[{"data":1,"prerenderedAt":10932},["ShallowReactive",2],{"fougere:post.list:{}":3,"docs:\u002Fdocs\u002Fextending\u002Fforeign-frond":6,"docs-uses":120,"docs-nav":295,"demo:rust-frond":433},{"items":4,"hasMore":5},[],false,{"id":7,"title":8,"body":9,"description":110,"extension":111,"forms":112,"kind":113,"meta":114,"navigation":115,"path":116,"seo":117,"stem":118,"step":112,"uses":112,"__hash__":119},"docs\u002Fdocs\u002F8.extending\u002F9.foreign-frond.md","A frond in another language",{"type":10,"value":11,"toc":106},"minimark",[12,16,85,92,102],[13,14,15],"p",{},"A frond does not have to be TypeScript. A process in Rust, Python or anything else joins the app if it\nhonours three things:",[17,18,19,42,59],"ol",{},[20,21,22,26,27,31,32,35,36,41],"li",{},[23,24,25],"strong",{},"the wire"," — ",[28,29,30],"code",{},"POST \u002F_fougere\u002Fcall",", JSON-RPC 2.0, ",[28,33,34],{},"method = \"address.op\""," — see\n",[37,38,40],"a",{"href":39},"\u002Fdocs\u002Fextending\u002Fcard-and-wire#the-wire-format","the wire format",";",[20,43,44,26,47,50,51,55,56,41],{},[23,45,46],{},"the card",[28,48,49],{},"rpc.discover"," answers its ",[37,52,54],{"href":53},"\u002Fdocs\u002Fextending\u002Fcard-and-wire","card",", ",[28,57,58],{},"x-fougere-version: 1",[20,60,61,64,65,68,69,72,73,75,76,80,81,84],{},[23,62,63],{},"the errors"," — a whole ",[28,66,67],{},"FougereError"," in ",[28,70,71],{},"error.data",", its ",[28,74,28],{}," one of the\n",[37,77,79],{"href":78},"\u002Freference\u002Ferrors","error codes","; the integer ",[28,82,83],{},"-32000"," stays JSON-RPC's.",[13,86,87,88,91],{},"Your app then runs ",[28,89,90],{},"fougere sync"," against it, rebuilds its entities from the card, and checks data\nlocally with the same rules as for any frond.",[13,93,94,97,98,101],{},[28,95,96],{},"demos\u002Frust-frond\u002F"," is one, in Rust — one entity, three operations, no ",[28,99,100],{},"entity({...})"," anywhere.",[103,104],"demo",{"name":105},"rust-frond",{"title":107,"searchDepth":108,"depth":108,"links":109},"",2,[],"A Rust or Python process answering the same calls.","md",null,"extending",{},true,"\u002Fdocs\u002Fextending\u002Fforeign-frond",{"title":8,"description":110},"docs\u002F8.extending\u002F9.foreign-frond","fbW6fxWcHtu3GLfeGIRngQfuMV5-7Sd8-KstY6ZVQwM",[121,124,127,130,133,136,139,142,145,151,157,162,166,170,174,178,182,187,191,195,200,204,209,213,217,221,225,229,233,237,241,245,249,253,257,261,265,268,271,274,276,279,282,285,288,291,292],{"path":122,"title":123,"uses":112},"\u002Fdocs\u002Fconcepts\u002Fentity","Entity",{"path":125,"title":126,"uses":112},"\u002Fdocs\u002Fconcepts\u002Fhandler","Handler",{"path":128,"title":129,"uses":112},"\u002Fdocs\u002Fconcepts\u002Frepository","Repository",{"path":131,"title":132,"uses":112},"\u002Fdocs\u002Fconcepts\u002Ffrond","Frond",{"path":134,"title":135,"uses":112},"\u002Fdocs\u002Fconcepts\u002Ffacade","Facade",{"path":137,"title":138,"uses":112},"\u002Fdocs\u002Fconcepts\u002Ffact","Fact",{"path":140,"title":141,"uses":112},"\u002Fdocs\u002Fconcepts\u002Fport","Port",{"path":143,"title":144,"uses":112},"\u002Fdocs\u002Fconcepts\u002Fconfiguration","Configuration",{"path":146,"title":147,"uses":148},"\u002Fdocs\u002Faccess\u002Fauthentication","Authentication",[149,150],"port","frond",{"path":152,"title":153,"uses":154},"\u002Fdocs\u002Faccess\u002Fstate","Keep a caller's state",[155,156],"configuration","handler",{"path":158,"title":159,"uses":160},"\u002Fdocs\u002Fdata\u002Fsql","SQLite or Postgres",[161,155],"entity",{"path":163,"title":164,"uses":165},"\u002Fdocs\u002Fdata\u002Fseveral-databases","Several databases",[155,161],{"path":167,"title":168,"uses":169},"\u002Fdocs\u002Fdata\u002Fcomputed-field","A computed field",[161,149],{"path":171,"title":172,"uses":173},"\u002Fdocs\u002Fdata\u002Fevolve","Evolve a schema",[161],{"path":175,"title":176,"uses":177},"\u002Fdocs\u002Fdata\u002Fseeds","Seed data",[161],{"path":179,"title":180,"uses":181},"\u002Fdocs\u002Fdata\u002Fvalues","Read settings and secrets",[161,155],{"path":183,"title":184,"uses":185},"\u002Fdocs\u002Fdata\u002Fmirror","Mirror a source you cannot query",[186],"repository",{"path":188,"title":189,"uses":190},"\u002Fdocs\u002Fdata\u002Ftogether","Two writes as one",[186],{"path":192,"title":193,"uses":194},"\u002Fdocs\u002Fbehaviour\u002Faround-every-call","Around every call",[149,150],{"path":196,"title":197,"uses":198},"\u002Fdocs\u002Fbehaviour\u002Ffinish-a-fact","Finish a fact",[199],"fact",{"path":201,"title":202,"uses":203},"\u002Fdocs\u002Fserve\u002Frest-graphql","REST, OpenAPI, GraphQL",[156,155],{"path":205,"title":206,"uses":207},"\u002Fdocs\u002Fserve\u002Fpages","Pages: queries and commands",[156,208],"facade",{"path":210,"title":211,"uses":212},"\u002Fdocs\u002Fserve\u002Fforms","A form",[161],{"path":214,"title":215,"uses":216},"\u002Fdocs\u002Fserve\u002Fadmin","An admin panel",[156],{"path":218,"title":219,"uses":220},"\u002Fdocs\u002Frun\u002Fdeploy","Deploy a split",[155,150],{"path":222,"title":223,"uses":224},"\u002Fdocs\u002Frun\u002Fsecure","Secure calls between processes",[155,150],{"path":226,"title":227,"uses":228},"\u002Fdocs\u002Frun\u002Flifecycle","Reload and shut down",[155],{"path":230,"title":231,"uses":232},"\u002Fdocs\u002Frun\u002Fobserve","Observe",[155,156],{"path":234,"title":235,"uses":236},"\u002Fdocs\u002Frun\u002Fdev-panel","The dev panel",[156],{"path":238,"title":239,"uses":240},"\u002Fdocs\u002Frun\u002Ftest","Test",[161,149],{"path":242,"title":243,"uses":244},"\u002Fdocs\u002Fadopt\u002Fnew-project","Start a project",[150,155],{"path":246,"title":247,"uses":248},"\u002Fdocs\u002Fadopt\u002Fexisting-app","Add Fougere to an existing app",[150,155],{"path":250,"title":251,"uses":252},"\u002Fdocs\u002Fadopt\u002Fbring-your-schema","Bring your schema",[161],{"path":254,"title":255,"uses":256},"\u002Fdocs\u002Fadopt\u002Fhosts","Pick a host",[155],{"path":258,"title":259,"uses":260},"\u002Fdocs\u002Fadopt\u002Fanother-repository","A frond from another repository",[208,150],{"path":262,"title":263,"uses":264},"\u002Fdocs\u002Fadopt\u002Fdemos","Demos",[],{"path":266,"title":267,"uses":112},"\u002Fdocs\u002Fextending\u002Fscan","How the scan reads a project",{"path":269,"title":270,"uses":112},"\u002Fdocs\u002Fextending\u002Fwithout-compiler","Boot without the compiler",{"path":272,"title":273,"uses":112},"\u002Fdocs\u002Fextending\u002Fboot","The boot, step by step",{"path":53,"title":275,"uses":112},"The card and the wire",{"path":277,"title":278,"uses":112},"\u002Fdocs\u002Fextending\u002Fextension-points","Registries and extension points",{"path":280,"title":281,"uses":112},"\u002Fdocs\u002Fextending\u002Fvocabulary","Teach a word",{"path":283,"title":284,"uses":112},"\u002Fdocs\u002Fextending\u002Fextensions","Run code at boot and shutdown",{"path":286,"title":287,"uses":112},"\u002Fdocs\u002Fextending\u002Fsource-adapter","Write a source adapter",{"path":289,"title":290,"uses":112},"\u002Fdocs\u002Fextending\u002Fsurface","Write a surface",{"path":116,"title":8,"uses":112},{"path":293,"title":294,"uses":112},"\u002Fdocs","What is Fougere",[296],{"title":297,"path":293,"stem":298,"children":299,"page":-1},"Docs","docs",[300,302,323,332,353,362,375,392,409],{"title":294,"path":293,"stem":301},"docs\u002Findex",{"title":303,"path":304,"stem":305,"children":306,"page":5},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F1.concepts",[307,309,311,313,315,317,319,321],{"title":123,"path":122,"stem":308},"docs\u002F1.concepts\u002F1.entity",{"title":126,"path":125,"stem":310},"docs\u002F1.concepts\u002F2.handler",{"title":129,"path":128,"stem":312},"docs\u002F1.concepts\u002F3.repository",{"title":132,"path":131,"stem":314},"docs\u002F1.concepts\u002F4.frond",{"title":135,"path":134,"stem":316},"docs\u002F1.concepts\u002F5.facade",{"title":138,"path":137,"stem":318},"docs\u002F1.concepts\u002F6.fact",{"title":141,"path":140,"stem":320},"docs\u002F1.concepts\u002F7.port",{"title":144,"path":143,"stem":322},"docs\u002F1.concepts\u002F8.configuration",{"title":324,"path":325,"stem":326,"children":327,"page":5},"Access","\u002Fdocs\u002Faccess","docs\u002F2.access",[328,330],{"title":147,"path":146,"stem":329},"docs\u002F2.access\u002F1.authentication",{"title":153,"path":152,"stem":331},"docs\u002F2.access\u002F2.state",{"title":333,"path":334,"stem":335,"children":336,"page":5},"Data","\u002Fdocs\u002Fdata","docs\u002F3.data",[337,339,341,343,345,347,349,351],{"title":159,"path":158,"stem":338},"docs\u002F3.data\u002F1.sql",{"title":164,"path":163,"stem":340},"docs\u002F3.data\u002F2.several-databases",{"title":168,"path":167,"stem":342},"docs\u002F3.data\u002F3.computed-field",{"title":172,"path":171,"stem":344},"docs\u002F3.data\u002F4.evolve",{"title":176,"path":175,"stem":346},"docs\u002F3.data\u002F5.seeds",{"title":180,"path":179,"stem":348},"docs\u002F3.data\u002F6.values",{"title":184,"path":183,"stem":350},"docs\u002F3.data\u002F7.mirror",{"title":189,"path":188,"stem":352},"docs\u002F3.data\u002F8.together",{"title":354,"path":355,"stem":356,"children":357,"page":5},"Behaviour","\u002Fdocs\u002Fbehaviour","docs\u002F4.behaviour",[358,360],{"title":193,"path":192,"stem":359},"docs\u002F4.behaviour\u002F1.around-every-call",{"title":197,"path":196,"stem":361},"docs\u002F4.behaviour\u002F2.finish-a-fact",{"title":363,"path":364,"stem":365,"children":366,"page":5},"Serve","\u002Fdocs\u002Fserve","docs\u002F5.serve",[367,369,371,373],{"title":202,"path":201,"stem":368},"docs\u002F5.serve\u002F1.rest-graphql",{"title":206,"path":205,"stem":370},"docs\u002F5.serve\u002F2.pages",{"title":211,"path":210,"stem":372},"docs\u002F5.serve\u002F3.forms",{"title":215,"path":214,"stem":374},"docs\u002F5.serve\u002F4.admin",{"title":376,"path":377,"stem":378,"children":379,"page":5},"Run","\u002Fdocs\u002Frun","docs\u002F6.run",[380,382,384,386,388,390],{"title":219,"path":218,"stem":381},"docs\u002F6.run\u002F1.deploy",{"title":223,"path":222,"stem":383},"docs\u002F6.run\u002F2.secure",{"title":227,"path":226,"stem":385},"docs\u002F6.run\u002F3.lifecycle",{"title":231,"path":230,"stem":387},"docs\u002F6.run\u002F4.observe",{"title":235,"path":234,"stem":389},"docs\u002F6.run\u002F5.dev-panel",{"title":239,"path":238,"stem":391},"docs\u002F6.run\u002F6.test",{"title":393,"path":394,"stem":395,"children":396,"page":5},"Adopt","\u002Fdocs\u002Fadopt","docs\u002F7.adopt",[397,399,401,403,405,407],{"title":243,"path":242,"stem":398},"docs\u002F7.adopt\u002F1.new-project",{"title":247,"path":246,"stem":400},"docs\u002F7.adopt\u002F2.existing-app",{"title":251,"path":250,"stem":402},"docs\u002F7.adopt\u002F3.bring-your-schema",{"title":255,"path":254,"stem":404},"docs\u002F7.adopt\u002F4.hosts",{"title":259,"path":258,"stem":406},"docs\u002F7.adopt\u002F5.another-repository",{"title":263,"path":262,"stem":408},"docs\u002F7.adopt\u002F6.demos",{"title":410,"path":411,"stem":412,"children":413,"page":5},"Extending","\u002Fdocs\u002Fextending","docs\u002F8.extending",[414,416,418,420,422,424,426,428,430,432],{"title":267,"path":266,"stem":415},"docs\u002F8.extending\u002F1.scan",{"title":270,"path":269,"stem":417},"docs\u002F8.extending\u002F10.without-compiler",{"title":273,"path":272,"stem":419},"docs\u002F8.extending\u002F2.boot",{"title":275,"path":53,"stem":421},"docs\u002F8.extending\u002F3.card-and-wire",{"title":278,"path":277,"stem":423},"docs\u002F8.extending\u002F4.extension-points",{"title":281,"path":280,"stem":425},"docs\u002F8.extending\u002F5.vocabulary",{"title":284,"path":283,"stem":427},"docs\u002F8.extending\u002F6.extensions",{"title":287,"path":286,"stem":429},"docs\u002F8.extending\u002F7.source-adapter",{"title":290,"path":289,"stem":431},"docs\u002F8.extending\u002F8.surface",{"title":8,"path":116,"stem":118},{"id":434,"title":105,"body":435,"count":544,"description":107,"entry":440,"extension":111,"meta":10927,"name":105,"navigation":115,"path":10928,"runnable":115,"seo":10929,"stem":10930,"__hash__":10931},"demo\u002Fdemo\u002Frust-frond.md",{"type":10,"value":436,"toc":10925},[437,10921],[438,439,441,451,775,1663,4801,5023,10816],"code-tree",{"default-value":440},"Cargo.toml",[442,443,449],"pre",{"className":444,"code":446,"filename":447,"language":448,"meta":107},[445],"language-text","target\u002F\n\n",".gitignore","text",[28,450,446],{"__ignoreMap":107},[442,452,456],{"className":453,"code":454,"filename":440,"language":455,"meta":107,"style":107},"language-toml shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","[package]\nname = \"telemetry-frond\"\nversion = \"0.1.0\"\nedition = \"2021\"\npublish = false\n\n[dependencies]\naxum = \"0.8\"\ntokio = { version = \"1\", features = [\"rt-multi-thread\", \"macros\"] }\nserde = { version = \"1\", features = [\"derive\"] }\nserde_json = \"1\"\nuuid = { version = \"1\", features = [\"v4\"] }\nchrono = { version = \"0.4\", default-features = false, features = [\"clock\", \"std\"] }\n\n","toml",[28,457,458,474,494,509,524,536,542,552,567,624,663,677,716],{"__ignoreMap":107},[459,460,463,467,471],"span",{"class":461,"line":462},"line",1,[459,464,466],{"class":465},"s15xx","[",[459,468,470],{"class":469},"sLf9K","package",[459,472,473],{"class":465},"]\n",[459,475,476,480,483,487,491],{"class":461,"line":108},[459,477,479],{"class":478},"sy9f4","name",[459,481,482],{"class":465}," =",[459,484,486],{"class":485},"sDDC1"," \"",[459,488,490],{"class":489},"sN-8n","telemetry-frond",[459,492,493],{"class":485},"\"\n",[459,495,497,500,502,504,507],{"class":461,"line":496},3,[459,498,499],{"class":478},"version",[459,501,482],{"class":465},[459,503,486],{"class":485},[459,505,506],{"class":489},"0.1.0",[459,508,493],{"class":485},[459,510,512,515,517,519,522],{"class":461,"line":511},4,[459,513,514],{"class":478},"edition",[459,516,482],{"class":465},[459,518,486],{"class":485},[459,520,521],{"class":489},"2021",[459,523,493],{"class":485},[459,525,527,530,532],{"class":461,"line":526},5,[459,528,529],{"class":478},"publish",[459,531,482],{"class":465},[459,533,535],{"class":534},"slmMI"," false\n",[459,537,539],{"class":461,"line":538},6,[459,540,541],{"emptyLinePlaceholder":115},"\n",[459,543,545,547,550],{"class":461,"line":544},7,[459,546,466],{"class":465},[459,548,549],{"class":469},"dependencies",[459,551,473],{"class":465},[459,553,555,558,560,562,565],{"class":461,"line":554},8,[459,556,557],{"class":478},"axum",[459,559,482],{"class":465},[459,561,486],{"class":485},[459,563,564],{"class":489},"0.8",[459,566,493],{"class":485},[459,568,570,573,575,578,581,583,585,588,591,594,597,599,602,604,607,609,611,613,616,618,621],{"class":461,"line":569},9,[459,571,572],{"class":478},"tokio",[459,574,482],{"class":465},[459,576,577],{"class":465}," {",[459,579,580],{"class":478}," version",[459,582,482],{"class":465},[459,584,486],{"class":485},[459,586,587],{"class":489},"1",[459,589,590],{"class":485},"\"",[459,592,593],{"class":465},",",[459,595,596],{"class":478}," features",[459,598,482],{"class":465},[459,600,601],{"class":465}," [",[459,603,590],{"class":485},[459,605,606],{"class":489},"rt-multi-thread",[459,608,590],{"class":485},[459,610,593],{"class":465},[459,612,486],{"class":485},[459,614,615],{"class":489},"macros",[459,617,590],{"class":485},[459,619,620],{"class":465},"]",[459,622,623],{"class":465}," }\n",[459,625,627,630,632,634,636,638,640,642,644,646,648,650,652,654,657,659,661],{"class":461,"line":626},10,[459,628,629],{"class":478},"serde",[459,631,482],{"class":465},[459,633,577],{"class":465},[459,635,580],{"class":478},[459,637,482],{"class":465},[459,639,486],{"class":485},[459,641,587],{"class":489},[459,643,590],{"class":485},[459,645,593],{"class":465},[459,647,596],{"class":478},[459,649,482],{"class":465},[459,651,601],{"class":465},[459,653,590],{"class":485},[459,655,656],{"class":489},"derive",[459,658,590],{"class":485},[459,660,620],{"class":465},[459,662,623],{"class":465},[459,664,666,669,671,673,675],{"class":461,"line":665},11,[459,667,668],{"class":478},"serde_json",[459,670,482],{"class":465},[459,672,486],{"class":485},[459,674,587],{"class":489},[459,676,493],{"class":485},[459,678,680,683,685,687,689,691,693,695,697,699,701,703,705,707,710,712,714],{"class":461,"line":679},12,[459,681,682],{"class":478},"uuid",[459,684,482],{"class":465},[459,686,577],{"class":465},[459,688,580],{"class":478},[459,690,482],{"class":465},[459,692,486],{"class":485},[459,694,587],{"class":489},[459,696,590],{"class":485},[459,698,593],{"class":465},[459,700,596],{"class":478},[459,702,482],{"class":465},[459,704,601],{"class":465},[459,706,590],{"class":485},[459,708,709],{"class":489},"v4",[459,711,590],{"class":485},[459,713,620],{"class":465},[459,715,623],{"class":465},[459,717,719,722,724,726,728,730,732,735,737,739,742,744,747,749,751,753,755,757,760,762,764,766,769,771,773],{"class":461,"line":718},13,[459,720,721],{"class":478},"chrono",[459,723,482],{"class":465},[459,725,577],{"class":465},[459,727,580],{"class":478},[459,729,482],{"class":465},[459,731,486],{"class":485},[459,733,734],{"class":489},"0.4",[459,736,590],{"class":485},[459,738,593],{"class":465},[459,740,741],{"class":478}," default-features",[459,743,482],{"class":465},[459,745,746],{"class":534}," false",[459,748,593],{"class":465},[459,750,596],{"class":478},[459,752,482],{"class":465},[459,754,601],{"class":465},[459,756,590],{"class":485},[459,758,759],{"class":489},"clock",[459,761,590],{"class":485},[459,763,593],{"class":465},[459,765,486],{"class":485},[459,767,768],{"class":489},"std",[459,770,590],{"class":485},[459,772,620],{"class":465},[459,774,623],{"class":465},[442,776,780],{"className":777,"code":778,"filename":779,"language":111,"meta":107,"style":107},"language-md shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","# rust-frond — a Frond outside TypeScript\n\nA `telemetry` frond written in Rust, consumed by TypeScript that knows none of its\nentities. There is **no** `class Sensor extends entity({...})` anywhere in this repo:\nthe declaration lives in `src\u002Fmain.rs`.\n\n```bash\ncargo run --release     # the Rust frond, :4200\npnpm dlx tsx consumer.ts     # the TS consumer, in another terminal\n```\n\n## What it proves\n\nThe frond honours two contracts, and both are JSON:\n\n1. **the wire** — `POST \u002F_fougere\u002Fcall`, JSON-RPC 2.0, `method = \"address.op\"`,\n   `params` = the InvocationContext. See `packages\u002Ftransport\u002Fhttp\u002Fsrc\u002Fjsonrpc.ts`.\n2. **the map** — `rpc.discover` returns what it hosts, schemas included.\n   See `RPC_ADDRESS` in `packages\u002Fcore\u002Fsrc\u002Fwire\u002Fcall.ts`.\n\nEverything else belongs to it: the language, the storage, the validator.\n\nThe moment that counts is step 4 of the consumer. `Card.toSchema()`\n(`packages\u002Fschema\u002Fsrc\u002Fprojection\u002Fcard\u002FCard.ts`, `toSchema`) rebuilds a **live** schema from\nthe map, and the TS validator refuses a payload before any network:\n\n```\n✗ couleur  — Unknown field\n✗ celsius  — 250 is greater than 80.\n✗ checksum — Read-only\n✗ label    — String is too short (1 \u003C 2).\n```\n\nThose messages come from `@cfworker\u002Fjson-schema`, on the TS side, applied to rules that\nno line of TypeScript declares. \"The truth travels, the realization varies\" — literally.\n\n## The 4 axes on the wire\n\n`shape` IS JSON Schema, at the top level of the field. The other three live under\n`x-fougere`:\n\n| axis | in `src\u002Fmain.rs` | effect on the TS side |\n|---|---|---|\n| `role.primary` | `id` | excluded from `Visibility.input` |\n| `lifecycle.create: 'now'` | `recordedAt` | excluded from `Visibility.input`, stamped by Rust |\n| `lifecycle.create: {generate}` | `id` | not required at creation |\n| `boundary.in: 'closed'` | `checksum` | `Read-only` if a client supplies it |\n\n## What the demo does not do\n\n- **The static type.** `Card.toSchema()` returns a `SchemaConstructor\u003CFields>` — full\n  runtime, literal keys lost. Getting `sensor.label` typed would need a map → `.d.ts`\n  projection, which does not exist (no codegen in `packages\u002Fcli\u002Fsrc`).\n- **The map is hand-written** (`sensor_card()`). A real Rust frond would derive it —\n  `#[derive(Entity)]` on the struct, with `schemars` underneath. That is where Rust\n  beats TS: a macro sees the declaration, where Fougere pays for an AST scan.\n- **The documented losses** of `card.ts:18-22` apply: a relation would travel by name,\n  and so would a custom generator.\n\n## What the consumer still does by hand\n\nIt calls `rpc.discover` itself. It no longer has to — since `0e51395`, the remote router\nreconstructs each entity's schema at discovery time and `App.schemaFor(entity)` serves it\n(`core\u002Fsrc\u002Fboot\u002Fremote.ts`, `createRemoteRouter` ; `core\u002Fsrc\u002Fboot\u002Fbootstrap.ts`, `schemaFor`). The explicit call is kept here\nbecause it is the demo's subject: showing the map arrive, and the validator being rebuilt\nfrom it. An app would ask `schemaFor`.\n\n","README.md",[28,781,782,791,795,812,838,853,857,867,872,877,882,886,894,898,904,909,941,964,988,1012,1017,1023,1028,1042,1077,1083,1088,1093,1099,1105,1111,1117,1122,1127,1143,1149,1154,1162,1167,1180,1193,1198,1226,1232,1268,1304,1331,1366,1371,1379,1384,1416,1439,1455,1480,1504,1510,1535,1541,1546,1554,1559,1584,1600,1643,1649],{"__ignoreMap":107},[459,783,784,788],{"class":461,"line":462},[459,785,787],{"class":786},"sd7zb","#",[459,789,790],{"class":469}," rust-frond — a Frond outside TypeScript\n",[459,792,793],{"class":461,"line":108},[459,794,541],{"emptyLinePlaceholder":115},[459,796,797,801,804,807,809],{"class":461,"line":496},[459,798,800],{"class":799},"sPEhv","A ",[459,802,803],{"class":465},"`",[459,805,806],{"class":489},"telemetry",[459,808,803],{"class":465},[459,810,811],{"class":799}," frond written in Rust, consumed by TypeScript that knows none of its\n",[459,813,814,817,821,825,827,830,833,835],{"class":461,"line":511},[459,815,816],{"class":799},"entities. There is ",[459,818,820],{"class":819},"sHaeK","**",[459,822,824],{"class":823},"s7rwI","no",[459,826,820],{"class":819},[459,828,829],{"class":465}," `",[459,831,832],{"class":489},"class Sensor extends entity({...})",[459,834,803],{"class":465},[459,836,837],{"class":799}," anywhere in this repo:\n",[459,839,840,843,845,848,850],{"class":461,"line":526},[459,841,842],{"class":799},"the declaration lives in ",[459,844,803],{"class":465},[459,846,847],{"class":489},"src\u002Fmain.rs",[459,849,803],{"class":465},[459,851,852],{"class":799},".\n",[459,854,855],{"class":461,"line":538},[459,856,541],{"emptyLinePlaceholder":115},[459,858,859,863],{"class":461,"line":544},[459,860,862],{"class":861},"siB6D","```",[459,864,866],{"class":865},"sYNOY","bash\n",[459,868,869],{"class":461,"line":554},[459,870,871],{"class":865},"cargo run --release     # the Rust frond, :4200\n",[459,873,874],{"class":461,"line":569},[459,875,876],{"class":865},"pnpm dlx tsx consumer.ts     # the TS consumer, in another terminal\n",[459,878,879],{"class":461,"line":626},[459,880,881],{"class":861},"```\n",[459,883,884],{"class":461,"line":665},[459,885,541],{"emptyLinePlaceholder":115},[459,887,888,891],{"class":461,"line":679},[459,889,890],{"class":786},"##",[459,892,893],{"class":469}," What it proves\n",[459,895,896],{"class":461,"line":718},[459,897,541],{"emptyLinePlaceholder":115},[459,899,901],{"class":461,"line":900},14,[459,902,903],{"class":799},"The frond honours two contracts, and both are JSON:\n",[459,905,907],{"class":461,"line":906},15,[459,908,541],{"emptyLinePlaceholder":115},[459,910,912,915,918,920,922,924,926,928,930,932,934,936,938],{"class":461,"line":911},16,[459,913,914],{"class":465},"1.",[459,916,917],{"class":819}," **",[459,919,25],{"class":823},[459,921,820],{"class":819},[459,923,26],{"class":799},[459,925,803],{"class":465},[459,927,30],{"class":489},[459,929,803],{"class":465},[459,931,31],{"class":799},[459,933,803],{"class":465},[459,935,34],{"class":489},[459,937,803],{"class":465},[459,939,940],{"class":799},",\n",[459,942,944,947,950,952,955,957,960,962],{"class":461,"line":943},17,[459,945,946],{"class":465},"   `",[459,948,949],{"class":489},"params",[459,951,803],{"class":465},[459,953,954],{"class":799}," = the InvocationContext. See ",[459,956,803],{"class":465},[459,958,959],{"class":489},"packages\u002Ftransport\u002Fhttp\u002Fsrc\u002Fjsonrpc.ts",[459,961,803],{"class":465},[459,963,852],{"class":799},[459,965,967,970,972,975,977,979,981,983,985],{"class":461,"line":966},18,[459,968,969],{"class":465},"2.",[459,971,917],{"class":819},[459,973,974],{"class":823},"the map",[459,976,820],{"class":819},[459,978,26],{"class":799},[459,980,803],{"class":465},[459,982,49],{"class":489},[459,984,803],{"class":465},[459,986,987],{"class":799}," returns what it hosts, schemas included.\n",[459,989,991,994,996,999,1001,1003,1005,1008,1010],{"class":461,"line":990},19,[459,992,993],{"class":799},"   See ",[459,995,803],{"class":465},[459,997,998],{"class":489},"RPC_ADDRESS",[459,1000,803],{"class":465},[459,1002,68],{"class":799},[459,1004,803],{"class":465},[459,1006,1007],{"class":489},"packages\u002Fcore\u002Fsrc\u002Fwire\u002Fcall.ts",[459,1009,803],{"class":465},[459,1011,852],{"class":799},[459,1013,1015],{"class":461,"line":1014},20,[459,1016,541],{"emptyLinePlaceholder":115},[459,1018,1020],{"class":461,"line":1019},21,[459,1021,1022],{"class":799},"Everything else belongs to it: the language, the storage, the validator.\n",[459,1024,1026],{"class":461,"line":1025},22,[459,1027,541],{"emptyLinePlaceholder":115},[459,1029,1031,1034,1036,1039],{"class":461,"line":1030},23,[459,1032,1033],{"class":799},"The moment that counts is step 4 of the consumer. ",[459,1035,803],{"class":465},[459,1037,1038],{"class":489},"Card.toSchema()",[459,1040,1041],{"class":465},"`\n",[459,1043,1045,1048,1050,1053,1055,1057,1059,1062,1064,1067,1069,1072,1074],{"class":461,"line":1044},24,[459,1046,1047],{"class":799},"(",[459,1049,803],{"class":465},[459,1051,1052],{"class":489},"packages\u002Fschema\u002Fsrc\u002Fprojection\u002Fcard\u002FCard.ts",[459,1054,803],{"class":465},[459,1056,55],{"class":799},[459,1058,803],{"class":465},[459,1060,1061],{"class":489},"toSchema",[459,1063,803],{"class":465},[459,1065,1066],{"class":799},") rebuilds a ",[459,1068,820],{"class":819},[459,1070,1071],{"class":823},"live",[459,1073,820],{"class":819},[459,1075,1076],{"class":799}," schema from\n",[459,1078,1080],{"class":461,"line":1079},25,[459,1081,1082],{"class":799},"the map, and the TS validator refuses a payload before any network:\n",[459,1084,1086],{"class":461,"line":1085},26,[459,1087,541],{"emptyLinePlaceholder":115},[459,1089,1091],{"class":461,"line":1090},27,[459,1092,881],{"class":861},[459,1094,1096],{"class":461,"line":1095},28,[459,1097,1098],{"class":865},"✗ couleur  — Unknown field\n",[459,1100,1102],{"class":461,"line":1101},29,[459,1103,1104],{"class":865},"✗ celsius  — 250 is greater than 80.\n",[459,1106,1108],{"class":461,"line":1107},30,[459,1109,1110],{"class":865},"✗ checksum — Read-only\n",[459,1112,1114],{"class":461,"line":1113},31,[459,1115,1116],{"class":865},"✗ label    — String is too short (1 \u003C 2).\n",[459,1118,1120],{"class":461,"line":1119},32,[459,1121,881],{"class":861},[459,1123,1125],{"class":461,"line":1124},33,[459,1126,541],{"emptyLinePlaceholder":115},[459,1128,1130,1133,1135,1138,1140],{"class":461,"line":1129},34,[459,1131,1132],{"class":799},"Those messages come from ",[459,1134,803],{"class":465},[459,1136,1137],{"class":489},"@cfworker\u002Fjson-schema",[459,1139,803],{"class":465},[459,1141,1142],{"class":799},", on the TS side, applied to rules that\n",[459,1144,1146],{"class":461,"line":1145},35,[459,1147,1148],{"class":799},"no line of TypeScript declares. \"The truth travels, the realization varies\" — literally.\n",[459,1150,1152],{"class":461,"line":1151},36,[459,1153,541],{"emptyLinePlaceholder":115},[459,1155,1157,1159],{"class":461,"line":1156},37,[459,1158,890],{"class":786},[459,1160,1161],{"class":469}," The 4 axes on the wire\n",[459,1163,1165],{"class":461,"line":1164},38,[459,1166,541],{"emptyLinePlaceholder":115},[459,1168,1170,1172,1175,1177],{"class":461,"line":1169},39,[459,1171,803],{"class":465},[459,1173,1174],{"class":489},"shape",[459,1176,803],{"class":465},[459,1178,1179],{"class":799}," IS JSON Schema, at the top level of the field. The other three live under\n",[459,1181,1183,1185,1188,1190],{"class":461,"line":1182},40,[459,1184,803],{"class":465},[459,1186,1187],{"class":489},"x-fougere",[459,1189,803],{"class":465},[459,1191,1192],{"class":799},":\n",[459,1194,1196],{"class":461,"line":1195},41,[459,1197,541],{"emptyLinePlaceholder":115},[459,1199,1201,1204,1207,1209,1211,1213,1215,1217,1220,1223],{"class":461,"line":1200},42,[459,1202,1203],{"class":465},"|",[459,1205,1206],{"class":799}," axis ",[459,1208,1203],{"class":465},[459,1210,68],{"class":799},[459,1212,803],{"class":465},[459,1214,847],{"class":489},[459,1216,803],{"class":465},[459,1218,1219],{"class":465}," |",[459,1221,1222],{"class":799}," effect on the TS side ",[459,1224,1225],{"class":465},"|\n",[459,1227,1229],{"class":461,"line":1228},43,[459,1230,1231],{"class":465},"|---|---|---|\n",[459,1233,1235,1237,1239,1242,1244,1246,1248,1251,1253,1255,1258,1260,1263,1265],{"class":461,"line":1234},44,[459,1236,1203],{"class":465},[459,1238,829],{"class":465},[459,1240,1241],{"class":489},"role.primary",[459,1243,803],{"class":465},[459,1245,1219],{"class":465},[459,1247,829],{"class":465},[459,1249,1250],{"class":489},"id",[459,1252,803],{"class":465},[459,1254,1219],{"class":465},[459,1256,1257],{"class":799}," excluded from ",[459,1259,803],{"class":465},[459,1261,1262],{"class":489},"Visibility.input",[459,1264,803],{"class":465},[459,1266,1267],{"class":465}," |\n",[459,1269,1271,1273,1275,1278,1280,1282,1284,1287,1289,1291,1293,1295,1297,1299,1302],{"class":461,"line":1270},45,[459,1272,1203],{"class":465},[459,1274,829],{"class":465},[459,1276,1277],{"class":489},"lifecycle.create: 'now'",[459,1279,803],{"class":465},[459,1281,1219],{"class":465},[459,1283,829],{"class":465},[459,1285,1286],{"class":489},"recordedAt",[459,1288,803],{"class":465},[459,1290,1219],{"class":465},[459,1292,1257],{"class":799},[459,1294,803],{"class":465},[459,1296,1262],{"class":489},[459,1298,803],{"class":465},[459,1300,1301],{"class":799},", stamped by Rust ",[459,1303,1225],{"class":465},[459,1305,1307,1309,1311,1314,1316,1318,1320,1322,1324,1326,1329],{"class":461,"line":1306},46,[459,1308,1203],{"class":465},[459,1310,829],{"class":465},[459,1312,1313],{"class":489},"lifecycle.create: {generate}",[459,1315,803],{"class":465},[459,1317,1219],{"class":465},[459,1319,829],{"class":465},[459,1321,1250],{"class":489},[459,1323,803],{"class":465},[459,1325,1219],{"class":465},[459,1327,1328],{"class":799}," not required at creation ",[459,1330,1225],{"class":465},[459,1332,1334,1336,1338,1341,1343,1345,1347,1350,1352,1354,1356,1359,1361,1364],{"class":461,"line":1333},47,[459,1335,1203],{"class":465},[459,1337,829],{"class":465},[459,1339,1340],{"class":489},"boundary.in: 'closed'",[459,1342,803],{"class":465},[459,1344,1219],{"class":465},[459,1346,829],{"class":465},[459,1348,1349],{"class":489},"checksum",[459,1351,803],{"class":465},[459,1353,1219],{"class":465},[459,1355,829],{"class":465},[459,1357,1358],{"class":489},"Read-only",[459,1360,803],{"class":465},[459,1362,1363],{"class":799}," if a client supplies it ",[459,1365,1225],{"class":465},[459,1367,1369],{"class":461,"line":1368},48,[459,1370,541],{"emptyLinePlaceholder":115},[459,1372,1374,1376],{"class":461,"line":1373},49,[459,1375,890],{"class":786},[459,1377,1378],{"class":469}," What the demo does not do\n",[459,1380,1382],{"class":461,"line":1381},50,[459,1383,541],{"emptyLinePlaceholder":115},[459,1385,1387,1390,1392,1395,1397,1399,1401,1403,1406,1408,1411,1413],{"class":461,"line":1386},51,[459,1388,1389],{"class":465},"-",[459,1391,917],{"class":819},[459,1393,1394],{"class":823},"The static type.",[459,1396,820],{"class":819},[459,1398,829],{"class":465},[459,1400,1038],{"class":489},[459,1402,803],{"class":465},[459,1404,1405],{"class":799}," returns a ",[459,1407,803],{"class":465},[459,1409,1410],{"class":489},"SchemaConstructor\u003CFields>",[459,1412,803],{"class":465},[459,1414,1415],{"class":799}," — full\n",[459,1417,1419,1422,1424,1427,1429,1432,1434,1437],{"class":461,"line":1418},52,[459,1420,1421],{"class":799},"  runtime, literal keys lost. Getting ",[459,1423,803],{"class":465},[459,1425,1426],{"class":489},"sensor.label",[459,1428,803],{"class":465},[459,1430,1431],{"class":799}," typed would need a map → ",[459,1433,803],{"class":465},[459,1435,1436],{"class":489},".d.ts",[459,1438,1041],{"class":465},[459,1440,1442,1445,1447,1450,1452],{"class":461,"line":1441},53,[459,1443,1444],{"class":799},"  projection, which does not exist (no codegen in ",[459,1446,803],{"class":465},[459,1448,1449],{"class":489},"packages\u002Fcli\u002Fsrc",[459,1451,803],{"class":465},[459,1453,1454],{"class":799},").\n",[459,1456,1458,1460,1462,1465,1467,1470,1472,1475,1477],{"class":461,"line":1457},54,[459,1459,1389],{"class":465},[459,1461,917],{"class":819},[459,1463,1464],{"class":823},"The map is hand-written",[459,1466,820],{"class":819},[459,1468,1469],{"class":799}," (",[459,1471,803],{"class":465},[459,1473,1474],{"class":489},"sensor_card()",[459,1476,803],{"class":465},[459,1478,1479],{"class":799},"). A real Rust frond would derive it —\n",[459,1481,1483,1486,1489,1491,1494,1496,1499,1501],{"class":461,"line":1482},55,[459,1484,1485],{"class":465},"  `",[459,1487,1488],{"class":489},"#[derive(Entity)]",[459,1490,803],{"class":465},[459,1492,1493],{"class":799}," on the struct, with ",[459,1495,803],{"class":465},[459,1497,1498],{"class":489},"schemars",[459,1500,803],{"class":465},[459,1502,1503],{"class":799}," underneath. That is where Rust\n",[459,1505,1507],{"class":461,"line":1506},56,[459,1508,1509],{"class":799},"  beats TS: a macro sees the declaration, where Fougere pays for an AST scan.\n",[459,1511,1513,1515,1517,1520,1522,1525,1527,1530,1532],{"class":461,"line":1512},57,[459,1514,1389],{"class":465},[459,1516,917],{"class":819},[459,1518,1519],{"class":823},"The documented losses",[459,1521,820],{"class":819},[459,1523,1524],{"class":799}," of ",[459,1526,803],{"class":465},[459,1528,1529],{"class":489},"card.ts:18-22",[459,1531,803],{"class":465},[459,1533,1534],{"class":799}," apply: a relation would travel by name,\n",[459,1536,1538],{"class":461,"line":1537},58,[459,1539,1540],{"class":799},"  and so would a custom generator.\n",[459,1542,1544],{"class":461,"line":1543},59,[459,1545,541],{"emptyLinePlaceholder":115},[459,1547,1549,1551],{"class":461,"line":1548},60,[459,1550,890],{"class":786},[459,1552,1553],{"class":469}," What the consumer still does by hand\n",[459,1555,1557],{"class":461,"line":1556},61,[459,1558,541],{"emptyLinePlaceholder":115},[459,1560,1562,1565,1567,1569,1571,1574,1576,1579,1581],{"class":461,"line":1561},62,[459,1563,1564],{"class":799},"It calls ",[459,1566,803],{"class":465},[459,1568,49],{"class":489},[459,1570,803],{"class":465},[459,1572,1573],{"class":799}," itself. It no longer has to — since ",[459,1575,803],{"class":465},[459,1577,1578],{"class":489},"0e51395",[459,1580,803],{"class":465},[459,1582,1583],{"class":799},", the remote router\n",[459,1585,1587,1590,1592,1595,1597],{"class":461,"line":1586},63,[459,1588,1589],{"class":799},"reconstructs each entity's schema at discovery time and ",[459,1591,803],{"class":465},[459,1593,1594],{"class":489},"App.schemaFor(entity)",[459,1596,803],{"class":465},[459,1598,1599],{"class":799}," serves it\n",[459,1601,1603,1605,1607,1610,1612,1614,1616,1619,1621,1624,1626,1629,1631,1633,1635,1638,1640],{"class":461,"line":1602},64,[459,1604,1047],{"class":799},[459,1606,803],{"class":465},[459,1608,1609],{"class":489},"core\u002Fsrc\u002Fboot\u002Fremote.ts",[459,1611,803],{"class":465},[459,1613,55],{"class":799},[459,1615,803],{"class":465},[459,1617,1618],{"class":489},"createRemoteRouter",[459,1620,803],{"class":465},[459,1622,1623],{"class":799}," ; ",[459,1625,803],{"class":465},[459,1627,1628],{"class":489},"core\u002Fsrc\u002Fboot\u002Fbootstrap.ts",[459,1630,803],{"class":465},[459,1632,55],{"class":799},[459,1634,803],{"class":465},[459,1636,1637],{"class":489},"schemaFor",[459,1639,803],{"class":465},[459,1641,1642],{"class":799},"). The explicit call is kept here\n",[459,1644,1646],{"class":461,"line":1645},65,[459,1647,1648],{"class":799},"because it is the demo's subject: showing the map arrive, and the validator being rebuilt\n",[459,1650,1652,1655,1657,1659,1661],{"class":461,"line":1651},66,[459,1653,1654],{"class":799},"from it. An app would ask ",[459,1656,803],{"class":465},[459,1658,1637],{"class":489},[459,1660,803],{"class":465},[459,1662,852],{"class":799},[442,1664,1669],{"className":1665,"code":1666,"filename":1667,"language":1668,"meta":107,"style":107},"language-ts shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","\u002F**\n * Le consommateur TypeScript — il ne sait rien du frond telemetry.\n *\n * Aucun `class Sensor extends entity({...})` n'existe dans ce repo : la\n * déclaration vit dans `src\u002Fmain.rs`. Ce fichier prouve trois choses :\n *\n *   1. le CONTRAT voyage      — les opérations s'appellent, la doublure ne distingue rien\n *   2. la CARTE voyage        — rpc.discover rend le schéma déclaré en Rust\n *   3. le COMPORTEMENT se rebâtit — Card.toSchema() rend un juge vivant côté TS\n *\n * Le troisième point est celui qui compte : le juge local refuse un payload\n * sur des règles qu'aucune ligne de TypeScript ne déclare.\n *\u002F\nimport { createHttpTransport } from '@fougere\u002Ftransport-http\u002Fclient';\nimport { Card, Visibility } from '@fougere\u002Fschema';\nimport {\n  FougereError,\n  type FrondCall,\n  type IdentityCard,\n  type InvocationContext,\n  type Transport,\n  Invocation,\n} from '@fougere\u002Fcore\u002Fcontract';\n\nconst RUST_FROND = process.env.RUST_FROND_URL ?? 'http:\u002F\u002Flocalhost:4200';\n\n\u002F**\n * La doublure — copie fidèle de `createRemoteFacade` (packages\u002Fcore\u002Fsrc\u002Fboot\u002Fremote.ts, `createRemoteFacade`).\n * Elle est reproduite ici parce qu'elle n'est pas exportée hors de bootstrap ;\n * c'est le même Proxy, à la lettre.\n *\u002F\nfunction doublure(address: string, transport: Transport): Record\u003Cstring, (input?: Partial\u003CInvocationContext>) => Promise\u003Cunknown>> {\n  return new Proxy({} as Record\u003Cstring, (input?: Partial\u003CInvocationContext>) => Promise\u003Cunknown>>, {\n    get(_target, prop) {\n      if (typeof prop !== 'string' || prop === 'then') return undefined;\n\n      return async (input: Partial\u003CInvocationContext> = {}) => {\n        const call: FrondCall = { address, op: prop };\n\n        return transport(call, { ...Invocation.empty, ...input });\n      };\n    },\n  });\n}\n\nconst title = (step: string, text: string) => console.log(`\\n\\x1b[36m${step}\\x1b[0m ${text}`);\nconst show = (value: unknown) => console.log(JSON.stringify(value, null, 2).split('\\n').map((l) => `   ${l}`).join('\\n'));\n\nasync function main(): Promise\u003Cvoid> {\n  const transport = createHttpTransport(RUST_FROND);\n\n  \u002F\u002F ─── 1. Découverte ───────────────────────────────────────────────\n  title('1.', 'Découverte — le TS ne sait rien, il demande');\n\n  const card = (await transport({ address: 'rpc', op: 'discover' }, Invocation.empty)) as IdentityCard;\n  for (const frond of card.fronds) {\n    for (const facade of frond.facades) {\n      console.log(`   ${frond.name} › ${facade.name} — ops: ${facade.ops.map((o) => o.name).join(', ')}`);\n    }\n    \u002F\u002F Ce frond n'annonce rien ; un qui le ferait publierait ici la forme de ses faits.\n    for (const fact of frond.facts) {\n      console.log(`   ${frond.name} ! ${fact.name} — un fait, aucune op`);\n    }\n  }\n\n  \u002F\u002F ─── 2. Le schéma déclaré en Rust ────────────────────────────────\n  title('2.', 'Le schéma — déclaré dans src\u002Fmain.rs, jamais en TypeScript');\n\n  \u002F\u002F Un frond peut ne rien stocker — la carte publie alors ses ops et aucune entité.\n  \u002F\u002F Ce frond en déclare une, donc l'absence est une panne, pas un cas à contourner.\n  const descriptor = card.fronds[0].entities[0]?.schema;\n  if (!descriptor) throw new Error(\"le frond Rust n'a publié aucun schéma — la carte est incomplète\");\n\n  console.log(`   ${Object.keys(descriptor.properties).length} champs · requis à la création : ${descriptor.required?.join(', ')}`);\n  show(descriptor.properties.recordedAt);\n\n  \u002F\u002F ─── 3. Reconstruction ───────────────────────────────────────────\n  title('3.', 'Card.toSchema() — le comportement se rebâtit côté TS');\n\n  const Sensor = Card.fromDescriptor(descriptor).toSchema();\n  console.log(`   entrée (ce qu'un client peut fournir) : ${Object.keys(Visibility.of(Sensor.getFields()).input).join(', ')}`);\n  console.log(`   sortie (ce qu'un client peut lire)    : ${Object.keys(Visibility.of(Sensor.getFields()).output).join(', ')}`);\n\n  \u002F\u002F ─── 4. Le juge local ────────────────────────────────────────────\n  title('4.', 'Le juge local refuse AVANT tout réseau — règles venues de Rust');\n\n  const bad = { label: 'x', celsius: 250, checksum: 'forgé', couleur: 'rouge' };\n  const verdict = Sensor.validate(bad);\n  console.log(`   payload : ${JSON.stringify(bad)}`);\n  if (!verdict.success) for (const error of verdict.errors) console.log(`   ✗ ${error.path || '.'} — ${error.message}`);\n\n  const good = { label: 'cuve-est', celsius: 3.7 };\n  console.log(`   payload : ${JSON.stringify(good)}`);\n  console.log(`   ${Sensor.validate(good).success ? '✓ accepté localement' : '✗ refusé'}`);\n\n  \u002F\u002F ─── 5. Les appels ───────────────────────────────────────────────\n  title('5.', 'Les appels — la doublure ne distingue pas Rust d\\'un frond local');\n\n  const sensor = doublure('sensor', transport);\n\n  const listed = (await sensor.list()) as { id: string; label: string }[];\n  console.log(`   sensor.list()      → ${listed.length} relevés : ${listed.map((s) => s.label).join(', ')}`);\n\n  const created = (await sensor.record({ input: good })) as { id: string; checksum: string; recordedAt: string };\n  console.log(`   sensor.record()    → ${created.id}`);\n  console.log(`                        checksum ${created.checksum} — calculé en Rust, illisible d'ici`);\n  console.log(`                        recordedAt ${created.recordedAt} — lifecycle create:'now', réalisé là-bas`);\n\n  const found = (await sensor.findById({ params: { id: created.id } })) as { label: string };\n  console.log(`   sensor.findById()  → ${found.label}`);\n\n  \u002F\u002F ─── 6. L'erreur typée traverse ──────────────────────────────────\n  title('6.', 'L\\'erreur traverse le fil et redevient typée');\n\n  for (const attempt of [\n    { what: 'findById sur un id absent', run: () => sensor.findById({ params: { id: 'nexiste-pas' } }) },\n    { what: 'record avec le payload refusé plus haut', run: () => sensor.record({ input: bad }) },\n  ]) {\n    try {\n      await attempt.run();\n    } catch (error) {\n      if (!(error instanceof FougereError)) throw error;\n      console.log(`   ${attempt.what}`);\n      console.log(`   ✗ ${error.code} — ${error.message}`);\n      if (error.details) console.log(`     ${JSON.stringify(error.details)}`);\n    }\n  }\n\n  console.log('\\n\\x1b[32m✓\\x1b[0m Un frond hors TypeScript, indistinguable derrière le contrat.\\n');\n}\n\nmain().catch((error: unknown) => {\n  if (error instanceof FougereError) {\n    console.error(`\\n✗ ${error.code} — ${error.message}`);\n    console.error(`  Le frond Rust tourne-t-il ? (cargo run, puis ${RUST_FROND})\\n`);\n    process.exit(1);\n  }\n  throw error;\n});\n\n","consumer.ts","ts",[28,1670,1671,1677,1682,1687,1692,1697,1701,1706,1711,1716,1720,1725,1730,1735,1764,1791,1798,1805,1815,1824,1833,1842,1849,1865,1869,1907,1911,1915,1920,1925,1930,1934,2015,2071,2092,2138,2142,2174,2206,2210,2249,2254,2259,2268,2273,2277,2354,2473,2477,2502,2522,2526,2531,2557,2561,2624,2650,2675,2769,2774,2779,2803,2847,2851,2856,2860,2865,2891,2896,2902,2908,2950,2987,2992,3068,3090,3095,3101,3128,3133,3165,3240,3311,3316,3322,3349,3354,3418,3444,3482,3574,3579,3613,3651,3710,3715,3721,3754,3759,3788,3793,3842,3923,3928,3993,4026,4061,4096,4101,4161,4194,4199,4205,4237,4242,4259,4325,4373,4381,4389,4406,4423,4450,4481,4524,4577,4582,4587,4592,4623,4628,4633,4662,4679,4726,4758,4777,4782,4792],{"__ignoreMap":107},[459,1672,1673],{"class":461,"line":462},[459,1674,1676],{"class":1675},"skXKP","\u002F**\n",[459,1678,1679],{"class":461,"line":108},[459,1680,1681],{"class":1675}," * Le consommateur TypeScript — il ne sait rien du frond telemetry.\n",[459,1683,1684],{"class":461,"line":496},[459,1685,1686],{"class":1675}," *\n",[459,1688,1689],{"class":461,"line":511},[459,1690,1691],{"class":1675}," * Aucun `class Sensor extends entity({...})` n'existe dans ce repo : la\n",[459,1693,1694],{"class":461,"line":526},[459,1695,1696],{"class":1675}," * déclaration vit dans `src\u002Fmain.rs`. Ce fichier prouve trois choses :\n",[459,1698,1699],{"class":461,"line":538},[459,1700,1686],{"class":1675},[459,1702,1703],{"class":461,"line":544},[459,1704,1705],{"class":1675}," *   1. le CONTRAT voyage      — les opérations s'appellent, la doublure ne distingue rien\n",[459,1707,1708],{"class":461,"line":554},[459,1709,1710],{"class":1675}," *   2. la CARTE voyage        — rpc.discover rend le schéma déclaré en Rust\n",[459,1712,1713],{"class":461,"line":569},[459,1714,1715],{"class":1675}," *   3. le COMPORTEMENT se rebâtit — Card.toSchema() rend un juge vivant côté TS\n",[459,1717,1718],{"class":461,"line":626},[459,1719,1686],{"class":1675},[459,1721,1722],{"class":461,"line":665},[459,1723,1724],{"class":1675}," * Le troisième point est celui qui compte : le juge local refuse un payload\n",[459,1726,1727],{"class":461,"line":679},[459,1728,1729],{"class":1675}," * sur des règles qu'aucune ligne de TypeScript ne déclare.\n",[459,1731,1732],{"class":461,"line":718},[459,1733,1734],{"class":1675}," *\u002F\n",[459,1736,1737,1741,1743,1746,1749,1752,1755,1758,1761],{"class":461,"line":900},[459,1738,1740],{"class":1739},"sK6XW","import",[459,1742,577],{"class":465},[459,1744,1745],{"class":799}," createHttpTransport",[459,1747,1748],{"class":465}," }",[459,1750,1751],{"class":1739}," from",[459,1753,1754],{"class":485}," '",[459,1756,1757],{"class":489},"@fougere\u002Ftransport-http\u002Fclient",[459,1759,1760],{"class":485},"'",[459,1762,1763],{"class":465},";\n",[459,1765,1766,1768,1770,1773,1775,1778,1780,1782,1784,1787,1789],{"class":461,"line":906},[459,1767,1740],{"class":1739},[459,1769,577],{"class":465},[459,1771,1772],{"class":799}," Card",[459,1774,593],{"class":465},[459,1776,1777],{"class":799}," Visibility",[459,1779,1748],{"class":465},[459,1781,1751],{"class":1739},[459,1783,1754],{"class":485},[459,1785,1786],{"class":489},"@fougere\u002Fschema",[459,1788,1760],{"class":485},[459,1790,1763],{"class":465},[459,1792,1793,1795],{"class":461,"line":911},[459,1794,1740],{"class":1739},[459,1796,1797],{"class":465}," {\n",[459,1799,1800,1803],{"class":461,"line":943},[459,1801,1802],{"class":799},"  FougereError",[459,1804,940],{"class":465},[459,1806,1807,1810,1813],{"class":461,"line":966},[459,1808,1809],{"class":1739},"  type",[459,1811,1812],{"class":799}," FrondCall",[459,1814,940],{"class":465},[459,1816,1817,1819,1822],{"class":461,"line":990},[459,1818,1809],{"class":1739},[459,1820,1821],{"class":799}," IdentityCard",[459,1823,940],{"class":465},[459,1825,1826,1828,1831],{"class":461,"line":1014},[459,1827,1809],{"class":1739},[459,1829,1830],{"class":799}," InvocationContext",[459,1832,940],{"class":465},[459,1834,1835,1837,1840],{"class":461,"line":1019},[459,1836,1809],{"class":1739},[459,1838,1839],{"class":799}," Transport",[459,1841,940],{"class":465},[459,1843,1844,1847],{"class":461,"line":1025},[459,1845,1846],{"class":799},"  Invocation",[459,1848,940],{"class":465},[459,1850,1851,1854,1856,1858,1861,1863],{"class":461,"line":1030},[459,1852,1853],{"class":465},"}",[459,1855,1751],{"class":1739},[459,1857,1754],{"class":485},[459,1859,1860],{"class":489},"@fougere\u002Fcore\u002Fcontract",[459,1862,1760],{"class":485},[459,1864,1763],{"class":465},[459,1866,1867],{"class":461,"line":1044},[459,1868,541],{"emptyLinePlaceholder":115},[459,1870,1871,1875,1878,1881,1884,1887,1890,1892,1895,1898,1900,1903,1905],{"class":461,"line":1079},[459,1872,1874],{"class":1873},"s76I7","const",[459,1876,1877],{"class":799}," RUST_FROND ",[459,1879,1880],{"class":465},"=",[459,1882,1883],{"class":799}," process",[459,1885,1886],{"class":465},".",[459,1888,1889],{"class":478},"env",[459,1891,1886],{"class":465},[459,1893,1894],{"class":478},"RUST_FROND_URL",[459,1896,1897],{"class":465}," ??",[459,1899,1754],{"class":485},[459,1901,1902],{"class":489},"http:\u002F\u002Flocalhost:4200",[459,1904,1760],{"class":485},[459,1906,1763],{"class":465},[459,1908,1909],{"class":461,"line":1085},[459,1910,541],{"emptyLinePlaceholder":115},[459,1912,1913],{"class":461,"line":1090},[459,1914,1676],{"class":1675},[459,1916,1917],{"class":461,"line":1095},[459,1918,1919],{"class":1675}," * La doublure — copie fidèle de `createRemoteFacade` (packages\u002Fcore\u002Fsrc\u002Fboot\u002Fremote.ts, `createRemoteFacade`).\n",[459,1921,1922],{"class":461,"line":1101},[459,1923,1924],{"class":1675}," * Elle est reproduite ici parce qu'elle n'est pas exportée hors de bootstrap ;\n",[459,1926,1927],{"class":461,"line":1107},[459,1928,1929],{"class":1675}," * c'est le même Proxy, à la lettre.\n",[459,1931,1932],{"class":461,"line":1113},[459,1933,1734],{"class":1675},[459,1935,1936,1939,1943,1945,1949,1952,1956,1958,1961,1963,1965,1968,1971,1974,1977,1979,1981,1984,1987,1990,1992,1995,1998,2002,2005,2007,2010,2013],{"class":461,"line":1119},[459,1937,1938],{"class":1873},"function",[459,1940,1942],{"class":1941},"s4mR9"," doublure",[459,1944,1047],{"class":465},[459,1946,1948],{"class":1947},"shDUQ","address",[459,1950,1951],{"class":465},":",[459,1953,1955],{"class":1954},"sBZYL"," string",[459,1957,593],{"class":465},[459,1959,1960],{"class":1947}," transport",[459,1962,1951],{"class":465},[459,1964,1839],{"class":1954},[459,1966,1967],{"class":465},"):",[459,1969,1970],{"class":1954}," Record",[459,1972,1973],{"class":465},"\u003C",[459,1975,1976],{"class":1954},"string",[459,1978,593],{"class":465},[459,1980,1469],{"class":465},[459,1982,1983],{"class":1947},"input",[459,1985,1986],{"class":465},"?:",[459,1988,1989],{"class":1954}," Partial",[459,1991,1973],{"class":465},[459,1993,1994],{"class":1954},"InvocationContext",[459,1996,1997],{"class":465},">)",[459,1999,2001],{"class":2000},"scTuO"," =>",[459,2003,2004],{"class":1954}," Promise",[459,2006,1973],{"class":465},[459,2008,2009],{"class":1954},"unknown",[459,2011,2012],{"class":465},">>",[459,2014,1797],{"class":465},[459,2016,2017,2020,2023,2027,2030,2033,2036,2038,2040,2042,2044,2046,2048,2050,2052,2054,2056,2058,2060,2062,2064,2066,2069],{"class":461,"line":1124},[459,2018,2019],{"class":1739},"  return",[459,2021,2022],{"class":465}," new",[459,2024,2026],{"class":2025},"sgjsB"," Proxy",[459,2028,1047],{"class":2029},"spAFX",[459,2031,2032],{"class":465},"{}",[459,2034,2035],{"class":1739}," as",[459,2037,1970],{"class":1954},[459,2039,1973],{"class":465},[459,2041,1976],{"class":1954},[459,2043,593],{"class":465},[459,2045,1469],{"class":465},[459,2047,1983],{"class":1947},[459,2049,1986],{"class":465},[459,2051,1989],{"class":1954},[459,2053,1973],{"class":465},[459,2055,1994],{"class":1954},[459,2057,1997],{"class":465},[459,2059,2001],{"class":2000},[459,2061,2004],{"class":1954},[459,2063,1973],{"class":465},[459,2065,2009],{"class":1954},[459,2067,2068],{"class":465},">>,",[459,2070,1797],{"class":465},[459,2072,2073,2077,2079,2082,2084,2087,2090],{"class":461,"line":1129},[459,2074,2076],{"class":2075},"sTa09","    get",[459,2078,1047],{"class":465},[459,2080,2081],{"class":1947},"_target",[459,2083,593],{"class":465},[459,2085,2086],{"class":1947}," prop",[459,2088,2089],{"class":465},")",[459,2091,1797],{"class":465},[459,2093,2094,2097,2099,2102,2104,2107,2109,2111,2113,2116,2118,2121,2123,2126,2128,2130,2133,2136],{"class":461,"line":1145},[459,2095,2096],{"class":1739},"      if",[459,2098,1469],{"class":2029},[459,2100,2101],{"class":465},"typeof",[459,2103,2086],{"class":799},[459,2105,2106],{"class":465}," !==",[459,2108,1754],{"class":485},[459,2110,1976],{"class":489},[459,2112,1760],{"class":485},[459,2114,2115],{"class":465}," ||",[459,2117,2086],{"class":799},[459,2119,2120],{"class":465}," ===",[459,2122,1754],{"class":485},[459,2124,2125],{"class":489},"then",[459,2127,1760],{"class":485},[459,2129,2089],{"class":2029},[459,2131,2132],{"class":1739}," return",[459,2134,2135],{"class":485}," undefined",[459,2137,1763],{"class":465},[459,2139,2140],{"class":461,"line":1151},[459,2141,541],{"emptyLinePlaceholder":115},[459,2143,2144,2147,2150,2152,2154,2156,2158,2160,2162,2165,2167,2170,2172],{"class":461,"line":1156},[459,2145,2146],{"class":1739},"      return",[459,2148,2149],{"class":1873}," async",[459,2151,1469],{"class":465},[459,2153,1983],{"class":1947},[459,2155,1951],{"class":465},[459,2157,1989],{"class":1954},[459,2159,1973],{"class":465},[459,2161,1994],{"class":1954},[459,2163,2164],{"class":465},">",[459,2166,482],{"class":465},[459,2168,2169],{"class":465}," {})",[459,2171,2001],{"class":2000},[459,2173,1797],{"class":465},[459,2175,2176,2179,2182,2184,2186,2188,2190,2193,2195,2199,2201,2203],{"class":461,"line":1164},[459,2177,2178],{"class":1873},"        const",[459,2180,2181],{"class":799}," call",[459,2183,1951],{"class":465},[459,2185,1812],{"class":1954},[459,2187,482],{"class":465},[459,2189,577],{"class":465},[459,2191,2192],{"class":799}," address",[459,2194,593],{"class":465},[459,2196,2198],{"class":2197},"sHtqg"," op",[459,2200,1951],{"class":465},[459,2202,2086],{"class":799},[459,2204,2205],{"class":465}," };\n",[459,2207,2208],{"class":461,"line":1169},[459,2209,541],{"emptyLinePlaceholder":115},[459,2211,2212,2215,2217,2219,2222,2224,2226,2229,2232,2234,2237,2239,2241,2243,2245,2247],{"class":461,"line":1182},[459,2213,2214],{"class":1739},"        return",[459,2216,1960],{"class":2025},[459,2218,1047],{"class":2029},[459,2220,2221],{"class":799},"call",[459,2223,593],{"class":465},[459,2225,577],{"class":465},[459,2227,2228],{"class":465}," ...",[459,2230,2231],{"class":799},"Invocation",[459,2233,1886],{"class":465},[459,2235,2236],{"class":478},"empty",[459,2238,593],{"class":465},[459,2240,2228],{"class":465},[459,2242,1983],{"class":799},[459,2244,1748],{"class":465},[459,2246,2089],{"class":2029},[459,2248,1763],{"class":465},[459,2250,2251],{"class":461,"line":1195},[459,2252,2253],{"class":465},"      };\n",[459,2255,2256],{"class":461,"line":1200},[459,2257,2258],{"class":465},"    },\n",[459,2260,2261,2264,2266],{"class":461,"line":1228},[459,2262,2263],{"class":465},"  }",[459,2265,2089],{"class":2029},[459,2267,1763],{"class":465},[459,2269,2270],{"class":461,"line":1234},[459,2271,2272],{"class":465},"}\n",[459,2274,2275],{"class":461,"line":1270},[459,2276,541],{"emptyLinePlaceholder":115},[459,2278,2279,2281,2285,2287,2289,2292,2294,2296,2298,2301,2303,2305,2307,2309,2312,2314,2317,2320,2322,2326,2329,2332,2334,2336,2339,2342,2344,2346,2348,2350,2352],{"class":461,"line":1306},[459,2280,1874],{"class":1873},[459,2282,2284],{"class":2283},"slP7D"," title",[459,2286,482],{"class":465},[459,2288,1469],{"class":465},[459,2290,2291],{"class":1947},"step",[459,2293,1951],{"class":465},[459,2295,1955],{"class":1954},[459,2297,593],{"class":465},[459,2299,2300],{"class":1947}," text",[459,2302,1951],{"class":465},[459,2304,1955],{"class":1954},[459,2306,2089],{"class":465},[459,2308,2001],{"class":2000},[459,2310,2311],{"class":799}," console",[459,2313,1886],{"class":465},[459,2315,2316],{"class":1941},"log",[459,2318,1047],{"class":2319},"srlTG",[459,2321,803],{"class":485},[459,2323,2325],{"class":2324},"sfnqo","\\n\\x1b",[459,2327,2328],{"class":489},"[36m",[459,2330,2331],{"class":465},"${",[459,2333,2291],{"class":799},[459,2335,1853],{"class":465},[459,2337,2338],{"class":2324},"\\x1b",[459,2340,2341],{"class":489},"[0m ",[459,2343,2331],{"class":465},[459,2345,448],{"class":799},[459,2347,1853],{"class":465},[459,2349,803],{"class":485},[459,2351,2089],{"class":2319},[459,2353,1763],{"class":465},[459,2355,2356,2358,2361,2363,2365,2368,2370,2373,2375,2377,2379,2381,2383,2385,2388,2390,2393,2395,2397,2399,2402,2404,2408,2410,2412,2415,2417,2419,2422,2424,2426,2428,2431,2433,2435,2438,2440,2442,2444,2447,2449,2451,2453,2455,2457,2460,2462,2464,2466,2468,2471],{"class":461,"line":1333},[459,2357,1874],{"class":1873},[459,2359,2360],{"class":2283}," show",[459,2362,482],{"class":465},[459,2364,1469],{"class":465},[459,2366,2367],{"class":1947},"value",[459,2369,1951],{"class":465},[459,2371,2372],{"class":1954}," unknown",[459,2374,2089],{"class":465},[459,2376,2001],{"class":2000},[459,2378,2311],{"class":799},[459,2380,1886],{"class":465},[459,2382,2316],{"class":1941},[459,2384,1047],{"class":2319},[459,2386,2387],{"class":799},"JSON",[459,2389,1886],{"class":465},[459,2391,2392],{"class":1941},"stringify",[459,2394,1047],{"class":2319},[459,2396,2367],{"class":799},[459,2398,593],{"class":465},[459,2400,2401],{"class":485}," null",[459,2403,593],{"class":465},[459,2405,2407],{"class":2406},"s3dPA"," 2",[459,2409,2089],{"class":2319},[459,2411,1886],{"class":465},[459,2413,2414],{"class":1941},"split",[459,2416,1047],{"class":2319},[459,2418,1760],{"class":485},[459,2420,2421],{"class":2324},"\\n",[459,2423,1760],{"class":485},[459,2425,2089],{"class":2319},[459,2427,1886],{"class":465},[459,2429,2430],{"class":1941},"map",[459,2432,1047],{"class":2319},[459,2434,1047],{"class":465},[459,2436,2437],{"class":1947},"l",[459,2439,2089],{"class":465},[459,2441,2001],{"class":2000},[459,2443,829],{"class":485},[459,2445,2446],{"class":465},"   ${",[459,2448,2437],{"class":799},[459,2450,1853],{"class":465},[459,2452,803],{"class":485},[459,2454,2089],{"class":2319},[459,2456,1886],{"class":465},[459,2458,2459],{"class":1941},"join",[459,2461,1047],{"class":2319},[459,2463,1760],{"class":485},[459,2465,2421],{"class":2324},[459,2467,1760],{"class":485},[459,2469,2470],{"class":2319},"))",[459,2472,1763],{"class":465},[459,2474,2475],{"class":461,"line":1368},[459,2476,541],{"emptyLinePlaceholder":115},[459,2478,2479,2482,2485,2488,2491,2493,2495,2498,2500],{"class":461,"line":1373},[459,2480,2481],{"class":1873},"async",[459,2483,2484],{"class":1873}," function",[459,2486,2487],{"class":1941}," main",[459,2489,2490],{"class":465},"():",[459,2492,2004],{"class":1954},[459,2494,1973],{"class":465},[459,2496,2497],{"class":1954},"void",[459,2499,2164],{"class":465},[459,2501,1797],{"class":465},[459,2503,2504,2507,2509,2511,2513,2515,2518,2520],{"class":461,"line":1381},[459,2505,2506],{"class":1873},"  const",[459,2508,1960],{"class":799},[459,2510,482],{"class":465},[459,2512,1745],{"class":1941},[459,2514,1047],{"class":2029},[459,2516,2517],{"class":799},"RUST_FROND",[459,2519,2089],{"class":2029},[459,2521,1763],{"class":465},[459,2523,2524],{"class":461,"line":1386},[459,2525,541],{"emptyLinePlaceholder":115},[459,2527,2528],{"class":461,"line":1418},[459,2529,2530],{"class":1675},"  \u002F\u002F ─── 1. Découverte ───────────────────────────────────────────────\n",[459,2532,2533,2536,2538,2540,2542,2544,2546,2548,2551,2553,2555],{"class":461,"line":1441},[459,2534,2535],{"class":1941},"  title",[459,2537,1047],{"class":2029},[459,2539,1760],{"class":485},[459,2541,914],{"class":489},[459,2543,1760],{"class":485},[459,2545,593],{"class":465},[459,2547,1754],{"class":485},[459,2549,2550],{"class":489},"Découverte — le TS ne sait rien, il demande",[459,2552,1760],{"class":485},[459,2554,2089],{"class":2029},[459,2556,1763],{"class":465},[459,2558,2559],{"class":461,"line":1457},[459,2560,541],{"emptyLinePlaceholder":115},[459,2562,2563,2565,2568,2570,2572,2575,2577,2579,2582,2584,2586,2588,2591,2593,2595,2597,2599,2601,2604,2606,2609,2612,2614,2616,2618,2620,2622],{"class":461,"line":1482},[459,2564,2506],{"class":1873},[459,2566,2567],{"class":799}," card",[459,2569,482],{"class":465},[459,2571,1469],{"class":2029},[459,2573,2574],{"class":1739},"await",[459,2576,1960],{"class":1941},[459,2578,1047],{"class":2029},[459,2580,2581],{"class":465},"{",[459,2583,2192],{"class":2197},[459,2585,1951],{"class":465},[459,2587,1754],{"class":485},[459,2589,2590],{"class":489},"rpc",[459,2592,1760],{"class":485},[459,2594,593],{"class":465},[459,2596,2198],{"class":2197},[459,2598,1951],{"class":465},[459,2600,1754],{"class":485},[459,2602,2603],{"class":489},"discover",[459,2605,1760],{"class":485},[459,2607,2608],{"class":465}," },",[459,2610,2611],{"class":799}," Invocation",[459,2613,1886],{"class":465},[459,2615,2236],{"class":478},[459,2617,2470],{"class":2029},[459,2619,2035],{"class":1739},[459,2621,1821],{"class":1954},[459,2623,1763],{"class":465},[459,2625,2626,2629,2631,2633,2636,2639,2641,2643,2646,2648],{"class":461,"line":1506},[459,2627,2628],{"class":1739},"  for",[459,2630,1469],{"class":2029},[459,2632,1874],{"class":1873},[459,2634,2635],{"class":799}," frond",[459,2637,2638],{"class":465}," of",[459,2640,2567],{"class":799},[459,2642,1886],{"class":465},[459,2644,2645],{"class":478},"fronds",[459,2647,2089],{"class":2029},[459,2649,1797],{"class":465},[459,2651,2652,2655,2657,2659,2662,2664,2666,2668,2671,2673],{"class":461,"line":1512},[459,2653,2654],{"class":1739},"    for",[459,2656,1469],{"class":2029},[459,2658,1874],{"class":1873},[459,2660,2661],{"class":799}," facade",[459,2663,2638],{"class":465},[459,2665,2635],{"class":799},[459,2667,1886],{"class":465},[459,2669,2670],{"class":478},"facades",[459,2672,2089],{"class":2029},[459,2674,1797],{"class":465},[459,2676,2677,2680,2682,2684,2686,2688,2690,2692,2694,2696,2698,2701,2703,2705,2707,2709,2711,2714,2716,2718,2720,2723,2725,2727,2729,2731,2734,2736,2738,2741,2743,2745,2747,2749,2751,2753,2755,2757,2759,2761,2763,2765,2767],{"class":461,"line":1537},[459,2678,2679],{"class":799},"      console",[459,2681,1886],{"class":465},[459,2683,2316],{"class":1941},[459,2685,1047],{"class":2029},[459,2687,803],{"class":485},[459,2689,2446],{"class":465},[459,2691,150],{"class":799},[459,2693,1886],{"class":465},[459,2695,479],{"class":478},[459,2697,1853],{"class":465},[459,2699,2700],{"class":489}," › ",[459,2702,2331],{"class":465},[459,2704,208],{"class":799},[459,2706,1886],{"class":465},[459,2708,479],{"class":478},[459,2710,1853],{"class":465},[459,2712,2713],{"class":489}," — ops: ",[459,2715,2331],{"class":465},[459,2717,208],{"class":799},[459,2719,1886],{"class":465},[459,2721,2722],{"class":478},"ops",[459,2724,1886],{"class":465},[459,2726,2430],{"class":1941},[459,2728,1047],{"class":2319},[459,2730,1047],{"class":465},[459,2732,2733],{"class":1947},"o",[459,2735,2089],{"class":465},[459,2737,2001],{"class":2000},[459,2739,2740],{"class":799}," o",[459,2742,1886],{"class":465},[459,2744,479],{"class":478},[459,2746,2089],{"class":2319},[459,2748,1886],{"class":465},[459,2750,2459],{"class":1941},[459,2752,1047],{"class":2319},[459,2754,1760],{"class":485},[459,2756,55],{"class":489},[459,2758,1760],{"class":485},[459,2760,2089],{"class":2319},[459,2762,1853],{"class":465},[459,2764,803],{"class":485},[459,2766,2089],{"class":2029},[459,2768,1763],{"class":465},[459,2770,2771],{"class":461,"line":1543},[459,2772,2773],{"class":465},"    }\n",[459,2775,2776],{"class":461,"line":1548},[459,2777,2778],{"class":1675},"    \u002F\u002F Ce frond n'annonce rien ; un qui le ferait publierait ici la forme de ses faits.\n",[459,2780,2781,2783,2785,2787,2790,2792,2794,2796,2799,2801],{"class":461,"line":1556},[459,2782,2654],{"class":1739},[459,2784,1469],{"class":2029},[459,2786,1874],{"class":1873},[459,2788,2789],{"class":799}," fact",[459,2791,2638],{"class":465},[459,2793,2635],{"class":799},[459,2795,1886],{"class":465},[459,2797,2798],{"class":478},"facts",[459,2800,2089],{"class":2029},[459,2802,1797],{"class":465},[459,2804,2805,2807,2809,2811,2813,2815,2817,2819,2821,2823,2825,2828,2830,2832,2834,2836,2838,2841,2843,2845],{"class":461,"line":1561},[459,2806,2679],{"class":799},[459,2808,1886],{"class":465},[459,2810,2316],{"class":1941},[459,2812,1047],{"class":2029},[459,2814,803],{"class":485},[459,2816,2446],{"class":465},[459,2818,150],{"class":799},[459,2820,1886],{"class":465},[459,2822,479],{"class":478},[459,2824,1853],{"class":465},[459,2826,2827],{"class":489}," ! ",[459,2829,2331],{"class":465},[459,2831,199],{"class":799},[459,2833,1886],{"class":465},[459,2835,479],{"class":478},[459,2837,1853],{"class":465},[459,2839,2840],{"class":489}," — un fait, aucune op",[459,2842,803],{"class":485},[459,2844,2089],{"class":2029},[459,2846,1763],{"class":465},[459,2848,2849],{"class":461,"line":1586},[459,2850,2773],{"class":465},[459,2852,2853],{"class":461,"line":1602},[459,2854,2855],{"class":465},"  }\n",[459,2857,2858],{"class":461,"line":1645},[459,2859,541],{"emptyLinePlaceholder":115},[459,2861,2862],{"class":461,"line":1651},[459,2863,2864],{"class":1675},"  \u002F\u002F ─── 2. Le schéma déclaré en Rust ────────────────────────────────\n",[459,2866,2868,2870,2872,2874,2876,2878,2880,2882,2885,2887,2889],{"class":461,"line":2867},67,[459,2869,2535],{"class":1941},[459,2871,1047],{"class":2029},[459,2873,1760],{"class":485},[459,2875,969],{"class":489},[459,2877,1760],{"class":485},[459,2879,593],{"class":465},[459,2881,1754],{"class":485},[459,2883,2884],{"class":489},"Le schéma — déclaré dans src\u002Fmain.rs, jamais en TypeScript",[459,2886,1760],{"class":485},[459,2888,2089],{"class":2029},[459,2890,1763],{"class":465},[459,2892,2894],{"class":461,"line":2893},68,[459,2895,541],{"emptyLinePlaceholder":115},[459,2897,2899],{"class":461,"line":2898},69,[459,2900,2901],{"class":1675},"  \u002F\u002F Un frond peut ne rien stocker — la carte publie alors ses ops et aucune entité.\n",[459,2903,2905],{"class":461,"line":2904},70,[459,2906,2907],{"class":1675},"  \u002F\u002F Ce frond en déclare une, donc l'absence est une panne, pas un cas à contourner.\n",[459,2909,2911,2913,2916,2918,2920,2922,2924,2926,2929,2931,2933,2936,2938,2940,2942,2945,2948],{"class":461,"line":2910},71,[459,2912,2506],{"class":1873},[459,2914,2915],{"class":799}," descriptor",[459,2917,482],{"class":465},[459,2919,2567],{"class":799},[459,2921,1886],{"class":465},[459,2923,2645],{"class":478},[459,2925,466],{"class":2029},[459,2927,2928],{"class":2406},"0",[459,2930,620],{"class":2029},[459,2932,1886],{"class":465},[459,2934,2935],{"class":478},"entities",[459,2937,466],{"class":2029},[459,2939,2928],{"class":2406},[459,2941,620],{"class":2029},[459,2943,2944],{"class":465},"?.",[459,2946,2947],{"class":478},"schema",[459,2949,1763],{"class":465},[459,2951,2953,2956,2958,2961,2964,2966,2969,2971,2974,2976,2978,2981,2983,2985],{"class":461,"line":2952},72,[459,2954,2955],{"class":1739},"  if",[459,2957,1469],{"class":2029},[459,2959,2960],{"class":465},"!",[459,2962,2963],{"class":799},"descriptor",[459,2965,2089],{"class":2029},[459,2967,2968],{"class":1739}," throw",[459,2970,2022],{"class":465},[459,2972,2973],{"class":2025}," Error",[459,2975,1047],{"class":2029},[459,2977,590],{"class":485},[459,2979,2980],{"class":489},"le frond Rust n'a publié aucun schéma — la carte est incomplète",[459,2982,590],{"class":485},[459,2984,2089],{"class":2029},[459,2986,1763],{"class":465},[459,2988,2990],{"class":461,"line":2989},73,[459,2991,541],{"emptyLinePlaceholder":115},[459,2993,2995,2998,3000,3002,3004,3006,3008,3011,3013,3016,3018,3020,3022,3025,3027,3029,3032,3034,3037,3039,3041,3043,3046,3048,3050,3052,3054,3056,3058,3060,3062,3064,3066],{"class":461,"line":2994},74,[459,2996,2997],{"class":799},"  console",[459,2999,1886],{"class":465},[459,3001,2316],{"class":1941},[459,3003,1047],{"class":2029},[459,3005,803],{"class":485},[459,3007,2446],{"class":465},[459,3009,3010],{"class":799},"Object",[459,3012,1886],{"class":465},[459,3014,3015],{"class":1941},"keys",[459,3017,1047],{"class":2319},[459,3019,2963],{"class":799},[459,3021,1886],{"class":465},[459,3023,3024],{"class":478},"properties",[459,3026,2089],{"class":2319},[459,3028,1886],{"class":465},[459,3030,3031],{"class":478},"length",[459,3033,1853],{"class":465},[459,3035,3036],{"class":489}," champs · requis à la création : ",[459,3038,2331],{"class":465},[459,3040,2963],{"class":799},[459,3042,1886],{"class":465},[459,3044,3045],{"class":478},"required",[459,3047,2944],{"class":465},[459,3049,2459],{"class":1941},[459,3051,1047],{"class":2319},[459,3053,1760],{"class":485},[459,3055,55],{"class":489},[459,3057,1760],{"class":485},[459,3059,2089],{"class":2319},[459,3061,1853],{"class":465},[459,3063,803],{"class":485},[459,3065,2089],{"class":2029},[459,3067,1763],{"class":465},[459,3069,3071,3074,3076,3078,3080,3082,3084,3086,3088],{"class":461,"line":3070},75,[459,3072,3073],{"class":1941},"  show",[459,3075,1047],{"class":2029},[459,3077,2963],{"class":799},[459,3079,1886],{"class":465},[459,3081,3024],{"class":478},[459,3083,1886],{"class":465},[459,3085,1286],{"class":478},[459,3087,2089],{"class":2029},[459,3089,1763],{"class":465},[459,3091,3093],{"class":461,"line":3092},76,[459,3094,541],{"emptyLinePlaceholder":115},[459,3096,3098],{"class":461,"line":3097},77,[459,3099,3100],{"class":1675},"  \u002F\u002F ─── 3. Reconstruction ───────────────────────────────────────────\n",[459,3102,3104,3106,3108,3110,3113,3115,3117,3119,3122,3124,3126],{"class":461,"line":3103},78,[459,3105,2535],{"class":1941},[459,3107,1047],{"class":2029},[459,3109,1760],{"class":485},[459,3111,3112],{"class":489},"3.",[459,3114,1760],{"class":485},[459,3116,593],{"class":465},[459,3118,1754],{"class":485},[459,3120,3121],{"class":489},"Card.toSchema() — le comportement se rebâtit côté TS",[459,3123,1760],{"class":485},[459,3125,2089],{"class":2029},[459,3127,1763],{"class":465},[459,3129,3131],{"class":461,"line":3130},79,[459,3132,541],{"emptyLinePlaceholder":115},[459,3134,3136,3138,3141,3143,3145,3147,3150,3152,3154,3156,3158,3160,3163],{"class":461,"line":3135},80,[459,3137,2506],{"class":1873},[459,3139,3140],{"class":799}," Sensor",[459,3142,482],{"class":465},[459,3144,1772],{"class":799},[459,3146,1886],{"class":465},[459,3148,3149],{"class":1941},"fromDescriptor",[459,3151,1047],{"class":2029},[459,3153,2963],{"class":799},[459,3155,2089],{"class":2029},[459,3157,1886],{"class":465},[459,3159,1061],{"class":1941},[459,3161,3162],{"class":2029},"()",[459,3164,1763],{"class":465},[459,3166,3168,3170,3172,3174,3176,3178,3181,3183,3185,3187,3189,3191,3194,3196,3199,3201,3204,3206,3209,3212,3214,3216,3218,3220,3222,3224,3226,3228,3230,3232,3234,3236,3238],{"class":461,"line":3167},81,[459,3169,2997],{"class":799},[459,3171,1886],{"class":465},[459,3173,2316],{"class":1941},[459,3175,1047],{"class":2029},[459,3177,803],{"class":485},[459,3179,3180],{"class":489},"   entrée (ce qu'un client peut fournir) : ",[459,3182,2331],{"class":465},[459,3184,3010],{"class":799},[459,3186,1886],{"class":465},[459,3188,3015],{"class":1941},[459,3190,1047],{"class":2319},[459,3192,3193],{"class":799},"Visibility",[459,3195,1886],{"class":465},[459,3197,3198],{"class":1941},"of",[459,3200,1047],{"class":2319},[459,3202,3203],{"class":799},"Sensor",[459,3205,1886],{"class":465},[459,3207,3208],{"class":1941},"getFields",[459,3210,3211],{"class":2319},"())",[459,3213,1886],{"class":465},[459,3215,1983],{"class":478},[459,3217,2089],{"class":2319},[459,3219,1886],{"class":465},[459,3221,2459],{"class":1941},[459,3223,1047],{"class":2319},[459,3225,1760],{"class":485},[459,3227,55],{"class":489},[459,3229,1760],{"class":485},[459,3231,2089],{"class":2319},[459,3233,1853],{"class":465},[459,3235,803],{"class":485},[459,3237,2089],{"class":2029},[459,3239,1763],{"class":465},[459,3241,3243,3245,3247,3249,3251,3253,3256,3258,3260,3262,3264,3266,3268,3270,3272,3274,3276,3278,3280,3282,3284,3287,3289,3291,3293,3295,3297,3299,3301,3303,3305,3307,3309],{"class":461,"line":3242},82,[459,3244,2997],{"class":799},[459,3246,1886],{"class":465},[459,3248,2316],{"class":1941},[459,3250,1047],{"class":2029},[459,3252,803],{"class":485},[459,3254,3255],{"class":489},"   sortie (ce qu'un client peut lire)    : ",[459,3257,2331],{"class":465},[459,3259,3010],{"class":799},[459,3261,1886],{"class":465},[459,3263,3015],{"class":1941},[459,3265,1047],{"class":2319},[459,3267,3193],{"class":799},[459,3269,1886],{"class":465},[459,3271,3198],{"class":1941},[459,3273,1047],{"class":2319},[459,3275,3203],{"class":799},[459,3277,1886],{"class":465},[459,3279,3208],{"class":1941},[459,3281,3211],{"class":2319},[459,3283,1886],{"class":465},[459,3285,3286],{"class":478},"output",[459,3288,2089],{"class":2319},[459,3290,1886],{"class":465},[459,3292,2459],{"class":1941},[459,3294,1047],{"class":2319},[459,3296,1760],{"class":485},[459,3298,55],{"class":489},[459,3300,1760],{"class":485},[459,3302,2089],{"class":2319},[459,3304,1853],{"class":465},[459,3306,803],{"class":485},[459,3308,2089],{"class":2029},[459,3310,1763],{"class":465},[459,3312,3314],{"class":461,"line":3313},83,[459,3315,541],{"emptyLinePlaceholder":115},[459,3317,3319],{"class":461,"line":3318},84,[459,3320,3321],{"class":1675},"  \u002F\u002F ─── 4. Le juge local ────────────────────────────────────────────\n",[459,3323,3325,3327,3329,3331,3334,3336,3338,3340,3343,3345,3347],{"class":461,"line":3324},85,[459,3326,2535],{"class":1941},[459,3328,1047],{"class":2029},[459,3330,1760],{"class":485},[459,3332,3333],{"class":489},"4.",[459,3335,1760],{"class":485},[459,3337,593],{"class":465},[459,3339,1754],{"class":485},[459,3341,3342],{"class":489},"Le juge local refuse AVANT tout réseau — règles venues de Rust",[459,3344,1760],{"class":485},[459,3346,2089],{"class":2029},[459,3348,1763],{"class":465},[459,3350,3352],{"class":461,"line":3351},86,[459,3353,541],{"emptyLinePlaceholder":115},[459,3355,3357,3359,3362,3364,3366,3369,3371,3373,3376,3378,3380,3383,3385,3388,3390,3393,3395,3397,3400,3402,3404,3407,3409,3411,3414,3416],{"class":461,"line":3356},87,[459,3358,2506],{"class":1873},[459,3360,3361],{"class":799}," bad",[459,3363,482],{"class":465},[459,3365,577],{"class":465},[459,3367,3368],{"class":2197}," label",[459,3370,1951],{"class":465},[459,3372,1754],{"class":485},[459,3374,3375],{"class":489},"x",[459,3377,1760],{"class":485},[459,3379,593],{"class":465},[459,3381,3382],{"class":2197}," celsius",[459,3384,1951],{"class":465},[459,3386,3387],{"class":2406}," 250",[459,3389,593],{"class":465},[459,3391,3392],{"class":2197}," checksum",[459,3394,1951],{"class":465},[459,3396,1754],{"class":485},[459,3398,3399],{"class":489},"forgé",[459,3401,1760],{"class":485},[459,3403,593],{"class":465},[459,3405,3406],{"class":2197}," couleur",[459,3408,1951],{"class":465},[459,3410,1754],{"class":485},[459,3412,3413],{"class":489},"rouge",[459,3415,1760],{"class":485},[459,3417,2205],{"class":465},[459,3419,3421,3423,3426,3428,3430,3432,3435,3437,3440,3442],{"class":461,"line":3420},88,[459,3422,2506],{"class":1873},[459,3424,3425],{"class":799}," verdict",[459,3427,482],{"class":465},[459,3429,3140],{"class":799},[459,3431,1886],{"class":465},[459,3433,3434],{"class":1941},"validate",[459,3436,1047],{"class":2029},[459,3438,3439],{"class":799},"bad",[459,3441,2089],{"class":2029},[459,3443,1763],{"class":465},[459,3445,3447,3449,3451,3453,3455,3457,3460,3462,3464,3466,3468,3470,3472,3474,3476,3478,3480],{"class":461,"line":3446},89,[459,3448,2997],{"class":799},[459,3450,1886],{"class":465},[459,3452,2316],{"class":1941},[459,3454,1047],{"class":2029},[459,3456,803],{"class":485},[459,3458,3459],{"class":489},"   payload : ",[459,3461,2331],{"class":465},[459,3463,2387],{"class":799},[459,3465,1886],{"class":465},[459,3467,2392],{"class":1941},[459,3469,1047],{"class":2319},[459,3471,3439],{"class":799},[459,3473,2089],{"class":2319},[459,3475,1853],{"class":465},[459,3477,803],{"class":485},[459,3479,2089],{"class":2029},[459,3481,1763],{"class":465},[459,3483,3485,3487,3489,3491,3494,3496,3499,3501,3504,3506,3508,3511,3513,3515,3517,3520,3522,3524,3526,3528,3530,3532,3535,3537,3540,3542,3545,3547,3549,3551,3553,3555,3557,3559,3561,3563,3566,3568,3570,3572],{"class":461,"line":3484},90,[459,3486,2955],{"class":1739},[459,3488,1469],{"class":2029},[459,3490,2960],{"class":465},[459,3492,3493],{"class":799},"verdict",[459,3495,1886],{"class":465},[459,3497,3498],{"class":478},"success",[459,3500,2089],{"class":2029},[459,3502,3503],{"class":1739}," for",[459,3505,1469],{"class":2029},[459,3507,1874],{"class":1873},[459,3509,3510],{"class":799}," error",[459,3512,2638],{"class":465},[459,3514,3425],{"class":799},[459,3516,1886],{"class":465},[459,3518,3519],{"class":478},"errors",[459,3521,2089],{"class":2029},[459,3523,2311],{"class":799},[459,3525,1886],{"class":465},[459,3527,2316],{"class":1941},[459,3529,1047],{"class":2029},[459,3531,803],{"class":485},[459,3533,3534],{"class":489},"   ✗ ",[459,3536,2331],{"class":465},[459,3538,3539],{"class":799},"error",[459,3541,1886],{"class":465},[459,3543,3544],{"class":478},"path",[459,3546,2115],{"class":465},[459,3548,1754],{"class":485},[459,3550,1886],{"class":489},[459,3552,1760],{"class":485},[459,3554,1853],{"class":465},[459,3556,26],{"class":489},[459,3558,2331],{"class":465},[459,3560,3539],{"class":799},[459,3562,1886],{"class":465},[459,3564,3565],{"class":478},"message",[459,3567,1853],{"class":465},[459,3569,803],{"class":485},[459,3571,2089],{"class":2029},[459,3573,1763],{"class":465},[459,3575,3577],{"class":461,"line":3576},91,[459,3578,541],{"emptyLinePlaceholder":115},[459,3580,3582,3584,3587,3589,3591,3593,3595,3597,3600,3602,3604,3606,3608,3611],{"class":461,"line":3581},92,[459,3583,2506],{"class":1873},[459,3585,3586],{"class":799}," good",[459,3588,482],{"class":465},[459,3590,577],{"class":465},[459,3592,3368],{"class":2197},[459,3594,1951],{"class":465},[459,3596,1754],{"class":485},[459,3598,3599],{"class":489},"cuve-est",[459,3601,1760],{"class":485},[459,3603,593],{"class":465},[459,3605,3382],{"class":2197},[459,3607,1951],{"class":465},[459,3609,3610],{"class":2406}," 3.7",[459,3612,2205],{"class":465},[459,3614,3616,3618,3620,3622,3624,3626,3628,3630,3632,3634,3636,3638,3641,3643,3645,3647,3649],{"class":461,"line":3615},93,[459,3617,2997],{"class":799},[459,3619,1886],{"class":465},[459,3621,2316],{"class":1941},[459,3623,1047],{"class":2029},[459,3625,803],{"class":485},[459,3627,3459],{"class":489},[459,3629,2331],{"class":465},[459,3631,2387],{"class":799},[459,3633,1886],{"class":465},[459,3635,2392],{"class":1941},[459,3637,1047],{"class":2319},[459,3639,3640],{"class":799},"good",[459,3642,2089],{"class":2319},[459,3644,1853],{"class":465},[459,3646,803],{"class":485},[459,3648,2089],{"class":2029},[459,3650,1763],{"class":465},[459,3652,3654,3656,3658,3660,3662,3664,3666,3668,3670,3672,3674,3676,3678,3680,3682,3685,3687,3690,3692,3695,3697,3700,3702,3704,3706,3708],{"class":461,"line":3653},94,[459,3655,2997],{"class":799},[459,3657,1886],{"class":465},[459,3659,2316],{"class":1941},[459,3661,1047],{"class":2029},[459,3663,803],{"class":485},[459,3665,2446],{"class":465},[459,3667,3203],{"class":799},[459,3669,1886],{"class":465},[459,3671,3434],{"class":1941},[459,3673,1047],{"class":2319},[459,3675,3640],{"class":799},[459,3677,2089],{"class":2319},[459,3679,1886],{"class":465},[459,3681,3498],{"class":478},[459,3683,3684],{"class":465}," ?",[459,3686,1754],{"class":485},[459,3688,3689],{"class":489},"✓ accepté localement",[459,3691,1760],{"class":485},[459,3693,3694],{"class":465}," :",[459,3696,1754],{"class":485},[459,3698,3699],{"class":489},"✗ refusé",[459,3701,1760],{"class":485},[459,3703,1853],{"class":465},[459,3705,803],{"class":485},[459,3707,2089],{"class":2029},[459,3709,1763],{"class":465},[459,3711,3713],{"class":461,"line":3712},95,[459,3714,541],{"emptyLinePlaceholder":115},[459,3716,3718],{"class":461,"line":3717},96,[459,3719,3720],{"class":1675},"  \u002F\u002F ─── 5. Les appels ───────────────────────────────────────────────\n",[459,3722,3724,3726,3728,3730,3733,3735,3737,3739,3742,3745,3748,3750,3752],{"class":461,"line":3723},97,[459,3725,2535],{"class":1941},[459,3727,1047],{"class":2029},[459,3729,1760],{"class":485},[459,3731,3732],{"class":489},"5.",[459,3734,1760],{"class":485},[459,3736,593],{"class":465},[459,3738,1754],{"class":485},[459,3740,3741],{"class":489},"Les appels — la doublure ne distingue pas Rust d",[459,3743,3744],{"class":2324},"\\'",[459,3746,3747],{"class":489},"un frond local",[459,3749,1760],{"class":485},[459,3751,2089],{"class":2029},[459,3753,1763],{"class":465},[459,3755,3757],{"class":461,"line":3756},98,[459,3758,541],{"emptyLinePlaceholder":115},[459,3760,3762,3764,3767,3769,3771,3773,3775,3778,3780,3782,3784,3786],{"class":461,"line":3761},99,[459,3763,2506],{"class":1873},[459,3765,3766],{"class":799}," sensor",[459,3768,482],{"class":465},[459,3770,1942],{"class":1941},[459,3772,1047],{"class":2029},[459,3774,1760],{"class":485},[459,3776,3777],{"class":489},"sensor",[459,3779,1760],{"class":485},[459,3781,593],{"class":465},[459,3783,1960],{"class":799},[459,3785,2089],{"class":2029},[459,3787,1763],{"class":465},[459,3789,3791],{"class":461,"line":3790},100,[459,3792,541],{"emptyLinePlaceholder":115},[459,3794,3796,3798,3801,3803,3805,3807,3809,3811,3814,3816,3818,3820,3823,3825,3827,3829,3831,3833,3835,3837,3840],{"class":461,"line":3795},101,[459,3797,2506],{"class":1873},[459,3799,3800],{"class":799}," listed",[459,3802,482],{"class":465},[459,3804,1469],{"class":2029},[459,3806,2574],{"class":1739},[459,3808,3766],{"class":799},[459,3810,1886],{"class":465},[459,3812,3813],{"class":1941},"list",[459,3815,3211],{"class":2029},[459,3817,2035],{"class":1739},[459,3819,577],{"class":465},[459,3821,3822],{"class":2197}," id",[459,3824,1951],{"class":465},[459,3826,1955],{"class":1954},[459,3828,41],{"class":465},[459,3830,3368],{"class":2197},[459,3832,1951],{"class":465},[459,3834,1955],{"class":1954},[459,3836,1748],{"class":465},[459,3838,3839],{"class":2029},"[]",[459,3841,1763],{"class":465},[459,3843,3845,3847,3849,3851,3853,3855,3858,3860,3863,3865,3867,3869,3872,3874,3876,3878,3880,3882,3884,3887,3889,3891,3894,3896,3899,3901,3903,3905,3907,3909,3911,3913,3915,3917,3919,3921],{"class":461,"line":3844},102,[459,3846,2997],{"class":799},[459,3848,1886],{"class":465},[459,3850,2316],{"class":1941},[459,3852,1047],{"class":2029},[459,3854,803],{"class":485},[459,3856,3857],{"class":489},"   sensor.list()      → ",[459,3859,2331],{"class":465},[459,3861,3862],{"class":799},"listed",[459,3864,1886],{"class":465},[459,3866,3031],{"class":478},[459,3868,1853],{"class":465},[459,3870,3871],{"class":489}," relevés : ",[459,3873,2331],{"class":465},[459,3875,3862],{"class":799},[459,3877,1886],{"class":465},[459,3879,2430],{"class":1941},[459,3881,1047],{"class":2319},[459,3883,1047],{"class":465},[459,3885,3886],{"class":1947},"s",[459,3888,2089],{"class":465},[459,3890,2001],{"class":2000},[459,3892,3893],{"class":799}," s",[459,3895,1886],{"class":465},[459,3897,3898],{"class":478},"label",[459,3900,2089],{"class":2319},[459,3902,1886],{"class":465},[459,3904,2459],{"class":1941},[459,3906,1047],{"class":2319},[459,3908,1760],{"class":485},[459,3910,55],{"class":489},[459,3912,1760],{"class":485},[459,3914,2089],{"class":2319},[459,3916,1853],{"class":465},[459,3918,803],{"class":485},[459,3920,2089],{"class":2029},[459,3922,1763],{"class":465},[459,3924,3926],{"class":461,"line":3925},103,[459,3927,541],{"emptyLinePlaceholder":115},[459,3929,3931,3933,3936,3938,3940,3942,3944,3946,3949,3951,3953,3956,3958,3960,3962,3964,3966,3968,3970,3972,3974,3976,3978,3980,3982,3984,3987,3989,3991],{"class":461,"line":3930},104,[459,3932,2506],{"class":1873},[459,3934,3935],{"class":799}," created",[459,3937,482],{"class":465},[459,3939,1469],{"class":2029},[459,3941,2574],{"class":1739},[459,3943,3766],{"class":799},[459,3945,1886],{"class":465},[459,3947,3948],{"class":1941},"record",[459,3950,1047],{"class":2029},[459,3952,2581],{"class":465},[459,3954,3955],{"class":2197}," input",[459,3957,1951],{"class":465},[459,3959,3586],{"class":799},[459,3961,1748],{"class":465},[459,3963,2470],{"class":2029},[459,3965,2035],{"class":1739},[459,3967,577],{"class":465},[459,3969,3822],{"class":2197},[459,3971,1951],{"class":465},[459,3973,1955],{"class":1954},[459,3975,41],{"class":465},[459,3977,3392],{"class":2197},[459,3979,1951],{"class":465},[459,3981,1955],{"class":1954},[459,3983,41],{"class":465},[459,3985,3986],{"class":2197}," recordedAt",[459,3988,1951],{"class":465},[459,3990,1955],{"class":1954},[459,3992,2205],{"class":465},[459,3994,3996,3998,4000,4002,4004,4006,4009,4011,4014,4016,4018,4020,4022,4024],{"class":461,"line":3995},105,[459,3997,2997],{"class":799},[459,3999,1886],{"class":465},[459,4001,2316],{"class":1941},[459,4003,1047],{"class":2029},[459,4005,803],{"class":485},[459,4007,4008],{"class":489},"   sensor.record()    → ",[459,4010,2331],{"class":465},[459,4012,4013],{"class":799},"created",[459,4015,1886],{"class":465},[459,4017,1250],{"class":478},[459,4019,1853],{"class":465},[459,4021,803],{"class":485},[459,4023,2089],{"class":2029},[459,4025,1763],{"class":465},[459,4027,4029,4031,4033,4035,4037,4039,4042,4044,4046,4048,4050,4052,4055,4057,4059],{"class":461,"line":4028},106,[459,4030,2997],{"class":799},[459,4032,1886],{"class":465},[459,4034,2316],{"class":1941},[459,4036,1047],{"class":2029},[459,4038,803],{"class":485},[459,4040,4041],{"class":489},"                        checksum ",[459,4043,2331],{"class":465},[459,4045,4013],{"class":799},[459,4047,1886],{"class":465},[459,4049,1349],{"class":478},[459,4051,1853],{"class":465},[459,4053,4054],{"class":489}," — calculé en Rust, illisible d'ici",[459,4056,803],{"class":485},[459,4058,2089],{"class":2029},[459,4060,1763],{"class":465},[459,4062,4064,4066,4068,4070,4072,4074,4077,4079,4081,4083,4085,4087,4090,4092,4094],{"class":461,"line":4063},107,[459,4065,2997],{"class":799},[459,4067,1886],{"class":465},[459,4069,2316],{"class":1941},[459,4071,1047],{"class":2029},[459,4073,803],{"class":485},[459,4075,4076],{"class":489},"                        recordedAt ",[459,4078,2331],{"class":465},[459,4080,4013],{"class":799},[459,4082,1886],{"class":465},[459,4084,1286],{"class":478},[459,4086,1853],{"class":465},[459,4088,4089],{"class":489}," — lifecycle create:'now', réalisé là-bas",[459,4091,803],{"class":485},[459,4093,2089],{"class":2029},[459,4095,1763],{"class":465},[459,4097,4099],{"class":461,"line":4098},108,[459,4100,541],{"emptyLinePlaceholder":115},[459,4102,4104,4106,4109,4111,4113,4115,4117,4119,4122,4124,4126,4129,4131,4133,4135,4137,4139,4141,4143,4145,4147,4149,4151,4153,4155,4157,4159],{"class":461,"line":4103},109,[459,4105,2506],{"class":1873},[459,4107,4108],{"class":799}," found",[459,4110,482],{"class":465},[459,4112,1469],{"class":2029},[459,4114,2574],{"class":1739},[459,4116,3766],{"class":799},[459,4118,1886],{"class":465},[459,4120,4121],{"class":1941},"findById",[459,4123,1047],{"class":2029},[459,4125,2581],{"class":465},[459,4127,4128],{"class":2197}," params",[459,4130,1951],{"class":465},[459,4132,577],{"class":465},[459,4134,3822],{"class":2197},[459,4136,1951],{"class":465},[459,4138,3935],{"class":799},[459,4140,1886],{"class":465},[459,4142,1250],{"class":478},[459,4144,1748],{"class":465},[459,4146,1748],{"class":465},[459,4148,2470],{"class":2029},[459,4150,2035],{"class":1739},[459,4152,577],{"class":465},[459,4154,3368],{"class":2197},[459,4156,1951],{"class":465},[459,4158,1955],{"class":1954},[459,4160,2205],{"class":465},[459,4162,4164,4166,4168,4170,4172,4174,4177,4179,4182,4184,4186,4188,4190,4192],{"class":461,"line":4163},110,[459,4165,2997],{"class":799},[459,4167,1886],{"class":465},[459,4169,2316],{"class":1941},[459,4171,1047],{"class":2029},[459,4173,803],{"class":485},[459,4175,4176],{"class":489},"   sensor.findById()  → ",[459,4178,2331],{"class":465},[459,4180,4181],{"class":799},"found",[459,4183,1886],{"class":465},[459,4185,3898],{"class":478},[459,4187,1853],{"class":465},[459,4189,803],{"class":485},[459,4191,2089],{"class":2029},[459,4193,1763],{"class":465},[459,4195,4197],{"class":461,"line":4196},111,[459,4198,541],{"emptyLinePlaceholder":115},[459,4200,4202],{"class":461,"line":4201},112,[459,4203,4204],{"class":1675},"  \u002F\u002F ─── 6. L'erreur typée traverse ──────────────────────────────────\n",[459,4206,4208,4210,4212,4214,4217,4219,4221,4223,4226,4228,4231,4233,4235],{"class":461,"line":4207},113,[459,4209,2535],{"class":1941},[459,4211,1047],{"class":2029},[459,4213,1760],{"class":485},[459,4215,4216],{"class":489},"6.",[459,4218,1760],{"class":485},[459,4220,593],{"class":465},[459,4222,1754],{"class":485},[459,4224,4225],{"class":489},"L",[459,4227,3744],{"class":2324},[459,4229,4230],{"class":489},"erreur traverse le fil et redevient typée",[459,4232,1760],{"class":485},[459,4234,2089],{"class":2029},[459,4236,1763],{"class":465},[459,4238,4240],{"class":461,"line":4239},114,[459,4241,541],{"emptyLinePlaceholder":115},[459,4243,4245,4247,4249,4251,4254,4256],{"class":461,"line":4244},115,[459,4246,2628],{"class":1739},[459,4248,1469],{"class":2029},[459,4250,1874],{"class":1873},[459,4252,4253],{"class":799}," attempt",[459,4255,2638],{"class":465},[459,4257,4258],{"class":2029}," [\n",[459,4260,4262,4265,4268,4270,4272,4275,4277,4279,4282,4284,4287,4289,4291,4293,4295,4297,4299,4301,4303,4305,4307,4309,4311,4314,4316,4318,4320,4322],{"class":461,"line":4261},116,[459,4263,4264],{"class":465},"    {",[459,4266,4267],{"class":2197}," what",[459,4269,1951],{"class":465},[459,4271,1754],{"class":485},[459,4273,4274],{"class":489},"findById sur un id absent",[459,4276,1760],{"class":485},[459,4278,593],{"class":465},[459,4280,4281],{"class":1941}," run",[459,4283,1951],{"class":465},[459,4285,4286],{"class":465}," ()",[459,4288,2001],{"class":2000},[459,4290,3766],{"class":799},[459,4292,1886],{"class":465},[459,4294,4121],{"class":1941},[459,4296,1047],{"class":2029},[459,4298,2581],{"class":465},[459,4300,4128],{"class":2197},[459,4302,1951],{"class":465},[459,4304,577],{"class":465},[459,4306,3822],{"class":2197},[459,4308,1951],{"class":465},[459,4310,1754],{"class":485},[459,4312,4313],{"class":489},"nexiste-pas",[459,4315,1760],{"class":485},[459,4317,1748],{"class":465},[459,4319,1748],{"class":465},[459,4321,2089],{"class":2029},[459,4323,4324],{"class":465}," },\n",[459,4326,4328,4330,4332,4334,4336,4339,4341,4343,4345,4347,4349,4351,4353,4355,4357,4359,4361,4363,4365,4367,4369,4371],{"class":461,"line":4327},117,[459,4329,4264],{"class":465},[459,4331,4267],{"class":2197},[459,4333,1951],{"class":465},[459,4335,1754],{"class":485},[459,4337,4338],{"class":489},"record avec le payload refusé plus haut",[459,4340,1760],{"class":485},[459,4342,593],{"class":465},[459,4344,4281],{"class":1941},[459,4346,1951],{"class":465},[459,4348,4286],{"class":465},[459,4350,2001],{"class":2000},[459,4352,3766],{"class":799},[459,4354,1886],{"class":465},[459,4356,3948],{"class":1941},[459,4358,1047],{"class":2029},[459,4360,2581],{"class":465},[459,4362,3955],{"class":2197},[459,4364,1951],{"class":465},[459,4366,3361],{"class":799},[459,4368,1748],{"class":465},[459,4370,2089],{"class":2029},[459,4372,4324],{"class":465},[459,4374,4376,4379],{"class":461,"line":4375},118,[459,4377,4378],{"class":2029},"  ])",[459,4380,1797],{"class":465},[459,4382,4384,4387],{"class":461,"line":4383},119,[459,4385,4386],{"class":1739},"    try",[459,4388,1797],{"class":465},[459,4390,4392,4395,4397,4399,4402,4404],{"class":461,"line":4391},120,[459,4393,4394],{"class":1739},"      await",[459,4396,4253],{"class":799},[459,4398,1886],{"class":465},[459,4400,4401],{"class":1941},"run",[459,4403,3162],{"class":2029},[459,4405,1763],{"class":465},[459,4407,4409,4412,4415,4417,4419,4421],{"class":461,"line":4408},121,[459,4410,4411],{"class":465},"    }",[459,4413,4414],{"class":1739}," catch",[459,4416,1469],{"class":2029},[459,4418,3539],{"class":799},[459,4420,2089],{"class":2029},[459,4422,1797],{"class":465},[459,4424,4426,4428,4430,4432,4434,4436,4439,4442,4444,4446,4448],{"class":461,"line":4425},122,[459,4427,2096],{"class":1739},[459,4429,1469],{"class":2029},[459,4431,2960],{"class":465},[459,4433,1047],{"class":2029},[459,4435,3539],{"class":799},[459,4437,4438],{"class":465}," instanceof",[459,4440,4441],{"class":1954}," FougereError",[459,4443,2470],{"class":2029},[459,4445,2968],{"class":1739},[459,4447,3510],{"class":799},[459,4449,1763],{"class":465},[459,4451,4453,4455,4457,4459,4461,4463,4465,4468,4470,4473,4475,4477,4479],{"class":461,"line":4452},123,[459,4454,2679],{"class":799},[459,4456,1886],{"class":465},[459,4458,2316],{"class":1941},[459,4460,1047],{"class":2029},[459,4462,803],{"class":485},[459,4464,2446],{"class":465},[459,4466,4467],{"class":799},"attempt",[459,4469,1886],{"class":465},[459,4471,4472],{"class":478},"what",[459,4474,1853],{"class":465},[459,4476,803],{"class":485},[459,4478,2089],{"class":2029},[459,4480,1763],{"class":465},[459,4482,4484,4486,4488,4490,4492,4494,4496,4498,4500,4502,4504,4506,4508,4510,4512,4514,4516,4518,4520,4522],{"class":461,"line":4483},124,[459,4485,2679],{"class":799},[459,4487,1886],{"class":465},[459,4489,2316],{"class":1941},[459,4491,1047],{"class":2029},[459,4493,803],{"class":485},[459,4495,3534],{"class":489},[459,4497,2331],{"class":465},[459,4499,3539],{"class":799},[459,4501,1886],{"class":465},[459,4503,28],{"class":478},[459,4505,1853],{"class":465},[459,4507,26],{"class":489},[459,4509,2331],{"class":465},[459,4511,3539],{"class":799},[459,4513,1886],{"class":465},[459,4515,3565],{"class":478},[459,4517,1853],{"class":465},[459,4519,803],{"class":485},[459,4521,2089],{"class":2029},[459,4523,1763],{"class":465},[459,4525,4527,4529,4531,4533,4535,4538,4540,4542,4544,4546,4548,4550,4553,4555,4557,4559,4561,4563,4565,4567,4569,4571,4573,4575],{"class":461,"line":4526},125,[459,4528,2096],{"class":1739},[459,4530,1469],{"class":2029},[459,4532,3539],{"class":799},[459,4534,1886],{"class":465},[459,4536,4537],{"class":478},"details",[459,4539,2089],{"class":2029},[459,4541,2311],{"class":799},[459,4543,1886],{"class":465},[459,4545,2316],{"class":1941},[459,4547,1047],{"class":2029},[459,4549,803],{"class":485},[459,4551,4552],{"class":465},"     ${",[459,4554,2387],{"class":799},[459,4556,1886],{"class":465},[459,4558,2392],{"class":1941},[459,4560,1047],{"class":2319},[459,4562,3539],{"class":799},[459,4564,1886],{"class":465},[459,4566,4537],{"class":478},[459,4568,2089],{"class":2319},[459,4570,1853],{"class":465},[459,4572,803],{"class":485},[459,4574,2089],{"class":2029},[459,4576,1763],{"class":465},[459,4578,4580],{"class":461,"line":4579},126,[459,4581,2773],{"class":465},[459,4583,4585],{"class":461,"line":4584},127,[459,4586,2855],{"class":465},[459,4588,4590],{"class":461,"line":4589},128,[459,4591,541],{"emptyLinePlaceholder":115},[459,4593,4595,4597,4599,4601,4603,4605,4607,4610,4612,4615,4617,4619,4621],{"class":461,"line":4594},129,[459,4596,2997],{"class":799},[459,4598,1886],{"class":465},[459,4600,2316],{"class":1941},[459,4602,1047],{"class":2029},[459,4604,1760],{"class":485},[459,4606,2325],{"class":2324},[459,4608,4609],{"class":489},"[32m✓",[459,4611,2338],{"class":2324},[459,4613,4614],{"class":489},"[0m Un frond hors TypeScript, indistinguable derrière le contrat.",[459,4616,2421],{"class":2324},[459,4618,1760],{"class":485},[459,4620,2089],{"class":2029},[459,4622,1763],{"class":465},[459,4624,4626],{"class":461,"line":4625},130,[459,4627,2272],{"class":465},[459,4629,4631],{"class":461,"line":4630},131,[459,4632,541],{"emptyLinePlaceholder":115},[459,4634,4636,4639,4641,4643,4646,4648,4650,4652,4654,4656,4658,4660],{"class":461,"line":4635},132,[459,4637,4638],{"class":1941},"main",[459,4640,3162],{"class":2319},[459,4642,1886],{"class":465},[459,4644,4645],{"class":1941},"catch",[459,4647,1047],{"class":2319},[459,4649,1047],{"class":465},[459,4651,3539],{"class":1947},[459,4653,1951],{"class":465},[459,4655,2372],{"class":1954},[459,4657,2089],{"class":465},[459,4659,2001],{"class":2000},[459,4661,1797],{"class":465},[459,4663,4665,4667,4669,4671,4673,4675,4677],{"class":461,"line":4664},133,[459,4666,2955],{"class":1739},[459,4668,1469],{"class":2029},[459,4670,3539],{"class":799},[459,4672,4438],{"class":465},[459,4674,4441],{"class":1954},[459,4676,2089],{"class":2029},[459,4678,1797],{"class":465},[459,4680,4682,4685,4687,4689,4691,4693,4695,4698,4700,4702,4704,4706,4708,4710,4712,4714,4716,4718,4720,4722,4724],{"class":461,"line":4681},134,[459,4683,4684],{"class":799},"    console",[459,4686,1886],{"class":465},[459,4688,3539],{"class":1941},[459,4690,1047],{"class":2029},[459,4692,803],{"class":485},[459,4694,2421],{"class":2324},[459,4696,4697],{"class":489},"✗ ",[459,4699,2331],{"class":465},[459,4701,3539],{"class":799},[459,4703,1886],{"class":465},[459,4705,28],{"class":478},[459,4707,1853],{"class":465},[459,4709,26],{"class":489},[459,4711,2331],{"class":465},[459,4713,3539],{"class":799},[459,4715,1886],{"class":465},[459,4717,3565],{"class":478},[459,4719,1853],{"class":465},[459,4721,803],{"class":485},[459,4723,2089],{"class":2029},[459,4725,1763],{"class":465},[459,4727,4729,4731,4733,4735,4737,4739,4742,4744,4746,4748,4750,4752,4754,4756],{"class":461,"line":4728},135,[459,4730,4684],{"class":799},[459,4732,1886],{"class":465},[459,4734,3539],{"class":1941},[459,4736,1047],{"class":2029},[459,4738,803],{"class":485},[459,4740,4741],{"class":489},"  Le frond Rust tourne-t-il ? (cargo run, puis ",[459,4743,2331],{"class":465},[459,4745,2517],{"class":799},[459,4747,1853],{"class":465},[459,4749,2089],{"class":489},[459,4751,2421],{"class":2324},[459,4753,803],{"class":485},[459,4755,2089],{"class":2029},[459,4757,1763],{"class":465},[459,4759,4761,4764,4766,4769,4771,4773,4775],{"class":461,"line":4760},136,[459,4762,4763],{"class":799},"    process",[459,4765,1886],{"class":465},[459,4767,4768],{"class":1941},"exit",[459,4770,1047],{"class":2029},[459,4772,587],{"class":2406},[459,4774,2089],{"class":2029},[459,4776,1763],{"class":465},[459,4778,4780],{"class":461,"line":4779},137,[459,4781,2855],{"class":465},[459,4783,4785,4788,4790],{"class":461,"line":4784},138,[459,4786,4787],{"class":1739},"  throw",[459,4789,3510],{"class":799},[459,4791,1763],{"class":465},[459,4793,4795,4797,4799],{"class":461,"line":4794},139,[459,4796,1853],{"class":465},[459,4798,2089],{"class":2319},[459,4800,1763],{"class":465},[442,4802,4807],{"className":4803,"code":4804,"filename":4805,"language":4806,"meta":107,"style":107},"language-json shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","{\n  \"name\": \"rust-frond-demo\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"frond\": \"cargo run --release\",\n    \"consume\": \"pnpm dlx tsx consumer.ts\",\n    \"typecheck\": \"tsc -p tsconfig.json\"\n  },\n  \"dependencies\": {\n    \"@fougere\u002Fcore\": \"^0.30.0-alpha.5\",\n    \"@fougere\u002Fschema\": \"^0.30.0-alpha.5\",\n    \"@fougere\u002Ftransport-http\": \"^0.30.0-alpha.5\"\n  }\n}\n\n","package.json","json",[28,4808,4809,4814,4835,4851,4871,4884,4905,4925,4943,4948,4960,4980,4998,5015,5019],{"__ignoreMap":107},[459,4810,4811],{"class":461,"line":462},[459,4812,4813],{"class":465},"{\n",[459,4815,4816,4819,4822,4824,4826,4828,4831,4833],{"class":461,"line":108},[459,4817,4818],{"class":465},"  \"",[459,4820,479],{"class":4821},"s8ClO",[459,4823,590],{"class":465},[459,4825,1951],{"class":465},[459,4827,486],{"class":485},[459,4829,4830],{"class":489},"rust-frond-demo",[459,4832,590],{"class":485},[459,4834,940],{"class":465},[459,4836,4837,4839,4842,4844,4846,4849],{"class":461,"line":496},[459,4838,4818],{"class":465},[459,4840,4841],{"class":4821},"private",[459,4843,590],{"class":465},[459,4845,1951],{"class":465},[459,4847,4848],{"class":485}," true",[459,4850,940],{"class":465},[459,4852,4853,4855,4858,4860,4862,4864,4867,4869],{"class":461,"line":511},[459,4854,4818],{"class":465},[459,4856,4857],{"class":4821},"type",[459,4859,590],{"class":465},[459,4861,1951],{"class":465},[459,4863,486],{"class":485},[459,4865,4866],{"class":489},"module",[459,4868,590],{"class":485},[459,4870,940],{"class":465},[459,4872,4873,4875,4878,4880,4882],{"class":461,"line":526},[459,4874,4818],{"class":465},[459,4876,4877],{"class":4821},"scripts",[459,4879,590],{"class":465},[459,4881,1951],{"class":465},[459,4883,1797],{"class":465},[459,4885,4886,4889,4892,4894,4896,4898,4901,4903],{"class":461,"line":538},[459,4887,4888],{"class":465},"    \"",[459,4890,150],{"class":4891},"sWI7z",[459,4893,590],{"class":465},[459,4895,1951],{"class":465},[459,4897,486],{"class":485},[459,4899,4900],{"class":489},"cargo run --release",[459,4902,590],{"class":485},[459,4904,940],{"class":465},[459,4906,4907,4909,4912,4914,4916,4918,4921,4923],{"class":461,"line":544},[459,4908,4888],{"class":465},[459,4910,4911],{"class":4891},"consume",[459,4913,590],{"class":465},[459,4915,1951],{"class":465},[459,4917,486],{"class":485},[459,4919,4920],{"class":489},"pnpm dlx tsx consumer.ts",[459,4922,590],{"class":485},[459,4924,940],{"class":465},[459,4926,4927,4929,4932,4934,4936,4938,4941],{"class":461,"line":554},[459,4928,4888],{"class":465},[459,4930,4931],{"class":4891},"typecheck",[459,4933,590],{"class":465},[459,4935,1951],{"class":465},[459,4937,486],{"class":485},[459,4939,4940],{"class":489},"tsc -p tsconfig.json",[459,4942,493],{"class":485},[459,4944,4945],{"class":461,"line":569},[459,4946,4947],{"class":465},"  },\n",[459,4949,4950,4952,4954,4956,4958],{"class":461,"line":626},[459,4951,4818],{"class":465},[459,4953,549],{"class":4821},[459,4955,590],{"class":465},[459,4957,1951],{"class":465},[459,4959,1797],{"class":465},[459,4961,4962,4964,4967,4969,4971,4973,4976,4978],{"class":461,"line":665},[459,4963,4888],{"class":465},[459,4965,4966],{"class":4891},"@fougere\u002Fcore",[459,4968,590],{"class":465},[459,4970,1951],{"class":465},[459,4972,486],{"class":485},[459,4974,4975],{"class":489},"^0.30.0-alpha.5",[459,4977,590],{"class":485},[459,4979,940],{"class":465},[459,4981,4982,4984,4986,4988,4990,4992,4994,4996],{"class":461,"line":679},[459,4983,4888],{"class":465},[459,4985,1786],{"class":4891},[459,4987,590],{"class":465},[459,4989,1951],{"class":465},[459,4991,486],{"class":485},[459,4993,4975],{"class":489},[459,4995,590],{"class":485},[459,4997,940],{"class":465},[459,4999,5000,5002,5005,5007,5009,5011,5013],{"class":461,"line":718},[459,5001,4888],{"class":465},[459,5003,5004],{"class":4891},"@fougere\u002Ftransport-http",[459,5006,590],{"class":465},[459,5008,1951],{"class":465},[459,5010,486],{"class":485},[459,5012,4975],{"class":489},[459,5014,493],{"class":485},[459,5016,5017],{"class":461,"line":900},[459,5018,2855],{"class":465},[459,5020,5021],{"class":461,"line":906},[459,5022,2272],{"class":465},[442,5024,5028],{"className":5025,"code":5026,"filename":847,"language":5027,"meta":107,"style":107},"language-rust shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","\u002F\u002F! telemetry — un Frond Fougère écrit en Rust.\n\u002F\u002F!\n\u002F\u002F! Il ne connaît ni TypeScript, ni Kysely, ni Pothos, ni `entity({...})`.\n\u002F\u002F! Il honore exactement deux choses :\n\u002F\u002F!\n\u002F\u002F!   1. le contrat d'appel   — POST \u002F_fougere\u002Fcall, JSON-RPC 2.0, `method = \"address.op\"`,\n\u002F\u002F!                             `params` = l'InvocationContext ({ params, query, input, state })\n\u002F\u002F!   2. la carte d'identité  — `rpc.discover` rend ce qu'il héberge, schéma compris\n\u002F\u002F!\n\u002F\u002F! Tout le reste lui appartient : le stockage, le langage, le juge.\n\u002F\u002F! Côté TS personne ne peut le distinguer d'un frond local.\n\nuse axum::{extract::State, routing::post, Json, Router};\nuse serde::Serialize;\nuse serde_json::{json, Map, Value};\nuse std::sync::{Arc, Mutex};\n\n\u002F\u002F ─── La déclaration — une seule, deux projections ───────────────────\n\u002F\u002F\n\u002F\u002F `entity({...})` n'existe pas ici, mais son GESTE si : on énonce les champs une\n\u002F\u002F fois, et le type Rust comme la carte en sont dérivés. La version précédente de\n\u002F\u002F ce fichier les écrivait tous les deux à la main — `struct Sensor` d'un côté,\n\u002F\u002F le `json!` de la carte de l'autre — donc rien ne signalait qu'un champ ajouté\n\u002F\u002F à l'un manquait à l'autre. Une duplication tenue à la main est la seule chose\n\u002F\u002F que ce dépôt refuse partout ailleurs ; elle n'avait pas sa place dans la démo\n\u002F\u002F qui sert à le montrer.\n\u002F\u002F\n\u002F\u002F `macro_rules!` suffit — pas de crate proc-macro, pas de dépendance ajoutée.\n\u002F\u002F Ce qu'un vrai portage écrirait, c'est `#[derive(Fougere)]` sur la struct : le\n\u002F\u002F même geste, à un cran de confort au-dessus.\n\n\u002F\u002F\u002F `recorded_at` → `recordedAt` — la même convention que `#[serde(rename_all)]`,\n\u002F\u002F\u002F appliquée à la carte pour que les deux projections nomment le champ pareil.\nfn camel(snake: &str) -> String {\n    let mut out = String::with_capacity(snake.len());\n    let mut upper = false;\n    for ch in snake.chars() {\n        if ch == '_' {\n            upper = true;\n        } else if upper {\n            out.extend(ch.to_uppercase());\n            upper = false;\n        } else {\n            out.push(ch);\n        }\n    }\n    out\n}\n\nmacro_rules! frond_entity {\n    (\n        $name:ident as $card_name:literal {\n            $( $field:ident : $ty:ty , $req:ident , $schema:tt );* $(;)?\n        }\n    ) => {\n        #[derive(Clone, Serialize)]\n        #[serde(rename_all = \"camelCase\")]\n        struct $name {\n            $( $field: $ty, )*\n        }\n\n        \u002F\u002F\u002F La carte — dérivée de la déclaration ci-dessus, jamais tenue à côté.\n        fn sensor_card() -> Value {\n            let mut properties = Map::new();\n            let mut required: Vec\u003CValue> = Vec::new();\n            $(\n                let key = camel(stringify!($field));\n                if stringify!($req) == \"required\" {\n                    required.push(Value::String(key.clone()));\n                }\n                properties.insert(key, json!($schema));\n            )*\n            json!({\n                \"title\": $card_name,\n                \"type\": \"object\",\n                \"properties\": Value::Object(properties),\n                \"required\": Value::Array(required),\n                \"x-fougere-version\": 1,\n                \"x-fougere-vendor\": \"fougere\"\n            })\n        }\n    };\n}\n\n\u002F\u002F ─── Le domaine — il n'existe qu'ici ────────────────────────────────\n\u002F\u002F\n\u002F\u002F `shape` EST du JSON Schema, au niveau supérieur. Les trois autres axes\n\u002F\u002F (role, lifecycle, boundary) vivent sous `x-fougere`, le slot d'extension\n\u002F\u002F standard. `Card.toSchema()` rebuilds a living schema on the TypeScript side.\n\nfrond_entity! {\n    Sensor as \"sensor\" {\n        id: String, optional, {\n            \"type\": \"string\",\n            \"format\": \"uuid\",\n            \"description\": \"Identité — le frond la génère, jamais le client.\",\n            \"x-fougere\": {\n                \"role\": { \"primary\": true },\n                \"lifecycle\": { \"create\": { \"generate\": \"uuid\" } }\n            }\n        };\n        label: String, required, {\n            \"type\": \"string\",\n            \"minLength\": 2,\n            \"maxLength\": 40,\n            \"description\": \"Nom lisible de la sonde.\"\n        };\n        celsius: f64, required, {\n            \"type\": \"number\",\n            \"minimum\": -80,\n            \"maximum\": 80,\n            \"description\": \"Relevé, en degrés Celsius.\"\n        };\n        recorded_at: String, optional, {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"description\": \"Horodatage — estampillé à la création, immuable ensuite.\",\n            \"x-fougere\": {\n                \"lifecycle\": { \"create\": \"now\", \"update\": \"forbidden\" }\n            }\n        };\n        \u002F\u002F Calculé par le frond. L'axe boundary le ferme en entrée : jamais accepté d'un client.\n        checksum: String, optional, {\n            \"type\": \"string\",\n            \"description\": \"Empreinte calculée par le frond — lecture seule.\",\n            \"x-fougere\": { \"boundary\": { \"in\": \"closed\" } }\n        }\n    }\n}\n\nimpl Sensor {\n    fn record(label: String, celsius: f64) -> Self {\n        Sensor {\n            id: uuid::Uuid::new_v4().to_string(),\n            checksum: checksum(&label, celsius),\n            recorded_at: chrono::Utc::now().to_rfc3339(),\n            label,\n            celsius,\n        }\n    }\n}\n\n\u002F\u002F\u002F FNV-1a — le frond réalise, personne d'autre ne peut produire cette valeur.\nfn checksum(label: &str, celsius: f64) -> String {\n    let mut hash: u64 = 0xcbf2_9ce4_8422_2325;\n    let bytes = label.as_bytes().iter().copied().chain(celsius.to_le_bytes());\n    for byte in bytes {\n        hash ^= u64::from(byte);\n        hash = hash.wrapping_mul(0x0000_0100_0000_01b3);\n    }\n    format!(\"{hash:016x}\")\n}\n\n\u002F\u002F ─── La carte d'identité ────────────────────────────────────────────\n\u002F\u002F `sensor_card()` est dérivée de la déclaration plus haut, pas écrite ici.\n\nfn identity_card(state: &AppState) -> Value {\n    json!({\n        \"fronds\": [{\n            \"name\": \"telemetry\",\n            \u002F\u002F Ce qu'on STOCKE, ce qu'on peut APPELER, et ce qui SORT tout seul.\n            \"entities\": [{ \"name\": \"sensor\", \"schema\": sensor_card() }],\n            \"facades\": [{\n                \"name\": \"sensor\",\n                \"ops\": state.ops.clone()\n            }],\n            \u002F\u002F Ce frond n'annonce aucun fait. Le dire vaut mieux que l'omettre : la liste\n            \u002F\u002F vide est une réponse, l'absence est un doute sur la version d'en face.\n            \"facts\": []\n        }]\n    })\n}\n\n\u002F\u002F ─── Le vocabulaire d'erreur — celui que le TS sait revivre ─────────\n\u002F\u002F FougereError voyage entier dans `error.data` (jsonrpc.ts:28) ; `error.code`\n\u002F\u002F reste l'entier réservé par la spec, le code sémantique vit dans la donnée.\n\n#[derive(Serialize)]\nstruct Failure {\n    code: &'static str,\n    message: String,\n    address: &'static str,\n    operation: String,\n    #[serde(skip_serializing_if = \"Option::is_none\")]\n    details: Option\u003CValue>,\n}\n\nimpl Failure {\n    fn not_found(message: String, op: &str) -> Self {\n        Failure { code: \"NOT_FOUND\", message, address: \"sensor\", operation: op.into(), details: None }\n    }\n}\n\n\u002F\u002F\u002F Un refus de validation : le chemin fautif et ce qui cloche.\n#[derive(Serialize)]\nstruct Rejected {\n    path: String,\n    message: &'static str,\n}\n\n\u002F\u002F ─── Le juge — la validation juge, le domaine réalise ───────────────\n\u002F\u002F Volontairement minimal : il applique les règles que la carte annonce, rien\n\u002F\u002F de plus. Le point de la démo n'est pas la parité des messages, c'est que les\n\u002F\u002F deux côtés jugent la même chose à partir d'UNE déclaration.\n\n\u002F\u002F\u002F Ce qu'un client ne peut pas fournir — les trois exclusions de l'axe io :\n\u002F\u002F\u002F `role.primary`, `lifecycle.create === 'now'`, `boundary.in === 'closed'`.\nfn is_closed(key: &str) -> bool {\n    matches!(key, \"id\" | \"recordedAt\" | \"checksum\")\n}\n\nfn read_label(object: &Map\u003CString, Value>) -> Result\u003CString, Rejected> {\n    let fail = |message| Rejected { path: \"label\".into(), message };\n    match object.get(\"label\") {\n        None => Err(fail(\"Required\")),\n        Some(Value::String(value)) => match value.chars().count() {\n            count if count \u003C 2 => Err(fail(\"Too short (min 2)\")),\n            count if count > 40 => Err(fail(\"Too long (max 40)\")),\n            _ => Ok(value.clone()),\n        },\n        Some(_) => Err(fail(\"Expected a string\")),\n    }\n}\n\nfn read_celsius(object: &Map\u003CString, Value>) -> Result\u003Cf64, Rejected> {\n    let fail = |message| Rejected { path: \"celsius\".into(), message };\n    match object.get(\"celsius\").map(Value::as_f64) {\n        None => Err(fail(\"Required\")),\n        Some(None) => Err(fail(\"Expected a number\")),\n        Some(Some(value)) if value \u003C -80.0 => Err(fail(\"Below minimum (-80)\")),\n        Some(Some(value)) if value > 80.0 => Err(fail(\"Above maximum (80)\")),\n        Some(Some(value)) => Ok(value),\n    }\n}\n\nfn validator(input: &Value) -> Result\u003C(String, f64), Vec\u003CRejected>> {\n    let Some(object) = input.as_object() else {\n        return Err(vec![Rejected { path: \".\".into(), message: \"Expected an object\" }]);\n    };\n\n    let mut rejected: Vec\u003CRejected> = object\n        .keys()\n        .filter(|key| !matches!(key.as_str(), \"label\" | \"celsius\"))\n        .map(|key| Rejected {\n            path: key.clone(),\n            message: if is_closed(key) { \"Read-only\" } else { \"Unknown field\" },\n        })\n        .collect();\n\n    match (read_label(object), read_celsius(object)) {\n        (Ok(label), Ok(celsius)) if rejected.is_empty() => Ok((label, celsius)),\n        (label, celsius) => {\n            rejected.extend(label.err());\n            rejected.extend(celsius.err());\n            Err(rejected)\n        }\n    }\n}\n\n\u002F\u002F ─── Les opérations — la façade du frond ────────────────────────────\n\nstruct AppState {\n    sensors: Mutex\u003CVec\u003CSensor>>,\n    \u002F\u002F\u002F Les termes, pas seulement les noms : ce que l'op fait, et si elle lit ou\n    \u002F\u002F\u002F écrit. Un appelant qui rencontre ce frond sur le fil n'a rien d'autre.\n    ops: Value,\n}\n\nfn dispatch(state: &AppState, method: &str, params: &Value) -> Result\u003CValue, Failure> {\n    let (address, op) = method.split_once('.').unwrap_or((\"\", method));\n\n    match (address, op) {\n        (\"rpc\", \"discover\") => Ok(identity_card(state)),\n\n        (\"sensor\", \"list\") => {\n            let sensors = state.sensors.lock().unwrap();\n            Ok(json!(*sensors))\n        }\n\n        (\"sensor\", \"findById\") => {\n            let id = params.get(\"params\").and_then(|p| p.get(\"id\")).and_then(Value::as_str).unwrap_or(\"\");\n            let sensors = state.sensors.lock().unwrap();\n            sensors\n                .iter()\n                .find(|sensor| sensor.id == id)\n                .map(|sensor| json!(sensor))\n                .ok_or_else(|| Failure::not_found(format!(\"No sensor '{id}'\"), op))\n        }\n\n        (\"sensor\", \"record\") => {\n            let input = params.get(\"input\").cloned().unwrap_or(Value::Null);\n            match validator(&input) {\n                Ok((label, celsius)) => {\n                    let sensor = Sensor::record(label, celsius);\n                    state.sensors.lock().unwrap().push(sensor.clone());\n                    Ok(json!(sensor))\n                }\n                Err(rejected) => Err(Failure {\n                    code: \"VALIDATION_FAILED\",\n                    message: \"Validation failed\".into(),\n                    address: \"sensor\",\n                    operation: op.into(),\n                    details: Some(json!(rejected)),\n                }),\n            }\n        }\n\n        _ => Err(Failure::not_found(format!(\"Unknown operation '{method}' here\"), op)),\n    }\n}\n\n\u002F\u002F ─── Le fil — JSON-RPC 2.0, quelques lignes, aucune lib ─────────────\n\nasync fn call(State(state): State\u003CArc\u003CAppState>>, Json(request): Json\u003CValue>) -> Json\u003CValue> {\n    let id = request.get(\"id\").cloned().unwrap_or(Value::Null);\n    let method = request.get(\"method\").and_then(Value::as_str).unwrap_or(\"\");\n    let params = request.get(\"params\").cloned().unwrap_or(json!({}));\n\n    match dispatch(&state, method, &params) {\n        Ok(result) => Json(json!({ \"jsonrpc\": \"2.0\", \"id\": id, \"result\": result })),\n        Err(failure) => Json(json!({\n            \"jsonrpc\": \"2.0\",\n            \"id\": id,\n            \u002F\u002F -32000 = APP_ERROR : une défaillance applicative, pas un défaut de trame.\n            \"error\": { \"code\": -32000, \"message\": failure.message.clone(), \"data\": failure }\n        })),\n    }\n}\n\n#[tokio::main]\nasync fn main() {\n    let state = Arc::new(AppState {\n        sensors: Mutex::new(vec![\n            Sensor::record(\"cuve-nord\".into(), 4.2),\n            Sensor::record(\"cuve-sud\".into(), 5.1),\n        ]),\n        ops: json!([\n            { \"name\": \"list\",     \"kind\": \"query\",   \"output\": sensor_card(), \"description\": \"Toutes les mesures connues, la plus récente d'abord.\" },\n            { \"name\": \"findById\", \"kind\": \"query\",   \"output\": sensor_card(), \"description\": \"Une mesure, désignée par son identifiant.\" },\n            { \"name\": \"record\",   \"kind\": \"command\", \"output\": sensor_card(), \"description\": \"Enregistre une mesure. Le frond estampille l'instant et le checksum.\" }\n        ]),\n    });\n\n    let app = Router::new().route(\"\u002F_fougere\u002Fcall\", post(call)).with_state(state);\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:4200\").await.unwrap();\n\n    println!(\"telemetry (rust) — frond prêt sur http:\u002F\u002Flocalhost:4200\");\n    println!(\"  1 frond · 1 entité · 3 opérations · rpc.discover\");\n\n    axum::serve(listener, app).await.unwrap();\n}\n\n","rust",[28,5029,5030,5035,5040,5045,5050,5054,5059,5064,5069,5073,5078,5083,5087,5132,5146,5169,5193,5197,5202,5207,5212,5217,5222,5227,5232,5237,5242,5246,5251,5256,5261,5265,5270,5275,5306,5338,5353,5375,5394,5405,5420,5442,5452,5460,5476,5481,5485,5490,5494,5498,5508,5513,5541,5595,5599,5608,5628,5650,5662,5681,5685,5689,5694,5710,5732,5763,5768,5793,5818,5849,5854,5879,5884,5892,5910,5929,5952,5975,5991,6009,6014,6018,6023,6027,6031,6036,6040,6045,6050,6055,6059,6066,6081,6099,6118,6137,6157,6169,6195,6238,6243,6248,6265,6283,6298,6314,6331,6335,6353,6372,6391,6407,6424,6428,6445,6463,6482,6501,6513,6560,6564,6568,6573,6590,6608,6627,6669,6673,6677,6681,6685,6694,6728,6735,6764,6784,6810,6817,6824,6828,6833,6838,6843,6849,6882,6904,6948,6962,6985,7006,7011,7033,7038,7043,7049,7055,7060,7088,7096,7111,7130,7136,7181,7194,7213,7238,7244,7250,7256,7270,7276,7282,7287,7292,7298,7304,7310,7315,7329,7340,7359,7371,7387,7399,7423,7441,7446,7451,7460,7494,7558,7563,7568,7573,7579,7592,7602,7614,7629,7634,7639,7645,7651,7657,7663,7668,7674,7680,7707,7743,7748,7753,7799,7841,7867,7895,7936,7971,8003,8026,8032,8062,8067,8072,8077,8122,8161,8198,8221,8252,8302,8348,8373,8378,8383,8388,8435,8464,8512,8517,8522,8547,8557,8606,8623,8640,8681,8687,8697,8702,8728,8777,8794,8815,8834,8847,8852,8857,8862,8867,8873,8878,8888,8910,8916,8922,8934,8939,8944,9001,9049,9054,9071,9107,9112,9137,9166,9184,9189,9194,9219,9292,9317,9323,9333,9360,9381,9427,9432,9437,9462,9506,9522,9542,9569,9601,9617,9622,9645,9662,9683,9699,9715,9735,9741,9746,9751,9756,9803,9808,9813,9818,9824,9829,9891,9933,9979,10018,10023,10048,10116,10139,10158,10173,10179,10242,10248,10253,10258,10263,10276,10289,10312,10333,10368,10401,10407,10420,10491,10557,10624,10629,10635,10640,10690,10737,10742,10759,10775,10780,10811],{"__ignoreMap":107},[459,5031,5032],{"class":461,"line":462},[459,5033,5034],{"class":1675},"\u002F\u002F! telemetry — un Frond Fougère écrit en Rust.\n",[459,5036,5037],{"class":461,"line":108},[459,5038,5039],{"class":1675},"\u002F\u002F!\n",[459,5041,5042],{"class":461,"line":496},[459,5043,5044],{"class":1675},"\u002F\u002F! Il ne connaît ni TypeScript, ni Kysely, ni Pothos, ni `entity({...})`.\n",[459,5046,5047],{"class":461,"line":511},[459,5048,5049],{"class":1675},"\u002F\u002F! Il honore exactement deux choses :\n",[459,5051,5052],{"class":461,"line":526},[459,5053,5039],{"class":1675},[459,5055,5056],{"class":461,"line":538},[459,5057,5058],{"class":1675},"\u002F\u002F!   1. le contrat d'appel   — POST \u002F_fougere\u002Fcall, JSON-RPC 2.0, `method = \"address.op\"`,\n",[459,5060,5061],{"class":461,"line":544},[459,5062,5063],{"class":1675},"\u002F\u002F!                             `params` = l'InvocationContext ({ params, query, input, state })\n",[459,5065,5066],{"class":461,"line":554},[459,5067,5068],{"class":1675},"\u002F\u002F!   2. la carte d'identité  — `rpc.discover` rend ce qu'il héberge, schéma compris\n",[459,5070,5071],{"class":461,"line":569},[459,5072,5039],{"class":1675},[459,5074,5075],{"class":461,"line":626},[459,5076,5077],{"class":1675},"\u002F\u002F! Tout le reste lui appartient : le stockage, le langage, le juge.\n",[459,5079,5080],{"class":461,"line":665},[459,5081,5082],{"class":1675},"\u002F\u002F! Côté TS personne ne peut le distinguer d'un frond local.\n",[459,5084,5085],{"class":461,"line":679},[459,5086,541],{"emptyLinePlaceholder":115},[459,5088,5089,5093,5096,5099,5102,5105,5108,5110,5113,5115,5119,5121,5124,5126,5129],{"class":461,"line":718},[459,5090,5092],{"class":5091},"sWPpw","use",[459,5094,5095],{"class":1954}," axum",[459,5097,5098],{"class":465},"::{",[459,5100,5101],{"class":1954},"extract",[459,5103,5104],{"class":465},"::",[459,5106,5107],{"class":1954},"State",[459,5109,593],{"class":465},[459,5111,5112],{"class":1954}," routing",[459,5114,5104],{"class":465},[459,5116,5118],{"class":5117},"s2EDz","post",[459,5120,593],{"class":465},[459,5122,5123],{"class":1954}," Json",[459,5125,593],{"class":465},[459,5127,5128],{"class":1954}," Router",[459,5130,5131],{"class":465},"};\n",[459,5133,5134,5136,5139,5141,5144],{"class":461,"line":900},[459,5135,5092],{"class":5091},[459,5137,5138],{"class":1954}," serde",[459,5140,5104],{"class":465},[459,5142,5143],{"class":1954},"Serialize",[459,5145,1763],{"class":465},[459,5147,5148,5150,5153,5155,5157,5159,5162,5164,5167],{"class":461,"line":906},[459,5149,5092],{"class":5091},[459,5151,5152],{"class":1954}," serde_json",[459,5154,5098],{"class":465},[459,5156,4806],{"class":5117},[459,5158,593],{"class":465},[459,5160,5161],{"class":1954}," Map",[459,5163,593],{"class":465},[459,5165,5166],{"class":1954}," Value",[459,5168,5131],{"class":465},[459,5170,5171,5173,5176,5178,5181,5183,5186,5188,5191],{"class":461,"line":911},[459,5172,5092],{"class":5091},[459,5174,5175],{"class":1954}," std",[459,5177,5104],{"class":465},[459,5179,5180],{"class":1954},"sync",[459,5182,5098],{"class":465},[459,5184,5185],{"class":1954},"Arc",[459,5187,593],{"class":465},[459,5189,5190],{"class":1954}," Mutex",[459,5192,5131],{"class":465},[459,5194,5195],{"class":461,"line":943},[459,5196,541],{"emptyLinePlaceholder":115},[459,5198,5199],{"class":461,"line":966},[459,5200,5201],{"class":1675},"\u002F\u002F ─── La déclaration — une seule, deux projections ───────────────────\n",[459,5203,5204],{"class":461,"line":990},[459,5205,5206],{"class":1675},"\u002F\u002F\n",[459,5208,5209],{"class":461,"line":1014},[459,5210,5211],{"class":1675},"\u002F\u002F `entity({...})` n'existe pas ici, mais son GESTE si : on énonce les champs une\n",[459,5213,5214],{"class":461,"line":1019},[459,5215,5216],{"class":1675},"\u002F\u002F fois, et le type Rust comme la carte en sont dérivés. La version précédente de\n",[459,5218,5219],{"class":461,"line":1025},[459,5220,5221],{"class":1675},"\u002F\u002F ce fichier les écrivait tous les deux à la main — `struct Sensor` d'un côté,\n",[459,5223,5224],{"class":461,"line":1030},[459,5225,5226],{"class":1675},"\u002F\u002F le `json!` de la carte de l'autre — donc rien ne signalait qu'un champ ajouté\n",[459,5228,5229],{"class":461,"line":1044},[459,5230,5231],{"class":1675},"\u002F\u002F à l'un manquait à l'autre. Une duplication tenue à la main est la seule chose\n",[459,5233,5234],{"class":461,"line":1079},[459,5235,5236],{"class":1675},"\u002F\u002F que ce dépôt refuse partout ailleurs ; elle n'avait pas sa place dans la démo\n",[459,5238,5239],{"class":461,"line":1085},[459,5240,5241],{"class":1675},"\u002F\u002F qui sert à le montrer.\n",[459,5243,5244],{"class":461,"line":1090},[459,5245,5206],{"class":1675},[459,5247,5248],{"class":461,"line":1095},[459,5249,5250],{"class":1675},"\u002F\u002F `macro_rules!` suffit — pas de crate proc-macro, pas de dépendance ajoutée.\n",[459,5252,5253],{"class":461,"line":1101},[459,5254,5255],{"class":1675},"\u002F\u002F Ce qu'un vrai portage écrirait, c'est `#[derive(Fougere)]` sur la struct : le\n",[459,5257,5258],{"class":461,"line":1107},[459,5259,5260],{"class":1675},"\u002F\u002F même geste, à un cran de confort au-dessus.\n",[459,5262,5263],{"class":461,"line":1113},[459,5264,541],{"emptyLinePlaceholder":115},[459,5266,5267],{"class":461,"line":1119},[459,5268,5269],{"class":1675},"\u002F\u002F\u002F `recorded_at` → `recordedAt` — la même convention que `#[serde(rename_all)]`,\n",[459,5271,5272],{"class":461,"line":1124},[459,5273,5274],{"class":1675},"\u002F\u002F\u002F appliquée à la carte pour que les deux projections nomment le champ pareil.\n",[459,5276,5277,5280,5283,5285,5288,5290,5293,5296,5298,5301,5304],{"class":461,"line":1129},[459,5278,5279],{"class":5091},"fn",[459,5281,5282],{"class":1941}," camel",[459,5284,1047],{"class":465},[459,5286,5287],{"class":799},"snake",[459,5289,1951],{"class":465},[459,5291,5292],{"class":465}," &",[459,5294,5295],{"class":1954},"str",[459,5297,2089],{"class":465},[459,5299,5300],{"class":465}," ->",[459,5302,5303],{"class":1954}," String",[459,5305,1797],{"class":465},[459,5307,5308,5311,5314,5317,5319,5321,5323,5326,5328,5330,5332,5335],{"class":461,"line":1145},[459,5309,5310],{"class":1873},"    let",[459,5312,5313],{"class":1873}," mut",[459,5315,5316],{"class":799}," out ",[459,5318,1880],{"class":465},[459,5320,5303],{"class":1954},[459,5322,5104],{"class":465},[459,5324,5325],{"class":1941},"with_capacity",[459,5327,1047],{"class":465},[459,5329,5287],{"class":799},[459,5331,1886],{"class":465},[459,5333,5334],{"class":1941},"len",[459,5336,5337],{"class":465},"());\n",[459,5339,5340,5342,5344,5347,5349,5351],{"class":461,"line":1151},[459,5341,5310],{"class":1873},[459,5343,5313],{"class":1873},[459,5345,5346],{"class":799}," upper ",[459,5348,1880],{"class":465},[459,5350,746],{"class":485},[459,5352,1763],{"class":465},[459,5354,5355,5357,5360,5363,5366,5368,5371,5373],{"class":461,"line":1156},[459,5356,2654],{"class":1739},[459,5358,5359],{"class":799}," ch ",[459,5361,5362],{"class":5091},"in",[459,5364,5365],{"class":799}," snake",[459,5367,1886],{"class":465},[459,5369,5370],{"class":1941},"chars",[459,5372,3162],{"class":465},[459,5374,1797],{"class":465},[459,5376,5377,5380,5382,5385,5387,5390,5392],{"class":461,"line":1164},[459,5378,5379],{"class":1739},"        if",[459,5381,5359],{"class":799},[459,5383,5384],{"class":465},"==",[459,5386,1754],{"class":465},[459,5388,5389],{"class":489},"_",[459,5391,1760],{"class":465},[459,5393,1797],{"class":465},[459,5395,5396,5399,5401,5403],{"class":461,"line":1169},[459,5397,5398],{"class":799},"            upper ",[459,5400,1880],{"class":465},[459,5402,4848],{"class":485},[459,5404,1763],{"class":465},[459,5406,5407,5410,5413,5416,5418],{"class":461,"line":1182},[459,5408,5409],{"class":465},"        }",[459,5411,5412],{"class":1739}," else",[459,5414,5415],{"class":1739}," if",[459,5417,5346],{"class":799},[459,5419,4813],{"class":465},[459,5421,5422,5425,5427,5430,5432,5435,5437,5440],{"class":461,"line":1195},[459,5423,5424],{"class":799},"            out",[459,5426,1886],{"class":465},[459,5428,5429],{"class":1941},"extend",[459,5431,1047],{"class":465},[459,5433,5434],{"class":799},"ch",[459,5436,1886],{"class":465},[459,5438,5439],{"class":1941},"to_uppercase",[459,5441,5337],{"class":465},[459,5443,5444,5446,5448,5450],{"class":461,"line":1200},[459,5445,5398],{"class":799},[459,5447,1880],{"class":465},[459,5449,746],{"class":485},[459,5451,1763],{"class":465},[459,5453,5454,5456,5458],{"class":461,"line":1228},[459,5455,5409],{"class":465},[459,5457,5412],{"class":1739},[459,5459,1797],{"class":465},[459,5461,5462,5464,5466,5469,5471,5473],{"class":461,"line":1234},[459,5463,5424],{"class":799},[459,5465,1886],{"class":465},[459,5467,5468],{"class":1941},"push",[459,5470,1047],{"class":465},[459,5472,5434],{"class":799},[459,5474,5475],{"class":465},");\n",[459,5477,5478],{"class":461,"line":1270},[459,5479,5480],{"class":465},"        }\n",[459,5482,5483],{"class":461,"line":1306},[459,5484,2773],{"class":465},[459,5486,5487],{"class":461,"line":1333},[459,5488,5489],{"class":799},"    out\n",[459,5491,5492],{"class":461,"line":1368},[459,5493,2272],{"class":465},[459,5495,5496],{"class":461,"line":1373},[459,5497,541],{"emptyLinePlaceholder":115},[459,5499,5500,5503,5506],{"class":461,"line":1381},[459,5501,5502],{"class":1941},"macro_rules!",[459,5504,5505],{"class":1941}," frond_entity",[459,5507,1797],{"class":465},[459,5509,5510],{"class":461,"line":1386},[459,5511,5512],{"class":465},"    (\n",[459,5514,5515,5518,5520,5522,5525,5528,5531,5534,5536,5539],{"class":461,"line":1418},[459,5516,5517],{"class":465},"        $",[459,5519,479],{"class":799},[459,5521,1951],{"class":465},[459,5523,5524],{"class":799},"ident ",[459,5526,5527],{"class":5091},"as",[459,5529,5530],{"class":465}," $",[459,5532,5533],{"class":799},"card_name",[459,5535,1951],{"class":465},[459,5537,5538],{"class":799},"literal ",[459,5540,4813],{"class":465},[459,5542,5543,5546,5548,5551,5553,5555,5557,5559,5562,5564,5567,5569,5571,5574,5576,5578,5580,5582,5584,5586,5589,5592],{"class":461,"line":1441},[459,5544,5545],{"class":465},"            $(",[459,5547,5530],{"class":465},[459,5549,5550],{"class":799},"field",[459,5552,1951],{"class":465},[459,5554,5524],{"class":799},[459,5556,1951],{"class":465},[459,5558,5530],{"class":465},[459,5560,5561],{"class":799},"ty",[459,5563,1951],{"class":465},[459,5565,5566],{"class":799},"ty ",[459,5568,593],{"class":465},[459,5570,5530],{"class":465},[459,5572,5573],{"class":799},"req",[459,5575,1951],{"class":465},[459,5577,5524],{"class":799},[459,5579,593],{"class":465},[459,5581,5530],{"class":465},[459,5583,2947],{"class":799},[459,5585,1951],{"class":465},[459,5587,5588],{"class":799},"tt ",[459,5590,5591],{"class":465},");*",[459,5593,5594],{"class":465}," $(;)?\n",[459,5596,5597],{"class":461,"line":1457},[459,5598,5480],{"class":465},[459,5600,5601,5604,5606],{"class":461,"line":1482},[459,5602,5603],{"class":465},"    )",[459,5605,2001],{"class":465},[459,5607,1797],{"class":465},[459,5609,5610,5613,5615,5617,5620,5622,5625],{"class":461,"line":1506},[459,5611,5612],{"class":465},"        #[",[459,5614,656],{"class":799},[459,5616,1047],{"class":465},[459,5618,5619],{"class":1954},"Clone",[459,5621,593],{"class":465},[459,5623,5624],{"class":1954}," Serialize",[459,5626,5627],{"class":465},")]\n",[459,5629,5630,5632,5634,5636,5639,5641,5643,5646,5648],{"class":461,"line":1512},[459,5631,5612],{"class":465},[459,5633,629],{"class":799},[459,5635,1047],{"class":465},[459,5637,5638],{"class":799},"rename_all ",[459,5640,1880],{"class":465},[459,5642,486],{"class":485},[459,5644,5645],{"class":489},"camelCase",[459,5647,590],{"class":485},[459,5649,5627],{"class":465},[459,5651,5652,5655,5657,5660],{"class":461,"line":1537},[459,5653,5654],{"class":1873},"        struct",[459,5656,5530],{"class":465},[459,5658,5659],{"class":799},"name ",[459,5661,4813],{"class":465},[459,5663,5664,5666,5668,5670,5672,5674,5676,5678],{"class":461,"line":1543},[459,5665,5545],{"class":465},[459,5667,5530],{"class":465},[459,5669,5550],{"class":799},[459,5671,1951],{"class":465},[459,5673,5530],{"class":465},[459,5675,5561],{"class":799},[459,5677,593],{"class":465},[459,5679,5680],{"class":465}," )*\n",[459,5682,5683],{"class":461,"line":1548},[459,5684,5480],{"class":465},[459,5686,5687],{"class":461,"line":1556},[459,5688,541],{"emptyLinePlaceholder":115},[459,5690,5691],{"class":461,"line":1561},[459,5692,5693],{"class":1675},"        \u002F\u002F\u002F La carte — dérivée de la déclaration ci-dessus, jamais tenue à côté.\n",[459,5695,5696,5699,5702,5704,5706,5708],{"class":461,"line":1586},[459,5697,5698],{"class":5091},"        fn",[459,5700,5701],{"class":1941}," sensor_card",[459,5703,3162],{"class":465},[459,5705,5300],{"class":465},[459,5707,5166],{"class":1954},[459,5709,1797],{"class":465},[459,5711,5712,5715,5717,5720,5722,5724,5726,5729],{"class":461,"line":1602},[459,5713,5714],{"class":1873},"            let",[459,5716,5313],{"class":1873},[459,5718,5719],{"class":799}," properties ",[459,5721,1880],{"class":465},[459,5723,5161],{"class":1954},[459,5725,5104],{"class":465},[459,5727,5728],{"class":1941},"new",[459,5730,5731],{"class":465},"();\n",[459,5733,5734,5736,5738,5741,5743,5746,5748,5751,5753,5755,5757,5759,5761],{"class":461,"line":1645},[459,5735,5714],{"class":1873},[459,5737,5313],{"class":1873},[459,5739,5740],{"class":799}," required",[459,5742,1951],{"class":465},[459,5744,5745],{"class":1954}," Vec",[459,5747,1973],{"class":465},[459,5749,5750],{"class":1954},"Value",[459,5752,2164],{"class":465},[459,5754,482],{"class":465},[459,5756,5745],{"class":1954},[459,5758,5104],{"class":465},[459,5760,5728],{"class":1941},[459,5762,5731],{"class":465},[459,5764,5765],{"class":461,"line":1651},[459,5766,5767],{"class":465},"            $(\n",[459,5769,5770,5773,5776,5778,5780,5782,5785,5788,5790],{"class":461,"line":2867},[459,5771,5772],{"class":1873},"                let",[459,5774,5775],{"class":799}," key ",[459,5777,1880],{"class":465},[459,5779,5282],{"class":1941},[459,5781,1047],{"class":465},[459,5783,5784],{"class":1941},"stringify!",[459,5786,5787],{"class":465},"($",[459,5789,5550],{"class":799},[459,5791,5792],{"class":465},"));\n",[459,5794,5795,5798,5801,5803,5805,5807,5810,5812,5814,5816],{"class":461,"line":2893},[459,5796,5797],{"class":1739},"                if",[459,5799,5800],{"class":1941}," stringify!",[459,5802,5787],{"class":465},[459,5804,5573],{"class":799},[459,5806,2089],{"class":465},[459,5808,5809],{"class":465}," ==",[459,5811,486],{"class":485},[459,5813,3045],{"class":489},[459,5815,590],{"class":485},[459,5817,1797],{"class":465},[459,5819,5820,5823,5825,5827,5829,5831,5833,5836,5838,5841,5843,5846],{"class":461,"line":2898},[459,5821,5822],{"class":799},"                    required",[459,5824,1886],{"class":465},[459,5826,5468],{"class":1941},[459,5828,1047],{"class":465},[459,5830,5750],{"class":1954},[459,5832,5104],{"class":465},[459,5834,5835],{"class":1941},"String",[459,5837,1047],{"class":465},[459,5839,5840],{"class":799},"key",[459,5842,1886],{"class":465},[459,5844,5845],{"class":1941},"clone",[459,5847,5848],{"class":465},"()));\n",[459,5850,5851],{"class":461,"line":2904},[459,5852,5853],{"class":465},"                }\n",[459,5855,5856,5859,5861,5864,5866,5868,5870,5873,5875,5877],{"class":461,"line":2910},[459,5857,5858],{"class":799},"                properties",[459,5860,1886],{"class":465},[459,5862,5863],{"class":1941},"insert",[459,5865,1047],{"class":465},[459,5867,5840],{"class":799},[459,5869,593],{"class":465},[459,5871,5872],{"class":1941}," json!",[459,5874,5787],{"class":465},[459,5876,2947],{"class":799},[459,5878,5792],{"class":465},[459,5880,5881],{"class":461,"line":2952},[459,5882,5883],{"class":465},"            )*\n",[459,5885,5886,5889],{"class":461,"line":2989},[459,5887,5888],{"class":1941},"            json!",[459,5890,5891],{"class":465},"({\n",[459,5893,5894,5897,5900,5902,5904,5906,5908],{"class":461,"line":2994},[459,5895,5896],{"class":485},"                \"",[459,5898,5899],{"class":489},"title",[459,5901,590],{"class":485},[459,5903,1951],{"class":465},[459,5905,5530],{"class":465},[459,5907,5533],{"class":799},[459,5909,940],{"class":465},[459,5911,5912,5914,5916,5918,5920,5922,5925,5927],{"class":461,"line":3070},[459,5913,5896],{"class":485},[459,5915,4857],{"class":489},[459,5917,590],{"class":485},[459,5919,1951],{"class":465},[459,5921,486],{"class":485},[459,5923,5924],{"class":489},"object",[459,5926,590],{"class":485},[459,5928,940],{"class":465},[459,5930,5931,5933,5935,5937,5939,5941,5943,5945,5947,5949],{"class":461,"line":3092},[459,5932,5896],{"class":485},[459,5934,3024],{"class":489},[459,5936,590],{"class":485},[459,5938,1951],{"class":465},[459,5940,5166],{"class":1954},[459,5942,5104],{"class":465},[459,5944,3010],{"class":1941},[459,5946,1047],{"class":465},[459,5948,3024],{"class":799},[459,5950,5951],{"class":465},"),\n",[459,5953,5954,5956,5958,5960,5962,5964,5966,5969,5971,5973],{"class":461,"line":3097},[459,5955,5896],{"class":485},[459,5957,3045],{"class":489},[459,5959,590],{"class":485},[459,5961,1951],{"class":465},[459,5963,5166],{"class":1954},[459,5965,5104],{"class":465},[459,5967,5968],{"class":1941},"Array",[459,5970,1047],{"class":465},[459,5972,3045],{"class":799},[459,5974,5951],{"class":465},[459,5976,5977,5979,5982,5984,5986,5989],{"class":461,"line":3103},[459,5978,5896],{"class":485},[459,5980,5981],{"class":489},"x-fougere-version",[459,5983,590],{"class":485},[459,5985,1951],{"class":465},[459,5987,5988],{"class":2406}," 1",[459,5990,940],{"class":465},[459,5992,5993,5995,5998,6000,6002,6004,6007],{"class":461,"line":3130},[459,5994,5896],{"class":485},[459,5996,5997],{"class":489},"x-fougere-vendor",[459,5999,590],{"class":485},[459,6001,1951],{"class":465},[459,6003,486],{"class":485},[459,6005,6006],{"class":489},"fougere",[459,6008,493],{"class":485},[459,6010,6011],{"class":461,"line":3135},[459,6012,6013],{"class":465},"            })\n",[459,6015,6016],{"class":461,"line":3167},[459,6017,5480],{"class":465},[459,6019,6020],{"class":461,"line":3242},[459,6021,6022],{"class":465},"    };\n",[459,6024,6025],{"class":461,"line":3313},[459,6026,2272],{"class":465},[459,6028,6029],{"class":461,"line":3318},[459,6030,541],{"emptyLinePlaceholder":115},[459,6032,6033],{"class":461,"line":3324},[459,6034,6035],{"class":1675},"\u002F\u002F ─── Le domaine — il n'existe qu'ici ────────────────────────────────\n",[459,6037,6038],{"class":461,"line":3351},[459,6039,5206],{"class":1675},[459,6041,6042],{"class":461,"line":3356},[459,6043,6044],{"class":1675},"\u002F\u002F `shape` EST du JSON Schema, au niveau supérieur. Les trois autres axes\n",[459,6046,6047],{"class":461,"line":3420},[459,6048,6049],{"class":1675},"\u002F\u002F (role, lifecycle, boundary) vivent sous `x-fougere`, le slot d'extension\n",[459,6051,6052],{"class":461,"line":3446},[459,6053,6054],{"class":1675},"\u002F\u002F standard. `Card.toSchema()` rebuilds a living schema on the TypeScript side.\n",[459,6056,6057],{"class":461,"line":3484},[459,6058,541],{"emptyLinePlaceholder":115},[459,6060,6061,6064],{"class":461,"line":3576},[459,6062,6063],{"class":1941},"frond_entity!",[459,6065,1797],{"class":465},[459,6067,6068,6071,6073,6075,6077,6079],{"class":461,"line":3581},[459,6069,6070],{"class":1954},"    Sensor",[459,6072,2035],{"class":5091},[459,6074,486],{"class":485},[459,6076,3777],{"class":489},[459,6078,590],{"class":485},[459,6080,1797],{"class":465},[459,6082,6083,6086,6088,6090,6092,6095,6097],{"class":461,"line":3615},[459,6084,6085],{"class":799},"        id",[459,6087,1951],{"class":465},[459,6089,5303],{"class":1954},[459,6091,593],{"class":465},[459,6093,6094],{"class":799}," optional",[459,6096,593],{"class":465},[459,6098,1797],{"class":465},[459,6100,6101,6104,6106,6108,6110,6112,6114,6116],{"class":461,"line":3653},[459,6102,6103],{"class":485},"            \"",[459,6105,4857],{"class":489},[459,6107,590],{"class":485},[459,6109,1951],{"class":465},[459,6111,486],{"class":485},[459,6113,1976],{"class":489},[459,6115,590],{"class":485},[459,6117,940],{"class":465},[459,6119,6120,6122,6125,6127,6129,6131,6133,6135],{"class":461,"line":3712},[459,6121,6103],{"class":485},[459,6123,6124],{"class":489},"format",[459,6126,590],{"class":485},[459,6128,1951],{"class":465},[459,6130,486],{"class":485},[459,6132,682],{"class":489},[459,6134,590],{"class":485},[459,6136,940],{"class":465},[459,6138,6139,6141,6144,6146,6148,6150,6153,6155],{"class":461,"line":3717},[459,6140,6103],{"class":485},[459,6142,6143],{"class":489},"description",[459,6145,590],{"class":485},[459,6147,1951],{"class":465},[459,6149,486],{"class":485},[459,6151,6152],{"class":489},"Identité — le frond la génère, jamais le client.",[459,6154,590],{"class":485},[459,6156,940],{"class":465},[459,6158,6159,6161,6163,6165,6167],{"class":461,"line":3723},[459,6160,6103],{"class":485},[459,6162,1187],{"class":489},[459,6164,590],{"class":485},[459,6166,1951],{"class":465},[459,6168,1797],{"class":465},[459,6170,6171,6173,6176,6178,6180,6182,6184,6187,6189,6191,6193],{"class":461,"line":3756},[459,6172,5896],{"class":485},[459,6174,6175],{"class":489},"role",[459,6177,590],{"class":485},[459,6179,1951],{"class":465},[459,6181,577],{"class":465},[459,6183,486],{"class":485},[459,6185,6186],{"class":489},"primary",[459,6188,590],{"class":485},[459,6190,1951],{"class":465},[459,6192,4848],{"class":485},[459,6194,4324],{"class":465},[459,6196,6197,6199,6202,6204,6206,6208,6210,6213,6215,6217,6219,6221,6224,6226,6228,6230,6232,6234,6236],{"class":461,"line":3761},[459,6198,5896],{"class":485},[459,6200,6201],{"class":489},"lifecycle",[459,6203,590],{"class":485},[459,6205,1951],{"class":465},[459,6207,577],{"class":465},[459,6209,486],{"class":485},[459,6211,6212],{"class":489},"create",[459,6214,590],{"class":485},[459,6216,1951],{"class":465},[459,6218,577],{"class":465},[459,6220,486],{"class":485},[459,6222,6223],{"class":489},"generate",[459,6225,590],{"class":485},[459,6227,1951],{"class":465},[459,6229,486],{"class":485},[459,6231,682],{"class":489},[459,6233,590],{"class":485},[459,6235,1748],{"class":465},[459,6237,623],{"class":465},[459,6239,6240],{"class":461,"line":3790},[459,6241,6242],{"class":465},"            }\n",[459,6244,6245],{"class":461,"line":3795},[459,6246,6247],{"class":465},"        };\n",[459,6249,6250,6253,6255,6257,6259,6261,6263],{"class":461,"line":3844},[459,6251,6252],{"class":799},"        label",[459,6254,1951],{"class":465},[459,6256,5303],{"class":1954},[459,6258,593],{"class":465},[459,6260,5740],{"class":799},[459,6262,593],{"class":465},[459,6264,1797],{"class":465},[459,6266,6267,6269,6271,6273,6275,6277,6279,6281],{"class":461,"line":3925},[459,6268,6103],{"class":485},[459,6270,4857],{"class":489},[459,6272,590],{"class":485},[459,6274,1951],{"class":465},[459,6276,486],{"class":485},[459,6278,1976],{"class":489},[459,6280,590],{"class":485},[459,6282,940],{"class":465},[459,6284,6285,6287,6290,6292,6294,6296],{"class":461,"line":3930},[459,6286,6103],{"class":485},[459,6288,6289],{"class":489},"minLength",[459,6291,590],{"class":485},[459,6293,1951],{"class":465},[459,6295,2407],{"class":2406},[459,6297,940],{"class":465},[459,6299,6300,6302,6305,6307,6309,6312],{"class":461,"line":3995},[459,6301,6103],{"class":485},[459,6303,6304],{"class":489},"maxLength",[459,6306,590],{"class":485},[459,6308,1951],{"class":465},[459,6310,6311],{"class":2406}," 40",[459,6313,940],{"class":465},[459,6315,6316,6318,6320,6322,6324,6326,6329],{"class":461,"line":4028},[459,6317,6103],{"class":485},[459,6319,6143],{"class":489},[459,6321,590],{"class":485},[459,6323,1951],{"class":465},[459,6325,486],{"class":485},[459,6327,6328],{"class":489},"Nom lisible de la sonde.",[459,6330,493],{"class":485},[459,6332,6333],{"class":461,"line":4063},[459,6334,6247],{"class":465},[459,6336,6337,6340,6342,6345,6347,6349,6351],{"class":461,"line":4098},[459,6338,6339],{"class":799},"        celsius",[459,6341,1951],{"class":465},[459,6343,6344],{"class":1954}," f64",[459,6346,593],{"class":465},[459,6348,5740],{"class":799},[459,6350,593],{"class":465},[459,6352,1797],{"class":465},[459,6354,6355,6357,6359,6361,6363,6365,6368,6370],{"class":461,"line":4103},[459,6356,6103],{"class":485},[459,6358,4857],{"class":489},[459,6360,590],{"class":485},[459,6362,1951],{"class":465},[459,6364,486],{"class":485},[459,6366,6367],{"class":489},"number",[459,6369,590],{"class":485},[459,6371,940],{"class":465},[459,6373,6374,6376,6379,6381,6383,6386,6389],{"class":461,"line":4163},[459,6375,6103],{"class":485},[459,6377,6378],{"class":489},"minimum",[459,6380,590],{"class":485},[459,6382,1951],{"class":465},[459,6384,6385],{"class":465}," -",[459,6387,6388],{"class":2406},"80",[459,6390,940],{"class":465},[459,6392,6393,6395,6398,6400,6402,6405],{"class":461,"line":4196},[459,6394,6103],{"class":485},[459,6396,6397],{"class":489},"maximum",[459,6399,590],{"class":485},[459,6401,1951],{"class":465},[459,6403,6404],{"class":2406}," 80",[459,6406,940],{"class":465},[459,6408,6409,6411,6413,6415,6417,6419,6422],{"class":461,"line":4201},[459,6410,6103],{"class":485},[459,6412,6143],{"class":489},[459,6414,590],{"class":485},[459,6416,1951],{"class":465},[459,6418,486],{"class":485},[459,6420,6421],{"class":489},"Relevé, en degrés Celsius.",[459,6423,493],{"class":485},[459,6425,6426],{"class":461,"line":4207},[459,6427,6247],{"class":465},[459,6429,6430,6433,6435,6437,6439,6441,6443],{"class":461,"line":4239},[459,6431,6432],{"class":799},"        recorded_at",[459,6434,1951],{"class":465},[459,6436,5303],{"class":1954},[459,6438,593],{"class":465},[459,6440,6094],{"class":799},[459,6442,593],{"class":465},[459,6444,1797],{"class":465},[459,6446,6447,6449,6451,6453,6455,6457,6459,6461],{"class":461,"line":4244},[459,6448,6103],{"class":485},[459,6450,4857],{"class":489},[459,6452,590],{"class":485},[459,6454,1951],{"class":465},[459,6456,486],{"class":485},[459,6458,1976],{"class":489},[459,6460,590],{"class":485},[459,6462,940],{"class":465},[459,6464,6465,6467,6469,6471,6473,6475,6478,6480],{"class":461,"line":4261},[459,6466,6103],{"class":485},[459,6468,6124],{"class":489},[459,6470,590],{"class":485},[459,6472,1951],{"class":465},[459,6474,486],{"class":485},[459,6476,6477],{"class":489},"date-time",[459,6479,590],{"class":485},[459,6481,940],{"class":465},[459,6483,6484,6486,6488,6490,6492,6494,6497,6499],{"class":461,"line":4327},[459,6485,6103],{"class":485},[459,6487,6143],{"class":489},[459,6489,590],{"class":485},[459,6491,1951],{"class":465},[459,6493,486],{"class":485},[459,6495,6496],{"class":489},"Horodatage — estampillé à la création, immuable ensuite.",[459,6498,590],{"class":485},[459,6500,940],{"class":465},[459,6502,6503,6505,6507,6509,6511],{"class":461,"line":4375},[459,6504,6103],{"class":485},[459,6506,1187],{"class":489},[459,6508,590],{"class":485},[459,6510,1951],{"class":465},[459,6512,1797],{"class":465},[459,6514,6515,6517,6519,6521,6523,6525,6527,6529,6531,6533,6535,6538,6540,6542,6544,6547,6549,6551,6553,6556,6558],{"class":461,"line":4383},[459,6516,5896],{"class":485},[459,6518,6201],{"class":489},[459,6520,590],{"class":485},[459,6522,1951],{"class":465},[459,6524,577],{"class":465},[459,6526,486],{"class":485},[459,6528,6212],{"class":489},[459,6530,590],{"class":485},[459,6532,1951],{"class":465},[459,6534,486],{"class":485},[459,6536,6537],{"class":489},"now",[459,6539,590],{"class":485},[459,6541,593],{"class":465},[459,6543,486],{"class":485},[459,6545,6546],{"class":489},"update",[459,6548,590],{"class":485},[459,6550,1951],{"class":465},[459,6552,486],{"class":485},[459,6554,6555],{"class":489},"forbidden",[459,6557,590],{"class":485},[459,6559,623],{"class":465},[459,6561,6562],{"class":461,"line":4391},[459,6563,6242],{"class":465},[459,6565,6566],{"class":461,"line":4408},[459,6567,6247],{"class":465},[459,6569,6570],{"class":461,"line":4425},[459,6571,6572],{"class":1675},"        \u002F\u002F Calculé par le frond. L'axe boundary le ferme en entrée : jamais accepté d'un client.\n",[459,6574,6575,6578,6580,6582,6584,6586,6588],{"class":461,"line":4452},[459,6576,6577],{"class":799},"        checksum",[459,6579,1951],{"class":465},[459,6581,5303],{"class":1954},[459,6583,593],{"class":465},[459,6585,6094],{"class":799},[459,6587,593],{"class":465},[459,6589,1797],{"class":465},[459,6591,6592,6594,6596,6598,6600,6602,6604,6606],{"class":461,"line":4483},[459,6593,6103],{"class":485},[459,6595,4857],{"class":489},[459,6597,590],{"class":485},[459,6599,1951],{"class":465},[459,6601,486],{"class":485},[459,6603,1976],{"class":489},[459,6605,590],{"class":485},[459,6607,940],{"class":465},[459,6609,6610,6612,6614,6616,6618,6620,6623,6625],{"class":461,"line":4526},[459,6611,6103],{"class":485},[459,6613,6143],{"class":489},[459,6615,590],{"class":485},[459,6617,1951],{"class":465},[459,6619,486],{"class":485},[459,6621,6622],{"class":489},"Empreinte calculée par le frond — lecture seule.",[459,6624,590],{"class":485},[459,6626,940],{"class":465},[459,6628,6629,6631,6633,6635,6637,6639,6641,6644,6646,6648,6650,6652,6654,6656,6658,6660,6663,6665,6667],{"class":461,"line":4579},[459,6630,6103],{"class":485},[459,6632,1187],{"class":489},[459,6634,590],{"class":485},[459,6636,1951],{"class":465},[459,6638,577],{"class":465},[459,6640,486],{"class":485},[459,6642,6643],{"class":489},"boundary",[459,6645,590],{"class":485},[459,6647,1951],{"class":465},[459,6649,577],{"class":465},[459,6651,486],{"class":485},[459,6653,5362],{"class":489},[459,6655,590],{"class":485},[459,6657,1951],{"class":465},[459,6659,486],{"class":485},[459,6661,6662],{"class":489},"closed",[459,6664,590],{"class":485},[459,6666,1748],{"class":465},[459,6668,623],{"class":465},[459,6670,6671],{"class":461,"line":4584},[459,6672,5480],{"class":465},[459,6674,6675],{"class":461,"line":4589},[459,6676,2773],{"class":465},[459,6678,6679],{"class":461,"line":4594},[459,6680,2272],{"class":465},[459,6682,6683],{"class":461,"line":4625},[459,6684,541],{"emptyLinePlaceholder":115},[459,6686,6687,6690,6692],{"class":461,"line":4630},[459,6688,6689],{"class":5091},"impl",[459,6691,3140],{"class":1954},[459,6693,1797],{"class":465},[459,6695,6696,6699,6702,6704,6706,6708,6710,6712,6714,6716,6718,6720,6722,6726],{"class":461,"line":4635},[459,6697,6698],{"class":5091},"    fn",[459,6700,6701],{"class":1941}," record",[459,6703,1047],{"class":465},[459,6705,3898],{"class":799},[459,6707,1951],{"class":465},[459,6709,5303],{"class":1954},[459,6711,593],{"class":465},[459,6713,3382],{"class":799},[459,6715,1951],{"class":465},[459,6717,6344],{"class":1954},[459,6719,2089],{"class":465},[459,6721,5300],{"class":465},[459,6723,6725],{"class":6724},"sTljH"," Self",[459,6727,1797],{"class":465},[459,6729,6730,6733],{"class":461,"line":4664},[459,6731,6732],{"class":1954},"        Sensor",[459,6734,1797],{"class":465},[459,6736,6737,6740,6742,6745,6747,6750,6752,6755,6758,6761],{"class":461,"line":4681},[459,6738,6739],{"class":799},"            id",[459,6741,1951],{"class":465},[459,6743,6744],{"class":1954}," uuid",[459,6746,5104],{"class":465},[459,6748,6749],{"class":1954},"Uuid",[459,6751,5104],{"class":465},[459,6753,6754],{"class":1941},"new_v4",[459,6756,6757],{"class":465},"().",[459,6759,6760],{"class":1941},"to_string",[459,6762,6763],{"class":465},"(),\n",[459,6765,6766,6769,6771,6773,6776,6778,6780,6782],{"class":461,"line":4728},[459,6767,6768],{"class":799},"            checksum",[459,6770,1951],{"class":465},[459,6772,3392],{"class":1941},[459,6774,6775],{"class":465},"(&",[459,6777,3898],{"class":799},[459,6779,593],{"class":465},[459,6781,3382],{"class":799},[459,6783,5951],{"class":465},[459,6785,6786,6789,6791,6794,6796,6799,6801,6803,6805,6808],{"class":461,"line":4760},[459,6787,6788],{"class":799},"            recorded_at",[459,6790,1951],{"class":465},[459,6792,6793],{"class":1954}," chrono",[459,6795,5104],{"class":465},[459,6797,6798],{"class":1954},"Utc",[459,6800,5104],{"class":465},[459,6802,6537],{"class":1941},[459,6804,6757],{"class":465},[459,6806,6807],{"class":1941},"to_rfc3339",[459,6809,6763],{"class":465},[459,6811,6812,6815],{"class":461,"line":4779},[459,6813,6814],{"class":799},"            label",[459,6816,940],{"class":465},[459,6818,6819,6822],{"class":461,"line":4784},[459,6820,6821],{"class":799},"            celsius",[459,6823,940],{"class":465},[459,6825,6826],{"class":461,"line":4794},[459,6827,5480],{"class":465},[459,6829,6831],{"class":461,"line":6830},140,[459,6832,2773],{"class":465},[459,6834,6836],{"class":461,"line":6835},141,[459,6837,2272],{"class":465},[459,6839,6841],{"class":461,"line":6840},142,[459,6842,541],{"emptyLinePlaceholder":115},[459,6844,6846],{"class":461,"line":6845},143,[459,6847,6848],{"class":1675},"\u002F\u002F\u002F FNV-1a — le frond réalise, personne d'autre ne peut produire cette valeur.\n",[459,6850,6852,6854,6856,6858,6860,6862,6864,6866,6868,6870,6872,6874,6876,6878,6880],{"class":461,"line":6851},144,[459,6853,5279],{"class":5091},[459,6855,3392],{"class":1941},[459,6857,1047],{"class":465},[459,6859,3898],{"class":799},[459,6861,1951],{"class":465},[459,6863,5292],{"class":465},[459,6865,5295],{"class":1954},[459,6867,593],{"class":465},[459,6869,3382],{"class":799},[459,6871,1951],{"class":465},[459,6873,6344],{"class":1954},[459,6875,2089],{"class":465},[459,6877,5300],{"class":465},[459,6879,5303],{"class":1954},[459,6881,1797],{"class":465},[459,6883,6885,6887,6889,6892,6894,6897,6899,6902],{"class":461,"line":6884},145,[459,6886,5310],{"class":1873},[459,6888,5313],{"class":1873},[459,6890,6891],{"class":799}," hash",[459,6893,1951],{"class":465},[459,6895,6896],{"class":1954}," u64",[459,6898,482],{"class":465},[459,6900,6901],{"class":2406}," 0xcbf2_9ce4_8422_2325",[459,6903,1763],{"class":465},[459,6905,6907,6909,6912,6914,6916,6918,6921,6923,6926,6928,6931,6933,6936,6938,6941,6943,6946],{"class":461,"line":6906},146,[459,6908,5310],{"class":1873},[459,6910,6911],{"class":799}," bytes ",[459,6913,1880],{"class":465},[459,6915,3368],{"class":799},[459,6917,1886],{"class":465},[459,6919,6920],{"class":1941},"as_bytes",[459,6922,6757],{"class":465},[459,6924,6925],{"class":1941},"iter",[459,6927,6757],{"class":465},[459,6929,6930],{"class":1941},"copied",[459,6932,6757],{"class":465},[459,6934,6935],{"class":1941},"chain",[459,6937,1047],{"class":465},[459,6939,6940],{"class":799},"celsius",[459,6942,1886],{"class":465},[459,6944,6945],{"class":1941},"to_le_bytes",[459,6947,5337],{"class":465},[459,6949,6951,6953,6956,6958,6960],{"class":461,"line":6950},147,[459,6952,2654],{"class":1739},[459,6954,6955],{"class":799}," byte ",[459,6957,5362],{"class":5091},[459,6959,6911],{"class":799},[459,6961,4813],{"class":465},[459,6963,6965,6968,6971,6973,6975,6978,6980,6983],{"class":461,"line":6964},148,[459,6966,6967],{"class":799},"        hash ",[459,6969,6970],{"class":465},"^=",[459,6972,6896],{"class":1954},[459,6974,5104],{"class":465},[459,6976,6977],{"class":1941},"from",[459,6979,1047],{"class":465},[459,6981,6982],{"class":799},"byte",[459,6984,5475],{"class":465},[459,6986,6988,6990,6992,6994,6996,6999,7001,7004],{"class":461,"line":6987},149,[459,6989,6967],{"class":799},[459,6991,1880],{"class":465},[459,6993,6891],{"class":799},[459,6995,1886],{"class":465},[459,6997,6998],{"class":1941},"wrapping_mul",[459,7000,1047],{"class":465},[459,7002,7003],{"class":2406},"0x0000_0100_0000_01b3",[459,7005,5475],{"class":465},[459,7007,7009],{"class":461,"line":7008},150,[459,7010,2773],{"class":465},[459,7012,7014,7017,7019,7021,7023,7026,7028,7030],{"class":461,"line":7013},151,[459,7015,7016],{"class":1941},"    format!",[459,7018,1047],{"class":465},[459,7020,590],{"class":485},[459,7022,2581],{"class":465},[459,7024,7025],{"class":489},"hash:016x",[459,7027,1853],{"class":465},[459,7029,590],{"class":485},[459,7031,7032],{"class":465},")\n",[459,7034,7036],{"class":461,"line":7035},152,[459,7037,2272],{"class":465},[459,7039,7041],{"class":461,"line":7040},153,[459,7042,541],{"emptyLinePlaceholder":115},[459,7044,7046],{"class":461,"line":7045},154,[459,7047,7048],{"class":1675},"\u002F\u002F ─── La carte d'identité ────────────────────────────────────────────\n",[459,7050,7052],{"class":461,"line":7051},155,[459,7053,7054],{"class":1675},"\u002F\u002F `sensor_card()` est dérivée de la déclaration plus haut, pas écrite ici.\n",[459,7056,7058],{"class":461,"line":7057},156,[459,7059,541],{"emptyLinePlaceholder":115},[459,7061,7063,7065,7068,7070,7073,7075,7077,7080,7082,7084,7086],{"class":461,"line":7062},157,[459,7064,5279],{"class":5091},[459,7066,7067],{"class":1941}," identity_card",[459,7069,1047],{"class":465},[459,7071,7072],{"class":799},"state",[459,7074,1951],{"class":465},[459,7076,5292],{"class":465},[459,7078,7079],{"class":1954},"AppState",[459,7081,2089],{"class":465},[459,7083,5300],{"class":465},[459,7085,5166],{"class":1954},[459,7087,1797],{"class":465},[459,7089,7091,7094],{"class":461,"line":7090},158,[459,7092,7093],{"class":1941},"    json!",[459,7095,5891],{"class":465},[459,7097,7099,7102,7104,7106,7108],{"class":461,"line":7098},159,[459,7100,7101],{"class":485},"        \"",[459,7103,2645],{"class":489},[459,7105,590],{"class":485},[459,7107,1951],{"class":465},[459,7109,7110],{"class":465}," [{\n",[459,7112,7114,7116,7118,7120,7122,7124,7126,7128],{"class":461,"line":7113},160,[459,7115,6103],{"class":485},[459,7117,479],{"class":489},[459,7119,590],{"class":485},[459,7121,1951],{"class":465},[459,7123,486],{"class":485},[459,7125,806],{"class":489},[459,7127,590],{"class":485},[459,7129,940],{"class":465},[459,7131,7133],{"class":461,"line":7132},161,[459,7134,7135],{"class":1675},"            \u002F\u002F Ce qu'on STOCKE, ce qu'on peut APPELER, et ce qui SORT tout seul.\n",[459,7137,7139,7141,7143,7145,7147,7150,7152,7154,7156,7158,7160,7162,7164,7166,7168,7170,7172,7174,7176,7178],{"class":461,"line":7138},162,[459,7140,6103],{"class":485},[459,7142,2935],{"class":489},[459,7144,590],{"class":485},[459,7146,1951],{"class":465},[459,7148,7149],{"class":465}," [{",[459,7151,486],{"class":485},[459,7153,479],{"class":489},[459,7155,590],{"class":485},[459,7157,1951],{"class":465},[459,7159,486],{"class":485},[459,7161,3777],{"class":489},[459,7163,590],{"class":485},[459,7165,593],{"class":465},[459,7167,486],{"class":485},[459,7169,2947],{"class":489},[459,7171,590],{"class":485},[459,7173,1951],{"class":465},[459,7175,5701],{"class":1941},[459,7177,3162],{"class":465},[459,7179,7180],{"class":465}," }],\n",[459,7182,7184,7186,7188,7190,7192],{"class":461,"line":7183},163,[459,7185,6103],{"class":485},[459,7187,2670],{"class":489},[459,7189,590],{"class":485},[459,7191,1951],{"class":465},[459,7193,7110],{"class":465},[459,7195,7197,7199,7201,7203,7205,7207,7209,7211],{"class":461,"line":7196},164,[459,7198,5896],{"class":485},[459,7200,479],{"class":489},[459,7202,590],{"class":485},[459,7204,1951],{"class":465},[459,7206,486],{"class":485},[459,7208,3777],{"class":489},[459,7210,590],{"class":485},[459,7212,940],{"class":465},[459,7214,7216,7218,7220,7222,7224,7227,7229,7231,7233,7235],{"class":461,"line":7215},165,[459,7217,5896],{"class":485},[459,7219,2722],{"class":489},[459,7221,590],{"class":485},[459,7223,1951],{"class":465},[459,7225,7226],{"class":799}," state",[459,7228,1886],{"class":465},[459,7230,2722],{"class":799},[459,7232,1886],{"class":465},[459,7234,5845],{"class":1941},[459,7236,7237],{"class":465},"()\n",[459,7239,7241],{"class":461,"line":7240},166,[459,7242,7243],{"class":465},"            }],\n",[459,7245,7247],{"class":461,"line":7246},167,[459,7248,7249],{"class":1675},"            \u002F\u002F Ce frond n'annonce aucun fait. Le dire vaut mieux que l'omettre : la liste\n",[459,7251,7253],{"class":461,"line":7252},168,[459,7254,7255],{"class":1675},"            \u002F\u002F vide est une réponse, l'absence est un doute sur la version d'en face.\n",[459,7257,7259,7261,7263,7265,7267],{"class":461,"line":7258},169,[459,7260,6103],{"class":485},[459,7262,2798],{"class":489},[459,7264,590],{"class":485},[459,7266,1951],{"class":465},[459,7268,7269],{"class":465}," []\n",[459,7271,7273],{"class":461,"line":7272},170,[459,7274,7275],{"class":465},"        }]\n",[459,7277,7279],{"class":461,"line":7278},171,[459,7280,7281],{"class":465},"    })\n",[459,7283,7285],{"class":461,"line":7284},172,[459,7286,2272],{"class":465},[459,7288,7290],{"class":461,"line":7289},173,[459,7291,541],{"emptyLinePlaceholder":115},[459,7293,7295],{"class":461,"line":7294},174,[459,7296,7297],{"class":1675},"\u002F\u002F ─── Le vocabulaire d'erreur — celui que le TS sait revivre ─────────\n",[459,7299,7301],{"class":461,"line":7300},175,[459,7302,7303],{"class":1675},"\u002F\u002F FougereError voyage entier dans `error.data` (jsonrpc.ts:28) ; `error.code`\n",[459,7305,7307],{"class":461,"line":7306},176,[459,7308,7309],{"class":1675},"\u002F\u002F reste l'entier réservé par la spec, le code sémantique vit dans la donnée.\n",[459,7311,7313],{"class":461,"line":7312},177,[459,7314,541],{"emptyLinePlaceholder":115},[459,7316,7318,7321,7323,7325,7327],{"class":461,"line":7317},178,[459,7319,7320],{"class":465},"#[",[459,7322,656],{"class":799},[459,7324,1047],{"class":465},[459,7326,5143],{"class":1954},[459,7328,5627],{"class":465},[459,7330,7332,7335,7338],{"class":461,"line":7331},179,[459,7333,7334],{"class":1873},"struct",[459,7336,7337],{"class":1954}," Failure",[459,7339,1797],{"class":465},[459,7341,7343,7346,7348,7351,7354,7357],{"class":461,"line":7342},180,[459,7344,7345],{"class":799},"    code",[459,7347,1951],{"class":465},[459,7349,7350],{"class":465}," &'",[459,7352,7353],{"class":1954},"static",[459,7355,7356],{"class":1954}," str",[459,7358,940],{"class":465},[459,7360,7362,7365,7367,7369],{"class":461,"line":7361},181,[459,7363,7364],{"class":799},"    message",[459,7366,1951],{"class":465},[459,7368,5303],{"class":1954},[459,7370,940],{"class":465},[459,7372,7374,7377,7379,7381,7383,7385],{"class":461,"line":7373},182,[459,7375,7376],{"class":799},"    address",[459,7378,1951],{"class":465},[459,7380,7350],{"class":465},[459,7382,7353],{"class":1954},[459,7384,7356],{"class":1954},[459,7386,940],{"class":465},[459,7388,7390,7393,7395,7397],{"class":461,"line":7389},183,[459,7391,7392],{"class":799},"    operation",[459,7394,1951],{"class":465},[459,7396,5303],{"class":1954},[459,7398,940],{"class":465},[459,7400,7402,7405,7407,7409,7412,7414,7416,7419,7421],{"class":461,"line":7401},184,[459,7403,7404],{"class":465},"    #[",[459,7406,629],{"class":799},[459,7408,1047],{"class":465},[459,7410,7411],{"class":799},"skip_serializing_if ",[459,7413,1880],{"class":465},[459,7415,486],{"class":485},[459,7417,7418],{"class":489},"Option::is_none",[459,7420,590],{"class":485},[459,7422,5627],{"class":465},[459,7424,7426,7429,7431,7434,7436,7438],{"class":461,"line":7425},185,[459,7427,7428],{"class":799},"    details",[459,7430,1951],{"class":465},[459,7432,7433],{"class":1954}," Option",[459,7435,1973],{"class":465},[459,7437,5750],{"class":1954},[459,7439,7440],{"class":465},">,\n",[459,7442,7444],{"class":461,"line":7443},186,[459,7445,2272],{"class":465},[459,7447,7449],{"class":461,"line":7448},187,[459,7450,541],{"emptyLinePlaceholder":115},[459,7452,7454,7456,7458],{"class":461,"line":7453},188,[459,7455,6689],{"class":5091},[459,7457,7337],{"class":1954},[459,7459,1797],{"class":465},[459,7461,7463,7465,7468,7470,7472,7474,7476,7478,7480,7482,7484,7486,7488,7490,7492],{"class":461,"line":7462},189,[459,7464,6698],{"class":5091},[459,7466,7467],{"class":1941}," not_found",[459,7469,1047],{"class":465},[459,7471,3565],{"class":799},[459,7473,1951],{"class":465},[459,7475,5303],{"class":1954},[459,7477,593],{"class":465},[459,7479,2198],{"class":799},[459,7481,1951],{"class":465},[459,7483,5292],{"class":465},[459,7485,5295],{"class":1954},[459,7487,2089],{"class":465},[459,7489,5300],{"class":465},[459,7491,6725],{"class":6724},[459,7493,1797],{"class":465},[459,7495,7497,7500,7502,7505,7507,7509,7512,7514,7516,7519,7521,7523,7525,7527,7529,7531,7533,7536,7538,7540,7542,7545,7548,7551,7553,7556],{"class":461,"line":7496},190,[459,7498,7499],{"class":1954},"        Failure",[459,7501,577],{"class":465},[459,7503,7504],{"class":799}," code",[459,7506,1951],{"class":465},[459,7508,486],{"class":485},[459,7510,7511],{"class":489},"NOT_FOUND",[459,7513,590],{"class":485},[459,7515,593],{"class":465},[459,7517,7518],{"class":799}," message",[459,7520,593],{"class":465},[459,7522,2192],{"class":799},[459,7524,1951],{"class":465},[459,7526,486],{"class":485},[459,7528,3777],{"class":489},[459,7530,590],{"class":485},[459,7532,593],{"class":465},[459,7534,7535],{"class":799}," operation",[459,7537,1951],{"class":465},[459,7539,2198],{"class":799},[459,7541,1886],{"class":465},[459,7543,7544],{"class":1941},"into",[459,7546,7547],{"class":465},"(),",[459,7549,7550],{"class":799}," details",[459,7552,1951],{"class":465},[459,7554,7555],{"class":1954}," None",[459,7557,623],{"class":465},[459,7559,7561],{"class":461,"line":7560},191,[459,7562,2773],{"class":465},[459,7564,7566],{"class":461,"line":7565},192,[459,7567,2272],{"class":465},[459,7569,7571],{"class":461,"line":7570},193,[459,7572,541],{"emptyLinePlaceholder":115},[459,7574,7576],{"class":461,"line":7575},194,[459,7577,7578],{"class":1675},"\u002F\u002F\u002F Un refus de validation : le chemin fautif et ce qui cloche.\n",[459,7580,7582,7584,7586,7588,7590],{"class":461,"line":7581},195,[459,7583,7320],{"class":465},[459,7585,656],{"class":799},[459,7587,1047],{"class":465},[459,7589,5143],{"class":1954},[459,7591,5627],{"class":465},[459,7593,7595,7597,7600],{"class":461,"line":7594},196,[459,7596,7334],{"class":1873},[459,7598,7599],{"class":1954}," Rejected",[459,7601,1797],{"class":465},[459,7603,7605,7608,7610,7612],{"class":461,"line":7604},197,[459,7606,7607],{"class":799},"    path",[459,7609,1951],{"class":465},[459,7611,5303],{"class":1954},[459,7613,940],{"class":465},[459,7615,7617,7619,7621,7623,7625,7627],{"class":461,"line":7616},198,[459,7618,7364],{"class":799},[459,7620,1951],{"class":465},[459,7622,7350],{"class":465},[459,7624,7353],{"class":1954},[459,7626,7356],{"class":1954},[459,7628,940],{"class":465},[459,7630,7632],{"class":461,"line":7631},199,[459,7633,2272],{"class":465},[459,7635,7637],{"class":461,"line":7636},200,[459,7638,541],{"emptyLinePlaceholder":115},[459,7640,7642],{"class":461,"line":7641},201,[459,7643,7644],{"class":1675},"\u002F\u002F ─── Le juge — la validation juge, le domaine réalise ───────────────\n",[459,7646,7648],{"class":461,"line":7647},202,[459,7649,7650],{"class":1675},"\u002F\u002F Volontairement minimal : il applique les règles que la carte annonce, rien\n",[459,7652,7654],{"class":461,"line":7653},203,[459,7655,7656],{"class":1675},"\u002F\u002F de plus. Le point de la démo n'est pas la parité des messages, c'est que les\n",[459,7658,7660],{"class":461,"line":7659},204,[459,7661,7662],{"class":1675},"\u002F\u002F deux côtés jugent la même chose à partir d'UNE déclaration.\n",[459,7664,7666],{"class":461,"line":7665},205,[459,7667,541],{"emptyLinePlaceholder":115},[459,7669,7671],{"class":461,"line":7670},206,[459,7672,7673],{"class":1675},"\u002F\u002F\u002F Ce qu'un client ne peut pas fournir — les trois exclusions de l'axe io :\n",[459,7675,7677],{"class":461,"line":7676},207,[459,7678,7679],{"class":1675},"\u002F\u002F\u002F `role.primary`, `lifecycle.create === 'now'`, `boundary.in === 'closed'`.\n",[459,7681,7683,7685,7688,7690,7692,7694,7696,7698,7700,7702,7705],{"class":461,"line":7682},208,[459,7684,5279],{"class":5091},[459,7686,7687],{"class":1941}," is_closed",[459,7689,1047],{"class":465},[459,7691,5840],{"class":799},[459,7693,1951],{"class":465},[459,7695,5292],{"class":465},[459,7697,5295],{"class":1954},[459,7699,2089],{"class":465},[459,7701,5300],{"class":465},[459,7703,7704],{"class":1954}," bool",[459,7706,1797],{"class":465},[459,7708,7710,7713,7715,7717,7719,7721,7723,7725,7727,7729,7731,7733,7735,7737,7739,7741],{"class":461,"line":7709},209,[459,7711,7712],{"class":1941},"    matches!",[459,7714,1047],{"class":465},[459,7716,5840],{"class":799},[459,7718,593],{"class":465},[459,7720,486],{"class":485},[459,7722,1250],{"class":489},[459,7724,590],{"class":485},[459,7726,1219],{"class":465},[459,7728,486],{"class":485},[459,7730,1286],{"class":489},[459,7732,590],{"class":485},[459,7734,1219],{"class":465},[459,7736,486],{"class":485},[459,7738,1349],{"class":489},[459,7740,590],{"class":485},[459,7742,7032],{"class":465},[459,7744,7746],{"class":461,"line":7745},210,[459,7747,2272],{"class":465},[459,7749,7751],{"class":461,"line":7750},211,[459,7752,541],{"emptyLinePlaceholder":115},[459,7754,7756,7758,7761,7763,7765,7767,7769,7772,7774,7776,7778,7780,7782,7784,7787,7789,7791,7793,7795,7797],{"class":461,"line":7755},212,[459,7757,5279],{"class":5091},[459,7759,7760],{"class":1941}," read_label",[459,7762,1047],{"class":465},[459,7764,5924],{"class":799},[459,7766,1951],{"class":465},[459,7768,5292],{"class":465},[459,7770,7771],{"class":1954},"Map",[459,7773,1973],{"class":465},[459,7775,5835],{"class":1954},[459,7777,593],{"class":465},[459,7779,5166],{"class":1954},[459,7781,1997],{"class":465},[459,7783,5300],{"class":465},[459,7785,7786],{"class":1954}," Result",[459,7788,1973],{"class":465},[459,7790,5835],{"class":1954},[459,7792,593],{"class":465},[459,7794,7599],{"class":1954},[459,7796,2164],{"class":465},[459,7798,1797],{"class":465},[459,7800,7802,7804,7807,7809,7811,7813,7815,7817,7819,7822,7824,7826,7828,7830,7832,7834,7836,7839],{"class":461,"line":7801},213,[459,7803,5310],{"class":1873},[459,7805,7806],{"class":799}," fail ",[459,7808,1880],{"class":465},[459,7810,1219],{"class":465},[459,7812,3565],{"class":799},[459,7814,1203],{"class":465},[459,7816,7599],{"class":1954},[459,7818,577],{"class":465},[459,7820,7821],{"class":799}," path",[459,7823,1951],{"class":465},[459,7825,486],{"class":485},[459,7827,3898],{"class":489},[459,7829,590],{"class":485},[459,7831,1886],{"class":465},[459,7833,7544],{"class":1941},[459,7835,7547],{"class":465},[459,7837,7838],{"class":799}," message ",[459,7840,5131],{"class":465},[459,7842,7844,7847,7850,7852,7855,7857,7859,7861,7863,7865],{"class":461,"line":7843},214,[459,7845,7846],{"class":1739},"    match",[459,7848,7849],{"class":799}," object",[459,7851,1886],{"class":465},[459,7853,7854],{"class":1941},"get",[459,7856,1047],{"class":465},[459,7858,590],{"class":485},[459,7860,3898],{"class":489},[459,7862,590],{"class":485},[459,7864,2089],{"class":465},[459,7866,1797],{"class":465},[459,7868,7870,7873,7875,7878,7880,7883,7885,7887,7890,7892],{"class":461,"line":7869},215,[459,7871,7872],{"class":1954},"        None",[459,7874,2001],{"class":465},[459,7876,7877],{"class":1954}," Err",[459,7879,1047],{"class":465},[459,7881,7882],{"class":1941},"fail",[459,7884,1047],{"class":465},[459,7886,590],{"class":485},[459,7888,7889],{"class":489},"Required",[459,7891,590],{"class":485},[459,7893,7894],{"class":465},")),\n",[459,7896,7898,7901,7903,7905,7907,7909,7911,7913,7915,7917,7920,7923,7925,7927,7929,7932,7934],{"class":461,"line":7897},216,[459,7899,7900],{"class":1954},"        Some",[459,7902,1047],{"class":465},[459,7904,5750],{"class":1954},[459,7906,5104],{"class":465},[459,7908,5835],{"class":1941},[459,7910,1047],{"class":465},[459,7912,2367],{"class":799},[459,7914,2470],{"class":465},[459,7916,2001],{"class":465},[459,7918,7919],{"class":1739}," match",[459,7921,7922],{"class":799}," value",[459,7924,1886],{"class":465},[459,7926,5370],{"class":1941},[459,7928,6757],{"class":465},[459,7930,7931],{"class":1941},"count",[459,7933,3162],{"class":465},[459,7935,1797],{"class":465},[459,7937,7939,7942,7945,7948,7950,7952,7954,7956,7958,7960,7962,7964,7967,7969],{"class":461,"line":7938},217,[459,7940,7941],{"class":799},"            count ",[459,7943,7944],{"class":1739},"if",[459,7946,7947],{"class":799}," count ",[459,7949,1973],{"class":465},[459,7951,2407],{"class":2406},[459,7953,2001],{"class":465},[459,7955,7877],{"class":1954},[459,7957,1047],{"class":465},[459,7959,7882],{"class":1941},[459,7961,1047],{"class":465},[459,7963,590],{"class":485},[459,7965,7966],{"class":489},"Too short (min 2)",[459,7968,590],{"class":485},[459,7970,7894],{"class":465},[459,7972,7974,7976,7978,7980,7982,7984,7986,7988,7990,7992,7994,7996,7999,8001],{"class":461,"line":7973},218,[459,7975,7941],{"class":799},[459,7977,7944],{"class":1739},[459,7979,7947],{"class":799},[459,7981,2164],{"class":465},[459,7983,6311],{"class":2406},[459,7985,2001],{"class":465},[459,7987,7877],{"class":1954},[459,7989,1047],{"class":465},[459,7991,7882],{"class":1941},[459,7993,1047],{"class":465},[459,7995,590],{"class":485},[459,7997,7998],{"class":489},"Too long (max 40)",[459,8000,590],{"class":485},[459,8002,7894],{"class":465},[459,8004,8006,8009,8012,8015,8017,8019,8021,8023],{"class":461,"line":8005},219,[459,8007,8008],{"class":799},"            _ ",[459,8010,8011],{"class":465},"=>",[459,8013,8014],{"class":1954}," Ok",[459,8016,1047],{"class":465},[459,8018,2367],{"class":799},[459,8020,1886],{"class":465},[459,8022,5845],{"class":1941},[459,8024,8025],{"class":465},"()),\n",[459,8027,8029],{"class":461,"line":8028},220,[459,8030,8031],{"class":465},"        },\n",[459,8033,8035,8037,8039,8041,8043,8045,8047,8049,8051,8053,8055,8058,8060],{"class":461,"line":8034},221,[459,8036,7900],{"class":1954},[459,8038,1047],{"class":465},[459,8040,5389],{"class":799},[459,8042,2089],{"class":465},[459,8044,2001],{"class":465},[459,8046,7877],{"class":1954},[459,8048,1047],{"class":465},[459,8050,7882],{"class":1941},[459,8052,1047],{"class":465},[459,8054,590],{"class":485},[459,8056,8057],{"class":489},"Expected a string",[459,8059,590],{"class":485},[459,8061,7894],{"class":465},[459,8063,8065],{"class":461,"line":8064},222,[459,8066,2773],{"class":465},[459,8068,8070],{"class":461,"line":8069},223,[459,8071,2272],{"class":465},[459,8073,8075],{"class":461,"line":8074},224,[459,8076,541],{"emptyLinePlaceholder":115},[459,8078,8080,8082,8085,8087,8089,8091,8093,8095,8097,8099,8101,8103,8105,8107,8109,8111,8114,8116,8118,8120],{"class":461,"line":8079},225,[459,8081,5279],{"class":5091},[459,8083,8084],{"class":1941}," read_celsius",[459,8086,1047],{"class":465},[459,8088,5924],{"class":799},[459,8090,1951],{"class":465},[459,8092,5292],{"class":465},[459,8094,7771],{"class":1954},[459,8096,1973],{"class":465},[459,8098,5835],{"class":1954},[459,8100,593],{"class":465},[459,8102,5166],{"class":1954},[459,8104,1997],{"class":465},[459,8106,5300],{"class":465},[459,8108,7786],{"class":1954},[459,8110,1973],{"class":465},[459,8112,8113],{"class":1954},"f64",[459,8115,593],{"class":465},[459,8117,7599],{"class":1954},[459,8119,2164],{"class":465},[459,8121,1797],{"class":465},[459,8123,8125,8127,8129,8131,8133,8135,8137,8139,8141,8143,8145,8147,8149,8151,8153,8155,8157,8159],{"class":461,"line":8124},226,[459,8126,5310],{"class":1873},[459,8128,7806],{"class":799},[459,8130,1880],{"class":465},[459,8132,1219],{"class":465},[459,8134,3565],{"class":799},[459,8136,1203],{"class":465},[459,8138,7599],{"class":1954},[459,8140,577],{"class":465},[459,8142,7821],{"class":799},[459,8144,1951],{"class":465},[459,8146,486],{"class":485},[459,8148,6940],{"class":489},[459,8150,590],{"class":485},[459,8152,1886],{"class":465},[459,8154,7544],{"class":1941},[459,8156,7547],{"class":465},[459,8158,7838],{"class":799},[459,8160,5131],{"class":465},[459,8162,8164,8166,8168,8170,8172,8174,8176,8178,8180,8183,8185,8187,8189,8191,8194,8196],{"class":461,"line":8163},227,[459,8165,7846],{"class":1739},[459,8167,7849],{"class":799},[459,8169,1886],{"class":465},[459,8171,7854],{"class":1941},[459,8173,1047],{"class":465},[459,8175,590],{"class":485},[459,8177,6940],{"class":489},[459,8179,590],{"class":485},[459,8181,8182],{"class":465},").",[459,8184,2430],{"class":1941},[459,8186,1047],{"class":465},[459,8188,5750],{"class":1954},[459,8190,5104],{"class":465},[459,8192,8193],{"class":799},"as_f64",[459,8195,2089],{"class":465},[459,8197,1797],{"class":465},[459,8199,8201,8203,8205,8207,8209,8211,8213,8215,8217,8219],{"class":461,"line":8200},228,[459,8202,7872],{"class":1954},[459,8204,2001],{"class":465},[459,8206,7877],{"class":1954},[459,8208,1047],{"class":465},[459,8210,7882],{"class":1941},[459,8212,1047],{"class":465},[459,8214,590],{"class":485},[459,8216,7889],{"class":489},[459,8218,590],{"class":485},[459,8220,7894],{"class":465},[459,8222,8224,8226,8228,8231,8233,8235,8237,8239,8241,8243,8245,8248,8250],{"class":461,"line":8223},229,[459,8225,7900],{"class":1954},[459,8227,1047],{"class":465},[459,8229,8230],{"class":1954},"None",[459,8232,2089],{"class":465},[459,8234,2001],{"class":465},[459,8236,7877],{"class":1954},[459,8238,1047],{"class":465},[459,8240,7882],{"class":1941},[459,8242,1047],{"class":465},[459,8244,590],{"class":485},[459,8246,8247],{"class":489},"Expected a number",[459,8249,590],{"class":485},[459,8251,7894],{"class":465},[459,8253,8255,8257,8259,8262,8264,8266,8268,8270,8273,8275,8277,8279,8281,8283,8285,8287,8289,8291,8293,8295,8298,8300],{"class":461,"line":8254},230,[459,8256,7900],{"class":1954},[459,8258,1047],{"class":465},[459,8260,8261],{"class":1954},"Some",[459,8263,1047],{"class":465},[459,8265,2367],{"class":799},[459,8267,2470],{"class":465},[459,8269,5415],{"class":1739},[459,8271,8272],{"class":799}," value ",[459,8274,1973],{"class":465},[459,8276,6385],{"class":465},[459,8278,6388],{"class":2406},[459,8280,1886],{"class":465},[459,8282,2928],{"class":2406},[459,8284,2001],{"class":465},[459,8286,7877],{"class":1954},[459,8288,1047],{"class":465},[459,8290,7882],{"class":1941},[459,8292,1047],{"class":465},[459,8294,590],{"class":485},[459,8296,8297],{"class":489},"Below minimum (-80)",[459,8299,590],{"class":485},[459,8301,7894],{"class":465},[459,8303,8305,8307,8309,8311,8313,8315,8317,8319,8321,8323,8325,8327,8329,8331,8333,8335,8337,8339,8341,8344,8346],{"class":461,"line":8304},231,[459,8306,7900],{"class":1954},[459,8308,1047],{"class":465},[459,8310,8261],{"class":1954},[459,8312,1047],{"class":465},[459,8314,2367],{"class":799},[459,8316,2470],{"class":465},[459,8318,5415],{"class":1739},[459,8320,8272],{"class":799},[459,8322,2164],{"class":465},[459,8324,6404],{"class":2406},[459,8326,1886],{"class":465},[459,8328,2928],{"class":2406},[459,8330,2001],{"class":465},[459,8332,7877],{"class":1954},[459,8334,1047],{"class":465},[459,8336,7882],{"class":1941},[459,8338,1047],{"class":465},[459,8340,590],{"class":485},[459,8342,8343],{"class":489},"Above maximum (80)",[459,8345,590],{"class":485},[459,8347,7894],{"class":465},[459,8349,8351,8353,8355,8357,8359,8361,8363,8365,8367,8369,8371],{"class":461,"line":8350},232,[459,8352,7900],{"class":1954},[459,8354,1047],{"class":465},[459,8356,8261],{"class":1954},[459,8358,1047],{"class":465},[459,8360,2367],{"class":799},[459,8362,2470],{"class":465},[459,8364,2001],{"class":465},[459,8366,8014],{"class":1954},[459,8368,1047],{"class":465},[459,8370,2367],{"class":799},[459,8372,5951],{"class":465},[459,8374,8376],{"class":461,"line":8375},233,[459,8377,2773],{"class":465},[459,8379,8381],{"class":461,"line":8380},234,[459,8382,2272],{"class":465},[459,8384,8386],{"class":461,"line":8385},235,[459,8387,541],{"emptyLinePlaceholder":115},[459,8389,8391,8393,8396,8398,8400,8402,8404,8406,8408,8410,8412,8415,8417,8419,8421,8424,8426,8428,8431,8433],{"class":461,"line":8390},236,[459,8392,5279],{"class":5091},[459,8394,8395],{"class":1941}," validator",[459,8397,1047],{"class":465},[459,8399,1983],{"class":799},[459,8401,1951],{"class":465},[459,8403,5292],{"class":465},[459,8405,5750],{"class":1954},[459,8407,2089],{"class":465},[459,8409,5300],{"class":465},[459,8411,7786],{"class":1954},[459,8413,8414],{"class":465},"\u003C(",[459,8416,5835],{"class":1954},[459,8418,593],{"class":465},[459,8420,6344],{"class":1954},[459,8422,8423],{"class":465},"),",[459,8425,5745],{"class":1954},[459,8427,1973],{"class":465},[459,8429,8430],{"class":1954},"Rejected",[459,8432,2012],{"class":465},[459,8434,1797],{"class":465},[459,8436,8438,8440,8443,8445,8447,8449,8451,8453,8455,8458,8460,8462],{"class":461,"line":8437},237,[459,8439,5310],{"class":1873},[459,8441,8442],{"class":1954}," Some",[459,8444,1047],{"class":465},[459,8446,5924],{"class":799},[459,8448,2089],{"class":465},[459,8450,482],{"class":465},[459,8452,3955],{"class":799},[459,8454,1886],{"class":465},[459,8456,8457],{"class":1941},"as_object",[459,8459,3162],{"class":465},[459,8461,5412],{"class":1739},[459,8463,1797],{"class":465},[459,8465,8467,8469,8471,8473,8476,8478,8480,8482,8484,8486,8488,8490,8492,8494,8496,8498,8500,8502,8504,8507,8509],{"class":461,"line":8466},238,[459,8468,2214],{"class":1739},[459,8470,7877],{"class":1954},[459,8472,1047],{"class":465},[459,8474,8475],{"class":1941},"vec!",[459,8477,466],{"class":465},[459,8479,8430],{"class":1954},[459,8481,577],{"class":465},[459,8483,7821],{"class":799},[459,8485,1951],{"class":465},[459,8487,486],{"class":485},[459,8489,1886],{"class":489},[459,8491,590],{"class":485},[459,8493,1886],{"class":465},[459,8495,7544],{"class":1941},[459,8497,7547],{"class":465},[459,8499,7518],{"class":799},[459,8501,1951],{"class":465},[459,8503,486],{"class":485},[459,8505,8506],{"class":489},"Expected an object",[459,8508,590],{"class":485},[459,8510,8511],{"class":465}," }]);\n",[459,8513,8515],{"class":461,"line":8514},239,[459,8516,6022],{"class":465},[459,8518,8520],{"class":461,"line":8519},240,[459,8521,541],{"emptyLinePlaceholder":115},[459,8523,8525,8527,8529,8532,8534,8536,8538,8540,8542,8544],{"class":461,"line":8524},241,[459,8526,5310],{"class":1873},[459,8528,5313],{"class":1873},[459,8530,8531],{"class":799}," rejected",[459,8533,1951],{"class":465},[459,8535,5745],{"class":1954},[459,8537,1973],{"class":465},[459,8539,8430],{"class":1954},[459,8541,2164],{"class":465},[459,8543,482],{"class":465},[459,8545,8546],{"class":799}," object\n",[459,8548,8550,8553,8555],{"class":461,"line":8549},242,[459,8551,8552],{"class":465},"        .",[459,8554,3015],{"class":1941},[459,8556,7237],{"class":465},[459,8558,8560,8562,8565,8568,8570,8572,8575,8578,8580,8582,8584,8587,8589,8591,8593,8595,8597,8599,8601,8603],{"class":461,"line":8559},243,[459,8561,8552],{"class":465},[459,8563,8564],{"class":1941},"filter",[459,8566,8567],{"class":465},"(|",[459,8569,5840],{"class":799},[459,8571,1203],{"class":465},[459,8573,8574],{"class":465}," !",[459,8576,8577],{"class":1941},"matches!",[459,8579,1047],{"class":465},[459,8581,5840],{"class":799},[459,8583,1886],{"class":465},[459,8585,8586],{"class":1941},"as_str",[459,8588,7547],{"class":465},[459,8590,486],{"class":485},[459,8592,3898],{"class":489},[459,8594,590],{"class":485},[459,8596,1219],{"class":465},[459,8598,486],{"class":485},[459,8600,6940],{"class":489},[459,8602,590],{"class":485},[459,8604,8605],{"class":465},"))\n",[459,8607,8609,8611,8613,8615,8617,8619,8621],{"class":461,"line":8608},244,[459,8610,8552],{"class":465},[459,8612,2430],{"class":1941},[459,8614,8567],{"class":465},[459,8616,5840],{"class":799},[459,8618,1203],{"class":465},[459,8620,7599],{"class":1954},[459,8622,1797],{"class":465},[459,8624,8626,8629,8631,8634,8636,8638],{"class":461,"line":8625},245,[459,8627,8628],{"class":799},"            path",[459,8630,1951],{"class":465},[459,8632,8633],{"class":799}," key",[459,8635,1886],{"class":465},[459,8637,5845],{"class":1941},[459,8639,6763],{"class":465},[459,8641,8643,8646,8648,8650,8652,8654,8656,8658,8660,8662,8664,8666,8668,8670,8672,8674,8677,8679],{"class":461,"line":8642},246,[459,8644,8645],{"class":799},"            message",[459,8647,1951],{"class":465},[459,8649,5415],{"class":1739},[459,8651,7687],{"class":1941},[459,8653,1047],{"class":465},[459,8655,5840],{"class":799},[459,8657,2089],{"class":465},[459,8659,577],{"class":465},[459,8661,486],{"class":485},[459,8663,1358],{"class":489},[459,8665,590],{"class":485},[459,8667,1748],{"class":465},[459,8669,5412],{"class":1739},[459,8671,577],{"class":465},[459,8673,486],{"class":485},[459,8675,8676],{"class":489},"Unknown field",[459,8678,590],{"class":485},[459,8680,4324],{"class":465},[459,8682,8684],{"class":461,"line":8683},247,[459,8685,8686],{"class":465},"        })\n",[459,8688,8690,8692,8695],{"class":461,"line":8689},248,[459,8691,8552],{"class":465},[459,8693,8694],{"class":1941},"collect",[459,8696,5731],{"class":465},[459,8698,8700],{"class":461,"line":8699},249,[459,8701,541],{"emptyLinePlaceholder":115},[459,8703,8705,8707,8709,8712,8714,8716,8718,8720,8722,8724,8726],{"class":461,"line":8704},250,[459,8706,7846],{"class":1739},[459,8708,1469],{"class":465},[459,8710,8711],{"class":1941},"read_label",[459,8713,1047],{"class":465},[459,8715,5924],{"class":799},[459,8717,8423],{"class":465},[459,8719,8084],{"class":1941},[459,8721,1047],{"class":465},[459,8723,5924],{"class":799},[459,8725,2470],{"class":465},[459,8727,1797],{"class":465},[459,8729,8731,8734,8737,8739,8741,8743,8745,8747,8749,8751,8753,8755,8757,8760,8762,8764,8766,8769,8771,8773,8775],{"class":461,"line":8730},251,[459,8732,8733],{"class":465},"        (",[459,8735,8736],{"class":1954},"Ok",[459,8738,1047],{"class":465},[459,8740,3898],{"class":799},[459,8742,8423],{"class":465},[459,8744,8014],{"class":1954},[459,8746,1047],{"class":465},[459,8748,6940],{"class":799},[459,8750,2470],{"class":465},[459,8752,5415],{"class":1739},[459,8754,8531],{"class":799},[459,8756,1886],{"class":465},[459,8758,8759],{"class":1941},"is_empty",[459,8761,3162],{"class":465},[459,8763,2001],{"class":465},[459,8765,8014],{"class":1954},[459,8767,8768],{"class":465},"((",[459,8770,3898],{"class":799},[459,8772,593],{"class":465},[459,8774,3382],{"class":799},[459,8776,7894],{"class":465},[459,8778,8780,8782,8784,8786,8788,8790,8792],{"class":461,"line":8779},252,[459,8781,8733],{"class":465},[459,8783,3898],{"class":799},[459,8785,593],{"class":465},[459,8787,3382],{"class":799},[459,8789,2089],{"class":465},[459,8791,2001],{"class":465},[459,8793,1797],{"class":465},[459,8795,8797,8800,8802,8804,8806,8808,8810,8813],{"class":461,"line":8796},253,[459,8798,8799],{"class":799},"            rejected",[459,8801,1886],{"class":465},[459,8803,5429],{"class":1941},[459,8805,1047],{"class":465},[459,8807,3898],{"class":799},[459,8809,1886],{"class":465},[459,8811,8812],{"class":1941},"err",[459,8814,5337],{"class":465},[459,8816,8818,8820,8822,8824,8826,8828,8830,8832],{"class":461,"line":8817},254,[459,8819,8799],{"class":799},[459,8821,1886],{"class":465},[459,8823,5429],{"class":1941},[459,8825,1047],{"class":465},[459,8827,6940],{"class":799},[459,8829,1886],{"class":465},[459,8831,8812],{"class":1941},[459,8833,5337],{"class":465},[459,8835,8837,8840,8842,8845],{"class":461,"line":8836},255,[459,8838,8839],{"class":1954},"            Err",[459,8841,1047],{"class":465},[459,8843,8844],{"class":799},"rejected",[459,8846,7032],{"class":465},[459,8848,8850],{"class":461,"line":8849},256,[459,8851,5480],{"class":465},[459,8853,8855],{"class":461,"line":8854},257,[459,8856,2773],{"class":465},[459,8858,8860],{"class":461,"line":8859},258,[459,8861,2272],{"class":465},[459,8863,8865],{"class":461,"line":8864},259,[459,8866,541],{"emptyLinePlaceholder":115},[459,8868,8870],{"class":461,"line":8869},260,[459,8871,8872],{"class":1675},"\u002F\u002F ─── Les opérations — la façade du frond ────────────────────────────\n",[459,8874,8876],{"class":461,"line":8875},261,[459,8877,541],{"emptyLinePlaceholder":115},[459,8879,8881,8883,8886],{"class":461,"line":8880},262,[459,8882,7334],{"class":1873},[459,8884,8885],{"class":1954}," AppState",[459,8887,1797],{"class":465},[459,8889,8891,8894,8896,8898,8900,8903,8905,8907],{"class":461,"line":8890},263,[459,8892,8893],{"class":799},"    sensors",[459,8895,1951],{"class":465},[459,8897,5190],{"class":1954},[459,8899,1973],{"class":465},[459,8901,8902],{"class":1954},"Vec",[459,8904,1973],{"class":465},[459,8906,3203],{"class":1954},[459,8908,8909],{"class":465},">>,\n",[459,8911,8913],{"class":461,"line":8912},264,[459,8914,8915],{"class":1675},"    \u002F\u002F\u002F Les termes, pas seulement les noms : ce que l'op fait, et si elle lit ou\n",[459,8917,8919],{"class":461,"line":8918},265,[459,8920,8921],{"class":1675},"    \u002F\u002F\u002F écrit. Un appelant qui rencontre ce frond sur le fil n'a rien d'autre.\n",[459,8923,8925,8928,8930,8932],{"class":461,"line":8924},266,[459,8926,8927],{"class":799},"    ops",[459,8929,1951],{"class":465},[459,8931,5166],{"class":1954},[459,8933,940],{"class":465},[459,8935,8937],{"class":461,"line":8936},267,[459,8938,2272],{"class":465},[459,8940,8942],{"class":461,"line":8941},268,[459,8943,541],{"emptyLinePlaceholder":115},[459,8945,8947,8949,8952,8954,8956,8958,8960,8962,8964,8967,8969,8971,8973,8975,8977,8979,8981,8983,8985,8987,8989,8991,8993,8995,8997,8999],{"class":461,"line":8946},269,[459,8948,5279],{"class":5091},[459,8950,8951],{"class":1941}," dispatch",[459,8953,1047],{"class":465},[459,8955,7072],{"class":799},[459,8957,1951],{"class":465},[459,8959,5292],{"class":465},[459,8961,7079],{"class":1954},[459,8963,593],{"class":465},[459,8965,8966],{"class":799}," method",[459,8968,1951],{"class":465},[459,8970,5292],{"class":465},[459,8972,5295],{"class":1954},[459,8974,593],{"class":465},[459,8976,4128],{"class":799},[459,8978,1951],{"class":465},[459,8980,5292],{"class":465},[459,8982,5750],{"class":1954},[459,8984,2089],{"class":465},[459,8986,5300],{"class":465},[459,8988,7786],{"class":1954},[459,8990,1973],{"class":465},[459,8992,5750],{"class":1954},[459,8994,593],{"class":465},[459,8996,7337],{"class":1954},[459,8998,2164],{"class":465},[459,9000,1797],{"class":465},[459,9002,9004,9006,9008,9010,9012,9014,9016,9018,9020,9022,9025,9027,9029,9031,9033,9035,9038,9040,9043,9045,9047],{"class":461,"line":9003},270,[459,9005,5310],{"class":1873},[459,9007,1469],{"class":465},[459,9009,1948],{"class":799},[459,9011,593],{"class":465},[459,9013,2198],{"class":799},[459,9015,2089],{"class":465},[459,9017,482],{"class":465},[459,9019,8966],{"class":799},[459,9021,1886],{"class":465},[459,9023,9024],{"class":1941},"split_once",[459,9026,1047],{"class":465},[459,9028,1760],{"class":465},[459,9030,1886],{"class":489},[459,9032,1760],{"class":465},[459,9034,8182],{"class":465},[459,9036,9037],{"class":1941},"unwrap_or",[459,9039,8768],{"class":465},[459,9041,9042],{"class":485},"\"\"",[459,9044,593],{"class":465},[459,9046,8966],{"class":799},[459,9048,5792],{"class":465},[459,9050,9052],{"class":461,"line":9051},271,[459,9053,541],{"emptyLinePlaceholder":115},[459,9055,9057,9059,9061,9063,9065,9067,9069],{"class":461,"line":9056},272,[459,9058,7846],{"class":1739},[459,9060,1469],{"class":465},[459,9062,1948],{"class":799},[459,9064,593],{"class":465},[459,9066,2198],{"class":799},[459,9068,2089],{"class":465},[459,9070,1797],{"class":465},[459,9072,9074,9076,9078,9080,9082,9084,9086,9088,9090,9092,9094,9096,9098,9101,9103,9105],{"class":461,"line":9073},273,[459,9075,8733],{"class":465},[459,9077,590],{"class":485},[459,9079,2590],{"class":489},[459,9081,590],{"class":485},[459,9083,593],{"class":465},[459,9085,486],{"class":485},[459,9087,2603],{"class":489},[459,9089,590],{"class":485},[459,9091,2089],{"class":465},[459,9093,2001],{"class":465},[459,9095,8014],{"class":1954},[459,9097,1047],{"class":465},[459,9099,9100],{"class":1941},"identity_card",[459,9102,1047],{"class":465},[459,9104,7072],{"class":799},[459,9106,7894],{"class":465},[459,9108,9110],{"class":461,"line":9109},274,[459,9111,541],{"emptyLinePlaceholder":115},[459,9113,9115,9117,9119,9121,9123,9125,9127,9129,9131,9133,9135],{"class":461,"line":9114},275,[459,9116,8733],{"class":465},[459,9118,590],{"class":485},[459,9120,3777],{"class":489},[459,9122,590],{"class":485},[459,9124,593],{"class":465},[459,9126,486],{"class":485},[459,9128,3813],{"class":489},[459,9130,590],{"class":485},[459,9132,2089],{"class":465},[459,9134,2001],{"class":465},[459,9136,1797],{"class":465},[459,9138,9140,9142,9145,9147,9149,9151,9154,9156,9159,9161,9164],{"class":461,"line":9139},276,[459,9141,5714],{"class":1873},[459,9143,9144],{"class":799}," sensors ",[459,9146,1880],{"class":465},[459,9148,7226],{"class":799},[459,9150,1886],{"class":465},[459,9152,9153],{"class":799},"sensors",[459,9155,1886],{"class":465},[459,9157,9158],{"class":1941},"lock",[459,9160,6757],{"class":465},[459,9162,9163],{"class":1941},"unwrap",[459,9165,5731],{"class":465},[459,9167,9169,9172,9174,9177,9180,9182],{"class":461,"line":9168},277,[459,9170,9171],{"class":1954},"            Ok",[459,9173,1047],{"class":465},[459,9175,9176],{"class":1941},"json!",[459,9178,9179],{"class":465},"(*",[459,9181,9153],{"class":799},[459,9183,8605],{"class":465},[459,9185,9187],{"class":461,"line":9186},278,[459,9188,5480],{"class":465},[459,9190,9192],{"class":461,"line":9191},279,[459,9193,541],{"emptyLinePlaceholder":115},[459,9195,9197,9199,9201,9203,9205,9207,9209,9211,9213,9215,9217],{"class":461,"line":9196},280,[459,9198,8733],{"class":465},[459,9200,590],{"class":485},[459,9202,3777],{"class":489},[459,9204,590],{"class":485},[459,9206,593],{"class":465},[459,9208,486],{"class":485},[459,9210,4121],{"class":489},[459,9212,590],{"class":485},[459,9214,2089],{"class":465},[459,9216,2001],{"class":465},[459,9218,1797],{"class":465},[459,9220,9222,9224,9227,9229,9231,9233,9235,9237,9239,9241,9243,9245,9248,9250,9252,9254,9257,9259,9261,9263,9265,9267,9269,9272,9274,9276,9278,9280,9282,9284,9286,9288,9290],{"class":461,"line":9221},281,[459,9223,5714],{"class":1873},[459,9225,9226],{"class":799}," id ",[459,9228,1880],{"class":465},[459,9230,4128],{"class":799},[459,9232,1886],{"class":465},[459,9234,7854],{"class":1941},[459,9236,1047],{"class":465},[459,9238,590],{"class":485},[459,9240,949],{"class":489},[459,9242,590],{"class":485},[459,9244,8182],{"class":465},[459,9246,9247],{"class":1941},"and_then",[459,9249,8567],{"class":465},[459,9251,13],{"class":799},[459,9253,1203],{"class":465},[459,9255,9256],{"class":799}," p",[459,9258,1886],{"class":465},[459,9260,7854],{"class":1941},[459,9262,1047],{"class":465},[459,9264,590],{"class":485},[459,9266,1250],{"class":489},[459,9268,590],{"class":485},[459,9270,9271],{"class":465},")).",[459,9273,9247],{"class":1941},[459,9275,1047],{"class":465},[459,9277,5750],{"class":1954},[459,9279,5104],{"class":465},[459,9281,8586],{"class":799},[459,9283,8182],{"class":465},[459,9285,9037],{"class":1941},[459,9287,1047],{"class":465},[459,9289,9042],{"class":485},[459,9291,5475],{"class":465},[459,9293,9295,9297,9299,9301,9303,9305,9307,9309,9311,9313,9315],{"class":461,"line":9294},282,[459,9296,5714],{"class":1873},[459,9298,9144],{"class":799},[459,9300,1880],{"class":465},[459,9302,7226],{"class":799},[459,9304,1886],{"class":465},[459,9306,9153],{"class":799},[459,9308,1886],{"class":465},[459,9310,9158],{"class":1941},[459,9312,6757],{"class":465},[459,9314,9163],{"class":1941},[459,9316,5731],{"class":465},[459,9318,9320],{"class":461,"line":9319},283,[459,9321,9322],{"class":799},"            sensors\n",[459,9324,9326,9329,9331],{"class":461,"line":9325},284,[459,9327,9328],{"class":465},"                .",[459,9330,6925],{"class":1941},[459,9332,7237],{"class":465},[459,9334,9336,9338,9341,9343,9345,9347,9349,9351,9354,9356,9358],{"class":461,"line":9335},285,[459,9337,9328],{"class":465},[459,9339,9340],{"class":1941},"find",[459,9342,8567],{"class":465},[459,9344,3777],{"class":799},[459,9346,1203],{"class":465},[459,9348,3766],{"class":799},[459,9350,1886],{"class":465},[459,9352,9353],{"class":799},"id ",[459,9355,5384],{"class":465},[459,9357,3822],{"class":799},[459,9359,7032],{"class":465},[459,9361,9363,9365,9367,9369,9371,9373,9375,9377,9379],{"class":461,"line":9362},286,[459,9364,9328],{"class":465},[459,9366,2430],{"class":1941},[459,9368,8567],{"class":465},[459,9370,3777],{"class":799},[459,9372,1203],{"class":465},[459,9374,5872],{"class":1941},[459,9376,1047],{"class":465},[459,9378,3777],{"class":799},[459,9380,8605],{"class":465},[459,9382,9384,9386,9389,9392,9394,9396,9399,9401,9404,9406,9408,9411,9413,9415,9417,9419,9421,9423,9425],{"class":461,"line":9383},287,[459,9385,9328],{"class":465},[459,9387,9388],{"class":1941},"ok_or_else",[459,9390,9391],{"class":465},"(||",[459,9393,7337],{"class":1954},[459,9395,5104],{"class":465},[459,9397,9398],{"class":1941},"not_found",[459,9400,1047],{"class":465},[459,9402,9403],{"class":1941},"format!",[459,9405,1047],{"class":465},[459,9407,590],{"class":485},[459,9409,9410],{"class":489},"No sensor '",[459,9412,2581],{"class":465},[459,9414,1250],{"class":489},[459,9416,1853],{"class":465},[459,9418,1760],{"class":489},[459,9420,590],{"class":485},[459,9422,8423],{"class":465},[459,9424,2198],{"class":799},[459,9426,8605],{"class":465},[459,9428,9430],{"class":461,"line":9429},288,[459,9431,5480],{"class":465},[459,9433,9435],{"class":461,"line":9434},289,[459,9436,541],{"emptyLinePlaceholder":115},[459,9438,9440,9442,9444,9446,9448,9450,9452,9454,9456,9458,9460],{"class":461,"line":9439},290,[459,9441,8733],{"class":465},[459,9443,590],{"class":485},[459,9445,3777],{"class":489},[459,9447,590],{"class":485},[459,9449,593],{"class":465},[459,9451,486],{"class":485},[459,9453,3948],{"class":489},[459,9455,590],{"class":485},[459,9457,2089],{"class":465},[459,9459,2001],{"class":465},[459,9461,1797],{"class":465},[459,9463,9465,9467,9470,9472,9474,9476,9478,9480,9482,9484,9486,9488,9491,9493,9495,9497,9499,9501,9504],{"class":461,"line":9464},291,[459,9466,5714],{"class":1873},[459,9468,9469],{"class":799}," input ",[459,9471,1880],{"class":465},[459,9473,4128],{"class":799},[459,9475,1886],{"class":465},[459,9477,7854],{"class":1941},[459,9479,1047],{"class":465},[459,9481,590],{"class":485},[459,9483,1983],{"class":489},[459,9485,590],{"class":485},[459,9487,8182],{"class":465},[459,9489,9490],{"class":1941},"cloned",[459,9492,6757],{"class":465},[459,9494,9037],{"class":1941},[459,9496,1047],{"class":465},[459,9498,5750],{"class":1954},[459,9500,5104],{"class":465},[459,9502,9503],{"class":1954},"Null",[459,9505,5475],{"class":465},[459,9507,9509,9512,9514,9516,9518,9520],{"class":461,"line":9508},292,[459,9510,9511],{"class":1739},"            match",[459,9513,8395],{"class":1941},[459,9515,6775],{"class":465},[459,9517,1983],{"class":799},[459,9519,2089],{"class":465},[459,9521,1797],{"class":465},[459,9523,9525,9528,9530,9532,9534,9536,9538,9540],{"class":461,"line":9524},293,[459,9526,9527],{"class":1954},"                Ok",[459,9529,8768],{"class":465},[459,9531,3898],{"class":799},[459,9533,593],{"class":465},[459,9535,3382],{"class":799},[459,9537,2470],{"class":465},[459,9539,2001],{"class":465},[459,9541,1797],{"class":465},[459,9543,9545,9548,9551,9553,9555,9557,9559,9561,9563,9565,9567],{"class":461,"line":9544},294,[459,9546,9547],{"class":1873},"                    let",[459,9549,9550],{"class":799}," sensor ",[459,9552,1880],{"class":465},[459,9554,3140],{"class":1954},[459,9556,5104],{"class":465},[459,9558,3948],{"class":1941},[459,9560,1047],{"class":465},[459,9562,3898],{"class":799},[459,9564,593],{"class":465},[459,9566,3382],{"class":799},[459,9568,5475],{"class":465},[459,9570,9572,9575,9577,9579,9581,9583,9585,9587,9589,9591,9593,9595,9597,9599],{"class":461,"line":9571},295,[459,9573,9574],{"class":799},"                    state",[459,9576,1886],{"class":465},[459,9578,9153],{"class":799},[459,9580,1886],{"class":465},[459,9582,9158],{"class":1941},[459,9584,6757],{"class":465},[459,9586,9163],{"class":1941},[459,9588,6757],{"class":465},[459,9590,5468],{"class":1941},[459,9592,1047],{"class":465},[459,9594,3777],{"class":799},[459,9596,1886],{"class":465},[459,9598,5845],{"class":1941},[459,9600,5337],{"class":465},[459,9602,9604,9607,9609,9611,9613,9615],{"class":461,"line":9603},296,[459,9605,9606],{"class":1954},"                    Ok",[459,9608,1047],{"class":465},[459,9610,9176],{"class":1941},[459,9612,1047],{"class":465},[459,9614,3777],{"class":799},[459,9616,8605],{"class":465},[459,9618,9620],{"class":461,"line":9619},297,[459,9621,5853],{"class":465},[459,9623,9625,9628,9630,9632,9634,9636,9638,9640,9643],{"class":461,"line":9624},298,[459,9626,9627],{"class":1954},"                Err",[459,9629,1047],{"class":465},[459,9631,8844],{"class":799},[459,9633,2089],{"class":465},[459,9635,2001],{"class":465},[459,9637,7877],{"class":1954},[459,9639,1047],{"class":465},[459,9641,9642],{"class":1954},"Failure",[459,9644,1797],{"class":465},[459,9646,9648,9651,9653,9655,9658,9660],{"class":461,"line":9647},299,[459,9649,9650],{"class":799},"                    code",[459,9652,1951],{"class":465},[459,9654,486],{"class":485},[459,9656,9657],{"class":489},"VALIDATION_FAILED",[459,9659,590],{"class":485},[459,9661,940],{"class":465},[459,9663,9665,9668,9670,9672,9675,9677,9679,9681],{"class":461,"line":9664},300,[459,9666,9667],{"class":799},"                    message",[459,9669,1951],{"class":465},[459,9671,486],{"class":485},[459,9673,9674],{"class":489},"Validation failed",[459,9676,590],{"class":485},[459,9678,1886],{"class":465},[459,9680,7544],{"class":1941},[459,9682,6763],{"class":465},[459,9684,9686,9689,9691,9693,9695,9697],{"class":461,"line":9685},301,[459,9687,9688],{"class":799},"                    address",[459,9690,1951],{"class":465},[459,9692,486],{"class":485},[459,9694,3777],{"class":489},[459,9696,590],{"class":485},[459,9698,940],{"class":465},[459,9700,9702,9705,9707,9709,9711,9713],{"class":461,"line":9701},302,[459,9703,9704],{"class":799},"                    operation",[459,9706,1951],{"class":465},[459,9708,2198],{"class":799},[459,9710,1886],{"class":465},[459,9712,7544],{"class":1941},[459,9714,6763],{"class":465},[459,9716,9718,9721,9723,9725,9727,9729,9731,9733],{"class":461,"line":9717},303,[459,9719,9720],{"class":799},"                    details",[459,9722,1951],{"class":465},[459,9724,8442],{"class":1954},[459,9726,1047],{"class":465},[459,9728,9176],{"class":1941},[459,9730,1047],{"class":465},[459,9732,8844],{"class":799},[459,9734,7894],{"class":465},[459,9736,9738],{"class":461,"line":9737},304,[459,9739,9740],{"class":465},"                }),\n",[459,9742,9744],{"class":461,"line":9743},305,[459,9745,6242],{"class":465},[459,9747,9749],{"class":461,"line":9748},306,[459,9750,5480],{"class":465},[459,9752,9754],{"class":461,"line":9753},307,[459,9755,541],{"emptyLinePlaceholder":115},[459,9757,9759,9762,9764,9766,9768,9770,9772,9774,9776,9778,9780,9782,9785,9787,9790,9792,9795,9797,9799,9801],{"class":461,"line":9758},308,[459,9760,9761],{"class":799},"        _ ",[459,9763,8011],{"class":465},[459,9765,7877],{"class":1954},[459,9767,1047],{"class":465},[459,9769,9642],{"class":1954},[459,9771,5104],{"class":465},[459,9773,9398],{"class":1941},[459,9775,1047],{"class":465},[459,9777,9403],{"class":1941},[459,9779,1047],{"class":465},[459,9781,590],{"class":485},[459,9783,9784],{"class":489},"Unknown operation '",[459,9786,2581],{"class":465},[459,9788,9789],{"class":489},"method",[459,9791,1853],{"class":465},[459,9793,9794],{"class":489},"' here",[459,9796,590],{"class":485},[459,9798,8423],{"class":465},[459,9800,2198],{"class":799},[459,9802,7894],{"class":465},[459,9804,9806],{"class":461,"line":9805},309,[459,9807,2773],{"class":465},[459,9809,9811],{"class":461,"line":9810},310,[459,9812,2272],{"class":465},[459,9814,9816],{"class":461,"line":9815},311,[459,9817,541],{"emptyLinePlaceholder":115},[459,9819,9821],{"class":461,"line":9820},312,[459,9822,9823],{"class":1675},"\u002F\u002F ─── Le fil — JSON-RPC 2.0, quelques lignes, aucune lib ─────────────\n",[459,9825,9827],{"class":461,"line":9826},313,[459,9828,541],{"emptyLinePlaceholder":115},[459,9830,9832,9834,9837,9839,9841,9843,9845,9847,9849,9852,9854,9856,9858,9860,9862,9864,9866,9869,9871,9873,9875,9877,9879,9881,9883,9885,9887,9889],{"class":461,"line":9831},314,[459,9833,2481],{"class":5091},[459,9835,9836],{"class":5091}," fn",[459,9838,2181],{"class":1941},[459,9840,1047],{"class":465},[459,9842,5107],{"class":1941},[459,9844,1047],{"class":465},[459,9846,7072],{"class":799},[459,9848,1967],{"class":465},[459,9850,9851],{"class":1954}," State",[459,9853,1973],{"class":465},[459,9855,5185],{"class":1954},[459,9857,1973],{"class":465},[459,9859,7079],{"class":1954},[459,9861,2068],{"class":465},[459,9863,5123],{"class":1941},[459,9865,1047],{"class":465},[459,9867,9868],{"class":799},"request",[459,9870,1967],{"class":465},[459,9872,5123],{"class":1954},[459,9874,1973],{"class":465},[459,9876,5750],{"class":1954},[459,9878,1997],{"class":465},[459,9880,5300],{"class":465},[459,9882,5123],{"class":1954},[459,9884,1973],{"class":465},[459,9886,5750],{"class":1954},[459,9888,2164],{"class":465},[459,9890,1797],{"class":465},[459,9892,9894,9896,9898,9900,9903,9905,9907,9909,9911,9913,9915,9917,9919,9921,9923,9925,9927,9929,9931],{"class":461,"line":9893},315,[459,9895,5310],{"class":1873},[459,9897,9226],{"class":799},[459,9899,1880],{"class":465},[459,9901,9902],{"class":799}," request",[459,9904,1886],{"class":465},[459,9906,7854],{"class":1941},[459,9908,1047],{"class":465},[459,9910,590],{"class":485},[459,9912,1250],{"class":489},[459,9914,590],{"class":485},[459,9916,8182],{"class":465},[459,9918,9490],{"class":1941},[459,9920,6757],{"class":465},[459,9922,9037],{"class":1941},[459,9924,1047],{"class":465},[459,9926,5750],{"class":1954},[459,9928,5104],{"class":465},[459,9930,9503],{"class":1954},[459,9932,5475],{"class":465},[459,9934,9936,9938,9941,9943,9945,9947,9949,9951,9953,9955,9957,9959,9961,9963,9965,9967,9969,9971,9973,9975,9977],{"class":461,"line":9935},316,[459,9937,5310],{"class":1873},[459,9939,9940],{"class":799}," method ",[459,9942,1880],{"class":465},[459,9944,9902],{"class":799},[459,9946,1886],{"class":465},[459,9948,7854],{"class":1941},[459,9950,1047],{"class":465},[459,9952,590],{"class":485},[459,9954,9789],{"class":489},[459,9956,590],{"class":485},[459,9958,8182],{"class":465},[459,9960,9247],{"class":1941},[459,9962,1047],{"class":465},[459,9964,5750],{"class":1954},[459,9966,5104],{"class":465},[459,9968,8586],{"class":799},[459,9970,8182],{"class":465},[459,9972,9037],{"class":1941},[459,9974,1047],{"class":465},[459,9976,9042],{"class":485},[459,9978,5475],{"class":465},[459,9980,9982,9984,9987,9989,9991,9993,9995,9997,9999,10001,10003,10005,10007,10009,10011,10013,10015],{"class":461,"line":9981},317,[459,9983,5310],{"class":1873},[459,9985,9986],{"class":799}," params ",[459,9988,1880],{"class":465},[459,9990,9902],{"class":799},[459,9992,1886],{"class":465},[459,9994,7854],{"class":1941},[459,9996,1047],{"class":465},[459,9998,590],{"class":485},[459,10000,949],{"class":489},[459,10002,590],{"class":485},[459,10004,8182],{"class":465},[459,10006,9490],{"class":1941},[459,10008,6757],{"class":465},[459,10010,9037],{"class":1941},[459,10012,1047],{"class":465},[459,10014,9176],{"class":1941},[459,10016,10017],{"class":465},"({}));\n",[459,10019,10021],{"class":461,"line":10020},318,[459,10022,541],{"emptyLinePlaceholder":115},[459,10024,10026,10028,10030,10032,10034,10036,10038,10040,10042,10044,10046],{"class":461,"line":10025},319,[459,10027,7846],{"class":1739},[459,10029,8951],{"class":1941},[459,10031,6775],{"class":465},[459,10033,7072],{"class":799},[459,10035,593],{"class":465},[459,10037,8966],{"class":799},[459,10039,593],{"class":465},[459,10041,5292],{"class":465},[459,10043,949],{"class":799},[459,10045,2089],{"class":465},[459,10047,1797],{"class":465},[459,10049,10051,10054,10056,10059,10061,10063,10065,10067,10069,10072,10074,10077,10079,10081,10083,10086,10088,10090,10092,10094,10096,10098,10100,10102,10104,10106,10108,10110,10113],{"class":461,"line":10050},320,[459,10052,10053],{"class":1954},"        Ok",[459,10055,1047],{"class":465},[459,10057,10058],{"class":799},"result",[459,10060,2089],{"class":465},[459,10062,2001],{"class":465},[459,10064,5123],{"class":1941},[459,10066,1047],{"class":465},[459,10068,9176],{"class":1941},[459,10070,10071],{"class":465},"({",[459,10073,486],{"class":485},[459,10075,10076],{"class":489},"jsonrpc",[459,10078,590],{"class":485},[459,10080,1951],{"class":465},[459,10082,486],{"class":485},[459,10084,10085],{"class":489},"2.0",[459,10087,590],{"class":485},[459,10089,593],{"class":465},[459,10091,486],{"class":485},[459,10093,1250],{"class":489},[459,10095,590],{"class":485},[459,10097,1951],{"class":465},[459,10099,3822],{"class":799},[459,10101,593],{"class":465},[459,10103,486],{"class":485},[459,10105,10058],{"class":489},[459,10107,590],{"class":485},[459,10109,1951],{"class":465},[459,10111,10112],{"class":799}," result ",[459,10114,10115],{"class":465},"})),\n",[459,10117,10119,10122,10124,10127,10129,10131,10133,10135,10137],{"class":461,"line":10118},321,[459,10120,10121],{"class":1954},"        Err",[459,10123,1047],{"class":465},[459,10125,10126],{"class":799},"failure",[459,10128,2089],{"class":465},[459,10130,2001],{"class":465},[459,10132,5123],{"class":1941},[459,10134,1047],{"class":465},[459,10136,9176],{"class":1941},[459,10138,5891],{"class":465},[459,10140,10142,10144,10146,10148,10150,10152,10154,10156],{"class":461,"line":10141},322,[459,10143,6103],{"class":485},[459,10145,10076],{"class":489},[459,10147,590],{"class":485},[459,10149,1951],{"class":465},[459,10151,486],{"class":485},[459,10153,10085],{"class":489},[459,10155,590],{"class":485},[459,10157,940],{"class":465},[459,10159,10161,10163,10165,10167,10169,10171],{"class":461,"line":10160},323,[459,10162,6103],{"class":485},[459,10164,1250],{"class":489},[459,10166,590],{"class":485},[459,10168,1951],{"class":465},[459,10170,3822],{"class":799},[459,10172,940],{"class":465},[459,10174,10176],{"class":461,"line":10175},324,[459,10177,10178],{"class":1675},"            \u002F\u002F -32000 = APP_ERROR : une défaillance applicative, pas un défaut de trame.\n",[459,10180,10182,10184,10186,10188,10190,10192,10194,10196,10198,10200,10202,10205,10207,10209,10211,10213,10215,10218,10220,10222,10224,10226,10228,10230,10233,10235,10237,10240],{"class":461,"line":10181},325,[459,10183,6103],{"class":485},[459,10185,3539],{"class":489},[459,10187,590],{"class":485},[459,10189,1951],{"class":465},[459,10191,577],{"class":465},[459,10193,486],{"class":485},[459,10195,28],{"class":489},[459,10197,590],{"class":485},[459,10199,1951],{"class":465},[459,10201,6385],{"class":465},[459,10203,10204],{"class":2406},"32000",[459,10206,593],{"class":465},[459,10208,486],{"class":485},[459,10210,3565],{"class":489},[459,10212,590],{"class":485},[459,10214,1951],{"class":465},[459,10216,10217],{"class":799}," failure",[459,10219,1886],{"class":465},[459,10221,3565],{"class":799},[459,10223,1886],{"class":465},[459,10225,5845],{"class":1941},[459,10227,7547],{"class":465},[459,10229,486],{"class":485},[459,10231,10232],{"class":489},"data",[459,10234,590],{"class":485},[459,10236,1951],{"class":465},[459,10238,10239],{"class":799}," failure ",[459,10241,2272],{"class":465},[459,10243,10245],{"class":461,"line":10244},326,[459,10246,10247],{"class":465},"        })),\n",[459,10249,10251],{"class":461,"line":10250},327,[459,10252,2773],{"class":465},[459,10254,10256],{"class":461,"line":10255},328,[459,10257,2272],{"class":465},[459,10259,10261],{"class":461,"line":10260},329,[459,10262,541],{"emptyLinePlaceholder":115},[459,10264,10266,10268,10270,10272,10274],{"class":461,"line":10265},330,[459,10267,7320],{"class":465},[459,10269,572],{"class":799},[459,10271,5104],{"class":465},[459,10273,4638],{"class":799},[459,10275,473],{"class":465},[459,10277,10279,10281,10283,10285,10287],{"class":461,"line":10278},331,[459,10280,2481],{"class":5091},[459,10282,9836],{"class":5091},[459,10284,2487],{"class":1941},[459,10286,3162],{"class":465},[459,10288,1797],{"class":465},[459,10290,10292,10294,10297,10299,10302,10304,10306,10308,10310],{"class":461,"line":10291},332,[459,10293,5310],{"class":1873},[459,10295,10296],{"class":799}," state ",[459,10298,1880],{"class":465},[459,10300,10301],{"class":1954}," Arc",[459,10303,5104],{"class":465},[459,10305,5728],{"class":1941},[459,10307,1047],{"class":465},[459,10309,7079],{"class":1954},[459,10311,1797],{"class":465},[459,10313,10315,10318,10320,10322,10324,10326,10328,10330],{"class":461,"line":10314},333,[459,10316,10317],{"class":799},"        sensors",[459,10319,1951],{"class":465},[459,10321,5190],{"class":1954},[459,10323,5104],{"class":465},[459,10325,5728],{"class":1941},[459,10327,1047],{"class":465},[459,10329,8475],{"class":1941},[459,10331,10332],{"class":465},"[\n",[459,10334,10336,10339,10341,10343,10345,10347,10350,10352,10354,10356,10358,10361,10363,10366],{"class":461,"line":10335},334,[459,10337,10338],{"class":1954},"            Sensor",[459,10340,5104],{"class":465},[459,10342,3948],{"class":1941},[459,10344,1047],{"class":465},[459,10346,590],{"class":485},[459,10348,10349],{"class":489},"cuve-nord",[459,10351,590],{"class":485},[459,10353,1886],{"class":465},[459,10355,7544],{"class":1941},[459,10357,7547],{"class":465},[459,10359,10360],{"class":2406}," 4",[459,10362,1886],{"class":465},[459,10364,10365],{"class":2406},"2",[459,10367,5951],{"class":465},[459,10369,10371,10373,10375,10377,10379,10381,10384,10386,10388,10390,10392,10395,10397,10399],{"class":461,"line":10370},335,[459,10372,10338],{"class":1954},[459,10374,5104],{"class":465},[459,10376,3948],{"class":1941},[459,10378,1047],{"class":465},[459,10380,590],{"class":485},[459,10382,10383],{"class":489},"cuve-sud",[459,10385,590],{"class":485},[459,10387,1886],{"class":465},[459,10389,7544],{"class":1941},[459,10391,7547],{"class":465},[459,10393,10394],{"class":2406}," 5",[459,10396,1886],{"class":465},[459,10398,587],{"class":2406},[459,10400,5951],{"class":465},[459,10402,10404],{"class":461,"line":10403},336,[459,10405,10406],{"class":465},"        ]),\n",[459,10408,10410,10413,10415,10417],{"class":461,"line":10409},337,[459,10411,10412],{"class":799},"        ops",[459,10414,1951],{"class":465},[459,10416,5872],{"class":1941},[459,10418,10419],{"class":465},"([\n",[459,10421,10423,10426,10428,10430,10432,10434,10436,10438,10440,10442,10445,10448,10450,10452,10454,10457,10459,10461,10464,10466,10468,10470,10472,10474,10476,10478,10480,10482,10484,10487,10489],{"class":461,"line":10422},338,[459,10424,10425],{"class":465},"            {",[459,10427,486],{"class":485},[459,10429,479],{"class":489},[459,10431,590],{"class":485},[459,10433,1951],{"class":465},[459,10435,486],{"class":485},[459,10437,3813],{"class":489},[459,10439,590],{"class":485},[459,10441,593],{"class":465},[459,10443,10444],{"class":485},"     \"",[459,10446,10447],{"class":489},"kind",[459,10449,590],{"class":485},[459,10451,1951],{"class":465},[459,10453,486],{"class":485},[459,10455,10456],{"class":489},"query",[459,10458,590],{"class":485},[459,10460,593],{"class":465},[459,10462,10463],{"class":485},"   \"",[459,10465,3286],{"class":489},[459,10467,590],{"class":485},[459,10469,1951],{"class":465},[459,10471,5701],{"class":1941},[459,10473,7547],{"class":465},[459,10475,486],{"class":485},[459,10477,6143],{"class":489},[459,10479,590],{"class":485},[459,10481,1951],{"class":465},[459,10483,486],{"class":485},[459,10485,10486],{"class":489},"Toutes les mesures connues, la plus récente d'abord.",[459,10488,590],{"class":485},[459,10490,4324],{"class":465},[459,10492,10494,10496,10498,10500,10502,10504,10506,10508,10510,10512,10514,10516,10518,10520,10522,10524,10526,10528,10530,10532,10534,10536,10538,10540,10542,10544,10546,10548,10550,10553,10555],{"class":461,"line":10493},339,[459,10495,10425],{"class":465},[459,10497,486],{"class":485},[459,10499,479],{"class":489},[459,10501,590],{"class":485},[459,10503,1951],{"class":465},[459,10505,486],{"class":485},[459,10507,4121],{"class":489},[459,10509,590],{"class":485},[459,10511,593],{"class":465},[459,10513,486],{"class":485},[459,10515,10447],{"class":489},[459,10517,590],{"class":485},[459,10519,1951],{"class":465},[459,10521,486],{"class":485},[459,10523,10456],{"class":489},[459,10525,590],{"class":485},[459,10527,593],{"class":465},[459,10529,10463],{"class":485},[459,10531,3286],{"class":489},[459,10533,590],{"class":485},[459,10535,1951],{"class":465},[459,10537,5701],{"class":1941},[459,10539,7547],{"class":465},[459,10541,486],{"class":485},[459,10543,6143],{"class":489},[459,10545,590],{"class":485},[459,10547,1951],{"class":465},[459,10549,486],{"class":485},[459,10551,10552],{"class":489},"Une mesure, désignée par son identifiant.",[459,10554,590],{"class":485},[459,10556,4324],{"class":465},[459,10558,10560,10562,10564,10566,10568,10570,10572,10574,10576,10578,10580,10582,10584,10586,10588,10591,10593,10595,10597,10599,10601,10603,10605,10607,10609,10611,10613,10615,10617,10620,10622],{"class":461,"line":10559},340,[459,10561,10425],{"class":465},[459,10563,486],{"class":485},[459,10565,479],{"class":489},[459,10567,590],{"class":485},[459,10569,1951],{"class":465},[459,10571,486],{"class":485},[459,10573,3948],{"class":489},[459,10575,590],{"class":485},[459,10577,593],{"class":465},[459,10579,10463],{"class":485},[459,10581,10447],{"class":489},[459,10583,590],{"class":485},[459,10585,1951],{"class":465},[459,10587,486],{"class":485},[459,10589,10590],{"class":489},"command",[459,10592,590],{"class":485},[459,10594,593],{"class":465},[459,10596,486],{"class":485},[459,10598,3286],{"class":489},[459,10600,590],{"class":485},[459,10602,1951],{"class":465},[459,10604,5701],{"class":1941},[459,10606,7547],{"class":465},[459,10608,486],{"class":485},[459,10610,6143],{"class":489},[459,10612,590],{"class":485},[459,10614,1951],{"class":465},[459,10616,486],{"class":485},[459,10618,10619],{"class":489},"Enregistre une mesure. Le frond estampille l'instant et le checksum.",[459,10621,590],{"class":485},[459,10623,623],{"class":465},[459,10625,10627],{"class":461,"line":10626},341,[459,10628,10406],{"class":465},[459,10630,10632],{"class":461,"line":10631},342,[459,10633,10634],{"class":465},"    });\n",[459,10636,10638],{"class":461,"line":10637},343,[459,10639,541],{"emptyLinePlaceholder":115},[459,10641,10643,10645,10648,10650,10652,10654,10656,10658,10661,10663,10665,10668,10670,10672,10675,10677,10679,10681,10684,10686,10688],{"class":461,"line":10642},344,[459,10644,5310],{"class":1873},[459,10646,10647],{"class":799}," app ",[459,10649,1880],{"class":465},[459,10651,5128],{"class":1954},[459,10653,5104],{"class":465},[459,10655,5728],{"class":1941},[459,10657,6757],{"class":465},[459,10659,10660],{"class":1941},"route",[459,10662,1047],{"class":465},[459,10664,590],{"class":485},[459,10666,10667],{"class":489},"\u002F_fougere\u002Fcall",[459,10669,590],{"class":485},[459,10671,593],{"class":465},[459,10673,10674],{"class":1941}," post",[459,10676,1047],{"class":465},[459,10678,2221],{"class":799},[459,10680,9271],{"class":465},[459,10682,10683],{"class":1941},"with_state",[459,10685,1047],{"class":465},[459,10687,7072],{"class":799},[459,10689,5475],{"class":465},[459,10691,10693,10695,10698,10700,10703,10705,10708,10710,10713,10715,10718,10720,10722,10725,10727,10729,10731,10733,10735],{"class":461,"line":10692},345,[459,10694,5310],{"class":1873},[459,10696,10697],{"class":799}," listener ",[459,10699,1880],{"class":465},[459,10701,10702],{"class":1954}," tokio",[459,10704,5104],{"class":465},[459,10706,10707],{"class":1954},"net",[459,10709,5104],{"class":465},[459,10711,10712],{"class":1954},"TcpListener",[459,10714,5104],{"class":465},[459,10716,10717],{"class":1941},"bind",[459,10719,1047],{"class":465},[459,10721,590],{"class":485},[459,10723,10724],{"class":489},"127.0.0.1:4200",[459,10726,590],{"class":485},[459,10728,8182],{"class":465},[459,10730,2574],{"class":1739},[459,10732,1886],{"class":465},[459,10734,9163],{"class":1941},[459,10736,5731],{"class":465},[459,10738,10740],{"class":461,"line":10739},346,[459,10741,541],{"emptyLinePlaceholder":115},[459,10743,10745,10748,10750,10752,10755,10757],{"class":461,"line":10744},347,[459,10746,10747],{"class":1941},"    println!",[459,10749,1047],{"class":465},[459,10751,590],{"class":485},[459,10753,10754],{"class":489},"telemetry (rust) — frond prêt sur http:\u002F\u002Flocalhost:4200",[459,10756,590],{"class":485},[459,10758,5475],{"class":465},[459,10760,10762,10764,10766,10768,10771,10773],{"class":461,"line":10761},348,[459,10763,10747],{"class":1941},[459,10765,1047],{"class":465},[459,10767,590],{"class":485},[459,10769,10770],{"class":489},"  1 frond · 1 entité · 3 opérations · rpc.discover",[459,10772,590],{"class":485},[459,10774,5475],{"class":465},[459,10776,10778],{"class":461,"line":10777},349,[459,10779,541],{"emptyLinePlaceholder":115},[459,10781,10783,10786,10788,10791,10793,10796,10798,10801,10803,10805,10807,10809],{"class":461,"line":10782},350,[459,10784,10785],{"class":1954},"    axum",[459,10787,5104],{"class":465},[459,10789,10790],{"class":1941},"serve",[459,10792,1047],{"class":465},[459,10794,10795],{"class":799},"listener",[459,10797,593],{"class":465},[459,10799,10800],{"class":799}," app",[459,10802,8182],{"class":465},[459,10804,2574],{"class":1739},[459,10806,1886],{"class":465},[459,10808,9163],{"class":1941},[459,10810,5731],{"class":465},[459,10812,10814],{"class":461,"line":10813},351,[459,10815,2272],{"class":465},[442,10817,10820],{"className":4803,"code":10818,"filename":10819,"language":4806,"meta":107,"style":107},"{\n  \"extends\": \"..\u002F..\u002Ftsconfig.base.json\",\n  \"compilerOptions\": {\n    \"rootDir\": \".\",\n    \"noEmit\": true\n  },\n  \"include\": [\"consumer.ts\"]\n}\n\n","tsconfig.json",[28,10821,10822,10826,10846,10859,10878,10892,10896,10917],{"__ignoreMap":107},[459,10823,10824],{"class":461,"line":462},[459,10825,4813],{"class":465},[459,10827,10828,10830,10833,10835,10837,10839,10842,10844],{"class":461,"line":108},[459,10829,4818],{"class":465},[459,10831,10832],{"class":4821},"extends",[459,10834,590],{"class":465},[459,10836,1951],{"class":465},[459,10838,486],{"class":485},[459,10840,10841],{"class":489},"..\u002F..\u002Ftsconfig.base.json",[459,10843,590],{"class":485},[459,10845,940],{"class":465},[459,10847,10848,10850,10853,10855,10857],{"class":461,"line":496},[459,10849,4818],{"class":465},[459,10851,10852],{"class":4821},"compilerOptions",[459,10854,590],{"class":465},[459,10856,1951],{"class":465},[459,10858,1797],{"class":465},[459,10860,10861,10863,10866,10868,10870,10872,10874,10876],{"class":461,"line":511},[459,10862,4888],{"class":465},[459,10864,10865],{"class":4891},"rootDir",[459,10867,590],{"class":465},[459,10869,1951],{"class":465},[459,10871,486],{"class":485},[459,10873,1886],{"class":489},[459,10875,590],{"class":485},[459,10877,940],{"class":465},[459,10879,10880,10882,10885,10887,10889],{"class":461,"line":526},[459,10881,4888],{"class":465},[459,10883,10884],{"class":4891},"noEmit",[459,10886,590],{"class":465},[459,10888,1951],{"class":465},[459,10890,10891],{"class":485}," true\n",[459,10893,10894],{"class":461,"line":538},[459,10895,4947],{"class":465},[459,10897,10898,10900,10903,10905,10907,10909,10911,10913,10915],{"class":461,"line":544},[459,10899,4818],{"class":465},[459,10901,10902],{"class":4821},"include",[459,10904,590],{"class":465},[459,10906,1951],{"class":465},[459,10908,601],{"class":465},[459,10910,590],{"class":485},[459,10912,1667],{"class":489},[459,10914,590],{"class":485},[459,10916,473],{"class":465},[459,10918,10919],{"class":461,"line":554},[459,10920,2272],{"class":465},[10922,10923,10924],"style",{},"html pre.shiki code .sd7zb, html code.shiki .sd7zb{--shiki-light:#39ADB5;--shiki-light-font-weight:inherit;--shiki-default:#A3B0A5;--shiki-default-font-weight:bold;--shiki-dark:#89DDFF;--shiki-dark-font-weight:inherit}html pre.shiki code .sLf9K, html code.shiki .sLf9K{--shiki-light:#E2931D;--shiki-light-font-weight:inherit;--shiki-default:#8FCF86;--shiki-default-font-weight:bold;--shiki-dark:#FFCB6B;--shiki-dark-font-weight:inherit}html pre.shiki code .sPEhv, html code.shiki .sPEhv{--shiki-light:#90A4AE;--shiki-default:#DDE5DA;--shiki-dark:#BABED8}html pre.shiki code .s15xx, html code.shiki .s15xx{--shiki-light:#39ADB5;--shiki-default:#A3B0A5;--shiki-dark:#89DDFF}html pre.shiki code .sN-8n, html code.shiki .sN-8n{--shiki-light:#91B859;--shiki-default:#EE9F6B;--shiki-dark:#C3E88D}html pre.shiki code .sHaeK, html code.shiki .sHaeK{--shiki-light:#39ADB5;--shiki-light-font-weight:bold;--shiki-default:#A3B0A5;--shiki-default-font-weight:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-weight:bold}html pre.shiki code .s7rwI, html code.shiki .s7rwI{--shiki-light:#E53935;--shiki-light-font-weight:bold;--shiki-default:#DDE5DA;--shiki-default-font-weight:inherit;--shiki-dark:#F07178;--shiki-dark-font-weight:bold}html pre.shiki code .siB6D, html code.shiki .siB6D{--shiki-light:#91B859;--shiki-default:#A3B0A5;--shiki-dark:#C3E88D}html pre.shiki code .sYNOY, html code.shiki .sYNOY{--shiki-light:#90A4AE90;--shiki-default:#DDE5DA;--shiki-dark:#BABED890}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .skXKP, html code.shiki .skXKP{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#7D8C80;--shiki-default-font-style:inherit;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sK6XW, html code.shiki .sK6XW{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#8FCF86;--shiki-default-font-style:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sDDC1, html code.shiki .sDDC1{--shiki-light:#39ADB5;--shiki-default:#EE9F6B;--shiki-dark:#89DDFF}html pre.shiki code .s76I7, html code.shiki .s76I7{--shiki-light:#9C3EDA;--shiki-default:#8FCF86;--shiki-dark:#C792EA}html pre.shiki code .sy9f4, html code.shiki .sy9f4{--shiki-light:#90A4AE;--shiki-default:#93CFC0;--shiki-dark:#BABED8}html pre.shiki code .s4mR9, html code.shiki .s4mR9{--shiki-light:#6182B8;--shiki-default:#C9B6EA;--shiki-dark:#82AAFF}html pre.shiki code .shDUQ, html code.shiki .shDUQ{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#DDE5DA;--shiki-default-font-style:inherit;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sBZYL, html code.shiki .sBZYL{--shiki-light:#E2931D;--shiki-default:#EFCD8F;--shiki-dark:#FFCB6B}html pre.shiki code .scTuO, html code.shiki .scTuO{--shiki-light:#9C3EDA;--shiki-default:#A3B0A5;--shiki-dark:#C792EA}html pre.shiki code .sgjsB, html code.shiki .sgjsB{--shiki-light:#6182B8;--shiki-default:#EFCD8F;--shiki-dark:#82AAFF}html pre.shiki code .spAFX, html code.shiki .spAFX{--shiki-light:#E53935;--shiki-default:#A3B0A5;--shiki-dark:#F07178}html pre.shiki code .sTa09, html code.shiki .sTa09{--shiki-light:#E53935;--shiki-default:#EFCD8F;--shiki-dark:#F07178}html pre.shiki code .sHtqg, html code.shiki .sHtqg{--shiki-light:#E53935;--shiki-default:#93CFC0;--shiki-dark:#F07178}html pre.shiki code .slP7D, html code.shiki .slP7D{--shiki-light:#90A4AE;--shiki-default:#C9B6EA;--shiki-dark:#BABED8}html pre.shiki code .srlTG, html code.shiki .srlTG{--shiki-light:#90A4AE;--shiki-default:#A3B0A5;--shiki-dark:#BABED8}html pre.shiki code .sfnqo, html code.shiki .sfnqo{--shiki-light:#90A4AE;--shiki-default:#EE9F6B;--shiki-dark:#BABED8}html pre.shiki code .s3dPA, html code.shiki .s3dPA{--shiki-light:#F76D47;--shiki-default:#EE9F6B;--shiki-dark:#F78C6C}html pre.shiki code .s8ClO, html code.shiki .s8ClO{--shiki-light:#9C3EDA;--shiki-default:#93CFC0;--shiki-dark:#C792EA}html pre.shiki code .sWI7z, html code.shiki .sWI7z{--shiki-light:#E2931D;--shiki-default:#93CFC0;--shiki-dark:#FFCB6B}html pre.shiki code .slmMI, html code.shiki .slmMI{--shiki-light:#FF5370;--shiki-default:#EE9F6B;--shiki-dark:#FF9CAC}html pre.shiki code .sWPpw, html code.shiki .sWPpw{--shiki-light:#F76D47;--shiki-default:#8FCF86;--shiki-dark:#F78C6C}html pre.shiki code .s2EDz, html code.shiki .s2EDz{--shiki-light:#E2931D;--shiki-default:#DDE5DA;--shiki-dark:#FFCB6B}html pre.shiki code .sTljH, html code.shiki .sTljH{--shiki-light:#90A4AE;--shiki-light-font-style:inherit;--shiki-default:#8FCF86;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:inherit}",{"title":107,"searchDepth":108,"depth":108,"links":10926},[],{},"\u002Fdemo\u002Frust-frond",{"title":105,"description":107},"demo\u002Frust-frond","U5U0iujpvxhTTtyO_TMmCDxkErjtKfmBddKkfr5HWnA",1794396615375]