velocious 1.0.514 → 1.0.516

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 (255) hide show
  1. package/README.md +4 -3
  2. package/build/background-jobs/cron-expression.js +9 -9
  3. package/build/background-jobs/forked-runner-child.js +1 -1
  4. package/build/background-jobs/job-runner.js +21 -15
  5. package/build/background-jobs/json-socket.js +4 -0
  6. package/build/background-jobs/main.js +180 -18
  7. package/build/background-jobs/status-reporter.js +12 -5
  8. package/build/background-jobs/store.js +132 -50
  9. package/build/background-jobs/types.js +11 -3
  10. package/build/background-jobs/worker.js +9 -5
  11. package/build/beacon/client.js +13 -6
  12. package/build/configuration.js +54 -29
  13. package/build/controller.js +9 -3
  14. package/build/database/drivers/sqlite/base.js +1 -1
  15. package/build/database/drivers/sqlite/index.js +15 -14
  16. package/build/database/migrations-ledger.js +16 -16
  17. package/build/database/pool/async-tracked-multi-connection.js +16 -0
  18. package/build/database/pool/base.js +26 -0
  19. package/build/database/query/where-model-class-hash.js +2 -0
  20. package/build/database/query/with-count.js +1 -1
  21. package/build/database/record/acts-as-list.js +2 -2
  22. package/build/database/record/auditing.js +23 -6
  23. package/build/database/record/index.js +7 -7
  24. package/build/database/record/validators/uniqueness.js +3 -3
  25. package/build/database/tenants/data-copier.js +23 -23
  26. package/build/database/tenants/schema-cloner.js +27 -27
  27. package/build/environment-handlers/browser.js +0 -1
  28. package/build/environment-handlers/node/cli/commands/background-jobs-runner.js +2 -1
  29. package/build/environment-handlers/node/cli/commands/lint/relationships.js +2 -2
  30. package/build/environment-handlers/node.js +1 -1
  31. package/build/frontend-model-controller.js +26 -18
  32. package/build/frontend-model-resource/base-resource.js +4 -4
  33. package/build/frontend-models/base.js +5 -5
  34. package/build/frontend-models/query.js +12 -12
  35. package/build/http-server/client/index.js +61 -15
  36. package/build/http-server/client/request-runner.js +7 -1
  37. package/build/http-server/client/response.js +17 -1
  38. package/build/http-server/client/websocket-session.js +13 -13
  39. package/build/http-server/server-client.js +96 -0
  40. package/build/http-server/websocket-channel.js +12 -11
  41. package/build/http-server/websocket-connection.js +12 -11
  42. package/build/http-server/websocket-events-host.js +1 -1
  43. package/build/http-server/worker-handler/in-process.js +48 -9
  44. package/build/http-server/worker-handler/index.js +67 -7
  45. package/build/http-server/worker-handler/worker-thread.js +68 -0
  46. package/build/src/background-jobs/cron-expression.d.ts +2 -2
  47. package/build/src/background-jobs/cron-expression.js +10 -10
  48. package/build/src/background-jobs/forked-runner-child.js +2 -2
  49. package/build/src/background-jobs/job-runner.d.ts +5 -1
  50. package/build/src/background-jobs/job-runner.d.ts.map +1 -1
  51. package/build/src/background-jobs/job-runner.js +22 -16
  52. package/build/src/background-jobs/json-socket.d.ts +4 -0
  53. package/build/src/background-jobs/json-socket.d.ts.map +1 -1
  54. package/build/src/background-jobs/json-socket.js +5 -1
  55. package/build/src/background-jobs/main.d.ts +62 -10
  56. package/build/src/background-jobs/main.d.ts.map +1 -1
  57. package/build/src/background-jobs/main.js +171 -19
  58. package/build/src/background-jobs/status-reporter.d.ts +6 -2
  59. package/build/src/background-jobs/status-reporter.d.ts.map +1 -1
  60. package/build/src/background-jobs/status-reporter.js +13 -6
  61. package/build/src/background-jobs/store.d.ts +48 -25
  62. package/build/src/background-jobs/store.d.ts.map +1 -1
  63. package/build/src/background-jobs/store.js +123 -50
  64. package/build/src/background-jobs/types.d.ts +36 -3
  65. package/build/src/background-jobs/types.d.ts.map +1 -1
  66. package/build/src/background-jobs/types.js +12 -4
  67. package/build/src/background-jobs/worker.d.ts +7 -5
  68. package/build/src/background-jobs/worker.d.ts.map +1 -1
  69. package/build/src/background-jobs/worker.js +10 -6
  70. package/build/src/beacon/client.d.ts +6 -3
  71. package/build/src/beacon/client.d.ts.map +1 -1
  72. package/build/src/beacon/client.js +14 -7
  73. package/build/src/configuration-types.d.ts +1 -1
  74. package/build/src/configuration.d.ts +42 -29
  75. package/build/src/configuration.d.ts.map +1 -1
  76. package/build/src/configuration.js +52 -30
  77. package/build/src/controller.d.ts +3 -0
  78. package/build/src/controller.d.ts.map +1 -1
  79. package/build/src/controller.js +9 -4
  80. package/build/src/database/drivers/sqlite/base.js +2 -2
  81. package/build/src/database/drivers/sqlite/index.d.ts +7 -6
  82. package/build/src/database/drivers/sqlite/index.d.ts.map +1 -1
  83. package/build/src/database/drivers/sqlite/index.js +16 -15
  84. package/build/src/database/migrations-ledger.d.ts +16 -16
  85. package/build/src/database/migrations-ledger.js +17 -17
  86. package/build/src/database/pool/async-tracked-multi-connection.d.ts +0 -11
  87. package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
  88. package/build/src/database/pool/async-tracked-multi-connection.js +16 -1
  89. package/build/src/database/pool/base.d.ts +21 -0
  90. package/build/src/database/pool/base.d.ts.map +1 -1
  91. package/build/src/database/pool/base.js +24 -1
  92. package/build/src/database/query/where-model-class-hash.d.ts.map +1 -1
  93. package/build/src/database/query/where-model-class-hash.js +3 -1
  94. package/build/src/database/query/with-count.js +2 -2
  95. package/build/src/database/record/acts-as-list.js +3 -3
  96. package/build/src/database/record/auditing.d.ts +1 -1
  97. package/build/src/database/record/auditing.d.ts.map +1 -1
  98. package/build/src/database/record/auditing.js +24 -7
  99. package/build/src/database/record/index.d.ts +7 -7
  100. package/build/src/database/record/index.js +8 -8
  101. package/build/src/database/record/validators/uniqueness.d.ts +3 -3
  102. package/build/src/database/record/validators/uniqueness.js +4 -4
  103. package/build/src/database/tenants/data-copier.d.ts +18 -18
  104. package/build/src/database/tenants/data-copier.js +24 -24
  105. package/build/src/database/tenants/schema-cloner.d.ts +27 -27
  106. package/build/src/database/tenants/schema-cloner.js +28 -28
  107. package/build/src/environment-handlers/browser.d.ts +9 -0
  108. package/build/src/environment-handlers/browser.d.ts.map +1 -1
  109. package/build/src/environment-handlers/browser.js +1 -2
  110. package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.d.ts.map +1 -1
  111. package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.js +3 -2
  112. package/build/src/environment-handlers/node/cli/commands/lint/relationships.js +3 -3
  113. package/build/src/environment-handlers/node.js +2 -2
  114. package/build/src/frontend-model-controller.d.ts +9 -8
  115. package/build/src/frontend-model-controller.d.ts.map +1 -1
  116. package/build/src/frontend-model-controller.js +26 -19
  117. package/build/src/frontend-model-resource/base-resource.js +5 -5
  118. package/build/src/frontend-models/base.d.ts +4 -4
  119. package/build/src/frontend-models/base.d.ts.map +1 -1
  120. package/build/src/frontend-models/base.js +6 -6
  121. package/build/src/frontend-models/query.d.ts +7 -7
  122. package/build/src/frontend-models/query.js +13 -13
  123. package/build/src/http-server/client/index.d.ts +23 -1
  124. package/build/src/http-server/client/index.d.ts.map +1 -1
  125. package/build/src/http-server/client/index.js +55 -17
  126. package/build/src/http-server/client/request-runner.d.ts.map +1 -1
  127. package/build/src/http-server/client/request-runner.js +8 -2
  128. package/build/src/http-server/client/response.d.ts +11 -1
  129. package/build/src/http-server/client/response.d.ts.map +1 -1
  130. package/build/src/http-server/client/response.js +16 -2
  131. package/build/src/http-server/client/websocket-session.d.ts +13 -13
  132. package/build/src/http-server/client/websocket-session.js +14 -14
  133. package/build/src/http-server/server-client.d.ts +13 -0
  134. package/build/src/http-server/server-client.d.ts.map +1 -1
  135. package/build/src/http-server/server-client.js +94 -1
  136. package/build/src/http-server/websocket-channel.d.ts +12 -11
  137. package/build/src/http-server/websocket-channel.d.ts.map +1 -1
  138. package/build/src/http-server/websocket-channel.js +13 -12
  139. package/build/src/http-server/websocket-connection.d.ts +12 -11
  140. package/build/src/http-server/websocket-connection.d.ts.map +1 -1
  141. package/build/src/http-server/websocket-connection.js +13 -12
  142. package/build/src/http-server/websocket-events-host.d.ts +1 -1
  143. package/build/src/http-server/websocket-events-host.js +2 -2
  144. package/build/src/http-server/worker-handler/in-process.d.ts +2 -0
  145. package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
  146. package/build/src/http-server/worker-handler/in-process.js +42 -11
  147. package/build/src/http-server/worker-handler/index.d.ts +21 -0
  148. package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
  149. package/build/src/http-server/worker-handler/index.js +61 -7
  150. package/build/src/http-server/worker-handler/worker-thread.d.ts +30 -0
  151. package/build/src/http-server/worker-handler/worker-thread.d.ts.map +1 -1
  152. package/build/src/http-server/worker-handler/worker-thread.js +61 -1
  153. package/build/src/sync/device-identity.d.ts +2 -2
  154. package/build/src/sync/device-identity.d.ts.map +1 -1
  155. package/build/src/sync/device-identity.js +4 -4
  156. package/build/src/sync/local-mutation-log.d.ts +0 -1
  157. package/build/src/sync/local-mutation-log.d.ts.map +1 -1
  158. package/build/src/sync/local-mutation-log.js +1 -2
  159. package/build/src/sync/query-scope.d.ts +5 -0
  160. package/build/src/sync/query-scope.d.ts.map +1 -1
  161. package/build/src/sync/query-scope.js +7 -2
  162. package/build/src/sync/sync-client-types.d.ts +2 -2
  163. package/build/src/sync/sync-client-types.d.ts.map +1 -1
  164. package/build/src/sync/sync-client-types.js +1 -1
  165. package/build/src/sync/sync-client.d.ts +17 -2
  166. package/build/src/sync/sync-client.d.ts.map +1 -1
  167. package/build/src/sync/sync-client.js +28 -14
  168. package/build/src/sync/sync-realtime-bridge.d.ts +6 -2
  169. package/build/src/sync/sync-realtime-bridge.d.ts.map +1 -1
  170. package/build/src/sync/sync-realtime-bridge.js +14 -3
  171. package/build/src/sync/sync-resource-base.d.ts +14 -3
  172. package/build/src/sync/sync-resource-base.d.ts.map +1 -1
  173. package/build/src/sync/sync-resource-base.js +20 -4
  174. package/build/src/sync/sync-scope-store.d.ts +3 -3
  175. package/build/src/sync/sync-scope-store.d.ts.map +1 -1
  176. package/build/src/sync/sync-scope-store.js +7 -5
  177. package/build/src/sync/sync-websocket-channel.d.ts +10 -0
  178. package/build/src/sync/sync-websocket-channel.d.ts.map +1 -1
  179. package/build/src/sync/sync-websocket-channel.js +20 -3
  180. package/build/src/tenants/tenant-iterator.d.ts +8 -8
  181. package/build/src/tenants/tenant-iterator.js +9 -9
  182. package/build/src/tenants/tenant.d.ts +6 -6
  183. package/build/src/tenants/tenant.js +7 -7
  184. package/build/src/testing/test-runner.d.ts +16 -0
  185. package/build/src/testing/test-runner.d.ts.map +1 -1
  186. package/build/src/testing/test-runner.js +79 -19
  187. package/build/sync/device-identity.js +3 -3
  188. package/build/sync/local-mutation-log.js +0 -1
  189. package/build/sync/query-scope.js +6 -1
  190. package/build/sync/sync-client-types.js +1 -1
  191. package/build/sync/sync-client.js +28 -15
  192. package/build/sync/sync-realtime-bridge.js +13 -2
  193. package/build/sync/sync-resource-base.js +20 -3
  194. package/build/sync/sync-scope-store.js +6 -4
  195. package/build/sync/sync-websocket-channel.js +18 -2
  196. package/build/tenants/tenant-iterator.js +8 -8
  197. package/build/tenants/tenant.js +6 -6
  198. package/build/testing/test-runner.js +86 -20
  199. package/package.json +2 -2
  200. package/src/background-jobs/cron-expression.js +9 -9
  201. package/src/background-jobs/forked-runner-child.js +1 -1
  202. package/src/background-jobs/job-runner.js +21 -15
  203. package/src/background-jobs/json-socket.js +4 -0
  204. package/src/background-jobs/main.js +180 -18
  205. package/src/background-jobs/status-reporter.js +12 -5
  206. package/src/background-jobs/store.js +132 -50
  207. package/src/background-jobs/types.js +11 -3
  208. package/src/background-jobs/worker.js +9 -5
  209. package/src/beacon/client.js +13 -6
  210. package/src/configuration.js +54 -29
  211. package/src/controller.js +9 -3
  212. package/src/database/drivers/sqlite/base.js +1 -1
  213. package/src/database/drivers/sqlite/index.js +15 -14
  214. package/src/database/migrations-ledger.js +16 -16
  215. package/src/database/pool/async-tracked-multi-connection.js +16 -0
  216. package/src/database/pool/base.js +26 -0
  217. package/src/database/query/where-model-class-hash.js +2 -0
  218. package/src/database/query/with-count.js +1 -1
  219. package/src/database/record/acts-as-list.js +2 -2
  220. package/src/database/record/auditing.js +23 -6
  221. package/src/database/record/index.js +7 -7
  222. package/src/database/record/validators/uniqueness.js +3 -3
  223. package/src/database/tenants/data-copier.js +23 -23
  224. package/src/database/tenants/schema-cloner.js +27 -27
  225. package/src/environment-handlers/browser.js +0 -1
  226. package/src/environment-handlers/node/cli/commands/background-jobs-runner.js +2 -1
  227. package/src/environment-handlers/node/cli/commands/lint/relationships.js +2 -2
  228. package/src/environment-handlers/node.js +1 -1
  229. package/src/frontend-model-controller.js +26 -18
  230. package/src/frontend-model-resource/base-resource.js +4 -4
  231. package/src/frontend-models/base.js +5 -5
  232. package/src/frontend-models/query.js +12 -12
  233. package/src/http-server/client/index.js +61 -15
  234. package/src/http-server/client/request-runner.js +7 -1
  235. package/src/http-server/client/response.js +17 -1
  236. package/src/http-server/client/websocket-session.js +13 -13
  237. package/src/http-server/server-client.js +96 -0
  238. package/src/http-server/websocket-channel.js +12 -11
  239. package/src/http-server/websocket-connection.js +12 -11
  240. package/src/http-server/websocket-events-host.js +1 -1
  241. package/src/http-server/worker-handler/in-process.js +48 -9
  242. package/src/http-server/worker-handler/index.js +67 -7
  243. package/src/http-server/worker-handler/worker-thread.js +68 -0
  244. package/src/sync/device-identity.js +3 -3
  245. package/src/sync/local-mutation-log.js +0 -1
  246. package/src/sync/query-scope.js +6 -1
  247. package/src/sync/sync-client-types.js +1 -1
  248. package/src/sync/sync-client.js +28 -15
  249. package/src/sync/sync-realtime-bridge.js +13 -2
  250. package/src/sync/sync-resource-base.js +20 -3
  251. package/src/sync/sync-scope-store.js +6 -4
  252. package/src/sync/sync-websocket-channel.js +18 -2
  253. package/src/tenants/tenant-iterator.js +8 -8
  254. package/src/tenants/tenant.js +6 -6
  255. package/src/testing/test-runner.js +86 -20
@@ -3,7 +3,7 @@ const ECDSA_P256_SHA256_ALGORITHM = "ECDSA-P256-SHA256";
3
3
  const ECDSA_P256_SHA256_SIGNATURE_PREFIX = "ecdsa-p256-sha256-";
4
4
  /**
5
5
  * JSON Web Key used by the sync signing helpers.
6
- * @typedef {JsonWebKey} SyncJsonWebKey
6
+ * @typedef {import("node:crypto").webcrypto.JsonWebKey} SyncJsonWebKey
7
7
  */
8
8
  /**
9
9
  * Backend-signed device certificate payload.
@@ -195,7 +195,7 @@ function signedMutationSignatureValue({ deviceCertificate, mutation }) {
195
195
  */
196
196
  async function signStableJson({ privateKey, value }) {
197
197
  const key = await cryptoSubtle().importKey("jwk", privateKey, { name: "ECDSA", namedCurve: "P-256" }, false, ["sign"]);
198
- const signature = await cryptoSubtle().sign({ hash: "SHA-256", name: "ECDSA" }, key, /** @type {BufferSource} */ (utf8(stableJsonStringify(value))));
198
+ const signature = await cryptoSubtle().sign({ hash: "SHA-256", name: "ECDSA" }, key, /** @type {Uint8Array<ArrayBuffer>} */ (utf8(stableJsonStringify(value))));
199
199
  return `${ECDSA_P256_SHA256_SIGNATURE_PREFIX}${base64UrlEncode(new Uint8Array(signature))}`;
200
200
  }
201
201
  /**
@@ -209,7 +209,7 @@ async function signStableJson({ privateKey, value }) {
209
209
  async function verifyStableJsonSignature({ publicKey, signature, value }) {
210
210
  const key = await cryptoSubtle().importKey("jwk", publicKey, { name: "ECDSA", namedCurve: "P-256" }, false, ["verify"]);
211
211
  const signatureBytes = base64UrlDecode(signatureWithoutPrefix(signature));
212
- return await cryptoSubtle().verify({ hash: "SHA-256", name: "ECDSA" }, key, /** @type {BufferSource} */ (signatureBytes), /** @type {BufferSource} */ (utf8(stableJsonStringify(value))));
212
+ return await cryptoSubtle().verify({ hash: "SHA-256", name: "ECDSA" }, key, /** @type {Uint8Array<ArrayBuffer>} */ (signatureBytes), /** @type {Uint8Array<ArrayBuffer>} */ (utf8(stableJsonStringify(value))));
213
213
  }
