@githolon/dsl 0.105.4 → 0.105.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dart/CHANGELOG.md CHANGED
@@ -1,3 +1,41 @@
1
+ ## 0.64.23
2
+
3
+ - Rebuild the self-contained runner without the retired structural-interface sidecar assumption;
4
+ compatibility is carried by the generated client and offered by installed USDA.
5
+ - Depend on `nomos_types` 0.8.7 so JSON-valued domain objects retain fields alongside `value`.
6
+
7
+ ## 0.64.22
8
+
9
+ - connect() no longer manufactures a custody verdict from an unrelated failure. A boot error
10
+ propagates as itself; `nomos.custody.snapshot_corrupt` is raised only by the snapshot reader that
11
+ found the bytes unreadable, so a transient network fault cannot trigger quarantine-and-reclone of
12
+ healthy local custody.
13
+
14
+ ## 0.64.21
15
+
16
+ - NEW: `Realm.snapshot(name)` — export one workspace's exact resident custody without manufacturing a
17
+ runner session. A generated birth can leave a child resident in the shared kernel before
18
+ application code acquires it, so host persistence cannot be defined as "every connected session":
19
+ mounted, parked and born-but-unopened residents all export. This is what makes a locally-born
20
+ estate survive a close.
21
+ - Snapshots carry the workspace they belong to. Restoring one into a DIFFERENT workspace is now a
22
+ typed recoverable error rather than a silent misinterpretation, and a corrupt v2 envelope is
23
+ refused instead of being decoded as legacy binary custody.
24
+ - The kernel's colocated-read residency refusal is recognised and satisfied on the device runner
25
+ lane, matching the cloud.
26
+ - Restaged with the current kernel candidate: regenerated vendored assets (kernel release identity is baked into them). Published pub.dev archives are immutable, so regenerated bytes ride their own version.
27
+
28
+ ## 0.64.20
29
+
30
+ - NEW: `bridge.localWorkRejectedEvents` — a typed stream of `NomosLocalWorkRejectedEvent` (from
31
+ nomos_types 0.8.6) forwarded over the runner bridge, so apps render honest UX ("queued, will
32
+ retry" vs "preserved for review — contact support") instead of scraping raw refusal prose.
33
+ - `parentSignerEnrollment` gains `remote: true` — force the CLOUD-gateway read even when this holon
34
+ IS the parent: the seated barrier's proof-by-read (enrolled there ⇒ durably in custody, not merely
35
+ locally folded).
36
+ - Rebuild the bundled runner from @githolon/client 0.105.5 (the seal-obligation release: footage-first
37
+ offer lane, scoreboard truth, FF-only seals, seal retry, no-evict-while-dirty).
38
+
1
39
  ## 0.64.19
2
40
 
3
41
  - Rebuild the bundled runner assets from @githolon/client 0.105.3: fixes `ensureParentSignerEnrollment`
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // <define:__NOMOS_KERNEL_RELEASE__>
4
- var define_NOMOS_KERNEL_RELEASE_default = { production: { hash: "d42871a577eb20acd931873998ecb4348df4bfdd09b772f1fb4c20c59b6e85cd", version: "kernel-d42871a5", features: ["compoundKeys", "capturedReads", "invariantGate", "surfacedMerge", "fieldProvenance", "nullSemantics", "attestedReads", "conflictSnapshots", "ownedAudience", "temporalEnum"], protocol: 1 }, testMint: { hash: "a90ca104fdb9d9eb3d42f605f5f85e000e2e84bd782a2aac8bb1be2a49d45833", version: "kernel-a90ca104", features: ["compoundKeys", "capturedReads", "invariantGate", "surfacedMerge", "fieldProvenance", "nullSemantics", "attestedReads", "conflictSnapshots", "ownedAudience", "temporalEnum"], protocol: 1 } };
4
+ var define_NOMOS_KERNEL_RELEASE_default = { production: { hash: "796e512cf4549c7fadbb4e56248ec076bca3992258a1b5282d678cb56bf24f35", version: "kernel-796e512c", features: ["compoundKeys", "capturedReads", "invariantGate", "surfacedMerge", "fieldProvenance", "nullSemantics", "attestedReads", "conflictSnapshots", "ownedAudience", "temporalEnum"], protocol: 1 }, testMint: { hash: "beaabafa0d30eb83f1e49cc9f26251996ea3ef302e24ae36180a686145b41588", version: "kernel-beaabafa", features: ["compoundKeys", "capturedReads", "invariantGate", "surfacedMerge", "fieldProvenance", "nullSemantics", "attestedReads", "conflictSnapshots", "ownedAudience", "temporalEnum"], protocol: 1 } };
5
5
 
6
6
  // runner/node-entry.ts
7
7
  import { createInterface } from "node:readline";
@@ -338,6 +338,10 @@ function createWebviewRunner({ post: post2, openRealm: openRealm2 }) {
338
338
  holon.onCustodyEvent?.((evt) => post2({ v: WEBVIEW_BRIDGE_VERSION, event: "custody", session, custody: evt }));
339
339
  } catch {
340
340
  }
341
+ try {
342
+ holon.onLocalWorkRejectedEvent?.((evt) => post2({ v: WEBVIEW_BRIDGE_VERSION, event: "localWorkRejected", session, localWorkRejected: evt }));
343
+ } catch {
344
+ }
341
345
  if (a.onCustodyBreak === "ask") {
342
346
  holon.onCustodyBreak = (brk) => new Promise((resolve) => {
343
347
  pendingCustodyAsks.set(session, resolve);
@@ -364,6 +368,22 @@ function createWebviewRunner({ post: post2, openRealm: openRealm2 }) {
364
368
  };
365
369
  }) };
366
370
  },
371
+ // PLANE SAVE-ALL: export a workspace that may have resident custody but no runner session (the normal
372
+ // state immediately after a generated birth). The realm performs this against the already-colocated
373
+ // kernel plane; this op never acquires/opens a session and therefore invents no host authority.
374
+ async snapshotWorkspace(a) {
375
+ if (!realm) throw new Error("no realm is open");
376
+ const workspace = String(a.workspace ?? "");
377
+ const r = await realm.snapshot(workspace, {
378
+ ifHead: a.ifHead == null ? null : String(a.ifHead)
379
+ });
380
+ if (r.unchanged) return { workspace, head: r.head, unchanged: true };
381
+ const snapshot = r.snapshot;
382
+ if (snapshot && snapshot.__nativeSnapshotRef !== void 0) {
383
+ return { workspace, head: r.head, snapshotRef: snapshot.__nativeSnapshotRef, len: snapshot.len || 0 };
384
+ }
385
+ return { workspace, head: r.head, snapshot: b64(snapshot) };
386
+ },
367
387
  // COMPAT SUPERPOWER (#72b): compute the LIVE per-member verdict (the generated Dart factory calls this
368
388
  // at bind), returning a PLAIN snapshot (no has()/refresh() closures over the bridge). The pre-call refusal
369
389
  // then lives in the JS runtime's offerDirective — a Dart offer through the bridge is guarded too.
@@ -6290,7 +6310,7 @@ function writeTypeOfScalar(type) {
6290
6310
  }
6291
6311
 
6292
6312
  // src/_adapter/proto/nomos/kernel/v1/kernel_pb.js
