[{"data":1,"prerenderedAt":866},["ShallowReactive",2],{"games":3,"levels:poisoned-review":107,"level:poisoned-review:fx-rates-client":124},[4,17,30,41,52,63,74,85,96],{"id":5,"order":6,"domain":7,"glyph":8,"requiresSandbox":9,"title":10,"tagline":13,"levelCount":6,"status":16},"legacy-nightmare",1,"refactoring","{ }",true,{"fr":11,"en":12},"Le cauchemar du Legacy","Legacy Nightmare",{"fr":14,"en":15},"Corrige le bug caché dans un code spaghetti, sans rien casser.","Fix the bug buried in spaghetti code without breaking anything.","available",{"id":18,"order":19,"domain":20,"glyph":20,"requiresSandbox":21,"title":22,"tagline":25,"levelCount":28,"status":29},"git-untangle",2,"git",false,{"fr":23,"en":24},"Démêlage d'historique","History Untangling",{"fr":26,"en":27},"Transforme un graphe de commits chaotique en historique propre.","Turn a chaotic commit graph into a clean history.",0,"coming-soon",{"id":31,"order":32,"domain":33,"glyph":34,"requiresSandbox":21,"title":35,"tagline":38,"levelCount":28,"status":29},"prod-pressure",3,"devops","RPS",{"fr":36,"en":37},"Pression en Prod","Prod Pressure",{"fr":39,"en":40},"Fais tenir la prod pendant le Black Friday, sans exploser le budget.","Keep production alive through Black Friday, on budget.",{"id":42,"order":43,"domain":44,"glyph":45,"requiresSandbox":9,"title":46,"tagline":49,"levelCount":28,"status":29},"the-heist",4,"security","0day",{"fr":47,"en":48},"Le braquage","The Heist",{"fr":50,"en":51},"Lis l'API, trouve la faille logique, exploite-la.","Read the API, find the logic flaw, exploit it.",{"id":53,"order":54,"domain":55,"glyph":56,"requiresSandbox":21,"title":57,"tagline":60,"levelCount":6,"status":16},"tech-dilemmas",5,"product","A|B",{"fr":58,"en":59},"Dilemmes","Tech Dilemmas",{"fr":61,"en":62},"Survis à un sprint d'arbitrages impossibles.","Survive a sprint of impossible trade-offs.",{"id":64,"order":65,"domain":66,"glyph":67,"requiresSandbox":21,"title":68,"tagline":71,"levelCount":28,"status":29},"cap-workshop",6,"distributed","CAP",{"fr":69,"en":70},"L'Atelier du Théorème CAP","CAP Workshop",{"fr":72,"en":73},"Choisis les bons compromis avant que le réseau ne se coupe.","Pick the right trade-offs before the network splits.",{"id":75,"order":76,"domain":77,"glyph":78,"requiresSandbox":9,"title":79,"tagline":82,"levelCount":28,"status":29},"feature-creeps",7,"patterns","\u003CT>",{"fr":80,"en":81},"L'attaque des Feature Creeps","Attack of the Feature Creeps",{"fr":83,"en":84},"Absorbe des règles métier sans fin sans réécrire ton cœur.","Absorb endless business rules without rewriting your core.",{"id":86,"order":87,"domain":88,"glyph":89,"requiresSandbox":21,"title":90,"tagline":93,"levelCount":32,"status":16},"poisoned-review",8,"review","PR",{"fr":91,"en":92},"La Code Review Empoisonnée","Poisoned Code Review",{"fr":94,"en":95},"Une PR parfaite en apparence cache une bombe. Trouve la ligne.","A flawless-looking PR hides a time bomb. Find the line.",{"id":97,"order":98,"domain":99,"glyph":100,"requiresSandbox":21,"hidden":9,"title":101,"tagline":104,"levelCount":6,"status":16},"engine-demo",99,"demo","?",{"fr":102,"en":103},"Démo du moteur de niveaux","Level engine demo",{"fr":105,"en":106},"Niveau factice qui exerce le moteur de bout en bout : indices, validation, score, débrief.","Dummy level exercising the engine end to end: hints, validation, score, debrief.",[108,113,118],{"id":109,"gameId":86,"order":6,"title":110,"difficulty":19,"estimatedMinutes":65},"store-dashboard",{"fr":111,"en":112},"Le dashboard des magasins","The store dashboard",{"id":114,"gameId":86,"order":19,"title":115,"difficulty":32,"estimatedMinutes":87},"wallet-transfer",{"fr":116,"en":117},"Virements entre portefeuilles","Wallet transfers",{"id":119,"gameId":86,"order":32,"title":120,"difficulty":32,"estimatedMinutes":123},"fx-rates-client",{"fr":121,"en":122},"Le client de taux de change","The FX rates client",10,{"id":119,"gameId":86,"order":32,"title":125,"difficulty":32,"estimatedMinutes":123,"context":126,"objective":129,"tools":132,"initialState":135,"hints":856,"scoring":863},{"fr":121,"en":122},{"fr":127,"en":128},"Le service de facturation convertit chaque facture en euros au moment de son émission. Il tourne sur **4 pods Kubernetes** (limite : 512 Mo chacun), qui ne redémarrent qu'au déploiement suivant, soit toutes les une à deux semaines.\n\nEn fin de mois, il émet **~40 factures par seconde**. Le fournisseur de taux facture chaque appel et coupe les rafales : l'équipe a donc demandé de **dédupliquer** les appels concurrents.","The billing service converts every invoice to euros when it is issued. It runs on **4 Kubernetes pods** (limit: 512 MB each), which only restart at the next deployment, every one to two weeks.\n\nAt month end it issues **~40 invoices per second**. The FX provider bills every call and cuts bursts off, so the team asked to **deduplicate** concurrent calls.",{"fr":130,"en":131},"Trouve la ligne qui fera tomber le service dans quelques jours, puis nomme le problème.","Find the line that will bring the service down in a few days, then name the problem.",[133,134],"diff-viewer","justification-menu",{"pr":136,"justificationOptions":147,"files":178},{"number":137,"title":138,"author":141,"description":142,"base":145,"head":146},1204,{"fr":139,"en":140},"perf(fx) : dédupliquer les appels concurrents au fournisseur de taux","perf(fx): deduplicate concurrent calls to the FX provider","lucie-t",{"fr":143,"en":144},"## Pourquoi\nLe fournisseur nous a facturé 1,2 M d'appels le mois dernier, et renvoie des `429` en fin de mois.\n\n## Quoi\n- Nouveau `FxRatesClient` : les appels **concurrents** pour le même taux partagent **une seule** requête HTTP (single-flight)\n- `InvoiceService` fige la date d'émission et l'utilise pour le taux, pour que facture et taux soient cohérents\n- Timeout de 2 s sur l'appel fournisseur\n\n## Résultat\nBenchmark local : 500 factures en parallèle → **1** appel fournisseur au lieu de 500. 🚀","## Why\nThe provider billed us for 1.2 M calls last month, and returns `429`s at month end.\n\n## What\n- New `FxRatesClient`: **concurrent** calls for the same rate share **a single** HTTP request (single-flight)\n- `InvoiceService` freezes the issue date and uses it for the rate, so invoice and rate stay consistent\n- 2 s timeout on the provider call\n\n## Result\nLocal benchmark: 500 invoices in parallel → **1** provider call instead of 500. 🚀","main","perf\u002Ffx-single-flight",[148,153,158,163,168,173],{"id":149,"label":150},"race-condition",{"fr":151,"en":152},"Condition de course","Race condition",{"id":154,"label":155},"stale-cache",{"fr":156,"en":157},"Données périmées servies par un cache","Stale data served from a cache",{"id":159,"label":160},"memory-leak",{"fr":161,"en":162},"Fuite mémoire","Memory leak",{"id":164,"label":165},"n-plus-one",{"fr":166,"en":167},"Requête N+1","N+1 query",{"id":169,"label":170},"missing-transaction",{"fr":171,"en":172},"Atomicité non garantie (transaction)","Atomicity not guaranteed (transaction)",{"id":174,"label":175},"float-money",{"fr":176,"en":177},"Montants en virgule flottante","Floating-point money",[179,692],{"path":180,"language":181,"status":182,"hunks":183},"src\u002Ffx\u002Ffx-rates.client.ts","typescript","added",[184],{"header":185,"lines":186},"@@ -0,0 +1,40 @@",[187,204,214,224,227,241,254,263,273,283,288,292,299,305,311,317,328,340,364,393,397,418,422,455,483,502,515,529,541,547,556,562,566,599,619,643,649,674,682,687],{"id":188,"type":189,"oldNo":190,"newNo":6,"tokens":191},"e72e35c723","add",null,[192,195,197,199,201],{"content":193,"color":194},"import","#FF7B72",{"content":196}," { Injectable, Logger } ",{"content":198,"color":194},"from",{"content":200}," ",{"content":202,"color":203},"'@nestjs\u002Fcommon'","#A5D6FF",{"id":205,"type":189,"oldNo":190,"newNo":19,"tokens":206},"5a9efa53d3",[207,208,210,211,212],{"content":193,"color":194},{"content":209}," { HttpService } ",{"content":198,"color":194},{"content":200},{"content":213,"color":203},"'@nestjs\u002Faxios'",{"id":215,"type":189,"oldNo":190,"newNo":32,"tokens":216},"9a8a3279ec",[217,218,220,221,222],{"content":193,"color":194},{"content":219}," { firstValueFrom } ",{"content":198,"color":194},{"content":200},{"content":223,"color":203},"'rxjs'",{"id":225,"type":189,"oldNo":190,"newNo":43,"tokens":226},"7b4396188f",[],{"id":228,"type":189,"oldNo":190,"newNo":54,"tokens":229},"c68bcae9fe",[230,232,233,235,236,239],{"content":231,"color":194},"export",{"content":200},{"content":234,"color":194},"interface",{"content":200},{"content":237,"color":238},"FxRate","#FFA657",{"content":240}," {",{"id":242,"type":189,"oldNo":190,"newNo":65,"tokens":243},"eafd9837b8",[244,246,248,250,251],{"content":245},"  ",{"content":247,"color":238},"base",{"content":249,"color":194},":",{"content":200},{"content":252,"color":253},"string","#79C0FF",{"id":255,"type":189,"oldNo":190,"newNo":76,"tokens":256},"16accc6389",[257,258,260,261,262],{"content":245},{"content":259,"color":238},"quote",{"content":249,"color":194},{"content":200},{"content":252,"color":253},{"id":264,"type":189,"oldNo":190,"newNo":87,"tokens":265},"7d01e74af4",[266,267,269,270,271],{"content":245},{"content":268,"color":238},"rate",{"content":249,"color":194},{"content":200},{"content":272,"color":253},"number",{"id":274,"type":189,"oldNo":190,"newNo":275,"tokens":276},"ade57dd71d",9,[277,278,280,281,282],{"content":245},{"content":279,"color":238},"asOf",{"content":249,"color":194},{"content":200},{"content":252,"color":253},{"id":284,"type":189,"oldNo":190,"newNo":123,"tokens":285},"355b0c9c2f",[286],{"content":287},"}",{"id":289,"type":189,"oldNo":190,"newNo":290,"tokens":291},"f4eb6f591f",11,[],{"id":293,"type":189,"oldNo":190,"newNo":294,"tokens":295},"f96361bf3f",12,[296],{"content":297,"color":298},"\u002F**","#8B949E",{"id":300,"type":189,"oldNo":190,"newNo":301,"tokens":302},"0168848c35",13,[303],{"content":304,"color":298}," * Client of the FX provider. The provider bills every call and throttles",{"id":306,"type":189,"oldNo":190,"newNo":307,"tokens":308},"00d091d044",14,[309],{"content":310,"color":298}," * bursts, so concurrent lookups of the same rate share a single HTTP request.",{"id":312,"type":189,"oldNo":190,"newNo":313,"tokens":314},"4ba5a2f237",15,[315],{"content":316,"color":298}," *\u002F",{"id":318,"type":189,"oldNo":190,"newNo":319,"tokens":320},"0fee1e045f",16,[321,323,326],{"content":322},"@",{"content":324,"color":325},"Injectable","#D2A8FF",{"content":327},"()",{"id":329,"type":189,"oldNo":190,"newNo":330,"tokens":331},"1c14cccfc7",17,[332,333,334,336,337,339],{"content":231,"color":194},{"content":200},{"content":335,"color":194},"class",{"content":200},{"content":338,"color":238},"FxRatesClient",{"content":240},{"id":341,"type":189,"oldNo":190,"newNo":342,"tokens":343},"4695ef0131",18,[344,345,347,348,350,351,353,354,356,357,359,360,362],{"content":245},{"content":346,"color":194},"private",{"content":200},{"content":349,"color":194},"readonly",{"content":200},{"content":352,"color":238},"logger",{"content":200},{"content":355,"color":194},"=",{"content":200},{"content":358,"color":194},"new",{"content":200},{"content":361,"color":325},"Logger",{"content":363},"(FxRatesClient.name)",{"id":365,"type":189,"oldNo":190,"newNo":366,"tokens":367},"007311e576",19,[368,369,370,371,372,373,375,376,377,378,379,380,382,384,385,387,389,390,391],{"content":245},{"content":346,"color":194},{"content":200},{"content":349,"color":194},{"content":200},{"content":374,"color":238},"inflight",{"content":200},{"content":355,"color":194},{"content":200},{"content":358,"color":194},{"content":200},{"content":381,"color":325},"Map",{"content":383},"\u003C",{"content":252,"color":253},{"content":386},", ",{"content":388,"color":238},"Promise",{"content":383},{"content":237,"color":238},{"content":392},">>()",{"id":394,"type":189,"oldNo":190,"newNo":395,"tokens":396},"58e4a03a73",20,[],{"id":398,"type":189,"oldNo":190,"newNo":399,"tokens":400},"fbf1b8c8fe",21,[401,402,404,406,407,408,409,410,412,413,414,416],{"content":245},{"content":403,"color":194},"constructor",{"content":405},"(",{"content":346,"color":194},{"content":200},{"content":349,"color":194},{"content":200},{"content":411,"color":238},"http",{"content":249,"color":194},{"content":200},{"content":415,"color":238},"HttpService",{"content":417},") {}",{"id":419,"type":189,"oldNo":190,"newNo":420,"tokens":421},"6a3bd5802d",22,[],{"id":423,"type":189,"oldNo":190,"newNo":424,"tokens":425},"99c80f5f6f",23,[426,427,429,430,431,432,433,434,435,436,437,438,439,440,442,443,444,446,448,449,450,451,452,453],{"content":245},{"content":428,"color":325},"getRate",{"content":405},{"content":247,"color":238},{"content":249,"color":194},{"content":200},{"content":252,"color":253},{"content":386},{"content":259,"color":238},{"content":249,"color":194},{"content":200},{"content":252,"color":253},{"content":386},{"content":441,"color":238},"at",{"content":249,"color":194},{"content":200},{"content":445,"color":238},"Date",{"content":447},")",{"content":249,"color":194},{"content":200},{"content":388,"color":238},{"content":383},{"content":237,"color":238},{"content":454},"> {",{"id":456,"type":189,"oldNo":190,"newNo":457,"tokens":458},"1e7a101e0b",24,[459,461,463,464,466,467,468,469,471,472,474,475,476,477,479,481],{"content":460},"    ",{"content":462,"color":194},"const",{"content":200},{"content":465,"color":253},"key",{"content":200},{"content":355,"color":194},{"content":200},{"content":470,"color":203},"`${",{"content":247},{"content":473,"color":203},"}:${",{"content":259},{"content":473,"color":203},{"content":441},{"content":478,"color":203},".",{"content":480,"color":325},"toISOString",{"content":482,"color":203},"()}`",{"id":484,"type":189,"oldNo":190,"newNo":485,"tokens":486},"ffa073ff55",25,[487,488,490,492,493,494,496,498,500],{"content":460},{"content":489,"color":194},"let",{"content":491}," request ",{"content":355,"color":194},{"content":200},{"content":495,"color":253},"this",{"content":497},".inflight.",{"content":499,"color":325},"get",{"content":501},"(key)",{"id":503,"type":189,"oldNo":190,"newNo":504,"tokens":505},"2b9fc47823",26,[506,507,509,511,513],{"content":460},{"content":508,"color":194},"if",{"content":510}," (",{"content":512,"color":194},"!",{"content":514},"request) {",{"id":516,"type":189,"oldNo":190,"newNo":517,"tokens":518},"2addc9fa03",27,[519,521,522,523,524,525,527],{"content":520},"      request ",{"content":355,"color":194},{"content":200},{"content":495,"color":253},{"content":478},{"content":526,"color":325},"fetchRate",{"content":528},"(base, quote, at)",{"id":530,"type":189,"oldNo":190,"newNo":531,"tokens":532},"f763498dc3",28,[533,535,536,537,539],{"content":534},"      ",{"content":495,"color":253},{"content":497},{"content":538,"color":325},"set",{"content":540},"(key, request)",{"id":542,"type":189,"oldNo":190,"newNo":543,"tokens":544},"b77b0028ff",29,[545],{"content":546},"    }",{"id":548,"type":189,"oldNo":190,"newNo":549,"tokens":550},"a8db66aa15",30,[551,552,554],{"content":460},{"content":553,"color":194},"return",{"content":555}," request",{"id":557,"type":189,"oldNo":190,"newNo":558,"tokens":559},"c8a266df0a",31,[560],{"content":561},"  }",{"id":563,"type":189,"oldNo":190,"newNo":564,"tokens":565},"a8913b824a",32,[],{"id":567,"type":189,"oldNo":190,"newNo":568,"tokens":569},"572a218005",33,[570,571,572,573,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598],{"content":245},{"content":346,"color":194},{"content":200},{"content":574,"color":194},"async",{"content":200},{"content":526,"color":325},{"content":405},{"content":247,"color":238},{"content":249,"color":194},{"content":200},{"content":252,"color":253},{"content":386},{"content":259,"color":238},{"content":249,"color":194},{"content":200},{"content":252,"color":253},{"content":386},{"content":441,"color":238},{"content":249,"color":194},{"content":200},{"content":445,"color":238},{"content":447},{"content":249,"color":194},{"content":200},{"content":388,"color":238},{"content":383},{"content":237,"color":238},{"content":454},{"id":600,"type":189,"oldNo":190,"newNo":601,"tokens":602},"60462107ba",34,[603,604,605,607,609,611,612,613,615,616,618],{"content":460},{"content":462,"color":194},{"content":606}," { ",{"content":608,"color":253},"data",{"content":610}," } ",{"content":355,"color":194},{"content":200},{"content":614,"color":194},"await",{"content":200},{"content":617,"color":325},"firstValueFrom",{"content":405},{"id":620,"type":189,"oldNo":190,"newNo":621,"tokens":622},"4c7e666b0d",35,[623,624,625,627,628,629,630,632,634,636,637,639,641],{"content":534},{"content":495,"color":253},{"content":626},".http.",{"content":499,"color":325},{"content":383},{"content":237,"color":238},{"content":631},">(",{"content":633,"color":203},"'\u002Fv2\u002Frates'",{"content":635},", { params: { base, quote, at: at.",{"content":480,"color":325},{"content":638},"() }, timeout: ",{"content":640,"color":253},"2_000",{"content":642}," }),",{"id":644,"type":189,"oldNo":190,"newNo":645,"tokens":646},"41839c2dac",36,[647],{"content":648},"    )",{"id":650,"type":189,"oldNo":190,"newNo":651,"tokens":652},"c8039c560d",37,[653,654,655,657,659,660,662,663,665,666,668,669,670,671,673],{"content":460},{"content":495,"color":253},{"content":656},".logger.",{"content":658,"color":325},"debug",{"content":405},{"content":661,"color":203},"`Fetched ${",{"content":247},{"content":664,"color":203},"}\u002F${",{"content":259},{"content":667,"color":203},"} = ${",{"content":608},{"content":478,"color":203},{"content":268},{"content":672,"color":203},"}`",{"content":447},{"id":675,"type":189,"oldNo":190,"newNo":676,"tokens":677},"1669059378",38,[678,679,680],{"content":460},{"content":553,"color":194},{"content":681}," data",{"id":683,"type":189,"oldNo":190,"newNo":684,"tokens":685},"218911e13f",39,[686],{"content":561},{"id":688,"type":189,"oldNo":190,"newNo":689,"tokens":690},"48d65cc9d0",40,[691],{"content":287},{"path":693,"language":181,"status":694,"hunks":695},"src\u002Fbilling\u002Finvoice.service.ts","modified",[696,740],{"header":697,"lines":698},"@@ -1,3 +1,3 @@",[699,709,720,730],{"id":700,"type":701,"oldNo":6,"newNo":6,"tokens":702},"dcf7d8da0f","ctx",[703,704,706,707,708],{"content":193,"color":194},{"content":705}," { Injectable } ",{"content":198,"color":194},{"content":200},{"content":202,"color":203},{"id":710,"type":711,"oldNo":19,"newNo":190,"tokens":712},"2ae415af09","del",[713,714,716,717,718],{"content":193,"color":194},{"content":715}," { FxService } ",{"content":198,"color":194},{"content":200},{"content":719,"color":203},"'..\u002Ffx\u002Ffx.service'",{"id":721,"type":189,"oldNo":190,"newNo":19,"tokens":722},"c1f5fa9151",[723,724,726,727,728],{"content":193,"color":194},{"content":725}," { FxRatesClient } ",{"content":198,"color":194},{"content":200},{"content":729,"color":203},"'..\u002Ffx\u002Ffx-rates.client'",{"id":731,"type":701,"oldNo":32,"newNo":32,"tokens":732},"d76c6eae96",[733,734,736,737,738],{"content":193,"color":194},{"content":735}," { InvoiceRepository } ",{"content":198,"color":194},{"content":200},{"content":739,"color":203},"'.\u002Finvoice.repository'",{"header":741,"lines":742},"@@ -9,12 +9,14 @@ export class InvoiceService {",[743,749,754,759,764,769,772,788,793,804,813,818,826,831,847,852],{"id":744,"type":701,"oldNo":275,"newNo":275,"tokens":745},"f80212d3c9",[746,747,748],{"content":245},{"content":403,"color":325},{"content":405},{"id":750,"type":701,"oldNo":123,"newNo":123,"tokens":751},"08832a3b61",[752],{"content":753},"    private readonly invoices: InvoiceRepository,",{"id":755,"type":711,"oldNo":290,"newNo":190,"tokens":756},"4af197ce46",[757],{"content":758},"    private readonly fx: FxService,",{"id":760,"type":189,"oldNo":190,"newNo":290,"tokens":761},"efde69be43",[762],{"content":763},"    private readonly fxRates: FxRatesClient,",{"id":765,"type":701,"oldNo":294,"newNo":294,"tokens":766},"ee14f2759f",[767],{"content":768},"  ) {}",{"id":770,"type":701,"oldNo":301,"newNo":301,"tokens":771},"cfa06ece22",[],{"id":773,"type":701,"oldNo":307,"newNo":307,"tokens":774},"def4343260",[775,777,779,781,782,783,785,787],{"content":776},"  async ",{"content":778,"color":325},"issue",{"content":780},"(draft: InvoiceDraft): ",{"content":388,"color":253},{"content":383,"color":194},{"content":784},"Invoice",{"content":786,"color":194},">",{"content":240},{"id":789,"type":711,"oldNo":313,"newNo":190,"tokens":790},"2f03f440e2",[791],{"content":792},"    const { rate } = await this.fx.getEurRate(draft.currency)",{"id":794,"type":189,"oldNo":190,"newNo":313,"tokens":795},"272f5fb238",[796,798,799,800,801,802,803],{"content":797},"    const issuedAt ",{"content":355,"color":194},{"content":200},{"content":358,"color":194},{"content":200},{"content":445,"color":325},{"content":327},{"id":805,"type":189,"oldNo":190,"newNo":319,"tokens":806},"f26b22032c",[807,809,811],{"content":808},"    const { rate } = await this.fxRates.getRate(draft.currency, ",{"content":810,"color":203},"'EUR'",{"content":812},", issuedAt)",{"id":814,"type":701,"oldNo":319,"newNo":330,"tokens":815},"15c7f8273b",[816],{"content":817},"    return this.invoices.save({",{"id":819,"type":701,"oldNo":330,"newNo":342,"tokens":820},"5192a0799c",[821,822,824],{"content":534},{"content":823,"color":194},"...",{"content":825},"draft,",{"id":827,"type":189,"oldNo":190,"newNo":366,"tokens":828},"7a837c75bd",[829],{"content":830},"      issuedAt,",{"id":832,"type":701,"oldNo":342,"newNo":395,"tokens":833},"f3007767b9",[834,835,837,839,841,843,845],{"content":534},{"content":836,"color":238},"totalEurCents",{"content":838},": Math.",{"content":840,"color":325},"round",{"content":842},"(draft.totalCents ",{"content":844,"color":194},"*",{"content":846}," rate),",{"id":848,"type":701,"oldNo":366,"newNo":399,"tokens":849},"a8a9eda2f1",[850],{"content":851},"    })",{"id":853,"type":701,"oldNo":395,"newNo":420,"tokens":854},"fca8e13854",[855],{"content":561},[857,859,861],{"type":858},"observation",{"type":860},"reflection",{"type":862},"focus",{"base":864,"parTimeSeconds":865},150,420,1790619203973]