214
214
  /**
215
215
  * Normalizes a signed device certificate envelope.
@@ -451,4 +451,4 @@ function deterministicJson({ label, value }) {
451
451
  }
452
452
  throw new Error(`Sync ${label} must be deterministic JSON`);
453
453
  }
454
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLWlkZW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvZGV2aWNlLWlkZW50aXR5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixNQUFNLDJCQUEyQixHQUFHLG1CQUFtQixDQUFBO0FBQ3ZELE1BQU0sa0NBQWtDLEdBQUcsb0JBQW9CLENBQUE7QUFFL0Q7OztHQUdHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsMEJBQTBCO0lBQzlDLE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBWSxFQUFFLENBQUMsV0FBVyxDQUM5QyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBQyxFQUNwQyxJQUFJLEVBQ0osQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQ25CLENBQUE7SUFFRCxPQUFPO1FBQ0wsVUFBVSxFQUFFLE1BQU0sWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3JFLFNBQVMsRUFBRSxNQUFNLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQztLQUNwRSxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCLENBQUMsRUFBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUM7SUFDNUUsTUFBTSxxQkFBcUIsR0FBRyxpQ0FBaUMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUU1RSxPQUFPO1FBQ0wsU0FBUyxFQUFFLDJCQUEyQjtRQUN0QyxXQUFXLEVBQUUscUJBQXFCO1FBQ2xDLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztZQUM5QixVQUFVLEVB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QU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUM1QyxNQUFNLFVBQVUsR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBRXRFLElBQUksVUFBVSxLQUFLLFNBQVM7Z0JBQUUsU0FBUTtZQUN0QyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsRUFBQyxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUE7UUFDcEYsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFBO0lBQ25CLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyw2QkFBNkIsQ0FBQyxDQUFBO0FBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuY29uc3QgRUNEU0FfUDI1Nl9TSEEyNTZfQUxHT1JJVEhNID0gXCJFQ0RTQS1QMjU2LVNIQTI1NlwiXG5jb25zdCBFQ0RTQV9QMjU2X1NIQTI1Nl9TSUdOQVRVUkVfUFJFRklYID0gXCJlY2RzYS1wMjU2LXNoYTI1Ni1cIlxuXG4vKipcbiAqIEpTT04gV2ViIEtleSB1c2VkIGJ5IHRoZSBzeW5jIHNpZ25pbmcgaGVscGVycy5cbiAqIEB0eXBlZGVmIHtKc29uV2ViS2V5fSBTeW5jSnNvbldlYktleVxuICovXG5cbi8qKlxuICogQmFja2VuZC1zaWduZWQgZGV2aWNlIGNlcnRpZmljYXRlIHBheWxvYWQuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3RvckRldmljZUlkIC0gRGV2aWNlIGlkIGFsbG93ZWQgdG8gc2lnbiBtdXRhdGlvbnMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0b3JVc2VySWQgLSBVc2VyIGlkIHJlcHJlc2VudGVkIGJ5IHRoZSBkZXZpY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2VydGlmaWNhdGVJZCAtIENlcnRpZmljYXRlIGlkLlxuICogQHByb3BlcnR5IHtTeW5jSnNvbldlYktleX0gZGV2aWNlUHVibGljS2V5IC0gRGV2aWNlIHB1YmxpYyBrZXkgcGVlcnMvYmFja2VuZHMgdXNlIHRvIHZlcmlmeSBtdXRhdGlvbnMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXhwaXJlc0F0IC0gSVNPIHRpbWVzdGFtcCBhZnRlciB3aGljaCB0aGUgY2VydGlmaWNhdGUgaXMgaW52YWxpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpc3N1ZWRBdCAtIElTTyB0aW1lc3RhbXAgd2hlbiB0aGUgYmFja2VuZCBpc3N1ZWQgdGhlIGNlcnRpZmljYXRlLlxuICovXG5cbi8qKlxuICogQmFja2VuZC1zaWduZWQgZGV2aWNlIGNlcnRpZmljYXRlIGVudmVsb3BlLlxuICogQHR5cGVkZWYge29iamVjdH0gRGV2aWNlQ2VydGlmaWNhdGVcbiAqIEBwcm9wZXJ0eSB7XCJFQ0RTQS1QMjU2LVNIQTI1NlwifSBhbGdvcml0aG0gLSBTaWduYXR1cmUgYWxnb3JpdGhtLlxuICogQHByb3BlcnR5IHtEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWR9IGNlcnRpZmljYXRlIC0gQ2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzaWduYXR1cmUgLSBCYWNrZW5kIHNpZ25hdHVyZSBvdmVyIHRoZSBjZXJ0aWZpY2F0ZSBwYXlsb2FkLlxuICovXG5cbi8qKlxuICogU3luYyBtdXRhdGlvbiBwYXlsb2FkIHNpZ25lZCBieSBhIGRldmljZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNNdXRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdG9yRGV2aWNlSWQgLSBEZXZpY2UgdGhhdCBzaWduZWQgdGhlIG11dGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdG9yVXNlcklkIC0gVXNlciByZXByZXNlbnRlZCBieSB0aGUgc2lnbmluZyBkZXZpY2UuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSBbYXR0cmlidXRlc10gLSBNb2RlbCBhdHRyaWJ1dGVzIGZvciBDUlVEIG11dGF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVtYmVyIHwgbnVsbH0gW2Jhc2VWZXJzaW9uXSAtIEJhc2Ugc2VydmVyL2NsaWVudCB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNsaWVudE11dGF0aW9uSWQgLSBEZXZpY2UtbG9jYWwgaWRlbXBvdGVuY3kgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbW1hbmRdIC0gRG9tYWluIGNvbW1hbmQgbmFtZSBmb3IgY29tbWFuZCBtdXRhdGlvbnMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kZWwgLSBTeW5jIG1vZGVsL3Jlc291cmNlIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb2NjdXJyZWRBdCAtIElTTyB0aW1lc3RhbXAgd2hlbiB0aGUgbXV0YXRpb24gb2NjdXJyZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb2ZmbGluZUdyYW50SWQgLSBPZmZsaW5lIGdyYW50IGlkIGF1dGhvcml6aW5nIHRoZSBtdXRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcGVyYXRpb24gLSBDUlVEIG9wZXJhdGlvbiBvciBjb21tYW5kIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IFtwYXlsb2FkXSAtIERvbWFpbiBjb21tYW5kIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcG9saWN5SGFzaCAtIFN5bmMgcG9saWN5IGhhc2ggdGhlIG11dGF0aW9uIHdhcyBjaGVja2VkIGFnYWluc3QuXG4gKi9cblxuLyoqXG4gKiBEZXZpY2Utc2lnbmVkIG11dGF0aW9uIGVudmVsb3BlLlxuICogQHR5cGVkZWYge29iamVjdH0gU2lnbmVkU3luY011dGF0aW9uXG4gKiBAcHJvcGVydHkge1wiRUNEU0EtUDI1Ni1TSEEyNTZcIn0gYWxnb3JpdGhtIC0gU2lnbmF0dXJlIGFsZ29yaXRobS5cbiAqIEBwcm9wZXJ0eSB7RGV2aWNlQ2VydGlmaWNhdGV9IGRldmljZUNlcnRpZmljYXRlIC0gQmFja2VuZC1zaWduZWQgZGV2aWNlIGNlcnRpZmljYXRlLlxuICogQHByb3BlcnR5IHtTeW5jTXV0YXRpb259IG11dGF0aW9uIC0gTXV0YXRpb24gcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzaWduYXR1cmUgLSBEZXZpY2Ugc2lnbmF0dXJlIG92ZXIgdGhlIG11dGF0aW9uIGVudmVsb3BlLlxuICovXG5cbi8qKlxuICogR2VuZXJhdGVzIGFuIEVDRFNBIFAtMjU2IGtleXBhaXIgZXhwb3J0ZWQgYXMgSldLcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHtwcml2YXRlS2V5OiBTeW5jSnNvbldlYktleSwgcHVibGljS2V5OiBTeW5jSnNvbldlYktleX0+fSAtIEV4cG9ydGVkIGtleXBhaXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVN5bmNTaWduaW5nS2V5UGFpcigpIHtcbiAgY29uc3Qga2V5UGFpciA9IGF3YWl0IGNyeXB0b1N1YnRsZSgpLmdlbmVyYXRlS2V5KFxuICAgIHtuYW1lOiBcIkVDRFNBXCIsIG5hbWVkQ3VydmU6IFwiUC0yNTZcIn0sXG4gICAgdHJ1ZSxcbiAgICBbXCJzaWduXCIsIFwidmVyaWZ5XCJdXG4gIClcblxuICByZXR1cm4ge1xuICAgIHByaXZhdGVLZXk6IGF3YWl0IGNyeXB0b1N1YnRsZSgpLmV4cG9ydEtleShcImp3a1wiLCBrZXlQYWlyLnByaXZhdGVLZXkpLFxuICAgIHB1YmxpY0tleTogYXdhaXQgY3J5cHRvU3VidGxlKCkuZXhwb3J0S2V5KFwiandrXCIsIGtleVBhaXIucHVibGljS2V5KVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJhY2tlbmQtc2lnbmVkIGRldmljZSBjZXJ0aWZpY2F0ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0gYXJncy5iYWNrZW5kUHJpdmF0ZUtleSAtIEJhY2tlbmQgcHJpdmF0ZSBzaWduaW5nIGtleS5cbiAqIEBwYXJhbSB7RGV2aWNlQ2VydGlmaWNhdGVQYXlsb2FkfSBhcmdzLmNlcnRpZmljYXRlIC0gQ2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPERldmljZUNlcnRpZmljYXRlPn0gLSBTaWduZWQgY2VydGlmaWNhdGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVEZXZpY2VDZXJ0aWZpY2F0ZSh7YmFja2VuZFByaXZhdGVLZXksIGNlcnRpZmljYXRlfSkge1xuICBjb25zdCBub3JtYWxpemVkQ2VydGlmaWNhdGUgPSBub3JtYWxpemVEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWQoY2VydGlmaWNhdGUpXG5cbiAgcmV0dXJuIHtcbiAgICBhbGdvcml0aG06IEVDRFNBX1AyNTZfU0hBMjU2X0FMR09SSVRITSxcbiAgICBjZXJ0aWZpY2F0ZTogbm9ybWFsaXplZENlcnRpZmljYXRlLFxuICAgIHNpZ25hdHVyZTogYXdhaXQgc2lnblN0YWJsZUpzb24oe1xuICAgICAgcHJpdmF0ZUtleTogYmFja2VuZFByaXZhdGVLZXksXG4gICAgICB2YWx1ZTogZGV2aWNlQ2VydGlmaWNhdGVTaWduYXR1cmVWYWx1ZShub3JtYWxpemVkQ2VydGlmaWNhdGUpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmaWVzIGEgYmFja2VuZC1zaWduZWQgZGV2aWNlIGNlcnRpZmljYXRlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge1N5bmNKc29uV2ViS2V5fSBhcmdzLmJhY2tlbmRQdWJsaWNLZXkgLSBCYWNrZW5kIHB1YmxpYyBrZXkuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlfSBhcmdzLmNlcnRpZmljYXRlIC0gU2lnbmVkIGNlcnRpZmljYXRlLlxuICogQHBhcmFtIHtEYXRlfSBbYXJncy5ub3ddIC0gVmVyaWZpY2F0aW9uIHRpbWUuIERlZmF1bHRzIHRvIGN1cnJlbnQgdGltZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPERldmljZUNlcnRpZmljYXRlUGF5bG9hZD59IC0gVmVyaWZpZWQgY2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeURldmljZUNlcnRpZmljYXRlKHtiYWNrZW5kUHVibGljS2V5LCBjZXJ0aWZpY2F0ZSwgbm93ID0gbmV3IERhdGUoKX0pIHtcbiAgY29uc3Qgbm9ybWFsaXplZENlcnRpZmljYXRlID0gbm9ybWFsaXplRGV2aWNlQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpXG4gIGNvbnN0IHZlcmlmaWVkID0gYXdhaXQgdmVyaWZ5U3RhYmxlSnNvblNpZ25hdHVyZSh7XG4gICAgcHVibGljS2V5OiBiYWNrZW5kUHVibGljS2V5LFxuICAgIHNpZ25hdHVyZTogbm9ybWFsaXplZENlcnRpZmljYXRlLnNpZ25hdHVyZSxcbiAgICB2YWx1ZTogZGV2aWNlQ2VydGlmaWNhdGVTaWduYXR1cmVWYWx1ZShub3JtYWxpemVkQ2VydGlmaWNhdGUuY2VydGlmaWNhdGUpXG4gIH0pXG5cbiAgaWYgKCF2ZXJpZmllZCkgdGhyb3cgbmV3IEVycm9yKFwiRGV2aWNlIGNlcnRpZmljYXRlIHNpZ25hdHVyZSBkaWQgbm90IG1hdGNoXCIpXG4gIGFzc2VydE5vdEV4cGlyZWQoe2V4cGlyZXNBdDogbm9ybWFsaXplZENlcnRpZmljYXRlLmNlcnRpZmljYXRlLmV4cGlyZXNBdCwgbGFiZWw6IFwiRGV2aWNlIGNlcnRpZmljYXRlXCIsIG5vd30pXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRDZXJ0aWZpY2F0ZS5jZXJ0aWZpY2F0ZVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkZXZpY2Utc2lnbmVkIG11dGF0aW9uIGVudmVsb3BlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlfSBhcmdzLmRldmljZUNlcnRpZmljYXRlIC0gQmFja2VuZC1zaWduZWQgZGV2aWNlIGNlcnRpZmljYXRlLlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0gYXJncy5kZXZpY2VQcml2YXRlS2V5IC0gRGV2aWNlIHByaXZhdGUgc2lnbmluZyBrZXkuXG4gKiBAcGFyYW0ge1N5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE11dGF0aW9uIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTaWduZWRTeW5jTXV0YXRpb24+fSAtIFNpZ25lZCBtdXRhdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNpZ25lZE11dGF0aW9uKHtkZXZpY2VDZXJ0aWZpY2F0ZSwgZGV2aWNlUHJpdmF0ZUtleSwgbXV0YXRpb259KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWREZXZpY2VDZXJ0aWZpY2F0ZSA9IG5vcm1hbGl6ZURldmljZUNlcnRpZmljYXRlKGRldmljZUNlcnRpZmljYXRlKVxuICBjb25zdCBub3JtYWxpemVkTXV0YXRpb24gPSBub3JtYWxpemVTeW5jTXV0YXRpb24obXV0YXRpb24pXG5cbiAgYXNzZXJ0TXV0YXRpb25NYXRjaGVzQ2VydGlmaWNhdGUoe2NlcnRpZmljYXRlOiBub3JtYWxpemVkRGV2aWNlQ2VydGlmaWNhdGUuY2VydGlmaWNhdGUsIG11dGF0aW9uOiBub3JtYWxpemVkTXV0YXRpb259KVxuXG4gIHJldHVybiB7XG4gICAgYWxnb3JpdGhtOiBFQ0RTQV9QMjU2X1NIQTI1Nl9BTEdPUklUSE0sXG4gICAgZGV2aWNlQ2VydGlmaWNhdGU6IG5vcm1hbGl6ZWREZXZpY2VDZXJ0aWZpY2F0ZSxcbiAgICBtdXRhdGlvbjogbm9ybWFsaXplZE11dGF0aW9uLFxuICAgIHNpZ25hdHVyZTogYXdhaXQgc2lnblN0YWJsZUpzb24oe1xuICAgICAgcHJpdmF0ZUtleTogZGV2aWNlUHJpdmF0ZUtleSxcbiAgICAgIHZhbHVlOiBzaWduZWRNdXRhdGlvblNpZ25hdHVyZVZhbHVlKHtcbiAgICAgICAgZGV2aWNlQ2VydGlmaWNhdGU6IG5vcm1hbGl6ZWREZXZpY2VDZXJ0aWZpY2F0ZSxcbiAgICAgICAgbXV0YXRpb246IG5vcm1hbGl6ZWRNdXRhdGlvblxuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogVmVyaWZpZXMgYSBzaWduZWQgc3luYyBtdXRhdGlvbiBhbmQgaXRzIGRldmljZSBjZXJ0aWZpY2F0ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0gYXJncy5iYWNrZW5kUHVibGljS2V5IC0gQmFja2VuZCBwdWJsaWMga2V5IHVzZWQgdG8gdmVyaWZ5IHRoZSBkZXZpY2UgY2VydGlmaWNhdGUuXG4gKiBAcGFyYW0ge0RhdGV9IFthcmdzLm5vd10gLSBWZXJpZmljYXRpb24gdGltZS4gRGVmYXVsdHMgdG8gY3VycmVudCB0aW1lLlxuICogQHBhcmFtIHtTaWduZWRTeW5jTXV0YXRpb259IGFyZ3Muc2lnbmVkTXV0YXRpb24gLSBTaWduZWQgbXV0YXRpb24gZW52ZWxvcGUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTeW5jTXV0YXRpb24+fSAtIFZlcmlmaWVkIG11dGF0aW9uIHBheWxvYWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlTaWduZWRNdXRhdGlvbih7YmFja2VuZFB1YmxpY0tleSwgbm93ID0gbmV3IERhdGUoKSwgc2lnbmVkTXV0YXRpb259KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTaWduZWRNdXRhdGlvbiA9IG5vcm1hbGl6ZVNpZ25lZFN5bmNNdXRhdGlvbihzaWduZWRNdXRhdGlvbilcbiAgY29uc3QgY2VydGlmaWNhdGVQYXlsb2FkID0gYXdhaXQgdmVyaWZ5RGV2aWNlQ2VydGlmaWNhdGUoe1xuICAgIGJhY2tlbmRQdWJsaWNLZXksXG4gICAgY2VydGlmaWNhdGU6IG5vcm1hbGl6ZWRTaWduZWRNdXRhdGlvbi5kZXZpY2VDZXJ0aWZpY2F0ZSxcbiAgICBub3dcbiAgfSlcblxuICBhc3NlcnRNdXRhdGlvbk1hdGNoZXNDZXJ0aWZpY2F0ZSh7Y2VydGlmaWNhdGU6IGNlcnRpZmljYXRlUGF5bG9hZCwgbXV0YXRpb246IG5vcm1hbGl6ZWRTaWduZWRNdXRhdGlvbi5tdXRhdGlvbn0pXG5cbiAgY29uc3QgdmVyaWZpZWQgPSBhd2FpdCB2ZXJpZnlTdGFibGVKc29uU2lnbmF0dXJlKHtcbiAgICBwdWJsaWNLZXk6IGNlcnRpZmljYXRlUGF5bG9hZC5kZXZpY2VQdWJsaWNLZXksXG4gICAgc2lnbmF0dXJlOiBub3JtYWxpemVkU2lnbmVkTXV0YXRpb24uc2lnbmF0dXJlLFxuICAgIHZhbHVlOiBzaWduZWRNdXRhdGlvblNpZ25hdHVyZVZhbHVlKHtcbiAgICAgIGRldmljZUNlcnRpZmljYXRlOiBub3JtYWxpemVkU2lnbmVkTXV0YXRpb24uZGV2aWNlQ2VydGlmaWNhdGUsXG4gICAgICBtdXRhdGlvbjogbm9ybWFsaXplZFNpZ25lZE11dGF0aW9uLm11dGF0aW9uXG4gICAgfSlcbiAgfSlcblxuICBpZiAoIXZlcmlmaWVkKSB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIG11dGF0aW9uIHNpZ25hdHVyZSBkaWQgbm90IG1hdGNoXCIpXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRTaWduZWRNdXRhdGlvbi5tdXRhdGlvblxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlcGxheS9pZGVtcG90ZW5jeSBrZXkgZm9yIGEgc2lnbmVkIG11dGF0aW9uLlxuICogQHBhcmFtIHt7bXV0YXRpb246IHthY3RvckRldmljZUlkPzogdW5rbm93biwgYWN0b3JVc2VySWQ/OiB1bmtub3duLCBjbGllbnRNdXRhdGlvbklkPzogdW5rbm93bn19fSBzaWduZWRNdXRhdGlvbiAtIFNpZ25lZCBtdXRhdGlvbi1saWtlIG9iamVjdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSWRlbXBvdGVuY3kga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbXV0YXRpb25JZGVtcG90ZW5jeUtleShzaWduZWRNdXRhdGlvbikge1xuICBjb25zdCBtdXRhdGlvbiA9IHNpZ25lZE11dGF0aW9uLm11dGF0aW9uXG5cbiAgcmV0dXJuIFtcbiAgICByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5hY3RvclVzZXJJZCwgXCJhY3RvclVzZXJJZFwiKSxcbiAgICByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5hY3RvckRldmljZUlkLCBcImFjdG9yRGV2aWNlSWRcIiksXG4gICAgcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCwgXCJjbGllbnRNdXRhdGlvbklkXCIpXG4gIF0uam9pbihcIjpcIilcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHN0YWJsZSB2YWx1ZSBzaWduZWQgYnkgYmFja2VuZCBkZXZpY2UgY2VydGlmaWNhdGVzLlxuICogQHBhcmFtIHtEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWR9IGNlcnRpZmljYXRlIC0gQ2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gLSBTdGFibGUgc2lnbmF0dXJlIHZhbHVlLlxuICovXG5mdW5jdGlvbiBkZXZpY2VDZXJ0aWZpY2F0ZVNpZ25hdHVyZVZhbHVlKGNlcnRpZmljYXRlKSB7XG4gIHJldHVybiB7XG4gICAgYWxnb3JpdGhtOiBFQ0RTQV9QMjU2X1NIQTI1Nl9BTEdPUklUSE0sXG4gICAgY2VydGlmaWNhdGU6IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59ICovIChkZXRlcm1pbmlzdGljSnNvbk9iamVjdCh7bGFiZWw6IFwiY2VydGlmaWNhdGVcIiwgdmFsdWU6IGNlcnRpZmljYXRlfSkpXG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHN0YWJsZSB2YWx1ZSBzaWduZWQgYnkgc3luYyBtdXRhdGlvbnMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7RGV2aWNlQ2VydGlmaWNhdGV9IGFyZ3MuZGV2aWNlQ2VydGlmaWNhdGUgLSBEZXZpY2UgY2VydGlmaWNhdGUuXG4gKiBAcGFyYW0ge1N5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE11dGF0aW9uIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IC0gU3RhYmxlIHNpZ25hdHVyZSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc2lnbmVkTXV0YXRpb25TaWduYXR1cmVWYWx1ZSh7ZGV2aWNlQ2VydGlmaWNhdGUsIG11dGF0aW9ufSkge1xuICByZXR1cm4ge1xuICAgIGFsZ29yaXRobTogRUNEU0FfUDI1Nl9TSEEyNTZfQUxHT1JJVEhNLFxuICAgIGRldmljZUNlcnRpZmljYXRlOiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAqLyAoZGV0ZXJtaW5pc3RpY0pzb25PYmplY3Qoe2xhYmVsOiBcImRldmljZUNlcnRpZmljYXRlXCIsIHZhbHVlOiBkZXZpY2VDZXJ0aWZpY2F0ZX0pKSxcbiAgICBtdXRhdGlvbjogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gKi8gKGRldGVybWluaXN0aWNKc29uT2JqZWN0KHtsYWJlbDogXCJtdXRhdGlvblwiLCB2YWx1ZTogbXV0YXRpb259KSlcbiAgfVxufVxuXG4vKipcbiAqIFNpZ25zIGEgZGV0ZXJtaW5pc3RpYyBKU09OIHZhbHVlIHdpdGggRUNEU0EgUC0yNTYvU0hBLTI1Ni5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0gYXJncy5wcml2YXRlS2V5IC0gUHJpdmF0ZSBKV0suXG4gKiBAcGFyYW0ge3Vua25vd259IGFyZ3MudmFsdWUgLSBWYWx1ZSB0byBzaWduLlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBQcmVmaXhlZCBiYXNlNjR1cmwgc2lnbmF0dXJlLlxuICovXG5hc3luYyBmdW5jdGlvbiBzaWduU3RhYmxlSnNvbih7cHJpdmF0ZUtleSwgdmFsdWV9KSB7XG4gIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0b1N1YnRsZSgpLmltcG9ydEtleShcImp3a1wiLCBwcml2YXRlS2V5LCB7bmFtZTogXCJFQ0RTQVwiLCBuYW1lZEN1cnZlOiBcIlAtMjU2XCJ9LCBmYWxzZSwgW1wic2lnblwiXSlcbiAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgY3J5cHRvU3VidGxlKCkuc2lnbih7aGFzaDogXCJTSEEtMjU2XCIsIG5hbWU6IFwiRUNEU0FcIn0sIGtleSwgLyoqIEB0eXBlIHtCdWZmZXJTb3VyY2V9ICovICh1dGY4KHN0YWJsZUpzb25TdHJpbmdpZnkodmFsdWUpKSkpXG5cbiAgcmV0dXJuIGAke0VDRFNBX1AyNTZfU0hBMjU2X1NJR05BVFVSRV9QUkVGSVh9JHtiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlKSl9YFxufVxuXG4vKipcbiAqIFZlcmlmaWVzIGEgZGV0ZXJtaW5pc3RpYyBKU09OIHZhbHVlIHdpdGggRUNEU0EgUC0yNTYvU0hBLTI1Ni5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0gYXJncy5wdWJsaWNLZXkgLSBQdWJsaWMgSldLLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc2lnbmF0dXJlIC0gUHJlZml4ZWQgYmFzZTY0dXJsIHNpZ25hdHVyZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJncy52YWx1ZSAtIFZhbHVlIHRvIHZlcmlmeS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgdGhlIHNpZ25hdHVyZSBtYXRjaGVzLlxuICovXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlTdGFibGVKc29uU2lnbmF0dXJlKHtwdWJsaWNLZXksIHNpZ25hdHVyZSwgdmFsdWV9KSB7XG4gIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0b1N1YnRsZSgpLmltcG9ydEtleShcImp3a1wiLCBwdWJsaWNLZXksIHtuYW1lOiBcIkVDRFNBXCIsIG5hbWVkQ3VydmU6IFwiUC0yNTZcIn0sIGZhbHNlLCBbXCJ2ZXJpZnlcIl0pXG4gIGNvbnN0IHNpZ25hdHVyZUJ5dGVzID0gYmFzZTY0VXJsRGVjb2RlKHNpZ25hdHVyZVdpdGhvdXRQcmVmaXgoc2lnbmF0dXJlKSlcblxuICByZXR1cm4gYXdhaXQgY3J5cHRvU3VidGxlKCkudmVyaWZ5KHtoYXNoOiBcIlNIQS0yNTZcIiwgbmFtZTogXCJFQ0RTQVwifSwga2V5LCAvKiogQHR5cGUge0J1ZmZlclNvdXJjZX0gKi8gKHNpZ25hdHVyZUJ5dGVzKSwgLyoqIEB0eXBlIHtCdWZmZXJTb3VyY2V9ICovICh1dGY4KHN0YWJsZUpzb25TdHJpbmdpZnkodmFsdWUpKSkpXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHNpZ25lZCBkZXZpY2UgY2VydGlmaWNhdGUgZW52ZWxvcGUuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlfSBjZXJ0aWZpY2F0ZSAtIFNpZ25lZCBjZXJ0aWZpY2F0ZS5cbiAqIEByZXR1cm5zIHtEZXZpY2VDZXJ0aWZpY2F0ZX0gLSBOb3JtYWxpemVkIGNlcnRpZmljYXRlLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVEZXZpY2VDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSkge1xuICBpZiAoIWNlcnRpZmljYXRlIHx8IHR5cGVvZiBjZXJ0aWZpY2F0ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGNlcnRpZmljYXRlKSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgZGV2aWNlIGNlcnRpZmljYXRlIG9iamVjdFwiKVxuICBpZiAoY2VydGlmaWNhdGUuYWxnb3JpdGhtICE9PSBFQ0RTQV9QMjU2X1NIQTI1Nl9BTEdPUklUSE0pIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGV2aWNlIGNlcnRpZmljYXRlIGFsZ29yaXRobSAnJHtTdHJpbmcoY2VydGlmaWNhdGUuYWxnb3JpdGhtKX0nYClcblxuICByZXR1cm4ge1xuICAgIGFsZ29yaXRobTogY2VydGlmaWNhdGUuYWxnb3JpdGhtLFxuICAgIGNlcnRpZmljYXRlOiBub3JtYWxpemVEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWQoY2VydGlmaWNhdGUuY2VydGlmaWNhdGUpLFxuICAgIHNpZ25hdHVyZTogbm9ybWFsaXplU2lnbmF0dXJlKGNlcnRpZmljYXRlLnNpZ25hdHVyZSwgXCJkZXZpY2UgY2VydGlmaWNhdGUgc2lnbmF0dXJlXCIpXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgZGV2aWNlIGNlcnRpZmljYXRlIHBheWxvYWQuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlUGF5bG9hZH0gY2VydGlmaWNhdGUgLSBDZXJ0aWZpY2F0ZSBwYXlsb2FkLlxuICogQHJldHVybnMge0RldmljZUNlcnRpZmljYXRlUGF5bG9hZH0gLSBOb3JtYWxpemVkIGNlcnRpZmljYXRlIHBheWxvYWQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZURldmljZUNlcnRpZmljYXRlUGF5bG9hZChjZXJ0aWZpY2F0ZSkge1xuICBpZiAoIWNlcnRpZmljYXRlIHx8IHR5cGVvZiBjZXJ0aWZpY2F0ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGNlcnRpZmljYXRlKSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgZGV2aWNlIGNlcnRpZmljYXRlIHBheWxvYWQgb2JqZWN0XCIpXG5cbiAgcmV0dXJuIHtcbiAgICBhY3RvckRldmljZUlkOiByZXF1aXJlZFN0cmluZyhjZXJ0aWZpY2F0ZS5hY3RvckRldmljZUlkLCBcImFjdG9yRGV2aWNlSWRcIiksXG4gICAgYWN0b3JVc2VySWQ6IHJlcXVpcmVkU3RyaW5nKGNlcnRpZmljYXRlLmFjdG9yVXNlcklkLCBcImFjdG9yVXNlcklkXCIpLFxuICAgIGNlcnRpZmljYXRlSWQ6IHJlcXVpcmVkU3RyaW5nKGNlcnRpZmljYXRlLmNlcnRpZmljYXRlSWQsIFwiY2VydGlmaWNhdGVJZFwiKSxcbiAgICBkZXZpY2VQdWJsaWNLZXk6IG5vcm1hbGl6ZUp3ayhjZXJ0aWZpY2F0ZS5kZXZpY2VQdWJsaWNLZXksIFwiZGV2aWNlUHVibGljS2V5XCIpLFxuICAgIGV4cGlyZXNBdDogaXNvRGF0ZVN0cmluZyhuZXcgRGF0ZShyZXF1aXJlZFN0cmluZyhjZXJ0aWZpY2F0ZS5leHBpcmVzQXQsIFwiZXhwaXJlc0F0XCIpKSwgXCJleHBpcmVzQXRcIiksXG4gICAgaXNzdWVkQXQ6IGlzb0RhdGVTdHJpbmcobmV3IERhdGUocmVxdWlyZWRTdHJpbmcoY2VydGlmaWNhdGUuaXNzdWVkQXQsIFwiaXNzdWVkQXRcIikpLCBcImlzc3VlZEF0XCIpXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgc2lnbmVkIHN5bmMgbXV0YXRpb24gZW52ZWxvcGUuXG4gKiBAcGFyYW0ge1NpZ25lZFN5bmNNdXRhdGlvbn0gc2lnbmVkTXV0YXRpb24gLSBTaWduZWQgbXV0YXRpb24uXG4gKiBAcmV0dXJucyB7U2lnbmVkU3luY011dGF0aW9ufSAtIE5vcm1hbGl6ZWQgc2lnbmVkIG11dGF0aW9uLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTaWduZWRTeW5jTXV0YXRpb24oc2lnbmVkTXV0YXRpb24pIHtcbiAgaWYgKCFzaWduZWRNdXRhdGlvbiB8fCB0eXBlb2Ygc2lnbmVkTXV0YXRpb24gIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShzaWduZWRNdXRhdGlvbikpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIHNpZ25lZCBzeW5jIG11dGF0aW9uIG9iamVjdFwiKVxuICBpZiAoc2lnbmVkTXV0YXRpb24uYWxnb3JpdGhtICE9PSBFQ0RTQV9QMjU2X1NIQTI1Nl9BTEdPUklUSE0pIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc3luYyBtdXRhdGlvbiBhbGdvcml0aG0gJyR7U3RyaW5nKHNpZ25lZE11dGF0aW9uLmFsZ29yaXRobSl9J2ApXG5cbiAgcmV0dXJuIHtcbiAgICBhbGdvcml0aG06IHNpZ25lZE11dGF0aW9uLmFsZ29yaXRobSxcbiAgICBkZXZpY2VDZXJ0aWZpY2F0ZTogbm9ybWFsaXplRGV2aWNlQ2VydGlmaWNhdGUoc2lnbmVkTXV0YXRpb24uZGV2aWNlQ2VydGlmaWNhdGUpLFxuICAgIG11dGF0aW9uOiBub3JtYWxpemVTeW5jTXV0YXRpb24oc2lnbmVkTXV0YXRpb24ubXV0YXRpb24pLFxuICAgIHNpZ25hdHVyZTogbm9ybWFsaXplU2lnbmF0dXJlKHNpZ25lZE11dGF0aW9uLnNpZ25hdHVyZSwgXCJzeW5jIG11dGF0aW9uIHNpZ25hdHVyZVwiKVxuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHN5bmMgbXV0YXRpb24gcGF5bG9hZC5cbiAqIEBwYXJhbSB7U3luY011dGF0aW9ufSBtdXRhdGlvbiAtIE11dGF0aW9uIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7U3luY011dGF0aW9ufSAtIE5vcm1hbGl6ZWQgbXV0YXRpb24gcGF5bG9hZC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU3luY011dGF0aW9uKG11dGF0aW9uKSB7XG4gIGlmICghbXV0YXRpb24gfHwgdHlwZW9mIG11dGF0aW9uICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobXV0YXRpb24pKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBzeW5jIG11dGF0aW9uIG9iamVjdFwiKVxuXG4gIC8qKiBAdHlwZSB7U3luY011dGF0aW9ufSAqL1xuICBjb25zdCBub3JtYWxpemVkID0ge1xuICAgIGFjdG9yRGV2aWNlSWQ6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLmFjdG9yRGV2aWNlSWQsIFwiYWN0b3JEZXZpY2VJZFwiKSxcbiAgICBhY3RvclVzZXJJZDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uYWN0b3JVc2VySWQsIFwiYWN0b3JVc2VySWRcIiksXG4gICAgY2xpZW50TXV0YXRpb25JZDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCwgXCJjbGllbnRNdXRhdGlvbklkXCIpLFxuICAgIG1vZGVsOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5tb2RlbCwgXCJtb2RlbFwiKSxcbiAgICBvY2N1cnJlZEF0OiBpc29EYXRlU3RyaW5nKG5ldyBEYXRlKHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLm9jY3VycmVkQXQsIFwib2NjdXJyZWRBdFwiKSksIFwib2NjdXJyZWRBdFwiKSxcbiAgICBvZmZsaW5lR3JhbnRJZDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24ub2ZmbGluZUdyYW50SWQsIFwib2ZmbGluZUdyYW50SWRcIiksXG4gICAgb3BlcmF0aW9uOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5vcGVyYXRpb24sIFwib3BlcmF0aW9uXCIpLFxuICAgIHBvbGljeUhhc2g6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLnBvbGljeUhhc2gsIFwicG9saWN5SGFzaFwiKVxuICB9XG5cbiAgaWYgKG11dGF0aW9uLmF0dHJpYnV0ZXMgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5hdHRyaWJ1dGVzID0gZGV0ZXJtaW5pc3RpY0pzb25PYmplY3Qoe2xhYmVsOiBcImF0dHJpYnV0ZXNcIiwgdmFsdWU6IG11dGF0aW9uLmF0dHJpYnV0ZXN9KVxuICBpZiAobXV0YXRpb24uYmFzZVZlcnNpb24gIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5iYXNlVmVyc2lvbiA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyIHwgbnVsbH0gKi8gKGRldGVybWluaXN0aWNKc29uKHtsYWJlbDogXCJiYXNlVmVyc2lvblwiLCB2YWx1ZTogbXV0YXRpb24uYmFzZVZlcnNpb259KSlcbiAgaWYgKG11dGF0aW9uLmNvbW1hbmQgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5jb21tYW5kID0gcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uY29tbWFuZCwgXCJjb21tYW5kXCIpXG4gIGlmIChtdXRhdGlvbi5wYXlsb2FkICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQucGF5bG9hZCA9IGRldGVybWluaXN0aWNKc29uT2JqZWN0KHtsYWJlbDogXCJwYXlsb2FkXCIsIHZhbHVlOiBtdXRhdGlvbi5wYXlsb2FkfSlcblxuICByZXR1cm4gbm9ybWFsaXplZFxufVxuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBtdXRhdGlvbiBhY3RvciBmaWVsZHMgbWF0Y2ggdGhlIGNlcnRpZmljYXRlIGFjdG9yLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlUGF5bG9hZH0gYXJncy5jZXJ0aWZpY2F0ZSAtIERldmljZSBjZXJ0aWZpY2F0ZSBwYXlsb2FkLlxuICogQHBhcmFtIHtTeW5jTXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBNdXRhdGlvbiBwYXlsb2FkLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBhc3NlcnRNdXRhdGlvbk1hdGNoZXNDZXJ0aWZpY2F0ZSh7Y2VydGlmaWNhdGUsIG11dGF0aW9ufSkge1xuICBpZiAobXV0YXRpb24uYWN0b3JEZXZpY2VJZCAhPT0gY2VydGlmaWNhdGUuYWN0b3JEZXZpY2VJZCB8fCBtdXRhdGlvbi5hY3RvclVzZXJJZCAhPT0gY2VydGlmaWNhdGUuYWN0b3JVc2VySWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIG11dGF0aW9uIGFjdG9yIGRvZXMgbm90IG1hdGNoIGRldmljZSBjZXJ0aWZpY2F0ZVwiKVxuICB9XG59XG5cbi8qKlxuICogQXNzZXJ0cyBhIHRpbWVzdGFtcCBpcyBub3QgZXhwaXJlZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZXhwaXJlc0F0IC0gRXhwaXJ5IHRpbWVzdGFtcC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmxhYmVsIC0gRXJyb3IgbGFiZWwuXG4gKiBAcGFyYW0ge0RhdGV9IGFyZ3Mubm93IC0gVmVyaWZpY2F0aW9uIHRpbWUuXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vdEV4cGlyZWQoe2V4cGlyZXNBdCwgbGFiZWwsIG5vd30pIHtcbiAgaWYgKE51bWJlci5pc05hTihub3cuZ2V0VGltZSgpKSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzeW5jIHZlcmlmaWNhdGlvbiB0aW1lXCIpXG4gIGlmIChuZXcgRGF0ZShleHBpcmVzQXQpLmdldFRpbWUoKSA8PSBub3cuZ2V0VGltZSgpKSB0aHJvdyBuZXcgRXJyb3IoYCR7bGFiZWx9IGV4cGlyZWRgKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBKU09OIFdlYiBLZXkgb2JqZWN0LlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0ga2V5IC0gSldLLlxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIC0gS2V5IGxhYmVsLlxuICogQHJldHVybnMge1N5bmNKc29uV2ViS2V5fSAtIE5vcm1hbGl6ZWQgSldLLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVKd2soa2V5LCBsYWJlbCkge1xuICBjb25zdCBub3JtYWxpemVkID0gZGV0ZXJtaW5pc3RpY0pzb25PYmplY3Qoe2xhYmVsLCB2YWx1ZToga2V5fSlcblxuICByZXR1cm4gLyoqIEB0eXBlIHtTeW5jSnNvbldlYktleX0gKi8gKG5vcm1hbGl6ZWQpXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHByZWZpeGVkIHNpZ25hdHVyZSBzdHJpbmcuXG4gKiBAcGFyYW0ge3Vua25vd259IHNpZ25hdHVyZSAtIFNpZ25hdHVyZSB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIEVycm9yIGxhYmVsLlxuICogQHJldHVybnMge3N0cmluZ30gLSBTaWduYXR1cmUgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTaWduYXR1cmUoc2lnbmF0dXJlLCBsYWJlbCkge1xuICBpZiAodHlwZW9mIHNpZ25hdHVyZSAhPT0gXCJzdHJpbmdcIiB8fCAhc2lnbmF0dXJlLnN0YXJ0c1dpdGgoRUNEU0FfUDI1Nl9TSEEyNTZfU0lHTkFUVVJFX1BSRUZJWCkpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtsYWJlbH1gKVxuXG4gIHJldHVybiBzaWduYXR1cmVcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBzaWduYXR1cmUgcHJlZml4LlxuICogQHBhcmFtIHtzdHJpbmd9IHNpZ25hdHVyZSAtIFByZWZpeGVkIHNpZ25hdHVyZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQmFzZTY0dXJsIHNpZ25hdHVyZSBib2R5LlxuICovXG5mdW5jdGlvbiBzaWduYXR1cmVXaXRob3V0UHJlZml4KHNpZ25hdHVyZSkge1xuICByZXR1cm4gc2lnbmF0dXJlLnNsaWNlKEVDRFNBX1AyNTZfU0hBMjU2X1NJR05BVFVSRV9QUkVGSVgubGVuZ3RoKVxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGEgbm9uLWVtcHR5IHN0cmluZyBmaWVsZC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBWYWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gRmllbGQgbmFtZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RyaW5nIHZhbHVlLlxuICovXG5mdW5jdGlvbiByZXF1aXJlZFN0cmluZyh2YWx1ZSwgbmFtZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8IHZhbHVlLmxlbmd0aCA8IDEpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgc3luYyAke25hbWV9YClcblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgRGF0ZSB0byBhbiBJU08gdGltZXN0YW1wLlxuICogQHBhcmFtIHtEYXRlfSBkYXRlIC0gRGF0ZSB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIEZpZWxkIGxhYmVsLlxuICogQHJldHVybnMge3N0cmluZ30gLSBJU08gdGltZXN0YW1wLlxuICovXG5mdW5jdGlvbiBpc29EYXRlU3RyaW5nKGRhdGUsIGxhYmVsKSB7XG4gIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3luYyAke2xhYmVsfWApXG5cbiAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKVxufVxuXG4vKipcbiAqIFJldHVybnMgZW5jb2RlZCBVVEYtOCBieXRlcyBmb3IgYSBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBTdHJpbmcgdmFsdWUuXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gLSBVVEYtOCBieXRlcy5cbiAqL1xuZnVuY3Rpb24gdXRmOCh2YWx1ZSkge1xuICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHZhbHVlKVxufVxuXG4vKipcbiAqIFJldHVybnMgV2ViQ3J5cHRvIHN1YnRsZSBBUEkuXG4gKiBAcmV0dXJucyB7U3VidGxlQ3J5cHRvfSAtIFN1YnRsZUNyeXB0byBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3J5cHRvU3VidGxlKCkge1xuICBpZiAoIWdsb2JhbFRoaXMuY3J5cHRvPy5zdWJ0bGUpIHRocm93IG5ldyBFcnJvcihcIldlYkNyeXB0byBzdWJ0bGUgQVBJIGlzIHJlcXVpcmVkIGZvciBzeW5jIHNpZ25pbmdcIilcblxuICByZXR1cm4gZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlXG59XG5cbi8qKlxuICogQmFzZTY0dXJsLWVuY29kZXMgYnl0ZXMuXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzIC0gQnl0ZXMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEJhc2U2NHVybCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGJhc2U2NFVybEVuY29kZShieXRlcykge1xuICBsZXQgYmluYXJ5ID0gXCJcIlxuXG4gIGZvciAoY29uc3QgYnl0ZSBvZiBieXRlcykgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZSlcblxuICByZXR1cm4gYnRvYShiaW5hcnkpLnJlcGxhY2VBbGwoXCIrXCIsIFwiLVwiKS5yZXBsYWNlQWxsKFwiL1wiLCBcIl9cIikucmVwbGFjZUFsbChcIj1cIiwgXCJcIilcbn1cblxuLyoqXG4gKiBCYXNlNjR1cmwtZGVjb2RlcyBieXRlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIEJhc2U2NHVybCBzdHJpbmcuXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gLSBCeXRlcy5cbiAqL1xuZnVuY3Rpb24gYmFzZTY0VXJsRGVjb2RlKHZhbHVlKSB7XG4gIGNvbnN0IGJhc2U2NCA9IHZhbHVlLnJlcGxhY2VBbGwoXCItXCIsIFwiK1wiKS5yZXBsYWNlQWxsKFwiX1wiLCBcIi9cIikucGFkRW5kKE1hdGguY2VpbCh2YWx1ZS5sZW5ndGggLyA0KSAqIDQsIFwiPVwiKVxuICBjb25zdCBiaW5hcnkgPSBhdG9iKGJhc2U2NClcblxuICByZXR1cm4gVWludDhBcnJheS5mcm9tKGJpbmFyeSwgKGNoYXIpID0+IGNoYXIuY2hhckNvZGVBdCgwKSlcbn1cblxuLyoqXG4gKiBTdGFibGUgSlNPTiBzdHJpbmdpZmllciB3aXRoIHNvcnRlZCBvYmplY3Qga2V5cy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBWYWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSlNPTiBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHN0YWJsZUpzb25TdHJpbmdpZnkodmFsdWUpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRldGVybWluaXN0aWNKc29uKHtsYWJlbDogXCJyb290XCIsIHZhbHVlfSkpXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHZhbHVlIGFzIGEgSlNPTiBvYmplY3QuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmxhYmVsIC0gRGlhZ25vc3RpYyBsYWJlbC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJncy52YWx1ZSAtIFZhbHVlLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAtIEpTT04gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBkZXRlcm1pbmlzdGljSnNvbk9iamVjdCh7bGFiZWwsIHZhbHVlfSkge1xuICBjb25zdCBub3JtYWxpemVkID0gZGV0ZXJtaW5pc3RpY0pzb24oe2xhYmVsLCB2YWx1ZX0pXG5cbiAgaWYgKCFub3JtYWxpemVkIHx8IHR5cGVvZiBub3JtYWxpemVkICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobm9ybWFsaXplZCkpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgc3luYyAke2xhYmVsfSBvYmplY3RgKVxuXG4gIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAqLyAobm9ybWFsaXplZClcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGRldGVybWluaXN0aWMgSlNPTiB3aXRoIHNvcnRlZCBvYmplY3Qga2V5cy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubGFiZWwgLSBEaWFnbm9zdGljIGxhYmVsLlxuICogQHBhcmFtIHt1bmtub3dufSBhcmdzLnZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZX0gLSBOb3JtYWxpemVkIEpTT04gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGRldGVybWluaXN0aWNKc29uKHtsYWJlbCwgdmFsdWV9KSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB2YWx1ZVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLm1hcCgoZW50cnksIGluZGV4KSA9PiBkZXRlcm1pbmlzdGljSnNvbih7bGFiZWw6IGAke2xhYmVsfS8ke2luZGV4fWAsIHZhbHVlOiBlbnRyeX0pKVxuXG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59ICovXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpKSB7XG4gICAgICBjb25zdCBjaGlsZFZhbHVlID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHZhbHVlKVtrZXldXG5cbiAgICAgIGlmIChjaGlsZFZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICBub3JtYWxpemVkW2tleV0gPSBkZXRlcm1pbmlzdGljSnNvbih7bGFiZWw6IGAke2xhYmVsfS8ke2tleX1gLCB2YWx1ZTogY2hpbGRWYWx1ZX0pXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgU3luYyAke2xhYmVsfSBtdXN0IGJlIGRldGVybWluaXN0aWMgSlNPTmApXG59XG4iXX0=
454
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLWlkZW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvZGV2aWNlLWlkZW50aXR5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixNQUFNLDJCQUEyQixHQUFHLG1CQUFtQixDQUFBO0FBQ3ZELE1BQU0sa0NBQWtDLEdBQUcsb0JBQW9CLENBQUE7QUFFL0Q7OztHQUdHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsMEJBQTBCO0lBQzlDLE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBWSxFQUFFLENBQUMsV0FBVyxDQUM5QyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBQyxFQUNwQyxJQUFJLEVBQ0osQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQ25CLENBQUE7SUFFRCxPQUFPO1FBQ0wsVUFBVSxFQUFFLE1BQU0sWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3JFLFNBQVMsRUFBRSxNQUFNLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQztLQUNwRSxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCLENBQUMsRUFBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUM7SUFDNUUsTUFBTSxxQkFBcUIsR0FBRyxpQ0FBaUMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUU1RSxPQUFPO1FBQ0wsU0FBUyxFQUFFLDJCQUEyQjtRQUN0QyxXQUFXLEVBQUUscUJBQXFCO1FBQ2xDLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztZQUM5QixVQUFVLEVB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QU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUM1QyxNQUFNLFVBQVUsR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBRXRFLElBQUksVUFBVSxLQUFLLFNBQVM7Z0JBQUUsU0FBUTtZQUN0QyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsRUFBQyxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUE7UUFDcEYsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFBO0lBQ25CLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyw2QkFBNkIsQ0FBQyxDQUFBO0FBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuY29uc3QgRUNEU0FfUDI1Nl9TSEEyNTZfQUxHT1JJVEhNID0gXCJFQ0RTQS1QMjU2LVNIQTI1NlwiXG5jb25zdCBFQ0RTQV9QMjU2X1NIQTI1Nl9TSUdOQVRVUkVfUFJFRklYID0gXCJlY2RzYS1wMjU2LXNoYTI1Ni1cIlxuXG4vKipcbiAqIEpTT04gV2ViIEtleSB1c2VkIGJ5IHRoZSBzeW5jIHNpZ25pbmcgaGVscGVycy5cbiAqIEB0eXBlZGVmIHtpbXBvcnQoXCJub2RlOmNyeXB0b1wiKS53ZWJjcnlwdG8uSnNvbldlYktleX0gU3luY0pzb25XZWJLZXlcbiAqL1xuXG4vKipcbiAqIEJhY2tlbmQtc2lnbmVkIGRldmljZSBjZXJ0aWZpY2F0ZSBwYXlsb2FkLlxuICogQHR5cGVkZWYge29iamVjdH0gRGV2aWNlQ2VydGlmaWNhdGVQYXlsb2FkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0b3JEZXZpY2VJZCAtIERldmljZSBpZCBhbGxvd2VkIHRvIHNpZ24gbXV0YXRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdG9yVXNlcklkIC0gVXNlciBpZCByZXByZXNlbnRlZCBieSB0aGUgZGV2aWNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNlcnRpZmljYXRlSWQgLSBDZXJ0aWZpY2F0ZSBpZC5cbiAqIEBwcm9wZXJ0eSB7U3luY0pzb25XZWJLZXl9IGRldmljZVB1YmxpY0tleSAtIERldmljZSBwdWJsaWMga2V5IHBlZXJzL2JhY2tlbmRzIHVzZSB0byB2ZXJpZnkgbXV0YXRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4cGlyZXNBdCAtIElTTyB0aW1lc3RhbXAgYWZ0ZXIgd2hpY2ggdGhlIGNlcnRpZmljYXRlIGlzIGludmFsaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaXNzdWVkQXQgLSBJU08gdGltZXN0YW1wIHdoZW4gdGhlIGJhY2tlbmQgaXNzdWVkIHRoZSBjZXJ0aWZpY2F0ZS5cbiAqL1xuXG4vKipcbiAqIEJhY2tlbmQtc2lnbmVkIGRldmljZSBjZXJ0aWZpY2F0ZSBlbnZlbG9wZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERldmljZUNlcnRpZmljYXRlXG4gKiBAcHJvcGVydHkge1wiRUNEU0EtUDI1Ni1TSEEyNTZcIn0gYWxnb3JpdGhtIC0gU2lnbmF0dXJlIGFsZ29yaXRobS5cbiAqIEBwcm9wZXJ0eSB7RGV2aWNlQ2VydGlmaWNhdGVQYXlsb2FkfSBjZXJ0aWZpY2F0ZSAtIENlcnRpZmljYXRlIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2lnbmF0dXJlIC0gQmFja2VuZCBzaWduYXR1cmUgb3ZlciB0aGUgY2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqL1xuXG4vKipcbiAqIFN5bmMgbXV0YXRpb24gcGF5bG9hZCBzaWduZWQgYnkgYSBkZXZpY2UuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jTXV0YXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3RvckRldmljZUlkIC0gRGV2aWNlIHRoYXQgc2lnbmVkIHRoZSBtdXRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3RvclVzZXJJZCAtIFVzZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHNpZ25pbmcgZGV2aWNlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gW2F0dHJpYnV0ZXNdIC0gTW9kZWwgYXR0cmlidXRlcyBmb3IgQ1JVRCBtdXRhdGlvbnMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bWJlciB8IG51bGx9IFtiYXNlVmVyc2lvbl0gLSBCYXNlIHNlcnZlci9jbGllbnQgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjbGllbnRNdXRhdGlvbklkIC0gRGV2aWNlLWxvY2FsIGlkZW1wb3RlbmN5IGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb21tYW5kXSAtIERvbWFpbiBjb21tYW5kIG5hbWUgZm9yIGNvbW1hbmQgbXV0YXRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZGVsIC0gU3luYyBtb2RlbC9yZXNvdXJjZSBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9jY3VycmVkQXQgLSBJU08gdGltZXN0YW1wIHdoZW4gdGhlIG11dGF0aW9uIG9jY3VycmVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9mZmxpbmVHcmFudElkIC0gT2ZmbGluZSBncmFudCBpZCBhdXRob3JpemluZyB0aGUgbXV0YXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uIC0gQ1JVRCBvcGVyYXRpb24gb3IgY29tbWFuZCBvcGVyYXRpb24uXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSBbcGF5bG9hZF0gLSBEb21haW4gY29tbWFuZCBwYXlsb2FkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBvbGljeUhhc2ggLSBTeW5jIHBvbGljeSBoYXNoIHRoZSBtdXRhdGlvbiB3YXMgY2hlY2tlZCBhZ2FpbnN0LlxuICovXG5cbi8qKlxuICogRGV2aWNlLXNpZ25lZCBtdXRhdGlvbiBlbnZlbG9wZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNpZ25lZFN5bmNNdXRhdGlvblxuICogQHByb3BlcnR5IHtcIkVDRFNBLVAyNTYtU0hBMjU2XCJ9IGFsZ29yaXRobSAtIFNpZ25hdHVyZSBhbGdvcml0aG0uXG4gKiBAcHJvcGVydHkge0RldmljZUNlcnRpZmljYXRlfSBkZXZpY2VDZXJ0aWZpY2F0ZSAtIEJhY2tlbmQtc2lnbmVkIGRldmljZSBjZXJ0aWZpY2F0ZS5cbiAqIEBwcm9wZXJ0eSB7U3luY011dGF0aW9ufSBtdXRhdGlvbiAtIE11dGF0aW9uIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2lnbmF0dXJlIC0gRGV2aWNlIHNpZ25hdHVyZSBvdmVyIHRoZSBtdXRhdGlvbiBlbnZlbG9wZS5cbiAqL1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhbiBFQ0RTQSBQLTI1NiBrZXlwYWlyIGV4cG9ydGVkIGFzIEpXS3MuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7cHJpdmF0ZUtleTogU3luY0pzb25XZWJLZXksIHB1YmxpY0tleTogU3luY0pzb25XZWJLZXl9Pn0gLSBFeHBvcnRlZCBrZXlwYWlyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTeW5jU2lnbmluZ0tleVBhaXIoKSB7XG4gIGNvbnN0IGtleVBhaXIgPSBhd2FpdCBjcnlwdG9TdWJ0bGUoKS5nZW5lcmF0ZUtleShcbiAgICB7bmFtZTogXCJFQ0RTQVwiLCBuYW1lZEN1cnZlOiBcIlAtMjU2XCJ9LFxuICAgIHRydWUsXG4gICAgW1wic2lnblwiLCBcInZlcmlmeVwiXVxuICApXG5cbiAgcmV0dXJuIHtcbiAgICBwcml2YXRlS2V5OiBhd2FpdCBjcnlwdG9TdWJ0bGUoKS5leHBvcnRLZXkoXCJqd2tcIiwga2V5UGFpci5wcml2YXRlS2V5KSxcbiAgICBwdWJsaWNLZXk6IGF3YWl0IGNyeXB0b1N1YnRsZSgpLmV4cG9ydEtleShcImp3a1wiLCBrZXlQYWlyLnB1YmxpY0tleSlcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBiYWNrZW5kLXNpZ25lZCBkZXZpY2UgY2VydGlmaWNhdGUuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7U3luY0pzb25XZWJLZXl9IGFyZ3MuYmFja2VuZFByaXZhdGVLZXkgLSBCYWNrZW5kIHByaXZhdGUgc2lnbmluZyBrZXkuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlUGF5bG9hZH0gYXJncy5jZXJ0aWZpY2F0ZSAtIENlcnRpZmljYXRlIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxEZXZpY2VDZXJ0aWZpY2F0ZT59IC0gU2lnbmVkIGNlcnRpZmljYXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRGV2aWNlQ2VydGlmaWNhdGUoe2JhY2tlbmRQcml2YXRlS2V5LCBjZXJ0aWZpY2F0ZX0pIHtcbiAgY29uc3Qgbm9ybWFsaXplZENlcnRpZmljYXRlID0gbm9ybWFsaXplRGV2aWNlQ2VydGlmaWNhdGVQYXlsb2FkKGNlcnRpZmljYXRlKVxuXG4gIHJldHVybiB7XG4gICAgYWxnb3JpdGhtOiBFQ0RTQV9QMjU2X1NIQTI1Nl9BTEdPUklUSE0sXG4gICAgY2VydGlmaWNhdGU6IG5vcm1hbGl6ZWRDZXJ0aWZpY2F0ZSxcbiAgICBzaWduYXR1cmU6IGF3YWl0IHNpZ25TdGFibGVKc29uKHtcbiAgICAgIHByaXZhdGVLZXk6IGJhY2tlbmRQcml2YXRlS2V5LFxuICAgICAgdmFsdWU6IGRldmljZUNlcnRpZmljYXRlU2lnbmF0dXJlVmFsdWUobm9ybWFsaXplZENlcnRpZmljYXRlKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZmllcyBhIGJhY2tlbmQtc2lnbmVkIGRldmljZSBjZXJ0aWZpY2F0ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0gYXJncy5iYWNrZW5kUHVibGljS2V5IC0gQmFja2VuZCBwdWJsaWMga2V5LlxuICogQHBhcmFtIHtEZXZpY2VDZXJ0aWZpY2F0ZX0gYXJncy5jZXJ0aWZpY2F0ZSAtIFNpZ25lZCBjZXJ0aWZpY2F0ZS5cbiAqIEBwYXJhbSB7RGF0ZX0gW2FyZ3Mubm93XSAtIFZlcmlmaWNhdGlvbiB0aW1lLiBEZWZhdWx0cyB0byBjdXJyZW50IHRpbWUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWQ+fSAtIFZlcmlmaWVkIGNlcnRpZmljYXRlIHBheWxvYWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlEZXZpY2VDZXJ0aWZpY2F0ZSh7YmFja2VuZFB1YmxpY0tleSwgY2VydGlmaWNhdGUsIG5vdyA9IG5ldyBEYXRlKCl9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDZXJ0aWZpY2F0ZSA9IG5vcm1hbGl6ZURldmljZUNlcnRpZmljYXRlKGNlcnRpZmljYXRlKVxuICBjb25zdCB2ZXJpZmllZCA9IGF3YWl0IHZlcmlmeVN0YWJsZUpzb25TaWduYXR1cmUoe1xuICAgIHB1YmxpY0tleTogYmFja2VuZFB1YmxpY0tleSxcbiAgICBzaWduYXR1cmU6IG5vcm1hbGl6ZWRDZXJ0aWZpY2F0ZS5zaWduYXR1cmUsXG4gICAgdmFsdWU6IGRldmljZUNlcnRpZmljYXRlU2lnbmF0dXJlVmFsdWUobm9ybWFsaXplZENlcnRpZmljYXRlLmNlcnRpZmljYXRlKVxuICB9KVxuXG4gIGlmICghdmVyaWZpZWQpIHRocm93IG5ldyBFcnJvcihcIkRldmljZSBjZXJ0aWZpY2F0ZSBzaWduYXR1cmUgZGlkIG5vdCBtYXRjaFwiKVxuICBhc3NlcnROb3RFeHBpcmVkKHtleHBpcmVzQXQ6IG5vcm1hbGl6ZWRDZXJ0aWZpY2F0ZS5jZXJ0aWZpY2F0ZS5leHBpcmVzQXQsIGxhYmVsOiBcIkRldmljZSBjZXJ0aWZpY2F0ZVwiLCBub3d9KVxuXG4gIHJldHVybiBub3JtYWxpemVkQ2VydGlmaWNhdGUuY2VydGlmaWNhdGVcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGV2aWNlLXNpZ25lZCBtdXRhdGlvbiBlbnZlbG9wZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtEZXZpY2VDZXJ0aWZpY2F0ZX0gYXJncy5kZXZpY2VDZXJ0aWZpY2F0ZSAtIEJhY2tlbmQtc2lnbmVkIGRldmljZSBjZXJ0aWZpY2F0ZS5cbiAqIEBwYXJhbSB7U3luY0pzb25XZWJLZXl9IGFyZ3MuZGV2aWNlUHJpdmF0ZUtleSAtIERldmljZSBwcml2YXRlIHNpZ25pbmcga2V5LlxuICogQHBhcmFtIHtTeW5jTXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBNdXRhdGlvbiBwYXlsb2FkLlxuICogQHJldHVybnMge1Byb21pc2U8U2lnbmVkU3luY011dGF0aW9uPn0gLSBTaWduZWQgbXV0YXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTaWduZWRNdXRhdGlvbih7ZGV2aWNlQ2VydGlmaWNhdGUsIGRldmljZVByaXZhdGVLZXksIG11dGF0aW9ufSkge1xuICBjb25zdCBub3JtYWxpemVkRGV2aWNlQ2VydGlmaWNhdGUgPSBub3JtYWxpemVEZXZpY2VDZXJ0aWZpY2F0ZShkZXZpY2VDZXJ0aWZpY2F0ZSlcbiAgY29uc3Qgbm9ybWFsaXplZE11dGF0aW9uID0gbm9ybWFsaXplU3luY011dGF0aW9uKG11dGF0aW9uKVxuXG4gIGFzc2VydE11dGF0aW9uTWF0Y2hlc0NlcnRpZmljYXRlKHtjZXJ0aWZpY2F0ZTogbm9ybWFsaXplZERldmljZUNlcnRpZmljYXRlLmNlcnRpZmljYXRlLCBtdXRhdGlvbjogbm9ybWFsaXplZE11dGF0aW9ufSlcblxuICByZXR1cm4ge1xuICAgIGFsZ29yaXRobTogRUNEU0FfUDI1Nl9TSEEyNTZfQUxHT1JJVEhNLFxuICAgIGRldmljZUNlcnRpZmljYXRlOiBub3JtYWxpemVkRGV2aWNlQ2VydGlmaWNhdGUsXG4gICAgbXV0YXRpb246IG5vcm1hbGl6ZWRNdXRhdGlvbixcbiAgICBzaWduYXR1cmU6IGF3YWl0IHNpZ25TdGFibGVKc29uKHtcbiAgICAgIHByaXZhdGVLZXk6IGRldmljZVByaXZhdGVLZXksXG4gICAgICB2YWx1ZTogc2lnbmVkTXV0YXRpb25TaWduYXR1cmVWYWx1ZSh7XG4gICAgICAgIGRldmljZUNlcnRpZmljYXRlOiBub3JtYWxpemVkRGV2aWNlQ2VydGlmaWNhdGUsXG4gICAgICAgIG11dGF0aW9uOiBub3JtYWxpemVkTXV0YXRpb25cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmaWVzIGEgc2lnbmVkIHN5bmMgbXV0YXRpb24gYW5kIGl0cyBkZXZpY2UgY2VydGlmaWNhdGUuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7U3luY0pzb25XZWJLZXl9IGFyZ3MuYmFja2VuZFB1YmxpY0tleSAtIEJhY2tlbmQgcHVibGljIGtleSB1c2VkIHRvIHZlcmlmeSB0aGUgZGV2aWNlIGNlcnRpZmljYXRlLlxuICogQHBhcmFtIHtEYXRlfSBbYXJncy5ub3ddIC0gVmVyaWZpY2F0aW9uIHRpbWUuIERlZmF1bHRzIHRvIGN1cnJlbnQgdGltZS5cbiAqIEBwYXJhbSB7U2lnbmVkU3luY011dGF0aW9ufSBhcmdzLnNpZ25lZE11dGF0aW9uIC0gU2lnbmVkIG11dGF0aW9uIGVudmVsb3BlLlxuICogQHJldHVybnMge1Byb21pc2U8U3luY011dGF0aW9uPn0gLSBWZXJpZmllZCBtdXRhdGlvbiBwYXlsb2FkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5U2lnbmVkTXV0YXRpb24oe2JhY2tlbmRQdWJsaWNLZXksIG5vdyA9IG5ldyBEYXRlKCksIHNpZ25lZE11dGF0aW9ufSkge1xuICBjb25zdCBub3JtYWxpemVkU2lnbmVkTXV0YXRpb24gPSBub3JtYWxpemVTaWduZWRTeW5jTXV0YXRpb24oc2lnbmVkTXV0YXRpb24pXG4gIGNvbnN0IGNlcnRpZmljYXRlUGF5bG9hZCA9IGF3YWl0IHZlcmlmeURldmljZUNlcnRpZmljYXRlKHtcbiAgICBiYWNrZW5kUHVibGljS2V5LFxuICAgIGNlcnRpZmljYXRlOiBub3JtYWxpemVkU2lnbmVkTXV0YXRpb24uZGV2aWNlQ2VydGlmaWNhdGUsXG4gICAgbm93XG4gIH0pXG5cbiAgYXNzZXJ0TXV0YXRpb25NYXRjaGVzQ2VydGlmaWNhdGUoe2NlcnRpZmljYXRlOiBjZXJ0aWZpY2F0ZVBheWxvYWQsIG11dGF0aW9uOiBub3JtYWxpemVkU2lnbmVkTXV0YXRpb24ubXV0YXRpb259KVxuXG4gIGNvbnN0IHZlcmlmaWVkID0gYXdhaXQgdmVyaWZ5U3RhYmxlSnNvblNpZ25hdHVyZSh7XG4gICAgcHVibGljS2V5OiBjZXJ0aWZpY2F0ZVBheWxvYWQuZGV2aWNlUHVibGljS2V5LFxuICAgIHNpZ25hdHVyZTogbm9ybWFsaXplZFNpZ25lZE11dGF0aW9uLnNpZ25hdHVyZSxcbiAgICB2YWx1ZTogc2lnbmVkTXV0YXRpb25TaWduYXR1cmVWYWx1ZSh7XG4gICAgICBkZXZpY2VDZXJ0aWZpY2F0ZTogbm9ybWFsaXplZFNpZ25lZE11dGF0aW9uLmRldmljZUNlcnRpZmljYXRlLFxuICAgICAgbXV0YXRpb246IG5vcm1hbGl6ZWRTaWduZWRNdXRhdGlvbi5tdXRhdGlvblxuICAgIH0pXG4gIH0pXG5cbiAgaWYgKCF2ZXJpZmllZCkgdGhyb3cgbmV3IEVycm9yKFwiU3luYyBtdXRhdGlvbiBzaWduYXR1cmUgZGlkIG5vdCBtYXRjaFwiKVxuXG4gIHJldHVybiBub3JtYWxpemVkU2lnbmVkTXV0YXRpb24ubXV0YXRpb25cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZXBsYXkvaWRlbXBvdGVuY3kga2V5IGZvciBhIHNpZ25lZCBtdXRhdGlvbi5cbiAqIEBwYXJhbSB7e211dGF0aW9uOiB7YWN0b3JEZXZpY2VJZD86IHVua25vd24sIGFjdG9yVXNlcklkPzogdW5rbm93biwgY2xpZW50TXV0YXRpb25JZD86IHVua25vd259fX0gc2lnbmVkTXV0YXRpb24gLSBTaWduZWQgbXV0YXRpb24tbGlrZSBvYmplY3QuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIElkZW1wb3RlbmN5IGtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11dGF0aW9uSWRlbXBvdGVuY3lLZXkoc2lnbmVkTXV0YXRpb24pIHtcbiAgY29uc3QgbXV0YXRpb24gPSBzaWduZWRNdXRhdGlvbi5tdXRhdGlvblxuXG4gIHJldHVybiBbXG4gICAgcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uYWN0b3JVc2VySWQsIFwiYWN0b3JVc2VySWRcIiksXG4gICAgcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uYWN0b3JEZXZpY2VJZCwgXCJhY3RvckRldmljZUlkXCIpLFxuICAgIHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsIFwiY2xpZW50TXV0YXRpb25JZFwiKVxuICBdLmpvaW4oXCI6XCIpXG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBzdGFibGUgdmFsdWUgc2lnbmVkIGJ5IGJhY2tlbmQgZGV2aWNlIGNlcnRpZmljYXRlcy5cbiAqIEBwYXJhbSB7RGV2aWNlQ2VydGlmaWNhdGVQYXlsb2FkfSBjZXJ0aWZpY2F0ZSAtIENlcnRpZmljYXRlIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IC0gU3RhYmxlIHNpZ25hdHVyZSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZGV2aWNlQ2VydGlmaWNhdGVTaWduYXR1cmVWYWx1ZShjZXJ0aWZpY2F0ZSkge1xuICByZXR1cm4ge1xuICAgIGFsZ29yaXRobTogRUNEU0FfUDI1Nl9TSEEyNTZfQUxHT1JJVEhNLFxuICAgIGNlcnRpZmljYXRlOiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAqLyAoZGV0ZXJtaW5pc3RpY0pzb25PYmplY3Qoe2xhYmVsOiBcImNlcnRpZmljYXRlXCIsIHZhbHVlOiBjZXJ0aWZpY2F0ZX0pKVxuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBzdGFibGUgdmFsdWUgc2lnbmVkIGJ5IHN5bmMgbXV0YXRpb25zLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge0RldmljZUNlcnRpZmljYXRlfSBhcmdzLmRldmljZUNlcnRpZmljYXRlIC0gRGV2aWNlIGNlcnRpZmljYXRlLlxuICogQHBhcmFtIHtTeW5jTXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBNdXRhdGlvbiBwYXlsb2FkLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAtIFN0YWJsZSBzaWduYXR1cmUgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHNpZ25lZE11dGF0aW9uU2lnbmF0dXJlVmFsdWUoe2RldmljZUNlcnRpZmljYXRlLCBtdXRhdGlvbn0pIHtcbiAgcmV0dXJuIHtcbiAgICBhbGdvcml0aG06IEVDRFNBX1AyNTZfU0hBMjU2X0FMR09SSVRITSxcbiAgICBkZXZpY2VDZXJ0aWZpY2F0ZTogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gKi8gKGRldGVybWluaXN0aWNKc29uT2JqZWN0KHtsYWJlbDogXCJkZXZpY2VDZXJ0aWZpY2F0ZVwiLCB2YWx1ZTogZGV2aWNlQ2VydGlmaWNhdGV9KSksXG4gICAgbXV0YXRpb246IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59ICovIChkZXRlcm1pbmlzdGljSnNvbk9iamVjdCh7bGFiZWw6IFwibXV0YXRpb25cIiwgdmFsdWU6IG11dGF0aW9ufSkpXG4gIH1cbn1cblxuLyoqXG4gKiBTaWducyBhIGRldGVybWluaXN0aWMgSlNPTiB2YWx1ZSB3aXRoIEVDRFNBIFAtMjU2L1NIQS0yNTYuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7U3luY0pzb25XZWJLZXl9IGFyZ3MucHJpdmF0ZUtleSAtIFByaXZhdGUgSldLLlxuICogQHBhcmFtIHt1bmtub3dufSBhcmdzLnZhbHVlIC0gVmFsdWUgdG8gc2lnbi5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gUHJlZml4ZWQgYmFzZTY0dXJsIHNpZ25hdHVyZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2lnblN0YWJsZUpzb24oe3ByaXZhdGVLZXksIHZhbHVlfSkge1xuICBjb25zdCBrZXkgPSBhd2FpdCBjcnlwdG9TdWJ0bGUoKS5pbXBvcnRLZXkoXCJqd2tcIiwgcHJpdmF0ZUtleSwge25hbWU6IFwiRUNEU0FcIiwgbmFtZWRDdXJ2ZTogXCJQLTI1NlwifSwgZmFsc2UsIFtcInNpZ25cIl0pXG4gIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IGNyeXB0b1N1YnRsZSgpLnNpZ24oe2hhc2g6IFwiU0hBLTI1NlwiLCBuYW1lOiBcIkVDRFNBXCJ9LCBrZXksIC8qKiBAdHlwZSB7VWludDhBcnJheTxBcnJheUJ1ZmZlcj59ICovICh1dGY4KHN0YWJsZUpzb25TdHJpbmdpZnkodmFsdWUpKSkpXG5cbiAgcmV0dXJuIGAke0VDRFNBX1AyNTZfU0hBMjU2X1NJR05BVFVSRV9QUkVGSVh9JHtiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlKSl9YFxufVxuXG4vKipcbiAqIFZlcmlmaWVzIGEgZGV0ZXJtaW5pc3RpYyBKU09OIHZhbHVlIHdpdGggRUNEU0EgUC0yNTYvU0hBLTI1Ni5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtTeW5jSnNvbldlYktleX0gYXJncy5wdWJsaWNLZXkgLSBQdWJsaWMgSldLLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc2lnbmF0dXJlIC0gUHJlZml4ZWQgYmFzZTY0dXJsIHNpZ25hdHVyZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJncy52YWx1ZSAtIFZhbHVlIHRvIHZlcmlmeS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgdGhlIHNpZ25hdHVyZSBtYXRjaGVzLlxuICovXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlTdGFibGVKc29uU2lnbmF0dXJlKHtwdWJsaWNLZXksIHNpZ25hdHVyZSwgdmFsdWV9KSB7XG4gIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0b1N1YnRsZSgpLmltcG9ydEtleShcImp3a1wiLCBwdWJsaWNLZXksIHtuYW1lOiBcIkVDRFNBXCIsIG5hbWVkQ3VydmU6IFwiUC0yNTZcIn0sIGZhbHNlLCBbXCJ2ZXJpZnlcIl0pXG4gIGNvbnN0IHNpZ25hdHVyZUJ5dGVzID0gYmFzZTY0VXJsRGVjb2RlKHNpZ25hdHVyZVdpdGhvdXRQcmVmaXgoc2lnbmF0dXJlKSlcblxuICByZXR1cm4gYXdhaXQgY3J5cHRvU3VidGxlKCkudmVyaWZ5KHtoYXNoOiBcIlNIQS0yNTZcIiwgbmFtZTogXCJFQ0RTQVwifSwga2V5LCAvKiogQHR5cGUge1VpbnQ4QXJyYXk8QXJyYXlCdWZmZXI+fSAqLyAoc2lnbmF0dXJlQnl0ZXMpLCAvKiogQHR5cGUge1VpbnQ4QXJyYXk8QXJyYXlCdWZmZXI+fSAqLyAodXRmOChzdGFibGVKc29uU3RyaW5naWZ5KHZhbHVlKSkpKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBzaWduZWQgZGV2aWNlIGNlcnRpZmljYXRlIGVudmVsb3BlLlxuICogQHBhcmFtIHtEZXZpY2VDZXJ0aWZpY2F0ZX0gY2VydGlmaWNhdGUgLSBTaWduZWQgY2VydGlmaWNhdGUuXG4gKiBAcmV0dXJucyB7RGV2aWNlQ2VydGlmaWNhdGV9IC0gTm9ybWFsaXplZCBjZXJ0aWZpY2F0ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRGV2aWNlQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpIHtcbiAgaWYgKCFjZXJ0aWZpY2F0ZSB8fCB0eXBlb2YgY2VydGlmaWNhdGUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShjZXJ0aWZpY2F0ZSkpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGRldmljZSBjZXJ0aWZpY2F0ZSBvYmplY3RcIilcbiAgaWYgKGNlcnRpZmljYXRlLmFsZ29yaXRobSAhPT0gRUNEU0FfUDI1Nl9TSEEyNTZfQUxHT1JJVEhNKSB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRldmljZSBjZXJ0aWZpY2F0ZSBhbGdvcml0aG0gJyR7U3RyaW5nKGNlcnRpZmljYXRlLmFsZ29yaXRobSl9J2ApXG5cbiAgcmV0dXJuIHtcbiAgICBhbGdvcml0aG06IGNlcnRpZmljYXRlLmFsZ29yaXRobSxcbiAgICBjZXJ0aWZpY2F0ZTogbm9ybWFsaXplRGV2aWNlQ2VydGlmaWNhdGVQYXlsb2FkKGNlcnRpZmljYXRlLmNlcnRpZmljYXRlKSxcbiAgICBzaWduYXR1cmU6IG5vcm1hbGl6ZVNpZ25hdHVyZShjZXJ0aWZpY2F0ZS5zaWduYXR1cmUsIFwiZGV2aWNlIGNlcnRpZmljYXRlIHNpZ25hdHVyZVwiKVxuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIGRldmljZSBjZXJ0aWZpY2F0ZSBwYXlsb2FkLlxuICogQHBhcmFtIHtEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWR9IGNlcnRpZmljYXRlIC0gQ2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWR9IC0gTm9ybWFsaXplZCBjZXJ0aWZpY2F0ZSBwYXlsb2FkLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWQoY2VydGlmaWNhdGUpIHtcbiAgaWYgKCFjZXJ0aWZpY2F0ZSB8fCB0eXBlb2YgY2VydGlmaWNhdGUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShjZXJ0aWZpY2F0ZSkpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGRldmljZSBjZXJ0aWZpY2F0ZSBwYXlsb2FkIG9iamVjdFwiKVxuXG4gIHJldHVybiB7XG4gICAgYWN0b3JEZXZpY2VJZDogcmVxdWlyZWRTdHJpbmcoY2VydGlmaWNhdGUuYWN0b3JEZXZpY2VJZCwgXCJhY3RvckRldmljZUlkXCIpLFxuICAgIGFjdG9yVXNlcklkOiByZXF1aXJlZFN0cmluZyhjZXJ0aWZpY2F0ZS5hY3RvclVzZXJJZCwgXCJhY3RvclVzZXJJZFwiKSxcbiAgICBjZXJ0aWZpY2F0ZUlkOiByZXF1aXJlZFN0cmluZyhjZXJ0aWZpY2F0ZS5jZXJ0aWZpY2F0ZUlkLCBcImNlcnRpZmljYXRlSWRcIiksXG4gICAgZGV2aWNlUHVibGljS2V5OiBub3JtYWxpemVKd2soY2VydGlmaWNhdGUuZGV2aWNlUHVibGljS2V5LCBcImRldmljZVB1YmxpY0tleVwiKSxcbiAgICBleHBpcmVzQXQ6IGlzb0RhdGVTdHJpbmcobmV3IERhdGUocmVxdWlyZWRTdHJpbmcoY2VydGlmaWNhdGUuZXhwaXJlc0F0LCBcImV4cGlyZXNBdFwiKSksIFwiZXhwaXJlc0F0XCIpLFxuICAgIGlzc3VlZEF0OiBpc29EYXRlU3RyaW5nKG5ldyBEYXRlKHJlcXVpcmVkU3RyaW5nKGNlcnRpZmljYXRlLmlzc3VlZEF0LCBcImlzc3VlZEF0XCIpKSwgXCJpc3N1ZWRBdFwiKVxuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHNpZ25lZCBzeW5jIG11dGF0aW9uIGVudmVsb3BlLlxuICogQHBhcmFtIHtTaWduZWRTeW5jTXV0YXRpb259IHNpZ25lZE11dGF0aW9uIC0gU2lnbmVkIG11dGF0aW9uLlxuICogQHJldHVybnMge1NpZ25lZFN5bmNNdXRhdGlvbn0gLSBOb3JtYWxpemVkIHNpZ25lZCBtdXRhdGlvbi5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2lnbmVkU3luY011dGF0aW9uKHNpZ25lZE11dGF0aW9uKSB7XG4gIGlmICghc2lnbmVkTXV0YXRpb24gfHwgdHlwZW9mIHNpZ25lZE11dGF0aW9uICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoc2lnbmVkTXV0YXRpb24pKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBzaWduZWQgc3luYyBtdXRhdGlvbiBvYmplY3RcIilcbiAgaWYgKHNpZ25lZE11dGF0aW9uLmFsZ29yaXRobSAhPT0gRUNEU0FfUDI1Nl9TSEEyNTZfQUxHT1JJVEhNKSB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHN5bmMgbXV0YXRpb24gYWxnb3JpdGhtICcke1N0cmluZyhzaWduZWRNdXRhdGlvbi5hbGdvcml0aG0pfSdgKVxuXG4gIHJldHVybiB7XG4gICAgYWxnb3JpdGhtOiBzaWduZWRNdXRhdGlvbi5hbGdvcml0aG0sXG4gICAgZGV2aWNlQ2VydGlmaWNhdGU6IG5vcm1hbGl6ZURldmljZUNlcnRpZmljYXRlKHNpZ25lZE11dGF0aW9uLmRldmljZUNlcnRpZmljYXRlKSxcbiAgICBtdXRhdGlvbjogbm9ybWFsaXplU3luY011dGF0aW9uKHNpZ25lZE11dGF0aW9uLm11dGF0aW9uKSxcbiAgICBzaWduYXR1cmU6IG5vcm1hbGl6ZVNpZ25hdHVyZShzaWduZWRNdXRhdGlvbi5zaWduYXR1cmUsIFwic3luYyBtdXRhdGlvbiBzaWduYXR1cmVcIilcbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBzeW5jIG11dGF0aW9uIHBheWxvYWQuXG4gKiBAcGFyYW0ge1N5bmNNdXRhdGlvbn0gbXV0YXRpb24gLSBNdXRhdGlvbiBwYXlsb2FkLlxuICogQHJldHVybnMge1N5bmNNdXRhdGlvbn0gLSBOb3JtYWxpemVkIG11dGF0aW9uIHBheWxvYWQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN5bmNNdXRhdGlvbihtdXRhdGlvbikge1xuICBpZiAoIW11dGF0aW9uIHx8IHR5cGVvZiBtdXRhdGlvbiAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG11dGF0aW9uKSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgc3luYyBtdXRhdGlvbiBvYmplY3RcIilcblxuICAvKiogQHR5cGUge1N5bmNNdXRhdGlvbn0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHtcbiAgICBhY3RvckRldmljZUlkOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5hY3RvckRldmljZUlkLCBcImFjdG9yRGV2aWNlSWRcIiksXG4gICAgYWN0b3JVc2VySWQ6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLmFjdG9yVXNlcklkLCBcImFjdG9yVXNlcklkXCIpLFxuICAgIGNsaWVudE11dGF0aW9uSWQ6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsIFwiY2xpZW50TXV0YXRpb25JZFwiKSxcbiAgICBtb2RlbDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24ubW9kZWwsIFwibW9kZWxcIiksXG4gICAgb2NjdXJyZWRBdDogaXNvRGF0ZVN0cmluZyhuZXcgRGF0ZShyZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5vY2N1cnJlZEF0LCBcIm9jY3VycmVkQXRcIikpLCBcIm9jY3VycmVkQXRcIiksXG4gICAgb2ZmbGluZUdyYW50SWQ6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLm9mZmxpbmVHcmFudElkLCBcIm9mZmxpbmVHcmFudElkXCIpLFxuICAgIG9wZXJhdGlvbjogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24ub3BlcmF0aW9uLCBcIm9wZXJhdGlvblwiKSxcbiAgICBwb2xpY3lIYXNoOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5wb2xpY3lIYXNoLCBcInBvbGljeUhhc2hcIilcbiAgfVxuXG4gIGlmIChtdXRhdGlvbi5hdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQuYXR0cmlidXRlcyA9IGRldGVybWluaXN0aWNKc29uT2JqZWN0KHtsYWJlbDogXCJhdHRyaWJ1dGVzXCIsIHZhbHVlOiBtdXRhdGlvbi5hdHRyaWJ1dGVzfSlcbiAgaWYgKG11dGF0aW9uLmJhc2VWZXJzaW9uICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQuYmFzZVZlcnNpb24gPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlciB8IG51bGx9ICovIChkZXRlcm1pbmlzdGljSnNvbih7bGFiZWw6IFwiYmFzZVZlcnNpb25cIiwgdmFsdWU6IG11dGF0aW9uLmJhc2VWZXJzaW9ufSkpXG4gIGlmIChtdXRhdGlvbi5jb21tYW5kICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQuY29tbWFuZCA9IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLmNvbW1hbmQsIFwiY29tbWFuZFwiKVxuICBpZiAobXV0YXRpb24ucGF5bG9hZCAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLnBheWxvYWQgPSBkZXRlcm1pbmlzdGljSnNvbk9iamVjdCh7bGFiZWw6IFwicGF5bG9hZFwiLCB2YWx1ZTogbXV0YXRpb24ucGF5bG9hZH0pXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRcbn1cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgbXV0YXRpb24gYWN0b3IgZmllbGRzIG1hdGNoIHRoZSBjZXJ0aWZpY2F0ZSBhY3Rvci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtEZXZpY2VDZXJ0aWZpY2F0ZVBheWxvYWR9IGFyZ3MuY2VydGlmaWNhdGUgLSBEZXZpY2UgY2VydGlmaWNhdGUgcGF5bG9hZC5cbiAqIEBwYXJhbSB7U3luY011dGF0aW9ufSBhcmdzLm11dGF0aW9uIC0gTXV0YXRpb24gcGF5bG9hZC5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0TXV0YXRpb25NYXRjaGVzQ2VydGlmaWNhdGUoe2NlcnRpZmljYXRlLCBtdXRhdGlvbn0pIHtcbiAgaWYgKG11dGF0aW9uLmFjdG9yRGV2aWNlSWQgIT09IGNlcnRpZmljYXRlLmFjdG9yRGV2aWNlSWQgfHwgbXV0YXRpb24uYWN0b3JVc2VySWQgIT09IGNlcnRpZmljYXRlLmFjdG9yVXNlcklkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3luYyBtdXRhdGlvbiBhY3RvciBkb2VzIG5vdCBtYXRjaCBkZXZpY2UgY2VydGlmaWNhdGVcIilcbiAgfVxufVxuXG4vKipcbiAqIEFzc2VydHMgYSB0aW1lc3RhbXAgaXMgbm90IGV4cGlyZWQuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmV4cGlyZXNBdCAtIEV4cGlyeSB0aW1lc3RhbXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5sYWJlbCAtIEVycm9yIGxhYmVsLlxuICogQHBhcmFtIHtEYXRlfSBhcmdzLm5vdyAtIFZlcmlmaWNhdGlvbiB0aW1lLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBhc3NlcnROb3RFeHBpcmVkKHtleHBpcmVzQXQsIGxhYmVsLCBub3d9KSB7XG4gIGlmIChOdW1iZXIuaXNOYU4obm93LmdldFRpbWUoKSkpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc3luYyB2ZXJpZmljYXRpb24gdGltZVwiKVxuICBpZiAobmV3IERhdGUoZXhwaXJlc0F0KS5nZXRUaW1lKCkgPD0gbm93LmdldFRpbWUoKSkgdGhyb3cgbmV3IEVycm9yKGAke2xhYmVsfSBleHBpcmVkYClcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgSlNPTiBXZWIgS2V5IG9iamVjdC5cbiAqIEBwYXJhbSB7U3luY0pzb25XZWJLZXl9IGtleSAtIEpXSy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIEtleSBsYWJlbC5cbiAqIEByZXR1cm5zIHtTeW5jSnNvbldlYktleX0gLSBOb3JtYWxpemVkIEpXSy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplSndrKGtleSwgbGFiZWwpIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGRldGVybWluaXN0aWNKc29uT2JqZWN0KHtsYWJlbCwgdmFsdWU6IGtleX0pXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7U3luY0pzb25XZWJLZXl9ICovIChub3JtYWxpemVkKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBwcmVmaXhlZCBzaWduYXR1cmUgc3RyaW5nLlxuICogQHBhcmFtIHt1bmtub3dufSBzaWduYXR1cmUgLSBTaWduYXR1cmUgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBFcnJvciBsYWJlbC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU2lnbmF0dXJlIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2lnbmF0dXJlKHNpZ25hdHVyZSwgbGFiZWwpIHtcbiAgaWYgKHR5cGVvZiBzaWduYXR1cmUgIT09IFwic3RyaW5nXCIgfHwgIXNpZ25hdHVyZS5zdGFydHNXaXRoKEVDRFNBX1AyNTZfU0hBMjU2X1NJR05BVFVSRV9QUkVGSVgpKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7bGFiZWx9YClcblxuICByZXR1cm4gc2lnbmF0dXJlXG59XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgc2lnbmF0dXJlIHByZWZpeC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzaWduYXR1cmUgLSBQcmVmaXhlZCBzaWduYXR1cmUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEJhc2U2NHVybCBzaWduYXR1cmUgYm9keS5cbiAqL1xuZnVuY3Rpb24gc2lnbmF0dXJlV2l0aG91dFByZWZpeChzaWduYXR1cmUpIHtcbiAgcmV0dXJuIHNpZ25hdHVyZS5zbGljZShFQ0RTQV9QMjU2X1NIQTI1Nl9TSUdOQVRVUkVfUFJFRklYLmxlbmd0aClcbn1cblxuLyoqXG4gKiBSZXF1aXJlcyBhIG5vbi1lbXB0eSBzdHJpbmcgZmllbGQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gVmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIEZpZWxkIG5hbWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFN0cmluZyB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcmVxdWlyZWRTdHJpbmcodmFsdWUsIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiB8fCB2YWx1ZS5sZW5ndGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHN5bmMgJHtuYW1lfWApXG5cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIERhdGUgdG8gYW4gSVNPIHRpbWVzdGFtcC5cbiAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSAtIERhdGUgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBGaWVsZCBsYWJlbC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSVNPIHRpbWVzdGFtcC5cbiAqL1xuZnVuY3Rpb24gaXNvRGF0ZVN0cmluZyhkYXRlLCBsYWJlbCkge1xuICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHN5bmMgJHtsYWJlbH1gKVxuXG4gIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGVuY29kZWQgVVRGLTggYnl0ZXMgZm9yIGEgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gU3RyaW5nIHZhbHVlLlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IC0gVVRGLTggYnl0ZXMuXG4gKi9cbmZ1bmN0aW9uIHV0ZjgodmFsdWUpIHtcbiAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh2YWx1ZSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIFdlYkNyeXB0byBzdWJ0bGUgQVBJLlxuICogQHJldHVybnMge1N1YnRsZUNyeXB0b30gLSBTdWJ0bGVDcnlwdG8gaW1wbGVtZW50YXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNyeXB0b1N1YnRsZSgpIHtcbiAgaWYgKCFnbG9iYWxUaGlzLmNyeXB0bz8uc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJXZWJDcnlwdG8gc3VidGxlIEFQSSBpcyByZXF1aXJlZCBmb3Igc3luYyBzaWduaW5nXCIpXG5cbiAgcmV0dXJuIGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZVxufVxuXG4vKipcbiAqIEJhc2U2NHVybC1lbmNvZGVzIGJ5dGVzLlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlcyAtIEJ5dGVzLlxuICogQHJldHVybnMge3N0cmluZ30gLSBCYXNlNjR1cmwgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlNjRVcmxFbmNvZGUoYnl0ZXMpIHtcbiAgbGV0IGJpbmFyeSA9IFwiXCJcblxuICBmb3IgKGNvbnN0IGJ5dGUgb2YgYnl0ZXMpIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGUpXG5cbiAgcmV0dXJuIGJ0b2EoYmluYXJ5KS5yZXBsYWNlQWxsKFwiK1wiLCBcIi1cIikucmVwbGFjZUFsbChcIi9cIiwgXCJfXCIpLnJlcGxhY2VBbGwoXCI9XCIsIFwiXCIpXG59XG5cbi8qKlxuICogQmFzZTY0dXJsLWRlY29kZXMgYnl0ZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBCYXNlNjR1cmwgc3RyaW5nLlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IC0gQnl0ZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2U2NFVybERlY29kZSh2YWx1ZSkge1xuICBjb25zdCBiYXNlNjQgPSB2YWx1ZS5yZXBsYWNlQWxsKFwiLVwiLCBcIitcIikucmVwbGFjZUFsbChcIl9cIiwgXCIvXCIpLnBhZEVuZChNYXRoLmNlaWwodmFsdWUubGVuZ3RoIC8gNCkgKiA0LCBcIj1cIilcbiAgY29uc3QgYmluYXJ5ID0gYXRvYihiYXNlNjQpXG5cbiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShiaW5hcnksIChjaGFyKSA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpXG59XG5cbi8qKlxuICogU3RhYmxlIEpTT04gc3RyaW5naWZpZXIgd2l0aCBzb3J0ZWQgb2JqZWN0IGtleXMuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEpTT04gc3RyaW5nLlxuICovXG5mdW5jdGlvbiBzdGFibGVKc29uU3RyaW5naWZ5KHZhbHVlKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShkZXRlcm1pbmlzdGljSnNvbih7bGFiZWw6IFwicm9vdFwiLCB2YWx1ZX0pKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSB2YWx1ZSBhcyBhIEpTT04gb2JqZWN0LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5sYWJlbCAtIERpYWdub3N0aWMgbGFiZWwuXG4gKiBAcGFyYW0ge3Vua25vd259IGFyZ3MudmFsdWUgLSBWYWx1ZS5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gLSBKU09OIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5pc3RpY0pzb25PYmplY3Qoe2xhYmVsLCB2YWx1ZX0pIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGRldGVybWluaXN0aWNKc29uKHtsYWJlbCwgdmFsdWV9KVxuXG4gIGlmICghbm9ybWFsaXplZCB8fCB0eXBlb2Ygbm9ybWFsaXplZCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWQpKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHN5bmMgJHtsYWJlbH0gb2JqZWN0YClcblxuICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gKi8gKG5vcm1hbGl6ZWQpXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBkZXRlcm1pbmlzdGljIEpTT04gd2l0aCBzb3J0ZWQgb2JqZWN0IGtleXMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmxhYmVsIC0gRGlhZ25vc3RpYyBsYWJlbC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJncy52YWx1ZSAtIFZhbHVlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWV9IC0gTm9ybWFsaXplZCBKU09OIHZhbHVlLlxuICovXG5mdW5jdGlvbiBkZXRlcm1pbmlzdGljSnNvbih7bGFiZWwsIHZhbHVlfSkge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gdmFsdWVcblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5tYXAoKGVudHJ5LCBpbmRleCkgPT4gZGV0ZXJtaW5pc3RpY0pzb24oe2xhYmVsOiBgJHtsYWJlbH0vJHtpbmRleH1gLCB2YWx1ZTogZW50cnl9KSlcblxuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAqL1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB7fVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpLnNvcnQoKSkge1xuICAgICAgY29uc3QgY2hpbGRWYWx1ZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSlba2V5XVxuXG4gICAgICBpZiAoY2hpbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgbm9ybWFsaXplZFtrZXldID0gZGV0ZXJtaW5pc3RpY0pzb24oe2xhYmVsOiBgJHtsYWJlbH0vJHtrZXl9YCwgdmFsdWU6IGNoaWxkVmFsdWV9KVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgJHtsYWJlbH0gbXVzdCBiZSBkZXRlcm1pbmlzdGljIEpTT05gKVxufVxuIl19
@@ -9,7 +9,6 @@
9
9
  * Implementations should store each mutation log record as its own row/entry.
10
10
  * Native apps should back this with SQLite and indexes on storage key, status,
11
11
  * and sequence. Avoid storing the whole log as one JSON blob.
12
- *
13
12
  * @typedef {object} LocalMutationLogStorage
14
13
  * @property {(storageKey: string, record: LocalMutationLogRecord) => Promise<void> | void} appendRecord - Appends one log record.
15
14
  * @property {(storageKey: string, ids: string[]) => Promise<void> | void} deleteRecords - Deletes log records by id.
@@ -1 +1 @@
1
- {"version":3,"file":"local-mutation-log.d.ts","sourceRoot":"","sources":["../../../src/sync/local-mutation-log.js"],"names":[],"mappings":"AAUA;;;;GAIG;AAEH;;;;;;;;;;;;;;GAcG;AAEH;;;;;GAKG;AAEH;;;KAGK;AAEL;;;;;;;;;;;GAWG;AAEH,mFAAmF;AACnF;IACE;;;;;;;OAOG;IACH,uDALG;QAA4B,WAAW,UAAzB,MAAM;QACM,GAAG,UAAf,IAAI;QACoB,OAAO,EAArC,uBAAuB;QACT,UAAU;KAClC,EAUA;IAJC,mBAVe,MAAM,CAUS;IAC9B,WAVe,IAAI,CAUL;IACd,iCAAsB;IACtB,mBAA4B;IAG9B;;;;;;OAMG;IACH,mCAJG;QAAyC,YAAY;QACK,QAAQ,EAA1D,OAAO,sBAAsB,EAAE,YAAY;KACnD,GAAU,OAAO,CAAC,sBAAsB,CAAC,CAmB3C;IAED;;;OAGG;IACH,WAFa,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAI7C;IAED;;;OAGG;IACH,kBAFa,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAI7C;IAED;;;;;;;OAOG;IACH,yCALG;QAAqB,EAAE,EAAf,MAAM;QACoB,MAAM,EAAhC,mBAAmB;QACmE,UAAU;KACxG,GAAU,OAAO,CAAC,sBAAsB,CAAC,CAmB3C;IAED;;;;;;OAMG;IACH,sDAJG;QAAsB,kBAAkB;QAClB,mBAAmB;KACzC,GAAU,OAAO,CAAC;QAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;KAAC,CAAC,CAkCjD;IAED;;;OAGG;IACH,oBAFa,MAAM,CAQlB;CACF;;;;;;;;;;;;;;;;;;;;;kBA/Ka,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;;;;mBAC5E,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;;;;kBAC3D,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM;;;;YAChD,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,sBAAsB,GAAG,IAAI,GAAG,SAAS;;;;aAClI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,8BAA8B,KAAK,OAAO,CAAC,sBAAsB,EAAE,CAAC,GAAG,sBAAsB,EAAE;;;;kBAC9H,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;;;;;;;;;sBAM5E,MAAM;;;;WACN,MAAM;;;;;kCAKP,SAAS,GAAG,iBAAiB,GAAG,cAAc,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ;;;;;;;;eAMlF,MAAM;;;;kBACN,uBAAuB,EAAE;;;;QACzB,MAAM;;;;cACN,OAAO,sBAAsB,EAAE,YAAY;;;;cAC3C,MAAM;;;;YACN,mBAAmB;;;;;;;;eAEnB,MAAM"}
1
+ {"version":3,"file":"local-mutation-log.d.ts","sourceRoot":"","sources":["../../../src/sync/local-mutation-log.js"],"names":[],"mappings":"AAUA;;;;GAIG;AAEH;;;;;;;;;;;;;GAaG;AAEH;;;;;GAKG;AAEH;;;KAGK;AAEL;;;;;;;;;;;GAWG;AAEH,mFAAmF;AACnF;IACE;;;;;;;OAOG;IACH,uDALG;QAA4B,WAAW,UAAzB,MAAM;QACM,GAAG,UAAf,IAAI;QACoB,OAAO,EAArC,uBAAuB;QACT,UAAU;KAClC,EAUA;IAJC,mBAVe,MAAM,CAUS;IAC9B,WAVe,IAAI,CAUL;IACd,iCAAsB;IACtB,mBAA4B;IAG9B;;;;;;OAMG;IACH,mCAJG;QAAyC,YAAY;QACK,QAAQ,EAA1D,OAAO,sBAAsB,EAAE,YAAY;KACnD,GAAU,OAAO,CAAC,sBAAsB,CAAC,CAmB3C;IAED;;;OAGG;IACH,WAFa,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAI7C;IAED;;;OAGG;IACH,kBAFa,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAI7C;IAED;;;;;;;OAOG;IACH,yCALG;QAAqB,EAAE,EAAf,MAAM;QACoB,MAAM,EAAhC,mBAAmB;QACmE,UAAU;KACxG,GAAU,OAAO,CAAC,sBAAsB,CAAC,CAmB3C;IAED;;;;;;OAMG;IACH,sDAJG;QAAsB,kBAAkB;QAClB,mBAAmB;KACzC,GAAU,OAAO,CAAC;QAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;KAAC,CAAC,CAkCjD;IAED;;;OAGG;IACH,oBAFa,MAAM,CAQlB;CACF;;;;;;;;;;;;;;;;;;;;;kBA/Ka,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;;;;mBAC5E,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;;;;kBAC3D,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM;;;;YAChD,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,sBAAsB,GAAG,IAAI,GAAG,SAAS;;;;aAClI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,8BAA8B,KAAK,OAAO,CAAC,sBAAsB,EAAE,CAAC,GAAG,sBAAsB,EAAE;;;;kBAC9H,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;;;;;;;;;sBAM5E,MAAM;;;;WACN,MAAM;;;;;kCAKP,SAAS,GAAG,iBAAiB,GAAG,cAAc,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ;;;;;;;;eAMlF,MAAM;;;;kBACN,uBAAuB,EAAE;;;;QACzB,MAAM;;;;cACN,OAAO,sBAAsB,EAAE,YAAY;;;;cAC3C,MAAM;;;;YACN,mBAAmB;;;;;;;;eAEnB,MAAM"}
@@ -17,7 +17,6 @@ const STORAGE_KEY_LOCKS = new Map();
17
17
  * Implementations should store each mutation log record as its own row/entry.
18
18
  * Native apps should back this with SQLite and indexes on storage key, status,
19
19
  * and sequence. Avoid storing the whole log as one JSON blob.
20
- *
21
20
  * @typedef {object} LocalMutationLogStorage
22
21
  * @property {(storageKey: string, record: LocalMutationLogRecord) => Promise<void> | void} appendRecord - Appends one log record.
23
22
  * @property {(storageKey: string, ids: string[]) => Promise<void> | void} deleteRecords - Deletes log records by id.
@@ -401,4 +400,4 @@ function randomRecordId() {
401
400
  return cryptoProvider.randomUUID();
402
401
  return `local-mutation-${Date.now()}-${Math.random().toString(16).slice(2)}`;
403
402
  }
404
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtbXV0YXRpb24tbG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvbG9jYWwtbXV0YXRpb24tbG9nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixNQUFNLG1CQUFtQixHQUFHLGlDQUFpQyxDQUFBO0FBQzdELE1BQU0scUJBQXFCLEdBQUcsb0NBQW9DLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFBO0FBQ25ILE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQTtBQUN2RCxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7QUFDMUYsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO0FBQ3pELDRDQUE0QztBQUM1QyxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7QUFFbkM7Ozs7R0FJRztBQUVIOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7O0tBR0s7QUFFTDs7Ozs7Ozs7Ozs7R0FXRztBQUVILG1GQUFtRjtBQUNuRixNQUFNLENBQUMsT0FBTyxPQUFPLGdCQUFnQjtJQUNuQzs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxFQUFDLFdBQVcsR0FBRyxjQUFjLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsR0FBRyxtQkFBbUIsRUFBQztRQUMzRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxnSEFBZ0gsQ0FBQyxDQUFBO1FBQ25JLENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtRQUM5QixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQTtRQUNkLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO1FBQ3RCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO0lBQzlCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUMsWUFBWSxHQUFHLEVBQUUsRUFBRSxRQUFRLEVBQUM7UUFDeEMsT0FBTyxNQUFNLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDMUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUE7WUFDekMsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDO2dCQUM3QixTQUFTLEVBQUUsU0FBUztnQkFDcEIsWUFBWTtnQkFDWixFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDdEIsUUFBUTtnQkFDUixRQUFRLEVBQUUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUMxRCxNQUFNLEVBQUUsU0FBUztnQkFDakIsU0FBUyxFQUFFLFNBQVM7YUFDckIsQ0FBQyxDQUFBO1lBRUYsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO1lBRXJFLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzVCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1gsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO0lBQ3pFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsY0FBYztRQUNsQixPQUFPLG1CQUFtQixDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFDLFFBQVEsRUFBRSxxQkFBcUIsRUFBQyxDQUFDLENBQUMsQ0FBQTtJQUM1RyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBQztRQUN6QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLE1BQU0sR0FBRyxDQUFDLENBQUE7UUFFaEcsT0FBTyxNQUFNLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDMUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1lBRWhFLElBQUksQ0FBQyxTQUFTO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLEVBQUUsR0FBRyxDQUFDLENBQUE7WUFFdkUsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBRXpDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsa0NBQWtDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUMzRCxJQUFJLFVBQVUsS0FBSyxTQUFTO2dCQUFFLE1BQU0sQ0FBQyxVQUFVLEdBQUcsZUFBZSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQTtZQUMzRixNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1lBQzFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtZQUVyRSxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM1QixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUMsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUMsR0FBRyxFQUFFO1FBQzFELE9BQU8sTUFBTSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzFELE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBQ3BDLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxHQUFHLENBQ3hDLE9BQU87aUJBQ0osTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDO2lCQUN2RixPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUM3RixDQUFBO1lBQ0QsTUFBTSxlQUFlLEdBQUcsT0FBTztpQkFDNUIsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUN4RCxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztpQkFDckYsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUE7WUFDbEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtZQUUzQixJQUFJLE9BQU8sa0JBQWtCLEtBQUssUUFBUSxJQUFJLGtCQUFrQixJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN0RSxLQUFLLE1BQU0sTUFBTSxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUM7b0JBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDMUYsQ0FBQztZQUVELElBQUksT0FBTyxtQkFBbUIsS0FBSyxRQUFRLElBQUksbUJBQW1CLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3hFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQTtnQkFFekQsS0FBSyxNQUFNLE1BQU0sSUFBSSxlQUFlLEVBQUUsQ0FBQztvQkFDckMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsTUFBTTt3QkFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtnQkFDN0UsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7WUFFOUMsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFBRSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtZQUVwRyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsQ0FBQTtRQUMzQixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0I7UUFDZCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUE7UUFFdkIsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFBO1FBRS9ILE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQzNCLENBQUM7Q0FDRjtBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxPQUFPO0lBQzNCLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRXpELE1BQU0sYUFBYSxHQUFHLHNDQUFzQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUE7SUFFdEUsT0FBTyxPQUFPLGFBQWEsQ0FBQyxZQUFZLEtBQUssVUFBVTtXQUNsRCxPQUFPLGFBQWEsQ0FBQyxhQUFhLEtBQUssVUFBVTtXQUNqRCxPQUFPLGFBQWEsQ0FBQyxZQUFZLEtBQUssVUFBVTtXQUNoRCxPQUFPLGFBQWEsQ0FBQyxNQUFNLEtBQUssVUFBVTtXQUMxQyxPQUFPLGFBQWEsQ0FBQyxPQUFPLEtBQUssVUFBVTtXQUMzQyxPQUFPLGFBQWEsQ0FBQyxZQUFZLEtBQUssVUFBVSxDQUFBO0FBQ3ZELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMseUJBQXlCLENBQUMsSUFBSSxFQUFFLEtBQUs7SUFDNUMsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7SUFFekUsSUFBSSxtQkFBbUIsS0FBSyxDQUFDO1FBQUUsT0FBTyxtQkFBbUIsQ0FBQTtJQUV6RCxPQUFPLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQTtBQUN2QyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsbUJBQW1CLENBQUMsT0FBTztJQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUE7SUFFakcsT0FBTyxPQUFPO1NBQ1gsR0FBRyxDQUFDLGVBQWUsQ0FBQztTQUNwQixJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7U0FDckQsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtBQUN6QyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsS0FBSyxVQUFVLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BELE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDdkUsSUFBSSxPQUFPLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFBO0lBQ3RCLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDaEYsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBRWxFLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFFMUMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQTtRQUVwQyxPQUFPLE1BQU0sUUFBUSxFQUFFLENBQUE7SUFDekIsQ0FBQztZQUFTLENBQUM7UUFDVCxPQUFPLEVBQUUsQ0FBQTtRQUNULElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLE9BQU87WUFBRSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDekYsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsS0FBSztJQUM1QixJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQTtJQUU3SCxNQUFNLE1BQU0sR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzdELE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBRXRELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsTUFBTSxHQUFHLENBQUMsQ0FBQTtJQUVoRyxNQUFNLFVBQVUsR0FBRztRQUNqQixTQUFTLEVBQUUsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUM7UUFDOUQsWUFBWSxFQUFFLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFDeEQsRUFBRSxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQztRQUNuQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUM1QyxRQUFRLEVBQUUsdUJBQXVCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7UUFDOUQsTUFBTSxFQUFFLGtDQUFrQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ25ELFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQztLQUMvRCxDQUFBO0lBRUQsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLFNBQVM7UUFBRSxPQUFPLFVBQVUsQ0FBQTtJQUV0RCxPQUFPO1FBQ0wsR0FBRyxVQUFVO1FBQ2IsVUFBVSxFQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQztLQUM3RCxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHFCQUFxQixDQUFDLEtBQUs7SUFDbEMsSUFBSSxLQUFLLEtBQUssU0FBUztRQUFFLE9BQU8sRUFBRSxDQUFBO0lBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQTtJQUV4RixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtRQUM5QixJQUFJLENBQUMsVUFBVSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDL0UsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFBO1FBQzlELENBQUM7UUFFRCxNQUFNLGdCQUFnQixHQUFHLHNDQUFzQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUE7UUFFNUUsT0FBTztZQUNMLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSw2QkFBNkIsQ0FBQztZQUNsRyxLQUFLLEVBQUUsY0FBYyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQztTQUNsRSxDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBSztJQUM5QixJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQTtJQUV2SCxNQUFNLFFBQVEsR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQy9ELE1BQU0sVUFBVSxHQUFHLDBEQUEwRCxDQUFDLENBQUM7UUFDN0UsYUFBYSxFQUFFLGNBQWMsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLGVBQWUsQ0FBQztRQUN0RSxXQUFXLEVBQUUsY0FBYyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDO1FBQ2hFLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUM7UUFDL0UsS0FBSyxFQUFFLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztRQUM5QyxVQUFVLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUM7UUFDbkUsY0FBYyxFQUFFLGNBQWMsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLGdCQUFnQixDQUFDO1FBQ3pFLFNBQVMsRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUM7UUFDMUQsVUFBVSxFQUFFLGNBQWMsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQztLQUM5RCxDQUFDLENBQUE7SUFFRixJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssU0FBUztRQUFFLFVBQVUsQ0FBQyxVQUFVLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUE7SUFDakgsSUFBSSxRQUFRLENBQUMsV0FBVyxLQUFLLFNBQVM7UUFBRSxVQUFVLENBQUMsV0FBVyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUN2RyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEtBQUssU0FBUztRQUFFLFVBQVUsQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDcEcsSUFBSSxRQUFRLENBQUMsT0FBTyxLQUFLLFNBQVM7UUFBRSxVQUFVLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBRXJHLE9BQU8sVUFBVSxDQUFBO0FBQ25CLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsY0FBYyxDQUFDLEtBQUssRUFBRSxLQUFLO0lBQ2xDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLEtBQUssRUFBRSxDQUFDLENBQUE7SUFFdEcsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLG9CQUFvQixDQUFDLEtBQUssRUFBRSxLQUFLO0lBQ3hDLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFDaEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7SUFFbEMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxXQUFXO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsS0FBSyxnQkFBZ0IsQ0FBQyxDQUFBO0lBRXpJLE9BQU8sV0FBVyxDQUFBO0FBQ3BCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLEtBQUs7SUFDM0MsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsS0FBSyxtQkFBbUIsQ0FBQyxDQUFBO0lBRTVJLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEtBQUs7SUFDN0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFFMUYsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFBO0FBQ2hGLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsY0FBYyxDQUFDLEtBQUssRUFBRSxLQUFLO0lBQ2xDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssS0FBSyxVQUFVO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsS0FBSyxFQUFFLENBQUMsQ0FBQTtJQUUzSCxPQUFPLDZFQUE2RSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUMxSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGVBQWUsQ0FBQyxLQUFLLEVBQUUsS0FBSztJQUNuQyxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLEtBQUssU0FBUyxDQUFDLENBQUE7SUFFM0gsT0FBTyw2RkFBNkYsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtBQUNySSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsV0FBVyxDQUFDLE1BQU07SUFDekIsT0FBTyxxQ0FBcUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDbkYsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsY0FBYztJQUNyQixNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFBO0lBRXhDLElBQUksY0FBYyxJQUFJLE9BQU8sY0FBYyxDQUFDLFVBQVUsS0FBSyxVQUFVO1FBQUUsT0FBTyxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUE7SUFFekcsT0FBTyxrQkFBa0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7QUFDOUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5jb25zdCBERUZBVUxUX1NUT1JBR0VfS0VZID0gXCJ2ZWxvY2lvdXMuc3luYy5sb2NhbE11dGF0aW9uTG9nXCJcbmNvbnN0IFBFTkRJTkdfU1RBVFVTX1ZBTFVFUyA9IC8qKiBAdHlwZSB7TG9jYWxNdXRhdGlvblN0YXR1c1tdfSAqLyAoW1wicGVuZGluZ1wiLCBcImFwcGxpZWQtbG9jYWxseVwiLCBcInBlZXItYXBwbGllZFwiXSlcbmNvbnN0IFBFTkRJTkdfU1RBVFVTRVMgPSBuZXcgU2V0KFBFTkRJTkdfU1RBVFVTX1ZBTFVFUylcbmNvbnN0IE1VVEFUSU9OX1NUQVRVU0VTID0gbmV3IFNldChbLi4uUEVORElOR19TVEFUVVNFUywgXCJjb25mbGljdFwiLCBcInJlamVjdGVkXCIsIFwic3luY2VkXCJdKVxuY29uc3QgVEVSTUlOQUxfU1RBVFVTRVMgPSBuZXcgU2V0KFtcInJlamVjdGVkXCIsIFwic3luY2VkXCJdKVxuLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBQcm9taXNlPHVua25vd24+Pn0gKi9cbmNvbnN0IFNUT1JBR0VfS0VZX0xPQ0tTID0gbmV3IE1hcCgpXG5cbi8qKlxuICogTG9jYWwgbXV0YXRpb24gbG9nIHJlY29yZCBxdWVyeSBvcHRpb25zLlxuICogQHR5cGVkZWYge29iamVjdH0gTG9jYWxNdXRhdGlvbkxvZ1JlY29yZHNPcHRpb25zXG4gKiBAcHJvcGVydHkge0xvY2FsTXV0YXRpb25TdGF0dXNbXX0gW3N0YXR1c2VzXSAtIE9wdGlvbmFsIHN0YXR1cyBmaWx0ZXIuXG4gKi9cblxuLyoqXG4gKiBMb2NhbCBtdXRhdGlvbiBsb2cgcm93LW9yaWVudGVkIHN0b3JhZ2UgYWRhcHRlci5cbiAqXG4gKiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHN0b3JlIGVhY2ggbXV0YXRpb24gbG9nIHJlY29yZCBhcyBpdHMgb3duIHJvdy9lbnRyeS5cbiAqIE5hdGl2ZSBhcHBzIHNob3VsZCBiYWNrIHRoaXMgd2l0aCBTUUxpdGUgYW5kIGluZGV4ZXMgb24gc3RvcmFnZSBrZXksIHN0YXR1cyxcbiAqIGFuZCBzZXF1ZW5jZS4gQXZvaWQgc3RvcmluZyB0aGUgd2hvbGUgbG9nIGFzIG9uZSBKU09OIGJsb2IuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gTG9jYWxNdXRhdGlvbkxvZ1N0b3JhZ2VcbiAqIEBwcm9wZXJ0eSB7KHN0b3JhZ2VLZXk6IHN0cmluZywgcmVjb3JkOiBMb2NhbE11dGF0aW9uTG9nUmVjb3JkKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZH0gYXBwZW5kUmVjb3JkIC0gQXBwZW5kcyBvbmUgbG9nIHJlY29yZC5cbiAqIEBwcm9wZXJ0eSB7KHN0b3JhZ2VLZXk6IHN0cmluZywgaWRzOiBzdHJpbmdbXSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWR9IGRlbGV0ZVJlY29yZHMgLSBEZWxldGVzIGxvZyByZWNvcmRzIGJ5IGlkLlxuICogQHByb3BlcnR5IHsoc3RvcmFnZUtleTogc3RyaW5nKSA9PiBQcm9taXNlPG51bWJlcj4gfCBudW1iZXJ9IG5leHRTZXF1ZW5jZSAtIFJldHVybnMgdGhlIG5leHQgbG9jYWwgc2VxdWVuY2UgbnVtYmVyLlxuICogQHByb3BlcnR5IHsoc3RvcmFnZUtleTogc3RyaW5nLCBpZDogc3RyaW5nKSA9PiBQcm9taXNlPExvY2FsTXV0YXRpb25Mb2dSZWNvcmQgfCBudWxsIHwgdW5kZWZpbmVkPiB8IExvY2FsTXV0YXRpb25Mb2dSZWNvcmQgfCBudWxsIHwgdW5kZWZpbmVkfSByZWNvcmQgLSBSZWFkcyBvbmUgbG9nIHJlY29yZCBieSBpZC5cbiAqIEBwcm9wZXJ0eSB7KHN0b3JhZ2VLZXk6IHN0cmluZywgb3B0aW9ucz86IExvY2FsTXV0YXRpb25Mb2dSZWNvcmRzT3B0aW9ucykgPT4gUHJvbWlzZTxMb2NhbE11dGF0aW9uTG9nUmVjb3JkW10+IHwgTG9jYWxNdXRhdGlvbkxvZ1JlY29yZFtdfSByZWNvcmRzIC0gUmVhZHMgbG9nIHJlY29yZHMuXG4gKiBAcHJvcGVydHkgeyhzdG9yYWdlS2V5OiBzdHJpbmcsIHJlY29yZDogTG9jYWxNdXRhdGlvbkxvZ1JlY29yZCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWR9IHVwZGF0ZVJlY29yZCAtIFJlcGxhY2VzIG9uZSBsb2cgcmVjb3JkLlxuICovXG5cbi8qKlxuICogTG9jYWwgc3luYyBtdXRhdGlvbiBkZXBlbmRlbmN5IG1ldGFkYXRhLlxuICogQHR5cGVkZWYge29iamVjdH0gTG9jYWxNdXRhdGlvbkRlcGVuZGVuY3lcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjbGllbnRNdXRhdGlvbklkIC0gQ2xpZW50IG11dGF0aW9uIGlkIHRoaXMgbXV0YXRpb24gZGVwZW5kcyBvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2RlbCAtIERlcGVuZGVudCBtb2RlbC9yZXNvdXJjZSBuYW1lLlxuICovXG5cbi8qKlxuICogTG9jYWwgbXV0YXRpb24gbG9nIHN0YXR1cy5cbiAqIEB0eXBlZGVmIHtcInBlbmRpbmdcIiB8IFwiYXBwbGllZC1sb2NhbGx5XCIgfCBcInBlZXItYXBwbGllZFwiIHwgXCJjb25mbGljdFwiIHwgXCJyZWplY3RlZFwiIHwgXCJzeW5jZWRcIn0gTG9jYWxNdXRhdGlvblN0YXR1c1xuICogKi9cblxuLyoqXG4gKiBMb2NhbCBtdXRhdGlvbiBsb2cgcmVjb3JkLlxuICogQHR5cGVkZWYge29iamVjdH0gTG9jYWxNdXRhdGlvbkxvZ1JlY29yZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNyZWF0ZWRBdCAtIElTTyB0aW1lc3RhbXAgd2hlbiB0aGUgcmVjb3JkIHdhcyBjcmVhdGVkIGxvY2FsbHkuXG4gKiBAcHJvcGVydHkge0xvY2FsTXV0YXRpb25EZXBlbmRlbmN5W119IGRlcGVuZGVuY2llcyAtIE90aGVyIGxvY2FsIG11dGF0aW9ucyB0aGF0IG11c3QgcmVwbGF5IGZpcnN0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gTG9jYWwgbG9nIHJlY29yZCBpZC5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuU3luY011dGF0aW9ufSBtdXRhdGlvbiAtIERldmljZSBtdXRhdGlvbiBwYXlsb2FkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNlcXVlbmNlIC0gTW9ub3RvbmljIGxvY2FsIHNlcXVlbmNlLlxuICogQHByb3BlcnR5IHtMb2NhbE11dGF0aW9uU3RhdHVzfSBzdGF0dXMgLSBMb2NhbCByZXBsYXkvYXBwbHkgc3RhdHVzLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gW3N5bmNSZXN1bHRdIC0gQmFja2VuZCByZXBsYXkvcmVzdWx0IG1ldGFkYXRhLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVwZGF0ZWRBdCAtIElTTyB0aW1lc3RhbXAgd2hlbiB0aGUgcmVjb3JkIHdhcyBsYXN0IGNoYW5nZWQuXG4gKi9cblxuLyoqIENsaWVudC1zaWRlIGFwcGVuZC1vbmx5IHN5bmMgbXV0YXRpb24gbG9nIHdpdGggcGx1Z2dhYmxlIHBlcnNpc3RlbnQgc3RvcmFnZS4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvY2FsTXV0YXRpb25Mb2cge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGxvY2FsIG11dGF0aW9uIGxvZy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7KCkgPT4gc3RyaW5nfSBbYXJncy5pZEdlbmVyYXRvcl0gLSBSZWNvcmQgaWQgZ2VuZXJhdG9yLlxuICAgKiBAcGFyYW0geygpID0+IERhdGV9IFthcmdzLm5vd10gLSBDbG9jayBjYWxsYmFjay5cbiAgICogQHBhcmFtIHtMb2NhbE11dGF0aW9uTG9nU3RvcmFnZX0gYXJncy5zdG9yYWdlIC0gUGVyc2lzdGVudCBzdG9yYWdlIGFkYXB0ZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5zdG9yYWdlS2V5XSAtIFN0b3JhZ2Uga2V5LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2lkR2VuZXJhdG9yID0gcmFuZG9tUmVjb3JkSWQsIG5vdyA9ICgpID0+IG5ldyBEYXRlKCksIHN0b3JhZ2UsIHN0b3JhZ2VLZXkgPSBERUZBVUxUX1NUT1JBR0VfS0VZfSkge1xuICAgIGlmICghdmFsaWRTdG9yYWdlKHN0b3JhZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2NhbE11dGF0aW9uTG9nIHJlcXVpcmVzIHJvdyBzdG9yYWdlIHdpdGggYXBwZW5kUmVjb3JkL2RlbGV0ZVJlY29yZHMvbmV4dFNlcXVlbmNlL3JlY29yZC9yZWNvcmRzL3VwZGF0ZVJlY29yZFwiKVxuICAgIH1cblxuICAgIHRoaXMuaWRHZW5lcmF0b3IgPSBpZEdlbmVyYXRvclxuICAgIHRoaXMubm93ID0gbm93XG4gICAgdGhpcy5zdG9yYWdlID0gc3RvcmFnZVxuICAgIHRoaXMuc3RvcmFnZUtleSA9IHN0b3JhZ2VLZXlcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgcGVuZGluZyBtdXRhdGlvbiByZWNvcmQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge0xvY2FsTXV0YXRpb25EZXBlbmRlbmN5W119IFthcmdzLmRlcGVuZGVuY2llc10gLSBNdXRhdGlvbiBkZXBlbmRlbmNpZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuU3luY011dGF0aW9ufSBhcmdzLm11dGF0aW9uIC0gTXV0YXRpb24gcGF5bG9hZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8TG9jYWxNdXRhdGlvbkxvZ1JlY29yZD59IC0gQ3JlYXRlZCBsb2cgcmVjb3JkLlxuICAgKi9cbiAgYXN5bmMgYXBwZW5kKHtkZXBlbmRlbmNpZXMgPSBbXSwgbXV0YXRpb259KSB7XG4gICAgcmV0dXJuIGF3YWl0IHdpdGhTdG9yYWdlS2V5TG9jayh0aGlzLnN0b3JhZ2VLZXksIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IHRoaXMuY3VycmVudFRpbWVzdGFtcCgpXG4gICAgICBjb25zdCByZWNvcmQgPSBub3JtYWxpemVSZWNvcmQoe1xuICAgICAgICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCxcbiAgICAgICAgZGVwZW5kZW5jaWVzLFxuICAgICAgICBpZDogdGhpcy5pZEdlbmVyYXRvcigpLFxuICAgICAgICBtdXRhdGlvbixcbiAgICAgICAgc2VxdWVuY2U6IGF3YWl0IHRoaXMuc3RvcmFnZS5uZXh0U2VxdWVuY2UodGhpcy5zdG9yYWdlS2V5KSxcbiAgICAgICAgc3RhdHVzOiBcInBlbmRpbmdcIixcbiAgICAgICAgdXBkYXRlZEF0OiB0aW1lc3RhbXBcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZS5hcHBlbmRSZWNvcmQodGhpcy5zdG9yYWdlS2V5LCBjbG9uZVJlY29yZChyZWNvcmQpKVxuXG4gICAgICByZXR1cm4gY2xvbmVSZWNvcmQocmVjb3JkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgcmVjb3JkcyBvcmRlcmVkIGJ5IGxvY2FsIHNlcXVlbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2NhbE11dGF0aW9uTG9nUmVjb3JkW10+fSAtIExvZyByZWNvcmRzLlxuICAgKi9cbiAgYXN5bmMgcmVjb3JkcygpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplUmVjb3JkTGlzdChhd2FpdCB0aGlzLnN0b3JhZ2UucmVjb3Jkcyh0aGlzLnN0b3JhZ2VLZXkpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcmVjb3JkcyB0aGF0IHN0aWxsIG5lZWQgbG9jYWwvc2VydmVyIHJlY29uY2lsaWF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2NhbE11dGF0aW9uTG9nUmVjb3JkW10+fSAtIFBlbmRpbmcgcmVjb3Jkcy5cbiAgICovXG4gIGFzeW5jIHBlbmRpbmdSZWNvcmRzKCkge1xuICAgIHJldHVybiBub3JtYWxpemVSZWNvcmRMaXN0KGF3YWl0IHRoaXMuc3RvcmFnZS5yZWNvcmRzKHRoaXMuc3RvcmFnZUtleSwge3N0YXR1c2VzOiBQRU5ESU5HX1NUQVRVU19WQUxVRVN9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGEgcmVjb3JkIHN0YXR1cy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmlkIC0gUmVjb3JkIGlkLlxuICAgKiBAcGFyYW0ge0xvY2FsTXV0YXRpb25TdGF0dXN9IGFyZ3Muc3RhdHVzIC0gTmV3IHN0YXR1cy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gW2FyZ3Muc3luY1Jlc3VsdF0gLSBSZXN1bHQgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvY2FsTXV0YXRpb25Mb2dSZWNvcmQ+fSAtIFVwZGF0ZWQgcmVjb3JkLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlU3RhdHVzKHtpZCwgc3RhdHVzLCBzeW5jUmVzdWx0fSkge1xuICAgIGlmICghTVVUQVRJT05fU1RBVFVTRVMuaGFzKHN0YXR1cykpIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBsb2NhbCBtdXRhdGlvbiBzdGF0dXMgJyR7c3RhdHVzfSdgKVxuXG4gICAgcmV0dXJuIGF3YWl0IHdpdGhTdG9yYWdlS2V5TG9jayh0aGlzLnN0b3JhZ2VLZXksIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJhd1JlY29yZCA9IGF3YWl0IHRoaXMuc3RvcmFnZS5yZWNvcmQodGhpcy5zdG9yYWdlS2V5LCBpZClcblxuICAgICAgaWYgKCFyYXdSZWNvcmQpIHRocm93IG5ldyBFcnJvcihgTm8gbG9jYWwgbXV0YXRpb24gbG9nIHJlY29yZCAnJHtpZH0nYClcblxuICAgICAgY29uc3QgcmVjb3JkID0gbm9ybWFsaXplUmVjb3JkKHJhd1JlY29yZClcblxuICAgICAgcmVjb3JkLnN0YXR1cyA9IC8qKiBAdHlwZSB7TG9jYWxNdXRhdGlvblN0YXR1c30gKi8gKHN0YXR1cylcbiAgICAgIGlmIChzeW5jUmVzdWx0ICE9PSB1bmRlZmluZWQpIHJlY29yZC5zeW5jUmVzdWx0ID0gY2xvbmVKc29uT2JqZWN0KHN5bmNSZXN1bHQsIFwic3luY1Jlc3VsdFwiKVxuICAgICAgcmVjb3JkLnVwZGF0ZWRBdCA9IHRoaXMuY3VycmVudFRpbWVzdGFtcCgpXG4gICAgICBhd2FpdCB0aGlzLnN0b3JhZ2UudXBkYXRlUmVjb3JkKHRoaXMuc3RvcmFnZUtleSwgY2xvbmVSZWNvcmQocmVjb3JkKSlcblxuICAgICAgcmV0dXJuIGNsb25lUmVjb3JkKHJlY29yZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFBydW5lcyB0ZXJtaW5hbCByZWNvcmRzIHRoYXQgYXJlIG5vIGxvbmdlciBuZWVkZWQgZm9yIHJlcGxheSBkZXBlbmRlbmNpZXMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBDb21wYWN0aW9uIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5tYXhUZXJtaW5hbFJlY29yZHNdIC0gTWF4aW11bSB0ZXJtaW5hbCByZWNvcmRzIHRvIHJldGFpbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnRlcm1pbmFsUmV0ZW50aW9uTXNdIC0gTWluaW11bSBhZ2UgYmVmb3JlIHBydW5pbmcgdGVybWluYWwgcmVjb3Jkcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8e2RlbGV0ZWRSZWNvcmRJZHM6IHN0cmluZ1tdfT59IC0gQ29tcGFjdGlvbiByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjb21wYWN0KHttYXhUZXJtaW5hbFJlY29yZHMsIHRlcm1pbmFsUmV0ZW50aW9uTXN9ID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgd2l0aFN0b3JhZ2VLZXlMb2NrKHRoaXMuc3RvcmFnZUtleSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMucmVjb3JkcygpXG4gICAgICBjb25zdCBwcm90ZWN0ZWRDbGllbnRNdXRhdGlvbklkcyA9IG5ldyBTZXQoXG4gICAgICAgIHJlY29yZHNcbiAgICAgICAgICAuZmlsdGVyKChyZWNvcmQpID0+IFBFTkRJTkdfU1RBVFVTRVMuaGFzKHJlY29yZC5zdGF0dXMpIHx8IHJlY29yZC5zdGF0dXMgPT09IFwiY29uZmxpY3RcIilcbiAgICAgICAgICAuZmxhdE1hcCgocmVjb3JkKSA9PiByZWNvcmQuZGVwZW5kZW5jaWVzLm1hcCgoZGVwZW5kZW5jeSkgPT4gZGVwZW5kZW5jeS5jbGllbnRNdXRhdGlvbklkKSlcbiAgICAgIClcbiAgICAgIGNvbnN0IHRlcm1pbmFsUmVjb3JkcyA9IHJlY29yZHNcbiAgICAgICAgLmZpbHRlcigocmVjb3JkKSA9PiBURVJNSU5BTF9TVEFUVVNFUy5oYXMocmVjb3JkLnN0YXR1cykpXG4gICAgICAgIC5maWx0ZXIoKHJlY29yZCkgPT4gIXByb3RlY3RlZENsaWVudE11dGF0aW9uSWRzLmhhcyhyZWNvcmQubXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCkpXG4gICAgICAgIC5zb3J0KGNvbXBhcmVSZWNvcmRzTmV3ZXN0Rmlyc3QpXG4gICAgICBjb25zdCBkZWxldGVJZHMgPSBuZXcgU2V0KClcblxuICAgICAgaWYgKHR5cGVvZiBtYXhUZXJtaW5hbFJlY29yZHMgPT09IFwibnVtYmVyXCIgJiYgbWF4VGVybWluYWxSZWNvcmRzID49IDApIHtcbiAgICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgdGVybWluYWxSZWNvcmRzLnNsaWNlKG1heFRlcm1pbmFsUmVjb3JkcykpIGRlbGV0ZUlkcy5hZGQocmVjb3JkLmlkKVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHRlcm1pbmFsUmV0ZW50aW9uTXMgPT09IFwibnVtYmVyXCIgJiYgdGVybWluYWxSZXRlbnRpb25NcyA+PSAwKSB7XG4gICAgICAgIGNvbnN0IGN1dG9mZiA9IHRoaXMubm93KCkuZ2V0VGltZSgpIC0gdGVybWluYWxSZXRlbnRpb25Nc1xuXG4gICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHRlcm1pbmFsUmVjb3Jkcykge1xuICAgICAgICAgIGlmIChuZXcgRGF0ZShyZWNvcmQudXBkYXRlZEF0KS5nZXRUaW1lKCkgPCBjdXRvZmYpIGRlbGV0ZUlkcy5hZGQocmVjb3JkLmlkKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlbGV0ZWRSZWNvcmRJZHMgPSBBcnJheS5mcm9tKGRlbGV0ZUlkcylcblxuICAgICAgaWYgKGRlbGV0ZWRSZWNvcmRJZHMubGVuZ3RoID4gMCkgYXdhaXQgdGhpcy5zdG9yYWdlLmRlbGV0ZVJlY29yZHModGhpcy5zdG9yYWdlS2V5LCBkZWxldGVkUmVjb3JkSWRzKVxuXG4gICAgICByZXR1cm4ge2RlbGV0ZWRSZWNvcmRJZHN9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxvZyB0aW1lc3RhbXAuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQ3VycmVudCBJU08gdGltZXN0YW1wLlxuICAgKi9cbiAgY3VycmVudFRpbWVzdGFtcCgpIHtcbiAgICBjb25zdCBkYXRlID0gdGhpcy5ub3coKVxuXG4gICAgaWYgKCEoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHx8IE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkpIHRocm93IG5ldyBFcnJvcihcIkxvY2FsTXV0YXRpb25Mb2cgbm93KCkgbXVzdCByZXR1cm4gYSB2YWxpZCBEYXRlXCIpXG5cbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHN0b3JhZ2UgYWRhcHRlciBoYXMgYWxsIHJlcXVpcmVkIHJvdy1zdG9yZSBtZXRob2RzLlxuICogQHBhcmFtIHt1bmtub3dufSBzdG9yYWdlIC0gU3RvcmFnZSBhZGFwdGVyIGNhbmRpZGF0ZS5cbiAqIEByZXR1cm5zIHtzdG9yYWdlIGlzIExvY2FsTXV0YXRpb25Mb2dTdG9yYWdlfSAtIFdoZXRoZXIgc3RvcmFnZSBpcyB2YWxpZC5cbiAqL1xuZnVuY3Rpb24gdmFsaWRTdG9yYWdlKHN0b3JhZ2UpIHtcbiAgaWYgKCFzdG9yYWdlIHx8IHR5cGVvZiBzdG9yYWdlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBzdG9yYWdlT2JqZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHN0b3JhZ2UpXG5cbiAgcmV0dXJuIHR5cGVvZiBzdG9yYWdlT2JqZWN0LmFwcGVuZFJlY29yZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgJiYgdHlwZW9mIHN0b3JhZ2VPYmplY3QuZGVsZXRlUmVjb3JkcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgJiYgdHlwZW9mIHN0b3JhZ2VPYmplY3QubmV4dFNlcXVlbmNlID09PSBcImZ1bmN0aW9uXCJcbiAgICAmJiB0eXBlb2Ygc3RvcmFnZU9iamVjdC5yZWNvcmQgPT09IFwiZnVuY3Rpb25cIlxuICAgICYmIHR5cGVvZiBzdG9yYWdlT2JqZWN0LnJlY29yZHMgPT09IFwiZnVuY3Rpb25cIlxuICAgICYmIHR5cGVvZiBzdG9yYWdlT2JqZWN0LnVwZGF0ZVJlY29yZCA9PT0gXCJmdW5jdGlvblwiXG59XG5cbi8qKlxuICogU29ydHMgcmVjb3JkcyBieSBuZXdlc3QgdXBkYXRlL3NlcXVlbmNlIGZpcnN0LlxuICogQHBhcmFtIHtMb2NhbE11dGF0aW9uTG9nUmVjb3JkfSBsZWZ0IC0gTGVmdCByZWNvcmQuXG4gKiBAcGFyYW0ge0xvY2FsTXV0YXRpb25Mb2dSZWNvcmR9IHJpZ2h0IC0gUmlnaHQgcmVjb3JkLlxuICogQHJldHVybnMge251bWJlcn0gLSBTb3J0IHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZVJlY29yZHNOZXdlc3RGaXJzdChsZWZ0LCByaWdodCkge1xuICBjb25zdCB1cGRhdGVkQXRDb21wYXJpc29uID0gcmlnaHQudXBkYXRlZEF0LmxvY2FsZUNvbXBhcmUobGVmdC51cGRhdGVkQXQpXG5cbiAgaWYgKHVwZGF0ZWRBdENvbXBhcmlzb24gIT09IDApIHJldHVybiB1cGRhdGVkQXRDb21wYXJpc29uXG5cbiAgcmV0dXJuIHJpZ2h0LnNlcXVlbmNlIC0gbGVmdC5zZXF1ZW5jZVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYW5kIHNvcnRzIGEgbGlzdCBvZiByZWNvcmRzLlxuICogQHBhcmFtIHt1bmtub3dufSByZWNvcmRzIC0gUmF3IHJlY29yZHMuXG4gKiBAcmV0dXJucyB7TG9jYWxNdXRhdGlvbkxvZ1JlY29yZFtdfSAtIE5vcm1hbGl6ZWQgcmVjb3Jkcy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmVjb3JkTGlzdChyZWNvcmRzKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShyZWNvcmRzKSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbG9jYWwgbXV0YXRpb24gbG9nIHN0b3JhZ2UgcmVjb3JkcyBhcnJheVwiKVxuXG4gIHJldHVybiByZWNvcmRzXG4gICAgLm1hcChub3JtYWxpemVSZWNvcmQpXG4gICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LnNlcXVlbmNlIC0gcmlnaHQuc2VxdWVuY2UpXG4gICAgLm1hcCgocmVjb3JkKSA9PiBjbG9uZVJlY29yZChyZWNvcmQpKVxufVxuXG4vKipcbiAqIFJ1bnMgYSBjYWxsYmFjayBhZnRlciBlYXJsaWVyIHdyaXRlcyBmb3IgdGhlIHNhbWUgc3RvcmFnZSBrZXkgaGF2ZSBjb21wbGV0ZWQuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtzdHJpbmd9IHN0b3JhZ2VLZXkgLSBTdG9yYWdlIGtleSB0byBzZXJpYWxpemUuXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gcnVuIHVuZGVyIHRoZSBzdG9yYWdlLWtleSBsb2NrLlxuICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICovXG5hc3luYyBmdW5jdGlvbiB3aXRoU3RvcmFnZUtleUxvY2soc3RvcmFnZUtleSwgY2FsbGJhY2spIHtcbiAgY29uc3QgcHJldmlvdXMgPSBTVE9SQUdFX0tFWV9MT0NLUy5nZXQoc3RvcmFnZUtleSkgfHwgUHJvbWlzZS5yZXNvbHZlKClcbiAgbGV0IHJlbGVhc2UgPSAoKSA9PiB7fVxuICBjb25zdCBjdXJyZW50ID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsgcmVsZWFzZSA9ICgpID0+IHJlc29sdmUodW5kZWZpbmVkKSB9KVxuICBjb25zdCBjaGFpbmVkID0gcHJldmlvdXMuY2F0Y2goKF9lcnJvcikgPT4ge30pLnRoZW4oKCkgPT4gY3VycmVudClcblxuICBTVE9SQUdFX0tFWV9MT0NLUy5zZXQoc3RvcmFnZUtleSwgY2hhaW5lZClcblxuICB0cnkge1xuICAgIGF3YWl0IHByZXZpb3VzLmNhdGNoKChfZXJyb3IpID0+IHt9KVxuXG4gICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgfSBmaW5hbGx5IHtcbiAgICByZWxlYXNlKClcbiAgICBpZiAoU1RPUkFHRV9LRVlfTE9DS1MuZ2V0KHN0b3JhZ2VLZXkpID09PSBjaGFpbmVkKSBTVE9SQUdFX0tFWV9MT0NLUy5kZWxldGUoc3RvcmFnZUtleSlcbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBwZXJzaXN0ZWQgbG9nIHJlY29yZC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBSYXcgcmVjb3JkLlxuICogQHJldHVybnMge0xvY2FsTXV0YXRpb25Mb2dSZWNvcmR9IC0gTm9ybWFsaXplZCByZWNvcmQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlY29yZCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbG9jYWwgbXV0YXRpb24gbG9nIHJlY29yZCBvYmplY3RcIilcblxuICBjb25zdCByZWNvcmQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodmFsdWUpXG4gIGNvbnN0IHN0YXR1cyA9IHJlcXVpcmVkU3RyaW5nKHJlY29yZC5zdGF0dXMsIFwic3RhdHVzXCIpXG5cbiAgaWYgKCFNVVRBVElPTl9TVEFUVVNFUy5oYXMoc3RhdHVzKSkgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGxvY2FsIG11dGF0aW9uIHN0YXR1cyAnJHtzdGF0dXN9J2ApXG5cbiAgY29uc3QgYmFzZVJlY29yZCA9IHtcbiAgICBjcmVhdGVkQXQ6IHJlcXVpcmVkSXNvVGltZXN0YW1wKHJlY29yZC5jcmVhdGVkQXQsIFwiY3JlYXRlZEF0XCIpLFxuICAgIGRlcGVuZGVuY2llczogbm9ybWFsaXplRGVwZW5kZW5jaWVzKHJlY29yZC5kZXBlbmRlbmNpZXMpLFxuICAgIGlkOiByZXF1aXJlZFN0cmluZyhyZWNvcmQuaWQsIFwiaWRcIiksXG4gICAgbXV0YXRpb246IG5vcm1hbGl6ZU11dGF0aW9uKHJlY29yZC5tdXRhdGlvbiksXG4gICAgc2VxdWVuY2U6IHJlcXVpcmVkUG9zaXRpdmVJbnRlZ2VyKHJlY29yZC5zZXF1ZW5jZSwgXCJzZXF1ZW5jZVwiKSxcbiAgICBzdGF0dXM6IC8qKiBAdHlwZSB7TG9jYWxNdXRhdGlvblN0YXR1c30gKi8gKHN0YXR1cyksXG4gICAgdXBkYXRlZEF0OiByZXF1aXJlZElzb1RpbWVzdGFtcChyZWNvcmQudXBkYXRlZEF0LCBcInVwZGF0ZWRBdFwiKVxuICB9XG5cbiAgaWYgKHJlY29yZC5zeW5jUmVzdWx0ID09PSB1bmRlZmluZWQpIHJldHVybiBiYXNlUmVjb3JkXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5iYXNlUmVjb3JkLFxuICAgIHN5bmNSZXN1bHQ6IGNsb25lSnNvbk9iamVjdChyZWNvcmQuc3luY1Jlc3VsdCwgXCJzeW5jUmVzdWx0XCIpXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGRlcGVuZGVuY3kgbWV0YWRhdGEgZW50cmllcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBSYXcgZGVwZW5kZW5jaWVzLlxuICogQHJldHVybnMge0xvY2FsTXV0YXRpb25EZXBlbmRlbmN5W119IC0gTm9ybWFsaXplZCBkZXBlbmRlbmNpZXMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZURlcGVuZGVuY2llcyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdXG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGxvY2FsIG11dGF0aW9uIGRlcGVuZGVuY2llcyBhcnJheVwiKVxuXG4gIHJldHVybiB2YWx1ZS5tYXAoKGRlcGVuZGVuY3kpID0+IHtcbiAgICBpZiAoIWRlcGVuZGVuY3kgfHwgdHlwZW9mIGRlcGVuZGVuY3kgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkZXBlbmRlbmN5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbG9jYWwgbXV0YXRpb24gZGVwZW5kZW5jeSBvYmplY3RcIilcbiAgICB9XG5cbiAgICBjb25zdCBkZXBlbmRlbmN5T2JqZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKGRlcGVuZGVuY3kpXG5cbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50TXV0YXRpb25JZDogcmVxdWlyZWRTdHJpbmcoZGVwZW5kZW5jeU9iamVjdC5jbGllbnRNdXRhdGlvbklkLCBcImRlcGVuZGVuY3kgY2xpZW50TXV0YXRpb25JZFwiKSxcbiAgICAgIG1vZGVsOiByZXF1aXJlZFN0cmluZyhkZXBlbmRlbmN5T2JqZWN0Lm1vZGVsLCBcImRlcGVuZGVuY3kgbW9kZWxcIilcbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHN5bmMgbXV0YXRpb24gcGF5bG9hZC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBSYXcgbXV0YXRpb24uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuU3luY011dGF0aW9ufSAtIE5vcm1hbGl6ZWQgbXV0YXRpb24uXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU11dGF0aW9uKHZhbHVlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBsb2NhbCBzeW5jIG11dGF0aW9uIG9iamVjdFwiKVxuXG4gIGNvbnN0IG11dGF0aW9uID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHZhbHVlKVxuICBjb25zdCBub3JtYWxpemVkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2RldmljZS1pZGVudGl0eS5qc1wiKS5TeW5jTXV0YXRpb259ICovICh7XG4gICAgYWN0b3JEZXZpY2VJZDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uYWN0b3JEZXZpY2VJZCwgXCJhY3RvckRldmljZUlkXCIpLFxuICAgIGFjdG9yVXNlcklkOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5hY3RvclVzZXJJZCwgXCJhY3RvclVzZXJJZFwiKSxcbiAgICBjbGllbnRNdXRhdGlvbklkOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkLCBcImNsaWVudE11dGF0aW9uSWRcIiksXG4gICAgbW9kZWw6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLm1vZGVsLCBcIm1vZGVsXCIpLFxuICAgIG9jY3VycmVkQXQ6IHJlcXVpcmVkSXNvVGltZXN0YW1wKG11dGF0aW9uLm9jY3VycmVkQXQsIFwib2NjdXJyZWRBdFwiKSxcbiAgICBvZmZsaW5lR3JhbnRJZDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24ub2ZmbGluZUdyYW50SWQsIFwib2ZmbGluZUdyYW50SWRcIiksXG4gICAgb3BlcmF0aW9uOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5vcGVyYXRpb24sIFwib3BlcmF0aW9uXCIpLFxuICAgIHBvbGljeUhhc2g6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLnBvbGljeUhhc2gsIFwicG9saWN5SGFzaFwiKVxuICB9KVxuXG4gIGlmIChtdXRhdGlvbi5hdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQuYXR0cmlidXRlcyA9IGNsb25lSnNvbk9iamVjdChtdXRhdGlvbi5hdHRyaWJ1dGVzLCBcImF0dHJpYnV0ZXNcIilcbiAgaWYgKG11dGF0aW9uLmJhc2VWZXJzaW9uICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQuYmFzZVZlcnNpb24gPSBjbG9uZUJhc2VWZXJzaW9uKG11dGF0aW9uLmJhc2VWZXJzaW9uKVxuICBpZiAobXV0YXRpb24uY29tbWFuZCAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLmNvbW1hbmQgPSByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5jb21tYW5kLCBcImNvbW1hbmRcIilcbiAgaWYgKG11dGF0aW9uLnBheWxvYWQgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5wYXlsb2FkID0gY2xvbmVKc29uT2JqZWN0KG11dGF0aW9uLnBheWxvYWQsIFwicGF5bG9hZFwiKVxuXG4gIHJldHVybiBub3JtYWxpemVkXG59XG5cbi8qKlxuICogUmVxdWlyZXMgYSBub24tZW1wdHkgc3RyaW5nIHZhbHVlLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFJhdyB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIEZpZWxkIGxhYmVsLlxuICogQHJldHVybnMge3N0cmluZ30gLSBSZXF1aXJlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVkU3RyaW5nKHZhbHVlLCBsYWJlbCkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8IHZhbHVlLmxlbmd0aCA8IDEpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbG9jYWwgbXV0YXRpb24gJHtsYWJlbH1gKVxuXG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGFuIElTTyB0aW1lc3RhbXAgc3RyaW5nLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFJhdyB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIEZpZWxkIGxhYmVsLlxuICogQHJldHVybnMge3N0cmluZ30gLSBJU08gdGltZXN0YW1wLlxuICovXG5mdW5jdGlvbiByZXF1aXJlZElzb1RpbWVzdGFtcCh2YWx1ZSwgbGFiZWwpIHtcbiAgY29uc3Qgc3RyaW5nVmFsdWUgPSByZXF1aXJlZFN0cmluZyh2YWx1ZSwgbGFiZWwpXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShzdHJpbmdWYWx1ZSlcblxuICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSB8fCBkYXRlLnRvSVNPU3RyaW5nKCkgIT09IHN0cmluZ1ZhbHVlKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGxvY2FsIG11dGF0aW9uICR7bGFiZWx9IElTTyB0aW1lc3RhbXBgKVxuXG4gIHJldHVybiBzdHJpbmdWYWx1ZVxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGEgcG9zaXRpdmUgaW50ZWdlciB2YWx1ZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBSYXcgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBGaWVsZCBsYWJlbC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gUG9zaXRpdmUgaW50ZWdlci5cbiAqL1xuZnVuY3Rpb24gcmVxdWlyZWRQb3NpdGl2ZUludGVnZXIodmFsdWUsIGxhYmVsKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc0ludGVnZXIodmFsdWUpIHx8IHZhbHVlIDwgMSkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBsb2NhbCBtdXRhdGlvbiAke2xhYmVsfSBwb3NpdGl2ZSBpbnRlZ2VyYClcblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBDbG9uZXMgYSBzdXBwb3J0ZWQgYmFzZS12ZXJzaW9uIHZhbHVlLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFJhdyBiYXNlIHZlcnNpb24uXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVtYmVyIHwgbnVsbH0gLSBOb3JtYWxpemVkIGJhc2UgdmVyc2lvbi5cbiAqL1xuZnVuY3Rpb24gY2xvbmVCYXNlVmVyc2lvbih2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHZhbHVlXG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbG9jYWwgbXV0YXRpb24gYmFzZVZlcnNpb24gc3RyaW5nLCBudW1iZXIsIG9yIG51bGxcIilcbn1cblxuLyoqXG4gKiBDbG9uZXMgYSBKU09OLWNvbXBhdGlibGUgdmFsdWUuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmF3IEpTT04gdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBGaWVsZCBsYWJlbC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlfSAtIENsb25lZCBKU09OIHZhbHVlLlxuICovXG5mdW5jdGlvbiBjbG9uZUpzb25WYWx1ZSh2YWx1ZSwgbGFiZWwpIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgSlNPTi1jb21wYXRpYmxlIGxvY2FsIG11dGF0aW9uICR7bGFiZWx9YClcblxuICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlfSAqLyAoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpKVxufVxuXG4vKipcbiAqIENsb25lcyBhIEpTT04tY29tcGF0aWJsZSBvYmplY3QuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmF3IEpTT04gb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIC0gRmllbGQgbGFiZWwuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IC0gQ2xvbmVkIEpTT04gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBjbG9uZUpzb25PYmplY3QodmFsdWUsIGxhYmVsKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGxvY2FsIG11dGF0aW9uICR7bGFiZWx9IG9iamVjdGApXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59ICovIChjbG9uZUpzb25WYWx1ZSh2YWx1ZSwgbGFiZWwpKVxufVxuXG4vKipcbiAqIENsb25lcyBhIGxvY2FsIG11dGF0aW9uIGxvZyByZWNvcmQuXG4gKiBAcGFyYW0ge0xvY2FsTXV0YXRpb25Mb2dSZWNvcmR9IHJlY29yZCAtIFJlY29yZCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtMb2NhbE11dGF0aW9uTG9nUmVjb3JkfSAtIENsb25lZCByZWNvcmQuXG4gKi9cbmZ1bmN0aW9uIGNsb25lUmVjb3JkKHJlY29yZCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtMb2NhbE11dGF0aW9uTG9nUmVjb3JkfSAqLyAoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZWNvcmQpKSlcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gbG9jYWwgbXV0YXRpb24gcmVjb3JkIGlkLlxuICogQHJldHVybnMge3N0cmluZ30gLSBSYW5kb20gcmVjb3JkIGlkLlxuICovXG5mdW5jdGlvbiByYW5kb21SZWNvcmRJZCgpIHtcbiAgY29uc3QgY3J5cHRvUHJvdmlkZXIgPSBnbG9iYWxUaGlzLmNyeXB0b1xuXG4gIGlmIChjcnlwdG9Qcm92aWRlciAmJiB0eXBlb2YgY3J5cHRvUHJvdmlkZXIucmFuZG9tVVVJRCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gY3J5cHRvUHJvdmlkZXIucmFuZG9tVVVJRCgpXG5cbiAgcmV0dXJuIGBsb2NhbC1tdXRhdGlvbi0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMil9YFxufVxuIl19
403
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtbXV0YXRpb24tbG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvbG9jYWwtbXV0YXRpb24tbG9nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixNQUFNLG1CQUFtQixHQUFHLGlDQUFpQyxDQUFBO0FBQzdELE1BQU0scUJBQXFCLEdBQUcsb0NBQW9DLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFBO0FBQ25ILE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQTtBQUN2RCxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7QUFDMUYsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO0FBQ3pELDRDQUE0QztBQUM1QyxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7QUFFbkM7Ozs7R0FJRztBQUVIOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7S0FHSztBQUVMOzs7Ozs7Ozs7OztHQVdHO0FBRUgsbUZBQW1GO0FBQ25GLE1BQU0sQ0FBQyxPQUFPLE9BQU8sZ0JBQWdCO0lBQ25DOzs7Ozs7O09BT0c7SUFDSCxZQUFZLEVBQUMsV0FBVyxHQUFHLGNBQWMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxHQUFHLG1CQUFtQixFQUFDO1FBQzNHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLGdIQUFnSCxDQUFDLENBQUE7UUFD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QU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmNvbnN0IERFRkFVTFRfU1RPUkFHRV9LRVkgPSBcInZlbG9jaW91cy5zeW5jLmxvY2FsTXV0YXRpb25Mb2dcIlxuY29uc3QgUEVORElOR19TVEFUVVNfVkFMVUVTID0gLyoqIEB0eXBlIHtMb2NhbE11dGF0aW9uU3RhdHVzW119ICovIChbXCJwZW5kaW5nXCIsIFwiYXBwbGllZC1sb2NhbGx5XCIsIFwicGVlci1hcHBsaWVkXCJdKVxuY29uc3QgUEVORElOR19TVEFUVVNFUyA9IG5ldyBTZXQoUEVORElOR19TVEFUVVNfVkFMVUVTKVxuY29uc3QgTVVUQVRJT05fU1RBVFVTRVMgPSBuZXcgU2V0KFsuLi5QRU5ESU5HX1NUQVRVU0VTLCBcImNvbmZsaWN0XCIsIFwicmVqZWN0ZWRcIiwgXCJzeW5jZWRcIl0pXG5jb25zdCBURVJNSU5BTF9TVEFUVVNFUyA9IG5ldyBTZXQoW1wicmVqZWN0ZWRcIiwgXCJzeW5jZWRcIl0pXG4vKiogQHR5cGUge01hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+fSAqL1xuY29uc3QgU1RPUkFHRV9LRVlfTE9DS1MgPSBuZXcgTWFwKClcblxuLyoqXG4gKiBMb2NhbCBtdXRhdGlvbiBsb2cgcmVjb3JkIHF1ZXJ5IG9wdGlvbnMuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2NhbE11dGF0aW9uTG9nUmVjb3Jkc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7TG9jYWxNdXRhdGlvblN0YXR1c1tdfSBbc3RhdHVzZXNdIC0gT3B0aW9uYWwgc3RhdHVzIGZpbHRlci5cbiAqL1xuXG4vKipcbiAqIExvY2FsIG11dGF0aW9uIGxvZyByb3ctb3JpZW50ZWQgc3RvcmFnZSBhZGFwdGVyLlxuICpcbiAqIEltcGxlbWVudGF0aW9ucyBzaG91bGQgc3RvcmUgZWFjaCBtdXRhdGlvbiBsb2cgcmVjb3JkIGFzIGl0cyBvd24gcm93L2VudHJ5LlxuICogTmF0aXZlIGFwcHMgc2hvdWxkIGJhY2sgdGhpcyB3aXRoIFNRTGl0ZSBhbmQgaW5kZXhlcyBvbiBzdG9yYWdlIGtleSwgc3RhdHVzLFxuICogYW5kIHNlcXVlbmNlLiBBdm9pZCBzdG9yaW5nIHRoZSB3aG9sZSBsb2cgYXMgb25lIEpTT04gYmxvYi5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IExvY2FsTXV0YXRpb25Mb2dTdG9yYWdlXG4gKiBAcHJvcGVydHkgeyhzdG9yYWdlS2V5OiBzdHJpbmcsIHJlY29yZDogTG9jYWxNdXRhdGlvbkxvZ1JlY29yZCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWR9IGFwcGVuZFJlY29yZCAtIEFwcGVuZHMgb25lIGxvZyByZWNvcmQuXG4gKiBAcHJvcGVydHkgeyhzdG9yYWdlS2V5OiBzdHJpbmcsIGlkczogc3RyaW5nW10pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkfSBkZWxldGVSZWNvcmRzIC0gRGVsZXRlcyBsb2cgcmVjb3JkcyBieSBpZC5cbiAqIEBwcm9wZXJ0eSB7KHN0b3JhZ2VLZXk6IHN0cmluZykgPT4gUHJvbWlzZTxudW1iZXI+IHwgbnVtYmVyfSBuZXh0U2VxdWVuY2UgLSBSZXR1cm5zIHRoZSBuZXh0IGxvY2FsIHNlcXVlbmNlIG51bWJlci5cbiAqIEBwcm9wZXJ0eSB7KHN0b3JhZ2VLZXk6IHN0cmluZywgaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxMb2NhbE11dGF0aW9uTG9nUmVjb3JkIHwgbnVsbCB8IHVuZGVmaW5lZD4gfCBMb2NhbE11dGF0aW9uTG9nUmVjb3JkIHwgbnVsbCB8IHVuZGVmaW5lZH0gcmVjb3JkIC0gUmVhZHMgb25lIGxvZyByZWNvcmQgYnkgaWQuXG4gKiBAcHJvcGVydHkgeyhzdG9yYWdlS2V5OiBzdHJpbmcsIG9wdGlvbnM/OiBMb2NhbE11dGF0aW9uTG9nUmVjb3Jkc09wdGlvbnMpID0+IFByb21pc2U8TG9jYWxNdXRhdGlvbkxvZ1JlY29yZFtdPiB8IExvY2FsTXV0YXRpb25Mb2dSZWNvcmRbXX0gcmVjb3JkcyAtIFJlYWRzIGxvZyByZWNvcmRzLlxuICogQHByb3BlcnR5IHsoc3RvcmFnZUtleTogc3RyaW5nLCByZWNvcmQ6IExvY2FsTXV0YXRpb25Mb2dSZWNvcmQpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkfSB1cGRhdGVSZWNvcmQgLSBSZXBsYWNlcyBvbmUgbG9nIHJlY29yZC5cbiAqL1xuXG4vKipcbiAqIExvY2FsIHN5bmMgbXV0YXRpb24gZGVwZW5kZW5jeSBtZXRhZGF0YS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IExvY2FsTXV0YXRpb25EZXBlbmRlbmN5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2xpZW50TXV0YXRpb25JZCAtIENsaWVudCBtdXRhdGlvbiBpZCB0aGlzIG11dGF0aW9uIGRlcGVuZHMgb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kZWwgLSBEZXBlbmRlbnQgbW9kZWwvcmVzb3VyY2UgbmFtZS5cbiAqL1xuXG4vKipcbiAqIExvY2FsIG11dGF0aW9uIGxvZyBzdGF0dXMuXG4gKiBAdHlwZWRlZiB7XCJwZW5kaW5nXCIgfCBcImFwcGxpZWQtbG9jYWxseVwiIHwgXCJwZWVyLWFwcGxpZWRcIiB8IFwiY29uZmxpY3RcIiB8IFwicmVqZWN0ZWRcIiB8IFwic3luY2VkXCJ9IExvY2FsTXV0YXRpb25TdGF0dXNcbiAqICovXG5cbi8qKlxuICogTG9jYWwgbXV0YXRpb24gbG9nIHJlY29yZC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IExvY2FsTXV0YXRpb25Mb2dSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjcmVhdGVkQXQgLSBJU08gdGltZXN0YW1wIHdoZW4gdGhlIHJlY29yZCB3YXMgY3JlYXRlZCBsb2NhbGx5LlxuICogQHByb3BlcnR5IHtMb2NhbE11dGF0aW9uRGVwZW5kZW5jeVtdfSBkZXBlbmRlbmNpZXMgLSBPdGhlciBsb2NhbCBtdXRhdGlvbnMgdGhhdCBtdXN0IHJlcGxheSBmaXJzdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIExvY2FsIGxvZyByZWNvcmQgaWQuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gbXV0YXRpb24gLSBEZXZpY2UgbXV0YXRpb24gcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzZXF1ZW5jZSAtIE1vbm90b25pYyBsb2NhbCBzZXF1ZW5jZS5cbiAqIEBwcm9wZXJ0eSB7TG9jYWxNdXRhdGlvblN0YXR1c30gc3RhdHVzIC0gTG9jYWwgcmVwbGF5L2FwcGx5IHN0YXR1cy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IFtzeW5jUmVzdWx0XSAtIEJhY2tlbmQgcmVwbGF5L3Jlc3VsdCBtZXRhZGF0YS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cGRhdGVkQXQgLSBJU08gdGltZXN0YW1wIHdoZW4gdGhlIHJlY29yZCB3YXMgbGFzdCBjaGFuZ2VkLlxuICovXG5cbi8qKiBDbGllbnQtc2lkZSBhcHBlbmQtb25seSBzeW5jIG11dGF0aW9uIGxvZyB3aXRoIHBsdWdnYWJsZSBwZXJzaXN0ZW50IHN0b3JhZ2UuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2NhbE11dGF0aW9uTG9nIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBsb2NhbCBtdXRhdGlvbiBsb2cuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0geygpID0+IHN0cmluZ30gW2FyZ3MuaWRHZW5lcmF0b3JdIC0gUmVjb3JkIGlkIGdlbmVyYXRvci5cbiAgICogQHBhcmFtIHsoKSA9PiBEYXRlfSBbYXJncy5ub3ddIC0gQ2xvY2sgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7TG9jYWxNdXRhdGlvbkxvZ1N0b3JhZ2V9IGFyZ3Muc3RvcmFnZSAtIFBlcnNpc3RlbnQgc3RvcmFnZSBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3Muc3RvcmFnZUtleV0gLSBTdG9yYWdlIGtleS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtpZEdlbmVyYXRvciA9IHJhbmRvbVJlY29yZElkLCBub3cgPSAoKSA9PiBuZXcgRGF0ZSgpLCBzdG9yYWdlLCBzdG9yYWdlS2V5ID0gREVGQVVMVF9TVE9SQUdFX0tFWX0pIHtcbiAgICBpZiAoIXZhbGlkU3RvcmFnZShzdG9yYWdlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9jYWxNdXRhdGlvbkxvZyByZXF1aXJlcyByb3cgc3RvcmFnZSB3aXRoIGFwcGVuZFJlY29yZC9kZWxldGVSZWNvcmRzL25leHRTZXF1ZW5jZS9yZWNvcmQvcmVjb3Jkcy91cGRhdGVSZWNvcmRcIilcbiAgICB9XG5cbiAgICB0aGlzLmlkR2VuZXJhdG9yID0gaWRHZW5lcmF0b3JcbiAgICB0aGlzLm5vdyA9IG5vd1xuICAgIHRoaXMuc3RvcmFnZSA9IHN0b3JhZ2VcbiAgICB0aGlzLnN0b3JhZ2VLZXkgPSBzdG9yYWdlS2V5XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIHBlbmRpbmcgbXV0YXRpb24gcmVjb3JkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtMb2NhbE11dGF0aW9uRGVwZW5kZW5jeVtdfSBbYXJncy5kZXBlbmRlbmNpZXNdIC0gTXV0YXRpb24gZGVwZW5kZW5jaWVzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE11dGF0aW9uIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvY2FsTXV0YXRpb25Mb2dSZWNvcmQ+fSAtIENyZWF0ZWQgbG9nIHJlY29yZC5cbiAgICovXG4gIGFzeW5jIGFwcGVuZCh7ZGVwZW5kZW5jaWVzID0gW10sIG11dGF0aW9ufSkge1xuICAgIHJldHVybiBhd2FpdCB3aXRoU3RvcmFnZUtleUxvY2sodGhpcy5zdG9yYWdlS2V5LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSB0aGlzLmN1cnJlbnRUaW1lc3RhbXAoKVxuICAgICAgY29uc3QgcmVjb3JkID0gbm9ybWFsaXplUmVjb3JkKHtcbiAgICAgICAgY3JlYXRlZEF0OiB0aW1lc3RhbXAsXG4gICAgICAgIGRlcGVuZGVuY2llcyxcbiAgICAgICAgaWQ6IHRoaXMuaWRHZW5lcmF0b3IoKSxcbiAgICAgICAgbXV0YXRpb24sXG4gICAgICAgIHNlcXVlbmNlOiBhd2FpdCB0aGlzLnN0b3JhZ2UubmV4dFNlcXVlbmNlKHRoaXMuc3RvcmFnZUtleSksXG4gICAgICAgIHN0YXR1czogXCJwZW5kaW5nXCIsXG4gICAgICAgIHVwZGF0ZWRBdDogdGltZXN0YW1wXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0aGlzLnN0b3JhZ2UuYXBwZW5kUmVjb3JkKHRoaXMuc3RvcmFnZUtleSwgY2xvbmVSZWNvcmQocmVjb3JkKSlcblxuICAgICAgcmV0dXJuIGNsb25lUmVjb3JkKHJlY29yZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIHJlY29yZHMgb3JkZXJlZCBieSBsb2NhbCBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8TG9jYWxNdXRhdGlvbkxvZ1JlY29yZFtdPn0gLSBMb2cgcmVjb3Jkcy5cbiAgICovXG4gIGFzeW5jIHJlY29yZHMoKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVJlY29yZExpc3QoYXdhaXQgdGhpcy5zdG9yYWdlLnJlY29yZHModGhpcy5zdG9yYWdlS2V5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHJlY29yZHMgdGhhdCBzdGlsbCBuZWVkIGxvY2FsL3NlcnZlciByZWNvbmNpbGlhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8TG9jYWxNdXRhdGlvbkxvZ1JlY29yZFtdPn0gLSBQZW5kaW5nIHJlY29yZHMuXG4gICAqL1xuICBhc3luYyBwZW5kaW5nUmVjb3JkcygpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplUmVjb3JkTGlzdChhd2FpdCB0aGlzLnN0b3JhZ2UucmVjb3Jkcyh0aGlzLnN0b3JhZ2VLZXksIHtzdGF0dXNlczogUEVORElOR19TVEFUVVNfVkFMVUVTfSkpXG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBhIHJlY29yZCBzdGF0dXMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5pZCAtIFJlY29yZCBpZC5cbiAgICogQHBhcmFtIHtMb2NhbE11dGF0aW9uU3RhdHVzfSBhcmdzLnN0YXR1cyAtIE5ldyBzdGF0dXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IFthcmdzLnN5bmNSZXN1bHRdIC0gUmVzdWx0IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2NhbE11dGF0aW9uTG9nUmVjb3JkPn0gLSBVcGRhdGVkIHJlY29yZC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZVN0YXR1cyh7aWQsIHN0YXR1cywgc3luY1Jlc3VsdH0pIHtcbiAgICBpZiAoIU1VVEFUSU9OX1NUQVRVU0VTLmhhcyhzdGF0dXMpKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbG9jYWwgbXV0YXRpb24gc3RhdHVzICcke3N0YXR1c30nYClcblxuICAgIHJldHVybiBhd2FpdCB3aXRoU3RvcmFnZUtleUxvY2sodGhpcy5zdG9yYWdlS2V5LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByYXdSZWNvcmQgPSBhd2FpdCB0aGlzLnN0b3JhZ2UucmVjb3JkKHRoaXMuc3RvcmFnZUtleSwgaWQpXG5cbiAgICAgIGlmICghcmF3UmVjb3JkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIGxvY2FsIG11dGF0aW9uIGxvZyByZWNvcmQgJyR7aWR9J2ApXG5cbiAgICAgIGNvbnN0IHJlY29yZCA9IG5vcm1hbGl6ZVJlY29yZChyYXdSZWNvcmQpXG5cbiAgICAgIHJlY29yZC5zdGF0dXMgPSAvKiogQHR5cGUge0xvY2FsTXV0YXRpb25TdGF0dXN9ICovIChzdGF0dXMpXG4gICAgICBpZiAoc3luY1Jlc3VsdCAhPT0gdW5kZWZpbmVkKSByZWNvcmQuc3luY1Jlc3VsdCA9IGNsb25lSnNvbk9iamVjdChzeW5jUmVzdWx0LCBcInN5bmNSZXN1bHRcIilcbiAgICAgIHJlY29yZC51cGRhdGVkQXQgPSB0aGlzLmN1cnJlbnRUaW1lc3RhbXAoKVxuICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlLnVwZGF0ZVJlY29yZCh0aGlzLnN0b3JhZ2VLZXksIGNsb25lUmVjb3JkKHJlY29yZCkpXG5cbiAgICAgIHJldHVybiBjbG9uZVJlY29yZChyZWNvcmQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQcnVuZXMgdGVybWluYWwgcmVjb3JkcyB0aGF0IGFyZSBubyBsb25nZXIgbmVlZGVkIGZvciByZXBsYXkgZGVwZW5kZW5jaWVzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gQ29tcGFjdGlvbiBvcHRpb25zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MubWF4VGVybWluYWxSZWNvcmRzXSAtIE1heGltdW0gdGVybWluYWwgcmVjb3JkcyB0byByZXRhaW4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy50ZXJtaW5hbFJldGVudGlvbk1zXSAtIE1pbmltdW0gYWdlIGJlZm9yZSBwcnVuaW5nIHRlcm1pbmFsIHJlY29yZHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtkZWxldGVkUmVjb3JkSWRzOiBzdHJpbmdbXX0+fSAtIENvbXBhY3Rpb24gcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgY29tcGFjdCh7bWF4VGVybWluYWxSZWNvcmRzLCB0ZXJtaW5hbFJldGVudGlvbk1zfSA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHdpdGhTdG9yYWdlS2V5TG9jayh0aGlzLnN0b3JhZ2VLZXksIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLnJlY29yZHMoKVxuICAgICAgY29uc3QgcHJvdGVjdGVkQ2xpZW50TXV0YXRpb25JZHMgPSBuZXcgU2V0KFxuICAgICAgICByZWNvcmRzXG4gICAgICAgICAgLmZpbHRlcigocmVjb3JkKSA9PiBQRU5ESU5HX1NUQVRVU0VTLmhhcyhyZWNvcmQuc3RhdHVzKSB8fCByZWNvcmQuc3RhdHVzID09PSBcImNvbmZsaWN0XCIpXG4gICAgICAgICAgLmZsYXRNYXAoKHJlY29yZCkgPT4gcmVjb3JkLmRlcGVuZGVuY2llcy5tYXAoKGRlcGVuZGVuY3kpID0+IGRlcGVuZGVuY3kuY2xpZW50TXV0YXRpb25JZCkpXG4gICAgICApXG4gICAgICBjb25zdCB0ZXJtaW5hbFJlY29yZHMgPSByZWNvcmRzXG4gICAgICAgIC5maWx0ZXIoKHJlY29yZCkgPT4gVEVSTUlOQUxfU1RBVFVTRVMuaGFzKHJlY29yZC5zdGF0dXMpKVxuICAgICAgICAuZmlsdGVyKChyZWNvcmQpID0+ICFwcm90ZWN0ZWRDbGllbnRNdXRhdGlvbklkcy5oYXMocmVjb3JkLm11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQpKVxuICAgICAgICAuc29ydChjb21wYXJlUmVjb3Jkc05ld2VzdEZpcnN0KVxuICAgICAgY29uc3QgZGVsZXRlSWRzID0gbmV3IFNldCgpXG5cbiAgICAgIGlmICh0eXBlb2YgbWF4VGVybWluYWxSZWNvcmRzID09PSBcIm51bWJlclwiICYmIG1heFRlcm1pbmFsUmVjb3JkcyA+PSAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHRlcm1pbmFsUmVjb3Jkcy5zbGljZShtYXhUZXJtaW5hbFJlY29yZHMpKSBkZWxldGVJZHMuYWRkKHJlY29yZC5pZClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0ZXJtaW5hbFJldGVudGlvbk1zID09PSBcIm51bWJlclwiICYmIHRlcm1pbmFsUmV0ZW50aW9uTXMgPj0gMCkge1xuICAgICAgICBjb25zdCBjdXRvZmYgPSB0aGlzLm5vdygpLmdldFRpbWUoKSAtIHRlcm1pbmFsUmV0ZW50aW9uTXNcblxuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiB0ZXJtaW5hbFJlY29yZHMpIHtcbiAgICAgICAgICBpZiAobmV3IERhdGUocmVjb3JkLnVwZGF0ZWRBdCkuZ2V0VGltZSgpIDwgY3V0b2ZmKSBkZWxldGVJZHMuYWRkKHJlY29yZC5pZClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWxldGVkUmVjb3JkSWRzID0gQXJyYXkuZnJvbShkZWxldGVJZHMpXG5cbiAgICAgIGlmIChkZWxldGVkUmVjb3JkSWRzLmxlbmd0aCA+IDApIGF3YWl0IHRoaXMuc3RvcmFnZS5kZWxldGVSZWNvcmRzKHRoaXMuc3RvcmFnZUtleSwgZGVsZXRlZFJlY29yZElkcylcblxuICAgICAgcmV0dXJuIHtkZWxldGVkUmVjb3JkSWRzfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBsb2cgdGltZXN0YW1wLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEN1cnJlbnQgSVNPIHRpbWVzdGFtcC5cbiAgICovXG4gIGN1cnJlbnRUaW1lc3RhbXAoKSB7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMubm93KClcblxuICAgIGlmICghKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSB8fCBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB0aHJvdyBuZXcgRXJyb3IoXCJMb2NhbE11dGF0aW9uTG9nIG5vdygpIG11c3QgcmV0dXJuIGEgdmFsaWQgRGF0ZVwiKVxuXG4gICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBzdG9yYWdlIGFkYXB0ZXIgaGFzIGFsbCByZXF1aXJlZCByb3ctc3RvcmUgbWV0aG9kcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gc3RvcmFnZSAtIFN0b3JhZ2UgYWRhcHRlciBjYW5kaWRhdGUuXG4gKiBAcmV0dXJucyB7c3RvcmFnZSBpcyBMb2NhbE11dGF0aW9uTG9nU3RvcmFnZX0gLSBXaGV0aGVyIHN0b3JhZ2UgaXMgdmFsaWQuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkU3RvcmFnZShzdG9yYWdlKSB7XG4gIGlmICghc3RvcmFnZSB8fCB0eXBlb2Ygc3RvcmFnZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3Qgc3RvcmFnZU9iamVjdCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChzdG9yYWdlKVxuXG4gIHJldHVybiB0eXBlb2Ygc3RvcmFnZU9iamVjdC5hcHBlbmRSZWNvcmQgPT09IFwiZnVuY3Rpb25cIlxuICAgICYmIHR5cGVvZiBzdG9yYWdlT2JqZWN0LmRlbGV0ZVJlY29yZHMgPT09IFwiZnVuY3Rpb25cIlxuICAgICYmIHR5cGVvZiBzdG9yYWdlT2JqZWN0Lm5leHRTZXF1ZW5jZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgJiYgdHlwZW9mIHN0b3JhZ2VPYmplY3QucmVjb3JkID09PSBcImZ1bmN0aW9uXCJcbiAgICAmJiB0eXBlb2Ygc3RvcmFnZU9iamVjdC5yZWNvcmRzID09PSBcImZ1bmN0aW9uXCJcbiAgICAmJiB0eXBlb2Ygc3RvcmFnZU9iamVjdC51cGRhdGVSZWNvcmQgPT09IFwiZnVuY3Rpb25cIlxufVxuXG4vKipcbiAqIFNvcnRzIHJlY29yZHMgYnkgbmV3ZXN0IHVwZGF0ZS9zZXF1ZW5jZSBmaXJzdC5cbiAqIEBwYXJhbSB7TG9jYWxNdXRhdGlvbkxvZ1JlY29yZH0gbGVmdCAtIExlZnQgcmVjb3JkLlxuICogQHBhcmFtIHtMb2NhbE11dGF0aW9uTG9nUmVjb3JkfSByaWdodCAtIFJpZ2h0IHJlY29yZC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gU29ydCByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVSZWNvcmRzTmV3ZXN0Rmlyc3QobGVmdCwgcmlnaHQpIHtcbiAgY29uc3QgdXBkYXRlZEF0Q29tcGFyaXNvbiA9IHJpZ2h0LnVwZGF0ZWRBdC5sb2NhbGVDb21wYXJlKGxlZnQudXBkYXRlZEF0KVxuXG4gIGlmICh1cGRhdGVkQXRDb21wYXJpc29uICE9PSAwKSByZXR1cm4gdXBkYXRlZEF0Q29tcGFyaXNvblxuXG4gIHJldHVybiByaWdodC5zZXF1ZW5jZSAtIGxlZnQuc2VxdWVuY2Vcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGFuZCBzb3J0cyBhIGxpc3Qgb2YgcmVjb3Jkcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gcmVjb3JkcyAtIFJhdyByZWNvcmRzLlxuICogQHJldHVybnMge0xvY2FsTXV0YXRpb25Mb2dSZWNvcmRbXX0gLSBOb3JtYWxpemVkIHJlY29yZHMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlY29yZExpc3QocmVjb3Jkcykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkocmVjb3JkcykpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGxvY2FsIG11dGF0aW9uIGxvZyBzdG9yYWdlIHJlY29yZHMgYXJyYXlcIilcblxuICByZXR1cm4gcmVjb3Jkc1xuICAgIC5tYXAobm9ybWFsaXplUmVjb3JkKVxuICAgIC5zb3J0KChsZWZ0LCByaWdodCkgPT4gbGVmdC5zZXF1ZW5jZSAtIHJpZ2h0LnNlcXVlbmNlKVxuICAgIC5tYXAoKHJlY29yZCkgPT4gY2xvbmVSZWNvcmQocmVjb3JkKSlcbn1cblxuLyoqXG4gKiBSdW5zIGEgY2FsbGJhY2sgYWZ0ZXIgZWFybGllciB3cml0ZXMgZm9yIHRoZSBzYW1lIHN0b3JhZ2Uga2V5IGhhdmUgY29tcGxldGVkLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdG9yYWdlS2V5IC0gU3RvcmFnZSBrZXkgdG8gc2VyaWFsaXplLlxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHJ1biB1bmRlciB0aGUgc3RvcmFnZS1rZXkgbG9jay5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2l0aFN0b3JhZ2VLZXlMb2NrKHN0b3JhZ2VLZXksIGNhbGxiYWNrKSB7XG4gIGNvbnN0IHByZXZpb3VzID0gU1RPUkFHRV9LRVlfTE9DS1MuZ2V0KHN0b3JhZ2VLZXkpIHx8IFByb21pc2UucmVzb2x2ZSgpXG4gIGxldCByZWxlYXNlID0gKCkgPT4ge31cbiAgY29uc3QgY3VycmVudCA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7IHJlbGVhc2UgPSAoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkgfSlcbiAgY29uc3QgY2hhaW5lZCA9IHByZXZpb3VzLmNhdGNoKChfZXJyb3IpID0+IHt9KS50aGVuKCgpID0+IGN1cnJlbnQpXG5cbiAgU1RPUkFHRV9LRVlfTE9DS1Muc2V0KHN0b3JhZ2VLZXksIGNoYWluZWQpXG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBwcmV2aW91cy5jYXRjaCgoX2Vycm9yKSA9PiB7fSlcblxuICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpXG4gIH0gZmluYWxseSB7XG4gICAgcmVsZWFzZSgpXG4gICAgaWYgKFNUT1JBR0VfS0VZX0xPQ0tTLmdldChzdG9yYWdlS2V5KSA9PT0gY2hhaW5lZCkgU1RPUkFHRV9LRVlfTE9DS1MuZGVsZXRlKHN0b3JhZ2VLZXkpXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgcGVyc2lzdGVkIGxvZyByZWNvcmQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmF3IHJlY29yZC5cbiAqIEByZXR1cm5zIHtMb2NhbE11dGF0aW9uTG9nUmVjb3JkfSAtIE5vcm1hbGl6ZWQgcmVjb3JkLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSZWNvcmQodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGxvY2FsIG11dGF0aW9uIGxvZyByZWNvcmQgb2JqZWN0XCIpXG5cbiAgY29uc3QgcmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHZhbHVlKVxuICBjb25zdCBzdGF0dXMgPSByZXF1aXJlZFN0cmluZyhyZWNvcmQuc3RhdHVzLCBcInN0YXR1c1wiKVxuXG4gIGlmICghTVVUQVRJT05fU1RBVFVTRVMuaGFzKHN0YXR1cykpIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBsb2NhbCBtdXRhdGlvbiBzdGF0dXMgJyR7c3RhdHVzfSdgKVxuXG4gIGNvbnN0IGJhc2VSZWNvcmQgPSB7XG4gICAgY3JlYXRlZEF0OiByZXF1aXJlZElzb1RpbWVzdGFtcChyZWNvcmQuY3JlYXRlZEF0LCBcImNyZWF0ZWRBdFwiKSxcbiAgICBkZXBlbmRlbmNpZXM6IG5vcm1hbGl6ZURlcGVuZGVuY2llcyhyZWNvcmQuZGVwZW5kZW5jaWVzKSxcbiAgICBpZDogcmVxdWlyZWRTdHJpbmcocmVjb3JkLmlkLCBcImlkXCIpLFxuICAgIG11dGF0aW9uOiBub3JtYWxpemVNdXRhdGlvbihyZWNvcmQubXV0YXRpb24pLFxuICAgIHNlcXVlbmNlOiByZXF1aXJlZFBvc2l0aXZlSW50ZWdlcihyZWNvcmQuc2VxdWVuY2UsIFwic2VxdWVuY2VcIiksXG4gICAgc3RhdHVzOiAvKiogQHR5cGUge0xvY2FsTXV0YXRpb25TdGF0dXN9ICovIChzdGF0dXMpLFxuICAgIHVwZGF0ZWRBdDogcmVxdWlyZWRJc29UaW1lc3RhbXAocmVjb3JkLnVwZGF0ZWRBdCwgXCJ1cGRhdGVkQXRcIilcbiAgfVxuXG4gIGlmIChyZWNvcmQuc3luY1Jlc3VsdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYmFzZVJlY29yZFxuXG4gIHJldHVybiB7XG4gICAgLi4uYmFzZVJlY29yZCxcbiAgICBzeW5jUmVzdWx0OiBjbG9uZUpzb25PYmplY3QocmVjb3JkLnN5bmNSZXN1bHQsIFwic3luY1Jlc3VsdFwiKVxuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBkZXBlbmRlbmN5IG1ldGFkYXRhIGVudHJpZXMuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmF3IGRlcGVuZGVuY2llcy5cbiAqIEByZXR1cm5zIHtMb2NhbE11dGF0aW9uRGVwZW5kZW5jeVtdfSAtIE5vcm1hbGl6ZWQgZGVwZW5kZW5jaWVzLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVEZXBlbmRlbmNpZXModmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBbXVxuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBsb2NhbCBtdXRhdGlvbiBkZXBlbmRlbmNpZXMgYXJyYXlcIilcblxuICByZXR1cm4gdmFsdWUubWFwKChkZXBlbmRlbmN5KSA9PiB7XG4gICAgaWYgKCFkZXBlbmRlbmN5IHx8IHR5cGVvZiBkZXBlbmRlbmN5ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZGVwZW5kZW5jeSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGxvY2FsIG11dGF0aW9uIGRlcGVuZGVuY3kgb2JqZWN0XCIpXG4gICAgfVxuXG4gICAgY29uc3QgZGVwZW5kZW5jeU9iamVjdCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChkZXBlbmRlbmN5KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNsaWVudE11dGF0aW9uSWQ6IHJlcXVpcmVkU3RyaW5nKGRlcGVuZGVuY3lPYmplY3QuY2xpZW50TXV0YXRpb25JZCwgXCJkZXBlbmRlbmN5IGNsaWVudE11dGF0aW9uSWRcIiksXG4gICAgICBtb2RlbDogcmVxdWlyZWRTdHJpbmcoZGVwZW5kZW5jeU9iamVjdC5tb2RlbCwgXCJkZXBlbmRlbmN5IG1vZGVsXCIpXG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBzeW5jIG11dGF0aW9uIHBheWxvYWQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmF3IG11dGF0aW9uLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gLSBOb3JtYWxpemVkIG11dGF0aW9uLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVNdXRhdGlvbih2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbG9jYWwgc3luYyBtdXRhdGlvbiBvYmplY3RcIilcblxuICBjb25zdCBtdXRhdGlvbiA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSlcbiAgY29uc3Qgbm9ybWFsaXplZCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuU3luY011dGF0aW9ufSAqLyAoe1xuICAgIGFjdG9yRGV2aWNlSWQ6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLmFjdG9yRGV2aWNlSWQsIFwiYWN0b3JEZXZpY2VJZFwiKSxcbiAgICBhY3RvclVzZXJJZDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uYWN0b3JVc2VySWQsIFwiYWN0b3JVc2VySWRcIiksXG4gICAgY2xpZW50TXV0YXRpb25JZDogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCwgXCJjbGllbnRNdXRhdGlvbklkXCIpLFxuICAgIG1vZGVsOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5tb2RlbCwgXCJtb2RlbFwiKSxcbiAgICBvY2N1cnJlZEF0OiByZXF1aXJlZElzb1RpbWVzdGFtcChtdXRhdGlvbi5vY2N1cnJlZEF0LCBcIm9jY3VycmVkQXRcIiksXG4gICAgb2ZmbGluZUdyYW50SWQ6IHJlcXVpcmVkU3RyaW5nKG11dGF0aW9uLm9mZmxpbmVHcmFudElkLCBcIm9mZmxpbmVHcmFudElkXCIpLFxuICAgIG9wZXJhdGlvbjogcmVxdWlyZWRTdHJpbmcobXV0YXRpb24ub3BlcmF0aW9uLCBcIm9wZXJhdGlvblwiKSxcbiAgICBwb2xpY3lIYXNoOiByZXF1aXJlZFN0cmluZyhtdXRhdGlvbi5wb2xpY3lIYXNoLCBcInBvbGljeUhhc2hcIilcbiAgfSlcblxuICBpZiAobXV0YXRpb24uYXR0cmlidXRlcyAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLmF0dHJpYnV0ZXMgPSBjbG9uZUpzb25PYmplY3QobXV0YXRpb24uYXR0cmlidXRlcywgXCJhdHRyaWJ1dGVzXCIpXG4gIGlmIChtdXRhdGlvbi5iYXNlVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLmJhc2VWZXJzaW9uID0gY2xvbmVCYXNlVmVyc2lvbihtdXRhdGlvbi5iYXNlVmVyc2lvbilcbiAgaWYgKG11dGF0aW9uLmNvbW1hbmQgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5jb21tYW5kID0gcmVxdWlyZWRTdHJpbmcobXV0YXRpb24uY29tbWFuZCwgXCJjb21tYW5kXCIpXG4gIGlmIChtdXRhdGlvbi5wYXlsb2FkICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQucGF5bG9hZCA9IGNsb25lSnNvbk9iamVjdChtdXRhdGlvbi5wYXlsb2FkLCBcInBheWxvYWRcIilcblxuICByZXR1cm4gbm9ybWFsaXplZFxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGEgbm9uLWVtcHR5IHN0cmluZyB2YWx1ZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBSYXcgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBGaWVsZCBsYWJlbC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUmVxdWlyZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiByZXF1aXJlZFN0cmluZyh2YWx1ZSwgbGFiZWwpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiB8fCB2YWx1ZS5sZW5ndGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGxvY2FsIG11dGF0aW9uICR7bGFiZWx9YClcblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBSZXF1aXJlcyBhbiBJU08gdGltZXN0YW1wIHN0cmluZy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBSYXcgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBGaWVsZCBsYWJlbC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSVNPIHRpbWVzdGFtcC5cbiAqL1xuZnVuY3Rpb24gcmVxdWlyZWRJc29UaW1lc3RhbXAodmFsdWUsIGxhYmVsKSB7XG4gIGNvbnN0IHN0cmluZ1ZhbHVlID0gcmVxdWlyZWRTdHJpbmcodmFsdWUsIGxhYmVsKVxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoc3RyaW5nVmFsdWUpXG5cbiAgaWYgKE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgfHwgZGF0ZS50b0lTT1N0cmluZygpICE9PSBzdHJpbmdWYWx1ZSkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBsb2NhbCBtdXRhdGlvbiAke2xhYmVsfSBJU08gdGltZXN0YW1wYClcblxuICByZXR1cm4gc3RyaW5nVmFsdWVcbn1cblxuLyoqXG4gKiBSZXF1aXJlcyBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWUuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmF3IHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIC0gRmllbGQgbGFiZWwuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIFBvc2l0aXZlIGludGVnZXIuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVkUG9zaXRpdmVJbnRlZ2VyKHZhbHVlLCBsYWJlbCkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSB8fCB2YWx1ZSA8IDEpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbG9jYWwgbXV0YXRpb24gJHtsYWJlbH0gcG9zaXRpdmUgaW50ZWdlcmApXG5cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogQ2xvbmVzIGEgc3VwcG9ydGVkIGJhc2UtdmVyc2lvbiB2YWx1ZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBSYXcgYmFzZSB2ZXJzaW9uLlxuICogQHJldHVybnMge3N0cmluZyB8IG51bWJlciB8IG51bGx9IC0gTm9ybWFsaXplZCBiYXNlIHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGNsb25lQmFzZVZlcnNpb24odmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiB2YWx1ZVxuXG4gIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGxvY2FsIG11dGF0aW9uIGJhc2VWZXJzaW9uIHN0cmluZywgbnVtYmVyLCBvciBudWxsXCIpXG59XG5cbi8qKlxuICogQ2xvbmVzIGEgSlNPTi1jb21wYXRpYmxlIHZhbHVlLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFJhdyBKU09OIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIC0gRmllbGQgbGFiZWwuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZX0gLSBDbG9uZWQgSlNPTiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gY2xvbmVKc29uVmFsdWUodmFsdWUsIGxhYmVsKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIEpTT04tY29tcGF0aWJsZSBsb2NhbCBtdXRhdGlvbiAke2xhYmVsfWApXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZX0gKi8gKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWUpKSlcbn1cblxuLyoqXG4gKiBDbG9uZXMgYSBKU09OLWNvbXBhdGlibGUgb2JqZWN0LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFJhdyBKU09OIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIEZpZWxkIGxhYmVsLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAtIENsb25lZCBKU09OIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gY2xvbmVKc29uT2JqZWN0KHZhbHVlLCBsYWJlbCkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBsb2NhbCBtdXRhdGlvbiAke2xhYmVsfSBvYmplY3RgKVxuXG4gIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAqLyAoY2xvbmVKc29uVmFsdWUodmFsdWUsIGxhYmVsKSlcbn1cblxuLyoqXG4gKiBDbG9uZXMgYSBsb2NhbCBtdXRhdGlvbiBsb2cgcmVjb3JkLlxuICogQHBhcmFtIHtMb2NhbE11dGF0aW9uTG9nUmVjb3JkfSByZWNvcmQgLSBSZWNvcmQgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7TG9jYWxNdXRhdGlvbkxvZ1JlY29yZH0gLSBDbG9uZWQgcmVjb3JkLlxuICovXG5mdW5jdGlvbiBjbG9uZVJlY29yZChyZWNvcmQpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7TG9jYWxNdXRhdGlvbkxvZ1JlY29yZH0gKi8gKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVjb3JkKSkpXG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIGxvY2FsIG11dGF0aW9uIHJlY29yZCBpZC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUmFuZG9tIHJlY29yZCBpZC5cbiAqL1xuZnVuY3Rpb24gcmFuZG9tUmVjb3JkSWQoKSB7XG4gIGNvbnN0IGNyeXB0b1Byb3ZpZGVyID0gZ2xvYmFsVGhpcy5jcnlwdG9cblxuICBpZiAoY3J5cHRvUHJvdmlkZXIgJiYgdHlwZW9mIGNyeXB0b1Byb3ZpZGVyLnJhbmRvbVVVSUQgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGNyeXB0b1Byb3ZpZGVyLnJhbmRvbVVVSUQoKVxuXG4gIHJldHVybiBgbG9jYWwtbXV0YXRpb24tJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpLnNsaWNlKDIpfWBcbn1cbiJdfQ==
@@ -16,6 +16,11 @@ export function serializedScopeFromQuery(query: import("../database/query/model-
16
16
  * its own local identity and cursor — a user scope's empty-conditions cursor
17
17
  * never leaks across accounts on a shared device, while the same user
18
18
  * reconnecting keeps continuity. Owner-less scopes keep their pre-owner key.
19
+ *
20
+ * A null `resourceType` is the all-types scope (the user scope): one scope
21
+ * covering every resource type the server authorizes for the caller, rather
22
+ * than one scope per type. It keys as an empty resource type, so it never
23
+ * collides with a type-declared scope.
19
24
  * @param {import("./sync-client-types.js").SerializedSyncScope} scope - Serialized sync scope.
20
25
  * @returns {string} Stable scope key.
21
26
  */