6293
- var file_nomos_kernel_v1_kernel = /* @__PURE__ */ fileDesc("Chxub21vcy9rZXJuZWwvdjEva2VybmVsLnByb3RvEg9ub21vcy5rZXJuZWwudjEimAMKC0NhbGxSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoCRIsCgRvcGVuGAogASgLMhwubm9tb3Mua2VybmVsLnYxLk9wZW5SZXF1ZXN0SAASLgoFb2ZmZXIYCyABKAsyHS5ub21vcy5rZXJuZWwudjEuT2ZmZXJSZXF1ZXN0SAASLgoFcXVlcnkYDCABKAsyHS5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXF1ZXN0SAASMAoGb3V0Ym94GA0gASgLMh4ubm9tb3Mua2VybmVsLnYxLk91dGJveFJlcXVlc3RIABIsCgRzeW5jGA4gASgLMhwubm9tb3Mua2VybmVsLnYxLlN5bmNSZXF1ZXN0SAASMgoHY3VzdG9keRgPIAEoCzIfLm5vbW9zLmtlcm5lbC52MS5DdXN0b2R5UmVxdWVzdEgAEiwKBHRlc3QYECABKAsyHC5ub21vcy5rZXJuZWwudjEuVGVzdFJlcXVlc3RIAEILCglvcGVyYXRpb24iywMKDENhbGxSZXNwb25zZRIYChBwcm90b2NvbF92ZXJzaW9uGAEgASgNEhIKCnJlcXVlc3RfaWQYAiABKAkSKwoHZmFpbHVyZRgKIAEoCzIYLm5vbW9zLmtlcm5lbC52MS5GYWlsdXJlSAASLQoEb3BlbhgLIAEoCzIdLm5vbW9zLmtlcm5lbC52MS5PcGVuUmVzcG9uc2VIABIvCgVvZmZlchgMIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5PZmZlclJlc3BvbnNlSAASLwoFcXVlcnkYDSABKAsyHi5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXNwb25zZUgAEjEKBm91dGJveBgOIAEoCzIfLm5vbW9zLmtlcm5lbC52MS5PdXRib3hSZXNwb25zZUgAEi0KBHN5bmMYDyABKAsyHS5ub21vcy5rZXJuZWwudjEuU3luY1Jlc3BvbnNlSAASMwoHY3VzdG9keRgQIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5DdXN0b2R5UmVzcG9uc2VIABItCgR0ZXN0GBEgASgLMh0ubm9tb3Mua2VybmVsLnYxLlRlc3RSZXNwb25zZUgAQgkKB291dGNvbWUiVwoHRmFpbHVyZRIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSLQoHZGV0YWlscxgDIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdCI8CgxPcGVuUmVzcG9uc2USLAoGcmVzdWx0GAEgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0IsMCCg1PZmZlclJlc3BvbnNlEjIKCGFkbWl0dGVkGAEgASgLMh4ubm9tb3Mua2VybmVsLnYxLk9mZmVyQWRtaXR0ZWRIABIwCgdyZWZ1c2VkGAIgASgLMh0ubm9tb3Mua2VybmVsLnYxLk9mZmVyUmVmdXNlZEgAEjsKDWRlYWRfbGV0dGVyZWQYAyABKAsyIi5ub21vcy5rZXJuZWwudjEuT2ZmZXJEZWFkTGV0dGVyZWRIABI4CgtxdWFyYW50aW5lZBgEIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5PZmZlclF1YXJhbnRpbmVkSAASSgoVYmxvY2tlZF9vbl9kZXBlbmRlbmN5GAUgASgLMikubm9tb3Mua2VybmVsLnYxLk9mZmVyQmxvY2tlZE9uRGVwZW5kZW5jeUgAQgkKB291dGNvbWUiPQoNT2ZmZXJBZG1pdHRlZBIsCgZyZXN1bHQYASABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QilgEKDE9mZmVyUmVmdXNlZBIVCghvZmZlcl9pZBgBIAEoCUgAiAEBEi8KB3JlZnVzYWwYAiABKAsyHi5ub21vcy5rZXJuZWwudjEuS2VybmVsUmVmdXNhbBIxCgtkaWFnbm9zdGljcxgDIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdEILCglfb2ZmZXJfaWQiegoRT2ZmZXJEZWFkTGV0dGVyZWQSFQoIb2ZmZXJfaWQYASABKAlIAIgBARIOCgZyZWFzb24YAiABKAkSMQoLZGlhZ25vc3RpY3MYAyABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RCCwoJX29mZmVyX2lkIq4BChBPZmZlclF1YXJhbnRpbmVkEhUKCG9mZmVyX2lkGAEgASgJSACIAQESGQoRYXV0aG9yZWRfbGF3X2hhc2gYAiABKAkSGAoQY3VycmVudF9sYXdfaGFzaBgDIAEoCRIOCgZyZWFzb24YBCABKAkSMQoLZGlhZ25vc3RpY3MYBSABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RCCwoJX29mZmVyX2lkIoEBChhPZmZlckJsb2NrZWRPbkRlcGVuZGVuY3kSFQoIb2ZmZXJfaWQYASABKAlIAIgBARIOCgZkZXRhaWwYAiABKAkSMQoLZGlhZ25vc3RpY3MYAyABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RCCwoJX29mZmVyX2lkIoEBCg1LZXJuZWxSZWZ1c2FsEjAKBGNvZGUYASABKA4yIi5ub21vcy5rZXJuZWwudjEuS2VybmVsUmVmdXNhbENvZGUSDwoHbWVzc2FnZRgCIAEoCRItCgdkZXRhaWxzGAMgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0Iu8CCg1RdWVyeVJlc3BvbnNlEiwKBXZhbHVlGAEgASgLMhsubm9tb3Mua2VybmVsLnYxLk5vbW9zVmFsdWVIABJBChBhcHBsaWNhdGlvbl9qc29uGAIgASgLMiUubm9tb3Mua2VybmVsLnYxLkFwcGxpY2F0aW9uSnNvblZhbHVlSAASSgoTYXV0aG9yaXphdGlvbl9jaGVjaxgKIAEoCzIrLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uQ2hlY2tSZXNwb25zZUgAEkwKFGF1dGhvcml6YXRpb25fZXhwYW5kGAsgASgLMiwubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25FeHBhbmRSZXNwb25zZUgAEkkKGHZlcmlmeV9jaGFpbl9kaWFnbm9zdGljcxgUIAEoCzInLm5vbW9zLmtlcm5lbC52MS5WZXJpZnlDaGFpbkRpYWdub3N0aWNzQggKBnJlc3VsdCLnAQoTVmVyaWZ5Q2hhaW5TdGVwU3BhbhINCgVpbmRleBgBIAEoBBISCgpjb21taXRfb2lkGAIgASgJEg4KBmRvbWFpbhgDIAEoCRIRCglkaXJlY3RpdmUYBCABKAkSEAoIdG90YWxfdXMYBSABKAQSNgoGcGhhc2VzGAYgASgLMiYubm9tb3Mua2VybmVsLnYxLlZlcmlmeUNoYWluU3RlcFBoYXNlcxJACg5lbmdpbmVfdGltaW5ncxgHIAMoCzIoLm5vbW9zLmtlcm5lbC52MS5WZXJpZnlDaGFpbkVuZ2luZVRpbWluZyKYAgoVVmVyaWZ5Q2hhaW5TdGVwUGhhc2VzEh4KFnJ1bnRpbWVfbGF3X3JlZnJlc2hfdXMYASABKAQSEwoLbWFuaWZlc3RfdXMYAiABKAQSGQoRbGF3X3Jlc29sdXRpb25fdXMYAyABKAQSHQoVbWFuYWdlZF90cmFuc2l0aW9uX3VzGAQgASgEEhQKDHByaW5jaXBhbF91cxgFIAEoBBIUCgxldm9sdXRpb25fdXMYBiABKAQSGgoSY29sb2NhdGVkX3JlYWRzX3VzGAcgASgEEiEKGXR5cGVkX2luc3RhbGxfdmVyaWZpZXJfdXMYCCABKAQSFAoMYWRtaXNzaW9uX3VzGAkgASgEEg8KB2ZvbGRfdXMYCiABKAQi0AQKFlZlcmlmeUNoYWluRGlhZ25vc3RpY3MSLgoEd2FsaxgBIAEoDjIgLm5vbW9zLmtlcm5lbC52MS5WZXJpZnlDaGFpbldhbGsSEAoIdG90YWxfdXMYAiABKAQSGwoTcmVmZXJlbmNlX2xvb2t1cF91cxgDIAEoBBIaChJyZXBvc2l0b3J5X29wZW5fdXMYBCABKAQSFQoNY2hhaW5fcmVhZF91cxgFIAEoBBIWCg5lbmdpbmVfaW5pdF91cxgGIAEoBBIYChB0aW1lbGluZV9yZWFkX3VzGAcgASgEEhgKEGxhd19oeWRyYXRpb25fdXMYCCABKAQSGwoTcmVjb3ZlcnlfcHJlc2Nhbl91cxgJIAEoBBIYChBmb2xkX2Zyb250aWVyX3VzGAogASgEEjMKBXN0ZXBzGAsgAygLMiQubm9tb3Mua2VybmVsLnYxLlZlcmlmeUNoYWluU3RlcFNwYW4SQAoOZW5naW5lX3RpbWluZ3MYDCADKAsyKC5ub21vcy5rZXJuZWwudjEuVmVyaWZ5Q2hhaW5FbmdpbmVUaW1pbmcSTQoVbGF3X2h5ZHJhdGlvbl90aW1pbmdzGA0gAygLMi4ubm9tb3Mua2VybmVsLnYxLlZlcmlmeUNoYWluTGF3SHlkcmF0aW9uVGltaW5nEhkKEWxhd19jbG9zdXJlX2NvdW50GA4gASgEEh4KFmxhd19jbG9zdXJlX2NhY2hlX2hpdHMYDyABKAQSIAoYbGF3X2Nsb3N1cmVfY2FjaGVfbWlzc2VzGBAgASgEIjoKF1ZlcmlmeUNoYWluRW5naW5lVGltaW5nEg0KBXBoYXNlGAEgASgJEhAKCHRvdGFsX3VzGAIgASgEIkAKHVZlcmlmeUNoYWluTGF3SHlkcmF0aW9uVGltaW5nEg0KBXBoYXNlGAEgASgJEhAKCHRvdGFsX3VzGAIgASgEIiQKFEFwcGxpY2F0aW9uSnNvblZhbHVlEgwKBHV0ZjgYASABKAwinwIKDU91dGJvdW5kT2ZmZXISCgoCaWQYASABKAkSEwoLZGVzdGluYXRpb24YAiABKAkSFAoMc2VhbGVkX29mZmVyGAMgASgMEhQKDGNvbnRlbnRfdHlwZRgEIAEoCRIYChBzb3VyY2Vfd29ya3NwYWNlGAUgASgJEhQKDGN1c3RvZHlfaGVhZBgGIAEoCRIXCg9jYXVzZWRfYnlfb2ZmZXIYByABKAkSGwoTc2NoZWR1bGVkX2F0X21pbGxpcxgIIAEoBBIaChJkZWFkbGluZV9hdF9taWxsaXMYCSABKAQSFAoMY3VzdG9keV9wYXRoGAogASgJEhMKC2N1c3RvZHlfb2lkGAsgASgJEhQKDGRlbGl2ZXJ5X3JlZhgMIAEoCSJ4Cg5PdXRib3hSZXNwb25zZRIuCgZvZmZlcnMYASADKAsyHi5ub21vcy5rZXJuZWwudjEuT3V0Ym91bmRPZmZlchIfChJuZXh0X2R1ZV9hdF9taWxsaXMYAiABKARIAIgBAUIVChNfbmV4dF9kdWVfYXRfbWlsbGlzIjwKDFN5bmNSZXNwb25zZRIsCgZyZXN1bHQYASABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QiQgoPV29ya3NwYWNlVGFyZ2V0EgwKBHJlcG8YASABKAkSEQoJd29ya3NwYWNlGAIgASgJEg4KBmJyYW5jaBgDIAEoCSJOCgtPcGVuUmVxdWVzdBIwCgZ0YXJnZXQYASABKAsyIC5ub21vcy5rZXJuZWwudjEuV29ya3NwYWNlVGFyZ2V0Eg0KBXNwYW5zGAIgASgIImEKDURpcmVjdGl2ZUNhbGwSDgoGZG9tYWluGAEgASgJEhEKCWRpcmVjdGl2ZRgCIAEoCRItCgdwYXlsb2FkGAMgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0IsACChBBdXRob3JpbmdPcHRpb25zEg0KBWFjdG9yGAEgASgJEhIKCmF1dGhfdG9rZW4YAiABKAwSFQoNYXV0aG9yX3NlY3JldBgDIAEoDBIdChB2YWxpZF9mcm9tX2Vwb2NoGAQgASgESACIAQESHwoScHJpbmNpcGFsX3ZlcmlmaWVkGAUgASgISAGIAQESCwoDcm5nGAYgAygBEhgKEGRlZmVyX3Byb2plY3Rpb24YByABKAgSDQoFc3BhbnMYCCABKAgSDwoHZHJ5X3J1bhgJIAEoCBIQCghzZXF1ZW5jZRgKIAEoBBItCgVjbG9jaxgLIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5DYXB0dXJlZENsb2NrQhMKEV92YWxpZF9mcm9tX2Vwb2NoQhUKE19wcmluY2lwYWxfdmVyaWZpZWQiSgoNQ2FwdHVyZWRDbG9jaxIXCg9waHlzaWNhbF9taWxsaXMYASABKAQSDwoHbG9naWNhbBgCIAEoDRIPCgdyZXBsaWNhGAMgASgEIsMDChBCaXJ0aENlcnRpZmljYXRlEg0KBWNoaWxkGAEgASgJEg8KB2ZvdW5kZXIYAiABKAkSEAoIdmVyaWZpZWQYAyABKAgSEgoKcGFyZW50X2tleRgEIAEoDBIRCglwYXJlbnRfaWQYBSABKAkSDQoFZXBvY2gYBiABKAMSEQoJc2lnbmF0dXJlGAcgASgMEhkKDHZlcmlmaWVkX3ZpYRgIIAEoCUgAiAEBEhYKCWlkcF90b2tlbhgJIAEoCUgBiAEBEhsKDmNhcHR1cmVkX2Nsb2NrGAogASgDSAKIAQESIQoUYXV0aF9wcm92aWRlcl9pc3N1ZXIYCyABKAlIA4gBARIfChJhdXRoX3Byb3ZpZGVyX2p3a3MYDCABKAlIBIgBARIjChZhdXRoX3Byb3ZpZGVyX2F1ZGllbmNlGA0gASgJSAWIAQFCDwoNX3ZlcmlmaWVkX3ZpYUIMCgpfaWRwX3Rva2VuQhEKD19jYXB0dXJlZF9jbG9ja0IXChVfYXV0aF9wcm92aWRlcl9pc3N1ZXJCFQoTX2F1dGhfcHJvdmlkZXJfandrc0IZChdfYXV0aF9wcm92aWRlcl9hdWRpZW5jZSKcBAoMT2ZmZXJSZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSLgoEY2FsbBgCIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5EaXJlY3RpdmVDYWxsSAASHAoSc2VhbGVkX2NoYW5nZV91c2RhGAcgASgMSAASNAoJYXV0aG9yaW5nGAMgASgLMiEubm9tb3Mua2VybmVsLnYxLkF1dGhvcmluZ09wdGlvbnMSEAoIbGF3X3VzZHoYBCABKAwSMwoMYXR0ZXN0YXRpb25zGAUgAygLMh0ubm9tb3Mua2VybmVsLnYxLkF0dGVzdGVkUmVhZBI9ChJjb25mbGljdF9zbmFwc2hvdHMYBiADKAsyIS5ub21vcy5rZXJuZWwudjEuQ29uZmxpY3RTbmFwc2hvdBIaChJleGVjdXRpb25fbGF3X3VzZHoYCCABKAwSIAoTY29udHJvbGxlcl9sYXdfaGFzaBgJIAEoCUgBiAEBEh0KEGNhbmRpZGF0ZV9jb21taXQYCiABKAlIAogBARI8ChFiaXJ0aF9jZXJ0aWZpY2F0ZRgLIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5CaXJ0aENlcnRpZmljYXRlQggKBmludGVudEIWChRfY29udHJvbGxlcl9sYXdfaGFzaEITChFfY2FuZGlkYXRlX2NvbW1pdCKTAQoMQXR0ZXN0ZWRSZWFkEhAKCHF1ZXJ5X2lkGAEgASgJEi8KCWFyZ3VtZW50cxgCIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdBIrCgZyZXN1bHQYAyABKAsyGy5ub21vcy5rZXJuZWwudjEuTm9tb3NWYWx1ZRITCgthdHRlc3RhdGlvbhgEIAEoDCJ1ChBDb25mbGljdFNuYXBzaG90EhYKDmFnZ3JlZ2F0ZV90eXBlGAEgASgJEhQKDGFnZ3JlZ2F0ZV9pZBgCIAEoCRINCgVmaWVsZBgDIAEoCRIVCg10YXJnZXRfc2NoZW1hGAQgASgJEg0KBXRva2VuGAUgASgJIuUFCgxRdWVyeVJlcXVlc3QSMAoGdGFyZ2V0GAEgASgLMiAubm9tb3Mua2VybmVsLnYxLldvcmtzcGFjZVRhcmdldBIyCglhdXRob3JpdHkYAiABKAsyHy5ub21vcy5rZXJuZWwudjEuUXVlcnlBdXRob3JpdHkSDQoFc3BhbnMYAyABKAgSKgoEcm93cxgKIAEoCzIaLm5vbW9zLmtlcm5lbC52MS5Sb3dzUXVlcnlIABIqCgRwYWdlGAsgASgLMhoubm9tb3Mua2VybmVsLnYxLlBhZ2VRdWVyeUgAEisKBWJ5X2lkGAwgASgLMhoubm9tb3Mua2VybmVsLnYxLkJ5SWRRdWVyeUgAEjkKDHJlc29sdmVfcmVmcxgNIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5SZXNvbHZlUmVmc1F1ZXJ5SAASRQoScmVmZXJlbmNlX3ZlcnNpb25zGA4gASgLMicubm9tb3Mua2VybmVsLnYxLlJlZmVyZW5jZVZlcnNpb25zUXVlcnlIABIsCgVjb3VudBgPIAEoCzIbLm5vbW9zLmtlcm5lbC52MS5UYWxseVF1ZXJ5SAASKgoDc3VtGBAgASgLMhsubm9tb3Mua2VybmVsLnYxLlRhbGx5UXVlcnlIABIwCgdzcGF0aWFsGBEgASgLMh0ubm9tb3Mua2VybmVsLnYxLlNwYXRpYWxRdWVyeUgAEiwKBW5hbWVkGBIgASgLMhsubm9tb3Mua2VybmVsLnYxLk5hbWVkUXVlcnlIABJJChNhdXRob3JpemF0aW9uX2NoZWNrGBMgASgLMioubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25DaGVja1JlcXVlc3RIABJLChRhdXRob3JpemF0aW9uX2V4cGFuZBgUIAEoCzIrLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRXhwYW5kUmVxdWVzdEgAQgcKBXF1ZXJ5IpIBCg5RdWVyeUF1dGhvcml0eRIXCg9wcmluY2lwYWxfY2xhaW0YASABKAkSEgoKYXV0aF90b2tlbhgCIAEoDBIQCghub3dfdW5peBgDIAEoBBIVCg1hdXRob3Jfc2VjcmV0GAQgASgMEioKBGtleXMYBSADKAsyHC5ub21vcy5rZXJuZWwudjEuSW5qZWN0ZWRLZXkiOAoLSW5qZWN0ZWRLZXkSDQoFc2NvcGUYASABKAkSDQoFZXBvY2gYAiABKAQSCwoDa2V5GAMgASgMIlsKCVJvd3NRdWVyeRIKCgJpZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSEQoJcHJpbmNpcGFsGAMgASgJInkKCVBhZ2VRdWVyeRIKCgJpZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSDQoFbGltaXQYAyABKA0SDQoFYWZ0ZXIYBCABKAkSEQoJcHJpbmNpcGFsGAUgASgJIkwKCUJ5SWRRdWVyeRIWCg5hZ2dyZWdhdGVfdHlwZRgBIAEoCRIUCgxhZ2dyZWdhdGVfaWQYAiABKAkSEQoJcHJpbmNpcGFsGAMgASgJIlwKCE5vbW9zUmVmEhEKCXdvcmtzcGFjZRgBIAEoCRIWCg5hZ2dyZWdhdGVfdHlwZRgCIAEoCRIUCgxhZ2dyZWdhdGVfaWQYAyABKAkSDwoHdmVyc2lvbhgEIAEoCSJOChBSZXNvbHZlUmVmc1F1ZXJ5EicKBHJlZnMYASADKAsyGS5ub21vcy5rZXJuZWwudjEuTm9tb3NSZWYSEQoJcHJpbmNpcGFsGAIgASgJIk4KFlJlZmVyZW5jZVZlcnNpb25zUXVlcnkSNAoEcmVmcxgBIAMoCzImLm5vbW9zLmtlcm5lbC52MS5SZWZlcmVuY2VWZXJzaW9uQ2hlY2sihAEKFVJlZmVyZW5jZVZlcnNpb25DaGVjaxIpCgZwaW5uZWQYASABKAsyGS5ub21vcy5rZXJuZWwudjEuTm9tb3NSZWYSKQoGc2VyaWVzGAIgASgLMhkubm9tb3Mua2VybmVsLnYxLk5vbW9zUmVmEhUKDWN1cnJlbnRfZmllbGQYAyABKAkiXAoKVGFsbHlRdWVyeRIKCgJpZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSEQoJcHJpbmNpcGFsGAMgASgJIl4KDFNwYXRpYWxRdWVyeRIKCgJpZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSEQoJcHJpbmNpcGFsGAMgASgJInEKCk5hbWVkUXVlcnkSMgoJb3BlcmF0aW9uGAEgASgOMh8ubm9tb3Mua2VybmVsLnYxLlF1ZXJ5T3BlcmF0aW9uEi8KCWFyZ3VtZW50cxgCIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdCIvChNBdXRob3JpemF0aW9uT2JqZWN0EgwKBHR5cGUYASABKAkSCgoCaWQYAiABKAkiVAoUQXV0aG9yaXphdGlvblN1YmplY3QSDAoEdHlwZRgBIAEoCRIKCgJpZBgCIAEoCRIVCghyZWxhdGlvbhgDIAEoCUgAiAEBQgsKCV9yZWxhdGlvbiKcAQoYUmVsYXRpb25zaGlwVHVwbGVBZGRyZXNzEjYKCHJlc291cmNlGAEgASgLMiQubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25PYmplY3QSEAoIcmVsYXRpb24YAiABKAkSNgoHc3ViamVjdBgDIAEoCzIlLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uU3ViamVjdCKBAQoYQXV0aG9yaXphdGlvbkNvbnNpc3RlbmN5EiMKGWN1cnJlbnRfdmVyaWZpZWRfZnJvbnRpZXIYASABKAhIABIZCg9hdF9sZWFzdF9jb21taXQYAiABKAlIABIWCgxleGFjdF9jb21taXQYAyABKAlIAEINCgtyZXF1aXJlbWVudCJmCh1BdXRob3JpemF0aW9uQ29uZGl0aW9uQ29udGV4dBIUCgxjb25kaXRpb25faWQYASABKAkSLwoJYXJndW1lbnRzGAIgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0IvcCChlBdXRob3JpemF0aW9uQ2hlY2tSZXF1ZXN0EjYKCHJlc291cmNlGAEgASgLMiQubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25PYmplY3QSEgoKcGVybWlzc2lvbhgCIAEoCRI2CgdzdWJqZWN0GAMgASgLMiUubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25TdWJqZWN0Ej4KC2NvbnNpc3RlbmN5GAQgASgLMikubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25Db25zaXN0ZW5jeRI/Cgdjb250ZXh0GAUgAygLMi4ubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25Db25kaXRpb25Db250ZXh0EiAKE2V4cGVjdGVkX21vZGVsX2hhc2gYBiABKAlIAIgBARIbChNpbmNsdWRlX2V4cGxhbmF0aW9uGAcgASgIQhYKFF9leHBlY3RlZF9tb2RlbF9oYXNoIu0CChpBdXRob3JpemF0aW9uRXhwYW5kUmVxdWVzdBI2CghyZXNvdXJjZRgBIAEoCzIkLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uT2JqZWN0EhIKCnBlcm1pc3Npb24YAiABKAkSPgoLY29uc2lzdGVuY3kYAyABKAsyKS5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbkNvbnNpc3RlbmN5Ej8KB2NvbnRleHQYBCADKAsyLi5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbkNvbmRpdGlvbkNvbnRleHQSIAoTZXhwZWN0ZWRfbW9kZWxfaGFzaBgFIAEoCUgAiAEBEg0KBWxpbWl0GAYgASgNEhIKBWFmdGVyGAcgASgJSAGIAQESGwoTaW5jbHVkZV9leHBsYW5hdGlvbhgIIAEoCEIWChRfZXhwZWN0ZWRfbW9kZWxfaGFzaEIICgZfYWZ0ZXIivQEKGVJlbGF0aW9uc2hpcFR1cGxlRXZpZGVuY2USOAoFdHVwbGUYASABKAsyKS5ub21vcy5rZXJuZWwudjEuUmVsYXRpb25zaGlwVHVwbGVBZGRyZXNzEhAKCHR1cGxlX2lkGAIgASgJEhoKEmFzc2VydGlvbl9ldmVudF9pZBgDIAEoCRIgChNyZXZvY2F0aW9uX2V2ZW50X2lkGAQgASgJSACIAQFCFgoUX3Jldm9jYXRpb25fZXZlbnRfaWQi4QMKGEF1dGhvcml6YXRpb25FeHBsYW5hdGlvbhJGCglvcGVyYXRpb24YASABKA4yMy5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbkV4cGxhbmF0aW9uLk9wZXJhdGlvbhIQCghyZWxhdGlvbhgCIAEoCRIOCgZyZXN1bHQYAyABKAgSPAoIZXZpZGVuY2UYBCADKAsyKi5ub21vcy5rZXJuZWwudjEuUmVsYXRpb25zaGlwVHVwbGVFdmlkZW5jZRI7CghjaGlsZHJlbhgFIAMoCzIpLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRXhwbGFuYXRpb24i3wEKCU9wZXJhdGlvbhIZChVPUEVSQVRJT05fVU5TUEVDSUZJRUQQABIUChBPUEVSQVRJT05fRElSRUNUEAESHgoaT1BFUkFUSU9OX0NPTVBVVEVEX1VTRVJTRVQQAhIeChpPUEVSQVRJT05fVFVQTEVfVE9fVVNFUlNFVBADEhMKD09QRVJBVElPTl9VTklPThAEEhoKFk9QRVJBVElPTl9JTlRFUlNFQ1RJT04QBRIXChNPUEVSQVRJT05fRVhDTFVTSU9OEAYSFwoTT1BFUkFUSU9OX0NPTkRJVElPThAHIncKGkF1dGhvcml6YXRpb25EZWNpc2lvbkJhc2lzEiAKGGF1dGhvcml6YXRpb25fbW9kZWxfaGFzaBgBIAEoCRIhChlyZWxhdGlvbnNoaXBfc3RhdGVfY29tbWl0GAIgASgJEhQKDGNvbnRleHRfaGFzaBgDIAEoDCK+AQoaQXV0aG9yaXphdGlvbkNoZWNrUmVzcG9uc2USDwoHYWxsb3dlZBgBIAEoCBI6CgViYXNpcxgCIAEoCzIrLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRGVjaXNpb25CYXNpcxJDCgtleHBsYW5hdGlvbhgDIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRXhwbGFuYXRpb25IAIgBAUIOCgxfZXhwbGFuYXRpb24igwIKG0F1dGhvcml6YXRpb25FeHBhbmRSZXNwb25zZRI3CghzdWJqZWN0cxgBIAMoCzIlLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uU3ViamVjdBI6CgViYXNpcxgCIAEoCzIrLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRGVjaXNpb25CYXNpcxIRCgRuZXh0GAMgASgJSACIAQESQwoLZXhwbGFuYXRpb24YBCABKAsyKS5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbkV4cGxhbmF0aW9uSAGIAQFCBwoFX25leHRCDgoMX2V4cGxhbmF0aW9uInAKDU91dGJveFJlcXVlc3QSMAoGdGFyZ2V0GAEgASgLMiAubm9tb3Mua2VybmVsLnYxLldvcmtzcGFjZVRhcmdldBItCgVjbG9jaxgCIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5DYXB0dXJlZENsb2NrImMKC1N5bmNSZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSEQoJZnJvbV9iYXNlGAIgASgJEg8KB3RvX2hlYWQYAyABKAkiUwoLVGVzdFJlcXVlc3QSNwoIc2V0X3Jvb3QYASABKAsyIy5ub21vcy5rZXJuZWwudjEuU2V0VGVzdFJvb3RSZXF1ZXN0SABCCwoJb3BlcmF0aW9uIigKElNldFRlc3RSb290UmVxdWVzdBISCgpwdWJsaWNfa2V5GAEgASgMIj0KDFRlc3RSZXNwb25zZRItCgZyZXN1bHQYASABKAsyHS5ub21vcy5rZXJuZWwudjEuQWNrbm93bGVkZ2VkIu0JCg5DdXN0b2R5UmVxdWVzdBI3CgpwYWNrX2RlbHRhGAogASgLMiEubm9tb3Mua2VybmVsLnYxLlBhY2tEZWx0YVJlcXVlc3RIABI3CgphcHBseV9wYWNrGAsgASgLMiEubm9tb3Mua2VybmVsLnYxLkFwcGx5UGFja1JlcXVlc3RIABI3CgpyZXBvX3N0YXRzGAwgASgLMiEubm9tb3Mua2VybmVsLnYxLlJlcG9TdGF0c1JlcXVlc3RIABI9Cg1pbnRlbnRzX2Fib3ZlGA0gASgLMiQubm9tb3Mua2VybmVsLnYxLkludGVudHNBYm92ZVJlcXVlc3RIABI/Cg5pbnNwZWN0X2NoYW5nZRgOIAEoCzIlLm5vbW9zLmtlcm5lbC52MS5JbnNwZWN0Q2hhbmdlUmVxdWVzdEgAEk4KFmVuY29kZV9yZWZ1c2FsX3ZlcmRpY3QYDyABKAsyLC5ub21vcy5rZXJuZWwudjEuRW5jb2RlUmVmdXNhbFZlcmRpY3RSZXF1ZXN0SAASUAoXaW5zcGVjdF9yZWZ1c2FsX3ZlcmRpY3QYECABKAsyLS5ub21vcy5rZXJuZWwudjEuSW5zcGVjdFJlZnVzYWxWZXJkaWN0UmVxdWVzdEgAEjUKCXJlYWRfYmxvYhgRIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5SZWFkQmxvYlJlcXVlc3RIABI5CgtyZXNvbHZlX3JlZhgSIAEoCzIiLm5vbW9zLmtlcm5lbC52MS5SZXNvbHZlUmVmUmVxdWVzdEgAEjUKCWxpc3RfcmVmcxgTIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5MaXN0UmVmc1JlcXVlc3RIABI1Cgl3cml0ZV9yZWYYFCABKAsyIC5ub21vcy5rZXJuZWwudjEuV3JpdGVSZWZSZXF1ZXN0SAASNwoKZGVsZXRlX3JlZhgVIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5EZWxldGVSZWZSZXF1ZXN0SAASRAoRd3JpdGVfbWV0YV9jb21taXQYFiABKAsyJy5ub21vcy5rZXJuZWwudjEuV3JpdGVNZXRhQ29tbWl0UmVxdWVzdEgAEkIKEGxhd19jbG9zdXJlX2luZm8YFyABKAsyJi5ub21vcy5rZXJuZWwudjEuTGF3Q2xvc3VyZUluZm9SZXF1ZXN0SAASRQoRY2hlY2twb2ludF9leHBvcnQYGCABKAsyKC5ub21vcy5rZXJuZWwudjEuQ2hlY2twb2ludEV4cG9ydFJlcXVlc3RIABJFChFjaGVja3BvaW50X2ltcG9ydBgZIAEoCzIoLm5vbW9zLmtlcm5lbC52MS5DaGVja3BvaW50SW1wb3J0UmVxdWVzdEgAEkMKEGNhcGFjaXR5X3Jlc2VydmUYGiABKAsyJy5ub21vcy5rZXJuZWwudjEuQ2FwYWNpdHlSZXNlcnZlUmVxdWVzdEgAEjsKDHJlc3RvcmVfbWFpbhgbIAEoCzIjLm5vbW9zLmtlcm5lbC52MS5SZXN0b3JlTWFpblJlcXVlc3RIABJOChZyZXNvbHZlX3N0YXRlX3Bvc2l0aW9uGBwgASgLMiwubm9tb3Mua2VybmVsLnYxLlJlc29sdmVTdGF0ZVBvc2l0aW9uUmVxdWVzdEgAQgsKCW9wZXJhdGlvbiKcAQoQUGFja0RlbHRhUmVxdWVzdBIMCgRyZXBvGAEgASgJEhEKBGhlYWQYAiABKAlIAIgBARIRCgRiYXNlGAMgASgJSAGIAQESDgoGYnJhbmNoGAQgASgJEh0KEHN0YWdlZF9wYWNrX2ZpbGUYBSABKAlIAogBAUIHCgVfaGVhZEIHCgVfYmFzZUITChFfc3RhZ2VkX3BhY2tfZmlsZSJyChBBcHBseVBhY2tSZXF1ZXN0EgwKBHJlcG8YASABKAkSDgoEcGFjaxgCIAEoDEgAEhoKEHN0YWdlZF9wYWNrX2ZpbGUYBCABKAlIABIRCgRoZWFkGAMgASgJSAGIAQFCCAoGc291cmNlQgcKBV9oZWFkIiAKEFJlcG9TdGF0c1JlcXVlc3QSDAoEcmVwbxgBIAEoCSKsAQoTSW50ZW50c0Fib3ZlUmVxdWVzdBIMCgRyZXBvGAEgASgJEhEKBGhlYWQYAiABKAlIAIgBARIRCgRiYXNlGAMgASgJSAGIAQESDgoGYnJhbmNoGAQgASgJEg0KBWxpbWl0GAUgASgEEhgKEGNvbXBsZXRlX2xvZ2ljYWwYBiABKAgSFgoOY29tcGFjdF9zdG9yZWQYByABKAhCBwoFX2hlYWRCBwoFX2Jhc2UiKwoUSW5zcGVjdENoYW5nZVJlcXVlc3QSEwoLY2hhbmdlX3VzZGEYASABKAwi3wEKDlJlZnVzYWxWZXJkaWN0EhUKCG9mZmVyX2lkGAEgASgJSACIAQESEAoDb2lkGAIgASgJSAGIAQESEwoGZG9tYWluGAMgASgJSAKIAQESGQoMZGlyZWN0aXZlX2lkGAQgASgJSAOIAQESFAoHc2Vzc2lvbhgFIAEoCUgEiAEBEhEKCXBhcmtlZF9hdBgGIAEoCRIOCgZyZWFzb24YByABKAlCCwoJX29mZmVyX2lkQgYKBF9vaWRCCQoHX2RvbWFpbkIPCg1fZGlyZWN0aXZlX2lkQgoKCF9zZXNzaW9uIk8KG0VuY29kZVJlZnVzYWxWZXJkaWN0UmVxdWVzdBIwCgd2ZXJkaWN0GAEgASgLMh8ubm9tb3Mua2VybmVsLnYxLlJlZnVzYWxWZXJkaWN0IjQKHEluc3BlY3RSZWZ1c2FsVmVyZGljdFJlcXVlc3QSFAoMdmVyZGljdF91c2RhGAEgASgMIjoKD1JlYWRCbG9iUmVxdWVzdBIMCgRyZXBvGAEgASgJEgsKA29pZBgCIAEoCRIMCgRwYXRoGAMgASgJIjQKEVJlc29sdmVSZWZSZXF1ZXN0EgwKBHJlcG8YASABKAkSEQoJcmVmZXJlbmNlGAIgASgJIi8KD0xpc3RSZWZzUmVxdWVzdBIMCgRyZXBvGAEgASgJEg4KBnByZWZpeBgCIAEoCSJCCg9Xcml0ZVJlZlJlcXVlc3QSDAoEcmVwbxgBIAEoCRIRCglyZWZlcmVuY2UYAiABKAkSDgoGdGFyZ2V0GAMgASgJIjMKEERlbGV0ZVJlZlJlcXVlc3QSDAoEcmVwbxgBIAEoCRIRCglyZWZlcmVuY2UYAiABKAkiKQoITWV0YUZpbGUSDAoEcGF0aBgBIAEoCRIPCgdjb250ZW50GAIgASgMIq4BChZXcml0ZU1ldGFDb21taXRSZXF1ZXN0EgwKBHJlcG8YASABKAkSDwoHcGFyZW50cxgCIAMoCRIoCgVmaWxlcxgDIAMoCzIZLm5vbW9zLmtlcm5lbC52MS5NZXRhRmlsZRIPCgdtZXNzYWdlGAQgASgJEhQKDHRpbWVfc2Vjb25kcxgFIAEoEhIWCglyZWZlcmVuY2UYBiABKAlIAIgBAUIMCgpfcmVmZXJlbmNlImcKFUxhd0Nsb3N1cmVJbmZvUmVxdWVzdBIUCgxjbG9zdXJlX2ZpbGUYASABKAkSOAoKY2FwYWJpbGl0eRgCIAEoDjIkLm5vbW9zLmtlcm5lbC52MS5LZXJuZWxMYXdDYXBhYmlsaXR5IocBChdDaGVja3BvaW50RXhwb3J0UmVxdWVzdBIwCgZ0YXJnZXQYASABKAsyIC5ub21vcy5rZXJuZWwudjEuV29ya3NwYWNlVGFyZ2V0EiEKFHN0YWdlZF9mcm9udGllcl9maWxlGAIgASgJSACIAQFCFwoVX3N0YWdlZF9mcm9udGllcl9maWxlIukBChdDaGVja3BvaW50SW1wb3J0UmVxdWVzdBIwCgZ0YXJnZXQYASABKAsyIC5ub21vcy5rZXJuZWwudjEuV29ya3NwYWNlVGFyZ2V0EhIKCGZyb250aWVyGAIgASgMSAASHgoUc3RhZ2VkX2Zyb250aWVyX2ZpbGUYBiABKAlIABITCgZjdXJzb3IYAyABKAlIAYgBARIXCgpzdGF0ZV9yb290GAQgASgJSAKIAQESDQoFc3BhbnMYBSABKAhCEQoPZnJvbnRpZXJfc291cmNlQgkKB19jdXJzb3JCDQoLX3N0YXRlX3Jvb3QiMQoWQ2FwYWNpdHlSZXNlcnZlUmVxdWVzdBIXCg9hZ2dyZWdhdGVfY291bnQYASABKAQiVAoSUmVzdG9yZU1haW5SZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSDAoEaGVhZBgCIAEoCSJpChtSZXNvbHZlU3RhdGVQb3NpdGlvblJlcXVlc3QSDAoEcmVwbxgBIAEoCRIRCgltYWluX2hlYWQYAiABKAkSFQoNaGludGVkX2NvbW1pdBgDIAEoCRISCgpzdGF0ZV9yb290GAQgASgJIvgJCg9DdXN0b2R5UmVzcG9uc2USOAoKcGFja19kZWx0YRgKIAEoCzIiLm5vbW9zLmtlcm5lbC52MS5QYWNrRGVsdGFSZXNwb25zZUgAEjgKCmFwcGx5X3BhY2sYCyABKAsyIi5ub21vcy5rZXJuZWwudjEuQXBwbHlQYWNrUmVzcG9uc2VIABI4CgpyZXBvX3N0YXRzGAwgASgLMiIubm9tb3Mua2VybmVsLnYxLlJlcG9TdGF0c1Jlc3BvbnNlSAASPgoNaW50ZW50c19hYm92ZRgNIAEoCzIlLm5vbW9zLmtlcm5lbC52MS5JbnRlbnRzQWJvdmVSZXNwb25zZUgAEkAKDmluc3BlY3RfY2hhbmdlGA4gASgLMiYubm9tb3Mua2VybmVsLnYxLkluc3BlY3RDaGFuZ2VSZXNwb25zZUgAEk8KFmVuY29kZV9yZWZ1c2FsX3ZlcmRpY3QYDyABKAsyLS5ub21vcy5rZXJuZWwudjEuRW5jb2RlUmVmdXNhbFZlcmRpY3RSZXNwb25zZUgAElEKF2luc3BlY3RfcmVmdXNhbF92ZXJkaWN0GBAgASgLMi4ubm9tb3Mua2VybmVsLnYxLkluc3BlY3RSZWZ1c2FsVmVyZGljdFJlc3BvbnNlSAASNgoJcmVhZF9ibG9iGBEgASgLMiEubm9tb3Mua2VybmVsLnYxLlJlYWRCbG9iUmVzcG9uc2VIABI6CgtyZXNvbHZlX3JlZhgSIAEoCzIjLm5vbW9zLmtlcm5lbC52MS5SZXNvbHZlUmVmUmVzcG9uc2VIABI2CglsaXN0X3JlZnMYEyABKAsyIS5ub21vcy5rZXJuZWwudjEuTGlzdFJlZnNSZXNwb25zZUgAEjIKCXdyaXRlX3JlZhgUIAEoCzIdLm5vbW9zLmtlcm5lbC52MS5BY2tub3dsZWRnZWRIABIzCgpkZWxldGVfcmVmGBUgASgLMh0ubm9tb3Mua2VybmVsLnYxLkFja25vd2xlZGdlZEgAEkUKEXdyaXRlX21ldGFfY29tbWl0GBYgASgLMigubm9tb3Mua2VybmVsLnYxLldyaXRlTWV0YUNvbW1pdFJlc3BvbnNlSAASQwoQbGF3X2Nsb3N1cmVfaW5mbxgXIAEoCzInLm5vbW9zLmtlcm5lbC52MS5MYXdDbG9zdXJlSW5mb1Jlc3BvbnNlSAASRgoRY2hlY2twb2ludF9leHBvcnQYGCABKAsyKS5ub21vcy5rZXJuZWwudjEuQ2hlY2twb2ludEV4cG9ydFJlc3BvbnNlSAASRgoRY2hlY2twb2ludF9pbXBvcnQYGSABKAsyKS5ub21vcy5rZXJuZWwudjEuQ2hlY2twb2ludEltcG9ydFJlc3BvbnNlSAASRAoQY2FwYWNpdHlfcmVzZXJ2ZRgaIAEoCzIoLm5vbW9zLmtlcm5lbC52MS5DYXBhY2l0eVJlc2VydmVSZXNwb25zZUgAEjwKDHJlc3RvcmVfbWFpbhgbIAEoCzIkLm5vbW9zLmtlcm5lbC52MS5SZXN0b3JlTWFpblJlc3BvbnNlSAASTwoWcmVzb2x2ZV9zdGF0ZV9wb3NpdGlvbhgcIAEoCzItLm5vbW9zLmtlcm5lbC52MS5SZXNvbHZlU3RhdGVQb3NpdGlvblJlc3BvbnNlSABCCwoJb3BlcmF0aW9uIjAKEVBhY2tEZWx0YVJlc3BvbnNlEgwKBHBhY2sYASABKAwSDQoFYnl0ZXMYAiABKAQiPAoRQXBwbHlQYWNrUmVzcG9uc2USFAoMb2JqZWN0X2NvdW50GAEgASgEEhEKCXBhY2tfaGFzaBgCIAEoCSKnAQoRUmVwb1N0YXRzUmVzcG9uc2USEwoLdG90YWxfYnl0ZXMYASABKAQSFAoMb2JqZWN0X2J5dGVzGAIgASgEEhUKDWxvb3NlX29iamVjdHMYAyABKAQSEwoLbG9vc2VfYnl0ZXMYBCABKAQSEgoKcGFja19maWxlcxgFIAEoBBISCgpwYWNrX2J5dGVzGAYgASgEEhMKC2luZGV4X2J5dGVzGAcgASgEIuIBCgxJbnRlbnRSZWNvcmQSCwoDb2lkGAEgASgJEhEKCWludGVudF9pZBgCIAEoCRIOCgZkb21haW4YAyABKAkSEQoJZGlyZWN0aXZlGAQgASgJEhMKC2NoYW5nZV91c2RhGAUgASgMEi4KCHNlbWFudGljGAYgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0EkoKFXRyYW5zcG9ydF9yZXF1aXJlbWVudBgHIAEoDjIrLm5vbW9zLmtlcm5lbC52MS5JbnRlbnRUcmFuc3BvcnRSZXF1aXJlbWVudCJGChRJbnRlbnRzQWJvdmVSZXNwb25zZRIuCgdpbnRlbnRzGAEgAygLMh0ubm9tb3Mua2VybmVsLnYxLkludGVudFJlY29yZCJCChNOb21pbmFsQ2FsbElkZW50aXR5EhMKC2RvbWFpbl9wYXRoGAEgASgJEhYKDmRpcmVjdGl2ZV9wYXRoGAIgASgJIogBChhMaWZlY3ljbGVJbnN0YWxsSWRlbnRpdHkSHwoXdGFyZ2V0X2Nsb3N1cmVfaWRlbnRpdHkYASABKAkSFAoMaW5zdGFsbGVkX2J5GAIgASgJEjUKBXBoYXNlGAMgASgOMiYubm9tb3Mua2VybmVsLnYxLkxpZmVjeWNsZUluc3RhbGxQaGFzZSJaCh1Xb3Jrc3BhY2VSZXNpZGVuY3lSZXF1aXJlbWVudBIRCgl3b3Jrc3BhY2UYASABKAkSEwoLc291cmNlX2hlYWQYAiABKAkSEQoJZm9sZF9yb290GAMgASgJIrQCChVJbnNwZWN0Q2hhbmdlUmVzcG9uc2USLgoIc2VtYW50aWMYASABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSEQoJaW50ZW50X2lkGAIgASgJEjIKBGNhbGwYAyABKAsyJC5ub21vcy5rZXJuZWwudjEuTm9taW5hbENhbGxJZGVudGl0eRIQCghhdXRob3JlZBgEIAEoCBJEChFsaWZlY3ljbGVfaW5zdGFsbBgFIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5MaWZlY3ljbGVJbnN0YWxsSWRlbnRpdHkSTAoUcmVxdWlyZWRfcmVzaWRlbmNpZXMYBiADKAsyLi5ub21vcy5rZXJuZWwudjEuV29ya3NwYWNlUmVzaWRlbmN5UmVxdWlyZW1lbnQiTAocUmVzb2x2ZVN0YXRlUG9zaXRpb25SZXNwb25zZRIaCg1yZXNvbHZlZF9oZWFkGAEgASgJSACIAQFCEAoOX3Jlc29sdmVkX2hlYWQiNAocRW5jb2RlUmVmdXNhbFZlcmRpY3RSZXNwb25zZRIUCgx2ZXJkaWN0X3VzZGEYASABKAwiUQodSW5zcGVjdFJlZnVzYWxWZXJkaWN0UmVzcG9uc2USMAoHdmVyZGljdBgBIAEoCzIfLm5vbW9zLmtlcm5lbC52MS5SZWZ1c2FsVmVyZGljdCIvChBSZWFkQmxvYlJlc3BvbnNlEg0KBWZvdW5kGAEgASgIEgwKBGJsb2IYAiABKAwiLgoSUmVzb2x2ZVJlZlJlc3BvbnNlEhAKA29pZBgBIAEoCUgAiAEBQgYKBF9vaWQiKwoJUmVmUmVjb3JkEhEKCXJlZmVyZW5jZRgBIAEoCRILCgNvaWQYAiABKAkiPAoQTGlzdFJlZnNSZXNwb25zZRIoCgRyZWZzGAEgAygLMhoubm9tb3Mua2VybmVsLnYxLlJlZlJlY29yZCIOCgxBY2tub3dsZWRnZWQiJgoXV3JpdGVNZXRhQ29tbWl0UmVzcG9uc2USCwoDb2lkGAEgASgJIoMBChZMYXdDbG9zdXJlSW5mb1Jlc3BvbnNlEhAKCGlkZW50aXR5GAEgASgJEhkKEXJvb3RfbG9naWNhbF9wYXRoGAIgASgJEhMKC2Fzc2V0X2NvdW50GAMgASgEEhIKCnByaW1fY291bnQYBCABKAQSEwoLZG9tYWluX2tleXMYBSADKAki7wIKGENoZWNrcG9pbnRFeHBvcnRSZXNwb25zZRINCgVlbXB0eRgBIAEoCBITCgZjdXJzb3IYAiABKAlIAIgBARIQCghmcm9udGllchgDIAEoDBIXCgpzdGF0ZV9yb290GAQgASgJSAGIAQESEgoKc3RhdGVfdHJlZRgFIAEoCBIOCgZwaW5uZWQYBiABKAgSGwoTcmVhZF9pbmRleF9zbmFwc2hvdBgHIAEoCBIjChtyZWFkX2luZGV4X3NuYXBzaG90X3BlbmRpbmcYCCABKAgSJAoXcmVhZF9pbmRleF9zcWxpdGVfYnl0ZXMYCSABKARIAogBARIlChhyZWFkX2luZGV4X2N1c3RvZHlfYnl0ZXMYCiABKARIA4gBAUIJCgdfY3Vyc29yQg0KC19zdGF0ZV9yb290QhoKGF9yZWFkX2luZGV4X3NxbGl0ZV9ieXRlc0IbChlfcmVhZF9pbmRleF9jdXN0b2R5X2J5dGVzIp4CChhDaGVja3BvaW50SW1wb3J0UmVzcG9uc2USEAoIcmVzdG9yZWQYASABKAgSEwoGcmVhc29uGAIgASgJSACIAQESFwoPZnJvbnRpZXJfc2VlZGVkGAMgASgIEiUKHWZyb250aWVyX3ZlcmlmaWNhdGlvbl9wZW5kaW5nGAQgASgIEhcKD2FnZ3JlZ2F0ZV9jb3VudBgFIAEoBBIrCgVzcGFucxgGIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdBITCgZjdXJzb3IYByABKAlIAYgBARIRCglyZWFkX29ubHkYCCABKAgSFwoPbGF6eV9yZWFkX2luZGV4GAkgASgIQgkKB19yZWFzb25CCQoHX2N1cnNvciJKChdDYXBhY2l0eVJlc2VydmVSZXNwb25zZRIXCg9hZ2dyZWdhdGVfY291bnQYASABKAQSFgoOcmVzZXJ2ZWRfYnl0ZXMYAiABKAQi+QIKEFJlc3RvcmVNYWluU3BhbnMSEAoIdG90YWxfdXMYASABKAQSGgoSbGl2ZV9yZWZfbG9va3VwX3VzGAIgASgEEhgKEHRhcmdldF9kZWNvZGVfdXMYAyABKAQSJAocY3VzdG9keV9jb21wbGV0ZW5lc3NfcmVhZF91cxgEIAEoBBIZChFxdWFyYW50aW5lX3JlZl91cxgFIAEoBBIlCh1jaGFpbl9zaWduYXR1cmVfbGF3X3JlcGxheV91cxgGIAEoBBIZChF2ZXJkaWN0X2RlY29kZV91cxgHIAEoBBIjChtwcm9tb3RlX2FuZF9jbGVhbnVwX3JlZnNfdXMYCCABKAQSGwoTZnJvbnRpZXJfcmVidWlsZF91cxgJIAEoBBIZChFmcm9udGllcl9zdG9yZV91cxgKIAEoBBI9Cgx2ZXJpZmljYXRpb24YCyABKAsyJy5ub21vcy5rZXJuZWwudjEuVmVyaWZ5Q2hhaW5EaWFnbm9zdGljcyKkAQoTUmVzdG9yZU1haW5SZXNwb25zZRIMCgRoZWFkGAEgASgJEhAKCHZlcmlmaWVkGAIgASgIEgwKBHdhbGsYAyABKAkSMAoFc3BhbnMYBCABKAsyIS5ub21vcy5rZXJuZWwudjEuUmVzdG9yZU1haW5TcGFucxItCgd2ZXJkaWN0GAUgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0IpsCCgpOb21vc1ZhbHVlEiUKBG51bGwYASABKAsyFS5ub21vcy5rZXJuZWwudjEuTnVsbEgAEhEKB2Jvb2xlYW4YAiABKAhIABIYCg5zaWduZWRfaW50ZWdlchgDIAEoEkgAEhoKEHVuc2lnbmVkX2ludGVnZXIYBCABKARIABIYCg5mbG9hdGluZ19wb2ludBgFIAEoAUgAEg4KBHRleHQYBiABKAlIABIPCgVieXRlcxgHIAEoDEgAEioKBGxpc3QYCCABKAsyGi5ub21vcy5rZXJuZWwudjEuTm9tb3NMaXN0SAASLgoGb2JqZWN0GAkgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0SABCBgoEa2luZCIGCgROdWxsIjgKCU5vbW9zTGlzdBIrCgZ2YWx1ZXMYASADKAsyGy5ub21vcy5rZXJuZWwudjEuTm9tb3NWYWx1ZSKTAQoLTm9tb3NTdHJ1Y3QSOAoGZmllbGRzGAEgAygLMigubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0LkZpZWxkc0VudHJ5GkoKC0ZpZWxkc0VudHJ5EgsKA2tleRgBIAEoCRIqCgV2YWx1ZRgCIAEoCzIbLm5vbW9zLmtlcm5lbC52MS5Ob21vc1ZhbHVlOgI4ASrpEgoRS2VybmVsUmVmdXNhbENvZGUSIwofS0VSTkVMX1JFRlVTQUxfQ09ERV9VTlNQRUNJRklFRBAAEiUKIUtFUk5FTF9SRUZVU0FMX0NPREVfQkFEX1NJR05BVFVSRRABEiQKIEtFUk5FTF9SRUZVU0FMX0NPREVfVU5BVVRIT1JJWkVEEAISJwojS0VSTkVMX1JFRlVTQUxfQ09ERV9QT0xJQ1lfRElTQUJMRUQQAxIqCiZLRVJORUxfUkVGVVNBTF9DT0RFX1VOQ0VSVElGSUVEX1BPTElDWRAEEiMKH0tFUk5FTF9SRUZVU0FMX0NPREVfUkVGRVJFTlRJQUwQBRIvCitLRVJORUxfUkVGVVNBTF9DT0RFX1BPSU5UX1NUQVRFX1VOQVZBSUxBQkxFEAYSJAogS0VSTkVMX1JFRlVTQUxfQ09ERV9DQVBfRVhDRUVERUQQBxItCilLRVJORUxfUkVGVVNBTF9DT0RFX0NBUF9DT1VOVF9VTkFWQUlMQUJMRRAIEikKJUtFUk5FTF9SRUZVU0FMX0NPREVfRVZJREVOQ0VfVU5CQUNLRUQQCRImCiJLRVJORUxfUkVGVVNBTF9DT0RFX09SUEhBTl9SRUNFSVBUEAoSNgoyS0VSTkVMX1JFRlVTQUxfQ09ERV9SRUNFSVBUX09OX1RFUk1JTkFMX09CTElHQVRJT04QCxIiCh5LRVJORUxfUkVGVVNBTF9DT0RFX05PVF9NSU5URUQQDBIoCiRLRVJORUxfUkVGVVNBTF9DT0RFX0RPTUFJTl9MSUZFQ1lDTEUQDRIpCiVLRVJORUxfUkVGVVNBTF9DT0RFX1RZUEVfVEFHX01JU01BVENIEA4SLAooS0VSTkVMX1JFRlVTQUxfQ09ERV9SRVRJUkVEX1JFQURfU1VSRkFDRRAPEjAKLEtFUk5FTF9SRUZVU0FMX0NPREVfQ1JPU1NfV09SS1NQQUNFX0RFQ0xJTkVEEBASKwonS0VSTkVMX1JFRlVTQUxfQ09ERV9BR0dSRUdBVEVfSU5WQVJJQU5UEBESKwonS0VSTkVMX1JFRlVTQUxfQ09ERV9XT1JLU1BBQ0VfSU5WQVJJQU5UEBISLgoqS0VSTkVMX1JFRlVTQUxfQ09ERV9DQVBUVVJFRF9SRUFEX0NPTkZMSUNUEBMSMgouS0VSTkVMX1JFRlVTQUxfQ09ERV9DT05GTElDVF9TTkFQU0hPVF9SRVFVSVJFRBAUEjQKMEtFUk5FTF9SRUZVU0FMX0NPREVfQ09ORkxJQ1RfU05BUFNIT1RfVU5ERUNMQVJFRBAVEjEKLUtFUk5FTF9SRUZVU0FMX0NPREVfQ09ORkxJQ1RfU05BUFNIT1RfSU5WQUxJRBAWEi8KK0tFUk5FTF9SRUZVU0FMX0NPREVfQ09ORkxJQ1RfU05BUFNIT1RfU1RBTEUQFxIwCixLRVJORUxfUkVGVVNBTF9DT0RFX0NBUFRVUkVEX1JFQURfVU5ERUNMQVJFRBAYEi0KKUtFUk5FTF9SRUZVU0FMX0NPREVfQ0FQVFVSRURfUkVBRF9QUklWQVRFEBkSMAosS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RFRF9SRUFEX1VOREVDTEFSRUQQGhIzCi9LRVJORUxfUkVGVVNBTF9DT0RFX0FUVEVTVEVEX1JFQURfVU5UUlVTVEVEX0tFWRAbEjYKMktFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNURURfUkVBRF9VTlRSVVNURURfU09VUkNFEBwSLAooS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RFRF9SRUFEX0ZPUkdFRBAdEisKJ0tFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNURURfUkVBRF9TVEFMRRAeEi4KKktFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNURURfUkVBRF9PVkVSU0laRRAfEjcKM0tFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNURURfUkVBRF9ESVNIT05PUkVEX1NPVVJDRRAgEjUKMUtFUk5FTF9SRUZVU0FMX0NPREVfRVFVSVZPQ0FUSU9OX0VWSURFTkNFX0lOVkFMSUQQIRIzCi9LRVJORUxfUkVGVVNBTF9DT0RFX0FUVEVTVEFUSU9OX1JFQ0VJUFRfSU5WQUxJRBAiEisKJ0tFUk5FTF9SRUZVU0FMX0NPREVfS0VZX1JPU1RFUl9NSVNNQVRDSBAjEi8KK0tFUk5FTF9SRUZVU0FMX0NPREVfS0VZX0VQT0NIX05PVF9NT05PVE9OSUMQJBIpCiVLRVJORUxfUkVGVVNBTF9DT0RFX1dSSVRFX0VQT0NIX1NUQUxFECUSLQopS0VSTkVMX1JFRlVTQUxfQ09ERV9FTlZFTE9QRV9TSURfTUlTTUFUQ0gQJhIyCi5LRVJORUxfUkVGVVNBTF9DT0RFX1JFVk9LRURfTUVNQkVSX1JFU1VSUkVDVEVEECcSKAokS0VSTkVMX1JFRlVTQUxfQ09ERV9GT1JHRURfUFJJTkNJUEFMECgSKAokS0VSTkVMX1JFRlVTQUxfQ09ERV9PV05FRF9LRVlfQU5DSE9SECkSJgoiS0VSTkVMX1JFRlVTQUxfQ09ERV9PV05FRF9SRUNPVkVSWRAqEiwKKEtFUk5FTF9SRUZVU0FMX0NPREVfU1VSRkFDRURfQkFTSVNfQUhFQUQQKxIyCi5LRVJORUxfUkVGVVNBTF9DT0RFX1NJR05FUl9FUE9DSF9PVVRfT0ZfV0lORE9XECwSJgoiS0VSTkVMX1JFRlVTQUxfQ09ERV9FVk9MVkVfUkVGVVNFRBAtEisKJ0tFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNUQVRJT05fSU5WQUxJRBAuEi0KKUtFUk5FTF9SRUZVU0FMX0NPREVfUEFSRU5UX0RJRF9OT1RfQVRURVNUEC8SKQolS0VSTkVMX1JFRlVTQUxfQ09ERV9DRVJUX0NIQUlOX0JST0tFThAwEioKJktFUk5FTF9SRUZVU0FMX0NPREVfTk9UX1JPT1RFRF9BVF9ST09UEDESKgomS0VSTkVMX1JFRlVTQUxfQ09ERV9ERUxFR0FUSU9OX0lOVkFMSUQQMhIlCiFLRVJORUxfUkVGVVNBTF9DT0RFX1BMQU5fUkVKRUNURUQQMyqKAQoPVmVyaWZ5Q2hhaW5XYWxrEiEKHVZFUklGWV9DSEFJTl9XQUxLX1VOU1BFQ0lGSUVEEAASGgoWVkVSSUZZX0NIQUlOX1dBTEtfRlVMTBABEhwKGFZFUklGWV9DSEFJTl9XQUxLX1NVRkZJWBACEhoKFlZFUklGWV9DSEFJTl9XQUxLX01FTU8QAyqFDAoOUXVlcnlPcGVyYXRpb24SHwobUVVFUllfT1BFUkFUSU9OX1VOU1BFQ0lGSUVEEAASHAoYUVVFUllfT1BFUkFUSU9OX0VYVFJFTVVNEAESJQohUVVFUllfT1BFUkFUSU9OX1BFTkRJTkdfQ09ORkxJQ1RTEAISLAooUVVFUllfT1BFUkFUSU9OX1BFTkRJTkdfQ09ORkxJQ1RfU1VNTUFSWRADEiAKHFFVRVJZX09QRVJBVElPTl9SRUFEX1BPU1RVUkUQBBIfChtRVUVSWV9PUEVSQVRJT05fQ1VSUkVOVF9MQVcQBRIjCh9RVUVSWV9PUEVSQVRJT05fSU5URVJGQUNFX09GRkVSEAYSJwojUVVFUllfT1BFUkFUSU9OX1JFTEFUSU9OX0dBVEVfT0ZGRVIQBxIdChlRVUVSWV9PUEVSQVRJT05fU0NFTkVfTEFXEAgSIQodUVVFUllfT1BFUkFUSU9OX0lOU1RBTExFRF9MQVcQCRIcChhRVUVSWV9PUEVSQVRJT05fREVTQ1JJQkUQChIgChxRVUVSWV9PUEVSQVRJT05fS0VSTkVMX1NUQU1QEAsSIwofUVVFUllfT1BFUkFUSU9OX0RFVkVMT1BFUl9TUEFOUxAMEikKJVFVRVJZX09QRVJBVElPTl9ERUNMQVJFRF9DQVBBQklMSVRJRVMQDRIdChlRVUVSWV9PUEVSQVRJT05fUkVBRElORVNTEA4SJAogUVVFUllfT1BFUkFUSU9OX1BST0pFQ1RJT05fU1RBVFMQDxIlCiFRVUVSWV9PUEVSQVRJT05fTUVNT1JZX0RST1BfUFJPQkUQEBIYChRRVUVSWV9PUEVSQVRJT05fV0FSTRAREhsKF1FVRVJZX09QRVJBVElPTl9SRUZSRVNIEBISIAocUVVFUllfT1BFUkFUSU9OX1ZFUklGWV9DSEFJThATEiUKIVFVRVJZX09QRVJBVElPTl9ISVNUT1JZX1BSRUZMSUdIVBAUEhkKFVFVRVJZX09QRVJBVElPTl9ST1VURRAVEhgKFFFVRVJZX09QRVJBVElPTl9NSU5UEBYSIQodUVVFUllfT1BFUkFUSU9OX0NSWVBUT19LRVlHRU4QFxIlCiFRVUVSWV9PUEVSQVRJT05fQ1JZUFRPX1NFQUxfRklFTEQQGBIsCihRVUVSWV9PUEVSQVRJT05fQ1JZUFRPX0JMSU5EX0lOREVYX1RPS0VOEBkSKgomUVVFUllfT1BFUkFUSU9OX0NSWVBUT19PV05FRF9TQ09QRV9LRVkQGhIvCitRVUVSWV9PUEVSQVRJT05fQ1JZUFRPX09XTkVEX0RFVklDRV9SRVFVRVNUEBsSMQotUVVFUllfT1BFUkFUSU9OX0NSWVBUT19PV05FRF9QUkVQQVJFX0FQUFJPVkFMEBwSMQotUVVFUllfT1BFUkFUSU9OX0NSWVBUT19PV05FRF9QUkVQQVJFX1JFQ09WRVJZEB0SIwofUVVFUllfT1BFUkFUSU9OX0NSWVBUT19XUkFQX0tFWRAeEiUKIVFVRVJZX09QRVJBVElPTl9DUllQVE9fVU5XUkFQX0tFWRAfEiEKHVFVRVJZX09QRVJBVElPTl9BVVRIT1JfS0VZR0VOECASJAogUVVFUllfT1BFUkFUSU9OX0FUVEVTVEFUSU9OX1NJR04QIRIgChxRVUVSWV9PUEVSQVRJT05fUkVDRUlQVF9QQVRIECISHQoZUVVFUllfT1BFUkFUSU9OX0NFUlRfU0lHThAjEiUKIVFVRVJZX09QRVJBVElPTl9CSVJUSF9UUlVTVF9TVEFURRAkEiEKHVFVRVJZX09QRVJBVElPTl9FUkFfQ0VSVF9TSUdOECUSKAokUVVFUllfT1BFUkFUSU9OX0RFTEVHQVRJT05fQ0VSVF9TSUdOECYSKQolUVVFUllfT1BFUkFUSU9OX0NBTk9OSUNBTElaRV9GUk9OVElFUhAnEisKJ1FVRVJZX09QRVJBVElPTl9DQU5PTklDQUxJWkVfUFJPSkVDVElPThAoKmwKE0tlcm5lbExhd0NhcGFiaWxpdHkSJQohS0VSTkVMX0xBV19DQVBBQklMSVRZX1VOU1BFQ0lGSUVEEAASLgoqS0VSTkVMX0xBV19DQVBBQklMSVRZX1NUQUdFX1pFUk9fQk9PVFNUUkFQEAEqqAEKGkludGVudFRyYW5zcG9ydFJlcXVpcmVtZW50EiwKKElOVEVOVF9UUkFOU1BPUlRfUkVRVUlSRU1FTlRfVU5TUEVDSUZJRUQQABIuCipJTlRFTlRfVFJBTlNQT1JUX1JFUVVJUkVNRU5UX1NFQUxFRF9DSEFOR0UQARIsCihJTlRFTlRfVFJBTlNQT1JUX1JFUVVJUkVNRU5UX0NPTU1JVF9UUkVFEAIqiQEKFUxpZmVjeWNsZUluc3RhbGxQaGFzZRInCiNMSUZFQ1lDTEVfSU5TVEFMTF9QSEFTRV9VTlNQRUNJRklFRBAAEiIKHkxJRkVDWUNMRV9JTlNUQUxMX1BIQVNFX0FDVElWRRABEiMKH0xJRkVDWUNMRV9JTlNUQUxMX1BIQVNFX1BFTkRJTkcQAjJZChJOb21vc0tlcm5lbFNlcnZpY2USQwoEQ2FsbBIcLm5vbW9zLmtlcm5lbC52MS5DYWxsUmVxdWVzdBodLm5vbW9zLmtlcm5lbC52MS5DYWxsUmVzcG9uc2ViBnByb3RvMw");
6313
+ var file_nomos_kernel_v1_kernel = /* @__PURE__ */ fileDesc("Chxub21vcy9rZXJuZWwvdjEva2VybmVsLnByb3RvEg9ub21vcy5rZXJuZWwudjEimAMKC0NhbGxSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoCRIsCgRvcGVuGAogASgLMhwubm9tb3Mua2VybmVsLnYxLk9wZW5SZXF1ZXN0SAASLgoFb2ZmZXIYCyABKAsyHS5ub21vcy5rZXJuZWwudjEuT2ZmZXJSZXF1ZXN0SAASLgoFcXVlcnkYDCABKAsyHS5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXF1ZXN0SAASMAoGb3V0Ym94GA0gASgLMh4ubm9tb3Mua2VybmVsLnYxLk91dGJveFJlcXVlc3RIABIsCgRzeW5jGA4gASgLMhwubm9tb3Mua2VybmVsLnYxLlN5bmNSZXF1ZXN0SAASMgoHY3VzdG9keRgPIAEoCzIfLm5vbW9zLmtlcm5lbC52MS5DdXN0b2R5UmVxdWVzdEgAEiwKBHRlc3QYECABKAsyHC5ub21vcy5rZXJuZWwudjEuVGVzdFJlcXVlc3RIAEILCglvcGVyYXRpb24iywMKDENhbGxSZXNwb25zZRIYChBwcm90b2NvbF92ZXJzaW9uGAEgASgNEhIKCnJlcXVlc3RfaWQYAiABKAkSKwoHZmFpbHVyZRgKIAEoCzIYLm5vbW9zLmtlcm5lbC52MS5GYWlsdXJlSAASLQoEb3BlbhgLIAEoCzIdLm5vbW9zLmtlcm5lbC52MS5PcGVuUmVzcG9uc2VIABIvCgVvZmZlchgMIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5PZmZlclJlc3BvbnNlSAASLwoFcXVlcnkYDSABKAsyHi5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXNwb25zZUgAEjEKBm91dGJveBgOIAEoCzIfLm5vbW9zLmtlcm5lbC52MS5PdXRib3hSZXNwb25zZUgAEi0KBHN5bmMYDyABKAsyHS5ub21vcy5rZXJuZWwudjEuU3luY1Jlc3BvbnNlSAASMwoHY3VzdG9keRgQIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5DdXN0b2R5UmVzcG9uc2VIABItCgR0ZXN0GBEgASgLMh0ubm9tb3Mua2VybmVsLnYxLlRlc3RSZXNwb25zZUgAQgkKB291dGNvbWUiVwoHRmFpbHVyZRIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSLQoHZGV0YWlscxgDIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdCI8CgxPcGVuUmVzcG9uc2USLAoGcmVzdWx0GAEgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0IsMCCg1PZmZlclJlc3BvbnNlEjIKCGFkbWl0dGVkGAEgASgLMh4ubm9tb3Mua2VybmVsLnYxLk9mZmVyQWRtaXR0ZWRIABIwCgdyZWZ1c2VkGAIgASgLMh0ubm9tb3Mua2VybmVsLnYxLk9mZmVyUmVmdXNlZEgAEjsKDWRlYWRfbGV0dGVyZWQYAyABKAsyIi5ub21vcy5rZXJuZWwudjEuT2ZmZXJEZWFkTGV0dGVyZWRIABI4CgtxdWFyYW50aW5lZBgEIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5PZmZlclF1YXJhbnRpbmVkSAASSgoVYmxvY2tlZF9vbl9kZXBlbmRlbmN5GAUgASgLMikubm9tb3Mua2VybmVsLnYxLk9mZmVyQmxvY2tlZE9uRGVwZW5kZW5jeUgAQgkKB291dGNvbWUiPQoNT2ZmZXJBZG1pdHRlZBIsCgZyZXN1bHQYASABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QilgEKDE9mZmVyUmVmdXNlZBIVCghvZmZlcl9pZBgBIAEoCUgAiAEBEi8KB3JlZnVzYWwYAiABKAsyHi5ub21vcy5rZXJuZWwudjEuS2VybmVsUmVmdXNhbBIxCgtkaWFnbm9zdGljcxgDIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdEILCglfb2ZmZXJfaWQiegoRT2ZmZXJEZWFkTGV0dGVyZWQSFQoIb2ZmZXJfaWQYASABKAlIAIgBARIOCgZyZWFzb24YAiABKAkSMQoLZGlhZ25vc3RpY3MYAyABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RCCwoJX29mZmVyX2lkIq4BChBPZmZlclF1YXJhbnRpbmVkEhUKCG9mZmVyX2lkGAEgASgJSACIAQESGQoRYXV0aG9yZWRfbGF3X2hhc2gYAiABKAkSGAoQY3VycmVudF9sYXdfaGFzaBgDIAEoCRIOCgZyZWFzb24YBCABKAkSMQoLZGlhZ25vc3RpY3MYBSABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RCCwoJX29mZmVyX2lkIoEBChhPZmZlckJsb2NrZWRPbkRlcGVuZGVuY3kSFQoIb2ZmZXJfaWQYASABKAlIAIgBARIOCgZkZXRhaWwYAiABKAkSMQoLZGlhZ25vc3RpY3MYAyABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RCCwoJX29mZmVyX2lkIoEBCg1LZXJuZWxSZWZ1c2FsEjAKBGNvZGUYASABKA4yIi5ub21vcy5rZXJuZWwudjEuS2VybmVsUmVmdXNhbENvZGUSDwoHbWVzc2FnZRgCIAEoCRItCgdkZXRhaWxzGAMgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0Iu8CCg1RdWVyeVJlc3BvbnNlEiwKBXZhbHVlGAEgASgLMhsubm9tb3Mua2VybmVsLnYxLk5vbW9zVmFsdWVIABJBChBhcHBsaWNhdGlvbl9qc29uGAIgASgLMiUubm9tb3Mua2VybmVsLnYxLkFwcGxpY2F0aW9uSnNvblZhbHVlSAASSgoTYXV0aG9yaXphdGlvbl9jaGVjaxgKIAEoCzIrLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uQ2hlY2tSZXNwb25zZUgAEkwKFGF1dGhvcml6YXRpb25fZXhwYW5kGAsgASgLMiwubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25FeHBhbmRSZXNwb25zZUgAEkkKGHZlcmlmeV9jaGFpbl9kaWFnbm9zdGljcxgUIAEoCzInLm5vbW9zLmtlcm5lbC52MS5WZXJpZnlDaGFpbkRpYWdub3N0aWNzQggKBnJlc3VsdCLnAQoTVmVyaWZ5Q2hhaW5TdGVwU3BhbhINCgVpbmRleBgBIAEoBBISCgpjb21taXRfb2lkGAIgASgJEg4KBmRvbWFpbhgDIAEoCRIRCglkaXJlY3RpdmUYBCABKAkSEAoIdG90YWxfdXMYBSABKAQSNgoGcGhhc2VzGAYgASgLMiYubm9tb3Mua2VybmVsLnYxLlZlcmlmeUNoYWluU3RlcFBoYXNlcxJACg5lbmdpbmVfdGltaW5ncxgHIAMoCzIoLm5vbW9zLmtlcm5lbC52MS5WZXJpZnlDaGFpbkVuZ2luZVRpbWluZyKYAgoVVmVyaWZ5Q2hhaW5TdGVwUGhhc2VzEh4KFnJ1bnRpbWVfbGF3X3JlZnJlc2hfdXMYASABKAQSEwoLbWFuaWZlc3RfdXMYAiABKAQSGQoRbGF3X3Jlc29sdXRpb25fdXMYAyABKAQSHQoVbWFuYWdlZF90cmFuc2l0aW9uX3VzGAQgASgEEhQKDHByaW5jaXBhbF91cxgFIAEoBBIUCgxldm9sdXRpb25fdXMYBiABKAQSGgoSY29sb2NhdGVkX3JlYWRzX3VzGAcgASgEEiEKGXR5cGVkX2luc3RhbGxfdmVyaWZpZXJfdXMYCCABKAQSFAoMYWRtaXNzaW9uX3VzGAkgASgEEg8KB2ZvbGRfdXMYCiABKAQi2gUKFlZlcmlmeUNoYWluRGlhZ25vc3RpY3MSLgoEd2FsaxgBIAEoDjIgLm5vbW9zLmtlcm5lbC52MS5WZXJpZnlDaGFpbldhbGsSEAoIdG90YWxfdXMYAiABKAQSGwoTcmVmZXJlbmNlX2xvb2t1cF91cxgDIAEoBBIaChJyZXBvc2l0b3J5X29wZW5fdXMYBCABKAQSFQoNY2hhaW5fcmVhZF91cxgFIAEoBBIWCg5lbmdpbmVfaW5pdF91cxgGIAEoBBIYChB0aW1lbGluZV9yZWFkX3VzGAcgASgEEhgKEGxhd19oeWRyYXRpb25fdXMYCCABKAQSGwoTcmVjb3ZlcnlfcHJlc2Nhbl91cxgJIAEoBBIYChBmb2xkX2Zyb250aWVyX3VzGAogASgEEjMKBXN0ZXBzGAsgAygLMiQubm9tb3Mua2VybmVsLnYxLlZlcmlmeUNoYWluU3RlcFNwYW4SQAoOZW5naW5lX3RpbWluZ3MYDCADKAsyKC5ub21vcy5rZXJuZWwudjEuVmVyaWZ5Q2hhaW5FbmdpbmVUaW1pbmcSTQoVbGF3X2h5ZHJhdGlvbl90aW1pbmdzGA0gAygLMi4ubm9tb3Mua2VybmVsLnYxLlZlcmlmeUNoYWluTGF3SHlkcmF0aW9uVGltaW5nEhkKEWxhd19jbG9zdXJlX2NvdW50GA4gASgEEh4KFmxhd19jbG9zdXJlX2NhY2hlX2hpdHMYDyABKAQSIAoYbGF3X2Nsb3N1cmVfY2FjaGVfbWlzc2VzGBAgASgEEhIKCnN0ZXBfY291bnQYESABKAQSFQoNc3RlcF90b3RhbF91cxgSIAEoBBJBChFzdGVwX3BoYXNlX3RvdGFscxgTIAEoCzImLm5vbW9zLmtlcm5lbC52MS5WZXJpZnlDaGFpblN0ZXBQaGFzZXMSGgoSb21pdHRlZF9zdGVwX2NvdW50GBQgASgEIjoKF1ZlcmlmeUNoYWluRW5naW5lVGltaW5nEg0KBXBoYXNlGAEgASgJEhAKCHRvdGFsX3VzGAIgASgEIkAKHVZlcmlmeUNoYWluTGF3SHlkcmF0aW9uVGltaW5nEg0KBXBoYXNlGAEgASgJEhAKCHRvdGFsX3VzGAIgASgEIiQKFEFwcGxpY2F0aW9uSnNvblZhbHVlEgwKBHV0ZjgYASABKAwinwIKDU91dGJvdW5kT2ZmZXISCgoCaWQYASABKAkSEwoLZGVzdGluYXRpb24YAiABKAkSFAoMc2VhbGVkX29mZmVyGAMgASgMEhQKDGNvbnRlbnRfdHlwZRgEIAEoCRIYChBzb3VyY2Vfd29ya3NwYWNlGAUgASgJEhQKDGN1c3RvZHlfaGVhZBgGIAEoCRIXCg9jYXVzZWRfYnlfb2ZmZXIYByABKAkSGwoTc2NoZWR1bGVkX2F0X21pbGxpcxgIIAEoBBIaChJkZWFkbGluZV9hdF9taWxsaXMYCSABKAQSFAoMY3VzdG9keV9wYXRoGAogASgJEhMKC2N1c3RvZHlfb2lkGAsgASgJEhQKDGRlbGl2ZXJ5X3JlZhgMIAEoCSJ4Cg5PdXRib3hSZXNwb25zZRIuCgZvZmZlcnMYASADKAsyHi5ub21vcy5rZXJuZWwudjEuT3V0Ym91bmRPZmZlchIfChJuZXh0X2R1ZV9hdF9taWxsaXMYAiABKARIAIgBAUIVChNfbmV4dF9kdWVfYXRfbWlsbGlzIjwKDFN5bmNSZXNwb25zZRIsCgZyZXN1bHQYASABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QiQgoPV29ya3NwYWNlVGFyZ2V0EgwKBHJlcG8YASABKAkSEQoJd29ya3NwYWNlGAIgASgJEg4KBmJyYW5jaBgDIAEoCSJOCgtPcGVuUmVxdWVzdBIwCgZ0YXJnZXQYASABKAsyIC5ub21vcy5rZXJuZWwudjEuV29ya3NwYWNlVGFyZ2V0Eg0KBXNwYW5zGAIgASgIImEKDURpcmVjdGl2ZUNhbGwSDgoGZG9tYWluGAEgASgJEhEKCWRpcmVjdGl2ZRgCIAEoCRItCgdwYXlsb2FkGAMgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0IsACChBBdXRob3JpbmdPcHRpb25zEg0KBWFjdG9yGAEgASgJEhIKCmF1dGhfdG9rZW4YAiABKAwSFQoNYXV0aG9yX3NlY3JldBgDIAEoDBIdChB2YWxpZF9mcm9tX2Vwb2NoGAQgASgESACIAQESHwoScHJpbmNpcGFsX3ZlcmlmaWVkGAUgASgISAGIAQESCwoDcm5nGAYgAygBEhgKEGRlZmVyX3Byb2plY3Rpb24YByABKAgSDQoFc3BhbnMYCCABKAgSDwoHZHJ5X3J1bhgJIAEoCBIQCghzZXF1ZW5jZRgKIAEoBBItCgVjbG9jaxgLIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5DYXB0dXJlZENsb2NrQhMKEV92YWxpZF9mcm9tX2Vwb2NoQhUKE19wcmluY2lwYWxfdmVyaWZpZWQiSgoNQ2FwdHVyZWRDbG9jaxIXCg9waHlzaWNhbF9taWxsaXMYASABKAQSDwoHbG9naWNhbBgCIAEoDRIPCgdyZXBsaWNhGAMgASgEIsMDChBCaXJ0aENlcnRpZmljYXRlEg0KBWNoaWxkGAEgASgJEg8KB2ZvdW5kZXIYAiABKAkSEAoIdmVyaWZpZWQYAyABKAgSEgoKcGFyZW50X2tleRgEIAEoDBIRCglwYXJlbnRfaWQYBSABKAkSDQoFZXBvY2gYBiABKAMSEQoJc2lnbmF0dXJlGAcgASgMEhkKDHZlcmlmaWVkX3ZpYRgIIAEoCUgAiAEBEhYKCWlkcF90b2tlbhgJIAEoCUgBiAEBEhsKDmNhcHR1cmVkX2Nsb2NrGAogASgDSAKIAQESIQoUYXV0aF9wcm92aWRlcl9pc3N1ZXIYCyABKAlIA4gBARIfChJhdXRoX3Byb3ZpZGVyX2p3a3MYDCABKAlIBIgBARIjChZhdXRoX3Byb3ZpZGVyX2F1ZGllbmNlGA0gASgJSAWIAQFCDwoNX3ZlcmlmaWVkX3ZpYUIMCgpfaWRwX3Rva2VuQhEKD19jYXB0dXJlZF9jbG9ja0IXChVfYXV0aF9wcm92aWRlcl9pc3N1ZXJCFQoTX2F1dGhfcHJvdmlkZXJfandrc0IZChdfYXV0aF9wcm92aWRlcl9hdWRpZW5jZSKcBAoMT2ZmZXJSZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSLgoEY2FsbBgCIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5EaXJlY3RpdmVDYWxsSAASHAoSc2VhbGVkX2NoYW5nZV91c2RhGAcgASgMSAASNAoJYXV0aG9yaW5nGAMgASgLMiEubm9tb3Mua2VybmVsLnYxLkF1dGhvcmluZ09wdGlvbnMSEAoIbGF3X3VzZHoYBCABKAwSMwoMYXR0ZXN0YXRpb25zGAUgAygLMh0ubm9tb3Mua2VybmVsLnYxLkF0dGVzdGVkUmVhZBI9ChJjb25mbGljdF9zbmFwc2hvdHMYBiADKAsyIS5ub21vcy5rZXJuZWwudjEuQ29uZmxpY3RTbmFwc2hvdBIaChJleGVjdXRpb25fbGF3X3VzZHoYCCABKAwSIAoTY29udHJvbGxlcl9sYXdfaGFzaBgJIAEoCUgBiAEBEh0KEGNhbmRpZGF0ZV9jb21taXQYCiABKAlIAogBARI8ChFiaXJ0aF9jZXJ0aWZpY2F0ZRgLIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5CaXJ0aENlcnRpZmljYXRlQggKBmludGVudEIWChRfY29udHJvbGxlcl9sYXdfaGFzaEITChFfY2FuZGlkYXRlX2NvbW1pdCKTAQoMQXR0ZXN0ZWRSZWFkEhAKCHF1ZXJ5X2lkGAEgASgJEi8KCWFyZ3VtZW50cxgCIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdBIrCgZyZXN1bHQYAyABKAsyGy5ub21vcy5rZXJuZWwudjEuTm9tb3NWYWx1ZRITCgthdHRlc3RhdGlvbhgEIAEoDCJ1ChBDb25mbGljdFNuYXBzaG90EhYKDmFnZ3JlZ2F0ZV90eXBlGAEgASgJEhQKDGFnZ3JlZ2F0ZV9pZBgCIAEoCRINCgVmaWVsZBgDIAEoCRIVCg10YXJnZXRfc2NoZW1hGAQgASgJEg0KBXRva2VuGAUgASgJIuUFCgxRdWVyeVJlcXVlc3QSMAoGdGFyZ2V0GAEgASgLMiAubm9tb3Mua2VybmVsLnYxLldvcmtzcGFjZVRhcmdldBIyCglhdXRob3JpdHkYAiABKAsyHy5ub21vcy5rZXJuZWwudjEuUXVlcnlBdXRob3JpdHkSDQoFc3BhbnMYAyABKAgSKgoEcm93cxgKIAEoCzIaLm5vbW9zLmtlcm5lbC52MS5Sb3dzUXVlcnlIABIqCgRwYWdlGAsgASgLMhoubm9tb3Mua2VybmVsLnYxLlBhZ2VRdWVyeUgAEisKBWJ5X2lkGAwgASgLMhoubm9tb3Mua2VybmVsLnYxLkJ5SWRRdWVyeUgAEjkKDHJlc29sdmVfcmVmcxgNIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5SZXNvbHZlUmVmc1F1ZXJ5SAASRQoScmVmZXJlbmNlX3ZlcnNpb25zGA4gASgLMicubm9tb3Mua2VybmVsLnYxLlJlZmVyZW5jZVZlcnNpb25zUXVlcnlIABIsCgVjb3VudBgPIAEoCzIbLm5vbW9zLmtlcm5lbC52MS5UYWxseVF1ZXJ5SAASKgoDc3VtGBAgASgLMhsubm9tb3Mua2VybmVsLnYxLlRhbGx5UXVlcnlIABIwCgdzcGF0aWFsGBEgASgLMh0ubm9tb3Mua2VybmVsLnYxLlNwYXRpYWxRdWVyeUgAEiwKBW5hbWVkGBIgASgLMhsubm9tb3Mua2VybmVsLnYxLk5hbWVkUXVlcnlIABJJChNhdXRob3JpemF0aW9uX2NoZWNrGBMgASgLMioubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25DaGVja1JlcXVlc3RIABJLChRhdXRob3JpemF0aW9uX2V4cGFuZBgUIAEoCzIrLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRXhwYW5kUmVxdWVzdEgAQgcKBXF1ZXJ5IpIBCg5RdWVyeUF1dGhvcml0eRIXCg9wcmluY2lwYWxfY2xhaW0YASABKAkSEgoKYXV0aF90b2tlbhgCIAEoDBIQCghub3dfdW5peBgDIAEoBBIVCg1hdXRob3Jfc2VjcmV0GAQgASgMEioKBGtleXMYBSADKAsyHC5ub21vcy5rZXJuZWwudjEuSW5qZWN0ZWRLZXkiOAoLSW5qZWN0ZWRLZXkSDQoFc2NvcGUYASABKAkSDQoFZXBvY2gYAiABKAQSCwoDa2V5GAMgASgMIlsKCVJvd3NRdWVyeRIKCgJpZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSEQoJcHJpbmNpcGFsGAMgASgJInkKCVBhZ2VRdWVyeRIKCgJpZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSDQoFbGltaXQYAyABKA0SDQoFYWZ0ZXIYBCABKAkSEQoJcHJpbmNpcGFsGAUgASgJIkwKCUJ5SWRRdWVyeRIWCg5hZ2dyZWdhdGVfdHlwZRgBIAEoCRIUCgxhZ2dyZWdhdGVfaWQYAiABKAkSEQoJcHJpbmNpcGFsGAMgASgJIlwKCE5vbW9zUmVmEhEKCXdvcmtzcGFjZRgBIAEoCRIWCg5hZ2dyZWdhdGVfdHlwZRgCIAEoCRIUCgxhZ2dyZWdhdGVfaWQYAyABKAkSDwoHdmVyc2lvbhgEIAEoCSJOChBSZXNvbHZlUmVmc1F1ZXJ5EicKBHJlZnMYASADKAsyGS5ub21vcy5rZXJuZWwudjEuTm9tb3NSZWYSEQoJcHJpbmNpcGFsGAIgASgJIk4KFlJlZmVyZW5jZVZlcnNpb25zUXVlcnkSNAoEcmVmcxgBIAMoCzImLm5vbW9zLmtlcm5lbC52MS5SZWZlcmVuY2VWZXJzaW9uQ2hlY2sihAEKFVJlZmVyZW5jZVZlcnNpb25DaGVjaxIpCgZwaW5uZWQYASABKAsyGS5ub21vcy5rZXJuZWwudjEuTm9tb3NSZWYSKQoGc2VyaWVzGAIgASgLMhkubm9tb3Mua2VybmVsLnYxLk5vbW9zUmVmEhUKDWN1cnJlbnRfZmllbGQYAyABKAkiXAoKVGFsbHlRdWVyeRIKCgJpZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSEQoJcHJpbmNpcGFsGAMgASgJIl4KDFNwYXRpYWxRdWVyeRIKCgJpZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSEQoJcHJpbmNpcGFsGAMgASgJInEKCk5hbWVkUXVlcnkSMgoJb3BlcmF0aW9uGAEgASgOMh8ubm9tb3Mua2VybmVsLnYxLlF1ZXJ5T3BlcmF0aW9uEi8KCWFyZ3VtZW50cxgCIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdCIvChNBdXRob3JpemF0aW9uT2JqZWN0EgwKBHR5cGUYASABKAkSCgoCaWQYAiABKAkiVAoUQXV0aG9yaXphdGlvblN1YmplY3QSDAoEdHlwZRgBIAEoCRIKCgJpZBgCIAEoCRIVCghyZWxhdGlvbhgDIAEoCUgAiAEBQgsKCV9yZWxhdGlvbiKcAQoYUmVsYXRpb25zaGlwVHVwbGVBZGRyZXNzEjYKCHJlc291cmNlGAEgASgLMiQubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25PYmplY3QSEAoIcmVsYXRpb24YAiABKAkSNgoHc3ViamVjdBgDIAEoCzIlLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uU3ViamVjdCKBAQoYQXV0aG9yaXphdGlvbkNvbnNpc3RlbmN5EiMKGWN1cnJlbnRfdmVyaWZpZWRfZnJvbnRpZXIYASABKAhIABIZCg9hdF9sZWFzdF9jb21taXQYAiABKAlIABIWCgxleGFjdF9jb21taXQYAyABKAlIAEINCgtyZXF1aXJlbWVudCJmCh1BdXRob3JpemF0aW9uQ29uZGl0aW9uQ29udGV4dBIUCgxjb25kaXRpb25faWQYASABKAkSLwoJYXJndW1lbnRzGAIgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0IvcCChlBdXRob3JpemF0aW9uQ2hlY2tSZXF1ZXN0EjYKCHJlc291cmNlGAEgASgLMiQubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25PYmplY3QSEgoKcGVybWlzc2lvbhgCIAEoCRI2CgdzdWJqZWN0GAMgASgLMiUubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25TdWJqZWN0Ej4KC2NvbnNpc3RlbmN5GAQgASgLMikubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25Db25zaXN0ZW5jeRI/Cgdjb250ZXh0GAUgAygLMi4ubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25Db25kaXRpb25Db250ZXh0EiAKE2V4cGVjdGVkX21vZGVsX2hhc2gYBiABKAlIAIgBARIbChNpbmNsdWRlX2V4cGxhbmF0aW9uGAcgASgIQhYKFF9leHBlY3RlZF9tb2RlbF9oYXNoIu0CChpBdXRob3JpemF0aW9uRXhwYW5kUmVxdWVzdBI2CghyZXNvdXJjZRgBIAEoCzIkLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uT2JqZWN0EhIKCnBlcm1pc3Npb24YAiABKAkSPgoLY29uc2lzdGVuY3kYAyABKAsyKS5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbkNvbnNpc3RlbmN5Ej8KB2NvbnRleHQYBCADKAsyLi5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbkNvbmRpdGlvbkNvbnRleHQSIAoTZXhwZWN0ZWRfbW9kZWxfaGFzaBgFIAEoCUgAiAEBEg0KBWxpbWl0GAYgASgNEhIKBWFmdGVyGAcgASgJSAGIAQESGwoTaW5jbHVkZV9leHBsYW5hdGlvbhgIIAEoCEIWChRfZXhwZWN0ZWRfbW9kZWxfaGFzaEIICgZfYWZ0ZXIivQEKGVJlbGF0aW9uc2hpcFR1cGxlRXZpZGVuY2USOAoFdHVwbGUYASABKAsyKS5ub21vcy5rZXJuZWwudjEuUmVsYXRpb25zaGlwVHVwbGVBZGRyZXNzEhAKCHR1cGxlX2lkGAIgASgJEhoKEmFzc2VydGlvbl9ldmVudF9pZBgDIAEoCRIgChNyZXZvY2F0aW9uX2V2ZW50X2lkGAQgASgJSACIAQFCFgoUX3Jldm9jYXRpb25fZXZlbnRfaWQi4QMKGEF1dGhvcml6YXRpb25FeHBsYW5hdGlvbhJGCglvcGVyYXRpb24YASABKA4yMy5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbkV4cGxhbmF0aW9uLk9wZXJhdGlvbhIQCghyZWxhdGlvbhgCIAEoCRIOCgZyZXN1bHQYAyABKAgSPAoIZXZpZGVuY2UYBCADKAsyKi5ub21vcy5rZXJuZWwudjEuUmVsYXRpb25zaGlwVHVwbGVFdmlkZW5jZRI7CghjaGlsZHJlbhgFIAMoCzIpLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRXhwbGFuYXRpb24i3wEKCU9wZXJhdGlvbhIZChVPUEVSQVRJT05fVU5TUEVDSUZJRUQQABIUChBPUEVSQVRJT05fRElSRUNUEAESHgoaT1BFUkFUSU9OX0NPTVBVVEVEX1VTRVJTRVQQAhIeChpPUEVSQVRJT05fVFVQTEVfVE9fVVNFUlNFVBADEhMKD09QRVJBVElPTl9VTklPThAEEhoKFk9QRVJBVElPTl9JTlRFUlNFQ1RJT04QBRIXChNPUEVSQVRJT05fRVhDTFVTSU9OEAYSFwoTT1BFUkFUSU9OX0NPTkRJVElPThAHIncKGkF1dGhvcml6YXRpb25EZWNpc2lvbkJhc2lzEiAKGGF1dGhvcml6YXRpb25fbW9kZWxfaGFzaBgBIAEoCRIhChlyZWxhdGlvbnNoaXBfc3RhdGVfY29tbWl0GAIgASgJEhQKDGNvbnRleHRfaGFzaBgDIAEoDCK+AQoaQXV0aG9yaXphdGlvbkNoZWNrUmVzcG9uc2USDwoHYWxsb3dlZBgBIAEoCBI6CgViYXNpcxgCIAEoCzIrLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRGVjaXNpb25CYXNpcxJDCgtleHBsYW5hdGlvbhgDIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRXhwbGFuYXRpb25IAIgBAUIOCgxfZXhwbGFuYXRpb24igwIKG0F1dGhvcml6YXRpb25FeHBhbmRSZXNwb25zZRI3CghzdWJqZWN0cxgBIAMoCzIlLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uU3ViamVjdBI6CgViYXNpcxgCIAEoCzIrLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRGVjaXNpb25CYXNpcxIRCgRuZXh0GAMgASgJSACIAQESQwoLZXhwbGFuYXRpb24YBCABKAsyKS5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbkV4cGxhbmF0aW9uSAGIAQFCBwoFX25leHRCDgoMX2V4cGxhbmF0aW9uInAKDU91dGJveFJlcXVlc3QSMAoGdGFyZ2V0GAEgASgLMiAubm9tb3Mua2VybmVsLnYxLldvcmtzcGFjZVRhcmdldBItCgVjbG9jaxgCIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5DYXB0dXJlZENsb2NrImMKC1N5bmNSZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSEQoJZnJvbV9iYXNlGAIgASgJEg8KB3RvX2hlYWQYAyABKAkiUwoLVGVzdFJlcXVlc3QSNwoIc2V0X3Jvb3QYASABKAsyIy5ub21vcy5rZXJuZWwudjEuU2V0VGVzdFJvb3RSZXF1ZXN0SABCCwoJb3BlcmF0aW9uIigKElNldFRlc3RSb290UmVxdWVzdBISCgpwdWJsaWNfa2V5GAEgASgMIj0KDFRlc3RSZXNwb25zZRItCgZyZXN1bHQYASABKAsyHS5ub21vcy5rZXJuZWwudjEuQWNrbm93bGVkZ2VkIrYKCg5DdXN0b2R5UmVxdWVzdBI3CgpwYWNrX2RlbHRhGAogASgLMiEubm9tb3Mua2VybmVsLnYxLlBhY2tEZWx0YVJlcXVlc3RIABI3CgphcHBseV9wYWNrGAsgASgLMiEubm9tb3Mua2VybmVsLnYxLkFwcGx5UGFja1JlcXVlc3RIABI3CgpyZXBvX3N0YXRzGAwgASgLMiEubm9tb3Mua2VybmVsLnYxLlJlcG9TdGF0c1JlcXVlc3RIABI9Cg1pbnRlbnRzX2Fib3ZlGA0gASgLMiQubm9tb3Mua2VybmVsLnYxLkludGVudHNBYm92ZVJlcXVlc3RIABI/Cg5pbnNwZWN0X2NoYW5nZRgOIAEoCzIlLm5vbW9zLmtlcm5lbC52MS5JbnNwZWN0Q2hhbmdlUmVxdWVzdEgAEk4KFmVuY29kZV9yZWZ1c2FsX3ZlcmRpY3QYDyABKAsyLC5ub21vcy5rZXJuZWwudjEuRW5jb2RlUmVmdXNhbFZlcmRpY3RSZXF1ZXN0SAASUAoXaW5zcGVjdF9yZWZ1c2FsX3ZlcmRpY3QYECABKAsyLS5ub21vcy5rZXJuZWwudjEuSW5zcGVjdFJlZnVzYWxWZXJkaWN0UmVxdWVzdEgAEjUKCXJlYWRfYmxvYhgRIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5SZWFkQmxvYlJlcXVlc3RIABI5CgtyZXNvbHZlX3JlZhgSIAEoCzIiLm5vbW9zLmtlcm5lbC52MS5SZXNvbHZlUmVmUmVxdWVzdEgAEjUKCWxpc3RfcmVmcxgTIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5MaXN0UmVmc1JlcXVlc3RIABI1Cgl3cml0ZV9yZWYYFCABKAsyIC5ub21vcy5rZXJuZWwudjEuV3JpdGVSZWZSZXF1ZXN0SAASNwoKZGVsZXRlX3JlZhgVIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5EZWxldGVSZWZSZXF1ZXN0SAASRAoRd3JpdGVfbWV0YV9jb21taXQYFiABKAsyJy5ub21vcy5rZXJuZWwudjEuV3JpdGVNZXRhQ29tbWl0UmVxdWVzdEgAEkIKEGxhd19jbG9zdXJlX2luZm8YFyABKAsyJi5ub21vcy5rZXJuZWwudjEuTGF3Q2xvc3VyZUluZm9SZXF1ZXN0SAASRQoRY2hlY2twb2ludF9leHBvcnQYGCABKAsyKC5ub21vcy5rZXJuZWwudjEuQ2hlY2twb2ludEV4cG9ydFJlcXVlc3RIABJFChFjaGVja3BvaW50X2ltcG9ydBgZIAEoCzIoLm5vbW9zLmtlcm5lbC52MS5DaGVja3BvaW50SW1wb3J0UmVxdWVzdEgAEkMKEGNhcGFjaXR5X3Jlc2VydmUYGiABKAsyJy5ub21vcy5rZXJuZWwudjEuQ2FwYWNpdHlSZXNlcnZlUmVxdWVzdEgAEjsKDHJlc3RvcmVfbWFpbhgbIAEoCzIjLm5vbW9zLmtlcm5lbC52MS5SZXN0b3JlTWFpblJlcXVlc3RIABJOChZyZXNvbHZlX3N0YXRlX3Bvc2l0aW9uGBwgASgLMiwubm9tb3Mua2VybmVsLnYxLlJlc29sdmVTdGF0ZVBvc2l0aW9uUmVxdWVzdEgAEkcKEnJlc2lkZW50X2Zvb3RwcmludBgdIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5SZXNpZGVudEZvb3RwcmludFJlcXVlc3RIAEILCglvcGVyYXRpb24iKAoYUmVzaWRlbnRGb290cHJpbnRSZXF1ZXN0EgwKBGRlZXAYASABKAginwIKEVJlc2lkZW50Rm9vdHByaW50EhEKCXdvcmtzcGFjZRgBIAEoCRIOCgZicmFuY2gYAiABKAkSGAoQcmVhZF9tb2RlbF9ieXRlcxgDIAEoBBIdChVyZWFkX21vZGVsX3J1c3RfYnl0ZXMYBCABKAQSGAoQZm9sZF9zdGF0ZV9ieXRlcxgFIAEoBBITCgtmb2xkX2ltYWdlcxgGIAEoDRIfChdzaGFyZWRfYXR0cmlidXRlZF9ieXRlcxgHIAEoBBISCgphZ2dyZWdhdGVzGAggASgEEjYKCmNvbXBvbmVudHMYCSADKAsyIi5ub21vcy5rZXJuZWwudjEuUmVzaWRlbnRDb21wb25lbnQSEgoKY29tcHV0ZV91cxgKIAEoBCJpChFSZXNpZGVudENvbXBvbmVudBI0CgRraW5kGAEgASgOMiYubm9tb3Mua2VybmVsLnYxLlJlc2lkZW50Q29tcG9uZW50S2luZBINCgVieXRlcxgCIAEoBBIPCgdjZWlsaW5nGAMgASgIIsoBChlSZXNpZGVudEZvb3RwcmludFJlc3BvbnNlEjUKCXJlc2lkZW50cxgBIAMoCzIiLm5vbW9zLmtlcm5lbC52MS5SZXNpZGVudEZvb3RwcmludBIcChRhbGxvY2F0b3JfbGl2ZV9ieXRlcxgCIAEoBBIYChBhdHRyaWJ1dGVkX2J5dGVzGAMgASgEEhkKEXVuYWNjb3VudGVkX2J5dGVzGAQgASgEEhUKDWFjY291bnRpbmdfdXMYBSABKAQSDAoEZGVlcBgGIAEoCCKcAQoQUGFja0RlbHRhUmVxdWVzdBIMCgRyZXBvGAEgASgJEhEKBGhlYWQYAiABKAlIAIgBARIRCgRiYXNlGAMgASgJSAGIAQESDgoGYnJhbmNoGAQgASgJEh0KEHN0YWdlZF9wYWNrX2ZpbGUYBSABKAlIAogBAUIHCgVfaGVhZEIHCgVfYmFzZUITChFfc3RhZ2VkX3BhY2tfZmlsZSJyChBBcHBseVBhY2tSZXF1ZXN0EgwKBHJlcG8YASABKAkSDgoEcGFjaxgCIAEoDEgAEhoKEHN0YWdlZF9wYWNrX2ZpbGUYBCABKAlIABIRCgRoZWFkGAMgASgJSAGIAQFCCAoGc291cmNlQgcKBV9oZWFkIiAKEFJlcG9TdGF0c1JlcXVlc3QSDAoEcmVwbxgBIAEoCSKsAQoTSW50ZW50c0Fib3ZlUmVxdWVzdBIMCgRyZXBvGAEgASgJEhEKBGhlYWQYAiABKAlIAIgBARIRCgRiYXNlGAMgASgJSAGIAQESDgoGYnJhbmNoGAQgASgJEg0KBWxpbWl0GAUgASgEEhgKEGNvbXBsZXRlX2xvZ2ljYWwYBiABKAgSFgoOY29tcGFjdF9zdG9yZWQYByABKAhCBwoFX2hlYWRCBwoFX2Jhc2UiKwoUSW5zcGVjdENoYW5nZVJlcXVlc3QSEwoLY2hhbmdlX3VzZGEYASABKAwi3wEKDlJlZnVzYWxWZXJkaWN0EhUKCG9mZmVyX2lkGAEgASgJSACIAQESEAoDb2lkGAIgASgJSAGIAQESEwoGZG9tYWluGAMgASgJSAKIAQESGQoMZGlyZWN0aXZlX2lkGAQgASgJSAOIAQESFAoHc2Vzc2lvbhgFIAEoCUgEiAEBEhEKCXBhcmtlZF9hdBgGIAEoCRIOCgZyZWFzb24YByABKAlCCwoJX29mZmVyX2lkQgYKBF9vaWRCCQoHX2RvbWFpbkIPCg1fZGlyZWN0aXZlX2lkQgoKCF9zZXNzaW9uIk8KG0VuY29kZVJlZnVzYWxWZXJkaWN0UmVxdWVzdBIwCgd2ZXJkaWN0GAEgASgLMh8ubm9tb3Mua2VybmVsLnYxLlJlZnVzYWxWZXJkaWN0IjQKHEluc3BlY3RSZWZ1c2FsVmVyZGljdFJlcXVlc3QSFAoMdmVyZGljdF91c2RhGAEgASgMIjoKD1JlYWRCbG9iUmVxdWVzdBIMCgRyZXBvGAEgASgJEgsKA29pZBgCIAEoCRIMCgRwYXRoGAMgASgJIjQKEVJlc29sdmVSZWZSZXF1ZXN0EgwKBHJlcG8YASABKAkSEQoJcmVmZXJlbmNlGAIgASgJIi8KD0xpc3RSZWZzUmVxdWVzdBIMCgRyZXBvGAEgASgJEg4KBnByZWZpeBgCIAEoCSJCCg9Xcml0ZVJlZlJlcXVlc3QSDAoEcmVwbxgBIAEoCRIRCglyZWZlcmVuY2UYAiABKAkSDgoGdGFyZ2V0GAMgASgJIjMKEERlbGV0ZVJlZlJlcXVlc3QSDAoEcmVwbxgBIAEoCRIRCglyZWZlcmVuY2UYAiABKAkiKQoITWV0YUZpbGUSDAoEcGF0aBgBIAEoCRIPCgdjb250ZW50GAIgASgMIq4BChZXcml0ZU1ldGFDb21taXRSZXF1ZXN0EgwKBHJlcG8YASABKAkSDwoHcGFyZW50cxgCIAMoCRIoCgVmaWxlcxgDIAMoCzIZLm5vbW9zLmtlcm5lbC52MS5NZXRhRmlsZRIPCgdtZXNzYWdlGAQgASgJEhQKDHRpbWVfc2Vjb25kcxgFIAEoEhIWCglyZWZlcmVuY2UYBiABKAlIAIgBAUIMCgpfcmVmZXJlbmNlImcKFUxhd0Nsb3N1cmVJbmZvUmVxdWVzdBIUCgxjbG9zdXJlX2ZpbGUYASABKAkSOAoKY2FwYWJpbGl0eRgCIAEoDjIkLm5vbW9zLmtlcm5lbC52MS5LZXJuZWxMYXdDYXBhYmlsaXR5IocBChdDaGVja3BvaW50RXhwb3J0UmVxdWVzdBIwCgZ0YXJnZXQYASABKAsyIC5ub21vcy5rZXJuZWwudjEuV29ya3NwYWNlVGFyZ2V0EiEKFHN0YWdlZF9mcm9udGllcl9maWxlGAIgASgJSACIAQFCFwoVX3N0YWdlZF9mcm9udGllcl9maWxlIukBChdDaGVja3BvaW50SW1wb3J0UmVxdWVzdBIwCgZ0YXJnZXQYASABKAsyIC5ub21vcy5rZXJuZWwudjEuV29ya3NwYWNlVGFyZ2V0EhIKCGZyb250aWVyGAIgASgMSAASHgoUc3RhZ2VkX2Zyb250aWVyX2ZpbGUYBiABKAlIABITCgZjdXJzb3IYAyABKAlIAYgBARIXCgpzdGF0ZV9yb290GAQgASgJSAKIAQESDQoFc3BhbnMYBSABKAhCEQoPZnJvbnRpZXJfc291cmNlQgkKB19jdXJzb3JCDQoLX3N0YXRlX3Jvb3QiMQoWQ2FwYWNpdHlSZXNlcnZlUmVxdWVzdBIXCg9hZ2dyZWdhdGVfY291bnQYASABKAQiaQoSUmVzdG9yZU1haW5SZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSDAoEaGVhZBgCIAEoCRITCgtkaWFnbm9zdGljcxgDIAEoCCJpChtSZXNvbHZlU3RhdGVQb3NpdGlvblJlcXVlc3QSDAoEcmVwbxgBIAEoCRIRCgltYWluX2hlYWQYAiABKAkSFQoNaGludGVkX2NvbW1pdBgDIAEoCRISCgpzdGF0ZV9yb290GAQgASgJIsIKCg9DdXN0b2R5UmVzcG9uc2USOAoKcGFja19kZWx0YRgKIAEoCzIiLm5vbW9zLmtlcm5lbC52MS5QYWNrRGVsdGFSZXNwb25zZUgAEjgKCmFwcGx5X3BhY2sYCyABKAsyIi5ub21vcy5rZXJuZWwudjEuQXBwbHlQYWNrUmVzcG9uc2VIABI4CgpyZXBvX3N0YXRzGAwgASgLMiIubm9tb3Mua2VybmVsLnYxLlJlcG9TdGF0c1Jlc3BvbnNlSAASPgoNaW50ZW50c19hYm92ZRgNIAEoCzIlLm5vbW9zLmtlcm5lbC52MS5JbnRlbnRzQWJvdmVSZXNwb25zZUgAEkAKDmluc3BlY3RfY2hhbmdlGA4gASgLMiYubm9tb3Mua2VybmVsLnYxLkluc3BlY3RDaGFuZ2VSZXNwb25zZUgAEk8KFmVuY29kZV9yZWZ1c2FsX3ZlcmRpY3QYDyABKAsyLS5ub21vcy5rZXJuZWwudjEuRW5jb2RlUmVmdXNhbFZlcmRpY3RSZXNwb25zZUgAElEKF2luc3BlY3RfcmVmdXNhbF92ZXJkaWN0GBAgASgLMi4ubm9tb3Mua2VybmVsLnYxLkluc3BlY3RSZWZ1c2FsVmVyZGljdFJlc3BvbnNlSAASNgoJcmVhZF9ibG9iGBEgASgLMiEubm9tb3Mua2VybmVsLnYxLlJlYWRCbG9iUmVzcG9uc2VIABI6CgtyZXNvbHZlX3JlZhgSIAEoCzIjLm5vbW9zLmtlcm5lbC52MS5SZXNvbHZlUmVmUmVzcG9uc2VIABI2CglsaXN0X3JlZnMYEyABKAsyIS5ub21vcy5rZXJuZWwudjEuTGlzdFJlZnNSZXNwb25zZUgAEjIKCXdyaXRlX3JlZhgUIAEoCzIdLm5vbW9zLmtlcm5lbC52MS5BY2tub3dsZWRnZWRIABIzCgpkZWxldGVfcmVmGBUgASgLMh0ubm9tb3Mua2VybmVsLnYxLkFja25vd2xlZGdlZEgAEkUKEXdyaXRlX21ldGFfY29tbWl0GBYgASgLMigubm9tb3Mua2VybmVsLnYxLldyaXRlTWV0YUNvbW1pdFJlc3BvbnNlSAASQwoQbGF3X2Nsb3N1cmVfaW5mbxgXIAEoCzInLm5vbW9zLmtlcm5lbC52MS5MYXdDbG9zdXJlSW5mb1Jlc3BvbnNlSAASRgoRY2hlY2twb2ludF9leHBvcnQYGCABKAsyKS5ub21vcy5rZXJuZWwudjEuQ2hlY2twb2ludEV4cG9ydFJlc3BvbnNlSAASRgoRY2hlY2twb2ludF9pbXBvcnQYGSABKAsyKS5ub21vcy5rZXJuZWwudjEuQ2hlY2twb2ludEltcG9ydFJlc3BvbnNlSAASRAoQY2FwYWNpdHlfcmVzZXJ2ZRgaIAEoCzIoLm5vbW9zLmtlcm5lbC52MS5DYXBhY2l0eVJlc2VydmVSZXNwb25zZUgAEjwKDHJlc3RvcmVfbWFpbhgbIAEoCzIkLm5vbW9zLmtlcm5lbC52MS5SZXN0b3JlTWFpblJlc3BvbnNlSAASTwoWcmVzb2x2ZV9zdGF0ZV9wb3NpdGlvbhgcIAEoCzItLm5vbW9zLmtlcm5lbC52MS5SZXNvbHZlU3RhdGVQb3NpdGlvblJlc3BvbnNlSAASSAoScmVzaWRlbnRfZm9vdHByaW50GB0gASgLMioubm9tb3Mua2VybmVsLnYxLlJlc2lkZW50Rm9vdHByaW50UmVzcG9uc2VIAEILCglvcGVyYXRpb24iMAoRUGFja0RlbHRhUmVzcG9uc2USDAoEcGFjaxgBIAEoDBINCgVieXRlcxgCIAEoBCI8ChFBcHBseVBhY2tSZXNwb25zZRIUCgxvYmplY3RfY291bnQYASABKAQSEQoJcGFja19oYXNoGAIgASgJIqcBChFSZXBvU3RhdHNSZXNwb25zZRITCgt0b3RhbF9ieXRlcxgBIAEoBBIUCgxvYmplY3RfYnl0ZXMYAiABKAQSFQoNbG9vc2Vfb2JqZWN0cxgDIAEoBBITCgtsb29zZV9ieXRlcxgEIAEoBBISCgpwYWNrX2ZpbGVzGAUgASgEEhIKCnBhY2tfYnl0ZXMYBiABKAQSEwoLaW5kZXhfYnl0ZXMYByABKAQi4gEKDEludGVudFJlY29yZBILCgNvaWQYASABKAkSEQoJaW50ZW50X2lkGAIgASgJEg4KBmRvbWFpbhgDIAEoCRIRCglkaXJlY3RpdmUYBCABKAkSEwoLY2hhbmdlX3VzZGEYBSABKAwSLgoIc2VtYW50aWMYBiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSSgoVdHJhbnNwb3J0X3JlcXVpcmVtZW50GAcgASgOMisubm9tb3Mua2VybmVsLnYxLkludGVudFRyYW5zcG9ydFJlcXVpcmVtZW50IkYKFEludGVudHNBYm92ZVJlc3BvbnNlEi4KB2ludGVudHMYASADKAsyHS5ub21vcy5rZXJuZWwudjEuSW50ZW50UmVjb3JkIkIKE05vbWluYWxDYWxsSWRlbnRpdHkSEwoLZG9tYWluX3BhdGgYASABKAkSFgoOZGlyZWN0aXZlX3BhdGgYAiABKAkiiAEKGExpZmVjeWNsZUluc3RhbGxJZGVudGl0eRIfChd0YXJnZXRfY2xvc3VyZV9pZGVudGl0eRgBIAEoCRIUCgxpbnN0YWxsZWRfYnkYAiABKAkSNQoFcGhhc2UYAyABKA4yJi5ub21vcy5rZXJuZWwudjEuTGlmZWN5Y2xlSW5zdGFsbFBoYXNlIloKHVdvcmtzcGFjZVJlc2lkZW5jeVJlcXVpcmVtZW50EhEKCXdvcmtzcGFjZRgBIAEoCRITCgtzb3VyY2VfaGVhZBgCIAEoCRIRCglmb2xkX3Jvb3QYAyABKAkitAIKFUluc3BlY3RDaGFuZ2VSZXNwb25zZRIuCghzZW1hbnRpYxgBIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdBIRCglpbnRlbnRfaWQYAiABKAkSMgoEY2FsbBgDIAEoCzIkLm5vbW9zLmtlcm5lbC52MS5Ob21pbmFsQ2FsbElkZW50aXR5EhAKCGF1dGhvcmVkGAQgASgIEkQKEWxpZmVjeWNsZV9pbnN0YWxsGAUgASgLMikubm9tb3Mua2VybmVsLnYxLkxpZmVjeWNsZUluc3RhbGxJZGVudGl0eRJMChRyZXF1aXJlZF9yZXNpZGVuY2llcxgGIAMoCzIuLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VSZXNpZGVuY3lSZXF1aXJlbWVudCJMChxSZXNvbHZlU3RhdGVQb3NpdGlvblJlc3BvbnNlEhoKDXJlc29sdmVkX2hlYWQYASABKAlIAIgBAUIQCg5fcmVzb2x2ZWRfaGVhZCI0ChxFbmNvZGVSZWZ1c2FsVmVyZGljdFJlc3BvbnNlEhQKDHZlcmRpY3RfdXNkYRgBIAEoDCJRCh1JbnNwZWN0UmVmdXNhbFZlcmRpY3RSZXNwb25zZRIwCgd2ZXJkaWN0GAEgASgLMh8ubm9tb3Mua2VybmVsLnYxLlJlZnVzYWxWZXJkaWN0Ii8KEFJlYWRCbG9iUmVzcG9uc2USDQoFZm91bmQYASABKAgSDAoEYmxvYhgCIAEoDCIuChJSZXNvbHZlUmVmUmVzcG9uc2USEAoDb2lkGAEgASgJSACIAQFCBgoEX29pZCIrCglSZWZSZWNvcmQSEQoJcmVmZXJlbmNlGAEgASgJEgsKA29pZBgCIAEoCSI8ChBMaXN0UmVmc1Jlc3BvbnNlEigKBHJlZnMYASADKAsyGi5ub21vcy5rZXJuZWwudjEuUmVmUmVjb3JkIg4KDEFja25vd2xlZGdlZCImChdXcml0ZU1ldGFDb21taXRSZXNwb25zZRILCgNvaWQYASABKAkigwEKFkxhd0Nsb3N1cmVJbmZvUmVzcG9uc2USEAoIaWRlbnRpdHkYASABKAkSGQoRcm9vdF9sb2dpY2FsX3BhdGgYAiABKAkSEwoLYXNzZXRfY291bnQYAyABKAQSEgoKcHJpbV9jb3VudBgEIAEoBBITCgtkb21haW5fa2V5cxgFIAMoCSLvAgoYQ2hlY2twb2ludEV4cG9ydFJlc3BvbnNlEg0KBWVtcHR5GAEgASgIEhMKBmN1cnNvchgCIAEoCUgAiAEBEhAKCGZyb250aWVyGAMgASgMEhcKCnN0YXRlX3Jvb3QYBCABKAlIAYgBARISCgpzdGF0ZV90cmVlGAUgASgIEg4KBnBpbm5lZBgGIAEoCBIbChNyZWFkX2luZGV4X3NuYXBzaG90GAcgASgIEiMKG3JlYWRfaW5kZXhfc25hcHNob3RfcGVuZGluZxgIIAEoCBIkChdyZWFkX2luZGV4X3NxbGl0ZV9ieXRlcxgJIAEoBEgCiAEBEiUKGHJlYWRfaW5kZXhfY3VzdG9keV9ieXRlcxgKIAEoBEgDiAEBQgkKB19jdXJzb3JCDQoLX3N0YXRlX3Jvb3RCGgoYX3JlYWRfaW5kZXhfc3FsaXRlX2J5dGVzQhsKGV9yZWFkX2luZGV4X2N1c3RvZHlfYnl0ZXMingIKGENoZWNrcG9pbnRJbXBvcnRSZXNwb25zZRIQCghyZXN0b3JlZBgBIAEoCBITCgZyZWFzb24YAiABKAlIAIgBARIXCg9mcm9udGllcl9zZWVkZWQYAyABKAgSJQodZnJvbnRpZXJfdmVyaWZpY2F0aW9uX3BlbmRpbmcYBCABKAgSFwoPYWdncmVnYXRlX2NvdW50GAUgASgEEisKBXNwYW5zGAYgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0EhMKBmN1cnNvchgHIAEoCUgBiAEBEhEKCXJlYWRfb25seRgIIAEoCBIXCg9sYXp5X3JlYWRfaW5kZXgYCSABKAhCCQoHX3JlYXNvbkIJCgdfY3Vyc29yIkoKF0NhcGFjaXR5UmVzZXJ2ZVJlc3BvbnNlEhcKD2FnZ3JlZ2F0ZV9jb3VudBgBIAEoBBIWCg5yZXNlcnZlZF9ieXRlcxgCIAEoBCL5AgoQUmVzdG9yZU1haW5TcGFucxIQCgh0b3RhbF91cxgBIAEoBBIaChJsaXZlX3JlZl9sb29rdXBfdXMYAiABKAQSGAoQdGFyZ2V0X2RlY29kZV91cxgDIAEoBBIkChxjdXN0b2R5X2NvbXBsZXRlbmVzc19yZWFkX3VzGAQgASgEEhkKEXF1YXJhbnRpbmVfcmVmX3VzGAUgASgEEiUKHWNoYWluX3NpZ25hdHVyZV9sYXdfcmVwbGF5X3VzGAYgASgEEhkKEXZlcmRpY3RfZGVjb2RlX3VzGAcgASgEEiMKG3Byb21vdGVfYW5kX2NsZWFudXBfcmVmc191cxgIIAEoBBIbChNmcm9udGllcl9yZWJ1aWxkX3VzGAkgASgEEhkKEWZyb250aWVyX3N0b3JlX3VzGAogASgEEj0KDHZlcmlmaWNhdGlvbhgLIAEoCzInLm5vbW9zLmtlcm5lbC52MS5WZXJpZnlDaGFpbkRpYWdub3N0aWNzIqQBChNSZXN0b3JlTWFpblJlc3BvbnNlEgwKBGhlYWQYASABKAkSEAoIdmVyaWZpZWQYAiABKAgSDAoEd2FsaxgDIAEoCRIwCgVzcGFucxgEIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5SZXN0b3JlTWFpblNwYW5zEi0KB3ZlcmRpY3QYBSABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QimwIKCk5vbW9zVmFsdWUSJQoEbnVsbBgBIAEoCzIVLm5vbW9zLmtlcm5lbC52MS5OdWxsSAASEQoHYm9vbGVhbhgCIAEoCEgAEhgKDnNpZ25lZF9pbnRlZ2VyGAMgASgSSAASGgoQdW5zaWduZWRfaW50ZWdlchgEIAEoBEgAEhgKDmZsb2F0aW5nX3BvaW50GAUgASgBSAASDgoEdGV4dBgGIAEoCUgAEg8KBWJ5dGVzGAcgASgMSAASKgoEbGlzdBgIIAEoCzIaLm5vbW9zLmtlcm5lbC52MS5Ob21vc0xpc3RIABIuCgZvYmplY3QYCSABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RIAEIGCgRraW5kIgYKBE51bGwiOAoJTm9tb3NMaXN0EisKBnZhbHVlcxgBIAMoCzIbLm5vbW9zLmtlcm5lbC52MS5Ob21vc1ZhbHVlIpMBCgtOb21vc1N0cnVjdBI4CgZmaWVsZHMYASADKAsyKC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QuRmllbGRzRW50cnkaSgoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgJEioKBXZhbHVlGAIgASgLMhsubm9tb3Mua2VybmVsLnYxLk5vbW9zVmFsdWU6AjgBKukSChFLZXJuZWxSZWZ1c2FsQ29kZRIjCh9LRVJORUxfUkVGVVNBTF9DT0RFX1VOU1BFQ0lGSUVEEAASJQohS0VSTkVMX1JFRlVTQUxfQ09ERV9CQURfU0lHTkFUVVJFEAESJAogS0VSTkVMX1JFRlVTQUxfQ09ERV9VTkFVVEhPUklaRUQQAhInCiNLRVJORUxfUkVGVVNBTF9DT0RFX1BPTElDWV9ESVNBQkxFRBADEioKJktFUk5FTF9SRUZVU0FMX0NPREVfVU5DRVJUSUZJRURfUE9MSUNZEAQSIwofS0VSTkVMX1JFRlVTQUxfQ09ERV9SRUZFUkVOVElBTBAFEi8KK0tFUk5FTF9SRUZVU0FMX0NPREVfUE9JTlRfU1RBVEVfVU5BVkFJTEFCTEUQBhIkCiBLRVJORUxfUkVGVVNBTF9DT0RFX0NBUF9FWENFRURFRBAHEi0KKUtFUk5FTF9SRUZVU0FMX0NPREVfQ0FQX0NPVU5UX1VOQVZBSUxBQkxFEAgSKQolS0VSTkVMX1JFRlVTQUxfQ09ERV9FVklERU5DRV9VTkJBQ0tFRBAJEiYKIktFUk5FTF9SRUZVU0FMX0NPREVfT1JQSEFOX1JFQ0VJUFQQChI2CjJLRVJORUxfUkVGVVNBTF9DT0RFX1JFQ0VJUFRfT05fVEVSTUlOQUxfT0JMSUdBVElPThALEiIKHktFUk5FTF9SRUZVU0FMX0NPREVfTk9UX01JTlRFRBAMEigKJEtFUk5FTF9SRUZVU0FMX0NPREVfRE9NQUlOX0xJRkVDWUNMRRANEikKJUtFUk5FTF9SRUZVU0FMX0NPREVfVFlQRV9UQUdfTUlTTUFUQ0gQDhIsCihLRVJORUxfUkVGVVNBTF9DT0RFX1JFVElSRURfUkVBRF9TVVJGQUNFEA8SMAosS0VSTkVMX1JFRlVTQUxfQ09ERV9DUk9TU19XT1JLU1BBQ0VfREVDTElORUQQEBIrCidLRVJORUxfUkVGVVNBTF9DT0RFX0FHR1JFR0FURV9JTlZBUklBTlQQERIrCidLRVJORUxfUkVGVVNBTF9DT0RFX1dPUktTUEFDRV9JTlZBUklBTlQQEhIuCipLRVJORUxfUkVGVVNBTF9DT0RFX0NBUFRVUkVEX1JFQURfQ09ORkxJQ1QQExIyCi5LRVJORUxfUkVGVVNBTF9DT0RFX0NPTkZMSUNUX1NOQVBTSE9UX1JFUVVJUkVEEBQSNAowS0VSTkVMX1JFRlVTQUxfQ09ERV9DT05GTElDVF9TTkFQU0hPVF9VTkRFQ0xBUkVEEBUSMQotS0VSTkVMX1JFRlVTQUxfQ09ERV9DT05GTElDVF9TTkFQU0hPVF9JTlZBTElEEBYSLworS0VSTkVMX1JFRlVTQUxfQ09ERV9DT05GTElDVF9TTkFQU0hPVF9TVEFMRRAXEjAKLEtFUk5FTF9SRUZVU0FMX0NPREVfQ0FQVFVSRURfUkVBRF9VTkRFQ0xBUkVEEBgSLQopS0VSTkVMX1JFRlVTQUxfQ09ERV9DQVBUVVJFRF9SRUFEX1BSSVZBVEUQGRIwCixLRVJORUxfUkVGVVNBTF9DT0RFX0FUVEVTVEVEX1JFQURfVU5ERUNMQVJFRBAaEjMKL0tFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNURURfUkVBRF9VTlRSVVNURURfS0VZEBsSNgoyS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RFRF9SRUFEX1VOVFJVU1RFRF9TT1VSQ0UQHBIsCihLRVJORUxfUkVGVVNBTF9DT0RFX0FUVEVTVEVEX1JFQURfRk9SR0VEEB0SKwonS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RFRF9SRUFEX1NUQUxFEB4SLgoqS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RFRF9SRUFEX09WRVJTSVpFEB8SNwozS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RFRF9SRUFEX0RJU0hPTk9SRURfU09VUkNFECASNQoxS0VSTkVMX1JFRlVTQUxfQ09ERV9FUVVJVk9DQVRJT05fRVZJREVOQ0VfSU5WQUxJRBAhEjMKL0tFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNUQVRJT05fUkVDRUlQVF9JTlZBTElEECISKwonS0VSTkVMX1JFRlVTQUxfQ09ERV9LRVlfUk9TVEVSX01JU01BVENIECMSLworS0VSTkVMX1JFRlVTQUxfQ09ERV9LRVlfRVBPQ0hfTk9UX01PTk9UT05JQxAkEikKJUtFUk5FTF9SRUZVU0FMX0NPREVfV1JJVEVfRVBPQ0hfU1RBTEUQJRItCilLRVJORUxfUkVGVVNBTF9DT0RFX0VOVkVMT1BFX1NJRF9NSVNNQVRDSBAmEjIKLktFUk5FTF9SRUZVU0FMX0NPREVfUkVWT0tFRF9NRU1CRVJfUkVTVVJSRUNURUQQJxIoCiRLRVJORUxfUkVGVVNBTF9DT0RFX0ZPUkdFRF9QUklOQ0lQQUwQKBIoCiRLRVJORUxfUkVGVVNBTF9DT0RFX09XTkVEX0tFWV9BTkNIT1IQKRImCiJLRVJORUxfUkVGVVNBTF9DT0RFX09XTkVEX1JFQ09WRVJZECoSLAooS0VSTkVMX1JFRlVTQUxfQ09ERV9TVVJGQUNFRF9CQVNJU19BSEVBRBArEjIKLktFUk5FTF9SRUZVU0FMX0NPREVfU0lHTkVSX0VQT0NIX09VVF9PRl9XSU5ET1cQLBImCiJLRVJORUxfUkVGVVNBTF9DT0RFX0VWT0xWRV9SRUZVU0VEEC0SKwonS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RBVElPTl9JTlZBTElEEC4SLQopS0VSTkVMX1JFRlVTQUxfQ09ERV9QQVJFTlRfRElEX05PVF9BVFRFU1QQLxIpCiVLRVJORUxfUkVGVVNBTF9DT0RFX0NFUlRfQ0hBSU5fQlJPS0VOEDASKgomS0VSTkVMX1JFRlVTQUxfQ09ERV9OT1RfUk9PVEVEX0FUX1JPT1QQMRIqCiZLRVJORUxfUkVGVVNBTF9DT0RFX0RFTEVHQVRJT05fSU5WQUxJRBAyEiUKIUtFUk5FTF9SRUZVU0FMX0NPREVfUExBTl9SRUpFQ1RFRBAzKooBCg9WZXJpZnlDaGFpbldhbGsSIQodVkVSSUZZX0NIQUlOX1dBTEtfVU5TUEVDSUZJRUQQABIaChZWRVJJRllfQ0hBSU5fV0FMS19GVUxMEAESHAoYVkVSSUZZX0NIQUlOX1dBTEtfU1VGRklYEAISGgoWVkVSSUZZX0NIQUlOX1dBTEtfTUVNTxADKoUMCg5RdWVyeU9wZXJhdGlvbhIfChtRVUVSWV9PUEVSQVRJT05fVU5TUEVDSUZJRUQQABIcChhRVUVSWV9PUEVSQVRJT05fRVhUUkVNVU0QARIlCiFRVUVSWV9PUEVSQVRJT05fUEVORElOR19DT05GTElDVFMQAhIsCihRVUVSWV9PUEVSQVRJT05fUEVORElOR19DT05GTElDVF9TVU1NQVJZEAMSIAocUVVFUllfT1BFUkFUSU9OX1JFQURfUE9TVFVSRRAEEh8KG1FVRVJZX09QRVJBVElPTl9DVVJSRU5UX0xBVxAFEiMKH1FVRVJZX09QRVJBVElPTl9JTlRFUkZBQ0VfT0ZGRVIQBhInCiNRVUVSWV9PUEVSQVRJT05fUkVMQVRJT05fR0FURV9PRkZFUhAHEh0KGVFVRVJZX09QRVJBVElPTl9TQ0VORV9MQVcQCBIhCh1RVUVSWV9PUEVSQVRJT05fSU5TVEFMTEVEX0xBVxAJEhwKGFFVRVJZX09QRVJBVElPTl9ERVNDUklCRRAKEiAKHFFVRVJZX09QRVJBVElPTl9LRVJORUxfU1RBTVAQCxIjCh9RVUVSWV9PUEVSQVRJT05fREVWRUxPUEVSX1NQQU5TEAwSKQolUVVFUllfT1BFUkFUSU9OX0RFQ0xBUkVEX0NBUEFCSUxJVElFUxANEh0KGVFVRVJZX09QRVJBVElPTl9SRUFESU5FU1MQDhIkCiBRVUVSWV9PUEVSQVRJT05fUFJPSkVDVElPTl9TVEFUUxAPEiUKIVFVRVJZX09QRVJBVElPTl9NRU1PUllfRFJPUF9QUk9CRRAQEhgKFFFVRVJZX09QRVJBVElPTl9XQVJNEBESGwoXUVVFUllfT1BFUkFUSU9OX1JFRlJFU0gQEhIgChxRVUVSWV9PUEVSQVRJT05fVkVSSUZZX0NIQUlOEBMSJQohUVVFUllfT1BFUkFUSU9OX0hJU1RPUllfUFJFRkxJR0hUEBQSGQoVUVVFUllfT1BFUkFUSU9OX1JPVVRFEBUSGAoUUVVFUllfT1BFUkFUSU9OX01JTlQQFhIhCh1RVUVSWV9PUEVSQVRJT05fQ1JZUFRPX0tFWUdFThAXEiUKIVFVRVJZX09QRVJBVElPTl9DUllQVE9fU0VBTF9GSUVMRBAYEiwKKFFVRVJZX09QRVJBVElPTl9DUllQVE9fQkxJTkRfSU5ERVhfVE9LRU4QGRIqCiZRVUVSWV9PUEVSQVRJT05fQ1JZUFRPX09XTkVEX1NDT1BFX0tFWRAaEi8KK1FVRVJZX09QRVJBVElPTl9DUllQVE9fT1dORURfREVWSUNFX1JFUVVFU1QQGxIxCi1RVUVSWV9PUEVSQVRJT05fQ1JZUFRPX09XTkVEX1BSRVBBUkVfQVBQUk9WQUwQHBIxCi1RVUVSWV9PUEVSQVRJT05fQ1JZUFRPX09XTkVEX1BSRVBBUkVfUkVDT1ZFUlkQHRIjCh9RVUVSWV9PUEVSQVRJT05fQ1JZUFRPX1dSQVBfS0VZEB4SJQohUVVFUllfT1BFUkFUSU9OX0NSWVBUT19VTldSQVBfS0VZEB8SIQodUVVFUllfT1BFUkFUSU9OX0FVVEhPUl9LRVlHRU4QIBIkCiBRVUVSWV9PUEVSQVRJT05fQVRURVNUQVRJT05fU0lHThAhEiAKHFFVRVJZX09QRVJBVElPTl9SRUNFSVBUX1BBVEgQIhIdChlRVUVSWV9PUEVSQVRJT05fQ0VSVF9TSUdOECMSJQohUVVFUllfT1BFUkFUSU9OX0JJUlRIX1RSVVNUX1NUQVRFECQSIQodUVVFUllfT1BFUkFUSU9OX0VSQV9DRVJUX1NJR04QJRIoCiRRVUVSWV9PUEVSQVRJT05fREVMRUdBVElPTl9DRVJUX1NJR04QJhIpCiVRVUVSWV9PUEVSQVRJT05fQ0FOT05JQ0FMSVpFX0ZST05USUVSECcSKwonUVVFUllfT1BFUkFUSU9OX0NBTk9OSUNBTElaRV9QUk9KRUNUSU9OECgq0gIKFVJlc2lkZW50Q29tcG9uZW50S2luZBInCiNSRVNJREVOVF9DT01QT05FTlRfS0lORF9VTlNQRUNJRklFRBAAEiYKIlJFU0lERU5UX0NPTVBPTkVOVF9LSU5EX0ZPTERfU1RBVEUQARItCilSRVNJREVOVF9DT01QT05FTlRfS0lORF9SRUFEX01PREVMX1NRTElURRACEi4KKlJFU0lERU5UX0NPTVBPTkVOVF9LSU5EX1JFQURfTU9ERUxfSU5ERVhFUxADEi0KKVJFU0lERU5UX0NPTVBPTkVOVF9LSU5EX1NIQVJFRF9BVFRSSUJVVEVEEAQSLAooUkVTSURFTlRfQ09NUE9ORU5UX0tJTkRfV09SS1NQQUNFX0NBQ0hFUxAFEiwKKFJFU0lERU5UX0NPTVBPTkVOVF9LSU5EX0dJVF9PQkpFQ1RfQ0FDSEUQBipsChNLZXJuZWxMYXdDYXBhYmlsaXR5EiUKIUtFUk5FTF9MQVdfQ0FQQUJJTElUWV9VTlNQRUNJRklFRBAAEi4KKktFUk5FTF9MQVdfQ0FQQUJJTElUWV9TVEFHRV9aRVJPX0JPT1RTVFJBUBABKqgBChpJbnRlbnRUcmFuc3BvcnRSZXF1aXJlbWVudBIsCihJTlRFTlRfVFJBTlNQT1JUX1JFUVVJUkVNRU5UX1VOU1BFQ0lGSUVEEAASLgoqSU5URU5UX1RSQU5TUE9SVF9SRVFVSVJFTUVOVF9TRUFMRURfQ0hBTkdFEAESLAooSU5URU5UX1RSQU5TUE9SVF9SRVFVSVJFTUVOVF9DT01NSVRfVFJFRRACKokBChVMaWZlY3ljbGVJbnN0YWxsUGhhc2USJwojTElGRUNZQ0xFX0lOU1RBTExfUEhBU0VfVU5TUEVDSUZJRUQQABIiCh5MSUZFQ1lDTEVfSU5TVEFMTF9QSEFTRV9BQ1RJVkUQARIjCh9MSUZFQ1lDTEVfSU5TVEFMTF9QSEFTRV9QRU5ESU5HEAIyWQoSTm9tb3NLZXJuZWxTZXJ2aWNlEkMKBENhbGwSHC5ub21vcy5rZXJuZWwudjEuQ2FsbFJlcXVlc3QaHS5ub21vcy5rZXJuZWwudjEuQ2FsbFJlc3BvbnNlYgZwcm90bzM");
6294
6314
  var CallRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 0);
