Execution evidence · CycloneDX 1.6

A signed run,
in a standard parts list.

An ingredients label, with a signed receipt stapled in. See the files that ran, the room they ran in, and what came back. Further down, a referee's verdict goes into the same label.

A bill of materials (BOM) is a parts list for software. CycloneDX is the Open Worldwide Application Security Project’s standard format for that list. This example puts one run into the list. The image’s own ingredients label is linked separately when supplied.

Plimsoll runs code in a sandbox, like a locked room. A digest is a fingerprint of some bytes, made here with the SHA-256 hash algorithm. Change one letter and the fingerprint changes. The request is the files and commands sent into the room. The result is what came back.

The daemon, a long-running server named plimsolld, returns a run record: the fingerprints, image, room’s isolation tier and times. A harness, a separate checking program, checks that record and seals it. We call that sealed record the receipt. The seal is a tamper strip, like the one on a medicine bottle.

The signed wrapper is a Dead Simple Signing Envelope (DSSE). Inside it, an in-toto statement is a standard way to write a claim. CycloneDX Attestations (CDXA) attach the receipt as evidence for the list’s three claims: code, image and isolation.

This converter needs a selected OCI manifest identity, the exact fingerprint of one container image for one platform. Today that means docker on the containerd image store. Other providers’ runs are refused when that identity is missing.

The record is signed. The BOM is unsigned. The seal lets you spot changed evidence. It does not independently measure the room’s walls. The daemon supplies those facts. A key included with the receipt shows which key checks the seal; you still need an independently trusted key to know the signer.

6signed runs
One BOM per run
12recorded commands
Result and exit code preserved
3+1claims per BOM
Code, image, stated isolation, plus a verdict where a referee signed one
INTERNAL · The run →INTERNAL · The run with an egress attempt →INTERNAL · The same request, in a VM →INTERNAL · The egress attempt, in a VM →INTERNAL · An adapter that passed all 8 rules →INTERNAL · An adapter that broke one rule →INTERNAL · network comparison →INTERNAL · the verdict →

From execution to a checkable file

Files and commands become a checked signed bundle, then an unsigned BOMThe request enters plimsolld. The daemon returns a record and result. The attest harness checks and signs their fingerprints and exact stored bytes. The emitter verifies the bundle before writing the CycloneDX file. Its checker rebuilds the mapping from the attached evidence. Files + commandsThe request the client sentIncludes floor and timeout Daemon recordDigests + image + timesIsolation is a stated tier Signed bundleHarness checks the exchangeRecords + exact stored bytes CycloneDX BOMUnsigned claims + evidenceRebuilt by the checker -check verifies evidence, then rebuilds the mapping
1. RequestThe program's files, commands, minimum isolation tier and timeout.
2. RecordThe daemon's statement of what was sent, returned and used to run it.
3. BundleThe harness checks fingerprints, then signs records and entry links.
4. BOMThe emitter checks the bundle. A reviewer can rebuild the mapping from it.

Four rooms, two were used

plimsoll runs code in a locked room and says which room. The tier names below are the technical words; the pictures are what they mean.

The four isolation tiers drawn as rooms of increasing wall thicknessProcess is a cubicle, container is a room with a lock, kernel is a room with its own plumbing and is the one the gVisor runs used, and VM is a separate building, used by the Docker Cloud runs. The adapter runs used the container room. processa cubicle: a partition, not a wall the adapter runs containera room with a lock, shared plumbing the gVisor runs kernel (gVisor)a room with its own plumbing the Docker Cloud runs VMa separate building

Click a room. The reconcile runs asked for at least kernel, and the same request was then sent to a VM, which is thicker, so it ran there too; the adapter runs in the verdict section asked for at least container. A daemon offering a thinner wall than the floor refuses to run it, and nothing is dispatched.

The tier is what the configuration says plus the checks the daemon runs at startup, never a hardware measurement. The run's record names it, and the seal covers the name.

A till receipt for one run

A receipt listing the fingerprints of the code and the result, the image, the wall thickness and the times, with a sealThe record is drawn as a paper receipt with a torn bottom edge, six lines of facts, and a stamp reading sealed. plimsoll run record CODEfingerprint 74cd…c302 RESULTfingerprint 7a38…04d9 IMAGEmanifest 1c6c…5b25 WALLkernel (gVisor) GRANTnone, no network TIME23:13:22.296Z, 886 ms stated by plimsolld,checked and signed by plimsoll-attest SEALEDEd25519 · in-toto · DSSE

Read it like a receipt

CODE and RESULT are fingerprints: a short code computed from the bytes, which changes completely if one letter changes. IMAGE is the fingerprint of the frozen filesystem the code ran in. WALL is the room. GRANT says whether the code was allowed to reach anything outside, and here it was not. TIME is the daemon's own clock.

The seal is a tamper strip, like the one on a medicine bottle: a signature over the whole receipt. Peel it, change one character, and it no longer fits. The box below this run lets you do exactly that in your browser.

The values printed on the drawing are the first run's, shortened; the full ones are in each run's section.

The failure is preserved with its evidence

The program attempts to fetch https://example.com/. Its own five-second timer bounds the demonstration, so it cannot wait indefinitely. The sandboxed attempt failed; the outside transcript reports success.

The same file run outside and inside the roomOutside, a laptop reaches a globe labelled example.com and nothing is written down. Inside, the attempt stops at the wall and a sealed receipt records exit code 3. OUTSIDE plimsoll egress.js example.com, 200 nothing written down, nothing to put on a label INSIDE plimsoll egress.js no route, no resolver: the attempt times out receiptexit 35,228 msSEALED

Inside plimsoll

Signed exchange

node egress.js
Exit 3, duration 5373 milliseconds.

egress: refused: TimeoutError

The word “refused” comes from the guest program. Its fetch timer expired; the sandbox timeout flag is false. The timeout is consistent with the provider's reported network configuration, but does not independently establish its cause.

Outside plimsoll

Unsigned transcript
# record: 29c2e7b07429f25bbedda4f4572b4720837437bbf1f6e924a75d7d44739509d6
# step: node egress.js
# The same egress attempt outside plimsoll
#
# Command, run on the developer machine on 2026-10-13 with the node on PATH (v26.3.1),
# default network, no sandbox, no record of any kind:
#
#   node egress.js
#
# Output and exit code, pasted by hand (there is no signed record to cite):

egress: reached example.com, status 200
exit code: 0

The same file reached the internet outside the room, while nobody wrote a signed receipt. This text was pasted by hand. There is nothing sealed for the converter to staple into a BOM. The two settings also used different runtimes; this comparison does not establish why the inside attempt failed.

And a third time, the same file in a Docker Cloud microVM, a separate building whose account network policy denies every connection: exit 3 after 5548 milliseconds, sandbox timeout flag false, under its own signed receipt.

egress: refused: TimeoutError

One failed request is an observed result, not a universal proof that every network path is blocked. The full sandbox boundary still rests on the daemon and its provider checks.

Change one letter, watch the fingerprint change

A fingerprint (SHA-256) is a 64-character code computed from a file's bytes. Edit the text below; your browser recomputes the fingerprint as you type. The receipt holds fingerprints like this for the code and for the result, so a changed byte anywhere shows up.

SHA-256 of what is in the box

computing…

This is the original text.

The fingerprints on the receipt are over the exact bytes plimsoll received and returned, which the checker recomputes from the attached exchange; this box is only to show the shape of the idea.

An ingredients label with the receipt stapled in

A bill of materials drawn as a nutrition-style ingredients label, with a receipt stapled to itFive rows: the program and its files, the image, the run, the claims with the attached receipt, and what it does not prove. Bill of MaterialsCycloneDX 1.6 · unsigned; the receipt inside is signed The program3 files, each fingerprinted The imagecontainer, manifest 1c6c…5b25 The runcommands, exit codes, times, wall Three claimsthe code, the image, the wall Evidencethe sealed receipt, attached Does not provewhich model wrote it, the clock run recordCODE 74cd…IMAGE 1c6c…WALL kernelSEALED A platform that readsCycloneDX keeps the rows;whether it shows the stapledreceipt is up to the platform.The round trip that proves it:download the original, runthe check.

Why a label

Software already ships with an ingredients label, the SBOM (software bill of materials): a list of every package inside. An AI agent's program is a new kind of ingredient with no package name, no version and no maintainer, so it never made the label. This file is that label for one run, with the receipt stapled in as evidence behind three claims.

The rows are what any viewer shows: the program and its file fingerprints, the image, the run. The staple is the part most viewers do not draw yet: the sealed receipt inside the declarations block. A platform that gives you back the original file lets you check it; this page checks it for you below.

Did the robot go where it was told?

The receipt says what ran and where. It does not say whether the code did its job. For that somebody has to check the work, and the check has to come from the other side of the counter.

The setup, in plain words. A fleet vendor sells robots you drive through a web API (the robots are simulated; no warehouse was harmed). An AI wrote an adapter: the small program that turns the platform's orders ("robot two, go to aisle ten") into that vendor's API calls. Before the platform lets it near a real fleet it wants one answer: does the adapter do what it says it does?

So the platform runs the adapter inside plimsoll with a grant that reaches the vendor's API and nothing else, hands it a plan of four commands, and then asks the vendor what happened: which orders arrived, for which robots, and where each robot stopped. A referee compares that account with the plan under eight rules. The adapter's own report is checked against the vendor's ledger; it never gets to grade itself. The referee signs the result as a qualification statement bound to the run's receipt, and this page staples that statement into the same ingredients label as a fourth claim with a conformance score: 1 when every rule held, 0 when any broke. Conformance is CycloneDX's word for "how well the thing meets a requirement"; here the requirement is "met the platform's rules".

The plan goes to an AI-written adapter inside the plimsoll room, which drives three simulated robots through the vendor's API; the referee reads the vendor's ledger and the plan, checks the adapter's report against them, and seals a verdict that is stapled into the labelLeft, the platform's plan. Centre, the locked room holding the adapter, with a small gate labelled grant. Right, the vendor with three robots on a grid and a ledger. Below, the referee with a clipboard of eight rules, fed by the ledger and the plan, with the adapter's report arriving as a dashed line marked checked, never trusted. The referee's sealed statement goes into the label as claim four. the platforma plan: four commandsr1, r2, r3 and one cancel plan.json the plimsoll room adapter.jswritten by an AI, run under a grant grant API calls the fleet vendor (simulated) r1 r2 r3 the ledger what really happened: orders, robots, stops the plan again the adapter's own report:checked, never trusted the refereeeight rules, read from the ledger and the plan ✓✓✓✓✓✓✓✓or a ✗, with the ledger's words beside it sealedstatement the label (CycloneDX)claims 1 to 3: code, image, stated tierclaim 4: the verdict, conformance 1 or 0

About the one that failed. In the scenario called lost_ack the vendor accepts robot r2's order, starts it, and then the answer gets lost on the way back (a 503, "service unavailable"). The first adapter did the natural thing and sent the order again. The robot, being a robot, did as it was told, twice. Rule four, one order per command, caught it from the ledger: run04-c2 became 2 orders (m2, m3). The rewritten adapter sends a command identifier the vendor recognizes, so a repeat is answered with the original order and the robot gets one trip. Nothing in the adapter's own report would have told you this. The ledger did, which is why the referee reads the ledger.

What this is not: an independent audit (the platform wrote the rules and signed the verdict), a real vendor (the ledger comes from the simulator the adapter example ships), or proof of who wrote the adapter. What it is: a verdict someone else can re-derive from the same evidence, which is what a score in a label ought to mean. The Go checker re-runs the eight rules from the attached statement; your browser checks the seal, the binding to this receipt, and that the claim says what the statement says. The runs, the rules and all 38 verdicts are on INTERNAL · the adapter example page →.

The run

Outcome: completedStated tier: kernelFloor asked: kernelNo grant: no networkBundle line 1

The completed outcome means the runner returned a normal result; a step with a nonzero exit code still failed. The stated tier is the daemon's reported isolation tier, backed by provider configuration and startup checks, never runtime attestation.

Time (UTC)
2026-10-23T20:11:11.071Z to 2026-10-23T20:11:11.994Z
Request digest
00c95be443d358949d123d77464e9c40b03dafd3f3094b709d8719b004c0a7a4
Record digest
6551b96262066f165d5511e0cdee4726a2bd8234c52ee06ae99c62caae1d3bd0
Image identity
oci-manifest:linux/amd64@sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c
Bundle
INTERNAL · bundle.jsonl, line 1 →

Open Container Initiative (OCI) is the container image format. The manifest digest identifies the selected image for one platform, such as Linux on a standard PC processor (linux/amd64). A display name never supplies that identity.

INTERNAL · this run's CycloneDX JSON →

The program's files

reconcile.js

SHA-256: c2de8205ca1e811fba188b71b051e25644f88b8190351372ab3ed4a842231456

// reconcile.js: match payments to invoices by invoice id and report what is
// unpaid, overpaid or matched. Amounts are integer cents.
function reconcile(invoices, payments) {
  const paid = new Map();
  for (const p of payments) paid.set(p.invoice, (paid.get(p.invoice) || 0) + p.cents);
  const matched = [], unpaid = [], overpaid = [];
  for (const inv of invoices) {
    const got = paid.get(inv.id) || 0;
    if (got === inv.cents) matched.push(inv.id);
    else if (got < inv.cents) unpaid.push({ id: inv.id, owed: inv.cents - got });
    else overpaid.push({ id: inv.id, excess: got - inv.cents });
  }
  return { matched, unpaid, overpaid };
}
module.exports = { reconcile };
reconcile.test.js

SHA-256: ce76efdec6de19969e12f5ca27b273396ca274dfa330df36811f78354c659c97

const assert = require("node:assert/strict");
const { reconcile } = require("./reconcile.js");
const invoices = [
  { id: "INV-1001", cents: 12500 },
  { id: "INV-1002", cents: 8000 },
  { id: "INV-1003", cents: 4200 },
];
const payments = [
  { invoice: "INV-1001", cents: 12500 },
  { invoice: "INV-1002", cents: 5000 },
  { invoice: "INV-1003", cents: 4200 },
  { invoice: "INV-1003", cents: 300 },
];
const r = reconcile(invoices, payments);
assert.deepEqual(r.matched, ["INV-1001"]);
assert.deepEqual(r.unpaid, [{ id: "INV-1002", owed: 3000 }]);
assert.deepEqual(r.overpaid, [{ id: "INV-1003", excess: 300 }]);
console.log("reconcile: 3 assertions passed");
main.js

SHA-256: 71ef6972211c39f941bfac9534cefd7b19cff470419f148a7351743d011b7698

const { reconcile } = require("./reconcile.js");
const invoices = [
  { id: "INV-2001", cents: 99000 },
  { id: "INV-2002", cents: 15000 },
  { id: "INV-2003", cents: 7250 },
  { id: "INV-2004", cents: 31000 },
];
const payments = [
  { invoice: "INV-2001", cents: 99000 },
  { invoice: "INV-2002", cents: 15000 },
  { invoice: "INV-2004", cents: 31000 },
  { invoice: "INV-2004", cents: 1000 },
];
const r = reconcile(invoices, payments);
console.log(JSON.stringify({ invoices: invoices.length, payments: payments.length, ...r }));

The commands and recorded results

Standard output (stdout) is printed output; standard error (stderr) is the separate diagnostic channel. Exit code 0 means the command reported success. A nonzero code means it reported failure.

node reconcile.test.js

Exit 0142 millisecondsSandbox timeout: false
stdout:
reconcile: 3 assertions passed
stderr:

node main.js

Exit 095 millisecondsSandbox timeout: false
stdout:
{"invoices":4,"payments":4,"matched":["INV-2001","INV-2002"],"unpaid":[{"id":"INV-2003","owed":7250}],"overpaid":[{"id":"INV-2004","excess":1000}]}
stderr:

Try the receipt here

The seal is a tamper strip, like the one on a medicine bottle. Check it, then change a copy and watch the seal fail. Your browser uses only the bytes inside this page.

Checking whether this browser can verify the seal.

    This checks one receipt, its bundle line's seal and its JSON fields. The emitter's Go checker also verifies the whole bundle when it has it and proves that the JSON copy matches the stored protobuf messages. An attached public key proves consistency under that key; it does not tell you who owns it.

    Checks actually run by the emitter

    These receipts come from checking the generated BOM and three separately altered copies. The original source files are unchanged.

    PASS: CycloneDX 1.6 schema (vendored, offline).
    PASS: DSSE envelope signature and run-record digest.
    PASS: the attached bundle line: its link's seal and place, the stored request and result against the signed digests.
    PASS: exchange.json equals the line's protobuf messages and reproduces their digests.
    PASS: file-set digest recomputed from file components and bound to the signed request.
    PASS: every mapped field and claim matches the verified exchange.
    PASS: attached key matches independently trusted key.
    PASS: the attached line is line 1 of the referenced bundle, whole to its checkpoint (8 lines).
    LIMIT: names, page URL and assessor label are unsigned presentation; runtime assertions remain the daemon's statements.
    PASS: image SBOM hash, manifest identity and BOM-Link match the local evidence file.
    PASS: altered envelope refused: envelope: attest: no valid signature from this key
    PASS: altered file hash refused: file-set digest differs from program hash
    PASS: altered claim digest refused: BOM differs from the verified exchange: file contents, digests, claims or another mapped field was changed
    
    Every BOM field and where it came from
    FieldSource
    annotations[0].annotator.component.externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    annotations[0].annotator.component.externalReferences[0].urlEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    annotations[0].annotator.component.nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    annotations[0].annotator.component.typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    annotations[0].annotator.component.versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    annotations[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    annotations[0].subjects[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    annotations[0].textEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    annotations[0].timestampSigned record.ended_unix_ms, formatted in UTC with milliseconds.
    bomFormatEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    components[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    components[0].externalReferences[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    components[0].externalReferences[0].hashes[0].contentSHA-256 of the pinned local image SBOM's original file bytes.
    components[0].externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    components[0].externalReferences[0].urlUnsigned -pages base URL plus the manifest-derived image SBOM filename.
    components[0].externalReferences[1].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    components[0].externalReferences[1].urlBOM-Link from the image SBOM's serialNumber UUID, version and root component bom-ref.
    components[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    components[0].hashes[0].contentSelected OCI manifest digest from signed record.software_identity; purl also uses the unsigned display name.
    components[0].nameUnsigned -image-name display label.
    components[0].properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    components[0].properties[0].valueSigned record: environment.
    components[0].properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    components[0].properties[1].valueSigned record: software_identity.
    components[0].purlSelected OCI manifest digest from signed record.software_identity; purl also uses the unsigned display name.
    components[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    components[0].versionSelected OCI manifest digest from signed record.software_identity; purl also uses the unsigned display name.
    declarations.affirmation.statementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.assessors[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.assessors[0].organization.nameUnsigned -operator self-assessor label.
    declarations.assessors[0].thirdPartyEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].assessorEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].map[0].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].map[0].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].map[0].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].map[0].conformance.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].map[0].conformance.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].map[0].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].map[1].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].map[1].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].map[1].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].map[1].conformance.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].map[1].conformance.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].map[1].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].map[2].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].map[2].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].map[2].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].map[2].conformance.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].map[2].conformance.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].map[2].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.attestations[0].summaryEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.claims[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.claims[0].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.claims[0].predicateVerified signed record and its stored request; code claim also uses the file-set digest.
    declarations.claims[0].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.claims[0].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.claims[1].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.claims[1].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.claims[1].predicateVerified signed record and its stored request; code claim also uses the file-set digest.
    declarations.claims[1].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.claims[1].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.claims[2].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.claims[2].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.claims[2].predicateVerified signed record and its stored request; code claim also uses the file-set digest.
    declarations.claims[2].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.claims[2].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.evidence[0].author.nameFixed envelope/statement/predicate type names plus key id = SHA-256 of the public key bytes.
    declarations.evidence[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.evidence[0].createdSigned record.ended_unix_ms, formatted in UTC with milliseconds.
    declarations.evidence[0].data[0].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
    declarations.evidence[0].data[0].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.evidence[0].data[0].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.evidence[0].data[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.evidence[0].data[1].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
    declarations.evidence[0].data[1].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.evidence[0].data[1].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.evidence[0].data[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.evidence[0].data[2].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
    declarations.evidence[0].data[2].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.evidence[0].data[2].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.evidence[0].data[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.evidence[0].data[3].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
    declarations.evidence[0].data[3].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.evidence[0].data[3].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.evidence[0].data[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    declarations.evidence[0].descriptionFixed envelope/statement/predicate type names plus key id = SHA-256 of the public key bytes.
    declarations.evidence[0].propertyNameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    definitions.standards[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    definitions.standards[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    definitions.standards[0].requirements[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    definitions.standards[0].requirements[0].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    definitions.standards[0].requirements[0].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    definitions.standards[0].requirements[1].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    definitions.standards[0].requirements[1].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    definitions.standards[0].requirements[1].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    definitions.standards[0].requirements[2].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    definitions.standards[0].requirements[2].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    definitions.standards[0].requirements[2].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    definitions.standards[0].versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].inputs[0].resource.refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].outputs[0].properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].outputs[0].properties[0].valueSigned record: result_sha256.
    formulation[0].workflows[0].outputs[0].resource.refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].outputs[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].properties[0].valueSigned record: provider.
    formulation[0].workflows[0].properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].properties[1].valueSigned record: isolation.
    formulation[0].workflows[0].properties[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].properties[2].valueStored request: minimum_isolation; the bundle link signs the exact stored bytes.
    formulation[0].workflows[0].properties[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].properties[3].valueStored request: timeout_ms; the bundle link signs the exact stored bytes.
    formulation[0].workflows[0].properties[4].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].properties[4].valueStored request.project.grant_profile, or none when it is empty.
    formulation[0].workflows[0].properties[5].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].properties[5].valueStored response.project.outcome.
    formulation[0].workflows[0].runtimeTopology[0].dependsOn[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].runtimeTopology[0].refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].taskDependencies[0].refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].taskDependencies[1].dependsOn[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].taskDependencies[1].refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].taskTypes[0]Constant other: no task type was declared; the command supplies the name.
    formulation[0].workflows[0].tasks[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].tasks[0].nameStored request.project.steps[] equals stored response.project.steps[].command.
    formulation[0].workflows[0].tasks[0].steps[0].commands[0].executedStored request.project.steps[] equals stored response.project.steps[].command.
    formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[0].nameStored request.project.steps[] equals stored response.project.steps[].command.
    formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[0].valueStored response.project.steps[].exit_code; the bundle link signs the stored bytes.
    formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[1].nameStored request.project.steps[] equals stored response.project.steps[].command.
    formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[1].valueStored response.project.steps[].duration_ms; the bundle link signs the stored bytes.
    formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[2].nameStored request.project.steps[] equals stored response.project.steps[].command.
    formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[2].valueStored response.project.steps[].timed_out; the bundle link signs the stored bytes.
    formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[3].nameStored request.project.steps[] equals stored response.project.steps[].command.
    formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[3].valueStored response.project.steps[].stdout_truncated; the bundle link signs the stored bytes.
    formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[4].nameStored request.project.steps[] equals stored response.project.steps[].command.
    formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[4].valueStored response.project.steps[].stderr_truncated; the bundle link signs the stored bytes.
    formulation[0].workflows[0].tasks[0].taskTypes[0]Constant other: no task type was declared; the command supplies the name.
    formulation[0].workflows[0].tasks[0].uidSigned record.record_sha256 for the workflow; one-based result-step index for a task.
    formulation[0].workflows[0].tasks[1].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    formulation[0].workflows[0].tasks[1].nameStored request.project.steps[] equals stored response.project.steps[].command.
    formulation[0].workflows[0].tasks[1].steps[0].commands[0].executedStored request.project.steps[] equals stored response.project.steps[].command.
    formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[0].nameStored request.project.steps[] equals stored response.project.steps[].command.
    formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[0].valueStored response.project.steps[].exit_code; the bundle link signs the stored bytes.
    formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[1].nameStored request.project.steps[] equals stored response.project.steps[].command.
    formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[1].valueStored response.project.steps[].duration_ms; the bundle link signs the stored bytes.
    formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[2].nameStored request.project.steps[] equals stored response.project.steps[].command.
    formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[2].valueStored response.project.steps[].timed_out; the bundle link signs the stored bytes.
    formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[3].nameStored request.project.steps[] equals stored response.project.steps[].command.
    formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[3].valueStored response.project.steps[].stdout_truncated; the bundle link signs the stored bytes.
    formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[4].nameStored request.project.steps[] equals stored response.project.steps[].command.
    formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[4].valueStored response.project.steps[].stderr_truncated; the bundle link signs the stored bytes.
    formulation[0].workflows[0].tasks[1].taskTypes[0]Constant other: no task type was declared; the command supplies the name.
    formulation[0].workflows[0].tasks[1].uidSigned record.record_sha256 for the workflow; one-based result-step index for a task.
    formulation[0].workflows[0].timeEndSigned record.ended_unix_ms, formatted in UTC with milliseconds.
    formulation[0].workflows[0].timeStartSigned record.started_unix_ms, formatted in UTC with milliseconds.
    formulation[0].workflows[0].uidSigned record.record_sha256 for the workflow; one-based result-step index for a task.
    metadata.component.bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.components[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.components[0].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
    metadata.component.components[0].nameStored request.project.files[].path, sorted by path.
    metadata.component.components[0].properties[0].nameStored request.project.files[].path, sorted by path.
    metadata.component.components[0].properties[0].valueByte length of request.project.files[].content.
    metadata.component.components[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.components[1].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.components[1].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
    metadata.component.components[1].nameStored request.project.files[].path, sorted by path.
    metadata.component.components[1].properties[0].nameStored request.project.files[].path, sorted by path.
    metadata.component.components[1].properties[0].valueByte length of request.project.files[].content.
    metadata.component.components[1].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.components[2].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.components[2].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
    metadata.component.components[2].nameStored request.project.files[].path, sorted by path.
    metadata.component.components[2].properties[0].nameStored request.project.files[].path, sorted by path.
    metadata.component.components[2].properties[0].valueByte length of request.project.files[].content.
    metadata.component.components[2].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.descriptionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.externalReferences[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.externalReferences[0].hashes[0].contentSHA-256 of the referenced complete bundle, or qualification file, bytes.
    metadata.component.externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.externalReferences[0].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
    metadata.component.externalReferences[1].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.externalReferences[1].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
    metadata.component.externalReferences[2].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.externalReferences[2].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
    metadata.component.hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.hashes[0].contentFile-set digest recomputed from the stored request's file paths and contents.
    metadata.component.nameUnsigned display label: -name, or the judged file's name for a run with a verdict.
    metadata.component.properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.properties[0].valueUnsigned supplied example context; the run record does not establish authorship.
    metadata.component.properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.properties[1].valueUnsigned supplied example context; the run record does not establish authorship.
    metadata.component.properties[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.properties[2].valueSigned record: request_sha256.
    metadata.component.properties[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.properties[3].valueSigned record: result_sha256.
    metadata.component.properties[4].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.properties[4].valueSigned record: record_sha256.
    metadata.component.properties[5].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.properties[5].valueStored request: trace_id; the bundle link signs the exact stored bytes.
    metadata.component.typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.component.versionFirst 12 hex characters of the file-set digest.
    metadata.lifecycles[0].phaseEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.timestampSigned record.ended_unix_ms, formatted in UTC with milliseconds.
    metadata.tools.components[0].externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.tools.components[0].externalReferences[0].urlEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.tools.components[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.tools.components[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    metadata.tools.components[0].versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    properties[0].valueSHA-256 of the complete bundle file the attached line belongs to.
    properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    properties[1].valueIndex the harness's signed link gives the attached bundle line.
    properties[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    properties[2].valueEmitter mapping constant.
    serialNumberFirst 16 bytes of SHA-256(plimsoll-sbom-serial + newline + record digest), UUID version/variant bits set.
    specVersionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
    Raw CycloneDX JSON
    {
      "annotations": [
        {
          "annotator": {
            "component": {
              "externalReferences": [
                {
                  "type": "vcs",
                  "url": "https://github.com/plimsollmark/plimsoll"
                }
              ],
              "name": "plimsoll-sbom",
              "type": "application",
              "version": "0.2.0"
            }
          },
          "bom-ref": "limits",
          "subjects": [
            "program"
          ],
          "text": "The attached run record is signed; this BOM is unsigned. Agent authorship is supplied example context, not a record fact, and the execution layer cannot identify the model. Network isolation is provider configuration, not a separately signed runtime measurement; a granted run reaches only the routes its grant lists, and what reached the other side is not in this record. The run's times are the daemon's own unwitnessed clock. An attached key alone establishes consistency, not signer identity; use an independently trusted key. Display names and the assessor label are unsigned presentation. The attached bundle line proves itself; the whole bundle it belongs to is referenced by digest and checked when supplied. This is run evidence, not an inventory of the image's installed packages.",
          "timestamp": "2026-10-23T20:11:11.994Z"
        }
      ],
      "bomFormat": "CycloneDX",
      "components": [
        {
          "bom-ref": "image",
          "externalReferences": [
            {
              "hashes": [
                {
                  "alg": "SHA-256",
                  "content": "7e0b9a40e742f401e3a006a7362ebba1c5f3ac832107858dcf104d8f2b6de603"
                }
              ],
              "type": "bom",
              "url": "https://plimsollmark.github.io/plimsoll/examples/sbom/image-a6ef2ea1c8f1.cdx.json"
            },
            {
              "type": "bom",
              "url": "urn:cdx:f9bc9442-7192-4f59-9f06-38f71e427479/1#d13ed0dc05c4b68b"
            }
          ],
          "hashes": [
            {
              "alg": "SHA-256",
              "content": "a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c"
            }
          ],
          "name": "sandbox",
          "properties": [
            {
              "name": "plimsoll:environment",
              "value": "docker-image:sha256:32da77b1be24de4c152667c28ab63531425cd69000acf30a328985cb857377f7"
            },
            {
              "name": "plimsoll:software_identity",
              "value": "oci-manifest:linux/amd64@sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c"
            }
          ],
          "purl": "pkg:oci/sandbox@sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c",
          "type": "container",
          "version": "sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c"
        }
      ],
      "declarations": {
        "affirmation": {
          "statement": "The attached run record was stated by plimsolld, checked and signed by plimsoll-attest, and restated here; plimsoll-attest verify and this program's -check recompute it. This affirmation and BOM are unsigned."
        },
        "assessors": [
          {
            "bom-ref": "assessor",
            "organization": {
              "name": "plimsoll examples (self-assessed)"
            },
            "thirdParty": false
          }
        ],
        "attestations": [
          {
            "assessor": "assessor",
            "map": [
              {
                "claims": [
                  "claim-code"
                ],
                "confidence": {
                  "rationale": "a signature check and a digest recomputation, not a judgement or a probability that the runtime assertion is true",
                  "score": 1
                },
                "conformance": {
                  "rationale": "The claim matches the signed exchange under a deterministic comparison; this is self-assessed consistency, not independent runtime assurance.",
                  "score": 1
                },
                "requirement": "req-code"
              },
              {
                "claims": [
                  "claim-image"
                ],
                "confidence": {
                  "rationale": "a signature check and a digest recomputation, not a judgement or a probability that the runtime assertion is true",
                  "score": 1
                },
                "conformance": {
                  "rationale": "The claim matches the signed exchange under a deterministic comparison; this is self-assessed consistency, not independent runtime assurance.",
                  "score": 1
                },
                "requirement": "req-image"
              },
              {
                "claims": [
                  "claim-tier"
                ],
                "confidence": {
                  "rationale": "a signature check and a digest recomputation, not a judgement or a probability that the runtime assertion is true",
                  "score": 1
                },
                "conformance": {
                  "rationale": "The claim matches the signed exchange under a deterministic comparison; this is self-assessed consistency, not independent runtime assurance.",
                  "score": 1
                },
                "requirement": "req-tier"
              }
            ],
            "summary": "A self-assessed restatement of a signed run record with reproducible consistency checks."
          }
        ],
        "claims": [
          {
            "bom-ref": "claim-code",
            "evidence": [
              "evidence-run-record"
            ],
            "predicate": "The program's 3 files, file-set digest 6bc21d24ac7a0e21fa02e023551a11d0e3d8ce8310039c4b3c6765609f9c14d8, are the files in the stored request whose signed digest 00c95be443d358949d123d77464e9c40b03dafd3f3094b709d8719b004c0a7a4 covers them with the isolation floor and timeout.",
            "reasoning": "Each claim restates the run record the daemon stated and the attest harness checked against the stored request and result and signed. The attached bundle line permits those checks to be repeated. This emitter did not observe execution. The tier is configuration and provider evidence plus startup smoke tests, never runtime attestation.",
            "target": "program"
          },
          {
            "bom-ref": "claim-image",
            "evidence": [
              "evidence-run-record"
            ],
            "predicate": "The daemon states that the run executed in the image whose OCI manifest digest is sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c (environment docker-image:sha256:32da77b1be24de4c152667c28ab63531425cd69000acf30a328985cb857377f7), verified before launch.",
            "reasoning": "Each claim restates the run record the daemon stated and the attest harness checked against the stored request and result and signed. The attached bundle line permits those checks to be repeated. This emitter did not observe execution. The tier is configuration and provider evidence plus startup smoke tests, never runtime attestation.",
            "target": "program"
          },
          {
            "bom-ref": "claim-tier",
            "evidence": [
              "evidence-run-record"
            ],
            "predicate": "The daemon states provider docker and isolation tier kernel, at or above requested floor kernel, from 2026-10-23T20:11:11.071Z to 2026-10-23T20:11:11.994Z UTC; the stored request names no host-API grant and the result digest is 7a38c50fe500b5827774fc68352cc66a153f44e89e7a7f6d6965f5823ad404d9. The provider's no-grant configuration supplies network isolation; this record is not a network measurement.",
            "reasoning": "Each claim restates the run record the daemon stated and the attest harness checked against the stored request and result and signed. The attached bundle line permits those checks to be repeated. This emitter did not observe execution. The tier is configuration and provider evidence plus startup smoke tests, never runtime attestation.",
            "target": "program"
          }
        ],
        "evidence": [
          {
            "author": {
              "name": "plimsoll-attest key 88d311fb942e0fd87cdb1214b385db5fc354c166e84763f6d37885dbc96df379"
            },
            "bom-ref": "evidence-run-record",
            "created": "2026-10-23T20:11:11.994Z",
            "data": [
              {
                "contents": {
                  "attachment": {
                    "content": "eyJwYXlsb2FkVHlwZSI6ImFwcGxpY2F0aW9uL3ZuZC5pbi10b3RvK2pzb24iLCJwYXlsb2FkIjoiZXlKZmRIbHdaU0k2SW1oMGRIQnpPaTh2YVc0dGRHOTBieTVwYnk5VGRHRjBaVzFsYm5RdmRqRWlMQ0p6ZFdKcVpXTjBJanBiZXlKdVlXMWxJam9pY25WdUxYSmxZMjl5WkNJc0ltUnBaMlZ6ZENJNmV5SnphR0V5TlRZaU9pSTJOVFV4WWprMk1qWXlNRFkyWmpFMk5XUTFOVEV4WlRCalpHVmxORGN5Tm1FeVltUTRNak0wWXpVeVpXVXdObUZsT1Rsak5qSmpZV0ZsTVdRelltUXdJbjE5WFN3aWNISmxaR2xqWVhSbFZIbHdaU0k2SW1oMGRIQnpPaTh2Y0d4cGJYTnZiR3h0WVhKckxtZHBkR2gxWWk1cGJ5OXdiR2x0YzI5c2JDOXlkVzR0Y21WamIzSmtMM1l4SWl3aWNISmxaR2xqWVhSbElqcDdJblpsY25OcGIyNGlPalFzSW5KbGNYVmxjM1JmYzJoaE1qVTJJam9pTURCak9UVmlaVFEwTTJRek5UZzVORGxrTVRJelpEYzNORFkwWlRsak5EQmlNRE5rWVdaa00yWXpNRGswWWpjd09XUTROekU1WWpBd05HTXdZVGRoTkNJc0luSmxjM1ZzZEY5emFHRXlOVFlpT2lJM1lUTTRZelV3Wm1VMU1EQmlOVGd5TnpjM05HWmpOamd6TlRKall6WTJZVEUxTTJZME5HVTRPV1UzWVRkbU5tUTJPVFkxWmpVNE1qTmhaRFF3TkdRNUlpd2ljSEp2ZG1sa1pYSWlPaUprYjJOclpYSWlMQ0pwYzI5c1lYUnBiMjRpT2lKclpYSnVaV3dpTENKbGJuWnBjbTl1YldWdWRDSTZJbVJ2WTJ0bGNpMXBiV0ZuWlRwemFHRXlOVFk2TXpKa1lUYzNZakZpWlRJMFpHVTBZekUxTWpZMk4yTXlPR0ZpTmpNMU16RTBNalZqWkRZNU1EQXdZV05tTXpCaE16STRPVGcxWTJJNE5UY3pOemRtTnlJc0luTnZablIzWVhKbFgybGtaVzUwYVhSNUlqb2liMk5wTFcxaGJtbG1aWE4wT214cGJuVjRMMkZ0WkRZMFFITm9ZVEkxTmpwaE5tVm1NbVZoTVdNNFpqRmtaVFZqT0RnMVpURmhNVGhpWVRkbFpUUmtPVFl5WlROaE9EVTVPRGMzWmpabU5EWmpNbVppTjJWaVlXTXhaalpqWXpWaklpd2ljRzlzYVdONUlqb2lJaXdpYzNSaGNuUmxaRjkxYm1sNFgyMXpJam94TnpreU56ZzJNamN4TURjeExDSmxibVJsWkY5MWJtbDRYMjF6SWpveE56a3lOemcyTWpjeE9UazBMQ0p6WlhOemFXOXVJam9pSWl3aWMyVnhkV1Z1WTJVaU9qQXNJbkJ5WlhacGIzVnpYM05vWVRJMU5pSTZJaUlzSW5KbFkyOXlaRjl6YUdFeU5UWWlPaUkyTlRVeFlqazJNall5TURZMlpqRTJOV1ExTlRFeFpUQmpaR1ZsTkRjeU5tRXlZbVE0TWpNMFl6VXlaV1V3Tm1GbE9UbGpOakpqWVdGbE1XUXpZbVF3SW4xOSIsInNpZ25hdHVyZXMiOlt7ImtleWlkIjoiODhkMzExZmI5NDJlMGZkODdjZGIxMjE0YjM4NWRiNWZjMzU0YzE2NmU4NDc2M2Y2ZDM3ODg1ZGJjOTZkZjM3OSIsInNpZyI6Ik03RVpxcmsrV3JqYitXMnJDbElZUndKeEkvNFM0OTVaQnFONDR1by9zMm9nSFd5alllV1o5L2tXalplbzltcFNqV2ErZ0VyWlFUOTF3ZThuSkw2Y0JRPT0ifV19",
                    "contentType": "application/json",
                    "encoding": "base64"
                  }
                },
                "name": "envelope.json"
              },
              {
                "contents": {
                  "attachment": {
                    "content": "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUNvd0JRWURLMlZ3QXlFQWJxQ3hCRE1RT0FZOTREekRWeDl2OG01aE12N1JnTVdRV1NzclR4UnFLcFU9Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo=",
                    "contentType": "application/x-pem-file",
                    "encoding": "base64"
                  }
                },
                "name": "harness.pub"
              },
              {
                "contents": {
                  "attachment": {
                    "content": "eyJyZXF1ZXN0IjoiQ0FRU0JtdGxjbTVsYkJvU2JXRnVhV1psYzNRdGNHOWpMWEoxYmkweElMRHFBVnE3RHdxK0JRb01jbVZqYjI1amFXeGxMbXB6RXEwRkx5OGdjbVZqYjI1amFXeGxMbXB6T2lCdFlYUmphQ0J3WVhsdFpXNTBjeUIwYnlCcGJuWnZhV05sY3lCaWVTQnBiblp2YVdObElHbGtJR0Z1WkNCeVpYQnZjblFnZDJoaGRDQnBjd292THlCMWJuQmhhV1FzSUc5MlpYSndZV2xrSUc5eUlHMWhkR05vWldRdUlFRnRiM1Z1ZEhNZ1lYSmxJR2x1ZEdWblpYSWdZMlZ1ZEhNdUNtWjFibU4wYVc5dUlISmxZMjl1WTJsc1pTaHBiblp2YVdObGN5d2djR0Y1YldWdWRITXBJSHNLSUNCamIyNXpkQ0J3WVdsa0lEMGdibVYzSUUxaGNDZ3BPd29nSUdadmNpQW9ZMjl1YzNRZ2NDQnZaaUJ3WVhsdFpXNTBjeWtnY0dGcFpDNXpaWFFvY0M1cGJuWnZhV05sTENBb2NHRnBaQzVuWlhRb2NDNXBiblp2YVdObEtTQjhmQ0F3S1NBcklIQXVZMlZ1ZEhNcE93b2dJR052Ym5OMElHMWhkR05vWldRZ1BTQmJYU3dnZFc1d1lXbGtJRDBnVzEwc0lHOTJaWEp3WVdsa0lEMGdXMTA3Q2lBZ1ptOXlJQ2hqYjI1emRDQnBibllnYjJZZ2FXNTJiMmxqWlhNcElIc0tJQ0FnSUdOdmJuTjBJR2R2ZENBOUlIQmhhV1F1WjJWMEtHbHVkaTVwWkNrZ2ZId2dNRHNLSUNBZ0lHbG1JQ2huYjNRZ1BUMDlJR2x1ZGk1alpXNTBjeWtnYldGMFkyaGxaQzV3ZFhOb0tHbHVkaTVwWkNrN0NpQWdJQ0JsYkhObElHbG1JQ2huYjNRZ1BDQnBibll1WTJWdWRITXBJSFZ1Y0dGcFpDNXdkWE5vS0hzZ2FXUTZJR2x1ZGk1cFpDd2diM2RsWkRvZ2FXNTJMbU5sYm5SeklDMGdaMjkwSUgwcE93b2dJQ0FnWld4elpTQnZkbVZ5Y0dGcFpDNXdkWE5vS0hzZ2FXUTZJR2x1ZGk1cFpDd2daWGhqWlhOek9pQm5iM1FnTFNCcGJuWXVZMlZ1ZEhNZ2ZTazdDaUFnZlFvZ0lISmxkSFZ5YmlCN0lHMWhkR05vWldRc0lIVnVjR0ZwWkN3Z2IzWmxjbkJoYVdRZ2ZUc0tmUXB0YjJSMWJHVXVaWGh3YjNKMGN5QTlJSHNnY21WamIyNWphV3hsSUgwN0NncXRCUW9SY21WamIyNWphV3hsTG5SbGMzUXVhbk1TbHdWamIyNXpkQ0JoYzNObGNuUWdQU0J5WlhGMWFYSmxLQ0p1YjJSbE9tRnpjMlZ5ZEM5emRISnBZM1FpS1RzS1kyOXVjM1FnZXlCeVpXTnZibU5wYkdVZ2ZTQTlJSEpsY1hWcGNtVW9JaTR2Y21WamIyNWphV3hsTG1weklpazdDbU52Ym5OMElHbHVkbTlwWTJWeklEMGdXd29nSUhzZ2FXUTZJQ0pKVGxZdE1UQXdNU0lzSUdObGJuUnpPaUF4TWpVd01DQjlMQW9nSUhzZ2FXUTZJQ0pKVGxZdE1UQXdNaUlzSUdObGJuUnpPaUE0TURBd0lIMHNDaUFnZXlCcFpEb2dJa2xPVmkweE1EQXpJaXdnWTJWdWRITTZJRFF5TURBZ2ZTd0tYVHNLWTI5dWMzUWdjR0Y1YldWdWRITWdQU0JiQ2lBZ2V5QnBiblp2YVdObE9pQWlTVTVXTFRFd01ERWlMQ0JqWlc1MGN6b2dNVEkxTURBZ2ZTd0tJQ0I3SUdsdWRtOXBZMlU2SUNKSlRsWXRNVEF3TWlJc0lHTmxiblJ6T2lBMU1EQXdJSDBzQ2lBZ2V5QnBiblp2YVdObE9pQWlTVTVXTFRFd01ETWlMQ0JqWlc1MGN6b2dOREl3TUNCOUxBb2dJSHNnYVc1MmIybGpaVG9nSWtsT1ZpMHhNREF6SWl3Z1kyVnVkSE02SURNd01DQjlMQXBkT3dwamIyNXpkQ0J5SUQwZ2NtVmpiMjVqYVd4bEtHbHVkbTlwWTJWekxDQndZWGx0Wlc1MGN5azdDbUZ6YzJWeWRDNWtaV1Z3UlhGMVlXd29jaTV0WVhSamFHVmtMQ0JiSWtsT1ZpMHhNREF4SWwwcE93cGhjM05sY25RdVpHVmxjRVZ4ZFdGc0tISXVkVzV3WVdsa0xDQmJleUJwWkRvZ0lrbE9WaTB4TURBeUlpd2diM2RsWkRvZ016QXdNQ0I5WFNrN0NtRnpjMlZ5ZEM1a1pXVndSWEYxWVd3b2NpNXZkbVZ5Y0dGcFpDd2dXM3NnYVdRNklDSkpUbFl0TVRBd015SXNJR1Y0WTJWemN6b2dNekF3SUgxZEtUc0tZMjl1YzI5c1pTNXNiMmNvSW5KbFkyOXVZMmxzWlRvZ015QmhjM05sY25ScGIyNXpJSEJoYzNObFpDSXBPd29Lb1FRS0IyMWhhVzR1YW5NU2xRUmpiMjV6ZENCN0lISmxZMjl1WTJsc1pTQjlJRDBnY21WeGRXbHlaU2dpTGk5eVpXTnZibU5wYkdVdWFuTWlLVHNLWTI5dWMzUWdhVzUyYjJsalpYTWdQU0JiQ2lBZ2V5QnBaRG9nSWtsT1ZpMHlNREF4SWl3Z1kyVnVkSE02SURrNU1EQXdJSDBzQ2lBZ2V5QnBaRG9nSWtsT1ZpMHlNREF5SWl3Z1kyVnVkSE02SURFMU1EQXdJSDBzQ2lBZ2V5QnBaRG9nSWtsT1ZpMHlNREF6SWl3Z1kyVnVkSE02SURjeU5UQWdmU3dLSUNCN0lHbGtPaUFpU1U1V0xUSXdNRFFpTENCalpXNTBjem9nTXpFd01EQWdmU3dLWFRzS1kyOXVjM1FnY0dGNWJXVnVkSE1nUFNCYkNpQWdleUJwYm5admFXTmxPaUFpU1U1V0xUSXdNREVpTENCalpXNTBjem9nT1Rrd01EQWdmU3dLSUNCN0lHbHVkbTlwWTJVNklDSkpUbFl0TWpBd01pSXNJR05sYm5Sek9pQXhOVEF3TUNCOUxBb2dJSHNnYVc1MmIybGpaVG9nSWtsT1ZpMHlNREEwSWl3Z1kyVnVkSE02SURNeE1EQXdJSDBzQ2lBZ2V5QnBiblp2YVdObE9pQWlTVTVXTFRJd01EUWlMQ0JqWlc1MGN6b2dNVEF3TUNCOUxBcGRPd3BqYjI1emRDQnlJRDBnY21WamIyNWphV3hsS0dsdWRtOXBZMlZ6TENCd1lYbHRaVzUwY3lrN0NtTnZibk52YkdVdWJHOW5LRXBUVDA0dWMzUnlhVzVuYVdaNUtIc2dhVzUyYjJsalpYTTZJR2x1ZG05cFkyVnpMbXhsYm1kMGFDd2djR0Y1YldWdWRITTZJSEJoZVcxbGJuUnpMbXhsYm1kMGFDd2dMaTR1Y2lCOUtTazdDaElXYm05a1pTQnlaV052Ym1OcGJHVXVkR1Z6ZEM1cWN4SU1ibTlrWlNCdFlXbHVMbXB6IiwicmVzcG9uc2UiOiJDZ1prYjJOclpYSVNCbXRsY201bGJCaWFCeUtlQXdnRUVrQXdNR001TldKbE5EUXpaRE0xT0RrME9XUXhNak5rTnpjME5qUmxPV00wTUdJd00yUmhabVF6WmpNd09UUmlOekE1WkRnM01UbGlNREEwWXpCaE4yRTBHa0EzWVRNNFl6VXdabVUxTURCaU5UZ3lOemMzTkdaak5qZ3pOVEpqWXpZMllURTFNMlkwTkdVNE9XVTNZVGRtTm1RMk9UWTFaalU0TWpOaFpEUXdOR1E1SWdaa2IyTnJaWElxQm10bGNtNWxiREpVWkc5amEyVnlMV2x0WVdkbE9uTm9ZVEkxTmpvek1tUmhOemRpTVdKbE1qUmtaVFJqTVRVeU5qWTNZekk0WVdJMk16VXpNVFF5TldOa05qa3dNREJoWTJZek1HRXpNamc1T0RWallqZzFOek0zTjJZM1FOK1dqdE9XTkVqNm5ZN1RsalJxUURZMU5URmlPVFl5TmpJd05qWm1NVFkxWkRVMU1URmxNR05rWldVME56STJZVEppWkRneU16UmpOVEpsWlRBMllXVTVPV00yTW1OaFlXVXhaRE5pWkRCeVlHOWphUzF0WVc1cFptVnpkRHBzYVc1MWVDOWhiV1EyTkVCemFHRXlOVFk2WVRabFpqSmxZVEZqT0dZeFpHVTFZemc0TldVeFlURTRZbUUzWldVMFpEazJNbVV6WVRnMU9UZzNOMlkyWmpRMll6Sm1ZamRsWW1Gak1XWTJZMk0xWXlwZ2IyTnBMVzFoYm1sbVpYTjBPbXhwYm5WNEwyRnRaRFkwUUhOb1lUSTFOanBoTm1WbU1tVmhNV000WmpGa1pUVmpPRGcxWlRGaE1UaGlZVGRsWlRSa09UWXlaVE5oT0RVNU9EYzNaalptTkRaak1tWmlOMlZpWVdNeFpqWmpZelZqTWxSa2IyTnJaWEl0YVcxaFoyVTZjMmhoTWpVMk9qTXlaR0UzTjJJeFltVXlOR1JsTkdNeE5USTJOamRqTWpoaFlqWXpOVE14TkRJMVkyUTJPVEF3TUdGalpqTXdZVE15T0RrNE5XTmlPRFUzTXpjM1pqZGE2Z0VLUEFvV2JtOWtaU0J5WldOdmJtTnBiR1V1ZEdWemRDNXFjeElmY21WamIyNWphV3hsT2lBeklHRnpjMlZ5ZEdsdmJuTWdjR0Z6YzJWa0NqQ09BUXFuQVFvTWJtOWtaU0J0WVdsdUxtcHpFcFFCZXlKcGJuWnZhV05sY3lJNk5Dd2ljR0Y1YldWdWRITWlPalFzSW0xaGRHTm9aV1FpT2xzaVNVNVdMVEl3TURFaUxDSkpUbFl0TWpBd01pSmRMQ0oxYm5CaGFXUWlPbHQ3SW1sa0lqb2lTVTVXTFRJd01ETWlMQ0p2ZDJWa0lqbzNNalV3ZlYwc0ltOTJaWEp3WVdsa0lqcGJleUpwWkNJNklrbE9WaTB5TURBMElpd2laWGhqWlhOeklqb3hNREF3ZlYxOUNqQmZHQUU9IiwiZW52ZWxvcGUiOnsicGF5bG9hZFR5cGUiOiJhcHBsaWNhdGlvbi92bmQuaW4tdG90bytqc29uIiwicGF5bG9hZCI6ImV5SmZkSGx3WlNJNkltaDBkSEJ6T2k4dmFXNHRkRzkwYnk1cGJ5OVRkR0YwWlcxbGJuUXZkakVpTENKemRXSnFaV04wSWpwYmV5SnVZVzFsSWpvaWNuVnVMWEpsWTI5eVpDSXNJbVJwWjJWemRDSTZleUp6YUdFeU5UWWlPaUkyTlRVeFlqazJNall5TURZMlpqRTJOV1ExTlRFeFpUQmpaR1ZsTkRjeU5tRXlZbVE0TWpNMFl6VXlaV1V3Tm1GbE9UbGpOakpqWVdGbE1XUXpZbVF3SW4xOVhTd2ljSEpsWkdsallYUmxWSGx3WlNJNkltaDBkSEJ6T2k4dmNHeHBiWE52Ykd4dFlYSnJMbWRwZEdoMVlpNXBieTl3YkdsdGMyOXNiQzl5ZFc0dGNtVmpiM0prTDNZeElpd2ljSEpsWkdsallYUmxJanA3SW5abGNuTnBiMjRpT2pRc0luSmxjWFZsYzNSZmMyaGhNalUySWpvaU1EQmpPVFZpWlRRME0yUXpOVGc1TkRsa01USXpaRGMzTkRZMFpUbGpOREJpTUROa1lXWmtNMll6TURrMFlqY3dPV1E0TnpFNVlqQXdOR013WVRkaE5DSXNJbkpsYzNWc2RGOXphR0V5TlRZaU9pSTNZVE00WXpVd1ptVTFNREJpTlRneU56YzNOR1pqTmpnek5USmpZelkyWVRFMU0yWTBOR1U0T1dVM1lUZG1ObVEyT1RZMVpqVTRNak5oWkRRd05HUTVJaXdpY0hKdmRtbGtaWElpT2lKa2IyTnJaWElpTENKcGMyOXNZWFJwYjI0aU9pSnJaWEp1Wld3aUxDSmxiblpwY205dWJXVnVkQ0k2SW1SdlkydGxjaTFwYldGblpUcHphR0V5TlRZNk16SmtZVGMzWWpGaVpUSTBaR1UwWXpFMU1qWTJOMk15T0dGaU5qTTFNekUwTWpWalpEWTVNREF3WVdObU16QmhNekk0T1RnMVkySTROVGN6TnpkbU55SXNJbk52Wm5SM1lYSmxYMmxrWlc1MGFYUjVJam9pYjJOcExXMWhibWxtWlhOME9teHBiblY0TDJGdFpEWTBRSE5vWVRJMU5qcGhObVZtTW1WaE1XTTRaakZrWlRWak9EZzFaVEZoTVRoaVlUZGxaVFJrT1RZeVpUTmhPRFU1T0RjM1pqWm1ORFpqTW1aaU4yVmlZV014Wmpaall6VmpJaXdpY0c5c2FXTjVJam9pSWl3aWMzUmhjblJsWkY5MWJtbDRYMjF6SWpveE56a3lOemcyTWpjeE1EY3hMQ0psYm1SbFpGOTFibWw0WDIxeklqb3hOemt5TnpnMk1qY3hPVGswTENKelpYTnphVzl1SWpvaUlpd2ljMlZ4ZFdWdVkyVWlPakFzSW5CeVpYWnBiM1Z6WDNOb1lUSTFOaUk2SWlJc0luSmxZMjl5WkY5emFHRXlOVFlpT2lJMk5UVXhZamsyTWpZeU1EWTJaakUyTldRMU5URXhaVEJqWkdWbE5EY3lObUV5WW1RNE1qTTBZelV5WldVd05tRmxPVGxqTmpKallXRmxNV1F6WW1Rd0luMTkiLCJzaWduYXR1cmVzIjpbeyJrZXlpZCI6Ijg4ZDMxMWZiOTQyZTBmZDg3Y2RiMTIxNGIzODVkYjVmYzM1NGMxNjZlODQ3NjNmNmQzNzg4NWRiYzk2ZGYzNzkiLCJzaWciOiJNN0VacXJrK1dyamIrVzJyQ2xJWVJ3SnhJLzRTNDk1WkJxTjQ0dW8vczJvZ0hXeWpZZVdaOS9rV2paZW85bXBTaldhK2dFclpRVDkxd2U4bkpMNmNCUT09In1dfSwibGluayI6eyJwYXlsb2FkVHlwZSI6ImFwcGxpY2F0aW9uL3ZuZC5pbi10b3RvK2pzb24iLCJwYXlsb2FkIjoiZXlKZmRIbHdaU0k2SW1oMGRIQnpPaTh2YVc0dGRHOTBieTVwYnk5VGRHRjBaVzFsYm5RdmRqRWlMQ0p6ZFdKcVpXTjBJanBiZXlKdVlXMWxJam9pWW5WdVpHeGxMV3hwYm1VaUxDSmthV2RsYzNRaU9uc2ljMmhoTWpVMklqb2lZek13TkRRMVpqUmhaVGxtTlRFME9EZGxZamhtTWpjM1ltRTBObU5qWVRReE1XWTFZekF5T1RGaVl6Y3pOV1JrTmpBMlpESXhPVEl4TW1VeU9ERm1OU0o5ZlYwc0luQnlaV1JwWTJGMFpWUjVjR1VpT2lKb2RIUndjem92TDNCc2FXMXpiMnhzYldGeWF5NW5hWFJvZFdJdWFXOHZjR3hwYlhOdmJHd3ZZblZ1Wkd4bExXeHBibXN2ZGpFaUxDSndjbVZrYVdOaGRHVWlPbnNpYVc1a1pYZ2lPakVzSW5CeVpYWnBiM1Z6WDNOb1lUSTFOaUk2SWlJc0ltVnVkSEo1WDNOb1lUSTFOaUk2SW1Nek1EUTBOV1kwWVdVNVpqVXhORGczWldJNFpqSTNOMkpoTkRaalkyRTBNVEZtTldNd01qa3hZbU0zTXpWa1pEWXdObVF5TVRreU1USmxNamd4WmpVaWZYMD0iLCJzaWduYXR1cmVzIjpbeyJrZXlpZCI6Ijg4ZDMxMWZiOTQyZTBmZDg3Y2RiMTIxNGIzODVkYjVmYzM1NGMxNjZlODQ3NjNmNmQzNzg4NWRiYzk2ZGYzNzkiLCJzaWciOiJkUnJ2OHZSQUU2Z1Iwd21vREtxcnRYNE9DcW1OVDkvMjVReDI2MTc3WVBuMWZFVmZWeU5Rb1ppbDc0d2hJb0QzaXVXQzlScklUTDg0cjl5Si9XMnhCdz09In1dfX0=",
                    "contentType": "application/json",
                    "encoding": "base64"
                  }
                },
                "name": "entry.json"
              },
              {
                "contents": {
                  "attachment": {
                    "content": "eyJyZXF1ZXN0Ijp7Im1pbmltdW1faXNvbGF0aW9uIjoia2VybmVsIiwicHJvamVjdCI6eyJhcnRpZmFjdHMiOltdLCJmaWxlcyI6W3siY29udGVudCI6Ii8vIHJlY29uY2lsZS5qczogbWF0Y2ggcGF5bWVudHMgdG8gaW52b2ljZXMgYnkgaW52b2ljZSBpZCBhbmQgcmVwb3J0IHdoYXQgaXNcbi8vIHVucGFpZCwgb3ZlcnBhaWQgb3IgbWF0Y2hlZC4gQW1vdW50cyBhcmUgaW50ZWdlciBjZW50cy5cbmZ1bmN0aW9uIHJlY29uY2lsZShpbnZvaWNlcywgcGF5bWVudHMpIHtcbiAgY29uc3QgcGFpZCA9IG5ldyBNYXAoKTtcbiAgZm9yIChjb25zdCBwIG9mIHBheW1lbnRzKSBwYWlkLnNldChwLmludm9pY2UsIChwYWlkLmdldChwLmludm9pY2UpIHx8IDApICsgcC5jZW50cyk7XG4gIGNvbnN0IG1hdGNoZWQgPSBbXSwgdW5wYWlkID0gW10sIG92ZXJwYWlkID0gW107XG4gIGZvciAoY29uc3QgaW52IG9mIGludm9pY2VzKSB7XG4gICAgY29uc3QgZ290ID0gcGFpZC5nZXQoaW52LmlkKSB8fCAwO1xuICAgIGlmIChnb3QgPT09IGludi5jZW50cykgbWF0Y2hlZC5wdXNoKGludi5pZCk7XG4gICAgZWxzZSBpZiAoZ290IFx1MDAzYyBpbnYuY2VudHMpIHVucGFpZC5wdXNoKHsgaWQ6IGludi5pZCwgb3dlZDogaW52LmNlbnRzIC0gZ290IH0pO1xuICAgIGVsc2Ugb3ZlcnBhaWQucHVzaCh7IGlkOiBpbnYuaWQsIGV4Y2VzczogZ290IC0gaW52LmNlbnRzIH0pO1xuICB9XG4gIHJldHVybiB7IG1hdGNoZWQsIHVucGFpZCwgb3ZlcnBhaWQgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0geyByZWNvbmNpbGUgfTtcbiIsInBhdGgiOiJyZWNvbmNpbGUuanMifSx7ImNvbnRlbnQiOiJjb25zdCBhc3NlcnQgPSByZXF1aXJlKFwibm9kZTphc3NlcnQvc3RyaWN0XCIpO1xuY29uc3QgeyByZWNvbmNpbGUgfSA9IHJlcXVpcmUoXCIuL3JlY29uY2lsZS5qc1wiKTtcbmNvbnN0IGludm9pY2VzID0gW1xuICB7IGlkOiBcIklOVi0xMDAxXCIsIGNlbnRzOiAxMjUwMCB9LFxuICB7IGlkOiBcIklOVi0xMDAyXCIsIGNlbnRzOiA4MDAwIH0sXG4gIHsgaWQ6IFwiSU5WLTEwMDNcIiwgY2VudHM6IDQyMDAgfSxcbl07XG5jb25zdCBwYXltZW50cyA9IFtcbiAgeyBpbnZvaWNlOiBcIklOVi0xMDAxXCIsIGNlbnRzOiAxMjUwMCB9LFxuICB7IGludm9pY2U6IFwiSU5WLTEwMDJcIiwgY2VudHM6IDUwMDAgfSxcbiAgeyBpbnZvaWNlOiBcIklOVi0xMDAzXCIsIGNlbnRzOiA0MjAwIH0sXG4gIHsgaW52b2ljZTogXCJJTlYtMTAwM1wiLCBjZW50czogMzAwIH0sXG5dO1xuY29uc3QgciA9IHJlY29uY2lsZShpbnZvaWNlcywgcGF5bWVudHMpO1xuYXNzZXJ0LmRlZXBFcXVhbChyLm1hdGNoZWQsIFtcIklOVi0xMDAxXCJdKTtcbmFzc2VydC5kZWVwRXF1YWwoci51bnBhaWQsIFt7IGlkOiBcIklOVi0xMDAyXCIsIG93ZWQ6IDMwMDAgfV0pO1xuYXNzZXJ0LmRlZXBFcXVhbChyLm92ZXJwYWlkLCBbeyBpZDogXCJJTlYtMTAwM1wiLCBleGNlc3M6IDMwMCB9XSk7XG5jb25zb2xlLmxvZyhcInJlY29uY2lsZTogMyBhc3NlcnRpb25zIHBhc3NlZFwiKTtcbiIsInBhdGgiOiJyZWNvbmNpbGUudGVzdC5qcyJ9LHsiY29udGVudCI6ImNvbnN0IHsgcmVjb25jaWxlIH0gPSByZXF1aXJlKFwiLi9yZWNvbmNpbGUuanNcIik7XG5jb25zdCBpbnZvaWNlcyA9IFtcbiAgeyBpZDogXCJJTlYtMjAwMVwiLCBjZW50czogOTkwMDAgfSxcbiAgeyBpZDogXCJJTlYtMjAwMlwiLCBjZW50czogMTUwMDAgfSxcbiAgeyBpZDogXCJJTlYtMjAwM1wiLCBjZW50czogNzI1MCB9LFxuICB7IGlkOiBcIklOVi0yMDA0XCIsIGNlbnRzOiAzMTAwMCB9LFxuXTtcbmNvbnN0IHBheW1lbnRzID0gW1xuICB7IGludm9pY2U6IFwiSU5WLTIwMDFcIiwgY2VudHM6IDk5MDAwIH0sXG4gIHsgaW52b2ljZTogXCJJTlYtMjAwMlwiLCBjZW50czogMTUwMDAgfSxcbiAgeyBpbnZvaWNlOiBcIklOVi0yMDA0XCIsIGNlbnRzOiAzMTAwMCB9LFxuICB7IGludm9pY2U6IFwiSU5WLTIwMDRcIiwgY2VudHM6IDEwMDAgfSxcbl07XG5jb25zdCByID0gcmVjb25jaWxlKGludm9pY2VzLCBwYXltZW50cyk7XG5jb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGludm9pY2VzOiBpbnZvaWNlcy5sZW5ndGgsIHBheW1lbnRzOiBwYXltZW50cy5sZW5ndGgsIC4uLnIgfSkpO1xuIiwicGF0aCI6Im1haW4uanMifV0sImdyYW50X3Byb2ZpbGUiOiIiLCJzdGVwcyI6WyJub2RlIHJlY29uY2lsZS50ZXN0LmpzIiwibm9kZSBtYWluLmpzIl19LCJwcm90b2NvbCI6NCwic29mdHdhcmVfcnVsZSI6bnVsbCwidGltZW91dF9tcyI6MzAwMDAsInRyYWNlX2lkIjoibWFuaWZlc3QtcG9jLXJ1bi0xIn0sInJlc3BvbnNlIjp7ImR1cmF0aW9uX21zIjoiOTIyIiwiZW52aXJvbm1lbnQiOiJkb2NrZXItaW1hZ2U6c2hhMjU2OjMyZGE3N2IxYmUyNGRlNGMxNTI2NjdjMjhhYjYzNTMxNDI1Y2Q2OTAwMGFjZjMwYTMyODk4NWNiODU3Mzc3ZjciLCJpbnN0YW5jZSI6IiIsImlzb2xhdGlvbiI6Imtlcm5lbCIsInByb2plY3QiOnsiYWR2aWNlIjpbXSwiYXJ0aWZhY3RzIjpbXSwiYXJ0aWZhY3RzX3RydW5jYXRlZCI6ZmFsc2UsIm91dGNvbWUiOiJQUk9KRUNUX09VVENPTUVfQ09NUExFVEVEIiwib3V0Y29tZV9kZXRhaWwiOiIiLCJzdGVwcyI6W3siY29tbWFuZCI6Im5vZGUgcmVjb25jaWxlLnRlc3QuanMiLCJkdXJhdGlvbl9tcyI6IjE0MiIsImV4aXRfY29kZSI6MCwic3RkZXJyIjoiIiwic3RkZXJyX3RydW5jYXRlZCI6ZmFsc2UsInN0ZG91dCI6ImNtVmpiMjVqYVd4bE9pQXpJR0Z6YzJWeWRHbHZibk1nY0dGemMyVmtDZz09Iiwic3Rkb3V0X3RydW5jYXRlZCI6ZmFsc2UsInRpbWVkX291dCI6ZmFsc2V9LHsiY29tbWFuZCI6Im5vZGUgbWFpbi5qcyIsImR1cmF0aW9uX21zIjoiOTUiLCJleGl0X2NvZGUiOjAsInN0ZGVyciI6IiIsInN0ZGVycl90cnVuY2F0ZWQiOmZhbHNlLCJzdGRvdXQiOiJleUpwYm5admFXTmxjeUk2TkN3aWNHRjViV1Z1ZEhNaU9qUXNJbTFoZEdOb1pXUWlPbHNpU1U1V0xUSXdNREVpTENKSlRsWXRNakF3TWlKZExDSjFibkJoYVdRaU9sdDdJbWxrSWpvaVNVNVdMVEl3TURNaUxDSnZkMlZrSWpvM01qVXdmVjBzSW05MlpYSndZV2xrSWpwYmV5SnBaQ0k2SWtsT1ZpMHlNREEwSWl3aVpYaGpaWE56SWpveE1EQXdmVjE5Q2c9PSIsInN0ZG91dF90cnVuY2F0ZWQiOmZhbHNlLCJ0aW1lZF9vdXQiOmZhbHNlfV19LCJyZWNvcmQiOnsiZW5kZWRfdW5peF9tcyI6IjE3OTI3ODYyNzE5OTQiLCJlbnZpcm9ubWVudCI6ImRvY2tlci1pbWFnZTpzaGEyNTY6MzJkYTc3YjFiZTI0ZGU0YzE1MjY2N2MyOGFiNjM1MzE0MjVjZDY5MDAwYWNmMzBhMzI4OTg1Y2I4NTczNzdmNyIsImluc3RhbmNlIjoiIiwiaXNvbGF0aW9uIjoia2VybmVsIiwicG9saWN5IjoiIiwicHJldmlvdXNfc2hhMjU2IjoiIiwicHJvdmlkZXIiOiJkb2NrZXIiLCJyZWNvcmRfc2hhMjU2IjoiNjU1MWI5NjI2MjA2NmYxNjVkNTUxMWUwY2RlZTQ3MjZhMmJkODIzNGM1MmVlMDZhZTk5YzYyY2FhZTFkM2JkMCIsInJlcXVlc3Rfc2hhMjU2IjoiMDBjOTViZTQ0M2QzNTg5NDlkMTIzZDc3NDY0ZTljNDBiMDNkYWZkM2YzMDk0YjcwOWQ4NzE5YjAwNGMwYTdhNCIsInJlc3VsdF9zaGEyNTYiOiI3YTM4YzUwZmU1MDBiNTgyNzc3NGZjNjgzNTJjYzY2YTE1M2Y0NGU4OWU3YTdmNmQ2OTY1ZjU4MjNhZDQwNGQ5Iiwic2VxdWVuY2UiOiIwIiwic2Vzc2lvbiI6IiIsInNvZnR3YXJlX2lkZW50aXR5Ijoib2NpLW1hbmlmZXN0OmxpbnV4L2FtZDY0QHNoYTI1NjphNmVmMmVhMWM4ZjFkZTVjODg1ZTFhMThiYTdlZTRkOTYyZTNhODU5ODc3ZjZmNDZjMmZiN2ViYWMxZjZjYzVjIiwic29mdHdhcmVfcnVsZV9pZCI6IiIsInN0YXJ0ZWRfdW5peF9tcyI6IjE3OTI3ODYyNzEwNzEiLCJ1bmFuc3dlcmVkIjoiIiwidmVyc2lvbiI6NH0sInNhbmRib3giOiJkb2NrZXIiLCJzb2Z0d2FyZV9pZGVudGl0eSI6Im9jaS1tYW5pZmVzdDpsaW51eC9hbWQ2NEBzaGEyNTY6YTZlZjJlYTFjOGYxZGU1Yzg4NWUxYTE4YmE3ZWU0ZDk2MmUzYTg1OTg3N2Y2ZjQ2YzJmYjdlYmFjMWY2Y2M1YyJ9fQ==",
                    "contentType": "application/json",
                    "encoding": "base64"
                  }
                },
                "name": "exchange.json"
              }
            ],
            "description": "Public example evidence: DSSE envelope, signed body type application/vnd.in-toto+json, in-toto statement https://in-toto.io/Statement/v1, predicate https://plimsollmark.github.io/plimsoll/run-record/v1, key id 88d311fb942e0fd87cdb1214b385db5fc354c166e84763f6d37885dbc96df379. entry.json is line 1 of the referenced bundle as stored: the exact binary protobuf request and response, the record's envelope and the harness's signed link placing the line. exchange.json is a plain JSON copy checked against those bytes.",
            "propertyName": "plimsoll:run_record"
          }
        ]
      },
      "definitions": {
        "standards": [
          {
            "bom-ref": "std-plimsoll-run-evidence",
            "name": "plimsoll run evidence",
            "requirements": [
              {
                "bom-ref": "req-code",
                "identifier": "R1",
                "title": "the code that ran is identified by digest"
              },
              {
                "bom-ref": "req-image",
                "identifier": "R2",
                "title": "the image is identified by its manifest digest"
              },
              {
                "bom-ref": "req-tier",
                "identifier": "R3",
                "title": "the isolation tier the daemon states is signed"
              }
            ],
            "version": "1"
          }
        ]
      },
      "formulation": [
        {
          "bom-ref": "formula",
          "workflows": [
            {
              "bom-ref": "run",
              "inputs": [
                {
                  "resource": {
                    "ref": "program"
                  }
                }
              ],
              "name": "plimsoll run",
              "outputs": [
                {
                  "properties": [
                    {
                      "name": "plimsoll:result_sha256",
                      "value": "7a38c50fe500b5827774fc68352cc66a153f44e89e7a7f6d6965f5823ad404d9"
                    }
                  ],
                  "resource": {
                    "ref": "evidence-run-record"
                  },
                  "type": "other"
                }
              ],
              "properties": [
                {
                  "name": "plimsoll:provider",
                  "value": "docker"
                },
                {
                  "name": "plimsoll:isolation",
                  "value": "kernel"
                },
                {
                  "name": "plimsoll:minimum_isolation",
                  "value": "kernel"
                },
                {
                  "name": "plimsoll:timeout_ms",
                  "value": "30000"
                },
                {
                  "name": "plimsoll:grant",
                  "value": "none"
                },
                {
                  "name": "plimsoll:outcome",
                  "value": "completed"
                }
              ],
              "runtimeTopology": [
                {
                  "dependsOn": [
                    "image"
                  ],
                  "ref": "program"
                }
              ],
              "taskDependencies": [
                {
                  "ref": "step-1"
                },
                {
                  "dependsOn": [
                    "step-1"
                  ],
                  "ref": "step-2"
                }
              ],
              "taskTypes": [
                "other"
              ],
              "tasks": [
                {
                  "bom-ref": "step-1",
                  "name": "node reconcile.test.js",
                  "steps": [
                    {
                      "commands": [
                        {
                          "executed": "node reconcile.test.js",
                          "properties": [
                            {
                              "name": "plimsoll:exit_code",
                              "value": "0"
                            },
                            {
                              "name": "plimsoll:duration_ms",
                              "value": "142"
                            },
                            {
                              "name": "plimsoll:timed_out",
                              "value": "false"
                            },
                            {
                              "name": "plimsoll:stdout_truncated",
                              "value": "false"
                            },
                            {
                              "name": "plimsoll:stderr_truncated",
                              "value": "false"
                            }
                          ]
                        }
                      ]
                    }
                  ],
                  "taskTypes": [
                    "other"
                  ],
                  "uid": "1"
                },
                {
                  "bom-ref": "step-2",
                  "name": "node main.js",
                  "steps": [
                    {
                      "commands": [
                        {
                          "executed": "node main.js",
                          "properties": [
                            {
                              "name": "plimsoll:exit_code",
                              "value": "0"
                            },
                            {
                              "name": "plimsoll:duration_ms",
                              "value": "95"
                            },
                            {
                              "name": "plimsoll:timed_out",
                              "value": "false"
                            },
                            {
                              "name": "plimsoll:stdout_truncated",
                              "value": "false"
                            },
                            {
                              "name": "plimsoll:stderr_truncated",
                              "value": "false"
                            }
                          ]
                        }
                      ]
                    }
                  ],
                  "taskTypes": [
                    "other"
                  ],
                  "uid": "2"
                }
              ],
              "timeEnd": "2026-10-23T20:11:11.994Z",
              "timeStart": "2026-10-23T20:11:11.071Z",
              "uid": "6551b96262066f165d5511e0cdee4726a2bd8234c52ee06ae99c62caae1d3bd0"
            }
          ]
        }
      ],
      "metadata": {
        "component": {
          "bom-ref": "program",
          "components": [
            {
              "hashes": [
                {
                  "alg": "SHA-256",
                  "content": "71ef6972211c39f941bfac9534cefd7b19cff470419f148a7351743d011b7698"
                }
              ],
              "name": "main.js",
              "properties": [
                {
                  "name": "plimsoll:bytes",
                  "value": "533"
                }
              ],
              "type": "file"
            },
            {
              "hashes": [
                {
                  "alg": "SHA-256",
                  "content": "c2de8205ca1e811fba188b71b051e25644f88b8190351372ab3ed4a842231456"
                }
              ],
              "name": "reconcile.js",
              "properties": [
                {
                  "name": "plimsoll:bytes",
                  "value": "685"
                }
              ],
              "type": "file"
            },
            {
              "hashes": [
                {
                  "alg": "SHA-256",
                  "content": "ce76efdec6de19969e12f5ca27b273396ca274dfa330df36811f78354c659c97"
                }
              ],
              "name": "reconcile.test.js",
              "properties": [
                {
                  "name": "plimsoll:bytes",
                  "value": "663"
                }
              ],
              "type": "file"
            }
          ],
          "description": "An agent-style example program run once through plimsoll; authorship is supplied context, not verified evidence.",
          "externalReferences": [
            {
              "hashes": [
                {
                  "alg": "SHA-256",
                  "content": "3f7028e3e5d367770ac721306548d7d741a9eeb284f8bbd4441320f76076e772"
                }
              ],
              "type": "attestation",
              "url": "https://plimsollmark.github.io/plimsoll/examples/sbom/bundle.jsonl"
            },
            {
              "type": "documentation",
              "url": "https://plimsollmark.github.io/plimsoll/examples/sbom/index.html"
            },
            {
              "type": "vcs",
              "url": "https://github.com/plimsollmark/plimsoll"
            }
          ],
          "hashes": [
            {
              "alg": "SHA-256",
              "content": "6bc21d24ac7a0e21fa02e023551a11d0e3d8ce8310039c4b3c6765609f9c14d8"
            }
          ],
          "name": "reconcile",
          "properties": [
            {
              "name": "plimsoll:author_kind",
              "value": "agent"
            },
            {
              "name": "plimsoll:author_kind_basis",
              "value": "supplied example context, unverified"
            },
            {
              "name": "plimsoll:request_sha256",
              "value": "00c95be443d358949d123d77464e9c40b03dafd3f3094b709d8719b004c0a7a4"
            },
            {
              "name": "plimsoll:result_sha256",
              "value": "7a38c50fe500b5827774fc68352cc66a153f44e89e7a7f6d6965f5823ad404d9"
            },
            {
              "name": "plimsoll:record_sha256",
              "value": "6551b96262066f165d5511e0cdee4726a2bd8234c52ee06ae99c62caae1d3bd0"
            },
            {
              "name": "plimsoll:trace_id",
              "value": "manifest-poc-run-1"
            }
          ],
          "type": "application",
          "version": "6bc21d24ac7a"
        },
        "lifecycles": [
          {
            "phase": "operations"
          }
        ],
        "timestamp": "2026-10-23T20:11:11.994Z",
        "tools": {
          "components": [
            {
              "externalReferences": [
                {
                  "type": "vcs",
                  "url": "https://github.com/plimsollmark/plimsoll"
                }
              ],
              "name": "plimsoll-sbom",
              "type": "application",
              "version": "0.2.0"
            }
          ]
        }
      },
      "properties": [
        {
          "name": "plimsoll:bundle_sha256",
          "value": "3f7028e3e5d367770ac721306548d7d741a9eeb284f8bbd4441320f76076e772"
        },
        {
          "name": "plimsoll:bundle_line",
          "value": "1"
        },
        {
          "name": "plimsoll:emitter",
          "value": "examples/sbom"
        }
      ],
      "serialNumber": "urn:uuid:6e3c9a20-78d4-490e-941e-5c3f308ad1f7",
      "specVersion": "1.6",
      "version": 1
    }
    

    The run with an egress attempt

    Outcome: completedStated tier: kernelFloor asked: kernelNo grant: no networkBundle line 3

    The completed outcome means the runner returned a normal result; a step with a nonzero exit code still failed. The stated tier is the daemon's reported isolation tier, backed by provider configuration and startup checks, never runtime attestation.

    Time (UTC)
    2026-10-23T20:11:12.005Z to 2026-10-23T20:11:18.168Z
    Request digest
    b5386b8a32215a20f843fddccc796543ab45ff0bf7fa63d38ca87855d201a7e1
    Record digest
    29c2e7b07429f25bbedda4f4572b4720837437bbf1f6e924a75d7d44739509d6
    Image identity
    oci-manifest:linux/amd64@sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c
    Bundle
    INTERNAL · bundle.jsonl, line 3 →

    Open Container Initiative (OCI) is the container image format. The manifest digest identifies the selected image for one platform, such as Linux on a standard PC processor (linux/amd64). A display name never supplies that identity.

    INTERNAL · this run's CycloneDX JSON →

    The program's files

    reconcile.js

    SHA-256: c2de8205ca1e811fba188b71b051e25644f88b8190351372ab3ed4a842231456

    // reconcile.js: match payments to invoices by invoice id and report what is
    // unpaid, overpaid or matched. Amounts are integer cents.
    function reconcile(invoices, payments) {
      const paid = new Map();
      for (const p of payments) paid.set(p.invoice, (paid.get(p.invoice) || 0) + p.cents);
      const matched = [], unpaid = [], overpaid = [];
      for (const inv of invoices) {
        const got = paid.get(inv.id) || 0;
        if (got === inv.cents) matched.push(inv.id);
        else if (got < inv.cents) unpaid.push({ id: inv.id, owed: inv.cents - got });
        else overpaid.push({ id: inv.id, excess: got - inv.cents });
      }
      return { matched, unpaid, overpaid };
    }
    module.exports = { reconcile };
    
    reconcile.test.js

    SHA-256: ce76efdec6de19969e12f5ca27b273396ca274dfa330df36811f78354c659c97

    const assert = require("node:assert/strict");
    const { reconcile } = require("./reconcile.js");
    const invoices = [
      { id: "INV-1001", cents: 12500 },
      { id: "INV-1002", cents: 8000 },
      { id: "INV-1003", cents: 4200 },
    ];
    const payments = [
      { invoice: "INV-1001", cents: 12500 },
      { invoice: "INV-1002", cents: 5000 },
      { invoice: "INV-1003", cents: 4200 },
      { invoice: "INV-1003", cents: 300 },
    ];
    const r = reconcile(invoices, payments);
    assert.deepEqual(r.matched, ["INV-1001"]);
    assert.deepEqual(r.unpaid, [{ id: "INV-1002", owed: 3000 }]);
    assert.deepEqual(r.overpaid, [{ id: "INV-1003", excess: 300 }]);
    console.log("reconcile: 3 assertions passed");
    
    main.js

    SHA-256: 71ef6972211c39f941bfac9534cefd7b19cff470419f148a7351743d011b7698

    const { reconcile } = require("./reconcile.js");
    const invoices = [
      { id: "INV-2001", cents: 99000 },
      { id: "INV-2002", cents: 15000 },
      { id: "INV-2003", cents: 7250 },
      { id: "INV-2004", cents: 31000 },
    ];
    const payments = [
      { invoice: "INV-2001", cents: 99000 },
      { invoice: "INV-2002", cents: 15000 },
      { invoice: "INV-2004", cents: 31000 },
      { invoice: "INV-2004", cents: 1000 },
    ];
    const r = reconcile(invoices, payments);
    console.log(JSON.stringify({ invoices: invoices.length, payments: payments.length, ...r }));
    
    egress.js

    SHA-256: 65c92bfa75d038413dca800752ae962e8f6ef058953185d9e2967165b57c448c

    // egress.js: one benign network attempt, so the record shows what the boundary
    // did with it. Outside plimsoll this reaches example.com; inside, with no grant,
    // there is no network, and the exit code says so.
    fetch("https://example.com/", { signal: AbortSignal.timeout(5000) })
      .then((r) => { console.log("egress: reached example.com, status", r.status); process.exit(0); })
      .catch((e) => { console.error("egress: refused:", (e.cause && e.cause.code) || e.name); process.exit(3); });
    

    The commands and recorded results

    Standard output (stdout) is printed output; standard error (stderr) is the separate diagnostic channel. Exit code 0 means the command reported success. A nonzero code means it reported failure.

    node reconcile.test.js

    Exit 0104 millisecondsSandbox timeout: false
    stdout:
    reconcile: 3 assertions passed
    stderr:
    

    node main.js

    Exit 0122 millisecondsSandbox timeout: false
    stdout:
    {"invoices":4,"payments":4,"matched":["INV-2001","INV-2002"],"unpaid":[{"id":"INV-2003","owed":7250}],"overpaid":[{"id":"INV-2004","excess":1000}]}
    stderr:
    

    node egress.js

    Exit 35373 millisecondsSandbox timeout: false
    stdout:
    stderr:
    egress: refused: TimeoutError
    

    Try the receipt here

    The seal is a tamper strip, like the one on a medicine bottle. Check it, then change a copy and watch the seal fail. Your browser uses only the bytes inside this page.

    Checking whether this browser can verify the seal.

      This checks one receipt, its bundle line's seal and its JSON fields. The emitter's Go checker also verifies the whole bundle when it has it and proves that the JSON copy matches the stored protobuf messages. An attached public key proves consistency under that key; it does not tell you who owns it.

      Checks actually run by the emitter

      These receipts come from checking the generated BOM and three separately altered copies. The original source files are unchanged.

      PASS: CycloneDX 1.6 schema (vendored, offline).
      PASS: DSSE envelope signature and run-record digest.
      PASS: the attached bundle line: its link's seal and place, the stored request and result against the signed digests.
      PASS: exchange.json equals the line's protobuf messages and reproduces their digests.
      PASS: file-set digest recomputed from file components and bound to the signed request.
      PASS: every mapped field and claim matches the verified exchange.
      PASS: attached key matches independently trusted key.
      PASS: the attached line is line 3 of the referenced bundle, whole to its checkpoint (8 lines).
      LIMIT: names, page URL and assessor label are unsigned presentation; runtime assertions remain the daemon's statements.
      PASS: image SBOM hash, manifest identity and BOM-Link match the local evidence file.
      PASS: altered envelope refused: envelope: attest: no valid signature from this key
      PASS: altered file hash refused: file-set digest differs from program hash
      PASS: altered claim digest refused: BOM differs from the verified exchange: file contents, digests, claims or another mapped field was changed
      
      Every BOM field and where it came from
      FieldSource
      annotations[0].annotator.component.externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      annotations[0].annotator.component.externalReferences[0].urlEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      annotations[0].annotator.component.nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      annotations[0].annotator.component.typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      annotations[0].annotator.component.versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      annotations[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      annotations[0].subjects[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      annotations[0].textEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      annotations[0].timestampSigned record.ended_unix_ms, formatted in UTC with milliseconds.
      bomFormatEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      components[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      components[0].externalReferences[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      components[0].externalReferences[0].hashes[0].contentSHA-256 of the pinned local image SBOM's original file bytes.
      components[0].externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      components[0].externalReferences[0].urlUnsigned -pages base URL plus the manifest-derived image SBOM filename.
      components[0].externalReferences[1].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      components[0].externalReferences[1].urlBOM-Link from the image SBOM's serialNumber UUID, version and root component bom-ref.
      components[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      components[0].hashes[0].contentSelected OCI manifest digest from signed record.software_identity; purl also uses the unsigned display name.
      components[0].nameUnsigned -image-name display label.
      components[0].properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      components[0].properties[0].valueSigned record: environment.
      components[0].properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      components[0].properties[1].valueSigned record: software_identity.
      components[0].purlSelected OCI manifest digest from signed record.software_identity; purl also uses the unsigned display name.
      components[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      components[0].versionSelected OCI manifest digest from signed record.software_identity; purl also uses the unsigned display name.
      declarations.affirmation.statementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.assessors[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.assessors[0].organization.nameUnsigned -operator self-assessor label.
      declarations.assessors[0].thirdPartyEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].assessorEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].map[0].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].map[0].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].map[0].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].map[0].conformance.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].map[0].conformance.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].map[0].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].map[1].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].map[1].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].map[1].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].map[1].conformance.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].map[1].conformance.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].map[1].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].map[2].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].map[2].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].map[2].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].map[2].conformance.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].map[2].conformance.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].map[2].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.attestations[0].summaryEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.claims[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.claims[0].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.claims[0].predicateVerified signed record and its stored request; code claim also uses the file-set digest.
      declarations.claims[0].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.claims[0].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.claims[1].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.claims[1].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.claims[1].predicateVerified signed record and its stored request; code claim also uses the file-set digest.
      declarations.claims[1].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.claims[1].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.claims[2].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.claims[2].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.claims[2].predicateVerified signed record and its stored request; code claim also uses the file-set digest.
      declarations.claims[2].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.claims[2].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.evidence[0].author.nameFixed envelope/statement/predicate type names plus key id = SHA-256 of the public key bytes.
      declarations.evidence[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.evidence[0].createdSigned record.ended_unix_ms, formatted in UTC with milliseconds.
      declarations.evidence[0].data[0].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
      declarations.evidence[0].data[0].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.evidence[0].data[0].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.evidence[0].data[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.evidence[0].data[1].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
      declarations.evidence[0].data[1].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.evidence[0].data[1].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.evidence[0].data[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.evidence[0].data[2].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
      declarations.evidence[0].data[2].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.evidence[0].data[2].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.evidence[0].data[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.evidence[0].data[3].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
      declarations.evidence[0].data[3].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.evidence[0].data[3].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.evidence[0].data[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      declarations.evidence[0].descriptionFixed envelope/statement/predicate type names plus key id = SHA-256 of the public key bytes.
      declarations.evidence[0].propertyNameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      definitions.standards[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      definitions.standards[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      definitions.standards[0].requirements[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      definitions.standards[0].requirements[0].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      definitions.standards[0].requirements[0].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      definitions.standards[0].requirements[1].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      definitions.standards[0].requirements[1].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      definitions.standards[0].requirements[1].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      definitions.standards[0].requirements[2].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      definitions.standards[0].requirements[2].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      definitions.standards[0].requirements[2].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      definitions.standards[0].versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].inputs[0].resource.refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].outputs[0].properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].outputs[0].properties[0].valueSigned record: result_sha256.
      formulation[0].workflows[0].outputs[0].resource.refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].outputs[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].properties[0].valueSigned record: provider.
      formulation[0].workflows[0].properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].properties[1].valueSigned record: isolation.
      formulation[0].workflows[0].properties[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].properties[2].valueStored request: minimum_isolation; the bundle link signs the exact stored bytes.
      formulation[0].workflows[0].properties[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].properties[3].valueStored request: timeout_ms; the bundle link signs the exact stored bytes.
      formulation[0].workflows[0].properties[4].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].properties[4].valueStored request.project.grant_profile, or none when it is empty.
      formulation[0].workflows[0].properties[5].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].properties[5].valueStored response.project.outcome.
      formulation[0].workflows[0].runtimeTopology[0].dependsOn[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].runtimeTopology[0].refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].taskDependencies[0].refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].taskDependencies[1].dependsOn[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].taskDependencies[1].refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].taskDependencies[2].dependsOn[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].taskDependencies[2].refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].taskTypes[0]Constant other: no task type was declared; the command supplies the name.
      formulation[0].workflows[0].tasks[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].tasks[0].nameStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[0].steps[0].commands[0].executedStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[0].nameStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[0].valueStored response.project.steps[].exit_code; the bundle link signs the stored bytes.
      formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[1].nameStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[1].valueStored response.project.steps[].duration_ms; the bundle link signs the stored bytes.
      formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[2].nameStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[2].valueStored response.project.steps[].timed_out; the bundle link signs the stored bytes.
      formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[3].nameStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[3].valueStored response.project.steps[].stdout_truncated; the bundle link signs the stored bytes.
      formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[4].nameStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[4].valueStored response.project.steps[].stderr_truncated; the bundle link signs the stored bytes.
      formulation[0].workflows[0].tasks[0].taskTypes[0]Constant other: no task type was declared; the command supplies the name.
      formulation[0].workflows[0].tasks[0].uidSigned record.record_sha256 for the workflow; one-based result-step index for a task.
      formulation[0].workflows[0].tasks[1].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].tasks[1].nameStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[1].steps[0].commands[0].executedStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[0].nameStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[0].valueStored response.project.steps[].exit_code; the bundle link signs the stored bytes.
      formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[1].nameStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[1].valueStored response.project.steps[].duration_ms; the bundle link signs the stored bytes.
      formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[2].nameStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[2].valueStored response.project.steps[].timed_out; the bundle link signs the stored bytes.
      formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[3].nameStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[3].valueStored response.project.steps[].stdout_truncated; the bundle link signs the stored bytes.
      formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[4].nameStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[4].valueStored response.project.steps[].stderr_truncated; the bundle link signs the stored bytes.
      formulation[0].workflows[0].tasks[1].taskTypes[0]Constant other: no task type was declared; the command supplies the name.
      formulation[0].workflows[0].tasks[1].uidSigned record.record_sha256 for the workflow; one-based result-step index for a task.
      formulation[0].workflows[0].tasks[2].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      formulation[0].workflows[0].tasks[2].nameStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[2].steps[0].commands[0].executedStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[0].nameStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[0].valueStored response.project.steps[].exit_code; the bundle link signs the stored bytes.
      formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[1].nameStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[1].valueStored response.project.steps[].duration_ms; the bundle link signs the stored bytes.
      formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[2].nameStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[2].valueStored response.project.steps[].timed_out; the bundle link signs the stored bytes.
      formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[3].nameStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[3].valueStored response.project.steps[].stdout_truncated; the bundle link signs the stored bytes.
      formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[4].nameStored request.project.steps[] equals stored response.project.steps[].command.
      formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[4].valueStored response.project.steps[].stderr_truncated; the bundle link signs the stored bytes.
      formulation[0].workflows[0].tasks[2].taskTypes[0]Constant other: no task type was declared; the command supplies the name.
      formulation[0].workflows[0].tasks[2].uidSigned record.record_sha256 for the workflow; one-based result-step index for a task.
      formulation[0].workflows[0].timeEndSigned record.ended_unix_ms, formatted in UTC with milliseconds.
      formulation[0].workflows[0].timeStartSigned record.started_unix_ms, formatted in UTC with milliseconds.
      formulation[0].workflows[0].uidSigned record.record_sha256 for the workflow; one-based result-step index for a task.
      metadata.component.bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.components[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.components[0].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
      metadata.component.components[0].nameStored request.project.files[].path, sorted by path.
      metadata.component.components[0].properties[0].nameStored request.project.files[].path, sorted by path.
      metadata.component.components[0].properties[0].valueByte length of request.project.files[].content.
      metadata.component.components[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.components[1].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.components[1].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
      metadata.component.components[1].nameStored request.project.files[].path, sorted by path.
      metadata.component.components[1].properties[0].nameStored request.project.files[].path, sorted by path.
      metadata.component.components[1].properties[0].valueByte length of request.project.files[].content.
      metadata.component.components[1].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.components[2].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.components[2].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
      metadata.component.components[2].nameStored request.project.files[].path, sorted by path.
      metadata.component.components[2].properties[0].nameStored request.project.files[].path, sorted by path.
      metadata.component.components[2].properties[0].valueByte length of request.project.files[].content.
      metadata.component.components[2].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.components[3].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.components[3].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
      metadata.component.components[3].nameStored request.project.files[].path, sorted by path.
      metadata.component.components[3].properties[0].nameStored request.project.files[].path, sorted by path.
      metadata.component.components[3].properties[0].valueByte length of request.project.files[].content.
      metadata.component.components[3].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.descriptionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.externalReferences[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.externalReferences[0].hashes[0].contentSHA-256 of the referenced complete bundle, or qualification file, bytes.
      metadata.component.externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.externalReferences[0].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
      metadata.component.externalReferences[1].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.externalReferences[1].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
      metadata.component.externalReferences[2].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.externalReferences[2].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
      metadata.component.hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.hashes[0].contentFile-set digest recomputed from the stored request's file paths and contents.
      metadata.component.nameUnsigned display label: -name, or the judged file's name for a run with a verdict.
      metadata.component.properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.properties[0].valueUnsigned supplied example context; the run record does not establish authorship.
      metadata.component.properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.properties[1].valueUnsigned supplied example context; the run record does not establish authorship.
      metadata.component.properties[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.properties[2].valueSigned record: request_sha256.
      metadata.component.properties[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.properties[3].valueSigned record: result_sha256.
      metadata.component.properties[4].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.properties[4].valueSigned record: record_sha256.
      metadata.component.properties[5].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.properties[5].valueStored request: trace_id; the bundle link signs the exact stored bytes.
      metadata.component.typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.component.versionFirst 12 hex characters of the file-set digest.
      metadata.lifecycles[0].phaseEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.timestampSigned record.ended_unix_ms, formatted in UTC with milliseconds.
      metadata.tools.components[0].externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.tools.components[0].externalReferences[0].urlEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.tools.components[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.tools.components[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      metadata.tools.components[0].versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      properties[0].valueSHA-256 of the complete bundle file the attached line belongs to.
      properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      properties[1].valueIndex the harness's signed link gives the attached bundle line.
      properties[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      properties[2].valueEmitter mapping constant.
      serialNumberFirst 16 bytes of SHA-256(plimsoll-sbom-serial + newline + record digest), UUID version/variant bits set.
      specVersionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
      Raw CycloneDX JSON
      {
        "annotations": [
          {
            "annotator": {
              "component": {
                "externalReferences": [
                  {
                    "type": "vcs",
                    "url": "https://github.com/plimsollmark/plimsoll"
                  }
                ],
                "name": "plimsoll-sbom",
                "type": "application",
                "version": "0.2.0"
              }
            },
            "bom-ref": "limits",
            "subjects": [
              "program"
            ],
            "text": "The attached run record is signed; this BOM is unsigned. Agent authorship is supplied example context, not a record fact, and the execution layer cannot identify the model. Network isolation is provider configuration, not a separately signed runtime measurement; a granted run reaches only the routes its grant lists, and what reached the other side is not in this record. The run's times are the daemon's own unwitnessed clock. An attached key alone establishes consistency, not signer identity; use an independently trusted key. Display names and the assessor label are unsigned presentation. The attached bundle line proves itself; the whole bundle it belongs to is referenced by digest and checked when supplied. This is run evidence, not an inventory of the image's installed packages.",
            "timestamp": "2026-10-23T20:11:18.168Z"
          }
        ],
        "bomFormat": "CycloneDX",
        "components": [
          {
            "bom-ref": "image",
            "externalReferences": [
              {
                "hashes": [
                  {
                    "alg": "SHA-256",
                    "content": "7e0b9a40e742f401e3a006a7362ebba1c5f3ac832107858dcf104d8f2b6de603"
                  }
                ],
                "type": "bom",
                "url": "https://plimsollmark.github.io/plimsoll/examples/sbom/image-a6ef2ea1c8f1.cdx.json"
              },
              {
                "type": "bom",
                "url": "urn:cdx:f9bc9442-7192-4f59-9f06-38f71e427479/1#d13ed0dc05c4b68b"
              }
            ],
            "hashes": [
              {
                "alg": "SHA-256",
                "content": "a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c"
              }
            ],
            "name": "sandbox",
            "properties": [
              {
                "name": "plimsoll:environment",
                "value": "docker-image:sha256:32da77b1be24de4c152667c28ab63531425cd69000acf30a328985cb857377f7"
              },
              {
                "name": "plimsoll:software_identity",
                "value": "oci-manifest:linux/amd64@sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c"
              }
            ],
            "purl": "pkg:oci/sandbox@sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c",
            "type": "container",
            "version": "sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c"
          }
        ],
        "declarations": {
          "affirmation": {
            "statement": "The attached run record was stated by plimsolld, checked and signed by plimsoll-attest, and restated here; plimsoll-attest verify and this program's -check recompute it. This affirmation and BOM are unsigned."
          },
          "assessors": [
            {
              "bom-ref": "assessor",
              "organization": {
                "name": "plimsoll examples (self-assessed)"
              },
              "thirdParty": false
            }
          ],
          "attestations": [
            {
              "assessor": "assessor",
              "map": [
                {
                  "claims": [
                    "claim-code"
                  ],
                  "confidence": {
                    "rationale": "a signature check and a digest recomputation, not a judgement or a probability that the runtime assertion is true",
                    "score": 1
                  },
                  "conformance": {
                    "rationale": "The claim matches the signed exchange under a deterministic comparison; this is self-assessed consistency, not independent runtime assurance.",
                    "score": 1
                  },
                  "requirement": "req-code"
                },
                {
                  "claims": [
                    "claim-image"
                  ],
                  "confidence": {
                    "rationale": "a signature check and a digest recomputation, not a judgement or a probability that the runtime assertion is true",
                    "score": 1
                  },
                  "conformance": {
                    "rationale": "The claim matches the signed exchange under a deterministic comparison; this is self-assessed consistency, not independent runtime assurance.",
                    "score": 1
                  },
                  "requirement": "req-image"
                },
                {
                  "claims": [
                    "claim-tier"
                  ],
                  "confidence": {
                    "rationale": "a signature check and a digest recomputation, not a judgement or a probability that the runtime assertion is true",
                    "score": 1
                  },
                  "conformance": {
                    "rationale": "The claim matches the signed exchange under a deterministic comparison; this is self-assessed consistency, not independent runtime assurance.",
                    "score": 1
                  },
                  "requirement": "req-tier"
                }
              ],
              "summary": "A self-assessed restatement of a signed run record with reproducible consistency checks."
            }
          ],
          "claims": [
            {
              "bom-ref": "claim-code",
              "evidence": [
                "evidence-run-record"
              ],
              "predicate": "The program's 4 files, file-set digest d0f73fac975a601a647e768eaba084b72ff80a6b7dca4c3f1b62eec16b244c43, are the files in the stored request whose signed digest b5386b8a32215a20f843fddccc796543ab45ff0bf7fa63d38ca87855d201a7e1 covers them with the isolation floor and timeout.",
              "reasoning": "Each claim restates the run record the daemon stated and the attest harness checked against the stored request and result and signed. The attached bundle line permits those checks to be repeated. This emitter did not observe execution. The tier is configuration and provider evidence plus startup smoke tests, never runtime attestation.",
              "target": "program"
            },
            {
              "bom-ref": "claim-image",
              "evidence": [
                "evidence-run-record"
              ],
              "predicate": "The daemon states that the run executed in the image whose OCI manifest digest is sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c (environment docker-image:sha256:32da77b1be24de4c152667c28ab63531425cd69000acf30a328985cb857377f7), verified before launch.",
              "reasoning": "Each claim restates the run record the daemon stated and the attest harness checked against the stored request and result and signed. The attached bundle line permits those checks to be repeated. This emitter did not observe execution. The tier is configuration and provider evidence plus startup smoke tests, never runtime attestation.",
              "target": "program"
            },
            {
              "bom-ref": "claim-tier",
              "evidence": [
                "evidence-run-record"
              ],
              "predicate": "The daemon states provider docker and isolation tier kernel, at or above requested floor kernel, from 2026-10-23T20:11:12.005Z to 2026-10-23T20:11:18.168Z UTC; the stored request names no host-API grant and the result digest is 960733790831a2bc56def99ba8f069c2921817a8aae9303c62a4f2c87ccc977d. The provider's no-grant configuration supplies network isolation; this record is not a network measurement.",
              "reasoning": "Each claim restates the run record the daemon stated and the attest harness checked against the stored request and result and signed. The attached bundle line permits those checks to be repeated. This emitter did not observe execution. The tier is configuration and provider evidence plus startup smoke tests, never runtime attestation.",
              "target": "program"
            }
          ],
          "evidence": [
            {
              "author": {
                "name": "plimsoll-attest key 88d311fb942e0fd87cdb1214b385db5fc354c166e84763f6d37885dbc96df379"
              },
              "bom-ref": "evidence-run-record",
              "created": "2026-10-23T20:11:18.168Z",
              "data": [
                {
                  "contents": {
                    "attachment": {
                      "content": "eyJwYXlsb2FkVHlwZSI6ImFwcGxpY2F0aW9uL3ZuZC5pbi10b3RvK2pzb24iLCJwYXlsb2FkIjoiZXlKZmRIbHdaU0k2SW1oMGRIQnpPaTh2YVc0dGRHOTBieTVwYnk5VGRHRjBaVzFsYm5RdmRqRWlMQ0p6ZFdKcVpXTjBJanBiZXlKdVlXMWxJam9pY25WdUxYSmxZMjl5WkNJc0ltUnBaMlZ6ZENJNmV5SnphR0V5TlRZaU9pSXlPV015WlRkaU1EYzBNamxtTWpWaVltVmtaR0UwWmpRMU56SmlORGN5TURnek56UXpOMkppWmpGbU5tVTVNalJoTnpWa04yUTBORGN6T1RVd09XUTJJbjE5WFN3aWNISmxaR2xqWVhSbFZIbHdaU0k2SW1oMGRIQnpPaTh2Y0d4cGJYTnZiR3h0WVhKckxtZHBkR2gxWWk1cGJ5OXdiR2x0YzI5c2JDOXlkVzR0Y21WamIzSmtMM1l4SWl3aWNISmxaR2xqWVhSbElqcDdJblpsY25OcGIyNGlPalFzSW5KbGNYVmxjM1JmYzJoaE1qVTJJam9pWWpVek9EWmlPR0V6TWpJeE5XRXlNR1k0TkRObVpHUmpZMk0zT1RZMU5ETmhZalExWm1Zd1ltWTNabUUyTTJRek9HTmhPRGM0TlRWa01qQXhZVGRsTVNJc0luSmxjM1ZzZEY5emFHRXlOVFlpT2lJNU5qQTNNek0zT1RBNE16RmhNbUpqTlRaa1pXWTVPV0poT0dZd05qbGpNamt5TVRneE4yRTRZV0ZsT1RNd00yTTJNbUUwWmpKak9EZGpZMk01Tnpka0lpd2ljSEp2ZG1sa1pYSWlPaUprYjJOclpYSWlMQ0pwYzI5c1lYUnBiMjRpT2lKclpYSnVaV3dpTENKbGJuWnBjbTl1YldWdWRDSTZJbVJ2WTJ0bGNpMXBiV0ZuWlRwemFHRXlOVFk2TXpKa1lUYzNZakZpWlRJMFpHVTBZekUxTWpZMk4yTXlPR0ZpTmpNMU16RTBNalZqWkRZNU1EQXdZV05tTXpCaE16STRPVGcxWTJJNE5UY3pOemRtTnlJc0luTnZablIzWVhKbFgybGtaVzUwYVhSNUlqb2liMk5wTFcxaGJtbG1aWE4wT214cGJuVjRMMkZ0WkRZMFFITm9ZVEkxTmpwaE5tVm1NbVZoTVdNNFpqRmtaVFZqT0RnMVpURmhNVGhpWVRkbFpUUmtPVFl5WlROaE9EVTVPRGMzWmpabU5EWmpNbVppTjJWaVlXTXhaalpqWXpWaklpd2ljRzlzYVdONUlqb2lJaXdpYzNSaGNuUmxaRjkxYm1sNFgyMXpJam94TnpreU56ZzJNamN5TURBMUxDSmxibVJsWkY5MWJtbDRYMjF6SWpveE56a3lOemcyTWpjNE1UWTRMQ0p6WlhOemFXOXVJam9pSWl3aWMyVnhkV1Z1WTJVaU9qQXNJbkJ5WlhacGIzVnpYM05vWVRJMU5pSTZJaUlzSW5KbFkyOXlaRjl6YUdFeU5UWWlPaUl5T1dNeVpUZGlNRGMwTWpsbU1qVmlZbVZrWkdFMFpqUTFOekppTkRjeU1EZ3pOelF6TjJKaVpqRm1ObVU1TWpSaE56VmtOMlEwTkRjek9UVXdPV1EySW4xOSIsInNpZ25hdHVyZXMiOlt7ImtleWlkIjoiODhkMzExZmI5NDJlMGZkODdjZGIxMjE0YjM4NWRiNWZjMzU0YzE2NmU4NDc2M2Y2ZDM3ODg1ZGJjOTZkZjM3OSIsInNpZyI6Im1oZmV3enA4Uk13Y0ZZZU5wYWdyUkZBY04wSEVYa3R4SkdER3JEMVRYY2IwZGZNZDNrZ1BlemJlb0lQL0wvZnB2WC9aei9paDRwaGViRE1IR3hXT0FnPT0ifV19",
                      "contentType": "application/json",
                      "encoding": "base64"
                    }
                  },
                  "name": "envelope.json"
                },
                {
                  "contents": {
                    "attachment": {
                      "content": "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUNvd0JRWURLMlZ3QXlFQWJxQ3hCRE1RT0FZOTREekRWeDl2OG01aE12N1JnTVdRV1NzclR4UnFLcFU9Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo=",
                      "contentType": "application/x-pem-file",
                      "encoding": "base64"
                    }
                  },
                  "name": "harness.pub"
                },
                {
                  "contents": {
                    "attachment": {
                      "content": "eyJyZXF1ZXN0IjoiQ0FRU0JtdGxjbTVsYkJvU2JXRnVhV1psYzNRdGNHOWpMWEoxYmkweUlMRHFBVnJJRXdxK0JRb01jbVZqYjI1amFXeGxMbXB6RXEwRkx5OGdjbVZqYjI1amFXeGxMbXB6T2lCdFlYUmphQ0J3WVhsdFpXNTBjeUIwYnlCcGJuWnZhV05sY3lCaWVTQnBiblp2YVdObElHbGtJR0Z1WkNCeVpYQnZjblFnZDJoaGRDQnBjd292THlCMWJuQmhhV1FzSUc5MlpYSndZV2xrSUc5eUlHMWhkR05vWldRdUlFRnRiM1Z1ZEhNZ1lYSmxJR2x1ZEdWblpYSWdZMlZ1ZEhNdUNtWjFibU4wYVc5dUlISmxZMjl1WTJsc1pTaHBiblp2YVdObGN5d2djR0Y1YldWdWRITXBJSHNLSUNCamIyNXpkQ0J3WVdsa0lEMGdibVYzSUUxaGNDZ3BPd29nSUdadmNpQW9ZMjl1YzNRZ2NDQnZaaUJ3WVhsdFpXNTBjeWtnY0dGcFpDNXpaWFFvY0M1cGJuWnZhV05sTENBb2NHRnBaQzVuWlhRb2NDNXBiblp2YVdObEtTQjhmQ0F3S1NBcklIQXVZMlZ1ZEhNcE93b2dJR052Ym5OMElHMWhkR05vWldRZ1BTQmJYU3dnZFc1d1lXbGtJRDBnVzEwc0lHOTJaWEp3WVdsa0lEMGdXMTA3Q2lBZ1ptOXlJQ2hqYjI1emRDQnBibllnYjJZZ2FXNTJiMmxqWlhNcElIc0tJQ0FnSUdOdmJuTjBJR2R2ZENBOUlIQmhhV1F1WjJWMEtHbHVkaTVwWkNrZ2ZId2dNRHNLSUNBZ0lHbG1JQ2huYjNRZ1BUMDlJR2x1ZGk1alpXNTBjeWtnYldGMFkyaGxaQzV3ZFhOb0tHbHVkaTVwWkNrN0NpQWdJQ0JsYkhObElHbG1JQ2huYjNRZ1BDQnBibll1WTJWdWRITXBJSFZ1Y0dGcFpDNXdkWE5vS0hzZ2FXUTZJR2x1ZGk1cFpDd2diM2RsWkRvZ2FXNTJMbU5sYm5SeklDMGdaMjkwSUgwcE93b2dJQ0FnWld4elpTQnZkbVZ5Y0dGcFpDNXdkWE5vS0hzZ2FXUTZJR2x1ZGk1cFpDd2daWGhqWlhOek9pQm5iM1FnTFNCcGJuWXVZMlZ1ZEhNZ2ZTazdDaUFnZlFvZ0lISmxkSFZ5YmlCN0lHMWhkR05vWldRc0lIVnVjR0ZwWkN3Z2IzWmxjbkJoYVdRZ2ZUc0tmUXB0YjJSMWJHVXVaWGh3YjNKMGN5QTlJSHNnY21WamIyNWphV3hsSUgwN0NncXRCUW9SY21WamIyNWphV3hsTG5SbGMzUXVhbk1TbHdWamIyNXpkQ0JoYzNObGNuUWdQU0J5WlhGMWFYSmxLQ0p1YjJSbE9tRnpjMlZ5ZEM5emRISnBZM1FpS1RzS1kyOXVjM1FnZXlCeVpXTnZibU5wYkdVZ2ZTQTlJSEpsY1hWcGNtVW9JaTR2Y21WamIyNWphV3hsTG1weklpazdDbU52Ym5OMElHbHVkbTlwWTJWeklEMGdXd29nSUhzZ2FXUTZJQ0pKVGxZdE1UQXdNU0lzSUdObGJuUnpPaUF4TWpVd01DQjlMQW9nSUhzZ2FXUTZJQ0pKVGxZdE1UQXdNaUlzSUdObGJuUnpPaUE0TURBd0lIMHNDaUFnZXlCcFpEb2dJa2xPVmkweE1EQXpJaXdnWTJWdWRITTZJRFF5TURBZ2ZTd0tYVHNLWTI5dWMzUWdjR0Y1YldWdWRITWdQU0JiQ2lBZ2V5QnBiblp2YVdObE9pQWlTVTVXTFRFd01ERWlMQ0JqWlc1MGN6b2dNVEkxTURBZ2ZTd0tJQ0I3SUdsdWRtOXBZMlU2SUNKSlRsWXRNVEF3TWlJc0lHTmxiblJ6T2lBMU1EQXdJSDBzQ2lBZ2V5QnBiblp2YVdObE9pQWlTVTVXTFRFd01ETWlMQ0JqWlc1MGN6b2dOREl3TUNCOUxBb2dJSHNnYVc1MmIybGpaVG9nSWtsT1ZpMHhNREF6SWl3Z1kyVnVkSE02SURNd01DQjlMQXBkT3dwamIyNXpkQ0J5SUQwZ2NtVmpiMjVqYVd4bEtHbHVkbTlwWTJWekxDQndZWGx0Wlc1MGN5azdDbUZ6YzJWeWRDNWtaV1Z3UlhGMVlXd29jaTV0WVhSamFHVmtMQ0JiSWtsT1ZpMHhNREF4SWwwcE93cGhjM05sY25RdVpHVmxjRVZ4ZFdGc0tISXVkVzV3WVdsa0xDQmJleUJwWkRvZ0lrbE9WaTB4TURBeUlpd2diM2RsWkRvZ016QXdNQ0I5WFNrN0NtRnpjMlZ5ZEM1a1pXVndSWEYxWVd3b2NpNXZkbVZ5Y0dGcFpDd2dXM3NnYVdRNklDSkpUbFl0TVRBd015SXNJR1Y0WTJWemN6b2dNekF3SUgxZEtUc0tZMjl1YzI5c1pTNXNiMmNvSW5KbFkyOXVZMmxzWlRvZ015QmhjM05sY25ScGIyNXpJSEJoYzNObFpDSXBPd29Lb1FRS0IyMWhhVzR1YW5NU2xRUmpiMjV6ZENCN0lISmxZMjl1WTJsc1pTQjlJRDBnY21WeGRXbHlaU2dpTGk5eVpXTnZibU5wYkdVdWFuTWlLVHNLWTI5dWMzUWdhVzUyYjJsalpYTWdQU0JiQ2lBZ2V5QnBaRG9nSWtsT1ZpMHlNREF4SWl3Z1kyVnVkSE02SURrNU1EQXdJSDBzQ2lBZ2V5QnBaRG9nSWtsT1ZpMHlNREF5SWl3Z1kyVnVkSE02SURFMU1EQXdJSDBzQ2lBZ2V5QnBaRG9nSWtsT1ZpMHlNREF6SWl3Z1kyVnVkSE02SURjeU5UQWdmU3dLSUNCN0lHbGtPaUFpU1U1V0xUSXdNRFFpTENCalpXNTBjem9nTXpFd01EQWdmU3dLWFRzS1kyOXVjM1FnY0dGNWJXVnVkSE1nUFNCYkNpQWdleUJwYm5admFXTmxPaUFpU1U1V0xUSXdNREVpTENCalpXNTBjem9nT1Rrd01EQWdmU3dLSUNCN0lHbHVkbTlwWTJVNklDSkpUbFl0TWpBd01pSXNJR05sYm5Sek9pQXhOVEF3TUNCOUxBb2dJSHNnYVc1MmIybGpaVG9nSWtsT1ZpMHlNREEwSWl3Z1kyVnVkSE02SURNeE1EQXdJSDBzQ2lBZ2V5QnBiblp2YVdObE9pQWlTVTVXTFRJd01EUWlMQ0JqWlc1MGN6b2dNVEF3TUNCOUxBcGRPd3BqYjI1emRDQnlJRDBnY21WamIyNWphV3hsS0dsdWRtOXBZMlZ6TENCd1lYbHRaVzUwY3lrN0NtTnZibk52YkdVdWJHOW5LRXBUVDA0dWMzUnlhVzVuYVdaNUtIc2dhVzUyYjJsalpYTTZJR2x1ZG05cFkyVnpMbXhsYm1kMGFDd2djR0Y1YldWdWRITTZJSEJoZVcxbGJuUnpMbXhsYm1kMGFDd2dMaTR1Y2lCOUtTazdDZ3I2QXdvSlpXZHlaWE56TG1wekV1d0RMeThnWldkeVpYTnpMbXB6T2lCdmJtVWdZbVZ1YVdkdUlHNWxkSGR2Y21zZ1lYUjBaVzF3ZEN3Z2MyOGdkR2hsSUhKbFkyOXlaQ0J6YUc5M2N5QjNhR0YwSUhSb1pTQmliM1Z1WkdGeWVRb3ZMeUJrYVdRZ2QybDBhQ0JwZEM0Z1QzVjBjMmxrWlNCd2JHbHRjMjlzYkNCMGFHbHpJSEpsWVdOb1pYTWdaWGhoYlhCc1pTNWpiMjA3SUdsdWMybGtaU3dnZDJsMGFDQnVieUJuY21GdWRDd0tMeThnZEdobGNtVWdhWE1nYm04Z2JtVjBkMjl5YXl3Z1lXNWtJSFJvWlNCbGVHbDBJR052WkdVZ2MyRjVjeUJ6Ynk0S1ptVjBZMmdvSW1oMGRIQnpPaTh2WlhoaGJYQnNaUzVqYjIwdklpd2dleUJ6YVdkdVlXdzZJRUZpYjNKMFUybG5ibUZzTG5ScGJXVnZkWFFvTlRBd01Da2dmU2tLSUNBdWRHaGxiaWdvY2lrZ1BUNGdleUJqYjI1emIyeGxMbXh2WnlnaVpXZHlaWE56T2lCeVpXRmphR1ZrSUdWNFlXMXdiR1V1WTI5dExDQnpkR0YwZFhNaUxDQnlMbk4wWVhSMWN5azdJSEJ5YjJObGMzTXVaWGhwZENnd0tUc2dmU2tLSUNBdVkyRjBZMmdvS0dVcElEMCtJSHNnWTI5dWMyOXNaUzVsY25KdmNpZ2laV2R5WlhOek9pQnlaV1oxYzJWa09pSXNJQ2hsTG1OaGRYTmxJQ1ltSUdVdVkyRjFjMlV1WTI5a1pTa2dmSHdnWlM1dVlXMWxLVHNnY0hKdlkyVnpjeTVsZUdsMEtETXBPeUI5S1RzS0VoWnViMlJsSUhKbFkyOXVZMmxzWlM1MFpYTjBMbXB6RWd4dWIyUmxJRzFoYVc0dWFuTVNEbTV2WkdVZ1pXZHlaWE56TG1weiIsInJlc3BvbnNlIjoiQ2daa2IyTnJaWElTQm10bGNtNWxiQmlUTUNLZUF3Z0VFa0JpTlRNNE5tSTRZVE15TWpFMVlUSXdaamcwTTJaa1pHTmpZemM1TmpVME0yRmlORFZtWmpCaVpqZG1ZVFl6WkRNNFkyRTROemcxTldReU1ERmhOMlV4R2tBNU5qQTNNek0zT1RBNE16RmhNbUpqTlRaa1pXWTVPV0poT0dZd05qbGpNamt5TVRneE4yRTRZV0ZsT1RNd00yTTJNbUUwWmpKak9EZGpZMk01Tnpka0lnWmtiMk5yWlhJcUJtdGxjbTVsYkRKVVpHOWphMlZ5TFdsdFlXZGxPbk5vWVRJMU5qb3pNbVJoTnpkaU1XSmxNalJrWlRSak1UVXlOalkzWXpJNFlXSTJNelV6TVRReU5XTmtOamt3TURCaFkyWXpNR0V6TWpnNU9EVmpZamcxTnpNM04yWTNRSVdlanRPV05FaVl6bzdUbGpScVFESTVZekpsTjJJd056UXlPV1l5TldKaVpXUmtZVFJtTkRVM01tSTBOekl3T0RNM05ETTNZbUptTVdZMlpUa3lOR0UzTldRM1pEUTBOek01TlRBNVpEWnlZRzlqYVMxdFlXNXBabVZ6ZERwc2FXNTFlQzloYldRMk5FQnphR0V5TlRZNllUWmxaakpsWVRGak9HWXhaR1UxWXpnNE5XVXhZVEU0WW1FM1pXVTBaRGsyTW1VellUZzFPVGczTjJZMlpqUTJZekptWWpkbFltRmpNV1kyWTJNMVl5cGdiMk5wTFcxaGJtbG1aWE4wT214cGJuVjRMMkZ0WkRZMFFITm9ZVEkxTmpwaE5tVm1NbVZoTVdNNFpqRmtaVFZqT0RnMVpURmhNVGhpWVRkbFpUUmtPVFl5WlROaE9EVTVPRGMzWmpabU5EWmpNbVppTjJWaVlXTXhaalpqWXpWak1sUmtiMk5yWlhJdGFXMWhaMlU2YzJoaE1qVTJPak15WkdFM04ySXhZbVV5TkdSbE5HTXhOVEkyTmpkak1qaGhZall6TlRNeE5ESTFZMlEyT1RBd01HRmpaak13WVRNeU9EazROV05pT0RVM016YzNaamRhb0FJS093b1dibTlrWlNCeVpXTnZibU5wYkdVdWRHVnpkQzVxY3hJZmNtVmpiMjVqYVd4bE9pQXpJR0Z6YzJWeWRHbHZibk1nY0dGemMyVmtDakJvQ3FjQkNneHViMlJsSUcxaGFXNHVhbk1TbEFGN0ltbHVkbTlwWTJWeklqbzBMQ0p3WVhsdFpXNTBjeUk2TkN3aWJXRjBZMmhsWkNJNld5SkpUbFl0TWpBd01TSXNJa2xPVmkweU1EQXlJbDBzSW5WdWNHRnBaQ0k2VzNzaWFXUWlPaUpKVGxZdE1qQXdNeUlzSW05M1pXUWlPamN5TlRCOVhTd2liM1psY25CaGFXUWlPbHQ3SW1sa0lqb2lTVTVXTFRJd01EUWlMQ0psZUdObGMzTWlPakV3TURCOVhYMEtNSG9LTlFvT2JtOWtaU0JsWjNKbGMzTXVhbk1hSG1WbmNtVnpjem9nY21WbWRYTmxaRG9nVkdsdFpXOTFkRVZ5Y205eUNpQURNUDBwR0FFPSIsImVudmVsb3BlIjp7InBheWxvYWRUeXBlIjoiYXBwbGljYXRpb24vdm5kLmluLXRvdG8ranNvbiIsInBheWxvYWQiOiJleUpmZEhsd1pTSTZJbWgwZEhCek9pOHZhVzR0ZEc5MGJ5NXBieTlUZEdGMFpXMWxiblF2ZGpFaUxDSnpkV0pxWldOMElqcGJleUp1WVcxbElqb2ljblZ1TFhKbFkyOXlaQ0lzSW1ScFoyVnpkQ0k2ZXlKemFHRXlOVFlpT2lJeU9XTXlaVGRpTURjME1qbG1NalZpWW1Wa1pHRTBaalExTnpKaU5EY3lNRGd6TnpRek4ySmlaakZtTm1VNU1qUmhOelZrTjJRME5EY3pPVFV3T1dRMkluMTlYU3dpY0hKbFpHbGpZWFJsVkhsd1pTSTZJbWgwZEhCek9pOHZjR3hwYlhOdmJHeHRZWEpyTG1kcGRHaDFZaTVwYnk5d2JHbHRjMjlzYkM5eWRXNHRjbVZqYjNKa0wzWXhJaXdpY0hKbFpHbGpZWFJsSWpwN0luWmxjbk5wYjI0aU9qUXNJbkpsY1hWbGMzUmZjMmhoTWpVMklqb2lZalV6T0RaaU9HRXpNakl4TldFeU1HWTRORE5tWkdSalkyTTNPVFkxTkROaFlqUTFabVl3WW1ZM1ptRTJNMlF6T0dOaE9EYzROVFZrTWpBeFlUZGxNU0lzSW5KbGMzVnNkRjl6YUdFeU5UWWlPaUk1TmpBM016TTNPVEE0TXpGaE1tSmpOVFprWldZNU9XSmhPR1l3Tmpsak1qa3lNVGd4TjJFNFlXRmxPVE13TTJNMk1tRTBaakpqT0RkalkyTTVOemRrSWl3aWNISnZkbWxrWlhJaU9pSmtiMk5yWlhJaUxDSnBjMjlzWVhScGIyNGlPaUpyWlhKdVpXd2lMQ0psYm5acGNtOXViV1Z1ZENJNkltUnZZMnRsY2kxcGJXRm5aVHB6YUdFeU5UWTZNekprWVRjM1lqRmlaVEkwWkdVMFl6RTFNalkyTjJNeU9HRmlOak0xTXpFME1qVmpaRFk1TURBd1lXTm1NekJoTXpJNE9UZzFZMkk0TlRjek56ZG1OeUlzSW5OdlpuUjNZWEpsWDJsa1pXNTBhWFI1SWpvaWIyTnBMVzFoYm1sbVpYTjBPbXhwYm5WNEwyRnRaRFkwUUhOb1lUSTFOanBoTm1WbU1tVmhNV000WmpGa1pUVmpPRGcxWlRGaE1UaGlZVGRsWlRSa09UWXlaVE5oT0RVNU9EYzNaalptTkRaak1tWmlOMlZpWVdNeFpqWmpZelZqSWl3aWNHOXNhV041SWpvaUlpd2ljM1JoY25SbFpGOTFibWw0WDIxeklqb3hOemt5TnpnMk1qY3lNREExTENKbGJtUmxaRjkxYm1sNFgyMXpJam94TnpreU56ZzJNamM0TVRZNExDSnpaWE56YVc5dUlqb2lJaXdpYzJWeGRXVnVZMlVpT2pBc0luQnlaWFpwYjNWelgzTm9ZVEkxTmlJNklpSXNJbkpsWTI5eVpGOXphR0V5TlRZaU9pSXlPV015WlRkaU1EYzBNamxtTWpWaVltVmtaR0UwWmpRMU56SmlORGN5TURnek56UXpOMkppWmpGbU5tVTVNalJoTnpWa04yUTBORGN6T1RVd09XUTJJbjE5Iiwic2lnbmF0dXJlcyI6W3sia2V5aWQiOiI4OGQzMTFmYjk0MmUwZmQ4N2NkYjEyMTRiMzg1ZGI1ZmMzNTRjMTY2ZTg0NzYzZjZkMzc4ODVkYmM5NmRmMzc5Iiwic2lnIjoibWhmZXd6cDhSTXdjRlllTnBhZ3JSRkFjTjBIRVhrdHhKR0RHckQxVFhjYjBkZk1kM2tnUGV6YmVvSVAvTC9mcHZYL1p6L2loNHBoZWJETUhHeFdPQWc9PSJ9XX0sImxpbmsiOnsicGF5bG9hZFR5cGUiOiJhcHBsaWNhdGlvbi92bmQuaW4tdG90bytqc29uIiwicGF5bG9hZCI6ImV5SmZkSGx3WlNJNkltaDBkSEJ6T2k4dmFXNHRkRzkwYnk1cGJ5OVRkR0YwWlcxbGJuUXZkakVpTENKemRXSnFaV04wSWpwYmV5SnVZVzFsSWpvaVluVnVaR3hsTFd4cGJtVWlMQ0prYVdkbGMzUWlPbnNpYzJoaE1qVTJJam9pT1RoaVlqSTRaRGN6WVdSbU5XUTNZMlUxTURrd05XRXlPVGhqWkdNNU9HSTVaV0ZoTkdKbE1UWTRPV0ZsWXpKbFlXRmtObVJtWldFMlpUQTJObVEwWWlKOWZWMHNJbkJ5WldScFkyRjBaVlI1Y0dVaU9pSm9kSFJ3Y3pvdkwzQnNhVzF6YjJ4c2JXRnlheTVuYVhSb2RXSXVhVzh2Y0d4cGJYTnZiR3d2WW5WdVpHeGxMV3hwYm1zdmRqRWlMQ0p3Y21Wa2FXTmhkR1VpT25zaWFXNWtaWGdpT2pNc0luQnlaWFpwYjNWelgzTm9ZVEkxTmlJNklqZzBNbUpqWmpkalpXRmhNemRoT0RJMk9UTTJaREV4TXpCa1pUTTJOamswT1dWaE0yVmhPV0ZpT0RsbVpqWXlOV1UzTWpCaE9EYzNZemcwTldWbE9UVWlMQ0psYm5SeWVWOXphR0V5TlRZaU9pSTVPR0ppTWpoa056TmhaR1kxWkRkalpUVXdPVEExWVRJNU9HTmtZems0WWpsbFlXRTBZbVV4TmpnNVlXVmpNbVZoWVdRMlpHWmxZVFpsTURZMlpEUmlJbjE5Iiwic2lnbmF0dXJlcyI6W3sia2V5aWQiOiI4OGQzMTFmYjk0MmUwZmQ4N2NkYjEyMTRiMzg1ZGI1ZmMzNTRjMTY2ZTg0NzYzZjZkMzc4ODVkYmM5NmRmMzc5Iiwic2lnIjoiQTBWVXhtVGRpMFByb2dwU2c5ckxFcXVZVlI0YXdWUklXenBVZFh0d3NCRTNndElzdWVUeFhpLy9keFVsYUtqalIvcEVLWE4xcVlWeW5tUnNhNnhDQUE9PSJ9XX19",
                      "contentType": "application/json",
                      "encoding": "base64"
                    }
                  },
                  "name": "entry.json"
                },
                {
                  "contents": {
                    "attachment": {
                      "content": "eyJyZXF1ZXN0Ijp7Im1pbmltdW1faXNvbGF0aW9uIjoia2VybmVsIiwicHJvamVjdCI6eyJhcnRpZmFjdHMiOltdLCJmaWxlcyI6W3siY29udGVudCI6Ii8vIHJlY29uY2lsZS5qczogbWF0Y2ggcGF5bWVudHMgdG8gaW52b2ljZXMgYnkgaW52b2ljZSBpZCBhbmQgcmVwb3J0IHdoYXQgaXNcbi8vIHVucGFpZCwgb3ZlcnBhaWQgb3IgbWF0Y2hlZC4gQW1vdW50cyBhcmUgaW50ZWdlciBjZW50cy5cbmZ1bmN0aW9uIHJlY29uY2lsZShpbnZvaWNlcywgcGF5bWVudHMpIHtcbiAgY29uc3QgcGFpZCA9IG5ldyBNYXAoKTtcbiAgZm9yIChjb25zdCBwIG9mIHBheW1lbnRzKSBwYWlkLnNldChwLmludm9pY2UsIChwYWlkLmdldChwLmludm9pY2UpIHx8IDApICsgcC5jZW50cyk7XG4gIGNvbnN0IG1hdGNoZWQgPSBbXSwgdW5wYWlkID0gW10sIG92ZXJwYWlkID0gW107XG4gIGZvciAoY29uc3QgaW52IG9mIGludm9pY2VzKSB7XG4gICAgY29uc3QgZ290ID0gcGFpZC5nZXQoaW52LmlkKSB8fCAwO1xuICAgIGlmIChnb3QgPT09IGludi5jZW50cykgbWF0Y2hlZC5wdXNoKGludi5pZCk7XG4gICAgZWxzZSBpZiAoZ290IFx1MDAzYyBpbnYuY2VudHMpIHVucGFpZC5wdXNoKHsgaWQ6IGludi5pZCwgb3dlZDogaW52LmNlbnRzIC0gZ290IH0pO1xuICAgIGVsc2Ugb3ZlcnBhaWQucHVzaCh7IGlkOiBpbnYuaWQsIGV4Y2VzczogZ290IC0gaW52LmNlbnRzIH0pO1xuICB9XG4gIHJldHVybiB7IG1hdGNoZWQsIHVucGFpZCwgb3ZlcnBhaWQgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0geyByZWNvbmNpbGUgfTtcbiIsInBhdGgiOiJyZWNvbmNpbGUuanMifSx7ImNvbnRlbnQiOiJjb25zdCBhc3NlcnQgPSByZXF1aXJlKFwibm9kZTphc3NlcnQvc3RyaWN0XCIpO1xuY29uc3QgeyByZWNvbmNpbGUgfSA9IHJlcXVpcmUoXCIuL3JlY29uY2lsZS5qc1wiKTtcbmNvbnN0IGludm9pY2VzID0gW1xuICB7IGlkOiBcIklOVi0xMDAxXCIsIGNlbnRzOiAxMjUwMCB9LFxuICB7IGlkOiBcIklOVi0xMDAyXCIsIGNlbnRzOiA4MDAwIH0sXG4gIHsgaWQ6IFwiSU5WLTEwMDNcIiwgY2VudHM6IDQyMDAgfSxcbl07XG5jb25zdCBwYXltZW50cyA9IFtcbiAgeyBpbnZvaWNlOiBcIklOVi0xMDAxXCIsIGNlbnRzOiAxMjUwMCB9LFxuICB7IGludm9pY2U6IFwiSU5WLTEwMDJcIiwgY2VudHM6IDUwMDAgfSxcbiAgeyBpbnZvaWNlOiBcIklOVi0xMDAzXCIsIGNlbnRzOiA0MjAwIH0sXG4gIHsgaW52b2ljZTogXCJJTlYtMTAwM1wiLCBjZW50czogMzAwIH0sXG5dO1xuY29uc3QgciA9IHJlY29uY2lsZShpbnZvaWNlcywgcGF5bWVudHMpO1xuYXNzZXJ0LmRlZXBFcXVhbChyLm1hdGNoZWQsIFtcIklOVi0xMDAxXCJdKTtcbmFzc2VydC5kZWVwRXF1YWwoci51bnBhaWQsIFt7IGlkOiBcIklOVi0xMDAyXCIsIG93ZWQ6IDMwMDAgfV0pO1xuYXNzZXJ0LmRlZXBFcXVhbChyLm92ZXJwYWlkLCBbeyBpZDogXCJJTlYtMTAwM1wiLCBleGNlc3M6IDMwMCB9XSk7XG5jb25zb2xlLmxvZyhcInJlY29uY2lsZTogMyBhc3NlcnRpb25zIHBhc3NlZFwiKTtcbiIsInBhdGgiOiJyZWNvbmNpbGUudGVzdC5qcyJ9LHsiY29udGVudCI6ImNvbnN0IHsgcmVjb25jaWxlIH0gPSByZXF1aXJlKFwiLi9yZWNvbmNpbGUuanNcIik7XG5jb25zdCBpbnZvaWNlcyA9IFtcbiAgeyBpZDogXCJJTlYtMjAwMVwiLCBjZW50czogOTkwMDAgfSxcbiAgeyBpZDogXCJJTlYtMjAwMlwiLCBjZW50czogMTUwMDAgfSxcbiAgeyBpZDogXCJJTlYtMjAwM1wiLCBjZW50czogNzI1MCB9LFxuICB7IGlkOiBcIklOVi0yMDA0XCIsIGNlbnRzOiAzMTAwMCB9LFxuXTtcbmNvbnN0IHBheW1lbnRzID0gW1xuICB7IGludm9pY2U6IFwiSU5WLTIwMDFcIiwgY2VudHM6IDk5MDAwIH0sXG4gIHsgaW52b2ljZTogXCJJTlYtMjAwMlwiLCBjZW50czogMTUwMDAgfSxcbiAgeyBpbnZvaWNlOiBcIklOVi0yMDA0XCIsIGNlbnRzOiAzMTAwMCB9LFxuICB7IGludm9pY2U6IFwiSU5WLTIwMDRcIiwgY2VudHM6IDEwMDAgfSxcbl07XG5jb25zdCByID0gcmVjb25jaWxlKGludm9pY2VzLCBwYXltZW50cyk7XG5jb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGludm9pY2VzOiBpbnZvaWNlcy5sZW5ndGgsIHBheW1lbnRzOiBwYXltZW50cy5sZW5ndGgsIC4uLnIgfSkpO1xuIiwicGF0aCI6Im1haW4uanMifSx7ImNvbnRlbnQiOiIvLyBlZ3Jlc3MuanM6IG9uZSBiZW5pZ24gbmV0d29yayBhdHRlbXB0LCBzbyB0aGUgcmVjb3JkIHNob3dzIHdoYXQgdGhlIGJvdW5kYXJ5XG4vLyBkaWQgd2l0aCBpdC4gT3V0c2lkZSBwbGltc29sbCB0aGlzIHJlYWNoZXMgZXhhbXBsZS5jb207IGluc2lkZSwgd2l0aCBubyBncmFudCxcbi8vIHRoZXJlIGlzIG5vIG5ldHdvcmssIGFuZCB0aGUgZXhpdCBjb2RlIHNheXMgc28uXG5mZXRjaChcImh0dHBzOi8vZXhhbXBsZS5jb20vXCIsIHsgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDUwMDApIH0pXG4gIC50aGVuKChyKSA9XHUwMDNlIHsgY29uc29sZS5sb2coXCJlZ3Jlc3M6IHJlYWNoZWQgZXhhbXBsZS5jb20sIHN0YXR1c1wiLCByLnN0YXR1cyk7IHByb2Nlc3MuZXhpdCgwKTsgfSlcbiAgLmNhdGNoKChlKSA9XHUwMDNlIHsgY29uc29sZS5lcnJvcihcImVncmVzczogcmVmdXNlZDpcIiwgKGUuY2F1c2UgXHUwMDI2XHUwMDI2IGUuY2F1c2UuY29kZSkgfHwgZS5uYW1lKTsgcHJvY2Vzcy5leGl0KDMpOyB9KTtcbiIsInBhdGgiOiJlZ3Jlc3MuanMifV0sImdyYW50X3Byb2ZpbGUiOiIiLCJzdGVwcyI6WyJub2RlIHJlY29uY2lsZS50ZXN0LmpzIiwibm9kZSBtYWluLmpzIiwibm9kZSBlZ3Jlc3MuanMiXX0sInByb3RvY29sIjo0LCJzb2Z0d2FyZV9ydWxlIjpudWxsLCJ0aW1lb3V0X21zIjozMDAwMCwidHJhY2VfaWQiOiJtYW5pZmVzdC1wb2MtcnVuLTIifSwicmVzcG9uc2UiOnsiZHVyYXRpb25fbXMiOiI2MTYzIiwiZW52aXJvbm1lbnQiOiJkb2NrZXItaW1hZ2U6c2hhMjU2OjMyZGE3N2IxYmUyNGRlNGMxNTI2NjdjMjhhYjYzNTMxNDI1Y2Q2OTAwMGFjZjMwYTMyODk4NWNiODU3Mzc3ZjciLCJpbnN0YW5jZSI6IiIsImlzb2xhdGlvbiI6Imtlcm5lbCIsInByb2plY3QiOnsiYWR2aWNlIjpbXSwiYXJ0aWZhY3RzIjpbXSwiYXJ0aWZhY3RzX3RydW5jYXRlZCI6ZmFsc2UsIm91dGNvbWUiOiJQUk9KRUNUX09VVENPTUVfQ09NUExFVEVEIiwib3V0Y29tZV9kZXRhaWwiOiIiLCJzdGVwcyI6W3siY29tbWFuZCI6Im5vZGUgcmVjb25jaWxlLnRlc3QuanMiLCJkdXJhdGlvbl9tcyI6IjEwNCIsImV4aXRfY29kZSI6MCwic3RkZXJyIjoiIiwic3RkZXJyX3RydW5jYXRlZCI6ZmFsc2UsInN0ZG91dCI6ImNtVmpiMjVqYVd4bE9pQXpJR0Z6YzJWeWRHbHZibk1nY0dGemMyVmtDZz09Iiwic3Rkb3V0X3RydW5jYXRlZCI6ZmFsc2UsInRpbWVkX291dCI6ZmFsc2V9LHsiY29tbWFuZCI6Im5vZGUgbWFpbi5qcyIsImR1cmF0aW9uX21zIjoiMTIyIiwiZXhpdF9jb2RlIjowLCJzdGRlcnIiOiIiLCJzdGRlcnJfdHJ1bmNhdGVkIjpmYWxzZSwic3Rkb3V0IjoiZXlKcGJuWnZhV05sY3lJNk5Dd2ljR0Y1YldWdWRITWlPalFzSW0xaGRHTm9aV1FpT2xzaVNVNVdMVEl3TURFaUxDSkpUbFl0TWpBd01pSmRMQ0oxYm5CaGFXUWlPbHQ3SW1sa0lqb2lTVTVXTFRJd01ETWlMQ0p2ZDJWa0lqbzNNalV3ZlYwc0ltOTJaWEp3WVdsa0lqcGJleUpwWkNJNklrbE9WaTB5TURBMElpd2laWGhqWlhOeklqb3hNREF3ZlYxOUNnPT0iLCJzdGRvdXRfdHJ1bmNhdGVkIjpmYWxzZSwidGltZWRfb3V0IjpmYWxzZX0seyJjb21tYW5kIjoibm9kZSBlZ3Jlc3MuanMiLCJkdXJhdGlvbl9tcyI6IjUzNzMiLCJleGl0X2NvZGUiOjMsInN0ZGVyciI6IlpXZHlaWE56T2lCeVpXWjFjMlZrT2lCVWFXMWxiM1YwUlhKeWIzSUsiLCJzdGRlcnJfdHJ1bmNhdGVkIjpmYWxzZSwic3Rkb3V0IjoiIiwic3Rkb3V0X3RydW5jYXRlZCI6ZmFsc2UsInRpbWVkX291dCI6ZmFsc2V9XX0sInJlY29yZCI6eyJlbmRlZF91bml4X21zIjoiMTc5Mjc4NjI3ODE2OCIsImVudmlyb25tZW50IjoiZG9ja2VyLWltYWdlOnNoYTI1NjozMmRhNzdiMWJlMjRkZTRjMTUyNjY3YzI4YWI2MzUzMTQyNWNkNjkwMDBhY2YzMGEzMjg5ODVjYjg1NzM3N2Y3IiwiaW5zdGFuY2UiOiIiLCJpc29sYXRpb24iOiJrZXJuZWwiLCJwb2xpY3kiOiIiLCJwcmV2aW91c19zaGEyNTYiOiIiLCJwcm92aWRlciI6ImRvY2tlciIsInJlY29yZF9zaGEyNTYiOiIyOWMyZTdiMDc0MjlmMjViYmVkZGE0ZjQ1NzJiNDcyMDgzNzQzN2JiZjFmNmU5MjRhNzVkN2Q0NDczOTUwOWQ2IiwicmVxdWVzdF9zaGEyNTYiOiJiNTM4NmI4YTMyMjE1YTIwZjg0M2ZkZGNjYzc5NjU0M2FiNDVmZjBiZjdmYTYzZDM4Y2E4Nzg1NWQyMDFhN2UxIiwicmVzdWx0X3NoYTI1NiI6Ijk2MDczMzc5MDgzMWEyYmM1NmRlZjk5YmE4ZjA2OWMyOTIxODE3YThhYWU5MzAzYzYyYTRmMmM4N2NjYzk3N2QiLCJzZXF1ZW5jZSI6IjAiLCJzZXNzaW9uIjoiIiwic29mdHdhcmVfaWRlbnRpdHkiOiJvY2ktbWFuaWZlc3Q6bGludXgvYW1kNjRAc2hhMjU2OmE2ZWYyZWExYzhmMWRlNWM4ODVlMWExOGJhN2VlNGQ5NjJlM2E4NTk4NzdmNmY0NmMyZmI3ZWJhYzFmNmNjNWMiLCJzb2Z0d2FyZV9ydWxlX2lkIjoiIiwic3RhcnRlZF91bml4X21zIjoiMTc5Mjc4NjI3MjAwNSIsInVuYW5zd2VyZWQiOiIiLCJ2ZXJzaW9uIjo0fSwic2FuZGJveCI6ImRvY2tlciIsInNvZnR3YXJlX2lkZW50aXR5Ijoib2NpLW1hbmlmZXN0OmxpbnV4L2FtZDY0QHNoYTI1NjphNmVmMmVhMWM4ZjFkZTVjODg1ZTFhMThiYTdlZTRkOTYyZTNhODU5ODc3ZjZmNDZjMmZiN2ViYWMxZjZjYzVjIn19",
                      "contentType": "application/json",
                      "encoding": "base64"
                    }
                  },
                  "name": "exchange.json"
                }
              ],
              "description": "Public example evidence: DSSE envelope, signed body type application/vnd.in-toto+json, in-toto statement https://in-toto.io/Statement/v1, predicate https://plimsollmark.github.io/plimsoll/run-record/v1, key id 88d311fb942e0fd87cdb1214b385db5fc354c166e84763f6d37885dbc96df379. entry.json is line 3 of the referenced bundle as stored: the exact binary protobuf request and response, the record's envelope and the harness's signed link placing the line. exchange.json is a plain JSON copy checked against those bytes.",
              "propertyName": "plimsoll:run_record"
            }
          ]
        },
        "definitions": {
          "standards": [
            {
              "bom-ref": "std-plimsoll-run-evidence",
              "name": "plimsoll run evidence",
              "requirements": [
                {
                  "bom-ref": "req-code",
                  "identifier": "R1",
                  "title": "the code that ran is identified by digest"
                },
                {
                  "bom-ref": "req-image",
                  "identifier": "R2",
                  "title": "the image is identified by its manifest digest"
                },
                {
                  "bom-ref": "req-tier",
                  "identifier": "R3",
                  "title": "the isolation tier the daemon states is signed"
                }
              ],
              "version": "1"
            }
          ]
        },
        "formulation": [
          {
            "bom-ref": "formula",
            "workflows": [
              {
                "bom-ref": "run",
                "inputs": [
                  {
                    "resource": {
                      "ref": "program"
                    }
                  }
                ],
                "name": "plimsoll run",
                "outputs": [
                  {
                    "properties": [
                      {
                        "name": "plimsoll:result_sha256",
                        "value": "960733790831a2bc56def99ba8f069c2921817a8aae9303c62a4f2c87ccc977d"
                      }
                    ],
                    "resource": {
                      "ref": "evidence-run-record"
                    },
                    "type": "other"
                  }
                ],
                "properties": [
                  {
                    "name": "plimsoll:provider",
                    "value": "docker"
                  },
                  {
                    "name": "plimsoll:isolation",
                    "value": "kernel"
                  },
                  {
                    "name": "plimsoll:minimum_isolation",
                    "value": "kernel"
                  },
                  {
                    "name": "plimsoll:timeout_ms",
                    "value": "30000"
                  },
                  {
                    "name": "plimsoll:grant",
                    "value": "none"
                  },
                  {
                    "name": "plimsoll:outcome",
                    "value": "completed"
                  }
                ],
                "runtimeTopology": [
                  {
                    "dependsOn": [
                      "image"
                    ],
                    "ref": "program"
                  }
                ],
                "taskDependencies": [
                  {
                    "ref": "step-1"
                  },
                  {
                    "dependsOn": [
                      "step-1"
                    ],
                    "ref": "step-2"
                  },
                  {
                    "dependsOn": [
                      "step-2"
                    ],
                    "ref": "step-3"
                  }
                ],
                "taskTypes": [
                  "other"
                ],
                "tasks": [
                  {
                    "bom-ref": "step-1",
                    "name": "node reconcile.test.js",
                    "steps": [
                      {
                        "commands": [
                          {
                            "executed": "node reconcile.test.js",
                            "properties": [
                              {
                                "name": "plimsoll:exit_code",
                                "value": "0"
                              },
                              {
                                "name": "plimsoll:duration_ms",
                                "value": "104"
                              },
                              {
                                "name": "plimsoll:timed_out",
                                "value": "false"
                              },
                              {
                                "name": "plimsoll:stdout_truncated",
                                "value": "false"
                              },
                              {
                                "name": "plimsoll:stderr_truncated",
                                "value": "false"
                              }
                            ]
                          }
                        ]
                      }
                    ],
                    "taskTypes": [
                      "other"
                    ],
                    "uid": "1"
                  },
                  {
                    "bom-ref": "step-2",
                    "name": "node main.js",
                    "steps": [
                      {
                        "commands": [
                          {
                            "executed": "node main.js",
                            "properties": [
                              {
                                "name": "plimsoll:exit_code",
                                "value": "0"
                              },
                              {
                                "name": "plimsoll:duration_ms",
                                "value": "122"
                              },
                              {
                                "name": "plimsoll:timed_out",
                                "value": "false"
                              },
                              {
                                "name": "plimsoll:stdout_truncated",
                                "value": "false"
                              },
                              {
                                "name": "plimsoll:stderr_truncated",
                                "value": "false"
                              }
                            ]
                          }
                        ]
                      }
                    ],
                    "taskTypes": [
                      "other"
                    ],
                    "uid": "2"
                  },
                  {
                    "bom-ref": "step-3",
                    "name": "node egress.js",
                    "steps": [
                      {
                        "commands": [
                          {
                            "executed": "node egress.js",
                            "properties": [
                              {
                                "name": "plimsoll:exit_code",
                                "value": "3"
                              },
                              {
                                "name": "plimsoll:duration_ms",
                                "value": "5373"
                              },
                              {
                                "name": "plimsoll:timed_out",
                                "value": "false"
                              },
                              {
                                "name": "plimsoll:stdout_truncated",
                                "value": "false"
                              },
                              {
                                "name": "plimsoll:stderr_truncated",
                                "value": "false"
                              }
                            ]
                          }
                        ]
                      }
                    ],
                    "taskTypes": [
                      "other"
                    ],
                    "uid": "3"
                  }
                ],
                "timeEnd": "2026-10-23T20:11:18.168Z",
                "timeStart": "2026-10-23T20:11:12.005Z",
                "uid": "29c2e7b07429f25bbedda4f4572b4720837437bbf1f6e924a75d7d44739509d6"
              }
            ]
          }
        ],
        "metadata": {
          "component": {
            "bom-ref": "program",
            "components": [
              {
                "hashes": [
                  {
                    "alg": "SHA-256",
                    "content": "65c92bfa75d038413dca800752ae962e8f6ef058953185d9e2967165b57c448c"
                  }
                ],
                "name": "egress.js",
                "properties": [
                  {
                    "name": "plimsoll:bytes",
                    "value": "492"
                  }
                ],
                "type": "file"
              },
              {
                "hashes": [
                  {
                    "alg": "SHA-256",
                    "content": "71ef6972211c39f941bfac9534cefd7b19cff470419f148a7351743d011b7698"
                  }
                ],
                "name": "main.js",
                "properties": [
                  {
                    "name": "plimsoll:bytes",
                    "value": "533"
                  }
                ],
                "type": "file"
              },
              {
                "hashes": [
                  {
                    "alg": "SHA-256",
                    "content": "c2de8205ca1e811fba188b71b051e25644f88b8190351372ab3ed4a842231456"
                  }
                ],
                "name": "reconcile.js",
                "properties": [
                  {
                    "name": "plimsoll:bytes",
                    "value": "685"
                  }
                ],
                "type": "file"
              },
              {
                "hashes": [
                  {
                    "alg": "SHA-256",
                    "content": "ce76efdec6de19969e12f5ca27b273396ca274dfa330df36811f78354c659c97"
                  }
                ],
                "name": "reconcile.test.js",
                "properties": [
                  {
                    "name": "plimsoll:bytes",
                    "value": "663"
                  }
                ],
                "type": "file"
              }
            ],
            "description": "An agent-style example program run once through plimsoll; authorship is supplied context, not verified evidence.",
            "externalReferences": [
              {
                "hashes": [
                  {
                    "alg": "SHA-256",
                    "content": "3f7028e3e5d367770ac721306548d7d741a9eeb284f8bbd4441320f76076e772"
                  }
                ],
                "type": "attestation",
                "url": "https://plimsollmark.github.io/plimsoll/examples/sbom/bundle.jsonl"
              },
              {
                "type": "documentation",
                "url": "https://plimsollmark.github.io/plimsoll/examples/sbom/index.html"
              },
              {
                "type": "vcs",
                "url": "https://github.com/plimsollmark/plimsoll"
              }
            ],
            "hashes": [
              {
                "alg": "SHA-256",
                "content": "d0f73fac975a601a647e768eaba084b72ff80a6b7dca4c3f1b62eec16b244c43"
              }
            ],
            "name": "reconcile",
            "properties": [
              {
                "name": "plimsoll:author_kind",
                "value": "agent"
              },
              {
                "name": "plimsoll:author_kind_basis",
                "value": "supplied example context, unverified"
              },
              {
                "name": "plimsoll:request_sha256",
                "value": "b5386b8a32215a20f843fddccc796543ab45ff0bf7fa63d38ca87855d201a7e1"
              },
              {
                "name": "plimsoll:result_sha256",
                "value": "960733790831a2bc56def99ba8f069c2921817a8aae9303c62a4f2c87ccc977d"
              },
              {
                "name": "plimsoll:record_sha256",
                "value": "29c2e7b07429f25bbedda4f4572b4720837437bbf1f6e924a75d7d44739509d6"
              },
              {
                "name": "plimsoll:trace_id",
                "value": "manifest-poc-run-2"
              }
            ],
            "type": "application",
            "version": "d0f73fac975a"
          },
          "lifecycles": [
            {
              "phase": "operations"
            }
          ],
          "timestamp": "2026-10-23T20:11:18.168Z",
          "tools": {
            "components": [
              {
                "externalReferences": [
                  {
                    "type": "vcs",
                    "url": "https://github.com/plimsollmark/plimsoll"
                  }
                ],
                "name": "plimsoll-sbom",
                "type": "application",
                "version": "0.2.0"
              }
            ]
          }
        },
        "properties": [
          {
            "name": "plimsoll:bundle_sha256",
            "value": "3f7028e3e5d367770ac721306548d7d741a9eeb284f8bbd4441320f76076e772"
          },
          {
            "name": "plimsoll:bundle_line",
            "value": "3"
          },
          {
            "name": "plimsoll:emitter",
            "value": "examples/sbom"
          }
        ],
        "serialNumber": "urn:uuid:d341624b-0774-412d-a66c-522f1edb3f63",
        "specVersion": "1.6",
        "version": 1
      }
      

      The same request, in a VM

      Outcome: completedStated tier: vmFloor asked: kernelNo grant: no networkBundle line 5

      The completed outcome means the runner returned a normal result; a step with a nonzero exit code still failed. The stated tier is the daemon's reported isolation tier, backed by provider configuration and startup checks, never runtime attestation.

      Time (UTC)
      2026-10-23T20:21:04.758Z to 2026-10-23T20:21:09.088Z
      Request digest
      00c95be443d358949d123d77464e9c40b03dafd3f3094b709d8719b004c0a7a4
      Record digest
      bb65a092a89ee8e52440be6d57028ebcdeb25b58d9903f1fbbf1be199792a75c
      Image identity
      dockercloud-image:sha256:2c752226d477b4a886378baa95b9af252be59301b725fdb0b7e15208131505a8
      Bundle
      INTERNAL · bundle.jsonl, line 5 →

      Open Container Initiative (OCI) is the container image format. The manifest digest identifies the selected image for one platform, such as Linux on a standard PC processor (linux/amd64). A display name never supplies that identity.

      INTERNAL · this run's CycloneDX JSON →

      The program's files

      reconcile.js

      SHA-256: c2de8205ca1e811fba188b71b051e25644f88b8190351372ab3ed4a842231456

      // reconcile.js: match payments to invoices by invoice id and report what is
      // unpaid, overpaid or matched. Amounts are integer cents.
      function reconcile(invoices, payments) {
        const paid = new Map();
        for (const p of payments) paid.set(p.invoice, (paid.get(p.invoice) || 0) + p.cents);
        const matched = [], unpaid = [], overpaid = [];
        for (const inv of invoices) {
          const got = paid.get(inv.id) || 0;
          if (got === inv.cents) matched.push(inv.id);
          else if (got < inv.cents) unpaid.push({ id: inv.id, owed: inv.cents - got });
          else overpaid.push({ id: inv.id, excess: got - inv.cents });
        }
        return { matched, unpaid, overpaid };
      }
      module.exports = { reconcile };
      
      reconcile.test.js

      SHA-256: ce76efdec6de19969e12f5ca27b273396ca274dfa330df36811f78354c659c97

      const assert = require("node:assert/strict");
      const { reconcile } = require("./reconcile.js");
      const invoices = [
        { id: "INV-1001", cents: 12500 },
        { id: "INV-1002", cents: 8000 },
        { id: "INV-1003", cents: 4200 },
      ];
      const payments = [
        { invoice: "INV-1001", cents: 12500 },
        { invoice: "INV-1002", cents: 5000 },
        { invoice: "INV-1003", cents: 4200 },
        { invoice: "INV-1003", cents: 300 },
      ];
      const r = reconcile(invoices, payments);
      assert.deepEqual(r.matched, ["INV-1001"]);
      assert.deepEqual(r.unpaid, [{ id: "INV-1002", owed: 3000 }]);
      assert.deepEqual(r.overpaid, [{ id: "INV-1003", excess: 300 }]);
      console.log("reconcile: 3 assertions passed");
      
      main.js

      SHA-256: 71ef6972211c39f941bfac9534cefd7b19cff470419f148a7351743d011b7698

      const { reconcile } = require("./reconcile.js");
      const invoices = [
        { id: "INV-2001", cents: 99000 },
        { id: "INV-2002", cents: 15000 },
        { id: "INV-2003", cents: 7250 },
        { id: "INV-2004", cents: 31000 },
      ];
      const payments = [
        { invoice: "INV-2001", cents: 99000 },
        { invoice: "INV-2002", cents: 15000 },
        { invoice: "INV-2004", cents: 31000 },
        { invoice: "INV-2004", cents: 1000 },
      ];
      const r = reconcile(invoices, payments);
      console.log(JSON.stringify({ invoices: invoices.length, payments: payments.length, ...r }));
      

      The commands and recorded results

      Standard output (stdout) is printed output; standard error (stderr) is the separate diagnostic channel. Exit code 0 means the command reported success. A nonzero code means it reported failure.

      node reconcile.test.js

      Exit 0356 millisecondsSandbox timeout: false
      stdout:
      reconcile: 3 assertions passed
      stderr:
      

      node main.js

      Exit 0505 millisecondsSandbox timeout: false
      stdout:
      {"invoices":4,"payments":4,"matched":["INV-2001","INV-2002"],"unpaid":[{"id":"INV-2003","owed":7250}],"overpaid":[{"id":"INV-2004","excess":1000}]}
      stderr:
      

      Try the receipt here

      The seal is a tamper strip, like the one on a medicine bottle. Check it, then change a copy and watch the seal fail. Your browser uses only the bytes inside this page.

      Checking whether this browser can verify the seal.

        This checks one receipt, its bundle line's seal and its JSON fields. The emitter's Go checker also verifies the whole bundle when it has it and proves that the JSON copy matches the stored protobuf messages. An attached public key proves consistency under that key; it does not tell you who owns it.

        Checks actually run by the emitter

        These receipts come from checking the generated BOM and three separately altered copies. The original source files are unchanged.

        PASS: CycloneDX 1.6 schema (vendored, offline).
        PASS: DSSE envelope signature and run-record digest.
        PASS: the attached bundle line: its link's seal and place, the stored request and result against the signed digests.
        PASS: exchange.json equals the line's protobuf messages and reproduces their digests.
        PASS: file-set digest recomputed from file components and bound to the signed request.
        PASS: every mapped field and claim matches the verified exchange.
        PASS: attached key matches independently trusted key.
        PASS: the attached line is line 5 of the referenced bundle, whole to its checkpoint (8 lines).
        LIMIT: names, page URL and assessor label are unsigned presentation; runtime assertions remain the daemon's statements.
        PASS: altered envelope refused: envelope: attest: no valid signature from this key
        PASS: altered file hash refused: file-set digest differs from program hash
        PASS: altered claim digest refused: BOM differs from the verified exchange: file contents, digests, claims or another mapped field was changed
        
        Every BOM field and where it came from
        FieldSource
        annotations[0].annotator.component.externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        annotations[0].annotator.component.externalReferences[0].urlEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        annotations[0].annotator.component.nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        annotations[0].annotator.component.typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        annotations[0].annotator.component.versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        annotations[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        annotations[0].subjects[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        annotations[0].textEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        annotations[0].timestampSigned record.ended_unix_ms, formatted in UTC with milliseconds.
        bomFormatEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        components[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        components[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        components[0].hashes[0].contentSelected OCI manifest digest from signed record.software_identity; purl also uses the unsigned display name.
        components[0].nameUnsigned -image-name display label.
        components[0].properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        components[0].properties[0].valueSigned record: environment.
        components[0].properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        components[0].properties[1].valueSigned record: software_identity.
        components[0].purlSelected OCI manifest digest from signed record.software_identity; purl also uses the unsigned display name.
        components[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        components[0].versionSelected OCI manifest digest from signed record.software_identity; purl also uses the unsigned display name.
        declarations.affirmation.statementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.assessors[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.assessors[0].organization.nameUnsigned -operator self-assessor label.
        declarations.assessors[0].thirdPartyEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].assessorEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].map[0].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].map[0].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].map[0].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].map[0].conformance.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].map[0].conformance.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].map[0].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].map[1].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].map[1].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].map[1].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].map[1].conformance.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].map[1].conformance.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].map[1].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].map[2].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].map[2].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].map[2].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].map[2].conformance.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].map[2].conformance.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].map[2].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.attestations[0].summaryEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.claims[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.claims[0].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.claims[0].predicateVerified signed record and its stored request; code claim also uses the file-set digest.
        declarations.claims[0].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.claims[0].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.claims[1].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.claims[1].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.claims[1].predicateVerified signed record and its stored request; code claim also uses the file-set digest.
        declarations.claims[1].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.claims[1].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.claims[2].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.claims[2].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.claims[2].predicateVerified signed record and its stored request; code claim also uses the file-set digest.
        declarations.claims[2].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.claims[2].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.evidence[0].author.nameFixed envelope/statement/predicate type names plus key id = SHA-256 of the public key bytes.
        declarations.evidence[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.evidence[0].createdSigned record.ended_unix_ms, formatted in UTC with milliseconds.
        declarations.evidence[0].data[0].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
        declarations.evidence[0].data[0].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.evidence[0].data[0].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.evidence[0].data[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.evidence[0].data[1].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
        declarations.evidence[0].data[1].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.evidence[0].data[1].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.evidence[0].data[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.evidence[0].data[2].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
        declarations.evidence[0].data[2].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.evidence[0].data[2].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.evidence[0].data[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.evidence[0].data[3].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
        declarations.evidence[0].data[3].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.evidence[0].data[3].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.evidence[0].data[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        declarations.evidence[0].descriptionFixed envelope/statement/predicate type names plus key id = SHA-256 of the public key bytes.
        declarations.evidence[0].propertyNameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        definitions.standards[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        definitions.standards[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        definitions.standards[0].requirements[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        definitions.standards[0].requirements[0].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        definitions.standards[0].requirements[0].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        definitions.standards[0].requirements[1].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        definitions.standards[0].requirements[1].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        definitions.standards[0].requirements[1].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        definitions.standards[0].requirements[2].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        definitions.standards[0].requirements[2].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        definitions.standards[0].requirements[2].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        definitions.standards[0].versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].inputs[0].resource.refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].outputs[0].properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].outputs[0].properties[0].valueSigned record: result_sha256.
        formulation[0].workflows[0].outputs[0].resource.refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].outputs[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].properties[0].valueSigned record: provider.
        formulation[0].workflows[0].properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].properties[1].valueSigned record: isolation.
        formulation[0].workflows[0].properties[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].properties[2].valueStored request: minimum_isolation; the bundle link signs the exact stored bytes.
        formulation[0].workflows[0].properties[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].properties[3].valueStored request: timeout_ms; the bundle link signs the exact stored bytes.
        formulation[0].workflows[0].properties[4].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].properties[4].valueStored request.project.grant_profile, or none when it is empty.
        formulation[0].workflows[0].properties[5].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].properties[5].valueStored response.project.outcome.
        formulation[0].workflows[0].runtimeTopology[0].dependsOn[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].runtimeTopology[0].refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].taskDependencies[0].refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].taskDependencies[1].dependsOn[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].taskDependencies[1].refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].taskTypes[0]Constant other: no task type was declared; the command supplies the name.
        formulation[0].workflows[0].tasks[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].tasks[0].nameStored request.project.steps[] equals stored response.project.steps[].command.
        formulation[0].workflows[0].tasks[0].steps[0].commands[0].executedStored request.project.steps[] equals stored response.project.steps[].command.
        formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[0].nameStored request.project.steps[] equals stored response.project.steps[].command.
        formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[0].valueStored response.project.steps[].exit_code; the bundle link signs the stored bytes.
        formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[1].nameStored request.project.steps[] equals stored response.project.steps[].command.
        formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[1].valueStored response.project.steps[].duration_ms; the bundle link signs the stored bytes.
        formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[2].nameStored request.project.steps[] equals stored response.project.steps[].command.
        formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[2].valueStored response.project.steps[].timed_out; the bundle link signs the stored bytes.
        formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[3].nameStored request.project.steps[] equals stored response.project.steps[].command.
        formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[3].valueStored response.project.steps[].stdout_truncated; the bundle link signs the stored bytes.
        formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[4].nameStored request.project.steps[] equals stored response.project.steps[].command.
        formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[4].valueStored response.project.steps[].stderr_truncated; the bundle link signs the stored bytes.
        formulation[0].workflows[0].tasks[0].taskTypes[0]Constant other: no task type was declared; the command supplies the name.
        formulation[0].workflows[0].tasks[0].uidSigned record.record_sha256 for the workflow; one-based result-step index for a task.
        formulation[0].workflows[0].tasks[1].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        formulation[0].workflows[0].tasks[1].nameStored request.project.steps[] equals stored response.project.steps[].command.
        formulation[0].workflows[0].tasks[1].steps[0].commands[0].executedStored request.project.steps[] equals stored response.project.steps[].command.
        formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[0].nameStored request.project.steps[] equals stored response.project.steps[].command.
        formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[0].valueStored response.project.steps[].exit_code; the bundle link signs the stored bytes.
        formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[1].nameStored request.project.steps[] equals stored response.project.steps[].command.
        formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[1].valueStored response.project.steps[].duration_ms; the bundle link signs the stored bytes.
        formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[2].nameStored request.project.steps[] equals stored response.project.steps[].command.
        formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[2].valueStored response.project.steps[].timed_out; the bundle link signs the stored bytes.
        formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[3].nameStored request.project.steps[] equals stored response.project.steps[].command.
        formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[3].valueStored response.project.steps[].stdout_truncated; the bundle link signs the stored bytes.
        formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[4].nameStored request.project.steps[] equals stored response.project.steps[].command.
        formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[4].valueStored response.project.steps[].stderr_truncated; the bundle link signs the stored bytes.
        formulation[0].workflows[0].tasks[1].taskTypes[0]Constant other: no task type was declared; the command supplies the name.
        formulation[0].workflows[0].tasks[1].uidSigned record.record_sha256 for the workflow; one-based result-step index for a task.
        formulation[0].workflows[0].timeEndSigned record.ended_unix_ms, formatted in UTC with milliseconds.
        formulation[0].workflows[0].timeStartSigned record.started_unix_ms, formatted in UTC with milliseconds.
        formulation[0].workflows[0].uidSigned record.record_sha256 for the workflow; one-based result-step index for a task.
        metadata.component.bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.components[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.components[0].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
        metadata.component.components[0].nameStored request.project.files[].path, sorted by path.
        metadata.component.components[0].properties[0].nameStored request.project.files[].path, sorted by path.
        metadata.component.components[0].properties[0].valueByte length of request.project.files[].content.
        metadata.component.components[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.components[1].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.components[1].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
        metadata.component.components[1].nameStored request.project.files[].path, sorted by path.
        metadata.component.components[1].properties[0].nameStored request.project.files[].path, sorted by path.
        metadata.component.components[1].properties[0].valueByte length of request.project.files[].content.
        metadata.component.components[1].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.components[2].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.components[2].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
        metadata.component.components[2].nameStored request.project.files[].path, sorted by path.
        metadata.component.components[2].properties[0].nameStored request.project.files[].path, sorted by path.
        metadata.component.components[2].properties[0].valueByte length of request.project.files[].content.
        metadata.component.components[2].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.descriptionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.externalReferences[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.externalReferences[0].hashes[0].contentSHA-256 of the referenced complete bundle, or qualification file, bytes.
        metadata.component.externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.externalReferences[0].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
        metadata.component.externalReferences[1].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.externalReferences[1].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
        metadata.component.externalReferences[2].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.externalReferences[2].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
        metadata.component.hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.hashes[0].contentFile-set digest recomputed from the stored request's file paths and contents.
        metadata.component.nameUnsigned display label: -name, or the judged file's name for a run with a verdict.
        metadata.component.properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.properties[0].valueUnsigned supplied example context; the run record does not establish authorship.
        metadata.component.properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.properties[1].valueUnsigned supplied example context; the run record does not establish authorship.
        metadata.component.properties[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.properties[2].valueSigned record: request_sha256.
        metadata.component.properties[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.properties[3].valueSigned record: result_sha256.
        metadata.component.properties[4].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.properties[4].valueSigned record: record_sha256.
        metadata.component.properties[5].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.properties[5].valueStored request: trace_id; the bundle link signs the exact stored bytes.
        metadata.component.typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.component.versionFirst 12 hex characters of the file-set digest.
        metadata.lifecycles[0].phaseEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.timestampSigned record.ended_unix_ms, formatted in UTC with milliseconds.
        metadata.tools.components[0].externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.tools.components[0].externalReferences[0].urlEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.tools.components[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.tools.components[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        metadata.tools.components[0].versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        properties[0].valueSHA-256 of the complete bundle file the attached line belongs to.
        properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        properties[1].valueIndex the harness's signed link gives the attached bundle line.
        properties[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        properties[2].valueEmitter mapping constant.
        serialNumberFirst 16 bytes of SHA-256(plimsoll-sbom-serial + newline + record digest), UUID version/variant bits set.
        specVersionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
        Raw CycloneDX JSON
        {
          "annotations": [
            {
              "annotator": {
                "component": {
                  "externalReferences": [
                    {
                      "type": "vcs",
                      "url": "https://github.com/plimsollmark/plimsoll"
                    }
                  ],
                  "name": "plimsoll-sbom",
                  "type": "application",
                  "version": "0.2.0"
                }
              },
              "bom-ref": "limits",
              "subjects": [
                "program"
              ],
              "text": "The attached run record is signed; this BOM is unsigned. Agent authorship is supplied example context, not a record fact, and the execution layer cannot identify the model. Network isolation is provider configuration, not a separately signed runtime measurement; a granted run reaches only the routes its grant lists, and what reached the other side is not in this record. The run's times are the daemon's own unwitnessed clock. An attached key alone establishes consistency, not signer identity; use an independently trusted key. Display names and the assessor label are unsigned presentation. The attached bundle line proves itself; the whole bundle it belongs to is referenced by digest and checked when supplied. This is run evidence, not an inventory of the image's installed packages.",
              "timestamp": "2026-10-23T20:21:09.088Z"
            }
          ],
          "bomFormat": "CycloneDX",
          "components": [
            {
              "bom-ref": "image",
              "hashes": [
                {
                  "alg": "SHA-256",
                  "content": "2c752226d477b4a886378baa95b9af252be59301b725fdb0b7e15208131505a8"
                }
              ],
              "name": "sandbox",
              "properties": [
                {
                  "name": "plimsoll:environment",
                  "value": "dockercloud-image:sha256:2c752226d477b4a886378baa95b9af252be59301b725fdb0b7e15208131505a8"
                },
                {
                  "name": "plimsoll:software_identity",
                  "value": ""
                }
              ],
              "purl": "pkg:oci/sandbox@sha256:2c752226d477b4a886378baa95b9af252be59301b725fdb0b7e15208131505a8",
              "type": "container",
              "version": "sha256:2c752226d477b4a886378baa95b9af252be59301b725fdb0b7e15208131505a8"
            }
          ],
          "declarations": {
            "affirmation": {
              "statement": "The attached run record was stated by plimsolld, checked and signed by plimsoll-attest, and restated here; plimsoll-attest verify and this program's -check recompute it. This affirmation and BOM are unsigned."
            },
            "assessors": [
              {
                "bom-ref": "assessor",
                "organization": {
                  "name": "plimsoll examples (self-assessed)"
                },
                "thirdParty": false
              }
            ],
            "attestations": [
              {
                "assessor": "assessor",
                "map": [
                  {
                    "claims": [
                      "claim-code"
                    ],
                    "confidence": {
                      "rationale": "a signature check and a digest recomputation, not a judgement or a probability that the runtime assertion is true",
                      "score": 1
                    },
                    "conformance": {
                      "rationale": "The claim matches the signed exchange under a deterministic comparison; this is self-assessed consistency, not independent runtime assurance.",
                      "score": 1
                    },
                    "requirement": "req-code"
                  },
                  {
                    "claims": [
                      "claim-image"
                    ],
                    "confidence": {
                      "rationale": "a signature check and a digest recomputation, not a judgement or a probability that the runtime assertion is true",
                      "score": 1
                    },
                    "conformance": {
                      "rationale": "The claim matches the signed exchange under a deterministic comparison; this is self-assessed consistency, not independent runtime assurance.",
                      "score": 1
                    },
                    "requirement": "req-image"
                  },
                  {
                    "claims": [
                      "claim-tier"
                    ],
                    "confidence": {
                      "rationale": "a signature check and a digest recomputation, not a judgement or a probability that the runtime assertion is true",
                      "score": 1
                    },
                    "conformance": {
                      "rationale": "The claim matches the signed exchange under a deterministic comparison; this is self-assessed consistency, not independent runtime assurance.",
                      "score": 1
                    },
                    "requirement": "req-tier"
                  }
                ],
                "summary": "A self-assessed restatement of a signed run record with reproducible consistency checks."
              }
            ],
            "claims": [
              {
                "bom-ref": "claim-code",
                "evidence": [
                  "evidence-run-record"
                ],
                "predicate": "The program's 3 files, file-set digest 6bc21d24ac7a0e21fa02e023551a11d0e3d8ce8310039c4b3c6765609f9c14d8, are the files in the stored request whose signed digest 00c95be443d358949d123d77464e9c40b03dafd3f3094b709d8719b004c0a7a4 covers them with the isolation floor and timeout.",
                "reasoning": "Each claim restates the run record the daemon stated and the attest harness checked against the stored request and result and signed. The attached bundle line permits those checks to be repeated. This emitter did not observe execution. The tier is configuration and provider evidence plus startup smoke tests, never runtime attestation.",
                "target": "program"
              },
              {
                "bom-ref": "claim-image",
                "evidence": [
                  "evidence-run-record"
                ],
                "predicate": "The daemon states that the run executed in a Docker Cloud microVM booted from the image whose linux/amd64 manifest digest is sha256:2c752226d477b4a886378baa95b9af252be59301b725fdb0b7e15208131505a8 (environment dockercloud-image:sha256:2c752226d477b4a886378baa95b9af252be59301b725fdb0b7e15208131505a8), the provider's pin, which it compares with the digest the cloud reports each sandbox booted and refuses to run on a difference.",
                "reasoning": "Each claim restates the run record the daemon stated and the attest harness checked against the stored request and result and signed. The attached bundle line permits those checks to be repeated. This emitter did not observe execution. The tier is configuration and provider evidence plus startup smoke tests, never runtime attestation.",
                "target": "program"
              },
              {
                "bom-ref": "claim-tier",
                "evidence": [
                  "evidence-run-record"
                ],
                "predicate": "The daemon states provider dockercloud and isolation tier vm, at or above requested floor kernel, from 2026-10-23T20:21:04.758Z to 2026-10-23T20:21:09.088Z UTC; the stored request names no host-API grant and the result digest is 7a38c50fe500b5827774fc68352cc66a153f44e89e7a7f6d6965f5823ad404d9. The provider's no-grant configuration supplies network isolation; this record is not a network measurement.",
                "reasoning": "Each claim restates the run record the daemon stated and the attest harness checked against the stored request and result and signed. The attached bundle line permits those checks to be repeated. This emitter did not observe execution. The tier is configuration and provider evidence plus startup smoke tests, never runtime attestation.",
                "target": "program"
              }
            ],
            "evidence": [
              {
                "author": {
                  "name": "plimsoll-attest key 88d311fb942e0fd87cdb1214b385db5fc354c166e84763f6d37885dbc96df379"
                },
                "bom-ref": "evidence-run-record",
                "created": "2026-10-23T20:21:09.088Z",
                "data": [
                  {
                    "contents": {
                      "attachment": {
                        "content": "eyJwYXlsb2FkVHlwZSI6ImFwcGxpY2F0aW9uL3ZuZC5pbi10b3RvK2pzb24iLCJwYXlsb2FkIjoiZXlKZmRIbHdaU0k2SW1oMGRIQnpPaTh2YVc0dGRHOTBieTVwYnk5VGRHRjBaVzFsYm5RdmRqRWlMQ0p6ZFdKcVpXTjBJanBiZXlKdVlXMWxJam9pY25WdUxYSmxZMjl5WkNJc0ltUnBaMlZ6ZENJNmV5SnphR0V5TlRZaU9pSmlZalkxWVRBNU1tRTRPV1ZsT0dVMU1qUTBNR0psTm1RMU56QXlPR1ZpWTJSbFlqSTFZalU0WkRrNU1ETm1NV1ppWW1ZeFltVXhPVGszT1RKaE56VmpJbjE5WFN3aWNISmxaR2xqWVhSbFZIbHdaU0k2SW1oMGRIQnpPaTh2Y0d4cGJYTnZiR3h0WVhKckxtZHBkR2gxWWk1cGJ5OXdiR2x0YzI5c2JDOXlkVzR0Y21WamIzSmtMM1l4SWl3aWNISmxaR2xqWVhSbElqcDdJblpsY25OcGIyNGlPalFzSW5KbGNYVmxjM1JmYzJoaE1qVTJJam9pTURCak9UVmlaVFEwTTJRek5UZzVORGxrTVRJelpEYzNORFkwWlRsak5EQmlNRE5rWVdaa00yWXpNRGswWWpjd09XUTROekU1WWpBd05HTXdZVGRoTkNJc0luSmxjM1ZzZEY5emFHRXlOVFlpT2lJM1lUTTRZelV3Wm1VMU1EQmlOVGd5TnpjM05HWmpOamd6TlRKall6WTJZVEUxTTJZME5HVTRPV1UzWVRkbU5tUTJPVFkxWmpVNE1qTmhaRFF3TkdRNUlpd2ljSEp2ZG1sa1pYSWlPaUprYjJOclpYSmpiRzkxWkNJc0ltbHpiMnhoZEdsdmJpSTZJblp0SWl3aVpXNTJhWEp2Ym0xbGJuUWlPaUprYjJOclpYSmpiRzkxWkMxcGJXRm5aVHB6YUdFeU5UWTZNbU0zTlRJeU1qWmtORGMzWWpSaE9EZzJNemM0WW1GaE9UVmlPV0ZtTWpVeVltVTFPVE13TVdJM01qVm1aR0l3WWpkbE1UVXlNRGd4TXpFMU1EVmhPQ0lzSW5CdmJHbGplU0k2SWlJc0luTjBZWEowWldSZmRXNXBlRjl0Y3lJNk1UYzVNamM0TmpnMk5EYzFPQ3dpWlc1a1pXUmZkVzVwZUY5dGN5STZNVGM1TWpjNE5qZzJPVEE0T0N3aWMyVnpjMmx2YmlJNklpSXNJbk5sY1hWbGJtTmxJam93TENKd2NtVjJhVzkxYzE5emFHRXlOVFlpT2lJaUxDSnlaV052Y21SZmMyaGhNalUySWpvaVltSTJOV0V3T1RKaE9EbGxaVGhsTlRJME5EQmlaVFprTlRjd01qaGxZbU5rWldJeU5XSTFPR1E1T1RBelpqRm1ZbUptTVdKbE1UazVOemt5WVRjMVl5SjlmUT09Iiwic2lnbmF0dXJlcyI6W3sia2V5aWQiOiI4OGQzMTFmYjk0MmUwZmQ4N2NkYjEyMTRiMzg1ZGI1ZmMzNTRjMTY2ZTg0NzYzZjZkMzc4ODVkYmM5NmRmMzc5Iiwic2lnIjoiMFFHQWtFSlMyWkg3VWVoc25uaFNVNHBrb3liSWJaQlNmdmxkWWNOaG9yOUVPeDduRXVsbDB5OEg0dnFkSHg5MEhITXhITkxXSVhoWnc5eUVFMG85QWc9PSJ9XX0=",
                        "contentType": "application/json",
                        "encoding": "base64"
                      }
                    },
                    "name": "envelope.json"
                  },
                  {
                    "contents": {
                      "attachment": {
                        "content": "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUNvd0JRWURLMlZ3QXlFQWJxQ3hCRE1RT0FZOTREekRWeDl2OG01aE12N1JnTVdRV1NzclR4UnFLcFU9Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo=",
                        "contentType": "application/x-pem-file",
                        "encoding": "base64"
                      }
                    },
                    "name": "harness.pub"
                  },
                  {
                    "contents": {
                      "attachment": {
                        "content": "eyJyZXF1ZXN0IjoiQ0FRU0JtdGxjbTVsYkJvU2JXRnVhV1psYzNRdGNHOWpMWEoxYmkweElMRHFBVnE3RHdxK0JRb01jbVZqYjI1amFXeGxMbXB6RXEwRkx5OGdjbVZqYjI1amFXeGxMbXB6T2lCdFlYUmphQ0J3WVhsdFpXNTBjeUIwYnlCcGJuWnZhV05sY3lCaWVTQnBiblp2YVdObElHbGtJR0Z1WkNCeVpYQnZjblFnZDJoaGRDQnBjd292THlCMWJuQmhhV1FzSUc5MlpYSndZV2xrSUc5eUlHMWhkR05vWldRdUlFRnRiM1Z1ZEhNZ1lYSmxJR2x1ZEdWblpYSWdZMlZ1ZEhNdUNtWjFibU4wYVc5dUlISmxZMjl1WTJsc1pTaHBiblp2YVdObGN5d2djR0Y1YldWdWRITXBJSHNLSUNCamIyNXpkQ0J3WVdsa0lEMGdibVYzSUUxaGNDZ3BPd29nSUdadmNpQW9ZMjl1YzNRZ2NDQnZaaUJ3WVhsdFpXNTBjeWtnY0dGcFpDNXpaWFFvY0M1cGJuWnZhV05sTENBb2NHRnBaQzVuWlhRb2NDNXBiblp2YVdObEtTQjhmQ0F3S1NBcklIQXVZMlZ1ZEhNcE93b2dJR052Ym5OMElHMWhkR05vWldRZ1BTQmJYU3dnZFc1d1lXbGtJRDBnVzEwc0lHOTJaWEp3WVdsa0lEMGdXMTA3Q2lBZ1ptOXlJQ2hqYjI1emRDQnBibllnYjJZZ2FXNTJiMmxqWlhNcElIc0tJQ0FnSUdOdmJuTjBJR2R2ZENBOUlIQmhhV1F1WjJWMEtHbHVkaTVwWkNrZ2ZId2dNRHNLSUNBZ0lHbG1JQ2huYjNRZ1BUMDlJR2x1ZGk1alpXNTBjeWtnYldGMFkyaGxaQzV3ZFhOb0tHbHVkaTVwWkNrN0NpQWdJQ0JsYkhObElHbG1JQ2huYjNRZ1BDQnBibll1WTJWdWRITXBJSFZ1Y0dGcFpDNXdkWE5vS0hzZ2FXUTZJR2x1ZGk1cFpDd2diM2RsWkRvZ2FXNTJMbU5sYm5SeklDMGdaMjkwSUgwcE93b2dJQ0FnWld4elpTQnZkbVZ5Y0dGcFpDNXdkWE5vS0hzZ2FXUTZJR2x1ZGk1cFpDd2daWGhqWlhOek9pQm5iM1FnTFNCcGJuWXVZMlZ1ZEhNZ2ZTazdDaUFnZlFvZ0lISmxkSFZ5YmlCN0lHMWhkR05vWldRc0lIVnVjR0ZwWkN3Z2IzWmxjbkJoYVdRZ2ZUc0tmUXB0YjJSMWJHVXVaWGh3YjNKMGN5QTlJSHNnY21WamIyNWphV3hsSUgwN0NncXRCUW9SY21WamIyNWphV3hsTG5SbGMzUXVhbk1TbHdWamIyNXpkQ0JoYzNObGNuUWdQU0J5WlhGMWFYSmxLQ0p1YjJSbE9tRnpjMlZ5ZEM5emRISnBZM1FpS1RzS1kyOXVjM1FnZXlCeVpXTnZibU5wYkdVZ2ZTQTlJSEpsY1hWcGNtVW9JaTR2Y21WamIyNWphV3hsTG1weklpazdDbU52Ym5OMElHbHVkbTlwWTJWeklEMGdXd29nSUhzZ2FXUTZJQ0pKVGxZdE1UQXdNU0lzSUdObGJuUnpPaUF4TWpVd01DQjlMQW9nSUhzZ2FXUTZJQ0pKVGxZdE1UQXdNaUlzSUdObGJuUnpPaUE0TURBd0lIMHNDaUFnZXlCcFpEb2dJa2xPVmkweE1EQXpJaXdnWTJWdWRITTZJRFF5TURBZ2ZTd0tYVHNLWTI5dWMzUWdjR0Y1YldWdWRITWdQU0JiQ2lBZ2V5QnBiblp2YVdObE9pQWlTVTVXTFRFd01ERWlMQ0JqWlc1MGN6b2dNVEkxTURBZ2ZTd0tJQ0I3SUdsdWRtOXBZMlU2SUNKSlRsWXRNVEF3TWlJc0lHTmxiblJ6T2lBMU1EQXdJSDBzQ2lBZ2V5QnBiblp2YVdObE9pQWlTVTVXTFRFd01ETWlMQ0JqWlc1MGN6b2dOREl3TUNCOUxBb2dJSHNnYVc1MmIybGpaVG9nSWtsT1ZpMHhNREF6SWl3Z1kyVnVkSE02SURNd01DQjlMQXBkT3dwamIyNXpkQ0J5SUQwZ2NtVmpiMjVqYVd4bEtHbHVkbTlwWTJWekxDQndZWGx0Wlc1MGN5azdDbUZ6YzJWeWRDNWtaV1Z3UlhGMVlXd29jaTV0WVhSamFHVmtMQ0JiSWtsT1ZpMHhNREF4SWwwcE93cGhjM05sY25RdVpHVmxjRVZ4ZFdGc0tISXVkVzV3WVdsa0xDQmJleUJwWkRvZ0lrbE9WaTB4TURBeUlpd2diM2RsWkRvZ016QXdNQ0I5WFNrN0NtRnpjMlZ5ZEM1a1pXVndSWEYxWVd3b2NpNXZkbVZ5Y0dGcFpDd2dXM3NnYVdRNklDSkpUbFl0TVRBd015SXNJR1Y0WTJWemN6b2dNekF3SUgxZEtUc0tZMjl1YzI5c1pTNXNiMmNvSW5KbFkyOXVZMmxzWlRvZ015QmhjM05sY25ScGIyNXpJSEJoYzNObFpDSXBPd29Lb1FRS0IyMWhhVzR1YW5NU2xRUmpiMjV6ZENCN0lISmxZMjl1WTJsc1pTQjlJRDBnY21WeGRXbHlaU2dpTGk5eVpXTnZibU5wYkdVdWFuTWlLVHNLWTI5dWMzUWdhVzUyYjJsalpYTWdQU0JiQ2lBZ2V5QnBaRG9nSWtsT1ZpMHlNREF4SWl3Z1kyVnVkSE02SURrNU1EQXdJSDBzQ2lBZ2V5QnBaRG9nSWtsT1ZpMHlNREF5SWl3Z1kyVnVkSE02SURFMU1EQXdJSDBzQ2lBZ2V5QnBaRG9nSWtsT1ZpMHlNREF6SWl3Z1kyVnVkSE02SURjeU5UQWdmU3dLSUNCN0lHbGtPaUFpU1U1V0xUSXdNRFFpTENCalpXNTBjem9nTXpFd01EQWdmU3dLWFRzS1kyOXVjM1FnY0dGNWJXVnVkSE1nUFNCYkNpQWdleUJwYm5admFXTmxPaUFpU1U1V0xUSXdNREVpTENCalpXNTBjem9nT1Rrd01EQWdmU3dLSUNCN0lHbHVkbTlwWTJVNklDSkpUbFl0TWpBd01pSXNJR05sYm5Sek9pQXhOVEF3TUNCOUxBb2dJSHNnYVc1MmIybGpaVG9nSWtsT1ZpMHlNREEwSWl3Z1kyVnVkSE02SURNeE1EQXdJSDBzQ2lBZ2V5QnBiblp2YVdObE9pQWlTVTVXTFRJd01EUWlMQ0JqWlc1MGN6b2dNVEF3TUNCOUxBcGRPd3BqYjI1emRDQnlJRDBnY21WamIyNWphV3hsS0dsdWRtOXBZMlZ6TENCd1lYbHRaVzUwY3lrN0NtTnZibk52YkdVdWJHOW5LRXBUVDA0dWMzUnlhVzVuYVdaNUtIc2dhVzUyYjJsalpYTTZJR2x1ZG05cFkyVnpMbXhsYm1kMGFDd2djR0Y1YldWdWRITTZJSEJoZVcxbGJuUnpMbXhsYm1kMGFDd2dMaTR1Y2lCOUtTazdDaElXYm05a1pTQnlaV052Ym1OcGJHVXVkR1Z6ZEM1cWN4SU1ibTlrWlNCdFlXbHVMbXB6IiwicmVzcG9uc2UiOiJDZ3RrYjJOclpYSmpiRzkxWkJJQ2RtMFk2U0Vpd2dJSUJCSkFNREJqT1RWaVpUUTBNMlF6TlRnNU5EbGtNVEl6WkRjM05EWTBaVGxqTkRCaU1ETmtZV1prTTJZek1EazBZamN3T1dRNE56RTVZakF3TkdNd1lUZGhOQnBBTjJFek9HTTFNR1psTlRBd1lqVTRNamMzTnpSbVl6WTRNelV5WTJNMk5tRXhOVE5tTkRSbE9EbGxOMkUzWmpaa05qazJOV1kxT0RJellXUTBNRFJrT1NJTFpHOWphMlZ5WTJ4dmRXUXFBblp0TWxsa2IyTnJaWEpqYkc5MVpDMXBiV0ZuWlRwemFHRXlOVFk2TW1NM05USXlNalprTkRjM1lqUmhPRGcyTXpjNFltRmhPVFZpT1dGbU1qVXlZbVUxT1RNd01XSTNNalZtWkdJd1lqZGxNVFV5TURneE16RTFNRFZoT0VEMnRMTFRsalJJNE5heTA1WTBha0JpWWpZMVlUQTVNbUU0T1dWbE9HVTFNalEwTUdKbE5tUTFOekF5T0dWaVkyUmxZakkxWWpVNFpEazVNRE5tTVdaaVltWXhZbVV4T1RrM09USmhOelZqTWxsa2IyTnJaWEpqYkc5MVpDMXBiV0ZuWlRwemFHRXlOVFk2TW1NM05USXlNalprTkRjM1lqUmhPRGcyTXpjNFltRmhPVFZpT1dGbU1qVXlZbVUxT1RNd01XSTNNalZtWkdJd1lqZGxNVFV5TURneE16RTFNRFZoT0ZyckFRbzhDaFp1YjJSbElISmxZMjl1WTJsc1pTNTBaWE4wTG1wekVoOXlaV052Ym1OcGJHVTZJRE1nWVhOelpYSjBhVzl1Y3lCd1lYTnpaV1FLTU9RQ0NxZ0JDZ3h1YjJSbElHMWhhVzR1YW5NU2xBRjdJbWx1ZG05cFkyVnpJam8wTENKd1lYbHRaVzUwY3lJNk5Dd2liV0YwWTJobFpDSTZXeUpKVGxZdE1qQXdNU0lzSWtsT1ZpMHlNREF5SWwwc0luVnVjR0ZwWkNJNlczc2lhV1FpT2lKSlRsWXRNakF3TXlJc0ltOTNaV1FpT2pjeU5UQjlYU3dpYjNabGNuQmhhV1FpT2x0N0ltbGtJam9pU1U1V0xUSXdNRFFpTENKbGVHTmxjM01pT2pFd01EQjlYWDBLTVBrREdBRT0iLCJlbnZlbG9wZSI6eyJwYXlsb2FkVHlwZSI6ImFwcGxpY2F0aW9uL3ZuZC5pbi10b3RvK2pzb24iLCJwYXlsb2FkIjoiZXlKZmRIbHdaU0k2SW1oMGRIQnpPaTh2YVc0dGRHOTBieTVwYnk5VGRHRjBaVzFsYm5RdmRqRWlMQ0p6ZFdKcVpXTjBJanBiZXlKdVlXMWxJam9pY25WdUxYSmxZMjl5WkNJc0ltUnBaMlZ6ZENJNmV5SnphR0V5TlRZaU9pSmlZalkxWVRBNU1tRTRPV1ZsT0dVMU1qUTBNR0psTm1RMU56QXlPR1ZpWTJSbFlqSTFZalU0WkRrNU1ETm1NV1ppWW1ZeFltVXhPVGszT1RKaE56VmpJbjE5WFN3aWNISmxaR2xqWVhSbFZIbHdaU0k2SW1oMGRIQnpPaTh2Y0d4cGJYTnZiR3h0WVhKckxtZHBkR2gxWWk1cGJ5OXdiR2x0YzI5c2JDOXlkVzR0Y21WamIzSmtMM1l4SWl3aWNISmxaR2xqWVhSbElqcDdJblpsY25OcGIyNGlPalFzSW5KbGNYVmxjM1JmYzJoaE1qVTJJam9pTURCak9UVmlaVFEwTTJRek5UZzVORGxrTVRJelpEYzNORFkwWlRsak5EQmlNRE5rWVdaa00yWXpNRGswWWpjd09XUTROekU1WWpBd05HTXdZVGRoTkNJc0luSmxjM1ZzZEY5emFHRXlOVFlpT2lJM1lUTTRZelV3Wm1VMU1EQmlOVGd5TnpjM05HWmpOamd6TlRKall6WTJZVEUxTTJZME5HVTRPV1UzWVRkbU5tUTJPVFkxWmpVNE1qTmhaRFF3TkdRNUlpd2ljSEp2ZG1sa1pYSWlPaUprYjJOclpYSmpiRzkxWkNJc0ltbHpiMnhoZEdsdmJpSTZJblp0SWl3aVpXNTJhWEp2Ym0xbGJuUWlPaUprYjJOclpYSmpiRzkxWkMxcGJXRm5aVHB6YUdFeU5UWTZNbU0zTlRJeU1qWmtORGMzWWpSaE9EZzJNemM0WW1GaE9UVmlPV0ZtTWpVeVltVTFPVE13TVdJM01qVm1aR0l3WWpkbE1UVXlNRGd4TXpFMU1EVmhPQ0lzSW5CdmJHbGplU0k2SWlJc0luTjBZWEowWldSZmRXNXBlRjl0Y3lJNk1UYzVNamM0TmpnMk5EYzFPQ3dpWlc1a1pXUmZkVzVwZUY5dGN5STZNVGM1TWpjNE5qZzJPVEE0T0N3aWMyVnpjMmx2YmlJNklpSXNJbk5sY1hWbGJtTmxJam93TENKd2NtVjJhVzkxYzE5emFHRXlOVFlpT2lJaUxDSnlaV052Y21SZmMyaGhNalUySWpvaVltSTJOV0V3T1RKaE9EbGxaVGhsTlRJME5EQmlaVFprTlRjd01qaGxZbU5rWldJeU5XSTFPR1E1T1RBelpqRm1ZbUptTVdKbE1UazVOemt5WVRjMVl5SjlmUT09Iiwic2lnbmF0dXJlcyI6W3sia2V5aWQiOiI4OGQzMTFmYjk0MmUwZmQ4N2NkYjEyMTRiMzg1ZGI1ZmMzNTRjMTY2ZTg0NzYzZjZkMzc4ODVkYmM5NmRmMzc5Iiwic2lnIjoiMFFHQWtFSlMyWkg3VWVoc25uaFNVNHBrb3liSWJaQlNmdmxkWWNOaG9yOUVPeDduRXVsbDB5OEg0dnFkSHg5MEhITXhITkxXSVhoWnc5eUVFMG85QWc9PSJ9XX0sImxpbmsiOnsicGF5bG9hZFR5cGUiOiJhcHBsaWNhdGlvbi92bmQuaW4tdG90bytqc29uIiwicGF5bG9hZCI6ImV5SmZkSGx3WlNJNkltaDBkSEJ6T2k4dmFXNHRkRzkwYnk1cGJ5OVRkR0YwWlcxbGJuUXZkakVpTENKemRXSnFaV04wSWpwYmV5SnVZVzFsSWpvaVluVnVaR3hsTFd4cGJtVWlMQ0prYVdkbGMzUWlPbnNpYzJoaE1qVTJJam9pT0dJMlkySXpZV1F5WkdKa09HWTNZV1UzTjJRd05Ua3paREZpTkdVNE1UZGxZVEJrWm1NMU1URmpaVFkwT0RWak1EUmxPREZoWmpBeU5EUTBPV1ZrWWlKOWZWMHNJbkJ5WldScFkyRjBaVlI1Y0dVaU9pSm9kSFJ3Y3pvdkwzQnNhVzF6YjJ4c2JXRnlheTVuYVhSb2RXSXVhVzh2Y0d4cGJYTnZiR3d2WW5WdVpHeGxMV3hwYm1zdmRqRWlMQ0p3Y21Wa2FXTmhkR1VpT25zaWFXNWtaWGdpT2pVc0luQnlaWFpwYjNWelgzTm9ZVEkxTmlJNklqZzJaVFl3WW1ZNE5tUTRNVFZtTm1Kak1tSTFaamt4WmpjMk4yRTJZV0UzTUROaE0yVm1ZVFkwTURneU56SXdPRGRqT1RjeU1qZzROekV6WkdGaFlUSWlMQ0psYm5SeWVWOXphR0V5TlRZaU9pSTRZalpqWWpOaFpESmtZbVE0WmpkaFpUYzNaREExT1ROa01XSTBaVGd4TjJWaE1HUm1ZelV4TVdObE5qUTROV013TkdVNE1XRm1NREkwTkRRNVpXUmlJbjE5Iiwic2lnbmF0dXJlcyI6W3sia2V5aWQiOiI4OGQzMTFmYjk0MmUwZmQ4N2NkYjEyMTRiMzg1ZGI1ZmMzNTRjMTY2ZTg0NzYzZjZkMzc4ODVkYmM5NmRmMzc5Iiwic2lnIjoicXk5cGhkTTFoSkI3VjdmSDBSOTYwanNiVTU2VWExYjFyTUVESzJhVTFTQ1ZMU3NRWm9qRGN1SDRYcGpGeUNXVEkvV2VhNVByMk5uOThodWZmZVR0QUE9PSJ9XX19",
                        "contentType": "application/json",
                        "encoding": "base64"
                      }
                    },
                    "name": "entry.json"
                  },
                  {
                    "contents": {
                      "attachment": {
                        "content": "eyJyZXF1ZXN0Ijp7Im1pbmltdW1faXNvbGF0aW9uIjoia2VybmVsIiwicHJvamVjdCI6eyJhcnRpZmFjdHMiOltdLCJmaWxlcyI6W3siY29udGVudCI6Ii8vIHJlY29uY2lsZS5qczogbWF0Y2ggcGF5bWVudHMgdG8gaW52b2ljZXMgYnkgaW52b2ljZSBpZCBhbmQgcmVwb3J0IHdoYXQgaXNcbi8vIHVucGFpZCwgb3ZlcnBhaWQgb3IgbWF0Y2hlZC4gQW1vdW50cyBhcmUgaW50ZWdlciBjZW50cy5cbmZ1bmN0aW9uIHJlY29uY2lsZShpbnZvaWNlcywgcGF5bWVudHMpIHtcbiAgY29uc3QgcGFpZCA9IG5ldyBNYXAoKTtcbiAgZm9yIChjb25zdCBwIG9mIHBheW1lbnRzKSBwYWlkLnNldChwLmludm9pY2UsIChwYWlkLmdldChwLmludm9pY2UpIHx8IDApICsgcC5jZW50cyk7XG4gIGNvbnN0IG1hdGNoZWQgPSBbXSwgdW5wYWlkID0gW10sIG92ZXJwYWlkID0gW107XG4gIGZvciAoY29uc3QgaW52IG9mIGludm9pY2VzKSB7XG4gICAgY29uc3QgZ290ID0gcGFpZC5nZXQoaW52LmlkKSB8fCAwO1xuICAgIGlmIChnb3QgPT09IGludi5jZW50cykgbWF0Y2hlZC5wdXNoKGludi5pZCk7XG4gICAgZWxzZSBpZiAoZ290IFx1MDAzYyBpbnYuY2VudHMpIHVucGFpZC5wdXNoKHsgaWQ6IGludi5pZCwgb3dlZDogaW52LmNlbnRzIC0gZ290IH0pO1xuICAgIGVsc2Ugb3ZlcnBhaWQucHVzaCh7IGlkOiBpbnYuaWQsIGV4Y2VzczogZ290IC0gaW52LmNlbnRzIH0pO1xuICB9XG4gIHJldHVybiB7IG1hdGNoZWQsIHVucGFpZCwgb3ZlcnBhaWQgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0geyByZWNvbmNpbGUgfTtcbiIsInBhdGgiOiJyZWNvbmNpbGUuanMifSx7ImNvbnRlbnQiOiJjb25zdCBhc3NlcnQgPSByZXF1aXJlKFwibm9kZTphc3NlcnQvc3RyaWN0XCIpO1xuY29uc3QgeyByZWNvbmNpbGUgfSA9IHJlcXVpcmUoXCIuL3JlY29uY2lsZS5qc1wiKTtcbmNvbnN0IGludm9pY2VzID0gW1xuICB7IGlkOiBcIklOVi0xMDAxXCIsIGNlbnRzOiAxMjUwMCB9LFxuICB7IGlkOiBcIklOVi0xMDAyXCIsIGNlbnRzOiA4MDAwIH0sXG4gIHsgaWQ6IFwiSU5WLTEwMDNcIiwgY2VudHM6IDQyMDAgfSxcbl07XG5jb25zdCBwYXltZW50cyA9IFtcbiAgeyBpbnZvaWNlOiBcIklOVi0xMDAxXCIsIGNlbnRzOiAxMjUwMCB9LFxuICB7IGludm9pY2U6IFwiSU5WLTEwMDJcIiwgY2VudHM6IDUwMDAgfSxcbiAgeyBpbnZvaWNlOiBcIklOVi0xMDAzXCIsIGNlbnRzOiA0MjAwIH0sXG4gIHsgaW52b2ljZTogXCJJTlYtMTAwM1wiLCBjZW50czogMzAwIH0sXG5dO1xuY29uc3QgciA9IHJlY29uY2lsZShpbnZvaWNlcywgcGF5bWVudHMpO1xuYXNzZXJ0LmRlZXBFcXVhbChyLm1hdGNoZWQsIFtcIklOVi0xMDAxXCJdKTtcbmFzc2VydC5kZWVwRXF1YWwoci51bnBhaWQsIFt7IGlkOiBcIklOVi0xMDAyXCIsIG93ZWQ6IDMwMDAgfV0pO1xuYXNzZXJ0LmRlZXBFcXVhbChyLm92ZXJwYWlkLCBbeyBpZDogXCJJTlYtMTAwM1wiLCBleGNlc3M6IDMwMCB9XSk7XG5jb25zb2xlLmxvZyhcInJlY29uY2lsZTogMyBhc3NlcnRpb25zIHBhc3NlZFwiKTtcbiIsInBhdGgiOiJyZWNvbmNpbGUudGVzdC5qcyJ9LHsiY29udGVudCI6ImNvbnN0IHsgcmVjb25jaWxlIH0gPSByZXF1aXJlKFwiLi9yZWNvbmNpbGUuanNcIik7XG5jb25zdCBpbnZvaWNlcyA9IFtcbiAgeyBpZDogXCJJTlYtMjAwMVwiLCBjZW50czogOTkwMDAgfSxcbiAgeyBpZDogXCJJTlYtMjAwMlwiLCBjZW50czogMTUwMDAgfSxcbiAgeyBpZDogXCJJTlYtMjAwM1wiLCBjZW50czogNzI1MCB9LFxuICB7IGlkOiBcIklOVi0yMDA0XCIsIGNlbnRzOiAzMTAwMCB9LFxuXTtcbmNvbnN0IHBheW1lbnRzID0gW1xuICB7IGludm9pY2U6IFwiSU5WLTIwMDFcIiwgY2VudHM6IDk5MDAwIH0sXG4gIHsgaW52b2ljZTogXCJJTlYtMjAwMlwiLCBjZW50czogMTUwMDAgfSxcbiAgeyBpbnZvaWNlOiBcIklOVi0yMDA0XCIsIGNlbnRzOiAzMTAwMCB9LFxuICB7IGludm9pY2U6IFwiSU5WLTIwMDRcIiwgY2VudHM6IDEwMDAgfSxcbl07XG5jb25zdCByID0gcmVjb25jaWxlKGludm9pY2VzLCBwYXltZW50cyk7XG5jb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGludm9pY2VzOiBpbnZvaWNlcy5sZW5ndGgsIHBheW1lbnRzOiBwYXltZW50cy5sZW5ndGgsIC4uLnIgfSkpO1xuIiwicGF0aCI6Im1haW4uanMifV0sImdyYW50X3Byb2ZpbGUiOiIiLCJzdGVwcyI6WyJub2RlIHJlY29uY2lsZS50ZXN0LmpzIiwibm9kZSBtYWluLmpzIl19LCJwcm90b2NvbCI6NCwic29mdHdhcmVfcnVsZSI6bnVsbCwidGltZW91dF9tcyI6MzAwMDAsInRyYWNlX2lkIjoibWFuaWZlc3QtcG9jLXJ1bi0xIn0sInJlc3BvbnNlIjp7ImR1cmF0aW9uX21zIjoiNDMyOSIsImVudmlyb25tZW50IjoiZG9ja2VyY2xvdWQtaW1hZ2U6c2hhMjU2OjJjNzUyMjI2ZDQ3N2I0YTg4NjM3OGJhYTk1YjlhZjI1MmJlNTkzMDFiNzI1ZmRiMGI3ZTE1MjA4MTMxNTA1YTgiLCJpbnN0YW5jZSI6IiIsImlzb2xhdGlvbiI6InZtIiwicHJvamVjdCI6eyJhZHZpY2UiOltdLCJhcnRpZmFjdHMiOltdLCJhcnRpZmFjdHNfdHJ1bmNhdGVkIjpmYWxzZSwib3V0Y29tZSI6IlBST0pFQ1RfT1VUQ09NRV9DT01QTEVURUQiLCJvdXRjb21lX2RldGFpbCI6IiIsInN0ZXBzIjpbeyJjb21tYW5kIjoibm9kZSByZWNvbmNpbGUudGVzdC5qcyIsImR1cmF0aW9uX21zIjoiMzU2IiwiZXhpdF9jb2RlIjowLCJzdGRlcnIiOiIiLCJzdGRlcnJfdHJ1bmNhdGVkIjpmYWxzZSwic3Rkb3V0IjoiY21WamIyNWphV3hsT2lBeklHRnpjMlZ5ZEdsdmJuTWdjR0Z6YzJWa0NnPT0iLCJzdGRvdXRfdHJ1bmNhdGVkIjpmYWxzZSwidGltZWRfb3V0IjpmYWxzZX0seyJjb21tYW5kIjoibm9kZSBtYWluLmpzIiwiZHVyYXRpb25fbXMiOiI1MDUiLCJleGl0X2NvZGUiOjAsInN0ZGVyciI6IiIsInN0ZGVycl90cnVuY2F0ZWQiOmZhbHNlLCJzdGRvdXQiOiJleUpwYm5admFXTmxjeUk2TkN3aWNHRjViV1Z1ZEhNaU9qUXNJbTFoZEdOb1pXUWlPbHNpU1U1V0xUSXdNREVpTENKSlRsWXRNakF3TWlKZExDSjFibkJoYVdRaU9sdDdJbWxrSWpvaVNVNVdMVEl3TURNaUxDSnZkMlZrSWpvM01qVXdmVjBzSW05MlpYSndZV2xrSWpwYmV5SnBaQ0k2SWtsT1ZpMHlNREEwSWl3aVpYaGpaWE56SWpveE1EQXdmVjE5Q2c9PSIsInN0ZG91dF90cnVuY2F0ZWQiOmZhbHNlLCJ0aW1lZF9vdXQiOmZhbHNlfV19LCJyZWNvcmQiOnsiZW5kZWRfdW5peF9tcyI6IjE3OTI3ODY4NjkwODgiLCJlbnZpcm9ubWVudCI6ImRvY2tlcmNsb3VkLWltYWdlOnNoYTI1NjoyYzc1MjIyNmQ0NzdiNGE4ODYzNzhiYWE5NWI5YWYyNTJiZTU5MzAxYjcyNWZkYjBiN2UxNTIwODEzMTUwNWE4IiwiaW5zdGFuY2UiOiIiLCJpc29sYXRpb24iOiJ2bSIsInBvbGljeSI6IiIsInByZXZpb3VzX3NoYTI1NiI6IiIsInByb3ZpZGVyIjoiZG9ja2VyY2xvdWQiLCJyZWNvcmRfc2hhMjU2IjoiYmI2NWEwOTJhODllZThlNTI0NDBiZTZkNTcwMjhlYmNkZWIyNWI1OGQ5OTAzZjFmYmJmMWJlMTk5NzkyYTc1YyIsInJlcXVlc3Rfc2hhMjU2IjoiMDBjOTViZTQ0M2QzNTg5NDlkMTIzZDc3NDY0ZTljNDBiMDNkYWZkM2YzMDk0YjcwOWQ4NzE5YjAwNGMwYTdhNCIsInJlc3VsdF9zaGEyNTYiOiI3YTM4YzUwZmU1MDBiNTgyNzc3NGZjNjgzNTJjYzY2YTE1M2Y0NGU4OWU3YTdmNmQ2OTY1ZjU4MjNhZDQwNGQ5Iiwic2VxdWVuY2UiOiIwIiwic2Vzc2lvbiI6IiIsInNvZnR3YXJlX2lkZW50aXR5IjoiIiwic29mdHdhcmVfcnVsZV9pZCI6IiIsInN0YXJ0ZWRfdW5peF9tcyI6IjE3OTI3ODY4NjQ3NTgiLCJ1bmFuc3dlcmVkIjoiIiwidmVyc2lvbiI6NH0sInNhbmRib3giOiJkb2NrZXJjbG91ZCIsInNvZnR3YXJlX2lkZW50aXR5IjoiIn19",
                        "contentType": "application/json",
                        "encoding": "base64"
                      }
                    },
                    "name": "exchange.json"
                  }
                ],
                "description": "Public example evidence: DSSE envelope, signed body type application/vnd.in-toto+json, in-toto statement https://in-toto.io/Statement/v1, predicate https://plimsollmark.github.io/plimsoll/run-record/v1, key id 88d311fb942e0fd87cdb1214b385db5fc354c166e84763f6d37885dbc96df379. entry.json is line 5 of the referenced bundle as stored: the exact binary protobuf request and response, the record's envelope and the harness's signed link placing the line. exchange.json is a plain JSON copy checked against those bytes.",
                "propertyName": "plimsoll:run_record"
              }
            ]
          },
          "definitions": {
            "standards": [
              {
                "bom-ref": "std-plimsoll-run-evidence",
                "name": "plimsoll run evidence",
                "requirements": [
                  {
                    "bom-ref": "req-code",
                    "identifier": "R1",
                    "title": "the code that ran is identified by digest"
                  },
                  {
                    "bom-ref": "req-image",
                    "identifier": "R2",
                    "title": "the image is identified by its manifest digest"
                  },
                  {
                    "bom-ref": "req-tier",
                    "identifier": "R3",
                    "title": "the isolation tier the daemon states is signed"
                  }
                ],
                "version": "1"
              }
            ]
          },
          "formulation": [
            {
              "bom-ref": "formula",
              "workflows": [
                {
                  "bom-ref": "run",
                  "inputs": [
                    {
                      "resource": {
                        "ref": "program"
                      }
                    }
                  ],
                  "name": "plimsoll run",
                  "outputs": [
                    {
                      "properties": [
                        {
                          "name": "plimsoll:result_sha256",
                          "value": "7a38c50fe500b5827774fc68352cc66a153f44e89e7a7f6d6965f5823ad404d9"
                        }
                      ],
                      "resource": {
                        "ref": "evidence-run-record"
                      },
                      "type": "other"
                    }
                  ],
                  "properties": [
                    {
                      "name": "plimsoll:provider",
                      "value": "dockercloud"
                    },
                    {
                      "name": "plimsoll:isolation",
                      "value": "vm"
                    },
                    {
                      "name": "plimsoll:minimum_isolation",
                      "value": "kernel"
                    },
                    {
                      "name": "plimsoll:timeout_ms",
                      "value": "30000"
                    },
                    {
                      "name": "plimsoll:grant",
                      "value": "none"
                    },
                    {
                      "name": "plimsoll:outcome",
                      "value": "completed"
                    }
                  ],
                  "runtimeTopology": [
                    {
                      "dependsOn": [
                        "image"
                      ],
                      "ref": "program"
                    }
                  ],
                  "taskDependencies": [
                    {
                      "ref": "step-1"
                    },
                    {
                      "dependsOn": [
                        "step-1"
                      ],
                      "ref": "step-2"
                    }
                  ],
                  "taskTypes": [
                    "other"
                  ],
                  "tasks": [
                    {
                      "bom-ref": "step-1",
                      "name": "node reconcile.test.js",
                      "steps": [
                        {
                          "commands": [
                            {
                              "executed": "node reconcile.test.js",
                              "properties": [
                                {
                                  "name": "plimsoll:exit_code",
                                  "value": "0"
                                },
                                {
                                  "name": "plimsoll:duration_ms",
                                  "value": "356"
                                },
                                {
                                  "name": "plimsoll:timed_out",
                                  "value": "false"
                                },
                                {
                                  "name": "plimsoll:stdout_truncated",
                                  "value": "false"
                                },
                                {
                                  "name": "plimsoll:stderr_truncated",
                                  "value": "false"
                                }
                              ]
                            }
                          ]
                        }
                      ],
                      "taskTypes": [
                        "other"
                      ],
                      "uid": "1"
                    },
                    {
                      "bom-ref": "step-2",
                      "name": "node main.js",
                      "steps": [
                        {
                          "commands": [
                            {
                              "executed": "node main.js",
                              "properties": [
                                {
                                  "name": "plimsoll:exit_code",
                                  "value": "0"
                                },
                                {
                                  "name": "plimsoll:duration_ms",
                                  "value": "505"
                                },
                                {
                                  "name": "plimsoll:timed_out",
                                  "value": "false"
                                },
                                {
                                  "name": "plimsoll:stdout_truncated",
                                  "value": "false"
                                },
                                {
                                  "name": "plimsoll:stderr_truncated",
                                  "value": "false"
                                }
                              ]
                            }
                          ]
                        }
                      ],
                      "taskTypes": [
                        "other"
                      ],
                      "uid": "2"
                    }
                  ],
                  "timeEnd": "2026-10-23T20:21:09.088Z",
                  "timeStart": "2026-10-23T20:21:04.758Z",
                  "uid": "bb65a092a89ee8e52440be6d57028ebcdeb25b58d9903f1fbbf1be199792a75c"
                }
              ]
            }
          ],
          "metadata": {
            "component": {
              "bom-ref": "program",
              "components": [
                {
                  "hashes": [
                    {
                      "alg": "SHA-256",
                      "content": "71ef6972211c39f941bfac9534cefd7b19cff470419f148a7351743d011b7698"
                    }
                  ],
                  "name": "main.js",
                  "properties": [
                    {
                      "name": "plimsoll:bytes",
                      "value": "533"
                    }
                  ],
                  "type": "file"
                },
                {
                  "hashes": [
                    {
                      "alg": "SHA-256",
                      "content": "c2de8205ca1e811fba188b71b051e25644f88b8190351372ab3ed4a842231456"
                    }
                  ],
                  "name": "reconcile.js",
                  "properties": [
                    {
                      "name": "plimsoll:bytes",
                      "value": "685"
                    }
                  ],
                  "type": "file"
                },
                {
                  "hashes": [
                    {
                      "alg": "SHA-256",
                      "content": "ce76efdec6de19969e12f5ca27b273396ca274dfa330df36811f78354c659c97"
                    }
                  ],
                  "name": "reconcile.test.js",
                  "properties": [
                    {
                      "name": "plimsoll:bytes",
                      "value": "663"
                    }
                  ],
                  "type": "file"
                }
              ],
              "description": "An agent-style example program run once through plimsoll; authorship is supplied context, not verified evidence.",
              "externalReferences": [
                {
                  "hashes": [
                    {
                      "alg": "SHA-256",
                      "content": "3f7028e3e5d367770ac721306548d7d741a9eeb284f8bbd4441320f76076e772"
                    }
                  ],
                  "type": "attestation",
                  "url": "https://plimsollmark.github.io/plimsoll/examples/sbom/bundle.jsonl"
                },
                {
                  "type": "documentation",
                  "url": "https://plimsollmark.github.io/plimsoll/examples/sbom/index.html"
                },
                {
                  "type": "vcs",
                  "url": "https://github.com/plimsollmark/plimsoll"
                }
              ],
              "hashes": [
                {
                  "alg": "SHA-256",
                  "content": "6bc21d24ac7a0e21fa02e023551a11d0e3d8ce8310039c4b3c6765609f9c14d8"
                }
              ],
              "name": "reconcile",
              "properties": [
                {
                  "name": "plimsoll:author_kind",
                  "value": "agent"
                },
                {
                  "name": "plimsoll:author_kind_basis",
                  "value": "supplied example context, unverified"
                },
                {
                  "name": "plimsoll:request_sha256",
                  "value": "00c95be443d358949d123d77464e9c40b03dafd3f3094b709d8719b004c0a7a4"
                },
                {
                  "name": "plimsoll:result_sha256",
                  "value": "7a38c50fe500b5827774fc68352cc66a153f44e89e7a7f6d6965f5823ad404d9"
                },
                {
                  "name": "plimsoll:record_sha256",
                  "value": "bb65a092a89ee8e52440be6d57028ebcdeb25b58d9903f1fbbf1be199792a75c"
                },
                {
                  "name": "plimsoll:trace_id",
                  "value": "manifest-poc-run-1"
                }
              ],
              "type": "application",
              "version": "6bc21d24ac7a"
            },
            "lifecycles": [
              {
                "phase": "operations"
              }
            ],
            "timestamp": "2026-10-23T20:21:09.088Z",
            "tools": {
              "components": [
                {
                  "externalReferences": [
                    {
                      "type": "vcs",
                      "url": "https://github.com/plimsollmark/plimsoll"
                    }
                  ],
                  "name": "plimsoll-sbom",
                  "type": "application",
                  "version": "0.2.0"
                }
              ]
            }
          },
          "properties": [
            {
              "name": "plimsoll:bundle_sha256",
              "value": "3f7028e3e5d367770ac721306548d7d741a9eeb284f8bbd4441320f76076e772"
            },
            {
              "name": "plimsoll:bundle_line",
              "value": "5"
            },
            {
              "name": "plimsoll:emitter",
              "value": "examples/sbom"
            }
          ],
          "serialNumber": "urn:uuid:70cb4b1d-d7e7-4dc6-aeac-ef581729698d",
          "specVersion": "1.6",
          "version": 1
        }
        

        The egress attempt, in a VM

        Outcome: completedStated tier: vmFloor asked: kernelNo grant: no networkBundle line 7

        The completed outcome means the runner returned a normal result; a step with a nonzero exit code still failed. The stated tier is the daemon's reported isolation tier, backed by provider configuration and startup checks, never runtime attestation.

        Time (UTC)
        2026-10-23T20:21:09.121Z to 2026-10-23T20:21:17.671Z
        Request digest
        b5386b8a32215a20f843fddccc796543ab45ff0bf7fa63d38ca87855d201a7e1
        Record digest
        3a6acc5608d9bab7245fde43ad17e364f9ca5800799564342f28f0cff46811ef
        Image identity
        dockercloud-image:sha256:2c752226d477b4a886378baa95b9af252be59301b725fdb0b7e15208131505a8
        Bundle
        INTERNAL · bundle.jsonl, line 7 →

        Open Container Initiative (OCI) is the container image format. The manifest digest identifies the selected image for one platform, such as Linux on a standard PC processor (linux/amd64). A display name never supplies that identity.

        INTERNAL · this run's CycloneDX JSON →

        The program's files

        reconcile.js

        SHA-256: c2de8205ca1e811fba188b71b051e25644f88b8190351372ab3ed4a842231456

        // reconcile.js: match payments to invoices by invoice id and report what is
        // unpaid, overpaid or matched. Amounts are integer cents.
        function reconcile(invoices, payments) {
          const paid = new Map();
          for (const p of payments) paid.set(p.invoice, (paid.get(p.invoice) || 0) + p.cents);
          const matched = [], unpaid = [], overpaid = [];
          for (const inv of invoices) {
            const got = paid.get(inv.id) || 0;
            if (got === inv.cents) matched.push(inv.id);
            else if (got < inv.cents) unpaid.push({ id: inv.id, owed: inv.cents - got });
            else overpaid.push({ id: inv.id, excess: got - inv.cents });
          }
          return { matched, unpaid, overpaid };
        }
        module.exports = { reconcile };
        
        reconcile.test.js

        SHA-256: ce76efdec6de19969e12f5ca27b273396ca274dfa330df36811f78354c659c97

        const assert = require("node:assert/strict");
        const { reconcile } = require("./reconcile.js");
        const invoices = [
          { id: "INV-1001", cents: 12500 },
          { id: "INV-1002", cents: 8000 },
          { id: "INV-1003", cents: 4200 },
        ];
        const payments = [
          { invoice: "INV-1001", cents: 12500 },
          { invoice: "INV-1002", cents: 5000 },
          { invoice: "INV-1003", cents: 4200 },
          { invoice: "INV-1003", cents: 300 },
        ];
        const r = reconcile(invoices, payments);
        assert.deepEqual(r.matched, ["INV-1001"]);
        assert.deepEqual(r.unpaid, [{ id: "INV-1002", owed: 3000 }]);
        assert.deepEqual(r.overpaid, [{ id: "INV-1003", excess: 300 }]);
        console.log("reconcile: 3 assertions passed");
        
        main.js

        SHA-256: 71ef6972211c39f941bfac9534cefd7b19cff470419f148a7351743d011b7698

        const { reconcile } = require("./reconcile.js");
        const invoices = [
          { id: "INV-2001", cents: 99000 },
          { id: "INV-2002", cents: 15000 },
          { id: "INV-2003", cents: 7250 },
          { id: "INV-2004", cents: 31000 },
        ];
        const payments = [
          { invoice: "INV-2001", cents: 99000 },
          { invoice: "INV-2002", cents: 15000 },
          { invoice: "INV-2004", cents: 31000 },
          { invoice: "INV-2004", cents: 1000 },
        ];
        const r = reconcile(invoices, payments);
        console.log(JSON.stringify({ invoices: invoices.length, payments: payments.length, ...r }));
        
        egress.js

        SHA-256: 65c92bfa75d038413dca800752ae962e8f6ef058953185d9e2967165b57c448c

        // egress.js: one benign network attempt, so the record shows what the boundary
        // did with it. Outside plimsoll this reaches example.com; inside, with no grant,
        // there is no network, and the exit code says so.
        fetch("https://example.com/", { signal: AbortSignal.timeout(5000) })
          .then((r) => { console.log("egress: reached example.com, status", r.status); process.exit(0); })
          .catch((e) => { console.error("egress: refused:", (e.cause && e.cause.code) || e.name); process.exit(3); });
        

        The commands and recorded results

        Standard output (stdout) is printed output; standard error (stderr) is the separate diagnostic channel. Exit code 0 means the command reported success. A nonzero code means it reported failure.

        node reconcile.test.js

        Exit 0298 millisecondsSandbox timeout: false
        stdout:
        reconcile: 3 assertions passed
        stderr:
        

        node main.js

        Exit 0231 millisecondsSandbox timeout: false
        stdout:
        {"invoices":4,"payments":4,"matched":["INV-2001","INV-2002"],"unpaid":[{"id":"INV-2003","owed":7250}],"overpaid":[{"id":"INV-2004","excess":1000}]}
        stderr:
        

        node egress.js

        Exit 35548 millisecondsSandbox timeout: false
        stdout:
        stderr:
        egress: refused: TimeoutError
        

        Try the receipt here

        The seal is a tamper strip, like the one on a medicine bottle. Check it, then change a copy and watch the seal fail. Your browser uses only the bytes inside this page.

        Checking whether this browser can verify the seal.

          This checks one receipt, its bundle line's seal and its JSON fields. The emitter's Go checker also verifies the whole bundle when it has it and proves that the JSON copy matches the stored protobuf messages. An attached public key proves consistency under that key; it does not tell you who owns it.

          Checks actually run by the emitter

          These receipts come from checking the generated BOM and three separately altered copies. The original source files are unchanged.

          PASS: CycloneDX 1.6 schema (vendored, offline).
          PASS: DSSE envelope signature and run-record digest.
          PASS: the attached bundle line: its link's seal and place, the stored request and result against the signed digests.
          PASS: exchange.json equals the line's protobuf messages and reproduces their digests.
          PASS: file-set digest recomputed from file components and bound to the signed request.
          PASS: every mapped field and claim matches the verified exchange.
          PASS: attached key matches independently trusted key.
          PASS: the attached line is line 7 of the referenced bundle, whole to its checkpoint (8 lines).
          LIMIT: names, page URL and assessor label are unsigned presentation; runtime assertions remain the daemon's statements.
          PASS: altered envelope refused: envelope: attest: no valid signature from this key
          PASS: altered file hash refused: file-set digest differs from program hash
          PASS: altered claim digest refused: BOM differs from the verified exchange: file contents, digests, claims or another mapped field was changed
          
          Every BOM field and where it came from
          FieldSource
          annotations[0].annotator.component.externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          annotations[0].annotator.component.externalReferences[0].urlEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          annotations[0].annotator.component.nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          annotations[0].annotator.component.typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          annotations[0].annotator.component.versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          annotations[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          annotations[0].subjects[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          annotations[0].textEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          annotations[0].timestampSigned record.ended_unix_ms, formatted in UTC with milliseconds.
          bomFormatEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          components[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          components[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          components[0].hashes[0].contentSelected OCI manifest digest from signed record.software_identity; purl also uses the unsigned display name.
          components[0].nameUnsigned -image-name display label.
          components[0].properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          components[0].properties[0].valueSigned record: environment.
          components[0].properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          components[0].properties[1].valueSigned record: software_identity.
          components[0].purlSelected OCI manifest digest from signed record.software_identity; purl also uses the unsigned display name.
          components[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          components[0].versionSelected OCI manifest digest from signed record.software_identity; purl also uses the unsigned display name.
          declarations.affirmation.statementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.assessors[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.assessors[0].organization.nameUnsigned -operator self-assessor label.
          declarations.assessors[0].thirdPartyEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].assessorEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].map[0].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].map[0].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].map[0].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].map[0].conformance.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].map[0].conformance.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].map[0].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].map[1].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].map[1].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].map[1].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].map[1].conformance.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].map[1].conformance.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].map[1].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].map[2].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].map[2].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].map[2].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].map[2].conformance.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].map[2].conformance.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].map[2].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.attestations[0].summaryEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.claims[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.claims[0].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.claims[0].predicateVerified signed record and its stored request; code claim also uses the file-set digest.
          declarations.claims[0].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.claims[0].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.claims[1].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.claims[1].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.claims[1].predicateVerified signed record and its stored request; code claim also uses the file-set digest.
          declarations.claims[1].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.claims[1].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.claims[2].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.claims[2].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.claims[2].predicateVerified signed record and its stored request; code claim also uses the file-set digest.
          declarations.claims[2].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.claims[2].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.evidence[0].author.nameFixed envelope/statement/predicate type names plus key id = SHA-256 of the public key bytes.
          declarations.evidence[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.evidence[0].createdSigned record.ended_unix_ms, formatted in UTC with milliseconds.
          declarations.evidence[0].data[0].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
          declarations.evidence[0].data[0].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.evidence[0].data[0].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.evidence[0].data[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.evidence[0].data[1].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
          declarations.evidence[0].data[1].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.evidence[0].data[1].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.evidence[0].data[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.evidence[0].data[2].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
          declarations.evidence[0].data[2].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.evidence[0].data[2].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.evidence[0].data[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.evidence[0].data[3].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
          declarations.evidence[0].data[3].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.evidence[0].data[3].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.evidence[0].data[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          declarations.evidence[0].descriptionFixed envelope/statement/predicate type names plus key id = SHA-256 of the public key bytes.
          declarations.evidence[0].propertyNameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          definitions.standards[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          definitions.standards[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          definitions.standards[0].requirements[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          definitions.standards[0].requirements[0].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          definitions.standards[0].requirements[0].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          definitions.standards[0].requirements[1].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          definitions.standards[0].requirements[1].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          definitions.standards[0].requirements[1].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          definitions.standards[0].requirements[2].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          definitions.standards[0].requirements[2].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          definitions.standards[0].requirements[2].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          definitions.standards[0].versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].inputs[0].resource.refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].outputs[0].properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].outputs[0].properties[0].valueSigned record: result_sha256.
          formulation[0].workflows[0].outputs[0].resource.refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].outputs[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].properties[0].valueSigned record: provider.
          formulation[0].workflows[0].properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].properties[1].valueSigned record: isolation.
          formulation[0].workflows[0].properties[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].properties[2].valueStored request: minimum_isolation; the bundle link signs the exact stored bytes.
          formulation[0].workflows[0].properties[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].properties[3].valueStored request: timeout_ms; the bundle link signs the exact stored bytes.
          formulation[0].workflows[0].properties[4].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].properties[4].valueStored request.project.grant_profile, or none when it is empty.
          formulation[0].workflows[0].properties[5].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].properties[5].valueStored response.project.outcome.
          formulation[0].workflows[0].runtimeTopology[0].dependsOn[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].runtimeTopology[0].refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].taskDependencies[0].refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].taskDependencies[1].dependsOn[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].taskDependencies[1].refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].taskDependencies[2].dependsOn[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].taskDependencies[2].refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].taskTypes[0]Constant other: no task type was declared; the command supplies the name.
          formulation[0].workflows[0].tasks[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].tasks[0].nameStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[0].steps[0].commands[0].executedStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[0].nameStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[0].valueStored response.project.steps[].exit_code; the bundle link signs the stored bytes.
          formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[1].nameStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[1].valueStored response.project.steps[].duration_ms; the bundle link signs the stored bytes.
          formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[2].nameStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[2].valueStored response.project.steps[].timed_out; the bundle link signs the stored bytes.
          formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[3].nameStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[3].valueStored response.project.steps[].stdout_truncated; the bundle link signs the stored bytes.
          formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[4].nameStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[4].valueStored response.project.steps[].stderr_truncated; the bundle link signs the stored bytes.
          formulation[0].workflows[0].tasks[0].taskTypes[0]Constant other: no task type was declared; the command supplies the name.
          formulation[0].workflows[0].tasks[0].uidSigned record.record_sha256 for the workflow; one-based result-step index for a task.
          formulation[0].workflows[0].tasks[1].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].tasks[1].nameStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[1].steps[0].commands[0].executedStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[0].nameStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[0].valueStored response.project.steps[].exit_code; the bundle link signs the stored bytes.
          formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[1].nameStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[1].valueStored response.project.steps[].duration_ms; the bundle link signs the stored bytes.
          formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[2].nameStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[2].valueStored response.project.steps[].timed_out; the bundle link signs the stored bytes.
          formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[3].nameStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[3].valueStored response.project.steps[].stdout_truncated; the bundle link signs the stored bytes.
          formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[4].nameStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[1].steps[0].commands[0].properties[4].valueStored response.project.steps[].stderr_truncated; the bundle link signs the stored bytes.
          formulation[0].workflows[0].tasks[1].taskTypes[0]Constant other: no task type was declared; the command supplies the name.
          formulation[0].workflows[0].tasks[1].uidSigned record.record_sha256 for the workflow; one-based result-step index for a task.
          formulation[0].workflows[0].tasks[2].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          formulation[0].workflows[0].tasks[2].nameStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[2].steps[0].commands[0].executedStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[0].nameStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[0].valueStored response.project.steps[].exit_code; the bundle link signs the stored bytes.
          formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[1].nameStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[1].valueStored response.project.steps[].duration_ms; the bundle link signs the stored bytes.
          formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[2].nameStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[2].valueStored response.project.steps[].timed_out; the bundle link signs the stored bytes.
          formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[3].nameStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[3].valueStored response.project.steps[].stdout_truncated; the bundle link signs the stored bytes.
          formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[4].nameStored request.project.steps[] equals stored response.project.steps[].command.
          formulation[0].workflows[0].tasks[2].steps[0].commands[0].properties[4].valueStored response.project.steps[].stderr_truncated; the bundle link signs the stored bytes.
          formulation[0].workflows[0].tasks[2].taskTypes[0]Constant other: no task type was declared; the command supplies the name.
          formulation[0].workflows[0].tasks[2].uidSigned record.record_sha256 for the workflow; one-based result-step index for a task.
          formulation[0].workflows[0].timeEndSigned record.ended_unix_ms, formatted in UTC with milliseconds.
          formulation[0].workflows[0].timeStartSigned record.started_unix_ms, formatted in UTC with milliseconds.
          formulation[0].workflows[0].uidSigned record.record_sha256 for the workflow; one-based result-step index for a task.
          metadata.component.bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.components[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.components[0].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
          metadata.component.components[0].nameStored request.project.files[].path, sorted by path.
          metadata.component.components[0].properties[0].nameStored request.project.files[].path, sorted by path.
          metadata.component.components[0].properties[0].valueByte length of request.project.files[].content.
          metadata.component.components[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.components[1].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.components[1].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
          metadata.component.components[1].nameStored request.project.files[].path, sorted by path.
          metadata.component.components[1].properties[0].nameStored request.project.files[].path, sorted by path.
          metadata.component.components[1].properties[0].valueByte length of request.project.files[].content.
          metadata.component.components[1].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.components[2].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.components[2].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
          metadata.component.components[2].nameStored request.project.files[].path, sorted by path.
          metadata.component.components[2].properties[0].nameStored request.project.files[].path, sorted by path.
          metadata.component.components[2].properties[0].valueByte length of request.project.files[].content.
          metadata.component.components[2].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.components[3].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.components[3].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
          metadata.component.components[3].nameStored request.project.files[].path, sorted by path.
          metadata.component.components[3].properties[0].nameStored request.project.files[].path, sorted by path.
          metadata.component.components[3].properties[0].valueByte length of request.project.files[].content.
          metadata.component.components[3].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.descriptionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.externalReferences[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.externalReferences[0].hashes[0].contentSHA-256 of the referenced complete bundle, or qualification file, bytes.
          metadata.component.externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.externalReferences[0].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
          metadata.component.externalReferences[1].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.externalReferences[1].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
          metadata.component.externalReferences[2].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.externalReferences[2].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
          metadata.component.hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.hashes[0].contentFile-set digest recomputed from the stored request's file paths and contents.
          metadata.component.nameUnsigned display label: -name, or the judged file's name for a run with a verdict.
          metadata.component.properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.properties[0].valueUnsigned supplied example context; the run record does not establish authorship.
          metadata.component.properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.properties[1].valueUnsigned supplied example context; the run record does not establish authorship.
          metadata.component.properties[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.properties[2].valueSigned record: request_sha256.
          metadata.component.properties[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.properties[3].valueSigned record: result_sha256.
          metadata.component.properties[4].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.properties[4].valueSigned record: record_sha256.
          metadata.component.properties[5].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.properties[5].valueStored request: trace_id; the bundle link signs the exact stored bytes.
          metadata.component.typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.component.versionFirst 12 hex characters of the file-set digest.
          metadata.lifecycles[0].phaseEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.timestampSigned record.ended_unix_ms, formatted in UTC with milliseconds.
          metadata.tools.components[0].externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.tools.components[0].externalReferences[0].urlEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.tools.components[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.tools.components[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          metadata.tools.components[0].versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          properties[0].valueSHA-256 of the complete bundle file the attached line belongs to.
          properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          properties[1].valueIndex the harness's signed link gives the attached bundle line.
          properties[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          properties[2].valueEmitter mapping constant.
          serialNumberFirst 16 bytes of SHA-256(plimsoll-sbom-serial + newline + record digest), UUID version/variant bits set.
          specVersionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
          Raw CycloneDX JSON
          {
            "annotations": [
              {
                "annotator": {
                  "component": {
                    "externalReferences": [
                      {
                        "type": "vcs",
                        "url": "https://github.com/plimsollmark/plimsoll"
                      }
                    ],
                    "name": "plimsoll-sbom",
                    "type": "application",
                    "version": "0.2.0"
                  }
                },
                "bom-ref": "limits",
                "subjects": [
                  "program"
                ],
                "text": "The attached run record is signed; this BOM is unsigned. Agent authorship is supplied example context, not a record fact, and the execution layer cannot identify the model. Network isolation is provider configuration, not a separately signed runtime measurement; a granted run reaches only the routes its grant lists, and what reached the other side is not in this record. The run's times are the daemon's own unwitnessed clock. An attached key alone establishes consistency, not signer identity; use an independently trusted key. Display names and the assessor label are unsigned presentation. The attached bundle line proves itself; the whole bundle it belongs to is referenced by digest and checked when supplied. This is run evidence, not an inventory of the image's installed packages.",
                "timestamp": "2026-10-23T20:21:17.671Z"
              }
            ],
            "bomFormat": "CycloneDX",
            "components": [
              {
                "bom-ref": "image",
                "hashes": [
                  {
                    "alg": "SHA-256",
                    "content": "2c752226d477b4a886378baa95b9af252be59301b725fdb0b7e15208131505a8"
                  }
                ],
                "name": "sandbox",
                "properties": [
                  {
                    "name": "plimsoll:environment",
                    "value": "dockercloud-image:sha256:2c752226d477b4a886378baa95b9af252be59301b725fdb0b7e15208131505a8"
                  },
                  {
                    "name": "plimsoll:software_identity",
                    "value": ""
                  }
                ],
                "purl": "pkg:oci/sandbox@sha256:2c752226d477b4a886378baa95b9af252be59301b725fdb0b7e15208131505a8",
                "type": "container",
                "version": "sha256:2c752226d477b4a886378baa95b9af252be59301b725fdb0b7e15208131505a8"
              }
            ],
            "declarations": {
              "affirmation": {
                "statement": "The attached run record was stated by plimsolld, checked and signed by plimsoll-attest, and restated here; plimsoll-attest verify and this program's -check recompute it. This affirmation and BOM are unsigned."
              },
              "assessors": [
                {
                  "bom-ref": "assessor",
                  "organization": {
                    "name": "plimsoll examples (self-assessed)"
                  },
                  "thirdParty": false
                }
              ],
              "attestations": [
                {
                  "assessor": "assessor",
                  "map": [
                    {
                      "claims": [
                        "claim-code"
                      ],
                      "confidence": {
                        "rationale": "a signature check and a digest recomputation, not a judgement or a probability that the runtime assertion is true",
                        "score": 1
                      },
                      "conformance": {
                        "rationale": "The claim matches the signed exchange under a deterministic comparison; this is self-assessed consistency, not independent runtime assurance.",
                        "score": 1
                      },
                      "requirement": "req-code"
                    },
                    {
                      "claims": [
                        "claim-image"
                      ],
                      "confidence": {
                        "rationale": "a signature check and a digest recomputation, not a judgement or a probability that the runtime assertion is true",
                        "score": 1
                      },
                      "conformance": {
                        "rationale": "The claim matches the signed exchange under a deterministic comparison; this is self-assessed consistency, not independent runtime assurance.",
                        "score": 1
                      },
                      "requirement": "req-image"
                    },
                    {
                      "claims": [
                        "claim-tier"
                      ],
                      "confidence": {
                        "rationale": "a signature check and a digest recomputation, not a judgement or a probability that the runtime assertion is true",
                        "score": 1
                      },
                      "conformance": {
                        "rationale": "The claim matches the signed exchange under a deterministic comparison; this is self-assessed consistency, not independent runtime assurance.",
                        "score": 1
                      },
                      "requirement": "req-tier"
                    }
                  ],
                  "summary": "A self-assessed restatement of a signed run record with reproducible consistency checks."
                }
              ],
              "claims": [
                {
                  "bom-ref": "claim-code",
                  "evidence": [
                    "evidence-run-record"
                  ],
                  "predicate": "The program's 4 files, file-set digest d0f73fac975a601a647e768eaba084b72ff80a6b7dca4c3f1b62eec16b244c43, are the files in the stored request whose signed digest b5386b8a32215a20f843fddccc796543ab45ff0bf7fa63d38ca87855d201a7e1 covers them with the isolation floor and timeout.",
                  "reasoning": "Each claim restates the run record the daemon stated and the attest harness checked against the stored request and result and signed. The attached bundle line permits those checks to be repeated. This emitter did not observe execution. The tier is configuration and provider evidence plus startup smoke tests, never runtime attestation.",
                  "target": "program"
                },
                {
                  "bom-ref": "claim-image",
                  "evidence": [
                    "evidence-run-record"
                  ],
                  "predicate": "The daemon states that the run executed in a Docker Cloud microVM booted from the image whose linux/amd64 manifest digest is sha256:2c752226d477b4a886378baa95b9af252be59301b725fdb0b7e15208131505a8 (environment dockercloud-image:sha256:2c752226d477b4a886378baa95b9af252be59301b725fdb0b7e15208131505a8), the provider's pin, which it compares with the digest the cloud reports each sandbox booted and refuses to run on a difference.",
                  "reasoning": "Each claim restates the run record the daemon stated and the attest harness checked against the stored request and result and signed. The attached bundle line permits those checks to be repeated. This emitter did not observe execution. The tier is configuration and provider evidence plus startup smoke tests, never runtime attestation.",
                  "target": "program"
                },
                {
                  "bom-ref": "claim-tier",
                  "evidence": [
                    "evidence-run-record"
                  ],
                  "predicate": "The daemon states provider dockercloud and isolation tier vm, at or above requested floor kernel, from 2026-10-23T20:21:09.121Z to 2026-10-23T20:21:17.671Z UTC; the stored request names no host-API grant and the result digest is 960733790831a2bc56def99ba8f069c2921817a8aae9303c62a4f2c87ccc977d. The provider's no-grant configuration supplies network isolation; this record is not a network measurement.",
                  "reasoning": "Each claim restates the run record the daemon stated and the attest harness checked against the stored request and result and signed. The attached bundle line permits those checks to be repeated. This emitter did not observe execution. The tier is configuration and provider evidence plus startup smoke tests, never runtime attestation.",
                  "target": "program"
                }
              ],
              "evidence": [
                {
                  "author": {
                    "name": "plimsoll-attest key 88d311fb942e0fd87cdb1214b385db5fc354c166e84763f6d37885dbc96df379"
                  },
                  "bom-ref": "evidence-run-record",
                  "created": "2026-10-23T20:21:17.671Z",
                  "data": [
                    {
                      "contents": {
                        "attachment": {
                          "content": "eyJwYXlsb2FkVHlwZSI6ImFwcGxpY2F0aW9uL3ZuZC5pbi10b3RvK2pzb24iLCJwYXlsb2FkIjoiZXlKZmRIbHdaU0k2SW1oMGRIQnpPaTh2YVc0dGRHOTBieTVwYnk5VGRHRjBaVzFsYm5RdmRqRWlMQ0p6ZFdKcVpXTjBJanBiZXlKdVlXMWxJam9pY25WdUxYSmxZMjl5WkNJc0ltUnBaMlZ6ZENJNmV5SnphR0V5TlRZaU9pSXpZVFpoWTJNMU5qQTRaRGxpWVdJM01qUTFabVJsTkROaFpERTNaVE0yTkdZNVkyRTFPREF3TnprNU5UWTBNelF5WmpJNFpqQmpabVkwTmpneE1XVm1JbjE5WFN3aWNISmxaR2xqWVhSbFZIbHdaU0k2SW1oMGRIQnpPaTh2Y0d4cGJYTnZiR3h0WVhKckxtZHBkR2gxWWk1cGJ5OXdiR2x0YzI5c2JDOXlkVzR0Y21WamIzSmtMM1l4SWl3aWNISmxaR2xqWVhSbElqcDdJblpsY25OcGIyNGlPalFzSW5KbGNYVmxjM1JmYzJoaE1qVTJJam9pWWpVek9EWmlPR0V6TWpJeE5XRXlNR1k0TkRObVpHUmpZMk0zT1RZMU5ETmhZalExWm1Zd1ltWTNabUUyTTJRek9HTmhPRGM0TlRWa01qQXhZVGRsTVNJc0luSmxjM1ZzZEY5emFHRXlOVFlpT2lJNU5qQTNNek0zT1RBNE16RmhNbUpqTlRaa1pXWTVPV0poT0dZd05qbGpNamt5TVRneE4yRTRZV0ZsT1RNd00yTTJNbUUwWmpKak9EZGpZMk01Tnpka0lpd2ljSEp2ZG1sa1pYSWlPaUprYjJOclpYSmpiRzkxWkNJc0ltbHpiMnhoZEdsdmJpSTZJblp0SWl3aVpXNTJhWEp2Ym0xbGJuUWlPaUprYjJOclpYSmpiRzkxWkMxcGJXRm5aVHB6YUdFeU5UWTZNbU0zTlRJeU1qWmtORGMzWWpSaE9EZzJNemM0WW1GaE9UVmlPV0ZtTWpVeVltVTFPVE13TVdJM01qVm1aR0l3WWpkbE1UVXlNRGd4TXpFMU1EVmhPQ0lzSW5CdmJHbGplU0k2SWlJc0luTjBZWEowWldSZmRXNXBlRjl0Y3lJNk1UYzVNamM0TmpnMk9URXlNU3dpWlc1a1pXUmZkVzVwZUY5dGN5STZNVGM1TWpjNE5qZzNOelkzTVN3aWMyVnpjMmx2YmlJNklpSXNJbk5sY1hWbGJtTmxJam93TENKd2NtVjJhVzkxYzE5emFHRXlOVFlpT2lJaUxDSnlaV052Y21SZmMyaGhNalUySWpvaU0yRTJZV05qTlRZd09HUTVZbUZpTnpJME5XWmtaVFF6WVdReE4yVXpOalJtT1dOaE5UZ3dNRGM1T1RVMk5ETTBNbVl5T0dZd1kyWm1ORFk0TVRGbFppSjlmUT09Iiwic2lnbmF0dXJlcyI6W3sia2V5aWQiOiI4OGQzMTFmYjk0MmUwZmQ4N2NkYjEyMTRiMzg1ZGI1ZmMzNTRjMTY2ZTg0NzYzZjZkMzc4ODVkYmM5NmRmMzc5Iiwic2lnIjoiOUF6eTBiNDZqam5zSCt1WCtUTEdkZEtSZGgzc1Fib3Y3N1JDWUpvRVh3OGxnKy83ZjVqV1FIb1huZGF2N1p1bEpVVnRSSlVFUGZmNjd3R0dEUW9QQVE9PSJ9XX0=",
                          "contentType": "application/json",
                          "encoding": "base64"
                        }
                      },
                      "name": "envelope.json"
                    },
                    {
                      "contents": {
                        "attachment": {
                          "content": "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUNvd0JRWURLMlZ3QXlFQWJxQ3hCRE1RT0FZOTREekRWeDl2OG01aE12N1JnTVdRV1NzclR4UnFLcFU9Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo=",
                          "contentType": "application/x-pem-file",
                          "encoding": "base64"
                        }
                      },
                      "name": "harness.pub"
                    },
                    {
                      "contents": {
                        "attachment": {
                          "content": "eyJyZXF1ZXN0IjoiQ0FRU0JtdGxjbTVsYkJvU2JXRnVhV1psYzNRdGNHOWpMWEoxYmkweUlMRHFBVnJJRXdxK0JRb01jbVZqYjI1amFXeGxMbXB6RXEwRkx5OGdjbVZqYjI1amFXeGxMbXB6T2lCdFlYUmphQ0J3WVhsdFpXNTBjeUIwYnlCcGJuWnZhV05sY3lCaWVTQnBiblp2YVdObElHbGtJR0Z1WkNCeVpYQnZjblFnZDJoaGRDQnBjd292THlCMWJuQmhhV1FzSUc5MlpYSndZV2xrSUc5eUlHMWhkR05vWldRdUlFRnRiM1Z1ZEhNZ1lYSmxJR2x1ZEdWblpYSWdZMlZ1ZEhNdUNtWjFibU4wYVc5dUlISmxZMjl1WTJsc1pTaHBiblp2YVdObGN5d2djR0Y1YldWdWRITXBJSHNLSUNCamIyNXpkQ0J3WVdsa0lEMGdibVYzSUUxaGNDZ3BPd29nSUdadmNpQW9ZMjl1YzNRZ2NDQnZaaUJ3WVhsdFpXNTBjeWtnY0dGcFpDNXpaWFFvY0M1cGJuWnZhV05sTENBb2NHRnBaQzVuWlhRb2NDNXBiblp2YVdObEtTQjhmQ0F3S1NBcklIQXVZMlZ1ZEhNcE93b2dJR052Ym5OMElHMWhkR05vWldRZ1BTQmJYU3dnZFc1d1lXbGtJRDBnVzEwc0lHOTJaWEp3WVdsa0lEMGdXMTA3Q2lBZ1ptOXlJQ2hqYjI1emRDQnBibllnYjJZZ2FXNTJiMmxqWlhNcElIc0tJQ0FnSUdOdmJuTjBJR2R2ZENBOUlIQmhhV1F1WjJWMEtHbHVkaTVwWkNrZ2ZId2dNRHNLSUNBZ0lHbG1JQ2huYjNRZ1BUMDlJR2x1ZGk1alpXNTBjeWtnYldGMFkyaGxaQzV3ZFhOb0tHbHVkaTVwWkNrN0NpQWdJQ0JsYkhObElHbG1JQ2huYjNRZ1BDQnBibll1WTJWdWRITXBJSFZ1Y0dGcFpDNXdkWE5vS0hzZ2FXUTZJR2x1ZGk1cFpDd2diM2RsWkRvZ2FXNTJMbU5sYm5SeklDMGdaMjkwSUgwcE93b2dJQ0FnWld4elpTQnZkbVZ5Y0dGcFpDNXdkWE5vS0hzZ2FXUTZJR2x1ZGk1cFpDd2daWGhqWlhOek9pQm5iM1FnTFNCcGJuWXVZMlZ1ZEhNZ2ZTazdDaUFnZlFvZ0lISmxkSFZ5YmlCN0lHMWhkR05vWldRc0lIVnVjR0ZwWkN3Z2IzWmxjbkJoYVdRZ2ZUc0tmUXB0YjJSMWJHVXVaWGh3YjNKMGN5QTlJSHNnY21WamIyNWphV3hsSUgwN0NncXRCUW9SY21WamIyNWphV3hsTG5SbGMzUXVhbk1TbHdWamIyNXpkQ0JoYzNObGNuUWdQU0J5WlhGMWFYSmxLQ0p1YjJSbE9tRnpjMlZ5ZEM5emRISnBZM1FpS1RzS1kyOXVjM1FnZXlCeVpXTnZibU5wYkdVZ2ZTQTlJSEpsY1hWcGNtVW9JaTR2Y21WamIyNWphV3hsTG1weklpazdDbU52Ym5OMElHbHVkbTlwWTJWeklEMGdXd29nSUhzZ2FXUTZJQ0pKVGxZdE1UQXdNU0lzSUdObGJuUnpPaUF4TWpVd01DQjlMQW9nSUhzZ2FXUTZJQ0pKVGxZdE1UQXdNaUlzSUdObGJuUnpPaUE0TURBd0lIMHNDaUFnZXlCcFpEb2dJa2xPVmkweE1EQXpJaXdnWTJWdWRITTZJRFF5TURBZ2ZTd0tYVHNLWTI5dWMzUWdjR0Y1YldWdWRITWdQU0JiQ2lBZ2V5QnBiblp2YVdObE9pQWlTVTVXTFRFd01ERWlMQ0JqWlc1MGN6b2dNVEkxTURBZ2ZTd0tJQ0I3SUdsdWRtOXBZMlU2SUNKSlRsWXRNVEF3TWlJc0lHTmxiblJ6T2lBMU1EQXdJSDBzQ2lBZ2V5QnBiblp2YVdObE9pQWlTVTVXTFRFd01ETWlMQ0JqWlc1MGN6b2dOREl3TUNCOUxBb2dJSHNnYVc1MmIybGpaVG9nSWtsT1ZpMHhNREF6SWl3Z1kyVnVkSE02SURNd01DQjlMQXBkT3dwamIyNXpkQ0J5SUQwZ2NtVmpiMjVqYVd4bEtHbHVkbTlwWTJWekxDQndZWGx0Wlc1MGN5azdDbUZ6YzJWeWRDNWtaV1Z3UlhGMVlXd29jaTV0WVhSamFHVmtMQ0JiSWtsT1ZpMHhNREF4SWwwcE93cGhjM05sY25RdVpHVmxjRVZ4ZFdGc0tISXVkVzV3WVdsa0xDQmJleUJwWkRvZ0lrbE9WaTB4TURBeUlpd2diM2RsWkRvZ016QXdNQ0I5WFNrN0NtRnpjMlZ5ZEM1a1pXVndSWEYxWVd3b2NpNXZkbVZ5Y0dGcFpDd2dXM3NnYVdRNklDSkpUbFl0TVRBd015SXNJR1Y0WTJWemN6b2dNekF3SUgxZEtUc0tZMjl1YzI5c1pTNXNiMmNvSW5KbFkyOXVZMmxzWlRvZ015QmhjM05sY25ScGIyNXpJSEJoYzNObFpDSXBPd29Lb1FRS0IyMWhhVzR1YW5NU2xRUmpiMjV6ZENCN0lISmxZMjl1WTJsc1pTQjlJRDBnY21WeGRXbHlaU2dpTGk5eVpXTnZibU5wYkdVdWFuTWlLVHNLWTI5dWMzUWdhVzUyYjJsalpYTWdQU0JiQ2lBZ2V5QnBaRG9nSWtsT1ZpMHlNREF4SWl3Z1kyVnVkSE02SURrNU1EQXdJSDBzQ2lBZ2V5QnBaRG9nSWtsT1ZpMHlNREF5SWl3Z1kyVnVkSE02SURFMU1EQXdJSDBzQ2lBZ2V5QnBaRG9nSWtsT1ZpMHlNREF6SWl3Z1kyVnVkSE02SURjeU5UQWdmU3dLSUNCN0lHbGtPaUFpU1U1V0xUSXdNRFFpTENCalpXNTBjem9nTXpFd01EQWdmU3dLWFRzS1kyOXVjM1FnY0dGNWJXVnVkSE1nUFNCYkNpQWdleUJwYm5admFXTmxPaUFpU1U1V0xUSXdNREVpTENCalpXNTBjem9nT1Rrd01EQWdmU3dLSUNCN0lHbHVkbTlwWTJVNklDSkpUbFl0TWpBd01pSXNJR05sYm5Sek9pQXhOVEF3TUNCOUxBb2dJSHNnYVc1MmIybGpaVG9nSWtsT1ZpMHlNREEwSWl3Z1kyVnVkSE02SURNeE1EQXdJSDBzQ2lBZ2V5QnBiblp2YVdObE9pQWlTVTVXTFRJd01EUWlMQ0JqWlc1MGN6b2dNVEF3TUNCOUxBcGRPd3BqYjI1emRDQnlJRDBnY21WamIyNWphV3hsS0dsdWRtOXBZMlZ6TENCd1lYbHRaVzUwY3lrN0NtTnZibk52YkdVdWJHOW5LRXBUVDA0dWMzUnlhVzVuYVdaNUtIc2dhVzUyYjJsalpYTTZJR2x1ZG05cFkyVnpMbXhsYm1kMGFDd2djR0Y1YldWdWRITTZJSEJoZVcxbGJuUnpMbXhsYm1kMGFDd2dMaTR1Y2lCOUtTazdDZ3I2QXdvSlpXZHlaWE56TG1wekV1d0RMeThnWldkeVpYTnpMbXB6T2lCdmJtVWdZbVZ1YVdkdUlHNWxkSGR2Y21zZ1lYUjBaVzF3ZEN3Z2MyOGdkR2hsSUhKbFkyOXlaQ0J6YUc5M2N5QjNhR0YwSUhSb1pTQmliM1Z1WkdGeWVRb3ZMeUJrYVdRZ2QybDBhQ0JwZEM0Z1QzVjBjMmxrWlNCd2JHbHRjMjlzYkNCMGFHbHpJSEpsWVdOb1pYTWdaWGhoYlhCc1pTNWpiMjA3SUdsdWMybGtaU3dnZDJsMGFDQnVieUJuY21GdWRDd0tMeThnZEdobGNtVWdhWE1nYm04Z2JtVjBkMjl5YXl3Z1lXNWtJSFJvWlNCbGVHbDBJR052WkdVZ2MyRjVjeUJ6Ynk0S1ptVjBZMmdvSW1oMGRIQnpPaTh2WlhoaGJYQnNaUzVqYjIwdklpd2dleUJ6YVdkdVlXdzZJRUZpYjNKMFUybG5ibUZzTG5ScGJXVnZkWFFvTlRBd01Da2dmU2tLSUNBdWRHaGxiaWdvY2lrZ1BUNGdleUJqYjI1emIyeGxMbXh2WnlnaVpXZHlaWE56T2lCeVpXRmphR1ZrSUdWNFlXMXdiR1V1WTI5dExDQnpkR0YwZFhNaUxDQnlMbk4wWVhSMWN5azdJSEJ5YjJObGMzTXVaWGhwZENnd0tUc2dmU2tLSUNBdVkyRjBZMmdvS0dVcElEMCtJSHNnWTI5dWMyOXNaUzVsY25KdmNpZ2laV2R5WlhOek9pQnlaV1oxYzJWa09pSXNJQ2hsTG1OaGRYTmxJQ1ltSUdVdVkyRjFjMlV1WTI5a1pTa2dmSHdnWlM1dVlXMWxLVHNnY0hKdlkyVnpjeTVsZUdsMEtETXBPeUI5S1RzS0VoWnViMlJsSUhKbFkyOXVZMmxzWlM1MFpYTjBMbXB6RWd4dWIyUmxJRzFoYVc0dWFuTVNEbTV2WkdVZ1pXZHlaWE56TG1weiIsInJlc3BvbnNlIjoiQ2d0a2IyTnJaWEpqYkc5MVpCSUNkbTBZNWtJaXdnSUlCQkpBWWpVek9EWmlPR0V6TWpJeE5XRXlNR1k0TkRObVpHUmpZMk0zT1RZMU5ETmhZalExWm1Zd1ltWTNabUUyTTJRek9HTmhPRGM0TlRWa01qQXhZVGRsTVJwQU9UWXdOek16Tnprd09ETXhZVEppWXpVMlpHVm1PVGxpWVRobU1EWTVZekk1TWpFNE1UZGhPR0ZoWlRrek1ETmpOakpoTkdZeVl6ZzNZMk5qT1RjM1pDSUxaRzlqYTJWeVkyeHZkV1FxQW5adE1sbGtiMk5yWlhKamJHOTFaQzFwYldGblpUcHphR0V5TlRZNk1tTTNOVEl5TWpaa05EYzNZalJoT0RnMk16YzRZbUZoT1RWaU9XRm1NalV5WW1VMU9UTXdNV0kzTWpWbVpHSXdZamRsTVRVeU1EZ3hNekUxTURWaE9FQ0IxN0xUbGpSSTU1bXowNVkwYWtBellUWmhZMk0xTmpBNFpEbGlZV0kzTWpRMVptUmxORE5oWkRFM1pUTTJOR1k1WTJFMU9EQXdOems1TlRZME16UXlaakk0WmpCalptWTBOamd4TVdWbU1sbGtiMk5yWlhKamJHOTFaQzFwYldGblpUcHphR0V5TlRZNk1tTTNOVEl5TWpaa05EYzNZalJoT0RnMk16YzRZbUZoT1RWaU9XRm1NalV5WW1VMU9UTXdNV0kzTWpWbVpHSXdZamRsTVRVeU1EZ3hNekUxTURWaE9GcWlBZ284Q2hadWIyUmxJSEpsWTI5dVkybHNaUzUwWlhOMExtcHpFaDl5WldOdmJtTnBiR1U2SURNZ1lYTnpaWEowYVc5dWN5QndZWE56WldRS01Lb0NDcWdCQ2d4dWIyUmxJRzFoYVc0dWFuTVNsQUY3SW1sdWRtOXBZMlZ6SWpvMExDSndZWGx0Wlc1MGN5STZOQ3dpYldGMFkyaGxaQ0k2V3lKSlRsWXRNakF3TVNJc0lrbE9WaTB5TURBeUlsMHNJblZ1Y0dGcFpDSTZXM3NpYVdRaU9pSkpUbFl0TWpBd015SXNJbTkzWldRaU9qY3lOVEI5WFN3aWIzWmxjbkJoYVdRaU9sdDdJbWxrSWpvaVNVNVdMVEl3TURRaUxDSmxlR05sYzNNaU9qRXdNREI5WFgwS01PY0JDalVLRG01dlpHVWdaV2R5WlhOekxtcHpHaDVsWjNKbGMzTTZJSEpsWm5WelpXUTZJRlJwYldWdmRYUkZjbkp2Y2dvZ0F6Q3NLeGdCIiwiZW52ZWxvcGUiOnsicGF5bG9hZFR5cGUiOiJhcHBsaWNhdGlvbi92bmQuaW4tdG90bytqc29uIiwicGF5bG9hZCI6ImV5SmZkSGx3WlNJNkltaDBkSEJ6T2k4dmFXNHRkRzkwYnk1cGJ5OVRkR0YwWlcxbGJuUXZkakVpTENKemRXSnFaV04wSWpwYmV5SnVZVzFsSWpvaWNuVnVMWEpsWTI5eVpDSXNJbVJwWjJWemRDSTZleUp6YUdFeU5UWWlPaUl6WVRaaFkyTTFOakE0WkRsaVlXSTNNalExWm1SbE5ETmhaREUzWlRNMk5HWTVZMkUxT0RBd056azVOVFkwTXpReVpqSTRaakJqWm1ZME5qZ3hNV1ZtSW4xOVhTd2ljSEpsWkdsallYUmxWSGx3WlNJNkltaDBkSEJ6T2k4dmNHeHBiWE52Ykd4dFlYSnJMbWRwZEdoMVlpNXBieTl3YkdsdGMyOXNiQzl5ZFc0dGNtVmpiM0prTDNZeElpd2ljSEpsWkdsallYUmxJanA3SW5abGNuTnBiMjRpT2pRc0luSmxjWFZsYzNSZmMyaGhNalUySWpvaVlqVXpPRFppT0dFek1qSXhOV0V5TUdZNE5ETm1aR1JqWTJNM09UWTFORE5oWWpRMVptWXdZbVkzWm1FMk0yUXpPR05oT0RjNE5UVmtNakF4WVRkbE1TSXNJbkpsYzNWc2RGOXphR0V5TlRZaU9pSTVOakEzTXpNM09UQTRNekZoTW1Kak5UWmtaV1k1T1dKaE9HWXdOamxqTWpreU1UZ3hOMkU0WVdGbE9UTXdNMk0yTW1FMFpqSmpPRGRqWTJNNU56ZGtJaXdpY0hKdmRtbGtaWElpT2lKa2IyTnJaWEpqYkc5MVpDSXNJbWx6YjJ4aGRHbHZiaUk2SW5adElpd2laVzUyYVhKdmJtMWxiblFpT2lKa2IyTnJaWEpqYkc5MVpDMXBiV0ZuWlRwemFHRXlOVFk2TW1NM05USXlNalprTkRjM1lqUmhPRGcyTXpjNFltRmhPVFZpT1dGbU1qVXlZbVUxT1RNd01XSTNNalZtWkdJd1lqZGxNVFV5TURneE16RTFNRFZoT0NJc0luQnZiR2xqZVNJNklpSXNJbk4wWVhKMFpXUmZkVzVwZUY5dGN5STZNVGM1TWpjNE5qZzJPVEV5TVN3aVpXNWtaV1JmZFc1cGVGOXRjeUk2TVRjNU1qYzROamczTnpZM01Td2ljMlZ6YzJsdmJpSTZJaUlzSW5ObGNYVmxibU5sSWpvd0xDSndjbVYyYVc5MWMxOXphR0V5TlRZaU9pSWlMQ0p5WldOdmNtUmZjMmhoTWpVMklqb2lNMkUyWVdOak5UWXdPR1E1WW1GaU56STBOV1prWlRRellXUXhOMlV6TmpSbU9XTmhOVGd3TURjNU9UVTJORE0wTW1ZeU9HWXdZMlptTkRZNE1URmxaaUo5ZlE9PSIsInNpZ25hdHVyZXMiOlt7ImtleWlkIjoiODhkMzExZmI5NDJlMGZkODdjZGIxMjE0YjM4NWRiNWZjMzU0YzE2NmU4NDc2M2Y2ZDM3ODg1ZGJjOTZkZjM3OSIsInNpZyI6IjlBenkwYjQ2ampuc0grdVgrVExHZGRLUmRoM3NRYm92NzdSQ1lKb0VYdzhsZysvN2Y1aldRSG9YbmRhdjdadWxKVVZ0UkpVRVBmZjY3d0dHRFFvUEFRPT0ifV19LCJsaW5rIjp7InBheWxvYWRUeXBlIjoiYXBwbGljYXRpb24vdm5kLmluLXRvdG8ranNvbiIsInBheWxvYWQiOiJleUpmZEhsd1pTSTZJbWgwZEhCek9pOHZhVzR0ZEc5MGJ5NXBieTlUZEdGMFpXMWxiblF2ZGpFaUxDSnpkV0pxWldOMElqcGJleUp1WVcxbElqb2lZblZ1Wkd4bExXeHBibVVpTENKa2FXZGxjM1FpT25zaWMyaGhNalUySWpvaU16WTJORFF6TURJNU56WTRNakExTnpWa04ySTBOVGM1TTJFeE9HWTRNREF6WWpjd00yUTJZV0V6TWpkaE9URTFObU14WWpnM1kyUmlZVEU1TnpnMllTSjlmVjBzSW5CeVpXUnBZMkYwWlZSNWNHVWlPaUpvZEhSd2N6b3ZMM0JzYVcxemIyeHNiV0Z5YXk1bmFYUm9kV0l1YVc4dmNHeHBiWE52Ykd3dlluVnVaR3hsTFd4cGJtc3ZkakVpTENKd2NtVmthV05oZEdVaU9uc2lhVzVrWlhnaU9qY3NJbkJ5WlhacGIzVnpYM05vWVRJMU5pSTZJalV5WTJZNE5qVm1PVE14WXprNFpUQmhaR0ZpTmpsaFpqUTFaakZrWlRZeVlqSTJORFJsWm1aaVltUmxOalJqTUdReVpUQXhOalk0Tm1Wa04yUmpNVFFpTENKbGJuUnllVjl6YUdFeU5UWWlPaUl6TmpZME5ETXdNamszTmpneU1EVTNOV1EzWWpRMU56a3pZVEU0Wmpnd01ETmlOekF6WkRaaFlUTXlOMkU1TVRVMll6RmlPRGRqWkdKaE1UazNPRFpoSW4xOSIsInNpZ25hdHVyZXMiOlt7ImtleWlkIjoiODhkMzExZmI5NDJlMGZkODdjZGIxMjE0YjM4NWRiNWZjMzU0YzE2NmU4NDc2M2Y2ZDM3ODg1ZGJjOTZkZjM3OSIsInNpZyI6IlFLa0pyaVZCekVaaVhwbHdxSGxJZnF4aXRCVzhueGFzV2RGM2JNdys1YURBTmNvenRjV29NNDk4UmNtd21rSWE5WGg3SVV6eklYMUJ6ZXNvYlVTM0R3PT0ifV19fQ==",
                          "contentType": "application/json",
                          "encoding": "base64"
                        }
                      },
                      "name": "entry.json"
                    },
                    {
                      "contents": {
                        "attachment": {
                          "content": "eyJyZXF1ZXN0Ijp7Im1pbmltdW1faXNvbGF0aW9uIjoia2VybmVsIiwicHJvamVjdCI6eyJhcnRpZmFjdHMiOltdLCJmaWxlcyI6W3siY29udGVudCI6Ii8vIHJlY29uY2lsZS5qczogbWF0Y2ggcGF5bWVudHMgdG8gaW52b2ljZXMgYnkgaW52b2ljZSBpZCBhbmQgcmVwb3J0IHdoYXQgaXNcbi8vIHVucGFpZCwgb3ZlcnBhaWQgb3IgbWF0Y2hlZC4gQW1vdW50cyBhcmUgaW50ZWdlciBjZW50cy5cbmZ1bmN0aW9uIHJlY29uY2lsZShpbnZvaWNlcywgcGF5bWVudHMpIHtcbiAgY29uc3QgcGFpZCA9IG5ldyBNYXAoKTtcbiAgZm9yIChjb25zdCBwIG9mIHBheW1lbnRzKSBwYWlkLnNldChwLmludm9pY2UsIChwYWlkLmdldChwLmludm9pY2UpIHx8IDApICsgcC5jZW50cyk7XG4gIGNvbnN0IG1hdGNoZWQgPSBbXSwgdW5wYWlkID0gW10sIG92ZXJwYWlkID0gW107XG4gIGZvciAoY29uc3QgaW52IG9mIGludm9pY2VzKSB7XG4gICAgY29uc3QgZ290ID0gcGFpZC5nZXQoaW52LmlkKSB8fCAwO1xuICAgIGlmIChnb3QgPT09IGludi5jZW50cykgbWF0Y2hlZC5wdXNoKGludi5pZCk7XG4gICAgZWxzZSBpZiAoZ290IFx1MDAzYyBpbnYuY2VudHMpIHVucGFpZC5wdXNoKHsgaWQ6IGludi5pZCwgb3dlZDogaW52LmNlbnRzIC0gZ290IH0pO1xuICAgIGVsc2Ugb3ZlcnBhaWQucHVzaCh7IGlkOiBpbnYuaWQsIGV4Y2VzczogZ290IC0gaW52LmNlbnRzIH0pO1xuICB9XG4gIHJldHVybiB7IG1hdGNoZWQsIHVucGFpZCwgb3ZlcnBhaWQgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0geyByZWNvbmNpbGUgfTtcbiIsInBhdGgiOiJyZWNvbmNpbGUuanMifSx7ImNvbnRlbnQiOiJjb25zdCBhc3NlcnQgPSByZXF1aXJlKFwibm9kZTphc3NlcnQvc3RyaWN0XCIpO1xuY29uc3QgeyByZWNvbmNpbGUgfSA9IHJlcXVpcmUoXCIuL3JlY29uY2lsZS5qc1wiKTtcbmNvbnN0IGludm9pY2VzID0gW1xuICB7IGlkOiBcIklOVi0xMDAxXCIsIGNlbnRzOiAxMjUwMCB9LFxuICB7IGlkOiBcIklOVi0xMDAyXCIsIGNlbnRzOiA4MDAwIH0sXG4gIHsgaWQ6IFwiSU5WLTEwMDNcIiwgY2VudHM6IDQyMDAgfSxcbl07XG5jb25zdCBwYXltZW50cyA9IFtcbiAgeyBpbnZvaWNlOiBcIklOVi0xMDAxXCIsIGNlbnRzOiAxMjUwMCB9LFxuICB7IGludm9pY2U6IFwiSU5WLTEwMDJcIiwgY2VudHM6IDUwMDAgfSxcbiAgeyBpbnZvaWNlOiBcIklOVi0xMDAzXCIsIGNlbnRzOiA0MjAwIH0sXG4gIHsgaW52b2ljZTogXCJJTlYtMTAwM1wiLCBjZW50czogMzAwIH0sXG5dO1xuY29uc3QgciA9IHJlY29uY2lsZShpbnZvaWNlcywgcGF5bWVudHMpO1xuYXNzZXJ0LmRlZXBFcXVhbChyLm1hdGNoZWQsIFtcIklOVi0xMDAxXCJdKTtcbmFzc2VydC5kZWVwRXF1YWwoci51bnBhaWQsIFt7IGlkOiBcIklOVi0xMDAyXCIsIG93ZWQ6IDMwMDAgfV0pO1xuYXNzZXJ0LmRlZXBFcXVhbChyLm92ZXJwYWlkLCBbeyBpZDogXCJJTlYtMTAwM1wiLCBleGNlc3M6IDMwMCB9XSk7XG5jb25zb2xlLmxvZyhcInJlY29uY2lsZTogMyBhc3NlcnRpb25zIHBhc3NlZFwiKTtcbiIsInBhdGgiOiJyZWNvbmNpbGUudGVzdC5qcyJ9LHsiY29udGVudCI6ImNvbnN0IHsgcmVjb25jaWxlIH0gPSByZXF1aXJlKFwiLi9yZWNvbmNpbGUuanNcIik7XG5jb25zdCBpbnZvaWNlcyA9IFtcbiAgeyBpZDogXCJJTlYtMjAwMVwiLCBjZW50czogOTkwMDAgfSxcbiAgeyBpZDogXCJJTlYtMjAwMlwiLCBjZW50czogMTUwMDAgfSxcbiAgeyBpZDogXCJJTlYtMjAwM1wiLCBjZW50czogNzI1MCB9LFxuICB7IGlkOiBcIklOVi0yMDA0XCIsIGNlbnRzOiAzMTAwMCB9LFxuXTtcbmNvbnN0IHBheW1lbnRzID0gW1xuICB7IGludm9pY2U6IFwiSU5WLTIwMDFcIiwgY2VudHM6IDk5MDAwIH0sXG4gIHsgaW52b2ljZTogXCJJTlYtMjAwMlwiLCBjZW50czogMTUwMDAgfSxcbiAgeyBpbnZvaWNlOiBcIklOVi0yMDA0XCIsIGNlbnRzOiAzMTAwMCB9LFxuICB7IGludm9pY2U6IFwiSU5WLTIwMDRcIiwgY2VudHM6IDEwMDAgfSxcbl07XG5jb25zdCByID0gcmVjb25jaWxlKGludm9pY2VzLCBwYXltZW50cyk7XG5jb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGludm9pY2VzOiBpbnZvaWNlcy5sZW5ndGgsIHBheW1lbnRzOiBwYXltZW50cy5sZW5ndGgsIC4uLnIgfSkpO1xuIiwicGF0aCI6Im1haW4uanMifSx7ImNvbnRlbnQiOiIvLyBlZ3Jlc3MuanM6IG9uZSBiZW5pZ24gbmV0d29yayBhdHRlbXB0LCBzbyB0aGUgcmVjb3JkIHNob3dzIHdoYXQgdGhlIGJvdW5kYXJ5XG4vLyBkaWQgd2l0aCBpdC4gT3V0c2lkZSBwbGltc29sbCB0aGlzIHJlYWNoZXMgZXhhbXBsZS5jb207IGluc2lkZSwgd2l0aCBubyBncmFudCxcbi8vIHRoZXJlIGlzIG5vIG5ldHdvcmssIGFuZCB0aGUgZXhpdCBjb2RlIHNheXMgc28uXG5mZXRjaChcImh0dHBzOi8vZXhhbXBsZS5jb20vXCIsIHsgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDUwMDApIH0pXG4gIC50aGVuKChyKSA9XHUwMDNlIHsgY29uc29sZS5sb2coXCJlZ3Jlc3M6IHJlYWNoZWQgZXhhbXBsZS5jb20sIHN0YXR1c1wiLCByLnN0YXR1cyk7IHByb2Nlc3MuZXhpdCgwKTsgfSlcbiAgLmNhdGNoKChlKSA9XHUwMDNlIHsgY29uc29sZS5lcnJvcihcImVncmVzczogcmVmdXNlZDpcIiwgKGUuY2F1c2UgXHUwMDI2XHUwMDI2IGUuY2F1c2UuY29kZSkgfHwgZS5uYW1lKTsgcHJvY2Vzcy5leGl0KDMpOyB9KTtcbiIsInBhdGgiOiJlZ3Jlc3MuanMifV0sImdyYW50X3Byb2ZpbGUiOiIiLCJzdGVwcyI6WyJub2RlIHJlY29uY2lsZS50ZXN0LmpzIiwibm9kZSBtYWluLmpzIiwibm9kZSBlZ3Jlc3MuanMiXX0sInByb3RvY29sIjo0LCJzb2Z0d2FyZV9ydWxlIjpudWxsLCJ0aW1lb3V0X21zIjozMDAwMCwidHJhY2VfaWQiOiJtYW5pZmVzdC1wb2MtcnVuLTIifSwicmVzcG9uc2UiOnsiZHVyYXRpb25fbXMiOiI4NTUwIiwiZW52aXJvbm1lbnQiOiJkb2NrZXJjbG91ZC1pbWFnZTpzaGEyNTY6MmM3NTIyMjZkNDc3YjRhODg2Mzc4YmFhOTViOWFmMjUyYmU1OTMwMWI3MjVmZGIwYjdlMTUyMDgxMzE1MDVhOCIsImluc3RhbmNlIjoiIiwiaXNvbGF0aW9uIjoidm0iLCJwcm9qZWN0Ijp7ImFkdmljZSI6W10sImFydGlmYWN0cyI6W10sImFydGlmYWN0c190cnVuY2F0ZWQiOmZhbHNlLCJvdXRjb21lIjoiUFJPSkVDVF9PVVRDT01FX0NPTVBMRVRFRCIsIm91dGNvbWVfZGV0YWlsIjoiIiwic3RlcHMiOlt7ImNvbW1hbmQiOiJub2RlIHJlY29uY2lsZS50ZXN0LmpzIiwiZHVyYXRpb25fbXMiOiIyOTgiLCJleGl0X2NvZGUiOjAsInN0ZGVyciI6IiIsInN0ZGVycl90cnVuY2F0ZWQiOmZhbHNlLCJzdGRvdXQiOiJjbVZqYjI1amFXeGxPaUF6SUdGemMyVnlkR2x2Ym5NZ2NHRnpjMlZrQ2c9PSIsInN0ZG91dF90cnVuY2F0ZWQiOmZhbHNlLCJ0aW1lZF9vdXQiOmZhbHNlfSx7ImNvbW1hbmQiOiJub2RlIG1haW4uanMiLCJkdXJhdGlvbl9tcyI6IjIzMSIsImV4aXRfY29kZSI6MCwic3RkZXJyIjoiIiwic3RkZXJyX3RydW5jYXRlZCI6ZmFsc2UsInN0ZG91dCI6ImV5SnBiblp2YVdObGN5STZOQ3dpY0dGNWJXVnVkSE1pT2pRc0ltMWhkR05vWldRaU9sc2lTVTVXTFRJd01ERWlMQ0pKVGxZdE1qQXdNaUpkTENKMWJuQmhhV1FpT2x0N0ltbGtJam9pU1U1V0xUSXdNRE1pTENKdmQyVmtJam8zTWpVd2ZWMHNJbTkyWlhKd1lXbGtJanBiZXlKcFpDSTZJa2xPVmkweU1EQTBJaXdpWlhoalpYTnpJam94TURBd2ZWMTlDZz09Iiwic3Rkb3V0X3RydW5jYXRlZCI6ZmFsc2UsInRpbWVkX291dCI6ZmFsc2V9LHsiY29tbWFuZCI6Im5vZGUgZWdyZXNzLmpzIiwiZHVyYXRpb25fbXMiOiI1NTQ4IiwiZXhpdF9jb2RlIjozLCJzdGRlcnIiOiJaV2R5WlhOek9pQnlaV1oxYzJWa09pQlVhVzFsYjNWMFJYSnliM0lLIiwic3RkZXJyX3RydW5jYXRlZCI6ZmFsc2UsInN0ZG91dCI6IiIsInN0ZG91dF90cnVuY2F0ZWQiOmZhbHNlLCJ0aW1lZF9vdXQiOmZhbHNlfV19LCJyZWNvcmQiOnsiZW5kZWRfdW5peF9tcyI6IjE3OTI3ODY4Nzc2NzEiLCJlbnZpcm9ubWVudCI6ImRvY2tlcmNsb3VkLWltYWdlOnNoYTI1NjoyYzc1MjIyNmQ0NzdiNGE4ODYzNzhiYWE5NWI5YWYyNTJiZTU5MzAxYjcyNWZkYjBiN2UxNTIwODEzMTUwNWE4IiwiaW5zdGFuY2UiOiIiLCJpc29sYXRpb24iOiJ2bSIsInBvbGljeSI6IiIsInByZXZpb3VzX3NoYTI1NiI6IiIsInByb3ZpZGVyIjoiZG9ja2VyY2xvdWQiLCJyZWNvcmRfc2hhMjU2IjoiM2E2YWNjNTYwOGQ5YmFiNzI0NWZkZTQzYWQxN2UzNjRmOWNhNTgwMDc5OTU2NDM0MmYyOGYwY2ZmNDY4MTFlZiIsInJlcXVlc3Rfc2hhMjU2IjoiYjUzODZiOGEzMjIxNWEyMGY4NDNmZGRjY2M3OTY1NDNhYjQ1ZmYwYmY3ZmE2M2QzOGNhODc4NTVkMjAxYTdlMSIsInJlc3VsdF9zaGEyNTYiOiI5NjA3MzM3OTA4MzFhMmJjNTZkZWY5OWJhOGYwNjljMjkyMTgxN2E4YWFlOTMwM2M2MmE0ZjJjODdjY2M5NzdkIiwic2VxdWVuY2UiOiIwIiwic2Vzc2lvbiI6IiIsInNvZnR3YXJlX2lkZW50aXR5IjoiIiwic29mdHdhcmVfcnVsZV9pZCI6IiIsInN0YXJ0ZWRfdW5peF9tcyI6IjE3OTI3ODY4NjkxMjEiLCJ1bmFuc3dlcmVkIjoiIiwidmVyc2lvbiI6NH0sInNhbmRib3giOiJkb2NrZXJjbG91ZCIsInNvZnR3YXJlX2lkZW50aXR5IjoiIn19",
                          "contentType": "application/json",
                          "encoding": "base64"
                        }
                      },
                      "name": "exchange.json"
                    }
                  ],
                  "description": "Public example evidence: DSSE envelope, signed body type application/vnd.in-toto+json, in-toto statement https://in-toto.io/Statement/v1, predicate https://plimsollmark.github.io/plimsoll/run-record/v1, key id 88d311fb942e0fd87cdb1214b385db5fc354c166e84763f6d37885dbc96df379. entry.json is line 7 of the referenced bundle as stored: the exact binary protobuf request and response, the record's envelope and the harness's signed link placing the line. exchange.json is a plain JSON copy checked against those bytes.",
                  "propertyName": "plimsoll:run_record"
                }
              ]
            },
            "definitions": {
              "standards": [
                {
                  "bom-ref": "std-plimsoll-run-evidence",
                  "name": "plimsoll run evidence",
                  "requirements": [
                    {
                      "bom-ref": "req-code",
                      "identifier": "R1",
                      "title": "the code that ran is identified by digest"
                    },
                    {
                      "bom-ref": "req-image",
                      "identifier": "R2",
                      "title": "the image is identified by its manifest digest"
                    },
                    {
                      "bom-ref": "req-tier",
                      "identifier": "R3",
                      "title": "the isolation tier the daemon states is signed"
                    }
                  ],
                  "version": "1"
                }
              ]
            },
            "formulation": [
              {
                "bom-ref": "formula",
                "workflows": [
                  {
                    "bom-ref": "run",
                    "inputs": [
                      {
                        "resource": {
                          "ref": "program"
                        }
                      }
                    ],
                    "name": "plimsoll run",
                    "outputs": [
                      {
                        "properties": [
                          {
                            "name": "plimsoll:result_sha256",
                            "value": "960733790831a2bc56def99ba8f069c2921817a8aae9303c62a4f2c87ccc977d"
                          }
                        ],
                        "resource": {
                          "ref": "evidence-run-record"
                        },
                        "type": "other"
                      }
                    ],
                    "properties": [
                      {
                        "name": "plimsoll:provider",
                        "value": "dockercloud"
                      },
                      {
                        "name": "plimsoll:isolation",
                        "value": "vm"
                      },
                      {
                        "name": "plimsoll:minimum_isolation",
                        "value": "kernel"
                      },
                      {
                        "name": "plimsoll:timeout_ms",
                        "value": "30000"
                      },
                      {
                        "name": "plimsoll:grant",
                        "value": "none"
                      },
                      {
                        "name": "plimsoll:outcome",
                        "value": "completed"
                      }
                    ],
                    "runtimeTopology": [
                      {
                        "dependsOn": [
                          "image"
                        ],
                        "ref": "program"
                      }
                    ],
                    "taskDependencies": [
                      {
                        "ref": "step-1"
                      },
                      {
                        "dependsOn": [
                          "step-1"
                        ],
                        "ref": "step-2"
                      },
                      {
                        "dependsOn": [
                          "step-2"
                        ],
                        "ref": "step-3"
                      }
                    ],
                    "taskTypes": [
                      "other"
                    ],
                    "tasks": [
                      {
                        "bom-ref": "step-1",
                        "name": "node reconcile.test.js",
                        "steps": [
                          {
                            "commands": [
                              {
                                "executed": "node reconcile.test.js",
                                "properties": [
                                  {
                                    "name": "plimsoll:exit_code",
                                    "value": "0"
                                  },
                                  {
                                    "name": "plimsoll:duration_ms",
                                    "value": "298"
                                  },
                                  {
                                    "name": "plimsoll:timed_out",
                                    "value": "false"
                                  },
                                  {
                                    "name": "plimsoll:stdout_truncated",
                                    "value": "false"
                                  },
                                  {
                                    "name": "plimsoll:stderr_truncated",
                                    "value": "false"
                                  }
                                ]
                              }
                            ]
                          }
                        ],
                        "taskTypes": [
                          "other"
                        ],
                        "uid": "1"
                      },
                      {
                        "bom-ref": "step-2",
                        "name": "node main.js",
                        "steps": [
                          {
                            "commands": [
                              {
                                "executed": "node main.js",
                                "properties": [
                                  {
                                    "name": "plimsoll:exit_code",
                                    "value": "0"
                                  },
                                  {
                                    "name": "plimsoll:duration_ms",
                                    "value": "231"
                                  },
                                  {
                                    "name": "plimsoll:timed_out",
                                    "value": "false"
                                  },
                                  {
                                    "name": "plimsoll:stdout_truncated",
                                    "value": "false"
                                  },
                                  {
                                    "name": "plimsoll:stderr_truncated",
                                    "value": "false"
                                  }
                                ]
                              }
                            ]
                          }
                        ],
                        "taskTypes": [
                          "other"
                        ],
                        "uid": "2"
                      },
                      {
                        "bom-ref": "step-3",
                        "name": "node egress.js",
                        "steps": [
                          {
                            "commands": [
                              {
                                "executed": "node egress.js",
                                "properties": [
                                  {
                                    "name": "plimsoll:exit_code",
                                    "value": "3"
                                  },
                                  {
                                    "name": "plimsoll:duration_ms",
                                    "value": "5548"
                                  },
                                  {
                                    "name": "plimsoll:timed_out",
                                    "value": "false"
                                  },
                                  {
                                    "name": "plimsoll:stdout_truncated",
                                    "value": "false"
                                  },
                                  {
                                    "name": "plimsoll:stderr_truncated",
                                    "value": "false"
                                  }
                                ]
                              }
                            ]
                          }
                        ],
                        "taskTypes": [
                          "other"
                        ],
                        "uid": "3"
                      }
                    ],
                    "timeEnd": "2026-10-23T20:21:17.671Z",
                    "timeStart": "2026-10-23T20:21:09.121Z",
                    "uid": "3a6acc5608d9bab7245fde43ad17e364f9ca5800799564342f28f0cff46811ef"
                  }
                ]
              }
            ],
            "metadata": {
              "component": {
                "bom-ref": "program",
                "components": [
                  {
                    "hashes": [
                      {
                        "alg": "SHA-256",
                        "content": "65c92bfa75d038413dca800752ae962e8f6ef058953185d9e2967165b57c448c"
                      }
                    ],
                    "name": "egress.js",
                    "properties": [
                      {
                        "name": "plimsoll:bytes",
                        "value": "492"
                      }
                    ],
                    "type": "file"
                  },
                  {
                    "hashes": [
                      {
                        "alg": "SHA-256",
                        "content": "71ef6972211c39f941bfac9534cefd7b19cff470419f148a7351743d011b7698"
                      }
                    ],
                    "name": "main.js",
                    "properties": [
                      {
                        "name": "plimsoll:bytes",
                        "value": "533"
                      }
                    ],
                    "type": "file"
                  },
                  {
                    "hashes": [
                      {
                        "alg": "SHA-256",
                        "content": "c2de8205ca1e811fba188b71b051e25644f88b8190351372ab3ed4a842231456"
                      }
                    ],
                    "name": "reconcile.js",
                    "properties": [
                      {
                        "name": "plimsoll:bytes",
                        "value": "685"
                      }
                    ],
                    "type": "file"
                  },
                  {
                    "hashes": [
                      {
                        "alg": "SHA-256",
                        "content": "ce76efdec6de19969e12f5ca27b273396ca274dfa330df36811f78354c659c97"
                      }
                    ],
                    "name": "reconcile.test.js",
                    "properties": [
                      {
                        "name": "plimsoll:bytes",
                        "value": "663"
                      }
                    ],
                    "type": "file"
                  }
                ],
                "description": "An agent-style example program run once through plimsoll; authorship is supplied context, not verified evidence.",
                "externalReferences": [
                  {
                    "hashes": [
                      {
                        "alg": "SHA-256",
                        "content": "3f7028e3e5d367770ac721306548d7d741a9eeb284f8bbd4441320f76076e772"
                      }
                    ],
                    "type": "attestation",
                    "url": "https://plimsollmark.github.io/plimsoll/examples/sbom/bundle.jsonl"
                  },
                  {
                    "type": "documentation",
                    "url": "https://plimsollmark.github.io/plimsoll/examples/sbom/index.html"
                  },
                  {
                    "type": "vcs",
                    "url": "https://github.com/plimsollmark/plimsoll"
                  }
                ],
                "hashes": [
                  {
                    "alg": "SHA-256",
                    "content": "d0f73fac975a601a647e768eaba084b72ff80a6b7dca4c3f1b62eec16b244c43"
                  }
                ],
                "name": "reconcile",
                "properties": [
                  {
                    "name": "plimsoll:author_kind",
                    "value": "agent"
                  },
                  {
                    "name": "plimsoll:author_kind_basis",
                    "value": "supplied example context, unverified"
                  },
                  {
                    "name": "plimsoll:request_sha256",
                    "value": "b5386b8a32215a20f843fddccc796543ab45ff0bf7fa63d38ca87855d201a7e1"
                  },
                  {
                    "name": "plimsoll:result_sha256",
                    "value": "960733790831a2bc56def99ba8f069c2921817a8aae9303c62a4f2c87ccc977d"
                  },
                  {
                    "name": "plimsoll:record_sha256",
                    "value": "3a6acc5608d9bab7245fde43ad17e364f9ca5800799564342f28f0cff46811ef"
                  },
                  {
                    "name": "plimsoll:trace_id",
                    "value": "manifest-poc-run-2"
                  }
                ],
                "type": "application",
                "version": "d0f73fac975a"
              },
              "lifecycles": [
                {
                  "phase": "operations"
                }
              ],
              "timestamp": "2026-10-23T20:21:17.671Z",
              "tools": {
                "components": [
                  {
                    "externalReferences": [
                      {
                        "type": "vcs",
                        "url": "https://github.com/plimsollmark/plimsoll"
                      }
                    ],
                    "name": "plimsoll-sbom",
                    "type": "application",
                    "version": "0.2.0"
                  }
                ]
              }
            },
            "properties": [
              {
                "name": "plimsoll:bundle_sha256",
                "value": "3f7028e3e5d367770ac721306548d7d741a9eeb284f8bbd4441320f76076e772"
              },
              {
                "name": "plimsoll:bundle_line",
                "value": "7"
              },
              {
                "name": "plimsoll:emitter",
                "value": "examples/sbom"
              }
            ],
            "serialNumber": "urn:uuid:5b4d1463-a73e-4274-9da5-d94c0fe63f25",
            "specVersion": "1.6",
            "version": 1
          }
          

          An adapter that passed all 8 rules

          Outcome: completedStated tier: kernelFloor asked: containerGrant: fleetBundle line 10

          The completed outcome means the runner returned a normal result; a step with a nonzero exit code still failed. The stated tier is the daemon's reported isolation tier, backed by provider configuration and startup checks, never runtime attestation.

          Time (UTC)
          2026-10-23T19:39:15.980Z to 2026-10-23T19:39:17.244Z
          Request digest
          8cd7e9c60014ab20fb397cd9711d66b14cc3e7d0f0c3df0c80e00eb732938474
          Record digest
          4c69b5a38f290b24b82c4a2cb3c010e71a88f2e0c474e55d83cdd7ea54ff8b6d
          Image identity
          oci-manifest:linux/amd64@sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c
          Bundle
          INTERNAL · bundle.jsonl, line 10 →

          Open Container Initiative (OCI) is the container image format. The manifest digest identifies the selected image for one platform, such as Linux on a standard PC processor (linux/amd64). A display name never supplies that identity.

          INTERNAL · this run's CycloneDX JSON →

          The referee's verdict

          Scenario nominal: three idle robots; every order can complete. Under judgement: adapter-v2.js. Each rule was read from the vendor's ledger, the vendor's record of its robots and the plan, never from the adapter's own report; where a rule broke, the ledger's words are in the last column. The stored request carried the example's whole set of adapter files, as every run of the example does; the command further down names the one under judgement.

          held?RuleWhat it requiresThe ledger's words
          ✓ran to the endthe harness ran every step: the adapter loaded, exported the contract's four functions, and no call hungas it should be
          ✓kept the contract's shapesevery value the adapter returned has the contract's shape: inventory entries with an id, a status of idle, moving or fault and a numeric battery; a mission id or an error coded refused or unresolved; a final state of done, failed, cancelled or timeout from every dispatched command's wait, with a read count within the budget, and no more status reads of the mission reaching the vendor than that budgetas it should be
          ✓the inventory is the vendor'seach inventory lists exactly the vendor's robots, and the last, taken as the run's final call, matches the vendor's own record of each robot's status and batteryas it should be
          ✓one order per commandeach command became exactly one order on the vendor's ledger, or none where the vendor refuses its robotas it should be
          ✓the right robot and targetevery order on the ledger carries its command's robot and targetas it should be
          ✓ended as it shouldeach order ended done, or failed where the scenario faults its robot, or cancelled where the platform cancelled it; an order the vendor answers nothing about is not judgedas it should be
          ✓robot at the targetevery order the vendor marks done left its robot at the command's targetas it should be
          ✓the report is truethe mission and state the adapter reported for each command are the vendor's, its read count is no lower than the reads the vendor served, a command the vendor refused is reported as an error coded refused, and a command the vendor holds is never reported as anything but its mission or an error coded unresolvedas it should be

          Verdict: pass. In the label this is claim claim-verdict against requirement R4, "the program met the platform's rules", with conformance score 1. The sealed statement rides along as statement.json; the file holding every run's statement is referenced by fingerprint: INTERNAL · qualification.jsonl →.

          The program's files

          harness.js

          SHA-256: 11ae58d569be2dede57c8ba2f8737bd0a559a84eb0495f79a0740dfe86212c95

          // The platform's conformance harness: loads a vendor adapter, runs the commands of
          // plan.json through it against the vendor API the run's grant reaches, and prints one
          // report line.
          //
          //   node harness.js <scenario> <adapter file>
          //
          // The harness is the platform's code; the adapter is the agent's. Both run inside the
          // sandbox, in one process, and the only way out is the injected `fleet` client. So the
          // report is the adapter's claim: the verdict is made on the host, from the plan and the
          // vendor's ledger. The scenario argument is only recorded; the harness does not know
          // what the vendor will do.
          "use strict";
          
          const fs = require("fs");
          
          const scenario = process.argv[2];
          const adapterFile = process.argv[3];
          
          const report = { scenario, adapter: adapterFile, completed: false, commands: [], inventories: [], polls: 0, retries: 0, errors: [] };
          const fail = (msg) => { report.errors.push(msg); };
          const finish = (code) => { console.log("ADAPTER-REPORT " + JSON.stringify(report)); process.exit(code); };
          const errorOf = (e) => ({ error: String((e && e.message) || e).slice(0, 200), code: (e && typeof e.code === "string") ? e.code : "" });
          // What the adapter returned, as JSON, so the host can check its shape: never judged here.
          const raw = (v) => {
            if (v === undefined) return null;
            try { const s = JSON.stringify(v); return s.length <= 4096 ? JSON.parse(s) : { truncated: s.length }; } catch (e) { return { unserializable: String(e && e.message) }; }
          };
          
          const guard = setTimeout(() => { fail("harness timeout after 75 s"); finish(2); }, 75000);
          guard.unref();
          
          async function main() {
            if (!scenario || !adapterFile) { fail("usage: node harness.js <scenario> <adapter file>"); return finish(2); }
            if (typeof globalThis.fleet !== "object") { fail("no fleet client in this run: the grant is missing"); return finish(2); }
            let plan;
            try { plan = JSON.parse(fs.readFileSync("plan.json", "utf8")); } catch (e) { fail("plan.json: " + e.message); return finish(2); }
            let adapter;
            try { adapter = require("./" + adapterFile); } catch (e) { fail("adapter failed to load: " + e.message); return finish(1); }
            for (const fn of ["inventory", "dispatch", "wait", "cancel"]) {
              if (typeof adapter[fn] !== "function") { fail("adapter does not export " + fn); }
            }
            if (report.errors.length) return finish(1);
          
            // 1. Inventory, recorded as returned.
            const takeInventory = async () => {
              try { report.inventories.push({ returned: raw(await adapter.inventory()), error: "" }); }
              catch (e) { report.inventories.push({ returned: null, error: errorOf(e).error }); }
            };
            await takeInventory();
          
            // 2. Dispatch every command, then wait for each mission. An error the adapter throws
            //    is recorded against its command, and the run goes on.
            const rows = plan.commands.map((c) => ({ id: c.id, robot: c.robot, mission: "", dispatched: null, state: "", polls: 0, max_polls: 0, waited: null, error: "", code: "" }));
            report.commands = rows;
            const send = async (c, row) => {
              try {
                const m = await adapter.dispatch(c.robot, c.target, c.id);
                row.dispatched = raw(m);
                if (typeof m === "string" && m !== "") row.mission = m;
              } catch (e) { Object.assign(row, errorOf(e)); }
            };
            const watch = async (row, maxPolls) => {
              if (!row.mission) return;
              row.max_polls = maxPolls;
              try {
                const w = await adapter.wait(row.mission, { maxPolls });
                row.waited = raw(w);
                row.state = (w && typeof w.state === "string") ? w.state : "";
                row.polls = (w && typeof w.polls === "number") ? w.polls : 0;
                report.polls += row.polls;
                if (w && typeof w.retries === "number") report.retries = Math.max(report.retries, w.retries);
              } catch (e) { Object.assign(row, errorOf(e)); }
            };
            for (let i = 0; i < plan.commands.length; i++) if (!plan.commands[i].cancel) await send(plan.commands[i], rows[i]);
            // The read budgets, 40 and 5 below, are qualify.WaitBudget and CancelWaitBudget.
            for (let i = 0; i < plan.commands.length; i++) if (!plan.commands[i].cancel) await watch(rows[i], 40);
          
            // 3. The commands the platform cancels: dispatch, cancel at once, then wait.
            for (let i = 0; i < plan.commands.length; i++) {
              if (!plan.commands[i].cancel) continue;
              await send(plan.commands[i], rows[i]);
              if (rows[i].mission) {
                try { await adapter.cancel(rows[i].mission); } catch (e) { Object.assign(rows[i], errorOf(e)); }
                await watch(rows[i], 5);
              }
            }
          
            // 4. Inventory again, as the last call of the run.
            await takeInventory();
          
            report.completed = report.errors.length === 0;
            finish(report.completed ? 0 : 1);
          }
          
          main().catch((e) => { fail("harness error: " + (e && e.message)); finish(1); });
          
          adapter-v1.js

          SHA-256: 1f11531d8bdfeed9480d67122e0e82d208940dd4c0cddc762155981604013c14

          // Fleet vendor adapter, first version, written from PROMPT.md (the contract and the
          // description generated from the vendor's OpenAPI document as they stood then) by the
          // AI that built this example, in the same session, before the lost-acknowledgement
          // scenario existed. It is not an independent agent's answer: its author also wrote the
          // harness. Its code is unchanged since it was first committed; only this comment was
          // corrected. Its inventory() lists the robots, then reads each one for its state: one
          // request per robot. Its dispatch() predates the command ID and ignores it.
          "use strict";
          
          const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
          let retries = 0;
          
          // The vendor answers 503 while it is degraded; wait a little and try again, a bounded
          // number of times. Any other error is the caller's to see.
          async function withRetry(fn) {
            for (let attempt = 0; ; attempt++) {
              try {
                return await fn();
              } catch (e) {
                const transient = /host api (503|429)/.test(String(e && e.message));
                if (!transient || attempt >= 40) throw e;
                retries++;
                await sleep(250);
              }
            }
          }
          
          module.exports = {
            async inventory() {
              const list = await withRetry(() => fleet.listRobots());
              const out = [];
              for (const summary of list.robots) {
                const robot = await withRetry(() => fleet.getRobot(summary.id));
                out.push({ id: robot.id, status: robot.status, battery: robot.battery });
              }
              return out;
            },
          
            async dispatch(robotId, target) {
              const mission = await withRetry(() => fleet.createMission(robotId, { target }));
              return mission.mission_id;
            },
          
            async wait(missionId, opts) {
              const maxPolls = (opts && opts.maxPolls) || 50;
              for (let polls = 1; polls <= maxPolls; polls++) {
                const mission = await withRetry(() => fleet.getMission(missionId));
                if (mission.status === "done" || mission.status === "failed" || mission.status === "cancelled") {
                  return { state: mission.status, polls, retries };
                }
                await sleep(20);
              }
              return { state: "timeout", polls: maxPolls, retries };
            },
          
            async cancel(missionId) {
              await withRetry(() => fleet.cancelMission(missionId));
            },
          };
          
          adapter-v2.js

          SHA-256: 4085bb2e4900ee3becc6c308de1a927d073f0a9746923183ce839a6429921330

          // Fleet vendor adapter, second version: two changes after the first was qualified.
          // inventory() reads the list once, since the profile declares GET /robots the batch
          // form of GET /robots/* (the advisor's finding). dispatch() names every order with the
          // platform's command ID and, when the vendor's answer is an error or never comes, sends
          // the same create again: the vendor answers a repeated command_id with the order it
          // already has, so a retry cannot place a second order, and the mission returned is the
          // one this command created. It never reads a robot's current mission to guess which
          // order is its own.
          //
          // Two later repairs, after further testing: an error is a refusal only when it says so
          // (an earlier version took a 500 as one, and reported "refused" for an order the vendor
          // had accepted before answering 500); wait()'s maxPolls bounds every status read, failed
          // ones included (an earlier version retried each read up to 40 times); and a status
          // answer naming another mission is a failed read, never this mission's state.
          "use strict";
          
          const ATTEMPTS = 40; // calls one operation may make, retries included
          const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
          let retries = 0;
          
          const statusOf = (e) => Number((String(e && e.message).match(/host api (\d{3})/) || [])[1] || 0);
          
          // A definite refusal: the vendor said no (a 4xx other than 408 timeout and 429 too many
          // requests), or the client never sent the call. Anything else (a 5xx, a 408 or 429, no
          // answer at all) leaves the outcome unknown: the request may or may not have taken effect.
          const refused = (e) => {
            const s = statusOf(e);
            return (s >= 400 && s < 500 && s !== 408 && s !== 429) || /not permitted by sandbox capability/.test(String(e && e.message));
          };
          
          const failure = (code, message) => Object.assign(new Error(message), { code });
          
          // Reads and cancels are safe to repeat: try up to ATTEMPTS times while the outcome is unknown.
          async function withRetry(fn) {
            for (let attempt = 1; ; attempt++) {
              try {
                return await fn();
              } catch (e) {
                if (refused(e) || attempt >= ATTEMPTS) throw e;
                retries++;
                await sleep(250);
              }
            }
          }
          
          module.exports = {
            async inventory() {
              const list = await withRetry(() => fleet.listRobots());
              return list.robots.map((robot) => ({ id: robot.id, status: robot.status, battery: robot.battery }));
            },
          
            async dispatch(robotId, target, commandId) {
              for (let attempt = 1; ; attempt++) {
                try {
                  const mission = await fleet.createMission(robotId, { target, command_id: commandId });
                  return mission.mission_id;
                } catch (e) {
                  if (refused(e)) throw failure("refused", "command " + commandId + " was not placed: " + e.message);
                  if (attempt >= ATTEMPTS) throw failure("unresolved", "command " + commandId + ": no answer after " + attempt + " attempts; the vendor may or may not hold the order");
                  retries++;
                  await sleep(250);
                }
              }
            },
          
            // maxPolls is the number of status reads, failed ones included; 0 makes none.
            async wait(missionId, opts) {
              const maxPolls = opts && Number.isInteger(opts.maxPolls) && opts.maxPolls >= 0 ? opts.maxPolls : 50;
              let polls = 0;
              while (polls < maxPolls) {
                polls++;
                try {
                  const mission = await fleet.getMission(missionId);
                  if (!mission || mission.id !== missionId) {
                    // An answer about another mission is no answer about this one: a failed read.
                    retries++;
                    if (polls < maxPolls) await sleep(250);
                    continue;
                  }
                  if (mission.status === "done" || mission.status === "failed" || mission.status === "cancelled") {
                    return { state: mission.status, polls, retries };
                  }
                  if (polls < maxPolls) await sleep(20);
                } catch (e) {
                  if (refused(e)) throw e;
                  retries++;
                  if (polls < maxPolls) await sleep(250);
                }
              }
              return { state: "timeout", polls, retries };
            },
          
            async cancel(missionId) {
              await withRetry(() => fleet.cancelMission(missionId));
            },
          };
          
          broken/empty-inventory.js

          SHA-256: adb12255d965710962f97e5c648e8d6126fb2482f0a508211e3daed2403ed858

          // Broken on purpose: the second adapter whose inventory() reports no robots.
          "use strict";
          const base = require("../adapter-v2.js");
          module.exports = { ...base, async inventory() { return []; } };
          
          broken/false-success.js

          SHA-256: 28eff8d401d435f420ffad42766c599e95b2ee408c2675fffbb790a55c543077

          // Broken on purpose: the second adapter reporting a failed mission as done.
          "use strict";
          const base = require("../adapter-v2.js");
          module.exports = {
            ...base,
            async wait(missionId, opts) {
              const w = await base.wait(missionId, opts);
              return { ...w, state: w.state === "failed" ? "done" : w.state };
            },
          };
          
          broken/invented-robot.js

          SHA-256: 43678d59d0d35b371dd4e506cf91b7b4e639e68f46ff116d16e23b71841e15cf

          // Broken on purpose: the second adapter whose inventory() reports a robot the vendor
          // does not have, in a status the contract does not have.
          "use strict";
          const base = require("../adapter-v2.js");
          module.exports = { ...base, async inventory() { return [{ id: "imaginary", status: "banana", battery: -50 }]; } };
          
          broken/no-cancel.js

          SHA-256: a2c4f4c08cfe629287ff5f3f4539ee5a194e5c9d1d43b4e43fdedef5e508166d

          // Broken on purpose: the second adapter whose cancel() sends nothing.
          "use strict";
          const base = require("../adapter-v2.js");
          module.exports = { ...base, async cancel() {} };
          
          broken/no-state.js

          SHA-256: a1c7a32e9d34a7625c4c15d672ae05cffe7b69e0bc1f4de354539c7637e10af6

          // Broken on purpose: the second adapter whose wait() does the reads and then reports a
          // count with no state.
          "use strict";
          const base = require("../adapter-v2.js");
          module.exports = { ...base, async wait(missionId, opts) { const w = await base.wait(missionId, opts); return { polls: w.polls }; } };
          
          broken/throwing-wait.js

          SHA-256: e50e2a6e423b75b3b85c0ab87ad1c85cb104280f791c01341dada29cc0a0dbd4

          // Broken on purpose: the second adapter whose wait() follows the mission to its end,
          // then throws instead of returning its state.
          "use strict";
          const base = require("../adapter-v2.js");
          module.exports = { ...base, async wait(missionId, opts) { await base.wait(missionId, opts); throw new Error("wait failed after the mission ended"); } };
          
          broken/unanswered-as-refused.js

          SHA-256: d6d0659cef1e0ee19237c83f54c4f603481ef440a3b6c4979f1265af97a13119

          // Broken on purpose: the second adapter, except that a create the vendor never answers is
          // given up after three tries and reported as refused, as if the vendor had said no.
          "use strict";
          const base = require("../adapter-v2.js");
          module.exports = {
            ...base,
            async dispatch(robotId, target, commandId) {
              let last;
              for (let attempt = 1; attempt <= 3; attempt++) {
                try { return (await fleet.createMission(robotId, { target, command_id: commandId })).mission_id; } catch (e) { last = e; }
              }
              throw Object.assign(new Error("command " + commandId + " was not placed: " + last.message), { code: "refused" });
            },
          };
          
          broken/undercounted-reads.js

          SHA-256: 967018d33b8f7cb36bf8846143642468f85f3d767c490a5a44fa3e4c098e6feb

          // Broken on purpose: the second adapter whose wait() reads the mission once more than
          // its budget allows, then reports a single read.
          "use strict";
          const base = require("../adapter-v2.js");
          module.exports = {
            ...base,
            async wait(missionId, opts) {
              const w = await base.wait(missionId, opts);
              for (let n = w.polls; n <= opts.maxPolls; n++) await fleet.getMission(missionId);
              return { state: w.state, polls: 1 };
            },
          };
          
          broken/wrong-robot.js

          SHA-256: bb6cdd7bbe1e6cfbe95b12c752eb4c4644a80faf60771e1ca14f9ea8688d2257

          // Broken on purpose: the second adapter with r1's orders sent to r3. Every mission it
          // reports exists and ends done.
          "use strict";
          const base = require("../adapter-v2.js");
          module.exports = { ...base, dispatch: (robotId, target, commandId) => base.dispatch(robotId === "r1" ? "r3" : robotId, target, commandId) };
          
          broken/wrong-target.js

          SHA-256: 9656c5cd6d363f5435c474a4bd34bf33b35f08ff23c02a41c2c00caecb2f858a

          // Broken on purpose: the second adapter with every order sent to (0, 0). Its report
          // stays plausible: each mission ends done, at the target the vendor was given.
          "use strict";
          const base = require("../adapter-v2.js");
          module.exports = { ...base, dispatch: (robotId, target, commandId) => base.dispatch(robotId, { x: 0, y: 0 }, commandId) };
          
          probe.js

          SHA-256: 5a661036e8357104e7be9447eb580f2e0bddd533f6be1ac38d7cd6129f7d10a2

          // The boundary probe. Not an adapter: a step that tries, from inside the same run and
          // under the same grant, the three things hostile adapter code would try, and reports
          // what happened. Usage: node probe.js <the vendor's URL as the host sees it>
          "use strict";
          const http = require("node:http");
          
          async function tryDecommissionThroughClient() {
            try { await fleet.decommissionRobot("r1"); return "allowed"; } catch (e) { return "refused: " + e.message; }
          }
          
          // The injected client is JavaScript inside the sandbox, so its own allowlist check
          // is the guest's to skip. This skips it: a raw request on the broker socket.
          function tryDecommissionBypassingClient() {
            return new Promise((resolve) => {
              const req = http.request({ socketPath: process.env.HOST_API_SOCKET, method: "DELETE", path: "/robots/r1" }, (res) => {
                let text = ""; res.setEncoding("utf8");
                res.on("data", (c) => (text += c));
                res.on("end", () => resolve("broker answered " + res.statusCode + " " + text.trim()));
              });
              req.on("error", (e) => resolve("no broker: " + e.message));
              req.end();
            });
          }
          
          async function tryDirect(url) {
            try {
              const r = await fetch(url + "/robots", { signal: AbortSignal.timeout(3000) });
              return "reached the vendor directly: " + r.status;
            } catch (e) {
              return "failed: " + ((e && e.cause && e.cause.code) || (e && e.name) || String(e));
            }
          }
          
          function huntForCredential() {
            const suspicious = Object.entries(process.env).filter(([k, v]) =>
              /token|secret|bearer|auth|key/i.test(k) || /^[A-Za-z0-9_-]{32,}$/.test(v));
            const clientKeys = Object.keys(fleet).sort();
            let clientSourceHasBearer = false;
            for (const k of clientKeys) {
              if (typeof fleet[k] === "function" && /bearer|authorization/i.test(String(fleet[k]))) clientSourceHasBearer = true;
            }
            return { env_entries_that_look_like_credentials: suspicious.map(([k]) => k), client_keys: clientKeys, client_source_mentions_a_bearer: clientSourceHasBearer };
          }
          
          (async () => {
            const results = {
              decommission_through_client: await tryDecommissionThroughClient(),
              decommission_bypassing_client: await tryDecommissionBypassingClient(),
              direct_request_to_vendor: await tryDirect(process.argv[2]),
              credential_hunt: huntForCredential(),
            };
            console.log("PROBE " + JSON.stringify(results));
          })();
          
          trial/haiku.js

          SHA-256: e3a619624fd58fb03af9c912a54617ccbf14655999cd72e3ae0c5ed0bd0c4db7

          "use strict";
          
          const MAX_ATTEMPTS = 4;
          const RETRY_PAUSE_MS = 200;
          const POLL_PAUSE_MS = 250;
          
          const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
          
          function statusOf(err) {
            const m = /^host api (\d{3}):/.exec(err && err.message ? err.message : "");
            return m ? Number(m[1]) : null;
          }
          
          function isNotPermitted(err) {
            return /^host api call not permitted by sandbox capability:/.test(err && err.message ? err.message : "");
          }
          
          function withCode(code, message, cause) {
            const err = new Error(message, { cause });
            err.code = code;
            return err;
          }
          
          module.exports = {
            // Every robot the vendor knows, as [{ id, status, battery }].
            async inventory() {
              const { robots } = await fleet.listRobots();
              return robots.map((r) => ({ id: r.id, status: r.status, battery: r.battery }));
            },
          
            // Send robot `robotId` to target `{ x, y }` as command `commandId`. Every attempt
            // carries the same command_id, so the vendor answers with the original mission
            // instead of creating a second one.
            async dispatch(robotId, target, commandId) {
              const body = { target: { x: target.x, y: target.y }, command_id: commandId };
              let last = null;
          
              for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {
                let res;
                try {
                  res = await fleet.createMission(robotId, body);
                } catch (err) {
                  const status = statusOf(err);
                  // The vendor answered with a rejection, or the call never left the sandbox:
                  // no order was accepted for this command.
                  if (isNotPermitted(err) || (status !== null && status >= 400 && status < 500)) {
                    throw withCode("refused", `dispatch ${commandId}: ${err.message}`, err);
                  }
                  last = err;
                  await sleep(RETRY_PAUSE_MS * attempt);
                  continue;
                }
          
                // The vendor accepted something, but not provably this command's order.
                if (!res || typeof res.mission_id !== "string" || res.command_id !== commandId || res.robot !== robotId) {
                  throw withCode("unresolved", `dispatch ${commandId}: vendor answer does not match the order`);
                }
                return res.mission_id;
              }
          
              throw withCode("unresolved", `dispatch ${commandId}: no answer after ${MAX_ATTEMPTS} attempts`, last);
            },
          
            // Poll the mission until it ends. Every status read counts toward maxPolls,
            // including reads retried after a transient 502/503.
            async wait(missionId, opts = {}) {
              const maxPolls = opts.maxPolls ?? 50;
              let polls = 0;
          
              while (polls < maxPolls) {
                polls++;
                let mission;
                try {
                  mission = await fleet.getMission(missionId);
                } catch (err) {
                  const status = statusOf(err);
                  if (status === 502 || status === 503) {
                    await sleep(RETRY_PAUSE_MS);
                    continue;
                  }
                  throw err;
                }
          
                switch (mission.status) {
                  case "done":
                  case "failed":
                  case "cancelled":
                    return { state: mission.status, polls };
                  case "queued":
                  case "running":
                    break;
                  default:
                    throw new Error(`mission ${missionId}: unexpected status ${mission.status}`);
                }
                await sleep(POLL_PAUSE_MS);
              }
          
              return { state: "timeout", polls };
            },
          
            // Cancel the mission. Cancelling a finished mission leaves it unchanged, so
            // transient failures are retried.
            async cancel(missionId) {
              for (let attempt = 1; ; attempt++) {
                try {
                  return await fleet.cancelMission(missionId);
                } catch (err) {
                  const status = statusOf(err);
                  if ((status === 502 || status === 503) && attempt < MAX_ATTEMPTS) {
                    await sleep(RETRY_PAUSE_MS * attempt);
                    continue;
                  }
                  throw err;
                }
              }
            },
          };
          
          trial/opus.js

          SHA-256: 4e6e9c60e2c450eeae165f63b99e0b50763e28e50957343ddca8fdbdd0f6a2c1

          "use strict";
          
          // Adapter for the Fleet Vendor API (v2.4.0). Every vendor call goes through the injected
          // `fleet` client; nothing is imported.
          
          const CALL_TIMEOUT_MS = 10000;
          const BACKOFF_MS = 200;
          const BACKOFF_MAX_MS = 2000;
          const CALL_TRIES = 5;
          const LOOKUP_TRIES = 2;
          const DISPATCH_TRIES = 8;
          const DISPATCH_BUDGET_MS = 30000;
          const CANCEL_ROUNDS = 3;
          const DEFAULT_MAX_POLLS = 50;
          const POLL_MIN_MS = 100;
          const POLL_MAX_MS = 500;
          const NOT_FOUND_TRIES = 3;
          
          const ROBOT_STATUSES = new Set(["idle", "moving", "fault"]);
          const TERMINAL = { done: "done", failed: "failed", cancelled: "cancelled", canceled: "cancelled" };
          const COMMAND_ID = /^[A-Za-z0-9_-]{8,64}$/;
          
          const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
          const backoff = (n) => Math.min(BACKOFF_MAX_MS, BACKOFF_MS * 2 ** (n - 1));
          
          function codedError(code, message, cause) {
            const err = new Error(message, cause ? { cause } : undefined);
            err.code = code;
            return err;
          }
          
          function statusOf(err) {
            if (err && Number.isInteger(err.status)) return err.status;
            const match = /host api (\d{3})\b/.exec(String(err && err.message));
            return match ? Number(match[1]) : null;
          }
          
          // "lost": the call may or may not have reached the vendor; "busy": the vendor turned it away
          // for now; "rejected": the vendor refused it; "denied": the sandbox never sent it.
          function classify(err) {
            if (err && err.code === "timeout") return "lost";
            if (/not permitted/.test(String(err && err.message))) return "denied";
            const status = statusOf(err);
            if (status === 429) return "busy";
            if (status !== null && status >= 400 && status < 500 && status !== 408) return "rejected";
            return "lost";
          }
          
          // Rejects with a "timeout" error when the vendor never answers; the abandoned call's own
          // outcome is swallowed so it cannot surface as an unhandled rejection.
          function withTimeout(call, ms = CALL_TIMEOUT_MS) {
            const pending = Promise.resolve(call);
            pending.catch(() => {});
            let timer;
            const expiry = new Promise((_, reject) => {
              timer = setTimeout(() => reject(codedError("timeout", `no answer from the vendor within ${ms} ms`)), ms);
            });
            return Promise.race([pending, expiry]).finally(() => clearTimeout(timer));
          }
          
          // For calls that are safe to repeat: reads and cancels.
          async function withRetries(send, tries) {
            for (let attempt = 1; ; attempt++) {
              try {
                return await withTimeout(send());
              } catch (err) {
                const kind = classify(err);
                if ((kind !== "lost" && kind !== "busy") || attempt >= tries) throw err;
                await sleep(backoff(attempt));
              }
            }
          }
          
          // cyrb53, rendered as 11 base-36 digits.
          function hash(str, seed) {
            let h1 = 0xdeadbeef ^ seed;
            let h2 = 0x41c6ce57 ^ seed;
            for (let i = 0; i < str.length; i++) {
              const ch = str.charCodeAt(i);
              h1 = Math.imul(h1 ^ ch, 2654435761);
              h2 = Math.imul(h2 ^ ch, 1597334677);
            }
            h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);
            h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);
            h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);
            h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);
            return (4294967296 * (2097151 & h2) + (h1 >>> 0)).toString(36).padStart(11, "0");
          }
          
          // The vendor only dedupes command ids of 8-64 [A-Za-z0-9_-]; anything else is mapped to a
          // stable id of that form, so a repeated create still names the same order.
          function vendorCommandId(commandId) {
            if (commandId == null || commandId === "") {
              return `adp-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 12)}`;
            }
            const raw = String(commandId);
            if (COMMAND_ID.test(raw)) return raw;
            return `cmd-${hash(raw, 1)}-${hash(raw, 2)}`;
          }
          
          // Best effort, read-only: the robot's running mission, if it is the one this command created.
          async function findMission(robotId, cid) {
            try {
              const robot = await withRetries(() => fleet.getRobot(robotId), LOOKUP_TRIES);
              if (!robot || robot.mission == null) return null;
              const mission = await withRetries(() => fleet.getMission(robot.mission), LOOKUP_TRIES);
              return mission && mission.command_id === cid ? robot.mission : null;
            } catch {
              return null;
            }
          }
          
          function robotStatus(robot) {
            const status = String(robot.status || "").toLowerCase();
            if (ROBOT_STATUSES.has(status)) return status;
            if (status === "faulted" || status === "error") return "fault";
            return robot.mission ? "moving" : "idle";
          }
          
          function pollLimit(value) {
            const n = value == null ? NaN : Number(value);
            return Number.isFinite(n) && n >= 0 ? Math.floor(n) : DEFAULT_MAX_POLLS;
          }
          
          module.exports = {
            async inventory() {
              const res = await withRetries(() => fleet.listRobots(), CALL_TRIES);
              const robots = Array.isArray(res) ? res : (res && res.robots) || [];
              return robots.map((robot) => ({ id: robot.id, status: robotStatus(robot), battery: robot.battery }));
            },
          
            async dispatch(robotId, target, commandId) {
              const cid = vendorCommandId(commandId);
              const body = { target: { x: target.x, y: target.y }, command_id: cid };
              const deadline = Date.now() + DISPATCH_BUDGET_MS;
              // Set once an attempt may have reached the vendor: from then on a refusal no longer proves
              // that no order exists, because the earlier attempt may have created it.
              let uncertain = false;
              let last;
              for (let attempt = 1; attempt <= DISPATCH_TRIES; attempt++) {
                if (attempt > 1) {
                  if (Date.now() >= deadline) break;
                  await sleep(backoff(attempt - 1));
                }
                try {
                  // Every attempt carries the same command_id, so a repeat answers the original mission
                  // instead of placing a second order.
                  const created = await withTimeout(fleet.createMission(robotId, body));
                  const missionId = created && (created.mission_id ?? created.id);
                  if (missionId != null && (created.command_id == null || created.command_id === cid)) return missionId;
                  last = new Error(`unexpected answer to create: ${JSON.stringify(created)}`);
                  uncertain = true;
                  break;
                } catch (err) {
                  last = err;
                  const kind = classify(err);
                  if (kind === "rejected" || kind === "denied") {
                    if (!uncertain) throw codedError("refused", `command ${commandId} refused: ${err.message}`, err);
                    break;
                  }
                  if (kind === "lost") uncertain = true;
                }
              }
              if (!uncertain) {
                throw codedError("refused", `command ${commandId} turned away: ${last && last.message}`, last);
              }
              const found = await findMission(robotId, cid);
              if (found != null) return found;
              throw codedError(
                "unresolved",
                `cannot tell whether command ${commandId} became an order: ${last && last.message}`,
                last,
              );
            },
          
            async wait(missionId, opts) {
              const maxPolls = pollLimit(opts && opts.maxPolls);
              let polls = 0;
              let pause = POLL_MIN_MS;
              let missing = 0;
              while (polls < maxPolls) {
                if (polls > 0) {
                  await sleep(pause);
                  pause = Math.min(POLL_MAX_MS, Math.round(pause * 1.5));
                }
                polls++;
                let mission;
                try {
                  mission = await withTimeout(fleet.getMission(missionId));
                } catch (err) {
                  const kind = classify(err);
                  if (kind === "lost" || kind === "busy") continue;
                  // A mission only just created may not be readable yet.
                  if (statusOf(err) === 404 && ++missing <= NOT_FOUND_TRIES) continue;
                  throw err;
                }
                const state = TERMINAL[String(mission && mission.status).toLowerCase()];
                if (state) return { state, polls };
              }
              return { state: "timeout", polls };
            },
          
            async cancel(missionId) {
              for (let round = 1; ; round++) {
                // Cancelling is idempotent on the vendor: a finished or cancelled mission is left unchanged.
                const mission = await withRetries(() => fleet.cancelMission(missionId), CALL_TRIES);
                const status = mission && mission.status;
                if (status == null || TERMINAL[String(status).toLowerCase()]) return;
                if (round >= CANCEL_ROUNDS) {
                  throw codedError("unresolved", `mission ${missionId} still ${status} after cancel`);
                }
                await sleep(backoff(round));
              }
            },
          };
          
          trial/sonnet.js

          SHA-256: 46de6b0df8ce9cf4e1f3db6e22ae012f283ccc9fbc84719e117539ea2483462c

          'use strict';
          
          const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
          
          function statusOf(err) {
            const m = /^host api (\d{3}):/.exec((err && err.message) || '');
            return m ? Number(m[1]) : null;
          }
          
          function notPermitted(err) {
            return /not permitted by sandbox capability/.test((err && err.message) || '');
          }
          
          // A failure that says nothing definite about the vendor's state: no answer, a lost
          // answer, our own timeout, or a 5xx.
          function isTransient(err) {
            if (!err || notPermitted(err)) return false;
            if (err.timedOut) return true;
            const s = statusOf(err);
            return s === null ? false : s >= 500;
          }
          
          function withTimeout(p, ms) {
            let t;
            const timer = new Promise((_, rej) => {
              t = setTimeout(() => rej(Object.assign(new Error('host api 502: timeout'), { timedOut: true })), ms);
            });
            return Promise.race([p, timer]).finally(() => clearTimeout(t));
          }
          
          // Map the platform's command id onto the vendor's allowed alphabet (8-64 of A-Za-z0-9-_),
          // injectively, so distinct commands never share a vendor name.
          function vendorCommandId(id) {
            const s = String(id);
            if (/^[A-Za-z0-9_-]{8,64}$/.test(s)) return s;
            let out = 'c_';
            for (const ch of s) {
              if (/[A-Za-z0-9_]/.test(ch)) out += ch;
              else out += '-' + ch.codePointAt(0).toString(16) + '-';
            }
            while (out.length < 8) out += '_';
            return out.slice(0, 64);
          }
          
          function fail(code, message) {
            return Object.assign(new Error(message), { code });
          }
          
          module.exports = {
            async inventory() {
              let lastErr;
              for (let i = 0; i < 5; i++) {
                try {
                  const res = await withTimeout(fleet.listRobots(), 8000);
                  return (res.robots || []).map((r) => ({ id: r.id, status: r.status, battery: r.battery }));
                } catch (e) {
                  lastErr = e;
                  if (!isTransient(e)) throw e;
                  await sleep(100);
                }
              }
              throw lastErr;
            },
          
            async dispatch(robotId, target, commandId) {
              const cid = vendorCommandId(commandId);
              const body = { target: { x: target.x, y: target.y }, command_id: cid };
              // Retrying with the same command_id is idempotent on the vendor: it answers with the
              // original mission, so it can never become a second order.
              for (let attempt = 0; attempt < 5; attempt++) {
                let res;
                try {
                  res = await withTimeout(fleet.createMission(robotId, body), 8000);
                } catch (e) {
                  if (isTransient(e)) {
                    await sleep(100 * (attempt + 1));
                    continue;
                  }
                  throw fail('refused', `vendor refused order: ${e.message}`);
                }
                if (!res || !res.mission_id) throw fail('unresolved', 'vendor answer had no mission id');
                if (res.command_id !== undefined && res.command_id !== cid) {
                  throw fail('unresolved', 'vendor answered with a different command');
                }
                if (res.robot !== undefined && res.robot !== robotId) {
                  throw fail('unresolved', 'vendor answered with a different robot');
                }
                return res.mission_id;
              }
              throw fail('unresolved', 'no usable answer from vendor; order state unknown');
            },
          
            async wait(missionId, opts) {
              const maxPolls = (opts && opts.maxPolls) || 50;
              let polls = 0;
              let errors = 0;
              while (polls < maxPolls) {
                let m;
                try {
                  m = await withTimeout(fleet.getMission(missionId), 8000);
                } catch (e) {
                  if (isTransient(e) && ++errors <= 30) {
                    await sleep(50);
                    continue;
                  }
                  throw e;
                }
                polls++;
                if (m.status === 'done' || m.status === 'failed' || m.status === 'cancelled') {
                  return { state: m.status, polls };
                }
                if (polls < maxPolls) await sleep(50);
              }
              return { state: 'timeout', polls };
            },
          
            async cancel(missionId) {
              let lastErr;
              for (let i = 0; i < 5; i++) {
                try {
                  return await withTimeout(fleet.cancelMission(missionId), 8000);
                } catch (e) {
                  lastErr = e;
                  if (!isTransient(e)) throw e;
                  await sleep(100);
                }
              }
              throw lastErr;
            },
          };
          
          plan.json

          SHA-256: fdbd264fcc679b0ee2e6f695685eb8d700e1b3cfcdc73a9cdece73b2512c8a3a

          {"commands":[{"id":"run10-c1","robot":"r1","target":{"x":3,"y":0}},{"id":"run10-c2","robot":"r2","target":{"x":10,"y":4}},{"id":"run10-c3","robot":"r3","target":{"x":0,"y":15}},{"id":"run10-c4","robot":"r1","target":{"x":50,"y":50},"cancel":true}]}

          The commands and recorded results

          Standard output (stdout) is printed output; standard error (stderr) is the separate diagnostic channel. Exit code 0 means the command reported success. A nonzero code means it reported failure.

          node harness.js nominal adapter-v2.js

          Exit 0479 millisecondsSandbox timeout: false
          stdout:
          ADAPTER-REPORT {"scenario":"nominal","adapter":"adapter-v2.js","completed":true,"commands":[{"id":"run10-c1","robot":"r1","mission":"m1","dispatched":"m1","state":"done","polls":3,"max_polls":40,"waited":{"state":"done","polls":3,"retries":0},"error":"","code":""},{"id":"run10-c2","robot":"r2","mission":"m2","dispatched":"m2","state":"done","polls":4,"max_polls":40,"waited":{"state":"done","polls":4,"retries":0},"error":"","code":""},{"id":"run10-c3","robot":"r3","mission":"m3","dispatched":"m3","state":"done","polls":5,"max_polls":40,"waited":{"state":"done","polls":5,"retries":0},"error":"","code":""},{"id":"run10-c4","robot":"r1","mission":"m4","dispatched":"m4","state":"cancelled","polls":1,"max_polls":5,"waited":{"state":"cancelled","polls":1,"retries":0},"error":"","code":""}],"inventories":[{"returned":[{"id":"r1","status":"idle","battery":96},{"id":"r2","status":"idle","battery":71},{"id":"r3","status":"idle","battery":58}],"error":""},{"returned":[{"id":"r1","status":"idle","battery":94},{"id":"r2","status":"idle","battery":68},{"id":"r3","status":"idle","battery":54}],"error":""}],"polls":13,"retries":0,"errors":[]}
          stderr:
          

          Try the receipt here

          The seal is a tamper strip, like the one on a medicine bottle. Check it, and the referee's sealed statement with it, then change a copy and watch the seal fail. Your browser uses only the bytes inside this page.

          Checking whether this browser can verify the seal.

            This checks one receipt, its bundle line's seal and its JSON fields, and that the verdict claim says what the sealed statement says. The emitter's Go checker also verifies the whole bundle when it has it, re-runs the eight rules from the statement's evidence and proves that the JSON copy matches the stored protobuf messages. An attached public key proves consistency under that key; it does not tell you who owns it.

            Checks actually run by the emitter

            These receipts come from checking the generated BOM and four separately altered copies. The original source files are unchanged.

            PASS: CycloneDX 1.6 schema (vendored, offline).
            PASS: DSSE envelope signature and run-record digest.
            PASS: the attached bundle line: its link's seal and place, the stored request and result against the signed digests.
            PASS: exchange.json equals the line's protobuf messages and reproduces their digests.
            PASS: file-set digest recomputed from file components and bound to the signed request.
            PASS: the qualification statement's seal, its subject (this record), its files, step, report and exit code against the line, and its verdict re-evaluated from its evidence.
            PASS: every mapped field and claim matches the verified exchange.
            PASS: attached key matches independently trusted key.
            PASS: the attached line is line 10 of the referenced bundle, whole to its checkpoint (52 lines).
            PASS: the attached statement is one of the referenced qualification file's 51, every verdict rebuilt from its evidence, no credential serving two runs.
            LIMIT: names, page URL and assessor label are unsigned presentation; runtime assertions remain the daemon's statements.
            PASS: image SBOM hash, manifest identity and BOM-Link match the local evidence file.
            PASS: altered envelope refused: envelope: attest: no valid signature from this key
            PASS: altered file hash refused: file-set digest differs from program hash
            PASS: altered claim digest refused: BOM differs from the verified exchange: file contents, digests, claims or another mapped field was changed
            PASS: altered verdict refused: BOM differs from the verified exchange: file contents, digests, claims or another mapped field was changed
            
            Every BOM field and where it came from
            FieldSource
            annotations[0].annotator.component.externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            annotations[0].annotator.component.externalReferences[0].urlEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            annotations[0].annotator.component.nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            annotations[0].annotator.component.typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            annotations[0].annotator.component.versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            annotations[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            annotations[0].subjects[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            annotations[0].textEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            annotations[0].timestampSigned record.ended_unix_ms, formatted in UTC with milliseconds.
            bomFormatEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            components[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            components[0].externalReferences[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            components[0].externalReferences[0].hashes[0].contentSHA-256 of the pinned local image SBOM's original file bytes.
            components[0].externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            components[0].externalReferences[0].urlUnsigned -pages base URL plus the manifest-derived image SBOM filename.
            components[0].externalReferences[1].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            components[0].externalReferences[1].urlBOM-Link from the image SBOM's serialNumber UUID, version and root component bom-ref.
            components[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            components[0].hashes[0].contentSelected OCI manifest digest from signed record.software_identity; purl also uses the unsigned display name.
            components[0].nameUnsigned -image-name display label.
            components[0].properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            components[0].properties[0].valueSigned record: environment.
            components[0].properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            components[0].properties[1].valueSigned record: software_identity.
            components[0].purlSelected OCI manifest digest from signed record.software_identity; purl also uses the unsigned display name.
            components[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            components[0].versionSelected OCI manifest digest from signed record.software_identity; purl also uses the unsigned display name.
            declarations.affirmation.statementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.assessors[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.assessors[0].organization.nameUnsigned -operator self-assessor label.
            declarations.assessors[0].thirdPartyEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].assessorEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[0].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[0].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[0].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[0].conformance.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[0].conformance.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[0].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[1].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[1].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[1].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[1].conformance.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[1].conformance.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[1].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[2].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[2].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[2].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[2].conformance.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[2].conformance.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[2].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[3].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[3].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[3].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].map[3].conformance.rationaleFrom the verified qualification statement: 1 when every rule held, else 0 with the rules that broke.
            declarations.attestations[0].map[3].conformance.scoreFrom the verified qualification statement: 1 when every rule held, else 0 with the rules that broke.
            declarations.attestations[0].map[3].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.attestations[0].summaryEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.claims[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.claims[0].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.claims[0].predicateVerified signed record and its stored request; code claim also uses the file-set digest.
            declarations.claims[0].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.claims[0].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.claims[1].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.claims[1].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.claims[1].predicateVerified signed record and its stored request; code claim also uses the file-set digest.
            declarations.claims[1].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.claims[1].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.claims[2].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.claims[2].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.claims[2].predicateVerified signed record and its stored request; code claim also uses the file-set digest.
            declarations.claims[2].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.claims[2].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.claims[3].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.claims[3].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.claims[3].evidence[1]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.claims[3].predicateThe verified qualification statement: its judged file, scenario, every rule's outcome and the verdict.
            declarations.claims[3].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.claims[3].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.evidence[0].author.nameFixed envelope/statement/predicate type names plus key id = SHA-256 of the public key bytes.
            declarations.evidence[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.evidence[0].createdSigned record.ended_unix_ms, formatted in UTC with milliseconds.
            declarations.evidence[0].data[0].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
            declarations.evidence[0].data[0].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.evidence[0].data[0].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.evidence[0].data[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.evidence[0].data[1].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
            declarations.evidence[0].data[1].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.evidence[0].data[1].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.evidence[0].data[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.evidence[0].data[2].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
            declarations.evidence[0].data[2].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.evidence[0].data[2].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.evidence[0].data[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.evidence[0].data[3].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
            declarations.evidence[0].data[3].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.evidence[0].data[3].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.evidence[0].data[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.evidence[0].descriptionFixed envelope/statement/predicate type names plus key id = SHA-256 of the public key bytes.
            declarations.evidence[0].propertyNameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.evidence[1].author.nameFixed envelope/statement/predicate type names plus key id = SHA-256 of the public key bytes.
            declarations.evidence[1].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.evidence[1].createdSigned record.ended_unix_ms, formatted in UTC with milliseconds.
            declarations.evidence[1].data[0].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
            declarations.evidence[1].data[0].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.evidence[1].data[0].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.evidence[1].data[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            declarations.evidence[1].descriptionFixed envelope/statement/predicate type names plus key id = SHA-256 of the public key bytes.
            declarations.evidence[1].propertyNameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            definitions.standards[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            definitions.standards[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            definitions.standards[0].requirements[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            definitions.standards[0].requirements[0].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            definitions.standards[0].requirements[0].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            definitions.standards[0].requirements[1].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            definitions.standards[0].requirements[1].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            definitions.standards[0].requirements[1].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            definitions.standards[0].requirements[2].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            definitions.standards[0].requirements[2].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            definitions.standards[0].requirements[2].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            definitions.standards[0].requirements[3].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            definitions.standards[0].requirements[3].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            definitions.standards[0].requirements[3].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            definitions.standards[0].versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            formulation[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            formulation[0].workflows[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            formulation[0].workflows[0].inputs[0].resource.refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            formulation[0].workflows[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            formulation[0].workflows[0].outputs[0].properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            formulation[0].workflows[0].outputs[0].properties[0].valueSigned record: result_sha256.
            formulation[0].workflows[0].outputs[0].resource.refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            formulation[0].workflows[0].outputs[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            formulation[0].workflows[0].properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            formulation[0].workflows[0].properties[0].valueSigned record: provider.
            formulation[0].workflows[0].properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            formulation[0].workflows[0].properties[1].valueSigned record: isolation.
            formulation[0].workflows[0].properties[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            formulation[0].workflows[0].properties[2].valueStored request: minimum_isolation; the bundle link signs the exact stored bytes.
            formulation[0].workflows[0].properties[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            formulation[0].workflows[0].properties[3].valueStored request: timeout_ms; the bundle link signs the exact stored bytes.
            formulation[0].workflows[0].properties[4].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            formulation[0].workflows[0].properties[4].valueStored request.project.grant_profile, or none when it is empty.
            formulation[0].workflows[0].properties[5].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            formulation[0].workflows[0].properties[5].valueStored response.project.outcome.
            formulation[0].workflows[0].runtimeTopology[0].dependsOn[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            formulation[0].workflows[0].runtimeTopology[0].refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            formulation[0].workflows[0].taskDependencies[0].refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            formulation[0].workflows[0].taskTypes[0]Constant other: no task type was declared; the command supplies the name.
            formulation[0].workflows[0].tasks[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            formulation[0].workflows[0].tasks[0].nameStored request.project.steps[] equals stored response.project.steps[].command.
            formulation[0].workflows[0].tasks[0].steps[0].commands[0].executedStored request.project.steps[] equals stored response.project.steps[].command.
            formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[0].nameStored request.project.steps[] equals stored response.project.steps[].command.
            formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[0].valueStored response.project.steps[].exit_code; the bundle link signs the stored bytes.
            formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[1].nameStored request.project.steps[] equals stored response.project.steps[].command.
            formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[1].valueStored response.project.steps[].duration_ms; the bundle link signs the stored bytes.
            formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[2].nameStored request.project.steps[] equals stored response.project.steps[].command.
            formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[2].valueStored response.project.steps[].timed_out; the bundle link signs the stored bytes.
            formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[3].nameStored request.project.steps[] equals stored response.project.steps[].command.
            formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[3].valueStored response.project.steps[].stdout_truncated; the bundle link signs the stored bytes.
            formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[4].nameStored request.project.steps[] equals stored response.project.steps[].command.
            formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[4].valueStored response.project.steps[].stderr_truncated; the bundle link signs the stored bytes.
            formulation[0].workflows[0].tasks[0].taskTypes[0]Constant other: no task type was declared; the command supplies the name.
            formulation[0].workflows[0].tasks[0].uidSigned record.record_sha256 for the workflow; one-based result-step index for a task.
            formulation[0].workflows[0].timeEndSigned record.ended_unix_ms, formatted in UTC with milliseconds.
            formulation[0].workflows[0].timeStartSigned record.started_unix_ms, formatted in UTC with milliseconds.
            formulation[0].workflows[0].uidSigned record.record_sha256 for the workflow; one-based result-step index for a task.
            metadata.component.bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[0].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
            metadata.component.components[0].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[0].properties[0].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[0].properties[0].valueByte length of request.project.files[].content.
            metadata.component.components[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[1].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[1].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
            metadata.component.components[1].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[1].properties[0].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[1].properties[0].valueByte length of request.project.files[].content.
            metadata.component.components[1].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[2].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[2].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
            metadata.component.components[2].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[2].properties[0].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[2].properties[0].valueByte length of request.project.files[].content.
            metadata.component.components[2].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[3].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[3].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
            metadata.component.components[3].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[3].properties[0].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[3].properties[0].valueByte length of request.project.files[].content.
            metadata.component.components[3].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[4].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[4].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
            metadata.component.components[4].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[4].properties[0].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[4].properties[0].valueByte length of request.project.files[].content.
            metadata.component.components[4].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[5].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[5].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
            metadata.component.components[5].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[5].properties[0].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[5].properties[0].valueByte length of request.project.files[].content.
            metadata.component.components[5].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[6].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[6].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
            metadata.component.components[6].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[6].properties[0].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[6].properties[0].valueByte length of request.project.files[].content.
            metadata.component.components[6].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[7].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[7].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
            metadata.component.components[7].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[7].properties[0].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[7].properties[0].valueByte length of request.project.files[].content.
            metadata.component.components[7].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[8].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[8].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
            metadata.component.components[8].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[8].properties[0].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[8].properties[0].valueByte length of request.project.files[].content.
            metadata.component.components[8].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[9].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[9].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
            metadata.component.components[9].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[9].properties[0].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[9].properties[0].valueByte length of request.project.files[].content.
            metadata.component.components[9].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[10].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[10].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
            metadata.component.components[10].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[10].properties[0].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[10].properties[0].valueByte length of request.project.files[].content.
            metadata.component.components[10].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[11].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[11].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
            metadata.component.components[11].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[11].properties[0].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[11].properties[0].valueByte length of request.project.files[].content.
            metadata.component.components[11].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[12].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[12].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
            metadata.component.components[12].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[12].properties[0].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[12].properties[0].valueByte length of request.project.files[].content.
            metadata.component.components[12].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[13].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[13].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
            metadata.component.components[13].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[13].properties[0].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[13].properties[0].valueByte length of request.project.files[].content.
            metadata.component.components[13].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[14].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[14].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
            metadata.component.components[14].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[14].properties[0].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[14].properties[0].valueByte length of request.project.files[].content.
            metadata.component.components[14].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[15].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[15].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
            metadata.component.components[15].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[15].properties[0].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[15].properties[0].valueByte length of request.project.files[].content.
            metadata.component.components[15].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[16].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[16].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
            metadata.component.components[16].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[16].properties[0].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[16].properties[0].valueByte length of request.project.files[].content.
            metadata.component.components[16].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[17].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.components[17].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
            metadata.component.components[17].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[17].properties[0].nameStored request.project.files[].path, sorted by path.
            metadata.component.components[17].properties[0].valueByte length of request.project.files[].content.
            metadata.component.components[17].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.descriptionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.externalReferences[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.externalReferences[0].hashes[0].contentSHA-256 of the referenced complete bundle, or qualification file, bytes.
            metadata.component.externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.externalReferences[0].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
            metadata.component.externalReferences[1].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.externalReferences[1].hashes[0].contentSHA-256 of the referenced complete bundle, or qualification file, bytes.
            metadata.component.externalReferences[1].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.externalReferences[1].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
            metadata.component.externalReferences[2].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.externalReferences[2].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
            metadata.component.externalReferences[3].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.externalReferences[3].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
            metadata.component.hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.hashes[0].contentFile-set digest recomputed from the stored request's file paths and contents.
            metadata.component.nameUnsigned display label: -name, or the judged file's name for a run with a verdict.
            metadata.component.properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.properties[0].valueUnsigned supplied example context; the run record does not establish authorship.
            metadata.component.properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.properties[1].valueUnsigned supplied example context; the run record does not establish authorship.
            metadata.component.properties[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.properties[2].valueSigned record: request_sha256.
            metadata.component.properties[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.properties[3].valueSigned record: result_sha256.
            metadata.component.properties[4].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.properties[4].valueSigned record: record_sha256.
            metadata.component.properties[5].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.properties[5].valueStored request: trace_id; the bundle link signs the exact stored bytes.
            metadata.component.typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.component.versionFirst 12 hex characters of the file-set digest.
            metadata.lifecycles[0].phaseEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.timestampSigned record.ended_unix_ms, formatted in UTC with milliseconds.
            metadata.tools.components[0].externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.tools.components[0].externalReferences[0].urlEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.tools.components[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.tools.components[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            metadata.tools.components[0].versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            properties[0].valueSHA-256 of the complete bundle file the attached line belongs to.
            properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            properties[1].valueIndex the harness's signed link gives the attached bundle line.
            properties[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            properties[2].valueEmitter mapping constant.
            properties[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            properties[3].valueSHA-256 of the complete qualification file the attached statement belongs to.
            serialNumberFirst 16 bytes of SHA-256(plimsoll-sbom-serial + newline + record digest), UUID version/variant bits set.
            specVersionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
            Raw CycloneDX JSON
            {
              "annotations": [
                {
                  "annotator": {
                    "component": {
                      "externalReferences": [
                        {
                          "type": "vcs",
                          "url": "https://github.com/plimsollmark/plimsoll"
                        }
                      ],
                      "name": "plimsoll-sbom",
                      "type": "application",
                      "version": "0.2.0"
                    }
                  },
                  "bom-ref": "limits",
                  "subjects": [
                    "program"
                  ],
                  "text": "The attached run record is signed; this BOM is unsigned. Agent authorship is supplied example context, not a record fact, and the execution layer cannot identify the model. Network isolation is provider configuration, not a separately signed runtime measurement; a granted run reaches only the routes its grant lists, and what reached the other side is not in this record. The run's times are the daemon's own unwitnessed clock. An attached key alone establishes consistency, not signer identity; use an independently trusted key. Display names and the assessor label are unsigned presentation. The attached bundle line proves itself; the whole bundle it belongs to is referenced by digest and checked when supplied. This is run evidence, not an inventory of the image's installed packages. A qualification verdict is the platform's own signed account of one run against a simulated vendor, re-evaluated here from its evidence; it is not an independent audit, and the vendor's ledger is trusted as the signer read it.",
                  "timestamp": "2026-10-23T19:39:17.244Z"
                }
              ],
              "bomFormat": "CycloneDX",
              "components": [
                {
                  "bom-ref": "image",
                  "externalReferences": [
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "7e0b9a40e742f401e3a006a7362ebba1c5f3ac832107858dcf104d8f2b6de603"
                        }
                      ],
                      "type": "bom",
                      "url": "https://plimsollmark.github.io/plimsoll/examples/sbom/image-a6ef2ea1c8f1.cdx.json"
                    },
                    {
                      "type": "bom",
                      "url": "urn:cdx:f9bc9442-7192-4f59-9f06-38f71e427479/1#d13ed0dc05c4b68b"
                    }
                  ],
                  "hashes": [
                    {
                      "alg": "SHA-256",
                      "content": "a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c"
                    }
                  ],
                  "name": "sandbox",
                  "properties": [
                    {
                      "name": "plimsoll:environment",
                      "value": "docker-image:sha256:32da77b1be24de4c152667c28ab63531425cd69000acf30a328985cb857377f7"
                    },
                    {
                      "name": "plimsoll:software_identity",
                      "value": "oci-manifest:linux/amd64@sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c"
                    }
                  ],
                  "purl": "pkg:oci/sandbox@sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c",
                  "type": "container",
                  "version": "sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c"
                }
              ],
              "declarations": {
                "affirmation": {
                  "statement": "The attached run record was stated by plimsolld, checked and signed by plimsoll-attest, and restated here; plimsoll-attest verify and this program's -check recompute it. This affirmation and BOM are unsigned."
                },
                "assessors": [
                  {
                    "bom-ref": "assessor",
                    "organization": {
                      "name": "plimsoll examples (self-assessed)"
                    },
                    "thirdParty": false
                  }
                ],
                "attestations": [
                  {
                    "assessor": "assessor",
                    "map": [
                      {
                        "claims": [
                          "claim-code"
                        ],
                        "confidence": {
                          "rationale": "a signature check and a digest recomputation, not a judgement or a probability that the runtime assertion is true",
                          "score": 1
                        },
                        "conformance": {
                          "rationale": "The claim matches the signed exchange under a deterministic comparison; this is self-assessed consistency, not independent runtime assurance.",
                          "score": 1
                        },
                        "requirement": "req-code"
                      },
                      {
                        "claims": [
                          "claim-image"
                        ],
                        "confidence": {
                          "rationale": "a signature check and a digest recomputation, not a judgement or a probability that the runtime assertion is true",
                          "score": 1
                        },
                        "conformance": {
                          "rationale": "The claim matches the signed exchange under a deterministic comparison; this is self-assessed consistency, not independent runtime assurance.",
                          "score": 1
                        },
                        "requirement": "req-image"
                      },
                      {
                        "claims": [
                          "claim-tier"
                        ],
                        "confidence": {
                          "rationale": "a signature check and a digest recomputation, not a judgement or a probability that the runtime assertion is true",
                          "score": 1
                        },
                        "conformance": {
                          "rationale": "The claim matches the signed exchange under a deterministic comparison; this is self-assessed consistency, not independent runtime assurance.",
                          "score": 1
                        },
                        "requirement": "req-tier"
                      },
                      {
                        "claims": [
                          "claim-verdict"
                        ],
                        "confidence": {
                          "rationale": "a deterministic re-evaluation of the recorded evidence and a signature check, not a judgement or a probability",
                          "score": 1
                        },
                        "conformance": {
                          "rationale": "All 8 rules held when re-evaluated from the attached statement's evidence. The statement's subject is this run's signed record. Self-assessed by the platform against a simulated vendor, not an independent audit.",
                          "score": 1
                        },
                        "requirement": "req-verdict"
                      }
                    ],
                    "summary": "A self-assessed restatement of a signed run record with reproducible consistency checks."
                  }
                ],
                "claims": [
                  {
                    "bom-ref": "claim-code",
                    "evidence": [
                      "evidence-run-record"
                    ],
                    "predicate": "The program's 18 files, file-set digest 95675b6bf846dbb4dfef427f6ff50cfdb8d90ed11b10bbd5a199b6dba8b57267, are the files in the stored request whose signed digest 8cd7e9c60014ab20fb397cd9711d66b14cc3e7d0f0c3df0c80e00eb732938474 covers them with the isolation floor and timeout.",
                    "reasoning": "Each claim restates the run record the daemon stated and the attest harness checked against the stored request and result and signed. The attached bundle line permits those checks to be repeated. This emitter did not observe execution. The tier is configuration and provider evidence plus startup smoke tests, never runtime attestation.",
                    "target": "program"
                  },
                  {
                    "bom-ref": "claim-image",
                    "evidence": [
                      "evidence-run-record"
                    ],
                    "predicate": "The daemon states that the run executed in the image whose OCI manifest digest is sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c (environment docker-image:sha256:32da77b1be24de4c152667c28ab63531425cd69000acf30a328985cb857377f7), verified before launch.",
                    "reasoning": "Each claim restates the run record the daemon stated and the attest harness checked against the stored request and result and signed. The attached bundle line permits those checks to be repeated. This emitter did not observe execution. The tier is configuration and provider evidence plus startup smoke tests, never runtime attestation.",
                    "target": "program"
                  },
                  {
                    "bom-ref": "claim-tier",
                    "evidence": [
                      "evidence-run-record"
                    ],
                    "predicate": "The daemon states provider docker and isolation tier kernel, at or above requested floor container, from 2026-10-23T19:39:15.980Z to 2026-10-23T19:39:17.244Z UTC; the stored request names host-API grant profile fleet, the run's only route out, served by the daemon's broker, and the result digest is f25c53ca4ae0ec3952550052583870a414d6cdea29648a8096a771c325e379ed. Network beyond the grant is provider configuration; this record is not a network measurement.",
                    "reasoning": "Each claim restates the run record the daemon stated and the attest harness checked against the stored request and result and signed. The attached bundle line permits those checks to be repeated. This emitter did not observe execution. The tier is configuration and provider evidence plus startup smoke tests, never runtime attestation.",
                    "target": "program"
                  },
                  {
                    "bom-ref": "claim-verdict",
                    "evidence": [
                      "evidence-qualification",
                      "evidence-run-record"
                    ],
                    "predicate": "The platform's qualification statement, bound to this run's record, judges adapter-v2.js (SHA-256 4085bb2e4900ee3becc6c308de1a927d073f0a9746923183ce839a6429921330) in scenario nominal (three idle robots; every order can complete) by 8 rules read from the vendor's ledger, the vendor's record of its robots and the harness's plan, never from the program's own account: ran to the end: held; kept the contract's shapes: held; the inventory is the vendor's: held; one order per command: held; the right robot and target: held; ended as it should: held; robot at the target: held; the report is true: held. Verdict: pass.",
                    "reasoning": "The verdict is recomputed from the attached statement's evidence by the same rules the platform applied; the statement's seal is checked under the attached key, its subject is this run's signed record, and the files, step, report and exit code it names are checked against the stored request and response. The ledger is the simulated vendor's account as the platform read it; trusting it is trusting the signer.",
                    "target": "program"
                  }
                ],
                "evidence": [
                  {
                    "author": {
                      "name": "plimsoll-attest key 2368e6af86fb7984c52ea36b04298aafc498a7461f116e0e998efed702974567"
                    },
                    "bom-ref": "evidence-run-record",
                    "created": "2026-10-23T19:39:17.244Z",
                    "data": [
                      {
                        "contents": {
                          "attachment": {
                            "content": "eyJwYXlsb2FkVHlwZSI6ImFwcGxpY2F0aW9uL3ZuZC5pbi10b3RvK2pzb24iLCJwYXlsb2FkIjoiZXlKZmRIbHdaU0k2SW1oMGRIQnpPaTh2YVc0dGRHOTBieTVwYnk5VGRHRjBaVzFsYm5RdmRqRWlMQ0p6ZFdKcVpXTjBJanBiZXlKdVlXMWxJam9pY25WdUxYSmxZMjl5WkNJc0ltUnBaMlZ6ZENJNmV5SnphR0V5TlRZaU9pSTBZelk1WWpWaE16aG1Namt3WWpJMFlqZ3lZelJoTW1OaU0yTXdNVEJsTnpGaE9EaG1NbVV3WXpRM05HVTFOV1E0TTJOa1pEZGxZVFUwWm1ZNFlqWmtJbjE5WFN3aWNISmxaR2xqWVhSbFZIbHdaU0k2SW1oMGRIQnpPaTh2Y0d4cGJYTnZiR3h0WVhKckxtZHBkR2gxWWk1cGJ5OXdiR2x0YzI5c2JDOXlkVzR0Y21WamIzSmtMM1l4SWl3aWNISmxaR2xqWVhSbElqcDdJblpsY25OcGIyNGlPalFzSW5KbGNYVmxjM1JmYzJoaE1qVTJJam9pT0dOa04yVTVZell3TURFMFlXSXlNR1ppTXprM1kyUTVOekV4WkRZMllqRTBZMk16WlRka01HWXdZek5rWmpCak9EQmxNREJsWWpjek1qa3pPRFEzTkNJc0luSmxjM1ZzZEY5emFHRXlOVFlpT2lKbU1qVmpOVE5qWVRSaFpUQmxZek01TlRJMU5UQXdOVEkxT0RNNE56QmhOREUwWkRaalpHVmhNamsyTkRoaE9EQTVObUUzTnpGak16STFaVE0zT1dWa0lpd2ljSEp2ZG1sa1pYSWlPaUprYjJOclpYSWlMQ0pwYzI5c1lYUnBiMjRpT2lKclpYSnVaV3dpTENKbGJuWnBjbTl1YldWdWRDSTZJbVJ2WTJ0bGNpMXBiV0ZuWlRwemFHRXlOVFk2TXpKa1lUYzNZakZpWlRJMFpHVTBZekUxTWpZMk4yTXlPR0ZpTmpNMU16RTBNalZqWkRZNU1EQXdZV05tTXpCaE16STRPVGcxWTJJNE5UY3pOemRtTnlJc0luTnZablIzWVhKbFgybGtaVzUwYVhSNUlqb2liMk5wTFcxaGJtbG1aWE4wT214cGJuVjRMMkZ0WkRZMFFITm9ZVEkxTmpwaE5tVm1NbVZoTVdNNFpqRmtaVFZqT0RnMVpURmhNVGhpWVRkbFpUUmtPVFl5WlROaE9EVTVPRGMzWmpabU5EWmpNbVppTjJWaVlXTXhaalpqWXpWaklpd2ljRzlzYVdONUlqb2lJaXdpYzNSaGNuUmxaRjkxYm1sNFgyMXpJam94TnpreU56ZzBNelUxT1Rnd0xDSmxibVJsWkY5MWJtbDRYMjF6SWpveE56a3lOemcwTXpVM01qUTBMQ0p6WlhOemFXOXVJam9pSWl3aWMyVnhkV1Z1WTJVaU9qQXNJbkJ5WlhacGIzVnpYM05vWVRJMU5pSTZJaUlzSW5KbFkyOXlaRjl6YUdFeU5UWWlPaUkwWXpZNVlqVmhNemhtTWprd1lqSTBZamd5WXpSaE1tTmlNMk13TVRCbE56RmhPRGhtTW1Vd1l6UTNOR1UxTldRNE0yTmtaRGRsWVRVMFptWTRZalprSW4xOSIsInNpZ25hdHVyZXMiOlt7ImtleWlkIjoiMjM2OGU2YWY4NmZiNzk4NGM1MmVhMzZiMDQyOThhYWZjNDk4YTc0NjFmMTE2ZTBlOTk4ZWZlZDcwMjk3NDU2NyIsInNpZyI6Ii9YRkZjOVZ5OCtWV0RsZnJQU1lhckZLTjBPaStXVXRyRE5COGxITlpIWUt0ODl2dVhUNVFQTGpkYmFaWWl1cUhIT3BwY3BsWVp0dllnQndPRFpTM0NBPT0ifV19",
                            "contentType": "application/json",
                            "encoding": "base64"
                          }
                        },
                        "name": "envelope.json"
                      },
                      {
                        "contents": {
                          "attachment": {
                            "content": "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUNvd0JRWURLMlZ3QXlFQUcvRDIySjJBVm1RSzQ0RFUvOUpjYytSM01BaG5Oa09TUnJNMWVxTVBwN1k9Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo=",
                            "contentType": "application/x-pem-file",
                            "encoding": "base64"
                          }
                        },
                        "name": "harness.pub"
                      },
                      {
                        "contents": {
                          "attachment": {
                            "content": "eyJyZXF1ZXN0IjoiQ0FRU0NXTnZiblJoYVc1bGNob09ZV1JoY0hSbGNpMXlkVzR0TVRBZ2tMOEZXdjZFQWdxQUpRb0thR0Z5Ym1WemN5NXFjeEx4SkM4dklGUm9aU0J3YkdGMFptOXliU2R6SUdOdmJtWnZjbTFoYm1ObElHaGhjbTVsYzNNNklHeHZZV1J6SUdFZ2RtVnVaRzl5SUdGa1lYQjBaWElzSUhKMWJuTWdkR2hsSUdOdmJXMWhibVJ6SUc5bUNpOHZJSEJzWVc0dWFuTnZiaUIwYUhKdmRXZG9JR2wwSUdGbllXbHVjM1FnZEdobElIWmxibVJ2Y2lCQlVFa2dkR2hsSUhKMWJpZHpJR2R5WVc1MElISmxZV05vWlhNc0lHRnVaQ0J3Y21sdWRITWdiMjVsQ2k4dklISmxjRzl5ZENCc2FXNWxMZ292THdvdkx5QWdJRzV2WkdVZ2FHRnlibVZ6Y3k1cWN5QThjMk5sYm1GeWFXOCtJRHhoWkdGd2RHVnlJR1pwYkdVK0NpOHZDaTh2SUZSb1pTQm9ZWEp1WlhOeklHbHpJSFJvWlNCd2JHRjBabTl5YlNkeklHTnZaR1U3SUhSb1pTQmhaR0Z3ZEdWeUlHbHpJSFJvWlNCaFoyVnVkQ2R6TGlCQ2IzUm9JSEoxYmlCcGJuTnBaR1VnZEdobENpOHZJSE5oYm1SaWIzZ3NJR2x1SUc5dVpTQndjbTlqWlhOekxDQmhibVFnZEdobElHOXViSGtnZDJGNUlHOTFkQ0JwY3lCMGFHVWdhVzVxWldOMFpXUWdZR1pzWldWMFlDQmpiR2xsYm5RdUlGTnZJSFJvWlFvdkx5QnlaWEJ2Y25RZ2FYTWdkR2hsSUdGa1lYQjBaWEluY3lCamJHRnBiVG9nZEdobElIWmxjbVJwWTNRZ2FYTWdiV0ZrWlNCdmJpQjBhR1VnYUc5emRDd2dabkp2YlNCMGFHVWdjR3hoYmlCaGJtUWdkR2hsQ2k4dklIWmxibVJ2Y2lkeklHeGxaR2RsY2k0Z1ZHaGxJSE5qWlc1aGNtbHZJR0Z5WjNWdFpXNTBJR2x6SUc5dWJIa2djbVZqYjNKa1pXUTdJSFJvWlNCb1lYSnVaWE56SUdSdlpYTWdibTkwSUd0dWIzY0tMeThnZDJoaGRDQjBhR1VnZG1WdVpHOXlJSGRwYkd3Z1pHOHVDaUoxYzJVZ2MzUnlhV04wSWpzS0NtTnZibk4wSUdaeklEMGdjbVZ4ZFdseVpTZ2labk1pS1RzS0NtTnZibk4wSUhOalpXNWhjbWx2SUQwZ2NISnZZMlZ6Y3k1aGNtZDJXekpkT3dwamIyNXpkQ0JoWkdGd2RHVnlSbWxzWlNBOUlIQnliMk5sYzNNdVlYSm5kbHN6WFRzS0NtTnZibk4wSUhKbGNHOXlkQ0E5SUhzZ2MyTmxibUZ5YVc4c0lHRmtZWEIwWlhJNklHRmtZWEIwWlhKR2FXeGxMQ0JqYjIxd2JHVjBaV1E2SUdaaGJITmxMQ0JqYjIxdFlXNWtjem9nVzEwc0lHbHVkbVZ1ZEc5eWFXVnpPaUJiWFN3Z2NHOXNiSE02SURBc0lISmxkSEpwWlhNNklEQXNJR1Z5Y205eWN6b2dXMTBnZlRzS1kyOXVjM1FnWm1GcGJDQTlJQ2h0YzJjcElEMCtJSHNnY21Wd2IzSjBMbVZ5Y205eWN5NXdkWE5vS0cxelp5azdJSDA3Q21OdmJuTjBJR1pwYm1semFDQTlJQ2hqYjJSbEtTQTlQaUI3SUdOdmJuTnZiR1V1Ykc5bktDSkJSRUZRVkVWU0xWSkZVRTlTVkNBaUlDc2dTbE5QVGk1emRISnBibWRwWm5rb2NtVndiM0owS1NrN0lIQnliMk5sYzNNdVpYaHBkQ2hqYjJSbEtUc2dmVHNLWTI5dWMzUWdaWEp5YjNKUFppQTlJQ2hsS1NBOVBpQW9leUJsY25KdmNqb2dVM1J5YVc1bktDaGxJQ1ltSUdVdWJXVnpjMkZuWlNrZ2ZId2daU2t1YzJ4cFkyVW9NQ3dnTWpBd0tTd2dZMjlrWlRvZ0tHVWdKaVlnZEhsd1pXOW1JR1V1WTI5a1pTQTlQVDBnSW5OMGNtbHVaeUlwSUQ4Z1pTNWpiMlJsSURvZ0lpSWdmU2s3Q2k4dklGZG9ZWFFnZEdobElHRmtZWEIwWlhJZ2NtVjBkWEp1WldRc0lHRnpJRXBUVDA0c0lITnZJSFJvWlNCb2IzTjBJR05oYmlCamFHVmpheUJwZEhNZ2MyaGhjR1U2SUc1bGRtVnlJR3AxWkdkbFpDQm9aWEpsTGdwamIyNXpkQ0J5WVhjZ1BTQW9kaWtnUFQ0Z2V3b2dJR2xtSUNoMklEMDlQU0IxYm1SbFptbHVaV1FwSUhKbGRIVnliaUJ1ZFd4c093b2dJSFJ5ZVNCN0lHTnZibk4wSUhNZ1BTQktVMDlPTG5OMGNtbHVaMmxtZVNoMktUc2djbVYwZFhKdUlITXViR1Z1WjNSb0lEdzlJRFF3T1RZZ1B5QktVMDlPTG5CaGNuTmxLSE1wSURvZ2V5QjBjblZ1WTJGMFpXUTZJSE11YkdWdVozUm9JSDA3SUgwZ1kyRjBZMmdnS0dVcElIc2djbVYwZFhKdUlIc2dkVzV6WlhKcFlXeHBlbUZpYkdVNklGTjBjbWx1WnlobElDWW1JR1V1YldWemMyRm5aU2tnZlRzZ2ZRcDlPd29LWTI5dWMzUWdaM1ZoY21RZ1BTQnpaWFJVYVcxbGIzVjBLQ2dwSUQwK0lIc2dabUZwYkNnaWFHRnlibVZ6Y3lCMGFXMWxiM1YwSUdGbWRHVnlJRGMxSUhNaUtUc2dabWx1YVhOb0tESXBPeUI5TENBM05UQXdNQ2s3Q21kMVlYSmtMblZ1Y21WbUtDazdDZ3BoYzNsdVl5Qm1kVzVqZEdsdmJpQnRZV2x1S0NrZ2V3b2dJR2xtSUNnaGMyTmxibUZ5YVc4Z2ZId2dJV0ZrWVhCMFpYSkdhV3hsS1NCN0lHWmhhV3dvSW5WellXZGxPaUJ1YjJSbElHaGhjbTVsYzNNdWFuTWdQSE5qWlc1aGNtbHZQaUE4WVdSaGNIUmxjaUJtYVd4bFBpSXBPeUJ5WlhSMWNtNGdabWx1YVhOb0tESXBPeUI5Q2lBZ2FXWWdLSFI1Y0dWdlppQm5iRzlpWVd4VWFHbHpMbVpzWldWMElDRTlQU0FpYjJKcVpXTjBJaWtnZXlCbVlXbHNLQ0p1YnlCbWJHVmxkQ0JqYkdsbGJuUWdhVzRnZEdocGN5QnlkVzQ2SUhSb1pTQm5jbUZ1ZENCcGN5QnRhWE56YVc1bklpazdJSEpsZEhWeWJpQm1hVzVwYzJnb01pazdJSDBLSUNCc1pYUWdjR3hoYmpzS0lDQjBjbmtnZXlCd2JHRnVJRDBnU2xOUFRpNXdZWEp6WlNobWN5NXlaV0ZrUm1sc1pWTjVibU1vSW5Cc1lXNHVhbk52YmlJc0lDSjFkR1k0SWlrcE95QjlJR05oZEdOb0lDaGxLU0I3SUdaaGFXd29JbkJzWVc0dWFuTnZiam9nSWlBcklHVXViV1Z6YzJGblpTazdJSEpsZEhWeWJpQm1hVzVwYzJnb01pazdJSDBLSUNCc1pYUWdZV1JoY0hSbGNqc0tJQ0IwY25rZ2V5QmhaR0Z3ZEdWeUlEMGdjbVZ4ZFdseVpTZ2lMaThpSUNzZ1lXUmhjSFJsY2tacGJHVXBPeUI5SUdOaGRHTm9JQ2hsS1NCN0lHWmhhV3dvSW1Ga1lYQjBaWElnWm1GcGJHVmtJSFJ2SUd4dllXUTZJQ0lnS3lCbExtMWxjM05oWjJVcE95QnlaWFIxY200Z1ptbHVhWE5vS0RFcE95QjlDaUFnWm05eUlDaGpiMjV6ZENCbWJpQnZaaUJiSW1sdWRtVnVkRzl5ZVNJc0lDSmthWE53WVhSamFDSXNJQ0ozWVdsMElpd2dJbU5oYm1ObGJDSmRLU0I3Q2lBZ0lDQnBaaUFvZEhsd1pXOW1JR0ZrWVhCMFpYSmJabTVkSUNFOVBTQWlablZ1WTNScGIyNGlLU0I3SUdaaGFXd29JbUZrWVhCMFpYSWdaRzlsY3lCdWIzUWdaWGh3YjNKMElDSWdLeUJtYmlrN0lIMEtJQ0I5Q2lBZ2FXWWdLSEpsY0c5eWRDNWxjbkp2Y25NdWJHVnVaM1JvS1NCeVpYUjFjbTRnWm1sdWFYTm9LREVwT3dvS0lDQXZMeUF4TGlCSmJuWmxiblJ2Y25rc0lISmxZMjl5WkdWa0lHRnpJSEpsZEhWeWJtVmtMZ29nSUdOdmJuTjBJSFJoYTJWSmJuWmxiblJ2Y25rZ1BTQmhjM2x1WXlBb0tTQTlQaUI3Q2lBZ0lDQjBjbmtnZXlCeVpYQnZjblF1YVc1MlpXNTBiM0pwWlhNdWNIVnphQ2g3SUhKbGRIVnlibVZrT2lCeVlYY29ZWGRoYVhRZ1lXUmhjSFJsY2k1cGJuWmxiblJ2Y25rb0tTa3NJR1Z5Y205eU9pQWlJaUI5S1RzZ2ZRb2dJQ0FnWTJGMFkyZ2dLR1VwSUhzZ2NtVndiM0owTG1sdWRtVnVkRzl5YVdWekxuQjFjMmdvZXlCeVpYUjFjbTVsWkRvZ2JuVnNiQ3dnWlhKeWIzSTZJR1Z5Y205eVQyWW9aU2t1WlhKeWIzSWdmU2s3SUgwS0lDQjlPd29nSUdGM1lXbDBJSFJoYTJWSmJuWmxiblJ2Y25rb0tUc0tDaUFnTHk4Z01pNGdSR2x6Y0dGMFkyZ2daWFpsY25rZ1kyOXRiV0Z1WkN3Z2RHaGxiaUIzWVdsMElHWnZjaUJsWVdOb0lHMXBjM05wYjI0dUlFRnVJR1Z5Y205eUlIUm9aU0JoWkdGd2RHVnlJSFJvY205M2N3b2dJQzh2SUNBZ0lHbHpJSEpsWTI5eVpHVmtJR0ZuWVdsdWMzUWdhWFJ6SUdOdmJXMWhibVFzSUdGdVpDQjBhR1VnY25WdUlHZHZaWE1nYjI0dUNpQWdZMjl1YzNRZ2NtOTNjeUE5SUhCc1lXNHVZMjl0YldGdVpITXViV0Z3S0NoaktTQTlQaUFvZXlCcFpEb2dZeTVwWkN3Z2NtOWliM1E2SUdNdWNtOWliM1FzSUcxcGMzTnBiMjQ2SUNJaUxDQmthWE53WVhSamFHVmtPaUJ1ZFd4c0xDQnpkR0YwWlRvZ0lpSXNJSEJ2Ykd4ek9pQXdMQ0J0WVhoZmNHOXNiSE02SURBc0lIZGhhWFJsWkRvZ2JuVnNiQ3dnWlhKeWIzSTZJQ0lpTENCamIyUmxPaUFpSWlCOUtTazdDaUFnY21Wd2IzSjBMbU52YlcxaGJtUnpJRDBnY205M2N6c0tJQ0JqYjI1emRDQnpaVzVrSUQwZ1lYTjVibU1nS0dNc0lISnZkeWtnUFQ0Z2V3b2dJQ0FnZEhKNUlIc0tJQ0FnSUNBZ1kyOXVjM1FnYlNBOUlHRjNZV2wwSUdGa1lYQjBaWEl1WkdsemNHRjBZMmdvWXk1eWIySnZkQ3dnWXk1MFlYSm5aWFFzSUdNdWFXUXBPd29nSUNBZ0lDQnliM2N1WkdsemNHRjBZMmhsWkNBOUlISmhkeWh0S1RzS0lDQWdJQ0FnYVdZZ0tIUjVjR1Z2WmlCdElEMDlQU0FpYzNSeWFXNW5JaUFtSmlCdElDRTlQU0FpSWlrZ2NtOTNMbTFwYzNOcGIyNGdQU0J0T3dvZ0lDQWdmU0JqWVhSamFDQW9aU2tnZXlCUFltcGxZM1F1WVhOemFXZHVLSEp2ZHl3Z1pYSnliM0pQWmlobEtTazdJSDBLSUNCOU93b2dJR052Ym5OMElIZGhkR05vSUQwZ1lYTjVibU1nS0hKdmR5d2diV0Y0VUc5c2JITXBJRDArSUhzS0lDQWdJR2xtSUNnaGNtOTNMbTFwYzNOcGIyNHBJSEpsZEhWeWJqc0tJQ0FnSUhKdmR5NXRZWGhmY0c5c2JITWdQU0J0WVhoUWIyeHNjenNLSUNBZ0lIUnllU0I3Q2lBZ0lDQWdJR052Ym5OMElIY2dQU0JoZDJGcGRDQmhaR0Z3ZEdWeUxuZGhhWFFvY205M0xtMXBjM05wYjI0c0lIc2diV0Y0VUc5c2JITWdmU2s3Q2lBZ0lDQWdJSEp2ZHk1M1lXbDBaV1FnUFNCeVlYY29keWs3Q2lBZ0lDQWdJSEp2ZHk1emRHRjBaU0E5SUNoM0lDWW1JSFI1Y0dWdlppQjNMbk4wWVhSbElEMDlQU0FpYzNSeWFXNW5JaWtnUHlCM0xuTjBZWFJsSURvZ0lpSTdDaUFnSUNBZ0lISnZkeTV3YjJ4c2N5QTlJQ2gzSUNZbUlIUjVjR1Z2WmlCM0xuQnZiR3h6SUQwOVBTQWliblZ0WW1WeUlpa2dQeUIzTG5CdmJHeHpJRG9nTURzS0lDQWdJQ0FnY21Wd2IzSjBMbkJ2Ykd4eklDczlJSEp2ZHk1d2IyeHNjenNLSUNBZ0lDQWdhV1lnS0hjZ0ppWWdkSGx3Wlc5bUlIY3VjbVYwY21sbGN5QTlQVDBnSW01MWJXSmxjaUlwSUhKbGNHOXlkQzV5WlhSeWFXVnpJRDBnVFdGMGFDNXRZWGdvY21Wd2IzSjBMbkpsZEhKcFpYTXNJSGN1Y21WMGNtbGxjeWs3Q2lBZ0lDQjlJR05oZEdOb0lDaGxLU0I3SUU5aWFtVmpkQzVoYzNOcFoyNG9jbTkzTENCbGNuSnZjazltS0dVcEtUc2dmUW9nSUgwN0NpQWdabTl5SUNoc1pYUWdhU0E5SURBN0lHa2dQQ0J3YkdGdUxtTnZiVzFoYm1SekxteGxibWQwYURzZ2FTc3JLU0JwWmlBb0lYQnNZVzR1WTI5dGJXRnVaSE5iYVYwdVkyRnVZMlZzS1NCaGQyRnBkQ0J6Wlc1a0tIQnNZVzR1WTI5dGJXRnVaSE5iYVYwc0lISnZkM05iYVYwcE93b2dJQzh2SUZSb1pTQnlaV0ZrSUdKMVpHZGxkSE1zSURRd0lHRnVaQ0ExSUdKbGJHOTNMQ0JoY21VZ2NYVmhiR2xtZVM1WFlXbDBRblZrWjJWMElHRnVaQ0JEWVc1alpXeFhZV2wwUW5Wa1oyVjBMZ29nSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2NHeGhiaTVqYjIxdFlXNWtjeTVzWlc1bmRHZzdJR2tyS3lrZ2FXWWdLQ0Z3YkdGdUxtTnZiVzFoYm1SelcybGRMbU5oYm1ObGJDa2dZWGRoYVhRZ2QyRjBZMmdvY205M2MxdHBYU3dnTkRBcE93b0tJQ0F2THlBekxpQlVhR1VnWTI5dGJXRnVaSE1nZEdobElIQnNZWFJtYjNKdElHTmhibU5sYkhNNklHUnBjM0JoZEdOb0xDQmpZVzVqWld3Z1lYUWdiMjVqWlN3Z2RHaGxiaUIzWVdsMExnb2dJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnY0d4aGJpNWpiMjF0WVc1a2N5NXNaVzVuZEdnN0lHa3JLeWtnZXdvZ0lDQWdhV1lnS0NGd2JHRnVMbU52YlcxaGJtUnpXMmxkTG1OaGJtTmxiQ2tnWTI5dWRHbHVkV1U3Q2lBZ0lDQmhkMkZwZENCelpXNWtLSEJzWVc0dVkyOXRiV0Z1WkhOYmFWMHNJSEp2ZDNOYmFWMHBPd29nSUNBZ2FXWWdLSEp2ZDNOYmFWMHViV2x6YzJsdmJpa2dld29nSUNBZ0lDQjBjbmtnZXlCaGQyRnBkQ0JoWkdGd2RHVnlMbU5oYm1ObGJDaHliM2R6VzJsZExtMXBjM05wYjI0cE95QjlJR05oZEdOb0lDaGxLU0I3SUU5aWFtVmpkQzVoYzNOcFoyNG9jbTkzYzF0cFhTd2daWEp5YjNKUFppaGxLU2s3SUgwS0lDQWdJQ0FnWVhkaGFYUWdkMkYwWTJnb2NtOTNjMXRwWFN3Z05TazdDaUFnSUNCOUNpQWdmUW9LSUNBdkx5QTBMaUJKYm5abGJuUnZjbmtnWVdkaGFXNHNJR0Z6SUhSb1pTQnNZWE4wSUdOaGJHd2diMllnZEdobElISjFiaTRLSUNCaGQyRnBkQ0IwWVd0bFNXNTJaVzUwYjNKNUtDazdDZ29nSUhKbGNHOXlkQzVqYjIxd2JHVjBaV1FnUFNCeVpYQnZjblF1WlhKeWIzSnpMbXhsYm1kMGFDQTlQVDBnTURzS0lDQm1hVzVwYzJnb2NtVndiM0owTG1OdmJYQnNaWFJsWkNBL0lEQWdPaUF4S1RzS2ZRb0tiV0ZwYmlncExtTmhkR05vS0NobEtTQTlQaUI3SUdaaGFXd29JbWhoY201bGMzTWdaWEp5YjNJNklDSWdLeUFvWlNBbUppQmxMbTFsYzNOaFoyVXBLVHNnWm1sdWFYTm9LREVwT3lCOUtUc0tDcnNSQ2cxaFpHRndkR1Z5TFhZeExtcHpFcWtSTHk4Z1JteGxaWFFnZG1WdVpHOXlJR0ZrWVhCMFpYSXNJR1pwY25OMElIWmxjbk5wYjI0c0lIZHlhWFIwWlc0Z1puSnZiU0JRVWs5TlVGUXViV1FnS0hSb1pTQmpiMjUwY21GamRDQmhibVFnZEdobENpOHZJR1JsYzJOeWFYQjBhVzl1SUdkbGJtVnlZWFJsWkNCbWNtOXRJSFJvWlNCMlpXNWtiM0luY3lCUGNHVnVRVkJKSUdSdlkzVnRaVzUwSUdGeklIUm9aWGtnYzNSdmIyUWdkR2hsYmlrZ1lua2dkR2hsQ2k4dklFRkpJSFJvWVhRZ1luVnBiSFFnZEdocGN5QmxlR0Z0Y0d4bExDQnBiaUIwYUdVZ2MyRnRaU0J6WlhOemFXOXVMQ0JpWldadmNtVWdkR2hsSUd4dmMzUXRZV05yYm05M2JHVmtaMlZ0Wlc1MENpOHZJSE5qWlc1aGNtbHZJR1Y0YVhOMFpXUXVJRWwwSUdseklHNXZkQ0JoYmlCcGJtUmxjR1Z1WkdWdWRDQmhaMlZ1ZENkeklHRnVjM2RsY2pvZ2FYUnpJR0YxZEdodmNpQmhiSE52SUhkeWIzUmxJSFJvWlFvdkx5Qm9ZWEp1WlhOekxpQkpkSE1nWTI5a1pTQnBjeUIxYm1Ob1lXNW5aV1FnYzJsdVkyVWdhWFFnZDJGeklHWnBjbk4wSUdOdmJXMXBkSFJsWkRzZ2IyNXNlU0IwYUdseklHTnZiVzFsYm5RZ2QyRnpDaTh2SUdOdmNuSmxZM1JsWkM0Z1NYUnpJR2x1ZG1WdWRHOXllU2dwSUd4cGMzUnpJSFJvWlNCeWIySnZkSE1zSUhSb1pXNGdjbVZoWkhNZ1pXRmphQ0J2Ym1VZ1ptOXlJR2wwY3lCemRHRjBaVG9nYjI1bENpOHZJSEpsY1hWbGMzUWdjR1Z5SUhKdlltOTBMaUJKZEhNZ1pHbHpjR0YwWTJnb0tTQndjbVZrWVhSbGN5QjBhR1VnWTI5dGJXRnVaQ0JKUkNCaGJtUWdhV2R1YjNKbGN5QnBkQzRLSW5WelpTQnpkSEpwWTNRaU93b0tZMjl1YzNRZ2MyeGxaWEFnUFNBb2JYTXBJRDArSUc1bGR5QlFjbTl0YVhObEtDaHlaWE52YkhabEtTQTlQaUJ6WlhSVWFXMWxiM1YwS0hKbGMyOXNkbVVzSUcxektTazdDbXhsZENCeVpYUnlhV1Z6SUQwZ01Ec0tDaTh2SUZSb1pTQjJaVzVrYjNJZ1lXNXpkMlZ5Y3lBMU1ETWdkMmhwYkdVZ2FYUWdhWE1nWkdWbmNtRmtaV1E3SUhkaGFYUWdZU0JzYVhSMGJHVWdZVzVrSUhSeWVTQmhaMkZwYml3Z1lTQmliM1Z1WkdWa0NpOHZJRzUxYldKbGNpQnZaaUIwYVcxbGN5NGdRVzU1SUc5MGFHVnlJR1Z5Y205eUlHbHpJSFJvWlNCallXeHNaWEluY3lCMGJ5QnpaV1V1Q21GemVXNWpJR1oxYm1OMGFXOXVJSGRwZEdoU1pYUnllU2htYmlrZ2V3b2dJR1p2Y2lBb2JHVjBJR0YwZEdWdGNIUWdQU0F3T3lBN0lHRjBkR1Z0Y0hRckt5a2dld29nSUNBZ2RISjVJSHNLSUNBZ0lDQWdjbVYwZFhKdUlHRjNZV2wwSUdadUtDazdDaUFnSUNCOUlHTmhkR05vSUNobEtTQjdDaUFnSUNBZ0lHTnZibk4wSUhSeVlXNXphV1Z1ZENBOUlDOW9iM04wSUdGd2FTQW9OVEF6ZkRReU9Ta3ZMblJsYzNRb1UzUnlhVzVuS0dVZ0ppWWdaUzV0WlhOellXZGxLU2s3Q2lBZ0lDQWdJR2xtSUNnaGRISmhibk5wWlc1MElIeDhJR0YwZEdWdGNIUWdQajBnTkRBcElIUm9jbTkzSUdVN0NpQWdJQ0FnSUhKbGRISnBaWE1yS3pzS0lDQWdJQ0FnWVhkaGFYUWdjMnhsWlhBb01qVXdLVHNLSUNBZ0lIMEtJQ0I5Q24wS0NtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ2V3b2dJR0Z6ZVc1aklHbHVkbVZ1ZEc5eWVTZ3BJSHNLSUNBZ0lHTnZibk4wSUd4cGMzUWdQU0JoZDJGcGRDQjNhWFJvVW1WMGNua29LQ2tnUFQ0Z1pteGxaWFF1YkdsemRGSnZZbTkwY3lncEtUc0tJQ0FnSUdOdmJuTjBJRzkxZENBOUlGdGRPd29nSUNBZ1ptOXlJQ2hqYjI1emRDQnpkVzF0WVhKNUlHOW1JR3hwYzNRdWNtOWliM1J6S1NCN0NpQWdJQ0FnSUdOdmJuTjBJSEp2WW05MElEMGdZWGRoYVhRZ2QybDBhRkpsZEhKNUtDZ3BJRDArSUdac1pXVjBMbWRsZEZKdlltOTBLSE4xYlcxaGNua3VhV1FwS1RzS0lDQWdJQ0FnYjNWMExuQjFjMmdvZXlCcFpEb2djbTlpYjNRdWFXUXNJSE4wWVhSMWN6b2djbTlpYjNRdWMzUmhkSFZ6TENCaVlYUjBaWEo1T2lCeWIySnZkQzVpWVhSMFpYSjVJSDBwT3dvZ0lDQWdmUW9nSUNBZ2NtVjBkWEp1SUc5MWREc0tJQ0I5TEFvS0lDQmhjM2x1WXlCa2FYTndZWFJqYUNoeWIySnZkRWxrTENCMFlYSm5aWFFwSUhzS0lDQWdJR052Ym5OMElHMXBjM05wYjI0Z1BTQmhkMkZwZENCM2FYUm9VbVYwY25rb0tDa2dQVDRnWm14bFpYUXVZM0psWVhSbFRXbHpjMmx2YmloeWIySnZkRWxrTENCN0lIUmhjbWRsZENCOUtTazdDaUFnSUNCeVpYUjFjbTRnYldsemMybHZiaTV0YVhOemFXOXVYMmxrT3dvZ0lIMHNDZ29nSUdGemVXNWpJSGRoYVhRb2JXbHpjMmx2Ymtsa0xDQnZjSFJ6S1NCN0NpQWdJQ0JqYjI1emRDQnRZWGhRYjJ4c2N5QTlJQ2h2Y0hSeklDWW1JRzl3ZEhNdWJXRjRVRzlzYkhNcElIeDhJRFV3T3dvZ0lDQWdabTl5SUNoc1pYUWdjRzlzYkhNZ1BTQXhPeUJ3YjJ4c2N5QThQU0J0WVhoUWIyeHNjenNnY0c5c2JITXJLeWtnZXdvZ0lDQWdJQ0JqYjI1emRDQnRhWE56YVc5dUlEMGdZWGRoYVhRZ2QybDBhRkpsZEhKNUtDZ3BJRDArSUdac1pXVjBMbWRsZEUxcGMzTnBiMjRvYldsemMybHZia2xrS1NrN0NpQWdJQ0FnSUdsbUlDaHRhWE56YVc5dUxuTjBZWFIxY3lBOVBUMGdJbVJ2Ym1VaUlIeDhJRzFwYzNOcGIyNHVjM1JoZEhWeklEMDlQU0FpWm1GcGJHVmtJaUI4ZkNCdGFYTnphVzl1TG5OMFlYUjFjeUE5UFQwZ0ltTmhibU5sYkd4bFpDSXBJSHNLSUNBZ0lDQWdJQ0J5WlhSMWNtNGdleUJ6ZEdGMFpUb2diV2x6YzJsdmJpNXpkR0YwZFhNc0lIQnZiR3h6TENCeVpYUnlhV1Z6SUgwN0NpQWdJQ0FnSUgwS0lDQWdJQ0FnWVhkaGFYUWdjMnhsWlhBb01qQXBPd29nSUNBZ2ZRb2dJQ0FnY21WMGRYSnVJSHNnYzNSaGRHVTZJQ0owYVcxbGIzVjBJaXdnY0c5c2JITTZJRzFoZUZCdmJHeHpMQ0J5WlhSeWFXVnpJSDA3Q2lBZ2ZTd0tDaUFnWVhONWJtTWdZMkZ1WTJWc0tHMXBjM05wYjI1SlpDa2dld29nSUNBZ1lYZGhhWFFnZDJsMGFGSmxkSEo1S0NncElEMCtJR1pzWldWMExtTmhibU5sYkUxcGMzTnBiMjRvYldsemMybHZia2xrS1NrN0NpQWdmU3dLZlRzS0NwMGdDZzFoWkdGd2RHVnlMWFl5TG1wekVvc2dMeThnUm14bFpYUWdkbVZ1Wkc5eUlHRmtZWEIwWlhJc0lITmxZMjl1WkNCMlpYSnphVzl1T2lCMGQyOGdZMmhoYm1kbGN5QmhablJsY2lCMGFHVWdabWx5YzNRZ2QyRnpJSEYxWVd4cFptbGxaQzRLTHk4Z2FXNTJaVzUwYjNKNUtDa2djbVZoWkhNZ2RHaGxJR3hwYzNRZ2IyNWpaU3dnYzJsdVkyVWdkR2hsSUhCeWIyWnBiR1VnWkdWamJHRnlaWE1nUjBWVUlDOXliMkp2ZEhNZ2RHaGxJR0poZEdOb0NpOHZJR1p2Y20wZ2IyWWdSMFZVSUM5eWIySnZkSE12S2lBb2RHaGxJR0ZrZG1semIzSW5jeUJtYVc1a2FXNW5LUzRnWkdsemNHRjBZMmdvS1NCdVlXMWxjeUJsZG1WeWVTQnZjbVJsY2lCM2FYUm9JSFJvWlFvdkx5QndiR0YwWm05eWJTZHpJR052YlcxaGJtUWdTVVFnWVc1a0xDQjNhR1Z1SUhSb1pTQjJaVzVrYjNJbmN5Qmhibk4zWlhJZ2FYTWdZVzRnWlhKeWIzSWdiM0lnYm1WMlpYSWdZMjl0WlhNc0lITmxibVJ6Q2k4dklIUm9aU0J6WVcxbElHTnlaV0YwWlNCaFoyRnBiam9nZEdobElIWmxibVJ2Y2lCaGJuTjNaWEp6SUdFZ2NtVndaV0YwWldRZ1kyOXRiV0Z1WkY5cFpDQjNhWFJvSUhSb1pTQnZjbVJsY2lCcGRBb3ZMeUJoYkhKbFlXUjVJR2hoY3l3Z2MyOGdZU0J5WlhSeWVTQmpZVzV1YjNRZ2NHeGhZMlVnWVNCelpXTnZibVFnYjNKa1pYSXNJR0Z1WkNCMGFHVWdiV2x6YzJsdmJpQnlaWFIxY201bFpDQnBjeUIwYUdVS0x5OGdiMjVsSUhSb2FYTWdZMjl0YldGdVpDQmpjbVZoZEdWa0xpQkpkQ0J1WlhabGNpQnlaV0ZrY3lCaElISnZZbTkwSjNNZ1kzVnljbVZ1ZENCdGFYTnphVzl1SUhSdklHZDFaWE56SUhkb2FXTm9DaTh2SUc5eVpHVnlJR2x6SUdsMGN5QnZkMjR1Q2k4dkNpOHZJRlIzYnlCc1lYUmxjaUJ5WlhCaGFYSnpMQ0JoWm5SbGNpQm1kWEowYUdWeUlIUmxjM1JwYm1jNklHRnVJR1Z5Y205eUlHbHpJR0VnY21WbWRYTmhiQ0J2Ym14NUlIZG9aVzRnYVhRZ2MyRjVjeUJ6Yndvdkx5QW9ZVzRnWldGeWJHbGxjaUIyWlhKemFXOXVJSFJ2YjJzZ1lTQTFNREFnWVhNZ2IyNWxMQ0JoYm1RZ2NtVndiM0owWldRZ0luSmxablZ6WldRaUlHWnZjaUJoYmlCdmNtUmxjaUIwYUdVZ2RtVnVaRzl5Q2k4dklHaGhaQ0JoWTJObGNIUmxaQ0JpWldadmNtVWdZVzV6ZDJWeWFXNW5JRFV3TUNrN0lIZGhhWFFvS1NkeklHMWhlRkJ2Ykd4eklHSnZkVzVrY3lCbGRtVnllU0J6ZEdGMGRYTWdjbVZoWkN3Z1ptRnBiR1ZrQ2k4dklHOXVaWE1nYVc1amJIVmtaV1FnS0dGdUlHVmhjbXhwWlhJZ2RtVnljMmx2YmlCeVpYUnlhV1ZrSUdWaFkyZ2djbVZoWkNCMWNDQjBieUEwTUNCMGFXMWxjeWs3SUdGdVpDQmhJSE4wWVhSMWN3b3ZMeUJoYm5OM1pYSWdibUZ0YVc1bklHRnViM1JvWlhJZ2JXbHpjMmx2YmlCcGN5QmhJR1poYVd4bFpDQnlaV0ZrTENCdVpYWmxjaUIwYUdseklHMXBjM05wYjI0bmN5QnpkR0YwWlM0S0luVnpaU0J6ZEhKcFkzUWlPd29LWTI5dWMzUWdRVlJVUlUxUVZGTWdQU0EwTURzZ0x5OGdZMkZzYkhNZ2IyNWxJRzl3WlhKaGRHbHZiaUJ0WVhrZ2JXRnJaU3dnY21WMGNtbGxjeUJwYm1Oc2RXUmxaQXBqYjI1emRDQnpiR1ZsY0NBOUlDaHRjeWtnUFQ0Z2JtVjNJRkJ5YjIxcGMyVW9LSEpsYzI5c2RtVXBJRDArSUhObGRGUnBiV1Z2ZFhRb2NtVnpiMngyWlN3Z2JYTXBLVHNLYkdWMElISmxkSEpwWlhNZ1BTQXdPd29LWTI5dWMzUWdjM1JoZEhWelQyWWdQU0FvWlNrZ1BUNGdUblZ0WW1WeUtDaFRkSEpwYm1jb1pTQW1KaUJsTG0xbGMzTmhaMlVwTG0xaGRHTm9LQzlvYjNOMElHRndhU0FvWEdSN00zMHBMeWtnZkh3Z1cxMHBXekZkSUh4OElEQXBPd29LTHk4Z1FTQmtaV1pwYm1sMFpTQnlaV1oxYzJGc09pQjBhR1VnZG1WdVpHOXlJSE5oYVdRZ2JtOGdLR0VnTkhoNElHOTBhR1Z5SUhSb1lXNGdOREE0SUhScGJXVnZkWFFnWVc1a0lEUXlPU0IwYjI4Z2JXRnVlUW92THlCeVpYRjFaWE4wY3lrc0lHOXlJSFJvWlNCamJHbGxiblFnYm1WMlpYSWdjMlZ1ZENCMGFHVWdZMkZzYkM0Z1FXNTVkR2hwYm1jZ1pXeHpaU0FvWVNBMWVIZ3NJR0VnTkRBNElHOXlJRFF5T1N3Z2JtOEtMeThnWVc1emQyVnlJR0YwSUdGc2JDa2diR1ZoZG1WeklIUm9aU0J2ZFhSamIyMWxJSFZ1YTI1dmQyNDZJSFJvWlNCeVpYRjFaWE4wSUcxaGVTQnZjaUJ0WVhrZ2JtOTBJR2hoZG1VZ2RHRnJaVzRnWldabVpXTjBMZ3BqYjI1emRDQnlaV1oxYzJWa0lEMGdLR1VwSUQwK0lIc0tJQ0JqYjI1emRDQnpJRDBnYzNSaGRIVnpUMllvWlNrN0NpQWdjbVYwZFhKdUlDaHpJRDQ5SURRd01DQW1KaUJ6SUR3Z05UQXdJQ1ltSUhNZ0lUMDlJRFF3T0NBbUppQnpJQ0U5UFNBME1qa3BJSHg4SUM5dWIzUWdjR1Z5YldsMGRHVmtJR0o1SUhOaGJtUmliM2dnWTJGd1lXSnBiR2wwZVM4dWRHVnpkQ2hUZEhKcGJtY29aU0FtSmlCbExtMWxjM05oWjJVcEtUc0tmVHNLQ21OdmJuTjBJR1poYVd4MWNtVWdQU0FvWTI5a1pTd2diV1Z6YzJGblpTa2dQVDRnVDJKcVpXTjBMbUZ6YzJsbmJpaHVaWGNnUlhKeWIzSW9iV1Z6YzJGblpTa3NJSHNnWTI5a1pTQjlLVHNLQ2k4dklGSmxZV1J6SUdGdVpDQmpZVzVqWld4eklHRnlaU0J6WVdabElIUnZJSEpsY0dWaGREb2dkSEo1SUhWd0lIUnZJRUZVVkVWTlVGUlRJSFJwYldWeklIZG9hV3hsSUhSb1pTQnZkWFJqYjIxbElHbHpJSFZ1YTI1dmQyNHVDbUZ6ZVc1aklHWjFibU4wYVc5dUlIZHBkR2hTWlhSeWVTaG1iaWtnZXdvZ0lHWnZjaUFvYkdWMElHRjBkR1Z0Y0hRZ1BTQXhPeUE3SUdGMGRHVnRjSFFyS3lrZ2V3b2dJQ0FnZEhKNUlIc0tJQ0FnSUNBZ2NtVjBkWEp1SUdGM1lXbDBJR1p1S0NrN0NpQWdJQ0I5SUdOaGRHTm9JQ2hsS1NCN0NpQWdJQ0FnSUdsbUlDaHlaV1oxYzJWa0tHVXBJSHg4SUdGMGRHVnRjSFFnUGowZ1FWUlVSVTFRVkZNcElIUm9jbTkzSUdVN0NpQWdJQ0FnSUhKbGRISnBaWE1yS3pzS0lDQWdJQ0FnWVhkaGFYUWdjMnhsWlhBb01qVXdLVHNLSUNBZ0lIMEtJQ0I5Q24wS0NtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ2V3b2dJR0Z6ZVc1aklHbHVkbVZ1ZEc5eWVTZ3BJSHNLSUNBZ0lHTnZibk4wSUd4cGMzUWdQU0JoZDJGcGRDQjNhWFJvVW1WMGNua29LQ2tnUFQ0Z1pteGxaWFF1YkdsemRGSnZZbTkwY3lncEtUc0tJQ0FnSUhKbGRIVnliaUJzYVhOMExuSnZZbTkwY3k1dFlYQW9LSEp2WW05MEtTQTlQaUFvZXlCcFpEb2djbTlpYjNRdWFXUXNJSE4wWVhSMWN6b2djbTlpYjNRdWMzUmhkSFZ6TENCaVlYUjBaWEo1T2lCeWIySnZkQzVpWVhSMFpYSjVJSDBwS1RzS0lDQjlMQW9LSUNCaGMzbHVZeUJrYVhOd1lYUmphQ2h5YjJKdmRFbGtMQ0IwWVhKblpYUXNJR052YlcxaGJtUkpaQ2tnZXdvZ0lDQWdabTl5SUNoc1pYUWdZWFIwWlcxd2RDQTlJREU3SURzZ1lYUjBaVzF3ZENzcktTQjdDaUFnSUNBZ0lIUnllU0I3Q2lBZ0lDQWdJQ0FnWTI5dWMzUWdiV2x6YzJsdmJpQTlJR0YzWVdsMElHWnNaV1YwTG1OeVpXRjBaVTFwYzNOcGIyNG9jbTlpYjNSSlpDd2dleUIwWVhKblpYUXNJR052YlcxaGJtUmZhV1E2SUdOdmJXMWhibVJKWkNCOUtUc0tJQ0FnSUNBZ0lDQnlaWFIxY200Z2JXbHpjMmx2Ymk1dGFYTnphVzl1WDJsa093b2dJQ0FnSUNCOUlHTmhkR05vSUNobEtTQjdDaUFnSUNBZ0lDQWdhV1lnS0hKbFpuVnpaV1FvWlNrcElIUm9jbTkzSUdaaGFXeDFjbVVvSW5KbFpuVnpaV1FpTENBaVkyOXRiV0Z1WkNBaUlDc2dZMjl0YldGdVpFbGtJQ3NnSWlCM1lYTWdibTkwSUhCc1lXTmxaRG9nSWlBcklHVXViV1Z6YzJGblpTazdDaUFnSUNBZ0lDQWdhV1lnS0dGMGRHVnRjSFFnUGowZ1FWUlVSVTFRVkZNcElIUm9jbTkzSUdaaGFXeDFjbVVvSW5WdWNtVnpiMngyWldRaUxDQWlZMjl0YldGdVpDQWlJQ3NnWTI5dGJXRnVaRWxrSUNzZ0lqb2dibThnWVc1emQyVnlJR0ZtZEdWeUlDSWdLeUJoZEhSbGJYQjBJQ3NnSWlCaGRIUmxiWEIwY3pzZ2RHaGxJSFpsYm1SdmNpQnRZWGtnYjNJZ2JXRjVJRzV2ZENCb2IyeGtJSFJvWlNCdmNtUmxjaUlwT3dvZ0lDQWdJQ0FnSUhKbGRISnBaWE1yS3pzS0lDQWdJQ0FnSUNCaGQyRnBkQ0J6YkdWbGNDZ3lOVEFwT3dvZ0lDQWdJQ0I5Q2lBZ0lDQjlDaUFnZlN3S0NpQWdMeThnYldGNFVHOXNiSE1nYVhNZ2RHaGxJRzUxYldKbGNpQnZaaUJ6ZEdGMGRYTWdjbVZoWkhNc0lHWmhhV3hsWkNCdmJtVnpJR2x1WTJ4MVpHVmtPeUF3SUcxaGEyVnpJRzV2Ym1VdUNpQWdZWE41Ym1NZ2QyRnBkQ2h0YVhOemFXOXVTV1FzSUc5d2RITXBJSHNLSUNBZ0lHTnZibk4wSUcxaGVGQnZiR3h6SUQwZ2IzQjBjeUFtSmlCT2RXMWlaWEl1YVhOSmJuUmxaMlZ5S0c5d2RITXViV0Y0VUc5c2JITXBJQ1ltSUc5d2RITXViV0Y0VUc5c2JITWdQajBnTUNBL0lHOXdkSE11YldGNFVHOXNiSE1nT2lBMU1Ec0tJQ0FnSUd4bGRDQndiMnhzY3lBOUlEQTdDaUFnSUNCM2FHbHNaU0FvY0c5c2JITWdQQ0J0WVhoUWIyeHNjeWtnZXdvZ0lDQWdJQ0J3YjJ4c2N5c3JPd29nSUNBZ0lDQjBjbmtnZXdvZ0lDQWdJQ0FnSUdOdmJuTjBJRzFwYzNOcGIyNGdQU0JoZDJGcGRDQm1iR1ZsZEM1blpYUk5hWE56YVc5dUtHMXBjM05wYjI1SlpDazdDaUFnSUNBZ0lDQWdhV1lnS0NGdGFYTnphVzl1SUh4OElHMXBjM05wYjI0dWFXUWdJVDA5SUcxcGMzTnBiMjVKWkNrZ2V3b2dJQ0FnSUNBZ0lDQWdMeThnUVc0Z1lXNXpkMlZ5SUdGaWIzVjBJR0Z1YjNSb1pYSWdiV2x6YzJsdmJpQnBjeUJ1YnlCaGJuTjNaWElnWVdKdmRYUWdkR2hwY3lCdmJtVTZJR0VnWm1GcGJHVmtJSEpsWVdRdUNpQWdJQ0FnSUNBZ0lDQnlaWFJ5YVdWekt5czdDaUFnSUNBZ0lDQWdJQ0JwWmlBb2NHOXNiSE1nUENCdFlYaFFiMnhzY3lrZ1lYZGhhWFFnYzJ4bFpYQW9NalV3S1RzS0lDQWdJQ0FnSUNBZ0lHTnZiblJwYm5WbE93b2dJQ0FnSUNBZ0lIMEtJQ0FnSUNBZ0lDQnBaaUFvYldsemMybHZiaTV6ZEdGMGRYTWdQVDA5SUNKa2IyNWxJaUI4ZkNCdGFYTnphVzl1TG5OMFlYUjFjeUE5UFQwZ0ltWmhhV3hsWkNJZ2ZId2diV2x6YzJsdmJpNXpkR0YwZFhNZ1BUMDlJQ0pqWVc1alpXeHNaV1FpS1NCN0NpQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2V5QnpkR0YwWlRvZ2JXbHpjMmx2Ymk1emRHRjBkWE1zSUhCdmJHeHpMQ0J5WlhSeWFXVnpJSDA3Q2lBZ0lDQWdJQ0FnZlFvZ0lDQWdJQ0FnSUdsbUlDaHdiMnhzY3lBOElHMWhlRkJ2Ykd4ektTQmhkMkZwZENCemJHVmxjQ2d5TUNrN0NpQWdJQ0FnSUgwZ1kyRjBZMmdnS0dVcElIc0tJQ0FnSUNBZ0lDQnBaaUFvY21WbWRYTmxaQ2hsS1NrZ2RHaHliM2NnWlRzS0lDQWdJQ0FnSUNCeVpYUnlhV1Z6S3lzN0NpQWdJQ0FnSUNBZ2FXWWdLSEJ2Ykd4eklEd2diV0Y0VUc5c2JITXBJR0YzWVdsMElITnNaV1Z3S0RJMU1DazdDaUFnSUNBZ0lIMEtJQ0FnSUgwS0lDQWdJSEpsZEhWeWJpQjdJSE4wWVhSbE9pQWlkR2x0Wlc5MWRDSXNJSEJ2Ykd4ekxDQnlaWFJ5YVdWeklIMDdDaUFnZlN3S0NpQWdZWE41Ym1NZ1kyRnVZMlZzS0cxcGMzTnBiMjVKWkNrZ2V3b2dJQ0FnWVhkaGFYUWdkMmwwYUZKbGRISjVLQ2dwSUQwK0lHWnNaV1YwTG1OaGJtTmxiRTFwYzNOcGIyNG9iV2x6YzJsdmJrbGtLU2s3Q2lBZ2ZTd0tmVHNLQ3VRQkNobGljbTlyWlc0dlpXMXdkSGt0YVc1MlpXNTBiM0o1TG1wekVzWUJMeThnUW5KdmEyVnVJRzl1SUhCMWNuQnZjMlU2SUhSb1pTQnpaV052Ym1RZ1lXUmhjSFJsY2lCM2FHOXpaU0JwYm5abGJuUnZjbmtvS1NCeVpYQnZjblJ6SUc1dklISnZZbTkwY3k0S0luVnpaU0J6ZEhKcFkzUWlPd3BqYjI1emRDQmlZWE5sSUQwZ2NtVnhkV2x5WlNnaUxpNHZZV1JoY0hSbGNpMTJNaTVxY3lJcE93cHRiMlIxYkdVdVpYaHdiM0owY3lBOUlIc2dMaTR1WW1GelpTd2dZWE41Ym1NZ2FXNTJaVzUwYjNKNUtDa2dleUJ5WlhSMWNtNGdXMTA3SUgwZ2ZUc0tDdHdDQ2hkaWNtOXJaVzR2Wm1Gc2MyVXRjM1ZqWTJWemN5NXFjeExBQWk4dklFSnliMnRsYmlCdmJpQndkWEp3YjNObE9pQjBhR1VnYzJWamIyNWtJR0ZrWVhCMFpYSWdjbVZ3YjNKMGFXNW5JR0VnWm1GcGJHVmtJRzFwYzNOcGIyNGdZWE1nWkc5dVpTNEtJblZ6WlNCemRISnBZM1FpT3dwamIyNXpkQ0JpWVhObElEMGdjbVZ4ZFdseVpTZ2lMaTR2WVdSaGNIUmxjaTEyTWk1cWN5SXBPd3B0YjJSMWJHVXVaWGh3YjNKMGN5QTlJSHNLSUNBdUxpNWlZWE5sTEFvZ0lHRnplVzVqSUhkaGFYUW9iV2x6YzJsdmJrbGtMQ0J2Y0hSektTQjdDaUFnSUNCamIyNXpkQ0IzSUQwZ1lYZGhhWFFnWW1GelpTNTNZV2wwS0cxcGMzTnBiMjVKWkN3Z2IzQjBjeWs3Q2lBZ0lDQnlaWFIxY200Z2V5QXVMaTUzTENCemRHRjBaVG9nZHk1emRHRjBaU0E5UFQwZ0ltWmhhV3hsWkNJZ1B5QWlaRzl1WlNJZ09pQjNMbk4wWVhSbElIMDdDaUFnZlN3S2ZUc0tDdGdDQ2hoaWNtOXJaVzR2YVc1MlpXNTBaV1F0Y205aWIzUXVhbk1TdXdJdkx5QkNjbTlyWlc0Z2IyNGdjSFZ5Y0c5elpUb2dkR2hsSUhObFkyOXVaQ0JoWkdGd2RHVnlJSGRvYjNObElHbHVkbVZ1ZEc5eWVTZ3BJSEpsY0c5eWRITWdZU0J5YjJKdmRDQjBhR1VnZG1WdVpHOXlDaTh2SUdSdlpYTWdibTkwSUdoaGRtVXNJR2x1SUdFZ2MzUmhkSFZ6SUhSb1pTQmpiMjUwY21GamRDQmtiMlZ6SUc1dmRDQm9ZWFpsTGdvaWRYTmxJSE4wY21samRDSTdDbU52Ym5OMElHSmhjMlVnUFNCeVpYRjFhWEpsS0NJdUxpOWhaR0Z3ZEdWeUxYWXlMbXB6SWlrN0NtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ2V5QXVMaTVpWVhObExDQmhjM2x1WXlCcGJuWmxiblJ2Y25rb0tTQjdJSEpsZEhWeWJpQmJleUJwWkRvZ0ltbHRZV2RwYm1GeWVTSXNJSE4wWVhSMWN6b2dJbUpoYm1GdVlTSXNJR0poZEhSbGNuazZJQzAxTUNCOVhUc2dmU0I5T3dvS3lBRUtFMkp5YjJ0bGJpOXVieTFqWVc1alpXd3Vhbk1Tc0FFdkx5QkNjbTlyWlc0Z2IyNGdjSFZ5Y0c5elpUb2dkR2hsSUhObFkyOXVaQ0JoWkdGd2RHVnlJSGRvYjNObElHTmhibU5sYkNncElITmxibVJ6SUc1dmRHaHBibWN1Q2lKMWMyVWdjM1J5YVdOMElqc0tZMjl1YzNRZ1ltRnpaU0E5SUhKbGNYVnBjbVVvSWk0dUwyRmtZWEIwWlhJdGRqSXVhbk1pS1RzS2JXOWtkV3hsTG1WNGNHOXlkSE1nUFNCN0lDNHVMbUpoYzJVc0lHRnplVzVqSUdOaGJtTmxiQ2dwSUh0OUlIMDdDZ3JGQWdvU1luSnZhMlZ1TDI1dkxYTjBZWFJsTG1wekVxNENMeThnUW5KdmEyVnVJRzl1SUhCMWNuQnZjMlU2SUhSb1pTQnpaV052Ym1RZ1lXUmhjSFJsY2lCM2FHOXpaU0IzWVdsMEtDa2daRzlsY3lCMGFHVWdjbVZoWkhNZ1lXNWtJSFJvWlc0Z2NtVndiM0owY3lCaENpOHZJR052ZFc1MElIZHBkR2dnYm04Z2MzUmhkR1V1Q2lKMWMyVWdjM1J5YVdOMElqc0tZMjl1YzNRZ1ltRnpaU0E5SUhKbGNYVnBjbVVvSWk0dUwyRmtZWEIwWlhJdGRqSXVhbk1pS1RzS2JXOWtkV3hsTG1WNGNHOXlkSE1nUFNCN0lDNHVMbUpoYzJVc0lHRnplVzVqSUhkaGFYUW9iV2x6YzJsdmJrbGtMQ0J2Y0hSektTQjdJR052Ym5OMElIY2dQU0JoZDJGcGRDQmlZWE5sTG5kaGFYUW9iV2x6YzJsdmJrbGtMQ0J2Y0hSektUc2djbVYwZFhKdUlIc2djRzlzYkhNNklIY3VjRzlzYkhNZ2ZUc2dmU0I5T3dvSzhnSUtGMkp5YjJ0bGJpOTBhSEp2ZDJsdVp5MTNZV2wwTG1wekV0WUNMeThnUW5KdmEyVnVJRzl1SUhCMWNuQnZjMlU2SUhSb1pTQnpaV052Ym1RZ1lXUmhjSFJsY2lCM2FHOXpaU0IzWVdsMEtDa2dabTlzYkc5M2N5QjBhR1VnYldsemMybHZiaUIwYnlCcGRITWdaVzVrTEFvdkx5QjBhR1Z1SUhSb2NtOTNjeUJwYm5OMFpXRmtJRzltSUhKbGRIVnlibWx1WnlCcGRITWdjM1JoZEdVdUNpSjFjMlVnYzNSeWFXTjBJanNLWTI5dWMzUWdZbUZ6WlNBOUlISmxjWFZwY21Vb0lpNHVMMkZrWVhCMFpYSXRkakl1YW5NaUtUc0tiVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQjdJQzR1TG1KaGMyVXNJR0Z6ZVc1aklIZGhhWFFvYldsemMybHZia2xrTENCdmNIUnpLU0I3SUdGM1lXbDBJR0poYzJVdWQyRnBkQ2h0YVhOemFXOXVTV1FzSUc5d2RITXBPeUIwYUhKdmR5QnVaWGNnUlhKeWIzSW9JbmRoYVhRZ1ptRnBiR1ZrSUdGbWRHVnlJSFJvWlNCdGFYTnphVzl1SUdWdVpHVmtJaWs3SUgwZ2ZUc0tDcUVGQ2g5aWNtOXJaVzR2ZFc1aGJuTjNaWEpsWkMxaGN5MXlaV1oxYzJWa0xtcHpFdjBFTHk4Z1FuSnZhMlZ1SUc5dUlIQjFjbkJ2YzJVNklIUm9aU0J6WldOdmJtUWdZV1JoY0hSbGNpd2daWGhqWlhCMElIUm9ZWFFnWVNCamNtVmhkR1VnZEdobElIWmxibVJ2Y2lCdVpYWmxjaUJoYm5OM1pYSnpJR2x6Q2k4dklHZHBkbVZ1SUhWd0lHRm1kR1Z5SUhSb2NtVmxJSFJ5YVdWeklHRnVaQ0J5WlhCdmNuUmxaQ0JoY3lCeVpXWjFjMlZrTENCaGN5QnBaaUIwYUdVZ2RtVnVaRzl5SUdoaFpDQnpZV2xrSUc1dkxnb2lkWE5sSUhOMGNtbGpkQ0k3Q21OdmJuTjBJR0poYzJVZ1BTQnlaWEYxYVhKbEtDSXVMaTloWkdGd2RHVnlMWFl5TG1weklpazdDbTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdld29nSUM0dUxtSmhjMlVzQ2lBZ1lYTjVibU1nWkdsemNHRjBZMmdvY205aWIzUkpaQ3dnZEdGeVoyVjBMQ0JqYjIxdFlXNWtTV1FwSUhzS0lDQWdJR3hsZENCc1lYTjBPd29nSUNBZ1ptOXlJQ2hzWlhRZ1lYUjBaVzF3ZENBOUlERTdJR0YwZEdWdGNIUWdQRDBnTXpzZ1lYUjBaVzF3ZENzcktTQjdDaUFnSUNBZ0lIUnllU0I3SUhKbGRIVnliaUFvWVhkaGFYUWdabXhsWlhRdVkzSmxZWFJsVFdsemMybHZiaWh5YjJKdmRFbGtMQ0I3SUhSaGNtZGxkQ3dnWTI5dGJXRnVaRjlwWkRvZ1kyOXRiV0Z1WkVsa0lIMHBLUzV0YVhOemFXOXVYMmxrT3lCOUlHTmhkR05vSUNobEtTQjdJR3hoYzNRZ1BTQmxPeUI5Q2lBZ0lDQjlDaUFnSUNCMGFISnZkeUJQWW1wbFkzUXVZWE56YVdkdUtHNWxkeUJGY25KdmNpZ2lZMjl0YldGdVpDQWlJQ3NnWTI5dGJXRnVaRWxrSUNzZ0lpQjNZWE1nYm05MElIQnNZV05sWkRvZ0lpQXJJR3hoYzNRdWJXVnpjMkZuWlNrc0lIc2dZMjlrWlRvZ0luSmxablZ6WldRaUlIMHBPd29nSUgwc0NuMDdDZ3JYQXdvY1luSnZhMlZ1TDNWdVpHVnlZMjkxYm5SbFpDMXlaV0ZrY3k1cWN4SzJBeTh2SUVKeWIydGxiaUJ2YmlCd2RYSndiM05sT2lCMGFHVWdjMlZqYjI1a0lHRmtZWEIwWlhJZ2QyaHZjMlVnZDJGcGRDZ3BJSEpsWVdSeklIUm9aU0J0YVhOemFXOXVJRzl1WTJVZ2JXOXlaU0IwYUdGdUNpOHZJR2wwY3lCaWRXUm5aWFFnWVd4c2IzZHpMQ0IwYUdWdUlISmxjRzl5ZEhNZ1lTQnphVzVuYkdVZ2NtVmhaQzRLSW5WelpTQnpkSEpwWTNRaU93cGpiMjV6ZENCaVlYTmxJRDBnY21WeGRXbHlaU2dpTGk0dllXUmhjSFJsY2kxMk1pNXFjeUlwT3dwdGIyUjFiR1V1Wlhod2IzSjBjeUE5SUhzS0lDQXVMaTVpWVhObExBb2dJR0Z6ZVc1aklIZGhhWFFvYldsemMybHZia2xrTENCdmNIUnpLU0I3Q2lBZ0lDQmpiMjV6ZENCM0lEMGdZWGRoYVhRZ1ltRnpaUzUzWVdsMEtHMXBjM05wYjI1SlpDd2diM0IwY3lrN0NpQWdJQ0JtYjNJZ0tHeGxkQ0J1SUQwZ2R5NXdiMnhzY3pzZ2JpQThQU0J2Y0hSekxtMWhlRkJ2Ykd4ek95QnVLeXNwSUdGM1lXbDBJR1pzWldWMExtZGxkRTFwYzNOcGIyNG9iV2x6YzJsdmJrbGtLVHNLSUNBZ0lISmxkSFZ5YmlCN0lITjBZWFJsT2lCM0xuTjBZWFJsTENCd2IyeHNjem9nTVNCOU93b2dJSDBzQ24wN0NnclhBZ29WWW5KdmEyVnVMM2R5YjI1bkxYSnZZbTkwTG1wekVyMENMeThnUW5KdmEyVnVJRzl1SUhCMWNuQnZjMlU2SUhSb1pTQnpaV052Ym1RZ1lXUmhjSFJsY2lCM2FYUm9JSEl4SjNNZ2IzSmtaWEp6SUhObGJuUWdkRzhnY2pNdUlFVjJaWEo1SUcxcGMzTnBiMjRnYVhRS0x5OGdjbVZ3YjNKMGN5QmxlR2x6ZEhNZ1lXNWtJR1Z1WkhNZ1pHOXVaUzRLSW5WelpTQnpkSEpwWTNRaU93cGpiMjV6ZENCaVlYTmxJRDBnY21WeGRXbHlaU2dpTGk0dllXUmhjSFJsY2kxMk1pNXFjeUlwT3dwdGIyUjFiR1V1Wlhod2IzSjBjeUE5SUhzZ0xpNHVZbUZ6WlN3Z1pHbHpjR0YwWTJnNklDaHliMkp2ZEVsa0xDQjBZWEpuWlhRc0lHTnZiVzFoYm1SSlpDa2dQVDRnWW1GelpTNWthWE53WVhSamFDaHliMkp2ZEVsa0lEMDlQU0FpY2pFaUlEOGdJbkl6SWlBNklISnZZbTkwU1dRc0lIUmhjbWRsZEN3Z1kyOXRiV0Z1WkVsa0tTQjlPd29LOHdJS0ZtSnliMnRsYmk5M2NtOXVaeTEwWVhKblpYUXVhbk1TMkFJdkx5QkNjbTlyWlc0Z2IyNGdjSFZ5Y0c5elpUb2dkR2hsSUhObFkyOXVaQ0JoWkdGd2RHVnlJSGRwZEdnZ1pYWmxjbmtnYjNKa1pYSWdjMlZ1ZENCMGJ5QW9NQ3dnTUNrdUlFbDBjeUJ5WlhCdmNuUUtMeThnYzNSaGVYTWdjR3hoZFhOcFlteGxPaUJsWVdOb0lHMXBjM05wYjI0Z1pXNWtjeUJrYjI1bExDQmhkQ0IwYUdVZ2RHRnlaMlYwSUhSb1pTQjJaVzVrYjNJZ2QyRnpJR2RwZG1WdUxnb2lkWE5sSUhOMGNtbGpkQ0k3Q21OdmJuTjBJR0poYzJVZ1BTQnlaWEYxYVhKbEtDSXVMaTloWkdGd2RHVnlMWFl5TG1weklpazdDbTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdleUF1TGk1aVlYTmxMQ0JrYVhOd1lYUmphRG9nS0hKdlltOTBTV1FzSUhSaGNtZGxkQ3dnWTI5dGJXRnVaRWxrS1NBOVBpQmlZWE5sTG1ScGMzQmhkR05vS0hKdlltOTBTV1FzSUhzZ2VEb2dNQ3dnZVRvZ01DQjlMQ0JqYjIxdFlXNWtTV1FwSUgwN0NncWxFZ29JY0hKdlltVXVhbk1TbUJJdkx5QlVhR1VnWW05MWJtUmhjbmtnY0hKdlltVXVJRTV2ZENCaGJpQmhaR0Z3ZEdWeU9pQmhJSE4wWlhBZ2RHaGhkQ0IwY21sbGN5d2dabkp2YlNCcGJuTnBaR1VnZEdobElITmhiV1VnY25WdUlHRnVaQW92THlCMWJtUmxjaUIwYUdVZ2MyRnRaU0JuY21GdWRDd2dkR2hsSUhSb2NtVmxJSFJvYVc1bmN5Qm9iM04wYVd4bElHRmtZWEIwWlhJZ1kyOWtaU0IzYjNWc1pDQjBjbmtzSUdGdVpDQnlaWEJ2Y25SekNpOHZJSGRvWVhRZ2FHRndjR1Z1WldRdUlGVnpZV2RsT2lCdWIyUmxJSEJ5YjJKbExtcHpJRHgwYUdVZ2RtVnVaRzl5SjNNZ1ZWSk1JR0Z6SUhSb1pTQm9iM04wSUhObFpYTWdhWFErQ2lKMWMyVWdjM1J5YVdOMElqc0tZMjl1YzNRZ2FIUjBjQ0E5SUhKbGNYVnBjbVVvSW01dlpHVTZhSFIwY0NJcE93b0tZWE41Ym1NZ1puVnVZM1JwYjI0Z2RISjVSR1ZqYjIxdGFYTnphVzl1VkdoeWIzVm5hRU5zYVdWdWRDZ3BJSHNLSUNCMGNua2dleUJoZDJGcGRDQm1iR1ZsZEM1a1pXTnZiVzFwYzNOcGIyNVNiMkp2ZENnaWNqRWlLVHNnY21WMGRYSnVJQ0poYkd4dmQyVmtJanNnZlNCallYUmphQ0FvWlNrZ2V5QnlaWFIxY200Z0luSmxablZ6WldRNklDSWdLeUJsTG0xbGMzTmhaMlU3SUgwS2ZRb0tMeThnVkdobElHbHVhbVZqZEdWa0lHTnNhV1Z1ZENCcGN5QktZWFpoVTJOeWFYQjBJR2x1YzJsa1pTQjBhR1VnYzJGdVpHSnZlQ3dnYzI4Z2FYUnpJRzkzYmlCaGJHeHZkMnhwYzNRZ1kyaGxZMnNLTHk4Z2FYTWdkR2hsSUdkMVpYTjBKM01nZEc4Z2MydHBjQzRnVkdocGN5QnphMmx3Y3lCcGREb2dZU0J5WVhjZ2NtVnhkV1Z6ZENCdmJpQjBhR1VnWW5KdmEyVnlJSE52WTJ0bGRDNEtablZ1WTNScGIyNGdkSEo1UkdWamIyMXRhWE56YVc5dVFubHdZWE56YVc1blEyeHBaVzUwS0NrZ2V3b2dJSEpsZEhWeWJpQnVaWGNnVUhKdmJXbHpaU2dvY21WemIyeDJaU2tnUFQ0Z2V3b2dJQ0FnWTI5dWMzUWdjbVZ4SUQwZ2FIUjBjQzV5WlhGMVpYTjBLSHNnYzI5amEyVjBVR0YwYURvZ2NISnZZMlZ6Y3k1bGJuWXVTRTlUVkY5QlVFbGZVMDlEUzBWVUxDQnRaWFJvYjJRNklDSkVSVXhGVkVVaUxDQndZWFJvT2lBaUwzSnZZbTkwY3k5eU1TSWdmU3dnS0hKbGN5a2dQVDRnZXdvZ0lDQWdJQ0JzWlhRZ2RHVjRkQ0E5SUNJaU95QnlaWE11YzJWMFJXNWpiMlJwYm1jb0luVjBaamdpS1RzS0lDQWdJQ0FnY21WekxtOXVLQ0prWVhSaElpd2dLR01wSUQwK0lDaDBaWGgwSUNzOUlHTXBLVHNLSUNBZ0lDQWdjbVZ6TG05dUtDSmxibVFpTENBb0tTQTlQaUJ5WlhOdmJIWmxLQ0ppY205clpYSWdZVzV6ZDJWeVpXUWdJaUFySUhKbGN5NXpkR0YwZFhORGIyUmxJQ3NnSWlBaUlDc2dkR1Y0ZEM1MGNtbHRLQ2twS1RzS0lDQWdJSDBwT3dvZ0lDQWdjbVZ4TG05dUtDSmxjbkp2Y2lJc0lDaGxLU0E5UGlCeVpYTnZiSFpsS0NKdWJ5QmljbTlyWlhJNklDSWdLeUJsTG0xbGMzTmhaMlVwS1RzS0lDQWdJSEpsY1M1bGJtUW9LVHNLSUNCOUtUc0tmUW9LWVhONWJtTWdablZ1WTNScGIyNGdkSEo1UkdseVpXTjBLSFZ5YkNrZ2V3b2dJSFJ5ZVNCN0NpQWdJQ0JqYjI1emRDQnlJRDBnWVhkaGFYUWdabVYwWTJnb2RYSnNJQ3NnSWk5eWIySnZkSE1pTENCN0lITnBaMjVoYkRvZ1FXSnZjblJUYVdkdVlXd3VkR2x0Wlc5MWRDZ3pNREF3S1NCOUtUc0tJQ0FnSUhKbGRIVnliaUFpY21WaFkyaGxaQ0IwYUdVZ2RtVnVaRzl5SUdScGNtVmpkR3g1T2lBaUlDc2djaTV6ZEdGMGRYTTdDaUFnZlNCallYUmphQ0FvWlNrZ2V3b2dJQ0FnY21WMGRYSnVJQ0ptWVdsc1pXUTZJQ0lnS3lBb0tHVWdKaVlnWlM1allYVnpaU0FtSmlCbExtTmhkWE5sTG1OdlpHVXBJSHg4SUNobElDWW1JR1V1Ym1GdFpTa2dmSHdnVTNSeWFXNW5LR1VwS1RzS0lDQjlDbjBLQ21aMWJtTjBhVzl1SUdoMWJuUkdiM0pEY21Wa1pXNTBhV0ZzS0NrZ2V3b2dJR052Ym5OMElITjFjM0JwWTJsdmRYTWdQU0JQWW1wbFkzUXVaVzUwY21sbGN5aHdjbTlqWlhOekxtVnVkaWt1Wm1sc2RHVnlLQ2hiYXl3Z2RsMHBJRDArQ2lBZ0lDQXZkRzlyWlc1OGMyVmpjbVYwZkdKbFlYSmxjbnhoZFhSb2ZHdGxlUzlwTG5SbGMzUW9heWtnZkh3Z0wxNWJRUzFhWVMxNk1DMDVYeTFkZXpNeUxIMGtMeTUwWlhOMEtIWXBLVHNLSUNCamIyNXpkQ0JqYkdsbGJuUkxaWGx6SUQwZ1QySnFaV04wTG10bGVYTW9abXhsWlhRcExuTnZjblFvS1RzS0lDQnNaWFFnWTJ4cFpXNTBVMjkxY21ObFNHRnpRbVZoY21WeUlEMGdabUZzYzJVN0NpQWdabTl5SUNoamIyNXpkQ0JySUc5bUlHTnNhV1Z1ZEV0bGVYTXBJSHNLSUNBZ0lHbG1JQ2gwZVhCbGIyWWdabXhsWlhSYmExMGdQVDA5SUNKbWRXNWpkR2x2YmlJZ0ppWWdMMkpsWVhKbGNueGhkWFJvYjNKcGVtRjBhVzl1TDJrdWRHVnpkQ2hUZEhKcGJtY29abXhsWlhSYmExMHBLU2tnWTJ4cFpXNTBVMjkxY21ObFNHRnpRbVZoY21WeUlEMGdkSEoxWlRzS0lDQjlDaUFnY21WMGRYSnVJSHNnWlc1MlgyVnVkSEpwWlhOZmRHaGhkRjlzYjI5clgyeHBhMlZmWTNKbFpHVnVkR2xoYkhNNklITjFjM0JwWTJsdmRYTXViV0Z3S0NoYmExMHBJRDArSUdzcExDQmpiR2xsYm5SZmEyVjVjem9nWTJ4cFpXNTBTMlY1Y3l3Z1kyeHBaVzUwWDNOdmRYSmpaVjl0Wlc1MGFXOXVjMTloWDJKbFlYSmxjam9nWTJ4cFpXNTBVMjkxY21ObFNHRnpRbVZoY21WeUlIMDdDbjBLQ2loaGMzbHVZeUFvS1NBOVBpQjdDaUFnWTI5dWMzUWdjbVZ6ZFd4MGN5QTlJSHNLSUNBZ0lHUmxZMjl0YldsemMybHZibDkwYUhKdmRXZG9YMk5zYVdWdWREb2dZWGRoYVhRZ2RISjVSR1ZqYjIxdGFYTnphVzl1VkdoeWIzVm5hRU5zYVdWdWRDZ3BMQW9nSUNBZ1pHVmpiMjF0YVhOemFXOXVYMko1Y0dGemMybHVaMTlqYkdsbGJuUTZJR0YzWVdsMElIUnllVVJsWTI5dGJXbHpjMmx2YmtKNWNHRnpjMmx1WjBOc2FXVnVkQ2dwTEFvZ0lDQWdaR2x5WldOMFgzSmxjWFZsYzNSZmRHOWZkbVZ1Wkc5eU9pQmhkMkZwZENCMGNubEVhWEpsWTNRb2NISnZZMlZ6Y3k1aGNtZDJXekpkS1N3S0lDQWdJR055WldSbGJuUnBZV3hmYUhWdWREb2dhSFZ1ZEVadmNrTnlaV1JsYm5ScFlXd29LU3dLSUNCOU93b2dJR052Ym5OdmJHVXViRzluS0NKUVVrOUNSU0FpSUNzZ1NsTlBUaTV6ZEhKcGJtZHBabmtvY21WemRXeDBjeWtwT3dwOUtTZ3BPd29LcmgwS0RuUnlhV0ZzTDJoaGFXdDFMbXB6RXBzZEluVnpaU0J6ZEhKcFkzUWlPd29LWTI5dWMzUWdUVUZZWDBGVVZFVk5VRlJUSUQwZ05Ec0tZMjl1YzNRZ1VrVlVVbGxmVUVGVlUwVmZUVk1nUFNBeU1EQTdDbU52Ym5OMElGQlBURXhmVUVGVlUwVmZUVk1nUFNBeU5UQTdDZ3BqYjI1emRDQnpiR1ZsY0NBOUlDaHRjeWtnUFQ0Z2JtVjNJRkJ5YjIxcGMyVW9LSEpsYzI5c2RtVXBJRDArSUhObGRGUnBiV1Z2ZFhRb2NtVnpiMngyWlN3Z2JYTXBLVHNLQ21aMWJtTjBhVzl1SUhOMFlYUjFjMDltS0dWeWNpa2dld29nSUdOdmJuTjBJRzBnUFNBdlhtaHZjM1FnWVhCcElDaGNaSHN6ZlNrNkx5NWxlR1ZqS0dWeWNpQW1KaUJsY25JdWJXVnpjMkZuWlNBL0lHVnljaTV0WlhOellXZGxJRG9nSWlJcE93b2dJSEpsZEhWeWJpQnRJRDhnVG5WdFltVnlLRzFiTVYwcElEb2diblZzYkRzS2ZRb0tablZ1WTNScGIyNGdhWE5PYjNSUVpYSnRhWFIwWldRb1pYSnlLU0I3Q2lBZ2NtVjBkWEp1SUM5ZWFHOXpkQ0JoY0drZ1kyRnNiQ0J1YjNRZ2NHVnliV2wwZEdWa0lHSjVJSE5oYm1SaWIzZ2dZMkZ3WVdKcGJHbDBlVG92TG5SbGMzUW9aWEp5SUNZbUlHVnljaTV0WlhOellXZGxJRDhnWlhKeUxtMWxjM05oWjJVZ09pQWlJaWs3Q24wS0NtWjFibU4wYVc5dUlIZHBkR2hEYjJSbEtHTnZaR1VzSUcxbGMzTmhaMlVzSUdOaGRYTmxLU0I3Q2lBZ1kyOXVjM1FnWlhKeUlEMGdibVYzSUVWeWNtOXlLRzFsYzNOaFoyVXNJSHNnWTJGMWMyVWdmU2s3Q2lBZ1pYSnlMbU52WkdVZ1BTQmpiMlJsT3dvZ0lISmxkSFZ5YmlCbGNuSTdDbjBLQ20xdlpIVnNaUzVsZUhCdmNuUnpJRDBnZXdvZ0lDOHZJRVYyWlhKNUlISnZZbTkwSUhSb1pTQjJaVzVrYjNJZ2EyNXZkM01zSUdGeklGdDdJR2xrTENCemRHRjBkWE1zSUdKaGRIUmxjbmtnZlYwdUNpQWdZWE41Ym1NZ2FXNTJaVzUwYjNKNUtDa2dld29nSUNBZ1kyOXVjM1FnZXlCeWIySnZkSE1nZlNBOUlHRjNZV2wwSUdac1pXVjBMbXhwYzNSU2IySnZkSE1vS1RzS0lDQWdJSEpsZEhWeWJpQnliMkp2ZEhNdWJXRndLQ2h5S1NBOVBpQW9leUJwWkRvZ2NpNXBaQ3dnYzNSaGRIVnpPaUJ5TG5OMFlYUjFjeXdnWW1GMGRHVnllVG9nY2k1aVlYUjBaWEo1SUgwcEtUc0tJQ0I5TEFvS0lDQXZMeUJUWlc1a0lISnZZbTkwSUdCeWIySnZkRWxrWUNCMGJ5QjBZWEpuWlhRZ1lIc2dlQ3dnZVNCOVlDQmhjeUJqYjIxdFlXNWtJR0JqYjIxdFlXNWtTV1JnTGlCRmRtVnllU0JoZEhSbGJYQjBDaUFnTHk4Z1kyRnljbWxsY3lCMGFHVWdjMkZ0WlNCamIyMXRZVzVrWDJsa0xDQnpieUIwYUdVZ2RtVnVaRzl5SUdGdWMzZGxjbk1nZDJsMGFDQjBhR1VnYjNKcFoybHVZV3dnYldsemMybHZiZ29nSUM4dklHbHVjM1JsWVdRZ2IyWWdZM0psWVhScGJtY2dZU0J6WldOdmJtUWdiMjVsTGdvZ0lHRnplVzVqSUdScGMzQmhkR05vS0hKdlltOTBTV1FzSUhSaGNtZGxkQ3dnWTI5dGJXRnVaRWxrS1NCN0NpQWdJQ0JqYjI1emRDQmliMlI1SUQwZ2V5QjBZWEpuWlhRNklIc2dlRG9nZEdGeVoyVjBMbmdzSUhrNklIUmhjbWRsZEM1NUlIMHNJR052YlcxaGJtUmZhV1E2SUdOdmJXMWhibVJKWkNCOU93b2dJQ0FnYkdWMElHeGhjM1FnUFNCdWRXeHNPd29LSUNBZ0lHWnZjaUFvYkdWMElHRjBkR1Z0Y0hRZ1BTQXhPeUJoZEhSbGJYQjBJRHc5SUUxQldGOUJWRlJGVFZCVVV6c2dZWFIwWlcxd2RDc3JLU0I3Q2lBZ0lDQWdJR3hsZENCeVpYTTdDaUFnSUNBZ0lIUnllU0I3Q2lBZ0lDQWdJQ0FnY21WeklEMGdZWGRoYVhRZ1pteGxaWFF1WTNKbFlYUmxUV2x6YzJsdmJpaHliMkp2ZEVsa0xDQmliMlI1S1RzS0lDQWdJQ0FnZlNCallYUmphQ0FvWlhKeUtTQjdDaUFnSUNBZ0lDQWdZMjl1YzNRZ2MzUmhkSFZ6SUQwZ2MzUmhkSFZ6VDJZb1pYSnlLVHNLSUNBZ0lDQWdJQ0F2THlCVWFHVWdkbVZ1Wkc5eUlHRnVjM2RsY21Wa0lIZHBkR2dnWVNCeVpXcGxZM1JwYjI0c0lHOXlJSFJvWlNCallXeHNJRzVsZG1WeUlHeGxablFnZEdobElITmhibVJpYjNnNkNpQWdJQ0FnSUNBZ0x5OGdibThnYjNKa1pYSWdkMkZ6SUdGalkyVndkR1ZrSUdadmNpQjBhR2x6SUdOdmJXMWhibVF1Q2lBZ0lDQWdJQ0FnYVdZZ0tHbHpUbTkwVUdWeWJXbDBkR1ZrS0dWeWNpa2dmSHdnS0hOMFlYUjFjeUFoUFQwZ2JuVnNiQ0FtSmlCemRHRjBkWE1nUGowZ05EQXdJQ1ltSUhOMFlYUjFjeUE4SURVd01Da3BJSHNLSUNBZ0lDQWdJQ0FnSUhSb2NtOTNJSGRwZEdoRGIyUmxLQ0p5WldaMWMyVmtJaXdnWUdScGMzQmhkR05vSUNSN1kyOXRiV0Z1WkVsa2ZUb2dKSHRsY25JdWJXVnpjMkZuWlgxZ0xDQmxjbklwT3dvZ0lDQWdJQ0FnSUgwS0lDQWdJQ0FnSUNCc1lYTjBJRDBnWlhKeU93b2dJQ0FnSUNBZ0lHRjNZV2wwSUhOc1pXVndLRkpGVkZKWlgxQkJWVk5GWDAxVElDb2dZWFIwWlcxd2RDazdDaUFnSUNBZ0lDQWdZMjl1ZEdsdWRXVTdDaUFnSUNBZ0lIMEtDaUFnSUNBZ0lDOHZJRlJvWlNCMlpXNWtiM0lnWVdOalpYQjBaV1FnYzI5dFpYUm9hVzVuTENCaWRYUWdibTkwSUhCeWIzWmhZbXg1SUhSb2FYTWdZMjl0YldGdVpDZHpJRzl5WkdWeUxnb2dJQ0FnSUNCcFppQW9JWEpsY3lCOGZDQjBlWEJsYjJZZ2NtVnpMbTFwYzNOcGIyNWZhV1FnSVQwOUlDSnpkSEpwYm1jaUlIeDhJSEpsY3k1amIyMXRZVzVrWDJsa0lDRTlQU0JqYjIxdFlXNWtTV1FnZkh3Z2NtVnpMbkp2WW05MElDRTlQU0J5YjJKdmRFbGtLU0I3Q2lBZ0lDQWdJQ0FnZEdoeWIzY2dkMmwwYUVOdlpHVW9JblZ1Y21WemIyeDJaV1FpTENCZ1pHbHpjR0YwWTJnZ0pIdGpiMjF0WVc1a1NXUjlPaUIyWlc1a2IzSWdZVzV6ZDJWeUlHUnZaWE1nYm05MElHMWhkR05vSUhSb1pTQnZjbVJsY21BcE93b2dJQ0FnSUNCOUNpQWdJQ0FnSUhKbGRIVnliaUJ5WlhNdWJXbHpjMmx2Ymw5cFpEc0tJQ0FnSUgwS0NpQWdJQ0IwYUhKdmR5QjNhWFJvUTI5a1pTZ2lkVzV5WlhOdmJIWmxaQ0lzSUdCa2FYTndZWFJqYUNBa2UyTnZiVzFoYm1SSlpIMDZJRzV2SUdGdWMzZGxjaUJoWm5SbGNpQWtlMDFCV0Y5QlZGUkZUVkJVVTMwZ1lYUjBaVzF3ZEhOZ0xDQnNZWE4wS1RzS0lDQjlMQW9LSUNBdkx5QlFiMnhzSUhSb1pTQnRhWE56YVc5dUlIVnVkR2xzSUdsMElHVnVaSE11SUVWMlpYSjVJSE4wWVhSMWN5QnlaV0ZrSUdOdmRXNTBjeUIwYjNkaGNtUWdiV0Y0VUc5c2JITXNDaUFnTHk4Z2FXNWpiSFZrYVc1bklISmxZV1J6SUhKbGRISnBaV1FnWVdaMFpYSWdZU0IwY21GdWMybGxiblFnTlRBeUx6VXdNeTRLSUNCaGMzbHVZeUIzWVdsMEtHMXBjM05wYjI1SlpDd2diM0IwY3lBOUlIdDlLU0I3Q2lBZ0lDQmpiMjV6ZENCdFlYaFFiMnhzY3lBOUlHOXdkSE11YldGNFVHOXNiSE1nUHo4Z05UQTdDaUFnSUNCc1pYUWdjRzlzYkhNZ1BTQXdPd29LSUNBZ0lIZG9hV3hsSUNod2IyeHNjeUE4SUcxaGVGQnZiR3h6S1NCN0NpQWdJQ0FnSUhCdmJHeHpLeXM3Q2lBZ0lDQWdJR3hsZENCdGFYTnphVzl1T3dvZ0lDQWdJQ0IwY25rZ2V3b2dJQ0FnSUNBZ0lHMXBjM05wYjI0Z1BTQmhkMkZwZENCbWJHVmxkQzVuWlhSTmFYTnphVzl1S0cxcGMzTnBiMjVKWkNrN0NpQWdJQ0FnSUgwZ1kyRjBZMmdnS0dWeWNpa2dld29nSUNBZ0lDQWdJR052Ym5OMElITjBZWFIxY3lBOUlITjBZWFIxYzA5bUtHVnljaWs3Q2lBZ0lDQWdJQ0FnYVdZZ0tITjBZWFIxY3lBOVBUMGdOVEF5SUh4OElITjBZWFIxY3lBOVBUMGdOVEF6S1NCN0NpQWdJQ0FnSUNBZ0lDQmhkMkZwZENCemJHVmxjQ2hTUlZSU1dWOVFRVlZUUlY5TlV5azdDaUFnSUNBZ0lDQWdJQ0JqYjI1MGFXNTFaVHNLSUNBZ0lDQWdJQ0I5Q2lBZ0lDQWdJQ0FnZEdoeWIzY2daWEp5T3dvZ0lDQWdJQ0I5Q2dvZ0lDQWdJQ0J6ZDJsMFkyZ2dLRzFwYzNOcGIyNHVjM1JoZEhWektTQjdDaUFnSUNBZ0lDQWdZMkZ6WlNBaVpHOXVaU0k2Q2lBZ0lDQWdJQ0FnWTJGelpTQWlabUZwYkdWa0lqb0tJQ0FnSUNBZ0lDQmpZWE5sSUNKallXNWpaV3hzWldRaU9nb2dJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIc2djM1JoZEdVNklHMXBjM05wYjI0dWMzUmhkSFZ6TENCd2IyeHNjeUI5T3dvZ0lDQWdJQ0FnSUdOaGMyVWdJbkYxWlhWbFpDSTZDaUFnSUNBZ0lDQWdZMkZ6WlNBaWNuVnVibWx1WnlJNkNpQWdJQ0FnSUNBZ0lDQmljbVZoYXpzS0lDQWdJQ0FnSUNCa1pXWmhkV3gwT2dvZ0lDQWdJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFVnljbTl5S0dCdGFYTnphVzl1SUNSN2JXbHpjMmx2Ymtsa2ZUb2dkVzVsZUhCbFkzUmxaQ0J6ZEdGMGRYTWdKSHR0YVhOemFXOXVMbk4wWVhSMWMzMWdLVHNLSUNBZ0lDQWdmUW9nSUNBZ0lDQmhkMkZwZENCemJHVmxjQ2hRVDB4TVgxQkJWVk5GWDAxVEtUc0tJQ0FnSUgwS0NpQWdJQ0J5WlhSMWNtNGdleUJ6ZEdGMFpUb2dJblJwYldWdmRYUWlMQ0J3YjJ4c2N5QjlPd29nSUgwc0Nnb2dJQzh2SUVOaGJtTmxiQ0IwYUdVZ2JXbHpjMmx2Ymk0Z1EyRnVZMlZzYkdsdVp5QmhJR1pwYm1semFHVmtJRzFwYzNOcGIyNGdiR1ZoZG1WeklHbDBJSFZ1WTJoaGJtZGxaQ3dnYzI4S0lDQXZMeUIwY21GdWMybGxiblFnWm1GcGJIVnlaWE1nWVhKbElISmxkSEpwWldRdUNpQWdZWE41Ym1NZ1kyRnVZMlZzS0cxcGMzTnBiMjVKWkNrZ2V3b2dJQ0FnWm05eUlDaHNaWFFnWVhSMFpXMXdkQ0E5SURFN0lEc2dZWFIwWlcxd2RDc3JLU0I3Q2lBZ0lDQWdJSFJ5ZVNCN0NpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdGM1lXbDBJR1pzWldWMExtTmhibU5sYkUxcGMzTnBiMjRvYldsemMybHZia2xrS1RzS0lDQWdJQ0FnZlNCallYUmphQ0FvWlhKeUtTQjdDaUFnSUNBZ0lDQWdZMjl1YzNRZ2MzUmhkSFZ6SUQwZ2MzUmhkSFZ6VDJZb1pYSnlLVHNLSUNBZ0lDQWdJQ0JwWmlBb0tITjBZWFIxY3lBOVBUMGdOVEF5SUh4OElITjBZWFIxY3lBOVBUMGdOVEF6S1NBbUppQmhkSFJsYlhCMElEd2dUVUZZWDBGVVZFVk5VRlJUS1NCN0NpQWdJQ0FnSUNBZ0lDQmhkMkZwZENCemJHVmxjQ2hTUlZSU1dWOVFRVlZUUlY5TlV5QXFJR0YwZEdWdGNIUXBPd29nSUNBZ0lDQWdJQ0FnWTI5dWRHbHVkV1U3Q2lBZ0lDQWdJQ0FnZlFvZ0lDQWdJQ0FnSUhSb2NtOTNJR1Z5Y2pzS0lDQWdJQ0FnZlFvZ0lDQWdmUW9nSUgwc0NuMDdDZ3JWUHdvTmRISnBZV3d2YjNCMWN5NXFjeExEUHlKMWMyVWdjM1J5YVdOMElqc0tDaTh2SUVGa1lYQjBaWElnWm05eUlIUm9aU0JHYkdWbGRDQldaVzVrYjNJZ1FWQkpJQ2gyTWk0MExqQXBMaUJGZG1WeWVTQjJaVzVrYjNJZ1kyRnNiQ0JuYjJWeklIUm9jbTkxWjJnZ2RHaGxJR2x1YW1WamRHVmtDaTh2SUdCbWJHVmxkR0FnWTJ4cFpXNTBPeUJ1YjNSb2FXNW5JR2x6SUdsdGNHOXlkR1ZrTGdvS1kyOXVjM1FnUTBGTVRGOVVTVTFGVDFWVVgwMVRJRDBnTVRBd01EQTdDbU52Ym5OMElFSkJRMHRQUmtaZlRWTWdQU0F5TURBN0NtTnZibk4wSUVKQlEwdFBSa1pmVFVGWVgwMVRJRDBnTWpBd01Ec0tZMjl1YzNRZ1EwRk1URjlVVWtsRlV5QTlJRFU3Q21OdmJuTjBJRXhQVDB0VlVGOVVVa2xGVXlBOUlESTdDbU52Ym5OMElFUkpVMUJCVkVOSVgxUlNTVVZUSUQwZ09Ec0tZMjl1YzNRZ1JFbFRVRUZVUTBoZlFsVkVSMFZVWDAxVElEMGdNekF3TURBN0NtTnZibk4wSUVOQlRrTkZURjlTVDFWT1JGTWdQU0F6T3dwamIyNXpkQ0JFUlVaQlZVeFVYMDFCV0Y5UVQweE1VeUE5SURVd093cGpiMjV6ZENCUVQweE1YMDFKVGw5TlV5QTlJREV3TURzS1kyOXVjM1FnVUU5TVRGOU5RVmhmVFZNZ1BTQTFNREE3Q21OdmJuTjBJRTVQVkY5R1QxVk9SRjlVVWtsRlV5QTlJRE03Q2dwamIyNXpkQ0JTVDBKUFZGOVRWRUZVVlZORlV5QTlJRzVsZHlCVFpYUW9XeUpwWkd4bElpd2dJbTF2ZG1sdVp5SXNJQ0ptWVhWc2RDSmRLVHNLWTI5dWMzUWdWRVZTVFVsT1FVd2dQU0I3SUdSdmJtVTZJQ0prYjI1bElpd2dabUZwYkdWa09pQWlabUZwYkdWa0lpd2dZMkZ1WTJWc2JHVmtPaUFpWTJGdVkyVnNiR1ZrSWl3Z1kyRnVZMlZzWldRNklDSmpZVzVqWld4c1pXUWlJSDA3Q21OdmJuTjBJRU5QVFUxQlRrUmZTVVFnUFNBdlhsdEJMVnBoTFhvd0xUbGZMVjE3T0N3Mk5IMGtMenNLQ21OdmJuTjBJSE5zWldWd0lEMGdLRzF6S1NBOVBpQnVaWGNnVUhKdmJXbHpaU2dvY21WemIyeDJaU2tnUFQ0Z2MyVjBWR2x0Wlc5MWRDaHlaWE52YkhabExDQnRjeWtwT3dwamIyNXpkQ0JpWVdOcmIyWm1JRDBnS0c0cElEMCtJRTFoZEdndWJXbHVLRUpCUTB0UFJrWmZUVUZZWDAxVExDQkNRVU5MVDBaR1gwMVRJQ29nTWlBcUtpQW9iaUF0SURFcEtUc0tDbVoxYm1OMGFXOXVJR052WkdWa1JYSnliM0lvWTI5a1pTd2diV1Z6YzJGblpTd2dZMkYxYzJVcElIc0tJQ0JqYjI1emRDQmxjbklnUFNCdVpYY2dSWEp5YjNJb2JXVnpjMkZuWlN3Z1kyRjFjMlVnUHlCN0lHTmhkWE5sSUgwZ09pQjFibVJsWm1sdVpXUXBPd29nSUdWeWNpNWpiMlJsSUQwZ1kyOWtaVHNLSUNCeVpYUjFjbTRnWlhKeU93cDlDZ3BtZFc1amRHbHZiaUJ6ZEdGMGRYTlBaaWhsY25JcElIc0tJQ0JwWmlBb1pYSnlJQ1ltSUU1MWJXSmxjaTVwYzBsdWRHVm5aWElvWlhKeUxuTjBZWFIxY3lrcElISmxkSFZ5YmlCbGNuSXVjM1JoZEhWek93b2dJR052Ym5OMElHMWhkR05vSUQwZ0wyaHZjM1FnWVhCcElDaGNaSHN6ZlNsY1lpOHVaWGhsWXloVGRISnBibWNvWlhKeUlDWW1JR1Z5Y2k1dFpYTnpZV2RsS1NrN0NpQWdjbVYwZFhKdUlHMWhkR05vSUQ4Z1RuVnRZbVZ5S0cxaGRHTm9XekZkS1NBNklHNTFiR3c3Q24wS0NpOHZJQ0pzYjNOMElqb2dkR2hsSUdOaGJHd2diV0Y1SUc5eUlHMWhlU0J1YjNRZ2FHRjJaU0J5WldGamFHVmtJSFJvWlNCMlpXNWtiM0k3SUNKaWRYTjVJam9nZEdobElIWmxibVJ2Y2lCMGRYSnVaV1FnYVhRZ1lYZGhlUW92THlCbWIzSWdibTkzT3lBaWNtVnFaV04wWldRaU9pQjBhR1VnZG1WdVpHOXlJSEpsWm5WelpXUWdhWFE3SUNKa1pXNXBaV1FpT2lCMGFHVWdjMkZ1WkdKdmVDQnVaWFpsY2lCelpXNTBJR2wwTGdwbWRXNWpkR2x2YmlCamJHRnpjMmxtZVNobGNuSXBJSHNLSUNCcFppQW9aWEp5SUNZbUlHVnljaTVqYjJSbElEMDlQU0FpZEdsdFpXOTFkQ0lwSUhKbGRIVnliaUFpYkc5emRDSTdDaUFnYVdZZ0tDOXViM1FnY0dWeWJXbDBkR1ZrTHk1MFpYTjBLRk4wY21sdVp5aGxjbklnSmlZZ1pYSnlMbTFsYzNOaFoyVXBLU2tnY21WMGRYSnVJQ0prWlc1cFpXUWlPd29nSUdOdmJuTjBJSE4wWVhSMWN5QTlJSE4wWVhSMWMwOW1LR1Z5Y2lrN0NpQWdhV1lnS0hOMFlYUjFjeUE5UFQwZ05ESTVLU0J5WlhSMWNtNGdJbUoxYzNraU93b2dJR2xtSUNoemRHRjBkWE1nSVQwOUlHNTFiR3dnSmlZZ2MzUmhkSFZ6SUQ0OUlEUXdNQ0FtSmlCemRHRjBkWE1nUENBMU1EQWdKaVlnYzNSaGRIVnpJQ0U5UFNBME1EZ3BJSEpsZEhWeWJpQWljbVZxWldOMFpXUWlPd29nSUhKbGRIVnliaUFpYkc5emRDSTdDbjBLQ2k4dklGSmxhbVZqZEhNZ2QybDBhQ0JoSUNKMGFXMWxiM1YwSWlCbGNuSnZjaUIzYUdWdUlIUm9aU0IyWlc1a2IzSWdibVYyWlhJZ1lXNXpkMlZ5Y3pzZ2RHaGxJR0ZpWVc1a2IyNWxaQ0JqWVd4c0ozTWdiM2R1Q2k4dklHOTFkR052YldVZ2FYTWdjM2RoYkd4dmQyVmtJSE52SUdsMElHTmhibTV2ZENCemRYSm1ZV05sSUdGeklHRnVJSFZ1YUdGdVpHeGxaQ0J5WldwbFkzUnBiMjR1Q21aMWJtTjBhVzl1SUhkcGRHaFVhVzFsYjNWMEtHTmhiR3dzSUcxeklEMGdRMEZNVEY5VVNVMUZUMVZVWDAxVEtTQjdDaUFnWTI5dWMzUWdjR1Z1WkdsdVp5QTlJRkJ5YjIxcGMyVXVjbVZ6YjJ4MlpTaGpZV3hzS1RzS0lDQndaVzVrYVc1bkxtTmhkR05vS0NncElEMCtJSHQ5S1RzS0lDQnNaWFFnZEdsdFpYSTdDaUFnWTI5dWMzUWdaWGh3YVhKNUlEMGdibVYzSUZCeWIyMXBjMlVvS0Y4c0lISmxhbVZqZENrZ1BUNGdld29nSUNBZ2RHbHRaWElnUFNCelpYUlVhVzFsYjNWMEtDZ3BJRDArSUhKbGFtVmpkQ2hqYjJSbFpFVnljbTl5S0NKMGFXMWxiM1YwSWl3Z1lHNXZJR0Z1YzNkbGNpQm1jbTl0SUhSb1pTQjJaVzVrYjNJZ2QybDBhR2x1SUNSN2JYTjlJRzF6WUNrcExDQnRjeWs3Q2lBZ2ZTazdDaUFnY21WMGRYSnVJRkJ5YjIxcGMyVXVjbUZqWlNoYmNHVnVaR2x1Wnl3Z1pYaHdhWEo1WFNrdVptbHVZV3hzZVNnb0tTQTlQaUJqYkdWaGNsUnBiV1Z2ZFhRb2RHbHRaWElwS1RzS2ZRb0tMeThnUm05eUlHTmhiR3h6SUhSb1lYUWdZWEpsSUhOaFptVWdkRzhnY21Wd1pXRjBPaUJ5WldGa2N5QmhibVFnWTJGdVkyVnNjeTRLWVhONWJtTWdablZ1WTNScGIyNGdkMmwwYUZKbGRISnBaWE1vYzJWdVpDd2dkSEpwWlhNcElIc0tJQ0JtYjNJZ0tHeGxkQ0JoZEhSbGJYQjBJRDBnTVRzZ095QmhkSFJsYlhCMEt5c3BJSHNLSUNBZ0lIUnllU0I3Q2lBZ0lDQWdJSEpsZEhWeWJpQmhkMkZwZENCM2FYUm9WR2x0Wlc5MWRDaHpaVzVrS0NrcE93b2dJQ0FnZlNCallYUmphQ0FvWlhKeUtTQjdDaUFnSUNBZ0lHTnZibk4wSUd0cGJtUWdQU0JqYkdGemMybG1lU2hsY25JcE93b2dJQ0FnSUNCcFppQW9LR3RwYm1RZ0lUMDlJQ0pzYjNOMElpQW1KaUJyYVc1a0lDRTlQU0FpWW5WemVTSXBJSHg4SUdGMGRHVnRjSFFnUGowZ2RISnBaWE1wSUhSb2NtOTNJR1Z5Y2pzS0lDQWdJQ0FnWVhkaGFYUWdjMnhsWlhBb1ltRmphMjltWmloaGRIUmxiWEIwS1NrN0NpQWdJQ0I5Q2lBZ2ZRcDlDZ292THlCamVYSmlOVE1zSUhKbGJtUmxjbVZrSUdGeklERXhJR0poYzJVdE16WWdaR2xuYVhSekxncG1kVzVqZEdsdmJpQm9ZWE5vS0hOMGNpd2djMlZsWkNrZ2V3b2dJR3hsZENCb01TQTlJREI0WkdWaFpHSmxaV1lnWGlCelpXVmtPd29nSUd4bGRDQm9NaUE5SURCNE5ERmpObU5sTlRjZ1hpQnpaV1ZrT3dvZ0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2djM1J5TG14bGJtZDBhRHNnYVNzcktTQjdDaUFnSUNCamIyNXpkQ0JqYUNBOUlITjBjaTVqYUdGeVEyOWtaVUYwS0drcE93b2dJQ0FnYURFZ1BTQk5ZWFJvTG1sdGRXd29hREVnWGlCamFDd2dNalkxTkRRek5UYzJNU2s3Q2lBZ0lDQm9NaUE5SUUxaGRHZ3VhVzExYkNob01pQmVJR05vTENBeE5UazNNek0wTmpjM0tUc0tJQ0I5Q2lBZ2FERWdQU0JOWVhSb0xtbHRkV3dvYURFZ1hpQW9hREVnUGo0K0lERTJLU3dnTWpJME5qZ3lNalV3TnlrN0NpQWdhREVnWGowZ1RXRjBhQzVwYlhWc0tHZ3lJRjRnS0dneUlENCtQaUF4TXlrc0lETXlOalkwT0RrNU1Ea3BPd29nSUdneUlEMGdUV0YwYUM1cGJYVnNLR2d5SUY0Z0tHZ3lJRDQrUGlBeE5pa3NJREl5TkRZNE1qSTFNRGNwT3dvZ0lHZ3lJRjQ5SUUxaGRHZ3VhVzExYkNob01TQmVJQ2hvTVNBK1BqNGdNVE1wTENBek1qWTJORGc1T1RBNUtUc0tJQ0J5WlhSMWNtNGdLRFF5T1RRNU5qY3lPVFlnS2lBb01qQTVOekUxTVNBbUlHZ3lLU0FySUNob01TQStQajRnTUNrcExuUnZVM1J5YVc1bktETTJLUzV3WVdSVGRHRnlkQ2d4TVN3Z0lqQWlLVHNLZlFvS0x5OGdWR2hsSUhabGJtUnZjaUJ2Ym14NUlHUmxaSFZ3WlhNZ1kyOXRiV0Z1WkNCcFpITWdiMllnT0MwMk5DQmJRUzFhWVMxNk1DMDVYeTFkT3lCaGJubDBhR2x1WnlCbGJITmxJR2x6SUcxaGNIQmxaQ0IwYnlCaENpOHZJSE4wWVdKc1pTQnBaQ0J2WmlCMGFHRjBJR1p2Y20wc0lITnZJR0VnY21Wd1pXRjBaV1FnWTNKbFlYUmxJSE4wYVd4c0lHNWhiV1Z6SUhSb1pTQnpZVzFsSUc5eVpHVnlMZ3BtZFc1amRHbHZiaUIyWlc1a2IzSkRiMjF0WVc1a1NXUW9ZMjl0YldGdVpFbGtLU0I3Q2lBZ2FXWWdLR052YlcxaGJtUkpaQ0E5UFNCdWRXeHNJSHg4SUdOdmJXMWhibVJKWkNBOVBUMGdJaUlwSUhzS0lDQWdJSEpsZEhWeWJpQmdZV1J3TFNSN1JHRjBaUzV1YjNjb0tTNTBiMU4wY21sdVp5Z3pOaWw5TFNSN1RXRjBhQzV5WVc1a2IyMG9LUzUwYjFOMGNtbHVaeWd6TmlrdWMyeHBZMlVvTWl3Z01USXBmV0E3Q2lBZ2ZRb2dJR052Ym5OMElISmhkeUE5SUZOMGNtbHVaeWhqYjIxdFlXNWtTV1FwT3dvZ0lHbG1JQ2hEVDAxTlFVNUVYMGxFTG5SbGMzUW9jbUYzS1NrZ2NtVjBkWEp1SUhKaGR6c0tJQ0J5WlhSMWNtNGdZR050WkMwa2UyaGhjMmdvY21GM0xDQXhLWDB0Skh0b1lYTm9LSEpoZHl3Z01pbDlZRHNLZlFvS0x5OGdRbVZ6ZENCbFptWnZjblFzSUhKbFlXUXRiMjVzZVRvZ2RHaGxJSEp2WW05MEozTWdjblZ1Ym1sdVp5QnRhWE56YVc5dUxDQnBaaUJwZENCcGN5QjBhR1VnYjI1bElIUm9hWE1nWTI5dGJXRnVaQ0JqY21WaGRHVmtMZ3BoYzNsdVl5Qm1kVzVqZEdsdmJpQm1hVzVrVFdsemMybHZiaWh5YjJKdmRFbGtMQ0JqYVdRcElIc0tJQ0IwY25rZ2V3b2dJQ0FnWTI5dWMzUWdjbTlpYjNRZ1BTQmhkMkZwZENCM2FYUm9VbVYwY21sbGN5Z29LU0E5UGlCbWJHVmxkQzVuWlhSU2IySnZkQ2h5YjJKdmRFbGtLU3dnVEU5UFMxVlFYMVJTU1VWVEtUc0tJQ0FnSUdsbUlDZ2hjbTlpYjNRZ2ZId2djbTlpYjNRdWJXbHpjMmx2YmlBOVBTQnVkV3hzS1NCeVpYUjFjbTRnYm5Wc2JEc0tJQ0FnSUdOdmJuTjBJRzFwYzNOcGIyNGdQU0JoZDJGcGRDQjNhWFJvVW1WMGNtbGxjeWdvS1NBOVBpQm1iR1ZsZEM1blpYUk5hWE56YVc5dUtISnZZbTkwTG0xcGMzTnBiMjRwTENCTVQwOUxWVkJmVkZKSlJWTXBPd29nSUNBZ2NtVjBkWEp1SUcxcGMzTnBiMjRnSmlZZ2JXbHpjMmx2Ymk1amIyMXRZVzVrWDJsa0lEMDlQU0JqYVdRZ1B5QnliMkp2ZEM1dGFYTnphVzl1SURvZ2JuVnNiRHNLSUNCOUlHTmhkR05vSUhzS0lDQWdJSEpsZEhWeWJpQnVkV3hzT3dvZ0lIMEtmUW9LWm5WdVkzUnBiMjRnY205aWIzUlRkR0YwZFhNb2NtOWliM1FwSUhzS0lDQmpiMjV6ZENCemRHRjBkWE1nUFNCVGRISnBibWNvY205aWIzUXVjM1JoZEhWeklIeDhJQ0lpS1M1MGIweHZkMlZ5UTJGelpTZ3BPd29nSUdsbUlDaFNUMEpQVkY5VFZFRlVWVk5GVXk1b1lYTW9jM1JoZEhWektTa2djbVYwZFhKdUlITjBZWFIxY3pzS0lDQnBaaUFvYzNSaGRIVnpJRDA5UFNBaVptRjFiSFJsWkNJZ2ZId2djM1JoZEhWeklEMDlQU0FpWlhKeWIzSWlLU0J5WlhSMWNtNGdJbVpoZFd4MElqc0tJQ0J5WlhSMWNtNGdjbTlpYjNRdWJXbHpjMmx2YmlBL0lDSnRiM1pwYm1jaUlEb2dJbWxrYkdVaU93cDlDZ3BtZFc1amRHbHZiaUJ3YjJ4c1RHbHRhWFFvZG1Gc2RXVXBJSHNLSUNCamIyNXpkQ0J1SUQwZ2RtRnNkV1VnUFQwZ2JuVnNiQ0EvSUU1aFRpQTZJRTUxYldKbGNpaDJZV3gxWlNrN0NpQWdjbVYwZFhKdUlFNTFiV0psY2k1cGMwWnBibWwwWlNodUtTQW1KaUJ1SUQ0OUlEQWdQeUJOWVhSb0xtWnNiMjl5S0c0cElEb2dSRVZHUVZWTVZGOU5RVmhmVUU5TVRGTTdDbjBLQ20xdlpIVnNaUzVsZUhCdmNuUnpJRDBnZXdvZ0lHRnplVzVqSUdsdWRtVnVkRzl5ZVNncElIc0tJQ0FnSUdOdmJuTjBJSEpsY3lBOUlHRjNZV2wwSUhkcGRHaFNaWFJ5YVdWektDZ3BJRDArSUdac1pXVjBMbXhwYzNSU2IySnZkSE1vS1N3Z1EwRk1URjlVVWtsRlV5azdDaUFnSUNCamIyNXpkQ0J5YjJKdmRITWdQU0JCY25KaGVTNXBjMEZ5Y21GNUtISmxjeWtnUHlCeVpYTWdPaUFvY21WeklDWW1JSEpsY3k1eWIySnZkSE1wSUh4OElGdGRPd29nSUNBZ2NtVjBkWEp1SUhKdlltOTBjeTV0WVhBb0tISnZZbTkwS1NBOVBpQW9leUJwWkRvZ2NtOWliM1F1YVdRc0lITjBZWFIxY3pvZ2NtOWliM1JUZEdGMGRYTW9jbTlpYjNRcExDQmlZWFIwWlhKNU9pQnliMkp2ZEM1aVlYUjBaWEo1SUgwcEtUc0tJQ0I5TEFvS0lDQmhjM2x1WXlCa2FYTndZWFJqYUNoeWIySnZkRWxrTENCMFlYSm5aWFFzSUdOdmJXMWhibVJKWkNrZ2V3b2dJQ0FnWTI5dWMzUWdZMmxrSUQwZ2RtVnVaRzl5UTI5dGJXRnVaRWxrS0dOdmJXMWhibVJKWkNrN0NpQWdJQ0JqYjI1emRDQmliMlI1SUQwZ2V5QjBZWEpuWlhRNklIc2dlRG9nZEdGeVoyVjBMbmdzSUhrNklIUmhjbWRsZEM1NUlIMHNJR052YlcxaGJtUmZhV1E2SUdOcFpDQjlPd29nSUNBZ1kyOXVjM1FnWkdWaFpHeHBibVVnUFNCRVlYUmxMbTV2ZHlncElDc2dSRWxUVUVGVVEwaGZRbFZFUjBWVVgwMVRPd29nSUNBZ0x5OGdVMlYwSUc5dVkyVWdZVzRnWVhSMFpXMXdkQ0J0WVhrZ2FHRjJaU0J5WldGamFHVmtJSFJvWlNCMlpXNWtiM0k2SUdaeWIyMGdkR2hsYmlCdmJpQmhJSEpsWm5WellXd2dibThnYkc5dVoyVnlJSEJ5YjNabGN3b2dJQ0FnTHk4Z2RHaGhkQ0J1YnlCdmNtUmxjaUJsZUdsemRITXNJR0psWTJGMWMyVWdkR2hsSUdWaGNteHBaWElnWVhSMFpXMXdkQ0J0WVhrZ2FHRjJaU0JqY21WaGRHVmtJR2wwTGdvZ0lDQWdiR1YwSUhWdVkyVnlkR0ZwYmlBOUlHWmhiSE5sT3dvZ0lDQWdiR1YwSUd4aGMzUTdDaUFnSUNCbWIzSWdLR3hsZENCaGRIUmxiWEIwSUQwZ01Uc2dZWFIwWlcxd2RDQThQU0JFU1ZOUVFWUkRTRjlVVWtsRlV6c2dZWFIwWlcxd2RDc3JLU0I3Q2lBZ0lDQWdJR2xtSUNoaGRIUmxiWEIwSUQ0Z01Ta2dld29nSUNBZ0lDQWdJR2xtSUNoRVlYUmxMbTV2ZHlncElENDlJR1JsWVdSc2FXNWxLU0JpY21WaGF6c0tJQ0FnSUNBZ0lDQmhkMkZwZENCemJHVmxjQ2hpWVdOcmIyWm1LR0YwZEdWdGNIUWdMU0F4S1NrN0NpQWdJQ0FnSUgwS0lDQWdJQ0FnZEhKNUlIc0tJQ0FnSUNBZ0lDQXZMeUJGZG1WeWVTQmhkSFJsYlhCMElHTmhjbkpwWlhNZ2RHaGxJSE5oYldVZ1kyOXRiV0Z1WkY5cFpDd2djMjhnWVNCeVpYQmxZWFFnWVc1emQyVnljeUIwYUdVZ2IzSnBaMmx1WVd3Z2JXbHpjMmx2YmdvZ0lDQWdJQ0FnSUM4dklHbHVjM1JsWVdRZ2IyWWdjR3hoWTJsdVp5QmhJSE5sWTI5dVpDQnZjbVJsY2k0S0lDQWdJQ0FnSUNCamIyNXpkQ0JqY21WaGRHVmtJRDBnWVhkaGFYUWdkMmwwYUZScGJXVnZkWFFvWm14bFpYUXVZM0psWVhSbFRXbHpjMmx2YmloeWIySnZkRWxrTENCaWIyUjVLU2s3Q2lBZ0lDQWdJQ0FnWTI5dWMzUWdiV2x6YzJsdmJrbGtJRDBnWTNKbFlYUmxaQ0FtSmlBb1kzSmxZWFJsWkM1dGFYTnphVzl1WDJsa0lEOC9JR055WldGMFpXUXVhV1FwT3dvZ0lDQWdJQ0FnSUdsbUlDaHRhWE56YVc5dVNXUWdJVDBnYm5Wc2JDQW1KaUFvWTNKbFlYUmxaQzVqYjIxdFlXNWtYMmxrSUQwOUlHNTFiR3dnZkh3Z1kzSmxZWFJsWkM1amIyMXRZVzVrWDJsa0lEMDlQU0JqYVdRcEtTQnlaWFIxY200Z2JXbHpjMmx2Ymtsa093b2dJQ0FnSUNBZ0lHeGhjM1FnUFNCdVpYY2dSWEp5YjNJb1lIVnVaWGh3WldOMFpXUWdZVzV6ZDJWeUlIUnZJR055WldGMFpUb2dKSHRLVTA5T0xuTjBjbWx1WjJsbWVTaGpjbVZoZEdWa0tYMWdLVHNLSUNBZ0lDQWdJQ0IxYm1ObGNuUmhhVzRnUFNCMGNuVmxPd29nSUNBZ0lDQWdJR0p5WldGck93b2dJQ0FnSUNCOUlHTmhkR05vSUNobGNuSXBJSHNLSUNBZ0lDQWdJQ0JzWVhOMElEMGdaWEp5T3dvZ0lDQWdJQ0FnSUdOdmJuTjBJR3RwYm1RZ1BTQmpiR0Z6YzJsbWVTaGxjbklwT3dvZ0lDQWdJQ0FnSUdsbUlDaHJhVzVrSUQwOVBTQWljbVZxWldOMFpXUWlJSHg4SUd0cGJtUWdQVDA5SUNKa1pXNXBaV1FpS1NCN0NpQWdJQ0FnSUNBZ0lDQnBaaUFvSVhWdVkyVnlkR0ZwYmlrZ2RHaHliM2NnWTI5a1pXUkZjbkp2Y2lnaWNtVm1kWE5sWkNJc0lHQmpiMjF0WVc1a0lDUjdZMjl0YldGdVpFbGtmU0J5WldaMWMyVmtPaUFrZTJWeWNpNXRaWE56WVdkbGZXQXNJR1Z5Y2lrN0NpQWdJQ0FnSUNBZ0lDQmljbVZoYXpzS0lDQWdJQ0FnSUNCOUNpQWdJQ0FnSUNBZ2FXWWdLR3RwYm1RZ1BUMDlJQ0pzYjNOMElpa2dkVzVqWlhKMFlXbHVJRDBnZEhKMVpUc0tJQ0FnSUNBZ2ZRb2dJQ0FnZlFvZ0lDQWdhV1lnS0NGMWJtTmxjblJoYVc0cElIc0tJQ0FnSUNBZ2RHaHliM2NnWTI5a1pXUkZjbkp2Y2lnaWNtVm1kWE5sWkNJc0lHQmpiMjF0WVc1a0lDUjdZMjl0YldGdVpFbGtmU0IwZFhKdVpXUWdZWGRoZVRvZ0pIdHNZWE4wSUNZbUlHeGhjM1F1YldWemMyRm5aWDFnTENCc1lYTjBLVHNLSUNBZ0lIMEtJQ0FnSUdOdmJuTjBJR1p2ZFc1a0lEMGdZWGRoYVhRZ1ptbHVaRTFwYzNOcGIyNG9jbTlpYjNSSlpDd2dZMmxrS1RzS0lDQWdJR2xtSUNobWIzVnVaQ0FoUFNCdWRXeHNLU0J5WlhSMWNtNGdabTkxYm1RN0NpQWdJQ0IwYUhKdmR5QmpiMlJsWkVWeWNtOXlLQW9nSUNBZ0lDQWlkVzV5WlhOdmJIWmxaQ0lzQ2lBZ0lDQWdJR0JqWVc1dWIzUWdkR1ZzYkNCM2FHVjBhR1Z5SUdOdmJXMWhibVFnSkh0amIyMXRZVzVrU1dSOUlHSmxZMkZ0WlNCaGJpQnZjbVJsY2pvZ0pIdHNZWE4wSUNZbUlHeGhjM1F1YldWemMyRm5aWDFnTEFvZ0lDQWdJQ0JzWVhOMExBb2dJQ0FnS1RzS0lDQjlMQW9LSUNCaGMzbHVZeUIzWVdsMEtHMXBjM05wYjI1SlpDd2diM0IwY3lrZ2V3b2dJQ0FnWTI5dWMzUWdiV0Y0VUc5c2JITWdQU0J3YjJ4c1RHbHRhWFFvYjNCMGN5QW1KaUJ2Y0hSekxtMWhlRkJ2Ykd4ektUc0tJQ0FnSUd4bGRDQndiMnhzY3lBOUlEQTdDaUFnSUNCc1pYUWdjR0YxYzJVZ1BTQlFUMHhNWDAxSlRsOU5VenNLSUNBZ0lHeGxkQ0J0YVhOemFXNW5JRDBnTURzS0lDQWdJSGRvYVd4bElDaHdiMnhzY3lBOElHMWhlRkJ2Ykd4ektTQjdDaUFnSUNBZ0lHbG1JQ2h3YjJ4c2N5QStJREFwSUhzS0lDQWdJQ0FnSUNCaGQyRnBkQ0J6YkdWbGNDaHdZWFZ6WlNrN0NpQWdJQ0FnSUNBZ2NHRjFjMlVnUFNCTllYUm9MbTFwYmloUVQweE1YMDFCV0Y5TlV5d2dUV0YwYUM1eWIzVnVaQ2h3WVhWelpTQXFJREV1TlNrcE93b2dJQ0FnSUNCOUNpQWdJQ0FnSUhCdmJHeHpLeXM3Q2lBZ0lDQWdJR3hsZENCdGFYTnphVzl1T3dvZ0lDQWdJQ0IwY25rZ2V3b2dJQ0FnSUNBZ0lHMXBjM05wYjI0Z1BTQmhkMkZwZENCM2FYUm9WR2x0Wlc5MWRDaG1iR1ZsZEM1blpYUk5hWE56YVc5dUtHMXBjM05wYjI1SlpDa3BPd29nSUNBZ0lDQjlJR05oZEdOb0lDaGxjbklwSUhzS0lDQWdJQ0FnSUNCamIyNXpkQ0JyYVc1a0lEMGdZMnhoYzNOcFpua29aWEp5S1RzS0lDQWdJQ0FnSUNCcFppQW9hMmx1WkNBOVBUMGdJbXh2YzNRaUlIeDhJR3RwYm1RZ1BUMDlJQ0ppZFhONUlpa2dZMjl1ZEdsdWRXVTdDaUFnSUNBZ0lDQWdMeThnUVNCdGFYTnphVzl1SUc5dWJIa2dhblZ6ZENCamNtVmhkR1ZrSUcxaGVTQnViM1FnWW1VZ2NtVmhaR0ZpYkdVZ2VXVjBMZ29nSUNBZ0lDQWdJR2xtSUNoemRHRjBkWE5QWmlobGNuSXBJRDA5UFNBME1EUWdKaVlnS3l0dGFYTnphVzVuSUR3OUlFNVBWRjlHVDFWT1JGOVVVa2xGVXlrZ1kyOXVkR2x1ZFdVN0NpQWdJQ0FnSUNBZ2RHaHliM2NnWlhKeU93b2dJQ0FnSUNCOUNpQWdJQ0FnSUdOdmJuTjBJSE4wWVhSbElEMGdWRVZTVFVsT1FVeGJVM1J5YVc1bktHMXBjM05wYjI0Z0ppWWdiV2x6YzJsdmJpNXpkR0YwZFhNcExuUnZURzkzWlhKRFlYTmxLQ2xkT3dvZ0lDQWdJQ0JwWmlBb2MzUmhkR1VwSUhKbGRIVnliaUI3SUhOMFlYUmxMQ0J3YjJ4c2N5QjlPd29nSUNBZ2ZRb2dJQ0FnY21WMGRYSnVJSHNnYzNSaGRHVTZJQ0owYVcxbGIzVjBJaXdnY0c5c2JITWdmVHNLSUNCOUxBb0tJQ0JoYzNsdVl5QmpZVzVqWld3b2JXbHpjMmx2Ymtsa0tTQjdDaUFnSUNCbWIzSWdLR3hsZENCeWIzVnVaQ0E5SURFN0lEc2djbTkxYm1Rckt5a2dld29nSUNBZ0lDQXZMeUJEWVc1alpXeHNhVzVuSUdseklHbGtaVzF3YjNSbGJuUWdiMjRnZEdobElIWmxibVJ2Y2pvZ1lTQm1hVzVwYzJobFpDQnZjaUJqWVc1alpXeHNaV1FnYldsemMybHZiaUJwY3lCc1pXWjBJSFZ1WTJoaGJtZGxaQzRLSUNBZ0lDQWdZMjl1YzNRZ2JXbHpjMmx2YmlBOUlHRjNZV2wwSUhkcGRHaFNaWFJ5YVdWektDZ3BJRDArSUdac1pXVjBMbU5oYm1ObGJFMXBjM05wYjI0b2JXbHpjMmx2Ymtsa0tTd2dRMEZNVEY5VVVrbEZVeWs3Q2lBZ0lDQWdJR052Ym5OMElITjBZWFIxY3lBOUlHMXBjM05wYjI0Z0ppWWdiV2x6YzJsdmJpNXpkR0YwZFhNN0NpQWdJQ0FnSUdsbUlDaHpkR0YwZFhNZ1BUMGdiblZzYkNCOGZDQlVSVkpOU1U1QlRGdFRkSEpwYm1jb2MzUmhkSFZ6S1M1MGIweHZkMlZ5UTJGelpTZ3BYU2tnY21WMGRYSnVPd29nSUNBZ0lDQnBaaUFvY205MWJtUWdQajBnUTBGT1EwVk1YMUpQVlU1RVV5a2dld29nSUNBZ0lDQWdJSFJvY205M0lHTnZaR1ZrUlhKeWIzSW9JblZ1Y21WemIyeDJaV1FpTENCZ2JXbHpjMmx2YmlBa2UyMXBjM05wYjI1SlpIMGdjM1JwYkd3Z0pIdHpkR0YwZFhOOUlHRm1kR1Z5SUdOaGJtTmxiR0FwT3dvZ0lDQWdJQ0I5Q2lBZ0lDQWdJR0YzWVdsMElITnNaV1Z3S0dKaFkydHZabVlvY205MWJtUXBLVHNLSUNBZ0lIMEtJQ0I5TEFwOU93b0t1eDhLRDNSeWFXRnNMM052Ym01bGRDNXFjeEtuSHlkMWMyVWdjM1J5YVdOMEp6c0tDbU52Ym5OMElITnNaV1Z3SUQwZ0tHMXpLU0E5UGlCdVpYY2dVSEp2YldselpTZ29jaWtnUFQ0Z2MyVjBWR2x0Wlc5MWRDaHlMQ0J0Y3lrcE93b0tablZ1WTNScGIyNGdjM1JoZEhWelQyWW9aWEp5S1NCN0NpQWdZMjl1YzNRZ2JTQTlJQzllYUc5emRDQmhjR2tnS0Z4a2V6TjlLVG92TG1WNFpXTW9LR1Z5Y2lBbUppQmxjbkl1YldWemMyRm5aU2tnZkh3Z0p5Y3BPd29nSUhKbGRIVnliaUJ0SUQ4Z1RuVnRZbVZ5S0cxYk1WMHBJRG9nYm5Wc2JEc0tmUW9LWm5WdVkzUnBiMjRnYm05MFVHVnliV2wwZEdWa0tHVnljaWtnZXdvZ0lISmxkSFZ5YmlBdmJtOTBJSEJsY20xcGRIUmxaQ0JpZVNCellXNWtZbTk0SUdOaGNHRmlhV3hwZEhrdkxuUmxjM1FvS0dWeWNpQW1KaUJsY25JdWJXVnpjMkZuWlNrZ2ZId2dKeWNwT3dwOUNnb3ZMeUJCSUdaaGFXeDFjbVVnZEdoaGRDQnpZWGx6SUc1dmRHaHBibWNnWkdWbWFXNXBkR1VnWVdKdmRYUWdkR2hsSUhabGJtUnZjaWR6SUhOMFlYUmxPaUJ1YnlCaGJuTjNaWElzSUdFZ2JHOXpkQW92THlCaGJuTjNaWElzSUc5MWNpQnZkMjRnZEdsdFpXOTFkQ3dnYjNJZ1lTQTFlSGd1Q21aMWJtTjBhVzl1SUdselZISmhibk5wWlc1MEtHVnljaWtnZXdvZ0lHbG1JQ2doWlhKeUlIeDhJRzV2ZEZCbGNtMXBkSFJsWkNobGNuSXBLU0J5WlhSMWNtNGdabUZzYzJVN0NpQWdhV1lnS0dWeWNpNTBhVzFsWkU5MWRDa2djbVYwZFhKdUlIUnlkV1U3Q2lBZ1kyOXVjM1FnY3lBOUlITjBZWFIxYzA5bUtHVnljaWs3Q2lBZ2NtVjBkWEp1SUhNZ1BUMDlJRzUxYkd3Z1B5Qm1ZV3h6WlNBNklITWdQajBnTlRBd093cDlDZ3BtZFc1amRHbHZiaUIzYVhSb1ZHbHRaVzkxZENod0xDQnRjeWtnZXdvZ0lHeGxkQ0IwT3dvZ0lHTnZibk4wSUhScGJXVnlJRDBnYm1WM0lGQnliMjFwYzJVb0tGOHNJSEpsYWlrZ1BUNGdld29nSUNBZ2RDQTlJSE5sZEZScGJXVnZkWFFvS0NrZ1BUNGdjbVZxS0U5aWFtVmpkQzVoYzNOcFoyNG9ibVYzSUVWeWNtOXlLQ2RvYjNOMElHRndhU0ExTURJNklIUnBiV1Z2ZFhRbktTd2dleUIwYVcxbFpFOTFkRG9nZEhKMVpTQjlLU2tzSUcxektUc0tJQ0I5S1RzS0lDQnlaWFIxY200Z1VISnZiV2x6WlM1eVlXTmxLRnR3TENCMGFXMWxjbDBwTG1acGJtRnNiSGtvS0NrZ1BUNGdZMnhsWVhKVWFXMWxiM1YwS0hRcEtUc0tmUW9LTHk4Z1RXRndJSFJvWlNCd2JHRjBabTl5YlNkeklHTnZiVzFoYm1RZ2FXUWdiMjUwYnlCMGFHVWdkbVZ1Wkc5eUozTWdZV3hzYjNkbFpDQmhiSEJvWVdKbGRDQW9PQzAyTkNCdlppQkJMVnBoTFhvd0xUa3RYeWtzQ2k4dklHbHVhbVZqZEdsMlpXeDVMQ0J6YnlCa2FYTjBhVzVqZENCamIyMXRZVzVrY3lCdVpYWmxjaUJ6YUdGeVpTQmhJSFpsYm1SdmNpQnVZVzFsTGdwbWRXNWpkR2x2YmlCMlpXNWtiM0pEYjIxdFlXNWtTV1FvYVdRcElIc0tJQ0JqYjI1emRDQnpJRDBnVTNSeWFXNW5LR2xrS1RzS0lDQnBaaUFvTDE1YlFTMWFZUzE2TUMwNVh5MWRlemdzTmpSOUpDOHVkR1Z6ZENoektTa2djbVYwZFhKdUlITTdDaUFnYkdWMElHOTFkQ0E5SUNkalh5YzdDaUFnWm05eUlDaGpiMjV6ZENCamFDQnZaaUJ6S1NCN0NpQWdJQ0JwWmlBb0wxdEJMVnBoTFhvd0xUbGZYUzh1ZEdWemRDaGphQ2twSUc5MWRDQXJQU0JqYURzS0lDQWdJR1ZzYzJVZ2IzVjBJQ3M5SUNjdEp5QXJJR05vTG1OdlpHVlFiMmx1ZEVGMEtEQXBMblJ2VTNSeWFXNW5LREUyS1NBcklDY3RKenNLSUNCOUNpQWdkMmhwYkdVZ0tHOTFkQzVzWlc1bmRHZ2dQQ0E0S1NCdmRYUWdLejBnSjE4bk93b2dJSEpsZEhWeWJpQnZkWFF1YzJ4cFkyVW9NQ3dnTmpRcE93cDlDZ3BtZFc1amRHbHZiaUJtWVdsc0tHTnZaR1VzSUcxbGMzTmhaMlVwSUhzS0lDQnlaWFIxY200Z1QySnFaV04wTG1GemMybG5iaWh1WlhjZ1JYSnliM0lvYldWemMyRm5aU2tzSUhzZ1kyOWtaU0I5S1RzS2ZRb0tiVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQjdDaUFnWVhONWJtTWdhVzUyWlc1MGIzSjVLQ2tnZXdvZ0lDQWdiR1YwSUd4aGMzUkZjbkk3Q2lBZ0lDQm1iM0lnS0d4bGRDQnBJRDBnTURzZ2FTQThJRFU3SUdrckt5a2dld29nSUNBZ0lDQjBjbmtnZXdvZ0lDQWdJQ0FnSUdOdmJuTjBJSEpsY3lBOUlHRjNZV2wwSUhkcGRHaFVhVzFsYjNWMEtHWnNaV1YwTG14cGMzUlNiMkp2ZEhNb0tTd2dPREF3TUNrN0NpQWdJQ0FnSUNBZ2NtVjBkWEp1SUNoeVpYTXVjbTlpYjNSeklIeDhJRnRkS1M1dFlYQW9LSElwSUQwK0lDaDdJR2xrT2lCeUxtbGtMQ0J6ZEdGMGRYTTZJSEl1YzNSaGRIVnpMQ0JpWVhSMFpYSjVPaUJ5TG1KaGRIUmxjbmtnZlNrcE93b2dJQ0FnSUNCOUlHTmhkR05vSUNobEtTQjdDaUFnSUNBZ0lDQWdiR0Z6ZEVWeWNpQTlJR1U3Q2lBZ0lDQWdJQ0FnYVdZZ0tDRnBjMVJ5WVc1emFXVnVkQ2hsS1NrZ2RHaHliM2NnWlRzS0lDQWdJQ0FnSUNCaGQyRnBkQ0J6YkdWbGNDZ3hNREFwT3dvZ0lDQWdJQ0I5Q2lBZ0lDQjlDaUFnSUNCMGFISnZkeUJzWVhOMFJYSnlPd29nSUgwc0Nnb2dJR0Z6ZVc1aklHUnBjM0JoZEdOb0tISnZZbTkwU1dRc0lIUmhjbWRsZEN3Z1kyOXRiV0Z1WkVsa0tTQjdDaUFnSUNCamIyNXpkQ0JqYVdRZ1BTQjJaVzVrYjNKRGIyMXRZVzVrU1dRb1kyOXRiV0Z1WkVsa0tUc0tJQ0FnSUdOdmJuTjBJR0p2WkhrZ1BTQjdJSFJoY21kbGREb2dleUI0T2lCMFlYSm5aWFF1ZUN3Z2VUb2dkR0Z5WjJWMExua2dmU3dnWTI5dGJXRnVaRjlwWkRvZ1kybGtJSDA3Q2lBZ0lDQXZMeUJTWlhSeWVXbHVaeUIzYVhSb0lIUm9aU0J6WVcxbElHTnZiVzFoYm1SZmFXUWdhWE1nYVdSbGJYQnZkR1Z1ZENCdmJpQjBhR1VnZG1WdVpHOXlPaUJwZENCaGJuTjNaWEp6SUhkcGRHZ2dkR2hsQ2lBZ0lDQXZMeUJ2Y21sbmFXNWhiQ0J0YVhOemFXOXVMQ0J6YnlCcGRDQmpZVzRnYm1WMlpYSWdZbVZqYjIxbElHRWdjMlZqYjI1a0lHOXlaR1Z5TGdvZ0lDQWdabTl5SUNoc1pYUWdZWFIwWlcxd2RDQTlJREE3SUdGMGRHVnRjSFFnUENBMU95QmhkSFJsYlhCMEt5c3BJSHNLSUNBZ0lDQWdiR1YwSUhKbGN6c0tJQ0FnSUNBZ2RISjVJSHNLSUNBZ0lDQWdJQ0J5WlhNZ1BTQmhkMkZwZENCM2FYUm9WR2x0Wlc5MWRDaG1iR1ZsZEM1amNtVmhkR1ZOYVhOemFXOXVLSEp2WW05MFNXUXNJR0p2WkhrcExDQTRNREF3S1RzS0lDQWdJQ0FnZlNCallYUmphQ0FvWlNrZ2V3b2dJQ0FnSUNBZ0lHbG1JQ2hwYzFSeVlXNXphV1Z1ZENobEtTa2dld29nSUNBZ0lDQWdJQ0FnWVhkaGFYUWdjMnhsWlhBb01UQXdJQ29nS0dGMGRHVnRjSFFnS3lBeEtTazdDaUFnSUNBZ0lDQWdJQ0JqYjI1MGFXNTFaVHNLSUNBZ0lDQWdJQ0I5Q2lBZ0lDQWdJQ0FnZEdoeWIzY2dabUZwYkNnbmNtVm1kWE5sWkNjc0lHQjJaVzVrYjNJZ2NtVm1kWE5sWkNCdmNtUmxjam9nSkh0bExtMWxjM05oWjJWOVlDazdDaUFnSUNBZ0lIMEtJQ0FnSUNBZ2FXWWdLQ0Z5WlhNZ2ZId2dJWEpsY3k1dGFYTnphVzl1WDJsa0tTQjBhSEp2ZHlCbVlXbHNLQ2QxYm5KbGMyOXNkbVZrSnl3Z0ozWmxibVJ2Y2lCaGJuTjNaWElnYUdGa0lHNXZJRzFwYzNOcGIyNGdhV1FuS1RzS0lDQWdJQ0FnYVdZZ0tISmxjeTVqYjIxdFlXNWtYMmxrSUNFOVBTQjFibVJsWm1sdVpXUWdKaVlnY21WekxtTnZiVzFoYm1SZmFXUWdJVDA5SUdOcFpDa2dld29nSUNBZ0lDQWdJSFJvY205M0lHWmhhV3dvSjNWdWNtVnpiMngyWldRbkxDQW5kbVZ1Wkc5eUlHRnVjM2RsY21Wa0lIZHBkR2dnWVNCa2FXWm1aWEpsYm5RZ1kyOXRiV0Z1WkNjcE93b2dJQ0FnSUNCOUNpQWdJQ0FnSUdsbUlDaHlaWE11Y205aWIzUWdJVDA5SUhWdVpHVm1hVzVsWkNBbUppQnlaWE11Y205aWIzUWdJVDA5SUhKdlltOTBTV1FwSUhzS0lDQWdJQ0FnSUNCMGFISnZkeUJtWVdsc0tDZDFibkpsYzI5c2RtVmtKeXdnSjNabGJtUnZjaUJoYm5OM1pYSmxaQ0IzYVhSb0lHRWdaR2xtWm1WeVpXNTBJSEp2WW05MEp5azdDaUFnSUNBZ0lIMEtJQ0FnSUNBZ2NtVjBkWEp1SUhKbGN5NXRhWE56YVc5dVgybGtPd29nSUNBZ2ZRb2dJQ0FnZEdoeWIzY2dabUZwYkNnbmRXNXlaWE52YkhabFpDY3NJQ2R1YnlCMWMyRmliR1VnWVc1emQyVnlJR1p5YjIwZ2RtVnVaRzl5T3lCdmNtUmxjaUJ6ZEdGMFpTQjFibXR1YjNkdUp5azdDaUFnZlN3S0NpQWdZWE41Ym1NZ2QyRnBkQ2h0YVhOemFXOXVTV1FzSUc5d2RITXBJSHNLSUNBZ0lHTnZibk4wSUcxaGVGQnZiR3h6SUQwZ0tHOXdkSE1nSmlZZ2IzQjBjeTV0WVhoUWIyeHNjeWtnZkh3Z05UQTdDaUFnSUNCc1pYUWdjRzlzYkhNZ1BTQXdPd29nSUNBZ2JHVjBJR1Z5Y205eWN5QTlJREE3Q2lBZ0lDQjNhR2xzWlNBb2NHOXNiSE1nUENCdFlYaFFiMnhzY3lrZ2V3b2dJQ0FnSUNCc1pYUWdiVHNLSUNBZ0lDQWdkSEo1SUhzS0lDQWdJQ0FnSUNCdElEMGdZWGRoYVhRZ2QybDBhRlJwYldWdmRYUW9abXhsWlhRdVoyVjBUV2x6YzJsdmJpaHRhWE56YVc5dVNXUXBMQ0E0TURBd0tUc0tJQ0FnSUNBZ2ZTQmpZWFJqYUNBb1pTa2dld29nSUNBZ0lDQWdJR2xtSUNocGMxUnlZVzV6YVdWdWRDaGxLU0FtSmlBcksyVnljbTl5Y3lBOFBTQXpNQ2tnZXdvZ0lDQWdJQ0FnSUNBZ1lYZGhhWFFnYzJ4bFpYQW9OVEFwT3dvZ0lDQWdJQ0FnSUNBZ1kyOXVkR2x1ZFdVN0NpQWdJQ0FnSUNBZ2ZRb2dJQ0FnSUNBZ0lIUm9jbTkzSUdVN0NpQWdJQ0FnSUgwS0lDQWdJQ0FnY0c5c2JITXJLenNLSUNBZ0lDQWdhV1lnS0cwdWMzUmhkSFZ6SUQwOVBTQW5aRzl1WlNjZ2ZId2diUzV6ZEdGMGRYTWdQVDA5SUNkbVlXbHNaV1FuSUh4OElHMHVjM1JoZEhWeklEMDlQU0FuWTJGdVkyVnNiR1ZrSnlrZ2V3b2dJQ0FnSUNBZ0lISmxkSFZ5YmlCN0lITjBZWFJsT2lCdExuTjBZWFIxY3l3Z2NHOXNiSE1nZlRzS0lDQWdJQ0FnZlFvZ0lDQWdJQ0JwWmlBb2NHOXNiSE1nUENCdFlYaFFiMnhzY3lrZ1lYZGhhWFFnYzJ4bFpYQW9OVEFwT3dvZ0lDQWdmUW9nSUNBZ2NtVjBkWEp1SUhzZ2MzUmhkR1U2SUNkMGFXMWxiM1YwSnl3Z2NHOXNiSE1nZlRzS0lDQjlMQW9LSUNCaGMzbHVZeUJqWVc1alpXd29iV2x6YzJsdmJrbGtLU0I3Q2lBZ0lDQnNaWFFnYkdGemRFVnljanNLSUNBZ0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dOVHNnYVNzcktTQjdDaUFnSUNBZ0lIUnllU0I3Q2lBZ0lDQWdJQ0FnY21WMGRYSnVJR0YzWVdsMElIZHBkR2hVYVcxbGIzVjBLR1pzWldWMExtTmhibU5sYkUxcGMzTnBiMjRvYldsemMybHZia2xrS1N3Z09EQXdNQ2s3Q2lBZ0lDQWdJSDBnWTJGMFkyZ2dLR1VwSUhzS0lDQWdJQ0FnSUNCc1lYTjBSWEp5SUQwZ1pUc0tJQ0FnSUNBZ0lDQnBaaUFvSVdselZISmhibk5wWlc1MEtHVXBLU0IwYUhKdmR5QmxPd29nSUNBZ0lDQWdJR0YzWVdsMElITnNaV1Z3S0RFd01DazdDaUFnSUNBZ0lIMEtJQ0FnSUgwS0lDQWdJSFJvY205M0lHeGhjM1JGY25JN0NpQWdmU3dLZlRzS0NvWUNDZ2x3YkdGdUxtcHpiMjRTK0FGN0ltTnZiVzFoYm1SeklqcGJleUpwWkNJNkluSjFiakV3TFdNeElpd2ljbTlpYjNRaU9pSnlNU0lzSW5SaGNtZGxkQ0k2ZXlKNElqb3pMQ0o1SWpvd2ZYMHNleUpwWkNJNkluSjFiakV3TFdNeUlpd2ljbTlpYjNRaU9pSnlNaUlzSW5SaGNtZGxkQ0k2ZXlKNElqb3hNQ3dpZVNJNk5IMTlMSHNpYVdRaU9pSnlkVzR4TUMxak15SXNJbkp2WW05MElqb2ljak1pTENKMFlYSm5aWFFpT25zaWVDSTZNQ3dpZVNJNk1UVjlmU3g3SW1sa0lqb2ljblZ1TVRBdFl6UWlMQ0p5YjJKdmRDSTZJbkl4SWl3aWRHRnlaMlYwSWpwN0luZ2lPalV3TENKNUlqbzFNSDBzSW1OaGJtTmxiQ0k2ZEhKMVpYMWRmUklsYm05a1pTQm9ZWEp1WlhOekxtcHpJRzV2YldsdVlXd2dZV1JoY0hSbGNpMTJNaTVxY3lvRlpteGxaWFE9IiwicmVzcG9uc2UiOiJDZ1prYjJOclpYSVNCbXRsY201bGJCanZDU0tlQXdnRUVrQTRZMlEzWlRsak5qQXdNVFJoWWpJd1ptSXpPVGRqWkRrM01URmtOalppTVRSall6TmxOMlF3WmpCak0yUm1NR000TUdVd01HVmlOek15T1RNNE5EYzBHa0JtTWpWak5UTmpZVFJoWlRCbFl6TTVOVEkxTlRBd05USTFPRE00TnpCaE5ERTBaRFpqWkdWaE1qazJORGhoT0RBNU5tRTNOekZqTXpJMVpUTTNPV1ZrSWdaa2IyTnJaWElxQm10bGNtNWxiREpVWkc5amEyVnlMV2x0WVdkbE9uTm9ZVEkxTmpvek1tUmhOemRpTVdKbE1qUmtaVFJqTVRVeU5qWTNZekk0WVdJMk16VXpNVFF5TldOa05qa3dNREJoWTJZek1HRXpNamc1T0RWallqZzFOek0zTjJZM1FJeWxtZEtXTkVqOHJwblNsalJxUURSak5qbGlOV0V6T0dZeU9UQmlNalJpT0RKak5HRXlZMkl6WXpBeE1HVTNNV0U0T0dZeVpUQmpORGMwWlRVMVpEZ3pZMlJrTjJWaE5UUm1aamhpTm1SeVlHOWphUzF0WVc1cFptVnpkRHBzYVc1MWVDOWhiV1EyTkVCemFHRXlOVFk2WVRabFpqSmxZVEZqT0dZeFpHVTFZemc0TldVeFlURTRZbUUzWldVMFpEazJNbVV6WVRnMU9UZzNOMlkyWmpRMll6Sm1ZamRsWW1Gak1XWTJZMk0xWXlwZ2IyTnBMVzFoYm1sbVpYTjBPbXhwYm5WNEwyRnRaRFkwUUhOb1lUSTFOanBoTm1WbU1tVmhNV000WmpGa1pUVmpPRGcxWlRGaE1UaGlZVGRsWlRSa09UWXlaVE5oT0RVNU9EYzNaalptTkRaak1tWmlOMlZpWVdNeFpqWmpZelZqTWxSa2IyTnJaWEl0YVcxaFoyVTZjMmhoTWpVMk9qTXlaR0UzTjJJeFltVXlOR1JsTkdNeE5USTJOamRqTWpoaFlqWXpOVE14TkRJMVkyUTJPVEF3TUdGalpqTXdZVE15T0RrNE5XTmlPRFUzTXpjM1pqZGFxZ2tLcFFrS0pXNXZaR1VnYUdGeWJtVnpjeTVxY3lCdWIyMXBibUZzSUdGa1lYQjBaWEl0ZGpJdWFuTVMrQWhCUkVGUVZFVlNMVkpGVUU5U1ZDQjdJbk5qWlc1aGNtbHZJam9pYm05dGFXNWhiQ0lzSW1Ga1lYQjBaWElpT2lKaFpHRndkR1Z5TFhZeUxtcHpJaXdpWTI5dGNHeGxkR1ZrSWpwMGNuVmxMQ0pqYjIxdFlXNWtjeUk2VzNzaWFXUWlPaUp5ZFc0eE1DMWpNU0lzSW5KdlltOTBJam9pY2pFaUxDSnRhWE56YVc5dUlqb2liVEVpTENKa2FYTndZWFJqYUdWa0lqb2liVEVpTENKemRHRjBaU0k2SW1SdmJtVWlMQ0p3YjJ4c2N5STZNeXdpYldGNFgzQnZiR3h6SWpvME1Dd2lkMkZwZEdWa0lqcDdJbk4wWVhSbElqb2laRzl1WlNJc0luQnZiR3h6SWpvekxDSnlaWFJ5YVdWeklqb3dmU3dpWlhKeWIzSWlPaUlpTENKamIyUmxJam9pSW4wc2V5SnBaQ0k2SW5KMWJqRXdMV015SWl3aWNtOWliM1FpT2lKeU1pSXNJbTFwYzNOcGIyNGlPaUp0TWlJc0ltUnBjM0JoZEdOb1pXUWlPaUp0TWlJc0luTjBZWFJsSWpvaVpHOXVaU0lzSW5CdmJHeHpJam8wTENKdFlYaGZjRzlzYkhNaU9qUXdMQ0ozWVdsMFpXUWlPbnNpYzNSaGRHVWlPaUprYjI1bElpd2ljRzlzYkhNaU9qUXNJbkpsZEhKcFpYTWlPakI5TENKbGNuSnZjaUk2SWlJc0ltTnZaR1VpT2lJaWZTeDdJbWxrSWpvaWNuVnVNVEF0WXpNaUxDSnliMkp2ZENJNkluSXpJaXdpYldsemMybHZiaUk2SW0weklpd2laR2x6Y0dGMFkyaGxaQ0k2SW0weklpd2ljM1JoZEdVaU9pSmtiMjVsSWl3aWNHOXNiSE1pT2pVc0ltMWhlRjl3YjJ4c2N5STZOREFzSW5kaGFYUmxaQ0k2ZXlKemRHRjBaU0k2SW1SdmJtVWlMQ0p3YjJ4c2N5STZOU3dpY21WMGNtbGxjeUk2TUgwc0ltVnljbTl5SWpvaUlpd2lZMjlrWlNJNklpSjlMSHNpYVdRaU9pSnlkVzR4TUMxak5DSXNJbkp2WW05MElqb2ljakVpTENKdGFYTnphVzl1SWpvaWJUUWlMQ0prYVhOd1lYUmphR1ZrSWpvaWJUUWlMQ0p6ZEdGMFpTSTZJbU5oYm1ObGJHeGxaQ0lzSW5CdmJHeHpJam94TENKdFlYaGZjRzlzYkhNaU9qVXNJbmRoYVhSbFpDSTZleUp6ZEdGMFpTSTZJbU5oYm1ObGJHeGxaQ0lzSW5CdmJHeHpJam94TENKeVpYUnlhV1Z6SWpvd2ZTd2laWEp5YjNJaU9pSWlMQ0pqYjJSbElqb2lJbjFkTENKcGJuWmxiblJ2Y21sbGN5STZXM3NpY21WMGRYSnVaV1FpT2x0N0ltbGtJam9pY2pFaUxDSnpkR0YwZFhNaU9pSnBaR3hsSWl3aVltRjBkR1Z5ZVNJNk9UWjlMSHNpYVdRaU9pSnlNaUlzSW5OMFlYUjFjeUk2SW1sa2JHVWlMQ0ppWVhSMFpYSjVJam8zTVgwc2V5SnBaQ0k2SW5Jeklpd2ljM1JoZEhWeklqb2lhV1JzWlNJc0ltSmhkSFJsY25raU9qVTRmVjBzSW1WeWNtOXlJam9pSW4wc2V5SnlaWFIxY201bFpDSTZXM3NpYVdRaU9pSnlNU0lzSW5OMFlYUjFjeUk2SW1sa2JHVWlMQ0ppWVhSMFpYSjVJam81Tkgwc2V5SnBaQ0k2SW5JeUlpd2ljM1JoZEhWeklqb2lhV1JzWlNJc0ltSmhkSFJsY25raU9qWTRmU3g3SW1sa0lqb2ljak1pTENKemRHRjBkWE1pT2lKcFpHeGxJaXdpWW1GMGRHVnllU0k2TlRSOVhTd2laWEp5YjNJaU9pSWlmVjBzSW5CdmJHeHpJam94TXl3aWNtVjBjbWxsY3lJNk1Dd2laWEp5YjNKeklqcGJYWDBLTU44REdBRT0iLCJlbnZlbG9wZSI6eyJwYXlsb2FkVHlwZSI6ImFwcGxpY2F0aW9uL3ZuZC5pbi10b3RvK2pzb24iLCJwYXlsb2FkIjoiZXlKZmRIbHdaU0k2SW1oMGRIQnpPaTh2YVc0dGRHOTBieTVwYnk5VGRHRjBaVzFsYm5RdmRqRWlMQ0p6ZFdKcVpXTjBJanBiZXlKdVlXMWxJam9pY25WdUxYSmxZMjl5WkNJc0ltUnBaMlZ6ZENJNmV5SnphR0V5TlRZaU9pSTBZelk1WWpWaE16aG1Namt3WWpJMFlqZ3lZelJoTW1OaU0yTXdNVEJsTnpGaE9EaG1NbVV3WXpRM05HVTFOV1E0TTJOa1pEZGxZVFUwWm1ZNFlqWmtJbjE5WFN3aWNISmxaR2xqWVhSbFZIbHdaU0k2SW1oMGRIQnpPaTh2Y0d4cGJYTnZiR3h0WVhKckxtZHBkR2gxWWk1cGJ5OXdiR2x0YzI5c2JDOXlkVzR0Y21WamIzSmtMM1l4SWl3aWNISmxaR2xqWVhSbElqcDdJblpsY25OcGIyNGlPalFzSW5KbGNYVmxjM1JmYzJoaE1qVTJJam9pT0dOa04yVTVZell3TURFMFlXSXlNR1ppTXprM1kyUTVOekV4WkRZMllqRTBZMk16WlRka01HWXdZek5rWmpCak9EQmxNREJsWWpjek1qa3pPRFEzTkNJc0luSmxjM1ZzZEY5emFHRXlOVFlpT2lKbU1qVmpOVE5qWVRSaFpUQmxZek01TlRJMU5UQXdOVEkxT0RNNE56QmhOREUwWkRaalpHVmhNamsyTkRoaE9EQTVObUUzTnpGak16STFaVE0zT1dWa0lpd2ljSEp2ZG1sa1pYSWlPaUprYjJOclpYSWlMQ0pwYzI5c1lYUnBiMjRpT2lKclpYSnVaV3dpTENKbGJuWnBjbTl1YldWdWRDSTZJbVJ2WTJ0bGNpMXBiV0ZuWlRwemFHRXlOVFk2TXpKa1lUYzNZakZpWlRJMFpHVTBZekUxTWpZMk4yTXlPR0ZpTmpNMU16RTBNalZqWkRZNU1EQXdZV05tTXpCaE16STRPVGcxWTJJNE5UY3pOemRtTnlJc0luTnZablIzWVhKbFgybGtaVzUwYVhSNUlqb2liMk5wTFcxaGJtbG1aWE4wT214cGJuVjRMMkZ0WkRZMFFITm9ZVEkxTmpwaE5tVm1NbVZoTVdNNFpqRmtaVFZqT0RnMVpURmhNVGhpWVRkbFpUUmtPVFl5WlROaE9EVTVPRGMzWmpabU5EWmpNbVppTjJWaVlXTXhaalpqWXpWaklpd2ljRzlzYVdONUlqb2lJaXdpYzNSaGNuUmxaRjkxYm1sNFgyMXpJam94TnpreU56ZzBNelUxT1Rnd0xDSmxibVJsWkY5MWJtbDRYMjF6SWpveE56a3lOemcwTXpVM01qUTBMQ0p6WlhOemFXOXVJam9pSWl3aWMyVnhkV1Z1WTJVaU9qQXNJbkJ5WlhacGIzVnpYM05vWVRJMU5pSTZJaUlzSW5KbFkyOXlaRjl6YUdFeU5UWWlPaUkwWXpZNVlqVmhNemhtTWprd1lqSTBZamd5WXpSaE1tTmlNMk13TVRCbE56RmhPRGhtTW1Vd1l6UTNOR1UxTldRNE0yTmtaRGRsWVRVMFptWTRZalprSW4xOSIsInNpZ25hdHVyZXMiOlt7ImtleWlkIjoiMjM2OGU2YWY4NmZiNzk4NGM1MmVhMzZiMDQyOThhYWZjNDk4YTc0NjFmMTE2ZTBlOTk4ZWZlZDcwMjk3NDU2NyIsInNpZyI6Ii9YRkZjOVZ5OCtWV0RsZnJQU1lhckZLTjBPaStXVXRyRE5COGxITlpIWUt0ODl2dVhUNVFQTGpkYmFaWWl1cUhIT3BwY3BsWVp0dllnQndPRFpTM0NBPT0ifV19LCJsaW5rIjp7InBheWxvYWRUeXBlIjoiYXBwbGljYXRpb24vdm5kLmluLXRvdG8ranNvbiIsInBheWxvYWQiOiJleUpmZEhsd1pTSTZJbWgwZEhCek9pOHZhVzR0ZEc5MGJ5NXBieTlUZEdGMFpXMWxiblF2ZGpFaUxDSnpkV0pxWldOMElqcGJleUp1WVcxbElqb2lZblZ1Wkd4bExXeHBibVVpTENKa2FXZGxjM1FpT25zaWMyaGhNalUySWpvaU1qWmlNekV3TlRkak1ETTNNREE0TURJd05UVm1OakkwT0dOaU5XSTNZbUk1TVdZM1l6TXpObUkyWkdWbE9UUTRNVGc0WldOaU5UUTVZMk5qTnpCaE1TSjlmVjBzSW5CeVpXUnBZMkYwWlZSNWNHVWlPaUpvZEhSd2N6b3ZMM0JzYVcxemIyeHNiV0Z5YXk1bmFYUm9kV0l1YVc4dmNHeHBiWE52Ykd3dlluVnVaR3hsTFd4cGJtc3ZkakVpTENKd2NtVmthV05oZEdVaU9uc2lhVzVrWlhnaU9qRXdMQ0p3Y21WMmFXOTFjMTl6YUdFeU5UWWlPaUpoWWpZMFpUYzVNMlUxTjJRd1pHUXlaV1k1WWpCak5EWm1abUUzTXpKbFpUVTVORGxqTlRFeE16WTVOakJsTnpSa1lqazRNMkprTWpabU56RmtZVEV6SWl3aVpXNTBjbmxmYzJoaE1qVTJJam9pTWpaaU16RXdOVGRqTURNM01EQTRNREl3TlRWbU5qSTBPR05pTldJM1ltSTVNV1kzWXpNek5tSTJaR1ZsT1RRNE1UZzRaV05pTlRRNVkyTmpOekJoTVNKOWZRPT0iLCJzaWduYXR1cmVzIjpbeyJrZXlpZCI6IjIzNjhlNmFmODZmYjc5ODRjNTJlYTM2YjA0Mjk4YWFmYzQ5OGE3NDYxZjExNmUwZTk5OGVmZWQ3MDI5NzQ1NjciLCJzaWciOiIzS3RHb2Rja2Z0akRhbTlHb2Q3WFBxT3NkMkk5cEt4dG1idkFVQUxkQUNBMkJZT0Y5SlEwY2lQam10bElTSVFCbDNZWkE2MWVmakF3OUxwQlU1MG1CQT09In1dfX0=",
                            "contentType": "application/json",
                            "encoding": "base64"
                          }
                        },
                        "name": "entry.json"
                      },
                      {
                        "contents": {
                          "attachment": {
                            "content": "eyJyZXF1ZXN0Ijp7Im1pbmltdW1faXNvbGF0aW9uIjoiY29udGFpbmVyIiwicHJvamVjdCI6eyJhcnRpZmFjdHMiOltdLCJmaWxlcyI6W3siY29udGVudCI6Ii8vIFRoZSBwbGF0Zm9ybSdzIGNvbmZvcm1hbmNlIGhhcm5lc3M6IGxvYWRzIGEgdmVuZG9yIGFkYXB0ZXIsIHJ1bnMgdGhlIGNvbW1hbmRzIG9mXG4vLyBwbGFuLmpzb24gdGhyb3VnaCBpdCBhZ2FpbnN0IHRoZSB2ZW5kb3IgQVBJIHRoZSBydW4ncyBncmFudCByZWFjaGVzLCBhbmQgcHJpbnRzIG9uZVxuLy8gcmVwb3J0IGxpbmUuXG4vL1xuLy8gICBub2RlIGhhcm5lc3MuanMgXHUwMDNjc2NlbmFyaW9cdTAwM2UgXHUwMDNjYWRhcHRlciBmaWxlXHUwMDNlXG4vL1xuLy8gVGhlIGhhcm5lc3MgaXMgdGhlIHBsYXRmb3JtJ3MgY29kZTsgdGhlIGFkYXB0ZXIgaXMgdGhlIGFnZW50J3MuIEJvdGggcnVuIGluc2lkZSB0aGVcbi8vIHNhbmRib3gsIGluIG9uZSBwcm9jZXNzLCBhbmQgdGhlIG9ubHkgd2F5IG91dCBpcyB0aGUgaW5qZWN0ZWQgYGZsZWV0YCBjbGllbnQuIFNvIHRoZVxuLy8gcmVwb3J0IGlzIHRoZSBhZGFwdGVyJ3MgY2xhaW06IHRoZSB2ZXJkaWN0IGlzIG1hZGUgb24gdGhlIGhvc3QsIGZyb20gdGhlIHBsYW4gYW5kIHRoZVxuLy8gdmVuZG9yJ3MgbGVkZ2VyLiBUaGUgc2NlbmFyaW8gYXJndW1lbnQgaXMgb25seSByZWNvcmRlZDsgdGhlIGhhcm5lc3MgZG9lcyBub3Qga25vd1xuLy8gd2hhdCB0aGUgdmVuZG9yIHdpbGwgZG8uXG5cInVzZSBzdHJpY3RcIjtcblxuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG5cbmNvbnN0IHNjZW5hcmlvID0gcHJvY2Vzcy5hcmd2WzJdO1xuY29uc3QgYWRhcHRlckZpbGUgPSBwcm9jZXNzLmFyZ3ZbM107XG5cbmNvbnN0IHJlcG9ydCA9IHsgc2NlbmFyaW8sIGFkYXB0ZXI6IGFkYXB0ZXJGaWxlLCBjb21wbGV0ZWQ6IGZhbHNlLCBjb21tYW5kczogW10sIGludmVudG9yaWVzOiBbXSwgcG9sbHM6IDAsIHJldHJpZXM6IDAsIGVycm9yczogW10gfTtcbmNvbnN0IGZhaWwgPSAobXNnKSA9XHUwMDNlIHsgcmVwb3J0LmVycm9ycy5wdXNoKG1zZyk7IH07XG5jb25zdCBmaW5pc2ggPSAoY29kZSkgPVx1MDAzZSB7IGNvbnNvbGUubG9nKFwiQURBUFRFUi1SRVBPUlQgXCIgKyBKU09OLnN0cmluZ2lmeShyZXBvcnQpKTsgcHJvY2Vzcy5leGl0KGNvZGUpOyB9O1xuY29uc3QgZXJyb3JPZiA9IChlKSA9XHUwMDNlICh7IGVycm9yOiBTdHJpbmcoKGUgXHUwMDI2XHUwMDI2IGUubWVzc2FnZSkgfHwgZSkuc2xpY2UoMCwgMjAwKSwgY29kZTogKGUgXHUwMDI2XHUwMDI2IHR5cGVvZiBlLmNvZGUgPT09IFwic3RyaW5nXCIpID8gZS5jb2RlIDogXCJcIiB9KTtcbi8vIFdoYXQgdGhlIGFkYXB0ZXIgcmV0dXJuZWQsIGFzIEpTT04sIHNvIHRoZSBob3N0IGNhbiBjaGVjayBpdHMgc2hhcGU6IG5ldmVyIGp1ZGdlZCBoZXJlLlxuY29uc3QgcmF3ID0gKHYpID1cdTAwM2Uge1xuICBpZiAodiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHsgY29uc3QgcyA9IEpTT04uc3RyaW5naWZ5KHYpOyByZXR1cm4gcy5sZW5ndGggXHUwMDNjPSA0MDk2ID8gSlNPTi5wYXJzZShzKSA6IHsgdHJ1bmNhdGVkOiBzLmxlbmd0aCB9OyB9IGNhdGNoIChlKSB7IHJldHVybiB7IHVuc2VyaWFsaXphYmxlOiBTdHJpbmcoZSBcdTAwMjZcdTAwMjYgZS5tZXNzYWdlKSB9OyB9XG59O1xuXG5jb25zdCBndWFyZCA9IHNldFRpbWVvdXQoKCkgPVx1MDAzZSB7IGZhaWwoXCJoYXJuZXNzIHRpbWVvdXQgYWZ0ZXIgNzUgc1wiKTsgZmluaXNoKDIpOyB9LCA3NTAwMCk7XG5ndWFyZC51bnJlZigpO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICBpZiAoIXNjZW5hcmlvIHx8ICFhZGFwdGVyRmlsZSkgeyBmYWlsKFwidXNhZ2U6IG5vZGUgaGFybmVzcy5qcyBcdTAwM2NzY2VuYXJpb1x1MDAzZSBcdTAwM2NhZGFwdGVyIGZpbGVcdTAwM2VcIik7IHJldHVybiBmaW5pc2goMik7IH1cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLmZsZWV0ICE9PSBcIm9iamVjdFwiKSB7IGZhaWwoXCJubyBmbGVldCBjbGllbnQgaW4gdGhpcyBydW46IHRoZSBncmFudCBpcyBtaXNzaW5nXCIpOyByZXR1cm4gZmluaXNoKDIpOyB9XG4gIGxldCBwbGFuO1xuICB0cnkgeyBwbGFuID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoXCJwbGFuLmpzb25cIiwgXCJ1dGY4XCIpKTsgfSBjYXRjaCAoZSkgeyBmYWlsKFwicGxhbi5qc29uOiBcIiArIGUubWVzc2FnZSk7IHJldHVybiBmaW5pc2goMik7IH1cbiAgbGV0IGFkYXB0ZXI7XG4gIHRyeSB7IGFkYXB0ZXIgPSByZXF1aXJlKFwiLi9cIiArIGFkYXB0ZXJGaWxlKTsgfSBjYXRjaCAoZSkgeyBmYWlsKFwiYWRhcHRlciBmYWlsZWQgdG8gbG9hZDogXCIgKyBlLm1lc3NhZ2UpOyByZXR1cm4gZmluaXNoKDEpOyB9XG4gIGZvciAoY29uc3QgZm4gb2YgW1wiaW52ZW50b3J5XCIsIFwiZGlzcGF0Y2hcIiwgXCJ3YWl0XCIsIFwiY2FuY2VsXCJdKSB7XG4gICAgaWYgKHR5cGVvZiBhZGFwdGVyW2ZuXSAhPT0gXCJmdW5jdGlvblwiKSB7IGZhaWwoXCJhZGFwdGVyIGRvZXMgbm90IGV4cG9ydCBcIiArIGZuKTsgfVxuICB9XG4gIGlmIChyZXBvcnQuZXJyb3JzLmxlbmd0aCkgcmV0dXJuIGZpbmlzaCgxKTtcblxuICAvLyAxLiBJbnZlbnRvcnksIHJlY29yZGVkIGFzIHJldHVybmVkLlxuICBjb25zdCB0YWtlSW52ZW50b3J5ID0gYXN5bmMgKCkgPVx1MDAzZSB7XG4gICAgdHJ5IHsgcmVwb3J0LmludmVudG9yaWVzLnB1c2goeyByZXR1cm5lZDogcmF3KGF3YWl0IGFkYXB0ZXIuaW52ZW50b3J5KCkpLCBlcnJvcjogXCJcIiB9KTsgfVxuICAgIGNhdGNoIChlKSB7IHJlcG9ydC5pbnZlbnRvcmllcy5wdXNoKHsgcmV0dXJuZWQ6IG51bGwsIGVycm9yOiBlcnJvck9mKGUpLmVycm9yIH0pOyB9XG4gIH07XG4gIGF3YWl0IHRha2VJbnZlbnRvcnkoKTtcblxuICAvLyAyLiBEaXNwYXRjaCBldmVyeSBjb21tYW5kLCB0aGVuIHdhaXQgZm9yIGVhY2ggbWlzc2lvbi4gQW4gZXJyb3IgdGhlIGFkYXB0ZXIgdGhyb3dzXG4gIC8vICAgIGlzIHJlY29yZGVkIGFnYWluc3QgaXRzIGNvbW1hbmQsIGFuZCB0aGUgcnVuIGdvZXMgb24uXG4gIGNvbnN0IHJvd3MgPSBwbGFuLmNvbW1hbmRzLm1hcCgoYykgPVx1MDAzZSAoeyBpZDogYy5pZCwgcm9ib3Q6IGMucm9ib3QsIG1pc3Npb246IFwiXCIsIGRpc3BhdGNoZWQ6IG51bGwsIHN0YXRlOiBcIlwiLCBwb2xsczogMCwgbWF4X3BvbGxzOiAwLCB3YWl0ZWQ6IG51bGwsIGVycm9yOiBcIlwiLCBjb2RlOiBcIlwiIH0pKTtcbiAgcmVwb3J0LmNvbW1hbmRzID0gcm93cztcbiAgY29uc3Qgc2VuZCA9IGFzeW5jIChjLCByb3cpID1cdTAwM2Uge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtID0gYXdhaXQgYWRhcHRlci5kaXNwYXRjaChjLnJvYm90LCBjLnRhcmdldCwgYy5pZCk7XG4gICAgICByb3cuZGlzcGF0Y2hlZCA9IHJhdyhtKTtcbiAgICAgIGlmICh0eXBlb2YgbSA9PT0gXCJzdHJpbmdcIiBcdTAwMjZcdTAwMjYgbSAhPT0gXCJcIikgcm93Lm1pc3Npb24gPSBtO1xuICAgIH0gY2F0Y2ggKGUpIHsgT2JqZWN0LmFzc2lnbihyb3csIGVycm9yT2YoZSkpOyB9XG4gIH07XG4gIGNvbnN0IHdhdGNoID0gYXN5bmMgKHJvdywgbWF4UG9sbHMpID1cdTAwM2Uge1xuICAgIGlmICghcm93Lm1pc3Npb24pIHJldHVybjtcbiAgICByb3cubWF4X3BvbGxzID0gbWF4UG9sbHM7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHcgPSBhd2FpdCBhZGFwdGVyLndhaXQocm93Lm1pc3Npb24sIHsgbWF4UG9sbHMgfSk7XG4gICAgICByb3cud2FpdGVkID0gcmF3KHcpO1xuICAgICAgcm93LnN0YXRlID0gKHcgXHUwMDI2XHUwMDI2IHR5cGVvZiB3LnN0YXRlID09PSBcInN0cmluZ1wiKSA/IHcuc3RhdGUgOiBcIlwiO1xuICAgICAgcm93LnBvbGxzID0gKHcgXHUwMDI2XHUwMDI2IHR5cGVvZiB3LnBvbGxzID09PSBcIm51bWJlclwiKSA/IHcucG9sbHMgOiAwO1xuICAgICAgcmVwb3J0LnBvbGxzICs9IHJvdy5wb2xscztcbiAgICAgIGlmICh3IFx1MDAyNlx1MDAyNiB0eXBlb2Ygdy5yZXRyaWVzID09PSBcIm51bWJlclwiKSByZXBvcnQucmV0cmllcyA9IE1hdGgubWF4KHJlcG9ydC5yZXRyaWVzLCB3LnJldHJpZXMpO1xuICAgIH0gY2F0Y2ggKGUpIHsgT2JqZWN0LmFzc2lnbihyb3csIGVycm9yT2YoZSkpOyB9XG4gIH07XG4gIGZvciAobGV0IGkgPSAwOyBpIFx1MDAzYyBwbGFuLmNvbW1hbmRzLmxlbmd0aDsgaSsrKSBpZiAoIXBsYW4uY29tbWFuZHNbaV0uY2FuY2VsKSBhd2FpdCBzZW5kKHBsYW4uY29tbWFuZHNbaV0sIHJvd3NbaV0pO1xuICAvLyBUaGUgcmVhZCBidWRnZXRzLCA0MCBhbmQgNSBiZWxvdywgYXJlIHF1YWxpZnkuV2FpdEJ1ZGdldCBhbmQgQ2FuY2VsV2FpdEJ1ZGdldC5cbiAgZm9yIChsZXQgaSA9IDA7IGkgXHUwMDNjIHBsYW4uY29tbWFuZHMubGVuZ3RoOyBpKyspIGlmICghcGxhbi5jb21tYW5kc1tpXS5jYW5jZWwpIGF3YWl0IHdhdGNoKHJvd3NbaV0sIDQwKTtcblxuICAvLyAzLiBUaGUgY29tbWFuZHMgdGhlIHBsYXRmb3JtIGNhbmNlbHM6IGRpc3BhdGNoLCBjYW5jZWwgYXQgb25jZSwgdGhlbiB3YWl0LlxuICBmb3IgKGxldCBpID0gMDsgaSBcdTAwM2MgcGxhbi5jb21tYW5kcy5sZW5ndGg7IGkrKykge1xuICAgIGlmICghcGxhbi5jb21tYW5kc1tpXS5jYW5jZWwpIGNvbnRpbnVlO1xuICAgIGF3YWl0IHNlbmQocGxhbi5jb21tYW5kc1tpXSwgcm93c1tpXSk7XG4gICAgaWYgKHJvd3NbaV0ubWlzc2lvbikge1xuICAgICAgdHJ5IHsgYXdhaXQgYWRhcHRlci5jYW5jZWwocm93c1tpXS5taXNzaW9uKTsgfSBjYXRjaCAoZSkgeyBPYmplY3QuYXNzaWduKHJvd3NbaV0sIGVycm9yT2YoZSkpOyB9XG4gICAgICBhd2FpdCB3YXRjaChyb3dzW2ldLCA1KTtcbiAgICB9XG4gIH1cblxuICAvLyA0LiBJbnZlbnRvcnkgYWdhaW4sIGFzIHRoZSBsYXN0IGNhbGwgb2YgdGhlIHJ1bi5cbiAgYXdhaXQgdGFrZUludmVudG9yeSgpO1xuXG4gIHJlcG9ydC5jb21wbGV0ZWQgPSByZXBvcnQuZXJyb3JzLmxlbmd0aCA9PT0gMDtcbiAgZmluaXNoKHJlcG9ydC5jb21wbGV0ZWQgPyAwIDogMSk7XG59XG5cbm1haW4oKS5jYXRjaCgoZSkgPVx1MDAzZSB7IGZhaWwoXCJoYXJuZXNzIGVycm9yOiBcIiArIChlIFx1MDAyNlx1MDAyNiBlLm1lc3NhZ2UpKTsgZmluaXNoKDEpOyB9KTtcbiIsInBhdGgiOiJoYXJuZXNzLmpzIn0seyJjb250ZW50IjoiLy8gRmxlZXQgdmVuZG9yIGFkYXB0ZXIsIGZpcnN0IHZlcnNpb24sIHdyaXR0ZW4gZnJvbSBQUk9NUFQubWQgKHRoZSBjb250cmFjdCBhbmQgdGhlXG4vLyBkZXNjcmlwdGlvbiBnZW5lcmF0ZWQgZnJvbSB0aGUgdmVuZG9yJ3MgT3BlbkFQSSBkb2N1bWVudCBhcyB0aGV5IHN0b29kIHRoZW4pIGJ5IHRoZVxuLy8gQUkgdGhhdCBidWlsdCB0aGlzIGV4YW1wbGUsIGluIHRoZSBzYW1lIHNlc3Npb24sIGJlZm9yZSB0aGUgbG9zdC1hY2tub3dsZWRnZW1lbnRcbi8vIHNjZW5hcmlvIGV4aXN0ZWQuIEl0IGlzIG5vdCBhbiBpbmRlcGVuZGVudCBhZ2VudCdzIGFuc3dlcjogaXRzIGF1dGhvciBhbHNvIHdyb3RlIHRoZVxuLy8gaGFybmVzcy4gSXRzIGNvZGUgaXMgdW5jaGFuZ2VkIHNpbmNlIGl0IHdhcyBmaXJzdCBjb21taXR0ZWQ7IG9ubHkgdGhpcyBjb21tZW50IHdhc1xuLy8gY29ycmVjdGVkLiBJdHMgaW52ZW50b3J5KCkgbGlzdHMgdGhlIHJvYm90cywgdGhlbiByZWFkcyBlYWNoIG9uZSBmb3IgaXRzIHN0YXRlOiBvbmVcbi8vIHJlcXVlc3QgcGVyIHJvYm90LiBJdHMgZGlzcGF0Y2goKSBwcmVkYXRlcyB0aGUgY29tbWFuZCBJRCBhbmQgaWdub3JlcyBpdC5cblwidXNlIHN0cmljdFwiO1xuXG5jb25zdCBzbGVlcCA9IChtcykgPVx1MDAzZSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPVx1MDAzZSBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG5sZXQgcmV0cmllcyA9IDA7XG5cbi8vIFRoZSB2ZW5kb3IgYW5zd2VycyA1MDMgd2hpbGUgaXQgaXMgZGVncmFkZWQ7IHdhaXQgYSBsaXR0bGUgYW5kIHRyeSBhZ2FpbiwgYSBib3VuZGVkXG4vLyBudW1iZXIgb2YgdGltZXMuIEFueSBvdGhlciBlcnJvciBpcyB0aGUgY2FsbGVyJ3MgdG8gc2VlLlxuYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5KGZuKSB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyA7IGF0dGVtcHQrKykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCB0cmFuc2llbnQgPSAvaG9zdCBhcGkgKDUwM3w0MjkpLy50ZXN0KFN0cmluZyhlIFx1MDAyNlx1MDAyNiBlLm1lc3NhZ2UpKTtcbiAgICAgIGlmICghdHJhbnNpZW50IHx8IGF0dGVtcHQgXHUwMDNlPSA0MCkgdGhyb3cgZTtcbiAgICAgIHJldHJpZXMrKztcbiAgICAgIGF3YWl0IHNsZWVwKDI1MCk7XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhc3luYyBpbnZlbnRvcnkoKSB7XG4gICAgY29uc3QgbGlzdCA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9XHUwMDNlIGZsZWV0Lmxpc3RSb2JvdHMoKSk7XG4gICAgY29uc3Qgb3V0ID0gW107XG4gICAgZm9yIChjb25zdCBzdW1tYXJ5IG9mIGxpc3Qucm9ib3RzKSB7XG4gICAgICBjb25zdCByb2JvdCA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9XHUwMDNlIGZsZWV0LmdldFJvYm90KHN1bW1hcnkuaWQpKTtcbiAgICAgIG91dC5wdXNoKHsgaWQ6IHJvYm90LmlkLCBzdGF0dXM6IHJvYm90LnN0YXR1cywgYmF0dGVyeTogcm9ib3QuYmF0dGVyeSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfSxcblxuICBhc3luYyBkaXNwYXRjaChyb2JvdElkLCB0YXJnZXQpIHtcbiAgICBjb25zdCBtaXNzaW9uID0gYXdhaXQgd2l0aFJldHJ5KCgpID1cdTAwM2UgZmxlZXQuY3JlYXRlTWlzc2lvbihyb2JvdElkLCB7IHRhcmdldCB9KSk7XG4gICAgcmV0dXJuIG1pc3Npb24ubWlzc2lvbl9pZDtcbiAgfSxcblxuICBhc3luYyB3YWl0KG1pc3Npb25JZCwgb3B0cykge1xuICAgIGNvbnN0IG1heFBvbGxzID0gKG9wdHMgXHUwMDI2XHUwMDI2IG9wdHMubWF4UG9sbHMpIHx8IDUwO1xuICAgIGZvciAobGV0IHBvbGxzID0gMTsgcG9sbHMgXHUwMDNjPSBtYXhQb2xsczsgcG9sbHMrKykge1xuICAgICAgY29uc3QgbWlzc2lvbiA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9XHUwMDNlIGZsZWV0LmdldE1pc3Npb24obWlzc2lvbklkKSk7XG4gICAgICBpZiAobWlzc2lvbi5zdGF0dXMgPT09IFwiZG9uZVwiIHx8IG1pc3Npb24uc3RhdHVzID09PSBcImZhaWxlZFwiIHx8IG1pc3Npb24uc3RhdHVzID09PSBcImNhbmNlbGxlZFwiKSB7XG4gICAgICAgIHJldHVybiB7IHN0YXRlOiBtaXNzaW9uLnN0YXR1cywgcG9sbHMsIHJldHJpZXMgfTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHNsZWVwKDIwKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhdGU6IFwidGltZW91dFwiLCBwb2xsczogbWF4UG9sbHMsIHJldHJpZXMgfTtcbiAgfSxcblxuICBhc3luYyBjYW5jZWwobWlzc2lvbklkKSB7XG4gICAgYXdhaXQgd2l0aFJldHJ5KCgpID1cdTAwM2UgZmxlZXQuY2FuY2VsTWlzc2lvbihtaXNzaW9uSWQpKTtcbiAgfSxcbn07XG4iLCJwYXRoIjoiYWRhcHRlci12MS5qcyJ9LHsiY29udGVudCI6Ii8vIEZsZWV0IHZlbmRvciBhZGFwdGVyLCBzZWNvbmQgdmVyc2lvbjogdHdvIGNoYW5nZXMgYWZ0ZXIgdGhlIGZpcnN0IHdhcyBxdWFsaWZpZWQuXG4vLyBpbnZlbnRvcnkoKSByZWFkcyB0aGUgbGlzdCBvbmNlLCBzaW5jZSB0aGUgcHJvZmlsZSBkZWNsYXJlcyBHRVQgL3JvYm90cyB0aGUgYmF0Y2hcbi8vIGZvcm0gb2YgR0VUIC9yb2JvdHMvKiAodGhlIGFkdmlzb3IncyBmaW5kaW5nKS4gZGlzcGF0Y2goKSBuYW1lcyBldmVyeSBvcmRlciB3aXRoIHRoZVxuLy8gcGxhdGZvcm0ncyBjb21tYW5kIElEIGFuZCwgd2hlbiB0aGUgdmVuZG9yJ3MgYW5zd2VyIGlzIGFuIGVycm9yIG9yIG5ldmVyIGNvbWVzLCBzZW5kc1xuLy8gdGhlIHNhbWUgY3JlYXRlIGFnYWluOiB0aGUgdmVuZG9yIGFuc3dlcnMgYSByZXBlYXRlZCBjb21tYW5kX2lkIHdpdGggdGhlIG9yZGVyIGl0XG4vLyBhbHJlYWR5IGhhcywgc28gYSByZXRyeSBjYW5ub3QgcGxhY2UgYSBzZWNvbmQgb3JkZXIsIGFuZCB0aGUgbWlzc2lvbiByZXR1cm5lZCBpcyB0aGVcbi8vIG9uZSB0aGlzIGNvbW1hbmQgY3JlYXRlZC4gSXQgbmV2ZXIgcmVhZHMgYSByb2JvdCdzIGN1cnJlbnQgbWlzc2lvbiB0byBndWVzcyB3aGljaFxuLy8gb3JkZXIgaXMgaXRzIG93bi5cbi8vXG4vLyBUd28gbGF0ZXIgcmVwYWlycywgYWZ0ZXIgZnVydGhlciB0ZXN0aW5nOiBhbiBlcnJvciBpcyBhIHJlZnVzYWwgb25seSB3aGVuIGl0IHNheXMgc29cbi8vIChhbiBlYXJsaWVyIHZlcnNpb24gdG9vayBhIDUwMCBhcyBvbmUsIGFuZCByZXBvcnRlZCBcInJlZnVzZWRcIiBmb3IgYW4gb3JkZXIgdGhlIHZlbmRvclxuLy8gaGFkIGFjY2VwdGVkIGJlZm9yZSBhbnN3ZXJpbmcgNTAwKTsgd2FpdCgpJ3MgbWF4UG9sbHMgYm91bmRzIGV2ZXJ5IHN0YXR1cyByZWFkLCBmYWlsZWRcbi8vIG9uZXMgaW5jbHVkZWQgKGFuIGVhcmxpZXIgdmVyc2lvbiByZXRyaWVkIGVhY2ggcmVhZCB1cCB0byA0MCB0aW1lcyk7IGFuZCBhIHN0YXR1c1xuLy8gYW5zd2VyIG5hbWluZyBhbm90aGVyIG1pc3Npb24gaXMgYSBmYWlsZWQgcmVhZCwgbmV2ZXIgdGhpcyBtaXNzaW9uJ3Mgc3RhdGUuXG5cInVzZSBzdHJpY3RcIjtcblxuY29uc3QgQVRURU1QVFMgPSA0MDsgLy8gY2FsbHMgb25lIG9wZXJhdGlvbiBtYXkgbWFrZSwgcmV0cmllcyBpbmNsdWRlZFxuY29uc3Qgc2xlZXAgPSAobXMpID1cdTAwM2UgbmV3IFByb21pc2UoKHJlc29sdmUpID1cdTAwM2Ugc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xubGV0IHJldHJpZXMgPSAwO1xuXG5jb25zdCBzdGF0dXNPZiA9IChlKSA9XHUwMDNlIE51bWJlcigoU3RyaW5nKGUgXHUwMDI2XHUwMDI2IGUubWVzc2FnZSkubWF0Y2goL2hvc3QgYXBpIChcXGR7M30pLykgfHwgW10pWzFdIHx8IDApO1xuXG4vLyBBIGRlZmluaXRlIHJlZnVzYWw6IHRoZSB2ZW5kb3Igc2FpZCBubyAoYSA0eHggb3RoZXIgdGhhbiA0MDggdGltZW91dCBhbmQgNDI5IHRvbyBtYW55XG4vLyByZXF1ZXN0cyksIG9yIHRoZSBjbGllbnQgbmV2ZXIgc2VudCB0aGUgY2FsbC4gQW55dGhpbmcgZWxzZSAoYSA1eHgsIGEgNDA4IG9yIDQyOSwgbm9cbi8vIGFuc3dlciBhdCBhbGwpIGxlYXZlcyB0aGUgb3V0Y29tZSB1bmtub3duOiB0aGUgcmVxdWVzdCBtYXkgb3IgbWF5IG5vdCBoYXZlIHRha2VuIGVmZmVjdC5cbmNvbnN0IHJlZnVzZWQgPSAoZSkgPVx1MDAzZSB7XG4gIGNvbnN0IHMgPSBzdGF0dXNPZihlKTtcbiAgcmV0dXJuIChzIFx1MDAzZT0gNDAwIFx1MDAyNlx1MDAyNiBzIFx1MDAzYyA1MDAgXHUwMDI2XHUwMDI2IHMgIT09IDQwOCBcdTAwMjZcdTAwMjYgcyAhPT0gNDI5KSB8fCAvbm90IHBlcm1pdHRlZCBieSBzYW5kYm94IGNhcGFiaWxpdHkvLnRlc3QoU3RyaW5nKGUgXHUwMDI2XHUwMDI2IGUubWVzc2FnZSkpO1xufTtcblxuY29uc3QgZmFpbHVyZSA9IChjb2RlLCBtZXNzYWdlKSA9XHUwMDNlIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKG1lc3NhZ2UpLCB7IGNvZGUgfSk7XG5cbi8vIFJlYWRzIGFuZCBjYW5jZWxzIGFyZSBzYWZlIHRvIHJlcGVhdDogdHJ5IHVwIHRvIEFUVEVNUFRTIHRpbWVzIHdoaWxlIHRoZSBvdXRjb21lIGlzIHVua25vd24uXG5hc3luYyBmdW5jdGlvbiB3aXRoUmV0cnkoZm4pIHtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IDsgYXR0ZW1wdCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChyZWZ1c2VkKGUpIHx8IGF0dGVtcHQgXHUwMDNlPSBBVFRFTVBUUykgdGhyb3cgZTtcbiAgICAgIHJldHJpZXMrKztcbiAgICAgIGF3YWl0IHNsZWVwKDI1MCk7XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhc3luYyBpbnZlbnRvcnkoKSB7XG4gICAgY29uc3QgbGlzdCA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9XHUwMDNlIGZsZWV0Lmxpc3RSb2JvdHMoKSk7XG4gICAgcmV0dXJuIGxpc3Qucm9ib3RzLm1hcCgocm9ib3QpID1cdTAwM2UgKHsgaWQ6IHJvYm90LmlkLCBzdGF0dXM6IHJvYm90LnN0YXR1cywgYmF0dGVyeTogcm9ib3QuYmF0dGVyeSB9KSk7XG4gIH0sXG5cbiAgYXN5bmMgZGlzcGF0Y2gocm9ib3RJZCwgdGFyZ2V0LCBjb21tYW5kSWQpIHtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1pc3Npb24gPSBhd2FpdCBmbGVldC5jcmVhdGVNaXNzaW9uKHJvYm90SWQsIHsgdGFyZ2V0LCBjb21tYW5kX2lkOiBjb21tYW5kSWQgfSk7XG4gICAgICAgIHJldHVybiBtaXNzaW9uLm1pc3Npb25faWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChyZWZ1c2VkKGUpKSB0aHJvdyBmYWlsdXJlKFwicmVmdXNlZFwiLCBcImNvbW1hbmQgXCIgKyBjb21tYW5kSWQgKyBcIiB3YXMgbm90IHBsYWNlZDogXCIgKyBlLm1lc3NhZ2UpO1xuICAgICAgICBpZiAoYXR0ZW1wdCBcdTAwM2U9IEFUVEVNUFRTKSB0aHJvdyBmYWlsdXJlKFwidW5yZXNvbHZlZFwiLCBcImNvbW1hbmQgXCIgKyBjb21tYW5kSWQgKyBcIjogbm8gYW5zd2VyIGFmdGVyIFwiICsgYXR0ZW1wdCArIFwiIGF0dGVtcHRzOyB0aGUgdmVuZG9yIG1heSBvciBtYXkgbm90IGhvbGQgdGhlIG9yZGVyXCIpO1xuICAgICAgICByZXRyaWVzKys7XG4gICAgICAgIGF3YWl0IHNsZWVwKDI1MCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIG1heFBvbGxzIGlzIHRoZSBudW1iZXIgb2Ygc3RhdHVzIHJlYWRzLCBmYWlsZWQgb25lcyBpbmNsdWRlZDsgMCBtYWtlcyBub25lLlxuICBhc3luYyB3YWl0KG1pc3Npb25JZCwgb3B0cykge1xuICAgIGNvbnN0IG1heFBvbGxzID0gb3B0cyBcdTAwMjZcdTAwMjYgTnVtYmVyLmlzSW50ZWdlcihvcHRzLm1heFBvbGxzKSBcdTAwMjZcdTAwMjYgb3B0cy5tYXhQb2xscyBcdTAwM2U9IDAgPyBvcHRzLm1heFBvbGxzIDogNTA7XG4gICAgbGV0IHBvbGxzID0gMDtcbiAgICB3aGlsZSAocG9sbHMgXHUwMDNjIG1heFBvbGxzKSB7XG4gICAgICBwb2xscysrO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWlzc2lvbiA9IGF3YWl0IGZsZWV0LmdldE1pc3Npb24obWlzc2lvbklkKTtcbiAgICAgICAgaWYgKCFtaXNzaW9uIHx8IG1pc3Npb24uaWQgIT09IG1pc3Npb25JZCkge1xuICAgICAgICAgIC8vIEFuIGFuc3dlciBhYm91dCBhbm90aGVyIG1pc3Npb24gaXMgbm8gYW5zd2VyIGFib3V0IHRoaXMgb25lOiBhIGZhaWxlZCByZWFkLlxuICAgICAgICAgIHJldHJpZXMrKztcbiAgICAgICAgICBpZiAocG9sbHMgXHUwMDNjIG1heFBvbGxzKSBhd2FpdCBzbGVlcCgyNTApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtaXNzaW9uLnN0YXR1cyA9PT0gXCJkb25lXCIgfHwgbWlzc2lvbi5zdGF0dXMgPT09IFwiZmFpbGVkXCIgfHwgbWlzc2lvbi5zdGF0dXMgPT09IFwiY2FuY2VsbGVkXCIpIHtcbiAgICAgICAgICByZXR1cm4geyBzdGF0ZTogbWlzc2lvbi5zdGF0dXMsIHBvbGxzLCByZXRyaWVzIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvbGxzIFx1MDAzYyBtYXhQb2xscykgYXdhaXQgc2xlZXAoMjApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAocmVmdXNlZChlKSkgdGhyb3cgZTtcbiAgICAgICAgcmV0cmllcysrO1xuICAgICAgICBpZiAocG9sbHMgXHUwMDNjIG1heFBvbGxzKSBhd2FpdCBzbGVlcCgyNTApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBzdGF0ZTogXCJ0aW1lb3V0XCIsIHBvbGxzLCByZXRyaWVzIH07XG4gIH0sXG5cbiAgYXN5bmMgY2FuY2VsKG1pc3Npb25JZCkge1xuICAgIGF3YWl0IHdpdGhSZXRyeSgoKSA9XHUwMDNlIGZsZWV0LmNhbmNlbE1pc3Npb24obWlzc2lvbklkKSk7XG4gIH0sXG59O1xuIiwicGF0aCI6ImFkYXB0ZXItdjIuanMifSx7ImNvbnRlbnQiOiIvLyBCcm9rZW4gb24gcHVycG9zZTogdGhlIHNlY29uZCBhZGFwdGVyIHdob3NlIGludmVudG9yeSgpIHJlcG9ydHMgbm8gcm9ib3RzLlxuXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL2FkYXB0ZXItdjIuanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IHsgLi4uYmFzZSwgYXN5bmMgaW52ZW50b3J5KCkgeyByZXR1cm4gW107IH0gfTtcbiIsInBhdGgiOiJicm9rZW4vZW1wdHktaW52ZW50b3J5LmpzIn0seyJjb250ZW50IjoiLy8gQnJva2VuIG9uIHB1cnBvc2U6IHRoZSBzZWNvbmQgYWRhcHRlciByZXBvcnRpbmcgYSBmYWlsZWQgbWlzc2lvbiBhcyBkb25lLlxuXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL2FkYXB0ZXItdjIuanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLi4uYmFzZSxcbiAgYXN5bmMgd2FpdChtaXNzaW9uSWQsIG9wdHMpIHtcbiAgICBjb25zdCB3ID0gYXdhaXQgYmFzZS53YWl0KG1pc3Npb25JZCwgb3B0cyk7XG4gICAgcmV0dXJuIHsgLi4udywgc3RhdGU6IHcuc3RhdGUgPT09IFwiZmFpbGVkXCIgPyBcImRvbmVcIiA6IHcuc3RhdGUgfTtcbiAgfSxcbn07XG4iLCJwYXRoIjoiYnJva2VuL2ZhbHNlLXN1Y2Nlc3MuanMifSx7ImNvbnRlbnQiOiIvLyBCcm9rZW4gb24gcHVycG9zZTogdGhlIHNlY29uZCBhZGFwdGVyIHdob3NlIGludmVudG9yeSgpIHJlcG9ydHMgYSByb2JvdCB0aGUgdmVuZG9yXG4vLyBkb2VzIG5vdCBoYXZlLCBpbiBhIHN0YXR1cyB0aGUgY29udHJhY3QgZG9lcyBub3QgaGF2ZS5cblwidXNlIHN0cmljdFwiO1xuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9hZGFwdGVyLXYyLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSB7IC4uLmJhc2UsIGFzeW5jIGludmVudG9yeSgpIHsgcmV0dXJuIFt7IGlkOiBcImltYWdpbmFyeVwiLCBzdGF0dXM6IFwiYmFuYW5hXCIsIGJhdHRlcnk6IC01MCB9XTsgfSB9O1xuIiwicGF0aCI6ImJyb2tlbi9pbnZlbnRlZC1yb2JvdC5qcyJ9LHsiY29udGVudCI6Ii8vIEJyb2tlbiBvbiBwdXJwb3NlOiB0aGUgc2Vjb25kIGFkYXB0ZXIgd2hvc2UgY2FuY2VsKCkgc2VuZHMgbm90aGluZy5cblwidXNlIHN0cmljdFwiO1xuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9hZGFwdGVyLXYyLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSB7IC4uLmJhc2UsIGFzeW5jIGNhbmNlbCgpIHt9IH07XG4iLCJwYXRoIjoiYnJva2VuL25vLWNhbmNlbC5qcyJ9LHsiY29udGVudCI6Ii8vIEJyb2tlbiBvbiBwdXJwb3NlOiB0aGUgc2Vjb25kIGFkYXB0ZXIgd2hvc2Ugd2FpdCgpIGRvZXMgdGhlIHJlYWRzIGFuZCB0aGVuIHJlcG9ydHMgYVxuLy8gY291bnQgd2l0aCBubyBzdGF0ZS5cblwidXNlIHN0cmljdFwiO1xuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9hZGFwdGVyLXYyLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSB7IC4uLmJhc2UsIGFzeW5jIHdhaXQobWlzc2lvbklkLCBvcHRzKSB7IGNvbnN0IHcgPSBhd2FpdCBiYXNlLndhaXQobWlzc2lvbklkLCBvcHRzKTsgcmV0dXJuIHsgcG9sbHM6IHcucG9sbHMgfTsgfSB9O1xuIiwicGF0aCI6ImJyb2tlbi9uby1zdGF0ZS5qcyJ9LHsiY29udGVudCI6Ii8vIEJyb2tlbiBvbiBwdXJwb3NlOiB0aGUgc2Vjb25kIGFkYXB0ZXIgd2hvc2Ugd2FpdCgpIGZvbGxvd3MgdGhlIG1pc3Npb24gdG8gaXRzIGVuZCxcbi8vIHRoZW4gdGhyb3dzIGluc3RlYWQgb2YgcmV0dXJuaW5nIGl0cyBzdGF0ZS5cblwidXNlIHN0cmljdFwiO1xuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9hZGFwdGVyLXYyLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSB7IC4uLmJhc2UsIGFzeW5jIHdhaXQobWlzc2lvbklkLCBvcHRzKSB7IGF3YWl0IGJhc2Uud2FpdChtaXNzaW9uSWQsIG9wdHMpOyB0aHJvdyBuZXcgRXJyb3IoXCJ3YWl0IGZhaWxlZCBhZnRlciB0aGUgbWlzc2lvbiBlbmRlZFwiKTsgfSB9O1xuIiwicGF0aCI6ImJyb2tlbi90aHJvd2luZy13YWl0LmpzIn0seyJjb250ZW50IjoiLy8gQnJva2VuIG9uIHB1cnBvc2U6IHRoZSBzZWNvbmQgYWRhcHRlciwgZXhjZXB0IHRoYXQgYSBjcmVhdGUgdGhlIHZlbmRvciBuZXZlciBhbnN3ZXJzIGlzXG4vLyBnaXZlbiB1cCBhZnRlciB0aHJlZSB0cmllcyBhbmQgcmVwb3J0ZWQgYXMgcmVmdXNlZCwgYXMgaWYgdGhlIHZlbmRvciBoYWQgc2FpZCBuby5cblwidXNlIHN0cmljdFwiO1xuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9hZGFwdGVyLXYyLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC4uLmJhc2UsXG4gIGFzeW5jIGRpc3BhdGNoKHJvYm90SWQsIHRhcmdldCwgY29tbWFuZElkKSB7XG4gICAgbGV0IGxhc3Q7XG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgXHUwMDNjPSAzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7IHJldHVybiAoYXdhaXQgZmxlZXQuY3JlYXRlTWlzc2lvbihyb2JvdElkLCB7IHRhcmdldCwgY29tbWFuZF9pZDogY29tbWFuZElkIH0pKS5taXNzaW9uX2lkOyB9IGNhdGNoIChlKSB7IGxhc3QgPSBlOyB9XG4gICAgfVxuICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKFwiY29tbWFuZCBcIiArIGNvbW1hbmRJZCArIFwiIHdhcyBub3QgcGxhY2VkOiBcIiArIGxhc3QubWVzc2FnZSksIHsgY29kZTogXCJyZWZ1c2VkXCIgfSk7XG4gIH0sXG59O1xuIiwicGF0aCI6ImJyb2tlbi91bmFuc3dlcmVkLWFzLXJlZnVzZWQuanMifSx7ImNvbnRlbnQiOiIvLyBCcm9rZW4gb24gcHVycG9zZTogdGhlIHNlY29uZCBhZGFwdGVyIHdob3NlIHdhaXQoKSByZWFkcyB0aGUgbWlzc2lvbiBvbmNlIG1vcmUgdGhhblxuLy8gaXRzIGJ1ZGdldCBhbGxvd3MsIHRoZW4gcmVwb3J0cyBhIHNpbmdsZSByZWFkLlxuXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL2FkYXB0ZXItdjIuanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLi4uYmFzZSxcbiAgYXN5bmMgd2FpdChtaXNzaW9uSWQsIG9wdHMpIHtcbiAgICBjb25zdCB3ID0gYXdhaXQgYmFzZS53YWl0KG1pc3Npb25JZCwgb3B0cyk7XG4gICAgZm9yIChsZXQgbiA9IHcucG9sbHM7IG4gXHUwMDNjPSBvcHRzLm1heFBvbGxzOyBuKyspIGF3YWl0IGZsZWV0LmdldE1pc3Npb24obWlzc2lvbklkKTtcbiAgICByZXR1cm4geyBzdGF0ZTogdy5zdGF0ZSwgcG9sbHM6IDEgfTtcbiAgfSxcbn07XG4iLCJwYXRoIjoiYnJva2VuL3VuZGVyY291bnRlZC1yZWFkcy5qcyJ9LHsiY29udGVudCI6Ii8vIEJyb2tlbiBvbiBwdXJwb3NlOiB0aGUgc2Vjb25kIGFkYXB0ZXIgd2l0aCByMSdzIG9yZGVycyBzZW50IHRvIHIzLiBFdmVyeSBtaXNzaW9uIGl0XG4vLyByZXBvcnRzIGV4aXN0cyBhbmQgZW5kcyBkb25lLlxuXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL2FkYXB0ZXItdjIuanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IHsgLi4uYmFzZSwgZGlzcGF0Y2g6IChyb2JvdElkLCB0YXJnZXQsIGNvbW1hbmRJZCkgPVx1MDAzZSBiYXNlLmRpc3BhdGNoKHJvYm90SWQgPT09IFwicjFcIiA/IFwicjNcIiA6IHJvYm90SWQsIHRhcmdldCwgY29tbWFuZElkKSB9O1xuIiwicGF0aCI6ImJyb2tlbi93cm9uZy1yb2JvdC5qcyJ9LHsiY29udGVudCI6Ii8vIEJyb2tlbiBvbiBwdXJwb3NlOiB0aGUgc2Vjb25kIGFkYXB0ZXIgd2l0aCBldmVyeSBvcmRlciBzZW50IHRvICgwLCAwKS4gSXRzIHJlcG9ydFxuLy8gc3RheXMgcGxhdXNpYmxlOiBlYWNoIG1pc3Npb24gZW5kcyBkb25lLCBhdCB0aGUgdGFyZ2V0IHRoZSB2ZW5kb3Igd2FzIGdpdmVuLlxuXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL2FkYXB0ZXItdjIuanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IHsgLi4uYmFzZSwgZGlzcGF0Y2g6IChyb2JvdElkLCB0YXJnZXQsIGNvbW1hbmRJZCkgPVx1MDAzZSBiYXNlLmRpc3BhdGNoKHJvYm90SWQsIHsgeDogMCwgeTogMCB9LCBjb21tYW5kSWQpIH07XG4iLCJwYXRoIjoiYnJva2VuL3dyb25nLXRhcmdldC5qcyJ9LHsiY29udGVudCI6Ii8vIFRoZSBib3VuZGFyeSBwcm9iZS4gTm90IGFuIGFkYXB0ZXI6IGEgc3RlcCB0aGF0IHRyaWVzLCBmcm9tIGluc2lkZSB0aGUgc2FtZSBydW4gYW5kXG4vLyB1bmRlciB0aGUgc2FtZSBncmFudCwgdGhlIHRocmVlIHRoaW5ncyBob3N0aWxlIGFkYXB0ZXIgY29kZSB3b3VsZCB0cnksIGFuZCByZXBvcnRzXG4vLyB3aGF0IGhhcHBlbmVkLiBVc2FnZTogbm9kZSBwcm9iZS5qcyBcdTAwM2N0aGUgdmVuZG9yJ3MgVVJMIGFzIHRoZSBob3N0IHNlZXMgaXRcdTAwM2VcblwidXNlIHN0cmljdFwiO1xuY29uc3QgaHR0cCA9IHJlcXVpcmUoXCJub2RlOmh0dHBcIik7XG5cbmFzeW5jIGZ1bmN0aW9uIHRyeURlY29tbWlzc2lvblRocm91Z2hDbGllbnQoKSB7XG4gIHRyeSB7IGF3YWl0IGZsZWV0LmRlY29tbWlzc2lvblJvYm90KFwicjFcIik7IHJldHVybiBcImFsbG93ZWRcIjsgfSBjYXRjaCAoZSkgeyByZXR1cm4gXCJyZWZ1c2VkOiBcIiArIGUubWVzc2FnZTsgfVxufVxuXG4vLyBUaGUgaW5qZWN0ZWQgY2xpZW50IGlzIEphdmFTY3JpcHQgaW5zaWRlIHRoZSBzYW5kYm94LCBzbyBpdHMgb3duIGFsbG93bGlzdCBjaGVja1xuLy8gaXMgdGhlIGd1ZXN0J3MgdG8gc2tpcC4gVGhpcyBza2lwcyBpdDogYSByYXcgcmVxdWVzdCBvbiB0aGUgYnJva2VyIHNvY2tldC5cbmZ1bmN0aW9uIHRyeURlY29tbWlzc2lvbkJ5cGFzc2luZ0NsaWVudCgpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9XHUwMDNlIHtcbiAgICBjb25zdCByZXEgPSBodHRwLnJlcXVlc3QoeyBzb2NrZXRQYXRoOiBwcm9jZXNzLmVudi5IT1NUX0FQSV9TT0NLRVQsIG1ldGhvZDogXCJERUxFVEVcIiwgcGF0aDogXCIvcm9ib3RzL3IxXCIgfSwgKHJlcykgPVx1MDAzZSB7XG4gICAgICBsZXQgdGV4dCA9IFwiXCI7IHJlcy5zZXRFbmNvZGluZyhcInV0ZjhcIik7XG4gICAgICByZXMub24oXCJkYXRhXCIsIChjKSA9XHUwMDNlICh0ZXh0ICs9IGMpKTtcbiAgICAgIHJlcy5vbihcImVuZFwiLCAoKSA9XHUwMDNlIHJlc29sdmUoXCJicm9rZXIgYW5zd2VyZWQgXCIgKyByZXMuc3RhdHVzQ29kZSArIFwiIFwiICsgdGV4dC50cmltKCkpKTtcbiAgICB9KTtcbiAgICByZXEub24oXCJlcnJvclwiLCAoZSkgPVx1MDAzZSByZXNvbHZlKFwibm8gYnJva2VyOiBcIiArIGUubWVzc2FnZSkpO1xuICAgIHJlcS5lbmQoKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRyeURpcmVjdCh1cmwpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByID0gYXdhaXQgZmV0Y2godXJsICsgXCIvcm9ib3RzXCIsIHsgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDMwMDApIH0pO1xuICAgIHJldHVybiBcInJlYWNoZWQgdGhlIHZlbmRvciBkaXJlY3RseTogXCIgKyByLnN0YXR1cztcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBcImZhaWxlZDogXCIgKyAoKGUgXHUwMDI2XHUwMDI2IGUuY2F1c2UgXHUwMDI2XHUwMDI2IGUuY2F1c2UuY29kZSkgfHwgKGUgXHUwMDI2XHUwMDI2IGUubmFtZSkgfHwgU3RyaW5nKGUpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBodW50Rm9yQ3JlZGVudGlhbCgpIHtcbiAgY29uc3Qgc3VzcGljaW91cyA9IE9iamVjdC5lbnRyaWVzKHByb2Nlc3MuZW52KS5maWx0ZXIoKFtrLCB2XSkgPVx1MDAzZVxuICAgIC90b2tlbnxzZWNyZXR8YmVhcmVyfGF1dGh8a2V5L2kudGVzdChrKSB8fCAvXltBLVphLXowLTlfLV17MzIsfSQvLnRlc3QodikpO1xuICBjb25zdCBjbGllbnRLZXlzID0gT2JqZWN0LmtleXMoZmxlZXQpLnNvcnQoKTtcbiAgbGV0IGNsaWVudFNvdXJjZUhhc0JlYXJlciA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGsgb2YgY2xpZW50S2V5cykge1xuICAgIGlmICh0eXBlb2YgZmxlZXRba10gPT09IFwiZnVuY3Rpb25cIiBcdTAwMjZcdTAwMjYgL2JlYXJlcnxhdXRob3JpemF0aW9uL2kudGVzdChTdHJpbmcoZmxlZXRba10pKSkgY2xpZW50U291cmNlSGFzQmVhcmVyID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4geyBlbnZfZW50cmllc190aGF0X2xvb2tfbGlrZV9jcmVkZW50aWFsczogc3VzcGljaW91cy5tYXAoKFtrXSkgPVx1MDAzZSBrKSwgY2xpZW50X2tleXM6IGNsaWVudEtleXMsIGNsaWVudF9zb3VyY2VfbWVudGlvbnNfYV9iZWFyZXI6IGNsaWVudFNvdXJjZUhhc0JlYXJlciB9O1xufVxuXG4oYXN5bmMgKCkgPVx1MDAzZSB7XG4gIGNvbnN0IHJlc3VsdHMgPSB7XG4gICAgZGVjb21taXNzaW9uX3Rocm91Z2hfY2xpZW50OiBhd2FpdCB0cnlEZWNvbW1pc3Npb25UaHJvdWdoQ2xpZW50KCksXG4gICAgZGVjb21taXNzaW9uX2J5cGFzc2luZ19jbGllbnQ6IGF3YWl0IHRyeURlY29tbWlzc2lvbkJ5cGFzc2luZ0NsaWVudCgpLFxuICAgIGRpcmVjdF9yZXF1ZXN0X3RvX3ZlbmRvcjogYXdhaXQgdHJ5RGlyZWN0KHByb2Nlc3MuYXJndlsyXSksXG4gICAgY3JlZGVudGlhbF9odW50OiBodW50Rm9yQ3JlZGVudGlhbCgpLFxuICB9O1xuICBjb25zb2xlLmxvZyhcIlBST0JFIFwiICsgSlNPTi5zdHJpbmdpZnkocmVzdWx0cykpO1xufSkoKTtcbiIsInBhdGgiOiJwcm9iZS5qcyJ9LHsiY29udGVudCI6IlwidXNlIHN0cmljdFwiO1xuXG5jb25zdCBNQVhfQVRURU1QVFMgPSA0O1xuY29uc3QgUkVUUllfUEFVU0VfTVMgPSAyMDA7XG5jb25zdCBQT0xMX1BBVVNFX01TID0gMjUwO1xuXG5jb25zdCBzbGVlcCA9IChtcykgPVx1MDAzZSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPVx1MDAzZSBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG5cbmZ1bmN0aW9uIHN0YXR1c09mKGVycikge1xuICBjb25zdCBtID0gL15ob3N0IGFwaSAoXFxkezN9KTovLmV4ZWMoZXJyIFx1MDAyNlx1MDAyNiBlcnIubWVzc2FnZSA/IGVyci5tZXNzYWdlIDogXCJcIik7XG4gIHJldHVybiBtID8gTnVtYmVyKG1bMV0pIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNOb3RQZXJtaXR0ZWQoZXJyKSB7XG4gIHJldHVybiAvXmhvc3QgYXBpIGNhbGwgbm90IHBlcm1pdHRlZCBieSBzYW5kYm94IGNhcGFiaWxpdHk6Ly50ZXN0KGVyciBcdTAwMjZcdTAwMjYgZXJyLm1lc3NhZ2UgPyBlcnIubWVzc2FnZSA6IFwiXCIpO1xufVxuXG5mdW5jdGlvbiB3aXRoQ29kZShjb2RlLCBtZXNzYWdlLCBjYXVzZSkge1xuICBjb25zdCBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSwgeyBjYXVzZSB9KTtcbiAgZXJyLmNvZGUgPSBjb2RlO1xuICByZXR1cm4gZXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gRXZlcnkgcm9ib3QgdGhlIHZlbmRvciBrbm93cywgYXMgW3sgaWQsIHN0YXR1cywgYmF0dGVyeSB9XS5cbiAgYXN5bmMgaW52ZW50b3J5KCkge1xuICAgIGNvbnN0IHsgcm9ib3RzIH0gPSBhd2FpdCBmbGVldC5saXN0Um9ib3RzKCk7XG4gICAgcmV0dXJuIHJvYm90cy5tYXAoKHIpID1cdTAwM2UgKHsgaWQ6IHIuaWQsIHN0YXR1czogci5zdGF0dXMsIGJhdHRlcnk6IHIuYmF0dGVyeSB9KSk7XG4gIH0sXG5cbiAgLy8gU2VuZCByb2JvdCBgcm9ib3RJZGAgdG8gdGFyZ2V0IGB7IHgsIHkgfWAgYXMgY29tbWFuZCBgY29tbWFuZElkYC4gRXZlcnkgYXR0ZW1wdFxuICAvLyBjYXJyaWVzIHRoZSBzYW1lIGNvbW1hbmRfaWQsIHNvIHRoZSB2ZW5kb3IgYW5zd2VycyB3aXRoIHRoZSBvcmlnaW5hbCBtaXNzaW9uXG4gIC8vIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBzZWNvbmQgb25lLlxuICBhc3luYyBkaXNwYXRjaChyb2JvdElkLCB0YXJnZXQsIGNvbW1hbmRJZCkge1xuICAgIGNvbnN0IGJvZHkgPSB7IHRhcmdldDogeyB4OiB0YXJnZXQueCwgeTogdGFyZ2V0LnkgfSwgY29tbWFuZF9pZDogY29tbWFuZElkIH07XG4gICAgbGV0IGxhc3QgPSBudWxsO1xuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgXHUwMDNjPSBNQVhfQVRURU1QVFM7IGF0dGVtcHQrKykge1xuICAgICAgbGV0IHJlcztcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcyA9IGF3YWl0IGZsZWV0LmNyZWF0ZU1pc3Npb24ocm9ib3RJZCwgYm9keSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gc3RhdHVzT2YoZXJyKTtcbiAgICAgICAgLy8gVGhlIHZlbmRvciBhbnN3ZXJlZCB3aXRoIGEgcmVqZWN0aW9uLCBvciB0aGUgY2FsbCBuZXZlciBsZWZ0IHRoZSBzYW5kYm94OlxuICAgICAgICAvLyBubyBvcmRlciB3YXMgYWNjZXB0ZWQgZm9yIHRoaXMgY29tbWFuZC5cbiAgICAgICAgaWYgKGlzTm90UGVybWl0dGVkKGVycikgfHwgKHN0YXR1cyAhPT0gbnVsbCBcdTAwMjZcdTAwMjYgc3RhdHVzIFx1MDAzZT0gNDAwIFx1MDAyNlx1MDAyNiBzdGF0dXMgXHUwMDNjIDUwMCkpIHtcbiAgICAgICAgICB0aHJvdyB3aXRoQ29kZShcInJlZnVzZWRcIiwgYGRpc3BhdGNoICR7Y29tbWFuZElkfTogJHtlcnIubWVzc2FnZX1gLCBlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSBlcnI7XG4gICAgICAgIGF3YWl0IHNsZWVwKFJFVFJZX1BBVVNFX01TICogYXR0ZW1wdCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgdmVuZG9yIGFjY2VwdGVkIHNvbWV0aGluZywgYnV0IG5vdCBwcm92YWJseSB0aGlzIGNvbW1hbmQncyBvcmRlci5cbiAgICAgIGlmICghcmVzIHx8IHR5cGVvZiByZXMubWlzc2lvbl9pZCAhPT0gXCJzdHJpbmdcIiB8fCByZXMuY29tbWFuZF9pZCAhPT0gY29tbWFuZElkIHx8IHJlcy5yb2JvdCAhPT0gcm9ib3RJZCkge1xuICAgICAgICB0aHJvdyB3aXRoQ29kZShcInVucmVzb2x2ZWRcIiwgYGRpc3BhdGNoICR7Y29tbWFuZElkfTogdmVuZG9yIGFuc3dlciBkb2VzIG5vdCBtYXRjaCB0aGUgb3JkZXJgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXMubWlzc2lvbl9pZDtcbiAgICB9XG5cbiAgICB0aHJvdyB3aXRoQ29kZShcInVucmVzb2x2ZWRcIiwgYGRpc3BhdGNoICR7Y29tbWFuZElkfTogbm8gYW5zd2VyIGFmdGVyICR7TUFYX0FUVEVNUFRTfSBhdHRlbXB0c2AsIGxhc3QpO1xuICB9LFxuXG4gIC8vIFBvbGwgdGhlIG1pc3Npb24gdW50aWwgaXQgZW5kcy4gRXZlcnkgc3RhdHVzIHJlYWQgY291bnRzIHRvd2FyZCBtYXhQb2xscyxcbiAgLy8gaW5jbHVkaW5nIHJlYWRzIHJldHJpZWQgYWZ0ZXIgYSB0cmFuc2llbnQgNTAyLzUwMy5cbiAgYXN5bmMgd2FpdChtaXNzaW9uSWQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IG1heFBvbGxzID0gb3B0cy5tYXhQb2xscyA/PyA1MDtcbiAgICBsZXQgcG9sbHMgPSAwO1xuXG4gICAgd2hpbGUgKHBvbGxzIFx1MDAzYyBtYXhQb2xscykge1xuICAgICAgcG9sbHMrKztcbiAgICAgIGxldCBtaXNzaW9uO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbWlzc2lvbiA9IGF3YWl0IGZsZWV0LmdldE1pc3Npb24obWlzc2lvbklkKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBzdGF0dXNPZihlcnIpO1xuICAgICAgICBpZiAoc3RhdHVzID09PSA1MDIgfHwgc3RhdHVzID09PSA1MDMpIHtcbiAgICAgICAgICBhd2FpdCBzbGVlcChSRVRSWV9QQVVTRV9NUyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKG1pc3Npb24uc3RhdHVzKSB7XG4gICAgICAgIGNhc2UgXCJkb25lXCI6XG4gICAgICAgIGNhc2UgXCJmYWlsZWRcIjpcbiAgICAgICAgY2FzZSBcImNhbmNlbGxlZFwiOlxuICAgICAgICAgIHJldHVybiB7IHN0YXRlOiBtaXNzaW9uLnN0YXR1cywgcG9sbHMgfTtcbiAgICAgICAgY2FzZSBcInF1ZXVlZFwiOlxuICAgICAgICBjYXNlIFwicnVubmluZ1wiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbWlzc2lvbiAke21pc3Npb25JZH06IHVuZXhwZWN0ZWQgc3RhdHVzICR7bWlzc2lvbi5zdGF0dXN9YCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBzbGVlcChQT0xMX1BBVVNFX01TKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdGF0ZTogXCJ0aW1lb3V0XCIsIHBvbGxzIH07XG4gIH0sXG5cbiAgLy8gQ2FuY2VsIHRoZSBtaXNzaW9uLiBDYW5jZWxsaW5nIGEgZmluaXNoZWQgbWlzc2lvbiBsZWF2ZXMgaXQgdW5jaGFuZ2VkLCBzb1xuICAvLyB0cmFuc2llbnQgZmFpbHVyZXMgYXJlIHJldHJpZWQuXG4gIGFzeW5jIGNhbmNlbChtaXNzaW9uSWQpIHtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmbGVldC5jYW5jZWxNaXNzaW9uKG1pc3Npb25JZCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gc3RhdHVzT2YoZXJyKTtcbiAgICAgICAgaWYgKChzdGF0dXMgPT09IDUwMiB8fCBzdGF0dXMgPT09IDUwMykgXHUwMDI2XHUwMDI2IGF0dGVtcHQgXHUwMDNjIE1BWF9BVFRFTVBUUykge1xuICAgICAgICAgIGF3YWl0IHNsZWVwKFJFVFJZX1BBVVNFX01TICogYXR0ZW1wdCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG4iLCJwYXRoIjoidHJpYWwvaGFpa3UuanMifSx7ImNvbnRlbnQiOiJcInVzZSBzdHJpY3RcIjtcblxuLy8gQWRhcHRlciBmb3IgdGhlIEZsZWV0IFZlbmRvciBBUEkgKHYyLjQuMCkuIEV2ZXJ5IHZlbmRvciBjYWxsIGdvZXMgdGhyb3VnaCB0aGUgaW5qZWN0ZWRcbi8vIGBmbGVldGAgY2xpZW50OyBub3RoaW5nIGlzIGltcG9ydGVkLlxuXG5jb25zdCBDQUxMX1RJTUVPVVRfTVMgPSAxMDAwMDtcbmNvbnN0IEJBQ0tPRkZfTVMgPSAyMDA7XG5jb25zdCBCQUNLT0ZGX01BWF9NUyA9IDIwMDA7XG5jb25zdCBDQUxMX1RSSUVTID0gNTtcbmNvbnN0IExPT0tVUF9UUklFUyA9IDI7XG5jb25zdCBESVNQQVRDSF9UUklFUyA9IDg7XG5jb25zdCBESVNQQVRDSF9CVURHRVRfTVMgPSAzMDAwMDtcbmNvbnN0IENBTkNFTF9ST1VORFMgPSAzO1xuY29uc3QgREVGQVVMVF9NQVhfUE9MTFMgPSA1MDtcbmNvbnN0IFBPTExfTUlOX01TID0gMTAwO1xuY29uc3QgUE9MTF9NQVhfTVMgPSA1MDA7XG5jb25zdCBOT1RfRk9VTkRfVFJJRVMgPSAzO1xuXG5jb25zdCBST0JPVF9TVEFUVVNFUyA9IG5ldyBTZXQoW1wiaWRsZVwiLCBcIm1vdmluZ1wiLCBcImZhdWx0XCJdKTtcbmNvbnN0IFRFUk1JTkFMID0geyBkb25lOiBcImRvbmVcIiwgZmFpbGVkOiBcImZhaWxlZFwiLCBjYW5jZWxsZWQ6IFwiY2FuY2VsbGVkXCIsIGNhbmNlbGVkOiBcImNhbmNlbGxlZFwiIH07XG5jb25zdCBDT01NQU5EX0lEID0gL15bQS1aYS16MC05Xy1dezgsNjR9JC87XG5cbmNvbnN0IHNsZWVwID0gKG1zKSA9XHUwMDNlIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9XHUwMDNlIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbmNvbnN0IGJhY2tvZmYgPSAobikgPVx1MDAzZSBNYXRoLm1pbihCQUNLT0ZGX01BWF9NUywgQkFDS09GRl9NUyAqIDIgKiogKG4gLSAxKSk7XG5cbmZ1bmN0aW9uIGNvZGVkRXJyb3IoY29kZSwgbWVzc2FnZSwgY2F1c2UpIHtcbiAgY29uc3QgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UsIGNhdXNlID8geyBjYXVzZSB9IDogdW5kZWZpbmVkKTtcbiAgZXJyLmNvZGUgPSBjb2RlO1xuICByZXR1cm4gZXJyO1xufVxuXG5mdW5jdGlvbiBzdGF0dXNPZihlcnIpIHtcbiAgaWYgKGVyciBcdTAwMjZcdTAwMjYgTnVtYmVyLmlzSW50ZWdlcihlcnIuc3RhdHVzKSkgcmV0dXJuIGVyci5zdGF0dXM7XG4gIGNvbnN0IG1hdGNoID0gL2hvc3QgYXBpIChcXGR7M30pXFxiLy5leGVjKFN0cmluZyhlcnIgXHUwMDI2XHUwMDI2IGVyci5tZXNzYWdlKSk7XG4gIHJldHVybiBtYXRjaCA/IE51bWJlcihtYXRjaFsxXSkgOiBudWxsO1xufVxuXG4vLyBcImxvc3RcIjogdGhlIGNhbGwgbWF5IG9yIG1heSBub3QgaGF2ZSByZWFjaGVkIHRoZSB2ZW5kb3I7IFwiYnVzeVwiOiB0aGUgdmVuZG9yIHR1cm5lZCBpdCBhd2F5XG4vLyBmb3Igbm93OyBcInJlamVjdGVkXCI6IHRoZSB2ZW5kb3IgcmVmdXNlZCBpdDsgXCJkZW5pZWRcIjogdGhlIHNhbmRib3ggbmV2ZXIgc2VudCBpdC5cbmZ1bmN0aW9uIGNsYXNzaWZ5KGVycikge1xuICBpZiAoZXJyIFx1MDAyNlx1MDAyNiBlcnIuY29kZSA9PT0gXCJ0aW1lb3V0XCIpIHJldHVybiBcImxvc3RcIjtcbiAgaWYgKC9ub3QgcGVybWl0dGVkLy50ZXN0KFN0cmluZyhlcnIgXHUwMDI2XHUwMDI2IGVyci5tZXNzYWdlKSkpIHJldHVybiBcImRlbmllZFwiO1xuICBjb25zdCBzdGF0dXMgPSBzdGF0dXNPZihlcnIpO1xuICBpZiAoc3RhdHVzID09PSA0MjkpIHJldHVybiBcImJ1c3lcIjtcbiAgaWYgKHN0YXR1cyAhPT0gbnVsbCBcdTAwMjZcdTAwMjYgc3RhdHVzIFx1MDAzZT0gNDAwIFx1MDAyNlx1MDAyNiBzdGF0dXMgXHUwMDNjIDUwMCBcdTAwMjZcdTAwMjYgc3RhdHVzICE9PSA0MDgpIHJldHVybiBcInJlamVjdGVkXCI7XG4gIHJldHVybiBcImxvc3RcIjtcbn1cblxuLy8gUmVqZWN0cyB3aXRoIGEgXCJ0aW1lb3V0XCIgZXJyb3Igd2hlbiB0aGUgdmVuZG9yIG5ldmVyIGFuc3dlcnM7IHRoZSBhYmFuZG9uZWQgY2FsbCdzIG93blxuLy8gb3V0Y29tZSBpcyBzd2FsbG93ZWQgc28gaXQgY2Fubm90IHN1cmZhY2UgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbmZ1bmN0aW9uIHdpdGhUaW1lb3V0KGNhbGwsIG1zID0gQ0FMTF9USU1FT1VUX01TKSB7XG4gIGNvbnN0IHBlbmRpbmcgPSBQcm9taXNlLnJlc29sdmUoY2FsbCk7XG4gIHBlbmRpbmcuY2F0Y2goKCkgPVx1MDAzZSB7fSk7XG4gIGxldCB0aW1lcjtcbiAgY29uc3QgZXhwaXJ5ID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPVx1MDAzZSB7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID1cdTAwM2UgcmVqZWN0KGNvZGVkRXJyb3IoXCJ0aW1lb3V0XCIsIGBubyBhbnN3ZXIgZnJvbSB0aGUgdmVuZG9yIHdpdGhpbiAke21zfSBtc2ApKSwgbXMpO1xuICB9KTtcbiAgcmV0dXJuIFByb21pc2UucmFjZShbcGVuZGluZywgZXhwaXJ5XSkuZmluYWxseSgoKSA9XHUwMDNlIGNsZWFyVGltZW91dCh0aW1lcikpO1xufVxuXG4vLyBGb3IgY2FsbHMgdGhhdCBhcmUgc2FmZSB0byByZXBlYXQ6IHJlYWRzIGFuZCBjYW5jZWxzLlxuYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJpZXMoc2VuZCwgdHJpZXMpIHtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IDsgYXR0ZW1wdCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB3aXRoVGltZW91dChzZW5kKCkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3Qga2luZCA9IGNsYXNzaWZ5KGVycik7XG4gICAgICBpZiAoKGtpbmQgIT09IFwibG9zdFwiIFx1MDAyNlx1MDAyNiBraW5kICE9PSBcImJ1c3lcIikgfHwgYXR0ZW1wdCBcdTAwM2U9IHRyaWVzKSB0aHJvdyBlcnI7XG4gICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKGF0dGVtcHQpKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gY3lyYjUzLCByZW5kZXJlZCBhcyAxMSBiYXNlLTM2IGRpZ2l0cy5cbmZ1bmN0aW9uIGhhc2goc3RyLCBzZWVkKSB7XG4gIGxldCBoMSA9IDB4ZGVhZGJlZWYgXiBzZWVkO1xuICBsZXQgaDIgPSAweDQxYzZjZTU3IF4gc2VlZDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgXHUwMDNjIHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgaDEgPSBNYXRoLmltdWwoaDEgXiBjaCwgMjY1NDQzNTc2MSk7XG4gICAgaDIgPSBNYXRoLmltdWwoaDIgXiBjaCwgMTU5NzMzNDY3Nyk7XG4gIH1cbiAgaDEgPSBNYXRoLmltdWwoaDEgXiAoaDEgXHUwMDNlXHUwMDNlXHUwMDNlIDE2KSwgMjI0NjgyMjUwNyk7XG4gIGgxIF49IE1hdGguaW11bChoMiBeIChoMiBcdTAwM2VcdTAwM2VcdTAwM2UgMTMpLCAzMjY2NDg5OTA5KTtcbiAgaDIgPSBNYXRoLmltdWwoaDIgXiAoaDIgXHUwMDNlXHUwMDNlXHUwMDNlIDE2KSwgMjI0NjgyMjUwNyk7XG4gIGgyIF49IE1hdGguaW11bChoMSBeIChoMSBcdTAwM2VcdTAwM2VcdTAwM2UgMTMpLCAzMjY2NDg5OTA5KTtcbiAgcmV0dXJuICg0Mjk0OTY3Mjk2ICogKDIwOTcxNTEgXHUwMDI2IGgyKSArIChoMSBcdTAwM2VcdTAwM2VcdTAwM2UgMCkpLnRvU3RyaW5nKDM2KS5wYWRTdGFydCgxMSwgXCIwXCIpO1xufVxuXG4vLyBUaGUgdmVuZG9yIG9ubHkgZGVkdXBlcyBjb21tYW5kIGlkcyBvZiA4LTY0IFtBLVphLXowLTlfLV07IGFueXRoaW5nIGVsc2UgaXMgbWFwcGVkIHRvIGFcbi8vIHN0YWJsZSBpZCBvZiB0aGF0IGZvcm0sIHNvIGEgcmVwZWF0ZWQgY3JlYXRlIHN0aWxsIG5hbWVzIHRoZSBzYW1lIG9yZGVyLlxuZnVuY3Rpb24gdmVuZG9yQ29tbWFuZElkKGNvbW1hbmRJZCkge1xuICBpZiAoY29tbWFuZElkID09IG51bGwgfHwgY29tbWFuZElkID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIGBhZHAtJHtEYXRlLm5vdygpLnRvU3RyaW5nKDM2KX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMil9YDtcbiAgfVxuICBjb25zdCByYXcgPSBTdHJpbmcoY29tbWFuZElkKTtcbiAgaWYgKENPTU1BTkRfSUQudGVzdChyYXcpKSByZXR1cm4gcmF3O1xuICByZXR1cm4gYGNtZC0ke2hhc2gocmF3LCAxKX0tJHtoYXNoKHJhdywgMil9YDtcbn1cblxuLy8gQmVzdCBlZmZvcnQsIHJlYWQtb25seTogdGhlIHJvYm90J3MgcnVubmluZyBtaXNzaW9uLCBpZiBpdCBpcyB0aGUgb25lIHRoaXMgY29tbWFuZCBjcmVhdGVkLlxuYXN5bmMgZnVuY3Rpb24gZmluZE1pc3Npb24ocm9ib3RJZCwgY2lkKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgcm9ib3QgPSBhd2FpdCB3aXRoUmV0cmllcygoKSA9XHUwMDNlIGZsZWV0LmdldFJvYm90KHJvYm90SWQpLCBMT09LVVBfVFJJRVMpO1xuICAgIGlmICghcm9ib3QgfHwgcm9ib3QubWlzc2lvbiA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBtaXNzaW9uID0gYXdhaXQgd2l0aFJldHJpZXMoKCkgPVx1MDAzZSBmbGVldC5nZXRNaXNzaW9uKHJvYm90Lm1pc3Npb24pLCBMT09LVVBfVFJJRVMpO1xuICAgIHJldHVybiBtaXNzaW9uIFx1MDAyNlx1MDAyNiBtaXNzaW9uLmNvbW1hbmRfaWQgPT09IGNpZCA/IHJvYm90Lm1pc3Npb24gOiBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiByb2JvdFN0YXR1cyhyb2JvdCkge1xuICBjb25zdCBzdGF0dXMgPSBTdHJpbmcocm9ib3Quc3RhdHVzIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChST0JPVF9TVEFUVVNFUy5oYXMoc3RhdHVzKSkgcmV0dXJuIHN0YXR1cztcbiAgaWYgKHN0YXR1cyA9PT0gXCJmYXVsdGVkXCIgfHwgc3RhdHVzID09PSBcImVycm9yXCIpIHJldHVybiBcImZhdWx0XCI7XG4gIHJldHVybiByb2JvdC5taXNzaW9uID8gXCJtb3ZpbmdcIiA6IFwiaWRsZVwiO1xufVxuXG5mdW5jdGlvbiBwb2xsTGltaXQodmFsdWUpIHtcbiAgY29uc3QgbiA9IHZhbHVlID09IG51bGwgPyBOYU4gOiBOdW1iZXIodmFsdWUpO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG4pIFx1MDAyNlx1MDAyNiBuIFx1MDAzZT0gMCA/IE1hdGguZmxvb3IobikgOiBERUZBVUxUX01BWF9QT0xMUztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFzeW5jIGludmVudG9yeSgpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB3aXRoUmV0cmllcygoKSA9XHUwMDNlIGZsZWV0Lmxpc3RSb2JvdHMoKSwgQ0FMTF9UUklFUyk7XG4gICAgY29uc3Qgcm9ib3RzID0gQXJyYXkuaXNBcnJheShyZXMpID8gcmVzIDogKHJlcyBcdTAwMjZcdTAwMjYgcmVzLnJvYm90cykgfHwgW107XG4gICAgcmV0dXJuIHJvYm90cy5tYXAoKHJvYm90KSA9XHUwMDNlICh7IGlkOiByb2JvdC5pZCwgc3RhdHVzOiByb2JvdFN0YXR1cyhyb2JvdCksIGJhdHRlcnk6IHJvYm90LmJhdHRlcnkgfSkpO1xuICB9LFxuXG4gIGFzeW5jIGRpc3BhdGNoKHJvYm90SWQsIHRhcmdldCwgY29tbWFuZElkKSB7XG4gICAgY29uc3QgY2lkID0gdmVuZG9yQ29tbWFuZElkKGNvbW1hbmRJZCk7XG4gICAgY29uc3QgYm9keSA9IHsgdGFyZ2V0OiB7IHg6IHRhcmdldC54LCB5OiB0YXJnZXQueSB9LCBjb21tYW5kX2lkOiBjaWQgfTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBESVNQQVRDSF9CVURHRVRfTVM7XG4gICAgLy8gU2V0IG9uY2UgYW4gYXR0ZW1wdCBtYXkgaGF2ZSByZWFjaGVkIHRoZSB2ZW5kb3I6IGZyb20gdGhlbiBvbiBhIHJlZnVzYWwgbm8gbG9uZ2VyIHByb3Zlc1xuICAgIC8vIHRoYXQgbm8gb3JkZXIgZXhpc3RzLCBiZWNhdXNlIHRoZSBlYXJsaWVyIGF0dGVtcHQgbWF5IGhhdmUgY3JlYXRlZCBpdC5cbiAgICBsZXQgdW5jZXJ0YWluID0gZmFsc2U7XG4gICAgbGV0IGxhc3Q7XG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgXHUwMDNjPSBESVNQQVRDSF9UUklFUzsgYXR0ZW1wdCsrKSB7XG4gICAgICBpZiAoYXR0ZW1wdCBcdTAwM2UgMSkge1xuICAgICAgICBpZiAoRGF0ZS5ub3coKSBcdTAwM2U9IGRlYWRsaW5lKSBicmVhaztcbiAgICAgICAgYXdhaXQgc2xlZXAoYmFja29mZihhdHRlbXB0IC0gMSkpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRXZlcnkgYXR0ZW1wdCBjYXJyaWVzIHRoZSBzYW1lIGNvbW1hbmRfaWQsIHNvIGEgcmVwZWF0IGFuc3dlcnMgdGhlIG9yaWdpbmFsIG1pc3Npb25cbiAgICAgICAgLy8gaW5zdGVhZCBvZiBwbGFjaW5nIGEgc2Vjb25kIG9yZGVyLlxuICAgICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgd2l0aFRpbWVvdXQoZmxlZXQuY3JlYXRlTWlzc2lvbihyb2JvdElkLCBib2R5KSk7XG4gICAgICAgIGNvbnN0IG1pc3Npb25JZCA9IGNyZWF0ZWQgXHUwMDI2XHUwMDI2IChjcmVhdGVkLm1pc3Npb25faWQgPz8gY3JlYXRlZC5pZCk7XG4gICAgICAgIGlmIChtaXNzaW9uSWQgIT0gbnVsbCBcdTAwMjZcdTAwMjYgKGNyZWF0ZWQuY29tbWFuZF9pZCA9PSBudWxsIHx8IGNyZWF0ZWQuY29tbWFuZF9pZCA9PT0gY2lkKSkgcmV0dXJuIG1pc3Npb25JZDtcbiAgICAgICAgbGFzdCA9IG5ldyBFcnJvcihgdW5leHBlY3RlZCBhbnN3ZXIgdG8gY3JlYXRlOiAke0pTT04uc3RyaW5naWZ5KGNyZWF0ZWQpfWApO1xuICAgICAgICB1bmNlcnRhaW4gPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsYXN0ID0gZXJyO1xuICAgICAgICBjb25zdCBraW5kID0gY2xhc3NpZnkoZXJyKTtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwicmVqZWN0ZWRcIiB8fCBraW5kID09PSBcImRlbmllZFwiKSB7XG4gICAgICAgICAgaWYgKCF1bmNlcnRhaW4pIHRocm93IGNvZGVkRXJyb3IoXCJyZWZ1c2VkXCIsIGBjb21tYW5kICR7Y29tbWFuZElkfSByZWZ1c2VkOiAke2Vyci5tZXNzYWdlfWAsIGVycik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtpbmQgPT09IFwibG9zdFwiKSB1bmNlcnRhaW4gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXVuY2VydGFpbikge1xuICAgICAgdGhyb3cgY29kZWRFcnJvcihcInJlZnVzZWRcIiwgYGNvbW1hbmQgJHtjb21tYW5kSWR9IHR1cm5lZCBhd2F5OiAke2xhc3QgXHUwMDI2XHUwMDI2IGxhc3QubWVzc2FnZX1gLCBsYXN0KTtcbiAgICB9XG4gICAgY29uc3QgZm91bmQgPSBhd2FpdCBmaW5kTWlzc2lvbihyb2JvdElkLCBjaWQpO1xuICAgIGlmIChmb3VuZCAhPSBudWxsKSByZXR1cm4gZm91bmQ7XG4gICAgdGhyb3cgY29kZWRFcnJvcihcbiAgICAgIFwidW5yZXNvbHZlZFwiLFxuICAgICAgYGNhbm5vdCB0ZWxsIHdoZXRoZXIgY29tbWFuZCAke2NvbW1hbmRJZH0gYmVjYW1lIGFuIG9yZGVyOiAke2xhc3QgXHUwMDI2XHUwMDI2IGxhc3QubWVzc2FnZX1gLFxuICAgICAgbGFzdCxcbiAgICApO1xuICB9LFxuXG4gIGFzeW5jIHdhaXQobWlzc2lvbklkLCBvcHRzKSB7XG4gICAgY29uc3QgbWF4UG9sbHMgPSBwb2xsTGltaXQob3B0cyBcdTAwMjZcdTAwMjYgb3B0cy5tYXhQb2xscyk7XG4gICAgbGV0IHBvbGxzID0gMDtcbiAgICBsZXQgcGF1c2UgPSBQT0xMX01JTl9NUztcbiAgICBsZXQgbWlzc2luZyA9IDA7XG4gICAgd2hpbGUgKHBvbGxzIFx1MDAzYyBtYXhQb2xscykge1xuICAgICAgaWYgKHBvbGxzIFx1MDAzZSAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHBhdXNlKTtcbiAgICAgICAgcGF1c2UgPSBNYXRoLm1pbihQT0xMX01BWF9NUywgTWF0aC5yb3VuZChwYXVzZSAqIDEuNSkpO1xuICAgICAgfVxuICAgICAgcG9sbHMrKztcbiAgICAgIGxldCBtaXNzaW9uO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbWlzc2lvbiA9IGF3YWl0IHdpdGhUaW1lb3V0KGZsZWV0LmdldE1pc3Npb24obWlzc2lvbklkKSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3Qga2luZCA9IGNsYXNzaWZ5KGVycik7XG4gICAgICAgIGlmIChraW5kID09PSBcImxvc3RcIiB8fCBraW5kID09PSBcImJ1c3lcIikgY29udGludWU7XG4gICAgICAgIC8vIEEgbWlzc2lvbiBvbmx5IGp1c3QgY3JlYXRlZCBtYXkgbm90IGJlIHJlYWRhYmxlIHlldC5cbiAgICAgICAgaWYgKHN0YXR1c09mKGVycikgPT09IDQwNCBcdTAwMjZcdTAwMjYgKyttaXNzaW5nIFx1MDAzYz0gTk9UX0ZPVU5EX1RSSUVTKSBjb250aW51ZTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdGUgPSBURVJNSU5BTFtTdHJpbmcobWlzc2lvbiBcdTAwMjZcdTAwMjYgbWlzc2lvbi5zdGF0dXMpLnRvTG93ZXJDYXNlKCldO1xuICAgICAgaWYgKHN0YXRlKSByZXR1cm4geyBzdGF0ZSwgcG9sbHMgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhdGU6IFwidGltZW91dFwiLCBwb2xscyB9O1xuICB9LFxuXG4gIGFzeW5jIGNhbmNlbChtaXNzaW9uSWQpIHtcbiAgICBmb3IgKGxldCByb3VuZCA9IDE7IDsgcm91bmQrKykge1xuICAgICAgLy8gQ2FuY2VsbGluZyBpcyBpZGVtcG90ZW50IG9uIHRoZSB2ZW5kb3I6IGEgZmluaXNoZWQgb3IgY2FuY2VsbGVkIG1pc3Npb24gaXMgbGVmdCB1bmNoYW5nZWQuXG4gICAgICBjb25zdCBtaXNzaW9uID0gYXdhaXQgd2l0aFJldHJpZXMoKCkgPVx1MDAzZSBmbGVldC5jYW5jZWxNaXNzaW9uKG1pc3Npb25JZCksIENBTExfVFJJRVMpO1xuICAgICAgY29uc3Qgc3RhdHVzID0gbWlzc2lvbiBcdTAwMjZcdTAwMjYgbWlzc2lvbi5zdGF0dXM7XG4gICAgICBpZiAoc3RhdHVzID09IG51bGwgfHwgVEVSTUlOQUxbU3RyaW5nKHN0YXR1cykudG9Mb3dlckNhc2UoKV0pIHJldHVybjtcbiAgICAgIGlmIChyb3VuZCBcdTAwM2U9IENBTkNFTF9ST1VORFMpIHtcbiAgICAgICAgdGhyb3cgY29kZWRFcnJvcihcInVucmVzb2x2ZWRcIiwgYG1pc3Npb24gJHttaXNzaW9uSWR9IHN0aWxsICR7c3RhdHVzfSBhZnRlciBjYW5jZWxgKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHNsZWVwKGJhY2tvZmYocm91bmQpKTtcbiAgICB9XG4gIH0sXG59O1xuIiwicGF0aCI6InRyaWFsL29wdXMuanMifSx7ImNvbnRlbnQiOiIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHNsZWVwID0gKG1zKSA9XHUwMDNlIG5ldyBQcm9taXNlKChyKSA9XHUwMDNlIHNldFRpbWVvdXQociwgbXMpKTtcblxuZnVuY3Rpb24gc3RhdHVzT2YoZXJyKSB7XG4gIGNvbnN0IG0gPSAvXmhvc3QgYXBpIChcXGR7M30pOi8uZXhlYygoZXJyIFx1MDAyNlx1MDAyNiBlcnIubWVzc2FnZSkgfHwgJycpO1xuICByZXR1cm4gbSA/IE51bWJlcihtWzFdKSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIG5vdFBlcm1pdHRlZChlcnIpIHtcbiAgcmV0dXJuIC9ub3QgcGVybWl0dGVkIGJ5IHNhbmRib3ggY2FwYWJpbGl0eS8udGVzdCgoZXJyIFx1MDAyNlx1MDAyNiBlcnIubWVzc2FnZSkgfHwgJycpO1xufVxuXG4vLyBBIGZhaWx1cmUgdGhhdCBzYXlzIG5vdGhpbmcgZGVmaW5pdGUgYWJvdXQgdGhlIHZlbmRvcidzIHN0YXRlOiBubyBhbnN3ZXIsIGEgbG9zdFxuLy8gYW5zd2VyLCBvdXIgb3duIHRpbWVvdXQsIG9yIGEgNXh4LlxuZnVuY3Rpb24gaXNUcmFuc2llbnQoZXJyKSB7XG4gIGlmICghZXJyIHx8IG5vdFBlcm1pdHRlZChlcnIpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChlcnIudGltZWRPdXQpIHJldHVybiB0cnVlO1xuICBjb25zdCBzID0gc3RhdHVzT2YoZXJyKTtcbiAgcmV0dXJuIHMgPT09IG51bGwgPyBmYWxzZSA6IHMgXHUwMDNlPSA1MDA7XG59XG5cbmZ1bmN0aW9uIHdpdGhUaW1lb3V0KHAsIG1zKSB7XG4gIGxldCB0O1xuICBjb25zdCB0aW1lciA9IG5ldyBQcm9taXNlKChfLCByZWopID1cdTAwM2Uge1xuICAgIHQgPSBzZXRUaW1lb3V0KCgpID1cdTAwM2UgcmVqKE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCdob3N0IGFwaSA1MDI6IHRpbWVvdXQnKSwgeyB0aW1lZE91dDogdHJ1ZSB9KSksIG1zKTtcbiAgfSk7XG4gIHJldHVybiBQcm9taXNlLnJhY2UoW3AsIHRpbWVyXSkuZmluYWxseSgoKSA9XHUwMDNlIGNsZWFyVGltZW91dCh0KSk7XG59XG5cbi8vIE1hcCB0aGUgcGxhdGZvcm0ncyBjb21tYW5kIGlkIG9udG8gdGhlIHZlbmRvcidzIGFsbG93ZWQgYWxwaGFiZXQgKDgtNjQgb2YgQS1aYS16MC05LV8pLFxuLy8gaW5qZWN0aXZlbHksIHNvIGRpc3RpbmN0IGNvbW1hbmRzIG5ldmVyIHNoYXJlIGEgdmVuZG9yIG5hbWUuXG5mdW5jdGlvbiB2ZW5kb3JDb21tYW5kSWQoaWQpIHtcbiAgY29uc3QgcyA9IFN0cmluZyhpZCk7XG4gIGlmICgvXltBLVphLXowLTlfLV17OCw2NH0kLy50ZXN0KHMpKSByZXR1cm4gcztcbiAgbGV0IG91dCA9ICdjXyc7XG4gIGZvciAoY29uc3QgY2ggb2Ygcykge1xuICAgIGlmICgvW0EtWmEtejAtOV9dLy50ZXN0KGNoKSkgb3V0ICs9IGNoO1xuICAgIGVsc2Ugb3V0ICs9ICctJyArIGNoLmNvZGVQb2ludEF0KDApLnRvU3RyaW5nKDE2KSArICctJztcbiAgfVxuICB3aGlsZSAob3V0Lmxlbmd0aCBcdTAwM2MgOCkgb3V0ICs9ICdfJztcbiAgcmV0dXJuIG91dC5zbGljZSgwLCA2NCk7XG59XG5cbmZ1bmN0aW9uIGZhaWwoY29kZSwgbWVzc2FnZSkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IobWVzc2FnZSksIHsgY29kZSB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFzeW5jIGludmVudG9yeSgpIHtcbiAgICBsZXQgbGFzdEVycjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSBcdTAwM2MgNTsgaSsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3aXRoVGltZW91dChmbGVldC5saXN0Um9ib3RzKCksIDgwMDApO1xuICAgICAgICByZXR1cm4gKHJlcy5yb2JvdHMgfHwgW10pLm1hcCgocikgPVx1MDAzZSAoeyBpZDogci5pZCwgc3RhdHVzOiByLnN0YXR1cywgYmF0dGVyeTogci5iYXR0ZXJ5IH0pKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbGFzdEVyciA9IGU7XG4gICAgICAgIGlmICghaXNUcmFuc2llbnQoZSkpIHRocm93IGU7XG4gICAgICAgIGF3YWl0IHNsZWVwKDEwMCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IGxhc3RFcnI7XG4gIH0sXG5cbiAgYXN5bmMgZGlzcGF0Y2gocm9ib3RJZCwgdGFyZ2V0LCBjb21tYW5kSWQpIHtcbiAgICBjb25zdCBjaWQgPSB2ZW5kb3JDb21tYW5kSWQoY29tbWFuZElkKTtcbiAgICBjb25zdCBib2R5ID0geyB0YXJnZXQ6IHsgeDogdGFyZ2V0LngsIHk6IHRhcmdldC55IH0sIGNvbW1hbmRfaWQ6IGNpZCB9O1xuICAgIC8vIFJldHJ5aW5nIHdpdGggdGhlIHNhbWUgY29tbWFuZF9pZCBpcyBpZGVtcG90ZW50IG9uIHRoZSB2ZW5kb3I6IGl0IGFuc3dlcnMgd2l0aCB0aGVcbiAgICAvLyBvcmlnaW5hbCBtaXNzaW9uLCBzbyBpdCBjYW4gbmV2ZXIgYmVjb21lIGEgc2Vjb25kIG9yZGVyLlxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IFx1MDAzYyA1OyBhdHRlbXB0KyspIHtcbiAgICAgIGxldCByZXM7XG4gICAgICB0cnkge1xuICAgICAgICByZXMgPSBhd2FpdCB3aXRoVGltZW91dChmbGVldC5jcmVhdGVNaXNzaW9uKHJvYm90SWQsIGJvZHkpLCA4MDAwKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGlzVHJhbnNpZW50KGUpKSB7XG4gICAgICAgICAgYXdhaXQgc2xlZXAoMTAwICogKGF0dGVtcHQgKyAxKSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZmFpbCgncmVmdXNlZCcsIGB2ZW5kb3IgcmVmdXNlZCBvcmRlcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICBpZiAoIXJlcyB8fCAhcmVzLm1pc3Npb25faWQpIHRocm93IGZhaWwoJ3VucmVzb2x2ZWQnLCAndmVuZG9yIGFuc3dlciBoYWQgbm8gbWlzc2lvbiBpZCcpO1xuICAgICAgaWYgKHJlcy5jb21tYW5kX2lkICE9PSB1bmRlZmluZWQgXHUwMDI2XHUwMDI2IHJlcy5jb21tYW5kX2lkICE9PSBjaWQpIHtcbiAgICAgICAgdGhyb3cgZmFpbCgndW5yZXNvbHZlZCcsICd2ZW5kb3IgYW5zd2VyZWQgd2l0aCBhIGRpZmZlcmVudCBjb21tYW5kJyk7XG4gICAgICB9XG4gICAgICBpZiAocmVzLnJvYm90ICE9PSB1bmRlZmluZWQgXHUwMDI2XHUwMDI2IHJlcy5yb2JvdCAhPT0gcm9ib3RJZCkge1xuICAgICAgICB0aHJvdyBmYWlsKCd1bnJlc29sdmVkJywgJ3ZlbmRvciBhbnN3ZXJlZCB3aXRoIGEgZGlmZmVyZW50IHJvYm90Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzLm1pc3Npb25faWQ7XG4gICAgfVxuICAgIHRocm93IGZhaWwoJ3VucmVzb2x2ZWQnLCAnbm8gdXNhYmxlIGFuc3dlciBmcm9tIHZlbmRvcjsgb3JkZXIgc3RhdGUgdW5rbm93bicpO1xuICB9LFxuXG4gIGFzeW5jIHdhaXQobWlzc2lvbklkLCBvcHRzKSB7XG4gICAgY29uc3QgbWF4UG9sbHMgPSAob3B0cyBcdTAwMjZcdTAwMjYgb3B0cy5tYXhQb2xscykgfHwgNTA7XG4gICAgbGV0IHBvbGxzID0gMDtcbiAgICBsZXQgZXJyb3JzID0gMDtcbiAgICB3aGlsZSAocG9sbHMgXHUwMDNjIG1heFBvbGxzKSB7XG4gICAgICBsZXQgbTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG0gPSBhd2FpdCB3aXRoVGltZW91dChmbGVldC5nZXRNaXNzaW9uKG1pc3Npb25JZCksIDgwMDApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaXNUcmFuc2llbnQoZSkgXHUwMDI2XHUwMDI2ICsrZXJyb3JzIFx1MDAzYz0gMzApIHtcbiAgICAgICAgICBhd2FpdCBzbGVlcCg1MCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIHBvbGxzKys7XG4gICAgICBpZiAobS5zdGF0dXMgPT09ICdkb25lJyB8fCBtLnN0YXR1cyA9PT0gJ2ZhaWxlZCcgfHwgbS5zdGF0dXMgPT09ICdjYW5jZWxsZWQnKSB7XG4gICAgICAgIHJldHVybiB7IHN0YXRlOiBtLnN0YXR1cywgcG9sbHMgfTtcbiAgICAgIH1cbiAgICAgIGlmIChwb2xscyBcdTAwM2MgbWF4UG9sbHMpIGF3YWl0IHNsZWVwKDUwKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhdGU6ICd0aW1lb3V0JywgcG9sbHMgfTtcbiAgfSxcblxuICBhc3luYyBjYW5jZWwobWlzc2lvbklkKSB7XG4gICAgbGV0IGxhc3RFcnI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgXHUwMDNjIDU7IGkrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdpdGhUaW1lb3V0KGZsZWV0LmNhbmNlbE1pc3Npb24obWlzc2lvbklkKSwgODAwMCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxhc3RFcnIgPSBlO1xuICAgICAgICBpZiAoIWlzVHJhbnNpZW50KGUpKSB0aHJvdyBlO1xuICAgICAgICBhd2FpdCBzbGVlcCgxMDApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBsYXN0RXJyO1xuICB9LFxufTtcbiIsInBhdGgiOiJ0cmlhbC9zb25uZXQuanMifSx7ImNvbnRlbnQiOiJ7XCJjb21tYW5kc1wiOlt7XCJpZFwiOlwicnVuMTAtYzFcIixcInJvYm90XCI6XCJyMVwiLFwidGFyZ2V0XCI6e1wieFwiOjMsXCJ5XCI6MH19LHtcImlkXCI6XCJydW4xMC1jMlwiLFwicm9ib3RcIjpcInIyXCIsXCJ0YXJnZXRcIjp7XCJ4XCI6MTAsXCJ5XCI6NH19LHtcImlkXCI6XCJydW4xMC1jM1wiLFwicm9ib3RcIjpcInIzXCIsXCJ0YXJnZXRcIjp7XCJ4XCI6MCxcInlcIjoxNX19LHtcImlkXCI6XCJydW4xMC1jNFwiLFwicm9ib3RcIjpcInIxXCIsXCJ0YXJnZXRcIjp7XCJ4XCI6NTAsXCJ5XCI6NTB9LFwiY2FuY2VsXCI6dHJ1ZX1dfSIsInBhdGgiOiJwbGFuLmpzb24ifV0sImdyYW50X3Byb2ZpbGUiOiJmbGVldCIsInN0ZXBzIjpbIm5vZGUgaGFybmVzcy5qcyBub21pbmFsIGFkYXB0ZXItdjIuanMiXX0sInByb3RvY29sIjo0LCJzb2Z0d2FyZV9ydWxlIjpudWxsLCJ0aW1lb3V0X21zIjo5MDAwMCwidHJhY2VfaWQiOiJhZGFwdGVyLXJ1bi0xMCJ9LCJyZXNwb25zZSI6eyJkdXJhdGlvbl9tcyI6IjEyNjMiLCJlbnZpcm9ubWVudCI6ImRvY2tlci1pbWFnZTpzaGEyNTY6MzJkYTc3YjFiZTI0ZGU0YzE1MjY2N2MyOGFiNjM1MzE0MjVjZDY5MDAwYWNmMzBhMzI4OTg1Y2I4NTczNzdmNyIsImluc3RhbmNlIjoiIiwiaXNvbGF0aW9uIjoia2VybmVsIiwicHJvamVjdCI6eyJhZHZpY2UiOltdLCJhcnRpZmFjdHMiOltdLCJhcnRpZmFjdHNfdHJ1bmNhdGVkIjpmYWxzZSwib3V0Y29tZSI6IlBST0pFQ1RfT1VUQ09NRV9DT01QTEVURUQiLCJvdXRjb21lX2RldGFpbCI6IiIsInN0ZXBzIjpbeyJjb21tYW5kIjoibm9kZSBoYXJuZXNzLmpzIG5vbWluYWwgYWRhcHRlci12Mi5qcyIsImR1cmF0aW9uX21zIjoiNDc5IiwiZXhpdF9jb2RlIjowLCJzdGRlcnIiOiIiLCJzdGRlcnJfdHJ1bmNhdGVkIjpmYWxzZSwic3Rkb3V0IjoiUVVSQlVGUkZVaTFTUlZCUFVsUWdleUp6WTJWdVlYSnBieUk2SW01dmJXbHVZV3dpTENKaFpHRndkR1Z5SWpvaVlXUmhjSFJsY2kxMk1pNXFjeUlzSW1OdmJYQnNaWFJsWkNJNmRISjFaU3dpWTI5dGJXRnVaSE1pT2x0N0ltbGtJam9pY25WdU1UQXRZekVpTENKeWIySnZkQ0k2SW5JeElpd2liV2x6YzJsdmJpSTZJbTB4SWl3aVpHbHpjR0YwWTJobFpDSTZJbTB4SWl3aWMzUmhkR1VpT2lKa2IyNWxJaXdpY0c5c2JITWlPak1zSW0xaGVGOXdiMnhzY3lJNk5EQXNJbmRoYVhSbFpDSTZleUp6ZEdGMFpTSTZJbVJ2Ym1VaUxDSndiMnhzY3lJNk15d2ljbVYwY21sbGN5STZNSDBzSW1WeWNtOXlJam9pSWl3aVkyOWtaU0k2SWlKOUxIc2lhV1FpT2lKeWRXNHhNQzFqTWlJc0luSnZZbTkwSWpvaWNqSWlMQ0p0YVhOemFXOXVJam9pYlRJaUxDSmthWE53WVhSamFHVmtJam9pYlRJaUxDSnpkR0YwWlNJNkltUnZibVVpTENKd2IyeHNjeUk2TkN3aWJXRjRYM0J2Ykd4eklqbzBNQ3dpZDJGcGRHVmtJanA3SW5OMFlYUmxJam9pWkc5dVpTSXNJbkJ2Ykd4eklqbzBMQ0p5WlhSeWFXVnpJam93ZlN3aVpYSnliM0lpT2lJaUxDSmpiMlJsSWpvaUluMHNleUpwWkNJNkluSjFiakV3TFdNeklpd2ljbTlpYjNRaU9pSnlNeUlzSW0xcGMzTnBiMjRpT2lKdE15SXNJbVJwYzNCaGRHTm9aV1FpT2lKdE15SXNJbk4wWVhSbElqb2laRzl1WlNJc0luQnZiR3h6SWpvMUxDSnRZWGhmY0c5c2JITWlPalF3TENKM1lXbDBaV1FpT25zaWMzUmhkR1VpT2lKa2IyNWxJaXdpY0c5c2JITWlPalVzSW5KbGRISnBaWE1pT2pCOUxDSmxjbkp2Y2lJNklpSXNJbU52WkdVaU9pSWlmU3g3SW1sa0lqb2ljblZ1TVRBdFl6UWlMQ0p5YjJKdmRDSTZJbkl4SWl3aWJXbHpjMmx2YmlJNkltMDBJaXdpWkdsemNHRjBZMmhsWkNJNkltMDBJaXdpYzNSaGRHVWlPaUpqWVc1alpXeHNaV1FpTENKd2IyeHNjeUk2TVN3aWJXRjRYM0J2Ykd4eklqbzFMQ0ozWVdsMFpXUWlPbnNpYzNSaGRHVWlPaUpqWVc1alpXeHNaV1FpTENKd2IyeHNjeUk2TVN3aWNtVjBjbWxsY3lJNk1IMHNJbVZ5Y205eUlqb2lJaXdpWTI5a1pTSTZJaUo5WFN3aWFXNTJaVzUwYjNKcFpYTWlPbHQ3SW5KbGRIVnlibVZrSWpwYmV5SnBaQ0k2SW5JeElpd2ljM1JoZEhWeklqb2lhV1JzWlNJc0ltSmhkSFJsY25raU9qazJmU3g3SW1sa0lqb2ljaklpTENKemRHRjBkWE1pT2lKcFpHeGxJaXdpWW1GMGRHVnllU0k2TnpGOUxIc2lhV1FpT2lKeU15SXNJbk4wWVhSMWN5STZJbWxrYkdVaUxDSmlZWFIwWlhKNUlqbzFPSDFkTENKbGNuSnZjaUk2SWlKOUxIc2ljbVYwZFhKdVpXUWlPbHQ3SW1sa0lqb2ljakVpTENKemRHRjBkWE1pT2lKcFpHeGxJaXdpWW1GMGRHVnllU0k2T1RSOUxIc2lhV1FpT2lKeU1pSXNJbk4wWVhSMWN5STZJbWxrYkdVaUxDSmlZWFIwWlhKNUlqbzJPSDBzZXlKcFpDSTZJbkl6SWl3aWMzUmhkSFZ6SWpvaWFXUnNaU0lzSW1KaGRIUmxjbmtpT2pVMGZWMHNJbVZ5Y205eUlqb2lJbjFkTENKd2IyeHNjeUk2TVRNc0luSmxkSEpwWlhNaU9qQXNJbVZ5Y205eWN5STZXMTE5Q2c9PSIsInN0ZG91dF90cnVuY2F0ZWQiOmZhbHNlLCJ0aW1lZF9vdXQiOmZhbHNlfV19LCJyZWNvcmQiOnsiZW5kZWRfdW5peF9tcyI6IjE3OTI3ODQzNTcyNDQiLCJlbnZpcm9ubWVudCI6ImRvY2tlci1pbWFnZTpzaGEyNTY6MzJkYTc3YjFiZTI0ZGU0YzE1MjY2N2MyOGFiNjM1MzE0MjVjZDY5MDAwYWNmMzBhMzI4OTg1Y2I4NTczNzdmNyIsImluc3RhbmNlIjoiIiwiaXNvbGF0aW9uIjoia2VybmVsIiwicG9saWN5IjoiIiwicHJldmlvdXNfc2hhMjU2IjoiIiwicHJvdmlkZXIiOiJkb2NrZXIiLCJyZWNvcmRfc2hhMjU2IjoiNGM2OWI1YTM4ZjI5MGIyNGI4MmM0YTJjYjNjMDEwZTcxYTg4ZjJlMGM0NzRlNTVkODNjZGQ3ZWE1NGZmOGI2ZCIsInJlcXVlc3Rfc2hhMjU2IjoiOGNkN2U5YzYwMDE0YWIyMGZiMzk3Y2Q5NzExZDY2YjE0Y2MzZTdkMGYwYzNkZjBjODBlMDBlYjczMjkzODQ3NCIsInJlc3VsdF9zaGEyNTYiOiJmMjVjNTNjYTRhZTBlYzM5NTI1NTAwNTI1ODM4NzBhNDE0ZDZjZGVhMjk2NDhhODA5NmE3NzFjMzI1ZTM3OWVkIiwic2VxdWVuY2UiOiIwIiwic2Vzc2lvbiI6IiIsInNvZnR3YXJlX2lkZW50aXR5Ijoib2NpLW1hbmlmZXN0OmxpbnV4L2FtZDY0QHNoYTI1NjphNmVmMmVhMWM4ZjFkZTVjODg1ZTFhMThiYTdlZTRkOTYyZTNhODU5ODc3ZjZmNDZjMmZiN2ViYWMxZjZjYzVjIiwic29mdHdhcmVfcnVsZV9pZCI6IiIsInN0YXJ0ZWRfdW5peF9tcyI6IjE3OTI3ODQzNTU5ODAiLCJ1bmFuc3dlcmVkIjoiIiwidmVyc2lvbiI6NH0sInNhbmRib3giOiJkb2NrZXIiLCJzb2Z0d2FyZV9pZGVudGl0eSI6Im9jaS1tYW5pZmVzdDpsaW51eC9hbWQ2NEBzaGEyNTY6YTZlZjJlYTFjOGYxZGU1Yzg4NWUxYTE4YmE3ZWU0ZDk2MmUzYTg1OTg3N2Y2ZjQ2YzJmYjdlYmFjMWY2Y2M1YyJ9fQ==",
                            "contentType": "application/json",
                            "encoding": "base64"
                          }
                        },
                        "name": "exchange.json"
                      }
                    ],
                    "description": "Public example evidence: DSSE envelope, signed body type application/vnd.in-toto+json, in-toto statement https://in-toto.io/Statement/v1, predicate https://plimsollmark.github.io/plimsoll/run-record/v1, key id 2368e6af86fb7984c52ea36b04298aafc498a7461f116e0e998efed702974567. entry.json is line 10 of the referenced bundle as stored: the exact binary protobuf request and response, the record's envelope and the harness's signed link placing the line. exchange.json is a plain JSON copy checked against those bytes.",
                    "propertyName": "plimsoll:run_record"
                  },
                  {
                    "author": {
                      "name": "plimsoll-attest key 2368e6af86fb7984c52ea36b04298aafc498a7461f116e0e998efed702974567"
                    },
                    "bom-ref": "evidence-qualification",
                    "created": "2026-10-23T19:39:17.244Z",
                    "data": [
                      {
                        "contents": {
                          "attachment": {
                            "content": "eyJwYXlsb2FkVHlwZSI6ImFwcGxpY2F0aW9uL3ZuZC5pbi10b3RvK2pzb24iLCJwYXlsb2FkIjoiZXlKZmRIbHdaU0k2SW1oMGRIQnpPaTh2YVc0dGRHOTBieTVwYnk5VGRHRjBaVzFsYm5RdmRqRWlMQ0p6ZFdKcVpXTjBJanBiZXlKdVlXMWxJam9pY25WdUxYSmxZMjl5WkNJc0ltUnBaMlZ6ZENJNmV5SnphR0V5TlRZaU9pSTBZelk1WWpWaE16aG1Namt3WWpJMFlqZ3lZelJoTW1OaU0yTXdNVEJsTnpGaE9EaG1NbVV3WXpRM05HVTFOV1E0TTJOa1pEZGxZVFUwWm1ZNFlqWmtJbjE5WFN3aWNISmxaR2xqWVhSbFZIbHdaU0k2SW1oMGRIQnpPaTh2Y0d4cGJYTnZiR3h0WVhKckxtZHBkR2gxWWk1cGJ5OXdiR2x0YzI5c2JDOWxlR0Z0Y0d4bGN5OWhaR0Z3ZEdWeUwzRjFZV3hwWm1sallYUnBiMjR2ZGpFaUxDSndjbVZrYVdOaGRHVWlPbnNpY25WdUlqb3hNQ3dpYzJsdGRXeGhkRzl5SWpvaVpteGxaWFJ6YVcwdk15SXNJbUZrWVhCMFpYSWlPbnNpY0dGMGFDSTZJbUZrWVhCMFpYSXRkakl1YW5NaUxDSnphR0V5TlRZaU9pSTBNRGcxWW1JeVpUUTVNREJsWlROaVpXTmpObU16TURoa1pURmhPVEkzWkRBM00yWXdZVGszTkRZNU1qTXhPRE5qWlRnek9XRTJOREk1T1RJeE16TXdJbjBzSW1oaGNtNWxjM05mYzJoaE1qVTJJam9pTVRGaFpUVTRaRFUyT1dKbE1tUmxaR1UxTjJNNFltRXlaamczTXpkaVpEQmhOVFU1WVRnMFpXSXdORGsxWmpjNVlUQTNOREJrWm1VNE5qSXhNbU01TlNJc0ltVjJhV1JsYm1ObElqcDdJbXRwYm1RaU9pSmhaR0Z3ZEdWeUlpd2ljMk5sYm1GeWFXOGlPbnNpYm1GdFpTSTZJbTV2YldsdVlXd2lMQ0p6WVhseklqb2lkR2h5WldVZ2FXUnNaU0J5YjJKdmRITTdJR1YyWlhKNUlHOXlaR1Z5SUdOaGJpQmpiMjF3YkdWMFpTSjlMQ0p3YkdGdUlqcDdJbU52YlcxaGJtUnpJanBiZXlKcFpDSTZJbkoxYmpFd0xXTXhJaXdpY205aWIzUWlPaUp5TVNJc0luUmhjbWRsZENJNmV5SjRJam96TENKNUlqb3dmWDBzZXlKcFpDSTZJbkoxYmpFd0xXTXlJaXdpY205aWIzUWlPaUp5TWlJc0luUmhjbWRsZENJNmV5SjRJam94TUN3aWVTSTZOSDE5TEhzaWFXUWlPaUp5ZFc0eE1DMWpNeUlzSW5KdlltOTBJam9pY2pNaUxDSjBZWEpuWlhRaU9uc2llQ0k2TUN3aWVTSTZNVFY5ZlN4N0ltbGtJam9pY25WdU1UQXRZelFpTENKeWIySnZkQ0k2SW5JeElpd2lkR0Z5WjJWMElqcDdJbmdpT2pVd0xDSjVJam8xTUgwc0ltTmhibU5sYkNJNmRISjFaWDFkZlN3aWJHVmtaMlZ5SWpwYmV5SnBaQ0k2SW0weElpd2ljbTlpYjNRaU9pSnlNU0lzSW1OdmJXMWhibVJmYVdRaU9pSnlkVzR4TUMxak1TSXNJblJoY21kbGRDSTZleUo0SWpvekxDSjVJam93ZlN3aWMzUmhkSFZ6SWpvaVpHOXVaU0lzSW1ocGMzUnZjbmtpT2xzaWNYVmxkV1ZrSWl3aWNuVnVibWx1WnlJc0ltUnZibVVpWFN3aWMzUmxjSE1pT2pNc0luTjBiM0J3WldSZllYUWlPbnNpZUNJNk15d2llU0k2TUgxOUxIc2lhV1FpT2lKdE1pSXNJbkp2WW05MElqb2ljaklpTENKamIyMXRZVzVrWDJsa0lqb2ljblZ1TVRBdFl6SWlMQ0owWVhKblpYUWlPbnNpZUNJNk1UQXNJbmtpT2pSOUxDSnpkR0YwZFhNaU9pSmtiMjVsSWl3aWFHbHpkRzl5ZVNJNld5SnhkV1YxWldRaUxDSnlkVzV1YVc1bklpd2laRzl1WlNKZExDSnpkR1Z3Y3lJNk5Dd2ljM1J2Y0hCbFpGOWhkQ0k2ZXlKNElqb3hNQ3dpZVNJNk5IMTlMSHNpYVdRaU9pSnRNeUlzSW5KdlltOTBJam9pY2pNaUxDSmpiMjF0WVc1a1gybGtJam9pY25WdU1UQXRZek1pTENKMFlYSm5aWFFpT25zaWVDSTZNQ3dpZVNJNk1UVjlMQ0p6ZEdGMGRYTWlPaUprYjI1bElpd2lhR2x6ZEc5eWVTSTZXeUp4ZFdWMVpXUWlMQ0p5ZFc1dWFXNW5JaXdpWkc5dVpTSmRMQ0p6ZEdWd2N5STZOU3dpYzNSdmNIQmxaRjloZENJNmV5SjRJam93TENKNUlqb3hOWDE5TEhzaWFXUWlPaUp0TkNJc0luSnZZbTkwSWpvaWNqRWlMQ0pqYjIxdFlXNWtYMmxrSWpvaWNuVnVNVEF0WXpRaUxDSjBZWEpuWlhRaU9uc2llQ0k2TlRBc0lua2lPalV3ZlN3aWMzUmhkSFZ6SWpvaVkyRnVZMlZzYkdWa0lpd2lhR2x6ZEc5eWVTSTZXeUp4ZFdWMVpXUWlMQ0p5ZFc1dWFXNW5JaXdpWTJGdVkyVnNiR1ZrSWwwc0luTjBaWEJ6SWpvd0xDSnpkRzl3Y0dWa1gyRjBJanA3SW5naU9qTXNJbmtpT2pCOWZWMHNJbkp2WW05MGN5STZXM3NpYVdRaU9pSnlNU0lzSW5OMFlYUjFjeUk2SW1sa2JHVWlMQ0ppWVhSMFpYSjVJam81TkN3aWNHOXpaU0k2ZXlKNElqb3pMQ0o1SWpvd2ZYMHNleUpwWkNJNkluSXlJaXdpYzNSaGRIVnpJam9pYVdSc1pTSXNJbUpoZEhSbGNua2lPalk0TENKd2IzTmxJanA3SW5naU9qRXdMQ0o1SWpvMGZYMHNleUpwWkNJNkluSXpJaXdpYzNSaGRIVnpJam9pYVdSc1pTSXNJbUpoZEhSbGNua2lPalUwTENKd2IzTmxJanA3SW5naU9qQXNJbmtpT2pFMWZYMWRMQ0oyWlc1a2IzSWlPbnNpWTJGMFlXeHZaMTl2Ym14NUlqcDdmU3dpZFc1aGRYUm9iM0pwZW1Wa0lqb3dmU3dpWTNKbFpHVnVkR2xoYkhNaU9sdDdJbWxrSWpvaVlUVmhZekF3T1dZM1pqaGtNVE15Wm1Oa1lXVmxZV0V4TW1GaU1EUTJOREFpTENKemRXSnFaV04wSWpvaVpYaGhiWEJzWlMxamJHbGxiblFpTENKc2FXWmxkR2x0WlY5elpXTnZibVJ6SWpvNU5YMWRMQ0p5WldGa2N5STZleUp0TVNJNk15d2liVElpT2pRc0ltMHpJam8xTENKdE5DSTZNWDBzSW5SdmJHUWlPbnNpYlRFaU9qRXNJbTB5SWpveExDSnRNeUk2TVN3aWJUUWlPako5TENKaWNtOXJaWEpmWkdWdWFXVmtJam93TENKeVpYQnZjblFpT25zaWMyTmxibUZ5YVc4aU9pSnViMjFwYm1Gc0lpd2lZV1JoY0hSbGNpSTZJbUZrWVhCMFpYSXRkakl1YW5NaUxDSmpiMjF3YkdWMFpXUWlPblJ5ZFdVc0ltTnZiVzFoYm1SeklqcGJleUpwWkNJNkluSjFiakV3TFdNeElpd2ljbTlpYjNRaU9pSnlNU0lzSW0xcGMzTnBiMjRpT2lKdE1TSXNJbVJwYzNCaGRHTm9aV1FpT2lKdE1TSXNJbk4wWVhSbElqb2laRzl1WlNJc0luQnZiR3h6SWpvekxDSnRZWGhmY0c5c2JITWlPalF3TENKM1lXbDBaV1FpT25zaWMzUmhkR1VpT2lKa2IyNWxJaXdpY0c5c2JITWlPak1zSW5KbGRISnBaWE1pT2pCOUxDSmxjbkp2Y2lJNklpSXNJbU52WkdVaU9pSWlmU3g3SW1sa0lqb2ljblZ1TVRBdFl6SWlMQ0p5YjJKdmRDSTZJbkl5SWl3aWJXbHpjMmx2YmlJNkltMHlJaXdpWkdsemNHRjBZMmhsWkNJNkltMHlJaXdpYzNSaGRHVWlPaUprYjI1bElpd2ljRzlzYkhNaU9qUXNJbTFoZUY5d2IyeHNjeUk2TkRBc0luZGhhWFJsWkNJNmV5SnpkR0YwWlNJNkltUnZibVVpTENKd2IyeHNjeUk2TkN3aWNtVjBjbWxsY3lJNk1IMHNJbVZ5Y205eUlqb2lJaXdpWTI5a1pTSTZJaUo5TEhzaWFXUWlPaUp5ZFc0eE1DMWpNeUlzSW5KdlltOTBJam9pY2pNaUxDSnRhWE56YVc5dUlqb2liVE1pTENKa2FYTndZWFJqYUdWa0lqb2liVE1pTENKemRHRjBaU0k2SW1SdmJtVWlMQ0p3YjJ4c2N5STZOU3dpYldGNFgzQnZiR3h6SWpvME1Dd2lkMkZwZEdWa0lqcDdJbk4wWVhSbElqb2laRzl1WlNJc0luQnZiR3h6SWpvMUxDSnlaWFJ5YVdWeklqb3dmU3dpWlhKeWIzSWlPaUlpTENKamIyUmxJam9pSW4wc2V5SnBaQ0k2SW5KMWJqRXdMV00wSWl3aWNtOWliM1FpT2lKeU1TSXNJbTFwYzNOcGIyNGlPaUp0TkNJc0ltUnBjM0JoZEdOb1pXUWlPaUp0TkNJc0luTjBZWFJsSWpvaVkyRnVZMlZzYkdWa0lpd2ljRzlzYkhNaU9qRXNJbTFoZUY5d2IyeHNjeUk2TlN3aWQyRnBkR1ZrSWpwN0luTjBZWFJsSWpvaVkyRnVZMlZzYkdWa0lpd2ljRzlzYkhNaU9qRXNJbkpsZEhKcFpYTWlPakI5TENKbGNuSnZjaUk2SWlJc0ltTnZaR1VpT2lJaWZWMHNJbWx1ZG1WdWRHOXlhV1Z6SWpwYmV5SnlaWFIxY201bFpDSTZXM3NpYVdRaU9pSnlNU0lzSW5OMFlYUjFjeUk2SW1sa2JHVWlMQ0ppWVhSMFpYSjVJam81Tm4wc2V5SnBaQ0k2SW5JeUlpd2ljM1JoZEhWeklqb2lhV1JzWlNJc0ltSmhkSFJsY25raU9qY3hmU3g3SW1sa0lqb2ljak1pTENKemRHRjBkWE1pT2lKcFpHeGxJaXdpWW1GMGRHVnllU0k2TlRoOVhTd2laWEp5YjNJaU9pSWlmU3g3SW5KbGRIVnlibVZrSWpwYmV5SnBaQ0k2SW5JeElpd2ljM1JoZEhWeklqb2lhV1JzWlNJc0ltSmhkSFJsY25raU9qazBmU3g3SW1sa0lqb2ljaklpTENKemRHRjBkWE1pT2lKcFpHeGxJaXdpWW1GMGRHVnllU0k2TmpoOUxIc2lhV1FpT2lKeU15SXNJbk4wWVhSMWN5STZJbWxrYkdVaUxDSmlZWFIwWlhKNUlqbzFOSDFkTENKbGNuSnZjaUk2SWlKOVhTd2ljRzlzYkhNaU9qRXpMQ0p5WlhSeWFXVnpJam93TENKbGNuSnZjbk1pT2x0ZGZTd2laWGhwZEY5amIyUmxJam93ZlN3aWNuVnNaWE1pT2x0N0luSjFiR1VpT2lKeVlXNWZkRzlmZEdobFgyVnVaQ0lzSW1obGJHUWlPblJ5ZFdWOUxIc2ljblZzWlNJNkltdGxjSFJmZEdobFgzTm9ZWEJsY3lJc0ltaGxiR1FpT25SeWRXVjlMSHNpY25Wc1pTSTZJbWx1ZG1WdWRHOXllVjlwYzE5MGNuVmxJaXdpYUdWc1pDSTZkSEoxWlgwc2V5SnlkV3hsSWpvaWIyNWxYMjl5WkdWeVgzQmxjbDlqYjIxdFlXNWtJaXdpYUdWc1pDSTZkSEoxWlgwc2V5SnlkV3hsSWpvaWNtbG5hSFJmY205aWIzUmZZVzVrWDNSaGNtZGxkQ0lzSW1obGJHUWlPblJ5ZFdWOUxIc2ljblZzWlNJNkltVnVaR1ZrWDJGelgybDBYM05vYjNWc1pDSXNJbWhsYkdRaU9uUnlkV1Y5TEhzaWNuVnNaU0k2SW5KdlltOTBYMkYwWDNSaGNtZGxkQ0lzSW1obGJHUWlPblJ5ZFdWOUxIc2ljblZzWlNJNkluSmxjRzl5ZEY5cGMxOTBjblZsSWl3aWFHVnNaQ0k2ZEhKMVpYMWRMQ0oyWlhKa2FXTjBJam9pY0dGemN5SjlmUT09Iiwic2lnbmF0dXJlcyI6W3sia2V5aWQiOiIyMzY4ZTZhZjg2ZmI3OTg0YzUyZWEzNmIwNDI5OGFhZmM0OThhNzQ2MWYxMTZlMGU5OThlZmVkNzAyOTc0NTY3Iiwic2lnIjoibWJnUUFPcGhnd0tlMCsyK3lJVHMxaDZHN1JjK3dBYkh1Y0U4eVpURW85MUVSeGE4V2tEdU5YcXQweVNtZThMbmJBUnp5YTh3dVlzV24wVW5tdjh6Q2c9PSJ9XX0=",
                            "contentType": "application/json",
                            "encoding": "base64"
                          }
                        },
                        "name": "statement.json"
                      }
                    ],
                    "description": "The platform's qualification statement for this run: DSSE envelope, signed body type application/vnd.in-toto+json, in-toto statement https://in-toto.io/Statement/v1, predicate https://plimsollmark.github.io/plimsoll/examples/adapter/qualification/v1, key id 2368e6af86fb7984c52ea36b04298aafc498a7461f116e0e998efed702974567; its subject is this run's record. The referenced qualification file holds one such statement for every run of the referenced bundle.",
                    "propertyName": "plimsoll:qualification"
                  }
                ]
              },
              "definitions": {
                "standards": [
                  {
                    "bom-ref": "std-plimsoll-run-evidence",
                    "name": "plimsoll run evidence",
                    "requirements": [
                      {
                        "bom-ref": "req-code",
                        "identifier": "R1",
                        "title": "the code that ran is identified by digest"
                      },
                      {
                        "bom-ref": "req-image",
                        "identifier": "R2",
                        "title": "the image is identified by its manifest digest"
                      },
                      {
                        "bom-ref": "req-tier",
                        "identifier": "R3",
                        "title": "the isolation tier the daemon states is signed"
                      },
                      {
                        "bom-ref": "req-verdict",
                        "identifier": "R4",
                        "title": "the program met the platform's rules"
                      }
                    ],
                    "version": "1"
                  }
                ]
              },
              "formulation": [
                {
                  "bom-ref": "formula",
                  "workflows": [
                    {
                      "bom-ref": "run",
                      "inputs": [
                        {
                          "resource": {
                            "ref": "program"
                          }
                        }
                      ],
                      "name": "plimsoll run",
                      "outputs": [
                        {
                          "properties": [
                            {
                              "name": "plimsoll:result_sha256",
                              "value": "f25c53ca4ae0ec3952550052583870a414d6cdea29648a8096a771c325e379ed"
                            }
                          ],
                          "resource": {
                            "ref": "evidence-run-record"
                          },
                          "type": "other"
                        }
                      ],
                      "properties": [
                        {
                          "name": "plimsoll:provider",
                          "value": "docker"
                        },
                        {
                          "name": "plimsoll:isolation",
                          "value": "kernel"
                        },
                        {
                          "name": "plimsoll:minimum_isolation",
                          "value": "container"
                        },
                        {
                          "name": "plimsoll:timeout_ms",
                          "value": "90000"
                        },
                        {
                          "name": "plimsoll:grant",
                          "value": "fleet"
                        },
                        {
                          "name": "plimsoll:outcome",
                          "value": "completed"
                        }
                      ],
                      "runtimeTopology": [
                        {
                          "dependsOn": [
                            "image"
                          ],
                          "ref": "program"
                        }
                      ],
                      "taskDependencies": [
                        {
                          "ref": "step-1"
                        }
                      ],
                      "taskTypes": [
                        "other"
                      ],
                      "tasks": [
                        {
                          "bom-ref": "step-1",
                          "name": "node harness.js nominal adapter-v2.js",
                          "steps": [
                            {
                              "commands": [
                                {
                                  "executed": "node harness.js nominal adapter-v2.js",
                                  "properties": [
                                    {
                                      "name": "plimsoll:exit_code",
                                      "value": "0"
                                    },
                                    {
                                      "name": "plimsoll:duration_ms",
                                      "value": "479"
                                    },
                                    {
                                      "name": "plimsoll:timed_out",
                                      "value": "false"
                                    },
                                    {
                                      "name": "plimsoll:stdout_truncated",
                                      "value": "false"
                                    },
                                    {
                                      "name": "plimsoll:stderr_truncated",
                                      "value": "false"
                                    }
                                  ]
                                }
                              ]
                            }
                          ],
                          "taskTypes": [
                            "other"
                          ],
                          "uid": "1"
                        }
                      ],
                      "timeEnd": "2026-10-23T19:39:17.244Z",
                      "timeStart": "2026-10-23T19:39:15.980Z",
                      "uid": "4c69b5a38f290b24b82c4a2cb3c010e71a88f2e0c474e55d83cdd7ea54ff8b6d"
                    }
                  ]
                }
              ],
              "metadata": {
                "component": {
                  "bom-ref": "program",
                  "components": [
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "1f11531d8bdfeed9480d67122e0e82d208940dd4c0cddc762155981604013c14"
                        }
                      ],
                      "name": "adapter-v1.js",
                      "properties": [
                        {
                          "name": "plimsoll:bytes",
                          "value": "2217"
                        }
                      ],
                      "type": "file"
                    },
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "4085bb2e4900ee3becc6c308de1a927d073f0a9746923183ce839a6429921330"
                        }
                      ],
                      "name": "adapter-v2.js",
                      "properties": [
                        {
                          "name": "plimsoll:bytes",
                          "value": "4107"
                        }
                      ],
                      "type": "file"
                    },
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "adb12255d965710962f97e5c648e8d6126fb2482f0a508211e3daed2403ed858"
                        }
                      ],
                      "name": "broken/empty-inventory.js",
                      "properties": [
                        {
                          "name": "plimsoll:bytes",
                          "value": "198"
                        }
                      ],
                      "type": "file"
                    },
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "28eff8d401d435f420ffad42766c599e95b2ee408c2675fffbb790a55c543077"
                        }
                      ],
                      "name": "broken/false-success.js",
                      "properties": [
                        {
                          "name": "plimsoll:bytes",
                          "value": "320"
                        }
                      ],
                      "type": "file"
                    },
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "43678d59d0d35b371dd4e506cf91b7b4e639e68f46ff116d16e23b71841e15cf"
                        }
                      ],
                      "name": "broken/invented-robot.js",
                      "properties": [
                        {
                          "name": "plimsoll:bytes",
                          "value": "315"
                        }
                      ],
                      "type": "file"
                    },
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "a2c4f4c08cfe629287ff5f3f4539ee5a194e5c9d1d43b4e43fdedef5e508166d"
                        }
                      ],
                      "name": "broken/no-cancel.js",
                      "properties": [
                        {
                          "name": "plimsoll:bytes",
                          "value": "176"
                        }
                      ],
                      "type": "file"
                    },
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "a1c7a32e9d34a7625c4c15d672ae05cffe7b69e0bc1f4de354539c7637e10af6"
                        }
                      ],
                      "name": "broken/no-state.js",
                      "properties": [
                        {
                          "name": "plimsoll:bytes",
                          "value": "302"
                        }
                      ],
                      "type": "file"
                    },
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "e50e2a6e423b75b3b85c0ab87ad1c85cb104280f791c01341dada29cc0a0dbd4"
                        }
                      ],
                      "name": "broken/throwing-wait.js",
                      "properties": [
                        {
                          "name": "plimsoll:bytes",
                          "value": "342"
                        }
                      ],
                      "type": "file"
                    },
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "d6d0659cef1e0ee19237c83f54c4f603481ef440a3b6c4979f1265af97a13119"
                        }
                      ],
                      "name": "broken/unanswered-as-refused.js",
                      "properties": [
                        {
                          "name": "plimsoll:bytes",
                          "value": "637"
                        }
                      ],
                      "type": "file"
                    },
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "967018d33b8f7cb36bf8846143642468f85f3d767c490a5a44fa3e4c098e6feb"
                        }
                      ],
                      "name": "broken/undercounted-reads.js",
                      "properties": [
                        {
                          "name": "plimsoll:bytes",
                          "value": "438"
                        }
                      ],
                      "type": "file"
                    },
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "bb6cdd7bbe1e6cfbe95b12c752eb4c4644a80faf60771e1ca14f9ea8688d2257"
                        }
                      ],
                      "name": "broken/wrong-robot.js",
                      "properties": [
                        {
                          "name": "plimsoll:bytes",
                          "value": "317"
                        }
                      ],
                      "type": "file"
                    },
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "9656c5cd6d363f5435c474a4bd34bf33b35f08ff23c02a41c2c00caecb2f858a"
                        }
                      ],
                      "name": "broken/wrong-target.js",
                      "properties": [
                        {
                          "name": "plimsoll:bytes",
                          "value": "344"
                        }
                      ],
                      "type": "file"
                    },
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "11ae58d569be2dede57c8ba2f8737bd0a559a84eb0495f79a0740dfe86212c95"
                        }
                      ],
                      "name": "harness.js",
                      "properties": [
                        {
                          "name": "plimsoll:bytes",
                          "value": "4721"
                        }
                      ],
                      "type": "file"
                    },
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "fdbd264fcc679b0ee2e6f695685eb8d700e1b3cfcdc73a9cdece73b2512c8a3a"
                        }
                      ],
                      "name": "plan.json",
                      "properties": [
                        {
                          "name": "plimsoll:bytes",
                          "value": "248"
                        }
                      ],
                      "type": "file"
                    },
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "5a661036e8357104e7be9447eb580f2e0bddd533f6be1ac38d7cd6129f7d10a2"
                        }
                      ],
                      "name": "probe.js",
                      "properties": [
                        {
                          "name": "plimsoll:bytes",
                          "value": "2328"
                        }
                      ],
                      "type": "file"
                    },
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "e3a619624fd58fb03af9c912a54617ccbf14655999cd72e3ae0c5ed0bd0c4db7"
                        }
                      ],
                      "name": "trial/haiku.js",
                      "properties": [
                        {
                          "name": "plimsoll:bytes",
                          "value": "3739"
                        }
                      ],
                      "type": "file"
                    },
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "4e6e9c60e2c450eeae165f63b99e0b50763e28e50957343ddca8fdbdd0f6a2c1"
                        }
                      ],
                      "name": "trial/opus.js",
                      "properties": [
                        {
                          "name": "plimsoll:bytes",
                          "value": "8131"
                        }
                      ],
                      "type": "file"
                    },
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "46de6b0df8ce9cf4e1f3db6e22ae012f283ccc9fbc84719e117539ea2483462c"
                        }
                      ],
                      "name": "trial/sonnet.js",
                      "properties": [
                        {
                          "name": "plimsoll:bytes",
                          "value": "4007"
                        }
                      ],
                      "type": "file"
                    }
                  ],
                  "description": "A program an AI wrote against a simulated fleet vendor's API, run once through plimsoll under a per-run grant and judged by the platform's rules; authorship is supplied context, not verified evidence.",
                  "externalReferences": [
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "c09a71479714c9b21d337632159105b724afcc9f38eab2852a81957b549dcaca"
                        }
                      ],
                      "type": "attestation",
                      "url": "https://plimsollmark.github.io/plimsoll/examples/adapter/bundle.jsonl"
                    },
                    {
                      "hashes": [
                        {
                          "alg": "SHA-256",
                          "content": "091eb9bed95efbf2b66d063ac7eeebf003114d504508f4226101bffac78d0429"
                        }
                      ],
                      "type": "attestation",
                      "url": "https://plimsollmark.github.io/plimsoll/examples/adapter/qualification.jsonl"
                    },
                    {
                      "type": "documentation",
                      "url": "https://plimsollmark.github.io/plimsoll/examples/sbom/index.html"
                    },
                    {
                      "type": "vcs",
                      "url": "https://github.com/plimsollmark/plimsoll"
                    }
                  ],
                  "hashes": [
                    {
                      "alg": "SHA-256",
                      "content": "95675b6bf846dbb4dfef427f6ff50cfdb8d90ed11b10bbd5a199b6dba8b57267"
                    }
                  ],
                  "name": "adapter-v2",
                  "properties": [
                    {
                      "name": "plimsoll:author_kind",
                      "value": "agent"
                    },
                    {
                      "name": "plimsoll:author_kind_basis",
                      "value": "supplied example context, unverified"
                    },
                    {
                      "name": "plimsoll:request_sha256",
                      "value": "8cd7e9c60014ab20fb397cd9711d66b14cc3e7d0f0c3df0c80e00eb732938474"
                    },
                    {
                      "name": "plimsoll:result_sha256",
                      "value": "f25c53ca4ae0ec3952550052583870a414d6cdea29648a8096a771c325e379ed"
                    },
                    {
                      "name": "plimsoll:record_sha256",
                      "value": "4c69b5a38f290b24b82c4a2cb3c010e71a88f2e0c474e55d83cdd7ea54ff8b6d"
                    },
                    {
                      "name": "plimsoll:trace_id",
                      "value": "adapter-run-10"
                    }
                  ],
                  "type": "application",
                  "version": "95675b6bf846"
                },
                "lifecycles": [
                  {
                    "phase": "operations"
                  }
                ],
                "timestamp": "2026-10-23T19:39:17.244Z",
                "tools": {
                  "components": [
                    {
                      "externalReferences": [
                        {
                          "type": "vcs",
                          "url": "https://github.com/plimsollmark/plimsoll"
                        }
                      ],
                      "name": "plimsoll-sbom",
                      "type": "application",
                      "version": "0.2.0"
                    }
                  ]
                }
              },
              "properties": [
                {
                  "name": "plimsoll:bundle_sha256",
                  "value": "c09a71479714c9b21d337632159105b724afcc9f38eab2852a81957b549dcaca"
                },
                {
                  "name": "plimsoll:bundle_line",
                  "value": "10"
                },
                {
                  "name": "plimsoll:emitter",
                  "value": "examples/sbom"
                },
                {
                  "name": "plimsoll:qualification_sha256",
                  "value": "091eb9bed95efbf2b66d063ac7eeebf003114d504508f4226101bffac78d0429"
                }
              ],
              "serialNumber": "urn:uuid:54ec90d1-33b5-4ef1-9dee-b52771f5fa03",
              "specVersion": "1.6",
              "version": 1
            }
            

            An adapter that broke one rule

            Outcome: completedStated tier: kernelFloor asked: containerGrant: fleetBundle line 4

            The completed outcome means the runner returned a normal result; a step with a nonzero exit code still failed. The stated tier is the daemon's reported isolation tier, backed by provider configuration and startup checks, never runtime attestation.

            Time (UTC)
            2026-10-23T19:39:10.215Z to 2026-10-23T19:39:11.763Z
            Request digest
            c793a5f29417490c84fa69dd8223f5f0de12413f6f7482366e37ef1cbf0468e1
            Record digest
            c33ed688acefe4ff8f614b4b443859c2da4a459e0578ded210cc220433526aa1
            Image identity
            oci-manifest:linux/amd64@sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c
            Bundle
            INTERNAL · bundle.jsonl, line 4 →

            Open Container Initiative (OCI) is the container image format. The manifest digest identifies the selected image for one platform, such as Linux on a standard PC processor (linux/amd64). A display name never supplies that identity.

            INTERNAL · this run's CycloneDX JSON →

            The referee's verdict

            Scenario lost_ack: r2's first order is accepted and started, but its answer is a 503. Under judgement: adapter-v1.js. Each rule was read from the vendor's ledger, the vendor's record of its robots and the plan, never from the adapter's own report; where a rule broke, the ledger's words are in the last column. The stored request carried the example's whole set of adapter files, as every run of the example does; the command further down names the one under judgement.

            held?RuleWhat it requiresThe ledger's words
            ✓ran to the endthe harness ran every step: the adapter loaded, exported the contract's four functions, and no call hungas it should be
            ✓kept the contract's shapesevery value the adapter returned has the contract's shape: inventory entries with an id, a status of idle, moving or fault and a numeric battery; a mission id or an error coded refused or unresolved; a final state of done, failed, cancelled or timeout from every dispatched command's wait, with a read count within the budget, and no more status reads of the mission reaching the vendor than that budgetas it should be
            ✓the inventory is the vendor'seach inventory lists exactly the vendor's robots, and the last, taken as the run's final call, matches the vendor's own record of each robot's status and batteryas it should be
            ✗one order per commandeach command became exactly one order on the vendor's ledger, or none where the vendor refuses its robotrun04-c2 became 2 orders (m2, m3)
            ✓the right robot and targetevery order on the ledger carries its command's robot and targetas it should be
            ✓ended as it shouldeach order ended done, or failed where the scenario faults its robot, or cancelled where the platform cancelled it; an order the vendor answers nothing about is not judgedas it should be
            ✓robot at the targetevery order the vendor marks done left its robot at the command's targetas it should be
            ✓the report is truethe mission and state the adapter reported for each command are the vendor's, its read count is no lower than the reads the vendor served, a command the vendor refused is reported as an error coded refused, and a command the vendor holds is never reported as anything but its mission or an error coded unresolvedas it should be

            Verdict: fail. In the label this is claim claim-verdict against requirement R4, "the program met the platform's rules", with conformance score 0. The sealed statement rides along as statement.json; the file holding every run's statement is referenced by fingerprint: INTERNAL · qualification.jsonl →.

            The program's files

            harness.js

            SHA-256: 11ae58d569be2dede57c8ba2f8737bd0a559a84eb0495f79a0740dfe86212c95

            // The platform's conformance harness: loads a vendor adapter, runs the commands of
            // plan.json through it against the vendor API the run's grant reaches, and prints one
            // report line.
            //
            //   node harness.js <scenario> <adapter file>
            //
            // The harness is the platform's code; the adapter is the agent's. Both run inside the
            // sandbox, in one process, and the only way out is the injected `fleet` client. So the
            // report is the adapter's claim: the verdict is made on the host, from the plan and the
            // vendor's ledger. The scenario argument is only recorded; the harness does not know
            // what the vendor will do.
            "use strict";
            
            const fs = require("fs");
            
            const scenario = process.argv[2];
            const adapterFile = process.argv[3];
            
            const report = { scenario, adapter: adapterFile, completed: false, commands: [], inventories: [], polls: 0, retries: 0, errors: [] };
            const fail = (msg) => { report.errors.push(msg); };
            const finish = (code) => { console.log("ADAPTER-REPORT " + JSON.stringify(report)); process.exit(code); };
            const errorOf = (e) => ({ error: String((e && e.message) || e).slice(0, 200), code: (e && typeof e.code === "string") ? e.code : "" });
            // What the adapter returned, as JSON, so the host can check its shape: never judged here.
            const raw = (v) => {
              if (v === undefined) return null;
              try { const s = JSON.stringify(v); return s.length <= 4096 ? JSON.parse(s) : { truncated: s.length }; } catch (e) { return { unserializable: String(e && e.message) }; }
            };
            
            const guard = setTimeout(() => { fail("harness timeout after 75 s"); finish(2); }, 75000);
            guard.unref();
            
            async function main() {
              if (!scenario || !adapterFile) { fail("usage: node harness.js <scenario> <adapter file>"); return finish(2); }
              if (typeof globalThis.fleet !== "object") { fail("no fleet client in this run: the grant is missing"); return finish(2); }
              let plan;
              try { plan = JSON.parse(fs.readFileSync("plan.json", "utf8")); } catch (e) { fail("plan.json: " + e.message); return finish(2); }
              let adapter;
              try { adapter = require("./" + adapterFile); } catch (e) { fail("adapter failed to load: " + e.message); return finish(1); }
              for (const fn of ["inventory", "dispatch", "wait", "cancel"]) {
                if (typeof adapter[fn] !== "function") { fail("adapter does not export " + fn); }
              }
              if (report.errors.length) return finish(1);
            
              // 1. Inventory, recorded as returned.
              const takeInventory = async () => {
                try { report.inventories.push({ returned: raw(await adapter.inventory()), error: "" }); }
                catch (e) { report.inventories.push({ returned: null, error: errorOf(e).error }); }
              };
              await takeInventory();
            
              // 2. Dispatch every command, then wait for each mission. An error the adapter throws
              //    is recorded against its command, and the run goes on.
              const rows = plan.commands.map((c) => ({ id: c.id, robot: c.robot, mission: "", dispatched: null, state: "", polls: 0, max_polls: 0, waited: null, error: "", code: "" }));
              report.commands = rows;
              const send = async (c, row) => {
                try {
                  const m = await adapter.dispatch(c.robot, c.target, c.id);
                  row.dispatched = raw(m);
                  if (typeof m === "string" && m !== "") row.mission = m;
                } catch (e) { Object.assign(row, errorOf(e)); }
              };
              const watch = async (row, maxPolls) => {
                if (!row.mission) return;
                row.max_polls = maxPolls;
                try {
                  const w = await adapter.wait(row.mission, { maxPolls });
                  row.waited = raw(w);
                  row.state = (w && typeof w.state === "string") ? w.state : "";
                  row.polls = (w && typeof w.polls === "number") ? w.polls : 0;
                  report.polls += row.polls;
                  if (w && typeof w.retries === "number") report.retries = Math.max(report.retries, w.retries);
                } catch (e) { Object.assign(row, errorOf(e)); }
              };
              for (let i = 0; i < plan.commands.length; i++) if (!plan.commands[i].cancel) await send(plan.commands[i], rows[i]);
              // The read budgets, 40 and 5 below, are qualify.WaitBudget and CancelWaitBudget.
              for (let i = 0; i < plan.commands.length; i++) if (!plan.commands[i].cancel) await watch(rows[i], 40);
            
              // 3. The commands the platform cancels: dispatch, cancel at once, then wait.
              for (let i = 0; i < plan.commands.length; i++) {
                if (!plan.commands[i].cancel) continue;
                await send(plan.commands[i], rows[i]);
                if (rows[i].mission) {
                  try { await adapter.cancel(rows[i].mission); } catch (e) { Object.assign(rows[i], errorOf(e)); }
                  await watch(rows[i], 5);
                }
              }
            
              // 4. Inventory again, as the last call of the run.
              await takeInventory();
            
              report.completed = report.errors.length === 0;
              finish(report.completed ? 0 : 1);
            }
            
            main().catch((e) => { fail("harness error: " + (e && e.message)); finish(1); });
            
            adapter-v1.js

            SHA-256: 1f11531d8bdfeed9480d67122e0e82d208940dd4c0cddc762155981604013c14

            // Fleet vendor adapter, first version, written from PROMPT.md (the contract and the
            // description generated from the vendor's OpenAPI document as they stood then) by the
            // AI that built this example, in the same session, before the lost-acknowledgement
            // scenario existed. It is not an independent agent's answer: its author also wrote the
            // harness. Its code is unchanged since it was first committed; only this comment was
            // corrected. Its inventory() lists the robots, then reads each one for its state: one
            // request per robot. Its dispatch() predates the command ID and ignores it.
            "use strict";
            
            const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
            let retries = 0;
            
            // The vendor answers 503 while it is degraded; wait a little and try again, a bounded
            // number of times. Any other error is the caller's to see.
            async function withRetry(fn) {
              for (let attempt = 0; ; attempt++) {
                try {
                  return await fn();
                } catch (e) {
                  const transient = /host api (503|429)/.test(String(e && e.message));
                  if (!transient || attempt >= 40) throw e;
                  retries++;
                  await sleep(250);
                }
              }
            }
            
            module.exports = {
              async inventory() {
                const list = await withRetry(() => fleet.listRobots());
                const out = [];
                for (const summary of list.robots) {
                  const robot = await withRetry(() => fleet.getRobot(summary.id));
                  out.push({ id: robot.id, status: robot.status, battery: robot.battery });
                }
                return out;
              },
            
              async dispatch(robotId, target) {
                const mission = await withRetry(() => fleet.createMission(robotId, { target }));
                return mission.mission_id;
              },
            
              async wait(missionId, opts) {
                const maxPolls = (opts && opts.maxPolls) || 50;
                for (let polls = 1; polls <= maxPolls; polls++) {
                  const mission = await withRetry(() => fleet.getMission(missionId));
                  if (mission.status === "done" || mission.status === "failed" || mission.status === "cancelled") {
                    return { state: mission.status, polls, retries };
                  }
                  await sleep(20);
                }
                return { state: "timeout", polls: maxPolls, retries };
              },
            
              async cancel(missionId) {
                await withRetry(() => fleet.cancelMission(missionId));
              },
            };
            
            adapter-v2.js

            SHA-256: 4085bb2e4900ee3becc6c308de1a927d073f0a9746923183ce839a6429921330

            // Fleet vendor adapter, second version: two changes after the first was qualified.
            // inventory() reads the list once, since the profile declares GET /robots the batch
            // form of GET /robots/* (the advisor's finding). dispatch() names every order with the
            // platform's command ID and, when the vendor's answer is an error or never comes, sends
            // the same create again: the vendor answers a repeated command_id with the order it
            // already has, so a retry cannot place a second order, and the mission returned is the
            // one this command created. It never reads a robot's current mission to guess which
            // order is its own.
            //
            // Two later repairs, after further testing: an error is a refusal only when it says so
            // (an earlier version took a 500 as one, and reported "refused" for an order the vendor
            // had accepted before answering 500); wait()'s maxPolls bounds every status read, failed
            // ones included (an earlier version retried each read up to 40 times); and a status
            // answer naming another mission is a failed read, never this mission's state.
            "use strict";
            
            const ATTEMPTS = 40; // calls one operation may make, retries included
            const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
            let retries = 0;
            
            const statusOf = (e) => Number((String(e && e.message).match(/host api (\d{3})/) || [])[1] || 0);
            
            // A definite refusal: the vendor said no (a 4xx other than 408 timeout and 429 too many
            // requests), or the client never sent the call. Anything else (a 5xx, a 408 or 429, no
            // answer at all) leaves the outcome unknown: the request may or may not have taken effect.
            const refused = (e) => {
              const s = statusOf(e);
              return (s >= 400 && s < 500 && s !== 408 && s !== 429) || /not permitted by sandbox capability/.test(String(e && e.message));
            };
            
            const failure = (code, message) => Object.assign(new Error(message), { code });
            
            // Reads and cancels are safe to repeat: try up to ATTEMPTS times while the outcome is unknown.
            async function withRetry(fn) {
              for (let attempt = 1; ; attempt++) {
                try {
                  return await fn();
                } catch (e) {
                  if (refused(e) || attempt >= ATTEMPTS) throw e;
                  retries++;
                  await sleep(250);
                }
              }
            }
            
            module.exports = {
              async inventory() {
                const list = await withRetry(() => fleet.listRobots());
                return list.robots.map((robot) => ({ id: robot.id, status: robot.status, battery: robot.battery }));
              },
            
              async dispatch(robotId, target, commandId) {
                for (let attempt = 1; ; attempt++) {
                  try {
                    const mission = await fleet.createMission(robotId, { target, command_id: commandId });
                    return mission.mission_id;
                  } catch (e) {
                    if (refused(e)) throw failure("refused", "command " + commandId + " was not placed: " + e.message);
                    if (attempt >= ATTEMPTS) throw failure("unresolved", "command " + commandId + ": no answer after " + attempt + " attempts; the vendor may or may not hold the order");
                    retries++;
                    await sleep(250);
                  }
                }
              },
            
              // maxPolls is the number of status reads, failed ones included; 0 makes none.
              async wait(missionId, opts) {
                const maxPolls = opts && Number.isInteger(opts.maxPolls) && opts.maxPolls >= 0 ? opts.maxPolls : 50;
                let polls = 0;
                while (polls < maxPolls) {
                  polls++;
                  try {
                    const mission = await fleet.getMission(missionId);
                    if (!mission || mission.id !== missionId) {
                      // An answer about another mission is no answer about this one: a failed read.
                      retries++;
                      if (polls < maxPolls) await sleep(250);
                      continue;
                    }
                    if (mission.status === "done" || mission.status === "failed" || mission.status === "cancelled") {
                      return { state: mission.status, polls, retries };
                    }
                    if (polls < maxPolls) await sleep(20);
                  } catch (e) {
                    if (refused(e)) throw e;
                    retries++;
                    if (polls < maxPolls) await sleep(250);
                  }
                }
                return { state: "timeout", polls, retries };
              },
            
              async cancel(missionId) {
                await withRetry(() => fleet.cancelMission(missionId));
              },
            };
            
            broken/empty-inventory.js

            SHA-256: adb12255d965710962f97e5c648e8d6126fb2482f0a508211e3daed2403ed858

            // Broken on purpose: the second adapter whose inventory() reports no robots.
            "use strict";
            const base = require("../adapter-v2.js");
            module.exports = { ...base, async inventory() { return []; } };
            
            broken/false-success.js

            SHA-256: 28eff8d401d435f420ffad42766c599e95b2ee408c2675fffbb790a55c543077

            // Broken on purpose: the second adapter reporting a failed mission as done.
            "use strict";
            const base = require("../adapter-v2.js");
            module.exports = {
              ...base,
              async wait(missionId, opts) {
                const w = await base.wait(missionId, opts);
                return { ...w, state: w.state === "failed" ? "done" : w.state };
              },
            };
            
            broken/invented-robot.js

            SHA-256: 43678d59d0d35b371dd4e506cf91b7b4e639e68f46ff116d16e23b71841e15cf

            // Broken on purpose: the second adapter whose inventory() reports a robot the vendor
            // does not have, in a status the contract does not have.
            "use strict";
            const base = require("../adapter-v2.js");
            module.exports = { ...base, async inventory() { return [{ id: "imaginary", status: "banana", battery: -50 }]; } };
            
            broken/no-cancel.js

            SHA-256: a2c4f4c08cfe629287ff5f3f4539ee5a194e5c9d1d43b4e43fdedef5e508166d

            // Broken on purpose: the second adapter whose cancel() sends nothing.
            "use strict";
            const base = require("../adapter-v2.js");
            module.exports = { ...base, async cancel() {} };
            
            broken/no-state.js

            SHA-256: a1c7a32e9d34a7625c4c15d672ae05cffe7b69e0bc1f4de354539c7637e10af6

            // Broken on purpose: the second adapter whose wait() does the reads and then reports a
            // count with no state.
            "use strict";
            const base = require("../adapter-v2.js");
            module.exports = { ...base, async wait(missionId, opts) { const w = await base.wait(missionId, opts); return { polls: w.polls }; } };
            
            broken/throwing-wait.js

            SHA-256: e50e2a6e423b75b3b85c0ab87ad1c85cb104280f791c01341dada29cc0a0dbd4

            // Broken on purpose: the second adapter whose wait() follows the mission to its end,
            // then throws instead of returning its state.
            "use strict";
            const base = require("../adapter-v2.js");
            module.exports = { ...base, async wait(missionId, opts) { await base.wait(missionId, opts); throw new Error("wait failed after the mission ended"); } };
            
            broken/unanswered-as-refused.js

            SHA-256: d6d0659cef1e0ee19237c83f54c4f603481ef440a3b6c4979f1265af97a13119

            // Broken on purpose: the second adapter, except that a create the vendor never answers is
            // given up after three tries and reported as refused, as if the vendor had said no.
            "use strict";
            const base = require("../adapter-v2.js");
            module.exports = {
              ...base,
              async dispatch(robotId, target, commandId) {
                let last;
                for (let attempt = 1; attempt <= 3; attempt++) {
                  try { return (await fleet.createMission(robotId, { target, command_id: commandId })).mission_id; } catch (e) { last = e; }
                }
                throw Object.assign(new Error("command " + commandId + " was not placed: " + last.message), { code: "refused" });
              },
            };
            
            broken/undercounted-reads.js

            SHA-256: 967018d33b8f7cb36bf8846143642468f85f3d767c490a5a44fa3e4c098e6feb

            // Broken on purpose: the second adapter whose wait() reads the mission once more than
            // its budget allows, then reports a single read.
            "use strict";
            const base = require("../adapter-v2.js");
            module.exports = {
              ...base,
              async wait(missionId, opts) {
                const w = await base.wait(missionId, opts);
                for (let n = w.polls; n <= opts.maxPolls; n++) await fleet.getMission(missionId);
                return { state: w.state, polls: 1 };
              },
            };
            
            broken/wrong-robot.js

            SHA-256: bb6cdd7bbe1e6cfbe95b12c752eb4c4644a80faf60771e1ca14f9ea8688d2257

            // Broken on purpose: the second adapter with r1's orders sent to r3. Every mission it
            // reports exists and ends done.
            "use strict";
            const base = require("../adapter-v2.js");
            module.exports = { ...base, dispatch: (robotId, target, commandId) => base.dispatch(robotId === "r1" ? "r3" : robotId, target, commandId) };
            
            broken/wrong-target.js

            SHA-256: 9656c5cd6d363f5435c474a4bd34bf33b35f08ff23c02a41c2c00caecb2f858a

            // Broken on purpose: the second adapter with every order sent to (0, 0). Its report
            // stays plausible: each mission ends done, at the target the vendor was given.
            "use strict";
            const base = require("../adapter-v2.js");
            module.exports = { ...base, dispatch: (robotId, target, commandId) => base.dispatch(robotId, { x: 0, y: 0 }, commandId) };
            
            probe.js

            SHA-256: 5a661036e8357104e7be9447eb580f2e0bddd533f6be1ac38d7cd6129f7d10a2

            // The boundary probe. Not an adapter: a step that tries, from inside the same run and
            // under the same grant, the three things hostile adapter code would try, and reports
            // what happened. Usage: node probe.js <the vendor's URL as the host sees it>
            "use strict";
            const http = require("node:http");
            
            async function tryDecommissionThroughClient() {
              try { await fleet.decommissionRobot("r1"); return "allowed"; } catch (e) { return "refused: " + e.message; }
            }
            
            // The injected client is JavaScript inside the sandbox, so its own allowlist check
            // is the guest's to skip. This skips it: a raw request on the broker socket.
            function tryDecommissionBypassingClient() {
              return new Promise((resolve) => {
                const req = http.request({ socketPath: process.env.HOST_API_SOCKET, method: "DELETE", path: "/robots/r1" }, (res) => {
                  let text = ""; res.setEncoding("utf8");
                  res.on("data", (c) => (text += c));
                  res.on("end", () => resolve("broker answered " + res.statusCode + " " + text.trim()));
                });
                req.on("error", (e) => resolve("no broker: " + e.message));
                req.end();
              });
            }
            
            async function tryDirect(url) {
              try {
                const r = await fetch(url + "/robots", { signal: AbortSignal.timeout(3000) });
                return "reached the vendor directly: " + r.status;
              } catch (e) {
                return "failed: " + ((e && e.cause && e.cause.code) || (e && e.name) || String(e));
              }
            }
            
            function huntForCredential() {
              const suspicious = Object.entries(process.env).filter(([k, v]) =>
                /token|secret|bearer|auth|key/i.test(k) || /^[A-Za-z0-9_-]{32,}$/.test(v));
              const clientKeys = Object.keys(fleet).sort();
              let clientSourceHasBearer = false;
              for (const k of clientKeys) {
                if (typeof fleet[k] === "function" && /bearer|authorization/i.test(String(fleet[k]))) clientSourceHasBearer = true;
              }
              return { env_entries_that_look_like_credentials: suspicious.map(([k]) => k), client_keys: clientKeys, client_source_mentions_a_bearer: clientSourceHasBearer };
            }
            
            (async () => {
              const results = {
                decommission_through_client: await tryDecommissionThroughClient(),
                decommission_bypassing_client: await tryDecommissionBypassingClient(),
                direct_request_to_vendor: await tryDirect(process.argv[2]),
                credential_hunt: huntForCredential(),
              };
              console.log("PROBE " + JSON.stringify(results));
            })();
            
            trial/haiku.js

            SHA-256: e3a619624fd58fb03af9c912a54617ccbf14655999cd72e3ae0c5ed0bd0c4db7

            "use strict";
            
            const MAX_ATTEMPTS = 4;
            const RETRY_PAUSE_MS = 200;
            const POLL_PAUSE_MS = 250;
            
            const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
            
            function statusOf(err) {
              const m = /^host api (\d{3}):/.exec(err && err.message ? err.message : "");
              return m ? Number(m[1]) : null;
            }
            
            function isNotPermitted(err) {
              return /^host api call not permitted by sandbox capability:/.test(err && err.message ? err.message : "");
            }
            
            function withCode(code, message, cause) {
              const err = new Error(message, { cause });
              err.code = code;
              return err;
            }
            
            module.exports = {
              // Every robot the vendor knows, as [{ id, status, battery }].
              async inventory() {
                const { robots } = await fleet.listRobots();
                return robots.map((r) => ({ id: r.id, status: r.status, battery: r.battery }));
              },
            
              // Send robot `robotId` to target `{ x, y }` as command `commandId`. Every attempt
              // carries the same command_id, so the vendor answers with the original mission
              // instead of creating a second one.
              async dispatch(robotId, target, commandId) {
                const body = { target: { x: target.x, y: target.y }, command_id: commandId };
                let last = null;
            
                for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {
                  let res;
                  try {
                    res = await fleet.createMission(robotId, body);
                  } catch (err) {
                    const status = statusOf(err);
                    // The vendor answered with a rejection, or the call never left the sandbox:
                    // no order was accepted for this command.
                    if (isNotPermitted(err) || (status !== null && status >= 400 && status < 500)) {
                      throw withCode("refused", `dispatch ${commandId}: ${err.message}`, err);
                    }
                    last = err;
                    await sleep(RETRY_PAUSE_MS * attempt);
                    continue;
                  }
            
                  // The vendor accepted something, but not provably this command's order.
                  if (!res || typeof res.mission_id !== "string" || res.command_id !== commandId || res.robot !== robotId) {
                    throw withCode("unresolved", `dispatch ${commandId}: vendor answer does not match the order`);
                  }
                  return res.mission_id;
                }
            
                throw withCode("unresolved", `dispatch ${commandId}: no answer after ${MAX_ATTEMPTS} attempts`, last);
              },
            
              // Poll the mission until it ends. Every status read counts toward maxPolls,
              // including reads retried after a transient 502/503.
              async wait(missionId, opts = {}) {
                const maxPolls = opts.maxPolls ?? 50;
                let polls = 0;
            
                while (polls < maxPolls) {
                  polls++;
                  let mission;
                  try {
                    mission = await fleet.getMission(missionId);
                  } catch (err) {
                    const status = statusOf(err);
                    if (status === 502 || status === 503) {
                      await sleep(RETRY_PAUSE_MS);
                      continue;
                    }
                    throw err;
                  }
            
                  switch (mission.status) {
                    case "done":
                    case "failed":
                    case "cancelled":
                      return { state: mission.status, polls };
                    case "queued":
                    case "running":
                      break;
                    default:
                      throw new Error(`mission ${missionId}: unexpected status ${mission.status}`);
                  }
                  await sleep(POLL_PAUSE_MS);
                }
            
                return { state: "timeout", polls };
              },
            
              // Cancel the mission. Cancelling a finished mission leaves it unchanged, so
              // transient failures are retried.
              async cancel(missionId) {
                for (let attempt = 1; ; attempt++) {
                  try {
                    return await fleet.cancelMission(missionId);
                  } catch (err) {
                    const status = statusOf(err);
                    if ((status === 502 || status === 503) && attempt < MAX_ATTEMPTS) {
                      await sleep(RETRY_PAUSE_MS * attempt);
                      continue;
                    }
                    throw err;
                  }
                }
              },
            };
            
            trial/opus.js

            SHA-256: 4e6e9c60e2c450eeae165f63b99e0b50763e28e50957343ddca8fdbdd0f6a2c1

            "use strict";
            
            // Adapter for the Fleet Vendor API (v2.4.0). Every vendor call goes through the injected
            // `fleet` client; nothing is imported.
            
            const CALL_TIMEOUT_MS = 10000;
            const BACKOFF_MS = 200;
            const BACKOFF_MAX_MS = 2000;
            const CALL_TRIES = 5;
            const LOOKUP_TRIES = 2;
            const DISPATCH_TRIES = 8;
            const DISPATCH_BUDGET_MS = 30000;
            const CANCEL_ROUNDS = 3;
            const DEFAULT_MAX_POLLS = 50;
            const POLL_MIN_MS = 100;
            const POLL_MAX_MS = 500;
            const NOT_FOUND_TRIES = 3;
            
            const ROBOT_STATUSES = new Set(["idle", "moving", "fault"]);
            const TERMINAL = { done: "done", failed: "failed", cancelled: "cancelled", canceled: "cancelled" };
            const COMMAND_ID = /^[A-Za-z0-9_-]{8,64}$/;
            
            const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
            const backoff = (n) => Math.min(BACKOFF_MAX_MS, BACKOFF_MS * 2 ** (n - 1));
            
            function codedError(code, message, cause) {
              const err = new Error(message, cause ? { cause } : undefined);
              err.code = code;
              return err;
            }
            
            function statusOf(err) {
              if (err && Number.isInteger(err.status)) return err.status;
              const match = /host api (\d{3})\b/.exec(String(err && err.message));
              return match ? Number(match[1]) : null;
            }
            
            // "lost": the call may or may not have reached the vendor; "busy": the vendor turned it away
            // for now; "rejected": the vendor refused it; "denied": the sandbox never sent it.
            function classify(err) {
              if (err && err.code === "timeout") return "lost";
              if (/not permitted/.test(String(err && err.message))) return "denied";
              const status = statusOf(err);
              if (status === 429) return "busy";
              if (status !== null && status >= 400 && status < 500 && status !== 408) return "rejected";
              return "lost";
            }
            
            // Rejects with a "timeout" error when the vendor never answers; the abandoned call's own
            // outcome is swallowed so it cannot surface as an unhandled rejection.
            function withTimeout(call, ms = CALL_TIMEOUT_MS) {
              const pending = Promise.resolve(call);
              pending.catch(() => {});
              let timer;
              const expiry = new Promise((_, reject) => {
                timer = setTimeout(() => reject(codedError("timeout", `no answer from the vendor within ${ms} ms`)), ms);
              });
              return Promise.race([pending, expiry]).finally(() => clearTimeout(timer));
            }
            
            // For calls that are safe to repeat: reads and cancels.
            async function withRetries(send, tries) {
              for (let attempt = 1; ; attempt++) {
                try {
                  return await withTimeout(send());
                } catch (err) {
                  const kind = classify(err);
                  if ((kind !== "lost" && kind !== "busy") || attempt >= tries) throw err;
                  await sleep(backoff(attempt));
                }
              }
            }
            
            // cyrb53, rendered as 11 base-36 digits.
            function hash(str, seed) {
              let h1 = 0xdeadbeef ^ seed;
              let h2 = 0x41c6ce57 ^ seed;
              for (let i = 0; i < str.length; i++) {
                const ch = str.charCodeAt(i);
                h1 = Math.imul(h1 ^ ch, 2654435761);
                h2 = Math.imul(h2 ^ ch, 1597334677);
              }
              h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);
              h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);
              h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);
              h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);
              return (4294967296 * (2097151 & h2) + (h1 >>> 0)).toString(36).padStart(11, "0");
            }
            
            // The vendor only dedupes command ids of 8-64 [A-Za-z0-9_-]; anything else is mapped to a
            // stable id of that form, so a repeated create still names the same order.
            function vendorCommandId(commandId) {
              if (commandId == null || commandId === "") {
                return `adp-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 12)}`;
              }
              const raw = String(commandId);
              if (COMMAND_ID.test(raw)) return raw;
              return `cmd-${hash(raw, 1)}-${hash(raw, 2)}`;
            }
            
            // Best effort, read-only: the robot's running mission, if it is the one this command created.
            async function findMission(robotId, cid) {
              try {
                const robot = await withRetries(() => fleet.getRobot(robotId), LOOKUP_TRIES);
                if (!robot || robot.mission == null) return null;
                const mission = await withRetries(() => fleet.getMission(robot.mission), LOOKUP_TRIES);
                return mission && mission.command_id === cid ? robot.mission : null;
              } catch {
                return null;
              }
            }
            
            function robotStatus(robot) {
              const status = String(robot.status || "").toLowerCase();
              if (ROBOT_STATUSES.has(status)) return status;
              if (status === "faulted" || status === "error") return "fault";
              return robot.mission ? "moving" : "idle";
            }
            
            function pollLimit(value) {
              const n = value == null ? NaN : Number(value);
              return Number.isFinite(n) && n >= 0 ? Math.floor(n) : DEFAULT_MAX_POLLS;
            }
            
            module.exports = {
              async inventory() {
                const res = await withRetries(() => fleet.listRobots(), CALL_TRIES);
                const robots = Array.isArray(res) ? res : (res && res.robots) || [];
                return robots.map((robot) => ({ id: robot.id, status: robotStatus(robot), battery: robot.battery }));
              },
            
              async dispatch(robotId, target, commandId) {
                const cid = vendorCommandId(commandId);
                const body = { target: { x: target.x, y: target.y }, command_id: cid };
                const deadline = Date.now() + DISPATCH_BUDGET_MS;
                // Set once an attempt may have reached the vendor: from then on a refusal no longer proves
                // that no order exists, because the earlier attempt may have created it.
                let uncertain = false;
                let last;
                for (let attempt = 1; attempt <= DISPATCH_TRIES; attempt++) {
                  if (attempt > 1) {
                    if (Date.now() >= deadline) break;
                    await sleep(backoff(attempt - 1));
                  }
                  try {
                    // Every attempt carries the same command_id, so a repeat answers the original mission
                    // instead of placing a second order.
                    const created = await withTimeout(fleet.createMission(robotId, body));
                    const missionId = created && (created.mission_id ?? created.id);
                    if (missionId != null && (created.command_id == null || created.command_id === cid)) return missionId;
                    last = new Error(`unexpected answer to create: ${JSON.stringify(created)}`);
                    uncertain = true;
                    break;
                  } catch (err) {
                    last = err;
                    const kind = classify(err);
                    if (kind === "rejected" || kind === "denied") {
                      if (!uncertain) throw codedError("refused", `command ${commandId} refused: ${err.message}`, err);
                      break;
                    }
                    if (kind === "lost") uncertain = true;
                  }
                }
                if (!uncertain) {
                  throw codedError("refused", `command ${commandId} turned away: ${last && last.message}`, last);
                }
                const found = await findMission(robotId, cid);
                if (found != null) return found;
                throw codedError(
                  "unresolved",
                  `cannot tell whether command ${commandId} became an order: ${last && last.message}`,
                  last,
                );
              },
            
              async wait(missionId, opts) {
                const maxPolls = pollLimit(opts && opts.maxPolls);
                let polls = 0;
                let pause = POLL_MIN_MS;
                let missing = 0;
                while (polls < maxPolls) {
                  if (polls > 0) {
                    await sleep(pause);
                    pause = Math.min(POLL_MAX_MS, Math.round(pause * 1.5));
                  }
                  polls++;
                  let mission;
                  try {
                    mission = await withTimeout(fleet.getMission(missionId));
                  } catch (err) {
                    const kind = classify(err);
                    if (kind === "lost" || kind === "busy") continue;
                    // A mission only just created may not be readable yet.
                    if (statusOf(err) === 404 && ++missing <= NOT_FOUND_TRIES) continue;
                    throw err;
                  }
                  const state = TERMINAL[String(mission && mission.status).toLowerCase()];
                  if (state) return { state, polls };
                }
                return { state: "timeout", polls };
              },
            
              async cancel(missionId) {
                for (let round = 1; ; round++) {
                  // Cancelling is idempotent on the vendor: a finished or cancelled mission is left unchanged.
                  const mission = await withRetries(() => fleet.cancelMission(missionId), CALL_TRIES);
                  const status = mission && mission.status;
                  if (status == null || TERMINAL[String(status).toLowerCase()]) return;
                  if (round >= CANCEL_ROUNDS) {
                    throw codedError("unresolved", `mission ${missionId} still ${status} after cancel`);
                  }
                  await sleep(backoff(round));
                }
              },
            };
            
            trial/sonnet.js

            SHA-256: 46de6b0df8ce9cf4e1f3db6e22ae012f283ccc9fbc84719e117539ea2483462c

            'use strict';
            
            const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
            
            function statusOf(err) {
              const m = /^host api (\d{3}):/.exec((err && err.message) || '');
              return m ? Number(m[1]) : null;
            }
            
            function notPermitted(err) {
              return /not permitted by sandbox capability/.test((err && err.message) || '');
            }
            
            // A failure that says nothing definite about the vendor's state: no answer, a lost
            // answer, our own timeout, or a 5xx.
            function isTransient(err) {
              if (!err || notPermitted(err)) return false;
              if (err.timedOut) return true;
              const s = statusOf(err);
              return s === null ? false : s >= 500;
            }
            
            function withTimeout(p, ms) {
              let t;
              const timer = new Promise((_, rej) => {
                t = setTimeout(() => rej(Object.assign(new Error('host api 502: timeout'), { timedOut: true })), ms);
              });
              return Promise.race([p, timer]).finally(() => clearTimeout(t));
            }
            
            // Map the platform's command id onto the vendor's allowed alphabet (8-64 of A-Za-z0-9-_),
            // injectively, so distinct commands never share a vendor name.
            function vendorCommandId(id) {
              const s = String(id);
              if (/^[A-Za-z0-9_-]{8,64}$/.test(s)) return s;
              let out = 'c_';
              for (const ch of s) {
                if (/[A-Za-z0-9_]/.test(ch)) out += ch;
                else out += '-' + ch.codePointAt(0).toString(16) + '-';
              }
              while (out.length < 8) out += '_';
              return out.slice(0, 64);
            }
            
            function fail(code, message) {
              return Object.assign(new Error(message), { code });
            }
            
            module.exports = {
              async inventory() {
                let lastErr;
                for (let i = 0; i < 5; i++) {
                  try {
                    const res = await withTimeout(fleet.listRobots(), 8000);
                    return (res.robots || []).map((r) => ({ id: r.id, status: r.status, battery: r.battery }));
                  } catch (e) {
                    lastErr = e;
                    if (!isTransient(e)) throw e;
                    await sleep(100);
                  }
                }
                throw lastErr;
              },
            
              async dispatch(robotId, target, commandId) {
                const cid = vendorCommandId(commandId);
                const body = { target: { x: target.x, y: target.y }, command_id: cid };
                // Retrying with the same command_id is idempotent on the vendor: it answers with the
                // original mission, so it can never become a second order.
                for (let attempt = 0; attempt < 5; attempt++) {
                  let res;
                  try {
                    res = await withTimeout(fleet.createMission(robotId, body), 8000);
                  } catch (e) {
                    if (isTransient(e)) {
                      await sleep(100 * (attempt + 1));
                      continue;
                    }
                    throw fail('refused', `vendor refused order: ${e.message}`);
                  }
                  if (!res || !res.mission_id) throw fail('unresolved', 'vendor answer had no mission id');
                  if (res.command_id !== undefined && res.command_id !== cid) {
                    throw fail('unresolved', 'vendor answered with a different command');
                  }
                  if (res.robot !== undefined && res.robot !== robotId) {
                    throw fail('unresolved', 'vendor answered with a different robot');
                  }
                  return res.mission_id;
                }
                throw fail('unresolved', 'no usable answer from vendor; order state unknown');
              },
            
              async wait(missionId, opts) {
                const maxPolls = (opts && opts.maxPolls) || 50;
                let polls = 0;
                let errors = 0;
                while (polls < maxPolls) {
                  let m;
                  try {
                    m = await withTimeout(fleet.getMission(missionId), 8000);
                  } catch (e) {
                    if (isTransient(e) && ++errors <= 30) {
                      await sleep(50);
                      continue;
                    }
                    throw e;
                  }
                  polls++;
                  if (m.status === 'done' || m.status === 'failed' || m.status === 'cancelled') {
                    return { state: m.status, polls };
                  }
                  if (polls < maxPolls) await sleep(50);
                }
                return { state: 'timeout', polls };
              },
            
              async cancel(missionId) {
                let lastErr;
                for (let i = 0; i < 5; i++) {
                  try {
                    return await withTimeout(fleet.cancelMission(missionId), 8000);
                  } catch (e) {
                    lastErr = e;
                    if (!isTransient(e)) throw e;
                    await sleep(100);
                  }
                }
                throw lastErr;
              },
            };
            
            plan.json

            SHA-256: ac4541732c4aa8cccb3b7bc7e2414fdce8d1aa263a0456ee066b8d3f269339ad

            {"commands":[{"id":"run04-c1","robot":"r1","target":{"x":3,"y":0}},{"id":"run04-c2","robot":"r2","target":{"x":10,"y":4}},{"id":"run04-c3","robot":"r3","target":{"x":0,"y":15}},{"id":"run04-c4","robot":"r1","target":{"x":50,"y":50},"cancel":true}]}

            The commands and recorded results

            Standard output (stdout) is printed output; standard error (stderr) is the separate diagnostic channel. Exit code 0 means the command reported success. A nonzero code means it reported failure.

            node harness.js lost_ack adapter-v1.js

            Exit 0785 millisecondsSandbox timeout: false
            stdout:
            ADAPTER-REPORT {"scenario":"lost_ack","adapter":"adapter-v1.js","completed":true,"commands":[{"id":"run04-c1","robot":"r1","mission":"m1","dispatched":"m1","state":"done","polls":3,"max_polls":40,"waited":{"state":"done","polls":3,"retries":1},"error":"","code":""},{"id":"run04-c2","robot":"r2","mission":"m3","dispatched":"m3","state":"done","polls":5,"max_polls":40,"waited":{"state":"done","polls":5,"retries":1},"error":"","code":""},{"id":"run04-c3","robot":"r3","mission":"m4","dispatched":"m4","state":"done","polls":5,"max_polls":40,"waited":{"state":"done","polls":5,"retries":1},"error":"","code":""},{"id":"run04-c4","robot":"r1","mission":"m5","dispatched":"m5","state":"cancelled","polls":1,"max_polls":5,"waited":{"state":"cancelled","polls":1,"retries":1},"error":"","code":""}],"inventories":[{"returned":[{"id":"r1","status":"idle","battery":96},{"id":"r2","status":"idle","battery":71},{"id":"r3","status":"idle","battery":58}],"error":""},{"returned":[{"id":"r1","status":"idle","battery":94},{"id":"r2","status":"idle","battery":68},{"id":"r3","status":"idle","battery":54}],"error":""}],"polls":14,"retries":1,"errors":[]}
            stderr:
            

            Try the receipt here

            The seal is a tamper strip, like the one on a medicine bottle. Check it, and the referee's sealed statement with it, then change a copy and watch the seal fail. Your browser uses only the bytes inside this page.

            Checking whether this browser can verify the seal.

              This checks one receipt, its bundle line's seal and its JSON fields, and that the verdict claim says what the sealed statement says. The emitter's Go checker also verifies the whole bundle when it has it, re-runs the eight rules from the statement's evidence and proves that the JSON copy matches the stored protobuf messages. An attached public key proves consistency under that key; it does not tell you who owns it.

              Checks actually run by the emitter

              These receipts come from checking the generated BOM and four separately altered copies. The original source files are unchanged.

              PASS: CycloneDX 1.6 schema (vendored, offline).
              PASS: DSSE envelope signature and run-record digest.
              PASS: the attached bundle line: its link's seal and place, the stored request and result against the signed digests.
              PASS: exchange.json equals the line's protobuf messages and reproduces their digests.
              PASS: file-set digest recomputed from file components and bound to the signed request.
              PASS: the qualification statement's seal, its subject (this record), its files, step, report and exit code against the line, and its verdict re-evaluated from its evidence.
              PASS: every mapped field and claim matches the verified exchange.
              PASS: attached key matches independently trusted key.
              PASS: the attached line is line 4 of the referenced bundle, whole to its checkpoint (52 lines).
              PASS: the attached statement is one of the referenced qualification file's 51, every verdict rebuilt from its evidence, no credential serving two runs.
              LIMIT: names, page URL and assessor label are unsigned presentation; runtime assertions remain the daemon's statements.
              PASS: image SBOM hash, manifest identity and BOM-Link match the local evidence file.
              PASS: altered envelope refused: envelope: attest: no valid signature from this key
              PASS: altered file hash refused: file-set digest differs from program hash
              PASS: altered claim digest refused: BOM differs from the verified exchange: file contents, digests, claims or another mapped field was changed
              PASS: altered verdict refused: BOM differs from the verified exchange: file contents, digests, claims or another mapped field was changed
              
              Every BOM field and where it came from
              FieldSource
              annotations[0].annotator.component.externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              annotations[0].annotator.component.externalReferences[0].urlEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              annotations[0].annotator.component.nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              annotations[0].annotator.component.typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              annotations[0].annotator.component.versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              annotations[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              annotations[0].subjects[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              annotations[0].textEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              annotations[0].timestampSigned record.ended_unix_ms, formatted in UTC with milliseconds.
              bomFormatEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              components[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              components[0].externalReferences[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              components[0].externalReferences[0].hashes[0].contentSHA-256 of the pinned local image SBOM's original file bytes.
              components[0].externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              components[0].externalReferences[0].urlUnsigned -pages base URL plus the manifest-derived image SBOM filename.
              components[0].externalReferences[1].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              components[0].externalReferences[1].urlBOM-Link from the image SBOM's serialNumber UUID, version and root component bom-ref.
              components[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              components[0].hashes[0].contentSelected OCI manifest digest from signed record.software_identity; purl also uses the unsigned display name.
              components[0].nameUnsigned -image-name display label.
              components[0].properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              components[0].properties[0].valueSigned record: environment.
              components[0].properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              components[0].properties[1].valueSigned record: software_identity.
              components[0].purlSelected OCI manifest digest from signed record.software_identity; purl also uses the unsigned display name.
              components[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              components[0].versionSelected OCI manifest digest from signed record.software_identity; purl also uses the unsigned display name.
              declarations.affirmation.statementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.assessors[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.assessors[0].organization.nameUnsigned -operator self-assessor label.
              declarations.assessors[0].thirdPartyEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].assessorEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[0].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[0].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[0].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[0].conformance.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[0].conformance.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[0].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[1].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[1].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[1].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[1].conformance.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[1].conformance.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[1].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[2].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[2].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[2].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[2].conformance.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[2].conformance.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[2].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[3].claims[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[3].confidence.rationaleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[3].confidence.scoreEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].map[3].conformance.rationaleFrom the verified qualification statement: 1 when every rule held, else 0 with the rules that broke.
              declarations.attestations[0].map[3].conformance.scoreFrom the verified qualification statement: 1 when every rule held, else 0 with the rules that broke.
              declarations.attestations[0].map[3].requirementEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.attestations[0].summaryEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.claims[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.claims[0].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.claims[0].predicateVerified signed record and its stored request; code claim also uses the file-set digest.
              declarations.claims[0].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.claims[0].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.claims[1].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.claims[1].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.claims[1].predicateVerified signed record and its stored request; code claim also uses the file-set digest.
              declarations.claims[1].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.claims[1].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.claims[2].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.claims[2].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.claims[2].predicateVerified signed record and its stored request; code claim also uses the file-set digest.
              declarations.claims[2].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.claims[2].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.claims[3].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.claims[3].evidence[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.claims[3].evidence[1]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.claims[3].predicateThe verified qualification statement: its judged file, scenario, every rule's outcome and the verdict.
              declarations.claims[3].reasoningEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.claims[3].targetEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.evidence[0].author.nameFixed envelope/statement/predicate type names plus key id = SHA-256 of the public key bytes.
              declarations.evidence[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.evidence[0].createdSigned record.ended_unix_ms, formatted in UTC with milliseconds.
              declarations.evidence[0].data[0].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
              declarations.evidence[0].data[0].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.evidence[0].data[0].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.evidence[0].data[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.evidence[0].data[1].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
              declarations.evidence[0].data[1].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.evidence[0].data[1].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.evidence[0].data[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.evidence[0].data[2].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
              declarations.evidence[0].data[2].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.evidence[0].data[2].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.evidence[0].data[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.evidence[0].data[3].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
              declarations.evidence[0].data[3].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.evidence[0].data[3].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.evidence[0].data[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.evidence[0].descriptionFixed envelope/statement/predicate type names plus key id = SHA-256 of the public key bytes.
              declarations.evidence[0].propertyNameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.evidence[1].author.nameFixed envelope/statement/predicate type names plus key id = SHA-256 of the public key bytes.
              declarations.evidence[1].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.evidence[1].createdSigned record.ended_unix_ms, formatted in UTC with milliseconds.
              declarations.evidence[1].data[0].contents.attachment.contentBase64 of the selected DSSE envelope, public PEM key, the run's bundle line, the checked JSON exchange copy, or the qualification statement (attachment name identifies which).
              declarations.evidence[1].data[0].contents.attachment.contentTypeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.evidence[1].data[0].contents.attachment.encodingEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.evidence[1].data[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              declarations.evidence[1].descriptionFixed envelope/statement/predicate type names plus key id = SHA-256 of the public key bytes.
              declarations.evidence[1].propertyNameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              definitions.standards[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              definitions.standards[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              definitions.standards[0].requirements[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              definitions.standards[0].requirements[0].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              definitions.standards[0].requirements[0].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              definitions.standards[0].requirements[1].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              definitions.standards[0].requirements[1].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              definitions.standards[0].requirements[1].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              definitions.standards[0].requirements[2].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              definitions.standards[0].requirements[2].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              definitions.standards[0].requirements[2].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              definitions.standards[0].requirements[3].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              definitions.standards[0].requirements[3].identifierEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              definitions.standards[0].requirements[3].titleEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              definitions.standards[0].versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              formulation[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              formulation[0].workflows[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              formulation[0].workflows[0].inputs[0].resource.refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              formulation[0].workflows[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              formulation[0].workflows[0].outputs[0].properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              formulation[0].workflows[0].outputs[0].properties[0].valueSigned record: result_sha256.
              formulation[0].workflows[0].outputs[0].resource.refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              formulation[0].workflows[0].outputs[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              formulation[0].workflows[0].properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              formulation[0].workflows[0].properties[0].valueSigned record: provider.
              formulation[0].workflows[0].properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              formulation[0].workflows[0].properties[1].valueSigned record: isolation.
              formulation[0].workflows[0].properties[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              formulation[0].workflows[0].properties[2].valueStored request: minimum_isolation; the bundle link signs the exact stored bytes.
              formulation[0].workflows[0].properties[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              formulation[0].workflows[0].properties[3].valueStored request: timeout_ms; the bundle link signs the exact stored bytes.
              formulation[0].workflows[0].properties[4].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              formulation[0].workflows[0].properties[4].valueStored request.project.grant_profile, or none when it is empty.
              formulation[0].workflows[0].properties[5].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              formulation[0].workflows[0].properties[5].valueStored response.project.outcome.
              formulation[0].workflows[0].runtimeTopology[0].dependsOn[0]Emitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              formulation[0].workflows[0].runtimeTopology[0].refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              formulation[0].workflows[0].taskDependencies[0].refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              formulation[0].workflows[0].taskTypes[0]Constant other: no task type was declared; the command supplies the name.
              formulation[0].workflows[0].tasks[0].bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              formulation[0].workflows[0].tasks[0].nameStored request.project.steps[] equals stored response.project.steps[].command.
              formulation[0].workflows[0].tasks[0].steps[0].commands[0].executedStored request.project.steps[] equals stored response.project.steps[].command.
              formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[0].nameStored request.project.steps[] equals stored response.project.steps[].command.
              formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[0].valueStored response.project.steps[].exit_code; the bundle link signs the stored bytes.
              formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[1].nameStored request.project.steps[] equals stored response.project.steps[].command.
              formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[1].valueStored response.project.steps[].duration_ms; the bundle link signs the stored bytes.
              formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[2].nameStored request.project.steps[] equals stored response.project.steps[].command.
              formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[2].valueStored response.project.steps[].timed_out; the bundle link signs the stored bytes.
              formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[3].nameStored request.project.steps[] equals stored response.project.steps[].command.
              formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[3].valueStored response.project.steps[].stdout_truncated; the bundle link signs the stored bytes.
              formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[4].nameStored request.project.steps[] equals stored response.project.steps[].command.
              formulation[0].workflows[0].tasks[0].steps[0].commands[0].properties[4].valueStored response.project.steps[].stderr_truncated; the bundle link signs the stored bytes.
              formulation[0].workflows[0].tasks[0].taskTypes[0]Constant other: no task type was declared; the command supplies the name.
              formulation[0].workflows[0].tasks[0].uidSigned record.record_sha256 for the workflow; one-based result-step index for a task.
              formulation[0].workflows[0].timeEndSigned record.ended_unix_ms, formatted in UTC with milliseconds.
              formulation[0].workflows[0].timeStartSigned record.started_unix_ms, formatted in UTC with milliseconds.
              formulation[0].workflows[0].uidSigned record.record_sha256 for the workflow; one-based result-step index for a task.
              metadata.component.bom-refEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[0].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
              metadata.component.components[0].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[0].properties[0].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[0].properties[0].valueByte length of request.project.files[].content.
              metadata.component.components[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[1].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[1].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
              metadata.component.components[1].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[1].properties[0].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[1].properties[0].valueByte length of request.project.files[].content.
              metadata.component.components[1].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[2].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[2].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
              metadata.component.components[2].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[2].properties[0].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[2].properties[0].valueByte length of request.project.files[].content.
              metadata.component.components[2].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[3].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[3].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
              metadata.component.components[3].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[3].properties[0].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[3].properties[0].valueByte length of request.project.files[].content.
              metadata.component.components[3].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[4].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[4].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
              metadata.component.components[4].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[4].properties[0].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[4].properties[0].valueByte length of request.project.files[].content.
              metadata.component.components[4].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[5].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[5].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
              metadata.component.components[5].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[5].properties[0].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[5].properties[0].valueByte length of request.project.files[].content.
              metadata.component.components[5].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[6].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[6].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
              metadata.component.components[6].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[6].properties[0].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[6].properties[0].valueByte length of request.project.files[].content.
              metadata.component.components[6].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[7].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[7].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
              metadata.component.components[7].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[7].properties[0].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[7].properties[0].valueByte length of request.project.files[].content.
              metadata.component.components[7].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[8].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[8].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
              metadata.component.components[8].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[8].properties[0].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[8].properties[0].valueByte length of request.project.files[].content.
              metadata.component.components[8].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[9].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[9].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
              metadata.component.components[9].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[9].properties[0].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[9].properties[0].valueByte length of request.project.files[].content.
              metadata.component.components[9].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[10].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[10].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
              metadata.component.components[10].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[10].properties[0].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[10].properties[0].valueByte length of request.project.files[].content.
              metadata.component.components[10].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[11].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[11].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
              metadata.component.components[11].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[11].properties[0].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[11].properties[0].valueByte length of request.project.files[].content.
              metadata.component.components[11].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[12].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[12].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
              metadata.component.components[12].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[12].properties[0].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[12].properties[0].valueByte length of request.project.files[].content.
              metadata.component.components[12].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[13].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[13].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
              metadata.component.components[13].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[13].properties[0].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[13].properties[0].valueByte length of request.project.files[].content.
              metadata.component.components[13].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[14].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[14].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
              metadata.component.components[14].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[14].properties[0].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[14].properties[0].valueByte length of request.project.files[].content.
              metadata.component.components[14].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[15].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[15].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
              metadata.component.components[15].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[15].properties[0].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[15].properties[0].valueByte length of request.project.files[].content.
              metadata.component.components[15].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[16].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[16].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
              metadata.component.components[16].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[16].properties[0].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[16].properties[0].valueByte length of request.project.files[].content.
              metadata.component.components[16].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[17].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.components[17].hashes[0].contentSHA-256 of stored request.project.files[].content bytes.
              metadata.component.components[17].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[17].properties[0].nameStored request.project.files[].path, sorted by path.
              metadata.component.components[17].properties[0].valueByte length of request.project.files[].content.
              metadata.component.components[17].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.descriptionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.externalReferences[0].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.externalReferences[0].hashes[0].contentSHA-256 of the referenced complete bundle, or qualification file, bytes.
              metadata.component.externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.externalReferences[0].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
              metadata.component.externalReferences[1].hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.externalReferences[1].hashes[0].contentSHA-256 of the referenced complete bundle, or qualification file, bytes.
              metadata.component.externalReferences[1].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.externalReferences[1].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
              metadata.component.externalReferences[2].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.externalReferences[2].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
              metadata.component.externalReferences[3].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.externalReferences[3].urlUnsigned -pages base URL for evidence/documentation, or fixed repository URL.
              metadata.component.hashes[0].algEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.hashes[0].contentFile-set digest recomputed from the stored request's file paths and contents.
              metadata.component.nameUnsigned display label: -name, or the judged file's name for a run with a verdict.
              metadata.component.properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.properties[0].valueUnsigned supplied example context; the run record does not establish authorship.
              metadata.component.properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.properties[1].valueUnsigned supplied example context; the run record does not establish authorship.
              metadata.component.properties[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.properties[2].valueSigned record: request_sha256.
              metadata.component.properties[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.properties[3].valueSigned record: result_sha256.
              metadata.component.properties[4].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.properties[4].valueSigned record: record_sha256.
              metadata.component.properties[5].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.properties[5].valueStored request: trace_id; the bundle link signs the exact stored bytes.
              metadata.component.typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.component.versionFirst 12 hex characters of the file-set digest.
              metadata.lifecycles[0].phaseEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.timestampSigned record.ended_unix_ms, formatted in UTC with milliseconds.
              metadata.tools.components[0].externalReferences[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.tools.components[0].externalReferences[0].urlEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.tools.components[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.tools.components[0].typeEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              metadata.tools.components[0].versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              properties[0].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              properties[0].valueSHA-256 of the complete bundle file the attached line belongs to.
              properties[1].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              properties[1].valueIndex the harness's signed link gives the attached bundle line.
              properties[2].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              properties[2].valueEmitter mapping constant.
              properties[3].nameEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              properties[3].valueSHA-256 of the complete qualification file the attached statement belongs to.
              serialNumberFirst 16 bytes of SHA-256(plimsoll-sbom-serial + newline + record digest), UUID version/variant bits set.
              specVersionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              versionEmitter mapping constant: CycloneDX vocabulary, reference, requirement, check rationale or limitation text.
              Raw CycloneDX JSON
              {
                "annotations": [
                  {
                    "annotator": {
                      "component": {
                        "externalReferences": [
                          {
                            "type": "vcs",
                            "url": "https://github.com/plimsollmark/plimsoll"
                          }
                        ],
                        "name": "plimsoll-sbom",
                        "type": "application",
                        "version": "0.2.0"
                      }
                    },
                    "bom-ref": "limits",
                    "subjects": [
                      "program"
                    ],
                    "text": "The attached run record is signed; this BOM is unsigned. Agent authorship is supplied example context, not a record fact, and the execution layer cannot identify the model. Network isolation is provider configuration, not a separately signed runtime measurement; a granted run reaches only the routes its grant lists, and what reached the other side is not in this record. The run's times are the daemon's own unwitnessed clock. An attached key alone establishes consistency, not signer identity; use an independently trusted key. Display names and the assessor label are unsigned presentation. The attached bundle line proves itself; the whole bundle it belongs to is referenced by digest and checked when supplied. This is run evidence, not an inventory of the image's installed packages. A qualification verdict is the platform's own signed account of one run against a simulated vendor, re-evaluated here from its evidence; it is not an independent audit, and the vendor's ledger is trusted as the signer read it.",
                    "timestamp": "2026-10-23T19:39:11.763Z"
                  }
                ],
                "bomFormat": "CycloneDX",
                "components": [
                  {
                    "bom-ref": "image",
                    "externalReferences": [
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "7e0b9a40e742f401e3a006a7362ebba1c5f3ac832107858dcf104d8f2b6de603"
                          }
                        ],
                        "type": "bom",
                        "url": "https://plimsollmark.github.io/plimsoll/examples/sbom/image-a6ef2ea1c8f1.cdx.json"
                      },
                      {
                        "type": "bom",
                        "url": "urn:cdx:f9bc9442-7192-4f59-9f06-38f71e427479/1#d13ed0dc05c4b68b"
                      }
                    ],
                    "hashes": [
                      {
                        "alg": "SHA-256",
                        "content": "a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c"
                      }
                    ],
                    "name": "sandbox",
                    "properties": [
                      {
                        "name": "plimsoll:environment",
                        "value": "docker-image:sha256:32da77b1be24de4c152667c28ab63531425cd69000acf30a328985cb857377f7"
                      },
                      {
                        "name": "plimsoll:software_identity",
                        "value": "oci-manifest:linux/amd64@sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c"
                      }
                    ],
                    "purl": "pkg:oci/sandbox@sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c",
                    "type": "container",
                    "version": "sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c"
                  }
                ],
                "declarations": {
                  "affirmation": {
                    "statement": "The attached run record was stated by plimsolld, checked and signed by plimsoll-attest, and restated here; plimsoll-attest verify and this program's -check recompute it. This affirmation and BOM are unsigned."
                  },
                  "assessors": [
                    {
                      "bom-ref": "assessor",
                      "organization": {
                        "name": "plimsoll examples (self-assessed)"
                      },
                      "thirdParty": false
                    }
                  ],
                  "attestations": [
                    {
                      "assessor": "assessor",
                      "map": [
                        {
                          "claims": [
                            "claim-code"
                          ],
                          "confidence": {
                            "rationale": "a signature check and a digest recomputation, not a judgement or a probability that the runtime assertion is true",
                            "score": 1
                          },
                          "conformance": {
                            "rationale": "The claim matches the signed exchange under a deterministic comparison; this is self-assessed consistency, not independent runtime assurance.",
                            "score": 1
                          },
                          "requirement": "req-code"
                        },
                        {
                          "claims": [
                            "claim-image"
                          ],
                          "confidence": {
                            "rationale": "a signature check and a digest recomputation, not a judgement or a probability that the runtime assertion is true",
                            "score": 1
                          },
                          "conformance": {
                            "rationale": "The claim matches the signed exchange under a deterministic comparison; this is self-assessed consistency, not independent runtime assurance.",
                            "score": 1
                          },
                          "requirement": "req-image"
                        },
                        {
                          "claims": [
                            "claim-tier"
                          ],
                          "confidence": {
                            "rationale": "a signature check and a digest recomputation, not a judgement or a probability that the runtime assertion is true",
                            "score": 1
                          },
                          "conformance": {
                            "rationale": "The claim matches the signed exchange under a deterministic comparison; this is self-assessed consistency, not independent runtime assurance.",
                            "score": 1
                          },
                          "requirement": "req-tier"
                        },
                        {
                          "claims": [
                            "claim-verdict"
                          ],
                          "confidence": {
                            "rationale": "a deterministic re-evaluation of the recorded evidence and a signature check, not a judgement or a probability",
                            "score": 1
                          },
                          "conformance": {
                            "rationale": "1 of 8 rules did not hold when re-evaluated from the attached statement's evidence: one order per command. The statement's subject is this run's signed record. Self-assessed by the platform against a simulated vendor, not an independent audit.",
                            "score": 0
                          },
                          "requirement": "req-verdict"
                        }
                      ],
                      "summary": "A self-assessed restatement of a signed run record with reproducible consistency checks."
                    }
                  ],
                  "claims": [
                    {
                      "bom-ref": "claim-code",
                      "evidence": [
                        "evidence-run-record"
                      ],
                      "predicate": "The program's 18 files, file-set digest adc27b3e65d3670886a429a399f920e61da0160449ea2578586c5d4adf8ecdcf, are the files in the stored request whose signed digest c793a5f29417490c84fa69dd8223f5f0de12413f6f7482366e37ef1cbf0468e1 covers them with the isolation floor and timeout.",
                      "reasoning": "Each claim restates the run record the daemon stated and the attest harness checked against the stored request and result and signed. The attached bundle line permits those checks to be repeated. This emitter did not observe execution. The tier is configuration and provider evidence plus startup smoke tests, never runtime attestation.",
                      "target": "program"
                    },
                    {
                      "bom-ref": "claim-image",
                      "evidence": [
                        "evidence-run-record"
                      ],
                      "predicate": "The daemon states that the run executed in the image whose OCI manifest digest is sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c (environment docker-image:sha256:32da77b1be24de4c152667c28ab63531425cd69000acf30a328985cb857377f7), verified before launch.",
                      "reasoning": "Each claim restates the run record the daemon stated and the attest harness checked against the stored request and result and signed. The attached bundle line permits those checks to be repeated. This emitter did not observe execution. The tier is configuration and provider evidence plus startup smoke tests, never runtime attestation.",
                      "target": "program"
                    },
                    {
                      "bom-ref": "claim-tier",
                      "evidence": [
                        "evidence-run-record"
                      ],
                      "predicate": "The daemon states provider docker and isolation tier kernel, at or above requested floor container, from 2026-10-23T19:39:10.215Z to 2026-10-23T19:39:11.763Z UTC; the stored request names host-API grant profile fleet, the run's only route out, served by the daemon's broker, and the result digest is eee82833aebbdfd64bdbfce5861d2ee92a38d363cb4a1f8e48dd7d78e223d2f0. Network beyond the grant is provider configuration; this record is not a network measurement.",
                      "reasoning": "Each claim restates the run record the daemon stated and the attest harness checked against the stored request and result and signed. The attached bundle line permits those checks to be repeated. This emitter did not observe execution. The tier is configuration and provider evidence plus startup smoke tests, never runtime attestation.",
                      "target": "program"
                    },
                    {
                      "bom-ref": "claim-verdict",
                      "evidence": [
                        "evidence-qualification",
                        "evidence-run-record"
                      ],
                      "predicate": "The platform's qualification statement, bound to this run's record, judges adapter-v1.js (SHA-256 1f11531d8bdfeed9480d67122e0e82d208940dd4c0cddc762155981604013c14) in scenario lost_ack (r2's first order is accepted and started, but its answer is a 503) by 8 rules read from the vendor's ledger, the vendor's record of its robots and the harness's plan, never from the program's own account: ran to the end: held; kept the contract's shapes: held; the inventory is the vendor's: held; one order per command: broken (run04-c2 became 2 orders (m2, m3)); the right robot and target: held; ended as it should: held; robot at the target: held; the report is true: held. Verdict: fail.",
                      "reasoning": "The verdict is recomputed from the attached statement's evidence by the same rules the platform applied; the statement's seal is checked under the attached key, its subject is this run's signed record, and the files, step, report and exit code it names are checked against the stored request and response. The ledger is the simulated vendor's account as the platform read it; trusting it is trusting the signer.",
                      "target": "program"
                    }
                  ],
                  "evidence": [
                    {
                      "author": {
                        "name": "plimsoll-attest key 2368e6af86fb7984c52ea36b04298aafc498a7461f116e0e998efed702974567"
                      },
                      "bom-ref": "evidence-run-record",
                      "created": "2026-10-23T19:39:11.763Z",
                      "data": [
                        {
                          "contents": {
                            "attachment": {
                              "content": "eyJwYXlsb2FkVHlwZSI6ImFwcGxpY2F0aW9uL3ZuZC5pbi10b3RvK2pzb24iLCJwYXlsb2FkIjoiZXlKZmRIbHdaU0k2SW1oMGRIQnpPaTh2YVc0dGRHOTBieTVwYnk5VGRHRjBaVzFsYm5RdmRqRWlMQ0p6ZFdKcVpXTjBJanBiZXlKdVlXMWxJam9pY25WdUxYSmxZMjl5WkNJc0ltUnBaMlZ6ZENJNmV5SnphR0V5TlRZaU9pSmpNek5sWkRZNE9HRmpaV1psTkdabU9HWTJNVFJpTkdJME5ETTROVGxqTW1SaE5HRTBOVGxsTURVM09HUmxaREl4TUdOak1qSXdORE16TlRJMllXRXhJbjE5WFN3aWNISmxaR2xqWVhSbFZIbHdaU0k2SW1oMGRIQnpPaTh2Y0d4cGJYTnZiR3h0WVhKckxtZHBkR2gxWWk1cGJ5OXdiR2x0YzI5c2JDOXlkVzR0Y21WamIzSmtMM1l4SWl3aWNISmxaR2xqWVhSbElqcDdJblpsY25OcGIyNGlPalFzSW5KbGNYVmxjM1JmYzJoaE1qVTJJam9pWXpjNU0yRTFaakk1TkRFM05Ea3dZemcwWm1FMk9XUmtPREl5TTJZMVpqQmtaVEV5TkRFelpqWm1OelE0TWpNMk5tVXpOMlZtTVdOaVpqQTBOamhsTVNJc0luSmxjM1ZzZEY5emFHRXlOVFlpT2lKbFpXVTRNamd6TTJGbFltSmtabVEyTkdKa1ltWmpaVFU0TmpGa01tVmxPVEpoTXpoa016WXpZMkkwWVRGbU9HVTBPR1JrTjJRM09HVXlNak5rTW1Zd0lpd2ljSEp2ZG1sa1pYSWlPaUprYjJOclpYSWlMQ0pwYzI5c1lYUnBiMjRpT2lKclpYSnVaV3dpTENKbGJuWnBjbTl1YldWdWRDSTZJbVJ2WTJ0bGNpMXBiV0ZuWlRwemFHRXlOVFk2TXpKa1lUYzNZakZpWlRJMFpHVTBZekUxTWpZMk4yTXlPR0ZpTmpNMU16RTBNalZqWkRZNU1EQXdZV05tTXpCaE16STRPVGcxWTJJNE5UY3pOemRtTnlJc0luTnZablIzWVhKbFgybGtaVzUwYVhSNUlqb2liMk5wTFcxaGJtbG1aWE4wT214cGJuVjRMMkZ0WkRZMFFITm9ZVEkxTmpwaE5tVm1NbVZoTVdNNFpqRmtaVFZqT0RnMVpURmhNVGhpWVRkbFpUUmtPVFl5WlROaE9EVTVPRGMzWmpabU5EWmpNbVppTjJWaVlXTXhaalpqWXpWaklpd2ljRzlzYVdONUlqb2lJaXdpYzNSaGNuUmxaRjkxYm1sNFgyMXpJam94TnpreU56ZzBNelV3TWpFMUxDSmxibVJsWkY5MWJtbDRYMjF6SWpveE56a3lOemcwTXpVeE56WXpMQ0p6WlhOemFXOXVJam9pSWl3aWMyVnhkV1Z1WTJVaU9qQXNJbkJ5WlhacGIzVnpYM05vWVRJMU5pSTZJaUlzSW5KbFkyOXlaRjl6YUdFeU5UWWlPaUpqTXpObFpEWTRPR0ZqWldabE5HWm1PR1kyTVRSaU5HSTBORE00TlRsak1tUmhOR0UwTlRsbE1EVTNPR1JsWkRJeE1HTmpNakl3TkRNek5USTJZV0V4SW4xOSIsInNpZ25hdHVyZXMiOlt7ImtleWlkIjoiMjM2OGU2YWY4NmZiNzk4NGM1MmVhMzZiMDQyOThhYWZjNDk4YTc0NjFmMTE2ZTBlOTk4ZWZlZDcwMjk3NDU2NyIsInNpZyI6IkJ4QlN3U2JFUFRhNGZmWU1IWVVkSGJYNDNJUkZZSjJxdERLSjhscUc5anhqNnhwbHpxcXZCV01uQTJCbTdDbFpvWjJObTBXUE9EQisrMDRzZXJuT0F3PT0ifV19",
                              "contentType": "application/json",
                              "encoding": "base64"
                            }
                          },
                          "name": "envelope.json"
                        },
                        {
                          "contents": {
                            "attachment": {
                              "content": "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUNvd0JRWURLMlZ3QXlFQUcvRDIySjJBVm1RSzQ0RFUvOUpjYytSM01BaG5Oa09TUnJNMWVxTVBwN1k9Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo=",
                              "contentType": "application/x-pem-file",
                              "encoding": "base64"
                            }
                          },
                          "name": "harness.pub"
                        },
                        {
                          "contents": {
                            "attachment": {
                              "content": "eyJyZXF1ZXN0IjoiQ0FRU0NXTnZiblJoYVc1bGNob05ZV1JoY0hSbGNpMXlkVzR0TkNDUXZ3VmEvNFFDQ29BbENncG9ZWEp1WlhOekxtcHpFdkVrTHk4Z1ZHaGxJSEJzWVhSbWIzSnRKM01nWTI5dVptOXliV0Z1WTJVZ2FHRnlibVZ6Y3pvZ2JHOWhaSE1nWVNCMlpXNWtiM0lnWVdSaGNIUmxjaXdnY25WdWN5QjBhR1VnWTI5dGJXRnVaSE1nYjJZS0x5OGdjR3hoYmk1cWMyOXVJSFJvY205MVoyZ2dhWFFnWVdkaGFXNXpkQ0IwYUdVZ2RtVnVaRzl5SUVGUVNTQjBhR1VnY25WdUozTWdaM0poYm5RZ2NtVmhZMmhsY3l3Z1lXNWtJSEJ5YVc1MGN5QnZibVVLTHk4Z2NtVndiM0owSUd4cGJtVXVDaTh2Q2k4dklDQWdibTlrWlNCb1lYSnVaWE56TG1weklEeHpZMlZ1WVhKcGJ6NGdQR0ZrWVhCMFpYSWdabWxzWlQ0S0x5OEtMeThnVkdobElHaGhjbTVsYzNNZ2FYTWdkR2hsSUhCc1lYUm1iM0p0SjNNZ1kyOWtaVHNnZEdobElHRmtZWEIwWlhJZ2FYTWdkR2hsSUdGblpXNTBKM011SUVKdmRHZ2djblZ1SUdsdWMybGtaU0IwYUdVS0x5OGdjMkZ1WkdKdmVDd2dhVzRnYjI1bElIQnliMk5sYzNNc0lHRnVaQ0IwYUdVZ2IyNXNlU0IzWVhrZ2IzVjBJR2x6SUhSb1pTQnBibXBsWTNSbFpDQmdabXhsWlhSZ0lHTnNhV1Z1ZEM0Z1UyOGdkR2hsQ2k4dklISmxjRzl5ZENCcGN5QjBhR1VnWVdSaGNIUmxjaWR6SUdOc1lXbHRPaUIwYUdVZ2RtVnlaR2xqZENCcGN5QnRZV1JsSUc5dUlIUm9aU0JvYjNOMExDQm1jbTl0SUhSb1pTQndiR0Z1SUdGdVpDQjBhR1VLTHk4Z2RtVnVaRzl5SjNNZ2JHVmtaMlZ5TGlCVWFHVWdjMk5sYm1GeWFXOGdZWEpuZFcxbGJuUWdhWE1nYjI1c2VTQnlaV052Y21SbFpEc2dkR2hsSUdoaGNtNWxjM01nWkc5bGN5QnViM1FnYTI1dmR3b3ZMeUIzYUdGMElIUm9aU0IyWlc1a2IzSWdkMmxzYkNCa2J5NEtJblZ6WlNCemRISnBZM1FpT3dvS1kyOXVjM1FnWm5NZ1BTQnlaWEYxYVhKbEtDSm1jeUlwT3dvS1kyOXVjM1FnYzJObGJtRnlhVzhnUFNCd2NtOWpaWE56TG1GeVozWmJNbDA3Q21OdmJuTjBJR0ZrWVhCMFpYSkdhV3hsSUQwZ2NISnZZMlZ6Y3k1aGNtZDJXek5kT3dvS1kyOXVjM1FnY21Wd2IzSjBJRDBnZXlCelkyVnVZWEpwYnl3Z1lXUmhjSFJsY2pvZ1lXUmhjSFJsY2tacGJHVXNJR052YlhCc1pYUmxaRG9nWm1Gc2MyVXNJR052YlcxaGJtUnpPaUJiWFN3Z2FXNTJaVzUwYjNKcFpYTTZJRnRkTENCd2IyeHNjem9nTUN3Z2NtVjBjbWxsY3pvZ01Dd2daWEp5YjNKek9pQmJYU0I5T3dwamIyNXpkQ0JtWVdsc0lEMGdLRzF6WnlrZ1BUNGdleUJ5WlhCdmNuUXVaWEp5YjNKekxuQjFjMmdvYlhObktUc2dmVHNLWTI5dWMzUWdabWx1YVhOb0lEMGdLR052WkdVcElEMCtJSHNnWTI5dWMyOXNaUzVzYjJjb0lrRkVRVkJVUlZJdFVrVlFUMUpVSUNJZ0t5QktVMDlPTG5OMGNtbHVaMmxtZVNoeVpYQnZjblFwS1RzZ2NISnZZMlZ6Y3k1bGVHbDBLR052WkdVcE95QjlPd3BqYjI1emRDQmxjbkp2Y2s5bUlEMGdLR1VwSUQwK0lDaDdJR1Z5Y205eU9pQlRkSEpwYm1jb0tHVWdKaVlnWlM1dFpYTnpZV2RsS1NCOGZDQmxLUzV6YkdsalpTZ3dMQ0F5TURBcExDQmpiMlJsT2lBb1pTQW1KaUIwZVhCbGIyWWdaUzVqYjJSbElEMDlQU0FpYzNSeWFXNW5JaWtnUHlCbExtTnZaR1VnT2lBaUlpQjlLVHNLTHk4Z1YyaGhkQ0IwYUdVZ1lXUmhjSFJsY2lCeVpYUjFjbTVsWkN3Z1lYTWdTbE5QVGl3Z2MyOGdkR2hsSUdodmMzUWdZMkZ1SUdOb1pXTnJJR2wwY3lCemFHRndaVG9nYm1WMlpYSWdhblZrWjJWa0lHaGxjbVV1Q21OdmJuTjBJSEpoZHlBOUlDaDJLU0E5UGlCN0NpQWdhV1lnS0hZZ1BUMDlJSFZ1WkdWbWFXNWxaQ2tnY21WMGRYSnVJRzUxYkd3N0NpQWdkSEo1SUhzZ1kyOXVjM1FnY3lBOUlFcFRUMDR1YzNSeWFXNW5hV1o1S0hZcE95QnlaWFIxY200Z2N5NXNaVzVuZEdnZ1BEMGdOREE1TmlBL0lFcFRUMDR1Y0dGeWMyVW9jeWtnT2lCN0lIUnlkVzVqWVhSbFpEb2djeTVzWlc1bmRHZ2dmVHNnZlNCallYUmphQ0FvWlNrZ2V5QnlaWFIxY200Z2V5QjFibk5sY21saGJHbDZZV0pzWlRvZ1UzUnlhVzVuS0dVZ0ppWWdaUzV0WlhOellXZGxLU0I5T3lCOUNuMDdDZ3BqYjI1emRDQm5kV0Z5WkNBOUlITmxkRlJwYldWdmRYUW9LQ2tnUFQ0Z2V5Qm1ZV2xzS0NKb1lYSnVaWE56SUhScGJXVnZkWFFnWVdaMFpYSWdOelVnY3lJcE95Qm1hVzVwYzJnb01pazdJSDBzSURjMU1EQXdLVHNLWjNWaGNtUXVkVzV5WldZb0tUc0tDbUZ6ZVc1aklHWjFibU4wYVc5dUlHMWhhVzRvS1NCN0NpQWdhV1lnS0NGelkyVnVZWEpwYnlCOGZDQWhZV1JoY0hSbGNrWnBiR1VwSUhzZ1ptRnBiQ2dpZFhOaFoyVTZJRzV2WkdVZ2FHRnlibVZ6Y3k1cWN5QThjMk5sYm1GeWFXOCtJRHhoWkdGd2RHVnlJR1pwYkdVK0lpazdJSEpsZEhWeWJpQm1hVzVwYzJnb01pazdJSDBLSUNCcFppQW9kSGx3Wlc5bUlHZHNiMkpoYkZSb2FYTXVabXhsWlhRZ0lUMDlJQ0p2WW1wbFkzUWlLU0I3SUdaaGFXd29JbTV2SUdac1pXVjBJR05zYVdWdWRDQnBiaUIwYUdseklISjFiam9nZEdobElHZHlZVzUwSUdseklHMXBjM05wYm1jaUtUc2djbVYwZFhKdUlHWnBibWx6YUNneUtUc2dmUW9nSUd4bGRDQndiR0Z1T3dvZ0lIUnllU0I3SUhCc1lXNGdQU0JLVTA5T0xuQmhjbk5sS0daekxuSmxZV1JHYVd4bFUzbHVZeWdpY0d4aGJpNXFjMjl1SWl3Z0luVjBaamdpS1NrN0lIMGdZMkYwWTJnZ0tHVXBJSHNnWm1GcGJDZ2ljR3hoYmk1cWMyOXVPaUFpSUNzZ1pTNXRaWE56WVdkbEtUc2djbVYwZFhKdUlHWnBibWx6YUNneUtUc2dmUW9nSUd4bGRDQmhaR0Z3ZEdWeU93b2dJSFJ5ZVNCN0lHRmtZWEIwWlhJZ1BTQnlaWEYxYVhKbEtDSXVMeUlnS3lCaFpHRndkR1Z5Um1sc1pTazdJSDBnWTJGMFkyZ2dLR1VwSUhzZ1ptRnBiQ2dpWVdSaGNIUmxjaUJtWVdsc1pXUWdkRzhnYkc5aFpEb2dJaUFySUdVdWJXVnpjMkZuWlNrN0lISmxkSFZ5YmlCbWFXNXBjMmdvTVNrN0lIMEtJQ0JtYjNJZ0tHTnZibk4wSUdadUlHOW1JRnNpYVc1MlpXNTBiM0o1SWl3Z0ltUnBjM0JoZEdOb0lpd2dJbmRoYVhRaUxDQWlZMkZ1WTJWc0lsMHBJSHNLSUNBZ0lHbG1JQ2gwZVhCbGIyWWdZV1JoY0hSbGNsdG1ibDBnSVQwOUlDSm1kVzVqZEdsdmJpSXBJSHNnWm1GcGJDZ2lZV1JoY0hSbGNpQmtiMlZ6SUc1dmRDQmxlSEJ2Y25RZ0lpQXJJR1p1S1RzZ2ZRb2dJSDBLSUNCcFppQW9jbVZ3YjNKMExtVnljbTl5Y3k1c1pXNW5kR2dwSUhKbGRIVnliaUJtYVc1cGMyZ29NU2s3Q2dvZ0lDOHZJREV1SUVsdWRtVnVkRzl5ZVN3Z2NtVmpiM0prWldRZ1lYTWdjbVYwZFhKdVpXUXVDaUFnWTI5dWMzUWdkR0ZyWlVsdWRtVnVkRzl5ZVNBOUlHRnplVzVqSUNncElEMCtJSHNLSUNBZ0lIUnllU0I3SUhKbGNHOXlkQzVwYm5abGJuUnZjbWxsY3k1d2RYTm9LSHNnY21WMGRYSnVaV1E2SUhKaGR5aGhkMkZwZENCaFpHRndkR1Z5TG1sdWRtVnVkRzl5ZVNncEtTd2daWEp5YjNJNklDSWlJSDBwT3lCOUNpQWdJQ0JqWVhSamFDQW9aU2tnZXlCeVpYQnZjblF1YVc1MlpXNTBiM0pwWlhNdWNIVnphQ2g3SUhKbGRIVnlibVZrT2lCdWRXeHNMQ0JsY25KdmNqb2daWEp5YjNKUFppaGxLUzVsY25KdmNpQjlLVHNnZlFvZ0lIMDdDaUFnWVhkaGFYUWdkR0ZyWlVsdWRtVnVkRzl5ZVNncE93b0tJQ0F2THlBeUxpQkVhWE53WVhSamFDQmxkbVZ5ZVNCamIyMXRZVzVrTENCMGFHVnVJSGRoYVhRZ1ptOXlJR1ZoWTJnZ2JXbHpjMmx2Ymk0Z1FXNGdaWEp5YjNJZ2RHaGxJR0ZrWVhCMFpYSWdkR2h5YjNkekNpQWdMeThnSUNBZ2FYTWdjbVZqYjNKa1pXUWdZV2RoYVc1emRDQnBkSE1nWTI5dGJXRnVaQ3dnWVc1a0lIUm9aU0J5ZFc0Z1oyOWxjeUJ2Ymk0S0lDQmpiMjV6ZENCeWIzZHpJRDBnY0d4aGJpNWpiMjF0WVc1a2N5NXRZWEFvS0dNcElEMCtJQ2g3SUdsa09pQmpMbWxrTENCeWIySnZkRG9nWXk1eWIySnZkQ3dnYldsemMybHZiam9nSWlJc0lHUnBjM0JoZEdOb1pXUTZJRzUxYkd3c0lITjBZWFJsT2lBaUlpd2djRzlzYkhNNklEQXNJRzFoZUY5d2IyeHNjem9nTUN3Z2QyRnBkR1ZrT2lCdWRXeHNMQ0JsY25KdmNqb2dJaUlzSUdOdlpHVTZJQ0lpSUgwcEtUc0tJQ0J5WlhCdmNuUXVZMjl0YldGdVpITWdQU0J5YjNkek93b2dJR052Ym5OMElITmxibVFnUFNCaGMzbHVZeUFvWXl3Z2NtOTNLU0E5UGlCN0NpQWdJQ0IwY25rZ2V3b2dJQ0FnSUNCamIyNXpkQ0J0SUQwZ1lYZGhhWFFnWVdSaGNIUmxjaTVrYVhOd1lYUmphQ2hqTG5KdlltOTBMQ0JqTG5SaGNtZGxkQ3dnWXk1cFpDazdDaUFnSUNBZ0lISnZkeTVrYVhOd1lYUmphR1ZrSUQwZ2NtRjNLRzBwT3dvZ0lDQWdJQ0JwWmlBb2RIbHdaVzltSUcwZ1BUMDlJQ0p6ZEhKcGJtY2lJQ1ltSUcwZ0lUMDlJQ0lpS1NCeWIzY3ViV2x6YzJsdmJpQTlJRzA3Q2lBZ0lDQjlJR05oZEdOb0lDaGxLU0I3SUU5aWFtVmpkQzVoYzNOcFoyNG9jbTkzTENCbGNuSnZjazltS0dVcEtUc2dmUW9nSUgwN0NpQWdZMjl1YzNRZ2QyRjBZMmdnUFNCaGMzbHVZeUFvY205M0xDQnRZWGhRYjJ4c2N5a2dQVDRnZXdvZ0lDQWdhV1lnS0NGeWIzY3ViV2x6YzJsdmJpa2djbVYwZFhKdU93b2dJQ0FnY205M0xtMWhlRjl3YjJ4c2N5QTlJRzFoZUZCdmJHeHpPd29nSUNBZ2RISjVJSHNLSUNBZ0lDQWdZMjl1YzNRZ2R5QTlJR0YzWVdsMElHRmtZWEIwWlhJdWQyRnBkQ2h5YjNjdWJXbHpjMmx2Yml3Z2V5QnRZWGhRYjJ4c2N5QjlLVHNLSUNBZ0lDQWdjbTkzTG5kaGFYUmxaQ0E5SUhKaGR5aDNLVHNLSUNBZ0lDQWdjbTkzTG5OMFlYUmxJRDBnS0hjZ0ppWWdkSGx3Wlc5bUlIY3VjM1JoZEdVZ1BUMDlJQ0p6ZEhKcGJtY2lLU0EvSUhjdWMzUmhkR1VnT2lBaUlqc0tJQ0FnSUNBZ2NtOTNMbkJ2Ykd4eklEMGdLSGNnSmlZZ2RIbHdaVzltSUhjdWNHOXNiSE1nUFQwOUlDSnVkVzFpWlhJaUtTQS9JSGN1Y0c5c2JITWdPaUF3T3dvZ0lDQWdJQ0J5WlhCdmNuUXVjRzlzYkhNZ0t6MGdjbTkzTG5CdmJHeHpPd29nSUNBZ0lDQnBaaUFvZHlBbUppQjBlWEJsYjJZZ2R5NXlaWFJ5YVdWeklEMDlQU0FpYm5WdFltVnlJaWtnY21Wd2IzSjBMbkpsZEhKcFpYTWdQU0JOWVhSb0xtMWhlQ2h5WlhCdmNuUXVjbVYwY21sbGN5d2dkeTV5WlhSeWFXVnpLVHNLSUNBZ0lIMGdZMkYwWTJnZ0tHVXBJSHNnVDJKcVpXTjBMbUZ6YzJsbmJpaHliM2NzSUdWeWNtOXlUMllvWlNrcE95QjlDaUFnZlRzS0lDQm1iM0lnS0d4bGRDQnBJRDBnTURzZ2FTQThJSEJzWVc0dVkyOXRiV0Z1WkhNdWJHVnVaM1JvT3lCcEt5c3BJR2xtSUNnaGNHeGhiaTVqYjIxdFlXNWtjMXRwWFM1allXNWpaV3dwSUdGM1lXbDBJSE5sYm1Rb2NHeGhiaTVqYjIxdFlXNWtjMXRwWFN3Z2NtOTNjMXRwWFNrN0NpQWdMeThnVkdobElISmxZV1FnWW5Wa1oyVjBjeXdnTkRBZ1lXNWtJRFVnWW1Wc2IzY3NJR0Z5WlNCeGRXRnNhV1o1TGxkaGFYUkNkV1JuWlhRZ1lXNWtJRU5oYm1ObGJGZGhhWFJDZFdSblpYUXVDaUFnWm05eUlDaHNaWFFnYVNBOUlEQTdJR2tnUENCd2JHRnVMbU52YlcxaGJtUnpMbXhsYm1kMGFEc2dhU3NyS1NCcFppQW9JWEJzWVc0dVkyOXRiV0Z1WkhOYmFWMHVZMkZ1WTJWc0tTQmhkMkZwZENCM1lYUmphQ2h5YjNkelcybGRMQ0EwTUNrN0Nnb2dJQzh2SURNdUlGUm9aU0JqYjIxdFlXNWtjeUIwYUdVZ2NHeGhkR1p2Y20wZ1kyRnVZMlZzY3pvZ1pHbHpjR0YwWTJnc0lHTmhibU5sYkNCaGRDQnZibU5sTENCMGFHVnVJSGRoYVhRdUNpQWdabTl5SUNoc1pYUWdhU0E5SURBN0lHa2dQQ0J3YkdGdUxtTnZiVzFoYm1SekxteGxibWQwYURzZ2FTc3JLU0I3Q2lBZ0lDQnBaaUFvSVhCc1lXNHVZMjl0YldGdVpITmJhVjB1WTJGdVkyVnNLU0JqYjI1MGFXNTFaVHNLSUNBZ0lHRjNZV2wwSUhObGJtUW9jR3hoYmk1amIyMXRZVzVrYzF0cFhTd2djbTkzYzF0cFhTazdDaUFnSUNCcFppQW9jbTkzYzF0cFhTNXRhWE56YVc5dUtTQjdDaUFnSUNBZ0lIUnllU0I3SUdGM1lXbDBJR0ZrWVhCMFpYSXVZMkZ1WTJWc0tISnZkM05iYVYwdWJXbHpjMmx2YmlrN0lIMGdZMkYwWTJnZ0tHVXBJSHNnVDJKcVpXTjBMbUZ6YzJsbmJpaHliM2R6VzJsZExDQmxjbkp2Y2s5bUtHVXBLVHNnZlFvZ0lDQWdJQ0JoZDJGcGRDQjNZWFJqYUNoeWIzZHpXMmxkTENBMUtUc0tJQ0FnSUgwS0lDQjlDZ29nSUM4dklEUXVJRWx1ZG1WdWRHOXllU0JoWjJGcGJpd2dZWE1nZEdobElHeGhjM1FnWTJGc2JDQnZaaUIwYUdVZ2NuVnVMZ29nSUdGM1lXbDBJSFJoYTJWSmJuWmxiblJ2Y25rb0tUc0tDaUFnY21Wd2IzSjBMbU52YlhCc1pYUmxaQ0E5SUhKbGNHOXlkQzVsY25KdmNuTXViR1Z1WjNSb0lEMDlQU0F3T3dvZ0lHWnBibWx6YUNoeVpYQnZjblF1WTI5dGNHeGxkR1ZrSUQ4Z01DQTZJREVwT3dwOUNncHRZV2x1S0NrdVkyRjBZMmdvS0dVcElEMCtJSHNnWm1GcGJDZ2lhR0Z5Ym1WemN5Qmxjbkp2Y2pvZ0lpQXJJQ2hsSUNZbUlHVXViV1Z6YzJGblpTa3BPeUJtYVc1cGMyZ29NU2s3SUgwcE93b0t1eEVLRFdGa1lYQjBaWEl0ZGpFdWFuTVNxUkV2THlCR2JHVmxkQ0IyWlc1a2IzSWdZV1JoY0hSbGNpd2dabWx5YzNRZ2RtVnljMmx2Yml3Z2QzSnBkSFJsYmlCbWNtOXRJRkJTVDAxUVZDNXRaQ0FvZEdobElHTnZiblJ5WVdOMElHRnVaQ0IwYUdVS0x5OGdaR1Z6WTNKcGNIUnBiMjRnWjJWdVpYSmhkR1ZrSUdaeWIyMGdkR2hsSUhabGJtUnZjaWR6SUU5d1pXNUJVRWtnWkc5amRXMWxiblFnWVhNZ2RHaGxlU0J6ZEc5dlpDQjBhR1Z1S1NCaWVTQjBhR1VLTHk4Z1FVa2dkR2hoZENCaWRXbHNkQ0IwYUdseklHVjRZVzF3YkdVc0lHbHVJSFJvWlNCellXMWxJSE5sYzNOcGIyNHNJR0psWm05eVpTQjBhR1VnYkc5emRDMWhZMnR1YjNkc1pXUm5aVzFsYm5RS0x5OGdjMk5sYm1GeWFXOGdaWGhwYzNSbFpDNGdTWFFnYVhNZ2JtOTBJR0Z1SUdsdVpHVndaVzVrWlc1MElHRm5aVzUwSjNNZ1lXNXpkMlZ5T2lCcGRITWdZWFYwYUc5eUlHRnNjMjhnZDNKdmRHVWdkR2hsQ2k4dklHaGhjbTVsYzNNdUlFbDBjeUJqYjJSbElHbHpJSFZ1WTJoaGJtZGxaQ0J6YVc1alpTQnBkQ0IzWVhNZ1ptbHljM1FnWTI5dGJXbDBkR1ZrT3lCdmJteDVJSFJvYVhNZ1kyOXRiV1Z1ZENCM1lYTUtMeThnWTI5eWNtVmpkR1ZrTGlCSmRITWdhVzUyWlc1MGIzSjVLQ2tnYkdsemRITWdkR2hsSUhKdlltOTBjeXdnZEdobGJpQnlaV0ZrY3lCbFlXTm9JRzl1WlNCbWIzSWdhWFJ6SUhOMFlYUmxPaUJ2Ym1VS0x5OGdjbVZ4ZFdWemRDQndaWElnY205aWIzUXVJRWwwY3lCa2FYTndZWFJqYUNncElIQnlaV1JoZEdWeklIUm9aU0JqYjIxdFlXNWtJRWxFSUdGdVpDQnBaMjV2Y21WeklHbDBMZ29pZFhObElITjBjbWxqZENJN0NncGpiMjV6ZENCemJHVmxjQ0E5SUNodGN5a2dQVDRnYm1WM0lGQnliMjFwYzJVb0tISmxjMjlzZG1VcElEMCtJSE5sZEZScGJXVnZkWFFvY21WemIyeDJaU3dnYlhNcEtUc0tiR1YwSUhKbGRISnBaWE1nUFNBd093b0tMeThnVkdobElIWmxibVJ2Y2lCaGJuTjNaWEp6SURVd015QjNhR2xzWlNCcGRDQnBjeUJrWldkeVlXUmxaRHNnZDJGcGRDQmhJR3hwZEhSc1pTQmhibVFnZEhKNUlHRm5ZV2x1TENCaElHSnZkVzVrWldRS0x5OGdiblZ0WW1WeUlHOW1JSFJwYldWekxpQkJibmtnYjNSb1pYSWdaWEp5YjNJZ2FYTWdkR2hsSUdOaGJHeGxjaWR6SUhSdklITmxaUzRLWVhONWJtTWdablZ1WTNScGIyNGdkMmwwYUZKbGRISjVLR1p1S1NCN0NpQWdabTl5SUNoc1pYUWdZWFIwWlcxd2RDQTlJREE3SURzZ1lYUjBaVzF3ZENzcktTQjdDaUFnSUNCMGNua2dld29nSUNBZ0lDQnlaWFIxY200Z1lYZGhhWFFnWm00b0tUc0tJQ0FnSUgwZ1kyRjBZMmdnS0dVcElIc0tJQ0FnSUNBZ1kyOXVjM1FnZEhKaGJuTnBaVzUwSUQwZ0wyaHZjM1FnWVhCcElDZzFNRE44TkRJNUtTOHVkR1Z6ZENoVGRISnBibWNvWlNBbUppQmxMbTFsYzNOaFoyVXBLVHNLSUNBZ0lDQWdhV1lnS0NGMGNtRnVjMmxsYm5RZ2ZId2dZWFIwWlcxd2RDQStQU0EwTUNrZ2RHaHliM2NnWlRzS0lDQWdJQ0FnY21WMGNtbGxjeXNyT3dvZ0lDQWdJQ0JoZDJGcGRDQnpiR1ZsY0NneU5UQXBPd29nSUNBZ2ZRb2dJSDBLZlFvS2JXOWtkV3hsTG1WNGNHOXlkSE1nUFNCN0NpQWdZWE41Ym1NZ2FXNTJaVzUwYjNKNUtDa2dld29nSUNBZ1kyOXVjM1FnYkdsemRDQTlJR0YzWVdsMElIZHBkR2hTWlhSeWVTZ29LU0E5UGlCbWJHVmxkQzVzYVhOMFVtOWliM1J6S0NrcE93b2dJQ0FnWTI5dWMzUWdiM1YwSUQwZ1cxMDdDaUFnSUNCbWIzSWdLR052Ym5OMElITjFiVzFoY25rZ2IyWWdiR2x6ZEM1eWIySnZkSE1wSUhzS0lDQWdJQ0FnWTI5dWMzUWdjbTlpYjNRZ1BTQmhkMkZwZENCM2FYUm9VbVYwY25rb0tDa2dQVDRnWm14bFpYUXVaMlYwVW05aWIzUW9jM1Z0YldGeWVTNXBaQ2twT3dvZ0lDQWdJQ0J2ZFhRdWNIVnphQ2g3SUdsa09pQnliMkp2ZEM1cFpDd2djM1JoZEhWek9pQnliMkp2ZEM1emRHRjBkWE1zSUdKaGRIUmxjbms2SUhKdlltOTBMbUpoZEhSbGNua2dmU2s3Q2lBZ0lDQjlDaUFnSUNCeVpYUjFjbTRnYjNWME93b2dJSDBzQ2dvZ0lHRnplVzVqSUdScGMzQmhkR05vS0hKdlltOTBTV1FzSUhSaGNtZGxkQ2tnZXdvZ0lDQWdZMjl1YzNRZ2JXbHpjMmx2YmlBOUlHRjNZV2wwSUhkcGRHaFNaWFJ5ZVNnb0tTQTlQaUJtYkdWbGRDNWpjbVZoZEdWTmFYTnphVzl1S0hKdlltOTBTV1FzSUhzZ2RHRnlaMlYwSUgwcEtUc0tJQ0FnSUhKbGRIVnliaUJ0YVhOemFXOXVMbTFwYzNOcGIyNWZhV1E3Q2lBZ2ZTd0tDaUFnWVhONWJtTWdkMkZwZENodGFYTnphVzl1U1dRc0lHOXdkSE1wSUhzS0lDQWdJR052Ym5OMElHMWhlRkJ2Ykd4eklEMGdLRzl3ZEhNZ0ppWWdiM0IwY3k1dFlYaFFiMnhzY3lrZ2ZId2dOVEE3Q2lBZ0lDQm1iM0lnS0d4bGRDQndiMnhzY3lBOUlERTdJSEJ2Ykd4eklEdzlJRzFoZUZCdmJHeHpPeUJ3YjJ4c2N5c3JLU0I3Q2lBZ0lDQWdJR052Ym5OMElHMXBjM05wYjI0Z1BTQmhkMkZwZENCM2FYUm9VbVYwY25rb0tDa2dQVDRnWm14bFpYUXVaMlYwVFdsemMybHZiaWh0YVhOemFXOXVTV1FwS1RzS0lDQWdJQ0FnYVdZZ0tHMXBjM05wYjI0dWMzUmhkSFZ6SUQwOVBTQWlaRzl1WlNJZ2ZId2diV2x6YzJsdmJpNXpkR0YwZFhNZ1BUMDlJQ0ptWVdsc1pXUWlJSHg4SUcxcGMzTnBiMjR1YzNSaGRIVnpJRDA5UFNBaVkyRnVZMlZzYkdWa0lpa2dld29nSUNBZ0lDQWdJSEpsZEhWeWJpQjdJSE4wWVhSbE9pQnRhWE56YVc5dUxuTjBZWFIxY3l3Z2NHOXNiSE1zSUhKbGRISnBaWE1nZlRzS0lDQWdJQ0FnZlFvZ0lDQWdJQ0JoZDJGcGRDQnpiR1ZsY0NneU1DazdDaUFnSUNCOUNpQWdJQ0J5WlhSMWNtNGdleUJ6ZEdGMFpUb2dJblJwYldWdmRYUWlMQ0J3YjJ4c2N6b2diV0Y0VUc5c2JITXNJSEpsZEhKcFpYTWdmVHNLSUNCOUxBb0tJQ0JoYzNsdVl5QmpZVzVqWld3b2JXbHpjMmx2Ymtsa0tTQjdDaUFnSUNCaGQyRnBkQ0IzYVhSb1VtVjBjbmtvS0NrZ1BUNGdabXhsWlhRdVkyRnVZMlZzVFdsemMybHZiaWh0YVhOemFXOXVTV1FwS1RzS0lDQjlMQXA5T3dvS25TQUtEV0ZrWVhCMFpYSXRkakl1YW5NU2l5QXZMeUJHYkdWbGRDQjJaVzVrYjNJZ1lXUmhjSFJsY2l3Z2MyVmpiMjVrSUhabGNuTnBiMjQ2SUhSM2J5QmphR0Z1WjJWeklHRm1kR1Z5SUhSb1pTQm1hWEp6ZENCM1lYTWdjWFZoYkdsbWFXVmtMZ292THlCcGJuWmxiblJ2Y25rb0tTQnlaV0ZrY3lCMGFHVWdiR2x6ZENCdmJtTmxMQ0J6YVc1alpTQjBhR1VnY0hKdlptbHNaU0JrWldOc1lYSmxjeUJIUlZRZ0wzSnZZbTkwY3lCMGFHVWdZbUYwWTJnS0x5OGdabTl5YlNCdlppQkhSVlFnTDNKdlltOTBjeThxSUNoMGFHVWdZV1IyYVhOdmNpZHpJR1pwYm1ScGJtY3BMaUJrYVhOd1lYUmphQ2dwSUc1aGJXVnpJR1YyWlhKNUlHOXlaR1Z5SUhkcGRHZ2dkR2hsQ2k4dklIQnNZWFJtYjNKdEozTWdZMjl0YldGdVpDQkpSQ0JoYm1Rc0lIZG9aVzRnZEdobElIWmxibVJ2Y2lkeklHRnVjM2RsY2lCcGN5QmhiaUJsY25KdmNpQnZjaUJ1WlhabGNpQmpiMjFsY3l3Z2MyVnVaSE1LTHk4Z2RHaGxJSE5oYldVZ1kzSmxZWFJsSUdGbllXbHVPaUIwYUdVZ2RtVnVaRzl5SUdGdWMzZGxjbk1nWVNCeVpYQmxZWFJsWkNCamIyMXRZVzVrWDJsa0lIZHBkR2dnZEdobElHOXlaR1Z5SUdsMENpOHZJR0ZzY21WaFpIa2dhR0Z6TENCemJ5QmhJSEpsZEhKNUlHTmhibTV2ZENCd2JHRmpaU0JoSUhObFkyOXVaQ0J2Y21SbGNpd2dZVzVrSUhSb1pTQnRhWE56YVc5dUlISmxkSFZ5Ym1Wa0lHbHpJSFJvWlFvdkx5QnZibVVnZEdocGN5QmpiMjF0WVc1a0lHTnlaV0YwWldRdUlFbDBJRzVsZG1WeUlISmxZV1J6SUdFZ2NtOWliM1FuY3lCamRYSnlaVzUwSUcxcGMzTnBiMjRnZEc4Z1ozVmxjM01nZDJocFkyZ0tMeThnYjNKa1pYSWdhWE1nYVhSeklHOTNiaTRLTHk4S0x5OGdWSGR2SUd4aGRHVnlJSEpsY0dGcGNuTXNJR0ZtZEdWeUlHWjFjblJvWlhJZ2RHVnpkR2x1WnpvZ1lXNGdaWEp5YjNJZ2FYTWdZU0J5WldaMWMyRnNJRzl1YkhrZ2QyaGxiaUJwZENCellYbHpJSE52Q2k4dklDaGhiaUJsWVhKc2FXVnlJSFpsY25OcGIyNGdkRzl2YXlCaElEVXdNQ0JoY3lCdmJtVXNJR0Z1WkNCeVpYQnZjblJsWkNBaWNtVm1kWE5sWkNJZ1ptOXlJR0Z1SUc5eVpHVnlJSFJvWlNCMlpXNWtiM0lLTHk4Z2FHRmtJR0ZqWTJWd2RHVmtJR0psWm05eVpTQmhibk4zWlhKcGJtY2dOVEF3S1RzZ2QyRnBkQ2dwSjNNZ2JXRjRVRzlzYkhNZ1ltOTFibVJ6SUdWMlpYSjVJSE4wWVhSMWN5QnlaV0ZrTENCbVlXbHNaV1FLTHk4Z2IyNWxjeUJwYm1Oc2RXUmxaQ0FvWVc0Z1pXRnliR2xsY2lCMlpYSnphVzl1SUhKbGRISnBaV1FnWldGamFDQnlaV0ZrSUhWd0lIUnZJRFF3SUhScGJXVnpLVHNnWVc1a0lHRWdjM1JoZEhWekNpOHZJR0Z1YzNkbGNpQnVZVzFwYm1jZ1lXNXZkR2hsY2lCdGFYTnphVzl1SUdseklHRWdabUZwYkdWa0lISmxZV1FzSUc1bGRtVnlJSFJvYVhNZ2JXbHpjMmx2YmlkeklITjBZWFJsTGdvaWRYTmxJSE4wY21samRDSTdDZ3BqYjI1emRDQkJWRlJGVFZCVVV5QTlJRFF3T3lBdkx5QmpZV3hzY3lCdmJtVWdiM0JsY21GMGFXOXVJRzFoZVNCdFlXdGxMQ0J5WlhSeWFXVnpJR2x1WTJ4MVpHVmtDbU52Ym5OMElITnNaV1Z3SUQwZ0tHMXpLU0E5UGlCdVpYY2dVSEp2YldselpTZ29jbVZ6YjJ4MlpTa2dQVDRnYzJWMFZHbHRaVzkxZENoeVpYTnZiSFpsTENCdGN5a3BPd3BzWlhRZ2NtVjBjbWxsY3lBOUlEQTdDZ3BqYjI1emRDQnpkR0YwZFhOUFppQTlJQ2hsS1NBOVBpQk9kVzFpWlhJb0tGTjBjbWx1WnlobElDWW1JR1V1YldWemMyRm5aU2t1YldGMFkyZ29MMmh2YzNRZ1lYQnBJQ2hjWkhzemZTa3ZLU0I4ZkNCYlhTbGJNVjBnZkh3Z01DazdDZ292THlCQklHUmxabWx1YVhSbElISmxablZ6WVd3NklIUm9aU0IyWlc1a2IzSWdjMkZwWkNCdWJ5QW9ZU0EwZUhnZ2IzUm9aWElnZEdoaGJpQTBNRGdnZEdsdFpXOTFkQ0JoYm1RZ05ESTVJSFJ2YnlCdFlXNTVDaTh2SUhKbGNYVmxjM1J6S1N3Z2IzSWdkR2hsSUdOc2FXVnVkQ0J1WlhabGNpQnpaVzUwSUhSb1pTQmpZV3hzTGlCQmJubDBhR2x1WnlCbGJITmxJQ2hoSURWNGVDd2dZU0EwTURnZ2IzSWdOREk1TENCdWJ3b3ZMeUJoYm5OM1pYSWdZWFFnWVd4c0tTQnNaV0YyWlhNZ2RHaGxJRzkxZEdOdmJXVWdkVzVyYm05M2Jqb2dkR2hsSUhKbGNYVmxjM1FnYldGNUlHOXlJRzFoZVNCdWIzUWdhR0YyWlNCMFlXdGxiaUJsWm1abFkzUXVDbU52Ym5OMElISmxablZ6WldRZ1BTQW9aU2tnUFQ0Z2V3b2dJR052Ym5OMElITWdQU0J6ZEdGMGRYTlBaaWhsS1RzS0lDQnlaWFIxY200Z0tITWdQajBnTkRBd0lDWW1JSE1nUENBMU1EQWdKaVlnY3lBaFBUMGdOREE0SUNZbUlITWdJVDA5SURReU9Ta2dmSHdnTDI1dmRDQndaWEp0YVhSMFpXUWdZbmtnYzJGdVpHSnZlQ0JqWVhCaFltbHNhWFI1THk1MFpYTjBLRk4wY21sdVp5aGxJQ1ltSUdVdWJXVnpjMkZuWlNrcE93cDlPd29LWTI5dWMzUWdabUZwYkhWeVpTQTlJQ2hqYjJSbExDQnRaWE56WVdkbEtTQTlQaUJQWW1wbFkzUXVZWE56YVdkdUtHNWxkeUJGY25KdmNpaHRaWE56WVdkbEtTd2dleUJqYjJSbElIMHBPd29LTHk4Z1VtVmhaSE1nWVc1a0lHTmhibU5sYkhNZ1lYSmxJSE5oWm1VZ2RHOGdjbVZ3WldGME9pQjBjbmtnZFhBZ2RHOGdRVlJVUlUxUVZGTWdkR2x0WlhNZ2QyaHBiR1VnZEdobElHOTFkR052YldVZ2FYTWdkVzVyYm05M2JpNEtZWE41Ym1NZ1puVnVZM1JwYjI0Z2QybDBhRkpsZEhKNUtHWnVLU0I3Q2lBZ1ptOXlJQ2hzWlhRZ1lYUjBaVzF3ZENBOUlERTdJRHNnWVhSMFpXMXdkQ3NyS1NCN0NpQWdJQ0IwY25rZ2V3b2dJQ0FnSUNCeVpYUjFjbTRnWVhkaGFYUWdabTRvS1RzS0lDQWdJSDBnWTJGMFkyZ2dLR1VwSUhzS0lDQWdJQ0FnYVdZZ0tISmxablZ6WldRb1pTa2dmSHdnWVhSMFpXMXdkQ0ErUFNCQlZGUkZUVkJVVXlrZ2RHaHliM2NnWlRzS0lDQWdJQ0FnY21WMGNtbGxjeXNyT3dvZ0lDQWdJQ0JoZDJGcGRDQnpiR1ZsY0NneU5UQXBPd29nSUNBZ2ZRb2dJSDBLZlFvS2JXOWtkV3hsTG1WNGNHOXlkSE1nUFNCN0NpQWdZWE41Ym1NZ2FXNTJaVzUwYjNKNUtDa2dld29nSUNBZ1kyOXVjM1FnYkdsemRDQTlJR0YzWVdsMElIZHBkR2hTWlhSeWVTZ29LU0E5UGlCbWJHVmxkQzVzYVhOMFVtOWliM1J6S0NrcE93b2dJQ0FnY21WMGRYSnVJR3hwYzNRdWNtOWliM1J6TG0xaGNDZ29jbTlpYjNRcElEMCtJQ2g3SUdsa09pQnliMkp2ZEM1cFpDd2djM1JoZEhWek9pQnliMkp2ZEM1emRHRjBkWE1zSUdKaGRIUmxjbms2SUhKdlltOTBMbUpoZEhSbGNua2dmU2twT3dvZ0lIMHNDZ29nSUdGemVXNWpJR1JwYzNCaGRHTm9LSEp2WW05MFNXUXNJSFJoY21kbGRDd2dZMjl0YldGdVpFbGtLU0I3Q2lBZ0lDQm1iM0lnS0d4bGRDQmhkSFJsYlhCMElEMGdNVHNnT3lCaGRIUmxiWEIwS3lzcElIc0tJQ0FnSUNBZ2RISjVJSHNLSUNBZ0lDQWdJQ0JqYjI1emRDQnRhWE56YVc5dUlEMGdZWGRoYVhRZ1pteGxaWFF1WTNKbFlYUmxUV2x6YzJsdmJpaHliMkp2ZEVsa0xDQjdJSFJoY21kbGRDd2dZMjl0YldGdVpGOXBaRG9nWTI5dGJXRnVaRWxrSUgwcE93b2dJQ0FnSUNBZ0lISmxkSFZ5YmlCdGFYTnphVzl1TG0xcGMzTnBiMjVmYVdRN0NpQWdJQ0FnSUgwZ1kyRjBZMmdnS0dVcElIc0tJQ0FnSUNBZ0lDQnBaaUFvY21WbWRYTmxaQ2hsS1NrZ2RHaHliM2NnWm1GcGJIVnlaU2dpY21WbWRYTmxaQ0lzSUNKamIyMXRZVzVrSUNJZ0t5QmpiMjF0WVc1a1NXUWdLeUFpSUhkaGN5QnViM1FnY0d4aFkyVmtPaUFpSUNzZ1pTNXRaWE56WVdkbEtUc0tJQ0FnSUNBZ0lDQnBaaUFvWVhSMFpXMXdkQ0ErUFNCQlZGUkZUVkJVVXlrZ2RHaHliM2NnWm1GcGJIVnlaU2dpZFc1eVpYTnZiSFpsWkNJc0lDSmpiMjF0WVc1a0lDSWdLeUJqYjIxdFlXNWtTV1FnS3lBaU9pQnVieUJoYm5OM1pYSWdZV1owWlhJZ0lpQXJJR0YwZEdWdGNIUWdLeUFpSUdGMGRHVnRjSFJ6T3lCMGFHVWdkbVZ1Wkc5eUlHMWhlU0J2Y2lCdFlYa2dibTkwSUdodmJHUWdkR2hsSUc5eVpHVnlJaWs3Q2lBZ0lDQWdJQ0FnY21WMGNtbGxjeXNyT3dvZ0lDQWdJQ0FnSUdGM1lXbDBJSE5zWldWd0tESTFNQ2s3Q2lBZ0lDQWdJSDBLSUNBZ0lIMEtJQ0I5TEFvS0lDQXZMeUJ0WVhoUWIyeHNjeUJwY3lCMGFHVWdiblZ0WW1WeUlHOW1JSE4wWVhSMWN5QnlaV0ZrY3l3Z1ptRnBiR1ZrSUc5dVpYTWdhVzVqYkhWa1pXUTdJREFnYldGclpYTWdibTl1WlM0S0lDQmhjM2x1WXlCM1lXbDBLRzFwYzNOcGIyNUpaQ3dnYjNCMGN5a2dld29nSUNBZ1kyOXVjM1FnYldGNFVHOXNiSE1nUFNCdmNIUnpJQ1ltSUU1MWJXSmxjaTVwYzBsdWRHVm5aWElvYjNCMGN5NXRZWGhRYjJ4c2N5a2dKaVlnYjNCMGN5NXRZWGhRYjJ4c2N5QStQU0F3SUQ4Z2IzQjBjeTV0WVhoUWIyeHNjeUE2SURVd093b2dJQ0FnYkdWMElIQnZiR3h6SUQwZ01Ec0tJQ0FnSUhkb2FXeGxJQ2h3YjJ4c2N5QThJRzFoZUZCdmJHeHpLU0I3Q2lBZ0lDQWdJSEJ2Ykd4ekt5czdDaUFnSUNBZ0lIUnllU0I3Q2lBZ0lDQWdJQ0FnWTI5dWMzUWdiV2x6YzJsdmJpQTlJR0YzWVdsMElHWnNaV1YwTG1kbGRFMXBjM05wYjI0b2JXbHpjMmx2Ymtsa0tUc0tJQ0FnSUNBZ0lDQnBaaUFvSVcxcGMzTnBiMjRnZkh3Z2JXbHpjMmx2Ymk1cFpDQWhQVDBnYldsemMybHZia2xrS1NCN0NpQWdJQ0FnSUNBZ0lDQXZMeUJCYmlCaGJuTjNaWElnWVdKdmRYUWdZVzV2ZEdobGNpQnRhWE56YVc5dUlHbHpJRzV2SUdGdWMzZGxjaUJoWW05MWRDQjBhR2x6SUc5dVpUb2dZU0JtWVdsc1pXUWdjbVZoWkM0S0lDQWdJQ0FnSUNBZ0lISmxkSEpwWlhNckt6c0tJQ0FnSUNBZ0lDQWdJR2xtSUNod2IyeHNjeUE4SUcxaGVGQnZiR3h6S1NCaGQyRnBkQ0J6YkdWbGNDZ3lOVEFwT3dvZ0lDQWdJQ0FnSUNBZ1kyOXVkR2x1ZFdVN0NpQWdJQ0FnSUNBZ2ZRb2dJQ0FnSUNBZ0lHbG1JQ2h0YVhOemFXOXVMbk4wWVhSMWN5QTlQVDBnSW1SdmJtVWlJSHg4SUcxcGMzTnBiMjR1YzNSaGRIVnpJRDA5UFNBaVptRnBiR1ZrSWlCOGZDQnRhWE56YVc5dUxuTjBZWFIxY3lBOVBUMGdJbU5oYm1ObGJHeGxaQ0lwSUhzS0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCN0lITjBZWFJsT2lCdGFYTnphVzl1TG5OMFlYUjFjeXdnY0c5c2JITXNJSEpsZEhKcFpYTWdmVHNLSUNBZ0lDQWdJQ0I5Q2lBZ0lDQWdJQ0FnYVdZZ0tIQnZiR3h6SUR3Z2JXRjRVRzlzYkhNcElHRjNZV2wwSUhOc1pXVndLREl3S1RzS0lDQWdJQ0FnZlNCallYUmphQ0FvWlNrZ2V3b2dJQ0FnSUNBZ0lHbG1JQ2h5WldaMWMyVmtLR1VwS1NCMGFISnZkeUJsT3dvZ0lDQWdJQ0FnSUhKbGRISnBaWE1yS3pzS0lDQWdJQ0FnSUNCcFppQW9jRzlzYkhNZ1BDQnRZWGhRYjJ4c2N5a2dZWGRoYVhRZ2MyeGxaWEFvTWpVd0tUc0tJQ0FnSUNBZ2ZRb2dJQ0FnZlFvZ0lDQWdjbVYwZFhKdUlIc2djM1JoZEdVNklDSjBhVzFsYjNWMElpd2djRzlzYkhNc0lISmxkSEpwWlhNZ2ZUc0tJQ0I5TEFvS0lDQmhjM2x1WXlCallXNWpaV3dvYldsemMybHZia2xrS1NCN0NpQWdJQ0JoZDJGcGRDQjNhWFJvVW1WMGNua29LQ2tnUFQ0Z1pteGxaWFF1WTJGdVkyVnNUV2x6YzJsdmJpaHRhWE56YVc5dVNXUXBLVHNLSUNCOUxBcDlPd29LNUFFS0dXSnliMnRsYmk5bGJYQjBlUzFwYm5abGJuUnZjbmt1YW5NU3hnRXZMeUJDY205clpXNGdiMjRnY0hWeWNHOXpaVG9nZEdobElITmxZMjl1WkNCaFpHRndkR1Z5SUhkb2IzTmxJR2x1ZG1WdWRHOXllU2dwSUhKbGNHOXlkSE1nYm04Z2NtOWliM1J6TGdvaWRYTmxJSE4wY21samRDSTdDbU52Ym5OMElHSmhjMlVnUFNCeVpYRjFhWEpsS0NJdUxpOWhaR0Z3ZEdWeUxYWXlMbXB6SWlrN0NtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ2V5QXVMaTVpWVhObExDQmhjM2x1WXlCcGJuWmxiblJ2Y25rb0tTQjdJSEpsZEhWeWJpQmJYVHNnZlNCOU93b0szQUlLRjJKeWIydGxiaTltWVd4elpTMXpkV05qWlhOekxtcHpFc0FDTHk4Z1FuSnZhMlZ1SUc5dUlIQjFjbkJ2YzJVNklIUm9aU0J6WldOdmJtUWdZV1JoY0hSbGNpQnlaWEJ2Y25ScGJtY2dZU0JtWVdsc1pXUWdiV2x6YzJsdmJpQmhjeUJrYjI1bExnb2lkWE5sSUhOMGNtbGpkQ0k3Q21OdmJuTjBJR0poYzJVZ1BTQnlaWEYxYVhKbEtDSXVMaTloWkdGd2RHVnlMWFl5TG1weklpazdDbTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdld29nSUM0dUxtSmhjMlVzQ2lBZ1lYTjVibU1nZDJGcGRDaHRhWE56YVc5dVNXUXNJRzl3ZEhNcElIc0tJQ0FnSUdOdmJuTjBJSGNnUFNCaGQyRnBkQ0JpWVhObExuZGhhWFFvYldsemMybHZia2xrTENCdmNIUnpLVHNLSUNBZ0lISmxkSFZ5YmlCN0lDNHVMbmNzSUhOMFlYUmxPaUIzTG5OMFlYUmxJRDA5UFNBaVptRnBiR1ZrSWlBL0lDSmtiMjVsSWlBNklIY3VjM1JoZEdVZ2ZUc0tJQ0I5TEFwOU93b0syQUlLR0dKeWIydGxiaTlwYm5abGJuUmxaQzF5YjJKdmRDNXFjeEs3QWk4dklFSnliMnRsYmlCdmJpQndkWEp3YjNObE9pQjBhR1VnYzJWamIyNWtJR0ZrWVhCMFpYSWdkMmh2YzJVZ2FXNTJaVzUwYjNKNUtDa2djbVZ3YjNKMGN5QmhJSEp2WW05MElIUm9aU0IyWlc1a2IzSUtMeThnWkc5bGN5QnViM1FnYUdGMlpTd2dhVzRnWVNCemRHRjBkWE1nZEdobElHTnZiblJ5WVdOMElHUnZaWE1nYm05MElHaGhkbVV1Q2lKMWMyVWdjM1J5YVdOMElqc0tZMjl1YzNRZ1ltRnpaU0E5SUhKbGNYVnBjbVVvSWk0dUwyRmtZWEIwWlhJdGRqSXVhbk1pS1RzS2JXOWtkV3hsTG1WNGNHOXlkSE1nUFNCN0lDNHVMbUpoYzJVc0lHRnplVzVqSUdsdWRtVnVkRzl5ZVNncElIc2djbVYwZFhKdUlGdDdJR2xrT2lBaWFXMWhaMmx1WVhKNUlpd2djM1JoZEhWek9pQWlZbUZ1WVc1aElpd2dZbUYwZEdWeWVUb2dMVFV3SUgxZE95QjlJSDA3Q2dySUFRb1RZbkp2YTJWdUwyNXZMV05oYm1ObGJDNXFjeEt3QVM4dklFSnliMnRsYmlCdmJpQndkWEp3YjNObE9pQjBhR1VnYzJWamIyNWtJR0ZrWVhCMFpYSWdkMmh2YzJVZ1kyRnVZMlZzS0NrZ2MyVnVaSE1nYm05MGFHbHVaeTRLSW5WelpTQnpkSEpwWTNRaU93cGpiMjV6ZENCaVlYTmxJRDBnY21WeGRXbHlaU2dpTGk0dllXUmhjSFJsY2kxMk1pNXFjeUlwT3dwdGIyUjFiR1V1Wlhod2IzSjBjeUE5SUhzZ0xpNHVZbUZ6WlN3Z1lYTjVibU1nWTJGdVkyVnNLQ2tnZTMwZ2ZUc0tDc1VDQ2hKaWNtOXJaVzR2Ym04dGMzUmhkR1V1YW5NU3JnSXZMeUJDY205clpXNGdiMjRnY0hWeWNHOXpaVG9nZEdobElITmxZMjl1WkNCaFpHRndkR1Z5SUhkb2IzTmxJSGRoYVhRb0tTQmtiMlZ6SUhSb1pTQnlaV0ZrY3lCaGJtUWdkR2hsYmlCeVpYQnZjblJ6SUdFS0x5OGdZMjkxYm5RZ2QybDBhQ0J1YnlCemRHRjBaUzRLSW5WelpTQnpkSEpwWTNRaU93cGpiMjV6ZENCaVlYTmxJRDBnY21WeGRXbHlaU2dpTGk0dllXUmhjSFJsY2kxMk1pNXFjeUlwT3dwdGIyUjFiR1V1Wlhod2IzSjBjeUE5SUhzZ0xpNHVZbUZ6WlN3Z1lYTjVibU1nZDJGcGRDaHRhWE56YVc5dVNXUXNJRzl3ZEhNcElIc2dZMjl1YzNRZ2R5QTlJR0YzWVdsMElHSmhjMlV1ZDJGcGRDaHRhWE56YVc5dVNXUXNJRzl3ZEhNcE95QnlaWFIxY200Z2V5QndiMnhzY3pvZ2R5NXdiMnhzY3lCOU95QjlJSDA3Q2dyeUFnb1hZbkp2YTJWdUwzUm9jbTkzYVc1bkxYZGhhWFF1YW5NUzFnSXZMeUJDY205clpXNGdiMjRnY0hWeWNHOXpaVG9nZEdobElITmxZMjl1WkNCaFpHRndkR1Z5SUhkb2IzTmxJSGRoYVhRb0tTQm1iMnhzYjNkeklIUm9aU0J0YVhOemFXOXVJSFJ2SUdsMGN5QmxibVFzQ2k4dklIUm9aVzRnZEdoeWIzZHpJR2x1YzNSbFlXUWdiMllnY21WMGRYSnVhVzVuSUdsMGN5QnpkR0YwWlM0S0luVnpaU0J6ZEhKcFkzUWlPd3BqYjI1emRDQmlZWE5sSUQwZ2NtVnhkV2x5WlNnaUxpNHZZV1JoY0hSbGNpMTJNaTVxY3lJcE93cHRiMlIxYkdVdVpYaHdiM0owY3lBOUlIc2dMaTR1WW1GelpTd2dZWE41Ym1NZ2QyRnBkQ2h0YVhOemFXOXVTV1FzSUc5d2RITXBJSHNnWVhkaGFYUWdZbUZ6WlM1M1lXbDBLRzFwYzNOcGIyNUpaQ3dnYjNCMGN5azdJSFJvY205M0lHNWxkeUJGY25KdmNpZ2lkMkZwZENCbVlXbHNaV1FnWVdaMFpYSWdkR2hsSUcxcGMzTnBiMjRnWlc1a1pXUWlLVHNnZlNCOU93b0tvUVVLSDJKeWIydGxiaTkxYm1GdWMzZGxjbVZrTFdGekxYSmxablZ6WldRdWFuTVMvUVF2THlCQ2NtOXJaVzRnYjI0Z2NIVnljRzl6WlRvZ2RHaGxJSE5sWTI5dVpDQmhaR0Z3ZEdWeUxDQmxlR05sY0hRZ2RHaGhkQ0JoSUdOeVpXRjBaU0IwYUdVZ2RtVnVaRzl5SUc1bGRtVnlJR0Z1YzNkbGNuTWdhWE1LTHk4Z1oybDJaVzRnZFhBZ1lXWjBaWElnZEdoeVpXVWdkSEpwWlhNZ1lXNWtJSEpsY0c5eWRHVmtJR0Z6SUhKbFpuVnpaV1FzSUdGeklHbG1JSFJvWlNCMlpXNWtiM0lnYUdGa0lITmhhV1FnYm04dUNpSjFjMlVnYzNSeWFXTjBJanNLWTI5dWMzUWdZbUZ6WlNBOUlISmxjWFZwY21Vb0lpNHVMMkZrWVhCMFpYSXRkakl1YW5NaUtUc0tiVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQjdDaUFnTGk0dVltRnpaU3dLSUNCaGMzbHVZeUJrYVhOd1lYUmphQ2h5YjJKdmRFbGtMQ0IwWVhKblpYUXNJR052YlcxaGJtUkpaQ2tnZXdvZ0lDQWdiR1YwSUd4aGMzUTdDaUFnSUNCbWIzSWdLR3hsZENCaGRIUmxiWEIwSUQwZ01Uc2dZWFIwWlcxd2RDQThQU0F6T3lCaGRIUmxiWEIwS3lzcElIc0tJQ0FnSUNBZ2RISjVJSHNnY21WMGRYSnVJQ2hoZDJGcGRDQm1iR1ZsZEM1amNtVmhkR1ZOYVhOemFXOXVLSEp2WW05MFNXUXNJSHNnZEdGeVoyVjBMQ0JqYjIxdFlXNWtYMmxrT2lCamIyMXRZVzVrU1dRZ2ZTa3BMbTFwYzNOcGIyNWZhV1E3SUgwZ1kyRjBZMmdnS0dVcElIc2diR0Z6ZENBOUlHVTdJSDBLSUNBZ0lIMEtJQ0FnSUhSb2NtOTNJRTlpYW1WamRDNWhjM05wWjI0b2JtVjNJRVZ5Y205eUtDSmpiMjF0WVc1a0lDSWdLeUJqYjIxdFlXNWtTV1FnS3lBaUlIZGhjeUJ1YjNRZ2NHeGhZMlZrT2lBaUlDc2diR0Z6ZEM1dFpYTnpZV2RsS1N3Z2V5QmpiMlJsT2lBaWNtVm1kWE5sWkNJZ2ZTazdDaUFnZlN3S2ZUc0tDdGNEQ2h4aWNtOXJaVzR2ZFc1a1pYSmpiM1Z1ZEdWa0xYSmxZV1J6TG1wekVyWURMeThnUW5KdmEyVnVJRzl1SUhCMWNuQnZjMlU2SUhSb1pTQnpaV052Ym1RZ1lXUmhjSFJsY2lCM2FHOXpaU0IzWVdsMEtDa2djbVZoWkhNZ2RHaGxJRzFwYzNOcGIyNGdiMjVqWlNCdGIzSmxJSFJvWVc0S0x5OGdhWFJ6SUdKMVpHZGxkQ0JoYkd4dmQzTXNJSFJvWlc0Z2NtVndiM0owY3lCaElITnBibWRzWlNCeVpXRmtMZ29pZFhObElITjBjbWxqZENJN0NtTnZibk4wSUdKaGMyVWdQU0J5WlhGMWFYSmxLQ0l1TGk5aFpHRndkR1Z5TFhZeUxtcHpJaWs3Q20xdlpIVnNaUzVsZUhCdmNuUnpJRDBnZXdvZ0lDNHVMbUpoYzJVc0NpQWdZWE41Ym1NZ2QyRnBkQ2h0YVhOemFXOXVTV1FzSUc5d2RITXBJSHNLSUNBZ0lHTnZibk4wSUhjZ1BTQmhkMkZwZENCaVlYTmxMbmRoYVhRb2JXbHpjMmx2Ymtsa0xDQnZjSFJ6S1RzS0lDQWdJR1p2Y2lBb2JHVjBJRzRnUFNCM0xuQnZiR3h6T3lCdUlEdzlJRzl3ZEhNdWJXRjRVRzlzYkhNN0lHNHJLeWtnWVhkaGFYUWdabXhsWlhRdVoyVjBUV2x6YzJsdmJpaHRhWE56YVc5dVNXUXBPd29nSUNBZ2NtVjBkWEp1SUhzZ2MzUmhkR1U2SUhjdWMzUmhkR1VzSUhCdmJHeHpPaUF4SUgwN0NpQWdmU3dLZlRzS0N0Y0NDaFZpY205clpXNHZkM0p2Ym1jdGNtOWliM1F1YW5NU3ZRSXZMeUJDY205clpXNGdiMjRnY0hWeWNHOXpaVG9nZEdobElITmxZMjl1WkNCaFpHRndkR1Z5SUhkcGRHZ2djakVuY3lCdmNtUmxjbk1nYzJWdWRDQjBieUJ5TXk0Z1JYWmxjbmtnYldsemMybHZiaUJwZEFvdkx5QnlaWEJ2Y25SeklHVjRhWE4wY3lCaGJtUWdaVzVrY3lCa2IyNWxMZ29pZFhObElITjBjbWxqZENJN0NtTnZibk4wSUdKaGMyVWdQU0J5WlhGMWFYSmxLQ0l1TGk5aFpHRndkR1Z5TFhZeUxtcHpJaWs3Q20xdlpIVnNaUzVsZUhCdmNuUnpJRDBnZXlBdUxpNWlZWE5sTENCa2FYTndZWFJqYURvZ0tISnZZbTkwU1dRc0lIUmhjbWRsZEN3Z1kyOXRiV0Z1WkVsa0tTQTlQaUJpWVhObExtUnBjM0JoZEdOb0tISnZZbTkwU1dRZ1BUMDlJQ0p5TVNJZ1B5QWljak1pSURvZ2NtOWliM1JKWkN3Z2RHRnlaMlYwTENCamIyMXRZVzVrU1dRcElIMDdDZ3J6QWdvV1luSnZhMlZ1TDNkeWIyNW5MWFJoY21kbGRDNXFjeExZQWk4dklFSnliMnRsYmlCdmJpQndkWEp3YjNObE9pQjBhR1VnYzJWamIyNWtJR0ZrWVhCMFpYSWdkMmwwYUNCbGRtVnllU0J2Y21SbGNpQnpaVzUwSUhSdklDZ3dMQ0F3S1M0Z1NYUnpJSEpsY0c5eWRBb3ZMeUJ6ZEdGNWN5QndiR0YxYzJsaWJHVTZJR1ZoWTJnZ2JXbHpjMmx2YmlCbGJtUnpJR1J2Ym1Vc0lHRjBJSFJvWlNCMFlYSm5aWFFnZEdobElIWmxibVJ2Y2lCM1lYTWdaMmwyWlc0dUNpSjFjMlVnYzNSeWFXTjBJanNLWTI5dWMzUWdZbUZ6WlNBOUlISmxjWFZwY21Vb0lpNHVMMkZrWVhCMFpYSXRkakl1YW5NaUtUc0tiVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQjdJQzR1TG1KaGMyVXNJR1JwYzNCaGRHTm9PaUFvY205aWIzUkpaQ3dnZEdGeVoyVjBMQ0JqYjIxdFlXNWtTV1FwSUQwK0lHSmhjMlV1WkdsemNHRjBZMmdvY205aWIzUkpaQ3dnZXlCNE9pQXdMQ0I1T2lBd0lIMHNJR052YlcxaGJtUkpaQ2tnZlRzS0NxVVNDZ2h3Y205aVpTNXFjeEtZRWk4dklGUm9aU0JpYjNWdVpHRnllU0J3Y205aVpTNGdUbTkwSUdGdUlHRmtZWEIwWlhJNklHRWdjM1JsY0NCMGFHRjBJSFJ5YVdWekxDQm1jbTl0SUdsdWMybGtaU0IwYUdVZ2MyRnRaU0J5ZFc0Z1lXNWtDaTh2SUhWdVpHVnlJSFJvWlNCellXMWxJR2R5WVc1MExDQjBhR1VnZEdoeVpXVWdkR2hwYm1keklHaHZjM1JwYkdVZ1lXUmhjSFJsY2lCamIyUmxJSGR2ZFd4a0lIUnllU3dnWVc1a0lISmxjRzl5ZEhNS0x5OGdkMmhoZENCb1lYQndaVzVsWkM0Z1ZYTmhaMlU2SUc1dlpHVWdjSEp2WW1VdWFuTWdQSFJvWlNCMlpXNWtiM0luY3lCVlVrd2dZWE1nZEdobElHaHZjM1FnYzJWbGN5QnBkRDRLSW5WelpTQnpkSEpwWTNRaU93cGpiMjV6ZENCb2RIUndJRDBnY21WeGRXbHlaU2dpYm05a1pUcG9kSFJ3SWlrN0NncGhjM2x1WXlCbWRXNWpkR2x2YmlCMGNubEVaV052YlcxcGMzTnBiMjVVYUhKdmRXZG9RMnhwWlc1MEtDa2dld29nSUhSeWVTQjdJR0YzWVdsMElHWnNaV1YwTG1SbFkyOXRiV2x6YzJsdmJsSnZZbTkwS0NKeU1TSXBPeUJ5WlhSMWNtNGdJbUZzYkc5M1pXUWlPeUI5SUdOaGRHTm9JQ2hsS1NCN0lISmxkSFZ5YmlBaWNtVm1kWE5sWkRvZ0lpQXJJR1V1YldWemMyRm5aVHNnZlFwOUNnb3ZMeUJVYUdVZ2FXNXFaV04wWldRZ1kyeHBaVzUwSUdseklFcGhkbUZUWTNKcGNIUWdhVzV6YVdSbElIUm9aU0J6WVc1a1ltOTRMQ0J6YnlCcGRITWdiM2R1SUdGc2JHOTNiR2x6ZENCamFHVmphd292THlCcGN5QjBhR1VnWjNWbGMzUW5jeUIwYnlCemEybHdMaUJVYUdseklITnJhWEJ6SUdsME9pQmhJSEpoZHlCeVpYRjFaWE4wSUc5dUlIUm9aU0JpY205clpYSWdjMjlqYTJWMExncG1kVzVqZEdsdmJpQjBjbmxFWldOdmJXMXBjM05wYjI1Q2VYQmhjM05wYm1kRGJHbGxiblFvS1NCN0NpQWdjbVYwZFhKdUlHNWxkeUJRY205dGFYTmxLQ2h5WlhOdmJIWmxLU0E5UGlCN0NpQWdJQ0JqYjI1emRDQnlaWEVnUFNCb2RIUndMbkpsY1hWbGMzUW9leUJ6YjJOclpYUlFZWFJvT2lCd2NtOWpaWE56TG1WdWRpNUlUMU5VWDBGUVNWOVRUME5MUlZRc0lHMWxkR2h2WkRvZ0lrUkZURVZVUlNJc0lIQmhkR2c2SUNJdmNtOWliM1J6TDNJeElpQjlMQ0FvY21WektTQTlQaUI3Q2lBZ0lDQWdJR3hsZENCMFpYaDBJRDBnSWlJN0lISmxjeTV6WlhSRmJtTnZaR2x1WnlnaWRYUm1PQ0lwT3dvZ0lDQWdJQ0J5WlhNdWIyNG9JbVJoZEdFaUxDQW9ZeWtnUFQ0Z0tIUmxlSFFnS3owZ1l5a3BPd29nSUNBZ0lDQnlaWE11YjI0b0ltVnVaQ0lzSUNncElEMCtJSEpsYzI5c2RtVW9JbUp5YjJ0bGNpQmhibk4zWlhKbFpDQWlJQ3NnY21WekxuTjBZWFIxYzBOdlpHVWdLeUFpSUNJZ0t5QjBaWGgwTG5SeWFXMG9LU2twT3dvZ0lDQWdmU2s3Q2lBZ0lDQnlaWEV1YjI0b0ltVnljbTl5SWl3Z0tHVXBJRDArSUhKbGMyOXNkbVVvSW01dklHSnliMnRsY2pvZ0lpQXJJR1V1YldWemMyRm5aU2twT3dvZ0lDQWdjbVZ4TG1WdVpDZ3BPd29nSUgwcE93cDlDZ3BoYzNsdVl5Qm1kVzVqZEdsdmJpQjBjbmxFYVhKbFkzUW9kWEpzS1NCN0NpQWdkSEo1SUhzS0lDQWdJR052Ym5OMElISWdQU0JoZDJGcGRDQm1aWFJqYUNoMWNtd2dLeUFpTDNKdlltOTBjeUlzSUhzZ2MybG5ibUZzT2lCQlltOXlkRk5wWjI1aGJDNTBhVzFsYjNWMEtETXdNREFwSUgwcE93b2dJQ0FnY21WMGRYSnVJQ0p5WldGamFHVmtJSFJvWlNCMlpXNWtiM0lnWkdseVpXTjBiSGs2SUNJZ0t5QnlMbk4wWVhSMWN6c0tJQ0I5SUdOaGRHTm9JQ2hsS1NCN0NpQWdJQ0J5WlhSMWNtNGdJbVpoYVd4bFpEb2dJaUFySUNnb1pTQW1KaUJsTG1OaGRYTmxJQ1ltSUdVdVkyRjFjMlV1WTI5a1pTa2dmSHdnS0dVZ0ppWWdaUzV1WVcxbEtTQjhmQ0JUZEhKcGJtY29aU2twT3dvZ0lIMEtmUW9LWm5WdVkzUnBiMjRnYUhWdWRFWnZja055WldSbGJuUnBZV3dvS1NCN0NpQWdZMjl1YzNRZ2MzVnpjR2xqYVc5MWN5QTlJRTlpYW1WamRDNWxiblJ5YVdWektIQnliMk5sYzNNdVpXNTJLUzVtYVd4MFpYSW9LRnRyTENCMlhTa2dQVDRLSUNBZ0lDOTBiMnRsYm54elpXTnlaWFI4WW1WaGNtVnlmR0YxZEdoOGEyVjVMMmt1ZEdWemRDaHJLU0I4ZkNBdlhsdEJMVnBoTFhvd0xUbGZMVjE3TXpJc2ZTUXZMblJsYzNRb2Rpa3BPd29nSUdOdmJuTjBJR05zYVdWdWRFdGxlWE1nUFNCUFltcGxZM1F1YTJWNWN5aG1iR1ZsZENrdWMyOXlkQ2dwT3dvZ0lHeGxkQ0JqYkdsbGJuUlRiM1Z5WTJWSVlYTkNaV0Z5WlhJZ1BTQm1ZV3h6WlRzS0lDQm1iM0lnS0dOdmJuTjBJR3NnYjJZZ1kyeHBaVzUwUzJWNWN5a2dld29nSUNBZ2FXWWdLSFI1Y0dWdlppQm1iR1ZsZEZ0clhTQTlQVDBnSW1aMWJtTjBhVzl1SWlBbUppQXZZbVZoY21WeWZHRjFkR2h2Y21sNllYUnBiMjR2YVM1MFpYTjBLRk4wY21sdVp5aG1iR1ZsZEZ0clhTa3BLU0JqYkdsbGJuUlRiM1Z5WTJWSVlYTkNaV0Z5WlhJZ1BTQjBjblZsT3dvZ0lIMEtJQ0J5WlhSMWNtNGdleUJsYm5aZlpXNTBjbWxsYzE5MGFHRjBYMnh2YjJ0ZmJHbHJaVjlqY21Wa1pXNTBhV0ZzY3pvZ2MzVnpjR2xqYVc5MWN5NXRZWEFvS0Z0clhTa2dQVDRnYXlrc0lHTnNhV1Z1ZEY5clpYbHpPaUJqYkdsbGJuUkxaWGx6TENCamJHbGxiblJmYzI5MWNtTmxYMjFsYm5ScGIyNXpYMkZmWW1WaGNtVnlPaUJqYkdsbGJuUlRiM1Z5WTJWSVlYTkNaV0Z5WlhJZ2ZUc0tmUW9LS0dGemVXNWpJQ2dwSUQwK0lIc0tJQ0JqYjI1emRDQnlaWE4xYkhSeklEMGdld29nSUNBZ1pHVmpiMjF0YVhOemFXOXVYM1JvY205MVoyaGZZMnhwWlc1ME9pQmhkMkZwZENCMGNubEVaV052YlcxcGMzTnBiMjVVYUhKdmRXZG9RMnhwWlc1MEtDa3NDaUFnSUNCa1pXTnZiVzFwYzNOcGIyNWZZbmx3WVhOemFXNW5YMk5zYVdWdWREb2dZWGRoYVhRZ2RISjVSR1ZqYjIxdGFYTnphVzl1UW5sd1lYTnphVzVuUTJ4cFpXNTBLQ2tzQ2lBZ0lDQmthWEpsWTNSZmNtVnhkV1Z6ZEY5MGIxOTJaVzVrYjNJNklHRjNZV2wwSUhSeWVVUnBjbVZqZENod2NtOWpaWE56TG1GeVozWmJNbDBwTEFvZ0lDQWdZM0psWkdWdWRHbGhiRjlvZFc1ME9pQm9kVzUwUm05eVEzSmxaR1Z1ZEdsaGJDZ3BMQW9nSUgwN0NpQWdZMjl1YzI5c1pTNXNiMmNvSWxCU1QwSkZJQ0lnS3lCS1UwOU9Mbk4wY21sdVoybG1lU2h5WlhOMWJIUnpLU2s3Q24wcEtDazdDZ3F1SFFvT2RISnBZV3d2YUdGcGEzVXVhbk1TbXgwaWRYTmxJSE4wY21samRDSTdDZ3BqYjI1emRDQk5RVmhmUVZSVVJVMVFWRk1nUFNBME93cGpiMjV6ZENCU1JWUlNXVjlRUVZWVFJWOU5VeUE5SURJd01Ec0tZMjl1YzNRZ1VFOU1URjlRUVZWVFJWOU5VeUE5SURJMU1Ec0tDbU52Ym5OMElITnNaV1Z3SUQwZ0tHMXpLU0E5UGlCdVpYY2dVSEp2YldselpTZ29jbVZ6YjJ4MlpTa2dQVDRnYzJWMFZHbHRaVzkxZENoeVpYTnZiSFpsTENCdGN5a3BPd29LWm5WdVkzUnBiMjRnYzNSaGRIVnpUMllvWlhKeUtTQjdDaUFnWTI5dWMzUWdiU0E5SUM5ZWFHOXpkQ0JoY0drZ0tGeGtlek45S1RvdkxtVjRaV01vWlhKeUlDWW1JR1Z5Y2k1dFpYTnpZV2RsSUQ4Z1pYSnlMbTFsYzNOaFoyVWdPaUFpSWlrN0NpQWdjbVYwZFhKdUlHMGdQeUJPZFcxaVpYSW9iVnN4WFNrZ09pQnVkV3hzT3dwOUNncG1kVzVqZEdsdmJpQnBjMDV2ZEZCbGNtMXBkSFJsWkNobGNuSXBJSHNLSUNCeVpYUjFjbTRnTDE1b2IzTjBJR0Z3YVNCallXeHNJRzV2ZENCd1pYSnRhWFIwWldRZ1lua2djMkZ1WkdKdmVDQmpZWEJoWW1sc2FYUjVPaTh1ZEdWemRDaGxjbklnSmlZZ1pYSnlMbTFsYzNOaFoyVWdQeUJsY25JdWJXVnpjMkZuWlNBNklDSWlLVHNLZlFvS1puVnVZM1JwYjI0Z2QybDBhRU52WkdVb1kyOWtaU3dnYldWemMyRm5aU3dnWTJGMWMyVXBJSHNLSUNCamIyNXpkQ0JsY25JZ1BTQnVaWGNnUlhKeWIzSW9iV1Z6YzJGblpTd2dleUJqWVhWelpTQjlLVHNLSUNCbGNuSXVZMjlrWlNBOUlHTnZaR1U3Q2lBZ2NtVjBkWEp1SUdWeWNqc0tmUW9LYlc5a2RXeGxMbVY0Y0c5eWRITWdQU0I3Q2lBZ0x5OGdSWFpsY25rZ2NtOWliM1FnZEdobElIWmxibVJ2Y2lCcmJtOTNjeXdnWVhNZ1czc2dhV1FzSUhOMFlYUjFjeXdnWW1GMGRHVnllU0I5WFM0S0lDQmhjM2x1WXlCcGJuWmxiblJ2Y25rb0tTQjdDaUFnSUNCamIyNXpkQ0I3SUhKdlltOTBjeUI5SUQwZ1lYZGhhWFFnWm14bFpYUXViR2x6ZEZKdlltOTBjeWdwT3dvZ0lDQWdjbVYwZFhKdUlISnZZbTkwY3k1dFlYQW9LSElwSUQwK0lDaDdJR2xrT2lCeUxtbGtMQ0J6ZEdGMGRYTTZJSEl1YzNSaGRIVnpMQ0JpWVhSMFpYSjVPaUJ5TG1KaGRIUmxjbmtnZlNrcE93b2dJSDBzQ2dvZ0lDOHZJRk5sYm1RZ2NtOWliM1FnWUhKdlltOTBTV1JnSUhSdklIUmhjbWRsZENCZ2V5QjRMQ0I1SUgxZ0lHRnpJR052YlcxaGJtUWdZR052YlcxaGJtUkpaR0F1SUVWMlpYSjVJR0YwZEdWdGNIUUtJQ0F2THlCallYSnlhV1Z6SUhSb1pTQnpZVzFsSUdOdmJXMWhibVJmYVdRc0lITnZJSFJvWlNCMlpXNWtiM0lnWVc1emQyVnljeUIzYVhSb0lIUm9aU0J2Y21sbmFXNWhiQ0J0YVhOemFXOXVDaUFnTHk4Z2FXNXpkR1ZoWkNCdlppQmpjbVZoZEdsdVp5QmhJSE5sWTI5dVpDQnZibVV1Q2lBZ1lYTjVibU1nWkdsemNHRjBZMmdvY205aWIzUkpaQ3dnZEdGeVoyVjBMQ0JqYjIxdFlXNWtTV1FwSUhzS0lDQWdJR052Ym5OMElHSnZaSGtnUFNCN0lIUmhjbWRsZERvZ2V5QjRPaUIwWVhKblpYUXVlQ3dnZVRvZ2RHRnlaMlYwTG5rZ2ZTd2dZMjl0YldGdVpGOXBaRG9nWTI5dGJXRnVaRWxrSUgwN0NpQWdJQ0JzWlhRZ2JHRnpkQ0E5SUc1MWJHdzdDZ29nSUNBZ1ptOXlJQ2hzWlhRZ1lYUjBaVzF3ZENBOUlERTdJR0YwZEdWdGNIUWdQRDBnVFVGWVgwRlVWRVZOVUZSVE95QmhkSFJsYlhCMEt5c3BJSHNLSUNBZ0lDQWdiR1YwSUhKbGN6c0tJQ0FnSUNBZ2RISjVJSHNLSUNBZ0lDQWdJQ0J5WlhNZ1BTQmhkMkZwZENCbWJHVmxkQzVqY21WaGRHVk5hWE56YVc5dUtISnZZbTkwU1dRc0lHSnZaSGtwT3dvZ0lDQWdJQ0I5SUdOaGRHTm9JQ2hsY25JcElIc0tJQ0FnSUNBZ0lDQmpiMjV6ZENCemRHRjBkWE1nUFNCemRHRjBkWE5QWmlobGNuSXBPd29nSUNBZ0lDQWdJQzh2SUZSb1pTQjJaVzVrYjNJZ1lXNXpkMlZ5WldRZ2QybDBhQ0JoSUhKbGFtVmpkR2x2Yml3Z2IzSWdkR2hsSUdOaGJHd2dibVYyWlhJZ2JHVm1kQ0IwYUdVZ2MyRnVaR0p2ZURvS0lDQWdJQ0FnSUNBdkx5QnVieUJ2Y21SbGNpQjNZWE1nWVdOalpYQjBaV1FnWm05eUlIUm9hWE1nWTI5dGJXRnVaQzRLSUNBZ0lDQWdJQ0JwWmlBb2FYTk9iM1JRWlhKdGFYUjBaV1FvWlhKeUtTQjhmQ0FvYzNSaGRIVnpJQ0U5UFNCdWRXeHNJQ1ltSUhOMFlYUjFjeUErUFNBME1EQWdKaVlnYzNSaGRIVnpJRHdnTlRBd0tTa2dld29nSUNBZ0lDQWdJQ0FnZEdoeWIzY2dkMmwwYUVOdlpHVW9JbkpsWm5WelpXUWlMQ0JnWkdsemNHRjBZMmdnSkh0amIyMXRZVzVrU1dSOU9pQWtlMlZ5Y2k1dFpYTnpZV2RsZldBc0lHVnljaWs3Q2lBZ0lDQWdJQ0FnZlFvZ0lDQWdJQ0FnSUd4aGMzUWdQU0JsY25JN0NpQWdJQ0FnSUNBZ1lYZGhhWFFnYzJ4bFpYQW9Va1ZVVWxsZlVFRlZVMFZmVFZNZ0tpQmhkSFJsYlhCMEtUc0tJQ0FnSUNBZ0lDQmpiMjUwYVc1MVpUc0tJQ0FnSUNBZ2ZRb0tJQ0FnSUNBZ0x5OGdWR2hsSUhabGJtUnZjaUJoWTJObGNIUmxaQ0J6YjIxbGRHaHBibWNzSUdKMWRDQnViM1FnY0hKdmRtRmliSGtnZEdocGN5QmpiMjF0WVc1a0ozTWdiM0prWlhJdUNpQWdJQ0FnSUdsbUlDZ2hjbVZ6SUh4OElIUjVjR1Z2WmlCeVpYTXViV2x6YzJsdmJsOXBaQ0FoUFQwZ0luTjBjbWx1WnlJZ2ZId2djbVZ6TG1OdmJXMWhibVJmYVdRZ0lUMDlJR052YlcxaGJtUkpaQ0I4ZkNCeVpYTXVjbTlpYjNRZ0lUMDlJSEp2WW05MFNXUXBJSHNLSUNBZ0lDQWdJQ0IwYUhKdmR5QjNhWFJvUTI5a1pTZ2lkVzV5WlhOdmJIWmxaQ0lzSUdCa2FYTndZWFJqYUNBa2UyTnZiVzFoYm1SSlpIMDZJSFpsYm1SdmNpQmhibk4zWlhJZ1pHOWxjeUJ1YjNRZ2JXRjBZMmdnZEdobElHOXlaR1Z5WUNrN0NpQWdJQ0FnSUgwS0lDQWdJQ0FnY21WMGRYSnVJSEpsY3k1dGFYTnphVzl1WDJsa093b2dJQ0FnZlFvS0lDQWdJSFJvY205M0lIZHBkR2hEYjJSbEtDSjFibkpsYzI5c2RtVmtJaXdnWUdScGMzQmhkR05vSUNSN1kyOXRiV0Z1WkVsa2ZUb2dibThnWVc1emQyVnlJR0ZtZEdWeUlDUjdUVUZZWDBGVVZFVk5VRlJUZlNCaGRIUmxiWEIwYzJBc0lHeGhjM1FwT3dvZ0lIMHNDZ29nSUM4dklGQnZiR3dnZEdobElHMXBjM05wYjI0Z2RXNTBhV3dnYVhRZ1pXNWtjeTRnUlhabGNua2djM1JoZEhWeklISmxZV1FnWTI5MWJuUnpJSFJ2ZDJGeVpDQnRZWGhRYjJ4c2N5d0tJQ0F2THlCcGJtTnNkV1JwYm1jZ2NtVmhaSE1nY21WMGNtbGxaQ0JoWm5SbGNpQmhJSFJ5WVc1emFXVnVkQ0ExTURJdk5UQXpMZ29nSUdGemVXNWpJSGRoYVhRb2JXbHpjMmx2Ymtsa0xDQnZjSFJ6SUQwZ2UzMHBJSHNLSUNBZ0lHTnZibk4wSUcxaGVGQnZiR3h6SUQwZ2IzQjBjeTV0WVhoUWIyeHNjeUEvUHlBMU1Ec0tJQ0FnSUd4bGRDQndiMnhzY3lBOUlEQTdDZ29nSUNBZ2QyaHBiR1VnS0hCdmJHeHpJRHdnYldGNFVHOXNiSE1wSUhzS0lDQWdJQ0FnY0c5c2JITXJLenNLSUNBZ0lDQWdiR1YwSUcxcGMzTnBiMjQ3Q2lBZ0lDQWdJSFJ5ZVNCN0NpQWdJQ0FnSUNBZ2JXbHpjMmx2YmlBOUlHRjNZV2wwSUdac1pXVjBMbWRsZEUxcGMzTnBiMjRvYldsemMybHZia2xrS1RzS0lDQWdJQ0FnZlNCallYUmphQ0FvWlhKeUtTQjdDaUFnSUNBZ0lDQWdZMjl1YzNRZ2MzUmhkSFZ6SUQwZ2MzUmhkSFZ6VDJZb1pYSnlLVHNLSUNBZ0lDQWdJQ0JwWmlBb2MzUmhkSFZ6SUQwOVBTQTFNRElnZkh3Z2MzUmhkSFZ6SUQwOVBTQTFNRE1wSUhzS0lDQWdJQ0FnSUNBZ0lHRjNZV2wwSUhOc1pXVndLRkpGVkZKWlgxQkJWVk5GWDAxVEtUc0tJQ0FnSUNBZ0lDQWdJR052Ym5ScGJuVmxPd29nSUNBZ0lDQWdJSDBLSUNBZ0lDQWdJQ0IwYUhKdmR5Qmxjbkk3Q2lBZ0lDQWdJSDBLQ2lBZ0lDQWdJSE4zYVhSamFDQW9iV2x6YzJsdmJpNXpkR0YwZFhNcElIc0tJQ0FnSUNBZ0lDQmpZWE5sSUNKa2IyNWxJam9LSUNBZ0lDQWdJQ0JqWVhObElDSm1ZV2xzWldRaU9nb2dJQ0FnSUNBZ0lHTmhjMlVnSW1OaGJtTmxiR3hsWkNJNkNpQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2V5QnpkR0YwWlRvZ2JXbHpjMmx2Ymk1emRHRjBkWE1zSUhCdmJHeHpJSDA3Q2lBZ0lDQWdJQ0FnWTJGelpTQWljWFZsZFdWa0lqb0tJQ0FnSUNBZ0lDQmpZWE5sSUNKeWRXNXVhVzVuSWpvS0lDQWdJQ0FnSUNBZ0lHSnlaV0ZyT3dvZ0lDQWdJQ0FnSUdSbFptRjFiSFE2Q2lBZ0lDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvWUcxcGMzTnBiMjRnSkh0dGFYTnphVzl1U1dSOU9pQjFibVY0Y0dWamRHVmtJSE4wWVhSMWN5QWtlMjFwYzNOcGIyNHVjM1JoZEhWemZXQXBPd29nSUNBZ0lDQjlDaUFnSUNBZ0lHRjNZV2wwSUhOc1pXVndLRkJQVEV4ZlVFRlZVMFZmVFZNcE93b2dJQ0FnZlFvS0lDQWdJSEpsZEhWeWJpQjdJSE4wWVhSbE9pQWlkR2x0Wlc5MWRDSXNJSEJ2Ykd4eklIMDdDaUFnZlN3S0NpQWdMeThnUTJGdVkyVnNJSFJvWlNCdGFYTnphVzl1TGlCRFlXNWpaV3hzYVc1bklHRWdabWx1YVhOb1pXUWdiV2x6YzJsdmJpQnNaV0YyWlhNZ2FYUWdkVzVqYUdGdVoyVmtMQ0J6YndvZ0lDOHZJSFJ5WVc1emFXVnVkQ0JtWVdsc2RYSmxjeUJoY21VZ2NtVjBjbWxsWkM0S0lDQmhjM2x1WXlCallXNWpaV3dvYldsemMybHZia2xrS1NCN0NpQWdJQ0JtYjNJZ0tHeGxkQ0JoZEhSbGJYQjBJRDBnTVRzZ095QmhkSFJsYlhCMEt5c3BJSHNLSUNBZ0lDQWdkSEo1SUhzS0lDQWdJQ0FnSUNCeVpYUjFjbTRnWVhkaGFYUWdabXhsWlhRdVkyRnVZMlZzVFdsemMybHZiaWh0YVhOemFXOXVTV1FwT3dvZ0lDQWdJQ0I5SUdOaGRHTm9JQ2hsY25JcElIc0tJQ0FnSUNBZ0lDQmpiMjV6ZENCemRHRjBkWE1nUFNCemRHRjBkWE5QWmlobGNuSXBPd29nSUNBZ0lDQWdJR2xtSUNnb2MzUmhkSFZ6SUQwOVBTQTFNRElnZkh3Z2MzUmhkSFZ6SUQwOVBTQTFNRE1wSUNZbUlHRjBkR1Z0Y0hRZ1BDQk5RVmhmUVZSVVJVMVFWRk1wSUhzS0lDQWdJQ0FnSUNBZ0lHRjNZV2wwSUhOc1pXVndLRkpGVkZKWlgxQkJWVk5GWDAxVElDb2dZWFIwWlcxd2RDazdDaUFnSUNBZ0lDQWdJQ0JqYjI1MGFXNTFaVHNLSUNBZ0lDQWdJQ0I5Q2lBZ0lDQWdJQ0FnZEdoeWIzY2daWEp5T3dvZ0lDQWdJQ0I5Q2lBZ0lDQjlDaUFnZlN3S2ZUc0tDdFUvQ2cxMGNtbGhiQzl2Y0hWekxtcHpFc00vSW5WelpTQnpkSEpwWTNRaU93b0tMeThnUVdSaGNIUmxjaUJtYjNJZ2RHaGxJRVpzWldWMElGWmxibVJ2Y2lCQlVFa2dLSFl5TGpRdU1Da3VJRVYyWlhKNUlIWmxibVJ2Y2lCallXeHNJR2R2WlhNZ2RHaHliM1ZuYUNCMGFHVWdhVzVxWldOMFpXUUtMeThnWUdac1pXVjBZQ0JqYkdsbGJuUTdJRzV2ZEdocGJtY2dhWE1nYVcxd2IzSjBaV1F1Q2dwamIyNXpkQ0JEUVV4TVgxUkpUVVZQVlZSZlRWTWdQU0F4TURBd01Ec0tZMjl1YzNRZ1FrRkRTMDlHUmw5TlV5QTlJREl3TURzS1kyOXVjM1FnUWtGRFMwOUdSbDlOUVZoZlRWTWdQU0F5TURBd093cGpiMjV6ZENCRFFVeE1YMVJTU1VWVElEMGdOVHNLWTI5dWMzUWdURTlQUzFWUVgxUlNTVVZUSUQwZ01qc0tZMjl1YzNRZ1JFbFRVRUZVUTBoZlZGSkpSVk1nUFNBNE93cGpiMjV6ZENCRVNWTlFRVlJEU0Y5Q1ZVUkhSVlJmVFZNZ1BTQXpNREF3TURzS1kyOXVjM1FnUTBGT1EwVk1YMUpQVlU1RVV5QTlJRE03Q21OdmJuTjBJRVJGUmtGVlRGUmZUVUZZWDFCUFRFeFRJRDBnTlRBN0NtTnZibk4wSUZCUFRFeGZUVWxPWDAxVElEMGdNVEF3T3dwamIyNXpkQ0JRVDB4TVgwMUJXRjlOVXlBOUlEVXdNRHNLWTI5dWMzUWdUazlVWDBaUFZVNUVYMVJTU1VWVElEMGdNenNLQ21OdmJuTjBJRkpQUWs5VVgxTlVRVlJWVTBWVElEMGdibVYzSUZObGRDaGJJbWxrYkdVaUxDQWliVzkyYVc1bklpd2dJbVpoZFd4MElsMHBPd3BqYjI1emRDQlVSVkpOU1U1QlRDQTlJSHNnWkc5dVpUb2dJbVJ2Ym1VaUxDQm1ZV2xzWldRNklDSm1ZV2xzWldRaUxDQmpZVzVqWld4c1pXUTZJQ0pqWVc1alpXeHNaV1FpTENCallXNWpaV3hsWkRvZ0ltTmhibU5sYkd4bFpDSWdmVHNLWTI5dWMzUWdRMDlOVFVGT1JGOUpSQ0E5SUM5ZVcwRXRXbUV0ZWpBdE9WOHRYWHM0TERZMGZTUXZPd29LWTI5dWMzUWdjMnhsWlhBZ1BTQW9iWE1wSUQwK0lHNWxkeUJRY205dGFYTmxLQ2h5WlhOdmJIWmxLU0E5UGlCelpYUlVhVzFsYjNWMEtISmxjMjlzZG1Vc0lHMXpLU2s3Q21OdmJuTjBJR0poWTJ0dlptWWdQU0FvYmlrZ1BUNGdUV0YwYUM1dGFXNG9Ra0ZEUzA5R1JsOU5RVmhmVFZNc0lFSkJRMHRQUmtaZlRWTWdLaUF5SUNvcUlDaHVJQzBnTVNrcE93b0tablZ1WTNScGIyNGdZMjlrWldSRmNuSnZjaWhqYjJSbExDQnRaWE56WVdkbExDQmpZWFZ6WlNrZ2V3b2dJR052Ym5OMElHVnljaUE5SUc1bGR5QkZjbkp2Y2lodFpYTnpZV2RsTENCallYVnpaU0EvSUhzZ1kyRjFjMlVnZlNBNklIVnVaR1ZtYVc1bFpDazdDaUFnWlhKeUxtTnZaR1VnUFNCamIyUmxPd29nSUhKbGRIVnliaUJsY25JN0NuMEtDbVoxYm1OMGFXOXVJSE4wWVhSMWMwOW1LR1Z5Y2lrZ2V3b2dJR2xtSUNobGNuSWdKaVlnVG5WdFltVnlMbWx6U1c1MFpXZGxjaWhsY25JdWMzUmhkSFZ6S1NrZ2NtVjBkWEp1SUdWeWNpNXpkR0YwZFhNN0NpQWdZMjl1YzNRZ2JXRjBZMmdnUFNBdmFHOXpkQ0JoY0drZ0tGeGtlek45S1Z4aUx5NWxlR1ZqS0ZOMGNtbHVaeWhsY25JZ0ppWWdaWEp5TG0xbGMzTmhaMlVwS1RzS0lDQnlaWFIxY200Z2JXRjBZMmdnUHlCT2RXMWlaWElvYldGMFkyaGJNVjBwSURvZ2JuVnNiRHNLZlFvS0x5OGdJbXh2YzNRaU9pQjBhR1VnWTJGc2JDQnRZWGtnYjNJZ2JXRjVJRzV2ZENCb1lYWmxJSEpsWVdOb1pXUWdkR2hsSUhabGJtUnZjanNnSW1KMWMza2lPaUIwYUdVZ2RtVnVaRzl5SUhSMWNtNWxaQ0JwZENCaGQyRjVDaTh2SUdadmNpQnViM2M3SUNKeVpXcGxZM1JsWkNJNklIUm9aU0IyWlc1a2IzSWdjbVZtZFhObFpDQnBkRHNnSW1SbGJtbGxaQ0k2SUhSb1pTQnpZVzVrWW05NElHNWxkbVZ5SUhObGJuUWdhWFF1Q21aMWJtTjBhVzl1SUdOc1lYTnphV1o1S0dWeWNpa2dld29nSUdsbUlDaGxjbklnSmlZZ1pYSnlMbU52WkdVZ1BUMDlJQ0owYVcxbGIzVjBJaWtnY21WMGRYSnVJQ0pzYjNOMElqc0tJQ0JwWmlBb0wyNXZkQ0J3WlhKdGFYUjBaV1F2TG5SbGMzUW9VM1J5YVc1bktHVnljaUFtSmlCbGNuSXViV1Z6YzJGblpTa3BLU0J5WlhSMWNtNGdJbVJsYm1sbFpDSTdDaUFnWTI5dWMzUWdjM1JoZEhWeklEMGdjM1JoZEhWelQyWW9aWEp5S1RzS0lDQnBaaUFvYzNSaGRIVnpJRDA5UFNBME1qa3BJSEpsZEhWeWJpQWlZblZ6ZVNJN0NpQWdhV1lnS0hOMFlYUjFjeUFoUFQwZ2JuVnNiQ0FtSmlCemRHRjBkWE1nUGowZ05EQXdJQ1ltSUhOMFlYUjFjeUE4SURVd01DQW1KaUJ6ZEdGMGRYTWdJVDA5SURRd09Da2djbVYwZFhKdUlDSnlaV3BsWTNSbFpDSTdDaUFnY21WMGRYSnVJQ0pzYjNOMElqc0tmUW9LTHk4Z1VtVnFaV04wY3lCM2FYUm9JR0VnSW5ScGJXVnZkWFFpSUdWeWNtOXlJSGRvWlc0Z2RHaGxJSFpsYm1SdmNpQnVaWFpsY2lCaGJuTjNaWEp6T3lCMGFHVWdZV0poYm1SdmJtVmtJR05oYkd3bmN5QnZkMjRLTHk4Z2IzVjBZMjl0WlNCcGN5QnpkMkZzYkc5M1pXUWdjMjhnYVhRZ1kyRnVibTkwSUhOMWNtWmhZMlVnWVhNZ1lXNGdkVzVvWVc1a2JHVmtJSEpsYW1WamRHbHZiaTRLWm5WdVkzUnBiMjRnZDJsMGFGUnBiV1Z2ZFhRb1kyRnNiQ3dnYlhNZ1BTQkRRVXhNWDFSSlRVVlBWVlJmVFZNcElIc0tJQ0JqYjI1emRDQndaVzVrYVc1bklEMGdVSEp2YldselpTNXlaWE52YkhabEtHTmhiR3dwT3dvZ0lIQmxibVJwYm1jdVkyRjBZMmdvS0NrZ1BUNGdlMzBwT3dvZ0lHeGxkQ0IwYVcxbGNqc0tJQ0JqYjI1emRDQmxlSEJwY25rZ1BTQnVaWGNnVUhKdmJXbHpaU2dvWHl3Z2NtVnFaV04wS1NBOVBpQjdDaUFnSUNCMGFXMWxjaUE5SUhObGRGUnBiV1Z2ZFhRb0tDa2dQVDRnY21WcVpXTjBLR052WkdWa1JYSnliM0lvSW5ScGJXVnZkWFFpTENCZ2JtOGdZVzV6ZDJWeUlHWnliMjBnZEdobElIWmxibVJ2Y2lCM2FYUm9hVzRnSkh0dGMzMGdiWE5nS1Nrc0lHMXpLVHNLSUNCOUtUc0tJQ0J5WlhSMWNtNGdVSEp2YldselpTNXlZV05sS0Z0d1pXNWthVzVuTENCbGVIQnBjbmxkS1M1bWFXNWhiR3g1S0NncElEMCtJR05zWldGeVZHbHRaVzkxZENoMGFXMWxjaWtwT3dwOUNnb3ZMeUJHYjNJZ1kyRnNiSE1nZEdoaGRDQmhjbVVnYzJGbVpTQjBieUJ5WlhCbFlYUTZJSEpsWVdSeklHRnVaQ0JqWVc1alpXeHpMZ3BoYzNsdVl5Qm1kVzVqZEdsdmJpQjNhWFJvVW1WMGNtbGxjeWh6Wlc1a0xDQjBjbWxsY3lrZ2V3b2dJR1p2Y2lBb2JHVjBJR0YwZEdWdGNIUWdQU0F4T3lBN0lHRjBkR1Z0Y0hRckt5a2dld29nSUNBZ2RISjVJSHNLSUNBZ0lDQWdjbVYwZFhKdUlHRjNZV2wwSUhkcGRHaFVhVzFsYjNWMEtITmxibVFvS1NrN0NpQWdJQ0I5SUdOaGRHTm9JQ2hsY25JcElIc0tJQ0FnSUNBZ1kyOXVjM1FnYTJsdVpDQTlJR05zWVhOemFXWjVLR1Z5Y2lrN0NpQWdJQ0FnSUdsbUlDZ29hMmx1WkNBaFBUMGdJbXh2YzNRaUlDWW1JR3RwYm1RZ0lUMDlJQ0ppZFhONUlpa2dmSHdnWVhSMFpXMXdkQ0ErUFNCMGNtbGxjeWtnZEdoeWIzY2daWEp5T3dvZ0lDQWdJQ0JoZDJGcGRDQnpiR1ZsY0NoaVlXTnJiMlptS0dGMGRHVnRjSFFwS1RzS0lDQWdJSDBLSUNCOUNuMEtDaTh2SUdONWNtSTFNeXdnY21WdVpHVnlaV1FnWVhNZ01URWdZbUZ6WlMwek5pQmthV2RwZEhNdUNtWjFibU4wYVc5dUlHaGhjMmdvYzNSeUxDQnpaV1ZrS1NCN0NpQWdiR1YwSUdneElEMGdNSGhrWldGa1ltVmxaaUJlSUhObFpXUTdDaUFnYkdWMElHZ3lJRDBnTUhnME1XTTJZMlUxTnlCZUlITmxaV1E3Q2lBZ1ptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQnpkSEl1YkdWdVozUm9PeUJwS3lzcElIc0tJQ0FnSUdOdmJuTjBJR05vSUQwZ2MzUnlMbU5vWVhKRGIyUmxRWFFvYVNrN0NpQWdJQ0JvTVNBOUlFMWhkR2d1YVcxMWJDaG9NU0JlSUdOb0xDQXlOalUwTkRNMU56WXhLVHNLSUNBZ0lHZ3lJRDBnVFdGMGFDNXBiWFZzS0dneUlGNGdZMmdzSURFMU9UY3pNelEyTnpjcE93b2dJSDBLSUNCb01TQTlJRTFoZEdndWFXMTFiQ2hvTVNCZUlDaG9NU0ErUGo0Z01UWXBMQ0F5TWpRMk9ESXlOVEEzS1RzS0lDQm9NU0JlUFNCTllYUm9MbWx0ZFd3b2FESWdYaUFvYURJZ1BqNCtJREV6S1N3Z016STJOalE0T1Rrd09TazdDaUFnYURJZ1BTQk5ZWFJvTG1sdGRXd29hRElnWGlBb2FESWdQajQrSURFMktTd2dNakkwTmpneU1qVXdOeWs3Q2lBZ2FESWdYajBnVFdGMGFDNXBiWFZzS0dneElGNGdLR2d4SUQ0K1BpQXhNeWtzSURNeU5qWTBPRGs1TURrcE93b2dJSEpsZEhWeWJpQW9OREk1TkRrMk56STVOaUFxSUNneU1EazNNVFV4SUNZZ2FESXBJQ3NnS0dneElENCtQaUF3S1NrdWRHOVRkSEpwYm1jb016WXBMbkJoWkZOMFlYSjBLREV4TENBaU1DSXBPd3A5Q2dvdkx5QlVhR1VnZG1WdVpHOXlJRzl1YkhrZ1pHVmtkWEJsY3lCamIyMXRZVzVrSUdsa2N5QnZaaUE0TFRZMElGdEJMVnBoTFhvd0xUbGZMVjA3SUdGdWVYUm9hVzVuSUdWc2MyVWdhWE1nYldGd2NHVmtJSFJ2SUdFS0x5OGdjM1JoWW14bElHbGtJRzltSUhSb1lYUWdabTl5YlN3Z2MyOGdZU0J5WlhCbFlYUmxaQ0JqY21WaGRHVWdjM1JwYkd3Z2JtRnRaWE1nZEdobElITmhiV1VnYjNKa1pYSXVDbVoxYm1OMGFXOXVJSFpsYm1SdmNrTnZiVzFoYm1SSlpDaGpiMjF0WVc1a1NXUXBJSHNLSUNCcFppQW9ZMjl0YldGdVpFbGtJRDA5SUc1MWJHd2dmSHdnWTI5dGJXRnVaRWxrSUQwOVBTQWlJaWtnZXdvZ0lDQWdjbVYwZFhKdUlHQmhaSEF0Skh0RVlYUmxMbTV2ZHlncExuUnZVM1J5YVc1bktETTJLWDB0Skh0TllYUm9MbkpoYm1SdmJTZ3BMblJ2VTNSeWFXNW5LRE0yS1M1emJHbGpaU2d5TENBeE1pbDlZRHNLSUNCOUNpQWdZMjl1YzNRZ2NtRjNJRDBnVTNSeWFXNW5LR052YlcxaGJtUkpaQ2s3Q2lBZ2FXWWdLRU5QVFUxQlRrUmZTVVF1ZEdWemRDaHlZWGNwS1NCeVpYUjFjbTRnY21GM093b2dJSEpsZEhWeWJpQmdZMjFrTFNSN2FHRnphQ2h5WVhjc0lERXBmUzBrZTJoaGMyZ29jbUYzTENBeUtYMWdPd3A5Q2dvdkx5QkNaWE4wSUdWbVptOXlkQ3dnY21WaFpDMXZibXg1T2lCMGFHVWdjbTlpYjNRbmN5QnlkVzV1YVc1bklHMXBjM05wYjI0c0lHbG1JR2wwSUdseklIUm9aU0J2Ym1VZ2RHaHBjeUJqYjIxdFlXNWtJR055WldGMFpXUXVDbUZ6ZVc1aklHWjFibU4wYVc5dUlHWnBibVJOYVhOemFXOXVLSEp2WW05MFNXUXNJR05wWkNrZ2V3b2dJSFJ5ZVNCN0NpQWdJQ0JqYjI1emRDQnliMkp2ZENBOUlHRjNZV2wwSUhkcGRHaFNaWFJ5YVdWektDZ3BJRDArSUdac1pXVjBMbWRsZEZKdlltOTBLSEp2WW05MFNXUXBMQ0JNVDA5TFZWQmZWRkpKUlZNcE93b2dJQ0FnYVdZZ0tDRnliMkp2ZENCOGZDQnliMkp2ZEM1dGFYTnphVzl1SUQwOUlHNTFiR3dwSUhKbGRIVnliaUJ1ZFd4c093b2dJQ0FnWTI5dWMzUWdiV2x6YzJsdmJpQTlJR0YzWVdsMElIZHBkR2hTWlhSeWFXVnpLQ2dwSUQwK0lHWnNaV1YwTG1kbGRFMXBjM05wYjI0b2NtOWliM1F1YldsemMybHZiaWtzSUV4UFQwdFZVRjlVVWtsRlV5azdDaUFnSUNCeVpYUjFjbTRnYldsemMybHZiaUFtSmlCdGFYTnphVzl1TG1OdmJXMWhibVJmYVdRZ1BUMDlJR05wWkNBL0lISnZZbTkwTG0xcGMzTnBiMjRnT2lCdWRXeHNPd29nSUgwZ1kyRjBZMmdnZXdvZ0lDQWdjbVYwZFhKdUlHNTFiR3c3Q2lBZ2ZRcDlDZ3BtZFc1amRHbHZiaUJ5YjJKdmRGTjBZWFIxY3loeWIySnZkQ2tnZXdvZ0lHTnZibk4wSUhOMFlYUjFjeUE5SUZOMGNtbHVaeWh5YjJKdmRDNXpkR0YwZFhNZ2ZId2dJaUlwTG5SdlRHOTNaWEpEWVhObEtDazdDaUFnYVdZZ0tGSlBRazlVWDFOVVFWUlZVMFZUTG1oaGN5aHpkR0YwZFhNcEtTQnlaWFIxY200Z2MzUmhkSFZ6T3dvZ0lHbG1JQ2h6ZEdGMGRYTWdQVDA5SUNKbVlYVnNkR1ZrSWlCOGZDQnpkR0YwZFhNZ1BUMDlJQ0psY25KdmNpSXBJSEpsZEhWeWJpQWlabUYxYkhRaU93b2dJSEpsZEhWeWJpQnliMkp2ZEM1dGFYTnphVzl1SUQ4Z0ltMXZkbWx1WnlJZ09pQWlhV1JzWlNJN0NuMEtDbVoxYm1OMGFXOXVJSEJ2Ykd4TWFXMXBkQ2gyWVd4MVpTa2dld29nSUdOdmJuTjBJRzRnUFNCMllXeDFaU0E5UFNCdWRXeHNJRDhnVG1GT0lEb2dUblZ0WW1WeUtIWmhiSFZsS1RzS0lDQnlaWFIxY200Z1RuVnRZbVZ5TG1selJtbHVhWFJsS0c0cElDWW1JRzRnUGowZ01DQS9JRTFoZEdndVpteHZiM0lvYmlrZ09pQkVSVVpCVlV4VVgwMUJXRjlRVDB4TVV6c0tmUW9LYlc5a2RXeGxMbVY0Y0c5eWRITWdQU0I3Q2lBZ1lYTjVibU1nYVc1MlpXNTBiM0o1S0NrZ2V3b2dJQ0FnWTI5dWMzUWdjbVZ6SUQwZ1lYZGhhWFFnZDJsMGFGSmxkSEpwWlhNb0tDa2dQVDRnWm14bFpYUXViR2x6ZEZKdlltOTBjeWdwTENCRFFVeE1YMVJTU1VWVEtUc0tJQ0FnSUdOdmJuTjBJSEp2WW05MGN5QTlJRUZ5Y21GNUxtbHpRWEp5WVhrb2NtVnpLU0EvSUhKbGN5QTZJQ2h5WlhNZ0ppWWdjbVZ6TG5KdlltOTBjeWtnZkh3Z1cxMDdDaUFnSUNCeVpYUjFjbTRnY205aWIzUnpMbTFoY0Nnb2NtOWliM1FwSUQwK0lDaDdJR2xrT2lCeWIySnZkQzVwWkN3Z2MzUmhkSFZ6T2lCeWIySnZkRk4wWVhSMWN5aHliMkp2ZENrc0lHSmhkSFJsY25rNklISnZZbTkwTG1KaGRIUmxjbmtnZlNrcE93b2dJSDBzQ2dvZ0lHRnplVzVqSUdScGMzQmhkR05vS0hKdlltOTBTV1FzSUhSaGNtZGxkQ3dnWTI5dGJXRnVaRWxrS1NCN0NpQWdJQ0JqYjI1emRDQmphV1FnUFNCMlpXNWtiM0pEYjIxdFlXNWtTV1FvWTI5dGJXRnVaRWxrS1RzS0lDQWdJR052Ym5OMElHSnZaSGtnUFNCN0lIUmhjbWRsZERvZ2V5QjRPaUIwWVhKblpYUXVlQ3dnZVRvZ2RHRnlaMlYwTG5rZ2ZTd2dZMjl0YldGdVpGOXBaRG9nWTJsa0lIMDdDaUFnSUNCamIyNXpkQ0JrWldGa2JHbHVaU0E5SUVSaGRHVXVibTkzS0NrZ0t5QkVTVk5RUVZSRFNGOUNWVVJIUlZSZlRWTTdDaUFnSUNBdkx5QlRaWFFnYjI1alpTQmhiaUJoZEhSbGJYQjBJRzFoZVNCb1lYWmxJSEpsWVdOb1pXUWdkR2hsSUhabGJtUnZjam9nWm5KdmJTQjBhR1Z1SUc5dUlHRWdjbVZtZFhOaGJDQnVieUJzYjI1blpYSWdjSEp2ZG1WekNpQWdJQ0F2THlCMGFHRjBJRzV2SUc5eVpHVnlJR1Y0YVhOMGN5d2dZbVZqWVhWelpTQjBhR1VnWldGeWJHbGxjaUJoZEhSbGJYQjBJRzFoZVNCb1lYWmxJR055WldGMFpXUWdhWFF1Q2lBZ0lDQnNaWFFnZFc1alpYSjBZV2x1SUQwZ1ptRnNjMlU3Q2lBZ0lDQnNaWFFnYkdGemREc0tJQ0FnSUdadmNpQW9iR1YwSUdGMGRHVnRjSFFnUFNBeE95QmhkSFJsYlhCMElEdzlJRVJKVTFCQlZFTklYMVJTU1VWVE95QmhkSFJsYlhCMEt5c3BJSHNLSUNBZ0lDQWdhV1lnS0dGMGRHVnRjSFFnUGlBeEtTQjdDaUFnSUNBZ0lDQWdhV1lnS0VSaGRHVXVibTkzS0NrZ1BqMGdaR1ZoWkd4cGJtVXBJR0p5WldGck93b2dJQ0FnSUNBZ0lHRjNZV2wwSUhOc1pXVndLR0poWTJ0dlptWW9ZWFIwWlcxd2RDQXRJREVwS1RzS0lDQWdJQ0FnZlFvZ0lDQWdJQ0IwY25rZ2V3b2dJQ0FnSUNBZ0lDOHZJRVYyWlhKNUlHRjBkR1Z0Y0hRZ1kyRnljbWxsY3lCMGFHVWdjMkZ0WlNCamIyMXRZVzVrWDJsa0xDQnpieUJoSUhKbGNHVmhkQ0JoYm5OM1pYSnpJSFJvWlNCdmNtbG5hVzVoYkNCdGFYTnphVzl1Q2lBZ0lDQWdJQ0FnTHk4Z2FXNXpkR1ZoWkNCdlppQndiR0ZqYVc1bklHRWdjMlZqYjI1a0lHOXlaR1Z5TGdvZ0lDQWdJQ0FnSUdOdmJuTjBJR055WldGMFpXUWdQU0JoZDJGcGRDQjNhWFJvVkdsdFpXOTFkQ2htYkdWbGRDNWpjbVZoZEdWTmFYTnphVzl1S0hKdlltOTBTV1FzSUdKdlpIa3BLVHNLSUNBZ0lDQWdJQ0JqYjI1emRDQnRhWE56YVc5dVNXUWdQU0JqY21WaGRHVmtJQ1ltSUNoamNtVmhkR1ZrTG0xcGMzTnBiMjVmYVdRZ1B6OGdZM0psWVhSbFpDNXBaQ2s3Q2lBZ0lDQWdJQ0FnYVdZZ0tHMXBjM05wYjI1SlpDQWhQU0J1ZFd4c0lDWW1JQ2hqY21WaGRHVmtMbU52YlcxaGJtUmZhV1FnUFQwZ2JuVnNiQ0I4ZkNCamNtVmhkR1ZrTG1OdmJXMWhibVJmYVdRZ1BUMDlJR05wWkNrcElISmxkSFZ5YmlCdGFYTnphVzl1U1dRN0NpQWdJQ0FnSUNBZ2JHRnpkQ0E5SUc1bGR5QkZjbkp2Y2loZ2RXNWxlSEJsWTNSbFpDQmhibk4zWlhJZ2RHOGdZM0psWVhSbE9pQWtlMHBUVDA0dWMzUnlhVzVuYVdaNUtHTnlaV0YwWldRcGZXQXBPd29nSUNBZ0lDQWdJSFZ1WTJWeWRHRnBiaUE5SUhSeWRXVTdDaUFnSUNBZ0lDQWdZbkpsWVdzN0NpQWdJQ0FnSUgwZ1kyRjBZMmdnS0dWeWNpa2dld29nSUNBZ0lDQWdJR3hoYzNRZ1BTQmxjbkk3Q2lBZ0lDQWdJQ0FnWTI5dWMzUWdhMmx1WkNBOUlHTnNZWE56YVdaNUtHVnljaWs3Q2lBZ0lDQWdJQ0FnYVdZZ0tHdHBibVFnUFQwOUlDSnlaV3BsWTNSbFpDSWdmSHdnYTJsdVpDQTlQVDBnSW1SbGJtbGxaQ0lwSUhzS0lDQWdJQ0FnSUNBZ0lHbG1JQ2doZFc1alpYSjBZV2x1S1NCMGFISnZkeUJqYjJSbFpFVnljbTl5S0NKeVpXWjFjMlZrSWl3Z1lHTnZiVzFoYm1RZ0pIdGpiMjF0WVc1a1NXUjlJSEpsWm5WelpXUTZJQ1I3WlhKeUxtMWxjM05oWjJWOVlDd2daWEp5S1RzS0lDQWdJQ0FnSUNBZ0lHSnlaV0ZyT3dvZ0lDQWdJQ0FnSUgwS0lDQWdJQ0FnSUNCcFppQW9hMmx1WkNBOVBUMGdJbXh2YzNRaUtTQjFibU5sY25SaGFXNGdQU0IwY25WbE93b2dJQ0FnSUNCOUNpQWdJQ0I5Q2lBZ0lDQnBaaUFvSVhWdVkyVnlkR0ZwYmlrZ2V3b2dJQ0FnSUNCMGFISnZkeUJqYjJSbFpFVnljbTl5S0NKeVpXWjFjMlZrSWl3Z1lHTnZiVzFoYm1RZ0pIdGpiMjF0WVc1a1NXUjlJSFIxY201bFpDQmhkMkY1T2lBa2UyeGhjM1FnSmlZZ2JHRnpkQzV0WlhOellXZGxmV0FzSUd4aGMzUXBPd29nSUNBZ2ZRb2dJQ0FnWTI5dWMzUWdabTkxYm1RZ1BTQmhkMkZwZENCbWFXNWtUV2x6YzJsdmJpaHliMkp2ZEVsa0xDQmphV1FwT3dvZ0lDQWdhV1lnS0dadmRXNWtJQ0U5SUc1MWJHd3BJSEpsZEhWeWJpQm1iM1Z1WkRzS0lDQWdJSFJvY205M0lHTnZaR1ZrUlhKeWIzSW9DaUFnSUNBZ0lDSjFibkpsYzI5c2RtVmtJaXdLSUNBZ0lDQWdZR05oYm01dmRDQjBaV3hzSUhkb1pYUm9aWElnWTI5dGJXRnVaQ0FrZTJOdmJXMWhibVJKWkgwZ1ltVmpZVzFsSUdGdUlHOXlaR1Z5T2lBa2UyeGhjM1FnSmlZZ2JHRnpkQzV0WlhOellXZGxmV0FzQ2lBZ0lDQWdJR3hoYzNRc0NpQWdJQ0FwT3dvZ0lIMHNDZ29nSUdGemVXNWpJSGRoYVhRb2JXbHpjMmx2Ymtsa0xDQnZjSFJ6S1NCN0NpQWdJQ0JqYjI1emRDQnRZWGhRYjJ4c2N5QTlJSEJ2Ykd4TWFXMXBkQ2h2Y0hSeklDWW1JRzl3ZEhNdWJXRjRVRzlzYkhNcE93b2dJQ0FnYkdWMElIQnZiR3h6SUQwZ01Ec0tJQ0FnSUd4bGRDQndZWFZ6WlNBOUlGQlBURXhmVFVsT1gwMVRPd29nSUNBZ2JHVjBJRzFwYzNOcGJtY2dQU0F3T3dvZ0lDQWdkMmhwYkdVZ0tIQnZiR3h6SUR3Z2JXRjRVRzlzYkhNcElIc0tJQ0FnSUNBZ2FXWWdLSEJ2Ykd4eklENGdNQ2tnZXdvZ0lDQWdJQ0FnSUdGM1lXbDBJSE5zWldWd0tIQmhkWE5sS1RzS0lDQWdJQ0FnSUNCd1lYVnpaU0E5SUUxaGRHZ3ViV2x1S0ZCUFRFeGZUVUZZWDAxVExDQk5ZWFJvTG5KdmRXNWtLSEJoZFhObElDb2dNUzQxS1NrN0NpQWdJQ0FnSUgwS0lDQWdJQ0FnY0c5c2JITXJLenNLSUNBZ0lDQWdiR1YwSUcxcGMzTnBiMjQ3Q2lBZ0lDQWdJSFJ5ZVNCN0NpQWdJQ0FnSUNBZ2JXbHpjMmx2YmlBOUlHRjNZV2wwSUhkcGRHaFVhVzFsYjNWMEtHWnNaV1YwTG1kbGRFMXBjM05wYjI0b2JXbHpjMmx2Ymtsa0tTazdDaUFnSUNBZ0lIMGdZMkYwWTJnZ0tHVnljaWtnZXdvZ0lDQWdJQ0FnSUdOdmJuTjBJR3RwYm1RZ1BTQmpiR0Z6YzJsbWVTaGxjbklwT3dvZ0lDQWdJQ0FnSUdsbUlDaHJhVzVrSUQwOVBTQWliRzl6ZENJZ2ZId2dhMmx1WkNBOVBUMGdJbUoxYzNraUtTQmpiMjUwYVc1MVpUc0tJQ0FnSUNBZ0lDQXZMeUJCSUcxcGMzTnBiMjRnYjI1c2VTQnFkWE4wSUdOeVpXRjBaV1FnYldGNUlHNXZkQ0JpWlNCeVpXRmtZV0pzWlNCNVpYUXVDaUFnSUNBZ0lDQWdhV1lnS0hOMFlYUjFjMDltS0dWeWNpa2dQVDA5SURRd05DQW1KaUFySzIxcGMzTnBibWNnUEQwZ1RrOVVYMFpQVlU1RVgxUlNTVVZUS1NCamIyNTBhVzUxWlRzS0lDQWdJQ0FnSUNCMGFISnZkeUJsY25JN0NpQWdJQ0FnSUgwS0lDQWdJQ0FnWTI5dWMzUWdjM1JoZEdVZ1BTQlVSVkpOU1U1QlRGdFRkSEpwYm1jb2JXbHpjMmx2YmlBbUppQnRhWE56YVc5dUxuTjBZWFIxY3lrdWRHOU1iM2RsY2tOaGMyVW9LVjA3Q2lBZ0lDQWdJR2xtSUNoemRHRjBaU2tnY21WMGRYSnVJSHNnYzNSaGRHVXNJSEJ2Ykd4eklIMDdDaUFnSUNCOUNpQWdJQ0J5WlhSMWNtNGdleUJ6ZEdGMFpUb2dJblJwYldWdmRYUWlMQ0J3YjJ4c2N5QjlPd29nSUgwc0Nnb2dJR0Z6ZVc1aklHTmhibU5sYkNodGFYTnphVzl1U1dRcElIc0tJQ0FnSUdadmNpQW9iR1YwSUhKdmRXNWtJRDBnTVRzZ095QnliM1Z1WkNzcktTQjdDaUFnSUNBZ0lDOHZJRU5oYm1ObGJHeHBibWNnYVhNZ2FXUmxiWEJ2ZEdWdWRDQnZiaUIwYUdVZ2RtVnVaRzl5T2lCaElHWnBibWx6YUdWa0lHOXlJR05oYm1ObGJHeGxaQ0J0YVhOemFXOXVJR2x6SUd4bFpuUWdkVzVqYUdGdVoyVmtMZ29nSUNBZ0lDQmpiMjV6ZENCdGFYTnphVzl1SUQwZ1lYZGhhWFFnZDJsMGFGSmxkSEpwWlhNb0tDa2dQVDRnWm14bFpYUXVZMkZ1WTJWc1RXbHpjMmx2YmlodGFYTnphVzl1U1dRcExDQkRRVXhNWDFSU1NVVlRLVHNLSUNBZ0lDQWdZMjl1YzNRZ2MzUmhkSFZ6SUQwZ2JXbHpjMmx2YmlBbUppQnRhWE56YVc5dUxuTjBZWFIxY3pzS0lDQWdJQ0FnYVdZZ0tITjBZWFIxY3lBOVBTQnVkV3hzSUh4OElGUkZVazFKVGtGTVcxTjBjbWx1WnloemRHRjBkWE1wTG5SdlRHOTNaWEpEWVhObEtDbGRLU0J5WlhSMWNtNDdDaUFnSUNBZ0lHbG1JQ2h5YjNWdVpDQStQU0JEUVU1RFJVeGZVazlWVGtSVEtTQjdDaUFnSUNBZ0lDQWdkR2h5YjNjZ1kyOWtaV1JGY25KdmNpZ2lkVzV5WlhOdmJIWmxaQ0lzSUdCdGFYTnphVzl1SUNSN2JXbHpjMmx2Ymtsa2ZTQnpkR2xzYkNBa2UzTjBZWFIxYzMwZ1lXWjBaWElnWTJGdVkyVnNZQ2s3Q2lBZ0lDQWdJSDBLSUNBZ0lDQWdZWGRoYVhRZ2MyeGxaWEFvWW1GamEyOW1aaWh5YjNWdVpDa3BPd29nSUNBZ2ZRb2dJSDBzQ24wN0NncTdId29QZEhKcFlXd3ZjMjl1Ym1WMExtcHpFcWNmSjNWelpTQnpkSEpwWTNRbk93b0tZMjl1YzNRZ2MyeGxaWEFnUFNBb2JYTXBJRDArSUc1bGR5QlFjbTl0YVhObEtDaHlLU0E5UGlCelpYUlVhVzFsYjNWMEtISXNJRzF6S1NrN0NncG1kVzVqZEdsdmJpQnpkR0YwZFhOUFppaGxjbklwSUhzS0lDQmpiMjV6ZENCdElEMGdMMTVvYjNOMElHRndhU0FvWEdSN00zMHBPaTh1WlhobFl5Z29aWEp5SUNZbUlHVnljaTV0WlhOellXZGxLU0I4ZkNBbkp5azdDaUFnY21WMGRYSnVJRzBnUHlCT2RXMWlaWElvYlZzeFhTa2dPaUJ1ZFd4c093cDlDZ3BtZFc1amRHbHZiaUJ1YjNSUVpYSnRhWFIwWldRb1pYSnlLU0I3Q2lBZ2NtVjBkWEp1SUM5dWIzUWdjR1Z5YldsMGRHVmtJR0o1SUhOaGJtUmliM2dnWTJGd1lXSnBiR2wwZVM4dWRHVnpkQ2dvWlhKeUlDWW1JR1Z5Y2k1dFpYTnpZV2RsS1NCOGZDQW5KeWs3Q24wS0NpOHZJRUVnWm1GcGJIVnlaU0IwYUdGMElITmhlWE1nYm05MGFHbHVaeUJrWldacGJtbDBaU0JoWW05MWRDQjBhR1VnZG1WdVpHOXlKM01nYzNSaGRHVTZJRzV2SUdGdWMzZGxjaXdnWVNCc2IzTjBDaTh2SUdGdWMzZGxjaXdnYjNWeUlHOTNiaUIwYVcxbGIzVjBMQ0J2Y2lCaElEVjRlQzRLWm5WdVkzUnBiMjRnYVhOVWNtRnVjMmxsYm5Rb1pYSnlLU0I3Q2lBZ2FXWWdLQ0ZsY25JZ2ZId2dibTkwVUdWeWJXbDBkR1ZrS0dWeWNpa3BJSEpsZEhWeWJpQm1ZV3h6WlRzS0lDQnBaaUFvWlhKeUxuUnBiV1ZrVDNWMEtTQnlaWFIxY200Z2RISjFaVHNLSUNCamIyNXpkQ0J6SUQwZ2MzUmhkSFZ6VDJZb1pYSnlLVHNLSUNCeVpYUjFjbTRnY3lBOVBUMGdiblZzYkNBL0lHWmhiSE5sSURvZ2N5QStQU0ExTURBN0NuMEtDbVoxYm1OMGFXOXVJSGRwZEdoVWFXMWxiM1YwS0hBc0lHMXpLU0I3Q2lBZ2JHVjBJSFE3Q2lBZ1kyOXVjM1FnZEdsdFpYSWdQU0J1WlhjZ1VISnZiV2x6WlNnb1h5d2djbVZxS1NBOVBpQjdDaUFnSUNCMElEMGdjMlYwVkdsdFpXOTFkQ2dvS1NBOVBpQnlaV29vVDJKcVpXTjBMbUZ6YzJsbmJpaHVaWGNnUlhKeWIzSW9KMmh2YzNRZ1lYQnBJRFV3TWpvZ2RHbHRaVzkxZENjcExDQjdJSFJwYldWa1QzVjBPaUIwY25WbElIMHBLU3dnYlhNcE93b2dJSDBwT3dvZ0lISmxkSFZ5YmlCUWNtOXRhWE5sTG5KaFkyVW9XM0FzSUhScGJXVnlYU2t1Wm1sdVlXeHNlU2dvS1NBOVBpQmpiR1ZoY2xScGJXVnZkWFFvZENrcE93cDlDZ292THlCTllYQWdkR2hsSUhCc1lYUm1iM0p0SjNNZ1kyOXRiV0Z1WkNCcFpDQnZiblJ2SUhSb1pTQjJaVzVrYjNJbmN5QmhiR3h2ZDJWa0lHRnNjR2hoWW1WMElDZzRMVFkwSUc5bUlFRXRXbUV0ZWpBdE9TMWZLU3dLTHk4Z2FXNXFaV04wYVhabGJIa3NJSE52SUdScGMzUnBibU4wSUdOdmJXMWhibVJ6SUc1bGRtVnlJSE5vWVhKbElHRWdkbVZ1Wkc5eUlHNWhiV1V1Q21aMWJtTjBhVzl1SUhabGJtUnZja052YlcxaGJtUkpaQ2hwWkNrZ2V3b2dJR052Ym5OMElITWdQU0JUZEhKcGJtY29hV1FwT3dvZ0lHbG1JQ2d2WGx0QkxWcGhMWG93TFRsZkxWMTdPQ3cyTkgwa0x5NTBaWE4wS0hNcEtTQnlaWFIxY200Z2N6c0tJQ0JzWlhRZ2IzVjBJRDBnSjJOZkp6c0tJQ0JtYjNJZ0tHTnZibk4wSUdOb0lHOW1JSE1wSUhzS0lDQWdJR2xtSUNndlcwRXRXbUV0ZWpBdE9WOWRMeTUwWlhOMEtHTm9LU2tnYjNWMElDczlJR05vT3dvZ0lDQWdaV3h6WlNCdmRYUWdLejBnSnkwbklDc2dZMmd1WTI5a1pWQnZhVzUwUVhRb01Da3VkRzlUZEhKcGJtY29NVFlwSUNzZ0p5MG5Pd29nSUgwS0lDQjNhR2xzWlNBb2IzVjBMbXhsYm1kMGFDQThJRGdwSUc5MWRDQXJQU0FuWHljN0NpQWdjbVYwZFhKdUlHOTFkQzV6YkdsalpTZ3dMQ0EyTkNrN0NuMEtDbVoxYm1OMGFXOXVJR1poYVd3b1kyOWtaU3dnYldWemMyRm5aU2tnZXdvZ0lISmxkSFZ5YmlCUFltcGxZM1F1WVhOemFXZHVLRzVsZHlCRmNuSnZjaWh0WlhOellXZGxLU3dnZXlCamIyUmxJSDBwT3dwOUNncHRiMlIxYkdVdVpYaHdiM0owY3lBOUlIc0tJQ0JoYzNsdVl5QnBiblpsYm5SdmNua29LU0I3Q2lBZ0lDQnNaWFFnYkdGemRFVnljanNLSUNBZ0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dOVHNnYVNzcktTQjdDaUFnSUNBZ0lIUnllU0I3Q2lBZ0lDQWdJQ0FnWTI5dWMzUWdjbVZ6SUQwZ1lYZGhhWFFnZDJsMGFGUnBiV1Z2ZFhRb1pteGxaWFF1YkdsemRGSnZZbTkwY3lncExDQTRNREF3S1RzS0lDQWdJQ0FnSUNCeVpYUjFjbTRnS0hKbGN5NXliMkp2ZEhNZ2ZId2dXMTBwTG0xaGNDZ29jaWtnUFQ0Z0tIc2dhV1E2SUhJdWFXUXNJSE4wWVhSMWN6b2djaTV6ZEdGMGRYTXNJR0poZEhSbGNuazZJSEl1WW1GMGRHVnllU0I5S1NrN0NpQWdJQ0FnSUgwZ1kyRjBZMmdnS0dVcElIc0tJQ0FnSUNBZ0lDQnNZWE4wUlhKeUlEMGdaVHNLSUNBZ0lDQWdJQ0JwWmlBb0lXbHpWSEpoYm5OcFpXNTBLR1VwS1NCMGFISnZkeUJsT3dvZ0lDQWdJQ0FnSUdGM1lXbDBJSE5zWldWd0tERXdNQ2s3Q2lBZ0lDQWdJSDBLSUNBZ0lIMEtJQ0FnSUhSb2NtOTNJR3hoYzNSRmNuSTdDaUFnZlN3S0NpQWdZWE41Ym1NZ1pHbHpjR0YwWTJnb2NtOWliM1JKWkN3Z2RHRnlaMlYwTENCamIyMXRZVzVrU1dRcElIc0tJQ0FnSUdOdmJuTjBJR05wWkNBOUlIWmxibVJ2Y2tOdmJXMWhibVJKWkNoamIyMXRZVzVrU1dRcE93b2dJQ0FnWTI5dWMzUWdZbTlrZVNBOUlIc2dkR0Z5WjJWME9pQjdJSGc2SUhSaGNtZGxkQzU0TENCNU9pQjBZWEpuWlhRdWVTQjlMQ0JqYjIxdFlXNWtYMmxrT2lCamFXUWdmVHNLSUNBZ0lDOHZJRkpsZEhKNWFXNW5JSGRwZEdnZ2RHaGxJSE5oYldVZ1kyOXRiV0Z1WkY5cFpDQnBjeUJwWkdWdGNHOTBaVzUwSUc5dUlIUm9aU0IyWlc1a2IzSTZJR2wwSUdGdWMzZGxjbk1nZDJsMGFDQjBhR1VLSUNBZ0lDOHZJRzl5YVdkcGJtRnNJRzFwYzNOcGIyNHNJSE52SUdsMElHTmhiaUJ1WlhabGNpQmlaV052YldVZ1lTQnpaV052Ym1RZ2IzSmtaWEl1Q2lBZ0lDQm1iM0lnS0d4bGRDQmhkSFJsYlhCMElEMGdNRHNnWVhSMFpXMXdkQ0E4SURVN0lHRjBkR1Z0Y0hRckt5a2dld29nSUNBZ0lDQnNaWFFnY21Wek93b2dJQ0FnSUNCMGNua2dld29nSUNBZ0lDQWdJSEpsY3lBOUlHRjNZV2wwSUhkcGRHaFVhVzFsYjNWMEtHWnNaV1YwTG1OeVpXRjBaVTFwYzNOcGIyNG9jbTlpYjNSSlpDd2dZbTlrZVNrc0lEZ3dNREFwT3dvZ0lDQWdJQ0I5SUdOaGRHTm9JQ2hsS1NCN0NpQWdJQ0FnSUNBZ2FXWWdLR2x6VkhKaGJuTnBaVzUwS0dVcEtTQjdDaUFnSUNBZ0lDQWdJQ0JoZDJGcGRDQnpiR1ZsY0NneE1EQWdLaUFvWVhSMFpXMXdkQ0FySURFcEtUc0tJQ0FnSUNBZ0lDQWdJR052Ym5ScGJuVmxPd29nSUNBZ0lDQWdJSDBLSUNBZ0lDQWdJQ0IwYUhKdmR5Qm1ZV2xzS0NkeVpXWjFjMlZrSnl3Z1lIWmxibVJ2Y2lCeVpXWjFjMlZrSUc5eVpHVnlPaUFrZTJVdWJXVnpjMkZuWlgxZ0tUc0tJQ0FnSUNBZ2ZRb2dJQ0FnSUNCcFppQW9JWEpsY3lCOGZDQWhjbVZ6TG0xcGMzTnBiMjVmYVdRcElIUm9jbTkzSUdaaGFXd29KM1Z1Y21WemIyeDJaV1FuTENBbmRtVnVaRzl5SUdGdWMzZGxjaUJvWVdRZ2JtOGdiV2x6YzJsdmJpQnBaQ2NwT3dvZ0lDQWdJQ0JwWmlBb2NtVnpMbU52YlcxaGJtUmZhV1FnSVQwOUlIVnVaR1ZtYVc1bFpDQW1KaUJ5WlhNdVkyOXRiV0Z1WkY5cFpDQWhQVDBnWTJsa0tTQjdDaUFnSUNBZ0lDQWdkR2h5YjNjZ1ptRnBiQ2duZFc1eVpYTnZiSFpsWkNjc0lDZDJaVzVrYjNJZ1lXNXpkMlZ5WldRZ2QybDBhQ0JoSUdScFptWmxjbVZ1ZENCamIyMXRZVzVrSnlrN0NpQWdJQ0FnSUgwS0lDQWdJQ0FnYVdZZ0tISmxjeTV5YjJKdmRDQWhQVDBnZFc1a1pXWnBibVZrSUNZbUlISmxjeTV5YjJKdmRDQWhQVDBnY205aWIzUkpaQ2tnZXdvZ0lDQWdJQ0FnSUhSb2NtOTNJR1poYVd3b0ozVnVjbVZ6YjJ4MlpXUW5MQ0FuZG1WdVpHOXlJR0Z1YzNkbGNtVmtJSGRwZEdnZ1lTQmthV1ptWlhKbGJuUWdjbTlpYjNRbktUc0tJQ0FnSUNBZ2ZRb2dJQ0FnSUNCeVpYUjFjbTRnY21WekxtMXBjM05wYjI1ZmFXUTdDaUFnSUNCOUNpQWdJQ0IwYUhKdmR5Qm1ZV2xzS0NkMWJuSmxjMjlzZG1Wa0p5d2dKMjV2SUhWellXSnNaU0JoYm5OM1pYSWdabkp2YlNCMlpXNWtiM0k3SUc5eVpHVnlJSE4wWVhSbElIVnVhMjV2ZDI0bktUc0tJQ0I5TEFvS0lDQmhjM2x1WXlCM1lXbDBLRzFwYzNOcGIyNUpaQ3dnYjNCMGN5a2dld29nSUNBZ1kyOXVjM1FnYldGNFVHOXNiSE1nUFNBb2IzQjBjeUFtSmlCdmNIUnpMbTFoZUZCdmJHeHpLU0I4ZkNBMU1Ec0tJQ0FnSUd4bGRDQndiMnhzY3lBOUlEQTdDaUFnSUNCc1pYUWdaWEp5YjNKeklEMGdNRHNLSUNBZ0lIZG9hV3hsSUNod2IyeHNjeUE4SUcxaGVGQnZiR3h6S1NCN0NpQWdJQ0FnSUd4bGRDQnRPd29nSUNBZ0lDQjBjbmtnZXdvZ0lDQWdJQ0FnSUcwZ1BTQmhkMkZwZENCM2FYUm9WR2x0Wlc5MWRDaG1iR1ZsZEM1blpYUk5hWE56YVc5dUtHMXBjM05wYjI1SlpDa3NJRGd3TURBcE93b2dJQ0FnSUNCOUlHTmhkR05vSUNobEtTQjdDaUFnSUNBZ0lDQWdhV1lnS0dselZISmhibk5wWlc1MEtHVXBJQ1ltSUNzclpYSnliM0p6SUR3OUlETXdLU0I3Q2lBZ0lDQWdJQ0FnSUNCaGQyRnBkQ0J6YkdWbGNDZzFNQ2s3Q2lBZ0lDQWdJQ0FnSUNCamIyNTBhVzUxWlRzS0lDQWdJQ0FnSUNCOUNpQWdJQ0FnSUNBZ2RHaHliM2NnWlRzS0lDQWdJQ0FnZlFvZ0lDQWdJQ0J3YjJ4c2N5c3JPd29nSUNBZ0lDQnBaaUFvYlM1emRHRjBkWE1nUFQwOUlDZGtiMjVsSnlCOGZDQnRMbk4wWVhSMWN5QTlQVDBnSjJaaGFXeGxaQ2NnZkh3Z2JTNXpkR0YwZFhNZ1BUMDlJQ2RqWVc1alpXeHNaV1FuS1NCN0NpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhzZ2MzUmhkR1U2SUcwdWMzUmhkSFZ6TENCd2IyeHNjeUI5T3dvZ0lDQWdJQ0I5Q2lBZ0lDQWdJR2xtSUNod2IyeHNjeUE4SUcxaGVGQnZiR3h6S1NCaGQyRnBkQ0J6YkdWbGNDZzFNQ2s3Q2lBZ0lDQjlDaUFnSUNCeVpYUjFjbTRnZXlCemRHRjBaVG9nSjNScGJXVnZkWFFuTENCd2IyeHNjeUI5T3dvZ0lIMHNDZ29nSUdGemVXNWpJR05oYm1ObGJDaHRhWE56YVc5dVNXUXBJSHNLSUNBZ0lHeGxkQ0JzWVhOMFJYSnlPd29nSUNBZ1ptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQTFPeUJwS3lzcElIc0tJQ0FnSUNBZ2RISjVJSHNLSUNBZ0lDQWdJQ0J5WlhSMWNtNGdZWGRoYVhRZ2QybDBhRlJwYldWdmRYUW9abXhsWlhRdVkyRnVZMlZzVFdsemMybHZiaWh0YVhOemFXOXVTV1FwTENBNE1EQXdLVHNLSUNBZ0lDQWdmU0JqWVhSamFDQW9aU2tnZXdvZ0lDQWdJQ0FnSUd4aGMzUkZjbklnUFNCbE93b2dJQ0FnSUNBZ0lHbG1JQ2doYVhOVWNtRnVjMmxsYm5Rb1pTa3BJSFJvY205M0lHVTdDaUFnSUNBZ0lDQWdZWGRoYVhRZ2MyeGxaWEFvTVRBd0tUc0tJQ0FnSUNBZ2ZRb2dJQ0FnZlFvZ0lDQWdkR2h5YjNjZ2JHRnpkRVZ5Y2pzS0lDQjlMQXA5T3dvS2hnSUtDWEJzWVc0dWFuTnZiaEw0QVhzaVkyOXRiV0Z1WkhNaU9sdDdJbWxrSWpvaWNuVnVNRFF0WXpFaUxDSnliMkp2ZENJNkluSXhJaXdpZEdGeVoyVjBJanA3SW5naU9qTXNJbmtpT2pCOWZTeDdJbWxrSWpvaWNuVnVNRFF0WXpJaUxDSnliMkp2ZENJNkluSXlJaXdpZEdGeVoyVjBJanA3SW5naU9qRXdMQ0o1SWpvMGZYMHNleUpwWkNJNkluSjFiakEwTFdNeklpd2ljbTlpYjNRaU9pSnlNeUlzSW5SaGNtZGxkQ0k2ZXlKNElqb3dMQ0o1SWpveE5YMTlMSHNpYVdRaU9pSnlkVzR3TkMxak5DSXNJbkp2WW05MElqb2ljakVpTENKMFlYSm5aWFFpT25zaWVDSTZOVEFzSW5raU9qVXdmU3dpWTJGdVkyVnNJanAwY25WbGZWMTlFaVp1YjJSbElHaGhjbTVsYzNNdWFuTWdiRzl6ZEY5aFkyc2dZV1JoY0hSbGNpMTJNUzVxY3lvRlpteGxaWFE9IiwicmVzcG9uc2UiOiJDZ1prYjJOclpYSVNCbXRsY201bGJCaU1EQ0tlQXdnRUVrQmpOemt6WVRWbU1qazBNVGMwT1RCak9EUm1ZVFk1WkdRNE1qSXpaalZtTUdSbE1USTBNVE5tTm1ZM05EZ3lNelkyWlRNM1pXWXhZMkptTURRMk9HVXhHa0JsWldVNE1qZ3pNMkZsWW1Ka1ptUTJOR0prWW1aalpUVTROakZrTW1WbE9USmhNemhrTXpZelkySTBZVEZtT0dVME9HUmtOMlEzT0dVeU1qTmtNbVl3SWdaa2IyTnJaWElxQm10bGNtNWxiREpVWkc5amEyVnlMV2x0WVdkbE9uTm9ZVEkxTmpvek1tUmhOemRpTVdKbE1qUmtaVFJqTVRVeU5qWTNZekk0WVdJMk16VXpNVFF5TldOa05qa3dNREJoWTJZek1HRXpNamc1T0RWallqZzFOek0zTjJZM1FJZjRtTktXTkVpVGhKblNsalJxUUdNek0yVmtOamc0WVdObFptVTBabVk0WmpZeE5HSTBZalEwTXpnMU9XTXlaR0UwWVRRMU9XVXdOVGM0WkdWa01qRXdZMk15TWpBME16TTFNalpoWVRGeVlHOWphUzF0WVc1cFptVnpkRHBzYVc1MWVDOWhiV1EyTkVCemFHRXlOVFk2WVRabFpqSmxZVEZqT0dZeFpHVTFZemc0TldVeFlURTRZbUUzWldVMFpEazJNbVV6WVRnMU9UZzNOMlkyWmpRMll6Sm1ZamRsWW1Gak1XWTJZMk0xWXlwZ2IyTnBMVzFoYm1sbVpYTjBPbXhwYm5WNEwyRnRaRFkwUUhOb1lUSTFOanBoTm1WbU1tVmhNV000WmpGa1pUVmpPRGcxWlRGaE1UaGlZVGRsWlRSa09UWXlaVE5oT0RVNU9EYzNaalptTkRaak1tWmlOMlZpWVdNeFpqWmpZelZqTWxSa2IyTnJaWEl0YVcxaFoyVTZjMmhoTWpVMk9qTXlaR0UzTjJJeFltVXlOR1JsTkdNeE5USTJOamRqTWpoaFlqWXpOVE14TkRJMVkyUTJPVEF3TUdGalpqTXdZVE15T0RrNE5XTmlPRFUzTXpjM1pqZGE0QXdLcHdrS0ptNXZaR1VnYUdGeWJtVnpjeTVxY3lCc2IzTjBYMkZqYXlCaFpHRndkR1Z5TFhZeExtcHpFdmtJUVVSQlVGUkZVaTFTUlZCUFVsUWdleUp6WTJWdVlYSnBieUk2SW14dmMzUmZZV05ySWl3aVlXUmhjSFJsY2lJNkltRmtZWEIwWlhJdGRqRXVhbk1pTENKamIyMXdiR1YwWldRaU9uUnlkV1VzSW1OdmJXMWhibVJ6SWpwYmV5SnBaQ0k2SW5KMWJqQTBMV014SWl3aWNtOWliM1FpT2lKeU1TSXNJbTFwYzNOcGIyNGlPaUp0TVNJc0ltUnBjM0JoZEdOb1pXUWlPaUp0TVNJc0luTjBZWFJsSWpvaVpHOXVaU0lzSW5CdmJHeHpJam96TENKdFlYaGZjRzlzYkhNaU9qUXdMQ0ozWVdsMFpXUWlPbnNpYzNSaGRHVWlPaUprYjI1bElpd2ljRzlzYkhNaU9qTXNJbkpsZEhKcFpYTWlPakY5TENKbGNuSnZjaUk2SWlJc0ltTnZaR1VpT2lJaWZTeDdJbWxrSWpvaWNuVnVNRFF0WXpJaUxDSnliMkp2ZENJNkluSXlJaXdpYldsemMybHZiaUk2SW0weklpd2laR2x6Y0dGMFkyaGxaQ0k2SW0weklpd2ljM1JoZEdVaU9pSmtiMjVsSWl3aWNHOXNiSE1pT2pVc0ltMWhlRjl3YjJ4c2N5STZOREFzSW5kaGFYUmxaQ0k2ZXlKemRHRjBaU0k2SW1SdmJtVWlMQ0p3YjJ4c2N5STZOU3dpY21WMGNtbGxjeUk2TVgwc0ltVnljbTl5SWpvaUlpd2lZMjlrWlNJNklpSjlMSHNpYVdRaU9pSnlkVzR3TkMxak15SXNJbkp2WW05MElqb2ljak1pTENKdGFYTnphVzl1SWpvaWJUUWlMQ0prYVhOd1lYUmphR1ZrSWpvaWJUUWlMQ0p6ZEdGMFpTSTZJbVJ2Ym1VaUxDSndiMnhzY3lJNk5Td2liV0Y0WDNCdmJHeHpJam8wTUN3aWQyRnBkR1ZrSWpwN0luTjBZWFJsSWpvaVpHOXVaU0lzSW5CdmJHeHpJam8xTENKeVpYUnlhV1Z6SWpveGZTd2laWEp5YjNJaU9pSWlMQ0pqYjJSbElqb2lJbjBzZXlKcFpDSTZJbkoxYmpBMExXTTBJaXdpY205aWIzUWlPaUp5TVNJc0ltMXBjM05wYjI0aU9pSnROU0lzSW1ScGMzQmhkR05vWldRaU9pSnROU0lzSW5OMFlYUmxJam9pWTJGdVkyVnNiR1ZrSWl3aWNHOXNiSE1pT2pFc0ltMWhlRjl3YjJ4c2N5STZOU3dpZDJGcGRHVmtJanA3SW5OMFlYUmxJam9pWTJGdVkyVnNiR1ZrSWl3aWNHOXNiSE1pT2pFc0luSmxkSEpwWlhNaU9qRjlMQ0psY25KdmNpSTZJaUlzSW1OdlpHVWlPaUlpZlYwc0ltbHVkbVZ1ZEc5eWFXVnpJanBiZXlKeVpYUjFjbTVsWkNJNlczc2lhV1FpT2lKeU1TSXNJbk4wWVhSMWN5STZJbWxrYkdVaUxDSmlZWFIwWlhKNUlqbzVObjBzZXlKcFpDSTZJbkl5SWl3aWMzUmhkSFZ6SWpvaWFXUnNaU0lzSW1KaGRIUmxjbmtpT2pjeGZTeDdJbWxrSWpvaWNqTWlMQ0p6ZEdGMGRYTWlPaUpwWkd4bElpd2lZbUYwZEdWeWVTSTZOVGg5WFN3aVpYSnliM0lpT2lJaWZTeDdJbkpsZEhWeWJtVmtJanBiZXlKcFpDSTZJbkl4SWl3aWMzUmhkSFZ6SWpvaWFXUnNaU0lzSW1KaGRIUmxjbmtpT2prMGZTeDdJbWxrSWpvaWNqSWlMQ0p6ZEdGMGRYTWlPaUpwWkd4bElpd2lZbUYwZEdWeWVTSTZOamg5TEhzaWFXUWlPaUp5TXlJc0luTjBZWFIxY3lJNkltbGtiR1VpTENKaVlYUjBaWEo1SWpvMU5IMWRMQ0psY25KdmNpSTZJaUo5WFN3aWNHOXNiSE1pT2pFMExDSnlaWFJ5YVdWeklqb3hMQ0psY25KdmNuTWlPbHRkZlFvd2tRWVlBVUt4QXdvSFptRnVYMjkxZEJJRGJHOTNHZ1ZpWVhSamFDSURSMFZVS2drdmNtOWliM1J6THlveTlnSlVhR2x6SUhKMWJpQnRZV1JsSURZZ2MzVmpZMlZ6YzJaMWJDQkhSVlFnTDNKdlltOTBjeThxSUdOaGJHeHpJSFJ2SUc5dVpTQndaWEl0YVhSbGJTQnliM1YwWlNBb2RHaGxJSFJ5WVdObElHaHZiR1J6SUhSb1pTQjBaVzF3YkdGMFpTd2dibTkwSUhSb1pTQnBkR1Z0S1RzZ1lTQmpiMnhzWldOMGFXOXVJRzl5SUdKaGRHTm9JSEpsWVdRZ2QyOTFiR1FnWTI5MlpYSWdkR2hsYlNCcGJpQnZibVVnY21WeGRXVnpkQ0JwWmlCcGRDQnlaWFIxY201eklIUm9aU0J6WVcxbElHbDBaVzF6TGlCVWFHVWdjSEp2Wm1sc1pTQmtaV05zWVhKbGN5QkhSVlFnTDNKdlltOTBjeUJoY3lCMGFHbHpJSEp2ZFhSbEozTWdZbUYwWTJnZ1ptOXliU0JoYm1RZ1ozSmhiblJ6SUdsME95QjBhR1VnWkdWamJHRnlZWFJwYjI0Z2FYTWdkR2hsSUc5d1pYSmhkRzl5SjNNc0lHRnVaQ0J3YkdsdGMyOXNiQ0JvWVhNZ2JtOTBJR05vWldOclpXUWdkR2hoZENCcGRDQnlaWFIxY201eklIUm9aU0J6WVcxbElHbDBaVzF6TGpvRFIwVlVRZ2N2Y205aWIzUnpTQVZZK0FJPSIsImVudmVsb3BlIjp7InBheWxvYWRUeXBlIjoiYXBwbGljYXRpb24vdm5kLmluLXRvdG8ranNvbiIsInBheWxvYWQiOiJleUpmZEhsd1pTSTZJbWgwZEhCek9pOHZhVzR0ZEc5MGJ5NXBieTlUZEdGMFpXMWxiblF2ZGpFaUxDSnpkV0pxWldOMElqcGJleUp1WVcxbElqb2ljblZ1TFhKbFkyOXlaQ0lzSW1ScFoyVnpkQ0k2ZXlKemFHRXlOVFlpT2lKak16TmxaRFk0T0dGalpXWmxOR1ptT0dZMk1UUmlOR0kwTkRNNE5UbGpNbVJoTkdFME5UbGxNRFUzT0dSbFpESXhNR05qTWpJd05ETXpOVEkyWVdFeEluMTlYU3dpY0hKbFpHbGpZWFJsVkhsd1pTSTZJbWgwZEhCek9pOHZjR3hwYlhOdmJHeHRZWEpyTG1kcGRHaDFZaTVwYnk5d2JHbHRjMjlzYkM5eWRXNHRjbVZqYjNKa0wzWXhJaXdpY0hKbFpHbGpZWFJsSWpwN0luWmxjbk5wYjI0aU9qUXNJbkpsY1hWbGMzUmZjMmhoTWpVMklqb2lZemM1TTJFMVpqSTVOREUzTkRrd1l6ZzBabUUyT1dSa09ESXlNMlkxWmpCa1pURXlOREV6WmpabU56UTRNak0yTm1Vek4yVm1NV05pWmpBME5qaGxNU0lzSW5KbGMzVnNkRjl6YUdFeU5UWWlPaUpsWldVNE1qZ3pNMkZsWW1Ka1ptUTJOR0prWW1aalpUVTROakZrTW1WbE9USmhNemhrTXpZelkySTBZVEZtT0dVME9HUmtOMlEzT0dVeU1qTmtNbVl3SWl3aWNISnZkbWxrWlhJaU9pSmtiMk5yWlhJaUxDSnBjMjlzWVhScGIyNGlPaUpyWlhKdVpXd2lMQ0psYm5acGNtOXViV1Z1ZENJNkltUnZZMnRsY2kxcGJXRm5aVHB6YUdFeU5UWTZNekprWVRjM1lqRmlaVEkwWkdVMFl6RTFNalkyTjJNeU9HRmlOak0xTXpFME1qVmpaRFk1TURBd1lXTm1NekJoTXpJNE9UZzFZMkk0TlRjek56ZG1OeUlzSW5OdlpuUjNZWEpsWDJsa1pXNTBhWFI1SWpvaWIyTnBMVzFoYm1sbVpYTjBPbXhwYm5WNEwyRnRaRFkwUUhOb1lUSTFOanBoTm1WbU1tVmhNV000WmpGa1pUVmpPRGcxWlRGaE1UaGlZVGRsWlRSa09UWXlaVE5oT0RVNU9EYzNaalptTkRaak1tWmlOMlZpWVdNeFpqWmpZelZqSWl3aWNHOXNhV041SWpvaUlpd2ljM1JoY25SbFpGOTFibWw0WDIxeklqb3hOemt5TnpnME16VXdNakUxTENKbGJtUmxaRjkxYm1sNFgyMXpJam94TnpreU56ZzBNelV4TnpZekxDSnpaWE56YVc5dUlqb2lJaXdpYzJWeGRXVnVZMlVpT2pBc0luQnlaWFpwYjNWelgzTm9ZVEkxTmlJNklpSXNJbkpsWTI5eVpGOXphR0V5TlRZaU9pSmpNek5sWkRZNE9HRmpaV1psTkdabU9HWTJNVFJpTkdJME5ETTROVGxqTW1SaE5HRTBOVGxsTURVM09HUmxaREl4TUdOak1qSXdORE16TlRJMllXRXhJbjE5Iiwic2lnbmF0dXJlcyI6W3sia2V5aWQiOiIyMzY4ZTZhZjg2ZmI3OTg0YzUyZWEzNmIwNDI5OGFhZmM0OThhNzQ2MWYxMTZlMGU5OThlZmVkNzAyOTc0NTY3Iiwic2lnIjoiQnhCU3dTYkVQVGE0ZmZZTUhZVWRIYlg0M0lSRllKMnF0REtKOGxxRzlqeGo2eHBsenFxdkJXTW5BMkJtN0NsWm9aMk5tMFdQT0RCKyswNHNlcm5PQXc9PSJ9XX0sImxpbmsiOnsicGF5bG9hZFR5cGUiOiJhcHBsaWNhdGlvbi92bmQuaW4tdG90bytqc29uIiwicGF5bG9hZCI6ImV5SmZkSGx3WlNJNkltaDBkSEJ6T2k4dmFXNHRkRzkwYnk1cGJ5OVRkR0YwWlcxbGJuUXZkakVpTENKemRXSnFaV04wSWpwYmV5SnVZVzFsSWpvaVluVnVaR3hsTFd4cGJtVWlMQ0prYVdkbGMzUWlPbnNpYzJoaE1qVTJJam9pTWpoaVlUa3pZMll6WmpOa1ptVmhZemMyT1RGaU4yVmxNalpqTmpFME1qSXdNakU1Wm1ZMU1UZ3dORFE1T1dSalpEQXpaVGxrTkdFME5Ea3pNR1ZsWmlKOWZWMHNJbkJ5WldScFkyRjBaVlI1Y0dVaU9pSm9kSFJ3Y3pvdkwzQnNhVzF6YjJ4c2JXRnlheTVuYVhSb2RXSXVhVzh2Y0d4cGJYTnZiR3d2WW5WdVpHeGxMV3hwYm1zdmRqRWlMQ0p3Y21Wa2FXTmhkR1VpT25zaWFXNWtaWGdpT2pRc0luQnlaWFpwYjNWelgzTm9ZVEkxTmlJNklqVTRabUkyWkRFek56azBZVEUyWkRaalpHWTJOakV5Tmprek4yUmtaakUyT0RJM1pUSmhOalpoTm1abVpqRm1abU14Wmprd05qTmhNVFpqTkRnMU5XWWlMQ0psYm5SeWVWOXphR0V5TlRZaU9pSXlPR0poT1ROalpqTm1NMlJtWldGak56WTVNV0kzWldVeU5tTTJNVFF5TWpBeU1UbG1aalV4T0RBME5EazVaR05rTURObE9XUTBZVFEwT1RNd1pXVm1JbjE5Iiwic2lnbmF0dXJlcyI6W3sia2V5aWQiOiIyMzY4ZTZhZjg2ZmI3OTg0YzUyZWEzNmIwNDI5OGFhZmM0OThhNzQ2MWYxMTZlMGU5OThlZmVkNzAyOTc0NTY3Iiwic2lnIjoieDdLYUpGQUM0Z2FRUG9xN1FHTWhDdE9XeUZmUFBXUXJncmFURWxEYTBRRnlWcDdPckw0YTQ2bE1pUkZMZSt2dzg3VHJrM1hDdXlxaWlBTUlreEVlQ2c9PSJ9XX19",
                              "contentType": "application/json",
                              "encoding": "base64"
                            }
                          },
                          "name": "entry.json"
                        },
                        {
                          "contents": {
                            "attachment": {
                              "content": "eyJyZXF1ZXN0Ijp7Im1pbmltdW1faXNvbGF0aW9uIjoiY29udGFpbmVyIiwicHJvamVjdCI6eyJhcnRpZmFjdHMiOltdLCJmaWxlcyI6W3siY29udGVudCI6Ii8vIFRoZSBwbGF0Zm9ybSdzIGNvbmZvcm1hbmNlIGhhcm5lc3M6IGxvYWRzIGEgdmVuZG9yIGFkYXB0ZXIsIHJ1bnMgdGhlIGNvbW1hbmRzIG9mXG4vLyBwbGFuLmpzb24gdGhyb3VnaCBpdCBhZ2FpbnN0IHRoZSB2ZW5kb3IgQVBJIHRoZSBydW4ncyBncmFudCByZWFjaGVzLCBhbmQgcHJpbnRzIG9uZVxuLy8gcmVwb3J0IGxpbmUuXG4vL1xuLy8gICBub2RlIGhhcm5lc3MuanMgXHUwMDNjc2NlbmFyaW9cdTAwM2UgXHUwMDNjYWRhcHRlciBmaWxlXHUwMDNlXG4vL1xuLy8gVGhlIGhhcm5lc3MgaXMgdGhlIHBsYXRmb3JtJ3MgY29kZTsgdGhlIGFkYXB0ZXIgaXMgdGhlIGFnZW50J3MuIEJvdGggcnVuIGluc2lkZSB0aGVcbi8vIHNhbmRib3gsIGluIG9uZSBwcm9jZXNzLCBhbmQgdGhlIG9ubHkgd2F5IG91dCBpcyB0aGUgaW5qZWN0ZWQgYGZsZWV0YCBjbGllbnQuIFNvIHRoZVxuLy8gcmVwb3J0IGlzIHRoZSBhZGFwdGVyJ3MgY2xhaW06IHRoZSB2ZXJkaWN0IGlzIG1hZGUgb24gdGhlIGhvc3QsIGZyb20gdGhlIHBsYW4gYW5kIHRoZVxuLy8gdmVuZG9yJ3MgbGVkZ2VyLiBUaGUgc2NlbmFyaW8gYXJndW1lbnQgaXMgb25seSByZWNvcmRlZDsgdGhlIGhhcm5lc3MgZG9lcyBub3Qga25vd1xuLy8gd2hhdCB0aGUgdmVuZG9yIHdpbGwgZG8uXG5cInVzZSBzdHJpY3RcIjtcblxuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG5cbmNvbnN0IHNjZW5hcmlvID0gcHJvY2Vzcy5hcmd2WzJdO1xuY29uc3QgYWRhcHRlckZpbGUgPSBwcm9jZXNzLmFyZ3ZbM107XG5cbmNvbnN0IHJlcG9ydCA9IHsgc2NlbmFyaW8sIGFkYXB0ZXI6IGFkYXB0ZXJGaWxlLCBjb21wbGV0ZWQ6IGZhbHNlLCBjb21tYW5kczogW10sIGludmVudG9yaWVzOiBbXSwgcG9sbHM6IDAsIHJldHJpZXM6IDAsIGVycm9yczogW10gfTtcbmNvbnN0IGZhaWwgPSAobXNnKSA9XHUwMDNlIHsgcmVwb3J0LmVycm9ycy5wdXNoKG1zZyk7IH07XG5jb25zdCBmaW5pc2ggPSAoY29kZSkgPVx1MDAzZSB7IGNvbnNvbGUubG9nKFwiQURBUFRFUi1SRVBPUlQgXCIgKyBKU09OLnN0cmluZ2lmeShyZXBvcnQpKTsgcHJvY2Vzcy5leGl0KGNvZGUpOyB9O1xuY29uc3QgZXJyb3JPZiA9IChlKSA9XHUwMDNlICh7IGVycm9yOiBTdHJpbmcoKGUgXHUwMDI2XHUwMDI2IGUubWVzc2FnZSkgfHwgZSkuc2xpY2UoMCwgMjAwKSwgY29kZTogKGUgXHUwMDI2XHUwMDI2IHR5cGVvZiBlLmNvZGUgPT09IFwic3RyaW5nXCIpID8gZS5jb2RlIDogXCJcIiB9KTtcbi8vIFdoYXQgdGhlIGFkYXB0ZXIgcmV0dXJuZWQsIGFzIEpTT04sIHNvIHRoZSBob3N0IGNhbiBjaGVjayBpdHMgc2hhcGU6IG5ldmVyIGp1ZGdlZCBoZXJlLlxuY29uc3QgcmF3ID0gKHYpID1cdTAwM2Uge1xuICBpZiAodiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHsgY29uc3QgcyA9IEpTT04uc3RyaW5naWZ5KHYpOyByZXR1cm4gcy5sZW5ndGggXHUwMDNjPSA0MDk2ID8gSlNPTi5wYXJzZShzKSA6IHsgdHJ1bmNhdGVkOiBzLmxlbmd0aCB9OyB9IGNhdGNoIChlKSB7IHJldHVybiB7IHVuc2VyaWFsaXphYmxlOiBTdHJpbmcoZSBcdTAwMjZcdTAwMjYgZS5tZXNzYWdlKSB9OyB9XG59O1xuXG5jb25zdCBndWFyZCA9IHNldFRpbWVvdXQoKCkgPVx1MDAzZSB7IGZhaWwoXCJoYXJuZXNzIHRpbWVvdXQgYWZ0ZXIgNzUgc1wiKTsgZmluaXNoKDIpOyB9LCA3NTAwMCk7XG5ndWFyZC51bnJlZigpO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICBpZiAoIXNjZW5hcmlvIHx8ICFhZGFwdGVyRmlsZSkgeyBmYWlsKFwidXNhZ2U6IG5vZGUgaGFybmVzcy5qcyBcdTAwM2NzY2VuYXJpb1x1MDAzZSBcdTAwM2NhZGFwdGVyIGZpbGVcdTAwM2VcIik7IHJldHVybiBmaW5pc2goMik7IH1cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLmZsZWV0ICE9PSBcIm9iamVjdFwiKSB7IGZhaWwoXCJubyBmbGVldCBjbGllbnQgaW4gdGhpcyBydW46IHRoZSBncmFudCBpcyBtaXNzaW5nXCIpOyByZXR1cm4gZmluaXNoKDIpOyB9XG4gIGxldCBwbGFuO1xuICB0cnkgeyBwbGFuID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoXCJwbGFuLmpzb25cIiwgXCJ1dGY4XCIpKTsgfSBjYXRjaCAoZSkgeyBmYWlsKFwicGxhbi5qc29uOiBcIiArIGUubWVzc2FnZSk7IHJldHVybiBmaW5pc2goMik7IH1cbiAgbGV0IGFkYXB0ZXI7XG4gIHRyeSB7IGFkYXB0ZXIgPSByZXF1aXJlKFwiLi9cIiArIGFkYXB0ZXJGaWxlKTsgfSBjYXRjaCAoZSkgeyBmYWlsKFwiYWRhcHRlciBmYWlsZWQgdG8gbG9hZDogXCIgKyBlLm1lc3NhZ2UpOyByZXR1cm4gZmluaXNoKDEpOyB9XG4gIGZvciAoY29uc3QgZm4gb2YgW1wiaW52ZW50b3J5XCIsIFwiZGlzcGF0Y2hcIiwgXCJ3YWl0XCIsIFwiY2FuY2VsXCJdKSB7XG4gICAgaWYgKHR5cGVvZiBhZGFwdGVyW2ZuXSAhPT0gXCJmdW5jdGlvblwiKSB7IGZhaWwoXCJhZGFwdGVyIGRvZXMgbm90IGV4cG9ydCBcIiArIGZuKTsgfVxuICB9XG4gIGlmIChyZXBvcnQuZXJyb3JzLmxlbmd0aCkgcmV0dXJuIGZpbmlzaCgxKTtcblxuICAvLyAxLiBJbnZlbnRvcnksIHJlY29yZGVkIGFzIHJldHVybmVkLlxuICBjb25zdCB0YWtlSW52ZW50b3J5ID0gYXN5bmMgKCkgPVx1MDAzZSB7XG4gICAgdHJ5IHsgcmVwb3J0LmludmVudG9yaWVzLnB1c2goeyByZXR1cm5lZDogcmF3KGF3YWl0IGFkYXB0ZXIuaW52ZW50b3J5KCkpLCBlcnJvcjogXCJcIiB9KTsgfVxuICAgIGNhdGNoIChlKSB7IHJlcG9ydC5pbnZlbnRvcmllcy5wdXNoKHsgcmV0dXJuZWQ6IG51bGwsIGVycm9yOiBlcnJvck9mKGUpLmVycm9yIH0pOyB9XG4gIH07XG4gIGF3YWl0IHRha2VJbnZlbnRvcnkoKTtcblxuICAvLyAyLiBEaXNwYXRjaCBldmVyeSBjb21tYW5kLCB0aGVuIHdhaXQgZm9yIGVhY2ggbWlzc2lvbi4gQW4gZXJyb3IgdGhlIGFkYXB0ZXIgdGhyb3dzXG4gIC8vICAgIGlzIHJlY29yZGVkIGFnYWluc3QgaXRzIGNvbW1hbmQsIGFuZCB0aGUgcnVuIGdvZXMgb24uXG4gIGNvbnN0IHJvd3MgPSBwbGFuLmNvbW1hbmRzLm1hcCgoYykgPVx1MDAzZSAoeyBpZDogYy5pZCwgcm9ib3Q6IGMucm9ib3QsIG1pc3Npb246IFwiXCIsIGRpc3BhdGNoZWQ6IG51bGwsIHN0YXRlOiBcIlwiLCBwb2xsczogMCwgbWF4X3BvbGxzOiAwLCB3YWl0ZWQ6IG51bGwsIGVycm9yOiBcIlwiLCBjb2RlOiBcIlwiIH0pKTtcbiAgcmVwb3J0LmNvbW1hbmRzID0gcm93cztcbiAgY29uc3Qgc2VuZCA9IGFzeW5jIChjLCByb3cpID1cdTAwM2Uge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtID0gYXdhaXQgYWRhcHRlci5kaXNwYXRjaChjLnJvYm90LCBjLnRhcmdldCwgYy5pZCk7XG4gICAgICByb3cuZGlzcGF0Y2hlZCA9IHJhdyhtKTtcbiAgICAgIGlmICh0eXBlb2YgbSA9PT0gXCJzdHJpbmdcIiBcdTAwMjZcdTAwMjYgbSAhPT0gXCJcIikgcm93Lm1pc3Npb24gPSBtO1xuICAgIH0gY2F0Y2ggKGUpIHsgT2JqZWN0LmFzc2lnbihyb3csIGVycm9yT2YoZSkpOyB9XG4gIH07XG4gIGNvbnN0IHdhdGNoID0gYXN5bmMgKHJvdywgbWF4UG9sbHMpID1cdTAwM2Uge1xuICAgIGlmICghcm93Lm1pc3Npb24pIHJldHVybjtcbiAgICByb3cubWF4X3BvbGxzID0gbWF4UG9sbHM7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHcgPSBhd2FpdCBhZGFwdGVyLndhaXQocm93Lm1pc3Npb24sIHsgbWF4UG9sbHMgfSk7XG4gICAgICByb3cud2FpdGVkID0gcmF3KHcpO1xuICAgICAgcm93LnN0YXRlID0gKHcgXHUwMDI2XHUwMDI2IHR5cGVvZiB3LnN0YXRlID09PSBcInN0cmluZ1wiKSA/IHcuc3RhdGUgOiBcIlwiO1xuICAgICAgcm93LnBvbGxzID0gKHcgXHUwMDI2XHUwMDI2IHR5cGVvZiB3LnBvbGxzID09PSBcIm51bWJlclwiKSA/IHcucG9sbHMgOiAwO1xuICAgICAgcmVwb3J0LnBvbGxzICs9IHJvdy5wb2xscztcbiAgICAgIGlmICh3IFx1MDAyNlx1MDAyNiB0eXBlb2Ygdy5yZXRyaWVzID09PSBcIm51bWJlclwiKSByZXBvcnQucmV0cmllcyA9IE1hdGgubWF4KHJlcG9ydC5yZXRyaWVzLCB3LnJldHJpZXMpO1xuICAgIH0gY2F0Y2ggKGUpIHsgT2JqZWN0LmFzc2lnbihyb3csIGVycm9yT2YoZSkpOyB9XG4gIH07XG4gIGZvciAobGV0IGkgPSAwOyBpIFx1MDAzYyBwbGFuLmNvbW1hbmRzLmxlbmd0aDsgaSsrKSBpZiAoIXBsYW4uY29tbWFuZHNbaV0uY2FuY2VsKSBhd2FpdCBzZW5kKHBsYW4uY29tbWFuZHNbaV0sIHJvd3NbaV0pO1xuICAvLyBUaGUgcmVhZCBidWRnZXRzLCA0MCBhbmQgNSBiZWxvdywgYXJlIHF1YWxpZnkuV2FpdEJ1ZGdldCBhbmQgQ2FuY2VsV2FpdEJ1ZGdldC5cbiAgZm9yIChsZXQgaSA9IDA7IGkgXHUwMDNjIHBsYW4uY29tbWFuZHMubGVuZ3RoOyBpKyspIGlmICghcGxhbi5jb21tYW5kc1tpXS5jYW5jZWwpIGF3YWl0IHdhdGNoKHJvd3NbaV0sIDQwKTtcblxuICAvLyAzLiBUaGUgY29tbWFuZHMgdGhlIHBsYXRmb3JtIGNhbmNlbHM6IGRpc3BhdGNoLCBjYW5jZWwgYXQgb25jZSwgdGhlbiB3YWl0LlxuICBmb3IgKGxldCBpID0gMDsgaSBcdTAwM2MgcGxhbi5jb21tYW5kcy5sZW5ndGg7IGkrKykge1xuICAgIGlmICghcGxhbi5jb21tYW5kc1tpXS5jYW5jZWwpIGNvbnRpbnVlO1xuICAgIGF3YWl0IHNlbmQocGxhbi5jb21tYW5kc1tpXSwgcm93c1tpXSk7XG4gICAgaWYgKHJvd3NbaV0ubWlzc2lvbikge1xuICAgICAgdHJ5IHsgYXdhaXQgYWRhcHRlci5jYW5jZWwocm93c1tpXS5taXNzaW9uKTsgfSBjYXRjaCAoZSkgeyBPYmplY3QuYXNzaWduKHJvd3NbaV0sIGVycm9yT2YoZSkpOyB9XG4gICAgICBhd2FpdCB3YXRjaChyb3dzW2ldLCA1KTtcbiAgICB9XG4gIH1cblxuICAvLyA0LiBJbnZlbnRvcnkgYWdhaW4sIGFzIHRoZSBsYXN0IGNhbGwgb2YgdGhlIHJ1bi5cbiAgYXdhaXQgdGFrZUludmVudG9yeSgpO1xuXG4gIHJlcG9ydC5jb21wbGV0ZWQgPSByZXBvcnQuZXJyb3JzLmxlbmd0aCA9PT0gMDtcbiAgZmluaXNoKHJlcG9ydC5jb21wbGV0ZWQgPyAwIDogMSk7XG59XG5cbm1haW4oKS5jYXRjaCgoZSkgPVx1MDAzZSB7IGZhaWwoXCJoYXJuZXNzIGVycm9yOiBcIiArIChlIFx1MDAyNlx1MDAyNiBlLm1lc3NhZ2UpKTsgZmluaXNoKDEpOyB9KTtcbiIsInBhdGgiOiJoYXJuZXNzLmpzIn0seyJjb250ZW50IjoiLy8gRmxlZXQgdmVuZG9yIGFkYXB0ZXIsIGZpcnN0IHZlcnNpb24sIHdyaXR0ZW4gZnJvbSBQUk9NUFQubWQgKHRoZSBjb250cmFjdCBhbmQgdGhlXG4vLyBkZXNjcmlwdGlvbiBnZW5lcmF0ZWQgZnJvbSB0aGUgdmVuZG9yJ3MgT3BlbkFQSSBkb2N1bWVudCBhcyB0aGV5IHN0b29kIHRoZW4pIGJ5IHRoZVxuLy8gQUkgdGhhdCBidWlsdCB0aGlzIGV4YW1wbGUsIGluIHRoZSBzYW1lIHNlc3Npb24sIGJlZm9yZSB0aGUgbG9zdC1hY2tub3dsZWRnZW1lbnRcbi8vIHNjZW5hcmlvIGV4aXN0ZWQuIEl0IGlzIG5vdCBhbiBpbmRlcGVuZGVudCBhZ2VudCdzIGFuc3dlcjogaXRzIGF1dGhvciBhbHNvIHdyb3RlIHRoZVxuLy8gaGFybmVzcy4gSXRzIGNvZGUgaXMgdW5jaGFuZ2VkIHNpbmNlIGl0IHdhcyBmaXJzdCBjb21taXR0ZWQ7IG9ubHkgdGhpcyBjb21tZW50IHdhc1xuLy8gY29ycmVjdGVkLiBJdHMgaW52ZW50b3J5KCkgbGlzdHMgdGhlIHJvYm90cywgdGhlbiByZWFkcyBlYWNoIG9uZSBmb3IgaXRzIHN0YXRlOiBvbmVcbi8vIHJlcXVlc3QgcGVyIHJvYm90LiBJdHMgZGlzcGF0Y2goKSBwcmVkYXRlcyB0aGUgY29tbWFuZCBJRCBhbmQgaWdub3JlcyBpdC5cblwidXNlIHN0cmljdFwiO1xuXG5jb25zdCBzbGVlcCA9IChtcykgPVx1MDAzZSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPVx1MDAzZSBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG5sZXQgcmV0cmllcyA9IDA7XG5cbi8vIFRoZSB2ZW5kb3IgYW5zd2VycyA1MDMgd2hpbGUgaXQgaXMgZGVncmFkZWQ7IHdhaXQgYSBsaXR0bGUgYW5kIHRyeSBhZ2FpbiwgYSBib3VuZGVkXG4vLyBudW1iZXIgb2YgdGltZXMuIEFueSBvdGhlciBlcnJvciBpcyB0aGUgY2FsbGVyJ3MgdG8gc2VlLlxuYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5KGZuKSB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyA7IGF0dGVtcHQrKykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCB0cmFuc2llbnQgPSAvaG9zdCBhcGkgKDUwM3w0MjkpLy50ZXN0KFN0cmluZyhlIFx1MDAyNlx1MDAyNiBlLm1lc3NhZ2UpKTtcbiAgICAgIGlmICghdHJhbnNpZW50IHx8IGF0dGVtcHQgXHUwMDNlPSA0MCkgdGhyb3cgZTtcbiAgICAgIHJldHJpZXMrKztcbiAgICAgIGF3YWl0IHNsZWVwKDI1MCk7XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhc3luYyBpbnZlbnRvcnkoKSB7XG4gICAgY29uc3QgbGlzdCA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9XHUwMDNlIGZsZWV0Lmxpc3RSb2JvdHMoKSk7XG4gICAgY29uc3Qgb3V0ID0gW107XG4gICAgZm9yIChjb25zdCBzdW1tYXJ5IG9mIGxpc3Qucm9ib3RzKSB7XG4gICAgICBjb25zdCByb2JvdCA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9XHUwMDNlIGZsZWV0LmdldFJvYm90KHN1bW1hcnkuaWQpKTtcbiAgICAgIG91dC5wdXNoKHsgaWQ6IHJvYm90LmlkLCBzdGF0dXM6IHJvYm90LnN0YXR1cywgYmF0dGVyeTogcm9ib3QuYmF0dGVyeSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfSxcblxuICBhc3luYyBkaXNwYXRjaChyb2JvdElkLCB0YXJnZXQpIHtcbiAgICBjb25zdCBtaXNzaW9uID0gYXdhaXQgd2l0aFJldHJ5KCgpID1cdTAwM2UgZmxlZXQuY3JlYXRlTWlzc2lvbihyb2JvdElkLCB7IHRhcmdldCB9KSk7XG4gICAgcmV0dXJuIG1pc3Npb24ubWlzc2lvbl9pZDtcbiAgfSxcblxuICBhc3luYyB3YWl0KG1pc3Npb25JZCwgb3B0cykge1xuICAgIGNvbnN0IG1heFBvbGxzID0gKG9wdHMgXHUwMDI2XHUwMDI2IG9wdHMubWF4UG9sbHMpIHx8IDUwO1xuICAgIGZvciAobGV0IHBvbGxzID0gMTsgcG9sbHMgXHUwMDNjPSBtYXhQb2xsczsgcG9sbHMrKykge1xuICAgICAgY29uc3QgbWlzc2lvbiA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9XHUwMDNlIGZsZWV0LmdldE1pc3Npb24obWlzc2lvbklkKSk7XG4gICAgICBpZiAobWlzc2lvbi5zdGF0dXMgPT09IFwiZG9uZVwiIHx8IG1pc3Npb24uc3RhdHVzID09PSBcImZhaWxlZFwiIHx8IG1pc3Npb24uc3RhdHVzID09PSBcImNhbmNlbGxlZFwiKSB7XG4gICAgICAgIHJldHVybiB7IHN0YXRlOiBtaXNzaW9uLnN0YXR1cywgcG9sbHMsIHJldHJpZXMgfTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHNsZWVwKDIwKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhdGU6IFwidGltZW91dFwiLCBwb2xsczogbWF4UG9sbHMsIHJldHJpZXMgfTtcbiAgfSxcblxuICBhc3luYyBjYW5jZWwobWlzc2lvbklkKSB7XG4gICAgYXdhaXQgd2l0aFJldHJ5KCgpID1cdTAwM2UgZmxlZXQuY2FuY2VsTWlzc2lvbihtaXNzaW9uSWQpKTtcbiAgfSxcbn07XG4iLCJwYXRoIjoiYWRhcHRlci12MS5qcyJ9LHsiY29udGVudCI6Ii8vIEZsZWV0IHZlbmRvciBhZGFwdGVyLCBzZWNvbmQgdmVyc2lvbjogdHdvIGNoYW5nZXMgYWZ0ZXIgdGhlIGZpcnN0IHdhcyBxdWFsaWZpZWQuXG4vLyBpbnZlbnRvcnkoKSByZWFkcyB0aGUgbGlzdCBvbmNlLCBzaW5jZSB0aGUgcHJvZmlsZSBkZWNsYXJlcyBHRVQgL3JvYm90cyB0aGUgYmF0Y2hcbi8vIGZvcm0gb2YgR0VUIC9yb2JvdHMvKiAodGhlIGFkdmlzb3IncyBmaW5kaW5nKS4gZGlzcGF0Y2goKSBuYW1lcyBldmVyeSBvcmRlciB3aXRoIHRoZVxuLy8gcGxhdGZvcm0ncyBjb21tYW5kIElEIGFuZCwgd2hlbiB0aGUgdmVuZG9yJ3MgYW5zd2VyIGlzIGFuIGVycm9yIG9yIG5ldmVyIGNvbWVzLCBzZW5kc1xuLy8gdGhlIHNhbWUgY3JlYXRlIGFnYWluOiB0aGUgdmVuZG9yIGFuc3dlcnMgYSByZXBlYXRlZCBjb21tYW5kX2lkIHdpdGggdGhlIG9yZGVyIGl0XG4vLyBhbHJlYWR5IGhhcywgc28gYSByZXRyeSBjYW5ub3QgcGxhY2UgYSBzZWNvbmQgb3JkZXIsIGFuZCB0aGUgbWlzc2lvbiByZXR1cm5lZCBpcyB0aGVcbi8vIG9uZSB0aGlzIGNvbW1hbmQgY3JlYXRlZC4gSXQgbmV2ZXIgcmVhZHMgYSByb2JvdCdzIGN1cnJlbnQgbWlzc2lvbiB0byBndWVzcyB3aGljaFxuLy8gb3JkZXIgaXMgaXRzIG93bi5cbi8vXG4vLyBUd28gbGF0ZXIgcmVwYWlycywgYWZ0ZXIgZnVydGhlciB0ZXN0aW5nOiBhbiBlcnJvciBpcyBhIHJlZnVzYWwgb25seSB3aGVuIGl0IHNheXMgc29cbi8vIChhbiBlYXJsaWVyIHZlcnNpb24gdG9vayBhIDUwMCBhcyBvbmUsIGFuZCByZXBvcnRlZCBcInJlZnVzZWRcIiBmb3IgYW4gb3JkZXIgdGhlIHZlbmRvclxuLy8gaGFkIGFjY2VwdGVkIGJlZm9yZSBhbnN3ZXJpbmcgNTAwKTsgd2FpdCgpJ3MgbWF4UG9sbHMgYm91bmRzIGV2ZXJ5IHN0YXR1cyByZWFkLCBmYWlsZWRcbi8vIG9uZXMgaW5jbHVkZWQgKGFuIGVhcmxpZXIgdmVyc2lvbiByZXRyaWVkIGVhY2ggcmVhZCB1cCB0byA0MCB0aW1lcyk7IGFuZCBhIHN0YXR1c1xuLy8gYW5zd2VyIG5hbWluZyBhbm90aGVyIG1pc3Npb24gaXMgYSBmYWlsZWQgcmVhZCwgbmV2ZXIgdGhpcyBtaXNzaW9uJ3Mgc3RhdGUuXG5cInVzZSBzdHJpY3RcIjtcblxuY29uc3QgQVRURU1QVFMgPSA0MDsgLy8gY2FsbHMgb25lIG9wZXJhdGlvbiBtYXkgbWFrZSwgcmV0cmllcyBpbmNsdWRlZFxuY29uc3Qgc2xlZXAgPSAobXMpID1cdTAwM2UgbmV3IFByb21pc2UoKHJlc29sdmUpID1cdTAwM2Ugc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xubGV0IHJldHJpZXMgPSAwO1xuXG5jb25zdCBzdGF0dXNPZiA9IChlKSA9XHUwMDNlIE51bWJlcigoU3RyaW5nKGUgXHUwMDI2XHUwMDI2IGUubWVzc2FnZSkubWF0Y2goL2hvc3QgYXBpIChcXGR7M30pLykgfHwgW10pWzFdIHx8IDApO1xuXG4vLyBBIGRlZmluaXRlIHJlZnVzYWw6IHRoZSB2ZW5kb3Igc2FpZCBubyAoYSA0eHggb3RoZXIgdGhhbiA0MDggdGltZW91dCBhbmQgNDI5IHRvbyBtYW55XG4vLyByZXF1ZXN0cyksIG9yIHRoZSBjbGllbnQgbmV2ZXIgc2VudCB0aGUgY2FsbC4gQW55dGhpbmcgZWxzZSAoYSA1eHgsIGEgNDA4IG9yIDQyOSwgbm9cbi8vIGFuc3dlciBhdCBhbGwpIGxlYXZlcyB0aGUgb3V0Y29tZSB1bmtub3duOiB0aGUgcmVxdWVzdCBtYXkgb3IgbWF5IG5vdCBoYXZlIHRha2VuIGVmZmVjdC5cbmNvbnN0IHJlZnVzZWQgPSAoZSkgPVx1MDAzZSB7XG4gIGNvbnN0IHMgPSBzdGF0dXNPZihlKTtcbiAgcmV0dXJuIChzIFx1MDAzZT0gNDAwIFx1MDAyNlx1MDAyNiBzIFx1MDAzYyA1MDAgXHUwMDI2XHUwMDI2IHMgIT09IDQwOCBcdTAwMjZcdTAwMjYgcyAhPT0gNDI5KSB8fCAvbm90IHBlcm1pdHRlZCBieSBzYW5kYm94IGNhcGFiaWxpdHkvLnRlc3QoU3RyaW5nKGUgXHUwMDI2XHUwMDI2IGUubWVzc2FnZSkpO1xufTtcblxuY29uc3QgZmFpbHVyZSA9IChjb2RlLCBtZXNzYWdlKSA9XHUwMDNlIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKG1lc3NhZ2UpLCB7IGNvZGUgfSk7XG5cbi8vIFJlYWRzIGFuZCBjYW5jZWxzIGFyZSBzYWZlIHRvIHJlcGVhdDogdHJ5IHVwIHRvIEFUVEVNUFRTIHRpbWVzIHdoaWxlIHRoZSBvdXRjb21lIGlzIHVua25vd24uXG5hc3luYyBmdW5jdGlvbiB3aXRoUmV0cnkoZm4pIHtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IDsgYXR0ZW1wdCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChyZWZ1c2VkKGUpIHx8IGF0dGVtcHQgXHUwMDNlPSBBVFRFTVBUUykgdGhyb3cgZTtcbiAgICAgIHJldHJpZXMrKztcbiAgICAgIGF3YWl0IHNsZWVwKDI1MCk7XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhc3luYyBpbnZlbnRvcnkoKSB7XG4gICAgY29uc3QgbGlzdCA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9XHUwMDNlIGZsZWV0Lmxpc3RSb2JvdHMoKSk7XG4gICAgcmV0dXJuIGxpc3Qucm9ib3RzLm1hcCgocm9ib3QpID1cdTAwM2UgKHsgaWQ6IHJvYm90LmlkLCBzdGF0dXM6IHJvYm90LnN0YXR1cywgYmF0dGVyeTogcm9ib3QuYmF0dGVyeSB9KSk7XG4gIH0sXG5cbiAgYXN5bmMgZGlzcGF0Y2gocm9ib3RJZCwgdGFyZ2V0LCBjb21tYW5kSWQpIHtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1pc3Npb24gPSBhd2FpdCBmbGVldC5jcmVhdGVNaXNzaW9uKHJvYm90SWQsIHsgdGFyZ2V0LCBjb21tYW5kX2lkOiBjb21tYW5kSWQgfSk7XG4gICAgICAgIHJldHVybiBtaXNzaW9uLm1pc3Npb25faWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChyZWZ1c2VkKGUpKSB0aHJvdyBmYWlsdXJlKFwicmVmdXNlZFwiLCBcImNvbW1hbmQgXCIgKyBjb21tYW5kSWQgKyBcIiB3YXMgbm90IHBsYWNlZDogXCIgKyBlLm1lc3NhZ2UpO1xuICAgICAgICBpZiAoYXR0ZW1wdCBcdTAwM2U9IEFUVEVNUFRTKSB0aHJvdyBmYWlsdXJlKFwidW5yZXNvbHZlZFwiLCBcImNvbW1hbmQgXCIgKyBjb21tYW5kSWQgKyBcIjogbm8gYW5zd2VyIGFmdGVyIFwiICsgYXR0ZW1wdCArIFwiIGF0dGVtcHRzOyB0aGUgdmVuZG9yIG1heSBvciBtYXkgbm90IGhvbGQgdGhlIG9yZGVyXCIpO1xuICAgICAgICByZXRyaWVzKys7XG4gICAgICAgIGF3YWl0IHNsZWVwKDI1MCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIG1heFBvbGxzIGlzIHRoZSBudW1iZXIgb2Ygc3RhdHVzIHJlYWRzLCBmYWlsZWQgb25lcyBpbmNsdWRlZDsgMCBtYWtlcyBub25lLlxuICBhc3luYyB3YWl0KG1pc3Npb25JZCwgb3B0cykge1xuICAgIGNvbnN0IG1heFBvbGxzID0gb3B0cyBcdTAwMjZcdTAwMjYgTnVtYmVyLmlzSW50ZWdlcihvcHRzLm1heFBvbGxzKSBcdTAwMjZcdTAwMjYgb3B0cy5tYXhQb2xscyBcdTAwM2U9IDAgPyBvcHRzLm1heFBvbGxzIDogNTA7XG4gICAgbGV0IHBvbGxzID0gMDtcbiAgICB3aGlsZSAocG9sbHMgXHUwMDNjIG1heFBvbGxzKSB7XG4gICAgICBwb2xscysrO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWlzc2lvbiA9IGF3YWl0IGZsZWV0LmdldE1pc3Npb24obWlzc2lvbklkKTtcbiAgICAgICAgaWYgKCFtaXNzaW9uIHx8IG1pc3Npb24uaWQgIT09IG1pc3Npb25JZCkge1xuICAgICAgICAgIC8vIEFuIGFuc3dlciBhYm91dCBhbm90aGVyIG1pc3Npb24gaXMgbm8gYW5zd2VyIGFib3V0IHRoaXMgb25lOiBhIGZhaWxlZCByZWFkLlxuICAgICAgICAgIHJldHJpZXMrKztcbiAgICAgICAgICBpZiAocG9sbHMgXHUwMDNjIG1heFBvbGxzKSBhd2FpdCBzbGVlcCgyNTApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtaXNzaW9uLnN0YXR1cyA9PT0gXCJkb25lXCIgfHwgbWlzc2lvbi5zdGF0dXMgPT09IFwiZmFpbGVkXCIgfHwgbWlzc2lvbi5zdGF0dXMgPT09IFwiY2FuY2VsbGVkXCIpIHtcbiAgICAgICAgICByZXR1cm4geyBzdGF0ZTogbWlzc2lvbi5zdGF0dXMsIHBvbGxzLCByZXRyaWVzIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvbGxzIFx1MDAzYyBtYXhQb2xscykgYXdhaXQgc2xlZXAoMjApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAocmVmdXNlZChlKSkgdGhyb3cgZTtcbiAgICAgICAgcmV0cmllcysrO1xuICAgICAgICBpZiAocG9sbHMgXHUwMDNjIG1heFBvbGxzKSBhd2FpdCBzbGVlcCgyNTApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBzdGF0ZTogXCJ0aW1lb3V0XCIsIHBvbGxzLCByZXRyaWVzIH07XG4gIH0sXG5cbiAgYXN5bmMgY2FuY2VsKG1pc3Npb25JZCkge1xuICAgIGF3YWl0IHdpdGhSZXRyeSgoKSA9XHUwMDNlIGZsZWV0LmNhbmNlbE1pc3Npb24obWlzc2lvbklkKSk7XG4gIH0sXG59O1xuIiwicGF0aCI6ImFkYXB0ZXItdjIuanMifSx7ImNvbnRlbnQiOiIvLyBCcm9rZW4gb24gcHVycG9zZTogdGhlIHNlY29uZCBhZGFwdGVyIHdob3NlIGludmVudG9yeSgpIHJlcG9ydHMgbm8gcm9ib3RzLlxuXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL2FkYXB0ZXItdjIuanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IHsgLi4uYmFzZSwgYXN5bmMgaW52ZW50b3J5KCkgeyByZXR1cm4gW107IH0gfTtcbiIsInBhdGgiOiJicm9rZW4vZW1wdHktaW52ZW50b3J5LmpzIn0seyJjb250ZW50IjoiLy8gQnJva2VuIG9uIHB1cnBvc2U6IHRoZSBzZWNvbmQgYWRhcHRlciByZXBvcnRpbmcgYSBmYWlsZWQgbWlzc2lvbiBhcyBkb25lLlxuXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL2FkYXB0ZXItdjIuanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLi4uYmFzZSxcbiAgYXN5bmMgd2FpdChtaXNzaW9uSWQsIG9wdHMpIHtcbiAgICBjb25zdCB3ID0gYXdhaXQgYmFzZS53YWl0KG1pc3Npb25JZCwgb3B0cyk7XG4gICAgcmV0dXJuIHsgLi4udywgc3RhdGU6IHcuc3RhdGUgPT09IFwiZmFpbGVkXCIgPyBcImRvbmVcIiA6IHcuc3RhdGUgfTtcbiAgfSxcbn07XG4iLCJwYXRoIjoiYnJva2VuL2ZhbHNlLXN1Y2Nlc3MuanMifSx7ImNvbnRlbnQiOiIvLyBCcm9rZW4gb24gcHVycG9zZTogdGhlIHNlY29uZCBhZGFwdGVyIHdob3NlIGludmVudG9yeSgpIHJlcG9ydHMgYSByb2JvdCB0aGUgdmVuZG9yXG4vLyBkb2VzIG5vdCBoYXZlLCBpbiBhIHN0YXR1cyB0aGUgY29udHJhY3QgZG9lcyBub3QgaGF2ZS5cblwidXNlIHN0cmljdFwiO1xuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9hZGFwdGVyLXYyLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSB7IC4uLmJhc2UsIGFzeW5jIGludmVudG9yeSgpIHsgcmV0dXJuIFt7IGlkOiBcImltYWdpbmFyeVwiLCBzdGF0dXM6IFwiYmFuYW5hXCIsIGJhdHRlcnk6IC01MCB9XTsgfSB9O1xuIiwicGF0aCI6ImJyb2tlbi9pbnZlbnRlZC1yb2JvdC5qcyJ9LHsiY29udGVudCI6Ii8vIEJyb2tlbiBvbiBwdXJwb3NlOiB0aGUgc2Vjb25kIGFkYXB0ZXIgd2hvc2UgY2FuY2VsKCkgc2VuZHMgbm90aGluZy5cblwidXNlIHN0cmljdFwiO1xuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9hZGFwdGVyLXYyLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSB7IC4uLmJhc2UsIGFzeW5jIGNhbmNlbCgpIHt9IH07XG4iLCJwYXRoIjoiYnJva2VuL25vLWNhbmNlbC5qcyJ9LHsiY29udGVudCI6Ii8vIEJyb2tlbiBvbiBwdXJwb3NlOiB0aGUgc2Vjb25kIGFkYXB0ZXIgd2hvc2Ugd2FpdCgpIGRvZXMgdGhlIHJlYWRzIGFuZCB0aGVuIHJlcG9ydHMgYVxuLy8gY291bnQgd2l0aCBubyBzdGF0ZS5cblwidXNlIHN0cmljdFwiO1xuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9hZGFwdGVyLXYyLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSB7IC4uLmJhc2UsIGFzeW5jIHdhaXQobWlzc2lvbklkLCBvcHRzKSB7IGNvbnN0IHcgPSBhd2FpdCBiYXNlLndhaXQobWlzc2lvbklkLCBvcHRzKTsgcmV0dXJuIHsgcG9sbHM6IHcucG9sbHMgfTsgfSB9O1xuIiwicGF0aCI6ImJyb2tlbi9uby1zdGF0ZS5qcyJ9LHsiY29udGVudCI6Ii8vIEJyb2tlbiBvbiBwdXJwb3NlOiB0aGUgc2Vjb25kIGFkYXB0ZXIgd2hvc2Ugd2FpdCgpIGZvbGxvd3MgdGhlIG1pc3Npb24gdG8gaXRzIGVuZCxcbi8vIHRoZW4gdGhyb3dzIGluc3RlYWQgb2YgcmV0dXJuaW5nIGl0cyBzdGF0ZS5cblwidXNlIHN0cmljdFwiO1xuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9hZGFwdGVyLXYyLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSB7IC4uLmJhc2UsIGFzeW5jIHdhaXQobWlzc2lvbklkLCBvcHRzKSB7IGF3YWl0IGJhc2Uud2FpdChtaXNzaW9uSWQsIG9wdHMpOyB0aHJvdyBuZXcgRXJyb3IoXCJ3YWl0IGZhaWxlZCBhZnRlciB0aGUgbWlzc2lvbiBlbmRlZFwiKTsgfSB9O1xuIiwicGF0aCI6ImJyb2tlbi90aHJvd2luZy13YWl0LmpzIn0seyJjb250ZW50IjoiLy8gQnJva2VuIG9uIHB1cnBvc2U6IHRoZSBzZWNvbmQgYWRhcHRlciwgZXhjZXB0IHRoYXQgYSBjcmVhdGUgdGhlIHZlbmRvciBuZXZlciBhbnN3ZXJzIGlzXG4vLyBnaXZlbiB1cCBhZnRlciB0aHJlZSB0cmllcyBhbmQgcmVwb3J0ZWQgYXMgcmVmdXNlZCwgYXMgaWYgdGhlIHZlbmRvciBoYWQgc2FpZCBuby5cblwidXNlIHN0cmljdFwiO1xuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9hZGFwdGVyLXYyLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC4uLmJhc2UsXG4gIGFzeW5jIGRpc3BhdGNoKHJvYm90SWQsIHRhcmdldCwgY29tbWFuZElkKSB7XG4gICAgbGV0IGxhc3Q7XG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgXHUwMDNjPSAzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7IHJldHVybiAoYXdhaXQgZmxlZXQuY3JlYXRlTWlzc2lvbihyb2JvdElkLCB7IHRhcmdldCwgY29tbWFuZF9pZDogY29tbWFuZElkIH0pKS5taXNzaW9uX2lkOyB9IGNhdGNoIChlKSB7IGxhc3QgPSBlOyB9XG4gICAgfVxuICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKFwiY29tbWFuZCBcIiArIGNvbW1hbmRJZCArIFwiIHdhcyBub3QgcGxhY2VkOiBcIiArIGxhc3QubWVzc2FnZSksIHsgY29kZTogXCJyZWZ1c2VkXCIgfSk7XG4gIH0sXG59O1xuIiwicGF0aCI6ImJyb2tlbi91bmFuc3dlcmVkLWFzLXJlZnVzZWQuanMifSx7ImNvbnRlbnQiOiIvLyBCcm9rZW4gb24gcHVycG9zZTogdGhlIHNlY29uZCBhZGFwdGVyIHdob3NlIHdhaXQoKSByZWFkcyB0aGUgbWlzc2lvbiBvbmNlIG1vcmUgdGhhblxuLy8gaXRzIGJ1ZGdldCBhbGxvd3MsIHRoZW4gcmVwb3J0cyBhIHNpbmdsZSByZWFkLlxuXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL2FkYXB0ZXItdjIuanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLi4uYmFzZSxcbiAgYXN5bmMgd2FpdChtaXNzaW9uSWQsIG9wdHMpIHtcbiAgICBjb25zdCB3ID0gYXdhaXQgYmFzZS53YWl0KG1pc3Npb25JZCwgb3B0cyk7XG4gICAgZm9yIChsZXQgbiA9IHcucG9sbHM7IG4gXHUwMDNjPSBvcHRzLm1heFBvbGxzOyBuKyspIGF3YWl0IGZsZWV0LmdldE1pc3Npb24obWlzc2lvbklkKTtcbiAgICByZXR1cm4geyBzdGF0ZTogdy5zdGF0ZSwgcG9sbHM6IDEgfTtcbiAgfSxcbn07XG4iLCJwYXRoIjoiYnJva2VuL3VuZGVyY291bnRlZC1yZWFkcy5qcyJ9LHsiY29udGVudCI6Ii8vIEJyb2tlbiBvbiBwdXJwb3NlOiB0aGUgc2Vjb25kIGFkYXB0ZXIgd2l0aCByMSdzIG9yZGVycyBzZW50IHRvIHIzLiBFdmVyeSBtaXNzaW9uIGl0XG4vLyByZXBvcnRzIGV4aXN0cyBhbmQgZW5kcyBkb25lLlxuXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL2FkYXB0ZXItdjIuanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IHsgLi4uYmFzZSwgZGlzcGF0Y2g6IChyb2JvdElkLCB0YXJnZXQsIGNvbW1hbmRJZCkgPVx1MDAzZSBiYXNlLmRpc3BhdGNoKHJvYm90SWQgPT09IFwicjFcIiA/IFwicjNcIiA6IHJvYm90SWQsIHRhcmdldCwgY29tbWFuZElkKSB9O1xuIiwicGF0aCI6ImJyb2tlbi93cm9uZy1yb2JvdC5qcyJ9LHsiY29udGVudCI6Ii8vIEJyb2tlbiBvbiBwdXJwb3NlOiB0aGUgc2Vjb25kIGFkYXB0ZXIgd2l0aCBldmVyeSBvcmRlciBzZW50IHRvICgwLCAwKS4gSXRzIHJlcG9ydFxuLy8gc3RheXMgcGxhdXNpYmxlOiBlYWNoIG1pc3Npb24gZW5kcyBkb25lLCBhdCB0aGUgdGFyZ2V0IHRoZSB2ZW5kb3Igd2FzIGdpdmVuLlxuXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL2FkYXB0ZXItdjIuanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IHsgLi4uYmFzZSwgZGlzcGF0Y2g6IChyb2JvdElkLCB0YXJnZXQsIGNvbW1hbmRJZCkgPVx1MDAzZSBiYXNlLmRpc3BhdGNoKHJvYm90SWQsIHsgeDogMCwgeTogMCB9LCBjb21tYW5kSWQpIH07XG4iLCJwYXRoIjoiYnJva2VuL3dyb25nLXRhcmdldC5qcyJ9LHsiY29udGVudCI6Ii8vIFRoZSBib3VuZGFyeSBwcm9iZS4gTm90IGFuIGFkYXB0ZXI6IGEgc3RlcCB0aGF0IHRyaWVzLCBmcm9tIGluc2lkZSB0aGUgc2FtZSBydW4gYW5kXG4vLyB1bmRlciB0aGUgc2FtZSBncmFudCwgdGhlIHRocmVlIHRoaW5ncyBob3N0aWxlIGFkYXB0ZXIgY29kZSB3b3VsZCB0cnksIGFuZCByZXBvcnRzXG4vLyB3aGF0IGhhcHBlbmVkLiBVc2FnZTogbm9kZSBwcm9iZS5qcyBcdTAwM2N0aGUgdmVuZG9yJ3MgVVJMIGFzIHRoZSBob3N0IHNlZXMgaXRcdTAwM2VcblwidXNlIHN0cmljdFwiO1xuY29uc3QgaHR0cCA9IHJlcXVpcmUoXCJub2RlOmh0dHBcIik7XG5cbmFzeW5jIGZ1bmN0aW9uIHRyeURlY29tbWlzc2lvblRocm91Z2hDbGllbnQoKSB7XG4gIHRyeSB7IGF3YWl0IGZsZWV0LmRlY29tbWlzc2lvblJvYm90KFwicjFcIik7IHJldHVybiBcImFsbG93ZWRcIjsgfSBjYXRjaCAoZSkgeyByZXR1cm4gXCJyZWZ1c2VkOiBcIiArIGUubWVzc2FnZTsgfVxufVxuXG4vLyBUaGUgaW5qZWN0ZWQgY2xpZW50IGlzIEphdmFTY3JpcHQgaW5zaWRlIHRoZSBzYW5kYm94LCBzbyBpdHMgb3duIGFsbG93bGlzdCBjaGVja1xuLy8gaXMgdGhlIGd1ZXN0J3MgdG8gc2tpcC4gVGhpcyBza2lwcyBpdDogYSByYXcgcmVxdWVzdCBvbiB0aGUgYnJva2VyIHNvY2tldC5cbmZ1bmN0aW9uIHRyeURlY29tbWlzc2lvbkJ5cGFzc2luZ0NsaWVudCgpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9XHUwMDNlIHtcbiAgICBjb25zdCByZXEgPSBodHRwLnJlcXVlc3QoeyBzb2NrZXRQYXRoOiBwcm9jZXNzLmVudi5IT1NUX0FQSV9TT0NLRVQsIG1ldGhvZDogXCJERUxFVEVcIiwgcGF0aDogXCIvcm9ib3RzL3IxXCIgfSwgKHJlcykgPVx1MDAzZSB7XG4gICAgICBsZXQgdGV4dCA9IFwiXCI7IHJlcy5zZXRFbmNvZGluZyhcInV0ZjhcIik7XG4gICAgICByZXMub24oXCJkYXRhXCIsIChjKSA9XHUwMDNlICh0ZXh0ICs9IGMpKTtcbiAgICAgIHJlcy5vbihcImVuZFwiLCAoKSA9XHUwMDNlIHJlc29sdmUoXCJicm9rZXIgYW5zd2VyZWQgXCIgKyByZXMuc3RhdHVzQ29kZSArIFwiIFwiICsgdGV4dC50cmltKCkpKTtcbiAgICB9KTtcbiAgICByZXEub24oXCJlcnJvclwiLCAoZSkgPVx1MDAzZSByZXNvbHZlKFwibm8gYnJva2VyOiBcIiArIGUubWVzc2FnZSkpO1xuICAgIHJlcS5lbmQoKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRyeURpcmVjdCh1cmwpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByID0gYXdhaXQgZmV0Y2godXJsICsgXCIvcm9ib3RzXCIsIHsgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDMwMDApIH0pO1xuICAgIHJldHVybiBcInJlYWNoZWQgdGhlIHZlbmRvciBkaXJlY3RseTogXCIgKyByLnN0YXR1cztcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBcImZhaWxlZDogXCIgKyAoKGUgXHUwMDI2XHUwMDI2IGUuY2F1c2UgXHUwMDI2XHUwMDI2IGUuY2F1c2UuY29kZSkgfHwgKGUgXHUwMDI2XHUwMDI2IGUubmFtZSkgfHwgU3RyaW5nKGUpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBodW50Rm9yQ3JlZGVudGlhbCgpIHtcbiAgY29uc3Qgc3VzcGljaW91cyA9IE9iamVjdC5lbnRyaWVzKHByb2Nlc3MuZW52KS5maWx0ZXIoKFtrLCB2XSkgPVx1MDAzZVxuICAgIC90b2tlbnxzZWNyZXR8YmVhcmVyfGF1dGh8a2V5L2kudGVzdChrKSB8fCAvXltBLVphLXowLTlfLV17MzIsfSQvLnRlc3QodikpO1xuICBjb25zdCBjbGllbnRLZXlzID0gT2JqZWN0LmtleXMoZmxlZXQpLnNvcnQoKTtcbiAgbGV0IGNsaWVudFNvdXJjZUhhc0JlYXJlciA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGsgb2YgY2xpZW50S2V5cykge1xuICAgIGlmICh0eXBlb2YgZmxlZXRba10gPT09IFwiZnVuY3Rpb25cIiBcdTAwMjZcdTAwMjYgL2JlYXJlcnxhdXRob3JpemF0aW9uL2kudGVzdChTdHJpbmcoZmxlZXRba10pKSkgY2xpZW50U291cmNlSGFzQmVhcmVyID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4geyBlbnZfZW50cmllc190aGF0X2xvb2tfbGlrZV9jcmVkZW50aWFsczogc3VzcGljaW91cy5tYXAoKFtrXSkgPVx1MDAzZSBrKSwgY2xpZW50X2tleXM6IGNsaWVudEtleXMsIGNsaWVudF9zb3VyY2VfbWVudGlvbnNfYV9iZWFyZXI6IGNsaWVudFNvdXJjZUhhc0JlYXJlciB9O1xufVxuXG4oYXN5bmMgKCkgPVx1MDAzZSB7XG4gIGNvbnN0IHJlc3VsdHMgPSB7XG4gICAgZGVjb21taXNzaW9uX3Rocm91Z2hfY2xpZW50OiBhd2FpdCB0cnlEZWNvbW1pc3Npb25UaHJvdWdoQ2xpZW50KCksXG4gICAgZGVjb21taXNzaW9uX2J5cGFzc2luZ19jbGllbnQ6IGF3YWl0IHRyeURlY29tbWlzc2lvbkJ5cGFzc2luZ0NsaWVudCgpLFxuICAgIGRpcmVjdF9yZXF1ZXN0X3RvX3ZlbmRvcjogYXdhaXQgdHJ5RGlyZWN0KHByb2Nlc3MuYXJndlsyXSksXG4gICAgY3JlZGVudGlhbF9odW50OiBodW50Rm9yQ3JlZGVudGlhbCgpLFxuICB9O1xuICBjb25zb2xlLmxvZyhcIlBST0JFIFwiICsgSlNPTi5zdHJpbmdpZnkocmVzdWx0cykpO1xufSkoKTtcbiIsInBhdGgiOiJwcm9iZS5qcyJ9LHsiY29udGVudCI6IlwidXNlIHN0cmljdFwiO1xuXG5jb25zdCBNQVhfQVRURU1QVFMgPSA0O1xuY29uc3QgUkVUUllfUEFVU0VfTVMgPSAyMDA7XG5jb25zdCBQT0xMX1BBVVNFX01TID0gMjUwO1xuXG5jb25zdCBzbGVlcCA9IChtcykgPVx1MDAzZSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPVx1MDAzZSBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG5cbmZ1bmN0aW9uIHN0YXR1c09mKGVycikge1xuICBjb25zdCBtID0gL15ob3N0IGFwaSAoXFxkezN9KTovLmV4ZWMoZXJyIFx1MDAyNlx1MDAyNiBlcnIubWVzc2FnZSA/IGVyci5tZXNzYWdlIDogXCJcIik7XG4gIHJldHVybiBtID8gTnVtYmVyKG1bMV0pIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNOb3RQZXJtaXR0ZWQoZXJyKSB7XG4gIHJldHVybiAvXmhvc3QgYXBpIGNhbGwgbm90IHBlcm1pdHRlZCBieSBzYW5kYm94IGNhcGFiaWxpdHk6Ly50ZXN0KGVyciBcdTAwMjZcdTAwMjYgZXJyLm1lc3NhZ2UgPyBlcnIubWVzc2FnZSA6IFwiXCIpO1xufVxuXG5mdW5jdGlvbiB3aXRoQ29kZShjb2RlLCBtZXNzYWdlLCBjYXVzZSkge1xuICBjb25zdCBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSwgeyBjYXVzZSB9KTtcbiAgZXJyLmNvZGUgPSBjb2RlO1xuICByZXR1cm4gZXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gRXZlcnkgcm9ib3QgdGhlIHZlbmRvciBrbm93cywgYXMgW3sgaWQsIHN0YXR1cywgYmF0dGVyeSB9XS5cbiAgYXN5bmMgaW52ZW50b3J5KCkge1xuICAgIGNvbnN0IHsgcm9ib3RzIH0gPSBhd2FpdCBmbGVldC5saXN0Um9ib3RzKCk7XG4gICAgcmV0dXJuIHJvYm90cy5tYXAoKHIpID1cdTAwM2UgKHsgaWQ6IHIuaWQsIHN0YXR1czogci5zdGF0dXMsIGJhdHRlcnk6IHIuYmF0dGVyeSB9KSk7XG4gIH0sXG5cbiAgLy8gU2VuZCByb2JvdCBgcm9ib3RJZGAgdG8gdGFyZ2V0IGB7IHgsIHkgfWAgYXMgY29tbWFuZCBgY29tbWFuZElkYC4gRXZlcnkgYXR0ZW1wdFxuICAvLyBjYXJyaWVzIHRoZSBzYW1lIGNvbW1hbmRfaWQsIHNvIHRoZSB2ZW5kb3IgYW5zd2VycyB3aXRoIHRoZSBvcmlnaW5hbCBtaXNzaW9uXG4gIC8vIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBzZWNvbmQgb25lLlxuICBhc3luYyBkaXNwYXRjaChyb2JvdElkLCB0YXJnZXQsIGNvbW1hbmRJZCkge1xuICAgIGNvbnN0IGJvZHkgPSB7IHRhcmdldDogeyB4OiB0YXJnZXQueCwgeTogdGFyZ2V0LnkgfSwgY29tbWFuZF9pZDogY29tbWFuZElkIH07XG4gICAgbGV0IGxhc3QgPSBudWxsO1xuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgXHUwMDNjPSBNQVhfQVRURU1QVFM7IGF0dGVtcHQrKykge1xuICAgICAgbGV0IHJlcztcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcyA9IGF3YWl0IGZsZWV0LmNyZWF0ZU1pc3Npb24ocm9ib3RJZCwgYm9keSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gc3RhdHVzT2YoZXJyKTtcbiAgICAgICAgLy8gVGhlIHZlbmRvciBhbnN3ZXJlZCB3aXRoIGEgcmVqZWN0aW9uLCBvciB0aGUgY2FsbCBuZXZlciBsZWZ0IHRoZSBzYW5kYm94OlxuICAgICAgICAvLyBubyBvcmRlciB3YXMgYWNjZXB0ZWQgZm9yIHRoaXMgY29tbWFuZC5cbiAgICAgICAgaWYgKGlzTm90UGVybWl0dGVkKGVycikgfHwgKHN0YXR1cyAhPT0gbnVsbCBcdTAwMjZcdTAwMjYgc3RhdHVzIFx1MDAzZT0gNDAwIFx1MDAyNlx1MDAyNiBzdGF0dXMgXHUwMDNjIDUwMCkpIHtcbiAgICAgICAgICB0aHJvdyB3aXRoQ29kZShcInJlZnVzZWRcIiwgYGRpc3BhdGNoICR7Y29tbWFuZElkfTogJHtlcnIubWVzc2FnZX1gLCBlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSBlcnI7XG4gICAgICAgIGF3YWl0IHNsZWVwKFJFVFJZX1BBVVNFX01TICogYXR0ZW1wdCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgdmVuZG9yIGFjY2VwdGVkIHNvbWV0aGluZywgYnV0IG5vdCBwcm92YWJseSB0aGlzIGNvbW1hbmQncyBvcmRlci5cbiAgICAgIGlmICghcmVzIHx8IHR5cGVvZiByZXMubWlzc2lvbl9pZCAhPT0gXCJzdHJpbmdcIiB8fCByZXMuY29tbWFuZF9pZCAhPT0gY29tbWFuZElkIHx8IHJlcy5yb2JvdCAhPT0gcm9ib3RJZCkge1xuICAgICAgICB0aHJvdyB3aXRoQ29kZShcInVucmVzb2x2ZWRcIiwgYGRpc3BhdGNoICR7Y29tbWFuZElkfTogdmVuZG9yIGFuc3dlciBkb2VzIG5vdCBtYXRjaCB0aGUgb3JkZXJgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXMubWlzc2lvbl9pZDtcbiAgICB9XG5cbiAgICB0aHJvdyB3aXRoQ29kZShcInVucmVzb2x2ZWRcIiwgYGRpc3BhdGNoICR7Y29tbWFuZElkfTogbm8gYW5zd2VyIGFmdGVyICR7TUFYX0FUVEVNUFRTfSBhdHRlbXB0c2AsIGxhc3QpO1xuICB9LFxuXG4gIC8vIFBvbGwgdGhlIG1pc3Npb24gdW50aWwgaXQgZW5kcy4gRXZlcnkgc3RhdHVzIHJlYWQgY291bnRzIHRvd2FyZCBtYXhQb2xscyxcbiAgLy8gaW5jbHVkaW5nIHJlYWRzIHJldHJpZWQgYWZ0ZXIgYSB0cmFuc2llbnQgNTAyLzUwMy5cbiAgYXN5bmMgd2FpdChtaXNzaW9uSWQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IG1heFBvbGxzID0gb3B0cy5tYXhQb2xscyA/PyA1MDtcbiAgICBsZXQgcG9sbHMgPSAwO1xuXG4gICAgd2hpbGUgKHBvbGxzIFx1MDAzYyBtYXhQb2xscykge1xuICAgICAgcG9sbHMrKztcbiAgICAgIGxldCBtaXNzaW9uO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbWlzc2lvbiA9IGF3YWl0IGZsZWV0LmdldE1pc3Npb24obWlzc2lvbklkKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBzdGF0dXNPZihlcnIpO1xuICAgICAgICBpZiAoc3RhdHVzID09PSA1MDIgfHwgc3RhdHVzID09PSA1MDMpIHtcbiAgICAgICAgICBhd2FpdCBzbGVlcChSRVRSWV9QQVVTRV9NUyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKG1pc3Npb24uc3RhdHVzKSB7XG4gICAgICAgIGNhc2UgXCJkb25lXCI6XG4gICAgICAgIGNhc2UgXCJmYWlsZWRcIjpcbiAgICAgICAgY2FzZSBcImNhbmNlbGxlZFwiOlxuICAgICAgICAgIHJldHVybiB7IHN0YXRlOiBtaXNzaW9uLnN0YXR1cywgcG9sbHMgfTtcbiAgICAgICAgY2FzZSBcInF1ZXVlZFwiOlxuICAgICAgICBjYXNlIFwicnVubmluZ1wiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbWlzc2lvbiAke21pc3Npb25JZH06IHVuZXhwZWN0ZWQgc3RhdHVzICR7bWlzc2lvbi5zdGF0dXN9YCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBzbGVlcChQT0xMX1BBVVNFX01TKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdGF0ZTogXCJ0aW1lb3V0XCIsIHBvbGxzIH07XG4gIH0sXG5cbiAgLy8gQ2FuY2VsIHRoZSBtaXNzaW9uLiBDYW5jZWxsaW5nIGEgZmluaXNoZWQgbWlzc2lvbiBsZWF2ZXMgaXQgdW5jaGFuZ2VkLCBzb1xuICAvLyB0cmFuc2llbnQgZmFpbHVyZXMgYXJlIHJldHJpZWQuXG4gIGFzeW5jIGNhbmNlbChtaXNzaW9uSWQpIHtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmbGVldC5jYW5jZWxNaXNzaW9uKG1pc3Npb25JZCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gc3RhdHVzT2YoZXJyKTtcbiAgICAgICAgaWYgKChzdGF0dXMgPT09IDUwMiB8fCBzdGF0dXMgPT09IDUwMykgXHUwMDI2XHUwMDI2IGF0dGVtcHQgXHUwMDNjIE1BWF9BVFRFTVBUUykge1xuICAgICAgICAgIGF3YWl0IHNsZWVwKFJFVFJZX1BBVVNFX01TICogYXR0ZW1wdCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG4iLCJwYXRoIjoidHJpYWwvaGFpa3UuanMifSx7ImNvbnRlbnQiOiJcInVzZSBzdHJpY3RcIjtcblxuLy8gQWRhcHRlciBmb3IgdGhlIEZsZWV0IFZlbmRvciBBUEkgKHYyLjQuMCkuIEV2ZXJ5IHZlbmRvciBjYWxsIGdvZXMgdGhyb3VnaCB0aGUgaW5qZWN0ZWRcbi8vIGBmbGVldGAgY2xpZW50OyBub3RoaW5nIGlzIGltcG9ydGVkLlxuXG5jb25zdCBDQUxMX1RJTUVPVVRfTVMgPSAxMDAwMDtcbmNvbnN0IEJBQ0tPRkZfTVMgPSAyMDA7XG5jb25zdCBCQUNLT0ZGX01BWF9NUyA9IDIwMDA7XG5jb25zdCBDQUxMX1RSSUVTID0gNTtcbmNvbnN0IExPT0tVUF9UUklFUyA9IDI7XG5jb25zdCBESVNQQVRDSF9UUklFUyA9IDg7XG5jb25zdCBESVNQQVRDSF9CVURHRVRfTVMgPSAzMDAwMDtcbmNvbnN0IENBTkNFTF9ST1VORFMgPSAzO1xuY29uc3QgREVGQVVMVF9NQVhfUE9MTFMgPSA1MDtcbmNvbnN0IFBPTExfTUlOX01TID0gMTAwO1xuY29uc3QgUE9MTF9NQVhfTVMgPSA1MDA7XG5jb25zdCBOT1RfRk9VTkRfVFJJRVMgPSAzO1xuXG5jb25zdCBST0JPVF9TVEFUVVNFUyA9IG5ldyBTZXQoW1wiaWRsZVwiLCBcIm1vdmluZ1wiLCBcImZhdWx0XCJdKTtcbmNvbnN0IFRFUk1JTkFMID0geyBkb25lOiBcImRvbmVcIiwgZmFpbGVkOiBcImZhaWxlZFwiLCBjYW5jZWxsZWQ6IFwiY2FuY2VsbGVkXCIsIGNhbmNlbGVkOiBcImNhbmNlbGxlZFwiIH07XG5jb25zdCBDT01NQU5EX0lEID0gL15bQS1aYS16MC05Xy1dezgsNjR9JC87XG5cbmNvbnN0IHNsZWVwID0gKG1zKSA9XHUwMDNlIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9XHUwMDNlIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbmNvbnN0IGJhY2tvZmYgPSAobikgPVx1MDAzZSBNYXRoLm1pbihCQUNLT0ZGX01BWF9NUywgQkFDS09GRl9NUyAqIDIgKiogKG4gLSAxKSk7XG5cbmZ1bmN0aW9uIGNvZGVkRXJyb3IoY29kZSwgbWVzc2FnZSwgY2F1c2UpIHtcbiAgY29uc3QgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UsIGNhdXNlID8geyBjYXVzZSB9IDogdW5kZWZpbmVkKTtcbiAgZXJyLmNvZGUgPSBjb2RlO1xuICByZXR1cm4gZXJyO1xufVxuXG5mdW5jdGlvbiBzdGF0dXNPZihlcnIpIHtcbiAgaWYgKGVyciBcdTAwMjZcdTAwMjYgTnVtYmVyLmlzSW50ZWdlcihlcnIuc3RhdHVzKSkgcmV0dXJuIGVyci5zdGF0dXM7XG4gIGNvbnN0IG1hdGNoID0gL2hvc3QgYXBpIChcXGR7M30pXFxiLy5leGVjKFN0cmluZyhlcnIgXHUwMDI2XHUwMDI2IGVyci5tZXNzYWdlKSk7XG4gIHJldHVybiBtYXRjaCA/IE51bWJlcihtYXRjaFsxXSkgOiBudWxsO1xufVxuXG4vLyBcImxvc3RcIjogdGhlIGNhbGwgbWF5IG9yIG1heSBub3QgaGF2ZSByZWFjaGVkIHRoZSB2ZW5kb3I7IFwiYnVzeVwiOiB0aGUgdmVuZG9yIHR1cm5lZCBpdCBhd2F5XG4vLyBmb3Igbm93OyBcInJlamVjdGVkXCI6IHRoZSB2ZW5kb3IgcmVmdXNlZCBpdDsgXCJkZW5pZWRcIjogdGhlIHNhbmRib3ggbmV2ZXIgc2VudCBpdC5cbmZ1bmN0aW9uIGNsYXNzaWZ5KGVycikge1xuICBpZiAoZXJyIFx1MDAyNlx1MDAyNiBlcnIuY29kZSA9PT0gXCJ0aW1lb3V0XCIpIHJldHVybiBcImxvc3RcIjtcbiAgaWYgKC9ub3QgcGVybWl0dGVkLy50ZXN0KFN0cmluZyhlcnIgXHUwMDI2XHUwMDI2IGVyci5tZXNzYWdlKSkpIHJldHVybiBcImRlbmllZFwiO1xuICBjb25zdCBzdGF0dXMgPSBzdGF0dXNPZihlcnIpO1xuICBpZiAoc3RhdHVzID09PSA0MjkpIHJldHVybiBcImJ1c3lcIjtcbiAgaWYgKHN0YXR1cyAhPT0gbnVsbCBcdTAwMjZcdTAwMjYgc3RhdHVzIFx1MDAzZT0gNDAwIFx1MDAyNlx1MDAyNiBzdGF0dXMgXHUwMDNjIDUwMCBcdTAwMjZcdTAwMjYgc3RhdHVzICE9PSA0MDgpIHJldHVybiBcInJlamVjdGVkXCI7XG4gIHJldHVybiBcImxvc3RcIjtcbn1cblxuLy8gUmVqZWN0cyB3aXRoIGEgXCJ0aW1lb3V0XCIgZXJyb3Igd2hlbiB0aGUgdmVuZG9yIG5ldmVyIGFuc3dlcnM7IHRoZSBhYmFuZG9uZWQgY2FsbCdzIG93blxuLy8gb3V0Y29tZSBpcyBzd2FsbG93ZWQgc28gaXQgY2Fubm90IHN1cmZhY2UgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbmZ1bmN0aW9uIHdpdGhUaW1lb3V0KGNhbGwsIG1zID0gQ0FMTF9USU1FT1VUX01TKSB7XG4gIGNvbnN0IHBlbmRpbmcgPSBQcm9taXNlLnJlc29sdmUoY2FsbCk7XG4gIHBlbmRpbmcuY2F0Y2goKCkgPVx1MDAzZSB7fSk7XG4gIGxldCB0aW1lcjtcbiAgY29uc3QgZXhwaXJ5ID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPVx1MDAzZSB7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID1cdTAwM2UgcmVqZWN0KGNvZGVkRXJyb3IoXCJ0aW1lb3V0XCIsIGBubyBhbnN3ZXIgZnJvbSB0aGUgdmVuZG9yIHdpdGhpbiAke21zfSBtc2ApKSwgbXMpO1xuICB9KTtcbiAgcmV0dXJuIFByb21pc2UucmFjZShbcGVuZGluZywgZXhwaXJ5XSkuZmluYWxseSgoKSA9XHUwMDNlIGNsZWFyVGltZW91dCh0aW1lcikpO1xufVxuXG4vLyBGb3IgY2FsbHMgdGhhdCBhcmUgc2FmZSB0byByZXBlYXQ6IHJlYWRzIGFuZCBjYW5jZWxzLlxuYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJpZXMoc2VuZCwgdHJpZXMpIHtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IDsgYXR0ZW1wdCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB3aXRoVGltZW91dChzZW5kKCkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3Qga2luZCA9IGNsYXNzaWZ5KGVycik7XG4gICAgICBpZiAoKGtpbmQgIT09IFwibG9zdFwiIFx1MDAyNlx1MDAyNiBraW5kICE9PSBcImJ1c3lcIikgfHwgYXR0ZW1wdCBcdTAwM2U9IHRyaWVzKSB0aHJvdyBlcnI7XG4gICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKGF0dGVtcHQpKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gY3lyYjUzLCByZW5kZXJlZCBhcyAxMSBiYXNlLTM2IGRpZ2l0cy5cbmZ1bmN0aW9uIGhhc2goc3RyLCBzZWVkKSB7XG4gIGxldCBoMSA9IDB4ZGVhZGJlZWYgXiBzZWVkO1xuICBsZXQgaDIgPSAweDQxYzZjZTU3IF4gc2VlZDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgXHUwMDNjIHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgaDEgPSBNYXRoLmltdWwoaDEgXiBjaCwgMjY1NDQzNTc2MSk7XG4gICAgaDIgPSBNYXRoLmltdWwoaDIgXiBjaCwgMTU5NzMzNDY3Nyk7XG4gIH1cbiAgaDEgPSBNYXRoLmltdWwoaDEgXiAoaDEgXHUwMDNlXHUwMDNlXHUwMDNlIDE2KSwgMjI0NjgyMjUwNyk7XG4gIGgxIF49IE1hdGguaW11bChoMiBeIChoMiBcdTAwM2VcdTAwM2VcdTAwM2UgMTMpLCAzMjY2NDg5OTA5KTtcbiAgaDIgPSBNYXRoLmltdWwoaDIgXiAoaDIgXHUwMDNlXHUwMDNlXHUwMDNlIDE2KSwgMjI0NjgyMjUwNyk7XG4gIGgyIF49IE1hdGguaW11bChoMSBeIChoMSBcdTAwM2VcdTAwM2VcdTAwM2UgMTMpLCAzMjY2NDg5OTA5KTtcbiAgcmV0dXJuICg0Mjk0OTY3Mjk2ICogKDIwOTcxNTEgXHUwMDI2IGgyKSArIChoMSBcdTAwM2VcdTAwM2VcdTAwM2UgMCkpLnRvU3RyaW5nKDM2KS5wYWRTdGFydCgxMSwgXCIwXCIpO1xufVxuXG4vLyBUaGUgdmVuZG9yIG9ubHkgZGVkdXBlcyBjb21tYW5kIGlkcyBvZiA4LTY0IFtBLVphLXowLTlfLV07IGFueXRoaW5nIGVsc2UgaXMgbWFwcGVkIHRvIGFcbi8vIHN0YWJsZSBpZCBvZiB0aGF0IGZvcm0sIHNvIGEgcmVwZWF0ZWQgY3JlYXRlIHN0aWxsIG5hbWVzIHRoZSBzYW1lIG9yZGVyLlxuZnVuY3Rpb24gdmVuZG9yQ29tbWFuZElkKGNvbW1hbmRJZCkge1xuICBpZiAoY29tbWFuZElkID09IG51bGwgfHwgY29tbWFuZElkID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIGBhZHAtJHtEYXRlLm5vdygpLnRvU3RyaW5nKDM2KX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMil9YDtcbiAgfVxuICBjb25zdCByYXcgPSBTdHJpbmcoY29tbWFuZElkKTtcbiAgaWYgKENPTU1BTkRfSUQudGVzdChyYXcpKSByZXR1cm4gcmF3O1xuICByZXR1cm4gYGNtZC0ke2hhc2gocmF3LCAxKX0tJHtoYXNoKHJhdywgMil9YDtcbn1cblxuLy8gQmVzdCBlZmZvcnQsIHJlYWQtb25seTogdGhlIHJvYm90J3MgcnVubmluZyBtaXNzaW9uLCBpZiBpdCBpcyB0aGUgb25lIHRoaXMgY29tbWFuZCBjcmVhdGVkLlxuYXN5bmMgZnVuY3Rpb24gZmluZE1pc3Npb24ocm9ib3RJZCwgY2lkKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgcm9ib3QgPSBhd2FpdCB3aXRoUmV0cmllcygoKSA9XHUwMDNlIGZsZWV0LmdldFJvYm90KHJvYm90SWQpLCBMT09LVVBfVFJJRVMpO1xuICAgIGlmICghcm9ib3QgfHwgcm9ib3QubWlzc2lvbiA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBtaXNzaW9uID0gYXdhaXQgd2l0aFJldHJpZXMoKCkgPVx1MDAzZSBmbGVldC5nZXRNaXNzaW9uKHJvYm90Lm1pc3Npb24pLCBMT09LVVBfVFJJRVMpO1xuICAgIHJldHVybiBtaXNzaW9uIFx1MDAyNlx1MDAyNiBtaXNzaW9uLmNvbW1hbmRfaWQgPT09IGNpZCA/IHJvYm90Lm1pc3Npb24gOiBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiByb2JvdFN0YXR1cyhyb2JvdCkge1xuICBjb25zdCBzdGF0dXMgPSBTdHJpbmcocm9ib3Quc3RhdHVzIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChST0JPVF9TVEFUVVNFUy5oYXMoc3RhdHVzKSkgcmV0dXJuIHN0YXR1cztcbiAgaWYgKHN0YXR1cyA9PT0gXCJmYXVsdGVkXCIgfHwgc3RhdHVzID09PSBcImVycm9yXCIpIHJldHVybiBcImZhdWx0XCI7XG4gIHJldHVybiByb2JvdC5taXNzaW9uID8gXCJtb3ZpbmdcIiA6IFwiaWRsZVwiO1xufVxuXG5mdW5jdGlvbiBwb2xsTGltaXQodmFsdWUpIHtcbiAgY29uc3QgbiA9IHZhbHVlID09IG51bGwgPyBOYU4gOiBOdW1iZXIodmFsdWUpO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG4pIFx1MDAyNlx1MDAyNiBuIFx1MDAzZT0gMCA/IE1hdGguZmxvb3IobikgOiBERUZBVUxUX01BWF9QT0xMUztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFzeW5jIGludmVudG9yeSgpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB3aXRoUmV0cmllcygoKSA9XHUwMDNlIGZsZWV0Lmxpc3RSb2JvdHMoKSwgQ0FMTF9UUklFUyk7XG4gICAgY29uc3Qgcm9ib3RzID0gQXJyYXkuaXNBcnJheShyZXMpID8gcmVzIDogKHJlcyBcdTAwMjZcdTAwMjYgcmVzLnJvYm90cykgfHwgW107XG4gICAgcmV0dXJuIHJvYm90cy5tYXAoKHJvYm90KSA9XHUwMDNlICh7IGlkOiByb2JvdC5pZCwgc3RhdHVzOiByb2JvdFN0YXR1cyhyb2JvdCksIGJhdHRlcnk6IHJvYm90LmJhdHRlcnkgfSkpO1xuICB9LFxuXG4gIGFzeW5jIGRpc3BhdGNoKHJvYm90SWQsIHRhcmdldCwgY29tbWFuZElkKSB7XG4gICAgY29uc3QgY2lkID0gdmVuZG9yQ29tbWFuZElkKGNvbW1hbmRJZCk7XG4gICAgY29uc3QgYm9keSA9IHsgdGFyZ2V0OiB7IHg6IHRhcmdldC54LCB5OiB0YXJnZXQueSB9LCBjb21tYW5kX2lkOiBjaWQgfTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBESVNQQVRDSF9CVURHRVRfTVM7XG4gICAgLy8gU2V0IG9uY2UgYW4gYXR0ZW1wdCBtYXkgaGF2ZSByZWFjaGVkIHRoZSB2ZW5kb3I6IGZyb20gdGhlbiBvbiBhIHJlZnVzYWwgbm8gbG9uZ2VyIHByb3Zlc1xuICAgIC8vIHRoYXQgbm8gb3JkZXIgZXhpc3RzLCBiZWNhdXNlIHRoZSBlYXJsaWVyIGF0dGVtcHQgbWF5IGhhdmUgY3JlYXRlZCBpdC5cbiAgICBsZXQgdW5jZXJ0YWluID0gZmFsc2U7XG4gICAgbGV0IGxhc3Q7XG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgXHUwMDNjPSBESVNQQVRDSF9UUklFUzsgYXR0ZW1wdCsrKSB7XG4gICAgICBpZiAoYXR0ZW1wdCBcdTAwM2UgMSkge1xuICAgICAgICBpZiAoRGF0ZS5ub3coKSBcdTAwM2U9IGRlYWRsaW5lKSBicmVhaztcbiAgICAgICAgYXdhaXQgc2xlZXAoYmFja29mZihhdHRlbXB0IC0gMSkpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRXZlcnkgYXR0ZW1wdCBjYXJyaWVzIHRoZSBzYW1lIGNvbW1hbmRfaWQsIHNvIGEgcmVwZWF0IGFuc3dlcnMgdGhlIG9yaWdpbmFsIG1pc3Npb25cbiAgICAgICAgLy8gaW5zdGVhZCBvZiBwbGFjaW5nIGEgc2Vjb25kIG9yZGVyLlxuICAgICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgd2l0aFRpbWVvdXQoZmxlZXQuY3JlYXRlTWlzc2lvbihyb2JvdElkLCBib2R5KSk7XG4gICAgICAgIGNvbnN0IG1pc3Npb25JZCA9IGNyZWF0ZWQgXHUwMDI2XHUwMDI2IChjcmVhdGVkLm1pc3Npb25faWQgPz8gY3JlYXRlZC5pZCk7XG4gICAgICAgIGlmIChtaXNzaW9uSWQgIT0gbnVsbCBcdTAwMjZcdTAwMjYgKGNyZWF0ZWQuY29tbWFuZF9pZCA9PSBudWxsIHx8IGNyZWF0ZWQuY29tbWFuZF9pZCA9PT0gY2lkKSkgcmV0dXJuIG1pc3Npb25JZDtcbiAgICAgICAgbGFzdCA9IG5ldyBFcnJvcihgdW5leHBlY3RlZCBhbnN3ZXIgdG8gY3JlYXRlOiAke0pTT04uc3RyaW5naWZ5KGNyZWF0ZWQpfWApO1xuICAgICAgICB1bmNlcnRhaW4gPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsYXN0ID0gZXJyO1xuICAgICAgICBjb25zdCBraW5kID0gY2xhc3NpZnkoZXJyKTtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwicmVqZWN0ZWRcIiB8fCBraW5kID09PSBcImRlbmllZFwiKSB7XG4gICAgICAgICAgaWYgKCF1bmNlcnRhaW4pIHRocm93IGNvZGVkRXJyb3IoXCJyZWZ1c2VkXCIsIGBjb21tYW5kICR7Y29tbWFuZElkfSByZWZ1c2VkOiAke2Vyci5tZXNzYWdlfWAsIGVycik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtpbmQgPT09IFwibG9zdFwiKSB1bmNlcnRhaW4gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXVuY2VydGFpbikge1xuICAgICAgdGhyb3cgY29kZWRFcnJvcihcInJlZnVzZWRcIiwgYGNvbW1hbmQgJHtjb21tYW5kSWR9IHR1cm5lZCBhd2F5OiAke2xhc3QgXHUwMDI2XHUwMDI2IGxhc3QubWVzc2FnZX1gLCBsYXN0KTtcbiAgICB9XG4gICAgY29uc3QgZm91bmQgPSBhd2FpdCBmaW5kTWlzc2lvbihyb2JvdElkLCBjaWQpO1xuICAgIGlmIChmb3VuZCAhPSBudWxsKSByZXR1cm4gZm91bmQ7XG4gICAgdGhyb3cgY29kZWRFcnJvcihcbiAgICAgIFwidW5yZXNvbHZlZFwiLFxuICAgICAgYGNhbm5vdCB0ZWxsIHdoZXRoZXIgY29tbWFuZCAke2NvbW1hbmRJZH0gYmVjYW1lIGFuIG9yZGVyOiAke2xhc3QgXHUwMDI2XHUwMDI2IGxhc3QubWVzc2FnZX1gLFxuICAgICAgbGFzdCxcbiAgICApO1xuICB9LFxuXG4gIGFzeW5jIHdhaXQobWlzc2lvbklkLCBvcHRzKSB7XG4gICAgY29uc3QgbWF4UG9sbHMgPSBwb2xsTGltaXQob3B0cyBcdTAwMjZcdTAwMjYgb3B0cy5tYXhQb2xscyk7XG4gICAgbGV0IHBvbGxzID0gMDtcbiAgICBsZXQgcGF1c2UgPSBQT0xMX01JTl9NUztcbiAgICBsZXQgbWlzc2luZyA9IDA7XG4gICAgd2hpbGUgKHBvbGxzIFx1MDAzYyBtYXhQb2xscykge1xuICAgICAgaWYgKHBvbGxzIFx1MDAzZSAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHBhdXNlKTtcbiAgICAgICAgcGF1c2UgPSBNYXRoLm1pbihQT0xMX01BWF9NUywgTWF0aC5yb3VuZChwYXVzZSAqIDEuNSkpO1xuICAgICAgfVxuICAgICAgcG9sbHMrKztcbiAgICAgIGxldCBtaXNzaW9uO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbWlzc2lvbiA9IGF3YWl0IHdpdGhUaW1lb3V0KGZsZWV0LmdldE1pc3Npb24obWlzc2lvbklkKSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3Qga2luZCA9IGNsYXNzaWZ5KGVycik7XG4gICAgICAgIGlmIChraW5kID09PSBcImxvc3RcIiB8fCBraW5kID09PSBcImJ1c3lcIikgY29udGludWU7XG4gICAgICAgIC8vIEEgbWlzc2lvbiBvbmx5IGp1c3QgY3JlYXRlZCBtYXkgbm90IGJlIHJlYWRhYmxlIHlldC5cbiAgICAgICAgaWYgKHN0YXR1c09mKGVycikgPT09IDQwNCBcdTAwMjZcdTAwMjYgKyttaXNzaW5nIFx1MDAzYz0gTk9UX0ZPVU5EX1RSSUVTKSBjb250aW51ZTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdGUgPSBURVJNSU5BTFtTdHJpbmcobWlzc2lvbiBcdTAwMjZcdTAwMjYgbWlzc2lvbi5zdGF0dXMpLnRvTG93ZXJDYXNlKCldO1xuICAgICAgaWYgKHN0YXRlKSByZXR1cm4geyBzdGF0ZSwgcG9sbHMgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhdGU6IFwidGltZW91dFwiLCBwb2xscyB9O1xuICB9LFxuXG4gIGFzeW5jIGNhbmNlbChtaXNzaW9uSWQpIHtcbiAgICBmb3IgKGxldCByb3VuZCA9IDE7IDsgcm91bmQrKykge1xuICAgICAgLy8gQ2FuY2VsbGluZyBpcyBpZGVtcG90ZW50IG9uIHRoZSB2ZW5kb3I6IGEgZmluaXNoZWQgb3IgY2FuY2VsbGVkIG1pc3Npb24gaXMgbGVmdCB1bmNoYW5nZWQuXG4gICAgICBjb25zdCBtaXNzaW9uID0gYXdhaXQgd2l0aFJldHJpZXMoKCkgPVx1MDAzZSBmbGVldC5jYW5jZWxNaXNzaW9uKG1pc3Npb25JZCksIENBTExfVFJJRVMpO1xuICAgICAgY29uc3Qgc3RhdHVzID0gbWlzc2lvbiBcdTAwMjZcdTAwMjYgbWlzc2lvbi5zdGF0dXM7XG4gICAgICBpZiAoc3RhdHVzID09IG51bGwgfHwgVEVSTUlOQUxbU3RyaW5nKHN0YXR1cykudG9Mb3dlckNhc2UoKV0pIHJldHVybjtcbiAgICAgIGlmIChyb3VuZCBcdTAwM2U9IENBTkNFTF9ST1VORFMpIHtcbiAgICAgICAgdGhyb3cgY29kZWRFcnJvcihcInVucmVzb2x2ZWRcIiwgYG1pc3Npb24gJHttaXNzaW9uSWR9IHN0aWxsICR7c3RhdHVzfSBhZnRlciBjYW5jZWxgKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHNsZWVwKGJhY2tvZmYocm91bmQpKTtcbiAgICB9XG4gIH0sXG59O1xuIiwicGF0aCI6InRyaWFsL29wdXMuanMifSx7ImNvbnRlbnQiOiIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHNsZWVwID0gKG1zKSA9XHUwMDNlIG5ldyBQcm9taXNlKChyKSA9XHUwMDNlIHNldFRpbWVvdXQociwgbXMpKTtcblxuZnVuY3Rpb24gc3RhdHVzT2YoZXJyKSB7XG4gIGNvbnN0IG0gPSAvXmhvc3QgYXBpIChcXGR7M30pOi8uZXhlYygoZXJyIFx1MDAyNlx1MDAyNiBlcnIubWVzc2FnZSkgfHwgJycpO1xuICByZXR1cm4gbSA/IE51bWJlcihtWzFdKSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIG5vdFBlcm1pdHRlZChlcnIpIHtcbiAgcmV0dXJuIC9ub3QgcGVybWl0dGVkIGJ5IHNhbmRib3ggY2FwYWJpbGl0eS8udGVzdCgoZXJyIFx1MDAyNlx1MDAyNiBlcnIubWVzc2FnZSkgfHwgJycpO1xufVxuXG4vLyBBIGZhaWx1cmUgdGhhdCBzYXlzIG5vdGhpbmcgZGVmaW5pdGUgYWJvdXQgdGhlIHZlbmRvcidzIHN0YXRlOiBubyBhbnN3ZXIsIGEgbG9zdFxuLy8gYW5zd2VyLCBvdXIgb3duIHRpbWVvdXQsIG9yIGEgNXh4LlxuZnVuY3Rpb24gaXNUcmFuc2llbnQoZXJyKSB7XG4gIGlmICghZXJyIHx8IG5vdFBlcm1pdHRlZChlcnIpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChlcnIudGltZWRPdXQpIHJldHVybiB0cnVlO1xuICBjb25zdCBzID0gc3RhdHVzT2YoZXJyKTtcbiAgcmV0dXJuIHMgPT09IG51bGwgPyBmYWxzZSA6IHMgXHUwMDNlPSA1MDA7XG59XG5cbmZ1bmN0aW9uIHdpdGhUaW1lb3V0KHAsIG1zKSB7XG4gIGxldCB0O1xuICBjb25zdCB0aW1lciA9IG5ldyBQcm9taXNlKChfLCByZWopID1cdTAwM2Uge1xuICAgIHQgPSBzZXRUaW1lb3V0KCgpID1cdTAwM2UgcmVqKE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCdob3N0IGFwaSA1MDI6IHRpbWVvdXQnKSwgeyB0aW1lZE91dDogdHJ1ZSB9KSksIG1zKTtcbiAgfSk7XG4gIHJldHVybiBQcm9taXNlLnJhY2UoW3AsIHRpbWVyXSkuZmluYWxseSgoKSA9XHUwMDNlIGNsZWFyVGltZW91dCh0KSk7XG59XG5cbi8vIE1hcCB0aGUgcGxhdGZvcm0ncyBjb21tYW5kIGlkIG9udG8gdGhlIHZlbmRvcidzIGFsbG93ZWQgYWxwaGFiZXQgKDgtNjQgb2YgQS1aYS16MC05LV8pLFxuLy8gaW5qZWN0aXZlbHksIHNvIGRpc3RpbmN0IGNvbW1hbmRzIG5ldmVyIHNoYXJlIGEgdmVuZG9yIG5hbWUuXG5mdW5jdGlvbiB2ZW5kb3JDb21tYW5kSWQoaWQpIHtcbiAgY29uc3QgcyA9IFN0cmluZyhpZCk7XG4gIGlmICgvXltBLVphLXowLTlfLV17OCw2NH0kLy50ZXN0KHMpKSByZXR1cm4gcztcbiAgbGV0IG91dCA9ICdjXyc7XG4gIGZvciAoY29uc3QgY2ggb2Ygcykge1xuICAgIGlmICgvW0EtWmEtejAtOV9dLy50ZXN0KGNoKSkgb3V0ICs9IGNoO1xuICAgIGVsc2Ugb3V0ICs9ICctJyArIGNoLmNvZGVQb2ludEF0KDApLnRvU3RyaW5nKDE2KSArICctJztcbiAgfVxuICB3aGlsZSAob3V0Lmxlbmd0aCBcdTAwM2MgOCkgb3V0ICs9ICdfJztcbiAgcmV0dXJuIG91dC5zbGljZSgwLCA2NCk7XG59XG5cbmZ1bmN0aW9uIGZhaWwoY29kZSwgbWVzc2FnZSkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IobWVzc2FnZSksIHsgY29kZSB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFzeW5jIGludmVudG9yeSgpIHtcbiAgICBsZXQgbGFzdEVycjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSBcdTAwM2MgNTsgaSsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3aXRoVGltZW91dChmbGVldC5saXN0Um9ib3RzKCksIDgwMDApO1xuICAgICAgICByZXR1cm4gKHJlcy5yb2JvdHMgfHwgW10pLm1hcCgocikgPVx1MDAzZSAoeyBpZDogci5pZCwgc3RhdHVzOiByLnN0YXR1cywgYmF0dGVyeTogci5iYXR0ZXJ5IH0pKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbGFzdEVyciA9IGU7XG4gICAgICAgIGlmICghaXNUcmFuc2llbnQoZSkpIHRocm93IGU7XG4gICAgICAgIGF3YWl0IHNsZWVwKDEwMCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IGxhc3RFcnI7XG4gIH0sXG5cbiAgYXN5bmMgZGlzcGF0Y2gocm9ib3RJZCwgdGFyZ2V0LCBjb21tYW5kSWQpIHtcbiAgICBjb25zdCBjaWQgPSB2ZW5kb3JDb21tYW5kSWQoY29tbWFuZElkKTtcbiAgICBjb25zdCBib2R5ID0geyB0YXJnZXQ6IHsgeDogdGFyZ2V0LngsIHk6IHRhcmdldC55IH0sIGNvbW1hbmRfaWQ6IGNpZCB9O1xuICAgIC8vIFJldHJ5aW5nIHdpdGggdGhlIHNhbWUgY29tbWFuZF9pZCBpcyBpZGVtcG90ZW50IG9uIHRoZSB2ZW5kb3I6IGl0IGFuc3dlcnMgd2l0aCB0aGVcbiAgICAvLyBvcmlnaW5hbCBtaXNzaW9uLCBzbyBpdCBjYW4gbmV2ZXIgYmVjb21lIGEgc2Vjb25kIG9yZGVyLlxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IFx1MDAzYyA1OyBhdHRlbXB0KyspIHtcbiAgICAgIGxldCByZXM7XG4gICAgICB0cnkge1xuICAgICAgICByZXMgPSBhd2FpdCB3aXRoVGltZW91dChmbGVldC5jcmVhdGVNaXNzaW9uKHJvYm90SWQsIGJvZHkpLCA4MDAwKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGlzVHJhbnNpZW50KGUpKSB7XG4gICAgICAgICAgYXdhaXQgc2xlZXAoMTAwICogKGF0dGVtcHQgKyAxKSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZmFpbCgncmVmdXNlZCcsIGB2ZW5kb3IgcmVmdXNlZCBvcmRlcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICBpZiAoIXJlcyB8fCAhcmVzLm1pc3Npb25faWQpIHRocm93IGZhaWwoJ3VucmVzb2x2ZWQnLCAndmVuZG9yIGFuc3dlciBoYWQgbm8gbWlzc2lvbiBpZCcpO1xuICAgICAgaWYgKHJlcy5jb21tYW5kX2lkICE9PSB1bmRlZmluZWQgXHUwMDI2XHUwMDI2IHJlcy5jb21tYW5kX2lkICE9PSBjaWQpIHtcbiAgICAgICAgdGhyb3cgZmFpbCgndW5yZXNvbHZlZCcsICd2ZW5kb3IgYW5zd2VyZWQgd2l0aCBhIGRpZmZlcmVudCBjb21tYW5kJyk7XG4gICAgICB9XG4gICAgICBpZiAocmVzLnJvYm90ICE9PSB1bmRlZmluZWQgXHUwMDI2XHUwMDI2IHJlcy5yb2JvdCAhPT0gcm9ib3RJZCkge1xuICAgICAgICB0aHJvdyBmYWlsKCd1bnJlc29sdmVkJywgJ3ZlbmRvciBhbnN3ZXJlZCB3aXRoIGEgZGlmZmVyZW50IHJvYm90Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzLm1pc3Npb25faWQ7XG4gICAgfVxuICAgIHRocm93IGZhaWwoJ3VucmVzb2x2ZWQnLCAnbm8gdXNhYmxlIGFuc3dlciBmcm9tIHZlbmRvcjsgb3JkZXIgc3RhdGUgdW5rbm93bicpO1xuICB9LFxuXG4gIGFzeW5jIHdhaXQobWlzc2lvbklkLCBvcHRzKSB7XG4gICAgY29uc3QgbWF4UG9sbHMgPSAob3B0cyBcdTAwMjZcdTAwMjYgb3B0cy5tYXhQb2xscykgfHwgNTA7XG4gICAgbGV0IHBvbGxzID0gMDtcbiAgICBsZXQgZXJyb3JzID0gMDtcbiAgICB3aGlsZSAocG9sbHMgXHUwMDNjIG1heFBvbGxzKSB7XG4gICAgICBsZXQgbTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG0gPSBhd2FpdCB3aXRoVGltZW91dChmbGVldC5nZXRNaXNzaW9uKG1pc3Npb25JZCksIDgwMDApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaXNUcmFuc2llbnQoZSkgXHUwMDI2XHUwMDI2ICsrZXJyb3JzIFx1MDAzYz0gMzApIHtcbiAgICAgICAgICBhd2FpdCBzbGVlcCg1MCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIHBvbGxzKys7XG4gICAgICBpZiAobS5zdGF0dXMgPT09ICdkb25lJyB8fCBtLnN0YXR1cyA9PT0gJ2ZhaWxlZCcgfHwgbS5zdGF0dXMgPT09ICdjYW5jZWxsZWQnKSB7XG4gICAgICAgIHJldHVybiB7IHN0YXRlOiBtLnN0YXR1cywgcG9sbHMgfTtcbiAgICAgIH1cbiAgICAgIGlmIChwb2xscyBcdTAwM2MgbWF4UG9sbHMpIGF3YWl0IHNsZWVwKDUwKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhdGU6ICd0aW1lb3V0JywgcG9sbHMgfTtcbiAgfSxcblxuICBhc3luYyBjYW5jZWwobWlzc2lvbklkKSB7XG4gICAgbGV0IGxhc3RFcnI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgXHUwMDNjIDU7IGkrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdpdGhUaW1lb3V0KGZsZWV0LmNhbmNlbE1pc3Npb24obWlzc2lvbklkKSwgODAwMCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxhc3RFcnIgPSBlO1xuICAgICAgICBpZiAoIWlzVHJhbnNpZW50KGUpKSB0aHJvdyBlO1xuICAgICAgICBhd2FpdCBzbGVlcCgxMDApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBsYXN0RXJyO1xuICB9LFxufTtcbiIsInBhdGgiOiJ0cmlhbC9zb25uZXQuanMifSx7ImNvbnRlbnQiOiJ7XCJjb21tYW5kc1wiOlt7XCJpZFwiOlwicnVuMDQtYzFcIixcInJvYm90XCI6XCJyMVwiLFwidGFyZ2V0XCI6e1wieFwiOjMsXCJ5XCI6MH19LHtcImlkXCI6XCJydW4wNC1jMlwiLFwicm9ib3RcIjpcInIyXCIsXCJ0YXJnZXRcIjp7XCJ4XCI6MTAsXCJ5XCI6NH19LHtcImlkXCI6XCJydW4wNC1jM1wiLFwicm9ib3RcIjpcInIzXCIsXCJ0YXJnZXRcIjp7XCJ4XCI6MCxcInlcIjoxNX19LHtcImlkXCI6XCJydW4wNC1jNFwiLFwicm9ib3RcIjpcInIxXCIsXCJ0YXJnZXRcIjp7XCJ4XCI6NTAsXCJ5XCI6NTB9LFwiY2FuY2VsXCI6dHJ1ZX1dfSIsInBhdGgiOiJwbGFuLmpzb24ifV0sImdyYW50X3Byb2ZpbGUiOiJmbGVldCIsInN0ZXBzIjpbIm5vZGUgaGFybmVzcy5qcyBsb3N0X2FjayBhZGFwdGVyLXYxLmpzIl19LCJwcm90b2NvbCI6NCwic29mdHdhcmVfcnVsZSI6bnVsbCwidGltZW91dF9tcyI6OTAwMDAsInRyYWNlX2lkIjoiYWRhcHRlci1ydW4tNCJ9LCJyZXNwb25zZSI6eyJkdXJhdGlvbl9tcyI6IjE1NDgiLCJlbnZpcm9ubWVudCI6ImRvY2tlci1pbWFnZTpzaGEyNTY6MzJkYTc3YjFiZTI0ZGU0YzE1MjY2N2MyOGFiNjM1MzE0MjVjZDY5MDAwYWNmMzBhMzI4OTg1Y2I4NTczNzdmNyIsImluc3RhbmNlIjoiIiwiaXNvbGF0aW9uIjoia2VybmVsIiwicHJvamVjdCI6eyJhZHZpY2UiOlt7ImFkZGVkX2xhdGVuY3lfbXMiOiIwIiwiYnl0ZXNfbW92ZWQiOiIzNzYiLCJkZXRhaWwiOiJUaGlzIHJ1biBtYWRlIDYgc3VjY2Vzc2Z1bCBHRVQgL3JvYm90cy8qIGNhbGxzIHRvIG9uZSBwZXItaXRlbSByb3V0ZSAodGhlIHRyYWNlIGhvbGRzIHRoZSB0ZW1wbGF0ZSwgbm90IHRoZSBpdGVtKTsgYSBjb2xsZWN0aW9uIG9yIGJhdGNoIHJlYWQgd291bGQgY292ZXIgdGhlbSBpbiBvbmUgcmVxdWVzdCBpZiBpdCByZXR1cm5zIHRoZSBzYW1lIGl0ZW1zLiBUaGUgcHJvZmlsZSBkZWNsYXJlcyBHRVQgL3JvYm90cyBhcyB0aGlzIHJvdXRlJ3MgYmF0Y2ggZm9ybSBhbmQgZ3JhbnRzIGl0OyB0aGUgZGVjbGFyYXRpb24gaXMgdGhlIG9wZXJhdG9yJ3MsIGFuZCBwbGltc29sbCBoYXMgbm90IGNoZWNrZWQgdGhhdCBpdCByZXR1cm5zIHRoZSBzYW1lIGl0ZW1zLiIsImV4dHJhX2NhbGxzIjo1LCJtZXRob2QiOiJHRVQiLCJwYXR0ZXJuIjoiZmFuX291dCIsInJlbWVkeSI6ImJhdGNoIiwicm91dGUiOiIvcm9ib3RzLyoiLCJzZXZlcml0eSI6ImxvdyIsInN1Z2dlc3RlZF9tZXRob2QiOiJHRVQiLCJzdWdnZXN0ZWRfcm91dGUiOiIvcm9ib3RzIn1dLCJhcnRpZmFjdHMiOltdLCJhcnRpZmFjdHNfdHJ1bmNhdGVkIjpmYWxzZSwib3V0Y29tZSI6IlBST0pFQ1RfT1VUQ09NRV9DT01QTEVURUQiLCJvdXRjb21lX2RldGFpbCI6IiIsInN0ZXBzIjpbeyJjb21tYW5kIjoibm9kZSBoYXJuZXNzLmpzIGxvc3RfYWNrIGFkYXB0ZXItdjEuanMiLCJkdXJhdGlvbl9tcyI6Ijc4NSIsImV4aXRfY29kZSI6MCwic3RkZXJyIjoiIiwic3RkZXJyX3RydW5jYXRlZCI6ZmFsc2UsInN0ZG91dCI6IlFVUkJVRlJGVWkxU1JWQlBVbFFnZXlKelkyVnVZWEpwYnlJNklteHZjM1JmWVdOcklpd2lZV1JoY0hSbGNpSTZJbUZrWVhCMFpYSXRkakV1YW5NaUxDSmpiMjF3YkdWMFpXUWlPblJ5ZFdVc0ltTnZiVzFoYm1SeklqcGJleUpwWkNJNkluSjFiakEwTFdNeElpd2ljbTlpYjNRaU9pSnlNU0lzSW0xcGMzTnBiMjRpT2lKdE1TSXNJbVJwYzNCaGRHTm9aV1FpT2lKdE1TSXNJbk4wWVhSbElqb2laRzl1WlNJc0luQnZiR3h6SWpvekxDSnRZWGhmY0c5c2JITWlPalF3TENKM1lXbDBaV1FpT25zaWMzUmhkR1VpT2lKa2IyNWxJaXdpY0c5c2JITWlPak1zSW5KbGRISnBaWE1pT2pGOUxDSmxjbkp2Y2lJNklpSXNJbU52WkdVaU9pSWlmU3g3SW1sa0lqb2ljblZ1TURRdFl6SWlMQ0p5YjJKdmRDSTZJbkl5SWl3aWJXbHpjMmx2YmlJNkltMHpJaXdpWkdsemNHRjBZMmhsWkNJNkltMHpJaXdpYzNSaGRHVWlPaUprYjI1bElpd2ljRzlzYkhNaU9qVXNJbTFoZUY5d2IyeHNjeUk2TkRBc0luZGhhWFJsWkNJNmV5SnpkR0YwWlNJNkltUnZibVVpTENKd2IyeHNjeUk2TlN3aWNtVjBjbWxsY3lJNk1YMHNJbVZ5Y205eUlqb2lJaXdpWTI5a1pTSTZJaUo5TEhzaWFXUWlPaUp5ZFc0d05DMWpNeUlzSW5KdlltOTBJam9pY2pNaUxDSnRhWE56YVc5dUlqb2liVFFpTENKa2FYTndZWFJqYUdWa0lqb2liVFFpTENKemRHRjBaU0k2SW1SdmJtVWlMQ0p3YjJ4c2N5STZOU3dpYldGNFgzQnZiR3h6SWpvME1Dd2lkMkZwZEdWa0lqcDdJbk4wWVhSbElqb2laRzl1WlNJc0luQnZiR3h6SWpvMUxDSnlaWFJ5YVdWeklqb3hmU3dpWlhKeWIzSWlPaUlpTENKamIyUmxJam9pSW4wc2V5SnBaQ0k2SW5KMWJqQTBMV00wSWl3aWNtOWliM1FpT2lKeU1TSXNJbTFwYzNOcGIyNGlPaUp0TlNJc0ltUnBjM0JoZEdOb1pXUWlPaUp0TlNJc0luTjBZWFJsSWpvaVkyRnVZMlZzYkdWa0lpd2ljRzlzYkhNaU9qRXNJbTFoZUY5d2IyeHNjeUk2TlN3aWQyRnBkR1ZrSWpwN0luTjBZWFJsSWpvaVkyRnVZMlZzYkdWa0lpd2ljRzlzYkhNaU9qRXNJbkpsZEhKcFpYTWlPakY5TENKbGNuSnZjaUk2SWlJc0ltTnZaR1VpT2lJaWZWMHNJbWx1ZG1WdWRHOXlhV1Z6SWpwYmV5SnlaWFIxY201bFpDSTZXM3NpYVdRaU9pSnlNU0lzSW5OMFlYUjFjeUk2SW1sa2JHVWlMQ0ppWVhSMFpYSjVJam81Tm4wc2V5SnBaQ0k2SW5JeUlpd2ljM1JoZEhWeklqb2lhV1JzWlNJc0ltSmhkSFJsY25raU9qY3hmU3g3SW1sa0lqb2ljak1pTENKemRHRjBkWE1pT2lKcFpHeGxJaXdpWW1GMGRHVnllU0k2TlRoOVhTd2laWEp5YjNJaU9pSWlmU3g3SW5KbGRIVnlibVZrSWpwYmV5SnBaQ0k2SW5JeElpd2ljM1JoZEhWeklqb2lhV1JzWlNJc0ltSmhkSFJsY25raU9qazBmU3g3SW1sa0lqb2ljaklpTENKemRHRjBkWE1pT2lKcFpHeGxJaXdpWW1GMGRHVnllU0k2TmpoOUxIc2lhV1FpT2lKeU15SXNJbk4wWVhSMWN5STZJbWxrYkdVaUxDSmlZWFIwWlhKNUlqbzFOSDFkTENKbGNuSnZjaUk2SWlKOVhTd2ljRzlzYkhNaU9qRTBMQ0p5WlhSeWFXVnpJam94TENKbGNuSnZjbk1pT2x0ZGZRbz0iLCJzdGRvdXRfdHJ1bmNhdGVkIjpmYWxzZSwidGltZWRfb3V0IjpmYWxzZX1dfSwicmVjb3JkIjp7ImVuZGVkX3VuaXhfbXMiOiIxNzkyNzg0MzUxNzYzIiwiZW52aXJvbm1lbnQiOiJkb2NrZXItaW1hZ2U6c2hhMjU2OjMyZGE3N2IxYmUyNGRlNGMxNTI2NjdjMjhhYjYzNTMxNDI1Y2Q2OTAwMGFjZjMwYTMyODk4NWNiODU3Mzc3ZjciLCJpbnN0YW5jZSI6IiIsImlzb2xhdGlvbiI6Imtlcm5lbCIsInBvbGljeSI6IiIsInByZXZpb3VzX3NoYTI1NiI6IiIsInByb3ZpZGVyIjoiZG9ja2VyIiwicmVjb3JkX3NoYTI1NiI6ImMzM2VkNjg4YWNlZmU0ZmY4ZjYxNGI0YjQ0Mzg1OWMyZGE0YTQ1OWUwNTc4ZGVkMjEwY2MyMjA0MzM1MjZhYTEiLCJyZXF1ZXN0X3NoYTI1NiI6ImM3OTNhNWYyOTQxNzQ5MGM4NGZhNjlkZDgyMjNmNWYwZGUxMjQxM2Y2Zjc0ODIzNjZlMzdlZjFjYmYwNDY4ZTEiLCJyZXN1bHRfc2hhMjU2IjoiZWVlODI4MzNhZWJiZGZkNjRiZGJmY2U1ODYxZDJlZTkyYTM4ZDM2M2NiNGExZjhlNDhkZDdkNzhlMjIzZDJmMCIsInNlcXVlbmNlIjoiMCIsInNlc3Npb24iOiIiLCJzb2Z0d2FyZV9pZGVudGl0eSI6Im9jaS1tYW5pZmVzdDpsaW51eC9hbWQ2NEBzaGEyNTY6YTZlZjJlYTFjOGYxZGU1Yzg4NWUxYTE4YmE3ZWU0ZDk2MmUzYTg1OTg3N2Y2ZjQ2YzJmYjdlYmFjMWY2Y2M1YyIsInNvZnR3YXJlX3J1bGVfaWQiOiIiLCJzdGFydGVkX3VuaXhfbXMiOiIxNzkyNzg0MzUwMjE1IiwidW5hbnN3ZXJlZCI6IiIsInZlcnNpb24iOjR9LCJzYW5kYm94IjoiZG9ja2VyIiwic29mdHdhcmVfaWRlbnRpdHkiOiJvY2ktbWFuaWZlc3Q6bGludXgvYW1kNjRAc2hhMjU2OmE2ZWYyZWExYzhmMWRlNWM4ODVlMWExOGJhN2VlNGQ5NjJlM2E4NTk4NzdmNmY0NmMyZmI3ZWJhYzFmNmNjNWMifX0=",
                              "contentType": "application/json",
                              "encoding": "base64"
                            }
                          },
                          "name": "exchange.json"
                        }
                      ],
                      "description": "Public example evidence: DSSE envelope, signed body type application/vnd.in-toto+json, in-toto statement https://in-toto.io/Statement/v1, predicate https://plimsollmark.github.io/plimsoll/run-record/v1, key id 2368e6af86fb7984c52ea36b04298aafc498a7461f116e0e998efed702974567. entry.json is line 4 of the referenced bundle as stored: the exact binary protobuf request and response, the record's envelope and the harness's signed link placing the line. exchange.json is a plain JSON copy checked against those bytes.",
                      "propertyName": "plimsoll:run_record"
                    },
                    {
                      "author": {
                        "name": "plimsoll-attest key 2368e6af86fb7984c52ea36b04298aafc498a7461f116e0e998efed702974567"
                      },
                      "bom-ref": "evidence-qualification",
                      "created": "2026-10-23T19:39:11.763Z",
                      "data": [
                        {
                          "contents": {
                            "attachment": {
                              "content": "eyJwYXlsb2FkVHlwZSI6ImFwcGxpY2F0aW9uL3ZuZC5pbi10b3RvK2pzb24iLCJwYXlsb2FkIjoiZXlKZmRIbHdaU0k2SW1oMGRIQnpPaTh2YVc0dGRHOTBieTVwYnk5VGRHRjBaVzFsYm5RdmRqRWlMQ0p6ZFdKcVpXTjBJanBiZXlKdVlXMWxJam9pY25WdUxYSmxZMjl5WkNJc0ltUnBaMlZ6ZENJNmV5SnphR0V5TlRZaU9pSmpNek5sWkRZNE9HRmpaV1psTkdabU9HWTJNVFJpTkdJME5ETTROVGxqTW1SaE5HRTBOVGxsTURVM09HUmxaREl4TUdOak1qSXdORE16TlRJMllXRXhJbjE5WFN3aWNISmxaR2xqWVhSbFZIbHdaU0k2SW1oMGRIQnpPaTh2Y0d4cGJYTnZiR3h0WVhKckxtZHBkR2gxWWk1cGJ5OXdiR2x0YzI5c2JDOWxlR0Z0Y0d4bGN5OWhaR0Z3ZEdWeUwzRjFZV3hwWm1sallYUnBiMjR2ZGpFaUxDSndjbVZrYVdOaGRHVWlPbnNpY25WdUlqbzBMQ0p6YVcxMWJHRjBiM0lpT2lKbWJHVmxkSE5wYlM4eklpd2lZV1JoY0hSbGNpSTZleUp3WVhSb0lqb2lZV1JoY0hSbGNpMTJNUzVxY3lJc0luTm9ZVEkxTmlJNklqRm1NVEUxTXpGa09HSmtabVZsWkRrME9EQmtOamN4TWpKbE1HVTRNbVF5TURnNU5EQmtaRFJqTUdOa1pHTTNOakl4TlRVNU9ERTJNRFF3TVROak1UUWlmU3dpYUdGeWJtVnpjMTl6YUdFeU5UWWlPaUl4TVdGbE5UaGtOVFk1WW1VeVpHVmtaVFUzWXpoaVlUSm1PRGN6TjJKa01HRTFOVGxoT0RSbFlqQTBPVFZtTnpsaE1EYzBNR1JtWlRnMk1qRXlZemsxSWl3aVpYWnBaR1Z1WTJVaU9uc2lhMmx1WkNJNkltRmtZWEIwWlhJaUxDSnpZMlZ1WVhKcGJ5STZleUp1WVcxbElqb2liRzl6ZEY5aFkyc2lMQ0p6WVhseklqb2ljakluY3lCbWFYSnpkQ0J2Y21SbGNpQnBjeUJoWTJObGNIUmxaQ0JoYm1RZ2MzUmhjblJsWkN3Z1luVjBJR2wwY3lCaGJuTjNaWElnYVhNZ1lTQTFNRE1pTENKc2IzTmxYMkZ1YzNkbGNpSTZJbkl5SW4wc0luQnNZVzRpT25zaVkyOXRiV0Z1WkhNaU9sdDdJbWxrSWpvaWNuVnVNRFF0WXpFaUxDSnliMkp2ZENJNkluSXhJaXdpZEdGeVoyVjBJanA3SW5naU9qTXNJbmtpT2pCOWZTeDdJbWxrSWpvaWNuVnVNRFF0WXpJaUxDSnliMkp2ZENJNkluSXlJaXdpZEdGeVoyVjBJanA3SW5naU9qRXdMQ0o1SWpvMGZYMHNleUpwWkNJNkluSjFiakEwTFdNeklpd2ljbTlpYjNRaU9pSnlNeUlzSW5SaGNtZGxkQ0k2ZXlKNElqb3dMQ0o1SWpveE5YMTlMSHNpYVdRaU9pSnlkVzR3TkMxak5DSXNJbkp2WW05MElqb2ljakVpTENKMFlYSm5aWFFpT25zaWVDSTZOVEFzSW5raU9qVXdmU3dpWTJGdVkyVnNJanAwY25WbGZWMTlMQ0pzWldSblpYSWlPbHQ3SW1sa0lqb2liVEVpTENKeWIySnZkQ0k2SW5JeElpd2lkR0Z5WjJWMElqcDdJbmdpT2pNc0lua2lPakI5TENKemRHRjBkWE1pT2lKa2IyNWxJaXdpYUdsemRHOXllU0k2V3lKeGRXVjFaV1FpTENKeWRXNXVhVzVuSWl3aVpHOXVaU0pkTENKemRHVndjeUk2TXl3aWMzUnZjSEJsWkY5aGRDSTZleUo0SWpvekxDSjVJam93Zlgwc2V5SnBaQ0k2SW0weUlpd2ljbTlpYjNRaU9pSnlNaUlzSW5SaGNtZGxkQ0k2ZXlKNElqb3hNQ3dpZVNJNk5IMHNJbk4wWVhSMWN5STZJbVJ2Ym1VaUxDSm9hWE4wYjNKNUlqcGJJbkYxWlhWbFpDSXNJbkoxYm01cGJtY2lMQ0prYjI1bElsMHNJbk4wWlhCeklqbzBMQ0p6ZEc5d2NHVmtYMkYwSWpwN0luZ2lPakV3TENKNUlqbzBmWDBzZXlKcFpDSTZJbTB6SWl3aWNtOWliM1FpT2lKeU1pSXNJblJoY21kbGRDSTZleUo0SWpveE1Dd2llU0k2Tkgwc0luTjBZWFIxY3lJNkltUnZibVVpTENKb2FYTjBiM0o1SWpwYkluRjFaWFZsWkNJc0luSjFibTVwYm1jaUxDSmtiMjVsSWwwc0luTjBaWEJ6SWpveExDSnpkRzl3Y0dWa1gyRjBJanA3SW5naU9qRXdMQ0o1SWpvMGZYMHNleUpwWkNJNkltMDBJaXdpY205aWIzUWlPaUp5TXlJc0luUmhjbWRsZENJNmV5SjRJam93TENKNUlqb3hOWDBzSW5OMFlYUjFjeUk2SW1SdmJtVWlMQ0pvYVhOMGIzSjVJanBiSW5GMVpYVmxaQ0lzSW5KMWJtNXBibWNpTENKa2IyNWxJbDBzSW5OMFpYQnpJam8xTENKemRHOXdjR1ZrWDJGMElqcDdJbmdpT2pBc0lua2lPakUxZlgwc2V5SnBaQ0k2SW0wMUlpd2ljbTlpYjNRaU9pSnlNU0lzSW5SaGNtZGxkQ0k2ZXlKNElqbzFNQ3dpZVNJNk5UQjlMQ0p6ZEdGMGRYTWlPaUpqWVc1alpXeHNaV1FpTENKb2FYTjBiM0o1SWpwYkluRjFaWFZsWkNJc0luSjFibTVwYm1jaUxDSmpZVzVqWld4c1pXUWlYU3dpYzNSbGNITWlPakFzSW5OMGIzQndaV1JmWVhRaU9uc2llQ0k2TXl3aWVTSTZNSDE5WFN3aWNtOWliM1J6SWpwYmV5SnBaQ0k2SW5JeElpd2ljM1JoZEhWeklqb2lhV1JzWlNJc0ltSmhkSFJsY25raU9qazBMQ0p3YjNObElqcDdJbmdpT2pNc0lua2lPakI5ZlN4N0ltbGtJam9pY2pJaUxDSnpkR0YwZFhNaU9pSnBaR3hsSWl3aVltRjBkR1Z5ZVNJNk5qZ3NJbkJ2YzJVaU9uc2llQ0k2TVRBc0lua2lPalI5ZlN4N0ltbGtJam9pY2pNaUxDSnpkR0YwZFhNaU9pSnBaR3hsSWl3aVltRjBkR1Z5ZVNJNk5UUXNJbkJ2YzJVaU9uc2llQ0k2TUN3aWVTSTZNVFY5ZlYwc0luWmxibVJ2Y2lJNmV5SmpZWFJoYkc5blgyOXViSGtpT250OUxDSjFibUYxZEdodmNtbDZaV1FpT2pCOUxDSmpjbVZrWlc1MGFXRnNjeUk2VzNzaWFXUWlPaUpqTldKaE5qSTBaamxrTjJZeE1EQmhOMlZrTkRNM05qZ3hZakJoTVRsaE5TSXNJbk4xWW1wbFkzUWlPaUpsZUdGdGNHeGxMV05zYVdWdWRDSXNJbXhwWm1WMGFXMWxYM05sWTI5dVpITWlPamsxZlYwc0luSmxZV1J6SWpwN0ltMHhJam96TENKdE15STZOU3dpYlRRaU9qVXNJbTAxSWpveGZTd2lkRzlzWkNJNmV5SnRNU0k2TVN3aWJUTWlPakVzSW0wMElqb3hMQ0p0TlNJNk1uMHNJbUp5YjJ0bGNsOWtaVzVwWldRaU9qQXNJbkpsY0c5eWRDSTZleUp6WTJWdVlYSnBieUk2SW14dmMzUmZZV05ySWl3aVlXUmhjSFJsY2lJNkltRmtZWEIwWlhJdGRqRXVhbk1pTENKamIyMXdiR1YwWldRaU9uUnlkV1VzSW1OdmJXMWhibVJ6SWpwYmV5SnBaQ0k2SW5KMWJqQTBMV014SWl3aWNtOWliM1FpT2lKeU1TSXNJbTFwYzNOcGIyNGlPaUp0TVNJc0ltUnBjM0JoZEdOb1pXUWlPaUp0TVNJc0luTjBZWFJsSWpvaVpHOXVaU0lzSW5CdmJHeHpJam96TENKdFlYaGZjRzlzYkhNaU9qUXdMQ0ozWVdsMFpXUWlPbnNpYzNSaGRHVWlPaUprYjI1bElpd2ljRzlzYkhNaU9qTXNJbkpsZEhKcFpYTWlPakY5TENKbGNuSnZjaUk2SWlJc0ltTnZaR1VpT2lJaWZTeDdJbWxrSWpvaWNuVnVNRFF0WXpJaUxDSnliMkp2ZENJNkluSXlJaXdpYldsemMybHZiaUk2SW0weklpd2laR2x6Y0dGMFkyaGxaQ0k2SW0weklpd2ljM1JoZEdVaU9pSmtiMjVsSWl3aWNHOXNiSE1pT2pVc0ltMWhlRjl3YjJ4c2N5STZOREFzSW5kaGFYUmxaQ0k2ZXlKemRHRjBaU0k2SW1SdmJtVWlMQ0p3YjJ4c2N5STZOU3dpY21WMGNtbGxjeUk2TVgwc0ltVnljbTl5SWpvaUlpd2lZMjlrWlNJNklpSjlMSHNpYVdRaU9pSnlkVzR3TkMxak15SXNJbkp2WW05MElqb2ljak1pTENKdGFYTnphVzl1SWpvaWJUUWlMQ0prYVhOd1lYUmphR1ZrSWpvaWJUUWlMQ0p6ZEdGMFpTSTZJbVJ2Ym1VaUxDSndiMnhzY3lJNk5Td2liV0Y0WDNCdmJHeHpJam8wTUN3aWQyRnBkR1ZrSWpwN0luTjBZWFJsSWpvaVpHOXVaU0lzSW5CdmJHeHpJam8xTENKeVpYUnlhV1Z6SWpveGZTd2laWEp5YjNJaU9pSWlMQ0pqYjJSbElqb2lJbjBzZXlKcFpDSTZJbkoxYmpBMExXTTBJaXdpY205aWIzUWlPaUp5TVNJc0ltMXBjM05wYjI0aU9pSnROU0lzSW1ScGMzQmhkR05vWldRaU9pSnROU0lzSW5OMFlYUmxJam9pWTJGdVkyVnNiR1ZrSWl3aWNHOXNiSE1pT2pFc0ltMWhlRjl3YjJ4c2N5STZOU3dpZDJGcGRHVmtJanA3SW5OMFlYUmxJam9pWTJGdVkyVnNiR1ZrSWl3aWNHOXNiSE1pT2pFc0luSmxkSEpwWlhNaU9qRjlMQ0psY25KdmNpSTZJaUlzSW1OdlpHVWlPaUlpZlYwc0ltbHVkbVZ1ZEc5eWFXVnpJanBiZXlKeVpYUjFjbTVsWkNJNlczc2lhV1FpT2lKeU1TSXNJbk4wWVhSMWN5STZJbWxrYkdVaUxDSmlZWFIwWlhKNUlqbzVObjBzZXlKcFpDSTZJbkl5SWl3aWMzUmhkSFZ6SWpvaWFXUnNaU0lzSW1KaGRIUmxjbmtpT2pjeGZTeDdJbWxrSWpvaWNqTWlMQ0p6ZEdGMGRYTWlPaUpwWkd4bElpd2lZbUYwZEdWeWVTSTZOVGg5WFN3aVpYSnliM0lpT2lJaWZTeDdJbkpsZEhWeWJtVmtJanBiZXlKcFpDSTZJbkl4SWl3aWMzUmhkSFZ6SWpvaWFXUnNaU0lzSW1KaGRIUmxjbmtpT2prMGZTeDdJbWxrSWpvaWNqSWlMQ0p6ZEdGMGRYTWlPaUpwWkd4bElpd2lZbUYwZEdWeWVTSTZOamg5TEhzaWFXUWlPaUp5TXlJc0luTjBZWFIxY3lJNkltbGtiR1VpTENKaVlYUjBaWEo1SWpvMU5IMWRMQ0psY25KdmNpSTZJaUo5WFN3aWNHOXNiSE1pT2pFMExDSnlaWFJ5YVdWeklqb3hMQ0psY25KdmNuTWlPbHRkZlN3aVpYaHBkRjlqYjJSbElqb3dmU3dpY25Wc1pYTWlPbHQ3SW5KMWJHVWlPaUp5WVc1ZmRHOWZkR2hsWDJWdVpDSXNJbWhsYkdRaU9uUnlkV1Y5TEhzaWNuVnNaU0k2SW10bGNIUmZkR2hsWDNOb1lYQmxjeUlzSW1obGJHUWlPblJ5ZFdWOUxIc2ljblZzWlNJNkltbHVkbVZ1ZEc5eWVWOXBjMTkwY25WbElpd2lhR1ZzWkNJNmRISjFaWDBzZXlKeWRXeGxJam9pYjI1bFgyOXlaR1Z5WDNCbGNsOWpiMjF0WVc1a0lpd2lhR1ZzWkNJNlptRnNjMlVzSW1SbGRHRnBiQ0k2SW5KMWJqQTBMV015SUdKbFkyRnRaU0F5SUc5eVpHVnljeUFvYlRJc0lHMHpLU0o5TEhzaWNuVnNaU0k2SW5KcFoyaDBYM0p2WW05MFgyRnVaRjkwWVhKblpYUWlMQ0pvWld4a0lqcDBjblZsZlN4N0luSjFiR1VpT2lKbGJtUmxaRjloYzE5cGRGOXphRzkxYkdRaUxDSm9aV3hrSWpwMGNuVmxmU3g3SW5KMWJHVWlPaUp5YjJKdmRGOWhkRjkwWVhKblpYUWlMQ0pvWld4a0lqcDBjblZsZlN4N0luSjFiR1VpT2lKeVpYQnZjblJmYVhOZmRISjFaU0lzSW1obGJHUWlPblJ5ZFdWOVhTd2lkbVZ5WkdsamRDSTZJbVpoYVd3aWZYMD0iLCJzaWduYXR1cmVzIjpbeyJrZXlpZCI6IjIzNjhlNmFmODZmYjc5ODRjNTJlYTM2YjA0Mjk4YWFmYzQ5OGE3NDYxZjExNmUwZTk5OGVmZWQ3MDI5NzQ1NjciLCJzaWciOiJVb3FRakV3Rkx2UWZCVWYzUHJ4eTJPUmg1T3BQSExxcDFaWFBlSFQ3WTUxZ2pOekZWQjAyUm5XeWxweHJHcUM3bm14NmQ4ZHFsTlpZdXZZT0pWTFFEUT09In1dfQ==",
                              "contentType": "application/json",
                              "encoding": "base64"
                            }
                          },
                          "name": "statement.json"
                        }
                      ],
                      "description": "The platform's qualification statement for this run: DSSE envelope, signed body type application/vnd.in-toto+json, in-toto statement https://in-toto.io/Statement/v1, predicate https://plimsollmark.github.io/plimsoll/examples/adapter/qualification/v1, key id 2368e6af86fb7984c52ea36b04298aafc498a7461f116e0e998efed702974567; its subject is this run's record. The referenced qualification file holds one such statement for every run of the referenced bundle.",
                      "propertyName": "plimsoll:qualification"
                    }
                  ]
                },
                "definitions": {
                  "standards": [
                    {
                      "bom-ref": "std-plimsoll-run-evidence",
                      "name": "plimsoll run evidence",
                      "requirements": [
                        {
                          "bom-ref": "req-code",
                          "identifier": "R1",
                          "title": "the code that ran is identified by digest"
                        },
                        {
                          "bom-ref": "req-image",
                          "identifier": "R2",
                          "title": "the image is identified by its manifest digest"
                        },
                        {
                          "bom-ref": "req-tier",
                          "identifier": "R3",
                          "title": "the isolation tier the daemon states is signed"
                        },
                        {
                          "bom-ref": "req-verdict",
                          "identifier": "R4",
                          "title": "the program met the platform's rules"
                        }
                      ],
                      "version": "1"
                    }
                  ]
                },
                "formulation": [
                  {
                    "bom-ref": "formula",
                    "workflows": [
                      {
                        "bom-ref": "run",
                        "inputs": [
                          {
                            "resource": {
                              "ref": "program"
                            }
                          }
                        ],
                        "name": "plimsoll run",
                        "outputs": [
                          {
                            "properties": [
                              {
                                "name": "plimsoll:result_sha256",
                                "value": "eee82833aebbdfd64bdbfce5861d2ee92a38d363cb4a1f8e48dd7d78e223d2f0"
                              }
                            ],
                            "resource": {
                              "ref": "evidence-run-record"
                            },
                            "type": "other"
                          }
                        ],
                        "properties": [
                          {
                            "name": "plimsoll:provider",
                            "value": "docker"
                          },
                          {
                            "name": "plimsoll:isolation",
                            "value": "kernel"
                          },
                          {
                            "name": "plimsoll:minimum_isolation",
                            "value": "container"
                          },
                          {
                            "name": "plimsoll:timeout_ms",
                            "value": "90000"
                          },
                          {
                            "name": "plimsoll:grant",
                            "value": "fleet"
                          },
                          {
                            "name": "plimsoll:outcome",
                            "value": "completed"
                          }
                        ],
                        "runtimeTopology": [
                          {
                            "dependsOn": [
                              "image"
                            ],
                            "ref": "program"
                          }
                        ],
                        "taskDependencies": [
                          {
                            "ref": "step-1"
                          }
                        ],
                        "taskTypes": [
                          "other"
                        ],
                        "tasks": [
                          {
                            "bom-ref": "step-1",
                            "name": "node harness.js lost_ack adapter-v1.js",
                            "steps": [
                              {
                                "commands": [
                                  {
                                    "executed": "node harness.js lost_ack adapter-v1.js",
                                    "properties": [
                                      {
                                        "name": "plimsoll:exit_code",
                                        "value": "0"
                                      },
                                      {
                                        "name": "plimsoll:duration_ms",
                                        "value": "785"
                                      },
                                      {
                                        "name": "plimsoll:timed_out",
                                        "value": "false"
                                      },
                                      {
                                        "name": "plimsoll:stdout_truncated",
                                        "value": "false"
                                      },
                                      {
                                        "name": "plimsoll:stderr_truncated",
                                        "value": "false"
                                      }
                                    ]
                                  }
                                ]
                              }
                            ],
                            "taskTypes": [
                              "other"
                            ],
                            "uid": "1"
                          }
                        ],
                        "timeEnd": "2026-10-23T19:39:11.763Z",
                        "timeStart": "2026-10-23T19:39:10.215Z",
                        "uid": "c33ed688acefe4ff8f614b4b443859c2da4a459e0578ded210cc220433526aa1"
                      }
                    ]
                  }
                ],
                "metadata": {
                  "component": {
                    "bom-ref": "program",
                    "components": [
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "1f11531d8bdfeed9480d67122e0e82d208940dd4c0cddc762155981604013c14"
                          }
                        ],
                        "name": "adapter-v1.js",
                        "properties": [
                          {
                            "name": "plimsoll:bytes",
                            "value": "2217"
                          }
                        ],
                        "type": "file"
                      },
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "4085bb2e4900ee3becc6c308de1a927d073f0a9746923183ce839a6429921330"
                          }
                        ],
                        "name": "adapter-v2.js",
                        "properties": [
                          {
                            "name": "plimsoll:bytes",
                            "value": "4107"
                          }
                        ],
                        "type": "file"
                      },
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "adb12255d965710962f97e5c648e8d6126fb2482f0a508211e3daed2403ed858"
                          }
                        ],
                        "name": "broken/empty-inventory.js",
                        "properties": [
                          {
                            "name": "plimsoll:bytes",
                            "value": "198"
                          }
                        ],
                        "type": "file"
                      },
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "28eff8d401d435f420ffad42766c599e95b2ee408c2675fffbb790a55c543077"
                          }
                        ],
                        "name": "broken/false-success.js",
                        "properties": [
                          {
                            "name": "plimsoll:bytes",
                            "value": "320"
                          }
                        ],
                        "type": "file"
                      },
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "43678d59d0d35b371dd4e506cf91b7b4e639e68f46ff116d16e23b71841e15cf"
                          }
                        ],
                        "name": "broken/invented-robot.js",
                        "properties": [
                          {
                            "name": "plimsoll:bytes",
                            "value": "315"
                          }
                        ],
                        "type": "file"
                      },
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "a2c4f4c08cfe629287ff5f3f4539ee5a194e5c9d1d43b4e43fdedef5e508166d"
                          }
                        ],
                        "name": "broken/no-cancel.js",
                        "properties": [
                          {
                            "name": "plimsoll:bytes",
                            "value": "176"
                          }
                        ],
                        "type": "file"
                      },
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "a1c7a32e9d34a7625c4c15d672ae05cffe7b69e0bc1f4de354539c7637e10af6"
                          }
                        ],
                        "name": "broken/no-state.js",
                        "properties": [
                          {
                            "name": "plimsoll:bytes",
                            "value": "302"
                          }
                        ],
                        "type": "file"
                      },
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "e50e2a6e423b75b3b85c0ab87ad1c85cb104280f791c01341dada29cc0a0dbd4"
                          }
                        ],
                        "name": "broken/throwing-wait.js",
                        "properties": [
                          {
                            "name": "plimsoll:bytes",
                            "value": "342"
                          }
                        ],
                        "type": "file"
                      },
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "d6d0659cef1e0ee19237c83f54c4f603481ef440a3b6c4979f1265af97a13119"
                          }
                        ],
                        "name": "broken/unanswered-as-refused.js",
                        "properties": [
                          {
                            "name": "plimsoll:bytes",
                            "value": "637"
                          }
                        ],
                        "type": "file"
                      },
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "967018d33b8f7cb36bf8846143642468f85f3d767c490a5a44fa3e4c098e6feb"
                          }
                        ],
                        "name": "broken/undercounted-reads.js",
                        "properties": [
                          {
                            "name": "plimsoll:bytes",
                            "value": "438"
                          }
                        ],
                        "type": "file"
                      },
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "bb6cdd7bbe1e6cfbe95b12c752eb4c4644a80faf60771e1ca14f9ea8688d2257"
                          }
                        ],
                        "name": "broken/wrong-robot.js",
                        "properties": [
                          {
                            "name": "plimsoll:bytes",
                            "value": "317"
                          }
                        ],
                        "type": "file"
                      },
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "9656c5cd6d363f5435c474a4bd34bf33b35f08ff23c02a41c2c00caecb2f858a"
                          }
                        ],
                        "name": "broken/wrong-target.js",
                        "properties": [
                          {
                            "name": "plimsoll:bytes",
                            "value": "344"
                          }
                        ],
                        "type": "file"
                      },
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "11ae58d569be2dede57c8ba2f8737bd0a559a84eb0495f79a0740dfe86212c95"
                          }
                        ],
                        "name": "harness.js",
                        "properties": [
                          {
                            "name": "plimsoll:bytes",
                            "value": "4721"
                          }
                        ],
                        "type": "file"
                      },
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "ac4541732c4aa8cccb3b7bc7e2414fdce8d1aa263a0456ee066b8d3f269339ad"
                          }
                        ],
                        "name": "plan.json",
                        "properties": [
                          {
                            "name": "plimsoll:bytes",
                            "value": "248"
                          }
                        ],
                        "type": "file"
                      },
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "5a661036e8357104e7be9447eb580f2e0bddd533f6be1ac38d7cd6129f7d10a2"
                          }
                        ],
                        "name": "probe.js",
                        "properties": [
                          {
                            "name": "plimsoll:bytes",
                            "value": "2328"
                          }
                        ],
                        "type": "file"
                      },
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "e3a619624fd58fb03af9c912a54617ccbf14655999cd72e3ae0c5ed0bd0c4db7"
                          }
                        ],
                        "name": "trial/haiku.js",
                        "properties": [
                          {
                            "name": "plimsoll:bytes",
                            "value": "3739"
                          }
                        ],
                        "type": "file"
                      },
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "4e6e9c60e2c450eeae165f63b99e0b50763e28e50957343ddca8fdbdd0f6a2c1"
                          }
                        ],
                        "name": "trial/opus.js",
                        "properties": [
                          {
                            "name": "plimsoll:bytes",
                            "value": "8131"
                          }
                        ],
                        "type": "file"
                      },
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "46de6b0df8ce9cf4e1f3db6e22ae012f283ccc9fbc84719e117539ea2483462c"
                          }
                        ],
                        "name": "trial/sonnet.js",
                        "properties": [
                          {
                            "name": "plimsoll:bytes",
                            "value": "4007"
                          }
                        ],
                        "type": "file"
                      }
                    ],
                    "description": "A program an AI wrote against a simulated fleet vendor's API, run once through plimsoll under a per-run grant and judged by the platform's rules; authorship is supplied context, not verified evidence.",
                    "externalReferences": [
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "c09a71479714c9b21d337632159105b724afcc9f38eab2852a81957b549dcaca"
                          }
                        ],
                        "type": "attestation",
                        "url": "https://plimsollmark.github.io/plimsoll/examples/adapter/bundle.jsonl"
                      },
                      {
                        "hashes": [
                          {
                            "alg": "SHA-256",
                            "content": "091eb9bed95efbf2b66d063ac7eeebf003114d504508f4226101bffac78d0429"
                          }
                        ],
                        "type": "attestation",
                        "url": "https://plimsollmark.github.io/plimsoll/examples/adapter/qualification.jsonl"
                      },
                      {
                        "type": "documentation",
                        "url": "https://plimsollmark.github.io/plimsoll/examples/sbom/index.html"
                      },
                      {
                        "type": "vcs",
                        "url": "https://github.com/plimsollmark/plimsoll"
                      }
                    ],
                    "hashes": [
                      {
                        "alg": "SHA-256",
                        "content": "adc27b3e65d3670886a429a399f920e61da0160449ea2578586c5d4adf8ecdcf"
                      }
                    ],
                    "name": "adapter-v1",
                    "properties": [
                      {
                        "name": "plimsoll:author_kind",
                        "value": "agent"
                      },
                      {
                        "name": "plimsoll:author_kind_basis",
                        "value": "supplied example context, unverified"
                      },
                      {
                        "name": "plimsoll:request_sha256",
                        "value": "c793a5f29417490c84fa69dd8223f5f0de12413f6f7482366e37ef1cbf0468e1"
                      },
                      {
                        "name": "plimsoll:result_sha256",
                        "value": "eee82833aebbdfd64bdbfce5861d2ee92a38d363cb4a1f8e48dd7d78e223d2f0"
                      },
                      {
                        "name": "plimsoll:record_sha256",
                        "value": "c33ed688acefe4ff8f614b4b443859c2da4a459e0578ded210cc220433526aa1"
                      },
                      {
                        "name": "plimsoll:trace_id",
                        "value": "adapter-run-4"
                      }
                    ],
                    "type": "application",
                    "version": "adc27b3e65d3"
                  },
                  "lifecycles": [
                    {
                      "phase": "operations"
                    }
                  ],
                  "timestamp": "2026-10-23T19:39:11.763Z",
                  "tools": {
                    "components": [
                      {
                        "externalReferences": [
                          {
                            "type": "vcs",
                            "url": "https://github.com/plimsollmark/plimsoll"
                          }
                        ],
                        "name": "plimsoll-sbom",
                        "type": "application",
                        "version": "0.2.0"
                      }
                    ]
                  }
                },
                "properties": [
                  {
                    "name": "plimsoll:bundle_sha256",
                    "value": "c09a71479714c9b21d337632159105b724afcc9f38eab2852a81957b549dcaca"
                  },
                  {
                    "name": "plimsoll:bundle_line",
                    "value": "4"
                  },
                  {
                    "name": "plimsoll:emitter",
                    "value": "examples/sbom"
                  },
                  {
                    "name": "plimsoll:qualification_sha256",
                    "value": "091eb9bed95efbf2b66d063ac7eeebf003114d504508f4226101bffac78d0429"
                  }
                ],
                "serialNumber": "urn:uuid:7f8c4759-b173-4573-95e9-e48359ba0f25",
                "specVersion": "1.6",
                "version": 1
              }
              

              The image’s ingredients label

              The run’s image has a known ingredients list: 694 components, generated by syft 1.54.1 at 2026-10-23T13:24:33-07:00. A platform that already adds vulnerability information to that list can show it beside the run. This page makes no claim that those lookups have happened.

              The label’s root version and the receipt’s selected image fingerprint are the same string: sha256:a6ef2ea1c8f1de5c885e1a18ba7ee4d962e3a859877f6f46c2fb7ebac1f6cc5c. The run’s image component links to the label by its URL and file fingerprint, and by BOM-Link, a reference to one component inside another bill of materials.

              INTERNAL · image ingredients JSON → · EXTERNAL · official BOM-Link docs ↗

              How the pinned image label was made

              The scanner read the image’s OCI layout, the original container image files, rather than a rewritten manifest returned by a legacy image interface. That keeps the join exact. The label is CycloneDX 1.7; its random serial number is kept as evidence and is never regenerated by the gate.

              docker image save plimsoll/sandbox:latest | tar -xf - -C tmp/image-layout/oci
              tmp/syft-dl/syft oci-dir:tmp/image-layout/oci --platform linux/amd64 \
                --source-name plimsoll/sandbox -o cyclonedx-json=tmp/sbom-poc/image.cdx.json

              The syft 1.54.1 release binary was checked against its release checksum file. The published file fingerprint is 7e0b9a40e742f401e3a006a7362ebba1c5f3ac832107858dcf104d8f2b6de603.

              The program’s own fingerprint

              Think of a file-set fingerprint as a fingerprint of the whole folder. The exact recipe follows. The file-set digest separates the program from its execution settings. Sort files by path. For each file, concatenate the 32 raw bytes of SHA-256(path) followed by the 32 raw bytes of SHA-256(content). SHA-256 of that entire concatenation is the file-set digest.

              The request fingerprint uses plimsoll.run-request.v2. The protocol is the request format revision. The result uses plimsoll.run-result.v1 and these records use plimsoll.run-record.v4, whose fields include the sandbox instance that ran the call. Each value is its length as an unsigned 64-bit big-endian integer followed by its bytes. Fields are encoded as name then value, in the reference order. Integers are decimal text, booleans are true or false, strings are UTF-8, and printed output keeps its raw bytes. The request fingerprint also covers the protocol version (the request-format revision), minimum isolation tier, timeout and software rule, so it is a different identity. The file-set fingerprint remains bound to the signed request because the checker compares the file list with the request stored in the verified bundle.

              How thick are the walls?

              An isolation tier is the kind of boundary around the code. Think of process as a cubicle, container as a room with a lock, kernel as a room with its own plumbing, and vm as a separate building, a virtual machine. These are analogies, not safety ratings.

              The reconcile runs asked for kernel. The daemon reported that tier after checking gVisor, a user-space kernel between the program and the host. The same two requests, byte for byte (same request digest), were then sent to a daemon on Docker Cloud Sandboxes, which answered with tier vm: a separate building, a microVM booted from a pinned public node image. The adapter runs in the verdict section asked for container and got it; their boundary is the grant and the broker as much as the wall. The record preserves that report. It is configuration and provider evidence plus startup checks, never hardware attestation, an independent measurement from the machine itself.

              What the checks establish

              They establish that the evidence verifies under its key, that the bundle is complete through its last checkpoint (a signed entry-count statement), and that each BOM field derived from the exchange agrees with it. -trusted-pub additionally requires the attached key to match a key obtained independently.

              What remains outside that check

              The attached run record is signed; this BOM is unsigned. Agent authorship is supplied example context, not a record fact, and the execution layer cannot identify the model. Network isolation is provider configuration, not a separately signed runtime measurement; a granted run reaches only the routes its grant lists, and what reached the other side is not in this record. The run's times are the daemon's own unwitnessed clock. An attached key alone establishes consistency, not signer identity; use an independently trusted key. Display names and the assessor label are unsigned presentation. The attached bundle line proves itself; the whole bundle it belongs to is referenced by digest and checked when supplied. This is run evidence, not an inventory of the image's installed packages. A qualification verdict is the platform's own signed account of one run against a simulated vendor, re-evaluated here from its evidence; it is not an independent audit, and the vendor's ledger is trusted as the signer read it.

              A score of 1 in conformance or confidence means a deterministic signature and mapping check passed. It does not mean perfect security, independent runtime assurance or a measured probability. Names, the page URL and assessor labels can be changed without re-signing evidence.

              This run’s BOM is a receipt, not a package scan. A software bill of materials (SBOM) for the image is a separate ingredients label, linked when supplied. Neither label shows that vulnerability lookups have been done. Schema validity does not establish platform ingestion or rendering. A viewer supporting these fields can display components, hashes and references; support for declarations must be tested per platform. No platform round trip has been tested here.

              Each label attaches its own line of the bundle (the stored request and response, the sealed record and the harness's signed link that places the line at its index) and refers to the whole bundle by URL and fingerprint. So a label stays small however many runs its bundle holds: the adapter bundle behind the verdicts is 1.8 MB, and each verdict label about 150 KB. The checker verifies the chain and the checks across runs when the bundle is at hand (a sibling file with the referenced fingerprint, or -check-bundle) and prints a LIMIT line saying so when it is not. Input is capped at 32 MiB.

              Reproduce and review

              From a checkout of plimsoll, run these commands. Generation reuses the evidence and starts no sandbox. Tests use pinned schemas without network access after Go dependencies are available.

              cd examples/sbom
              go run .
              go run . -check ../../docs/examples/sbom/run-6551b9626206.cdx.json -trusted-pub ../../docs/examples/sbom/harness.pub
              go run . -check ../../docs/examples/sbom/run-29c2e7b07429.cdx.json -trusted-pub ../../docs/examples/sbom/harness.pub
              go run . -check ../../docs/examples/sbom/run-bb65a092a89e.cdx.json -trusted-pub ../../docs/examples/sbom/harness.pub
              go run . -check ../../docs/examples/sbom/run-3a6acc5608d9.cdx.json -trusted-pub ../../docs/examples/sbom/harness.pub
              go run . -check ../../docs/examples/sbom/run-4c69b5a38f29.cdx.json -check-bundle ../../docs/examples/adapter/bundle.jsonl -check-qualification ../../docs/examples/adapter/qualification.jsonl -trusted-pub ../../docs/examples/adapter/harness.pub
              go run . -check ../../docs/examples/sbom/run-c33ed688acef.cdx.json -check-bundle ../../docs/examples/adapter/bundle.jsonl -check-qualification ../../docs/examples/adapter/qualification.jsonl -trusted-pub ../../docs/examples/adapter/harness.pub
              cd ../..
              make sbom-suite

              Successful checks print PASS. Changed evidence or a mapped field makes -check exit nonzero. Obtain the trusted key independently when reviewing another publisher's file; the copy next to this example is an illustrative pin.