githolon 0.108.4 → 0.108.7

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.
@@ -1192,7 +1192,7 @@ var init_lifecycle_calls = __esm({
1192
1192
 
1193
1193
  // ../adapter/proto/nomos/kernel/v1/kernel_pb.js
1194
1194
  import { enumDesc, fileDesc, messageDesc, serviceDesc, tsEnum } from "@bufbuild/protobuf/codegenv2";
1195
- var file_nomos_kernel_v1_kernel, CallRequestSchema, CallResponseSchema, OfferAggregateRefSchema, BornWorkspaceSchema, BirthOutcomeSchema, PrepareRemoteOfferRequestSchema, PrepareRemoteOfferResponseSchema, WorkspaceTargetSchema, InitializeWorkspaceRequestSchema, DirectiveCallSchema, AuthoringOptionsSchema, CapturedClockSchema, BirthCertificateSchema, SignBirthCertificateRequestSchema, OfferRequestSchema, QueryRequestSchema, QueryAuthoritySchema, InjectedKeySchema, RowsQuerySchema, ByIdQuerySchema, TallyQuerySchema, SpatialQuerySchema, NamedQuerySchema, TestRequestSchema, SetTestRootRequestSchema, CustodyRequestSchema, PackDeltaRequestSchema, ApplyPackRequestSchema, RepoStatsRequestSchema, IntentsAboveRequestSchema, InspectChangeRequestSchema, RefusalVerdictSchema, EncodeRefusalVerdictRequestSchema, InspectRefusalVerdictRequestSchema, ProveCompactionEquivalenceRequestSchema, ReadBlobRequestSchema, ResolveRefRequestSchema, ListRefsRequestSchema, WriteRefRequestSchema, DeleteRefRequestSchema, WriteMetaCommitRequestSchema, LawClosureInfoRequestSchema, CheckpointExportRequestSchema, VerifiedFrontierReceiptSchema, StoredCheckpointManifestSchema, CheckpointImportRequestSchema, RestoreMainRequestSchema, ResolveStatePositionRequestSchema, NomosValueSchema, NomosStructSchema, BirthOutcomeStatusSchema, BirthOutcomeStatus, QueryOperationSchema, QueryOperation, KernelLawCapabilitySchema, KernelLawCapability, CheckpointCompressionSchema, CheckpointCompression, CheckpointVerificationPolicySchema, CheckpointVerificationPolicy, CheckpointAssuranceSchema, CheckpointAssurance;
1195
+ var file_nomos_kernel_v1_kernel, CallRequestSchema, CallResponseSchema, OfferAggregateRefSchema, BornWorkspaceSchema, BirthOutcomeSchema, PrepareRemoteOfferRequestSchema, PrepareRemoteOfferResponseSchema, ApplyWorkspaceEffectRequestSchema, ApplyWorkspaceEffectResponseSchema, WorkspaceTargetSchema, InitializeWorkspaceRequestSchema, DirectiveCallSchema, AuthoringOptionsSchema, CapturedClockSchema, BirthCertificateSchema, SignBirthCertificateRequestSchema, OfferRequestSchema, QueryRequestSchema, QueryAuthoritySchema, InjectedKeySchema, RowsQuerySchema, ByIdQuerySchema, TallyQuerySchema, SpatialQuerySchema, NamedQuerySchema, OutboxRequestSchema, TestRequestSchema, SetTestRootRequestSchema, CustodyRequestSchema, PackDeltaRequestSchema, ApplyPackRequestSchema, RepoStatsRequestSchema, IntentsAboveRequestSchema, InspectChangeRequestSchema, RefusalVerdictSchema, EncodeRefusalVerdictRequestSchema, InspectRefusalVerdictRequestSchema, ProveCompactionEquivalenceRequestSchema, ReadBlobRequestSchema, ResolveRefRequestSchema, ListRefsRequestSchema, WriteRefRequestSchema, DeleteRefRequestSchema, WriteMetaCommitRequestSchema, LawClosureInfoRequestSchema, CheckpointExportRequestSchema, VerifiedFrontierReceiptSchema, StoredCheckpointManifestSchema, CheckpointImportRequestSchema, RestoreMainRequestSchema, ResolveStatePositionRequestSchema, NomosValueSchema, NomosStructSchema, BirthOutcomeStatusSchema, BirthOutcomeStatus, QueryOperationSchema, QueryOperation, KernelLawCapabilitySchema, KernelLawCapability, CheckpointCompressionSchema, CheckpointCompression, CheckpointVerificationPolicySchema, CheckpointVerificationPolicy, CheckpointAssuranceSchema, CheckpointAssurance;
1196
1196
  var init_kernel_pb = __esm({
1197
1197
  "../adapter/proto/nomos/kernel/v1/kernel_pb.js"() {
1198
1198
  "use strict";
@@ -1204,6 +1204,8 @@ var init_kernel_pb = __esm({
1204
1204
  BirthOutcomeSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 8);
1205
1205
  PrepareRemoteOfferRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 19);
1206
1206
  PrepareRemoteOfferResponseSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 21);
1207
+ ApplyWorkspaceEffectRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 38);
1208
+ ApplyWorkspaceEffectResponseSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 39);
1207
1209
  WorkspaceTargetSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 43);
1208
1210
  InitializeWorkspaceRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 45);
1209
1211
  DirectiveCallSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 47);
@@ -1220,6 +1222,7 @@ var init_kernel_pb = __esm({
1220
1222
  TallyQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 74);
1221
1223
  SpatialQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 75);
1222
1224
  NamedQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 78);
1225
+ OutboxRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 96);
1223
1226
  TestRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 98);
1224
1227
  SetTestRootRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 99);
1225
1228
  CustodyRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 101);
@@ -1337,6 +1340,17 @@ var init_offer_result = __esm({
1337
1340
  }
1338
1341
  });
1339
1342
 
1343
+ // ../adapter/proto/nomos/custody/v1/snapshot_pb.js
1344
+ import { fileDesc as fileDesc2, messageDesc as messageDesc2 } from "@bufbuild/protobuf/codegenv2";
1345
+ var file_nomos_custody_v1_snapshot, LocalCustodySnapshotSchema;
1346
+ var init_snapshot_pb = __esm({
1347
+ "../adapter/proto/nomos/custody/v1/snapshot_pb.js"() {
1348
+ "use strict";
1349
+ file_nomos_custody_v1_snapshot = /* @__PURE__ */ fileDesc2("Ch9ub21vcy9jdXN0b2R5L3YxL3NuYXBzaG90LnByb3RvEhBub21vcy5jdXN0b2R5LnYxIqACChRMb2NhbEN1c3RvZHlTbmFwc2hvdBIWCg5mb3JtYXRfdmVyc2lvbhgBIAEoDRIWCgl3b3Jrc3BhY2UYAiABKAlIAIgBARIMCgR0cmVlGAMgASgMEhcKCmNoZWNrcG9pbnQYBCABKAxIAYgBARIVCghmcm9udGllchgFIAEoDEgCiAEBEhMKBmN1cnNvchgGIAEoCUgDiAEBEhcKCnN0YXRlX3Jvb3QYByABKAlIBIgBARIYCgtzeW5jZWRfYmFzZRgIIAEoCUgFiAEBQgwKCl93b3Jrc3BhY2VCDQoLX2NoZWNrcG9pbnRCCwoJX2Zyb250aWVyQgkKB19jdXJzb3JCDQoLX3N0YXRlX3Jvb3RCDgoMX3N5bmNlZF9iYXNlYgZwcm90bzM");
1350
+ LocalCustodySnapshotSchema = /* @__PURE__ */ messageDesc2(file_nomos_custody_v1_snapshot, 0);
1351
+ }
1352
+ });
1353
+
1340
1354
  // ../adapter/engine.ts
1341
1355
  import { WASI, File, Directory, OpenFile, ConsoleStdout, PreopenDirectory } from "@bjorn3/browser_wasi_shim";
1342
1356
  import { create, fromBinary, toBinary } from "@bufbuild/protobuf";
@@ -1398,6 +1412,13 @@ function invokeCallRequest(ex, request, STDERR) {
1398
1412
  ex.git_holon_dealloc(requestPtr, bytes.length);
1399
1413
  }
1400
1414
  }