6295
6315
  var CallResponseSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 1);
6296
6316
  var WorkspaceTargetSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 21);
@@ -6319,25 +6339,25 @@ var SyncRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel,
6319
6339
  var TestRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 57);
6320
6340
  var SetTestRootRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 58);
6321
6341
  var CustodyRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 60);
6322
- var PackDeltaRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 61);
6323
- var ApplyPackRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 62);
6324
- var RepoStatsRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 63);
6325
- var IntentsAboveRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 64);
6326
- var WriteRefRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 72);
6327
- var DeleteRefRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 73);
6328
- var LawClosureInfoRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 76);
6329
- var CheckpointExportRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 77);
6330
- var CheckpointImportRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 78);
6331
- var RestoreMainRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 80);
6332
- var NomosValueSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 107);
6333
- var NomosStructSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 110);
6342
+ var PackDeltaRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 65);
6343
+ var ApplyPackRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 66);
6344
+ var RepoStatsRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 67);
6345
+ var IntentsAboveRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 68);
6346
+ var WriteRefRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 76);
6347
+ var DeleteRefRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 77);
6348
+ var LawClosureInfoRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 80);
6349
+ var CheckpointExportRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 81);
6350
+ var CheckpointImportRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 82);
6351
+ var RestoreMainRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 84);
6352
+ var NomosValueSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 111);
6353
+ var NomosStructSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 114);
6334
6354
  var VerifyChainWalkSchema = /* @__PURE__ */ enumDesc(file_nomos_kernel_v1_kernel, 1);