@@ -1 +1 @@
1
- {"version":3,"file":"query-scope.d.ts","sourceRoot":"","sources":["../../../src/sync/query-scope.js"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AACH,gDAHW,OAAO,wCAAwC,EAAE,OAAO,CAAC,OAAC,CAAC,GACzD,OAAO,wBAAwB,EAAE,mBAAmB,CA+BhE;AAED;;;;;;;;;GASG;AACH,gCAHW,OAAO,wBAAwB,EAAE,mBAAmB,GAClD,MAAM,CAMlB"}
1
+ {"version":3,"file":"query-scope.d.ts","sourceRoot":"","sources":["../../../src/sync/query-scope.js"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AACH,gDAHW,OAAO,wCAAwC,EAAE,OAAO,CAAC,OAAC,CAAC,GACzD,OAAO,wBAAwB,EAAE,mBAAmB,CA+BhE;AAED;;;;;;;;;;;;;;GAcG;AACH,gCAHW,OAAO,wBAAwB,EAAE,mBAAmB,GAClD,MAAM,CAMlB"}
@@ -45,12 +45,17 @@ export function serializedScopeFromQuery(query) {
45
45
  * its own local identity and cursor — a user scope's empty-conditions cursor
46
46
  * never leaks across accounts on a shared device, while the same user
47
47
  * reconnecting keeps continuity. Owner-less scopes keep their pre-owner key.
48
+ *
49
+ * A null `resourceType` is the all-types scope (the user scope): one scope
50
+ * covering every resource type the server authorizes for the caller, rather
51
+ * than one scope per type. It keys as an empty resource type, so it never
52
+ * collides with a type-declared scope.
48
53
  * @param {import("./sync-client-types.js").SerializedSyncScope} scope - Serialized sync scope.
49
54
  * @returns {string} Stable scope key.
50
55
  */
51
56
  export function scopeKey(scope) {
52
57
  const ownerPrefix = scope.owner === undefined || scope.owner === null ? "" : `owner=${stableJsonStringify(scope.owner)}|`;
53
- return `${ownerPrefix}${scope.resourceType}:${stableJsonStringify(scope.conditions)}`;
58
+ return `${ownerPrefix}${scope.resourceType ?? ""}:${stableJsonStringify(scope.conditions)}`;
54
59
  }
55
60
  /**
56
61
  * Validates one scope condition value as a scalar or array of scalars.
@@ -80,4 +85,4 @@ function validateScalar(attributeName, value) {
80
85
  return;
81
86
  throw new Error(`sync(query) condition values must be scalar, got ${typeof value} for: ${attributeName}`);
82
87
  }
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktc2NvcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9xdWVyeS1zY29wZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxtQkFBbUIsTUFBTSxrQkFBa0IsQ0FBQTtBQUVsRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsS0FBSztJQUM1QyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQTtJQUN0RixJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQTtJQUN4RixJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUE7SUFDdEgsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxTQUFTO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO0lBQ3pILElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO0lBRXhGLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUN4QyxNQUFNLFVBQVUsR0FBRyxnQ0FBZ0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRXhELEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7UUFDdEMsTUFBTSxTQUFTLEdBQUcseUNBQXlDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUE7UUFFeEUsSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSwwQkFBMEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3hILE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUN6RyxDQUFDO1FBRUQsS0FBSyxNQUFNLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMvRCxNQUFNLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFFakUsSUFBSSxhQUFhLElBQUksVUFBVSxJQUFJLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxLQUFLLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQzFILE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLGFBQWEsRUFBRSxDQUFDLENBQUE7WUFDakYsQ0FBQztZQUVELFVBQVUsQ0FBQyxhQUFhLENBQUMsR0FBRyxjQUFjLENBQUE7UUFDNUMsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEVBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxVQUFVLENBQUMsWUFBWSxFQUFFLEVBQUMsQ0FBQTtBQUM5RCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUFLO0lBQzVCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUE7SUFFekgsT0FBTyxHQUFHLFdBQVcsR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFBO0FBQ3ZGLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsb0JBQW9CLENBQUMsYUFBYSxFQUFFLEtBQUs7SUFDaEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLO1lBQUUsY0FBYyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUU3RCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFRCxjQUFjLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBRXBDLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxjQUFjLENBQUMsYUFBYSxFQUFFLEtBQUs7SUFDMUMsSUFBSSxLQUFLLEtBQUssSUFBSTtRQUFFLE9BQU07SUFDMUIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFNO0lBRWhHLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELE9BQU8sS0FBSyxTQUFTLGFBQWEsRUFBRSxDQUFDLENBQUE7QUFDM0csQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgc3RhYmxlSnNvblN0cmluZ2lmeSBmcm9tIFwiLi9zdGFibGUtanNvbi5qc1wiXG5cbi8qKlxuICogU2VyaWFsaXplcyBhIG1vZGVsIHF1ZXJ5IGludG8gYSB0cmFuc3BvcnRhYmxlIHN5bmMgc2NvcGUuXG4gKlxuICogT25seSBwbGFpbiBhdHRyaWJ1dGUgZXF1YWxpdHkgY29uZGl0aW9ucyBhcmUgc3VwcG9ydGVkOiB0aGUgc2NvcGUgbXVzdCBiZVxuICogZXhwcmVzc2libGUgYXMgYHtyZXNvdXJjZVR5cGUsIGNvbmRpdGlvbnN9YCBzbyBzZXJ2ZXJzIGNhbiBtYXRjaCBpdCBhZ2FpbnN0XG4gKiB0aGVpciBjaGFuZ2UgZmVlZHMuIEFueXRoaW5nIGVsc2UgKHJhdyBTUUwsIG5lZ2F0aW9ucywgam9pbnMsIG9yZGVycyxcbiAqIGxpbWl0cywgb2Zmc2V0cywgZ3JvdXBzKSBmYWlscyBsb3VkbHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8Pz59IHF1ZXJ5IC0gTW9kZWwgcXVlcnkgZGVjbGFyaW5nIHRoZSBzeW5jIHNjb3BlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU2VyaWFsaXplZFN5bmNTY29wZX0gU2VyaWFsaXplZCBzeW5jIHNjb3BlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplZFNjb3BlRnJvbVF1ZXJ5KHF1ZXJ5KSB7XG4gIGlmIChxdWVyeS5nZXRKb2lucygpLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihcInN5bmMocXVlcnkpIGRvZXMgbm90IHN1cHBvcnQgam9pbnNcIilcbiAgaWYgKHF1ZXJ5LmdldE9yZGVycygpLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihcInN5bmMocXVlcnkpIGRvZXMgbm90IHN1cHBvcnQgb3JkZXJzXCIpXG4gIGlmIChxdWVyeS5nZXRMaW1pdCgpICE9PSBudWxsICYmIHF1ZXJ5LmdldExpbWl0KCkgIT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKFwic3luYyhxdWVyeSkgZG9lcyBub3Qgc3VwcG9ydCBsaW1pdFwiKVxuICBpZiAocXVlcnkuZ2V0T2Zmc2V0KCkgIT09IG51bGwgJiYgcXVlcnkuZ2V0T2Zmc2V0KCkgIT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKFwic3luYyhxdWVyeSkgZG9lcyBub3Qgc3VwcG9ydCBvZmZzZXRcIilcbiAgaWYgKHF1ZXJ5LmdldEdyb3VwcygpLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihcInN5bmMocXVlcnkpIGRvZXMgbm90IHN1cHBvcnQgZ3JvdXBzXCIpXG5cbiAgY29uc3QgbW9kZWxDbGFzcyA9IHF1ZXJ5LmdldE1vZGVsQ2xhc3MoKVxuICBjb25zdCBjb25kaXRpb25zID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKHt9KVxuXG4gIGZvciAoY29uc3Qgd2hlcmUgb2YgcXVlcnkuZ2V0V2hlcmVzKCkpIHtcbiAgICBjb25zdCB3aGVyZUhhc2ggPSAvKiogQHR5cGUge3toYXNoPzogUmVjb3JkPHN0cmluZywgPz59fSAqLyAod2hlcmUpLmhhc2hcblxuICAgIGlmICghd2hlcmVIYXNoIHx8IHR5cGVvZiB3aGVyZUhhc2ggIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh3aGVyZUhhc2gpIHx8IC8qKiBAdHlwZSB7e3doZXJlPzogP319ICovICh3aGVyZSkud2hlcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgc3luYyhxdWVyeSkgb25seSBzdXBwb3J0cyBwbGFpbiBhdHRyaWJ1dGUgY29uZGl0aW9ucywgZ290OiAke3doZXJlLmNvbnN0cnVjdG9yLm5hbWV9YClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMod2hlcmVIYXNoKSkge1xuICAgICAgY29uc3QgY29uZGl0aW9uVmFsdWUgPSBzY2FsYXJDb25kaXRpb25WYWx1ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSlcblxuICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgaW4gY29uZGl0aW9ucyAmJiBzdGFibGVKc29uU3RyaW5naWZ5KGNvbmRpdGlvbnNbYXR0cmlidXRlTmFtZV0pICE9PSBzdGFibGVKc29uU3RyaW5naWZ5KGNvbmRpdGlvblZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHN5bmMocXVlcnkpIGdvdCBjb25mbGljdGluZyBjb25kaXRpb25zIGZvcjogJHthdHRyaWJ1dGVOYW1lfWApXG4gICAgICB9XG5cbiAgICAgIGNvbmRpdGlvbnNbYXR0cmlidXRlTmFtZV0gPSBjb25kaXRpb25WYWx1ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7Y29uZGl0aW9ucywgcmVzb3VyY2VUeXBlOiBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBzdGFibGUgY2Fub25pY2FsIGtleSBpZGVudGlmeWluZyBhIHN5bmMgc2NvcGUuIFdoZW4gYW4gYG93bmVyYCBpc1xuICogcHJlc2VudCAodGhlIGF1dGhlbnRpY2F0ZWQgaWRlbnRpdHkgdGhhdCBkZWNsYXJlZCB0aGUgc2NvcGUgbG9jYWxseSksIGl0XG4gKiBwYXJ0aWNpcGF0ZXMgaW4gdGhlIGtleSBzbyB0aGUgc2FtZSB3aXJlIHNjb3BlIG93bmVkIGJ5IGEgZGlmZmVyZW50IHVzZXIgZ2V0c1xuICogaXRzIG93biBsb2NhbCBpZGVudGl0eSBhbmQgY3Vyc29yIOKAlCBhIHVzZXIgc2NvcGUncyBlbXB0eS1jb25kaXRpb25zIGN1cnNvclxuICogbmV2ZXIgbGVha3MgYWNyb3NzIGFjY291bnRzIG9uIGEgc2hhcmVkIGRldmljZSwgd2hpbGUgdGhlIHNhbWUgdXNlclxuICogcmVjb25uZWN0aW5nIGtlZXBzIGNvbnRpbnVpdHkuIE93bmVyLWxlc3Mgc2NvcGVzIGtlZXAgdGhlaXIgcHJlLW93bmVyIGtleS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TZXJpYWxpemVkU3luY1Njb3BlfSBzY29wZSAtIFNlcmlhbGl6ZWQgc3luYyBzY29wZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFN0YWJsZSBzY29wZSBrZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY29wZUtleShzY29wZSkge1xuICBjb25zdCBvd25lclByZWZpeCA9IHNjb3BlLm93bmVyID09PSB1bmRlZmluZWQgfHwgc2NvcGUub3duZXIgPT09IG51bGwgPyBcIlwiIDogYG93bmVyPSR7c3RhYmxlSnNvblN0cmluZ2lmeShzY29wZS5vd25lcil9fGBcblxuICByZXR1cm4gYCR7b3duZXJQcmVmaXh9JHtzY29wZS5yZXNvdXJjZVR5cGV9OiR7c3RhYmxlSnNvblN0cmluZ2lmeShzY29wZS5jb25kaXRpb25zKX1gXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBzY29wZSBjb25kaXRpb24gdmFsdWUgYXMgYSBzY2FsYXIgb3IgYXJyYXkgb2Ygc2NhbGFycy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gQ29uZGl0aW9uIGF0dHJpYnV0ZSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBDb25kaXRpb24gdmFsdWUuXG4gKiBAcmV0dXJucyB7P30gVmFsaWRhdGVkIGNvbmRpdGlvbiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc2NhbGFyQ29uZGl0aW9uVmFsdWUoYXR0cmlidXRlTmFtZSwgdmFsdWUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB2YWxpZGF0ZVNjYWxhcihhdHRyaWJ1dGVOYW1lLCBpdGVtKVxuXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICB2YWxpZGF0ZVNjYWxhcihhdHRyaWJ1dGVOYW1lLCB2YWx1ZSlcblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgb25lIHNjYWxhciBjb25kaXRpb24gdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIENvbmRpdGlvbiBhdHRyaWJ1dGUgbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gQ29uZGl0aW9uIHZhbHVlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU2NhbGFyKGF0dHJpYnV0ZU5hbWUsIHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHJldHVyblxuXG4gIHRocm93IG5ldyBFcnJvcihgc3luYyhxdWVyeSkgY29uZGl0aW9uIHZhbHVlcyBtdXN0IGJlIHNjYWxhciwgZ290ICR7dHlwZW9mIHZhbHVlfSBmb3I6ICR7YXR0cmlidXRlTmFtZX1gKVxufVxuIl19
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktc2NvcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9xdWVyeS1zY29wZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxtQkFBbUIsTUFBTSxrQkFBa0IsQ0FBQTtBQUVsRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsS0FBSztJQUM1QyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQTtJQUN0RixJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQTtJQUN4RixJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUE7SUFDdEgsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxTQUFTO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO0lBQ3pILElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO0lBRXhGLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUN4QyxNQUFNLFVBQVUsR0FBRyxnQ0FBZ0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRXhELEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7UUFDdEMsTUFBTSxTQUFTLEdBQUcseUNBQXlDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUE7UUFFeEUsSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSwwQkFBMEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3hILE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUN6RyxDQUFDO1FBRUQsS0FBSyxNQUFNLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMvRCxNQUFNLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFFakUsSUFBSSxhQUFhLElBQUksVUFBVSxJQUFJLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxLQUFLLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQzFILE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLGFBQWEsRUFBRSxDQUFDLENBQUE7WUFDakYsQ0FBQztZQUVELFVBQVUsQ0FBQyxhQUFhLENBQUMsR0FBRyxjQUFjLENBQUE7UUFDNUMsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEVBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxVQUFVLENBQUMsWUFBWSxFQUFFLEVBQUMsQ0FBQTtBQUM5RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLEtBQUs7SUFDNUIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQTtJQUV6SCxPQUFPLEdBQUcsV0FBVyxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksRUFBRSxJQUFJLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFBO0FBQzdGLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsb0JBQW9CLENBQUMsYUFBYSxFQUFFLEtBQUs7SUFDaEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLO1lBQUUsY0FBYyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUU3RCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFRCxjQUFjLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBRXBDLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxjQUFjLENBQUMsYUFBYSxFQUFFLEtBQUs7SUFDMUMsSUFBSSxLQUFLLEtBQUssSUFBSTtRQUFFLE9BQU07SUFDMUIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFNO0lBRWhHLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELE9BQU8sS0FBSyxTQUFTLGFBQWEsRUFBRSxDQUFDLENBQUE7QUFDM0csQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgc3RhYmxlSnNvblN0cmluZ2lmeSBmcm9tIFwiLi9zdGFibGUtanNvbi5qc1wiXG5cbi8qKlxuICogU2VyaWFsaXplcyBhIG1vZGVsIHF1ZXJ5IGludG8gYSB0cmFuc3BvcnRhYmxlIHN5bmMgc2NvcGUuXG4gKlxuICogT25seSBwbGFpbiBhdHRyaWJ1dGUgZXF1YWxpdHkgY29uZGl0aW9ucyBhcmUgc3VwcG9ydGVkOiB0aGUgc2NvcGUgbXVzdCBiZVxuICogZXhwcmVzc2libGUgYXMgYHtyZXNvdXJjZVR5cGUsIGNvbmRpdGlvbnN9YCBzbyBzZXJ2ZXJzIGNhbiBtYXRjaCBpdCBhZ2FpbnN0XG4gKiB0aGVpciBjaGFuZ2UgZmVlZHMuIEFueXRoaW5nIGVsc2UgKHJhdyBTUUwsIG5lZ2F0aW9ucywgam9pbnMsIG9yZGVycyxcbiAqIGxpbWl0cywgb2Zmc2V0cywgZ3JvdXBzKSBmYWlscyBsb3VkbHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8Pz59IHF1ZXJ5IC0gTW9kZWwgcXVlcnkgZGVjbGFyaW5nIHRoZSBzeW5jIHNjb3BlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU2VyaWFsaXplZFN5bmNTY29wZX0gU2VyaWFsaXplZCBzeW5jIHNjb3BlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplZFNjb3BlRnJvbVF1ZXJ5KHF1ZXJ5KSB7XG4gIGlmIChxdWVyeS5nZXRKb2lucygpLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihcInN5bmMocXVlcnkpIGRvZXMgbm90IHN1cHBvcnQgam9pbnNcIilcbiAgaWYgKHF1ZXJ5LmdldE9yZGVycygpLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihcInN5bmMocXVlcnkpIGRvZXMgbm90IHN1cHBvcnQgb3JkZXJzXCIpXG4gIGlmIChxdWVyeS5nZXRMaW1pdCgpICE9PSBudWxsICYmIHF1ZXJ5LmdldExpbWl0KCkgIT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKFwic3luYyhxdWVyeSkgZG9lcyBub3Qgc3VwcG9ydCBsaW1pdFwiKVxuICBpZiAocXVlcnkuZ2V0T2Zmc2V0KCkgIT09IG51bGwgJiYgcXVlcnkuZ2V0T2Zmc2V0KCkgIT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKFwic3luYyhxdWVyeSkgZG9lcyBub3Qgc3VwcG9ydCBvZmZzZXRcIilcbiAgaWYgKHF1ZXJ5LmdldEdyb3VwcygpLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihcInN5bmMocXVlcnkpIGRvZXMgbm90IHN1cHBvcnQgZ3JvdXBzXCIpXG5cbiAgY29uc3QgbW9kZWxDbGFzcyA9IHF1ZXJ5LmdldE1vZGVsQ2xhc3MoKVxuICBjb25zdCBjb25kaXRpb25zID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKHt9KVxuXG4gIGZvciAoY29uc3Qgd2hlcmUgb2YgcXVlcnkuZ2V0V2hlcmVzKCkpIHtcbiAgICBjb25zdCB3aGVyZUhhc2ggPSAvKiogQHR5cGUge3toYXNoPzogUmVjb3JkPHN0cmluZywgPz59fSAqLyAod2hlcmUpLmhhc2hcblxuICAgIGlmICghd2hlcmVIYXNoIHx8IHR5cGVvZiB3aGVyZUhhc2ggIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh3aGVyZUhhc2gpIHx8IC8qKiBAdHlwZSB7e3doZXJlPzogP319ICovICh3aGVyZSkud2hlcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgc3luYyhxdWVyeSkgb25seSBzdXBwb3J0cyBwbGFpbiBhdHRyaWJ1dGUgY29uZGl0aW9ucywgZ290OiAke3doZXJlLmNvbnN0cnVjdG9yLm5hbWV9YClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMod2hlcmVIYXNoKSkge1xuICAgICAgY29uc3QgY29uZGl0aW9uVmFsdWUgPSBzY2FsYXJDb25kaXRpb25WYWx1ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSlcblxuICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgaW4gY29uZGl0aW9ucyAmJiBzdGFibGVKc29uU3RyaW5naWZ5KGNvbmRpdGlvbnNbYXR0cmlidXRlTmFtZV0pICE9PSBzdGFibGVKc29uU3RyaW5naWZ5KGNvbmRpdGlvblZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHN5bmMocXVlcnkpIGdvdCBjb25mbGljdGluZyBjb25kaXRpb25zIGZvcjogJHthdHRyaWJ1dGVOYW1lfWApXG4gICAgICB9XG5cbiAgICAgIGNvbmRpdGlvbnNbYXR0cmlidXRlTmFtZV0gPSBjb25kaXRpb25WYWx1ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7Y29uZGl0aW9ucywgcmVzb3VyY2VUeXBlOiBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBzdGFibGUgY2Fub25pY2FsIGtleSBpZGVudGlmeWluZyBhIHN5bmMgc2NvcGUuIFdoZW4gYW4gYG93bmVyYCBpc1xuICogcHJlc2VudCAodGhlIGF1dGhlbnRpY2F0ZWQgaWRlbnRpdHkgdGhhdCBkZWNsYXJlZCB0aGUgc2NvcGUgbG9jYWxseSksIGl0XG4gKiBwYXJ0aWNpcGF0ZXMgaW4gdGhlIGtleSBzbyB0aGUgc2FtZSB3aXJlIHNjb3BlIG93bmVkIGJ5IGEgZGlmZmVyZW50IHVzZXIgZ2V0c1xuICogaXRzIG93biBsb2NhbCBpZGVudGl0eSBhbmQgY3Vyc29yIOKAlCBhIHVzZXIgc2NvcGUncyBlbXB0eS1jb25kaXRpb25zIGN1cnNvclxuICogbmV2ZXIgbGVha3MgYWNyb3NzIGFjY291bnRzIG9uIGEgc2hhcmVkIGRldmljZSwgd2hpbGUgdGhlIHNhbWUgdXNlclxuICogcmVjb25uZWN0aW5nIGtlZXBzIGNvbnRpbnVpdHkuIE93bmVyLWxlc3Mgc2NvcGVzIGtlZXAgdGhlaXIgcHJlLW93bmVyIGtleS5cbiAqXG4gKiBBIG51bGwgYHJlc291cmNlVHlwZWAgaXMgdGhlIGFsbC10eXBlcyBzY29wZSAodGhlIHVzZXIgc2NvcGUpOiBvbmUgc2NvcGVcbiAqIGNvdmVyaW5nIGV2ZXJ5IHJlc291cmNlIHR5cGUgdGhlIHNlcnZlciBhdXRob3JpemVzIGZvciB0aGUgY2FsbGVyLCByYXRoZXJcbiAqIHRoYW4gb25lIHNjb3BlIHBlciB0eXBlLiBJdCBrZXlzIGFzIGFuIGVtcHR5IHJlc291cmNlIHR5cGUsIHNvIGl0IG5ldmVyXG4gKiBjb2xsaWRlcyB3aXRoIGEgdHlwZS1kZWNsYXJlZCBzY29wZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TZXJpYWxpemVkU3luY1Njb3BlfSBzY29wZSAtIFNlcmlhbGl6ZWQgc3luYyBzY29wZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFN0YWJsZSBzY29wZSBrZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY29wZUtleShzY29wZSkge1xuICBjb25zdCBvd25lclByZWZpeCA9IHNjb3BlLm93bmVyID09PSB1bmRlZmluZWQgfHwgc2NvcGUub3duZXIgPT09IG51bGwgPyBcIlwiIDogYG93bmVyPSR7c3RhYmxlSnNvblN0cmluZ2lmeShzY29wZS5vd25lcil9fGBcblxuICByZXR1cm4gYCR7b3duZXJQcmVmaXh9JHtzY29wZS5yZXNvdXJjZVR5cGUgPz8gXCJcIn06JHtzdGFibGVKc29uU3RyaW5naWZ5KHNjb3BlLmNvbmRpdGlvbnMpfWBcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgb25lIHNjb3BlIGNvbmRpdGlvbiB2YWx1ZSBhcyBhIHNjYWxhciBvciBhcnJheSBvZiBzY2FsYXJzLlxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgLSBDb25kaXRpb24gYXR0cmlidXRlIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHBhcmFtIHs/fSB2YWx1ZSAtIENvbmRpdGlvbiB2YWx1ZS5cbiAqIEByZXR1cm5zIHs/fSBWYWxpZGF0ZWQgY29uZGl0aW9uIHZhbHVlLlxuICovXG5mdW5jdGlvbiBzY2FsYXJDb25kaXRpb25WYWx1ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHZhbGlkYXRlU2NhbGFyKGF0dHJpYnV0ZU5hbWUsIGl0ZW0pXG5cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIHZhbGlkYXRlU2NhbGFyKGF0dHJpYnV0ZU5hbWUsIHZhbHVlKVxuXG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBvbmUgc2NhbGFyIGNvbmRpdGlvbiB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gQ29uZGl0aW9uIGF0dHJpYnV0ZSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBDb25kaXRpb24gdmFsdWUuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTY2FsYXIoYXR0cmlidXRlTmFtZSwgdmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikgcmV0dXJuXG5cbiAgdGhyb3cgbmV3IEVycm9yKGBzeW5jKHF1ZXJ5KSBjb25kaXRpb24gdmFsdWVzIG11c3QgYmUgc2NhbGFyLCBnb3QgJHt0eXBlb2YgdmFsdWV9IGZvcjogJHthdHRyaWJ1dGVOYW1lfWApXG59XG4iXX0=
@@ -7,9 +7,9 @@ export type SerializedSyncScope = {
7
7
  */
8
8
  conditions: Record<string, unknown>;
9
9
  /**
10
- * - Resource/model name the scope was declared for.
10
+ * - Resource/model name the scope was declared for, or null for the all-types (user) scope covering every type the server authorizes for the caller.
11
11
  */
12
- resourceType: string;
12
+ resourceType: string | null;
13
13
  /**
14
14
  * - Local partition key: the authenticated identity that declared the scope. Used only to partition the local scope/cursor store (never sent to the server as scope conditions), so a user scope's empty-conditions cursor does not leak across accounts on a shared device.
15
15
  */
@@ -1 +1 @@
1
- {"version":3,"file":"sync-client-types.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-client-types.js"],"names":[],"mappings":";;;;;;;gBAKc,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;;;;kBACjB,MAAM;;;;;;;;;;;;;;aASN,MAAM;;;;;;;;;;;;;gBAON,OAAC;;;;;;;;;;;;iBAED,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,YAAY,CAAC;;;;0BACrE,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,qBAAqB,CAAC;;;;iBAC9E,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,YAAY,CAAC;;;;;;;;;;;;kCAGlD;QAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;QAAC,MAAM,EAAE,OAAC,CAAA;KAAC,KAAK,MAAM;;;;0BAC9E;QAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;QAAC,MAAM,EAAE,OAAC,CAAA;KAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;;;;;oBAC7D,KAAK,CAAC,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;;;;;;;;;;;;uCAQ7D,MAAM;;;;iBAEN,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,YAAY,CAAC;;;;;;;;;;;;;;;;iBAGrE,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,YAAY,CAAC;;;;0BACrE,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,qBAAqB,CAAC;;;;;;;;;;;;kCAG3D;QAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;QAAC,MAAM,EAAE,OAAC,CAAA;KAAC,KAAK,MAAM;;;;;oBACrB,KAAK,CAAC,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;;;;;0BAC/F;QAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;QAAC,MAAM,EAAE,OAAC,CAAA;KAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;;;;;;;;;;iCAOpF,MAAM,UACP,OAAO,GAAG,0BAA0B,CAAC,MAAM,CAAC;;;;;;yCAO5C,OAAO,2BAA2B,EAAE,oCAAoC;;;;;;;;;;;;;;2BAShE;QAAC,KAAK,EAAE,mBAAmB,CAAA;KAAC,KAAK,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;;;;;;;;gBAE9E,OAAC;;;;;;;;;;yBAOD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;;;;;;;;mBAE9B,OAAO,qBAAqB,EAAE,OAAO;;;;sBAC/B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;;;;2BACzB;QAAC,KAAK,EAAE,mBAAmB,CAAA;KAAC,KAAK,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;;;;uBACtE,KAAK,KAAK,IAAI;;;;iBACtB,CAAC,OAAO,EAAE,OAAO,4BAA4B,EAAE,kBAAkB,GAAG;QAAC,KAAK,EAAE,mBAAmB,CAAA;KAAC,KAAK,OAAO,CAAC,OAAO,4BAA4B,EAAE,mBAAmB,CAAC;;;;gBACtK,CAAC,OAAO,EAAE;QAAC,mBAAmB,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAAA;KAAC,KAAK,OAAO,CAAC,OAAO,4BAA4B,EAAE,kBAAkB,CAAC;;;;;;;;eAE7I,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC;;;;eACxC,OAAC;;;;;;;;mCAEe,MAAM,GAAG,IAAI,GAAG,SAAS"}
1
+ {"version":3,"file":"sync-client-types.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-client-types.js"],"names":[],"mappings":";;;;;;;gBAKc,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;;;;kBACjB,MAAM,GAAG,IAAI;;;;;;;;;;;;;;aASb,MAAM;;;;;;;;;;;;;gBAON,OAAC;;;;;;;;;;;;iBAED,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,YAAY,CAAC;;;;0BACrE,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,qBAAqB,CAAC;;;;iBAC9E,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,YAAY,CAAC;;;;;;;;;;;;kCAGlD;QAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;QAAC,MAAM,EAAE,OAAC,CAAA;KAAC,KAAK,MAAM;;;;0BAC9E;QAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;QAAC,MAAM,EAAE,OAAC,CAAA;KAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;;;;;oBAC7D,KAAK,CAAC,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;;;;;;;;;;;;uCAQ7D,MAAM;;;;iBAEN,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,YAAY,CAAC;;;;;;;;;;;;;;;;iBAGrE,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,YAAY,CAAC;;;;0BACrE,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,qBAAqB,CAAC;;;;;;;;;;;;kCAG3D;QAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;QAAC,MAAM,EAAE,OAAC,CAAA;KAAC,KAAK,MAAM;;;;;oBACrB,KAAK,CAAC,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;;;;;0BAC/F;QAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;QAAC,MAAM,EAAE,OAAC,CAAA;KAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;;;;;;;;;;iCAOpF,MAAM,UACP,OAAO,GAAG,0BAA0B,CAAC,MAAM,CAAC;;;;;;yCAO5C,OAAO,2BAA2B,EAAE,oCAAoC;;;;;;;;;;;;;;2BAShE;QAAC,KAAK,EAAE,mBAAmB,CAAA;KAAC,KAAK,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;;;;;;;;gBAE9E,OAAC;;;;;;;;;;yBAOD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;;;;;;;;mBAE9B,OAAO,qBAAqB,EAAE,OAAO;;;;sBAC/B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;;;;2BACzB;QAAC,KAAK,EAAE,mBAAmB,CAAA;KAAC,KAAK,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;;;;uBACtE,KAAK,KAAK,IAAI;;;;iBACtB,CAAC,OAAO,EAAE,OAAO,4BAA4B,EAAE,kBAAkB,GAAG;QAAC,KAAK,EAAE,mBAAmB,CAAA;KAAC,KAAK,OAAO,CAAC,OAAO,4BAA4B,EAAE,mBAAmB,CAAC;;;;gBACtK,CAAC,OAAO,EAAE;QAAC,mBAAmB,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAAA;KAAC,KAAK,OAAO,CAAC,OAAO,4BAA4B,EAAE,kBAAkB,CAAC;;;;;;;;eAE7I,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC;;;;eACxC,OAAC;;;;;;;;mCAEe,MAAM,GAAG,IAAI,GAAG,SAAS"}