1415
+ function callKernel(eng, request) {
1416
+ if (request.protocolVersion !== PROTO_ABI_VERSION) {
1417
+ throw new Error(`kernel protobuf ABI ${request.protocolVersion}; expected ${PROTO_ABI_VERSION}`);
1418
+ }
1419
+ if (!request.requestId) throw new Error("kernel protobuf request id is required");
1420
+ return invokeCallRequest(eng.ex, request, eng.STDERR);
1421
+ }
1401
1422
  function callProto(ex, operation, STDERR) {
1402
1423
  return invokeCallRequest(ex, create(CallRequestSchema, {
1403
1424
  protocolVersion: PROTO_ABI_VERSION,
@@ -2122,6 +2143,30 @@ function intentOfferResidencies(eng, offers) {
2122
2143
  }
2123
2144
  return [...unique.values()];
2124
2145
  }
2146
+ function hasWorkspaceResidency(eng, workspace, sourceHead, foldRoot) {
2147
+ if (!eng.mounted.has(workspace)) return false;
2148
+ const gitdir = gitdirOf(workspace);
2149
+ const main = kgit.resolveRef(eng, gitdir, BRANCH);
2150
+ if (!main) return false;
2151
+ try {
2152
+ return !!kgit.resolveStatePosition(eng, gitdir, main, sourceHead, foldRoot);
2153
+ } catch {
2154
+ return false;
2155
+ }
2156
+ }
2157
+ async function ensureWorkspaceResidency(eng, workspace, sourceHead, foldRoot, ledger) {
2158
+ if (hasWorkspaceResidency(eng, workspace, sourceHead, foldRoot)) {
2159
+ return { workspace, sourceHead, foldRoot, reused: true };
2160
+ }
2161
+ if (eng.mounted.has(workspace)) unmount(eng, workspace);
2162
+ const mounted = await mountWorkspace(eng, workspace, ledger);
2163
+ if (!mounted.restored || !hasWorkspaceResidency(eng, workspace, sourceHead, foldRoot)) {
2164
+ throw new Error(
2165
+ `workspace residency '${workspace}' does not contain required source state ${foldRoot}`
2166
+ );
2167
+ }
2168
+ return { workspace, sourceHead, foldRoot, reused: false };
2169
+ }
2125
2170
  function stageWorkspaceDir(eng, ws) {
2126
2171
  const wsContents = /* @__PURE__ */ new Map();
2127
2172
  dirOf(eng.preopen.dir.contents.get("ws")).contents.set(ws, new Directory(wsContents));
@@ -2224,6 +2269,50 @@ function requireCurrentControllerLawHash(eng, ws) {
2224
2269
  function installedLaw(eng, ws) {
2225
2270
  return namedQueryProto(eng, ws, QueryOperation.INSTALLED_LAW);
2226
2271
  }
2272
+ function outboundOffers(eng, ws, nowMillis = Date.now()) {
2273
+ const response = callProto(eng.ex, {
2274
+ case: "outbox",
2275
+ value: create(OutboxRequestSchema, {
2276
+ target: protoTarget(ws),
2277
+ clock: create(CapturedClockSchema, {
2278
+ physicalMillis: BigInt(nowMillis),
2279
+ logical: 0,
2280
+ replica: BigInt(eng.replica)
2281
+ })
2282
+ })
2283
+ }, eng.STDERR);
2284
+ if (response.outcome.case !== "outbox") {
2285
+ throw new Error(`kernel returned ${response.outcome.case || "empty"} for outbox request`);
2286
+ }
2287
+ return response.outcome.value;
2288
+ }
2289
+ async function applyWorkspaceEffect(eng, ws, ledger, requestBytes, admissionCheckpointSecret) {
2290
+ const request = fromBinary(ApplyWorkspaceEffectRequestSchema, requestBytes);
2291
+ if (request.target?.workspace !== ws || request.target.repo !== repoArgOf(ws)) {
2292
+ throw new Error("workspace-effect protobuf target does not match the mounted target custody");
2293
+ }
2294
+ if (admissionCheckpointSecret.byteLength !== 32) {
2295
+ throw new Error("target runtime admission checkpoint credential is missing or malformed");
2296
+ }
2297
+ request.admissionCheckpointSecret = admissionCheckpointSecret;
2298
+ const response = callProto(eng.ex, {
2299
+ case: "applyWorkspaceEffect",
2300
+ value: request
2301
+ }, eng.STDERR);
2302
+ if (response.outcome.case !== "applyWorkspaceEffect") {
2303
+ throw new Error(`kernel returned ${response.outcome.case || "empty"} for workspace effect`);
2304
+ }
2305
+ const result = response.outcome.value.result;
2306
+ if (!result || result.outcome.case !== "admitted") {
2307
+ const outcome = result?.outcome.case || "empty";
2308
+ const detail = result?.outcome.case === "refused" ? result.outcome.value.refusal?.message : void 0;
2309
+ throw new Error(
2310
+ `target kernel ${outcome} the workspace effect${detail ? `: ${detail}` : ""}`
2311
+ );
2312
+ }
2313
+ await custodyPush(eng, ws, ledger, { remoteRef: "refs/heads/main", ffOnly: true });
2314
+ return toBinary(ApplyWorkspaceEffectResponseSchema, response.outcome.value);
2315
+ }
2227
2316
  function author(eng, ws, domain, directiveId, payload, controllerHash, opts = {}) {
2228
2317
  const seq = eng.seq++;
2229
2318
  const capPorts = { clock: { physical: Date.now(), logical: 0, replica: eng.replica }, rng: osEntropyBuffer(opts.rngDraws ?? 64) };
@@ -2301,8 +2390,8 @@ function prepareRemoteOffer(eng, ws, requestBytes) {
2301
2390
  if (authoring.authorSecret.byteLength !== 0) {
2302
2391
  throw new Error("remote offer preparation refuses client signing secrets");
2303
2392
  }
2304
- if (request.intent.case !== "call") {
2305
- throw new Error("remote offer preparation requires a typed directive call");
2393
+ if (request.intent.case !== "call" && request.intent.case !== "modelLifecycle") {
2394
+ throw new Error("remote offer preparation requires a typed directive or model-lifecycle call");
2306
2395
  }
2307
2396
  const response = callProto(eng.ex, {
2308
2397
  case: "prepareRemoteOffer",
@@ -2606,7 +2695,13 @@ function packDelta(eng, ws, base, head) {
2606
2695
  case: "packDelta",
2607
2696
  value: create(PackDeltaRequestSchema, { repo: repoArgOf(ws), base: base || void 0, head })
2608
2697
  }, "packDelta").pack;
2609
- } catch {
2698
+ } catch (error) {
2699
+ console.error("[nomos-custody-pack] packDelta refused", {
2700
+ workspace: ws,
2701
+ base: base || "<full>",
2702
+ head,
2703
+ error: String(error)
2704
+ });
2610
2705
  return null;
2611
2706
  }
2612
2707
  }
@@ -3197,6 +3292,121 @@ async function deleteRefusedRef(eng, ws, ledger, offerId) {
3197
3292
  }
3198
3293
  return ref;
3199
3294
  }
3295
+ async function emitOutbox(eng, ws, ledger, workspaceEffectBase = "", admissionCheckpointSecret) {
3296
+ const outbox = outboundOffers(eng, ws);
3297
+ const nextDueAtMillis = outbox.nextDueAtMillis === void 0 ? void 0 : Number(outbox.nextDueAtMillis);
3298
+ if (outbox.offers.length === 0) {
3299
+ return { delivered: [], skipped: 0, errors: 0, nextDueAtMillis };
3300
+ }
3301
+ const gitdir = gitdirOf(ws);
3302
+ const delivered = [];
3303
+ let errors = 0;
3304
+ for (const offer of outbox.offers) {
3305
+ try {
3306
+ switch (offer.route.case) {
3307
+ case "httpsRoute": {
3308
+ const destination = offer.route.value.url;
3309
+ const res = await fetch(destination, {
3310
+ method: "POST",
3311
+ headers: {
3312
+ "content-type": offer.contentType,
3313
+ "x-nomos-offer-id": offer.id,
3314
+ "x-nomos-obligation-id": offer.obligationId,
3315
+ "x-nomos-source-workspace": offer.sourceWorkspace,
3316
+ "x-nomos-custody-head": offer.custodyHead
3317
+ },
3318
+ // Fetch's DOM typing requires an ArrayBuffer-backed body; this copies opaque bytes without
3319
+ // decoding or re-authoring them. The receiving kernel sees the exact sealed USDA payload.
3320
+ body: Uint8Array.from(offer.sealedOffer).buffer,
3321
+ signal: AbortSignal.timeout(3e4)
3322
+ });
3323
+ if (!res.ok) {
3324
+ throw new Error(`HTTPS capability returned ${res.status}`);
3325
+ }
3326
+ break;
3327
+ }
3328
+ case "workspaceRoute": {
3329
+ const targetWorkspace = offer.route.value.workspace;
3330
+ const request = create(ApplyWorkspaceEffectRequestSchema, {
3331
+ source: protoTarget(ws),
3332
+ sourceCommit: offer.sourceCommit,
3333
+ sourceOfferPath: offer.sourceOfferPath,
3334
+ target: protoTarget(targetWorkspace),
3335
+ sourceEvidencePack: offer.sourceEvidencePack
3336
+ });
3337
+ const response = workspaceEffectBase ? fromBinary(
3338
+ ApplyWorkspaceEffectResponseSchema,
3339
+ new Uint8Array(await (async () => {
3340
+ const remote = await fetch(
3341
+ `${workspaceEffectBase.replace(/\/+$/, "")}/v2/workspaces/${encodeURIComponent(targetWorkspace)}/workspace-effect`,
3342
+ {
3343
+ method: "POST",
3344
+ headers: { "content-type": "application/vnd.nomos.workspace-effect+protobuf" },
3345
+ body: toBinary(ApplyWorkspaceEffectRequestSchema, request),
3346
+ signal: AbortSignal.timeout(3e4)
3347
+ }
3348
+ );
3349
+ if (!remote.ok) throw new Error(`workspace-effect receiver returned ${remote.status}: ${(await remote.text()).slice(0, 200)}`);
3350
+ return remote.arrayBuffer();
3351
+ })())
3352
+ ) : (() => {
3353
+ if (admissionCheckpointSecret?.byteLength !== 32) {
3354
+ throw new Error("local target admission checkpoint credential is missing or malformed");
3355
+ }
3356
+ request.admissionCheckpointSecret = admissionCheckpointSecret;
3357
+ const local = callProto(eng.ex, {
3358
+ case: "applyWorkspaceEffect",
3359
+ value: request
3360
+ }, eng.STDERR);
3361
+ if (local.outcome.case !== "applyWorkspaceEffect") {
3362
+ throw new Error(`kernel returned ${local.outcome.case || "empty"} for workspace effect`);
3363
+ }
3364
+ return local.outcome.value;
3365
+ })();
3366
+ const targetResult = response.result;
3367
+ if (!targetResult || targetResult.outcome.case !== "admitted") {
3368
+ const outcome = targetResult?.outcome.case || "empty";
3369
+ const detail = targetResult?.outcome.case === "refused" ? targetResult.outcome.value.refusal?.message : void 0;
3370
+ throw new Error(
3371
+ `target kernel ${outcome} the workspace effect${detail ? `: ${detail}` : ""}`
3372
+ );
3373
+ }
3374
+ break;
3375
+ }
3376
+ case void 0: {
3377
+ if (!offer.destination) throw new Error("legacy outbound offer has no HTTPS destination");
3378
+ const res = await fetch(offer.destination, {
3379
+ method: "POST",
3380
+ headers: {
3381
+ "content-type": offer.contentType,
3382
+ "x-nomos-offer-id": offer.id,
3383
+ "x-nomos-obligation-id": offer.obligationId,
3384
+ "x-nomos-source-workspace": offer.sourceWorkspace,
3385
+ "x-nomos-custody-head": offer.custodyHead
3386
+ },
3387
+ body: Uint8Array.from(offer.sealedOffer).buffer,
3388
+ signal: AbortSignal.timeout(3e4)
3389
+ });
3390
+ if (!res.ok) throw new Error(`legacy HTTPS capability returned ${res.status}`);
3391
+ break;
3392
+ }
3393
+ }
3394
+ kgit.writeRef(eng, gitdir, offer.deliveryRef, offer.custodyOid);
3395
+ try {
3396
+ await custodyPush(eng, ws, ledger, { remoteRef: offer.deliveryRef });
3397
+ } catch (e) {
3398
+ log("outbox-delivery-ref-push-failed", { ws, ref: offer.deliveryRef, error: String(e).slice(0, 200) });
3399
+ }
3400
+ delivered.push(offer.id);
3401
+ } catch (e) {
3402
+ errors++;
3403
+ const destination = offer.route.case === "httpsRoute" ? offer.route.value.url : offer.route.case === "workspaceRoute" ? offer.route.value.workspace : offer.destination;
3404
+ log("outbox-deliver-failed", { ws, offerId: offer.id, destination, error: String(e).slice(0, 2e3) });
3405
+ }
3406
+ }
3407
+ if (delivered.length || errors) log("outbox", { ws, delivered: delivered.length, errors });
3408
+ return { delivered, skipped: 0, errors, nextDueAtMillis };
3409
+ }
3200
3410
  async function boot(eng, ws, ledger) {
3201
3411
  const m = await mountWorkspace(eng, ws, ledger);
3202
3412
  if (nomosActive(eng, ws)) {
@@ -3222,6 +3432,26 @@ function snapshot(eng, ws) {
3222
3432
  const wsDir = dirOf(eng.preopen.dir.contents.get("ws")).contents.get(ws);
3223
3433
  return serializeTree(wsDir);
3224
3434
  }
3435
+ function localCustodySnapshot(eng, ws) {
3436
+ const checkpoint = exportCheckpoint(eng, ws);
3437
+ const tree = snapshot(eng, ws);
3438
+ const head = headOf(eng, ws);
3439
+ const body = toBinary(LocalCustodySnapshotSchema, create(LocalCustodySnapshotSchema, {
3440
+ formatVersion: 3,
3441
+ workspace: ws,
3442
+ tree,
3443
+ checkpoint: checkpoint.blob ? bytesFromB64(checkpoint.blob) : void 0,
3444
+ frontier: checkpoint.frontier ? bytesFromB64(checkpoint.frontier) : void 0,
3445
+ cursor: checkpoint.cursor === void 0 ? void 0 : String(checkpoint.cursor),
3446
+ stateRoot: checkpoint.stateRoot,
3447
+ syncedBase: head || void 0
3448
+ }));
3449
+ const prefix = enc3.encode("NOMOS-CUSTODY-PB3\n");
3450
+ const framed = new Uint8Array(prefix.byteLength + body.byteLength);
3451
+ framed.set(prefix);
3452
+ framed.set(body, prefix.byteLength);
3453
+ return framed;
3454
+ }
3225
3455
  async function ledgerStats(eng, ws, ledger = null) {
3226
3456
  const gitdir = gitdirOf(ws);
3227
3457
  let head = kgit.resolveRef(eng, gitdir, BRANCH);
@@ -3249,7 +3479,7 @@ async function ledgerStats(eng, ws, ledger = null) {
3249
3479
  if (mounted) mounted.ledgerStats = out;
3250
3480
  return out;
3251
3481
  }
3252
- var enc3, dec3, BRANCH, PROTO_ABI_VERSION, protoRequestSequence, protoBirthCertificate, RESULT_PACK_INLINE_MAX, dirOf, repoArgOf, gitdirOf, birthCertificateLawPayload, unpack, unsignedWasiPointers, log, protoTarget, protoAuthority, repoArgOfGitdir, bytesFromB64, kgit, closureInstallPayload, routeTagHexOfHomeKey, SUMMARY_SEP, summaryKey, splitSummaryKey, NOMOS_SHARD_ROWS_READ, groupOf, tallyOf, isExtremumRead, extremumMonotone, MAX_INLINE_INTENT_OFFER_BYTES, MAX_STAGED_INTENT_OFFER_BYTES, CKPT_REF, pushVia, fullRef, applyPackInto, custodyLsRefs, capturedReadUnix, queryArguments, queryAuthorityOptions, qById, query, authorKeygen, certSign, readPosture, count, sum, spatialWithin, extremum, nomosActive, refusedRefName, GENESIS_WARRANT_ID, isWarranted;
3482
+ var enc3, dec3, BRANCH, PROTO_ABI_VERSION, protoRequestSequence, protoBirthCertificate, RESULT_PACK_INLINE_MAX, dirOf, repoArgOf, gitdirOf, headOf, birthCertificateLawPayload, unpack, unsignedWasiPointers, log, protoTarget, protoAuthority, repoArgOfGitdir, bytesFromB64, kgit, closureInstallPayload, routeTagHexOfHomeKey, SUMMARY_SEP, summaryKey, splitSummaryKey, NOMOS_SHARD_ROWS_READ, groupOf, tallyOf, isExtremumRead, extremumMonotone, MAX_INLINE_INTENT_OFFER_BYTES, MAX_STAGED_INTENT_OFFER_BYTES, CKPT_REF, pushVia, fullRef, applyPackInto, custodyLsRefs, capturedReadUnix, queryArguments, queryAuthorityOptions, qById, query, authorKeygen, certSign, count, sum, spatialWithin, extremum, nomosActive, refusedRefName, GENESIS_WARRANT_ID, isWarranted;
3253
3483
  var init_engine = __esm({
3254
3484
  "../adapter/engine.ts"() {
3255
3485
  "use strict";
@@ -3260,6 +3490,7 @@ var init_engine = __esm({
3260
3490
  init_lifecycle_calls();
3261
3491
  init_offer_result();
3262
3492
  init_kernel_pb();
3493
+ init_snapshot_pb();
3263
3494
  enc3 = new TextEncoder();
3264
3495
  dec3 = new TextDecoder();
3265
3496
  BRANCH = "main";
@@ -3270,6 +3501,7 @@ var init_engine = __esm({
3270
3501
  dirOf = (n) => n;
3271
3502
  repoArgOf = (ws) => `/work/ws/${ws}`;
3272
3503
  gitdirOf = (ws) => `/work/ws/${ws}/nomos.git`;
3504
+ headOf = (eng, ws) => kgit.resolveRef(eng, gitdirOf(ws), BRANCH) ?? "";
3273
3505
  birthCertificateLawPayload = (certificate) => ({
3274
3506
  child: certificate.child,
3275
3507
  founder: certificate.founder,
@@ -3600,13 +3832,6 @@ var init_engine = __esm({
3600
3832
  }
3601
3833
  return response.outcome.value.certificate;
3602
3834
  };
3603
- readPosture = (eng, ws, principal = "", authToken = "", nowUnix = 0, authorSecret = "") => namedQueryProto(
3604
- eng,
3605
- ws,
3606
- QueryOperation.READ_POSTURE,
3607
- {},
3608
- queryAuthorityOptions(principal, [], authToken, nowUnix, authorSecret)
3609
- );
3610
3835
  count = (eng, ws, countId, groupKey, principal = "", authToken = "", nowUnix = 0, authorSecret = "") => applicationQueryProto(eng, ws, {
3611
3836
  case: "count",
3612
3837
  value: create(TallyQuerySchema, { id: countId, groupKey, principal })
@@ -3674,7 +3899,7 @@ __export(bootstrap_exports, {
3674
3899
  platformGenesisDomain: () => platformGenesisDomain
3675
3900
  });
3676
3901
  import { readFileSync } from "node:fs";
3677
- import { createHash } from "node:crypto";
3902
+ import { createHash, generateKeyPairSync, sign as nodeSign } from "node:crypto";
3678
3903
  import path from "node:path";
3679
3904
  import { pathToFileURL } from "node:url";
3680
3905
  async function loadApplicationFrameworkCalls(lawUsdzPath) {
@@ -3691,7 +3916,7 @@ async function loadApplicationFrameworkCalls(lawUsdzPath) {
3691
3916
  );
3692
3917
  }
3693
3918
  const calls = generated.nomosInternalFrameworkCalls;
3694
- if (calls === void 0 || typeof calls.identity?.enrollSigner !== "function" || typeof calls.identity?.setAuthProvider !== "function" || typeof calls.birth?.seedBirthPolicy !== "function" || typeof calls.birth?.seedBirthAttestation !== "function" || typeof calls.birth?.seedGenesis !== "function") {
3919
+ if (calls === void 0 || typeof calls.identity?.enrollAdmissionCheckpointSigner !== "function" || typeof calls.identity?.enrollSigner !== "function" || typeof calls.identity?.setAuthProvider !== "function" || typeof calls.birth?.seedAuthProvider !== "function" || typeof calls.birth?.seedBirthPolicy !== "function" || typeof calls.birth?.seedBirthAttestation !== "function" || typeof calls.birth?.seedGenesis !== "function") {
3695
3920
  throw new Error(
3696
3921
  `the generated application binding ${headlessPath} does not expose the complete typed bootstrap call set`
3697
3922
  );
@@ -3753,6 +3978,59 @@ function devAuthProviderPayload(initial, nowMillis = Date.now(), operator = "use
3753
3978
  setAt: nowMillis
3754
3979
  };
3755
3980
  }
3981
+ function syntheticIdentityProvider(platform, generation = 0) {
3982
+ const { privateKey, publicKey } = generateKeyPairSync("ec", {
3983
+ namedCurve: "P-256"
3984
+ });
3985
+ const jwk = publicKey.export({ format: "jwk" });
3986
+ const kid = generation === 0 ? "dev-idp" : `dev-idp-${generation}`;
3987
+ const issuer = `https://dev-idp.local/${platform}`;
3988
+ const audience = `${platform}-app`;
3989
+ const publicKeys = [
3990
+ {
3991
+ kty: "EC",
3992
+ crv: "P-256",
3993
+ kid,
3994
+ alg: "ES256",
3995
+ use: "sig",
3996
+ x: jwk.x,
3997
+ y: jwk.y
3998
+ }
3999
+ ];
4000
+ const jwks = JSON.stringify({ keys: publicKeys });
4001
+ const b64url = (bytes) => Buffer.from(bytes).toString("base64url");
4002
+ const mint = (claims) => {
4003
+ const header = b64url(JSON.stringify({ alg: "ES256", typ: "JWT", kid }));
4004
+ const payload = b64url(
4005
+ JSON.stringify({
4006
+ iss: issuer,
4007
+ aud: audience,
4008
+ nbf: 0,
4009
+ exp: 4102444800,
4010
+ ...claims
4011
+ })
4012
+ );
4013
+ const signingInput = `${header}.${payload}`;
4014
+ const signature = b64url(
4015
+ nodeSign("sha256", Buffer.from(signingInput), {
4016
+ key: privateKey,
4017
+ dsaEncoding: "ieee-p1363"
4018
+ })
4019
+ );
4020
+ return `${signingInput}.${signature}`;
4021
+ };
4022
+ return {
4023
+ issuer,
4024
+ audience,
4025
+ jwks,
4026
+ publicKeys,
4027
+ jwksUrl: `${issuer}/jwks.json`,
4028
+ label: "dev",
4029
+ requireDeviceBinding: "true",
4030
+ kid,
4031
+ mint
4032
+ };
4033
+ }
3756
4034
  function firebaseIdentityProvider(project, jwks) {
3757
4035
  const id = project.trim();
3758
4036
  if (!/^[a-z][a-z0-9-]{4,61}[a-z0-9]$/.test(id)) {
@@ -3846,18 +4124,7 @@ async function bootstrapPlatform(dev, opts) {
3846
4124
  const sOp = authorKeygen(eng);
3847
4125
  const opKeyHash = createHash("sha256").update(Buffer.from(sOp.public, "base64")).digest("hex");
3848
4126
  const foundingPrincipal = `key:${opKeyHash}`;
3849
- const { generateKeyPairSync, sign: nodeSign } = await import("node:crypto");
3850
- const { privateKey: idpPrivateKey, publicKey: idpPublicKey } = generateKeyPairSync("ec", { namedCurve: "P-256" });
3851
- const idpJwk = idpPublicKey.export({ format: "jwk" });
3852
- const syntheticIdp = {
3853
- issuer: `https://dev-idp.local/${platform}`,
3854
- audience: `${platform}-app`,
3855
- jwks: JSON.stringify({ keys: [{ kty: "EC", crv: "P-256", kid: "dev-idp", alg: "ES256", use: "sig", x: idpJwk.x, y: idpJwk.y }] }),
3856
- publicKeys: [{ kty: "EC", crv: "P-256", kid: "dev-idp", alg: "ES256", use: "sig", x: idpJwk.x, y: idpJwk.y }],
3857
- jwksUrl: `https://dev-idp.local/${platform}/jwks.json`,
3858
- label: "dev",
3859
- requireDeviceBinding: "true"
3860
- };
4127
+ const syntheticIdp = syntheticIdentityProvider(platform);
3861
4128
  const selectedIdp = opts.firebaseProject ? firebaseIdentityProvider(
3862
4129
  opts.firebaseProject,
3863
4130
  await (async () => {
@@ -3871,13 +4138,6 @@ async function bootstrapPlatform(dev, opts) {
3871
4138
  const idpIssuer = selectedIdp.issuer;
3872
4139
  const idpAudience = selectedIdp.audience;
3873
4140
  const idpJwks = selectedIdp.jwks;
3874
- const b64url = (b) => Buffer.from(b).toString("base64url");
3875
- const mintDevToken = (claims) => {
3876
- const header = b64url(JSON.stringify({ alg: "ES256", typ: "JWT", kid: "dev-idp" }));
3877
- const payload = b64url(JSON.stringify({ iss: idpIssuer, aud: idpAudience, nbf: 0, exp: 4102444800, ...claims }));
3878
- const si = `${header}.${payload}`;
3879
- return `${si}.${b64url(nodeSign("sha256", Buffer.from(si), { key: idpPrivateKey, dsaEncoding: "ieee-p1363" }))}`;
3880
- };
3881
4141
  const platformCert = certSign(eng, {
3882
4142
  child: platform,
3883
4143
  founder: foundingPrincipal,
@@ -3926,7 +4186,7 @@ async function bootstrapPlatform(dev, opts) {
3926
4186
  ISS: idpIssuer,
3927
4187
  AUD: idpAudience,
3928
4188
  JWKS: idpJwks,
3929
- ...opts.firebaseProject ? {} : { mint: mintDevToken },
4189
+ ...opts.firebaseProject ? {} : { mint: syntheticIdp.mint },
3930
4190
  apPayload
3931
4191
  };
3932
4192
  }
@@ -3986,6 +4246,20 @@ async function bootstrapPlatform(dev, opts) {
3986
4246
  }
3987
4247
  log2(`application birth policy seeded from the compiled scenario (${applicationMaxChildWorkspaces} child workspaces per principal)`);
3988
4248
  }
4249
+ if (pendingIdP) {
4250
+ const seededAuthProvider = await preWarrant(
4251
+ applicationFrameworkCalls.birth.seedAuthProvider({
4252
+ domain: homeDomain,
4253
+ workspace: platform,
4254
+ ...pendingIdP.apPayload
4255
+ })
4256
+ );
4257
+ if (!seededAuthProvider.ok) {
4258
+ throw new Error(
4259
+ `platform AuthProvider seed REFUSED: ${String(seededAuthProvider.error).slice(0, 400)}`
4260
+ );
4261
+ }
4262
+ }
3989
4263
  const warrant = await signed(applicationFrameworkCalls.birth.seedGenesis({
3990
4264
  domain: homeDomain,
3991
4265
  workspace: platform,
@@ -3994,32 +4268,78 @@ async function bootstrapPlatform(dev, opts) {
3994
4268
  bornAt: (/* @__PURE__ */ new Date()).toISOString()
3995
4269
  }));
3996
4270
  if (!warrant.ok) throw new Error(`platform WARRANT (seedGenesis) REFUSED: ${String(warrant.error).slice(0, 400)}`);
4271
+ const checkpoint = dev.admissionCheckpoint;
4272
+ if (checkpoint === void 0) {
4273
+ throw new Error("dev bootstrap has no runtime admission checkpoint identity");
4274
+ }
4275
+ const checkpointKeyHash = createHash("sha256").update(Buffer.from(checkpoint.public, "base64")).digest("hex");
4276
+ const checkpointEnrollment = await signed(
4277
+ applicationFrameworkCalls.identity.enrollAdmissionCheckpointSigner({
4278
+ domain: homeDomain,
4279
+ workspace: platform,
4280
+ keyHash: checkpointKeyHash,
4281
+ validFromEpoch: 0,
4282
+ grantedAt: (/* @__PURE__ */ new Date()).toISOString()
4283
+ })
4284
+ );
4285
+ if (!checkpointEnrollment.ok) {
4286
+ throw new Error(
4287
+ `platform admission checkpoint enrollment REFUSED: ${String(checkpointEnrollment.error).slice(0, 400)}`
4288
+ );
4289
+ }
3997
4290
  dev.operatorDevice = sOp;
3998
4291
  dev.operatorPrincipal = foundingPrincipal;
3999
4292
  if (pendingIdP) {
4000
- const ap = await serialize(async () => authorOperatorCall(
4001
- eng,
4002
- platform,
4003
- applicationFrameworkCalls.identity.setAuthProvider({
4004
- domain: homeDomain,
4005
- workspace: platform,
4006
- ...pendingIdP.apPayload
4007
- }),
4008
- lawHash,
4009
- { actor: foundingPrincipal, authorSecret: sOp.secret }
4010
- ));
4011
- if (ap.ok) {
4012
- if (pendingIdP.mint) {
4013
- devIdP = { issuer: pendingIdP.ISS, audience: pendingIdP.AUD, jwks: pendingIdP.JWKS, mint: pendingIdP.mint };
4014
- log2(`dev test IdP registered (setAuthProvider ${pendingIdP.ISS}, aud ${pendingIdP.AUD}) \u2014 mint tokens via POST /dev/mint-token`);
4015
- } else {
4016
- log2(`Firebase AuthProvider registered (setAuthProvider ${pendingIdP.ISS}, aud ${pendingIdP.AUD}) \u2014 signed-in clients use their real Firebase ID token`);
4017
- }
4293
+ if (pendingIdP.mint) {
4294
+ devIdP = { issuer: pendingIdP.ISS, audience: pendingIdP.AUD, jwks: pendingIdP.JWKS, mint: pendingIdP.mint };
4295
+ log2(`dev test IdP registered (seedAuthProvider ${pendingIdP.ISS}, aud ${pendingIdP.AUD}) \u2014 mint tokens via POST /dev/mint-token`);
4018
4296
  } else {
4019
- log2(`dev test IdP NOT registered \u2014 setAuthProvider refused (payload keys: ${Object.keys(pendingIdP.apPayload).join(",")}): ${String(ap.error).slice(0, 600)}`);
4297
+ log2(`Firebase AuthProvider registered (seedAuthProvider ${pendingIdP.ISS}, aud ${pendingIdP.AUD}) \u2014 signed-in clients use their real Firebase ID token`);
4020
4298
  }
4021
4299
  }
4022
4300
  dev.testIdP = devIdP;
4301
+ if (!opts.firebaseProject && applicationFrameworkCalls && devIdP) {
4302
+ let generation = 0;
4303
+ let lastProviderEpoch = pendingIdP?.apPayload.keySet.epoch ?? 0;
4304
+ dev.rotateTestIdP = async () => {
4305
+ const next = syntheticIdentityProvider(platform, ++generation);
4306
+ const providerEpoch = Math.max(Date.now(), lastProviderEpoch + 1);
4307
+ const payload = devAuthProviderPayload(
4308
+ next,
4309
+ providerEpoch,
4310
+ foundingPrincipal
4311
+ );
4312
+ const admitted = await serialize(
4313
+ async () => authorOperatorCall(
4314
+ eng,
4315
+ platform,
4316
+ applicationFrameworkCalls.identity.setAuthProvider({
4317
+ domain: homeDomain,
4318
+ workspace: platform,
4319
+ ...payload
4320
+ }),
4321
+ lawHash,
4322
+ { actor: foundingPrincipal, authorSecret: sOp.secret }
4323
+ )
4324
+ );
4325
+ if (!admitted.ok) {
4326
+ throw new Error(
4327
+ `test IdP rotation setAuthProvider REFUSED: ${String(admitted.error).slice(0, 600)}`
4328
+ );
4329
+ }
4330
+ lastProviderEpoch = providerEpoch;
4331
+ dev.testIdP = {
4332
+ issuer: next.issuer,
4333
+ audience: next.audience,
4334
+ jwks: next.jwks,
4335
+ mint: next.mint
4336
+ };
4337
+ log2(
4338
+ `dev test IdP rotated lawfully to ${next.kid} (provider epoch ${providerEpoch})`
4339
+ );
4340
+ return { providerEpoch, kid: next.kid };
4341
+ };
4342
+ }
4023
4343
  log2(`root-attested platform: founding key ${opKeyHash.slice(0, 12)}\u2026 signed GenesisWarrant, seeded BirthAttestation (platform_cert signed by K_root, P_P=${sP.public.slice(0, 12)}\u2026), WARRANTED (self-id ${platform})`);
4024
4344
  log2(" a birthHome under this platform now assembles [home_cert, u_delegation(S_P), platform_cert(K_root)] \u2014 no unwarranted-cert.");
4025
4345
  log2(" ENROLL each user via the warranted lane: enrollFirstDevice (AuthProvider) or enrollDelegation (S_P-signed cert).");
@@ -4117,7 +4437,7 @@ import { readFileSync as readFileSync2, writeFileSync, existsSync as existsSync2
4117
4437
  import { fileURLToPath } from "node:url";
4118
4438
  import path2 from "node:path";
4119
4439
  import os from "node:os";
4120
- import { fromBinary as fromBinary2 } from "@bufbuild/protobuf";
4440
+ import { create as create3, fromBinary as fromBinary2, toBinary as toBinary3 } from "@bufbuild/protobuf";
4121
4441
 
4122
4442
  // ../adapter/custody-offer-transport.ts
4123
4443
  init_kernel_pb();
@@ -4125,30 +4445,32 @@ import { create as create2, toBinary as toBinary2 } from "@bufbuild/protobuf";
4125
4445
 
4126
4446
  // ../adapter/proto/nomos/runtime/v2/runtime_pb.js
4127
4447
  init_kernel_pb();
4128
- import { enumDesc as enumDesc3, fileDesc as fileDesc3, messageDesc as messageDesc3, serviceDesc as serviceDesc2, tsEnum as tsEnum3 } from "@bufbuild/protobuf/codegenv2";
4448
+ import { enumDesc as enumDesc3, fileDesc as fileDesc4, messageDesc as messageDesc4, serviceDesc as serviceDesc2, tsEnum as tsEnum3 } from "@bufbuild/protobuf/codegenv2";
4129
4449
 
4130
4450
  // ../adapter/proto/nomos/kernel/v1/progress_pb.js
4131
- import { enumDesc as enumDesc2, fileDesc as fileDesc2, messageDesc as messageDesc2, tsEnum as tsEnum2 } from "@bufbuild/protobuf/codegenv2";
4132
- var file_nomos_kernel_v1_progress = /* @__PURE__ */ fileDesc2("Ch5ub21vcy9rZXJuZWwvdjEvcHJvZ3Jlc3MucHJvdG8SD25vbW9zLmtlcm5lbC52MSLEAwoWS2VybmVsUHJvZ3Jlc3NTbmFwc2hvdBIWCg5zY2hlbWFfdmVyc2lvbhgBIAEoDRIQCghzZXF1ZW5jZRgCIAEoBBI7CglvcGVyYXRpb24YAyABKA4yKC5ub21vcy5rZXJuZWwudjEuS2VybmVsUHJvZ3Jlc3NPcGVyYXRpb24SMwoFcGhhc2UYBCABKA4yJC5ub21vcy5rZXJuZWwudjEuS2VybmVsUHJvZ3Jlc3NQaGFzZRIXCg9jb21wbGV0ZWRfdW5pdHMYBSABKAQSEwoLdG90YWxfdW5pdHMYBiABKAQSMQoEdW5pdBgHIAEoDjIjLm5vbW9zLmtlcm5lbC52MS5LZXJuZWxQcm9ncmVzc1VuaXQSEAoIdGVybWluYWwYCCABKAgSHAoUYWxsb2NhdG9yX2xpdmVfYnl0ZXMYCSABKAQSHAoUYWxsb2NhdG9yX3BlYWtfYnl0ZXMYCiABKAQSQwoSbGF3X2h5ZHJhdGlvbl9zdGVwGAsgASgOMicubm9tb3Mua2VybmVsLnYxLktlcm5lbExhd0h5ZHJhdGlvblN0ZXASGgoSbGF3X3BhY2thZ2Vfc2hhMjU2GAwgASgJKnAKF0tlcm5lbFByb2dyZXNzT3BlcmF0aW9uEikKJUtFUk5FTF9QUk9HUkVTU19PUEVSQVRJT05fVU5TUEVDSUZJRUQQABIqCiZLRVJORUxfUFJPR1JFU1NfT1BFUkFUSU9OX1JFU1RPUkVfTUFJThABKtkDChNLZXJuZWxQcm9ncmVzc1BoYXNlEiUKIUtFUk5FTF9QUk9HUkVTU19QSEFTRV9VTlNQRUNJRklFRBAAEicKI0tFUk5FTF9QUk9HUkVTU19QSEFTRV9DSEVDS19DVVNUT0RZEAESJAogS0VSTkVMX1BST0dSRVNTX1BIQVNFX1JFQURfQ0hBSU4QAhIrCidLRVJORUxfUFJPR1JFU1NfUEhBU0VfSU5JVElBTElaRV9FTkdJTkUQAxInCiNLRVJORUxfUFJPR1JFU1NfUEhBU0VfUkVBRF9USU1FTElORRAEEiUKIUtFUk5FTF9QUk9HUkVTU19QSEFTRV9IWURSQVRFX0xBVxAFEioKJktFUk5FTF9QUk9HUkVTU19QSEFTRV9SRUNPVkVSWV9QUkVTQ0FOEAYSKAokS0VSTkVMX1BST0dSRVNTX1BIQVNFX1ZFUklGWV9JTlRFTlRTEAcSKQolS0VSTkVMX1BST0dSRVNTX1BIQVNFX1BST01PVEVfQ1VTVE9EWRAIEioKJktFUk5FTF9QUk9HUkVTU19QSEFTRV9SRUJVSUxEX0ZST05USUVSEAkSIgoeS0VSTkVMX1BST0dSRVNTX1BIQVNFX0NPTVBMRVRFEAoqgQEKEktlcm5lbFByb2dyZXNzVW5pdBIkCiBLRVJORUxfUFJPR1JFU1NfVU5JVF9VTlNQRUNJRklFRBAAEh8KG0tFUk5FTF9QUk9HUkVTU19VTklUX0lOVEVOVBABEiQKIEtFUk5FTF9QUk9HUkVTU19VTklUX0xBV19QQUNLQUdFEAIqqwIKFktlcm5lbExhd0h5ZHJhdGlvblN0ZXASKQolS0VSTkVMX0xBV19IWURSQVRJT05fU1RFUF9VTlNQRUNJRklFRBAAEioKJktFUk5FTF9MQVdfSFlEUkFUSU9OX1NURVBfUkVBRF9DTE9TVVJFEAESKwonS0VSTkVMX0xBV19IWURSQVRJT05fU1RFUF9DT01QT1NFX1NUQUdFEAISLAooS0VSTkVMX0xBV19IWURSQVRJT05fU1RFUF9ERVJJVkVfU0NIRU1BUxADEi8KK0tFUk5FTF9MQVdfSFlEUkFUSU9OX1NURVBfTE9BRF9QT0xJQ1lfU0hFTEwQBBIuCipLRVJORUxfTEFXX0hZRFJBVElPTl9TVEVQX1BBQ0tBR0VfQ09NUExFVEUQBWIGcHJvdG8z");
4451
+ import { enumDesc as enumDesc2, fileDesc as fileDesc3, messageDesc as messageDesc3, tsEnum as tsEnum2 } from "@bufbuild/protobuf/codegenv2";
4452
+ var file_nomos_kernel_v1_progress = /* @__PURE__ */ fileDesc3("Ch5ub21vcy9rZXJuZWwvdjEvcHJvZ3Jlc3MucHJvdG8SD25vbW9zLmtlcm5lbC52MSLEAwoWS2VybmVsUHJvZ3Jlc3NTbmFwc2hvdBIWCg5zY2hlbWFfdmVyc2lvbhgBIAEoDRIQCghzZXF1ZW5jZRgCIAEoBBI7CglvcGVyYXRpb24YAyABKA4yKC5ub21vcy5rZXJuZWwudjEuS2VybmVsUHJvZ3Jlc3NPcGVyYXRpb24SMwoFcGhhc2UYBCABKA4yJC5ub21vcy5rZXJuZWwudjEuS2VybmVsUHJvZ3Jlc3NQaGFzZRIXCg9jb21wbGV0ZWRfdW5pdHMYBSABKAQSEwoLdG90YWxfdW5pdHMYBiABKAQSMQoEdW5pdBgHIAEoDjIjLm5vbW9zLmtlcm5lbC52MS5LZXJuZWxQcm9ncmVzc1VuaXQSEAoIdGVybWluYWwYCCABKAgSHAoUYWxsb2NhdG9yX2xpdmVfYnl0ZXMYCSABKAQSHAoUYWxsb2NhdG9yX3BlYWtfYnl0ZXMYCiABKAQSQwoSbGF3X2h5ZHJhdGlvbl9zdGVwGAsgASgOMicubm9tb3Mua2VybmVsLnYxLktlcm5lbExhd0h5ZHJhdGlvblN0ZXASGgoSbGF3X3BhY2thZ2Vfc2hhMjU2GAwgASgJKnAKF0tlcm5lbFByb2dyZXNzT3BlcmF0aW9uEikKJUtFUk5FTF9QUk9HUkVTU19PUEVSQVRJT05fVU5TUEVDSUZJRUQQABIqCiZLRVJORUxfUFJPR1JFU1NfT1BFUkFUSU9OX1JFU1RPUkVfTUFJThABKtkDChNLZXJuZWxQcm9ncmVzc1BoYXNlEiUKIUtFUk5FTF9QUk9HUkVTU19QSEFTRV9VTlNQRUNJRklFRBAAEicKI0tFUk5FTF9QUk9HUkVTU19QSEFTRV9DSEVDS19DVVNUT0RZEAESJAogS0VSTkVMX1BST0dSRVNTX1BIQVNFX1JFQURfQ0hBSU4QAhIrCidLRVJORUxfUFJPR1JFU1NfUEhBU0VfSU5JVElBTElaRV9FTkdJTkUQAxInCiNLRVJORUxfUFJPR1JFU1NfUEhBU0VfUkVBRF9USU1FTElORRAEEiUKIUtFUk5FTF9QUk9HUkVTU19QSEFTRV9IWURSQVRFX0xBVxAFEioKJktFUk5FTF9QUk9HUkVTU19QSEFTRV9SRUNPVkVSWV9QUkVTQ0FOEAYSKAokS0VSTkVMX1BST0dSRVNTX1BIQVNFX1ZFUklGWV9JTlRFTlRTEAcSKQolS0VSTkVMX1BST0dSRVNTX1BIQVNFX1BST01PVEVfQ1VTVE9EWRAIEioKJktFUk5FTF9QUk9HUkVTU19QSEFTRV9SRUJVSUxEX0ZST05USUVSEAkSIgoeS0VSTkVMX1BST0dSRVNTX1BIQVNFX0NPTVBMRVRFEAoqgQEKEktlcm5lbFByb2dyZXNzVW5pdBIkCiBLRVJORUxfUFJPR1JFU1NfVU5JVF9VTlNQRUNJRklFRBAAEh8KG0tFUk5FTF9QUk9HUkVTU19VTklUX0lOVEVOVBABEiQKIEtFUk5FTF9QUk9HUkVTU19VTklUX0xBV19QQUNLQUdFEAIqqwIKFktlcm5lbExhd0h5ZHJhdGlvblN0ZXASKQolS0VSTkVMX0xBV19IWURSQVRJT05fU1RFUF9VTlNQRUNJRklFRBAAEioKJktFUk5FTF9MQVdfSFlEUkFUSU9OX1NURVBfUkVBRF9DTE9TVVJFEAESKwonS0VSTkVMX0xBV19IWURSQVRJT05fU1RFUF9DT01QT1NFX1NUQUdFEAISLAooS0VSTkVMX0xBV19IWURSQVRJT05fU1RFUF9ERVJJVkVfU0NIRU1BUxADEi8KK0tFUk5FTF9MQVdfSFlEUkFUSU9OX1NURVBfTE9BRF9QT0xJQ1lfU0hFTEwQBBIuCipLRVJORUxfTEFXX0hZRFJBVElPTl9TVEVQX1BBQ0tBR0VfQ09NUExFVEUQBWIGcHJvdG8z");
4133
4453
 
4134
4454
  // ../adapter/proto/nomos/runtime/v2/runtime_pb.js
4135
- var file_nomos_runtime_v2_runtime = /* @__PURE__ */ fileDesc3("Ch5ub21vcy9ydW50aW1lL3YyL3J1bnRpbWUucHJvdG8SEG5vbW9zLnJ1bnRpbWUudjIioAkKDlJ1bnRpbWVSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoBBIyCgV0cmFjZRgDIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuVHJhY2VDb250ZXh0SAGIAQESOgoLa2VybmVsX2NhbGwYCiABKAsyIy5ub21vcy5ydW50aW1lLnYyLktlcm5lbENhbGxSZXF1ZXN0SAASMwoHY29ubmVjdBgLIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuQ29ubmVjdFJlcXVlc3RIABJCCg9saXN0X3dvcmtzcGFjZXMYDCABKAsyJy5ub21vcy5ydW50aW1lLnYyLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdEgAEkgKEnNuYXBzaG90X3dvcmtzcGFjZRgNIAEoCzIqLm5vbW9zLnJ1bnRpbWUudjIuU25hcHNob3RXb3Jrc3BhY2VSZXF1ZXN0SAASQAoOc3luY193b3Jrc3BhY2UYDiABKAsyJi5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXF1ZXN0SAASQQoPc3RhcnRfYXV0b19zeW5jGA8gASgLMiYubm9tb3MucnVudGltZS52Mi5TdGFydEF1dG9TeW5jUmVxdWVzdEgAEj8KDnN0b3BfYXV0b19zeW5jGBAgASgLMiUubm9tb3MucnVudGltZS52Mi5TdG9wQXV0b1N5bmNSZXF1ZXN0SAASLwoFd2F0Y2gYESABKAsyHi5ub21vcy5ydW50aW1lLnYyLldhdGNoUmVxdWVzdEgAEjMKB3Vud2F0Y2gYEiABKAsyIC5ub21vcy5ydW50aW1lLnYyLlVud2F0Y2hSZXF1ZXN0SAASQAoOcHJlcGFyZV9kb21haW4YEyABKAsyJi5ub21vcy5ydW50aW1lLnYyLlByZXBhcmVEb21haW5SZXF1ZXN0SAASTQoVcmVzb2x2ZV9jdXN0b2R5X2JyZWFrGBQgASgLMiwubm9tb3MucnVudGltZS52Mi5SZXNvbHZlQ3VzdG9keUJyZWFrUmVxdWVzdEgAEjoKC2Nsb3NlX3JlYWxtGBUgASgLMiMubm9tb3MucnVudGltZS52Mi5DbG9zZVJlYWxtUmVxdWVzdEgAEjoKC2RlYWRfbGV0dGVyGBYgASgLMiMubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmVxdWVzdEgAEkAKDmhpc3RvcmljX3F1ZXJ5GBcgASgLMiYubm9tb3MucnVudGltZS52Mi5IaXN0b3JpY1F1ZXJ5UmVxdWVzdEgAEkIKD21vZGVsX2xpZmVjeWNsZRgYIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxMaWZlY3ljbGVSZXF1ZXN0SAASXQodZXN0YWJsaXNoX2FwcGxpY2F0aW9uX2N1c3RvZHkYGSABKAsyNC5ub21vcy5ydW50aW1lLnYyLkVzdGFibGlzaEFwcGxpY2F0aW9uQ3VzdG9keVJlcXVlc3RIAEIJCgdjb21tYW5kQggKBl90cmFjZSJTChFLZXJuZWxDYWxsUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEi0KB3JlcXVlc3QYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuQ2FsbFJlcXVlc3Qi8QIKIkVzdGFibGlzaEFwcGxpY2F0aW9uQ3VzdG9keVJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIOCgZwYXJlbnQYAiABKAkSEQoJcHJpbmNpcGFsGAMgASgJEg8KB3N1YmplY3QYBCABKAkSFQoNZGV2aWNlX3NlY3JldBgFIAEoDBIVCg1kZXZpY2VfcHVibGljGAYgASgMEhIKCmF1dGhfdG9rZW4YByABKAkSEAoIaWRfdG9rZW4YCCABKAkSFAoMdmVyaWZpZWRfdmlhGAkgASgJEg8KB2Jvcm5fYXQYCiABKAkSOwoTZW5yb2xsX2ZpcnN0X2RldmljZRgLIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5EaXJlY3RpdmVDYWxsEj0KFWJpcnRoX3JlY2VpdmluZ19ncm91cBgMIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5EaXJlY3RpdmVDYWxsEg8KB2NvbmZpcm0YDSABKAginwEKHUFwcGxpY2F0aW9uQ3VzdG9keUVzdGFibGlzaGVkEgwKBGhvbWUYASABKAkSFwoKY2hpbGRfaGVhZBgCIAEoCUgAiAEBEhAKCHZlcmlmaWVkGAMgASgIEh8KEnZlcmlmaWNhdGlvbl9lcnJvchgEIAEoCUgBiAEBQg0KC19jaGlsZF9oZWFkQhUKE192ZXJpZmljYXRpb25fZXJyb3IiZQoUSGlzdG9yaWNRdWVyeVJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIOCgZtb21lbnQYAiABKAkSLAoFcXVlcnkYAyABKAsyHS5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXF1ZXN0IrUJCg9SdW50aW1lUmVzcG9uc2USGAoQcHJvdG9jb2xfdmVyc2lvbhgBIAEoDRISCgpyZXF1ZXN0X2lkGAIgASgEEjMKB2ZhaWx1cmUYCiABKAsyIC5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVGYWlsdXJlSAASNAoLa2VybmVsX2NhbGwYCyABKAsyHS5ub21vcy5rZXJuZWwudjEuQ2FsbFJlc3BvbnNlSAASMAoJY29ubmVjdGVkGAwgASgLMhsubm9tb3MucnVudGltZS52Mi5Db25uZWN0ZWRIABI5Cg53b3Jrc3BhY2VfbGlzdBgNIAEoCzIfLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlTGlzdEgAEkEKEndvcmtzcGFjZV9zbmFwc2hvdBgOIAEoCzIjLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlU25hcHNob3RIABJBCg5zeW5jX3dvcmtzcGFjZRgPIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuU3luY1dvcmtzcGFjZVJlc3BvbnNlSAASPgoRYXV0b19zeW5jX3N0YXJ0ZWQYECABKAsyIS5ub21vcy5ydW50aW1lLnYyLkF1dG9TeW5jU3RhcnRlZEgAEj4KEWF1dG9fc3luY19zdG9wcGVkGBEgASgLMiEubm9tb3MucnVudGltZS52Mi5BdXRvU3luY1N0b3BwZWRIABI3Cg13YXRjaF9zdGFydGVkGBIgASgLMh4ubm9tb3MucnVudGltZS52Mi5XYXRjaFN0YXJ0ZWRIABI3Cg13YXRjaF9zdG9wcGVkGBMgASgLMh4ubm9tb3MucnVudGltZS52Mi5XYXRjaFN0b3BwZWRIABI7Cg9kb21haW5fcHJlcGFyZWQYFCABKAsyIC5ub21vcy5ydW50aW1lLnYyLkRvbWFpblByZXBhcmVkSAASSAoWY3VzdG9keV9icmVha19yZXNvbHZlZBgVIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrUmVzb2x2ZWRIABI1CgxyZWFsbV9jbG9zZWQYFiABKAsyHS5ub21vcy5ydW50aW1lLnYyLlJlYWxtQ2xvc2VkSAASMwoHYmxvY2tlZBgXIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUJsb2NrZWRIABJIChZyZW1vdGVfb2ZmZXJfYWRtaXNzaW9uGBggASgLMiYubm9tb3MucnVudGltZS52Mi5SZW1vdGVPZmZlckFkbWlzc2lvbkgAEjsKC2RlYWRfbGV0dGVyGBkgASgLMiQubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmVzcG9uc2VIABJDCg9tb2RlbF9saWZlY3ljbGUYGiABKAsyKC5ub21vcy5ydW50aW1lLnYyLk1vZGVsTGlmZWN5Y2xlUmVzcG9uc2VIABJaCh9hcHBsaWNhdGlvbl9jdXN0b2R5X2VzdGFibGlzaGVkGBsgASgLMi8ubm9tb3MucnVudGltZS52Mi5BcHBsaWNhdGlvbkN1c3RvZHlFc3RhYmxpc2hlZEgAQgkKB291dGNvbWUinwEKDlJ1bnRpbWVCbG9ja2VkEkEKCXdvcmtzcGFjZRgBIAEoCzIsLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlUmVzaWRlbmN5UmVxdWlyZWRIABJACghzaWJsaW5ncxgCIAEoCzIsLm5vbW9zLnJ1bnRpbWUudjIuU2libGluZ1Jlc2lkZW5jaWVzUmVxdWlyZWRIAEIICgZyZWFzb24iLwoaV29ya3NwYWNlUmVzaWRlbmN5UmVxdWlyZWQSEQoJd29ya3NwYWNlGAEgASgJIlUKGFNpYmxpbmdSZXNpZGVuY3lSZXF1aXJlZBIRCgl3b3Jrc3BhY2UYASABKAkSEwoLc291cmNlX2hlYWQYAiABKAkSEQoJZm9sZF9yb290GAMgASgJIl0KGlNpYmxpbmdSZXNpZGVuY2llc1JlcXVpcmVkEj8KC3Jlc2lkZW5jaWVzGAEgAygLMioubm9tb3MucnVudGltZS52Mi5TaWJsaW5nUmVzaWRlbmN5UmVxdWlyZWQihgIKFFJlbW90ZU9mZmVyQWRtaXNzaW9uEhEKCXdvcmtzcGFjZRgBIAEoCRIMCgRtYWluGAIgASgJEhgKC3NlYWxlZF9tYWluGAMgASgJSACIAQESLwoHdmVyZGljdBgEIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5PZmZlclJlc3BvbnNlEjMKDGJvcm5fY3VzdG9keRgFIAMoCzIdLm5vbW9zLnJ1bnRpbWUudjIuQm9ybkN1c3RvZHkSEwoLcmVzdWx0X3BhY2sYBiABKAwSGAoLcmVzdWx0X2Jhc2UYByABKAlIAYgBAUIOCgxfc2VhbGVkX21haW5CDgoMX3Jlc3VsdF9iYXNlIkoKC0Jvcm5DdXN0b2R5Ei0KBWNoaWxkGAEgASgLMh4ubm9tb3Mua2VybmVsLnYxLkJvcm5Xb3Jrc3BhY2USDAoEcGFjaxgCIAEoDCL5AQoYQ3VzdG9keU9mZmVyQmF0Y2hSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoCRI3CgZpbmxpbmUYAyABKAsyJS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbmxpbmVPZmZlcnNIABJGChFzZXNzaW9uX2NhbmRpZGF0ZRgEIAEoCzIpLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keVNlc3Npb25DYW5kaWRhdGVIABIWCgliYXNlX2hlYWQYBSABKAlIAYgBAUIICgZzb3VyY2VCDAoKX2Jhc2VfaGVhZCJOChJDdXN0b2R5SW50ZW50T2ZmZXISDwoHc2Vzc2lvbhgBIAEoCRISCgpjb21taXRfb2lkGAIgASgJEhMKC2NoYW5nZV91c2RhGAMgASgMIksKE0N1c3RvZHlJbmxpbmVPZmZlcnMSNAoGb2ZmZXJzGAEgAygLMiQubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW50ZW50T2ZmZXIiLAoXQ3VzdG9keVNlc3Npb25DYW5kaWRhdGUSEQoJcmVmZXJlbmNlGAEgASgJIvcBChlDdXN0b2R5T2ZmZXJCYXRjaFJlc3BvbnNlEhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoCRI3CglhZG1pc3Npb24YCiABKAsyIi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlBZG1pc3Npb25IABIzCgdmYWlsdXJlGAsgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAEjMKB2Jsb2NrZWQYDCABKAsyIC5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVCbG9ja2VkSABCCQoHb3V0Y29tZSLuAgoQQ3VzdG9keUFkbWlzc2lvbhIMCgRtYWluGAEgASgJEhgKC3NlYWxlZF9tYWluGAIgASgJSACIAQESOwoIc2Vzc2lvbnMYAyADKAsyKS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlTZXNzaW9uQWRtaXNzaW9uEjUKDmJpcnRoX291dGNvbWVzGAQgAygLMh0ubm9tb3Mua2VybmVsLnYxLkJpcnRoT3V0Y29tZRIzCgxib3JuX2N1c3RvZHkYBSADKAsyHS5ub21vcy5ydW50aW1lLnYyLkJvcm5DdXN0b2R5EhMKC3Jlc3VsdF9wYWNrGAYgASgMEhgKC3Jlc3VsdF9iYXNlGAcgASgJSAGIAQESOgoHdGltaW5ncxgIIAEoCzIpLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUFkbWlzc2lvblRpbWluZ3NCDgoMX3NlYWxlZF9tYWluQg4KDF9yZXN1bHRfYmFzZSJlChdDdXN0b2R5U2Vzc2lvbkFkbWlzc2lvbhIPCgdzZXNzaW9uGAEgASgJEjkKB2ludGVudHMYAiADKAsyKC5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbnRlbnRBZG1pc3Npb24ikAIKFkN1c3RvZHlJbnRlbnRBZG1pc3Npb24SEgoKY29tbWl0X29pZBgBIAEoCRIWCglpbnRlbnRfaWQYAiABKAlIAYgBARI7CghhZG1pdHRlZBgKIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudEFkbWl0dGVkSAASOQoHc2tpcHBlZBgLIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudFNraXBwZWRIABI5CgdyZWZ1c2VkGAwgASgLMiYubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW50ZW50UmVmdXNlZEgAQgkKB291dGNvbWVCDAoKX2ludGVudF9pZCKQAQoVQ3VzdG9keUludGVudEFkbWl0dGVkEgwKBGhlYWQYASABKAkSMwoHY3JlYXRlZBgCIAMoCzIiLm5vbW9zLmtlcm5lbC52MS5PZmZlckFnZ3JlZ2F0ZVJlZhI0CghhZmZlY3RlZBgDIAMoCzIiLm5vbW9zLmtlcm5lbC52MS5PZmZlckFnZ3JlZ2F0ZVJlZiIvChRDdXN0b2R5SW50ZW50U2tpcHBlZBIXCg9hbHJlYWR5X29uX21haW4YASABKAgiWgoUQ3VzdG9keUludGVudFJlZnVzZWQSDwoHbWVzc2FnZRgBIAEoCRIVCg1kZWFkX2xldHRlcmVkGAIgASgIEhEKBGhpbnQYAyABKAlIAIgBAUIHCgVfaGludCLtAQoXQ3VzdG9keUFkbWlzc2lvblRpbWluZ3MSFAoMdG90YWxfbWlsbGlzGAEgASgBEhMKC3NjYW5fbWlsbGlzGAIgASgBEhQKDGZldGNoX21pbGxpcxgDIAEoARITCgtzZWFsX21pbGxpcxgEIAEoARIYChBnYXRlX2ZvbGRfbWlsbGlzGAUgASgBEhQKDGludGVudF9jb3VudBgGIAEoDRIVCg1zZXNzaW9uX2NvdW50GAcgASgNEjUKBXNwYW5zGAggAygLMiYubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QWRtaXNzaW9uU3BhbiKXAQoUQ3VzdG9keUFkbWlzc2lvblNwYW4SCgoCaWQYASABKAkSDQoFdHJhY2sYAiABKAkSDAoEbmFtZRgDIAEoCRIMCgRraW5kGAQgASgJEg0KBWRlcHRoGAUgASgNEhsKE3N0YXJ0ZWRfdW5peF9taWxsaXMYBiABKAESHAoUZmluaXNoZWRfdW5peF9taWxsaXMYByABKAEiQgoMVHJhY2VDb250ZXh0EhAKCHRyYWNlX2lkGAEgASgMEg8KB3NwYW5faWQYAiABKAwSDwoHc2FtcGxlZBgDIAEoCCLpAQoOUnVudGltZUZhaWx1cmUSDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEhEKCWNvbXBvbmVudBgDIAEoCRIWCgl3b3Jrc3BhY2UYBCABKAlIAIgBARITCgZkb21haW4YBSABKAlIAYgBARIWCglkaXJlY3RpdmUYBiABKAlIAogBARI5CgphdHRyaWJ1dGVzGAcgAygLMiUubm9tb3MucnVudGltZS52Mi5EaWFnbm9zdGljQXR0cmlidXRlQgwKCl93b3Jrc3BhY2VCCQoHX2RvbWFpbkIMCgpfZGlyZWN0aXZlIqUBChNEaWFnbm9zdGljQXR0cmlidXRlEgwKBG5hbWUYASABKAkSFgoMc3RyaW5nX3ZhbHVlGAIgASgJSAASFwoNaW50ZWdlcl92YWx1ZRgDIAEoEkgAEhYKDGRvdWJsZV92YWx1ZRgEIAEoAUgAEhcKDWJvb2xlYW5fdmFsdWUYBSABKAhIABIVCgtieXRlc192YWx1ZRgGIAEoDEgAQgcKBXZhbHVlIs0CCg5Db25uZWN0UmVxdWVzdBIRCgl3b3Jrc3BhY2UYASABKAkSEQoJY2xpZW50X2lkGAIgASgJEhQKB3Nlc3Npb24YAyABKAlIAIgBARISCgVjbG91ZBgEIAEoCUgBiAEBEhIKCmF1dGhfdG9rZW4YBSABKAwSFQoNYXV0aG9yX3NlY3JldBgGIAEoDBIiChptYXhpbXVtX21vdW50ZWRfd29ya3NwYWNlcxgHIAEoDRIUCgxhbGxvd191bmJvcm4YCCABKAgSDwoHcmVjb3ZlchgJIAEoCBJCChRjdXN0b2R5X2JyZWFrX3BvbGljeRgKIAEoDjIkLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrUG9saWN5EhsKE2hhc19yZXN0b3JlX2N1c3RvZHkYCyABKAhCCgoIX3Nlc3Npb25CCAoGX2Nsb3VkIosBCglDb25uZWN0ZWQSEQoJd29ya3NwYWNlGAEgASgJEg8KB3Nlc3Npb24YAiABKAkSEwoLY2xvdWRfYm91bmQYAyABKAgSOAoIcmVjb3ZlcnkYBCABKAsyIS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlSZWNvdmVyeUgAiAEBQgsKCV9yZWNvdmVyeSJbCg9DdXN0b2R5UmVjb3ZlcnkSFQoNcHJldmlvdXNfaGVhZBgBIAEoCRIWCg5yZWNvdmVyZWRfaGVhZBgCIAEoCRIZChFyZWNvdmVyZWRfaW50ZW50cxgDIAEoBCIXChVMaXN0V29ya3NwYWNlc1JlcXVlc3QirQEKEFdvcmtzcGFjZVN1bW1hcnkSDwoHc2Vzc2lvbhgBIAEoCRIRCgl3b3Jrc3BhY2UYAiABKAkSNwoJcmVzaWRlbmN5GAMgASgOMiQubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VSZXNpZGVuY3kSPAoMc3luY19wb3N0dXJlGAQgASgOMiYubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTeW5jUG9zdHVyZSJHCg1Xb3Jrc3BhY2VMaXN0EjYKCndvcmtzcGFjZXMYASADKAsyIi5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZVN1bW1hcnkiTQoYU25hcHNob3RXb3Jrc3BhY2VSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSFAoHaWZfaGVhZBgCIAEoCUgAiAEBQgoKCF9pZl9oZWFkIlwKEVdvcmtzcGFjZVNuYXBzaG90EhEKCXdvcmtzcGFjZRgBIAEoCRIMCgRoZWFkGAIgASgJEhEKCXVuY2hhbmdlZBgDIAEoCBITCgtoYXNfY3VzdG9keRgEIAEoCCI2ChRTeW5jV29ya3NwYWNlUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEg0KBWFkbWl0GAIgASgIIrwFChVTeW5jV29ya3NwYWNlUmVzcG9uc2USEQoJd29ya3NwYWNlGAEgASgJEhoKDXByZXZpb3VzX2hlYWQYAiABKAlIAIgBARIZCgxjdXJyZW50X2hlYWQYAyABKAlIAYgBARIQCghhZG1pdHRlZBgEIAEoBBIPCgdyZWZ1c2VkGAUgASgEEhAKCGRlZmVycmVkGAYgASgEEhIKCmxvY2FsX29ubHkYByABKAgSDgoGcHVsbGVkGAggASgIEhAKCGRpdmVyZ2VkGAkgASgIEhoKEnJlY29ubmVjdF9yZXF1aXJlZBgKIAEoCBITCgtzdGlsbF9haGVhZBgLIAEoCBIPCgdvZmZsaW5lGAwgASgIEhMKC3B1c2hfZmFpbGVkGA0gASgIEh0KFWRpcmVjdF9vZmZlcl9kZWZlcnJlZBgOIAEoCBI1Cg5iaXJ0aF9vdXRjb21lcxgPIAMoCzIdLm5vbW9zLmtlcm5lbC52MS5CaXJ0aE91dGNvbWUSGwoTYWRtaXR0ZWRfaW50ZW50X2lkcxgQIAMoCRIcChRjb252ZXJnZWRfaW50ZW50X2lkcxgRIAMoCRJCCgpwdXNoX2Vycm9yGBIgASgLMikubm9tb3MucnVudGltZS52Mi5SdW50aW1lVHJhbnNwb3J0RmFpbHVyZUgCiAEBEkcKD2Rpc2NvdmVyeV9lcnJvchgTIAEoCzIpLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVRyYW5zcG9ydEZhaWx1cmVIA4gBARIzCgd0aW1pbmdzGBQgASgLMiIubm9tb3MucnVudGltZS52Mi5TeW5jUGhhc2VUaW1pbmdzQhAKDl9wcmV2aW91c19oZWFkQg8KDV9jdXJyZW50X2hlYWRCDQoLX3B1c2hfZXJyb3JCEgoQX2Rpc2NvdmVyeV9lcnJvciJdChdSdW50aW1lVHJhbnNwb3J0RmFpbHVyZRIQCghlbmRwb2ludBgBIAEoCRIOCgZzdGF0dXMYAiABKBESDwoHcmVmdXNlZBgDIAEoCBIPCgdtZXNzYWdlGAQgASgJIrEBChBTeW5jUGhhc2VUaW1pbmdzEhMKC3B1c2hfbWlsbGlzGAEgASgBEhQKDGFkbWl0X21pbGxpcxgCIAEoARIXCg9wcmVmZXRjaF9taWxsaXMYAyABKAESFwoPY29udmVyZ2VfbWlsbGlzGAQgASgBEhIKCnB1c2hfYnl0ZXMYBSABKAQSFQoNc2VydmVyX21pbGxpcxgGIAEoARIVCg1vZmZlcl9pbl9wdXNoGAcgASgIIt8BChRTdGFydEF1dG9TeW5jUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEhwKD2RlYm91bmNlX21pbGxpcxgCIAEoDUgAiAEBEhwKD2ZhbGxiYWNrX21pbGxpcxgDIAEoDUgBiAEBEhoKDXNpZ25hbF9taWxsaXMYBCABKA1IAogBARIWCglzaWduYWxfaWQYBSABKAlIA4gBAUISChBfZGVib3VuY2VfbWlsbGlzQhIKEF9mYWxsYmFja19taWxsaXNCEAoOX3NpZ25hbF9taWxsaXNCDAoKX3NpZ25hbF9pZCIiCg9BdXRvU3luY1N0YXJ0ZWQSDwoHc2Vzc2lvbhgBIAEoCSImChNTdG9wQXV0b1N5bmNSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkiIgoPQXV0b1N5bmNTdG9wcGVkEg8KB3Nlc3Npb24YASABKAkiqgEKDFdhdGNoUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEhcKD3N1YnNjcmlwdGlvbl9pZBgCIAEoCRIpCgRraW5kGAMgASgOMhsubm9tb3MucnVudGltZS52Mi5XYXRjaEtpbmQSLAoFcXVlcnkYBCABKAsyHS5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXF1ZXN0EhcKD2ludGVydmFsX21pbGxpcxgFIAEoDSInCgxXYXRjaFN0YXJ0ZWQSFwoPc3Vic2NyaXB0aW9uX2lkGAEgASgJIikKDlVud2F0Y2hSZXF1ZXN0EhcKD3N1YnNjcmlwdGlvbl9pZBgBIAEoCSInCgxXYXRjaFN0b3BwZWQSFwoPc3Vic2NyaXB0aW9uX2lkGAEgASgJInUKFFByZXBhcmVEb21haW5SZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDgoGZG9tYWluGAIgASgJEhYKDnBhY2thZ2Vfc2hhMjU2GAMgASgJEhYKCWRpcmVjdGl2ZRgEIAEoCUgAiAEBQgwKCl9kaXJlY3RpdmUiUgoORG9tYWluUHJlcGFyZWQSDgoGZG9tYWluGAEgASgJEhYKDnBhY2thZ2Vfc2hhMjU2GAIgASgJEhgKEGFscmVhZHlfcmVzaWRlbnQYAyABKAgi9gEKFU1vZGVsTGlmZWN5Y2xlUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEj0KBXN0YWdlGAogASgLMiwubm9tb3MucnVudGltZS52Mi5TdGFnZUdlbmVyYXRlZE1vZGVsUmVxdWVzdEgAEj0KBWFkb3B0GAsgASgLMiwubm9tb3MucnVudGltZS52Mi5BZG9wdEdlbmVyYXRlZE1vZGVsUmVxdWVzdEgAEkEKB3Jlc3RvcmUYDCABKAsyLi5ub21vcy5ydW50aW1lLnYyLlJlc3RvcmVHZW5lcmF0ZWRNb2RlbFJlcXVlc3RIAEILCglvcGVyYXRpb24ihgEKGlN0YWdlR2VuZXJhdGVkTW9kZWxSZXF1ZXN0Eg4KBmRvbWFpbhgBIAEoCRIWCg5jYW5kaWRhdGVfaGFzaBgCIAEoCRIQCghsYXdfdXNkehgDIAEoDBIbCg5zb3VyY2Vfc2Vzc2lvbhgEIAEoCUgAiAEBQhEKD19zb3VyY2Vfc2Vzc2lvbiJ6ChpBZG9wdEdlbmVyYXRlZE1vZGVsUmVxdWVzdBIOCgZkb21haW4YASABKAkSFgoOY2FuZGlkYXRlX2hhc2gYAiABKAkSHgoRYWNjZXB0YW5jZV9yZWFzb24YAyABKAlIAIgBAUIUChJfYWNjZXB0YW5jZV9yZWFzb24iegocUmVzdG9yZUdlbmVyYXRlZE1vZGVsUmVxdWVzdBIOCgZkb21haW4YASABKAkSFAoMY3VycmVudF9oYXNoGAIgASgJEh4KEWFjY2VwdGFuY2VfcmVhc29uGAMgASgJSACIAQFCFAoSX2FjY2VwdGFuY2VfcmVhc29uIpMBCg9Nb2RlbERpZmZlcmVuY2USMwoEa2luZBgBIAEoDjIlLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxEaWZmZXJlbmNlS2luZBIRCgRhcmVhGAIgASgJSACIAQESEwoGYWN0aW9uGAMgASgJSAGIAQESDwoHc3VtbWFyeRgEIAEoCUIHCgVfYXJlYUIJCgdfYWN0aW9uIqUBCgtNb2RlbFJldmlldxIXCg9jaGVja2VkX2FjdGlvbnMYASABKAQSGQoRY2FuZGlkYXRlX2FjdGlvbnMYAiABKAQSGQoMc2FtZV9vdXRjb21lGAMgASgISACIAQESNgoLZGlmZmVyZW5jZXMYBCADKAsyIS5ub21vcy5ydW50aW1lLnYyLk1vZGVsRGlmZmVyZW5jZUIPCg1fc2FtZV9vdXRjb21lIoUCChZNb2RlbExpZmVjeWNsZVJlc3BvbnNlEhAKCGFjY2VwdGVkGAEgASgIEjQKBXN0YWdlGAIgASgOMiUubm9tb3MucnVudGltZS52Mi5Nb2RlbExpZmVjeWNsZVN0YWdlEhQKB21lc3NhZ2UYAyABKAlIAIgBARIRCgRoZWFkGAQgASgJSAGIAQESFwoKcmVjZWlwdF9pZBgFIAEoCUgCiAEBEjIKBnJldmlldxgGIAEoCzIdLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxSZXZpZXdIA4gBAUIKCghfbWVzc2FnZUIHCgVfaGVhZEINCgtfcmVjZWlwdF9pZEIJCgdfcmV2aWV3ImcKGlJlc29sdmVDdXN0b2R5QnJlYWtSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSOAoIZGVjaXNpb24YAiABKA4yJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha0RlY2lzaW9uImEKFEN1c3RvZHlCcmVha1Jlc29sdmVkEg8KB3Nlc3Npb24YASABKAkSOAoIZGVjaXNpb24YAiABKA4yJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha0RlY2lzaW9uIhMKEUNsb3NlUmVhbG1SZXF1ZXN0Ig0KC1JlYWxtQ2xvc2VkIuUBChFEZWFkTGV0dGVyUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEjgKBGxpc3QYCiABKAsyKC5ub21vcy5ydW50aW1lLnYyLkxpc3REZWFkTGV0dGVyc1JlcXVlc3RIABI5CgVyZXRyeRgLIAEoCzIoLm5vbW9zLnJ1bnRpbWUudjIuUmV0cnlEZWFkTGV0dGVyUmVxdWVzdEgAEj0KB2Rpc2NhcmQYDCABKAsyKi5ub21vcy5ydW50aW1lLnYyLkRpc2NhcmREZWFkTGV0dGVyUmVxdWVzdEgAQgsKCW9wZXJhdGlvbiIYChZMaXN0RGVhZExldHRlcnNSZXF1ZXN0IisKFlJldHJ5RGVhZExldHRlclJlcXVlc3QSEQoJaW50ZW50X2lkGAEgASgJIi0KGERpc2NhcmREZWFkTGV0dGVyUmVxdWVzdBIRCglpbnRlbnRfaWQYASABKAkivQEKEkRlYWRMZXR0ZXJSZXNwb25zZRIwCgRsaXN0GAogASgLMiAubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyTGlzdEgAEjIKBXJldHJ5GAsgASgLMiEubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmV0cnlIABI2CgdkaXNjYXJkGAwgASgLMiMubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyRGlzY2FyZEgAQgkKB291dGNvbWUiRAoORGVhZExldHRlckxpc3QSMgoHZW50cmllcxgBIAMoCzIhLm5vbW9zLnJ1bnRpbWUudjIuRGVhZExldHRlckVudHJ5IrkBCg9EZWFkTGV0dGVyRW50cnkSDwoCaWQYASABKAlIAIgBARISCgpjb21taXRfb2lkGAIgASgJEg4KBnNvdXJjZRgDIAEoCRIPCgdtZXNzYWdlGAQgASgJEhMKBmRvbWFpbhgFIAEoCUgBiAEBEhYKCWRpcmVjdGl2ZRgGIAEoCUgCiAEBEhMKC3JlY29yZGVkX2F0GAcgASgJQgUKA19pZEIJCgdfZG9tYWluQgwKCl9kaXJlY3RpdmUieQoPRGVhZExldHRlclJldHJ5Eg8KB3JldHJpZWQYASABKAgSEQoEaGVhZBgCIAEoCUgAiAEBEhcKD2FscmVhZHlfb25fbWFpbhgDIAEoCBIUCgdtZXNzYWdlGAQgASgJSAGIAQFCBwoFX2hlYWRCCgoIX21lc3NhZ2UiJAoRRGVhZExldHRlckRpc2NhcmQSDwoHcmVtb3ZlZBgBIAEoBCLNBQoMUnVudGltZUV2ZW50EhAKCHNlcXVlbmNlGAEgASgEEhQKB3Nlc3Npb24YAiABKAlIAYgBARIvCgVyZWFkeRgKIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVJlYWR5SAASNwoNd2F0Y2hfY2hhbmdlZBgLIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuV2F0Y2hDaGFuZ2VkSAASOQoOc3luY19jb21wbGV0ZWQYDCABKAsyHy5ub21vcy5ydW50aW1lLnYyLlN5bmNDb21wbGV0ZWRIABI1CgxsaW5rX2NoYW5nZWQYDSABKAsyHS5ub21vcy5ydW50aW1lLnYyLkxpbmtDaGFuZ2VkSAASOQoOc2lnbmFsX2NoYW5nZWQYDiABKAsyHy5ub21vcy5ydW50aW1lLnYyLlNpZ25hbENoYW5nZWRIABI7Cg9jdXN0b2R5X2NoYW5nZWQYDyABKAsyIC5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlDaGFuZ2VkSAASQgoTbG9jYWxfd29ya19yZWplY3RlZBgQIAEoCzIjLm5vbW9zLnJ1bnRpbWUudjIuTG9jYWxXb3JrUmVqZWN0ZWRIABIzCgtsYXdfY2hhbmdlZBgRIAEoCzIcLm5vbW9zLnJ1bnRpbWUudjIuTGF3Q2hhbmdlZEgAEkMKD2tlcm5lbF9wcm9ncmVzcxgSIAEoCzIoLm5vbW9zLnJ1bnRpbWUudjIuS2VybmVsUHJvZ3Jlc3NPYnNlcnZlZEgAEi0KBHNwYW4YEyABKAsyHS5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVTcGFuSAASPwoRdHJhbnNmZXJfcHJvZ3Jlc3MYFCABKAsyIi5ub21vcy5ydW50aW1lLnYyLlRyYW5zZmVyUHJvZ3Jlc3NIAEIHCgVldmVudEIKCghfc2Vzc2lvbiI+CgxSdW50aW1lUmVhZHkSFwoPcnVudGltZV92ZXJzaW9uGAEgASgJEhUKDWtlcm5lbF9zaGEyNTYYAiABKAwigAEKDFdhdGNoQ2hhbmdlZBIXCg9zdWJzY3JpcHRpb25faWQYASABKAkSEwoLcmVzdWx0X3VzZGEYAiABKAwSNgoHZmFpbHVyZRgDIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUZhaWx1cmVIAIgBAUIKCghfZmFpbHVyZSKcAQoNU3luY0NvbXBsZXRlZBIOCgZyZWFzb24YASABKAkSNwoGcmVzdWx0GAIgASgLMicubm9tb3MucnVudGltZS52Mi5TeW5jV29ya3NwYWNlUmVzcG9uc2USNgoHZmFpbHVyZRgDIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUZhaWx1cmVIAIgBAUIKCghfZmFpbHVyZSI7CgtMaW5rQ2hhbmdlZBIsCgZzdGF0dXMYASABKA4yHC5ub21vcy5ydW50aW1lLnYyLkxpbmtTdGF0dXMiOAoNU2lnbmFsQ2hhbmdlZBIOCgZkb21haW4YASABKAkSFwoPcHJvamVjdGlvbl91c2RhGAIgASgMIvQBCg5DdXN0b2R5Q2hhbmdlZBIxCgRraW5kGAEgASgOMiMubm9tb3MucnVudGltZS52Mi5DdXN0b2R5Q2hhbmdlS2luZBI1Cg1jdXN0b2R5X2JyZWFrGAIgASgLMh4ubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QnJlYWsSFgoJb3BlcmF0aW9uGAMgASgJSACIAQESFQoIcmVjbG9uZWQYBCABKAhIAYgBARIbCg5wYXJrZWRfaW50ZW50cxgFIAEoBEgCiAEBQgwKCl9vcGVyYXRpb25CCwoJX3JlY2xvbmVkQhEKD19wYXJrZWRfaW50ZW50cyLhAQoRTG9jYWxXb3JrUmVqZWN0ZWQSEQoJd29ya3NwYWNlGAEgASgJEjYKB3JlZnVzZWQYAiADKAsyJS5ub21vcy5ydW50aW1lLnYyLlJlamVjdGVkTG9jYWxJbnRlbnQSDgoGcGFya2VkGAMgASgIEhUKCHJlc2V0X3RvGAQgASgJSACIAQESEQoJcmV0cnlhYmxlGAUgASgIEjoKBnNvdXJjZRgGIAEoDjIqLm5vbW9zLnJ1bnRpbWUudjIuTG9jYWxXb3JrUmVqZWN0aW9uU291cmNlQgsKCV9yZXNldF90byJjChNDdXN0b2R5U3VwZXJzZXNzaW9uEhoKDXN1cGVyc2VkZWRfYXQYASABKAlIAIgBARITCgZyZWFzb24YAiABKAlIAYgBAUIQCg5fc3VwZXJzZWRlZF9hdEIJCgdfcmVhc29uIrgCCgxDdXN0b2R5QnJlYWsSMAoEa2luZBgBIAEoDjIiLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrS2luZBIVCg1sb2NhbF9nZW5lc2lzGAIgASgJEhYKDnJlbW90ZV9nZW5lc2lzGAMgASgJEhoKEnJlbW90ZV9pbmNhcm5hdGlvbhgEIAEoCRJACgxzdXBlcnNlc3Npb24YBSABKAsyJS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlTdXBlcnNlc3Npb25IAIgBARIaChJsb2NhbF9vbmx5X2ludGVudHMYBiABKAQSIgoVbGFzdF9zeW5jZWRfYXRfbWlsbGlzGAcgASgESAGIAQFCDwoNX3N1cGVyc2Vzc2lvbkIYChZfbGFzdF9zeW5jZWRfYXRfbWlsbGlzIs0BChNSZWplY3RlZExvY2FsSW50ZW50EhYKCWludGVudF9pZBgBIAEoCUgAiAEBEhcKCmNvbW1pdF9vaWQYAiABKAlIAYgBARITCgZkb21haW4YAyABKAlIAogBARIWCglkaXJlY3RpdmUYBCABKAlIA4gBARIPCgdtZXNzYWdlGAUgASgJEhEKCXJldHJ5YWJsZRgGIAEoCEIMCgpfaW50ZW50X2lkQg0KC19jb21taXRfb2lkQgkKB19kb21haW5CDAoKX2RpcmVjdGl2ZSJQCgpMYXdDaGFuZ2VkEg4KBmRvbWFpbhgBIAEoCRIWCg5wYWNrYWdlX3NoYTI1NhgCIAEoCRIaChJjb21wYXRpYmlsaXR5X3VzZGEYAyABKAwi3QEKC1J1bnRpbWVTcGFuEhAKCHRyYWNlX2lkGAEgASgMEg8KB3NwYW5faWQYAiABKAwSGwoOcGFyZW50X3NwYW5faWQYAyABKAxIAIgBARIMCgRuYW1lGAQgASgJEhoKEnN0YXJ0ZWRfdW5peF9uYW5vcxgFIAEoBBIWCg5kdXJhdGlvbl9uYW5vcxgGIAEoBBI5CgphdHRyaWJ1dGVzGAcgAygLMiUubm9tb3MucnVudGltZS52Mi5EaWFnbm9zdGljQXR0cmlidXRlQhEKD19wYXJlbnRfc3Bhbl9pZCLqAQoWS2VybmVsUHJvZ3Jlc3NPYnNlcnZlZBI5CghzbmFwc2hvdBgBIAEoCzInLm5vbW9zLmtlcm5lbC52MS5LZXJuZWxQcm9ncmVzc1NuYXBzaG90EiQKHGhvc3Rfb2JzZXJ2ZWRfZWxhcHNlZF9taWNyb3MYAiABKAQSKgoiaG9zdF9vYnNlcnZlZF9waGFzZV9lbGFwc2VkX21pY3JvcxgDIAEoBBIeChZwcm9jZXNzX3Jlc2lkZW50X2J5dGVzGAQgASgEEiMKG3Byb2Nlc3NfcGVha19yZXNpZGVudF9ieXRlcxgFIAEoBCKCAQoQVHJhbnNmZXJQcm9ncmVzcxIWCg5yZWNlaXZlZF9ieXRlcxgBIAEoBBIYCgt0b3RhbF9ieXRlcxgCIAEoBEgAiAEBEiwKBGtpbmQYAyABKA4yHi5ub21vcy5ydW50aW1lLnYyLlRyYW5zZmVyS2luZEIOCgxfdG90YWxfYnl0ZXMqmQEKEkN1c3RvZHlCcmVha1BvbGljeRIkCiBDVVNUT0RZX0JSRUFLX1BPTElDWV9VTlNQRUNJRklFRBAAEhwKGENVU1RPRFlfQlJFQUtfUE9MSUNZX0FTSxABEh4KGkNVU1RPRFlfQlJFQUtfUE9MSUNZX0FET1BUEAISHwobQ1VTVE9EWV9CUkVBS19QT0xJQ1lfUkVKRUNUEAMqoAEKEldvcmtzcGFjZVJlc2lkZW5jeRIjCh9XT1JLU1BBQ0VfUkVTSURFTkNZX1VOU1BFQ0lGSUVEEAASHwobV09SS1NQQUNFX1JFU0lERU5DWV9NT1VOVEVEEAESHgoaV09SS1NQQUNFX1JFU0lERU5DWV9QQVJLRUQQAhIkCiBXT1JLU1BBQ0VfUkVTSURFTkNZX0NVU1RPRFlfT05MWRADKo0BChRXb3Jrc3BhY2VTeW5jUG9zdHVyZRImCiJXT1JLU1BBQ0VfU1lOQ19QT1NUVVJFX1VOU1BFQ0lGSUVEEAASJQohV09SS1NQQUNFX1NZTkNfUE9TVFVSRV9MT0NBTF9PTkxZEAESJgoiV09SS1NQQUNFX1NZTkNfUE9TVFVSRV9DTE9VRF9CT1VORBACKqgBCglXYXRjaEtpbmQSGgoWV0FUQ0hfS0lORF9VTlNQRUNJRklFRBAAEhQKEFdBVENIX0tJTkRfUVVFUlkQARIUChBXQVRDSF9LSU5EX0JZX0lEEAISFgoSV0FUQ0hfS0lORF9TUEFUSUFMEAMSFwoTV0FUQ0hfS0lORF9BQ1RJVklUWRAEIgQIBRAFKhxXQVRDSF9LSU5EX1BFTkRJTkdfQ09ORkxJQ1RTKqQDChNNb2RlbExpZmVjeWNsZVN0YWdlEiUKIU1PREVMX0xJRkVDWUNMRV9TVEFHRV9VTlNQRUNJRklFRBAAEisKJ01PREVMX0xJRkVDWUNMRV9TVEFHRV9JREVOVElUWV9SRVFVSVJFRBABEioKJk1PREVMX0xJRkVDWUNMRV9TVEFHRV9TVEFHSU5HX1JFUVVJUkVEEAISIwofTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1BSRUZMSUdIVBADEi0KKU1PREVMX0xJRkVDWUNMRV9TVEFHRV9BQ0NFUFRBTkNFX1JFUVVJUkVEEAQSIwofTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0FETUlTU0lPThAFEiEKHU1PREVMX0xJRkVDWUNMRV9TVEFHRV9QRU5ESU5HEAYSIgoeTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1BST01PVEVEEAcSIgoeTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1JFU1RPUkVEEAgSKQolTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0FMUkVBRFlfQ1VSUkVOVBAJKqQBChNNb2RlbERpZmZlcmVuY2VLaW5kEiUKIU1PREVMX0RJRkZFUkVOQ0VfS0lORF9VTlNQRUNJRklFRBAAEh8KG01PREVMX0RJRkZFUkVOQ0VfS0lORF9SVUxFUxABEiEKHU1PREVMX0RJRkZFUkVOQ0VfS0lORF9PVVRDT01FEAISIgoeTU9ERUxfRElGRkVSRU5DRV9LSU5EX0VWSURFTkNFEAMqgwEKFEN1c3RvZHlCcmVha0RlY2lzaW9uEiYKIkNVU1RPRFlfQlJFQUtfREVDSVNJT05fVU5TUEVDSUZJRUQQABIgChxDVVNUT0RZX0JSRUFLX0RFQ0lTSU9OX0FET1BUEAESIQodQ1VTVE9EWV9CUkVBS19ERUNJU0lPTl9SRUpFQ1QQAipXCgpMaW5rU3RhdHVzEhsKF0xJTktfU1RBVFVTX1VOU1BFQ0lGSUVEEAASFAoQTElOS19TVEFUVVNfT1BFThABEhYKEkxJTktfU1RBVFVTX0NMT1NFRBACKuIBChFDdXN0b2R5Q2hhbmdlS2luZBIjCh9DVVNUT0RZX0NIQU5HRV9LSU5EX1VOU1BFQ0lGSUVEEAASIAocQ1VTVE9EWV9DSEFOR0VfS0lORF9ERVRFQ1RFRBABEiAKHENVU1RPRFlfQ0hBTkdFX0tJTkRfUkVKRUNURUQQAhIgChxDVVNUT0RZX0NIQU5HRV9LSU5EX0FET1BUSU5HEAMSJQohQ1VTVE9EWV9DSEFOR0VfS0lORF9BRE9QVF9SRUZVU0VEEAQSGwoXQ1VTVE9EWV9DSEFOR0VfS0lORF9BU0sQBSp6ChBDdXN0b2R5QnJlYWtLaW5kEiIKHkNVU1RPRFlfQlJFQUtfS0lORF9VTlNQRUNJRklFRBAAEiEKHUNVU1RPRFlfQlJFQUtfS0lORF9TVVBFUlNFREVEEAESHwobQ1VTVE9EWV9CUkVBS19LSU5EX0RJVkVSR0VEEAIqmAEKGExvY2FsV29ya1JlamVjdGlvblNvdXJjZRIrCidMT0NBTF9XT1JLX1JFSkVDVElPTl9TT1VSQ0VfVU5TUEVDSUZJRUQQABIpCiVMT0NBTF9XT1JLX1JFSkVDVElPTl9TT1VSQ0VfQURNSVNTSU9OEAESJAogTE9DQUxfV09SS19SRUpFQ1RJT05fU09VUkNFX1NZTkMQAip2CgxUcmFuc2ZlcktpbmQSHQoZVFJBTlNGRVJfS0lORF9VTlNQRUNJRklFRBAAEhcKE1RSQU5TRkVSX0tJTkRfREVMVEEQARIWChJUUkFOU0ZFUl9LSU5EX0ZVTEwQAhIWChJUUkFOU0ZFUl9LSU5EX1BVU0gQAzJkChNOb21vc1J1bnRpbWVTZXJ2aWNlEk0KBkludm9rZRIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVJlcXVlc3QaIS5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVSZXNwb25zZWIGcHJvdG8z", [file_nomos_kernel_v1_kernel, file_nomos_kernel_v1_progress]);
4136
- var RuntimeBlockedSchema = /* @__PURE__ */ messageDesc3(file_nomos_runtime_v2_runtime, 6);
4137
- var WorkspaceResidencyRequiredSchema = /* @__PURE__ */ messageDesc3(file_nomos_runtime_v2_runtime, 7);
4138
- var SiblingResidencyRequiredSchema = /* @__PURE__ */ messageDesc3(file_nomos_runtime_v2_runtime, 8);
4139
- var SiblingResidenciesRequiredSchema = /* @__PURE__ */ messageDesc3(file_nomos_runtime_v2_runtime, 9);
4140
- var BornCustodySchema = /* @__PURE__ */ messageDesc3(file_nomos_runtime_v2_runtime, 11);
4141
- var CustodyOfferBatchRequestSchema = /* @__PURE__ */ messageDesc3(file_nomos_runtime_v2_runtime, 12);
4142
- var CustodyOfferBatchResponseSchema = /* @__PURE__ */ messageDesc3(file_nomos_runtime_v2_runtime, 16);
4143
- var CustodyAdmissionSchema = /* @__PURE__ */ messageDesc3(file_nomos_runtime_v2_runtime, 17);
4144
- var CustodySessionAdmissionSchema = /* @__PURE__ */ messageDesc3(file_nomos_runtime_v2_runtime, 18);
4145
- var CustodyIntentAdmissionSchema = /* @__PURE__ */ messageDesc3(file_nomos_runtime_v2_runtime, 19);
4146
- var CustodyIntentAdmittedSchema = /* @__PURE__ */ messageDesc3(file_nomos_runtime_v2_runtime, 20);
4147
- var CustodyIntentSkippedSchema = /* @__PURE__ */ messageDesc3(file_nomos_runtime_v2_runtime, 21);
4148
- var CustodyIntentRefusedSchema = /* @__PURE__ */ messageDesc3(file_nomos_runtime_v2_runtime, 22);
4149
- var CustodyAdmissionTimingsSchema = /* @__PURE__ */ messageDesc3(file_nomos_runtime_v2_runtime, 23);
4150
- var CustodyAdmissionSpanSchema = /* @__PURE__ */ messageDesc3(file_nomos_runtime_v2_runtime, 24);
4151
- var RuntimeFailureSchema = /* @__PURE__ */ messageDesc3(file_nomos_runtime_v2_runtime, 26);
4455
+ var file_nomos_runtime_v2_runtime = /* @__PURE__ */ fileDesc4("Ch5ub21vcy9ydW50aW1lL3YyL3J1bnRpbWUucHJvdG8SEG5vbW9zLnJ1bnRpbWUudjIitwoKDlJ1bnRpbWVSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoBBIyCgV0cmFjZRgDIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuVHJhY2VDb250ZXh0SAGIAQESOgoLa2VybmVsX2NhbGwYCiABKAsyIy5ub21vcy5ydW50aW1lLnYyLktlcm5lbENhbGxSZXF1ZXN0SAASMwoHY29ubmVjdBgLIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuQ29ubmVjdFJlcXVlc3RIABJCCg9saXN0X3dvcmtzcGFjZXMYDCABKAsyJy5ub21vcy5ydW50aW1lLnYyLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdEgAEkgKEnNuYXBzaG90X3dvcmtzcGFjZRgNIAEoCzIqLm5vbW9zLnJ1bnRpbWUudjIuU25hcHNob3RXb3Jrc3BhY2VSZXF1ZXN0SAASQAoOc3luY193b3Jrc3BhY2UYDiABKAsyJi5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXF1ZXN0SAASQQoPc3RhcnRfYXV0b19zeW5jGA8gASgLMiYubm9tb3MucnVudGltZS52Mi5TdGFydEF1dG9TeW5jUmVxdWVzdEgAEj8KDnN0b3BfYXV0b19zeW5jGBAgASgLMiUubm9tb3MucnVudGltZS52Mi5TdG9wQXV0b1N5bmNSZXF1ZXN0SAASLwoFd2F0Y2gYESABKAsyHi5ub21vcy5ydW50aW1lLnYyLldhdGNoUmVxdWVzdEgAEjMKB3Vud2F0Y2gYEiABKAsyIC5ub21vcy5ydW50aW1lLnYyLlVud2F0Y2hSZXF1ZXN0SAASQAoOcHJlcGFyZV9kb21haW4YEyABKAsyJi5ub21vcy5ydW50aW1lLnYyLlByZXBhcmVEb21haW5SZXF1ZXN0SAASTQoVcmVzb2x2ZV9jdXN0b2R5X2JyZWFrGBQgASgLMiwubm9tb3MucnVudGltZS52Mi5SZXNvbHZlQ3VzdG9keUJyZWFrUmVxdWVzdEgAEjoKC2Nsb3NlX3JlYWxtGBUgASgLMiMubm9tb3MucnVudGltZS52Mi5DbG9zZVJlYWxtUmVxdWVzdEgAEjoKC2RlYWRfbGV0dGVyGBYgASgLMiMubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmVxdWVzdEgAEkAKDmhpc3RvcmljX3F1ZXJ5GBcgASgLMiYubm9tb3MucnVudGltZS52Mi5IaXN0b3JpY1F1ZXJ5UmVxdWVzdEgAEkIKD21vZGVsX2xpZmVjeWNsZRgYIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxMaWZlY3ljbGVSZXF1ZXN0SAASXQodZXN0YWJsaXNoX2FwcGxpY2F0aW9uX2N1c3RvZHkYGSABKAsyNC5ub21vcy5ydW50aW1lLnYyLkVzdGFibGlzaEFwcGxpY2F0aW9uQ3VzdG9keVJlcXVlc3RIABJEChB3b3Jrc3BhY2Vfc3RhdHVzGBogASgLMigubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTdGF0dXNSZXF1ZXN0SAASTwoWcmVtb3RlX2dlbmVyYXRlZF9vZmZlchgbIAEoCzItLm5vbW9zLnJ1bnRpbWUudjIuUmVtb3RlR2VuZXJhdGVkT2ZmZXJSZXF1ZXN0SABCCQoHY29tbWFuZEIICgZfdHJhY2UiUwoRS2VybmVsQ2FsbFJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRItCgdyZXF1ZXN0GAIgASgLMhwubm9tb3Mua2VybmVsLnYxLkNhbGxSZXF1ZXN0IvECCiJFc3RhYmxpc2hBcHBsaWNhdGlvbkN1c3RvZHlSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDgoGcGFyZW50GAIgASgJEhEKCXByaW5jaXBhbBgDIAEoCRIPCgdzdWJqZWN0GAQgASgJEhUKDWRldmljZV9zZWNyZXQYBSABKAwSFQoNZGV2aWNlX3B1YmxpYxgGIAEoDBISCgphdXRoX3Rva2VuGAcgASgJEhAKCGlkX3Rva2VuGAggASgJEhQKDHZlcmlmaWVkX3ZpYRgJIAEoCRIPCgdib3JuX2F0GAogASgJEjsKE2Vucm9sbF9maXJzdF9kZXZpY2UYCyABKAsyHi5ub21vcy5rZXJuZWwudjEuRGlyZWN0aXZlQ2FsbBI9ChViaXJ0aF9yZWNlaXZpbmdfZ3JvdXAYDCABKAsyHi5ub21vcy5rZXJuZWwudjEuRGlyZWN0aXZlQ2FsbBIPCgdjb25maXJtGA0gASgIIp8BCh1BcHBsaWNhdGlvbkN1c3RvZHlFc3RhYmxpc2hlZBIMCgRob21lGAEgASgJEhcKCmNoaWxkX2hlYWQYAiABKAlIAIgBARIQCgh2ZXJpZmllZBgDIAEoCBIfChJ2ZXJpZmljYXRpb25fZXJyb3IYBCABKAlIAYgBAUINCgtfY2hpbGRfaGVhZEIVChNfdmVyaWZpY2F0aW9uX2Vycm9yImUKFEhpc3RvcmljUXVlcnlSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDgoGbW9tZW50GAIgASgJEiwKBXF1ZXJ5GAMgASgLMh0ubm9tb3Mua2VybmVsLnYxLlF1ZXJ5UmVxdWVzdCLGCgoPUnVudGltZVJlc3BvbnNlEhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoBBIzCgdmYWlsdXJlGAogASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAEjQKC2tlcm5lbF9jYWxsGAsgASgLMh0ubm9tb3Mua2VybmVsLnYxLkNhbGxSZXNwb25zZUgAEjAKCWNvbm5lY3RlZBgMIAEoCzIbLm5vbW9zLnJ1bnRpbWUudjIuQ29ubmVjdGVkSAASOQoOd29ya3NwYWNlX2xpc3QYDSABKAsyHy5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZUxpc3RIABJBChJ3b3Jrc3BhY2Vfc25hcHNob3QYDiABKAsyIy5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZVNuYXBzaG90SAASQQoOc3luY193b3Jrc3BhY2UYDyABKAsyJy5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXNwb25zZUgAEj4KEWF1dG9fc3luY19zdGFydGVkGBAgASgLMiEubm9tb3MucnVudGltZS52Mi5BdXRvU3luY1N0YXJ0ZWRIABI+ChFhdXRvX3N5bmNfc3RvcHBlZBgRIAEoCzIhLm5vbW9zLnJ1bnRpbWUudjIuQXV0b1N5bmNTdG9wcGVkSAASNwoNd2F0Y2hfc3RhcnRlZBgSIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuV2F0Y2hTdGFydGVkSAASNwoNd2F0Y2hfc3RvcHBlZBgTIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuV2F0Y2hTdG9wcGVkSAASOwoPZG9tYWluX3ByZXBhcmVkGBQgASgLMiAubm9tb3MucnVudGltZS52Mi5Eb21haW5QcmVwYXJlZEgAEkgKFmN1c3RvZHlfYnJlYWtfcmVzb2x2ZWQYFSABKAsyJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha1Jlc29sdmVkSAASNQoMcmVhbG1fY2xvc2VkGBYgASgLMh0ubm9tb3MucnVudGltZS52Mi5SZWFsbUNsb3NlZEgAEjMKB2Jsb2NrZWQYFyABKAsyIC5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVCbG9ja2VkSAASSAoWcmVtb3RlX29mZmVyX2FkbWlzc2lvbhgYIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuUmVtb3RlT2ZmZXJBZG1pc3Npb25IABI7CgtkZWFkX2xldHRlchgZIAEoCzIkLm5vbW9zLnJ1bnRpbWUudjIuRGVhZExldHRlclJlc3BvbnNlSAASQwoPbW9kZWxfbGlmZWN5Y2xlGBogASgLMigubm9tb3MucnVudGltZS52Mi5Nb2RlbExpZmVjeWNsZVJlc3BvbnNlSAASWgofYXBwbGljYXRpb25fY3VzdG9keV9lc3RhYmxpc2hlZBgbIAEoCzIvLm5vbW9zLnJ1bnRpbWUudjIuQXBwbGljYXRpb25DdXN0b2R5RXN0YWJsaXNoZWRIABI9ChB3b3Jrc3BhY2Vfc3RhdHVzGBwgASgLMiEubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTdGF0dXNIABJQChZyZW1vdGVfZ2VuZXJhdGVkX29mZmVyGB0gASgLMi4ubm9tb3MucnVudGltZS52Mi5SZW1vdGVHZW5lcmF0ZWRPZmZlckFjY2VwdGVkSABCCQoHb3V0Y29tZSK3AQobUmVtb3RlR2VuZXJhdGVkT2ZmZXJSZXF1ZXN0EhYKDnNvdXJjZV9zZXNzaW9uGAEgASgJEhgKEHRhcmdldF93b3Jrc3BhY2UYAiABKAkSDQoFYWN0b3IYAyABKAkSFQoNYXV0aG9yX3NlY3JldBgEIAEoDBISCgphdXRoX3Rva2VuGAUgASgMEiwKBGNhbGwYBiABKAsyHi5ub21vcy5rZXJuZWwudjEuRGlyZWN0aXZlQ2FsbCI/ChxSZW1vdGVHZW5lcmF0ZWRPZmZlckFjY2VwdGVkEhEKCXdvcmtzcGFjZRgBIAEoCRIMCgRoZWFkGAIgASgJIp8BCg5SdW50aW1lQmxvY2tlZBJBCgl3b3Jrc3BhY2UYASABKAsyLC5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZVJlc2lkZW5jeVJlcXVpcmVkSAASQAoIc2libGluZ3MYAiABKAsyLC5ub21vcy5ydW50aW1lLnYyLlNpYmxpbmdSZXNpZGVuY2llc1JlcXVpcmVkSABCCAoGcmVhc29uIi8KGldvcmtzcGFjZVJlc2lkZW5jeVJlcXVpcmVkEhEKCXdvcmtzcGFjZRgBIAEoCSJVChhTaWJsaW5nUmVzaWRlbmN5UmVxdWlyZWQSEQoJd29ya3NwYWNlGAEgASgJEhMKC3NvdXJjZV9oZWFkGAIgASgJEhEKCWZvbGRfcm9vdBgDIAEoCSJdChpTaWJsaW5nUmVzaWRlbmNpZXNSZXF1aXJlZBI/CgtyZXNpZGVuY2llcxgBIAMoCzIqLm5vbW9zLnJ1bnRpbWUudjIuU2libGluZ1Jlc2lkZW5jeVJlcXVpcmVkIoYCChRSZW1vdGVPZmZlckFkbWlzc2lvbhIRCgl3b3Jrc3BhY2UYASABKAkSDAoEbWFpbhgCIAEoCRIYCgtzZWFsZWRfbWFpbhgDIAEoCUgAiAEBEi8KB3ZlcmRpY3QYBCABKAsyHi5ub21vcy5rZXJuZWwudjEuT2ZmZXJSZXNwb25zZRIzCgxib3JuX2N1c3RvZHkYBSADKAsyHS5ub21vcy5ydW50aW1lLnYyLkJvcm5DdXN0b2R5EhMKC3Jlc3VsdF9wYWNrGAYgASgMEhgKC3Jlc3VsdF9iYXNlGAcgASgJSAGIAQFCDgoMX3NlYWxlZF9tYWluQg4KDF9yZXN1bHRfYmFzZSJKCgtCb3JuQ3VzdG9keRItCgVjaGlsZBgBIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5Cb3JuV29ya3NwYWNlEgwKBHBhY2sYAiABKAwi+QEKGEN1c3RvZHlPZmZlckJhdGNoUmVxdWVzdBIYChBwcm90b2NvbF92ZXJzaW9uGAEgASgNEhIKCnJlcXVlc3RfaWQYAiABKAkSNwoGaW5saW5lGAMgASgLMiUubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW5saW5lT2ZmZXJzSAASRgoRc2Vzc2lvbl9jYW5kaWRhdGUYBCABKAsyKS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlTZXNzaW9uQ2FuZGlkYXRlSAASFgoJYmFzZV9oZWFkGAUgASgJSAGIAQFCCAoGc291cmNlQgwKCl9iYXNlX2hlYWQiTgoSQ3VzdG9keUludGVudE9mZmVyEg8KB3Nlc3Npb24YASABKAkSEgoKY29tbWl0X29pZBgCIAEoCRITCgtjaGFuZ2VfdXNkYRgDIAEoDCJLChNDdXN0b2R5SW5saW5lT2ZmZXJzEjQKBm9mZmVycxgBIAMoCzIkLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudE9mZmVyIiwKF0N1c3RvZHlTZXNzaW9uQ2FuZGlkYXRlEhEKCXJlZmVyZW5jZRgBIAEoCSL3AQoZQ3VzdG9keU9mZmVyQmF0Y2hSZXNwb25zZRIYChBwcm90b2NvbF92ZXJzaW9uGAEgASgNEhIKCnJlcXVlc3RfaWQYAiABKAkSNwoJYWRtaXNzaW9uGAogASgLMiIubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QWRtaXNzaW9uSAASMwoHZmFpbHVyZRgLIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUZhaWx1cmVIABIzCgdibG9ja2VkGAwgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lQmxvY2tlZEgAQgkKB291dGNvbWUi7gIKEEN1c3RvZHlBZG1pc3Npb24SDAoEbWFpbhgBIAEoCRIYCgtzZWFsZWRfbWFpbhgCIAEoCUgAiAEBEjsKCHNlc3Npb25zGAMgAygLMikubm9tb3MucnVudGltZS52Mi5DdXN0b2R5U2Vzc2lvbkFkbWlzc2lvbhI1Cg5iaXJ0aF9vdXRjb21lcxgEIAMoCzIdLm5vbW9zLmtlcm5lbC52MS5CaXJ0aE91dGNvbWUSMwoMYm9ybl9jdXN0b2R5GAUgAygLMh0ubm9tb3MucnVudGltZS52Mi5Cb3JuQ3VzdG9keRITCgtyZXN1bHRfcGFjaxgGIAEoDBIYCgtyZXN1bHRfYmFzZRgHIAEoCUgBiAEBEjoKB3RpbWluZ3MYCCABKAsyKS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlBZG1pc3Npb25UaW1pbmdzQg4KDF9zZWFsZWRfbWFpbkIOCgxfcmVzdWx0X2Jhc2UiZQoXQ3VzdG9keVNlc3Npb25BZG1pc3Npb24SDwoHc2Vzc2lvbhgBIAEoCRI5CgdpbnRlbnRzGAIgAygLMigubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW50ZW50QWRtaXNzaW9uIpACChZDdXN0b2R5SW50ZW50QWRtaXNzaW9uEhIKCmNvbW1pdF9vaWQYASABKAkSFgoJaW50ZW50X2lkGAIgASgJSAGIAQESOwoIYWRtaXR0ZWQYCiABKAsyJy5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbnRlbnRBZG1pdHRlZEgAEjkKB3NraXBwZWQYCyABKAsyJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbnRlbnRTa2lwcGVkSAASOQoHcmVmdXNlZBgMIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudFJlZnVzZWRIAEIJCgdvdXRjb21lQgwKCl9pbnRlbnRfaWQikAEKFUN1c3RvZHlJbnRlbnRBZG1pdHRlZBIMCgRoZWFkGAEgASgJEjMKB2NyZWF0ZWQYAiADKAsyIi5ub21vcy5rZXJuZWwudjEuT2ZmZXJBZ2dyZWdhdGVSZWYSNAoIYWZmZWN0ZWQYAyADKAsyIi5ub21vcy5rZXJuZWwudjEuT2ZmZXJBZ2dyZWdhdGVSZWYiLwoUQ3VzdG9keUludGVudFNraXBwZWQSFwoPYWxyZWFkeV9vbl9tYWluGAEgASgIIloKFEN1c3RvZHlJbnRlbnRSZWZ1c2VkEg8KB21lc3NhZ2UYASABKAkSFQoNZGVhZF9sZXR0ZXJlZBgCIAEoCBIRCgRoaW50GAMgASgJSACIAQFCBwoFX2hpbnQi7QEKF0N1c3RvZHlBZG1pc3Npb25UaW1pbmdzEhQKDHRvdGFsX21pbGxpcxgBIAEoARITCgtzY2FuX21pbGxpcxgCIAEoARIUCgxmZXRjaF9taWxsaXMYAyABKAESEwoLc2VhbF9taWxsaXMYBCABKAESGAoQZ2F0ZV9mb2xkX21pbGxpcxgFIAEoARIUCgxpbnRlbnRfY291bnQYBiABKA0SFQoNc2Vzc2lvbl9jb3VudBgHIAEoDRI1CgVzcGFucxgIIAMoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUFkbWlzc2lvblNwYW4ilwEKFEN1c3RvZHlBZG1pc3Npb25TcGFuEgoKAmlkGAEgASgJEg0KBXRyYWNrGAIgASgJEgwKBG5hbWUYAyABKAkSDAoEa2luZBgEIAEoCRINCgVkZXB0aBgFIAEoDRIbChNzdGFydGVkX3VuaXhfbWlsbGlzGAYgASgBEhwKFGZpbmlzaGVkX3VuaXhfbWlsbGlzGAcgASgBIkIKDFRyYWNlQ29udGV4dBIQCgh0cmFjZV9pZBgBIAEoDBIPCgdzcGFuX2lkGAIgASgMEg8KB3NhbXBsZWQYAyABKAgi6QEKDlJ1bnRpbWVGYWlsdXJlEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCRIRCgljb21wb25lbnQYAyABKAkSFgoJd29ya3NwYWNlGAQgASgJSACIAQESEwoGZG9tYWluGAUgASgJSAGIAQESFgoJZGlyZWN0aXZlGAYgASgJSAKIAQESOQoKYXR0cmlidXRlcxgHIAMoCzIlLm5vbW9zLnJ1bnRpbWUudjIuRGlhZ25vc3RpY0F0dHJpYnV0ZUIMCgpfd29ya3NwYWNlQgkKB19kb21haW5CDAoKX2RpcmVjdGl2ZSKlAQoTRGlhZ25vc3RpY0F0dHJpYnV0ZRIMCgRuYW1lGAEgASgJEhYKDHN0cmluZ192YWx1ZRgCIAEoCUgAEhcKDWludGVnZXJfdmFsdWUYAyABKBJIABIWCgxkb3VibGVfdmFsdWUYBCABKAFIABIXCg1ib29sZWFuX3ZhbHVlGAUgASgISAASFQoLYnl0ZXNfdmFsdWUYBiABKAxIAEIHCgV2YWx1ZSLNAgoOQ29ubmVjdFJlcXVlc3QSEQoJd29ya3NwYWNlGAEgASgJEhEKCWNsaWVudF9pZBgCIAEoCRIUCgdzZXNzaW9uGAMgASgJSACIAQESEgoFY2xvdWQYBCABKAlIAYgBARISCgphdXRoX3Rva2VuGAUgASgMEhUKDWF1dGhvcl9zZWNyZXQYBiABKAwSIgoabWF4aW11bV9tb3VudGVkX3dvcmtzcGFjZXMYByABKA0SFAoMYWxsb3dfdW5ib3JuGAggASgIEg8KB3JlY292ZXIYCSABKAgSQgoUY3VzdG9keV9icmVha19wb2xpY3kYCiABKA4yJC5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha1BvbGljeRIbChNoYXNfcmVzdG9yZV9jdXN0b2R5GAsgASgIQgoKCF9zZXNzaW9uQggKBl9jbG91ZCKLAQoJQ29ubmVjdGVkEhEKCXdvcmtzcGFjZRgBIAEoCRIPCgdzZXNzaW9uGAIgASgJEhMKC2Nsb3VkX2JvdW5kGAMgASgIEjgKCHJlY292ZXJ5GAQgASgLMiEubm9tb3MucnVudGltZS52Mi5DdXN0b2R5UmVjb3ZlcnlIAIgBAUILCglfcmVjb3ZlcnkiWwoPQ3VzdG9keVJlY292ZXJ5EhUKDXByZXZpb3VzX2hlYWQYASABKAkSFgoOcmVjb3ZlcmVkX2hlYWQYAiABKAkSGQoRcmVjb3ZlcmVkX2ludGVudHMYAyABKAQiFwoVTGlzdFdvcmtzcGFjZXNSZXF1ZXN0Iq0BChBXb3Jrc3BhY2VTdW1tYXJ5Eg8KB3Nlc3Npb24YASABKAkSEQoJd29ya3NwYWNlGAIgASgJEjcKCXJlc2lkZW5jeRgDIAEoDjIkLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlUmVzaWRlbmN5EjwKDHN5bmNfcG9zdHVyZRgEIAEoDjImLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlU3luY1Bvc3R1cmUiRwoNV29ya3NwYWNlTGlzdBI2Cgp3b3Jrc3BhY2VzGAEgAygLMiIubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTdW1tYXJ5IikKFldvcmtzcGFjZVN0YXR1c1JlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCSJACg9Xb3Jrc3BhY2VTdGF0dXMSEQoJd29ya3NwYWNlGAEgASgJEhEKBGhlYWQYAiABKAlIAIgBAUIHCgVfaGVhZCJNChhTbmFwc2hvdFdvcmtzcGFjZVJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIUCgdpZl9oZWFkGAIgASgJSACIAQFCCgoIX2lmX2hlYWQiXAoRV29ya3NwYWNlU25hcHNob3QSEQoJd29ya3NwYWNlGAEgASgJEgwKBGhlYWQYAiABKAkSEQoJdW5jaGFuZ2VkGAMgASgIEhMKC2hhc19jdXN0b2R5GAQgASgIIjYKFFN5bmNXb3Jrc3BhY2VSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDQoFYWRtaXQYAiABKAgivAUKFVN5bmNXb3Jrc3BhY2VSZXNwb25zZRIRCgl3b3Jrc3BhY2UYASABKAkSGgoNcHJldmlvdXNfaGVhZBgCIAEoCUgAiAEBEhkKDGN1cnJlbnRfaGVhZBgDIAEoCUgBiAEBEhAKCGFkbWl0dGVkGAQgASgEEg8KB3JlZnVzZWQYBSABKAQSEAoIZGVmZXJyZWQYBiABKAQSEgoKbG9jYWxfb25seRgHIAEoCBIOCgZwdWxsZWQYCCABKAgSEAoIZGl2ZXJnZWQYCSABKAgSGgoScmVjb25uZWN0X3JlcXVpcmVkGAogASgIEhMKC3N0aWxsX2FoZWFkGAsgASgIEg8KB29mZmxpbmUYDCABKAgSEwoLcHVzaF9mYWlsZWQYDSABKAgSHQoVZGlyZWN0X29mZmVyX2RlZmVycmVkGA4gASgIEjUKDmJpcnRoX291dGNvbWVzGA8gAygLMh0ubm9tb3Mua2VybmVsLnYxLkJpcnRoT3V0Y29tZRIbChNhZG1pdHRlZF9pbnRlbnRfaWRzGBAgAygJEhwKFGNvbnZlcmdlZF9pbnRlbnRfaWRzGBEgAygJEkIKCnB1c2hfZXJyb3IYEiABKAsyKS5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVUcmFuc3BvcnRGYWlsdXJlSAKIAQESRwoPZGlzY292ZXJ5X2Vycm9yGBMgASgLMikubm9tb3MucnVudGltZS52Mi5SdW50aW1lVHJhbnNwb3J0RmFpbHVyZUgDiAEBEjMKB3RpbWluZ3MYFCABKAsyIi5ub21vcy5ydW50aW1lLnYyLlN5bmNQaGFzZVRpbWluZ3NCEAoOX3ByZXZpb3VzX2hlYWRCDwoNX2N1cnJlbnRfaGVhZEINCgtfcHVzaF9lcnJvckISChBfZGlzY292ZXJ5X2Vycm9yIl0KF1J1bnRpbWVUcmFuc3BvcnRGYWlsdXJlEhAKCGVuZHBvaW50GAEgASgJEg4KBnN0YXR1cxgCIAEoERIPCgdyZWZ1c2VkGAMgASgIEg8KB21lc3NhZ2UYBCABKAkisQEKEFN5bmNQaGFzZVRpbWluZ3MSEwoLcHVzaF9taWxsaXMYASABKAESFAoMYWRtaXRfbWlsbGlzGAIgASgBEhcKD3ByZWZldGNoX21pbGxpcxgDIAEoARIXCg9jb252ZXJnZV9taWxsaXMYBCABKAESEgoKcHVzaF9ieXRlcxgFIAEoBBIVCg1zZXJ2ZXJfbWlsbGlzGAYgASgBEhUKDW9mZmVyX2luX3B1c2gYByABKAgi3wEKFFN0YXJ0QXV0b1N5bmNSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSHAoPZGVib3VuY2VfbWlsbGlzGAIgASgNSACIAQESHAoPZmFsbGJhY2tfbWlsbGlzGAMgASgNSAGIAQESGgoNc2lnbmFsX21pbGxpcxgEIAEoDUgCiAEBEhYKCXNpZ25hbF9pZBgFIAEoCUgDiAEBQhIKEF9kZWJvdW5jZV9taWxsaXNCEgoQX2ZhbGxiYWNrX21pbGxpc0IQCg5fc2lnbmFsX21pbGxpc0IMCgpfc2lnbmFsX2lkIiIKD0F1dG9TeW5jU3RhcnRlZBIPCgdzZXNzaW9uGAEgASgJIiYKE1N0b3BBdXRvU3luY1JlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCSIiCg9BdXRvU3luY1N0b3BwZWQSDwoHc2Vzc2lvbhgBIAEoCSKqAQoMV2F0Y2hSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSFwoPc3Vic2NyaXB0aW9uX2lkGAIgASgJEikKBGtpbmQYAyABKA4yGy5ub21vcy5ydW50aW1lLnYyLldhdGNoS2luZBIsCgVxdWVyeRgEIAEoCzIdLm5vbW9zLmtlcm5lbC52MS5RdWVyeVJlcXVlc3QSFwoPaW50ZXJ2YWxfbWlsbGlzGAUgASgNIicKDFdhdGNoU3RhcnRlZBIXCg9zdWJzY3JpcHRpb25faWQYASABKAkiKQoOVW53YXRjaFJlcXVlc3QSFwoPc3Vic2NyaXB0aW9uX2lkGAEgASgJIicKDFdhdGNoU3RvcHBlZBIXCg9zdWJzY3JpcHRpb25faWQYASABKAkidQoUUHJlcGFyZURvbWFpblJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIOCgZkb21haW4YAiABKAkSFgoOcGFja2FnZV9zaGEyNTYYAyABKAkSFgoJZGlyZWN0aXZlGAQgASgJSACIAQFCDAoKX2RpcmVjdGl2ZSJSCg5Eb21haW5QcmVwYXJlZBIOCgZkb21haW4YASABKAkSFgoOcGFja2FnZV9zaGEyNTYYAiABKAkSGAoQYWxyZWFkeV9yZXNpZGVudBgDIAEoCCL2AQoVTW9kZWxMaWZlY3ljbGVSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSPQoFc3RhZ2UYCiABKAsyLC5ub21vcy5ydW50aW1lLnYyLlN0YWdlR2VuZXJhdGVkTW9kZWxSZXF1ZXN0SAASPQoFYWRvcHQYCyABKAsyLC5ub21vcy5ydW50aW1lLnYyLkFkb3B0R2VuZXJhdGVkTW9kZWxSZXF1ZXN0SAASQQoHcmVzdG9yZRgMIAEoCzIuLm5vbW9zLnJ1bnRpbWUudjIuUmVzdG9yZUdlbmVyYXRlZE1vZGVsUmVxdWVzdEgAQgsKCW9wZXJhdGlvbiKGAQoaU3RhZ2VHZW5lcmF0ZWRNb2RlbFJlcXVlc3QSDgoGZG9tYWluGAEgASgJEhYKDmNhbmRpZGF0ZV9oYXNoGAIgASgJEhAKCGxhd191c2R6GAMgASgMEhsKDnNvdXJjZV9zZXNzaW9uGAQgASgJSACIAQFCEQoPX3NvdXJjZV9zZXNzaW9uInoKGkFkb3B0R2VuZXJhdGVkTW9kZWxSZXF1ZXN0Eg4KBmRvbWFpbhgBIAEoCRIWCg5jYW5kaWRhdGVfaGFzaBgCIAEoCRIeChFhY2NlcHRhbmNlX3JlYXNvbhgDIAEoCUgAiAEBQhQKEl9hY2NlcHRhbmNlX3JlYXNvbiJ6ChxSZXN0b3JlR2VuZXJhdGVkTW9kZWxSZXF1ZXN0Eg4KBmRvbWFpbhgBIAEoCRIUCgxjdXJyZW50X2hhc2gYAiABKAkSHgoRYWNjZXB0YW5jZV9yZWFzb24YAyABKAlIAIgBAUIUChJfYWNjZXB0YW5jZV9yZWFzb24ikwEKD01vZGVsRGlmZmVyZW5jZRIzCgRraW5kGAEgASgOMiUubm9tb3MucnVudGltZS52Mi5Nb2RlbERpZmZlcmVuY2VLaW5kEhEKBGFyZWEYAiABKAlIAIgBARITCgZhY3Rpb24YAyABKAlIAYgBARIPCgdzdW1tYXJ5GAQgASgJQgcKBV9hcmVhQgkKB19hY3Rpb24ipQEKC01vZGVsUmV2aWV3EhcKD2NoZWNrZWRfYWN0aW9ucxgBIAEoBBIZChFjYW5kaWRhdGVfYWN0aW9ucxgCIAEoBBIZCgxzYW1lX291dGNvbWUYAyABKAhIAIgBARI2CgtkaWZmZXJlbmNlcxgEIAMoCzIhLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxEaWZmZXJlbmNlQg8KDV9zYW1lX291dGNvbWUihQIKFk1vZGVsTGlmZWN5Y2xlUmVzcG9uc2USEAoIYWNjZXB0ZWQYASABKAgSNAoFc3RhZ2UYAiABKA4yJS5ub21vcy5ydW50aW1lLnYyLk1vZGVsTGlmZWN5Y2xlU3RhZ2USFAoHbWVzc2FnZRgDIAEoCUgAiAEBEhEKBGhlYWQYBCABKAlIAYgBARIXCgpyZWNlaXB0X2lkGAUgASgJSAKIAQESMgoGcmV2aWV3GAYgASgLMh0ubm9tb3MucnVudGltZS52Mi5Nb2RlbFJldmlld0gDiAEBQgoKCF9tZXNzYWdlQgcKBV9oZWFkQg0KC19yZWNlaXB0X2lkQgkKB19yZXZpZXciZwoaUmVzb2x2ZUN1c3RvZHlCcmVha1JlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRI4CghkZWNpc2lvbhgCIAEoDjImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrRGVjaXNpb24iYQoUQ3VzdG9keUJyZWFrUmVzb2x2ZWQSDwoHc2Vzc2lvbhgBIAEoCRI4CghkZWNpc2lvbhgCIAEoDjImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrRGVjaXNpb24iEwoRQ2xvc2VSZWFsbVJlcXVlc3QiDQoLUmVhbG1DbG9zZWQi5QEKEURlYWRMZXR0ZXJSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSOAoEbGlzdBgKIAEoCzIoLm5vbW9zLnJ1bnRpbWUudjIuTGlzdERlYWRMZXR0ZXJzUmVxdWVzdEgAEjkKBXJldHJ5GAsgASgLMigubm9tb3MucnVudGltZS52Mi5SZXRyeURlYWRMZXR0ZXJSZXF1ZXN0SAASPQoHZGlzY2FyZBgMIAEoCzIqLm5vbW9zLnJ1bnRpbWUudjIuRGlzY2FyZERlYWRMZXR0ZXJSZXF1ZXN0SABCCwoJb3BlcmF0aW9uIhgKFkxpc3REZWFkTGV0dGVyc1JlcXVlc3QiKwoWUmV0cnlEZWFkTGV0dGVyUmVxdWVzdBIRCglpbnRlbnRfaWQYASABKAkiLQoYRGlzY2FyZERlYWRMZXR0ZXJSZXF1ZXN0EhEKCWludGVudF9pZBgBIAEoCSK9AQoSRGVhZExldHRlclJlc3BvbnNlEjAKBGxpc3QYCiABKAsyIC5ub21vcy5ydW50aW1lLnYyLkRlYWRMZXR0ZXJMaXN0SAASMgoFcmV0cnkYCyABKAsyIS5ub21vcy5ydW50aW1lLnYyLkRlYWRMZXR0ZXJSZXRyeUgAEjYKB2Rpc2NhcmQYDCABKAsyIy5ub21vcy5ydW50aW1lLnYyLkRlYWRMZXR0ZXJEaXNjYXJkSABCCQoHb3V0Y29tZSJECg5EZWFkTGV0dGVyTGlzdBIyCgdlbnRyaWVzGAEgAygLMiEubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyRW50cnkiuQEKD0RlYWRMZXR0ZXJFbnRyeRIPCgJpZBgBIAEoCUgAiAEBEhIKCmNvbW1pdF9vaWQYAiABKAkSDgoGc291cmNlGAMgASgJEg8KB21lc3NhZ2UYBCABKAkSEwoGZG9tYWluGAUgASgJSAGIAQESFgoJZGlyZWN0aXZlGAYgASgJSAKIAQESEwoLcmVjb3JkZWRfYXQYByABKAlCBQoDX2lkQgkKB19kb21haW5CDAoKX2RpcmVjdGl2ZSJ5Cg9EZWFkTGV0dGVyUmV0cnkSDwoHcmV0cmllZBgBIAEoCBIRCgRoZWFkGAIgASgJSACIAQESFwoPYWxyZWFkeV9vbl9tYWluGAMgASgIEhQKB21lc3NhZ2UYBCABKAlIAYgBAUIHCgVfaGVhZEIKCghfbWVzc2FnZSIkChFEZWFkTGV0dGVyRGlzY2FyZBIPCgdyZW1vdmVkGAEgASgEIs0FCgxSdW50aW1lRXZlbnQSEAoIc2VxdWVuY2UYASABKAQSFAoHc2Vzc2lvbhgCIAEoCUgBiAEBEi8KBXJlYWR5GAogASgLMh4ubm9tb3MucnVudGltZS52Mi5SdW50aW1lUmVhZHlIABI3Cg13YXRjaF9jaGFuZ2VkGAsgASgLMh4ubm9tb3MucnVudGltZS52Mi5XYXRjaENoYW5nZWRIABI5Cg5zeW5jX2NvbXBsZXRlZBgMIAEoCzIfLm5vbW9zLnJ1bnRpbWUudjIuU3luY0NvbXBsZXRlZEgAEjUKDGxpbmtfY2hhbmdlZBgNIAEoCzIdLm5vbW9zLnJ1bnRpbWUudjIuTGlua0NoYW5nZWRIABI5Cg5zaWduYWxfY2hhbmdlZBgOIAEoCzIfLm5vbW9zLnJ1bnRpbWUudjIuU2lnbmFsQ2hhbmdlZEgAEjsKD2N1c3RvZHlfY2hhbmdlZBgPIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUNoYW5nZWRIABJCChNsb2NhbF93b3JrX3JlamVjdGVkGBAgASgLMiMubm9tb3MucnVudGltZS52Mi5Mb2NhbFdvcmtSZWplY3RlZEgAEjMKC2xhd19jaGFuZ2VkGBEgASgLMhwubm9tb3MucnVudGltZS52Mi5MYXdDaGFuZ2VkSAASQwoPa2VybmVsX3Byb2dyZXNzGBIgASgLMigubm9tb3MucnVudGltZS52Mi5LZXJuZWxQcm9ncmVzc09ic2VydmVkSAASLQoEc3BhbhgTIAEoCzIdLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVNwYW5IABI/ChF0cmFuc2Zlcl9wcm9ncmVzcxgUIAEoCzIiLm5vbW9zLnJ1bnRpbWUudjIuVHJhbnNmZXJQcm9ncmVzc0gAQgcKBWV2ZW50QgoKCF9zZXNzaW9uIj4KDFJ1bnRpbWVSZWFkeRIXCg9ydW50aW1lX3ZlcnNpb24YASABKAkSFQoNa2VybmVsX3NoYTI1NhgCIAEoDCKAAQoMV2F0Y2hDaGFuZ2VkEhcKD3N1YnNjcmlwdGlvbl9pZBgBIAEoCRITCgtyZXN1bHRfdXNkYRgCIAEoDBI2CgdmYWlsdXJlGAMgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAiAEBQgoKCF9mYWlsdXJlIpwBCg1TeW5jQ29tcGxldGVkEg4KBnJlYXNvbhgBIAEoCRI3CgZyZXN1bHQYAiABKAsyJy5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXNwb25zZRI2CgdmYWlsdXJlGAMgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAiAEBQgoKCF9mYWlsdXJlIjsKC0xpbmtDaGFuZ2VkEiwKBnN0YXR1cxgBIAEoDjIcLm5vbW9zLnJ1bnRpbWUudjIuTGlua1N0YXR1cyI4Cg1TaWduYWxDaGFuZ2VkEg4KBmRvbWFpbhgBIAEoCRIXCg9wcm9qZWN0aW9uX3VzZGEYAiABKAwi9AEKDkN1c3RvZHlDaGFuZ2VkEjEKBGtpbmQYASABKA4yIy5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlDaGFuZ2VLaW5kEjUKDWN1c3RvZHlfYnJlYWsYAiABKAsyHi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVhaxIWCglvcGVyYXRpb24YAyABKAlIAIgBARIVCghyZWNsb25lZBgEIAEoCEgBiAEBEhsKDnBhcmtlZF9pbnRlbnRzGAUgASgESAKIAQFCDAoKX29wZXJhdGlvbkILCglfcmVjbG9uZWRCEQoPX3BhcmtlZF9pbnRlbnRzIuEBChFMb2NhbFdvcmtSZWplY3RlZBIRCgl3b3Jrc3BhY2UYASABKAkSNgoHcmVmdXNlZBgCIAMoCzIlLm5vbW9zLnJ1bnRpbWUudjIuUmVqZWN0ZWRMb2NhbEludGVudBIOCgZwYXJrZWQYAyABKAgSFQoIcmVzZXRfdG8YBCABKAlIAIgBARIRCglyZXRyeWFibGUYBSABKAgSOgoGc291cmNlGAYgASgOMioubm9tb3MucnVudGltZS52Mi5Mb2NhbFdvcmtSZWplY3Rpb25Tb3VyY2VCCwoJX3Jlc2V0X3RvImMKE0N1c3RvZHlTdXBlcnNlc3Npb24SGgoNc3VwZXJzZWRlZF9hdBgBIAEoCUgAiAEBEhMKBnJlYXNvbhgCIAEoCUgBiAEBQhAKDl9zdXBlcnNlZGVkX2F0QgkKB19yZWFzb24iuAIKDEN1c3RvZHlCcmVhaxIwCgRraW5kGAEgASgOMiIubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QnJlYWtLaW5kEhUKDWxvY2FsX2dlbmVzaXMYAiABKAkSFgoOcmVtb3RlX2dlbmVzaXMYAyABKAkSGgoScmVtb3RlX2luY2FybmF0aW9uGAQgASgJEkAKDHN1cGVyc2Vzc2lvbhgFIAEoCzIlLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keVN1cGVyc2Vzc2lvbkgAiAEBEhoKEmxvY2FsX29ubHlfaW50ZW50cxgGIAEoBBIiChVsYXN0X3N5bmNlZF9hdF9taWxsaXMYByABKARIAYgBAUIPCg1fc3VwZXJzZXNzaW9uQhgKFl9sYXN0X3N5bmNlZF9hdF9taWxsaXMizQEKE1JlamVjdGVkTG9jYWxJbnRlbnQSFgoJaW50ZW50X2lkGAEgASgJSACIAQESFwoKY29tbWl0X29pZBgCIAEoCUgBiAEBEhMKBmRvbWFpbhgDIAEoCUgCiAEBEhYKCWRpcmVjdGl2ZRgEIAEoCUgDiAEBEg8KB21lc3NhZ2UYBSABKAkSEQoJcmV0cnlhYmxlGAYgASgIQgwKCl9pbnRlbnRfaWRCDQoLX2NvbW1pdF9vaWRCCQoHX2RvbWFpbkIMCgpfZGlyZWN0aXZlIlAKCkxhd0NoYW5nZWQSDgoGZG9tYWluGAEgASgJEhYKDnBhY2thZ2Vfc2hhMjU2GAIgASgJEhoKEmNvbXBhdGliaWxpdHlfdXNkYRgDIAEoDCLdAQoLUnVudGltZVNwYW4SEAoIdHJhY2VfaWQYASABKAwSDwoHc3Bhbl9pZBgCIAEoDBIbCg5wYXJlbnRfc3Bhbl9pZBgDIAEoDEgAiAEBEgwKBG5hbWUYBCABKAkSGgoSc3RhcnRlZF91bml4X25hbm9zGAUgASgEEhYKDmR1cmF0aW9uX25hbm9zGAYgASgEEjkKCmF0dHJpYnV0ZXMYByADKAsyJS5ub21vcy5ydW50aW1lLnYyLkRpYWdub3N0aWNBdHRyaWJ1dGVCEQoPX3BhcmVudF9zcGFuX2lkIuoBChZLZXJuZWxQcm9ncmVzc09ic2VydmVkEjkKCHNuYXBzaG90GAEgASgLMicubm9tb3Mua2VybmVsLnYxLktlcm5lbFByb2dyZXNzU25hcHNob3QSJAocaG9zdF9vYnNlcnZlZF9lbGFwc2VkX21pY3JvcxgCIAEoBBIqCiJob3N0X29ic2VydmVkX3BoYXNlX2VsYXBzZWRfbWljcm9zGAMgASgEEh4KFnByb2Nlc3NfcmVzaWRlbnRfYnl0ZXMYBCABKAQSIwobcHJvY2Vzc19wZWFrX3Jlc2lkZW50X2J5dGVzGAUgASgEIoIBChBUcmFuc2ZlclByb2dyZXNzEhYKDnJlY2VpdmVkX2J5dGVzGAEgASgEEhgKC3RvdGFsX2J5dGVzGAIgASgESACIAQESLAoEa2luZBgDIAEoDjIeLm5vbW9zLnJ1bnRpbWUudjIuVHJhbnNmZXJLaW5kQg4KDF90b3RhbF9ieXRlcyqZAQoSQ3VzdG9keUJyZWFrUG9saWN5EiQKIENVU1RPRFlfQlJFQUtfUE9MSUNZX1VOU1BFQ0lGSUVEEAASHAoYQ1VTVE9EWV9CUkVBS19QT0xJQ1lfQVNLEAESHgoaQ1VTVE9EWV9CUkVBS19QT0xJQ1lfQURPUFQQAhIfChtDVVNUT0RZX0JSRUFLX1BPTElDWV9SRUpFQ1QQAyqgAQoSV29ya3NwYWNlUmVzaWRlbmN5EiMKH1dPUktTUEFDRV9SRVNJREVOQ1lfVU5TUEVDSUZJRUQQABIfChtXT1JLU1BBQ0VfUkVTSURFTkNZX01PVU5URUQQARIeChpXT1JLU1BBQ0VfUkVTSURFTkNZX1BBUktFRBACEiQKIFdPUktTUEFDRV9SRVNJREVOQ1lfQ1VTVE9EWV9PTkxZEAMqjQEKFFdvcmtzcGFjZVN5bmNQb3N0dXJlEiYKIldPUktTUEFDRV9TWU5DX1BPU1RVUkVfVU5TUEVDSUZJRUQQABIlCiFXT1JLU1BBQ0VfU1lOQ19QT1NUVVJFX0xPQ0FMX09OTFkQARImCiJXT1JLU1BBQ0VfU1lOQ19QT1NUVVJFX0NMT1VEX0JPVU5EEAIqqAEKCVdhdGNoS2luZBIaChZXQVRDSF9LSU5EX1VOU1BFQ0lGSUVEEAASFAoQV0FUQ0hfS0lORF9RVUVSWRABEhQKEFdBVENIX0tJTkRfQllfSUQQAhIWChJXQVRDSF9LSU5EX1NQQVRJQUwQAxIXChNXQVRDSF9LSU5EX0FDVElWSVRZEAQiBAgFEAUqHFdBVENIX0tJTkRfUEVORElOR19DT05GTElDVFMqpAMKE01vZGVsTGlmZWN5Y2xlU3RhZ2USJQohTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1VOU1BFQ0lGSUVEEAASKwonTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0lERU5USVRZX1JFUVVJUkVEEAESKgomTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1NUQUdJTkdfUkVRVUlSRUQQAhIjCh9NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfUFJFRkxJR0hUEAMSLQopTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0FDQ0VQVEFOQ0VfUkVRVUlSRUQQBBIjCh9NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfQURNSVNTSU9OEAUSIQodTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1BFTkRJTkcQBhIiCh5NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfUFJPTU9URUQQBxIiCh5NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfUkVTVE9SRUQQCBIpCiVNT0RFTF9MSUZFQ1lDTEVfU1RBR0VfQUxSRUFEWV9DVVJSRU5UEAkqpAEKE01vZGVsRGlmZmVyZW5jZUtpbmQSJQohTU9ERUxfRElGRkVSRU5DRV9LSU5EX1VOU1BFQ0lGSUVEEAASHwobTU9ERUxfRElGRkVSRU5DRV9LSU5EX1JVTEVTEAESIQodTU9ERUxfRElGRkVSRU5DRV9LSU5EX09VVENPTUUQAhIiCh5NT0RFTF9ESUZGRVJFTkNFX0tJTkRfRVZJREVOQ0UQAyqDAQoUQ3VzdG9keUJyZWFrRGVjaXNpb24SJgoiQ1VTVE9EWV9CUkVBS19ERUNJU0lPTl9VTlNQRUNJRklFRBAAEiAKHENVU1RPRFlfQlJFQUtfREVDSVNJT05fQURPUFQQARIhCh1DVVNUT0RZX0JSRUFLX0RFQ0lTSU9OX1JFSkVDVBACKlcKCkxpbmtTdGF0dXMSGwoXTElOS19TVEFUVVNfVU5TUEVDSUZJRUQQABIUChBMSU5LX1NUQVRVU19PUEVOEAESFgoSTElOS19TVEFUVVNfQ0xPU0VEEAIq4gEKEUN1c3RvZHlDaGFuZ2VLaW5kEiMKH0NVU1RPRFlfQ0hBTkdFX0tJTkRfVU5TUEVDSUZJRUQQABIgChxDVVNUT0RZX0NIQU5HRV9LSU5EX0RFVEVDVEVEEAESIAocQ1VTVE9EWV9DSEFOR0VfS0lORF9SRUpFQ1RFRBACEiAKHENVU1RPRFlfQ0hBTkdFX0tJTkRfQURPUFRJTkcQAxIlCiFDVVNUT0RZX0NIQU5HRV9LSU5EX0FET1BUX1JFRlVTRUQQBBIbChdDVVNUT0RZX0NIQU5HRV9LSU5EX0FTSxAFKnoKEEN1c3RvZHlCcmVha0tpbmQSIgoeQ1VTVE9EWV9CUkVBS19LSU5EX1VOU1BFQ0lGSUVEEAASIQodQ1VTVE9EWV9CUkVBS19LSU5EX1NVUEVSU0VERUQQARIfChtDVVNUT0RZX0JSRUFLX0tJTkRfRElWRVJHRUQQAiqYAQoYTG9jYWxXb3JrUmVqZWN0aW9uU291cmNlEisKJ0xPQ0FMX1dPUktfUkVKRUNUSU9OX1NPVVJDRV9VTlNQRUNJRklFRBAAEikKJUxPQ0FMX1dPUktfUkVKRUNUSU9OX1NPVVJDRV9BRE1JU1NJT04QARIkCiBMT0NBTF9XT1JLX1JFSkVDVElPTl9TT1VSQ0VfU1lOQxACKnYKDFRyYW5zZmVyS2luZBIdChlUUkFOU0ZFUl9LSU5EX1VOU1BFQ0lGSUVEEAASFwoTVFJBTlNGRVJfS0lORF9ERUxUQRABEhYKElRSQU5TRkVSX0tJTkRfRlVMTBACEhYKElRSQU5TRkVSX0tJTkRfUFVTSBADMmQKE05vbW9zUnVudGltZVNlcnZpY2USTQoGSW52b2tlEiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lUmVxdWVzdBohLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVJlc3BvbnNlYgZwcm90bzM", [file_nomos_kernel_v1_kernel, file_nomos_kernel_v1_progress]);
4456
+ var RuntimeRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 0);
4457
+ var RuntimeResponseSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 5);
4458
+ var RuntimeBlockedSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 8);
4459
+ var WorkspaceResidencyRequiredSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 9);
4460
+ var SiblingResidencyRequiredSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 10);
4461
+ var SiblingResidenciesRequiredSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 11);
4462
+ var BornCustodySchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 13);
4463
+ var CustodyOfferBatchRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 14);
4464
+ var CustodyOfferBatchResponseSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 18);
4465
+ var CustodyAdmissionSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 19);
4466
+ var CustodySessionAdmissionSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 20);
4467
+ var CustodyIntentAdmissionSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 21);
4468
+ var CustodyIntentAdmittedSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 22);
4469
+ var CustodyIntentSkippedSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 23);
4470
+ var CustodyIntentRefusedSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 24);
4471
+ var CustodyAdmissionTimingsSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 25);
4472
+ var CustodyAdmissionSpanSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 26);
4473
+ var RuntimeFailureSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 28);
4152
4474
 
4153
4475
  // ../adapter/custody-offer-transport.ts
4154
4476
  function record(value) {
@@ -4470,38 +4792,6 @@ function requireSingleOsgiResource(xml) {
4470
4792
  return resources[0];
4471
4793
  }
4472
4794
 
4473
- // ../adapter/pack_auth_contract.ts
4474
- var HDR = Object.freeze({
4475
- /** The verified PROOF: an IdP access token (JWT), kernel-verified against the workspace's AuthProvider. */
4476
- AUTH: "x-nomos-auth",
4477
- /** The bare CLAIM (transitional / unverified fallback when no token is presented). */
4478
- PRINCIPAL: "x-nomos-principal"
4479
- });
4480
- function bulkReadForbidden(ws, kind, verdict) {
4481
- const v = verdict || {};
4482
- const caps = v.requiredRelationAnyOf || v.caps || [];
4483
- const schemaUnresolvable = v.schemaResolved === false;
4484
- const premise = v.tokenError ? `token-verification-failed:${v.tokenError}` : schemaUnresolvable ? "relation-schema-unresolvable" : v.resolvedPrincipal ? "principal-lacks-workspace-read-cap" : "no-principal-presented";
4485
- const why = v.tokenError ? `the presented ${HDR.AUTH} token did NOT verify (${v.tokenError}) against the workspace's declared issuer ${v.issuer || "?"}${v.audience ? ` / audience ${v.audience}` : ""}.` : schemaUnresolvable ? `the workspace's relation SCHEMA did not resolve \u2014 no principal can hold any read capability until the law's relation declarations merge cleanly (check for a cross-domain (type, relation) rewrite conflict on the shared 'workspace' type).` : v.resolvedPrincipal ? `resolved principal '${v.resolvedPrincipal}'${v.principalVerified ? " (token-verified)" : ` (unverified bare ${HDR.PRINCIPAL} claim)`} holds none of the required read capabilities.` : `no principal was presented \u2014 send a verified ${HDR.AUTH} token for a principal the owner granted a read capability.`;
4486
- return {
4487
- ok: false,
4488
- ws,
4489
- error: `${kind}-forbidden`,
4490
- forbidden: {
4491
- premise,
4492
- workspace: ws,
4493
- resolvedPrincipal: v.resolvedPrincipal || null,
4494
- principalVerified: !!v.principalVerified,
4495
- tokenError: v.tokenError || null,
4496
- requiredObject: v.requiredObject || "workspace:self",
4497
- requiredRelationAnyOf: caps,
4498
- issuer: v.issuer || null,
4499
- audience: v.audience || null
4500
- },
4501
- hint: `this workspace is private (read visibility) \u2014 a ${kind} reads the whole ledger, so it requires a principal granted ANY of its read capabilities (${caps.join(", ") || "a read cap"}) on ${v.requiredObject || "workspace:self"}: ${why}`
4502
- };
4503
- }
4504
-
4505
4795
  // ../cloud/cloudflare-shell/src/gateway-route-resolver.ts
4506
4796
  function aliasIdsFor(x, path3) {
4507
4797
  const ids = [];
@@ -4734,8 +5024,9 @@ function receivePackCommands(raw) {
4734
5024
  init_types();
4735
5025
  var DIR = path2.dirname(fileURLToPath(import.meta.url));
4736
5026
  var REPO_ROOT = path2.resolve(DIR, "../..");
4737
- var MAX_TYPED_OFFER_REQUEST_BYTES = 8 * 1024 * 1024;
5027
+ var MAX_TYPED_OFFER_REQUEST_BYTES = 32 * 1024 * 1024;
4738
5028
  var MAX_TYPED_CUSTODY_OFFER_BYTES = 64 * 1024 * 1024;
5029
+ var MAX_TYPED_WORKSPACE_EFFECT_BYTES = 34 * 1024 * 1024;
4739
5030
  var RECOGNIZED_UNSUPPORTED = /* @__PURE__ */ new Set([
4740
5031
  "container-status",
4741
5032
  "recycle-container",
@@ -4940,6 +5231,35 @@ async function startDevCloud(opts = {}) {
4940
5231
  for (let i = 0; i < 8; i++) replica = replica << 8n | BigInt(replicaDigest[i]);
4941
5232
  replica &= (1n << 63n) - 1n;
4942
5233
  const eng = await createEngine({ wasmModule, bootstrapLawUsdz, nomosLawUsdz, replica, installedBy: "nomos-cloud-dev" });
5234
+ const admissionCheckpointSecretPath = path2.join(dataDir, "admission-checkpoint.secret");
5235
+ const admissionCheckpointPublicPath = path2.join(dataDir, "admission-checkpoint.public");
5236
+ let admissionCheckpoint;
5237
+ let admissionCheckpointSecret;
5238
+ if (existsSync2(admissionCheckpointSecretPath) && existsSync2(admissionCheckpointPublicPath)) {
5239
+ admissionCheckpointSecret = new Uint8Array(readFileSync2(admissionCheckpointSecretPath));
5240
+ const admissionCheckpointPublic = new Uint8Array(readFileSync2(admissionCheckpointPublicPath));
5241
+ if (admissionCheckpointSecret.byteLength !== 32 || admissionCheckpointPublic.byteLength !== 32) {
5242
+ throw new Error("persisted admission checkpoint keypair is malformed");
5243
+ }
5244
+ admissionCheckpoint = {
5245
+ secret: Buffer.from(admissionCheckpointSecret).toString("base64"),
5246
+ public: Buffer.from(admissionCheckpointPublic).toString("base64")
5247
+ };
5248
+ } else {
5249
+ admissionCheckpoint = authorKeygen(eng);
5250
+ admissionCheckpointSecret = new Uint8Array(
5251
+ Buffer.from(admissionCheckpoint.secret, "base64")
5252
+ );
5253
+ const admissionCheckpointPublic = Buffer.from(admissionCheckpoint.public, "base64");
5254
+ if (admissionCheckpointSecret.byteLength !== 32 || admissionCheckpointPublic.byteLength !== 32) {
5255
+ throw new Error("kernel produced a malformed admission checkpoint keypair");
5256
+ }
5257
+ writeFileSync(admissionCheckpointSecretPath, admissionCheckpointSecret, { mode: 384 });
5258
+ writeFileSync(admissionCheckpointPublicPath, admissionCheckpointPublic, { mode: 384 });
5259
+ }
5260
+ if (admissionCheckpointSecret.byteLength !== 32) {
5261
+ throw new Error("kernel produced a malformed admission checkpoint secret");
5262
+ }
4943
5263
  const restoredTestKRootPublic = String(process.env.NOMOS_TEST_K_ROOT_PUBLIC ?? "").trim();
4944
5264
  if (restoredTestKRootPublic) {
4945
5265
  const rootBytes = Buffer.from(restoredTestKRootPublic, "base64");
@@ -4986,6 +5306,75 @@ async function startDevCloud(opts = {}) {
4986
5306
  headers: {},
4987
5307
  pushLane: pushLaneFor(ws)
4988
5308
  });
5309
+ async function mountWorkspaceWithResidencies(ws, visiting = /* @__PURE__ */ new Set()) {
5310
+ const mounted = await mountWorkspace(eng, ws, ledgerFor(ws));
5311
+ if (mounted.restored || mounted.requiredResidencies.length === 0) return mounted;
5312
+ if (visiting.has(ws)) {
5313
+ throw new Error(`cyclic workspace residency dependency while mounting '${ws}'`);
5314
+ }
5315
+ const next = new Set(visiting).add(ws);
5316
+ for (const residency of mounted.requiredResidencies) {
5317
+ const source = await mountWorkspaceWithResidencies(residency.workspace, next);
5318
+ if (!source.restored) {
5319
+ throw new Error(
5320
+ `workspace '${ws}' requires unavailable residency '${residency.workspace}'`
5321
+ );
5322
+ }
5323
+ await ensureWorkspaceResidency(
5324
+ eng,
5325
+ residency.workspace,
5326
+ residency.sourceHead,
5327
+ residency.foldRoot,
5328
+ ledgerFor(residency.workspace)
5329
+ );
5330
+ }
5331
+ unmount(eng, ws);
5332
+ return mountWorkspace(eng, ws, ledgerFor(ws));
5333
+ }
5334
+ async function emitOutboxCascade(sourceWorkspace) {
5335
+ const pending = [sourceWorkspace];
5336
+ const seenOfferIds = /* @__PURE__ */ new Set();
5337
+ while (pending.length > 0) {
5338
+ const ws = pending.shift();
5339
+ await mountWorkspace(eng, ws, ledgerFor(ws));
5340
+ const due = outboundOffers(eng, ws);
5341
+ if (due.offers.length === 0) continue;
5342
+ const targetWorkspaces = /* @__PURE__ */ new Set();
5343
+ for (const offer of due.offers) {
5344
+ if (seenOfferIds.has(offer.id)) {
5345
+ throw new Error(
5346
+ `dev outbox lifecycle repeated due offer '${offer.id}' after delivery`
5347
+ );
5348
+ }
5349
+ seenOfferIds.add(offer.id);
5350
+ if (offer.route.case === "workspaceRoute") {
5351
+ const target = offer.route.value.workspace;
5352
+ if (!target) throw new Error(`workspace outbox offer '${offer.id}' has no target`);
5353
+ targetWorkspaces.add(target);
5354
+ }
5355
+ }
5356
+ for (const target of targetWorkspaces) {
5357
+ await mountWorkspace(eng, target, ledgerFor(target));
5358
+ }
5359
+ const result = await emitOutbox(
5360
+ eng,
5361
+ ws,
5362
+ ledgerFor(ws),
5363
+ "",
5364
+ admissionCheckpointSecret
5365
+ );
5366
+ for (const target of targetWorkspaces) {
5367
+ await commitAndPush(eng, target, ledgerFor(target));
5368
+ pending.push(target);
5369
+ }
5370
+ if (result.errors > 0) {
5371
+ console.warn(
5372
+ `[dev-cloud] outbox deferred ${result.errors} of ${due.offers.length} typed delivery attempt(s) from '${ws}'`
5373
+ );
5374
+ return;
5375
+ }
5376
+ }
5377
+ }
4989
5378
  async function persistBorn(born) {
4990
5379
  if (!Array.isArray(born)) return [];
4991
5380
  const out = [];
@@ -5040,27 +5429,6 @@ async function startDevCloud(opts = {}) {
5040
5429
  });
5041
5430
  const claimedPrincipalOf = (req) => String(req.headers["x-nomos-principal"] || "").slice(0, 128);
5042
5431
  const authTokenOf = (req) => String(req.headers["x-nomos-auth"] || "").replace(/^Bearer\s+/i, "");
5043
- const postureGate = (res, ws, req, kind) => {
5044
- if (process.env.NOMOS_TEST_DIAGNOSTICS === "1") {
5045
- console.error(
5046
- `[dev-cloud] read-posture request ${ws} ${kind} auth-bytes=${authTokenOf(req).length} principal=${claimedPrincipalOf(req) || "(none)"}`
5047
- );
5048
- }
5049
- let posture;
5050
- try {
5051
- posture = readPosture(eng, ws, claimedPrincipalOf(req), authTokenOf(req), Math.floor(Date.now() / 1e3));
5052
- } catch {
5053
- return false;
5054
- }
5055
- if (process.env.NOMOS_TEST_DIAGNOSTICS === "1") {
5056
- console.error(`[dev-cloud] read-posture ${ws} ${kind} ${JSON.stringify(posture)}`);
5057
- }
5058
- if (posture && posture.private && !posture.allowedAny) {
5059
- sendJson(res, bulkReadForbidden(ws, kind, posture), 403);
5060
- return true;
5061
- }
5062
- return false;
5063
- };
5064
5432
  function openapiFor(ws) {
5065
5433
  const merged = { openapi: "3.1.0", info: { title: `${ws} (nomos workspace)`, version: "0", "x-nomos-workspace": ws }, paths: {} };
5066
5434
  const domOf = (o) => {
@@ -5142,6 +5510,18 @@ async function startDevCloud(opts = {}) {
5142
5510
  const token = idp.mint({ sub: b.sub, ...b.nonce ? { nonce: b.nonce } : {} });
5143
5511
  return sendJson(res, { ok: true, token, issuer: idp.issuer, audience: idp.audience, jwks: idp.jwks });
5144
5512
  }
5513
+ if (url.pathname === "/dev/rotate-idp" && req.method === "POST") {
5514
+ const rotate = devSelf?.rotateTestIdP;
5515
+ if (!rotate) {
5516
+ return sendJson(res, {
5517
+ ok: false,
5518
+ error: "no rotatable dev IdP \u2014 start an ephemeral platform without --firebase-project"
5519
+ }, 409);
5520
+ }
5521
+ await rotate();
5522
+ res.writeHead(204, CORS);
5523
+ return res.end();
5524
+ }
5145
5525
  if (url.pathname === "/v1/runtime/holon.wasm" || url.pathname === "/v1/runtime/holon-testmint.wasm") {
5146
5526
  res.writeHead(200, { ...CORS, "content-type": "application/wasm", "cache-control": "no-store", "x-nomos-kernel": kernelKind, "x-nomos-kernel-sha": kernelSha });
5147
5527
  return res.end(Buffer.from(wasmBytes));
@@ -5265,7 +5645,7 @@ async function startDevCloud(opts = {}) {
5265
5645
  const ledger = ledgerFor(ws);
5266
5646
  let initialized = false, ledgerState = null, mount = null;
5267
5647
  if (custody.get(`holon-${ws}`)) {
5268
- mount = await mountWorkspace(eng, ws, ledger);
5648
+ mount = await mountWorkspaceWithResidencies(ws);
5269
5649
  try {
5270
5650
  initialized = nomosActive(eng, ws);
5271
5651
  } catch {
@@ -5292,7 +5672,7 @@ async function startDevCloud(opts = {}) {
5292
5672
  if (sub[0] === "domains" && sub.length === 1) {
5293
5673
  if (req.method === "GET") {
5294
5674
  return await serialize(async () => {
5295
- await mountWorkspace(eng, ws, ledgerFor(ws));
5675
+ await mountWorkspaceWithResidencies(ws);
5296
5676
  sendJson(res, { ok: true, ws, ...installedLaw(eng, ws) });
5297
5677
  });
5298
5678
  }
@@ -5315,9 +5695,47 @@ async function startDevCloud(opts = {}) {
5315
5695
  await mountWorkspace(eng, ws, ledger);
5316
5696
  const out = await admitAll(eng, ws, ledger, {});
5317
5697
  if (Array.isArray(out.born) && out.born.length) await persistBorn(packBornChildren(eng, out.born));
5698
+ await emitOutboxCascade(ws);
5318
5699
  sendJson(res, { ok: true, ws, sessions: out.sessions, main: out.main, ...out.timings ? { timings: out.timings } : {} });
5319
5700
  });
5320
5701
  }
5702
+ if (sub[0] === "workspace-effect" && req.method === "POST") {
5703
+ return await serialize(async () => {
5704
+ const contentType = String(req.headers["content-type"] || "");
5705
+ if (!contentType.includes("application/vnd.nomos.workspace-effect+protobuf")) {
5706
+ return sendBytes(res, Buffer.from("expected typed workspace-effect protobuf"), 415, {
5707
+ "content-type": "text/plain; charset=utf-8"
5708
+ });
5709
+ }
5710
+ const raw = await readBody(req);
5711
+ if (raw.byteLength === 0 || raw.byteLength > MAX_TYPED_WORKSPACE_EFFECT_BYTES) {
5712
+ return sendBytes(
5713
+ res,
5714
+ Buffer.from(`typed workspace effect must be 1..${MAX_TYPED_WORKSPACE_EFFECT_BYTES} bytes`),
5715
+ 413,
5716
+ { "content-type": "text/plain; charset=utf-8" }
5717
+ );
5718
+ }
5719
+ if (!custody.get(`holon-${ws}`)) {
5720
+ return sendBytes(res, Buffer.from(`workspace-effect target '${ws}' has no custody`), 404, {
5721
+ "content-type": "text/plain; charset=utf-8"
5722
+ });
5723
+ }
5724
+ const ledger = ledgerFor(ws);
5725
+ await mountWorkspace(eng, ws, ledger);
5726
+ const response = await applyWorkspaceEffect(
5727
+ eng,
5728
+ ws,
5729
+ ledger,
5730
+ new Uint8Array(raw),
5731
+ admissionCheckpointSecret
5732
+ );
5733
+ await emitOutboxCascade(ws);
5734
+ sendBytes(res, Buffer.from(response), 200, {
5735
+ "content-type": "application/vnd.nomos.workspace-effect-result+protobuf"
5736
+ });
5737
+ });
5738
+ }
5321
5739
  if (sub[0] === "intent-offers" && req.method === "POST") {
5322
5740
  return await serialize(async () => {
5323
5741
  const contentType = String(req.headers["content-type"] || "");
@@ -5364,6 +5782,7 @@ async function startDevCloud(opts = {}) {
5364
5782
  return sendBytes(res, Buffer.from("typed custody offer has no source"), 400, { "content-type": "text/plain; charset=utf-8" });
5365
5783
  }
5366
5784
  if (Array.isArray(out.born) && out.born.length) await persistBorn(out.born);
5785
+ await emitOutboxCascade(ws);
5367
5786
  sendBytes(res, encodeCustodyOfferResponse(request, ws, out), 200, {
5368
5787
  "content-type": "application/vnd.nomos.custody-offer-result+protobuf"
5369
5788
  });
@@ -5425,7 +5844,6 @@ async function startDevCloud(opts = {}) {
5425
5844
  if (sub[0] === "pack" && req.method === "GET") {
5426
5845
  return await serialize(async () => {
5427
5846
  await mountWorkspace(eng, ws, ledgerFor(ws));
5428
- if (postureGate(res, ws, req, "pack")) return;
5429
5847
  const have = url.searchParams.get("have") || "";
5430
5848
  let r;
5431
5849
  try {
@@ -5446,9 +5864,11 @@ async function startDevCloud(opts = {}) {
5446
5864
  if (sub[0] === "snapshot" && req.method === "GET") {
5447
5865
  return await serialize(async () => {
5448
5866
  await mountWorkspace(eng, ws, ledgerFor(ws));
5449
- if (postureGate(res, ws, req, "snapshot")) return;
5450
- const bytes = snapshot(eng, ws);
5451
- sendBytes(res, bytes, 200, { "content-type": "application/octet-stream", "x-nomos-layout": "flat-manifest-v1" });
5867
+ const bytes = localCustodySnapshot(eng, ws);
5868
+ sendBytes(res, bytes, 200, {
5869
+ "content-type": "application/vnd.nomos.local-custody-snapshot+protobuf",
5870
+ "x-nomos-layout": "local-custody-v3"
5871
+ });
5452
5872
  });
5453
5873
  }
5454
5874
  if (sub.length === 1 && sub[0] === "prepare-offer" && req.method === "POST") {
@@ -5488,6 +5908,91 @@ async function startDevCloud(opts = {}) {
5488
5908
  });
5489
5909
  });
5490
5910
  }
5911
+ if (sub.length === 1 && sub[0] === "runtime" && req.method === "POST") {
5912
+ const contentType = String(req.headers["content-type"] || "");
5913
+ if (!contentType.includes("application/vnd.nomos.runtime-request+protobuf")) {
5914
+ return sendBytes(res, Buffer.from("expected typed Runtime v2 protobuf"), 415, {
5915
+ "content-type": "text/plain; charset=utf-8"
5916
+ });
5917
+ }
5918
+ let requestBytes;
5919
+ try {
5920
+ requestBytes = await readBoundedBody(req, MAX_TYPED_OFFER_REQUEST_BYTES);
5921
+ } catch (error) {
5922
+ if (error instanceof RangeError) {
5923
+ return sendBytes(res, Buffer.from(error.message), 413, {
5924
+ "content-type": "text/plain; charset=utf-8"
5925
+ });
5926
+ }
5927
+ throw error;
5928
+ }
5929
+ const runtime = fromBinary2(RuntimeRequestSchema, requestBytes);
5930
+ if (runtime.protocolVersion !== 2 || !runtime.requestId) {
5931
+ return sendBytes(res, Buffer.from("runtime request requires protocol version 2 and a request id"), 400, {
5932
+ "content-type": "text/plain; charset=utf-8"
5933
+ });
5934
+ }
5935
+ if (runtime.command.case !== "kernelCall" || !runtime.command.value.request) {
5936
+ return sendBytes(res, Buffer.from("local runtime currently accepts generated kernel calls"), 400, {
5937
+ "content-type": "text/plain; charset=utf-8"
5938
+ });
5939
+ }
5940
+ if (runtime.command.value.session !== ws) {
5941
+ return sendBytes(res, Buffer.from("runtime session does not match the routed workspace"), 409, {
5942
+ "content-type": "text/plain; charset=utf-8"
5943
+ });
5944
+ }
5945
+ const call = runtime.command.value.request;
5946
+ if (call.protocolVersion !== 1 || !call.requestId) {
5947
+ return sendBytes(res, Buffer.from("kernel call requires protocol version 1 and a request id"), 400, {
5948
+ "content-type": "text/plain; charset=utf-8"
5949
+ });
5950
+ }
5951
+ if (call.operation.case === "offer" || call.operation.case === "query") {
5952
+ const target = call.operation.value.target;
5953
+ if (!target || target.workspace !== ws || target.repo !== `/work/ws/${ws}` || target.branch !== "main") {
5954
+ return sendBytes(res, Buffer.from("runtime kernel call target is not bound to this workspace/main"), 409, {
5955
+ "content-type": "text/plain; charset=utf-8"
5956
+ });
5957
+ }
5958
+ } else if (call.operation.case === "custody" && call.operation.value.operation.case === "resolveRef") {
5959
+ const resolve = call.operation.value.operation.value;
5960
+ if (resolve.repo !== `/work/ws/${ws}` || resolve.reference !== "refs/heads/main") {
5961
+ return sendBytes(res, Buffer.from("runtime custody lookup is not bound to this workspace/main"), 409, {
5962
+ "content-type": "text/plain; charset=utf-8"
5963
+ });
5964
+ }
5965
+ } else {
5966
+ return sendBytes(res, Buffer.from("kernel operation is not available on the remote runtime lane"), 400, {
5967
+ "content-type": "text/plain; charset=utf-8"
5968
+ });
5969
+ }
5970
+ if (call.operation.case === "offer" && call.operation.value.intent.case !== "sealedChangeUsda") {
5971
+ return sendBytes(res, Buffer.from("remote runtime admits only locally signed USDA transitions"), 400, {
5972
+ "content-type": "text/plain; charset=utf-8"
5973
+ });
5974
+ }
5975
+ return await serialize(async () => {
5976
+ const ledger = ledgerFor(ws);
5977
+ await mountWorkspace(eng, ws, ledger);
5978
+ const response = callKernel(eng, call);
5979
+ if (response.outcome.case === "offer" && response.outcome.value.outcome.case === "admitted") {
5980
+ await commitAndPush(eng, ws, ledger);
5981
+ const admitted = response.outcome.value.outcome.value;
5982
+ if (admitted.born.length > 0) {
5983
+ await persistBorn(packBornChildren(eng, admitted.born));
5984
+ }
5985
+ await emitOutboxCascade(ws);
5986
+ }
5987
+ sendBytes(res, toBinary3(RuntimeResponseSchema, create3(RuntimeResponseSchema, {
5988
+ protocolVersion: 2,
5989
+ requestId: runtime.requestId,
5990
+ outcome: { case: "kernelCall", value: response }
5991
+ })), 200, {
5992
+ "content-type": "application/vnd.nomos.runtime-response+protobuf"
5993
+ });
5994
+ });
5995
+ }
5491
5996
  if (sub[0] === "aggregates" && sub[1] || sub[0] === "qbyid" && req.method === "GET") {
5492
5997
  const id = sub[0] === "aggregates" ? decodeURIComponent(sub.slice(1).join("/")) : url.searchParams.get("id");
5493
5998
  return await serialize(async () => {
@@ -5544,6 +6049,7 @@ async function startDevCloud(opts = {}) {
5544
6049
  }
5545
6050
  if (!out.ok) return sendJson(res, { ok: false, refused: true, error: String(out.error).slice(0, 600) }, 422);
5546
6051
  const born = Array.isArray(out.born) && out.born.length ? await persistBorn(packBornChildren(eng, out.born)) : void 0;
6052
+ await emitOutboxCascade(ws);
5547
6053
  sendJson(res, { ok: true, ws, head: out.head, ...born ? { born } : {}, ...out.birthOutcomes ? { birthOutcomes: out.birthOutcomes } : {} });
5548
6054
  } catch (e) {
5549
6055
  sendJson(res, { ok: false, refused: true, error: errMsg(e).slice(0, 600) }, 422);
@@ -5623,6 +6129,7 @@ async function startDevCloud(opts = {}) {
5623
6129
  await mountWorkspace(eng, ws, ledger);
5624
6130
  const out = await admitAll(eng, ws, ledger, {});
5625
6131
  if (Array.isArray(out.born) && out.born.length) await persistBorn(packBornChildren(eng, out.born));
6132
+ await emitOutboxCascade(ws);
5626
6133
  } catch (e) {
5627
6134
  console.error(`[dev-cloud] admit ${ws} failed:`, errMsg(e));
5628
6135
  }
@@ -5673,6 +6180,7 @@ Sec-WebSocket-Accept: ${accept}\r
5673
6180
  ledgerFor,
5674
6181
  serialize,
5675
6182
  persistBorn,
6183
+ admissionCheckpoint,
5676
6184
  // `--platform` requested ⇒ NOT ready until the boot-time ceremony completes (main flips it true).
5677
6185
  ...opts.platform ? { platformReady: false } : {},
5678
6186
  close: () => new Promise((resolve) => {
@@ -5733,6 +6241,7 @@ function parseArgs(argv) {
5733
6241
  const a = argv[i];
5734
6242
  if (a === "--ephemeral") o.ephemeral = true;
5735
6243
  else if (a === "--port") o.port = parseInt(argv[++i], 10);
6244
+ else if (a === "--host") o.host = argv[++i];
5736
6245
  else if (a === "--data") o.data = argv[++i];
5737
6246
  else if (a === "--firebase-project") o.firebaseProject = argv[++i];
5738
6247
  else if (a === "--platform") o.platform = argv[++i];