6335
6355
  var VerifyChainWalk = /* @__PURE__ */ tsEnum(VerifyChainWalkSchema);
6336
6356
  var QueryOperationSchema = /* @__PURE__ */ enumDesc(file_nomos_kernel_v1_kernel, 2);
6337
6357
  var QueryOperation = /* @__PURE__ */ tsEnum(QueryOperationSchema);
6338
- var KernelLawCapabilitySchema = /* @__PURE__ */ enumDesc(file_nomos_kernel_v1_kernel, 3);
6358
+ var KernelLawCapabilitySchema = /* @__PURE__ */ enumDesc(file_nomos_kernel_v1_kernel, 4);
6339
6359
  var KernelLawCapability = /* @__PURE__ */ tsEnum(KernelLawCapabilitySchema);
6340
- var IntentTransportRequirementSchema = /* @__PURE__ */ enumDesc(file_nomos_kernel_v1_kernel, 4);
6360
+ var IntentTransportRequirementSchema = /* @__PURE__ */ enumDesc(file_nomos_kernel_v1_kernel, 5);
6341
6361
  var IntentTransportRequirement = /* @__PURE__ */ tsEnum(IntentTransportRequirementSchema);
6342
6362
 
6343
6363
  // src/kernel_provider_wasm.ts
@@ -6789,7 +6809,7 @@ function providerOperation(mode, rawFields, workBytes) {
6789
6809
  } })
6790
6810
  };
6791
6811
  let custody;
6792
- if (mode === "restore_main") custody = { case: "restoreMain", value: create(RestoreMainRequestSchema, { target, head: String(fields.head ?? "") }) };
6812
+ if (mode === "restore_main") custody = { case: "restoreMain", value: create(RestoreMainRequestSchema, { target, head: String(fields.head ?? ""), diagnostics: fields.diagnostics === true }) };
6793
6813
  else if (mode === "repo_stats") custody = { case: "repoStats", value: create(RepoStatsRequestSchema, { repo: String(fields.repoArg ?? "") }) };
6794
6814
  else if (mode === "apply_pack") custody = {
6795
6815
  case: "applyPack",
@@ -7030,6 +7050,7 @@ function nmsInternalParseSnapshot(bytes) {
7030
7050
  const o = JSON.parse(dec2.decode(bytes));
7031
7051
  if (o && o.v === 2 && typeof o.tree === "string") {
7032
7052
  return {
7053
+ workspace: typeof o.workspace === "string" && o.workspace ? o.workspace : null,
7033
7054
  treeBytes: nmsInternalSnapshotFromBase64(o.tree),
7034
7055
  ckpt: o.ckpt ?? null,
7035
7056
  frontier: o.frontier ?? null,
@@ -7038,15 +7059,35 @@ function nmsInternalParseSnapshot(bytes) {
7038
7059
  syncedBase: o.syncedBase ?? null
7039
7060
  };
7040
7061
  }
7041
- } catch {
7062
+ } catch (cause) {
7063
+ const first = dec2.decode(bytes.subarray(0, Math.min(bytes.length, 32))).trimStart()[0];
7064
+ if (first === "{") {
7065
+ const message = `snapshot envelope is corrupt: ${String(cause?.message || cause)}`;
7066
+ const error = new Error(message);
7067
+ error.code = "nomos.custody.snapshot_corrupt";
7068
+ error.errorInfo = {
7069
+ code: error.code,
7070
+ message,
7071
+ component: "nomos.custody",
7072
+ operation: "connect",
7073
+ attributes: {
7074
+ "nomos.custody.source": "localSnapshot",
7075
+ "nomos.custody.phase": "decode",
7076
+ "nomos.custody.recoverable": true,
7077
+ "nomos.custody.recommended_action": "quarantineLocalSnapshotAndReclone"
7078
+ }
7079
+ };
7080
+ throw error;
7081
+ }
7042
7082
  }
7043
- return { treeBytes: bytes, ckpt: null, frontier: null, cursor: null, stateRoot: null, syncedBase: null };
7083
+ return { workspace: null, treeBytes: bytes, ckpt: null, frontier: null, cursor: null, stateRoot: null, syncedBase: null };
7044
7084
  }
7045
- function nmsInternalBuildSnapshot(treeBytes, ckpt, syncedBase) {
7085
+ function nmsInternalBuildSnapshot(treeBytes, ckpt, syncedBase, workspace = null) {
7046
7086
  const hasCheckpoint = !!(ckpt && (ckpt.blob || ckpt.frontier || ckpt.cursor));
7047
- if (!hasCheckpoint && !syncedBase) return treeBytes;
7087
+ if (!hasCheckpoint && !syncedBase && !workspace) return treeBytes;
7048
7088
  return enc2.encode(JSON.stringify({
7049
7089
  v: 2,
7090
+ workspace: workspace || null,
7050
7091
  tree: nmsInternalSnapshotToBase64(treeBytes),
7051
7092
  ckpt: ckpt && ckpt.blob ? ckpt.blob : null,
7052
7093
  frontier: ckpt ? ckpt.frontier ?? null : null,
@@ -7202,6 +7243,24 @@ function createWasmEnginePlane({ span } = {}) {
7202
7243
  repoArg = opts.repoArg || `/work/ws/${workspace}`;
7203
7244
  gitdir = `${repoArg}/nomos.git`;
7204
7245
  const snap = opts.restoreSnapshot ? nmsInternalParseSnapshot(opts.restoreSnapshot) : null;
7246
+ if (snap?.workspace && snap.workspace !== workspace) {
7247
+ const error = new Error(`local custody belongs to workspace '${snap.workspace}', not '${workspace}'`);
7248
+ error.code = "nomos.custody.snapshot_workspace_mismatch";
7249
+ error.errorInfo = {
7250
+ code: error.code,
7251
+ message: error.message,
7252
+ component: "nomos.custody",
7253
+ operation: "connect",
7254
+ workspace,
7255
+ attributes: {
7256
+ "nomos.custody.source": "localSnapshot",
7257
+ "nomos.custody.recoverable": true,
7258
+ "nomos.custody.recommended_action": "quarantineLocalSnapshotAndReclone",
7259
+ "nomos.custody.snapshot_workspace": snap.workspace
7260
+ }
7261
+ };
7262
+ throw error;
7263
+ }
7205
7264
  if (snap) {
7206
7265
  _ckptBlobStr = snap.ckpt;
7207
7266
  _ckptFrontierStr = snap.frontier;
@@ -7365,7 +7424,8 @@ function createWasmEnginePlane({ span } = {}) {
7365
7424
  return nmsInternalBuildSnapshot(
7366
7425
  treeBytes,
7367
7426
  ckpt && (ckpt.blob || ckpt.frontier || ckpt.cursor) ? ckpt : null,
7368
- opts.syncedBase || null
7427
+ opts.syncedBase || null,
7428
+ workspace
7369
7429
  );
7370
7430
  }
7371
7431
  };
@@ -8096,7 +8156,7 @@ function createGovernanceOffers(ctx) {
8096
8156
  * `revoked: true` means the subject's leaf was flipped `status:revoked` (remove-wins — a lawful
8097
8157
  * re-enroll of the SAME key is refused; mint + enroll a new device key instead).
8098
8158
  */
8099
- parentSignerEnrollment: async ({ parent, principal, keyHash, publicKey, authToken } = {}) => {
8159
+ parentSignerEnrollment: async ({ parent, principal, keyHash, publicKey, authToken, remote } = {}) => {
8100
8160
  if (!parent || typeof parent !== "string") throw new Error("parentSignerEnrollment requires `parent` (the workspace whose chain holds the signer tuple)");
8101
8161
  if (!principal || typeof principal !== "string") throw new Error("parentSignerEnrollment requires `principal` (the auth-provider uid)");
8102
8162
  const p = canonicalPrincipal(principal);
@@ -8106,7 +8166,7 @@ function createGovernanceOffers(ctx) {
8106
8166
  }
8107
8167
  const object = signerObjectOf(p);
8108
8168
  let rows;
8109
- if (parent === workspace) {
8169
+ if (parent === workspace && !remote) {
8110
8170
  rows = JSON.parse(call("query", { queryBytes: qBytes2({ kind: "query", queryId: "relationTuplesByObject", paramsJson: JSON.stringify({ object }) }) })) || [];
8111
8171
  } else {
8112
8172
  const headers = authToken ? { Authorization: `Bearer ${authToken}`, "x-nomos-auth": authToken } : authHeaders;
@@ -8635,7 +8695,7 @@ function birthOutcomeFailure(birthOutcomes) {
8635
8695
  err.birthOutcomes = birthOutcomes;
8636
8696
  return err;
8637
8697
  }
8638
- async function connectSingle({ cloud, workspace, clientId, authToken, restoreFrom, onSpan, authorSecret, principal, allowUnborn = false, salvageOnly = false, recover = false, mountInPlace = false, __injectCheckpoint, kernelProvider, fetchImpl, historicSnapshots, onCustodyBreak, watchRebind, openWorkspaceInPlane, __knownKernelCapabilities, __testKRootPublic, __testRootSecret }) {
8698
+ async function connectSingle({ cloud, workspace, clientId, authToken, restoreFrom, onSpan, authorSecret, principal, allowUnborn = false, salvageOnly = false, recover = false, mountInPlace = false, __injectCheckpoint, kernelProvider, fetchImpl, historicSnapshots, onCustodyBreak, onLocalWorkRejected, watchRebind, openWorkspaceInPlane, openSourceInPlane, __knownKernelCapabilities, __testKRootPublic, __testRootSecret }) {
8639
8699
  if (salvageOnly) allowUnborn = true;
8640
8700
  if (!cloud || !workspace) throw new Error("connect({ cloud, workspace }) required");
8641
8701
  const _fetch = typeof fetchImpl === "function" ? fetchImpl : globalThis.fetch;
@@ -8760,13 +8820,44 @@ ${String(commit).toLowerCase()}`;
8760
8820
  const addReadRemote = async () => {
8761
8821
  };
8762
8822
  const applyPack = (packB64, head) => provider.applyPack(packB64, head);
8763
- await provider.boot({ base, workspace, branch: BRANCH, repoArg, restoreSnapshot: restoreFrom || null, fetchImpl: _fetch, authHeaders });
8823
+ try {
8824
+ await provider.boot({ base, workspace, branch: BRANCH, repoArg, restoreSnapshot: restoreFrom || null, fetchImpl: _fetch, authHeaders });
8825
+ } catch (error) {
8826
+ throw error;
8827
+ }
8764
8828
  if (__testKRootPublic) {
8765
8829
  provider.call("set_test_k_root", { kRootPublicB64: __testKRootPublic });
8766
8830
  }
8767
8831
  const resolveBranchHead = () => provider.resolveBranchHead();
8768
8832
  const mountBranchHead = (head, why) => provider.mountBranchHead(head, why);
8769
8833
  const writeSkeleton = () => provider.writeSkeleton();
8834
+ const residencyRequiredWorkspace = (error) => {
8835
+ const text = String(error?.message ?? error ?? "");
8836
+ if (!text.includes("foreign-read-not-ready")) return null;
8837
+ const match = /source workspace '([^']+)' is not resident/.exec(text);
8838
+ const named = match?.[1]?.trim();
8839
+ return named ? named : null;
8840
+ };
8841
+ const mountWithResidency = async (head, why) => {
8842
+ const satisfied = /* @__PURE__ */ new Set();
8843
+ for (; ; ) {
8844
+ try {
8845
+ return await mountBranchHead(head, why);
8846
+ } catch (error) {
8847
+ const required = residencyRequiredWorkspace(error);
8848
+ if (required === null || required === workspace || satisfied.has(required) || satisfied.size >= 8 || typeof (openSourceInPlane ?? openWorkspaceInPlane) !== "function") {
8849
+ throw error;
8850
+ }
8851
+ satisfied.add(required);
8852
+ const _r = span("receive", `boot: mount required source '${required}'`, "cfetch");
8853
+ try {
8854
+ await (openSourceInPlane ?? openWorkspaceInPlane)(required, { allowUnborn: true });
8855
+ } finally {
8856
+ _r.end();
8857
+ }
8858
+ }
8859
+ }
8860
+ };
8770
8861
  const _restoreCkpt = provider.restoreCheckpoint;
8771
8862
  let ckptBlobStr = _restoreCkpt?.blob ?? null, ckptFrontierStr = _restoreCkpt?.frontier ?? null;
8772
8863
  const ckptStagedFrontierFile = _restoreCkpt?.stagedFrontierFile ?? null;
@@ -8797,6 +8888,47 @@ ${String(commit).toLowerCase()}`;
8797
8888
  }
8798
8889
  };
8799
8890
  const onCustodyBreakOpt = typeof onCustodyBreak === "function" ? onCustodyBreak : null;
8891
+ let localWorkRejectedHook = typeof onLocalWorkRejected === "function" ? onLocalWorkRejected : null;
8892
+ const localWorkRejectedListeners = /* @__PURE__ */ new Set();
8893
+ const refusalIsRetryable = (error) => {
8894
+ try {
8895
+ const d = authzDiagnosisFromRefusal(String(error ?? ""));
8896
+ return d?.code === "nomos.authz.signer_enrollment_missing";
8897
+ } catch {
8898
+ return false;
8899
+ }
8900
+ };
8901
+ const emitLocalWorkRejected = (source, refused, resetTo) => {
8902
+ if (!refused.length) return;
8903
+ const items = refused.map((r) => ({
8904
+ intentId: typeof r.intentId === "string" ? r.intentId : null,
8905
+ oid: typeof r.oid === "string" ? r.oid : null,
8906
+ domain: typeof r.domain === "string" ? r.domain : null,
8907
+ directiveId: typeof r.directiveId === "string" ? r.directiveId : null,
8908
+ error: String(r.error ?? "the law refused this offer").slice(0, 600),
8909
+ retryable: refusalIsRetryable(r.error)
8910
+ }));
8911
+ const event = {
8912
+ workspace,
8913
+ refused: items,
8914
+ parked: true,
8915
+ resetTo,
8916
+ retryable: items.every((i) => i.retryable),
8917
+ source
8918
+ };
8919
+ if (localWorkRejectedHook) {
8920
+ try {
8921
+ localWorkRejectedHook(event);
8922
+ } catch {
8923
+ }
8924
+ }
8925
+ for (const l of [...localWorkRejectedListeners]) {
8926
+ try {
8927
+ l(event);
8928
+ } catch {
8929
+ }
8930
+ }
8931
+ };
8800
8932
  function captureIncarnation(j) {
8801
8933
  const inc = j && typeof j.incarnation === "string" && OID40_RE.test(j.incarnation) ? j.incarnation : null;
8802
8934
  if (inc !== null) remoteIncarnation = inc;
@@ -8866,7 +8998,7 @@ ${String(commit).toLowerCase()}`;
8866
8998
  if (!allowUnborn) throw new Error(`workspace '${workspace}' has no ledger main \u2014 create it first (POST /v2/workspaces/${workspace})`);
8867
8999
  } else {
8868
9000
  await fetchAndApplyPack("", "boot: fetch full pack");
8869
- const mounted = await mountBranchHead(remoteMain, "boot restore");
9001
+ const mounted = await mountWithResidency(remoteMain, "boot restore");
8870
9002
  if (mounted && typeof mounted === "object" && mounted.kernelSpans) {
8871
9003
  bootKernelSpans = mounted.kernelSpans;
8872
9004
  }
@@ -9383,6 +9515,7 @@ ${String(commit).toLowerCase()}`;
9383
9515
  }
9384
9516
  }
9385
9517
  }
9518
+ if (deadLettered.length) emitLocalWorkRejected("sync", deadLettered.map((d) => ({ intentId: d.id, error: d.error })), remoteHead);
9386
9519
  invalidateInstalledLawMetadata();
9387
9520
  nudgeWatches();
9388
9521
  return {
@@ -9991,6 +10124,9 @@ ${String(commit).toLowerCase()}`;
9991
10124
  _author.end({
9992
10125
  domain,
9993
10126
  directiveId,
10127
+ // Durability is acknowledged per authored workspace/head. The runner already supplies the session;
10128
+ // carry the exact sealed head so a sibling save can never acknowledge this write accidentally.
10129
+ head: typeof res.head === "string" ? res.head : "",
9994
10130
  kernelSpans: res.kernelSpans,
9995
10131
  // Birth is an offer-effect, so its exhaustive result belongs on the offer flame span too. This is
9996
10132
  // deliberately small structured evidence (workspace/status/head), not custody bytes: when a parent
@@ -11695,6 +11831,22 @@ ${String(commit).toLowerCase()}`;
11695
11831
  if (typeof cb === "function") custodyListeners.add(cb);
11696
11832
  return () => custodyListeners.delete(cb);
11697
11833
  },
11834
+ /** THE LOCAL-WORK-REJECTED HOOK (settable; connect({onLocalWorkRejected}) is the default) — the
11835
+ * typed "the cloud refused work your device had accepted" lifecycle event. See
11836
+ * `LocalWorkRejectedEvent`: refused intents are already parked + survivors replayed when it
11837
+ * fires; the app's only job is honest UX (retryable ⇒ "queued, will retry"; terminal ⇒
11838
+ * "preserved for review — contact support"). */
11839
+ get onLocalWorkRejected() {
11840
+ return localWorkRejectedHook;
11841
+ },
11842
+ set onLocalWorkRejected(fn) {
11843
+ localWorkRejectedHook = typeof fn === "function" ? fn : null;
11844
+ },
11845
+ /** Subscribe (multi-listener) to LocalWorkRejectedEvents. Returns an unsubscribe fn. */
11846
+ onLocalWorkRejectedEvent: (cb) => {
11847
+ if (typeof cb === "function") localWorkRejectedListeners.add(cb);
11848
+ return () => localWorkRejectedListeners.delete(cb);
11849
+ },
11698
11850
  /**
11699
11851
  * INTROSPECTION — where this holon sits on the custody spectrum:
11700
11852
  * `{ incarnation, localGenesis, remoteIncarnation, syncPosture, pendingLocalIntents, salvagedIntents,
@@ -12633,7 +12785,7 @@ ${String(commit).toLowerCase()}`;
12633
12785
  * typed verdict `{ ok, missing[], incompatible[] }` naming the exact directive / aggregate
12634
12786
  * / field at fault. `requirement` + `offer` are the `{[domain]: interface}` maps the
12635
12787
  * compiler emits; pass the workspace offer explicitly (e.g. from its deployed
12636
- * `.interface.json` / a future on-ledger read). architecture/shape_compatibility.md.
12788
+ * the generated client's carried requirement / the on-ledger offer). architecture/shape_compatibility.md.
12637
12789
  */
12638
12790
  checkCompatibility: (requirement, offer) => serialize(async () => {
12639
12791
  const domains = interfaceDomains(requirement);
@@ -13164,6 +13316,10 @@ ${String(commit).toLowerCase()}`;
13164
13316
  });
13165
13317
  _convSpan.end();
13166
13318
  if (result && result.custodyBreak) return await resolveCustodyBreakFlow(result.custodyBreak, { operation: "sync" });
13319
+ if (admissionRefusals && admissionRefusals.size) {
13320
+ const refusedEntries = (admission?.sessions || []).flatMap((s) => (s.rejected || []).map((r) => ({ intentId: r.intent, oid: r.oid, error: r.error })));
13321
+ emitLocalWorkRejected("admission", refusedEntries, result && typeof result.remoteMain === "string" ? result.remoteMain : null);
13322
+ }
13167
13323
  try {
13168
13324
  result.stillAhead = await resolveBranchHead() !== syncedBase;
13169
13325
  } catch {
@@ -13763,8 +13919,8 @@ async function openRealm(opts = {}) {
13763
13919
  const m = mounted.get(victim);
13764
13920
  mounted.delete(victim);
13765
13921
  try {
13766
- const snap = await m.holon.export();
13767
- parked.set(victim, snap);
13922
+ const [snapshot, head] = await Promise.all([m.holon.export(), m.holon.head()]);
13923
+ parked.set(victim, { snapshot, head });
13768
13924
  } catch {
13769
13925
  }
13770
13926
  parkWatches(victim);
@@ -13809,7 +13965,7 @@ async function openRealm(opts = {}) {
13809
13965
  }
13810
13966
  if (evict) while (mounted.size >= Math.max(1, maxMounted)) await evictLru(name);
13811
13967
  const provider = plane.providerFor();
13812
- const restoreFrom = wsOpts.restoreFrom || parked.get(name) || void 0;
13968
+ const restoreFrom = wsOpts.restoreFrom || parked.get(name)?.snapshot || void 0;
13813
13969
  const inPlace = !restoreFrom && plane.hasCustody(name);
13814
13970
  const holon = await connectSingle({
13815
13971
  cloud,
@@ -13835,6 +13991,9 @@ async function openRealm(opts = {}) {
13835
13991
  // callback is invoked only after this mount has completed, so entering the realm gate here cannot
13836
13992
  // recursively deadlock the mount that created the caller.
13837
13993
  openWorkspaceInPlane: (target, targetOpts) => withGate(() => mount(target, targetOpts, { evict: false })),
13994
+ // UNGATED on purpose: this runs inside the gate this very mount is holding. Evicting is also
13995
+ // disabled — a source being mounted for a replay must never displace the workspace replaying.
13996
+ openSourceInPlane: (target, targetOpts) => mount(target, targetOpts, { evict: false }),
13838
13997
  watchRebind,
13839
13998
  // so a subscription survives this ws's LRU park/remount cycle
13840
13999
  __knownKernelCapabilities: knownKernelCapabilities,
@@ -13871,13 +14030,44 @@ async function openRealm(opts = {}) {
13871
14030
  custody: plane.hasCustody(name) || parked.has(name)
13872
14031
  }));
13873
14032
  },
14033
+ /**
14034
+ * Export one workspace's exact resident custody without manufacturing a runner session.
14035
+ *
14036
+ * This is the plane persistence seam. A generated birth can leave a child in the shared
14037
+ * kernel before application code ever acquires it, so host save-all cannot be defined as
14038
+ * "all connected sessions". Mounted holons retain their normal synchronized-base export;
14039
+ * parked holons return the already-exact parked snapshot; a born-but-unopened resident is
14040
+ * exported by a temporary provider view routed directly to its kernel workspace.
14041
+ */
14042
+ snapshot: (name, opts2 = {}) => withGate(async () => {
14043
+ if (!name || typeof name !== "string") throw new Error("realm.snapshot(name) requires a workspace name");
14044
+ const mountedEntry = mounted.get(name);
14045
+ if (mountedEntry) {
14046
+ const head2 = await mountedEntry.holon.head();
14047
+ if (opts2.ifHead && opts2.ifHead === head2) return { workspace: name, head: head2, unchanged: true };
14048
+ return { workspace: name, head: head2, snapshot: await mountedEntry.holon.export() };
14049
+ }
14050
+ const parkedEntry = parked.get(name);
14051
+ if (parkedEntry) {
14052
+ if (opts2.ifHead && opts2.ifHead === parkedEntry.head) {
14053
+ return { workspace: name, head: parkedEntry.head, unchanged: true };
14054
+ }
14055
+ return { workspace: name, head: parkedEntry.head, snapshot: parkedEntry.snapshot };
14056
+ }
14057
+ if (!plane.hasCustody(name)) throw new Error(`workspace '${name}' has no resident custody to snapshot`);
14058
+ const provider = plane.providerFor();
14059
+ await provider.boot({ base: cloud, workspace: name, branch: "main", fetchImpl });
14060
+ const head = await provider.resolveBranchHead() || "";
14061
+ if (opts2.ifHead && opts2.ifHead === head) return { workspace: name, head, unchanged: true };
14062
+ return { workspace: name, head, snapshot: await provider.export() };
14063
+ }),
13874
14064
  /** Unmount ONE workspace — export to a parked snapshot, free its resident tree. Re-access remounts it. */
13875
14065
  close: (name) => withGate(async () => {
13876
14066
  const m = mounted.get(name);
13877
14067
  if (!m) return false;
13878
14068
  try {
13879
- const snap = await m.holon.export();
13880
- parked.set(name, snap);
14069
+ const [snapshot, head] = await Promise.all([m.holon.export(), m.holon.head()]);
14070
+ parked.set(name, { snapshot, head });
13881
14071
  } catch {
13882
14072
  }
13883
14073
  parkWatches(name);