@rr0/ufoathome 0.137.0 → 0.139.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-embed-scene/BeamSystem-Dp1WU1Zx.js +1 -0
- package/dist-embed-scene/ContrailGrowth-DwHS8If9.js +1 -0
- package/dist-embed-scene/ContrailSystem-GO0Hkyj3.js +1 -0
- package/dist-embed-scene/{SceneNames_es-D_98QraV.js → SceneNames_es-BS2ioieu.js} +1 -1
- package/dist-embed-scene/{SceneNames_fr-y6Z57BDf.js → SceneNames_fr-B-fRwUUu.js} +1 -1
- package/dist-embed-scene/{SceneNames_it-DQt9yIh1.js → SceneNames_it-B-QEwmuM.js} +1 -1
- package/dist-embed-scene/rr0-scene.mjs +346 -346
- package/dist-embed-scene/sightingSchema-Dn9Nacua.js +1 -0
- package/{dist-embed-sighting/trafficRuntime-sSIo5Lms.js → dist-embed-scene/trafficRuntime-BPEJW9KZ.js} +2 -2
- package/dist-embed-sighting/BeamSystem-Ddt2lTBT.js +1 -0
- package/dist-embed-sighting/ContrailGrowth-DwHS8If9.js +1 -0
- package/dist-embed-sighting/ContrailSystem-D_EBfThB.js +1 -0
- package/dist-embed-sighting/{SceneNames_es-Zb4vw-Vp.js → SceneNames_es-wkWHMHet.js} +1 -1
- package/dist-embed-sighting/{SceneNames_fr-C6_IIN2c.js → SceneNames_fr-DbbzZ1bB.js} +1 -1
- package/dist-embed-sighting/{SceneNames_it-D7GivBq2.js → SceneNames_it-BsxnweGu.js} +1 -1
- package/dist-embed-sighting/rr0-sighting.mjs +330 -330
- package/dist-embed-sighting/sightingSchema-Dn9Nacua.js +1 -0
- package/dist-embed-sighting/trafficRuntime-CfPqH9j0.js +2 -0
- package/dist-embed-sighting-editor/BeamSystem-B3qYVuHd.js +1 -0
- package/dist-embed-sighting-editor/ContrailGrowth-DwHS8If9.js +1 -0
- package/dist-embed-sighting-editor/ContrailSystem-D9rPfOBE.js +1 -0
- package/dist-embed-sighting-editor/{InterviewEditorElement-DHxRISPC.js → InterviewEditorElement-CJxgekiU.js} +2 -2
- package/dist-embed-sighting-editor/LaunchEditor-CPa-pltK.js +18 -0
- package/dist-embed-sighting-editor/LaunchEditorMessages_en-DH8gI1vo.js +1 -0
- package/dist-embed-sighting-editor/LaunchEditorMessages_es-WCfaY4uY.js +1 -0
- package/dist-embed-sighting-editor/LaunchEditorMessages_fr-CWCGUG_A.js +1 -0
- package/dist-embed-sighting-editor/LaunchEditorMessages_it-DxSSiAd7.js +1 -0
- package/dist-embed-sighting-editor/{SceneNames_es-7RR79EmC.js → SceneNames_es-umTyyCxN.js} +1 -1
- package/dist-embed-sighting-editor/{SceneNames_fr-Da_S9KXa.js → SceneNames_fr-BNgnxIHx.js} +1 -1
- package/dist-embed-sighting-editor/{SceneNames_it-BwFZROII.js → SceneNames_it-5UYhmJHo.js} +1 -1
- package/dist-embed-sighting-editor/SightingEditorMessages_es-UiUywEk4.js +12 -0
- package/dist-embed-sighting-editor/{SightingEditorMessages_fr-90Ojknvv.js → SightingEditorMessages_fr-D5pajHZd.js} +2 -2
- package/dist-embed-sighting-editor/SightingEditorMessages_it-9SduHYDB.js +12 -0
- package/dist-embed-sighting-editor/{SightingFileEditor-DcOCyimm.js → SightingFileEditor-CJX1-U4q.js} +1 -1
- package/dist-embed-sighting-editor/rr0-sighting-editor.mjs +458 -435
- package/dist-embed-sighting-editor/sightingSchema-Dn9Nacua.js +1 -0
- package/dist-embed-sighting-editor/surroundingsSources-BK1okKkz.js +1 -0
- package/dist-embed-sighting-editor/trafficRuntime-BAGbGiVc.js +2 -0
- package/package.json +1 -1
- package/dist-embed-scene/BeamSystem-DDqbr8Bb.js +0 -1
- package/dist-embed-scene/ContrailGrowth-CuAzwIoc.js +0 -1
- package/dist-embed-scene/ContrailSystem-CG5BhBF7.js +0 -1
- package/dist-embed-scene/sightingSchema-CNCtrneh.js +0 -1
- package/dist-embed-scene/trafficRuntime-CgM31CwB.js +0 -2
- package/dist-embed-sighting/BeamSystem-wkZ6I_8Y.js +0 -1
- package/dist-embed-sighting/ContrailGrowth-CuAzwIoc.js +0 -1
- package/dist-embed-sighting/ContrailSystem-XVzDvxFV.js +0 -1
- package/dist-embed-sighting/sightingSchema-CNCtrneh.js +0 -1
- package/dist-embed-sighting-editor/BeamSystem-YGYbbAkU.js +0 -1
- package/dist-embed-sighting-editor/ContrailGrowth-CuAzwIoc.js +0 -1
- package/dist-embed-sighting-editor/ContrailSystem-CyYvtUTV.js +0 -1
- package/dist-embed-sighting-editor/LaunchEditor-qoB8RSgQ.js +0 -13
- package/dist-embed-sighting-editor/LaunchEditorMessages_en-BzymQ_VU.js +0 -1
- package/dist-embed-sighting-editor/LaunchEditorMessages_es-DzI2xAcW.js +0 -1
- package/dist-embed-sighting-editor/LaunchEditorMessages_fr-BLOwKfkH.js +0 -1
- package/dist-embed-sighting-editor/LaunchEditorMessages_it-CuovusOf.js +0 -1
- package/dist-embed-sighting-editor/SightingEditorMessages_es-BFzjoSef.js +0 -12
- package/dist-embed-sighting-editor/SightingEditorMessages_it-BtQIjKie.js +0 -12
- package/dist-embed-sighting-editor/sightingSchema-CNCtrneh.js +0 -1
- package/dist-embed-sighting-editor/surroundingsSources-B1931yh4.js +0 -1
- package/dist-embed-sighting-editor/trafficRuntime-lbQ2eKSF.js +0 -2
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
const e={basisTitle:"Come è stato ottenuto questo valore",basisField:"Base",howField:"Come",rationaleField:"Giustificazione",basisReset:"Base riportata a «dichiarata»: il valore è stato riscritto (era: {basis}).",lawSources:"Fonti: {sources}",extrapolation:"Queste leggi sono misurate su osservazioni notturne: applicarle a un'osservazione diurna è un'estrapolazione.",sectionAccountConditions:"Condizioni della testimonianza",sectionViewing:"Condizioni di visione",sectionMoon:"Calibro Luna",sectionErrorParameters:"Parametri d'errore di questo testimone",errorModelField:"Modello d'errore",delayField:"Ritardo prima di questo racconto",delayUnit:"giorni",versionField:"Versione",wordField:"Parola usata",exposureField:"Esposizione",independenceField:"Indipendenza",independentYes:"senza aver parlato con gli altri testimoni",independentNo:"dopo aver parlato con gli altri testimoni",unknownChoice:"non si sa",darkAdapted:"Adattato al buio",correctedVision:"Vista corretta (occhiali, lenti)",glare:"Luce intensa poco prima",viewingNote:"Il vetro o il parabrezza e il binocolo si impostano in «Visione» qui sopra.",moonIntro:"Il testimone mostra la Luna piena come ha mostrato l'oggetto. Il rapporto dà il suo fattore di dimensione angolare: l'unica misura che rende individuale la legge generale. Da rilevare una volta per testimone.",moonField:"Luna come mostrata",moonHint:"A braccio teso, 1 cm ≈ 1°",moonNone:"Non ancora misurata: si applica la legge generale ({law}).",moonFactor:"Fattore ×{k}: sostituisce la legge generale in tutte le dimensioni angolari di questo testimone.",moonReal:"Luna reale · 0,52°",parametersIntro:"Gli errori di uno stesso testimone sono legati: lo stesso fattore su tutte le dimensioni, lo stesso scarto su tutte le ore. Calcolati, mai scritti: nessun margine «±» si inserisce a mano.",showMore:"Mostra",basis:{measured:"◆ misurata",stated:"dichiarata",derived:"dedotta",assumed:"supposta"},how:{clock:"letta su un orologio",anchored:"ancorata a un evento datato",estimated:"stimata","shown-on-the-spot":"mostrata sul posto","arm-length-gauge":"calibro a braccio teso","recalled-object":"riferita a un oggetto noto",instrument:"strumento",landmark:"riferimento del paesaggio",occlusion:"occultazione","known-size":"dimensione nota",triangulation:"triangolazione"},status:{consolidated:"consolidata",individual:"individuale",single:"studio unico",argued:"argomentata",contested:"contestata"},laws:{timeClock:"± {minutes} min (letta su un orologio)",timeAnchored:"± {minutes} min (ancorata a un evento datato)",timeEstimated:"± {minutes} min per 9 testimoni su 10 (stimata)",duration:"da {low} a {high}: ×/÷{factor} (log-normale)",elevationOver:"da {low} a {high}: altezza sovrastimata",measuredInstrument:"± {degrees}° (misurata)",measuredLandmark:"± {degrees}° (da un riferimento)",headingCross:"da {low} a {high}: ± {degrees}°, verso talvolta invertito",sizeMoon:"da {low} a {high}: fattore ×{factor} del calibro Luna",sizeShown:"da {low} a {high}: mostrata sul posto, da +2 a +17 %",sizeRecalled:"da {low} a {high}: riferita a un oggetto noto, ~30 % troppo grande",sizeArm:"da {low} a {high}: sovrastimata da ×{from} a ×{to} a braccio teso",sizeGauge:"da {low} a {high}: calibro, ± {percent} %",distanceAnchored:"Ancorata: il suo errore segue quello di ciò da cui è dedotta",distanceNotData:"Non è un dato: sbagliata di un fattore {factor} o più senza ancoraggio"},parameterNames:{clock:"Scarto dell'orologio",date:"Scarto di data",heading:"Rotazione della direzione",elevation:"Compressione delle altezze",size:"Fattore di dimensione angolare",duration:"Fattore di durata"},parameterScopes:{clock:"tutte le ore",date:"la data",heading:"tutte le direzioni",elevation:"tutte le altezze",size:"tutte le dimensioni angolari",duration:"la durata e la scala della timeline"},parameters:{clockClock:"± {minutes} min (orologio)",clockAnchored:"± {minutes} min (ancorata)",clockEstimated:"± {minutes} min (stimata)",dateShift:"±1 giorno, mese o anno; ora legale ({percent} % delle date)",headingRotation:"± {degrees}°, specchio possibile",elevationCompression:"sovrastimate, mai sottostimate",sizeMoon:"×{factor} (calibro Luna)",sizeArm:"da ×{from} a ×{to} a braccio teso",sizeShown:"da +2 a +17 % mostrata sul posto",durationFactor:"×/÷{factor} (log-normale)"},words:{light:"luce",object:"oggetto",craft:"velivolo",ufo:"ufo",other:"altro"},exposures:{none:"nessuna",press:"stampa",broadcast:"radio, televisione","other-witnesses":"altri testimoni",investigators:"investigatori"},models:{consolidated:"Letture consolidate (UFO@home)",keul:"Keul (dimensioni mostrate sul posto)"},candidates:{title:"Spiegazioni candidate",verdicts:{consolidated:"Compatibile con distorsioni consolidate",contested:"Solo invocando distorsioni contestate",incompatible:"Incompatibile anche ai limiti"},cost:"costo {x} σ",seeVariant:"Vedi questa variante",variantLabel:"Variante: {name}",backToAccount:"Torna al racconto",costNote:"Un costo non è una probabilità: dice quali distorsioni bisogna invocare, e di quanto.",scopeNote:"Matrice di Poher (1977) per la lista di partenza; la Luna, i pianeti, i passaggi di satelliti, i rientri, i bolidi registrati e gli aerei del tracciato sono calcolati e confrontati con il racconto.",fields:{time:"Ora",heading:"Azimut",elevation:"Altezza sull'orizzonte",size:"Larghezza apparente",duration:"Durata",sweep:"Percorso nel cielo"},biases:{clock:"scarto dell'orologio {x} min",heading:"rotazione della direzione {x}°",elevation:"altezza sovrastimata ×{x}",size:"dimensione sovrastimata ×{x}",duration:"durata stimata male ×{x}",sweep:"percorso stimato male {x}°"},reasons:{"never-seen":"Mai visibile da questo luogo nel margine dell'ora data.",direction:"Troppo lontano dalla direzione data, anche ai limiti delle leggi.",size:"Dimensione troppo diversa, anche ai limiti delle leggi.",motion:"Non si muove come dice il resoconto, e nulla fa leggere l'uno per l'altro.",growth:"Non cresce come dice il resoconto, né diventa più luminoso."},readingTitle:"Lettura",readings:{grouped:"luci lette come un solo corpo","still-seen-moving":"una luce ferma vista muoversi (effetto autocinetico, nuvole che scorrono)","moving-seen-still":"una luce in moto vista immobile (in arrivo di fronte)","brightening-as-approach":"una luminosità crescente letta come un avvicinamento"},notAgainst:"Non è un argomento contro il racconto.",noDirection:"Il racconto non colloca il fenomeno nel cielo: non c'è nulla da confrontare.",noSky:"Senza data, ora e luogo, nessun astro può essere collocato.",bodies:{Moon:"Luna",Venus:"Venere",Mars:"Marte",Jupiter:"Giove",Saturn:"Saturno"},aircraft:"Aeromobile {name}",interpretation:"Interpretazione: {name}",keepVariant:"Conserva questa variante",keptTitle:"Varianti conservate ({n})",seeKept:"Vedi",removeVariant:"Rimuovi",keptRecomputed:"ricalcolata: {verdict}, costo {x} σ",keptModel:"modello: {model}",reentry:"Rientro {name}",star:"Stella {name}",fireball:"Bolide {name}",poherLoading:"Caricamento della matrice di Poher…",poherFailed:"Non è stato possibile leggere la matrice di Poher: sono proposti solo gli astri.",poherTitle:"Secondo la matrice di Poher (1977)",poherIntro:"Gli altri fenomeni noti della matrice, senza traiettoria calcolata qui: il loro punteggio è il giudizio di Poher, da confrontare a mano.",poherPossible:"Possibili",poherExcluded:"Esclusi ({n})",poherExcludedBy:"escluso da: {list}",poherDoubted:"dubbio secondo stime: {list}",poherScore:"punteggio {x}",poherTag:"Poher: {state}",poherStatePossible:"possibile, punteggio {x}",poherStateExcluded:"escluso",answersTitle:"Risposte dedotte dalla registrazione ({n})",firm:"ferma",soft:"stima, da sola non esclude nulla"}},o={color:"Colore",transparency:"Trasparenza",halo:"Alone",blur:"Sfocatura",brightness:"Brillantezza",shapeTitle:"Nome",utcOffset:"Fuso orario",cloudBase:"Base delle nuvole",elevation:"Altitudine",heightAboveGround:"Altezza dal suolo",duration:"Durata",placeName:"Luogo",latitude:"Latitudine",longitude:"Longitudine",heading:"Orientamento",pitch:"Inclinazione",roll:"Rollio",sway:"Oscillazione a riposo",swayTitle:"Quanto il corpo che regge lo strumento muove la vista quando non cammina: 1 per una persona in piedi, 0 per un treppiede. Vuoto: 1 (0 se il resoconto dice che l'osservatore era paralizzato)",lightPollution:"Cielo notturno",lightPollutionTitle:"Lo zenit di una notte senza Luna in questo luogo, in magnitudini per secondo d'arco quadrato, come lo legge uno Sky Quality Meter o lo dà l'atlante mondiale della brillanza artificiale del cielo (Falchi et al. 2016, lightpollutionmap.info, «SQM»). 22 è un cielo naturale; una periferia è intorno a 19, un centro città a 17. Vuoto: un cielo naturale",observationTime:"Inizio dell'osservazione",observationEndTime:"Fine dell'osservazione",assessmentGroup:"Valutazione",assessmentNames:{coverage:"Dati dell'osservatore"},assessmentVerdicts:{"hynek.nl":"NL — luce notturna","hynek.dd":"DD — disco diurno","hynek.rv":"RV — radar-visivo","hynek.ce1":"IR1 — incontro ravvicinato","hynek.ce2":"IR2 — con traccia fisica","hynek.ce3":"IR3 — con entità"},timeQualifierApproximate:"Approssimativa",timeQualifierUncertain:"Incerta",timeQualifierBoth:"Incerta e approssimativa",timeSeasonSpring:"Primavera",timeSeasonSummer:"Estate",timeSeasonAutumn:"Autunno",timeSeasonWinter:"Inverno",summaryGroups:{observation:"Osservazione",location:"Posizione",temporal:"Tempo",weather:"Meteo",sound:"Suono"},summaryGroup:"Riepilogo",summaryDescription:"Descrizione",closeDescription:"Chiudi la descrizione",observerGroup:"Osservatore",observerId:"ID",observerTitle:"Titolo",observerLastName:"Cognome",observerFirstNames:"Nomi",sightingId:"ID",tags:"Etichette",cloudCover:"Copertura nuvolosa",highCloudCover:"Nubi di ghiaccio (cirri)",focalLength:"Lunghezza focale",fieldOfView:"Campo visivo",aperture:"Apertura",exposure:"Esposizione",focusDistance:"Messa a fuoco a",iceCrystalAlignment:"Allineamento dei cristalli",rareIceCrystals:"Cristalli rari",cloudDarkness:"Oscurità delle nuvole",precipitationType:"Precipitazioni",precipitationNone:"Nessuna",precipitationRain:"Pioggia",precipitationSnow:"Neve",precipitationHail:"Grandine",precipitationIntensity:"Intensità",windDirection:"Direzione del vento",windSpeed:"Velocità del vento",storm:"Temporale",cloudsGroup:"Nuvole",precipitationGroup:"Precipitazioni",windGroup:"Vento",soundKind:"Suono",soundNone:"Nessuno (silenzioso)",soundHum:"Ronzio",soundWhistle:"Fischio",soundRumble:"Rombo",soundCrackle:"Crepitio",soundVolume:"Volume",soundPitch:"Tono",soundSrc:"Registrazione",instrument:"Osservato con",filter:"Davanti",filterNone:"niente",filterSolarVisual:"un filtro solare per l'occhio (occhiali da eclissi, densità 5)",filterSolarPhoto:"una pellicola solare per fotocamera (densità 3,8)",decorAircraft:"Aeromobile",decorEntity:"Essere",decorAltitude:"Altitudine",decorLights:"Luci",decorLightsNone:"nessuna",decor:"Ambiente",decorBuilding:"Edificio",decorTree:"Albero",decorShrub:"Cespuglio",decorBridge:"Ponte",decorWire:"Linea aerea",decorCrop:"Filare di coltura",decorTerrace:"Terrazzamento",decorMound:"Mucchio di pietre",decorWall:"Muretto a secco",decorStreetlight:"Lampione",decorTrafficLight:"Semaforo",decorCrossing:"Attraversamento pedonale",decorRoadSign:"Segnale stradale",decorVehicle:"Veicolo",decorObserver:"Altro osservatore",decorEast:"Distanza a est",decorNorth:"Distanza a nord",decorHeading:"Orientamento",decorColor:"Colore",decorLit:"Acceso",decorTitle:"Nome",milestones:"Momenti",milestoneLabel:"Etichetta",milestoneNote:"Cosa succede",addMilestone:"Dai un nome a questo momento",deleteMilestone:"Elimina momento",goToMilestone:"Vai a questo momento",decorWidth:"Larghezza",decorLength:"Lunghezza",decorHeight:"Altezza",decorModel:"Modello 3D",decorModelAdvanced:"Modello da un indirizzo",decorModelUrl:"Indirizzo glTF/GLB",decorModelTitle:"Nome del modello",decorModelAuthor:"Autore",decorModelLicense:"Licenza",decorModelSource:"Provenienza",decorObserverSide:"Posizione dell'osservatore",decorObserverSideNone:"Non presente",decorSideFront:"Davanti",decorSideBehind:"Dietro",decorSideLeft:"Sinistra",decorSideRight:"Destra",decorSideFrontLeft:"Davanti a sinistra",decorSideFrontRight:"Davanti a destra",decorSideBehindLeft:"Dietro a sinistra",decorSideBehindRight:"Dietro a destra"},a={...o,oval:"Ovale",polygon:"Poligono",modelTriangle:"Triangolo",modelSaucer:"Disco volante",modelCigar:"Sigaro",modelChevron:"Chevron",modelLight:"Luce",modelPartDisc:"disco",modelPartDome:"cupola",addVertex:"Aggiungi vertice",deleteVertex:"Elimina vertice",notAPolygon:"Seleziona una sola forma poligonale",tooFewVertices:"Una forma ha bisogno di almeno 3 punti",shape:"Forma",apparentWidth:"Larghezza apparente",realWidth:"Larghezza reale",distance:"Distanza",shapeRotation:"Rotazione",shapeRotationTitle:"Di quanto la forma è ruotata nel disegno, in senso orario, in gradi: ciò che regola la sua maniglia di rotazione",sizeLock:"Mantieni",lockNone:"niente",lockApparent:"la larghezza apparente",lockReal:"la larghezza reale",lockDistance:"la distanza",apparentSize:"{moons}× la Luna",utcOffsetPlaceholder:"dalla longitudine",realSizeBetween:"La scena delimita quella larghezza: tra {min} e {max} m, in base a ciò che attraversa",realSizeAtLeast:"La scena delimita quella larghezza: almeno {min} m, in base a ciò dietro cui passa",realSizeAtMost:"La scena delimita quella larghezza: al massimo {max} m, in base a ciò davanti a cui passa",realSizeUnknown:"Nulla nella scena delimita quella larghezza: è solo ciò che la distanza implica",realSizeOutside:" — la larghezza qui sopra ne è fuori",blurBound:"Sfocato attraverso questo obiettivo: più vicino di {max} m",blurBoundNoInstrument:"La sfocatura a occhio nudo non delimita alcuna distanza — un occhio non ha un diaframma con cui andare fuori fuoco",blurBoundNotAtInfinity:"La sfocatura delimita una distanza solo per un obiettivo messo a fuoco all'infinito: questo è a fuoco a {focus} m, il che sfoca da entrambi i lati",realSizeContradiction:"Contraddizione: gli attraversamenti dichiarati non possono essere tutti veri",realDistanceHere:" — cioè qui tra {min} e {max} m",clearDistanceHypothesis:"Ritira l'ipotesi di distanza",clearDistanceHypothesisTitle:"Torna a ciò che la registrazione stabilisce",depthStated:"Disegnato a {m} m, come dichiara la registrazione",depthHypothesis:"Disegnato a {m} m: la tua ipotesi — ciò che la scenografia ne nasconde è ciò che perderebbe una cosa così lontana",depthDerived:"Disegnato a {m} m, in base alla camminata stessa dell'osservatore",depthBounded:"Disegnato a {m} m, in base a ciò dietro e davanti a cui passa",depthConventional:"Disegnato a {m} m per convenzione: nulla nella registrazione stabilisce una distanza",addShape:"Aggiungi forma",deleteShape:"Elimina forma",play:"Riproduci",pause:"Pausa",noDuration:"Nessuna durata di osservazione",previousKeyframe:"Fotogramma chiave precedente",nextKeyframe:"Fotogramma chiave successivo",keyframeMark:"Fotogramma chiave",shapesTrack:"forme",observerTrack:"osservatore",weatherTrack:"meteo",soundTrack:"suono",group:"Raggruppa",ungroup:"Separa",duplicate:"Duplica",bringToFront:"Porta in primo piano",sendToBack:"Porta in fondo",contextMenuDelete:"Elimina",onlyOneShape:"C'è una sola forma",alreadyAtFront:"Questa forma è già in primo piano",alreadyAtBack:"Questa forma è già in fondo",needTwoShapesToGroup:"Seleziona almeno due forme per raggrupparle",notGrouped:"Questa forma non fa parte di un gruppo",multipleShapesSelected:"Più forme selezionate — selezionane una sola per modificare questo",samplingRate:"Frequenza di campionamento",currentPosition:"Posizione attuale",switchToElapsed:"clicca per mostrare il tempo trascorso",switchToClockTime:"clicca per mostrare l'ora del giorno",durationPlaceholder:"durata dell'osservazione",durationImprecise:"Queste date non determinano con sufficiente precisione una durata — inseriscila manualmente.",export:"Salva",frozenTitle:"Dati congelati",frozenHint:"Ciò che la scena chiederebbe altrimenti a terzi a ogni riproduzione (rilievo, foto del suolo, strade, acqua, ferrovie, alta atmosfera), rilevato al salvataggio e conservato in file accanto alla registrazione, perché si riproduca uguale senza chiedere nulla a nessuno.",frozenLive:"Interrogare le fonti a ogni riproduzione (non congelare nulla)",frozenRelief:"Rilievo",frozenImagery:"Foto del suolo",frozenRoads:"Strade",frozenWater:"Acqua",frozenRailways:"Ferrovie",frozenUpperAir:"Alta atmosfera",frozenMap:"Foto della mappa",fileItemRecording:"Registrazione",fileItemWeather:"Meteo",fileItemPlace:"Luogo",fileItemLightPollution:"Inquinamento luminoso",fileItemDecor:"Scenografia",weatherStatedByObserver:"come l'ha data l'osservatore",annexSource:"File",annexStorageInline:"dentro la registrazione stessa",annexEditorLabel:"L'allegato come testo JSON",annexUnreadable:"Questo file non è un allegato di questo tipo: non è cambiato nulla.",frozenTakenOn:"rilevato il {date}",frozenPending:"rilevato al salvataggio",frozenLiveState:"chiesto in diretta",frozenRefresh:"Aggiorna",frozenTaking:"Rilevamento: {group}… {done}/{of}",frozenFailed:"{group}: la fonte non ha risposto, nulla è stato rilevato.",frozenMissing:"{file} illeggibile: lasciato fuori dall'archivio.",frozenExported:"Salvato con {count} allegati ({size}), in un archivio da decomprimere dove la registrazione è pubblicata.",identityHint:"Nomina qualcuno solo se vi ha acconsentito o ha pubblicato lui stesso la propria testimonianza; altrimenti bastano le iniziali.",identityAsk:"Questa registrazione nomina o colloca una persona. Rispondi di ciò che pubblichi: nomina qualcuno solo se vi ha acconsentito, o se ha pubblicato lui stesso la propria testimonianza. Altrimenti bastano le iniziali.",identityLastName:"Cognome: {value}",identityFirstNames:"Nome: {value}",identityNameInId:"Nome in un identificativo: {value}",identityNameInText:"Nome nel testo: {value}",identityAddress:"Indirizzo: {value}",identityEmail:"Indirizzo e-mail: {value}",identityPhone:"Numero di telefono: {value}",identityInitials:"Sostituisci con le iniziali",identityKeep:"Salva comunque",identityBack:"Torna indietro",importFile:"Carica un file di osservazione",paramSummaryTitle:"Ciò che indica la registrazione ({n})",wholeKeyframes:"Ogni fotogramma chiave per intero",wholeKeyframesHint:"Altrimenti un fotogramma chiave dice solo ciò che è cambiato dal precedente, come si scrive una registrazione a mano. Cambiare questa scelta svuota la cronologia di annullamento.",importUrlPlaceholder:"https://…/sighting.json",inputFileFromFile:"dal proprio disco",inputFileFromUrl:"da un indirizzo",inputFileModeHint:"Fare clic per darlo nell'altro modo: un proprio file o un indirizzo",inputFileLoad:"Carica",importError:"Impossibile caricare questa registrazione — controlla il file o l'URL e riprova.",importErrorCors:`Questo indirizzo risponde, ma il browser non ha il permesso di leggerlo da questa pagina. Il file in sé va bene: è il suo server che deve inviarlo con l'intestazione "Access-Control-Allow-Origin: *". Se il server non è tuo, è questo che devi chiedere al suo amministratore.`,importErrorMixedContent:"Una pagina sicura non può caricare un indirizzo che inizia con http://. Usa https:// se quel server lo offre.",importErrorUnreachable:"Nulla ha risposto a questo indirizzo. Controlla come è scritto e di essere connesso.",importErrorStatus:"Quel server ha risposto con un errore ({status}). Probabilmente l'indirizzo è sbagliato o il file è stato spostato.",importErrorMalformed:"Questo indirizzo ha risposto, ma ciò che è tornato non è una registrazione.",formatVersionError:"Questo file indica la versione {found} del suo formato; questo UFO@home legge fino alla versione {supported}. Lo apra con un UFO@home più recente.",record:"Registra",stop:"Ferma",according:"secondo",sourceElevation:"Rilievo",sourceImagery:"Immagini",sourceAircraft:"Traffico aereo",sourceFile:"File",sourceKind:"Dati",placeNamePlaceholder:"Valensole, Francia",searchPlace:"Localizza",placeMatch:"Corrispondenze",placeSearching:"Ricerca del luogo…",placeMatchFound:"luogo trovato",placeMatchesFound:"luoghi trovati",placeNotFound:"Nessun luogo con questo nome",placeSearchFailed:"Ricerca dei luoghi momentaneamente non disponibile",utcOffsetNoZone:"Nessun fuso indica questo scarto quel giorno",utcOffsetImplausible:"Questo fuso orario non corrisponde alla longitudine inserita, la cui ora solare è UTC{solar} — eppure la scena e il rilevamento meteo obbediscono a ciò che è dichiarato qui. Svuota il campo per ricavarlo dalla longitudine.",timeZoneManual:"sconosciuto",altitudeAboveSeaLevel:"Altitudine dell'osservatore sul livello del mare — il suolo del luogo inserito ne fissa il minimo: un osservatore sulle Alpi non è a 0 m.",groundAt:"suolo a {m} m",headingPlaceholder:"sconosciuto",edtfInvalid:"Data/ora EDTF non valida (es. 1965-07-01T05:00, 2025-06?, 2025~).",edtfPlaceholder:"AAAA-MM-GGThh:mm[?~%] o hh:mm",observationTimeHint:"EDTF — es. 1965-07-01T05:00, 2025-06? (incerto), 2025~ (approssimativo), o solo 05:00 se la data non è nota",observationEndTimeHint:"EDTF — es. 1965-07-01T05:10, 2025-06? (incerto), 2025~ (approssimativo), o solo 05:10 se la data non è nota",presetsGroupLabel:"Forma dell'UFO",description:"Descrizione",tagsPlaceholder:"separati da virgole",weather:"Meteo",shapeGroup:"Fenomeno",shapesSubgroup:"Forme",bodiesSubgroup:"Corpi",launchesSubgroup:"Lanci",sky:"Cielo",dataSources:"Fonti dei dati",beamsSubgroup:"Fasci",soundGroup:"Suono",close:"Chiudi",editorKicker:"Editor di avvistamento",witnessError:e,expandTracks:"Espandi le tracce",collapseTracks:"Comprimi le tracce",addKeyframeHere:"Aggiungi un fotogramma chiave qui",keyframeHere:"Qui c'è un fotogramma chiave: modificarlo lo cambia",overlayHorizon:"Orizzonte · inclinazione {deg}°",overlayFov:"Campo visivo {v}° × {h}°",overlayWind:"Soffia verso {point} · {speed} m/s",sectionIdentity:"Identità",sectionProfile:"Profilo",sectionTestimony:"Testimonianza",sectionVision:"Visione",sectionPerception:"Percezione",sectionCoordinates:"Coordinate",sectionGaze:"Sguardo",sectionNightSky:"Cielo notturno",sectionPeriod:"Periodo",sectionSurvey:"Scenario da un rilievo",sectionHeard:"Ciò che è stato udito",sectionSoundRecording:"Registrazione",sectionPicture:"Foto",sectionPose:"Posa",sectionAppearance:"Aspetto",sectionSize:"Dimensioni e distanza",sectionPath:"Traiettoria",moreSettings:"Altre impostazioni ({n})",lessSettings:"Meno impostazioni",showSettings:"Mostra ({n} impostazioni)",showSettingsOne:"Mostra (1 impostazione)",showSettingsAny:"Mostra",hideSettings:"Nascondi",save:"Salva",stateNew:"Nuova registrazione",panelIntroObservation:"Cosa è successo, in poche righe, e cosa resta da completare.",panelIntroObserver:"Chi ha visto, e con cosa. Ogni osservatore ha il proprio punto di vista nella scena.",panelIntroLocation:"Da dove guardava l'osservatore, e in quale direzione.",panelIntroTemporal:"Quando è iniziato, quanto è durato, e i momenti del racconto.",panelIntroDecor:"Ciò che circondava l'osservatore: veicoli, edifici, vegetazione.",panelIntroWeather:"Il tempo che faceva, e ciò che attraversava il cielo senza essere il fenomeno: lanci, fasci.",panelIntroShape:"Ciò che è stato visto, disegnato nella scena dal punto di vista dell'osservatore.",panelIntroSound:"Ciò che è stato udito.",panelIntroReference:"Foto e schizzi, allineati alla scena per confrontarla.",panelIntroFile:"La registrazione completa, da salvare o ricaricare.",temporalGroup:"Data",fileGroup:"File",fileLoading:"Caricamento dell'editor…",weatherEditedAsk:"Questa modifica tocca il meteo, un dato letto dinamicamente da {source}. Vuoi smettere di leggerlo da {source}?",weatherEditedStop:"Smetti di leggerlo",weatherEditedKeep:"Continua a leggerlo (annulla la mia modifica)",fileEditorLabel:"La registrazione come testo JSON",fileSearchPhrases:{Find:"Cerca",Replace:"Sostituisci",next:"successivo",previous:"precedente",all:"tutti","match case":"maiuscole","by word":"parola intera",regexp:"regexp",replace:"sostituisci","replace all":"sostituisci tutto",close:"chiudi","current match":"corrispondenza corrente","on line":"alla riga","replaced $ matches":"$ corrispondenze sostituite","replaced match on line $":"corrispondenza sostituita alla riga $","Go to line":"Vai alla riga",go:"vai"},timeQualifierExact:"Esatta",durationPrecise:"precisa",durationIso:"imprecisa",durationModeTitle:"Dire la durata esattamente, o come è stata enunciata: circa, tra due durate",durationInvalid:"Non è una durata: PT10M, PT1H30M, PT5M/PT10M…",durationHelpTitle:"Che cosa accetta il testo (EDTF)",durationHelpLines:`PT45S — 45 secondi
|
|
2
|
-
PT10M — 10 minuti
|
|
3
|
-
PT1H30M — 1 ora 30 minuti
|
|
4
|
-
PT5M/PT10M — tra 5 e 10 minuti
|
|
5
|
-
Terminare con ? se incerto, ~ se approssimativo, % per entrambi
|
|
6
|
-
1965-?07 — il dubbio può riguardare anche una parte`,durationChosen:"(simulata: {value})",accountView:"Resoconto",accountView2d:"2D · forme",accountView3d:"3D · corpi",accountViewHint:"Ciò che mostra il render e ciò che si modifica: le forme che l'osservatore ha disegnato, o i corpi che ha detto che fossero",datePrecise:"precisa",dateEdtf:"imprecisa",dateHelpTitle:"Che cosa accetta il testo (EDTF)",dateHelpLines:`1965 — un anno
|
|
7
|
-
1965-07 — un mese
|
|
8
|
-
1965-21 — una stagione (21 primavera, 22 estate, 23 autunno, 24 inverno)
|
|
9
|
-
1965-07-01 — un giorno
|
|
10
|
-
1965-07-01T05:00 — un giorno e un'ora
|
|
11
|
-
05:00 — un'ora, data sconosciuta
|
|
12
|
-
Terminare con ? se incerto, ~ se approssimativo, % per entrambi`,edtfModeTitle:"Scrivi invece una data imprecisa: solo un anno, un mese, un'ora senza data",locationGroup:"Luogo",observerTab:"Testimone",observationGroup:"Riepilogo",weatherWhilePlaying:"Metti in pausa la registrazione per indicare il tempo — mentre scorre, l'istante in cui verrebbe scritto si sposta",weatherInferred:"Fonte",weatherInferredTitle:"Il meteo non è un resoconto: è un fatto misurabile, rilevato per la data, l'ora e il luogo dell'osservazione. Deseleziona per indicare le condizioni riferite dall'osservatore, che allora prevalgono sul rilevamento.",weatherLookingUp:"Ricerca del rilevamento…",weatherNeedsDateAndPlace:"Servono una data completa e un luogo per cercare il rilevamento",weatherNeedsDate:"Serve una data completa (anno, mese e giorno) per cercare i rilevamenti meteo",weatherNeedsPlace:"Serve un luogo con coordinate per cercare i rilevamenti meteo",weatherNoRecord:"Nessun rilevamento per questa data e questo luogo",weatherLookupFailed:"Rilevamenti meteo momentaneamente irraggiungibili",lightPollutionLookingUp:"Consultazione dell'atlante…",lightPollutionFound:"{artificial} µcd/m² di luce artificiale,",lightPollutionNatural:"Nessuna luce artificiale qui,",lightPollutionOutside:"Fuori dall'atlante (da 85°N a 60°S),",lightPollutionFailed:"Atlante al momento irraggiungibile",lightPollutionTooEarly:"L'atlante descrive il {atlasYear}; il cielo del {year} era più buio, indicarlo se è noto",instrumentOutOfPeriod:"{name} — non di quest'epoca",instrumentCategoryEye:"Occhio nudo",instrumentCategoryCamera:"Fotocamere",instrumentCategoryDslr:"Reflex digitali",instrumentCategoryPhone:"Telefoni",instrumentCategoryBinoculars:"Binocoli",instrumentCategoryTelescope:"Telescopi",instrumentNotYetOnSale:"Non esisteva ancora nel {year} (in vendita dal {from})",instrumentNoLongerOnSale:"Non esisteva più nel {year} (in vendita fino al {to})",filterNotForInstrument:"Non utilizzabile con questo strumento",unitMillimetres:"mm",unitDegrees:"°",fieldOfViewReadout:"{deg}° di campo",soundSrcPlaceholder:"URL di una registrazione reale",referenceGroup:"Foto",reference:"Foto",referenceTitle:"Nome",referenceSrc:"Immagine",referenceSrcPlaceholder:"https://…/photo.jpg",referenceKind:"Tipo",referencePhoto:"Foto",referencePanorama:"Panorama (360°)",referenceCredit:"Crediti",referenceCreditUrl:"Link dei crediti",referenceT:"Scattata a",referenceDrawing:"Disegno sopra",referenceOpacity:"Opacità",referenceHeading:"Direzione",referencePitch:"Beccheggio",referenceRoll:"Rollio",referenceFov:"Campo verticale",referenceUsePose:"Usa la posa dell'osservatore",addReferenceUrl:"Da un indirizzo",addReferenceFile:"Da un file",deleteReference:"Elimina foto",referenceEmbedded:"{kb} kB incorporati nella registrazione — un indirizzo la terrebbe leggera",referenceUnreachable:"Impossibile caricare la foto: controlla l'indirizzo e che il suo sito permetta ad altri siti di leggerla",referenceRegisterHint:"Trascina per ruotare la foto, rotellina per cambiarne il campo; «Aggiungi un punto di riferimento» per indicare un dettaglio sulla foto, poi lo stesso nel rendering",referenceLandmarkPicture:"Punto di riferimento {n}: clicca il punto sulla foto",referenceLandmarkScene:"Punto di riferimento {n}: clicca lo stesso punto nel rendering",referenceLandmarkOffPicture:"Questo clic non cade sulla foto",referenceNotLoaded:"La foto non è ancora arrivata",referenceLandmarksFit:"{n} punti di riferimento — scarto medio di {deg}°",referenceLandmarks:"Punti di riferimento",addReferenceLandmark:"Aggiungi un punto di riferimento",deleteReferenceLandmark:"Elimina punto di riferimento",referenceLandmarkLabel:"Nome",referenceLandmarkLabelPlaceholder:"Albero che copre, recinzione…",referenceAdoptPose:"Adotta come posa dell'osservatore",referenceAdoptRationale:"Misurato sulla foto «{title}»: {n} punti di riferimento allineati, {deg}° di scarto residuo",referenceStreetSearch:"Foto stradali nei dintorni",referenceStreetNoPlace:"Dai prima un luogo alla registrazione: le foto si cercano intorno",referenceStreetSearching:"Ricerca di foto scattate nei dintorni…",referenceStreetNone:"Nessuna foto stradale entro {m} m (Panoramax)",referenceStreetFailed:"Impossibile raggiungere Panoramax",referenceStreetAdd:"Aggiungi",traceImport:"Tracciati dell'investigatore (KML, KMZ)",trace:"Tracciato",deleteTrace:"Elimina il tracciato",traceTitle:"Nome",traceSource:"Fonte",traceImported:"{n} importato/i da {name}.",traceSkipped:"Escluso: {what}.",traceNone:"Nessuna linea, luogo o contorno in questo file.",traceFailed:"Impossibile leggere questo file.",traceKindPoint:"luogo",traceKindLine:"linea",traceKindPolygon:"contorno",referenceStreetItem:"{distance} m a {bearing}°, {date}{panorama}",referenceStreetPanorama:" — 360°",referenceStreetTitle:"Foto stradale a {distance} m a {bearing}°, {date}",skyLine:"Cielo: {parts}",skyStarsEye:"stelle fino alla magnitudine {limit}, il limite che un occhio raggiungeva sotto questo cielo",skyStarsDeeper:"stelle fino alla magnitudine {limit} attraverso un {device} — {gain} magnitudini oltre le {eye} raggiunte dagli occhi dell'osservatore",skyStarsShallower:"stelle fino alla magnitudine {limit} attraverso un {device} — {gain} magnitudini al di qua delle {eye} raggiunte dagli occhi dell'osservatore",skyStarsCatalogue:", disegnate fino a {catalogue}, dove si ferma il catalogo di questo progetto",skyStarsNone:"nessuna stella si distingueva in un cielo così chiaro",skyDetails:"Mostra i rilevamenti completi",skyDetailsHide:"Nascondi i rilevamenti",skyShowerActive:"{name} — radiante a {altitude}° sopra l'orizzonte, {bearing} — circa {rate}/h sotto questo cielo, su un fondo sporadico di {sporadic}/h",skyShowerBelowHorizon:"{name} è attivo, ma il suo radiante è sotto l'orizzonte — non ha potuto produrre nulla",skyNothingActive:"nessuno sciame meteorico attivo in questa data — un fondo sporadico di circa {sporadic}/h",showMeteor:"Mostrami una meteora",skyComet:"La {name}, magnitudine {magnitude}, a {altitude}° sopra l'orizzonte {bearing}, coda lunga {tail}°",skyCometNoTail:"La {name}, magnitudine {magnitude}, a {altitude}° sopra l'orizzonte {bearing}",skyCometBelowHorizon:"La {name} c'era, di magnitudine {magnitude}, ma sotto l'orizzonte — nessuno qui l'ha vista",skyCometInDaylight:"La {name}, magnitudine {magnitude}, a {altitude}° sopra l'orizzonte {bearing} — ma a soli {elongation}° dal Sole",showComet:"Mostrami la cometa",skyNova:"La {name}, una stella nuova di magnitudine {magnitude}, a {altitude}° sopra l'orizzonte {bearing}",skyNovaBelowHorizon:"La {name} brillava di magnitudine {magnitude}, ma sotto l'orizzonte: nessuno qui l'ha vista",showNova:"Mostrami la stella nuova",skyEclipsePartial:"Eclissi di Sole: la Luna nasconde il {percent} % del Sole alle {time}, a {altitude}° sopra l'orizzonte {bearing}",skyEclipseTotal:"Eclissi totale di Sole: il Sole è interamente nascosto dalle {time} per {duration}, a {altitude}° sopra l'orizzonte {bearing}",skySupermoon:"Luna piena a {distance} km: {diameter}° di larghezza, il {percent} % in più che alla distanza media — una «superluna», e non più grande all'orizzonte che in alto",skyMicromoon:"Luna piena a {distance} km: {diameter}° di larghezza, il {percent} % in meno che alla distanza media — una «microluna», e non più piccola all'orizzonte che in alto",skyRedMoon:"La «lune rousse»: la Luna piena della lunazione che segue la Pasqua, a {altitude}° sopra l'orizzonte {bearing} — bassa, quindi arrossata dall'aria che attraversa, e né più grande né più luminosa di un'altra",skySatellitePasses:"{count} satelliti hanno attraversato questo cielo abbastanza luminosi da essere visti, il più luminoso {name}, magnitudine {magnitude}, a {altitude}° sopra l'orizzonte {bearing} alle {time}",skySatellitePassesOne:"un satellite ha attraversato questo cielo abbastanza luminoso da essere visto: {name}, magnitudine {magnitude}, a {altitude}° sopra l'orizzonte {bearing} alle {time}",skySatelliteTrain:"tra cui un treno di {count} Starlink lanciati il {date}",skySatellitePassesNone:"secondo gli elementi orbitali archiviati per quella data, nessun satellite illuminato ha attraversato questo cielo abbastanza luminoso da essere visto",skySatelliteElementsGap:"nessun elemento orbitale archiviato vicino a quella data",skyReentries:"rientri registrati: {list}",skyReentriesMore:"altri {count}",skyReentrySeen:"{name} è ricaduto alle {time}, visto da {place} (a {distance} km)",skyReentryObserved:"{name} è ricaduto alle {time}, visto",skyReentryOffset:", a {minutes} min dall'osservazione",skyReentryPredicted:"{name} è ricaduto verso le {time} ± {hours} h, non si sa dove",skyReentryDay:"{name} è ricaduto il {date} (UTC), senza ora né luogo noti",skyFireballs:"{count} bolidi registrati dalla Global Meteor Network, il più luminoso di magnitudine {magnitude} alle {time}, a {altitude}° di altezza {bearing}, a {distance} km ({stations} stazioni)",skyFireballsOne:"un bolide registrato dalla Global Meteor Network: magnitudine {magnitude} alle {time}, a {altitude}° di altezza {bearing}, a {distance} km ({stations} stazioni)",showFireball:"Mostrami il bolide",showSatellite:"Mostrami un satellite",skyOpticsPossible:"nubi di ghiaccio sufficienti, intorno {source}, per {forms}",skyOpticsAlignment:" — tutto tranne gli anelli richiede cristalli che cadono orizzontali, qui supposti allineati al {alignment}%, poiché nessun rilevamento lo indica",skyOpticsHalo22:"un anello di {angle}°",skyOpticsHalo46:"un anello di {angle}°",skyOpticsParhelia:"pareli a {angle}° da entrambi i lati",skyOpticsTangentArc:"un arco tangente sopra",skyOpticsParhelicCircle:"un cerchio bianco che fa il giro del cielo alla sua stessa altezza",skyOpticsCircumzenithal:"un arco circumzenitale a {angle}° di altezza",skyOpticsCircumhorizontal:"un arco circumorizzontale molto più in basso",skyOpticsPillar:"una colonna eretta sopra",skyOpticsNoIce:"nessuna nube di ghiaccio: né alone né pareli",skyOpticsHidden:"nubi di ghiaccio in quota, ma uno strato più basso tra loro e l'osservatore",skyOpticsSun:"al Sole",skyOpticsMoon:"alla Luna",skyBowPossible:"pioggia e sole sufficienti per {forms}",skyBowMoon:"pioggia sotto una Luna illuminata al {lit}%, sufficiente per {forms} — un arcobaleno lunare, che l'occhio vede come un arco bianco",skyGlowBand:"la Via Lattea a {contrast}× il fondo del cielo, a {altitude}° di altezza {bearing}",skyGlowCone:"la luce zodiacale a {contrast}× il fondo del cielo, a {altitude}° di altezza {bearing}, a {elongation}° dal Sole — un tenue cono di luce inclinato, dai bordi sfumati, svanito entro un'ora",skyGlowZodiacalBand:"la banda zodiacale a {contrast}× il fondo del cielo, a {altitude}° di altezza {bearing} — tutta l'eclittica debolmente accesa, che non è ciò che la gente riferisce",skyGlowMoon:"né Via Lattea né luce zodiacale: una Luna illuminata al {lit}% teneva il cielo a {sky} magnitudini per secondo d'arco quadrato, dove ne servono 22",skyGlowTwilight:"né Via Lattea né luce zodiacale: il crepuscolo teneva ancora il cielo a {sky} magnitudini per secondo d'arco quadrato, dove ne servono 22",skyGlowTowns:"né Via Lattea né luce zodiacale: il bagliore delle città teneva il cielo a {sky} magnitudini per secondo d'arco quadrato, dove ne servono 22",skyGlowNothingUp:"cielo abbastanza buio ({sky} magnitudini per secondo d'arco quadrato), ma né il piano galattico né l'eclittica vi stavano abbastanza in alto",skyBowPrimary:"un arco di {radius}° di raggio, con la sommità a {top}° di altezza",skyBowSecondary:"un secondo, più tenue, a {radius}°, con i colori invertiti",skyBowSourceTooHigh:"pioggia, ma con l'astro a {altitude}° di altezza nessun arco poteva superare l'orizzonte: si trovano a {radius}° dal punto opposto",skyBowHidden:"pioggia, ma uno strato continuo tra essa e la luce: nessun arco",skyBowNoSource:"pioggia, e niente di illuminato per farne un arco",skySatellitesLit:"l'ombra della Terra era a {height} km sopra l'osservatore, quindi l'orbita bassa era ancora al sole — {count} oggetti catalogati erano in orbita quel mese",skySatellitesLitWith:"l'ombra della Terra era a {height} km sopra l'osservatore, quindi l'orbita bassa era ancora al sole — {count} oggetti catalogati erano in orbita quel mese, tra cui {eras}",skySatellitesShadowed:"l'ombra della Terra era a {height} km sopra l'osservatore: dei {count} oggetti catalogati in orbita quel mese, niente in orbita bassa era illuminato",skySatellitesNotYet:"non era ancora stato messo niente in orbita",skySatellitesDaylight:"tutto ciò che era in orbita era illuminato, come sempre di giorno, e {eras} potevano superare in luminosità persino questo cielo",skySatellitesDaylightOne:"tutto ciò che era in orbita era illuminato, come sempre di giorno, e {eras} poteva superare in luminosità persino questo cielo",skyUnknown:"non determinabile senza una data e un luogo",lookAtDecor:"Guardalo",addDecor:"Aggiungi",deleteDecor:"Elimina elemento della scenografia",undo:"Annulla",redo:"Ripristina",viewAccount:"Vedi il resoconto",noObserverRecording:"Nessun URL di registrazione per questo osservatore",masks:"Nasconde",masksNone:"Nessun fenomeno da nascondere per ora",masksBodyFully:"nascosto da questo oggetto",masksBodyPartly:"nascosto al {share} % da questo oggetto",masksBodyNot:"non nascosto da questo oggetto",modelPickerTitle:"Scegliere un modello 3D",modelPickerClose:"Chiudere",modelPickerChoose:"Scegliere un modello 3D",modelPickerUse:"Usa questo modello",modelPickerIncomplete:"Non disegnato finché non sono indicati il nome e la licenza del modello",addObserver:"Aggiungi osservatore",surveyLabel:"Scenografia ricavata da un rilievo",surveySource:"Scenografia da",surveyDated:"Rilevato il: {dates}.",surveyLaserLabel:"laser",surveyPhotoLabel:"foto aerea",surveyMapLabel:"carta",surveyLampsLabel:"OpenStreetMap",surveyWarning:"⚠ Questa scenografia viene da rilievi del {survey}, successivi all'osservazione ({observation}): non è ciò che c'era allora. Teneteli come riferimento, o eliminateli.",surveyRadius:"Raggio",surveyRadiusTitle:"Fino a dove intorno all'osservatore si interroga il rilievo, in metri. Un raggio più ampio porta edifici, ponti e linee più lontani; gli alberi vengono dal laser, che si interroga solo entro 150 m.",surveySourceTitle:"Il rilievo da cui sono ricavati, da soli, gli alberi, gli edifici, i ponti e le linee aeree attorno al luogo quando date un luogo alla registrazione: sono messi nell'elenco, al loro posto, con altezza e larghezza misurate. Le coordinate del luogo sono inviate a quel servizio. Nessuno lascia la scenografia a voi soli. Ciò che avete collocato voi non viene mai toccato.",surveySourceNone:"Nessuno (tutto a mano)",surveyBusy:"Ricerca della scenografia attorno all'osservatore…",surveyDone:"Da {source}: alberi {trees}, edifici {buildings}, ponti {bridges}, linee elettriche {lines}. Sono quelli del giorno del rilievo, non della registrazione: teneteli, spostateli o eliminateli.",surveyNone:"Nessun albero, edificio, ponte né linea elettrica trovato entro {radius} m.",surveyKept:"Ciò che avete collocato voi resta com'è.",surveyUnreachable:"Impossibile raggiungere il rilievo. Riprovate più tardi.",surveyFurniturePending:"Illuminazione pubblica e semafori: in attesa di OpenStreetMap…",surveyFurnitureDone:"Da {source}: lampioni {lamps}, semafori {signals}, attraversamenti {crossings}, segnali {signs}.",surveyFurnitureUnavailable:"Illuminazione pubblica e semafori non disponibili per ora: OpenStreetMap non risponde.",surveyFurnitureRetry:"Riprova",narrativePlaceholder:"Ciò che l'osservatore ha riferito, con parole sue",narrativeSource:"Redatto da",narrativeNeedsSetting:'Compila "{setting}" ({source}) per generare una ricostruzione dal resoconto',narrativeNeedsAsk:"Ancora niente da inviare",narrativeRemember:"Ricorda su questo dispositivo",narrativeDraft:"Genera ricostruzione",narrativeStop:"Ferma",narrativeWorking:"Lettura del resoconto…",narrativeApplied:"{count} campi scritti nell'editor",narrativeUnchanged:"Il resoconto non dice ancora nulla che la registrazione possa contenere",narrativeStated:"Ciò che l'osservatore ha detto",narrativeDerived:"Ricavato dal resoconto",narrativeAssumed:"Supposto, perché la ricostruzione funzioni — da verificare",narrativeGaps:"Ciò che niente ha potuto stabilire",narrativeErrorCredential:"Nessuna chiave, o una chiave rifiutata — controllala su console.anthropic.com",narrativeErrorRateLimited:"Troppe richieste sul tuo account: aspetta un momento e richiedi",narrativeErrorRefused:"Il resoconto non ha avuto risposta. Riformularlo può aiutare; richiederlo no",narrativeErrorMalformed:"La risposta non era una bozza utilizzabile — vale la pena richiederla ancora una volta",narrativeErrorUnreachable:"Nulla ha risposto: controlla la connessione",narrativeErrorRejected:"Rifiutato: {detail}",observerAge:"Età allora",observerBirth:"Nato il",observerPerception:{"color-vision":"Visione dei colori","color-vision.hint":"Come appaiono i colori a chi ha coni diversi (Machado et al. 2009). Ricolora soltanto: luminosità e risoluzione restano uguali.","color-vision.type":"Tipo","color-vision.type.normal":"Tipica","color-vision.type.protan":"Protan (rosso debole o cieco)","color-vision.type.deutan":"Deutan (verde debole o cieco)","color-vision.type.tritan":"Tritan (blu debole o cieco)","color-vision.severity":"Gravità",intoxication:"Alcol","intoxication.hint":"Riduce la sensibilità al contrasto di circa 0,9 dB a 0,08 % di alcol nel sangue (uno studio controllato; i risultati variano), mostrato fino a 0,1 % al massimo: un livello più alto viene registrato ma mostrato come 0,1 %, poiché oltre non è stato misurato nulla. Visione doppia, campo ristretto e altre droghe non sono modellati: nessuna fonte li quantifica.","intoxication.bloodAlcohol":"Alcolemia",fatigue:"Stanchezza","fatigue.hint":"Solo dichiarata: non è dimostrato che la mancanza di sonno cambi ciò che riceve un occhio sano, quindi l'immagine non cambia. Riguarda attenzione e memoria, non la vista.","fatigue.hoursAwake":"Sveglio da"},observerOccupation:"Professione",accountSource:"Resoconto raccolto",accountUrl:"Fonte (URL)",accountSourceUnknown:"sconosciuto",accountSourceOnSite:"indagine sul posto",accountSourceInterview:"colloquio di persona",accountSourceTelephone:"per telefono",accountSourceQuestionnaire:"questionario",accountSourceLetter:"l'ha scritto l'osservatore",accountSourceSocialMedia:"l'ha pubblicato l'osservatore in rete",accountSourcePress:"stampa o radiotelevisione",accountFollowedUp:"Ricontattato",accountUnknown:"sconosciuto",accountYes:"sì",accountNo:"no",questionUnanswered:"Nulla in questa registrazione risponde a una delle domande che una ricostruzione deve risolvere",durationRequired:"L'osservazione ha bisogno di una durata per poter essere riprodotta — indicala, o un'ora di fine, che può essere approssimativa",questionsUnanswered:"{count} delle domande a cui risponde una ricostruzione completa restano qui senza risposta",emptyDecor:"Nessun elemento della scenografia",emptyMilestones:"Nessun momento",emptyReferences:"Nessuna foto",emptyReferenceLandmarks:"Nessun punto di riferimento",emptyTraces:"Nessun tracciato dell'investigatore",emptyShapes:"Nessuna forma",addReference:"Aggiungi una foto",principalObserver:"Osservatore di questo resoconto",deleteObserver:"Elimina l'osservatore"};export{a as sightingEditorMessages_it};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e={type:"string",doc:"The schema this file was written against, for an editor to check it with: https://ufoathome.org/schema/1/sighting.schema.json."},t={type:"number",doc:"The version of the format this file is written in (see FormatVersion): 1, the only one so far."},o={type:"string",doc:'Which account this is, unique across every recording anywhere: the day it happened, then who saw it ("1964-04-24-ZamoraLonnie"), or where for an anonymous observer.'},r={type:"object",fields:{year:{type:"number"},month:{type:"number"},day:{type:"number"},hour:{type:"number"},minute:{type:"number"},second:{type:"number"},season:{type:"enum",doc:'The season, when the date is only known to be "in the spring of 2022" (EDTF `2022-21`): then `month` and `day` are undefined.',values:["spring","summer","autumn","winter"]},raw:{type:"string",doc:"The exact EDTF-ish text as typed in the editor UI (e.g."}}},a={type:"object",doc:"See SightingEvent.endTime.",fields:{year:{type:"number"},month:{type:"number"},day:{type:"number"},hour:{type:"number"},minute:{type:"number"},second:{type:"number"},season:{type:"enum",doc:'The season, when the date is only known to be "in the spring of 2022" (EDTF `2022-21`): then `month` and `day` are undefined.',values:["spring","summer","autumn","winter"]},raw:{type:"string",doc:"The exact EDTF-ish text as typed in the editor UI (e.g."}}},n={type:"number",doc:"See SightingEvent.durationSeconds."},s={type:"string",doc:"See SightingEvent.durationText."},i={type:"number",doc:"See SightingEvent.utcOffsetHours — the legal time zone `time`/`endTime` are expressed in."},d={type:"string",doc:"See SightingEvent.timeZone — the IANA rule `utcOffsetHours` was derived from, when it was."},h={type:"array",fields:{lat:{type:"number"},lng:{type:"number"},name:{type:"string",doc:'The place as it is named, fully qualified — "Valensole, Alpes-de-Haute-Provence, …, France".'}}},c={type:"object",doc:"See Sighting.observer.",fields:{id:{type:"string",doc:'Who this is, as a reference: last name then first names, run together ("ZamoraLonnie"), whether or not a page exists for them yet.'},title:{type:"string",doc:'What the observer is called when no name is given or wanted — "Witness 2" in one language, "Témoin 2" in another — or their name as they gave it.',loose:!0},lastName:{type:"string"},firstNames:{type:"array"}}},l={type:"object",doc:"Who saw it and how their account travelled — see Account, and Sighting.account.",fields:{observerAgeYears:{type:"number",doc:"The main observer's age in years AT THE TIME, not today — a 1974 account is read by whoever finds it decades later, and the number that means anything is the one from then."},observerBirth:{type:"object",doc:"The main observer's birth date, as precisely as it is known (a full date, a year, or one marked approximate): the other way of stating `observerAgeYears`, which the editor keeps in step with it against the observation date (see ObserverAge).",fields:{year:{type:"number"},month:{type:"number"},day:{type:"number"},hour:{type:"number"},minute:{type:"number"},second:{type:"number"},season:{type:"enum",doc:'The season, when the date is only known to be "in the spring of 2022" (EDTF `2022-21`): then `month` and `day` are undefined.',values:["spring","summer","autumn","winter"]},raw:{type:"string",doc:"The exact EDTF-ish text as typed in the editor UI (e.g."}}},observerPerception:{type:"object",doc:"How the main observer's own perception differs from a typical one — colour vision, alcohol, fatigue — as the values of the ObserverProviders' settings, by provider id."},observerOccupation:{type:"string",doc:'What the main observer did, as they are described: "boulanger", "pilote de ligne", "gendarme".',loose:!0},source:{type:"enum",doc:"How the account reached the person who wrote this recording.",values:["on-site","interview","telephone","questionnaire","letter","social-media","press"]},followedUp:{type:"boolean",doc:"Whether the observer was gone back to after the first account."},conditions:{type:"object",doc:"The conditions of this account and of the sighting as the observer lived it: what the error laws of the values they give read (see docs/witness-error-model.md and WitnessError).",fields:{delayDays:{type:"number",doc:"Days between the sighting and this account."},version:{type:"number",doc:"Which version of the observer's account this is: 1 for the first given."},word:{type:"enum",values:["object","light","craft","ufo","other"]},exposure:{type:"enum",values:["press","none","broadcast","other-witnesses","investigators"]},independent:{type:"boolean",doc:"Whether the observers gave their accounts without talking to each other first."},darkAdapted:{type:"boolean",doc:"Whether the observer's eyes were used to the dark."},correctedVision:{type:"boolean",doc:"Whether the observer wore the glasses or lenses they need."},glare:{type:"boolean",doc:"Whether a bright light dazzled the observer just before."},moonShownDeg:{type:"number",doc:"How wide the observer showed the full Moon, in degrees, the way they showed the object: their own angular-size factor is this over the Moon's real 0.52°, applied to every angular size they give (see WitnessError.MOON_DEG)."}}}}},p={type:"number",doc:"How much the observer's body sways the view at rest: 1 a person, 0 a tripod — see Sighting.sway."},u={type:"object",doc:"The vehicle the observer was in, when the decor does not draw it — see Sighting.vehicle.",fields:{kind:{type:"enum",values:["car","van","truck","motorcycle","generic"]},windowsOpen:{type:"boolean",doc:"Whether the windows were open: the road and the wind come in, the cabin no longer muffles the engine."},noise:{type:"number",doc:'How loud it was, against an ordinary one of its kind: 1 by default, 1.5 for "very noisy".'},headlights:{type:"enum",doc:'How its lights are set (see HeadlightMode), or "auto": the dipped beam from the dusk on and nothing by day, which is what a driver does.',values:["off","position","dipped","main","fog","auto"]},headlightKeyframes:{type:"array",doc:"Sorted by t.",fields:{t:{type:"number"},mode:{type:"enum",values:["off","position","dipped","main","fog","auto"]}}}}},y={type:"string",doc:"See SightingEvent.description — a plain string, or one per language.",loose:!0},m={type:"string",doc:"See SightingEvent.image — the picture a shared link to this recording shows."},g={type:"string",doc:"See SightingEvent.summary — what a shared link to this recording says of it.",loose:!0},b={type:"number",doc:"See SightingEvent.summaryTime — the second the picture of this recording's card is taken at."},f={type:"array",doc:"See SightingEvent.tags."},w={type:"object",fields:{keyframes:{type:"array",fields:{t:{type:"number"},shapes:{type:"array",fields:{sourceId:{type:"string"},shape:{type:"object",fields:{kind:{type:"enum",values:["oval","polygon"]},bounds:{type:"object",fields:{x:{type:"number"},y:{type:"number"},width:{type:"number"},height:{type:"number"}}},color:{type:"string",doc:"CSS color"},angle:{type:"number",doc:"Rotation in radians about the shape's centre, positive = clockwise on screen; 0 = no rotation"},transparency:{type:"number",doc:"0 = opaque, 1 = fully transparent"},haloScale:{type:"number",doc:"0 = no halo/glow, >1 = larger glow radius"},blur:{type:"number",doc:"How indistinct the observer said its edges were — 0 for a hard outline, 1 for a shape with no edge at all."},brightness:{type:"number",doc:"How dazzling the observer said it was — 0 for a light you can look at, 1 for one you cannot."},selected:{type:"boolean"},title:{type:"string",doc:"What the observer calls it, if anything.",loose:!0},angular:{type:"object",doc:"How big this looked to the observer, in degrees of arc (see AngularExtent) — the recording's OWN statement of size, and the one it is allowed to make.",fields:{widthDeg:{type:"number",doc:"How wide it looked, in degrees of arc."},heightDeg:{type:"number",doc:"How tall it looked, in degrees of arc."}}},aim:{type:"object",doc:"Where the phenomenon itself was in the observer's sky (the direction of the shape's centre, not the way the observer was facing) — degrees of azimuth from true north and of altitude above the horizon, the same conventions as ObserverPose.",fields:{azimuthDeg:{type:"number",doc:"Degrees clockwise from true north, the same convention as ObserverPose.headingDeg."},altitudeDeg:{type:"number",doc:"Degrees above (positive) or below the horizon."}}},points:{type:"array",doc:"Points relative to bounds origin (0,0 = bounds.x, bounds.y)",fields:{x:{type:"number"},y:{type:"number"}}}}}}}}},order:{type:"array",doc:"Back-to-front paint/hit-test order — see Timeline's own `order` field."},groups:{type:"array",doc:"Each inner array is one group's member sourceIds (always >= 2 members) — see Timeline's own `groups` field."},span:{type:"number",doc:"The length of the observation the keyframes were placed against, in ms, when it is longer than the last keyframe — a shape placed at 0 s then moved at 5 s of a 10 s observation has keyframes at 0 and 5000 only, and without this the recording would end (and be stretched over the whole observation) at 5 s."}}},v={type:"object",doc:"The observer's position/elevation/orientation over time — absent for older recordings, which fall back to the legacy static place[0] (see Sighting.ts's resolveObserverPoseAt).",fields:{keyframes:{type:"array",fields:{t:{type:"number"},pose:{type:"object",fields:{lat:{type:"number",doc:"Decimal degrees."},lng:{type:"number"},elevationM:{type:"number",doc:"Metres above the local ground under the observer, not above sea level: 0 for someone standing on it, the height of a window or a cliff top otherwise."},headingDeg:{type:"number",doc:"Degrees clockwise from true north."},pitchDeg:{type:"number",doc:"Degrees above (positive) or below (negative) the local horizontal — how far up/down the observer was looking, e.g."},rollDeg:{type:"number",doc:"How far the instrument itself was tilted about its own line of sight, degrees, positive clockwise as the observer saw it — a camera held askew, a head leaned over."},fovDeg:{type:"number",doc:"Vertical field of view in degrees, as a Three.js PerspectiveCamera would take it."},fNumber:{type:"number",doc:"How far the lens was stopped down — undefined for anything the recording did not state, which then falls back to the instrument's own setting (see Instrument.fNumber)."},focusDistanceM:{type:"number",doc:"How far away the lens was focused, metres — undefined meaning at infinity, which is where a camera pointed at the sky sits and the only setting under which everything celestial comes out sharp."},filter:{type:"string",doc:"What was held in front of the instrument — a FILTERS id, a solar filter for an eclipse."}}}}}}},k={type:"object",doc:"Weather over time — absent for older recordings, which fall back to the legacy static `weather` field below (see Sighting.ts's resolveWeatherAt).",fields:{keyframes:{type:"array",fields:{t:{type:"number"},weather:{type:"object",fields:{cloudLayers:{type:"array",doc:"Explicit layers override the historical cloud fields; [] means no clouds.",fields:{id:{type:"string",doc:"Stable across keyframes: reordering layers must not regenerate their cloud pattern."},instances:{type:"array",doc:"Optional explicit masses, independent of the generated coverage percentage.",fields:{id:{type:"string"},eastM:{type:"number",doc:"Position relative to the recording's initial observer, in metres east/north."},northM:{type:"number"},baseM:{type:"number"},thicknessM:{type:"number"},widthM:{type:"number"},depthM:{type:"number"},rotationDeg:{type:"number"},density:{type:"number"},darkness:{type:"number",doc:"Visual shading, 0 (white) to 1 (very dark); absent inherits the parent layer."},seed:{type:"number"}}},type:{type:"enum",values:["cumulus","stratus","stratocumulus","cirrus","unknown"]},baseM:{type:"number",doc:"Base in metres above the recording's reference ground, not above the moving observer."},thicknessM:{type:"number",doc:"Vertical extent in metres."},coverage:{type:"number",doc:"Horizontal coverage, 0–1."},sizeM:{type:"number",doc:"Characteristic horizontal cloud size in metres."},density:{type:"number",doc:"Relative optical density, 0–2; zero is transparent."},darkness:{type:"number",doc:"Visual shading, 0 (white) to 1 (very dark)."},iceCrystalAlignment:{type:"number",doc:"Degree of preferential crystal orientation, meaningful only for cirrus."},seed:{type:"number",doc:"Reproducible variation; defaults to a hash of the stable layer id."},windDirectionDeg:{type:"number",doc:"Optional wind overrides; bearing TOWARD which the cloud travels, clockwise from north."},windSpeed:{type:"number"}}},cloudCover:{type:"number",doc:"0 = clear sky, 1 = fully overcast."},cloudDarkness:{type:"number",doc:"0 = light/clear clouds, 1 = dark/stormy character."},cloudBaseM:{type:"number",doc:"Height of the cloud layer's BASE above the ground, in meters — 600 to 2000 m covers most real low cloud."},highCloudCover:{type:"number",doc:"How much of the sky the HIGH deck covered, 0 to 1 — cirrus and cirrostratus, above about six kilometres, where anything present is ice rather than water."},lowerCloudCover:{type:"number",doc:"How much of the sky the LOW and MIDDLE decks covered, 0 to 1 — the cloud that stands between a observer and anything higher up."},iceCrystalAlignment:{type:"number",doc:"How steadily the ice crystals were falling, 0 to 1 — the one thing about the sky that decides which halo forms stood, and the one thing no record of any sighting holds."},rareIceCrystals:{type:"number",doc:"The share of a cirrus deck's crystals that are the rare kinds, 0 to 1: columns capped with pyramids, which draw the odd-radius rings (9, 20, 35 degrees), and plates free to turn about a level axis, which draw Lowitz's arcs sloping from the sundogs."},relativeHumidity:{type:"number",doc:"Relative humidity near the ground, 0 to 1."},precipitationType:{type:"enum",values:["none","rain","snow","hail"]},precipitationIntensity:{type:"number",doc:'0-1; meaningless while precipitationType is "none".'},precipitationAmount:{type:"number",doc:"How much of that precipitation is actually falling yet, 0 to 1 — absent meaning all of it."},windDirectionDeg:{type:"number",doc:"Degrees clockwise from true north — same convention as ObserverPose.headingDeg, and the direction the wind blows *toward*, not the one it comes from: SceneRenderer drifts every precipitation particle and cloud field along exactly this bearing (`sin/-cos`, north = -Z), so 0 means snow drifting northward."},windSpeed:{type:"number",doc:"Real-world wind speed in m/s (0 = calm, ~30 = violent storm/hurricane-force) — drives both cloud advection, visual precipitation drift and wind audio volume directly."},storm:{type:"boolean",doc:"Whether a thunderstorm was reported — drives both a scene-fog lightning flash and a delayed thunderclap (see SceneRenderer's lightning-flash scheduling, named for the visual mechanism it implements internally, not for this field)."}}}}}}},M={type:"object",doc:`Legacy static weather condition, kept only as weatherTrack's own fallback for recordings made before it existed — absent means "unknown/not recorded", not "clear skies" (renderers default to DEFAULT_WEATHER, see Weather.ts).`,fields:{cloudLayers:{type:"array",doc:"Explicit layers override the historical cloud fields; [] means no clouds.",fields:{id:{type:"string",doc:"Stable across keyframes: reordering layers must not regenerate their cloud pattern."},instances:{type:"array",doc:"Optional explicit masses, independent of the generated coverage percentage.",fields:{id:{type:"string"},eastM:{type:"number",doc:"Position relative to the recording's initial observer, in metres east/north."},northM:{type:"number"},baseM:{type:"number"},thicknessM:{type:"number"},widthM:{type:"number"},depthM:{type:"number"},rotationDeg:{type:"number"},density:{type:"number"},darkness:{type:"number",doc:"Visual shading, 0 (white) to 1 (very dark); absent inherits the parent layer."},seed:{type:"number"}}},type:{type:"enum",values:["cumulus","stratus","stratocumulus","cirrus","unknown"]},baseM:{type:"number",doc:"Base in metres above the recording's reference ground, not above the moving observer."},thicknessM:{type:"number",doc:"Vertical extent in metres."},coverage:{type:"number",doc:"Horizontal coverage, 0–1."},sizeM:{type:"number",doc:"Characteristic horizontal cloud size in metres."},density:{type:"number",doc:"Relative optical density, 0–2; zero is transparent."},darkness:{type:"number",doc:"Visual shading, 0 (white) to 1 (very dark)."},iceCrystalAlignment:{type:"number",doc:"Degree of preferential crystal orientation, meaningful only for cirrus."},seed:{type:"number",doc:"Reproducible variation; defaults to a hash of the stable layer id."},windDirectionDeg:{type:"number",doc:"Optional wind overrides; bearing TOWARD which the cloud travels, clockwise from north."},windSpeed:{type:"number"}}},cloudCover:{type:"number",doc:"0 = clear sky, 1 = fully overcast."},cloudDarkness:{type:"number",doc:"0 = light/clear clouds, 1 = dark/stormy character."},cloudBaseM:{type:"number",doc:"Height of the cloud layer's BASE above the ground, in meters — 600 to 2000 m covers most real low cloud."},highCloudCover:{type:"number",doc:"How much of the sky the HIGH deck covered, 0 to 1 — cirrus and cirrostratus, above about six kilometres, where anything present is ice rather than water."},lowerCloudCover:{type:"number",doc:"How much of the sky the LOW and MIDDLE decks covered, 0 to 1 — the cloud that stands between a observer and anything higher up."},iceCrystalAlignment:{type:"number",doc:"How steadily the ice crystals were falling, 0 to 1 — the one thing about the sky that decides which halo forms stood, and the one thing no record of any sighting holds."},rareIceCrystals:{type:"number",doc:"The share of a cirrus deck's crystals that are the rare kinds, 0 to 1: columns capped with pyramids, which draw the odd-radius rings (9, 20, 35 degrees), and plates free to turn about a level axis, which draw Lowitz's arcs sloping from the sundogs."},relativeHumidity:{type:"number",doc:"Relative humidity near the ground, 0 to 1."},precipitationType:{type:"enum",values:["none","rain","snow","hail"]},precipitationIntensity:{type:"number",doc:'0-1; meaningless while precipitationType is "none".'},precipitationAmount:{type:"number",doc:"How much of that precipitation is actually falling yet, 0 to 1 — absent meaning all of it."},windDirectionDeg:{type:"number",doc:"Degrees clockwise from true north — same convention as ObserverPose.headingDeg, and the direction the wind blows *toward*, not the one it comes from: SceneRenderer drifts every precipitation particle and cloud field along exactly this bearing (`sin/-cos`, north = -Z), so 0 means snow drifting northward."},windSpeed:{type:"number",doc:"Real-world wind speed in m/s (0 = calm, ~30 = violent storm/hurricane-force) — drives both cloud advection, visual precipitation drift and wind audio volume directly."},storm:{type:"boolean",doc:"Whether a thunderstorm was reported — drives both a scene-fog lightning flash and a delayed thunderclap (see SceneRenderer's lightning-flash scheduling, named for the visual mechanism it implements internally, not for this field)."}}},S={type:"object",doc:"What the sighting sounded like over time — see SoundTrack.",fields:{keyframes:{type:"array",fields:{t:{type:"number"},sound:{type:"object",fields:{kind:{type:"enum",values:["none","hum","whistle","rumble","crackle"]},volume:{type:"number",doc:"How loud it was, 0 (inaudible) to 1 (as loud as the observer could describe) — deliberately relative rather than a dB SPL figure: nobody reports a sound level in decibels, and inventing one would claim a measurement where there is only an impression."},pitchHz:{type:"number",doc:`The sound's own frequency in Hz — the oscillator's pitch for the pitched kinds ("hum", "whistle"), and the noise filter's centre for the unpitched ones ("rumble", "crackle"), where it reads as how deep or how sharp the noise is.`},src:{type:"string",doc:"An actual audio recording of the sound, when one exists (a observer who filmed the event, a later recording of the same phenomenon) — replaces synthesis entirely while it is set, with `volume` still scaling it."}}}}}}},T=JSON.parse(`{"type":"array","doc":"See Sighting.decor.","fields":{"id":{"type":"string"},"kind":{"type":"enum","values":["terrace","wall","building","tree","crop","mound","streetlight","vehicle","observer","aircraft","trafficlight","crossing","roadsign","shrub","bridge","wire","entity"]},"title":{"type":"string","doc":"Optional display name, same role as Shape.title — falls back to a generic \\"{kind} {n}\\" label (see SightingEditorElement.decorLabel) when absent.","loose":true},"eastM":{"type":"number","doc":"Meters from the observer's own position — eastM positive = east, northM positive = north."},"northM":{"type":"number"},"headingDeg":{"type":"number","doc":"Degrees clockwise from true north, same convention as ObserverPose.headingDeg — which way a vehicle is facing, or a observer looking."},"lit":{"type":"boolean","doc":"Streetlight lamp / vehicle headlights switched on."},"litKeyframes":{"type":"array","doc":"Sorted by t.","fields":{"t":{"type":"number"},"lit":{"type":"boolean"}}},"headlights":{"type":"enum","doc":"For a vehicle: how its lights are set (see HeadlightMode).","values":["off","position","dipped","main","fog"]},"headlightKeyframes":{"type":"array","doc":"Sorted by t.","fields":{"t":{"type":"number"},"mode":{"type":"enum","values":["off","position","dipped","main","fog"]}}},"lights":{"type":"array","doc":"The object's individual lamps, each with its own place on the body and its own rhythm — see DecorLight, and LIGHT_RIGS for the ready-made sets.","fields":{"id":{"type":"string"},"offsetM":{"type":"object","doc":"Where it sits on the object, in meters relative to the object's own centre and heading: +x is its right, +y up, +z its front.","fields":{"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"}}},"color":{"type":"string","doc":"CSS hex colour, as emitted — the regulated red/green/white of navigation lights, the amber of a hazard flasher."},"intensity":{"type":"number","doc":"Peak luminous intensity as a ratio to an ordinary navigation light's (1, about a hundred candela — see DecorSystem's LAMP_CANDELA); the airliner rig (LIGHT_RIGS) gives its beacon 1.5 and its wingtip strobes 20."},"pattern":{"type":"object","fields":{"kind":{"type":"enum","values":["steady","flash"]},"perMinute":{"type":"number"},"dutyCycle":{"type":"number"},"phase":{"type":"number"}}},"radiusM":{"type":"number","doc":"The radius of what shines, metres, where it is not a quarter of a metre: the lens of a traffic light is ten centimetres."},"beamDeg":{"type":"number","doc":"Where the lamp is seen from, when it is not from everywhere: the angle off the object's front (−z, where its heading points) at which it gives half its light, degrees."}}},"track":{"type":"array","doc":"Where the object is over time, when it moves — an aircraft crossing the sky, a car driving past.","fields":{"t":{"type":"number"},"eastM":{"type":"number"},"northM":{"type":"number"},"altitudeM":{"type":"number","doc":"Meters above the observer's own elevation."},"headingDeg":{"type":"number"},"gazeAzimuthDeg":{"type":"number","doc":"Where a figure looks, as a compass azimuth: its head turns to face it, as far as a neck turns (85 degrees either side of where its body points), if its model has a node named \\"head\\" (scripts/people/split_head.py)."}}},"sightingUrl":{"type":"string","doc":"For kind \\"observer\\" only: the URL of that observer's own sighting.json recording, if known — lets the 3D scene's own context menu offer \\"view this observer's account\\" (loading it the same way SightingEditorElement.importFromUrl already does)."},"windows":{"type":"object","doc":"Per-side window opacity, 0 (fully open — the pane is invisible, and DecorSystem.addRoom's own interior wall panel is skipped there too, same as no window at all) to 100 (fully closed — a solid-looking pane)."},"color":{"type":"string","doc":"What colour this object actually is, as a CSS colour — the same way a shape states its own (see Shape.color), because a recording is written and read by people and \\"#8f86a8\\" is a colour a person can type."},"observerSide":{"type":"enum","values":["front","behind","left","right","front-left","front-right","behind-left","behind-right"]},"observerFacing":{"type":"enum","doc":"Which window the observer looks through, when it is not the one at their own seat: a driver sits at \\"front-left\\" and looks through the windshield (\\"front\\").","values":["front","behind","left","right","front-left","front-right","behind-left","behind-right"]},"observerKeyframes":{"type":"array","doc":"Where the observer sits over time, when they do not stay where they are: a driver is in the car until the moment they get out of it.","fields":{"t":{"type":"number"},"side":{"type":"enum","doc":"The seat they are in from this instant; absent means they are outside the object.","values":["front","behind","left","right","front-left","front-right","behind-left","behind-right"]},"facing":{"type":"enum","doc":"The window they look through from this instant, when it is not the one at their seat.","values":["front","behind","left","right","front-left","front-right","behind-left","behind-right"]}}},"engine":{"type":"object","doc":"A vehicle heard running — see DecorEngine: its engine turning with its own \`track\`, heard less the further it is from the observer.","fields":{"kind":{"type":"enum","doc":"Which sound: a decor object's own \`kind\` says only \\"vehicle\\".","values":["car","van","truck","motorcycle","generic"]},"noise":{"type":"number","doc":"As ObserverVehicle.noise."}}},"aircraftSound":{"type":"enum","doc":"An aircraft heard while it flies — what sort of noise it makes (see AircraftHearing.noiseOfKind), or \\"silent\\" for one that makes none (a glider's cousin, a stand-in for something nobody heard).","values":["unknown","airliner-narrow","airliner-wide","regional-turboprop","regional-jet","business-jet","light-piston","turboprop-light","helicopter-light","helicopter-medium","helicopter-heavy","military-jet","glider","balloon","ultralight","unmanned","silent"]},"surveyedOn":{"type":"string","doc":"The day (YYYY-MM-DD) of the survey this object was taken from, where it comes from one (see \`origin\`): the latest of the days of everything it was drawn from (the laser flight, the aerial photograph, the map's edition)."},"facade":{"type":"object","doc":"Kind \\"building\\" only: the colour of its walls, and the windows and door drawn on them.","fields":{"color":{"type":"string","doc":"The colour of the wall, \\"#rrggbb\\": plaster, stone, brick."},"plain":{"type":"boolean","doc":"A plain wall, with no windows and no door."},"openings":{"type":"enum","doc":"How the walls are opened.","values":["tall","lancet"]},"storeyM":{"type":"number","doc":"The height of a storey, metres, where it is known (the floors a survey states, or those of an old building): absent is three."},"closedAtNight":{"type":"boolean","doc":"The windows of a place nobody is in at night (a shop, an office, a pool, a gymnasium): it has windows, but a fifth as many of them lit as a home has at the same hour (see DecorSystem.CLOSED_AT_NIGHT_SHARE)."}}},"roof":{"type":"object","doc":"Kind \\"building\\" only: the shape and colour of its roof.","fields":{"shape":{"type":"enum","doc":"\\"flat\\" is the box; \\"gable\\" rises to a ridge along the building's longer side; \\"hip\\" slopes down on all four; \\"dome\\" is a cupola over the ellipse the walls hold.","values":["flat","gable","hip","dome"]},"ridge":{"type":"enum","doc":"Which side of the building a gable's ridge runs along: \\"width\\" (the longer side, the default) or \\"depth\\".","values":["width","depth"]},"riseM":{"type":"number","doc":"How far the ridge stands above the eaves, metres."},"color":{"type":"string","doc":"The colour of the roof seen from above, \\"#rrggbb\\", where it was measured (see RoofShapes): the walls keep their own."}}},"bridge":{"type":"object","doc":"Kind \\"bridge\\" only: how it is built, where that is known — see BridgeStructure.","fields":{"spanM":{"type":"number","doc":"Metres of open span under the deck, centred on the object."},"deckThicknessM":{"type":"number","doc":"Thickness of the deck slab, metres."},"railing":{"type":"object","doc":"The railing along both edges: its height above the road, the spacing of its posts, and how many horizontal rails it has — two rails make two rows of rectangular openings.","fields":{"heightM":{"type":"number"},"postSpacingM":{"type":"number"},"rails":{"type":"number"}}}}},"wire":{"type":"object","doc":"Kind \\"wire\\" only: how many strands, where they hang, and which ends stand on a pole — see WireStructure.","fields":{"strands":{"type":"array","doc":"The strands: each one's height above the ground and, for a crossarm, how far it hangs to one side of the line (positive to the right of its heading).","fields":{"heightM":{"type":"number"},"acrossM":{"type":"number"}}},"poles":{"type":"enum","doc":"Which ends stand on a pole: both (default), the one the object's heading points away from (\`start\`) or towards (\`end\`), or none, for a line anchored on buildings at both ends.","values":["none","both","start","end"]},"diameterM":{"type":"number","doc":"How thick a strand is, metres."},"poleHeightM":{"type":"number","doc":"How tall a pole is, metres."}}},"lamp":{"type":"object","doc":"Kind \\"streetlight\\" only: the lamp it carries, where it is known (a town's inventory says it).","fields":{"colorTemperatureK":{"type":"number","doc":"The colour of its light, kelvins: 2 000 a sodium lamp's orange, 2 700 to 3 000 a warm white LED's, 4 000 a cold one."},"lumens":{"type":"number","doc":"Its luminous flux, lumens."},"mount":{"type":"enum","doc":"\\"wall\\": a bracket on a facade, with no column of its own.","values":["wall","column"]}}},"sign":{"type":"object","doc":"Kind \\"roadsign\\" only: what its face says.","fields":{"face":{"type":"enum","doc":"\\"stop\\" is the red octagon, \\"give-way\\" the triangle point down, \\"speed-limit\\" the disc ringed in red; \\"other\\" a sign whose face is not drawn.","values":["other","stop","give-way","speed-limit"]},"code":{"type":"string","doc":"The sign as the map codes it, where it does (\\"FR:B14[50]\\")."},"value":{"type":"number","doc":"The limit, km/h, for a \\"speed-limit\\"."}}},"floors":{"type":"number","doc":"Kind \\"building\\" only: number of upper stories above the ground floor, set when the building is created (default 2, see SightingEditorElement.addDecor) and editable afterward."},"occupiedFloor":{"type":"number","doc":"Kind \\"building\\" only, meaningful once observerSide is set: which floor the observer is on, 0 (ground floor) up to floors."},"occludesSourceIds":{"type":"array","doc":"Shape sourceIds (see Timeline.sourceIds/Shape) this decor object sits in front of, from the observer's own reported viewpoint — occluding that shape wherever their screen positions line up (see SceneRenderer.isScreenPointOccluded)."},"sizeM":{"type":"object","doc":"How big it really is, in meters, along its own axes — see DecorSize.","fields":{"widthM":{"type":"number"},"lengthM":{"type":"number"},"heightM":{"type":"number"}}},"modelParameters":{"type":"object","doc":"The settings of the model this object is drawn as, by the key the model publishes them under (see ModelParameters.parameters): a being's costume colour, say."},"model":{"type":"object","doc":"The real 3D model that stands in for the primitive, if one does — see DecorModelRef.","fields":{"id":{"type":"string","doc":"Catalogue entry, resolved by the live DecorModelProvider."},"url":{"type":"string","doc":"Direct glTF/GLB address, taking precedence over \`id\`."},"headingOffsetDeg":{"type":"number","doc":"Degrees to turn the loaded model about its own vertical axis so its nose points the way this scene's heading convention expects (0 faces -Z — see DecorSystem's build)."},"credit":{"type":"object","doc":"Who made it and under what licence.","fields":{"title":{"type":"string"},"author":{"type":"string"},"license":{"type":"string","doc":"Licence name as its author states it, e.g."},"sourceUrl":{"type":"string","doc":"Where it came from, so the claim can be checked."}}}}},"origin":{"type":"string","doc":"The survey this object was taken from, by the id of its provider (\\"ign-lidar-hd\\"), when the author did not place it by hand: the trees the editor plants from a canopy survey (see CanopyProvider)."}}}`),D={type:"array",doc:"The roads the account's own plan draws — see Sighting.roads and Road.ts.",fields:{id:{type:"string"},title:{type:"string",doc:"What the account calls it, where it calls it anything.",loose:!0},surface:{type:"enum",values:["paved","gravel","dirt"]},widthM:{type:"number",doc:"Carriageway width, metres."},path:{type:"array",doc:"The centre line, in metres east and north of the observer's place at t=0.",fields:{eastM:{type:"number"},northM:{type:"number"}}},source:{type:"string",doc:"Where this line comes from — the plan, the survey, the report it was read off.",loose:!0}}},j={type:"array",doc:"What an investigator drew over the place, imported from their file — see Sighting.traces and Trace.ts.",fields:{id:{type:"string"},title:{type:"string",doc:'What its author called it ("Ligne de visée depuis la ferme").',loose:!0},kind:{type:"enum",values:["polygon","point","line"]},points:{type:"array",doc:"One point for a marker, the vertices of a line, the vertices of an outline (not repeated at the end: it is closed by being a polygon).",fields:{lat:{type:"number"},lng:{type:"number"},altM:{type:"number",doc:"Metres, read as `InvestigatorTrace.altitude` says."}}},altitude:{type:"enum",doc:"How `altM` is read.",values:["ground","relative","absolute"]},color:{type:"string",doc:"CSS colour the author gave it, `#rrggbb`."},source:{type:"string",doc:"Whose it is and where it comes from — the person, the report, the file.",loose:!0}}},x={type:"object",doc:"Which meteorological record `weatherTrack` was looked up from, when it wasn't the observer who stated the conditions — see Sighting.weatherSource.",fields:{id:{type:"string",doc:"Stable dataset id, e.g."},name:{type:"string",doc:"Human-readable dataset name, e.g."},url:{type:"string",doc:"The exact request that produced these values, so the claim stays checkable years later."}}},W={type:"string",doc:"Which INSTRUMENTS entry this was observed through — see Sighting.instrumentId."},H={type:"number",doc:"How long the shutter stayed open, seconds — one value for the whole observation, see Sighting.exposureSeconds."},A={type:"number",doc:"The speed of the film or sensor this picture was taken on — see Sighting.iso."},R={type:"number",doc:`How bright the night sky is at the place, towns and all: the zenith of a moonless night in magnitudes per square arcsecond, a Sky Quality Meter's reading or the World Atlas's "SQM" figure (Falchi et al.`},z={type:"boolean",doc:"Whether the map of where the observer stood starts open — see Sighting.observerMap."},E={type:"array",doc:"The named moments of the account — see Milestone.",fields:{t:{type:"number",doc:"When, in milliseconds from the start of the recording — the same scale every track uses."},label:{type:"string",doc:'Short label, shown on the seek bar: the letter or number the account itself uses ("A", "B"), or a couple of words where it uses none.',loose:!0},note:{type:"string",doc:"What happened at that moment, in the account's own words where possible.",loose:!0}}},I={type:"array",doc:"Pictures of the place, laid over the reconstruction at the direction each was registered in — see SceneReference.",fields:{id:{type:"string",doc:"Stable id, what the editor's own list and a future trace on the picture name."},kind:{type:"enum",values:["photo","panorama"]},src:{type:"string",doc:"Where the picture is: an address, or the picture itself as a `data:` URL."},title:{type:"string",doc:'What to call it — "Vue depuis le muret, fin été 1968".',loose:!0},credit:{type:"string",doc:"Who made it and on what terms — shown wherever the picture is, because a credit that is not displayed is not a licence (see DataSource for the same rule on the data)."},creditUrl:{type:"string",doc:"Where that credit points: the source page, the licence."},t:{type:"number",doc:"The instant of the timeline it was taken at, milliseconds, for a picture made DURING the observation — by the observer, or by whoever was there."},from:{type:"object",doc:"Where it was taken from — the one point its registration holds for.",fields:{lat:{type:"number"},lng:{type:"number"}}},drawing:{type:"boolean",doc:"Whether somebody drew on it — a trajectory, an outline, an arrow — so that what the picture shows of the phenomenon is a statement made afterwards, not a thing the camera recorded."},opacity:{type:"number",doc:"How much of it shows, 0 to 1 — the starting point of the reader's own slider, since the comparison is made by sliding: all picture, all render, and the registration checked at every step between."},registration:{type:"object",fields:{headingDeg:{type:"number",doc:"Degrees clockwise from true north, the direction the picture's centre looks at."},pitchDeg:{type:"number",doc:"Degrees above the local horizontal, positive up."},rollDeg:{type:"number",doc:"Degrees the picture is tilted about its own axis, positive clockwise as it is looked at — see ObserverPose.rollDeg."},fovDeg:{type:"number",doc:"The picture's VERTICAL field, degrees — what the lens took in top to bottom, its horizontal field following from the image's own aspect ratio."}}},landmarks:{type:"array",doc:"The details it was lined up on — see PictureLandmark.",fields:{id:{type:"string"},label:{type:"string",doc:'What the detail is — "Arbre masquant", "barrière".',loose:!0},picture:{type:"object",doc:"Where it is on the picture, 0..1 from the top-left corner.",fields:{u:{type:"number"},v:{type:"number"}}},scene:{type:"object",doc:"Where it is from the observer, in the scene.",fields:{azimuthDeg:{type:"number"},altitudeDeg:{type:"number"}}}}}}},O={type:"array",doc:"Where the account can be read as it was given, each one a source — see RecordingSource.",fields:{type:{type:"enum",values:["book","article"]},title:{type:"string"},authors:{type:"array",doc:"The author(s) name(s): for a post, the account that posted it."},url:{type:"string",doc:"Where it can be read."},publication:{type:"object",doc:"Who published it and when (EDTF).",fields:{publisher:{type:"string"},time:{type:"string"}}},index:{type:"string",doc:"Chapter, page, etc."}}},C=JSON.parse(`{"type":"object","doc":"What the observer took it to be, in metres — see InterpretationJson.","fields":{"title":{"type":"string","doc":"What the claim is, in a few words — \\"Craft on its legs\\", \\"Weather balloon at 3 km\\".","loose":true},"bodies":{"type":"array","fields":{"id":{"type":"string"},"title":{"type":"string","loose":true},"explains":{"type":"array","doc":"The phenomena of the account (their \`sourceId\`s) this body claims to be — what its projected outline is measured against at each instant, and what is drawn as a ghost beside it."},"model":{"type":"object","doc":"What it is shaped like.","fields":{"id":{"type":"string","doc":"Catalogue entry, resolved by the live DecorModelProvider."},"url":{"type":"string","doc":"Direct glTF/GLB address, taking precedence over \`id\`."},"headingOffsetDeg":{"type":"number","doc":"Degrees to turn the loaded model about its own vertical axis so its nose points the way this scene's heading convention expects (0 faces -Z — see DecorSystem's build)."},"credit":{"type":"object","doc":"Who made it and under what licence.","fields":{"title":{"type":"string"},"author":{"type":"string"},"license":{"type":"string","doc":"Licence name as its author states it, e.g."},"sourceUrl":{"type":"string","doc":"Where it came from, so the claim can be checked."}}}}},"withObserver":{"type":"boolean","doc":"Whether the observer carries it: its keyframes, stated FROM THE OBSERVER, are offsets from their eye that go with the eye, instead of points of the world fixed where the eye was at each keyframe's instant."},"outlineNode":{"type":"string","doc":"The node of the model that IS what the observer drew — \\"hull\\" for a craft on legs the observer drew as an oval — and so what its outline is measured by (see BodyConfrontation)."},"track":{"type":"array","fields":{"t":{"type":"number"},"eastM":{"type":"number"},"northM":{"type":"number"},"azimuthDeg":{"type":"number"},"altitudeDeg":{"type":"number"},"distanceM":{"type":"number"},"onGround":{"type":"boolean","doc":"Standing on the ground."},"present":{"type":"boolean","doc":"Gone from here on — \`false\` — or back — \`true\`."},"altitudeAboveGroundM":{"type":"number","doc":"Metres between the ground under it and its lowest point."},"altitudeM":{"type":"number","doc":"Metres between its lowest point and the ground at the recording's own origin (where the observer stands at the start) — a height in the air that does NOT follow what is under the body."},"sizeM":{"type":"object","fields":{"widthM":{"type":"number"},"lengthM":{"type":"number"},"heightM":{"type":"number"}}},"attitude":{"type":"object","fields":{"headingDeg":{"type":"number"},"pitchDeg":{"type":"number"},"rollDeg":{"type":"number"}}},"appearance":{"type":"object","fields":{"color":{"type":"string","doc":"Its surface colour, CSS."},"albedo":{"type":"number","doc":"How much of the light falling on it it sends back, 0-1: aluminium ~0.7, a matt dark hull ~0.1."},"luminanceCdM2":{"type":"number","doc":"What it gives out of itself, candela per square metre — read through the scene's own photometry exactly as a flame's is (see BodyFlame), so that the same figure is a lamp at night and nothing at all against a noon sky."},"transparency":{"type":"number","doc":"How much of what is behind it shows through, 0 (opaque, the default) to 1 (gone): the same statement a drawn shape's transparency makes, for a body of the scene."},"haloScale":{"type":"number","doc":"How far the glare it throws round itself reaches, as a multiple of what its light gives (1, the default): 0 puts the glare out, 2 doubles its width."}}},"flame":{"type":"object","doc":"A flame coming out of it, from here on — see BodyFlame.","fields":{"node":{"type":"string"},"lengthM":{"type":"number","doc":"How far it reaches from the node, metres."},"widthM":{"type":"number","doc":"How wide it is at its widest, metres."},"color":{"type":"string","doc":"Its colour where it leaves the node, CSS."},"tipColor":{"type":"string","doc":"Its colour at its far end; the same as \`color\` when absent."},"luminanceCdM2":{"type":"number"},"raisesDust":{"type":"boolean","doc":"Whether it raises dust where it meets the ground — a flame reaching loose, dry soil does, the more the nearer it gets."}}},"motions":{"type":"object","doc":"How far along each of its model's own movements it is, by the movement's name in the model (a glTF animation): 0 at its start, 1 at its end, and on past 1 for one that repeats — a turn made three times is 3."},"lights":{"type":"object","doc":"The luminance of each of its model's own lights, cd/m², by the name of the light's material in the model: what lets one body carry lights that behave each their own way — a steady white at each end, a red one flashing between."}}},"sound":{"type":"object","doc":"What it sounds like: heard from where the observer stands, late by the time sound takes to come, shifted in pitch as it comes and goes, and masked by the noise of the place (see BodyHearing).","fields":{"kind":{"type":"enum","values":["unknown","airliner-narrow","airliner-wide","regional-turboprop","regional-jet","business-jet","light-piston","turboprop-light","helicopter-light","helicopter-medium","helicopter-heavy","military-jet","glider","balloon","ultralight","unmanned"]},"quieterDb":{"type":"number","doc":"Decibels less than the class's own sound power, across its spectrum."}}}}},"smoke":{"type":"array","doc":"Fires the interpretation lights on the ground, as their smoke — see SmokeSource.","fields":{"eastM":{"type":"number"},"northM":{"type":"number"},"fromT":{"type":"number"},"untilT":{"type":"number"},"halfLifeS":{"type":"number","doc":"How fast it dies down, seconds to half its thickness — brush flares and smoulders."}}},"flares":{"type":"array","doc":"Salvoes of decoy flares an aircraft dispensed, computed into bodies when shown — see FlareSalvoJson.","fields":{"id":{"type":"string"},"title":{"type":"string","loose":true},"aircraft":{"type":"object","doc":"The aircraft at one instant of the recording, flying straight and level from there on (and before).","fields":{"t":{"type":"number"},"eastM":{"type":"number"},"northM":{"type":"number"},"altitudeM":{"type":"number","doc":"Metres above the ground at the recording's origin — see BodyKeyframe.altitudeM."},"headingDeg":{"type":"number"},"speedMS":{"type":"number"},"originElevationM":{"type":"number","doc":"Its height above sea level at \`t\` would be this plus \`altitudeM\`: what sets how thick the air braking the flares is."},"model":{"type":"object","doc":"Drawn when given (a catalogue model or a primitive), dark and unlit as a fighter in an exercise often is.","fields":{"id":{"type":"string","doc":"Catalogue entry, resolved by the live DecorModelProvider."},"url":{"type":"string","doc":"Direct glTF/GLB address, taking precedence over \`id\`."},"headingOffsetDeg":{"type":"number","doc":"Degrees to turn the loaded model about its own vertical axis so its nose points the way this scene's heading convention expects (0 faces -Z — see DecorSystem's build)."},"credit":{"type":"object","doc":"Who made it and under what licence.","fields":{"title":{"type":"string"},"author":{"type":"string"},"license":{"type":"string","doc":"Licence name as its author states it, e.g."},"sourceUrl":{"type":"string","doc":"Where it came from, so the claim can be checked."}}}}},"sizeM":{"type":"object","fields":{"widthM":{"type":"number"},"lengthM":{"type":"number"},"heightM":{"type":"number"}}},"glow":{"type":"object","doc":"A light it gives off as it flies — its afterburner — which an observer may have taken for a phenomenon of its own.","fields":{"explains":{"type":"array","doc":"The phenomena of the account it claims to be — see BodyJson.explains."},"sizeM":{"type":"number","doc":"How wide it looks, m."},"luminousIntensityCd":{"type":"number"},"color":{"type":"string"},"fromT":{"type":"number","doc":"Ms of the recording."},"untilT":{"type":"number"},"onS":{"type":"number","doc":"Seconds lit, then seconds out, repeated from \`fromT\`; always lit when absent."},"offS":{"type":"number"}}},"sound":{"type":"object","doc":"What it sounds like (see BodySound): heard from the two minutes before the recording on, as its sound takes that long to come from afar.","fields":{"kind":{"type":"enum","values":["unknown","airliner-narrow","airliner-wide","regional-turboprop","regional-jet","business-jet","light-piston","turboprop-light","helicopter-light","helicopter-medium","helicopter-heavy","military-jet","glider","balloon","ultralight","unmanned"]},"quieterDb":{"type":"number","doc":"Decibels less than the class's own sound power, across its spectrum."}}}}},"releases":{"type":"array","doc":"When each flare leaves it, and which phenomena of the account it claims to be.","fields":{"t":{"type":"number","doc":"Ms of the recording."},"explains":{"type":"array","doc":"The phenomena of the account this flare claims to be — see BodyJson.explains."}}},"flare":{"type":"object","doc":"The flare dispensed: an MJU-7 when absent (see DecoyFlare.MJU_7).","fields":{"massKg":{"type":"number","doc":"Mass at ejection, kg."},"burnedKg":{"type":"number","doc":"Mass burned away by burnout, kg."},"dragAreaM2":{"type":"number","doc":"Drag coefficient times reference area, m²: how hard the air brakes it."},"ejectionMS":{"type":"number","doc":"The dispenser's kick, m/s, straight down out of the aircraft."},"burnS":{"type":"number","doc":"How long it burns, s."},"luminousIntensityCd":{"type":"number","doc":"Its luminous intensity at full burn, candela, in the visible: what the eye gets of it."},"flameSizeM":{"type":"number","doc":"How wide its burning plume looks, m: the size of the glowing sphere drawn."},"color":{"type":"string","doc":"The colour of its light, CSS."}}},"wind":{"type":"object","doc":"The wind at the flares' height: where it blows TOWARDS, degrees, and its speed.","fields":{"towardDeg":{"type":"number"},"speedMS":{"type":"number"}}}}},"variant":{"type":"object","doc":"When this interpretation is a VARIANT of the account: what the observer would have to have erred by for the account to be a misperception of a candidate, as the candidate search found it (see CandidateSearch, docs/witness-error-model.md).","fields":{"candidate":{"type":"string","doc":"Which candidate: a body of the sky (\\"Venus\\"), a satellite, a re-entry, an aircraft, or another interpretation."},"label":{"type":"string","doc":"What the candidate is called, as it was when the variant was kept."},"phenomenon":{"type":"string","doc":"The known phenomenon of Poher's matrix it is an instance of, when it is one."},"parameters":{"type":"object","doc":"The witness parameters applied: a clock offset in minutes, a rotation of the heading in degrees, factors on elevation and size.","fields":{"clockMinutes":{"type":"number"},"headingDeg":{"type":"number"},"elevationFactor":{"type":"number"},"sizeFactor":{"type":"number"},"durationFactor":{"type":"number"}}},"moved":{"type":"array","doc":"The values it moves: what the account says, what the variant reads, the bias and its status.","fields":{"field":{"type":"enum","values":["time","heading","elevation","size","duration","sweep"]},"stated":{"type":"number"},"variant":{"type":"number"},"parameter":{"type":"string"},"amount":{"type":"number"},"z":{"type":"number"},"status":{"type":"string"}}},"readings":{"type":"array","doc":"The structural readings it uses (see CandidateSearch's StructuralReading), each with what the studies say of it.","fields":{"reading":{"type":"string"},"status":{"type":"string"}}},"cost":{"type":"number","doc":"What it costs, in units of the laws' spread (σ), and the verdict it got."},"verdict":{"type":"enum","values":["consolidated","contested","incompatible"]},"modelId":{"type":"string","doc":"The error model it was computed with (see WitnessError.MODELS)."}}}}}`),L=JSON.parse(`{"type":"array","doc":"The variants of the account that were kept: each an interpretation saying what the observer would have erred by for it to be a misperception of a candidate (see InterpretationJson.variant).","fields":{"title":{"type":"string","doc":"What the claim is, in a few words — \\"Craft on its legs\\", \\"Weather balloon at 3 km\\".","loose":true},"bodies":{"type":"array","fields":{"id":{"type":"string"},"title":{"type":"string","loose":true},"explains":{"type":"array","doc":"The phenomena of the account (their \`sourceId\`s) this body claims to be — what its projected outline is measured against at each instant, and what is drawn as a ghost beside it."},"model":{"type":"object","doc":"What it is shaped like.","fields":{"id":{"type":"string","doc":"Catalogue entry, resolved by the live DecorModelProvider."},"url":{"type":"string","doc":"Direct glTF/GLB address, taking precedence over \`id\`."},"headingOffsetDeg":{"type":"number","doc":"Degrees to turn the loaded model about its own vertical axis so its nose points the way this scene's heading convention expects (0 faces -Z — see DecorSystem's build)."},"credit":{"type":"object","doc":"Who made it and under what licence.","fields":{"title":{"type":"string"},"author":{"type":"string"},"license":{"type":"string","doc":"Licence name as its author states it, e.g."},"sourceUrl":{"type":"string","doc":"Where it came from, so the claim can be checked."}}}}},"withObserver":{"type":"boolean","doc":"Whether the observer carries it: its keyframes, stated FROM THE OBSERVER, are offsets from their eye that go with the eye, instead of points of the world fixed where the eye was at each keyframe's instant."},"outlineNode":{"type":"string","doc":"The node of the model that IS what the observer drew — \\"hull\\" for a craft on legs the observer drew as an oval — and so what its outline is measured by (see BodyConfrontation)."},"track":{"type":"array","fields":{"t":{"type":"number"},"eastM":{"type":"number"},"northM":{"type":"number"},"azimuthDeg":{"type":"number"},"altitudeDeg":{"type":"number"},"distanceM":{"type":"number"},"onGround":{"type":"boolean","doc":"Standing on the ground."},"present":{"type":"boolean","doc":"Gone from here on — \`false\` — or back — \`true\`."},"altitudeAboveGroundM":{"type":"number","doc":"Metres between the ground under it and its lowest point."},"altitudeM":{"type":"number","doc":"Metres between its lowest point and the ground at the recording's own origin (where the observer stands at the start) — a height in the air that does NOT follow what is under the body."},"sizeM":{"type":"object","fields":{"widthM":{"type":"number"},"lengthM":{"type":"number"},"heightM":{"type":"number"}}},"attitude":{"type":"object","fields":{"headingDeg":{"type":"number"},"pitchDeg":{"type":"number"},"rollDeg":{"type":"number"}}},"appearance":{"type":"object","fields":{"color":{"type":"string","doc":"Its surface colour, CSS."},"albedo":{"type":"number","doc":"How much of the light falling on it it sends back, 0-1: aluminium ~0.7, a matt dark hull ~0.1."},"luminanceCdM2":{"type":"number","doc":"What it gives out of itself, candela per square metre — read through the scene's own photometry exactly as a flame's is (see BodyFlame), so that the same figure is a lamp at night and nothing at all against a noon sky."},"transparency":{"type":"number","doc":"How much of what is behind it shows through, 0 (opaque, the default) to 1 (gone): the same statement a drawn shape's transparency makes, for a body of the scene."},"haloScale":{"type":"number","doc":"How far the glare it throws round itself reaches, as a multiple of what its light gives (1, the default): 0 puts the glare out, 2 doubles its width."}}},"flame":{"type":"object","doc":"A flame coming out of it, from here on — see BodyFlame.","fields":{"node":{"type":"string"},"lengthM":{"type":"number","doc":"How far it reaches from the node, metres."},"widthM":{"type":"number","doc":"How wide it is at its widest, metres."},"color":{"type":"string","doc":"Its colour where it leaves the node, CSS."},"tipColor":{"type":"string","doc":"Its colour at its far end; the same as \`color\` when absent."},"luminanceCdM2":{"type":"number"},"raisesDust":{"type":"boolean","doc":"Whether it raises dust where it meets the ground — a flame reaching loose, dry soil does, the more the nearer it gets."}}},"motions":{"type":"object","doc":"How far along each of its model's own movements it is, by the movement's name in the model (a glTF animation): 0 at its start, 1 at its end, and on past 1 for one that repeats — a turn made three times is 3."},"lights":{"type":"object","doc":"The luminance of each of its model's own lights, cd/m², by the name of the light's material in the model: what lets one body carry lights that behave each their own way — a steady white at each end, a red one flashing between."}}},"sound":{"type":"object","doc":"What it sounds like: heard from where the observer stands, late by the time sound takes to come, shifted in pitch as it comes and goes, and masked by the noise of the place (see BodyHearing).","fields":{"kind":{"type":"enum","values":["unknown","airliner-narrow","airliner-wide","regional-turboprop","regional-jet","business-jet","light-piston","turboprop-light","helicopter-light","helicopter-medium","helicopter-heavy","military-jet","glider","balloon","ultralight","unmanned"]},"quieterDb":{"type":"number","doc":"Decibels less than the class's own sound power, across its spectrum."}}}}},"smoke":{"type":"array","doc":"Fires the interpretation lights on the ground, as their smoke — see SmokeSource.","fields":{"eastM":{"type":"number"},"northM":{"type":"number"},"fromT":{"type":"number"},"untilT":{"type":"number"},"halfLifeS":{"type":"number","doc":"How fast it dies down, seconds to half its thickness — brush flares and smoulders."}}},"flares":{"type":"array","doc":"Salvoes of decoy flares an aircraft dispensed, computed into bodies when shown — see FlareSalvoJson.","fields":{"id":{"type":"string"},"title":{"type":"string","loose":true},"aircraft":{"type":"object","doc":"The aircraft at one instant of the recording, flying straight and level from there on (and before).","fields":{"t":{"type":"number"},"eastM":{"type":"number"},"northM":{"type":"number"},"altitudeM":{"type":"number","doc":"Metres above the ground at the recording's origin — see BodyKeyframe.altitudeM."},"headingDeg":{"type":"number"},"speedMS":{"type":"number"},"originElevationM":{"type":"number","doc":"Its height above sea level at \`t\` would be this plus \`altitudeM\`: what sets how thick the air braking the flares is."},"model":{"type":"object","doc":"Drawn when given (a catalogue model or a primitive), dark and unlit as a fighter in an exercise often is.","fields":{"id":{"type":"string","doc":"Catalogue entry, resolved by the live DecorModelProvider."},"url":{"type":"string","doc":"Direct glTF/GLB address, taking precedence over \`id\`."},"headingOffsetDeg":{"type":"number","doc":"Degrees to turn the loaded model about its own vertical axis so its nose points the way this scene's heading convention expects (0 faces -Z — see DecorSystem's build)."},"credit":{"type":"object","doc":"Who made it and under what licence.","fields":{"title":{"type":"string"},"author":{"type":"string"},"license":{"type":"string","doc":"Licence name as its author states it, e.g."},"sourceUrl":{"type":"string","doc":"Where it came from, so the claim can be checked."}}}}},"sizeM":{"type":"object","fields":{"widthM":{"type":"number"},"lengthM":{"type":"number"},"heightM":{"type":"number"}}},"glow":{"type":"object","doc":"A light it gives off as it flies — its afterburner — which an observer may have taken for a phenomenon of its own.","fields":{"explains":{"type":"array","doc":"The phenomena of the account it claims to be — see BodyJson.explains."},"sizeM":{"type":"number","doc":"How wide it looks, m."},"luminousIntensityCd":{"type":"number"},"color":{"type":"string"},"fromT":{"type":"number","doc":"Ms of the recording."},"untilT":{"type":"number"},"onS":{"type":"number","doc":"Seconds lit, then seconds out, repeated from \`fromT\`; always lit when absent."},"offS":{"type":"number"}}},"sound":{"type":"object","doc":"What it sounds like (see BodySound): heard from the two minutes before the recording on, as its sound takes that long to come from afar.","fields":{"kind":{"type":"enum","values":["unknown","airliner-narrow","airliner-wide","regional-turboprop","regional-jet","business-jet","light-piston","turboprop-light","helicopter-light","helicopter-medium","helicopter-heavy","military-jet","glider","balloon","ultralight","unmanned"]},"quieterDb":{"type":"number","doc":"Decibels less than the class's own sound power, across its spectrum."}}}}},"releases":{"type":"array","doc":"When each flare leaves it, and which phenomena of the account it claims to be.","fields":{"t":{"type":"number","doc":"Ms of the recording."},"explains":{"type":"array","doc":"The phenomena of the account this flare claims to be — see BodyJson.explains."}}},"flare":{"type":"object","doc":"The flare dispensed: an MJU-7 when absent (see DecoyFlare.MJU_7).","fields":{"massKg":{"type":"number","doc":"Mass at ejection, kg."},"burnedKg":{"type":"number","doc":"Mass burned away by burnout, kg."},"dragAreaM2":{"type":"number","doc":"Drag coefficient times reference area, m²: how hard the air brakes it."},"ejectionMS":{"type":"number","doc":"The dispenser's kick, m/s, straight down out of the aircraft."},"burnS":{"type":"number","doc":"How long it burns, s."},"luminousIntensityCd":{"type":"number","doc":"Its luminous intensity at full burn, candela, in the visible: what the eye gets of it."},"flameSizeM":{"type":"number","doc":"How wide its burning plume looks, m: the size of the glowing sphere drawn."},"color":{"type":"string","doc":"The colour of its light, CSS."}}},"wind":{"type":"object","doc":"The wind at the flares' height: where it blows TOWARDS, degrees, and its speed.","fields":{"towardDeg":{"type":"number"},"speedMS":{"type":"number"}}}}},"variant":{"type":"object","doc":"When this interpretation is a VARIANT of the account: what the observer would have to have erred by for the account to be a misperception of a candidate, as the candidate search found it (see CandidateSearch, docs/witness-error-model.md).","fields":{"candidate":{"type":"string","doc":"Which candidate: a body of the sky (\\"Venus\\"), a satellite, a re-entry, an aircraft, or another interpretation."},"label":{"type":"string","doc":"What the candidate is called, as it was when the variant was kept."},"phenomenon":{"type":"string","doc":"The known phenomenon of Poher's matrix it is an instance of, when it is one."},"parameters":{"type":"object","doc":"The witness parameters applied: a clock offset in minutes, a rotation of the heading in degrees, factors on elevation and size.","fields":{"clockMinutes":{"type":"number"},"headingDeg":{"type":"number"},"elevationFactor":{"type":"number"},"sizeFactor":{"type":"number"},"durationFactor":{"type":"number"}}},"moved":{"type":"array","doc":"The values it moves: what the account says, what the variant reads, the bias and its status.","fields":{"field":{"type":"enum","values":["time","heading","elevation","size","duration","sweep"]},"stated":{"type":"number"},"variant":{"type":"number"},"parameter":{"type":"string"},"amount":{"type":"number"},"z":{"type":"number"},"status":{"type":"string"}}},"readings":{"type":"array","doc":"The structural readings it uses (see CandidateSearch's StructuralReading), each with what the studies say of it.","fields":{"reading":{"type":"string"},"status":{"type":"string"}}},"cost":{"type":"number","doc":"What it costs, in units of the laws' spread (σ), and the verdict it got."},"verdict":{"type":"enum","values":["consolidated","contested","incompatible"]},"modelId":{"type":"string","doc":"The error model it was computed with (see WitnessError.MODELS)."}}}}}`),Y={type:"object",doc:"What happened in the sky while it runs, as facts (a laser shot, a launch, a re-entry) — see SkyEventsJson.",fields:{beams:{type:"array",doc:"Beams of light sent through the air from the ground: a laser, a searchlight — see BeamJson.",fields:{id:{type:"string"},title:{type:"string",loose:!0},explains:{type:"array",doc:"The phenomena of the account (their `sourceId`s) this beam claims to be — see BodyJson.explains."},path:{type:"array",doc:"Where the light goes, in order: where it leaves the emitter, then where it is turned (a mirror) if it is, and where it ends (what it hits, or where it has gone far enough for nothing more of it to matter).",fields:{lat:{type:"number"},lng:{type:"number"},altitudeM:{type:"number",doc:"Altitude above the sea, metres."}}},wavelengthNm:{type:"number",doc:"The wavelength of the light, nm: 532 for the green of a frequency-doubled Nd:YAG laser, 520 for a green diode, 638 for a red one."},powerW:{type:"number",doc:"The optical power it carries, watts: its mean power for a pulsed laser, whose pulses an eye cannot tell apart."},divergenceMrad:{type:"number",doc:"How fast it widens, milliradians, full angle."},apertureM:{type:"number",doc:"How wide it leaves the emitter, metres."},fromT:{type:"number",doc:"When it is on, ms of the recording: from its start and until its end when absent."},untilT:{type:"number"}}},launches:{type:"array",doc:"Rocket launches, whose exhaust shows lit by a Sun the ground no longer sees — see LaunchJson.",fields:{id:{type:"string"},title:{type:"string",loose:!0},explains:{type:"array",doc:"The phenomena of the account (their `sourceId`s) this launch claims to be — see BodyJson.explains."},vehicle:{type:"object",doc:"What flew, as its operator names it.",fields:{name:{type:"string",doc:'"Falcon 9".'},mission:{type:"string",doc:'"Starlink Group 10-49".'},engine:{type:"object",doc:"The engine whose exhaust it is.",fields:{thrustKN:{type:"number",doc:"Thrust in vacuum, kN: a Merlin Vacuum's 934, an RL10's 110, a solid booster's thousands."},specificImpulseS:{type:"number",doc:"Specific impulse in vacuum, seconds: 348 for a Merlin Vacuum, 465 for an RL10, 285 for a solid."},propellant:{type:"enum",values:["rp1-lox","methane-lox","hydrogen-lox","hypergolic","solid"]}}}}},track:{type:"array",doc:"Where the stage stood at instants of the recording, ms.",fields:{t:{type:"number"},lat:{type:"number"},lng:{type:"number"},altitudeKm:{type:"number",doc:"Height above the ellipsoid, km."}}},burnFromT:{type:"number",doc:"When the engine started and stopped, ms of the recording."},burnUntilT:{type:"number"},plume:{type:"object",fields:{exhaustKgPerS:{type:"number",doc:"Mass of exhaust leaving the engine, kg per second."},condensedShare:{type:"number",doc:"The share of that exhaust that ends up as particles that scatter light, 0 to 1."},particleRadiusUm:{type:"number",doc:"Radius of those particles, micrometres."},expansionKmPerS:{type:"number",doc:"How fast a puff's radius grows, km per second, from `initialRadiusKm`."},initialRadiusKm:{type:"number"},lifetimeS:{type:"number",doc:"How long a puff lasts before the particles have gone, seconds."},collarShare:{type:"number",doc:"The share of the particles that is the collar: exhaust just let go, which leaves the nozzle at its exhaust velocity (3.4 km/s for a Merlin Vacuum) and, with almost no air to stop it, spreads into a wide, short-lived shell round the stage, where the rest stays behind as the narrow trail."},collarExpansionKmPerS:{type:"number",doc:"How fast the collar's radius grows, km per second, and how long it lasts, seconds."},collarLifetimeS:{type:"number"}}}}},reentries:{type:"array",doc:"Re-entries: placed on the Earth, not round the observer — see ReentryJson.",fields:{id:{type:"string"},title:{type:"string",loose:!0},explains:{type:"array",doc:"The phenomena of the account (their `sourceId`s) this re-entry claims to be — see BodyJson.explains."},object:{type:"object",doc:"The object that came down, when it is known — the catalogue says which piece it was.",fields:{name:{type:"string",doc:'Its catalogue name — "SL-12 R/B".'},cosparId:{type:"string",doc:'International designator — "1968-013C".'},norad:{type:"number",doc:"US Space Surveillance Network catalogue number — 3136."}}},track:{type:"array",doc:"Where the leading point of the break-up was, at instants of the recording.",fields:{t:{type:"number"},lat:{type:"number"},lng:{type:"number"},altitudeKm:{type:"number",doc:"Height above the ellipsoid, km."}}},fragments:{type:"array",doc:"The pieces seen, each following the same path some seconds behind the leading point.",fields:{id:{type:"string"},lagS:{type:"number",doc:"Seconds behind the leading point, along the same path."},fromT:{type:"number",doc:"When it is first seen, ms of the recording — when it broke off, or when it began to glow."},untilT:{type:"number",doc:"When it goes out, ms — burned up, or slowed below glowing."},absoluteMagnitude:{type:"number",doc:"Its brightness as a magnitude at 100 km — the meteor astronomers' absolute magnitude, which a fireball report gives — from which the brightness at the observer's actual distance follows."},color:{type:"string",doc:"Its colour, as a CSS hex colour."},trainS:{type:"number",doc:"How long a stretch of its own past path still glows behind it, seconds: the tail observers describe."}}}}}}},F={type:"object",doc:"Where the data its scene would otherwise ask third parties for is kept, beside this file — see FrozenData.",fields:{live:{type:"boolean",doc:"Every group asked of its source at every play, and nothing taken at save: off (absent) by default."},relief:{type:"object",fields:{src:{type:"string",doc:"The annex holding it, relative to the recording's own file (as a model's `url` is), or a `data:` URL for an annex kept inside the recording itself."},live:{type:"boolean",doc:"Asked of its source at every play, and never taken at save: what an author chooses by picking a source rather than the file."},takenOn:{type:"string",doc:"The day it was taken from its source, YYYY-MM-DD: what the data is a picture of (a road network, a survey) is that day's."},attribution:{type:"string",doc:"Whom it was taken from, as their licence asks it to be said."},refresh:{type:"boolean",doc:"Asked of its source again, once: the scene does not read the annex, and the editor takes it again at the next save and drops this."}}},imagery:{type:"object",fields:{src:{type:"string",doc:"The annex holding it, relative to the recording's own file (as a model's `url` is), or a `data:` URL for an annex kept inside the recording itself."},live:{type:"boolean",doc:"Asked of its source at every play, and never taken at save: what an author chooses by picking a source rather than the file."},takenOn:{type:"string",doc:"The day it was taken from its source, YYYY-MM-DD: what the data is a picture of (a road network, a survey) is that day's."},attribution:{type:"string",doc:"Whom it was taken from, as their licence asks it to be said."},refresh:{type:"boolean",doc:"Asked of its source again, once: the scene does not read the annex, and the editor takes it again at the next save and drops this."}}},roads:{type:"object",fields:{src:{type:"string",doc:"The annex holding it, relative to the recording's own file (as a model's `url` is), or a `data:` URL for an annex kept inside the recording itself."},live:{type:"boolean",doc:"Asked of its source at every play, and never taken at save: what an author chooses by picking a source rather than the file."},takenOn:{type:"string",doc:"The day it was taken from its source, YYYY-MM-DD: what the data is a picture of (a road network, a survey) is that day's."},attribution:{type:"string",doc:"Whom it was taken from, as their licence asks it to be said."},refresh:{type:"boolean",doc:"Asked of its source again, once: the scene does not read the annex, and the editor takes it again at the next save and drops this."}}},water:{type:"object",fields:{src:{type:"string",doc:"The annex holding it, relative to the recording's own file (as a model's `url` is), or a `data:` URL for an annex kept inside the recording itself."},live:{type:"boolean",doc:"Asked of its source at every play, and never taken at save: what an author chooses by picking a source rather than the file."},takenOn:{type:"string",doc:"The day it was taken from its source, YYYY-MM-DD: what the data is a picture of (a road network, a survey) is that day's."},attribution:{type:"string",doc:"Whom it was taken from, as their licence asks it to be said."},refresh:{type:"boolean",doc:"Asked of its source again, once: the scene does not read the annex, and the editor takes it again at the next save and drops this."}}},railways:{type:"object",fields:{src:{type:"string",doc:"The annex holding it, relative to the recording's own file (as a model's `url` is), or a `data:` URL for an annex kept inside the recording itself."},live:{type:"boolean",doc:"Asked of its source at every play, and never taken at save: what an author chooses by picking a source rather than the file."},takenOn:{type:"string",doc:"The day it was taken from its source, YYYY-MM-DD: what the data is a picture of (a road network, a survey) is that day's."},attribution:{type:"string",doc:"Whom it was taken from, as their licence asks it to be said."},refresh:{type:"boolean",doc:"Asked of its source again, once: the scene does not read the annex, and the editor takes it again at the next save and drops this."}}},upperAir:{type:"object",fields:{src:{type:"string",doc:"The annex holding it, relative to the recording's own file (as a model's `url` is), or a `data:` URL for an annex kept inside the recording itself."},live:{type:"boolean",doc:"Asked of its source at every play, and never taken at save: what an author chooses by picking a source rather than the file."},takenOn:{type:"string",doc:"The day it was taken from its source, YYYY-MM-DD: what the data is a picture of (a road network, a survey) is that day's."},attribution:{type:"string",doc:"Whom it was taken from, as their licence asks it to be said."},refresh:{type:"boolean",doc:"Asked of its source again, once: the scene does not read the annex, and the editor takes it again at the next save and drops this."}}},map:{type:"object",fields:{src:{type:"string",doc:"The annex holding it, relative to the recording's own file (as a model's `url` is), or a `data:` URL for an annex kept inside the recording itself."},live:{type:"boolean",doc:"Asked of its source at every play, and never taken at save: what an author chooses by picking a source rather than the file."},takenOn:{type:"string",doc:"The day it was taken from its source, YYYY-MM-DD: what the data is a picture of (a road network, a survey) is that day's."},attribution:{type:"string",doc:"Whom it was taken from, as their licence asks it to be said."},refresh:{type:"boolean",doc:"Asked of its source again, once: the scene does not read the annex, and the editor takes it again at the next save and drops this."}}},weather:{type:"object",doc:"Where the weather is kept, when it is not inside the recording (its `weatherTrack` and `weatherSource`): an annex holding them, read as the recording is loaded (see RecordingSections).",fields:{src:{type:"string",doc:"The annex holding it, relative to the recording's own file (as a model's `url` is), or a `data:` URL for an annex kept inside the recording itself."},live:{type:"boolean",doc:"Asked of its source at every play, and never taken at save: what an author chooses by picking a source rather than the file."},takenOn:{type:"string",doc:"The day it was taken from its source, YYYY-MM-DD: what the data is a picture of (a road network, a survey) is that day's."},attribution:{type:"string",doc:"Whom it was taken from, as their licence asks it to be said."},refresh:{type:"boolean",doc:"Asked of its source again, once: the scene does not read the annex, and the editor takes it again at the next save and drops this."}}},place:{type:"object",doc:"The place's name and coordinates (`place`), read from the recording's file rather than looked up by a geocoder when present: inside the recording, or in the annex `src` names.",fields:{src:{type:"string",doc:"The annex holding it, relative to the recording's own file (as a model's `url` is), or a `data:` URL for an annex kept inside the recording itself."},live:{type:"boolean",doc:"Asked of its source at every play, and never taken at save: what an author chooses by picking a source rather than the file."},takenOn:{type:"string",doc:"The day it was taken from its source, YYYY-MM-DD: what the data is a picture of (a road network, a survey) is that day's."},attribution:{type:"string",doc:"Whom it was taken from, as their licence asks it to be said."},refresh:{type:"boolean",doc:"Asked of its source again, once: the scene does not read the annex, and the editor takes it again at the next save and drops this."}}},lightPollution:{type:"object",doc:"The night sky's figure (`lightPollution`), read from the recording's file rather than looked up in the atlas when present: inside the recording, or in the annex `src` names.",fields:{src:{type:"string",doc:"The annex holding it, relative to the recording's own file (as a model's `url` is), or a `data:` URL for an annex kept inside the recording itself."},live:{type:"boolean",doc:"Asked of its source at every play, and never taken at save: what an author chooses by picking a source rather than the file."},takenOn:{type:"string",doc:"The day it was taken from its source, YYYY-MM-DD: what the data is a picture of (a road network, a survey) is that day's."},attribution:{type:"string",doc:"Whom it was taken from, as their licence asks it to be said."},refresh:{type:"boolean",doc:"Asked of its source again, once: the scene does not read the annex, and the editor takes it again at the next save and drops this."}}},decor:{type:"object",doc:"The scenery (`decor`), read from the recording's file rather than taken again from a survey of the place as the observer moves, when present: inside the recording, or in the annex `src` names.",fields:{src:{type:"string",doc:"The annex holding it, relative to the recording's own file (as a model's `url` is), or a `data:` URL for an annex kept inside the recording itself."},live:{type:"boolean",doc:"Asked of its source at every play, and never taken at save: what an author chooses by picking a source rather than the file."},takenOn:{type:"string",doc:"The day it was taken from its source, YYYY-MM-DD: what the data is a picture of (a road network, a survey) is that day's."},attribution:{type:"string",doc:"Whom it was taken from, as their licence asks it to be said."},refresh:{type:"boolean",doc:"Asked of its source again, once: the scene does not read the annex, and the editor takes it again at the next save and drops this."}}}}},B={$schema:e,version:t,id:o,time:r,endTime:a,durationSeconds:n,durationText:s,utcOffsetHours:i,timeZone:d,place:h,observer:c,account:l,sway:p,vehicle:u,description:y,image:m,summary:g,summaryTime:b,tags:f,timeline:w,observerTrack:v,weatherTrack:k,weather:M,soundTrack:S,decor:T,roads:D,traces:j,weatherSource:x,instrument:W,exposureSeconds:H,iso:A,lightPollution:R,observerMap:z,milestones:E,references:I,sources:O,interpretation:C,variants:L,skyEvents:Y,frozen:F};export{e as $schema,l as account,T as decor,B as default,y as description,n as durationSeconds,s as durationText,a as endTime,H as exposureSeconds,F as frozen,o as id,m as image,W as instrument,C as interpretation,A as iso,R as lightPollution,E as milestones,c as observer,z as observerMap,v as observerTrack,h as place,I as references,D as roads,Y as skyEvents,S as soundTrack,O as sources,g as summary,b as summaryTime,p as sway,f as tags,r as time,d as timeZone,w as timeline,j as traces,i as utcOffsetHours,L as variants,u as vehicle,t as version,M as weather,x as weatherSource,k as weatherTrack};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{f as V,O as B,g as q,T as j,h as C,i as X,j as tt,k as et}from"./rr0-sighting-editor.mjs";class I{constructor(t){this.survey=t}static CACHE_NAME="rr0-surroundings";static MAX_AGE_MS=720*3600*1e3;static FORMAT=7;static MAX_STORED=400;static asked=new Map;get id(){return this.survey.id}get name(){return this.survey.name}get attribution(){return this.survey.attribution}get creditUrl(){return this.survey.creditUrl}get contemporary(){return this.survey.contemporary}covers(t,e){return this.survey.covers(t,e)}async getSurroundings(t,e){const o=I.key(this.survey.id,t,e);let s=I.asked.get(o);return s===void 0&&(s=this.recalled(o,t,e),I.asked.set(o,s),s.catch(()=>I.asked.delete(o))),structuredClone(await s)}later(t,e){const o=this.survey.later?.(t,e);if(!o)return;const s=I.key(this.survey.id,t,e);return o.then(n=>{const a=I.partial.get(s);if(a){I.partial.delete(s);const{incomplete:r,...i}=a,h=[...a.credits??[],...n.credits??[]].filter((l,f,M)=>M.findIndex(d=>d.url===l.url)===f),c={...i,...n,dates:{...a.dates,...n.dates},...h.length>0?{credits:h}:{}};I.asked.set(s,Promise.resolve(c)),I.openCache().then(l=>l&&I.store(l,I.request(s),c))}return structuredClone(n)})}static partial=new Map;static forget(){I.partial.clear(),I.asked.clear()}static key(t,e,o){return`${t}/v${I.FORMAT}/${e.lat.toFixed(5)}/${e.lng.toFixed(5)}/${Math.round(o)}`}async recalled(t,e,o){const s=await I.openCache(),n=I.request(t);if(s)try{const r=await s.match(n);if(r){const{savedAt:i,surroundings:h}=await r.json();if(Date.now()-i<I.MAX_AGE_MS)return h;await s.delete(n)}}catch{}const a=await this.survey.getSurroundings(e,o);return a.incomplete?(I.asked.delete(t),I.partial.set(t,structuredClone(a)),a):(s&&I.store(s,n,a),a)}static async store(t,e,o){try{const s={savedAt:Date.now(),surroundings:o};await t.put(e,new Response(JSON.stringify(s),{headers:{"Content-Type":"application/json"}}));const n=await t.keys();for(const a of n.slice(0,Math.max(0,n.length-I.MAX_STORED)))await t.delete(a)}catch{}}static async openCache(){try{return typeof caches>"u"?void 0:await caches.open(I.CACHE_NAME)}catch{return}}static request(t){const e=typeof location>"u"?"http://localhost":location.origin;return new Request(`${e}/__surroundings__/${encodeURIComponent(t)}`)}}class st{constructor(t){if(this.candidates=t,t.length===0)throw new Error("A survey needs at least one candidate");this.current=t[0]}current;get id(){return this.current.id}get name(){return this.current.name}get attribution(){return this.current.attribution}get creditUrl(){return this.current.creditUrl}get contemporary(){return this.current.contemporary}covers(t,e){return this.candidates.some(o=>o.covers(t,e))}async getSurroundings(t,e){let o;for(const s of this.candidates)if(s.covers(t.lat,t.lng))try{const n=await s.getSurroundings(t,e);return this.current=s,n}catch(n){if(o??=n,!(n instanceof V))throw n}throw o??new V("no-coverage","No survey reaches this place")}later(t,e){return this.current.later?.(t,e)}}class D{constructor(t,e,o,s){this.heights=t,this.building=e,this.width=o,this.height=s}static ROOF_PERCENTILE=.9;static STEP_M=.9;static RECTANGLE_FILL=.72;static MIN_DEPTH_M=2.5;static MAX_PARTS=24;static MAX_CELLS=640;buildings(t){const e=t.metresPerPixel,o=t.minAreaM2??12,s=new Uint8Array(this.width*this.height),n=[];for(let a=0;a<this.building.length;a++){if(!this.building[a]||s[a])continue;const r=this.patchFrom(a,s);if(!(r.length*e*e<o))for(const i of this.buildingsOf(r,e,o))Math.hypot(i.eastM,i.northM)<=t.radiusM&&n.push(i)}return n.sort((a,r)=>Math.hypot(a.eastM,a.northM)-Math.hypot(r.eastM,r.northM)),n.slice(0,t.maxBuildings??60)}patchFrom(t,e){const o=[],s=[t];for(e[t]=1;s.length>0;){const n=s.pop();o.push(n);const a=n%this.width,r=Math.floor(n/this.width);for(const[i,h]of[[1,0],[-1,0],[0,1],[0,-1]]){const c=a+i,l=r+h;if(c<0||l<0||c>=this.width||l>=this.height)continue;const f=l*this.width+c;this.building[f]&&!e[f]&&Math.abs(this.heights[f]-this.heights[n])<=D.STEP_M&&(e[f]=1,s.push(f))}}return o}buildingsOf(t,e,o){const s=this.width/2,n=this.height/2,a=[],r=[],i=[];for(const h of t){const c=h%this.width,l=Math.floor(h/this.width);a.push((c+.5-s)*e),r.push((n-l-.5)*e),i.push(this.heights[h])}return D.ofPoints(a,r,i,e,o)}static ofPoints(t,e,o,s,n,a=D.RECTANGLE_FILL,r=[]){const i=[];for(let p=0;p<t.length;p++)for(const[E,v]of[[-.5,-.5],[.5,-.5],[-.5,.5],[.5,.5]])i.push([t[p]+E*s,e[p]+v*s]);const h=D.hull(i),{angle:c,rectangle:l}=D.smallestRectangle(h),f=t.length*s*s,M=(l.maxU-l.minU)*(l.maxV-l.minV);if(f/M>=a||f<4*n)return[D.building(l,c,D.roof(o))];const d=h.map((p,E)=>({from:{east:p[0],north:p[1]},to:{east:h[(E+1)%h.length][0],north:h[(E+1)%h.length][1]}})),g=D.dominantAngles([...r,...d]);return D.parts(t,e,o,g.length>0?g:[c],s,n)}static dominantAngles(t,e=3){const o=new Map;for(const s of t){const n=Math.hypot(s.to.east-s.from.east,s.to.north-s.from.north);if(n<1e-6)continue;const a=(Math.atan2(s.to.north-s.from.north,s.to.east-s.from.east)%(Math.PI/2)+Math.PI/2)%(Math.PI/2),r=Math.round(a/(Math.PI/60));o.set(r,(o.get(r)??0)+n)}return[...o.entries()].sort((s,n)=>n[1]-s[1]).slice(0,e).map(([s])=>s*Math.PI/60)}static parts(t,e,o,s,n,a){let r=t.map((h,c)=>c);const i=[];for(let h=0;h<D.MAX_PARTS&&r.length>0;h++){let c;for(const M of s){const d=D.largestIn(t,e,r,M,n);d&&(c===void 0||d.area>c.area)&&(c=d)}if(c===void 0||c.area<a)break;const l=c.covered;Math.min(c.rectangle.maxU-c.rectangle.minU,c.rectangle.maxV-c.rectangle.minV)>=D.MIN_DEPTH_M&&i.push(D.building(c.rectangle,c.angle,D.roof([...l].map(M=>o[M])))),r=r.filter(M=>!l.has(M))}return i}static largestIn(t,e,o,s,n){const a=Math.cos(s),r=Math.sin(s);let i=1/0,h=-1/0,c=1/0,l=-1/0;const f=[],M=[];for(const A of o){const y=t[A]*a+e[A]*r,R=-t[A]*r+e[A]*a;f.push(y),M.push(R),i=Math.min(i,y),h=Math.max(h,y),c=Math.min(c,R),l=Math.max(l,R)}const d=Math.max(n*Math.SQRT2,Math.max(h-i,l-c)/D.MAX_CELLS),g=Math.max(1,Math.ceil((h-i)/d+1e-9)),p=Math.max(1,Math.ceil((l-c)/d+1e-9)),E=new Uint8Array(g*p),v=o.map((A,y)=>{const R=Math.min(g-1,Math.max(0,Math.floor((f[y]-i)/d))),x=Math.min(p-1,Math.max(0,Math.floor((M[y]-c)/d)));return E[x*g+R]=1,x*g+R}),w=D.largestRectangle(E,g,p);if(w===void 0)return;const m=new Set;return o.forEach((A,y)=>{const R=v[y]%g,x=Math.floor(v[y]/g);R>=w.column&&R<w.column+w.columns&&x>=w.row&&x<w.row+w.rows&&m.add(A)}),{area:w.area*d*d,angle:s,covered:m,rectangle:{minU:i+w.column*d,maxU:i+(w.column+w.columns)*d,minV:c+w.row*d,maxV:c+(w.row+w.rows)*d}}}static largestRectangle(t,e,o){const s=new Array(e).fill(0);let n;for(let a=0;a<o;a++){for(let i=0;i<e;i++)s[i]=t[a*e+i]?s[i]+1:0;const r=[];for(let i=0;i<=e;i++){const h=i===e?0:s[i];for(;r.length>0&&s[r[r.length-1]]>=h;){const c=r.pop(),l=r.length===0?i:i-r[r.length-1]-1,f=s[c]*l;(n===void 0||f>n.area)&&(n={column:i-l,row:a-s[c]+1,columns:l,rows:s[c],area:f})}r.push(i)}}return n}static roof(t){const e=[...t].sort((o,s)=>o-s);return Math.max(2,e[Math.min(e.length-1,Math.floor(e.length*D.ROOF_PERCENTILE))])}static building(t,e,o){const s=Math.cos(e),n=Math.sin(e),a=t.maxU-t.minU,r=t.maxV-t.minV,i=(t.minU+t.maxU)/2,h=(t.minV+t.maxV)/2,l=((90-(a<r?e:e+Math.PI/2)*180/Math.PI)%180+180)%180;return{eastM:D.tenth(i*s-h*n),northM:D.tenth(i*n+h*s),widthM:D.tenth(Math.max(a,r)),lengthM:D.tenth(Math.min(a,r)),heightM:D.tenth(o),headingDeg:Math.round(l*10)/10}}static smallestRectangle(t){let e={area:1/0,angle:0,rectangle:{minU:0,maxU:0,minV:0,maxV:0}};for(let o=0;o<Math.max(1,t.length);o++){const[s,n]=t[o]??[0,0],[a,r]=t[(o+1)%t.length]??[1,0],i=Math.atan2(r-n,a-s),h=Math.cos(i),c=Math.sin(i);let l=1/0,f=-1/0,M=1/0,d=-1/0;for(const[p,E]of t){const v=p*h+E*c,w=-p*c+E*h;l=Math.min(l,v),f=Math.max(f,v),M=Math.min(M,w),d=Math.max(d,w)}const g=(f-l)*(d-M);g<e.area&&(e={area:g,angle:i,rectangle:{minU:l,maxU:f,minV:M,maxV:d}})}return e}static hull(t){const e=[...t].sort((r,i)=>r[0]-i[0]||r[1]-i[1]),o=e.filter((r,i)=>i===0||r[0]!==e[i-1][0]||r[1]!==e[i-1][1]);if(o.length<3)return o;const s=(r,i,h)=>(i[0]-r[0])*(h[1]-r[1])-(i[1]-r[1])*(h[0]-r[0]),n=[];for(const r of o){for(;n.length>=2&&s(n[n.length-2],n[n.length-1],r)<=0;)n.pop();n.push(r)}const a=[];for(const r of[...o].reverse()){for(;a.length>=2&&s(a[a.length-2],a[a.length-1],r)<=0;)a.pop();a.push(r)}return[...n.slice(0,-1),...a.slice(0,-1)]}static tenth(t){return Math.round(t*10)/10}}class H{constructor(t,e,o,s){this.heights=t,this.vegetation=e,this.width=o,this.height=s}static SUMMIT_RADIUS_M=2.5;static CROWN_REACH_M=8;static MAX_WIDTH_M=16;static MIN_WIDTH_M=2;static tenth(t){return Math.round(t*10)/10}trees(t){const e=t.metresPerPixel,o=t.minHeightM??4,s=t.eyeM??1.6,n=t.minElevationDeg??2,a=Math.max(1,Math.round(H.SUMMIT_RADIUS_M/e)),r=Math.round(H.CROWN_REACH_M/e),i=this.width/2,h=this.height/2,c=[];for(let l=0;l<this.height;l++)for(let f=0;f<this.width;f++){const M=this.canopy(f,l);if(M<o)continue;const d=(f+.5-i)*e,g=(h-l-.5)*e,p=Math.hypot(d,g);if(p>t.radiusM||!this.isSummit(f,l,M,a))continue;const E=Math.atan2(M-s,Math.max(p,1))*180/Math.PI;E<n||c.push({tree:{eastM:H.tenth(d),northM:H.tenth(g),heightM:H.tenth(M),widthM:H.tenth(this.crownWidth(f,l,M,e,r))},elevation:E})}return c.sort((l,f)=>f.elevation-l.elevation),c.slice(0,t.maxTrees??150).map(l=>l.tree)}canopy(t,e){if(t<0||e<0||t>=this.width||e>=this.height)return 0;const o=e*this.width+t;return this.vegetation[o]?this.heights[o]:0}isSummit(t,e,o,s){for(let n=-s;n<=s;n++)for(let a=-s;a<=s;a++){if(a===0&&n===0)continue;const r=this.canopy(t+a,e+n);if(r>o||r===o&&(n<0||n===0&&a<0))return!1}return!0}crownWidth(t,e,o,s,n){let a=0;for(let i=-n;i<=n;i++)for(let h=-n;h<=n;h++)Math.hypot(h,i)*s<=H.CROWN_REACH_M&&this.canopy(t+h,e+i)>=o*.5&&a++;const r=2*Math.sqrt(a*s*s/Math.PI);return Math.max(H.MIN_WIDTH_M,Math.min(r,H.MAX_WIDTH_M))}}class _{static WALLS={1:"stone",2:"meuliere",3:"concrete",4:"brick",5:"block",6:"wood",9:"other"};static ROOFS={1:"tile",2:"slate",3:"zinc",4:"concrete",9:"other"};static WALL_COLOURS={stone:"#b9ae9b",meuliere:"#b8a78a",concrete:"#b4b2ac",brick:"#a65f48",block:"#d0c6b2",wood:"#7d5c3e",other:"#c9c0ae"};static PLASTER="#d3cab8";static ROOF_COLOURS={tile:"#a0583f",slate:"#4a5059",zinc:"#8d969c",concrete:"#8f8e8a",other:"#7a7872"};static VARIATION=.12;static OLD_ROOF="#7d858c";static OLD_STOREY_M=3.6;static GRAND_STOREY_M=4.5;static MIN_STOREY_M=2.4;static MAX_STOREY_M=6;static of(t,e){const o=String(t??"").trim();if(!/^\d{1,2}$/.test(o))return;const s=Number(o),n=s%10!==0?s%10:Math.floor(s/10);return(e==="wall"?_.WALLS:_.ROOFS)[String(n)]}static roofColor(t){return t?_.ROOF_COLOURS[t]:void 0}static fit(t){return t.map(e=>{const o=e.style,s={...e.facade,color:e.facade?.color??_.wallColor(e)};o==="church"?s.openings="lancet":o==="monument"||o==="works"?s.plain=!0:(o==="old"||o==="grand")&&(s.openings="tall"),e.closedAtNight&&!s.plain&&(s.closedAtNight=!0);const n=_.storeyOf(e);n!==void 0&&o!=="church"&&o!=="monument"&&(s.storeyM=n);const a=o==="old"&&e.roof?.color===void 0?{shape:"flat",riseM:0,...e.roof,color:_.OLD_ROOF}:e.roof;return{...e,facade:s,...a?{roof:a}:{}}})}static storeyOf(t){const e=t.heightM-(t.roof?.riseM??0);if(t.floors&&t.floors>0){const o=e/t.floors;if(o>=_.MIN_STOREY_M&&o<=_.MAX_STOREY_M)return Math.round(o*100)/100}return t.style==="old"?_.OLD_STOREY_M:t.style==="grand"?_.GRAND_STOREY_M:void 0}static wallColor(t){const e=t.style==="church"||t.style==="monument"||t.style==="old",o=t.wallMaterial?_.WALL_COLOURS[t.wallMaterial]:e?_.WALL_COLOURS.stone:_.PLASTER,s=Math.sin(t.eastM*12.9898+t.northM*78.233)*43758.5453,n=1+(s-Math.floor(s)-.5)*2*_.VARIATION,a=r=>Math.max(0,Math.min(255,Math.round(parseInt(o.slice(r,r+2),16)*n))).toString(16).padStart(2,"0");return`#${a(1)}${a(3)}${a(5)}`}}class N{static MIN_RISE_M=1.2;static MIN_EAVES_M=2.5;static MIN_SEEN=.35;static NO_DATA=-9999;static BANDS=7;static INSET_M=.9;static LIFT=1.18;static PEAK=.3;static LEVEL=.45;static fit(t,e,o){return!e&&!o&&!t.some(s=>s.roofMaterial)?t:t.map(s=>{const n=e?N.shapeOf(s,e):void 0,a=(o?N.colorOf(s,o):void 0)??_.roofColor(s.roofMaterial);if(!n&&!a)return s;const r={shape:n?.shape??"flat",...n?.ridge==="depth"?{ridge:"depth"}:{},riseM:n?.riseM??0,...a?{color:a}:{}},i=n&&n.shape!=="flat"?n.topM:s.heightM;return{...s,heightM:i,roof:r}})}static world(t,e,o){const s=t.headingDeg*Math.PI/180;return{east:t.eastM+e*Math.cos(s)+o*Math.sin(s),north:t.northM-e*Math.sin(s)+o*Math.cos(s)}}static shapeOf(t,e){const o=N.BANDS,s=Math.max(e.metresPerPixel,.5),n=t.widthM/2-N.INSET_M,a=t.lengthM/2-N.INSET_M;if(n<=0||a<=0)return;const r=[],i=Array.from({length:o},()=>({sum:0,n:0})),h=Array.from({length:o},()=>({sum:0,n:0}));let c=0;for(let y=-n;y<=n;y+=s)for(let R=-a;R<=a;R+=s){c++;const{east:x,north:$}=N.world(t,y,R),z=Math.floor(x/e.metresPerPixel+e.size/2),Y=Math.floor(e.size/2-$/e.metresPerPixel);if(z<0||Y<0||z>=e.size||Y>=e.size)continue;const U=Y*e.size+z,P=e.heights[U];if(e.vegetation[U]||P===N.NO_DATA||!(P>0))continue;r.push(P);const J=i[Math.min(o-1,Math.floor((y+n)/(2*n)*o))],Q=h[Math.min(o-1,Math.floor((R+a)/(2*a)*o))];J.sum+=P,J.n++,Q.sum+=P,Q.n++}if(c===0||r.length/c<N.MIN_SEEN)return;r.sort((y,R)=>y-R);const l=N.percentile(r,.08),f=N.percentile(r,.92),M=f-l;if(l<N.MIN_EAVES_M||M>Math.min(t.widthM,t.lengthM))return;if(M<N.MIN_RISE_M)return{shape:"flat",riseM:0,topM:f};const d=N.profile(i),g=N.profile(h);if(!d||!g)return;const p=N.peak(g)/M,E=N.peak(d)/M,v=N.spread(d)/M,w=N.spread(g)/M,m=p>=N.PEAK&&v<=N.LEVEL,A=E>=N.PEAK&&w<=N.LEVEL;if(m&&(!A||p>=E))return{shape:"gable",ridge:"width",riseM:M,topM:f};if(A)return{shape:"gable",ridge:"depth",riseM:M,topM:f};if(p>=N.PEAK&&E>=N.PEAK/2)return{shape:"hip",ridge:"width",riseM:M,topM:f}}static profile(t){const e=t.map(o=>o.n>0?o.sum/o.n:NaN);return e.filter(Number.isFinite).length>=t.length-1?e.map((o,s)=>Number.isFinite(o)?o:N.neighbour(e,s)):void 0}static neighbour(t,e){return Number.isFinite(t[e-1])?t[e-1]:t[e+1]}static peak(t){const e=Math.max(1,Math.floor(t.length/3)),o=n=>n.reduce((a,r)=>a+r,0)/n.length,s=[...t.slice(0,e),...t.slice(t.length-e)];return o(t.slice(e,t.length-e))-o(s)}static spread(t){return Math.max(...t)-Math.min(...t)}static percentile(t,e){return t[Math.min(t.length-1,Math.floor(t.length*e))]}static colorOf(t,e){const o=Math.max(e.metresPerPixel,.5),s=Math.max(t.widthM/2-N.INSET_M,o),n=Math.max(t.lengthM/2-N.INSET_M,o),a=[],r=[],i=[];for(let l=-s;l<=s;l+=o)for(let f=-n;f<=n;f+=o){const{east:M,north:d}=N.world(t,l,f),g=Math.floor(M/e.metresPerPixel+e.size/2),p=Math.floor(e.size/2-d/e.metresPerPixel);if(g<0||p<0||g>=e.size||p>=e.size)continue;const E=(p*e.size+g)*e.samples,v=e.values[E],w=e.values[E+1],m=e.values[E+2];w>v&&w>m||(a.push(v),r.push(w),i.push(m))}if(a.length===0)return;const h=l=>l.sort((f,M)=>f-M)[Math.floor(l.length/2)],c=l=>Math.min(255,Math.round(l*N.LIFT)).toString(16).padStart(2,"0");return`#${c(h(a))}${c(h(r))}${c(h(i))}`}}class G{static DEFAULT_HEIGHT_M=6;static METRES_PER_DEGREE=111320;static STREET_SPACING_M=35;static KERB_OFFSET_M=1;static DEFAULT_WIDTH_M=5.5;static PATIENCE_MS=15e3;static MAX=150;static lampsFrom(t,e,o){const s=[],n=new Set;for(const r of t.elements??[]){if(r.id!==void 0){const l=`${r.type}/${r.id}`;if(n.has(l))continue;n.add(l)}if(r.type==="way"){r.tags?.lit==="yes"&&G.alongStreet(r,e,s);continue}if(r.tags?.highway!=="street_lamp"||typeof r.lat!="number"||typeof r.lon!="number")continue;const i=(r.lon-e.lng)*G.METRES_PER_DEGREE*Math.cos(e.lat*Math.PI/180),h=(r.lat-e.lat)*G.METRES_PER_DEGREE;if(Math.hypot(i,h)>o)continue;const c=Number.parseFloat(r.tags?.height??"");s.push({eastM:Math.round(i*10)/10,northM:Math.round(h*10)/10,...Number.isFinite(c)&&c>=2&&c<=20?{heightM:c}:{}})}const a=s.filter(r=>Math.hypot(r.eastM,r.northM)<=o);return s.length=0,s.push(...a),s.sort((r,i)=>Math.hypot(r.eastM,r.northM)-Math.hypot(i.eastM,i.northM)),s.slice(0,G.MAX)}static alongStreet(t,e,o){const s=t.geometry;if(!s||s.length<2)return;const n=d=>[(d.lon-e.lng)*G.METRES_PER_DEGREE*Math.cos(e.lat*Math.PI/180),(d.lat-e.lat)*G.METRES_PER_DEGREE],a=s.map(n),r=Number.parseFloat(t.tags?.width??""),i=Number.parseInt(t.tags?.lanes??"",10),c=(Number.isFinite(r)&&r>0?r:Number.isFinite(i)&&i>0?i*3.5:G.DEFAULT_WIDTH_M)/2+G.KERB_OFFSET_M;let l=1,f=G.STREET_SPACING_M/2,M=0;for(let d=1;d<a.length;d++){const[g,p]=a[d-1],[E,v]=a[d],w=Math.hypot(E-g,v-p);if(w===0)continue;const m=(E-g)/w,A=(v-p)/w;for(;f<=M+w;f+=G.STREET_SPACING_M){const y=f-M;o.push({eastM:Math.round((g+m*y+A*c*l)*10)/10,northM:Math.round((p+A*y-m*c*l)*10)/10}),l=-l}M+=w}}}class u{constructor(t={},e=[],o=[]){this.lampSources=e,this.signalSources=o,this.client=new B(t)}static METRES_PER_DEGREE=111320;static KERB_OFFSET_M=.6;static SETBACK_M=.5;static MIN_CROSSING_M=3;static MAX_CROSSING_M=30;static SAME_CROSSING_M=5;static SAME_HEAD_M=2.5;static SAME_HEAD_DEG=45;static MAX_SIGNALS=160;static MAX_CROSSINGS=150;static MAX_SIGNS=100;static ROADS=new Set([...q.DRIVABLE,"living_street","busway","road"]);static ON_ROAD="^(traffic_signals|crossing|stop|give_way)$";static CREDIT={name:"OpenStreetMap",url:"https://www.openstreetmap.org/copyright",licence:"ODbL"};client;local(t,e){const o=u.boxOf(t,e),s=(r,i)=>{if(!r)return Promise.resolve(void 0);const h=`${r.credit.url} ${o}`;let c=u.localPending.get(h);return c||(c=i().then(l=>({credit:r.credit,found:l}),()=>{u.localPending.delete(h)}),u.localPending.set(h,c)),c},n=this.lampSources.find(r=>r.covers(t.lat,t.lng)),a=this.signalSources.find(r=>r.covers(t.lat,t.lng));return Promise.all([s(n,()=>n.lampsNear(t,e)),s(a,()=>a.signalsNear(t,e))]).then(([r,i])=>({lamps:r,signals:i}))}static localPending=new Map;static withLocal(t,e){const o=e?.lamps?e.lamps.found:t.lamps,s=e?.signals?e.signals.found:t.signals,a=[...u.found({crossings:t.crossings,signs:t.signs,...e?.lamps?{}:{lamps:o},...e?.signals?{}:{signals:s}})?[u.CREDIT]:[],...e?.lamps&&e.lamps.found.length>0?[e.lamps.credit]:[],...e?.signals&&e.signals.found.length>0?[e.signals.credit]:[]],{lamps:r,signals:i,credits:h,...c}=t;return{...c,...o?.length?{lamps:o}:{},...s?.length?{signals:s}:{},...a.length>0?{credits:a}:{}}}static today(){return new Date().toISOString().slice(0,10)}static later(t,e,o){return t?.answered(e,o).then(s=>({...s,...u.found(s)?{dates:{lamps:u.today()}}:{}}))}static found(t){return!!(t?.lamps?.length||t?.signals?.length||t?.crossings?.length||t?.signs?.length)}static query(t){const e=u.ON_ROAD;return`[out:json][timeout:25];(node["highway"="street_lamp"](${t});way["highway"]["lit"="yes"](${t});node["highway"~"${e}"](${t});node["traffic_sign"](${t});way["footway"="crossing"](${t}););out geom;(node._["highway"~"${e}"];node._["traffic_sign"];)->.kerb;way(bn.kerb)["highway"];out geom;`}static pending=new Map;async near(t,e){const o=this.ask(u.boxOf(t,e)),s=this.local(t,e);let n;const a=Symbol("late"),r=new Promise(i=>{n=setTimeout(()=>i(a),G.PATIENCE_MS)});try{const[i,h]=await Promise.all([Promise.race([o,r]),Promise.race([s,r])]),c=h===a?void 0:h;return i===a||i===void 0?{...u.withLocal({},c),incomplete:!0}:u.withLocal(u.from(i,t,e),c)}finally{clearTimeout(n)}}static RETRY_DELAYS_MS=[15e3,6e4,18e4,6e5];async answered(t,e){const o=u.boxOf(t,e);for(let s=0;;s++){const n=await this.ask(o);if(n)return u.withLocal(u.from(n,t,e),await this.local(t,e));if(s>=u.RETRY_DELAYS_MS.length)throw new Error("Overpass did not answer");await new Promise(a=>setTimeout(a,u.RETRY_DELAYS_MS[s]))}}ask(t){let e=u.pending.get(t);return e||(e=this.client.query(u.query(t)).catch(()=>{u.pending.delete(t)}),u.pending.set(t,e)),e}static boxOf(t,e){const o=e/u.METRES_PER_DEGREE,s=e/(u.METRES_PER_DEGREE*Math.cos(t.lat*Math.PI/180));return[t.lat-o,t.lng-s,t.lat+o,t.lng+s].map(n=>n.toFixed(6)).join(",")}static forget(){u.pending.clear(),u.localPending.clear()}static from(t,e,o){const s=G.lampsFrom(t,e,o),n=Math.cos(e.lat*Math.PI/180),a=(m,A)=>[(A-e.lng)*u.METRES_PER_DEGREE*n,(m-e.lat)*u.METRES_PER_DEGREE],r=(m,A)=>`${m.toFixed(7)},${A.toFixed(7)}`,i=new Map,h=new Set,c=[],l=[];for(const m of t.elements??[]){if(m.type==="node"){typeof m.lat=="number"&&typeof m.lon=="number"&&l.push(m);continue}if(m.type!=="way"||!m.geometry||m.geometry.length<2)continue;if(m.id!==void 0){if(h.has(m.id))continue;h.add(m.id)}const A=m.tags??{};if(A.footway==="crossing"&&c.push(m),!u.ROADS.has(A.highway??""))continue;const y=m.geometry.map(R=>a(R.lat,R.lon));m.geometry.forEach((R,x)=>{const $=r(R.lat,R.lon);i.set($,[...i.get($)??[],{way:m,points:y,index:x}])})}const f=[],M=[],d=[],g=new Set;for(const m of l){if(m.id!==void 0){if(g.has(m.id))continue;g.add(m.id)}const A=m.tags??{},y=a(m.lat,m.lon),R=i.get(r(m.lat,m.lon))??[],x=A.highway;if(x==="traffic_signals")for(const U of u.approaches(R,u.directionOf(A),!1))f.push(u.head(y,U,"vehicles"));if(x==="crossing"||x==="traffic_signals"&&A.crossing!==void 0){const U=R[0];if(U&&u.marked(A)){const P=u.directionAt(U);P&&M.push({eastM:u.round(y[0]),northM:u.round(y[1]),headingDeg:u.heading(P),widthM:q.widthOf(U.way.tags??{})}),P&&(A.crossing==="traffic_signals"||A["crossing:signals"]==="yes")&&f.push(...u.pedestrianHeads(y,P,U))}}if(x==="traffic_signals")continue;const $=x==="stop"?{face:"stop"}:x==="give_way"?{face:"give-way"}:u.faceOf(A);if(!$)continue;const z=A.traffic_sign?{code:A.traffic_sign}:{};if(R.length>0){const U=u.approaches(R,u.directionOf(A),!0)[0];if(U){const P=u.head(y,U,"vehicles");d.push({eastM:P.eastM,northM:P.northM,headingDeg:P.headingDeg,...$,...z})}continue}const Y=u.compassOf(A.direction);Y!==void 0&&d.push({eastM:u.round(y[0]),northM:u.round(y[1]),headingDeg:(Y+180)%360,...$,...z})}for(const m of c){const A=u.crossingAlong(m,a);A&&!M.some(y=>Math.hypot(y.eastM-A.eastM,y.northM-A.northM)<u.SAME_CROSSING_M)&&M.push(A)}const p=f.filter((m,A)=>!f.slice(0,A).some(y=>y.for===m.for&&Math.hypot(y.eastM-m.eastM,y.northM-m.northM)<u.SAME_HEAD_M&&Math.abs((y.headingDeg-m.headingDeg+540)%360-180)<u.SAME_HEAD_DEG)),E=(m,A)=>m.filter(y=>Math.hypot(y.eastM,y.northM)<=o).sort((y,R)=>Math.hypot(y.eastM,y.northM)-Math.hypot(R.eastM,R.northM)).slice(0,A),v={};s.length>0&&(v.lamps=s);const w={signals:E(p,u.MAX_SIGNALS),crossings:E(M,u.MAX_CROSSINGS),signs:E(d,u.MAX_SIGNS)};return w.signals.length>0&&(v.signals=w.signals),w.crossings.length>0&&(v.crossings=w.crossings),w.signs.length>0&&(v.signs=w.signs),v}static approaches(t,e,o){const s=[];for(const a of t){const r=a.way.tags??{},i=r.oneway==="yes"||r.oneway==="true"||r.oneway==="1"||r.junction==="roundabout"||r.highway==="motorway",h=r.oneway==="-1",{points:c,index:l}=a,f=(d,g)=>{let p=0;for(let E=Math.min(d,g);E<Math.max(d,g);E++)p+=Math.hypot(c[E+1][0]-c[E][0],c[E+1][1]-c[E][1]);return p},M=d=>{const g=c[l][0]-c[d][0],p=c[l][1]-c[d][1],E=Math.hypot(g,p);return E>0?[g/E,p/E]:void 0};if(l>0&&!h){const d=M(l-1);d&&s.push({approach:{unit:d,road:a},toEndM:f(l,c.length-1),forward:!0})}if(l<c.length-1&&!i){const d=M(l+1);d&&s.push({approach:{unit:d,road:a},toEndM:f(0,l),forward:!1})}}const n=e!==void 0&&t.length===1?s.filter(a=>a.forward===(e==="forward")):s;return!o||n.length<=1?n.map(a=>a.approach):[n.reduce((a,r)=>r.toEndM<a.toEndM?r:a).approach]}static head(t,e,o){const[s,n]=e.unit,a=q.widthOf(e.road.way.tags??{})/2+u.KERB_OFFSET_M,r=u.SETBACK_M,i=u.heading(e.unit);return{eastM:u.round(t[0]-s*r+n*a),northM:u.round(t[1]-n*r-s*a),headingDeg:(i+180)%360,for:o,phase:j.phaseOf(i)}}static pedestrianHeads(t,e,o){const s=q.widthOf(o.way.tags??{})/2+u.KERB_OFFSET_M,n=u.heading(e),a=j.phaseOf(n);return[1,-1].map(r=>({eastM:u.round(t[0]+e[1]*s*r),northM:u.round(t[1]-e[0]*s*r),headingDeg:(n+(r===1?270:90))%360,for:"pedestrians",phase:a}))}static crossingAlong(t,e){if(!u.marked(t.tags??{}))return;const o=t.geometry.map(h=>e(h.lat,h.lon)),[s,n]=o[0],[a,r]=o[o.length-1],i=Math.hypot(a-s,r-n);if(!(i<u.MIN_CROSSING_M))return{eastM:u.round((s+a)/2),northM:u.round((n+r)/2),headingDeg:(u.heading([(a-s)/i,(r-n)/i])+90)%360,widthM:Math.round(Math.min(i,u.MAX_CROSSING_M)*10)/10}}static marked(t){const e=t.crossing;return e!=="unmarked"&&e!=="no"&&e!=="informal"&&t["crossing:markings"]!=="no"}static directionAt(t){const{points:e,index:o}=t,[s,n]=o<e.length-1?[e[o],e[o+1]]:[e[o-1],e[o]],a=Math.hypot(n[0]-s[0],n[1]-s[1]);return a>0?[(n[0]-s[0])/a,(n[1]-s[1])/a]:void 0}static directionOf(t){const e=t["traffic_signals:direction"]??t["traffic_sign:direction"]??t.direction;return e==="forward"||e==="backward"?e:void 0}static compassOf(t){if(t===void 0)return;const e=Number.parseFloat(t);if(Number.isFinite(e)&&/^\s*-?\d/.test(t))return(e%360+360)%360;const s=["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"].indexOf(t.trim().toUpperCase());return s<0?void 0:s*22.5}static faceOf(t){const e=t.traffic_sign;if(!e||e==="no"||e==="none")return;const o=e.split(/[;,]/).map(s=>s.trim());if(o.some(s=>/stop|:AB4\b|:206\b|:R1-1\b|:B2\b/i.test(s)))return{face:"stop"};if(o.some(s=>/give_way|yield|:AB3a\b|:205\b|:R1-2\b|:B1\b/i.test(s)))return{face:"give-way"};for(const s of o){const n=/maxspeed|:B14\b|:274\b|:C14\b|:R2-1\b/i.test(s)?Number.parseInt(/\[(\d+)\]/.exec(s)?.[1]??t.maxspeed??"",10):Number.NaN;if(Number.isFinite(n)&&n>0)return{face:"speed-limit",value:n}}return{face:"other"}}static heading([t,e]){return Math.round((Math.atan2(t,e)*180/Math.PI+360)%360*10)/10}static round(t){return Math.round(t*10)/10}}class ot{id="ign-lidar-hd";name="IGN LiDAR HD";attribution="Canopy and roofs © IGN, LiDAR HD (Licence Ouverte 2.0), as surveyed on a day the service does not give";creditUrl="https://geoservices.ign.fr/lidarhd";contemporary=!0;platform;furniture;constructor(t={},e){this.platform=new C(t),this.furniture=e}covers(t,e){return C.covers(t,e)}later(t,e){return u.later(this.furniture,t,e)}async getSurroundings(t,e){if(!this.covers(t.lat,t.lng))throw new V("no-coverage","The LiDAR HD survey covers France only");const o=C.lidarRadius(e),[s,n,a,r,i]=await Promise.all([this.platform.lidar(t,o),this.platform.photo(t,o).catch(()=>{}),this.furniture?.near(t,e),this.platform.laserDate(t),this.platform.photoDate(t)]);return{trees:new H(s.heights,s.vegetation,s.size,s.size).trees({metresPerPixel:s.metresPerPixel,radiusM:o}),buildings:_.fit(N.fit(new D(s.heights,s.building,s.size,s.size).buildings({metresPerPixel:s.metresPerPixel,radiusM:o,maxBuildings:300}),s,n)),bridges:[],lines:[],...a,dates:{...r?{laser:r}:{},...n&&i?{photo:i}:{},...u.found(a)?{lamps:u.today()}:{}}}}}class O{static MAP_NATURES={Eglise:"church",Chapelle:"church",Monument:"monument","Tour, donjon":"monument","Fort, blockhaus, casemate":"monument","Arc de triomphe":"monument","Arène ou théâtre antique":"monument",Château:"old","Industriel, agricole ou commercial":"works",Serre:"works",Silo:"works"};static MAP_WORKS=new Set(["Industriel","Agricole","Annexe"]);static MAP_CLOSED_AT_NIGHT=new Set(["Commercial et services","Sportif"]);static OSM_CLOSED_AT_NIGHT=new Set(["retail","commercial","office","supermarket","kiosk","sports_hall","sports_centre","stadium","school","university","college","kindergarten","public","civic","government","train_station","transportation"]);static OSM_BUILDINGS={cathedral:"church",church:"church",chapel:"church",basilica:"church",temple:"church",mosque:"church",synagogue:"church",shrine:"church",religious:"church",castle:"old",palace:"old",fortress:"monument",bunker:"monument",triumphal_arch:"monument",industrial:"works",warehouse:"works",barn:"works",farm_auxiliary:"works",shed:"works",hangar:"works",garage:"works",garages:"works",greenhouse:"works",silo:"works",storage_tank:"works",cowshed:"works",stable:"works",sty:"works",manufacture:"works"};static OSM_HISTORIC={church:"church",chapel:"church",monastery:"old",castle:"old",manor:"old",fort:"monument",tower:"monument",monument:"monument",memorial:"monument",city_gate:"monument"};static OLD_BEFORE=1900;static GRAND_FROM_M=15;static GRAND_UP_TO_M=40;static TOWER_SLENDERNESS=2;static CHURCH_PITCH=.7;static CHURCH_ROOF_OF_WALLS=.35;static CHURCH_ROOF_COLOUR="#5a6068";static ofMap(t){const e=O.year(t.date_d_apparition),s=O.MAP_NATURES[String(t.nature??"")]??(t.usage_1==="Religieux"?"church":void 0)??(O.MAP_WORKS.has(String(t.usage_1??""))?"works":void 0)??O.ofYear(e)??O.grand(t),n=O.MAP_CLOSED_AT_NIGHT.has(String(t.usage_1??""));return{...s?{style:s}:{},...e!==void 0?{builtYear:e}:{},...n?{closedAtNight:!0}:{}}}static ofOsm(t){const e=O.year(t.start_date),o=t.historic&&t.historic!=="no"?O.OSM_HISTORIC[t.historic]??"old":void 0,s=t.amenity==="place_of_worship"?"church":void 0,n=O.OSM_BUILDINGS[t.building??""]??o??s??O.ofYear(e),a=O.OSM_CLOSED_AT_NIGHT.has(t.building??"")||t.shop!==void 0&&t.shop!=="no";return{...n?{style:n}:{},...e!==void 0?{builtYear:e}:{},...a?{closedAtNight:!0}:{}}}static year(t){const e=Number(/\b(\d{4})\b/.exec(String(t??""))?.[1]);return Number.isFinite(e)&&e>=1e3&&e<=2100?e:void 0}static fit(t){return t.map(e=>e.style==="church"?O.church(e):e)}static isTower(t){return t.heightM>=O.TOWER_SLENDERNESS*Math.max(t.widthM,t.lengthM)}static church(t){const e=t.roof?.color??O.CHURCH_ROOF_COLOUR;if(O.isTower(t))return{...t,roof:{shape:"flat",riseM:0,color:e}};if(t.roof&&t.roof.shape!=="flat")return t;const o=Math.round(Math.min(O.CHURCH_PITCH*t.lengthM,O.CHURCH_ROOF_OF_WALLS*t.heightM)*10)/10,s={shape:"gable",riseM:o,color:e};return{...t,heightM:Math.round((t.heightM+o)*10)/10,roof:s}}static ofYear(t){return t!==void 0&&t<O.OLD_BEFORE?"old":void 0}static grand(t){const e=Number(t.hauteur),o=Number(t.nombre_d_etages);if(!(Number.isFinite(o)&&o>0)&&!(t.usage_1==="Résidentiel"||t.date_d_apparition))return e>=O.GRAND_FROM_M&&e<=O.GRAND_UP_TO_M?"grand":void 0}}class b{static METRES_PER_DEGREE=111320;static NAMED_NATURES={Silo:"Silo"};static DEFAULT_HEIGHT_M=6;static FLOOR_HEIGHT_M=3;static FINE_M=.5;static COARSE_M=1;static MAX_CELLS=4e4;static RECTANGLE_FILL=.9;static buildings(t,e,o,s=12,n=300,a=[]){const r=[];for(const h of b.reached(t,a,e,o)){const c=h.feature,l=Number(c.properties.nombre_d_etages),f=Number(c.properties.hauteur),M=Number.isFinite(f)&&f>0?f:Number.isFinite(l)&&l>0?l*b.FLOOR_HEIGHT_M:b.DEFAULT_HEIGHT_M,{style:d,builtYear:g,closedAtNight:p}=O.ofMap(c.properties);for(const E of b.rectanglesOf(h.rings,M,s)){const v=_.of(c.properties.materiaux_des_murs,"wall"),w=_.of(c.properties.materiaux_de_la_toiture,"roof"),m=b.NAMED_NATURES[String(c.properties.nature??"")];r.push({...E,...m?{name:m}:{},...Number.isFinite(l)&&l>0?{floors:l}:{},...v?{wallMaterial:v}:{},...w?{roofMaterial:w}:{},...d?{style:d}:{},...g!==void 0?{builtYear:g}:{},...p?{closedAtNight:p}:{}})}}const i=h=>Math.hypot(h.eastM,h.northM);if(r.length>n){const h=c=>(c.heightM+6)*Math.sqrt(c.widthM*c.lengthM)/Math.max(i(c),50);r.sort((c,l)=>h(l)-h(c)),r.length=n}return r.sort((h,c)=>i(h)-i(c)),r}static named(t,e,o){const s=e.map(n=>({name:typeof n.properties.toponyme=="string"?n.properties.toponyme:"",rings:b.rings(n,o)})).filter(n=>n.name.length>0&&n.rings.length>0);return s.length===0?t:t.map(n=>{const a=s.find(r=>b.inside(n.eastM,n.northM,r.rings));return a?{...n,name:a.name}:n})}static reached(t,e,o,s){const n=t.map(i=>({feature:i,rings:b.rings(i,o)})).filter(i=>i.rings.length>0),a=n.map(i=>b.reach(i.rings)<=s),r=e.filter(i=>typeof i.properties.toponyme=="string"&&i.properties.toponyme.length>0).map(i=>b.rings(i,o)).filter(i=>i.length>0);if(r.length>0){const i=n.map(c=>{const l=c.rings[0],f=l.reduce((d,g)=>d+g.east,0)/l.length,M=l.reduce((d,g)=>d+g.north,0)/l.length;return r.findIndex(d=>b.inside(f,M,d))}),h=new Set(i.filter((c,l)=>c>=0&&a[l]));i.forEach((c,l)=>{h.has(c)&&(a[l]=!0)})}return n.filter((i,h)=>a[h])}static reach(t){if(b.inside(0,0,t))return 0;let e=1/0;for(const o of t)for(let s=0;s+1<o.length;s++){const n=o[s],a=o[s+1],r=a.east-n.east,i=a.north-n.north,h=r*r+i*i>0?Math.max(0,Math.min(1,-(n.east*r+n.north*i)/(r*r+i*i))):0;e=Math.min(e,Math.hypot(n.east+h*r,n.north+h*i))}return e}static inside(t,e,o){let s=0;for(const n of o)for(let a=0;a+1<n.length;a++){const r=n[a],i=n[a+1];r.north<=e!=i.north<=e&&r.east+(e-r.north)/(i.north-r.north)*(i.east-r.east)>t&&s++}return s%2===1}static rings(t,e){const o=t.geometry,s=o.type==="Polygon"?[o.coordinates]:o.type==="MultiPolygon"?o.coordinates:[],n=Math.cos(e.lat*Math.PI/180),a=[];for(const r of s)for(const i of r)a.push(i.map(([h,c])=>({east:(h-e.lng)*b.METRES_PER_DEGREE*n,north:(c-e.lat)*b.METRES_PER_DEGREE})));return a}static rectanglesOf(t,e,o){let s=1/0,n=-1/0,a=1/0,r=-1/0;for(const f of t)for(const M of f)s=Math.min(s,M.east),n=Math.max(n,M.east),a=Math.min(a,M.north),r=Math.max(r,M.north);let i=b.FINE_M;(n-s)*(r-a)/(i*i)>b.MAX_CELLS&&(i=b.COARSE_M);const h=[],c=[];for(let f=a+i/2;f<r;f+=i){const M=[];for(const d of t)for(let g=0;g+1<d.length;g++){const p=d[g],E=d[g+1];p.north<=f!=E.north<=f&&M.push(p.east+(f-p.north)/(E.north-p.north)*(E.east-p.east))}M.sort((d,g)=>d-g);for(let d=0;d+1<M.length;d+=2)for(let g=Math.ceil((M[d]-i/2)/i)*i+i/2;g<M[d+1];g+=i)h.push(g),c.push(f)}if(h.length*i*i<o)return[];const l=t.flatMap(f=>f.slice(0,-1).map((M,d)=>({from:M,to:f[d+1]})));return D.ofPoints(h,c,new Array(h.length).fill(e),i,o,b.RECTANGLE_FILL,l)}}class F{id="ign-lidar-topo";name="IGN LiDAR HD + BD TOPO";attribution="Canopy © IGN, LiDAR HD; buildings, bridges and lines © IGN, BD TOPO (Licence Ouverte 2.0), as surveyed on days the services do not give";creditUrl="https://geoservices.ign.fr/lidarhd";contemporary=!0;static BRIDGE_MARGIN_M=30;static MAX_BRIDGE_WINDOWS=8;platform;furniture;constructor(t={},e){this.platform=new C(t),this.furniture=e}covers(t,e){return C.covers(t,e)}later(t,e){return u.later(this.furniture,t,e)}async getSurroundings(t,e){if(!this.covers(t.lat,t.lng))throw new V("no-coverage","The IGN's surveys cover France only");const o=C.radius(e),[s,n,a,r,i,h]=await Promise.allSettled([this.platform.lidar(t,o),this.platform.vectors(t,o,!0),this.platform.photo(t,o),this.furniture?.near(t,e)??Promise.resolve(void 0),this.platform.laserDate(t),this.platform.photoDate(t)]),c=C.lidarRadius(o);if(s.status==="rejected"&&n.status==="rejected")throw s.reason;const l=s.status==="fulfilled"?s.value:void 0,f=n.status==="fulfilled"?n.value:void 0,M=f!==void 0&&f.buildings.length===0&&f.bridges.length===0&&f.lines.length===0;if(s.status==="rejected"&&s.reason instanceof V&&s.reason.reason==="no-coverage"&&M)throw s.reason;return{trees:l?new H(l.heights,l.vegetation,l.size,l.size).trees({metresPerPixel:l.metresPerPixel,radiusM:c}):[],buildings:this.roofed(this.buildings(l,f,t,o),l,a.status==="fulfilled"?a.value:void 0),bridges:f?await this.bridges(f,t,o,l?.structures,c):[],lines:f?X.lines(f,t,o,l?.structures):[],...r.status==="fulfilled"?r.value:{},dates:{...s.status==="fulfilled"&&i.status==="fulfilled"&&i.value?{laser:i.value}:{},...a.status==="fulfilled"&&h.status==="fulfilled"&&h.value?{photo:h.value}:{},...f?.mapDate?{map:f.mapDate}:{},...r.status==="fulfilled"&&u.found(r.value)?{lamps:u.today()}:{}}}}async bridges(t,e,o,s,n){const a=X.bridges(t,e,o,s);let r=0;return Promise.all(a.map(async i=>{if(s!==void 0&&Math.hypot(i.eastM,i.northM)+i.lengthM/2<=n)return i;const h=i.lengthM/2+F.BRIDGE_MARGIN_M;if(r++>=F.MAX_BRIDGE_WINDOWS)return i;const c=tt(i.eastM,-i.northM,e.lat,e.lng);try{const l=await this.platform.lidar(c,h),f=X.bridges(t,c,h,l.structures).sort((M,d)=>Math.hypot(M.eastM,M.northM)-Math.hypot(d.eastM,d.northM))[0];return!f||Math.hypot(f.eastM,f.northM)>i.lengthM/2?i:{...f,eastM:X.tenth(f.eastM+i.eastM),northM:X.tenth(f.northM+i.northM)}}catch{return i}}))}roofed(t,e,o){return _.fit(O.fit(N.fit(t,e,o)))}buildings(t,e,o,s){const n=e?b.buildings(e.buildings,o,s,void 0,void 0,e.zones):[],a=n.length>0||t===void 0?n:new D(t.heights,t.building,t.size,t.size).buildings({metresPerPixel:t.metresPerPixel,radiusM:C.lidarRadius(s),maxBuildings:300});return e?b.named(a,e.zones,o):a}}class nt{id="ign-bd-topo";name="IGN BD TOPO";attribution="Buildings, bridges and lines © IGN, BD TOPO (Licence Ouverte 2.0), as drawn on a day the service does not give";creditUrl="https://geoservices.ign.fr/bdtopo";contemporary=!0;platform;furniture;constructor(t={},e){this.platform=new C(t),this.furniture=e}covers(t,e){return C.covers(t,e)}later(t,e){return u.later(this.furniture,t,e)}async getSurroundings(t,e){if(!this.covers(t.lat,t.lng))throw new V("no-coverage","BD TOPO covers France only");const o=C.radius(e),[s,n,a,r]=await Promise.all([this.platform.vectors(t,o,!0),this.platform.photo(t,o).catch(()=>{}),this.furniture?.near(t,e),this.platform.photoDate(t)]);return{trees:[],buildings:_.fit(O.fit(N.fit(b.named(b.buildings(s.buildings,t,o,void 0,void 0,s.zones),s.zones,t),void 0,n))),bridges:X.bridges(s,t,o,void 0),lines:X.lines(s,t,o,void 0),...a,dates:{...s.mapDate?{map:s.mapDate}:{},...n&&r?{photo:r}:{},...u.found(a)?{lamps:u.today()}:{}}}}}class S{static ROOF_SHAPES={flat:"flat",gabled:"gable",gambrel:"gable",saltbox:"gable","half-hipped":"hip",hipped:"hip",pyramidal:"hip",mansard:"hip",round:"gable",dome:"dome",onion:"dome"};static WALL_MATERIALS={brick:"brick",stone:"stone",granite:"stone",sandstone:"stone",limestone:"stone",concrete:"concrete",cement_block:"block",block:"block",wood:"wood",timber_framing:"wood"};static ROOF_MATERIALS={roof_tiles:"tile",tiles:"tile",tile:"tile",slate:"slate",metal:"zinc",zinc:"zinc",tin:"zinc",copper:"zinc",concrete:"concrete",eternit:"other"};static COLOURS={white:"#e8e6e0",grey:"#8c8c8a",gray:"#8c8c8a",black:"#3a3a3a",red:"#a8483a",brown:"#6e4f38",beige:"#d6c9a8",yellow:"#d8c070",orange:"#c9773a",green:"#5f7a52",blue:"#506a8a",tan:"#c0a37a",cream:"#e6dcc0",pink:"#c99a96",silver:"#b4b6b6"};static height(t){const e=Number.parseFloat((t??"").replace(",","."));return Number.isFinite(e)&&e>=2&&e<=500?e:void 0}static levels(t){const e=Number.parseInt(t??"",10);return Number.isFinite(e)&&e>=1&&e<=150?e:void 0}static roofShape(t){return S.ROOF_SHAPES[(t??"").trim().toLowerCase()]}static wallMaterial(t){return S.WALL_MATERIALS[(t??"").trim().toLowerCase()]}static roofMaterial(t){return S.ROOF_MATERIALS[(t??"").trim().toLowerCase()]}static colour(t){const e=(t??"").trim().toLowerCase();return/^#[0-9a-f]{6}$/.test(e)?e:/^#[0-9a-f]{3}$/.test(e)?`#${e[1]}${e[1]}${e[2]}${e[2]}${e[3]}${e[3]}`:S.COLOURS[e]}}class W{id="osm-buildings";name="OpenStreetMap buildings";attribution="Buildings © OpenStreetMap contributors (ODbL), as drawn on the day of the data, which a recording is not";creditUrl="https://www.openstreetmap.org/copyright";contemporary=!0;static MAX_RADIUS_M=1500;static MIN_AREA_M2=12;static MAX_BUILDINGS=300;client;furniture;constructor(t={},e){this.client=new B(t),this.furniture=e}covers(){return!0}later(t,e){return u.later(this.furniture,t,e)}async getSurroundings(t,e){const o=Math.min(e,W.MAX_RADIUS_M);let s;try{s=await this.client.query(`[out:json][timeout:30];(way["building"](around:${o},${t.lat},${t.lng});relation["building"]["type"="multipolygon"](around:${o},${t.lat},${t.lng}););out geom;`)}catch(r){throw new V("unreachable",r instanceof Error?r.message:String(r))}const n=await this.furniture?.near(t,e),a=(s.osm3s?.timestamp_osm_base??"").slice(0,10);return{trees:[],buildings:_.fit(O.fit(W.buildings(s,t,o))),bridges:[],lines:[],...n,dates:{.../^\d{4}-\d{2}-\d{2}$/.test(a)?{map:a}:{},...u.found(n)?{lamps:u.today()}:{}}}}static buildings(t,e,o){const s=[];for(const n of t.elements??[]){const a=W.ringsOf(n);if(a.length===0)continue;const r=n.tags??{},i=S.levels(r["building:levels"]),h=S.height(r.height),c={geometry:{type:"Polygon",coordinates:a},properties:{...h?{hauteur:h}:{},...i?{nombre_d_etages:i}:{}}};for(const l of b.buildings([c],e,o,W.MIN_AREA_M2,50))s.push(W.described(l,r,h!==void 0))}return s.sort((n,a)=>Math.hypot(n.eastM,n.northM)-Math.hypot(a.eastM,a.northM)),s.slice(0,W.MAX_BUILDINGS)}static ringsOf(t){const e=s=>{if(!s||s.length<4)return;const n=s.map(i=>[i.lon,i.lat]),a=n[0],r=n[n.length-1];return a[0]===r[0]&&a[1]===r[1]?n:void 0};if(t.type==="way"){const s=e(t.geometry);return s?[s]:[]}return(t.members??[]).filter(s=>s.role==="outer").map(s=>e(s.geometry)).filter(s=>s!==void 0).slice(0,1)}static described(t,e,o){const s=S.wallMaterial(e["building:material"]),n=S.roofMaterial(e["roof:material"]),a=S.colour(e["building:colour"]),r=S.colour(e["roof:colour"])??_.roofColor(n),i=S.roofShape(e["roof:shape"]),h=a?{color:a}:void 0;let c,l=t.heightM;if(i==="gable"||i==="hip"||i==="dome"){const g=S.height(e["roof:height"]),p=Math.round((g??Math.min(5,Math.max(1.5,.29*Math.min(t.widthM,t.lengthM))))*10)/10;o||(l=Math.round((t.heightM+p)*10)/10),c={shape:i,riseM:p,...e["roof:orientation"]==="across"?{ridge:"depth"}:{},...r?{color:r}:{}}}else(i==="flat"||r)&&(c={shape:"flat",riseM:0,...r?{color:r}:{}});const{style:f,builtYear:M,closedAtNight:d}=O.ofOsm(e);return{...t,heightM:l,...f?{style:f}:{},...M!==void 0?{builtYear:M}:{},...d?{closedAtNight:d}:{},...e.name?{name:e.name}:{},...s?{wallMaterial:s}:{},...n?{roofMaterial:n}:{},...h?{facade:h}:{},...c?{roof:c}:{}}}}class L{credit={name:"Ville de Paris, Éclairage public",url:"https://opendata.paris.fr/explore/dataset/eclairage-public/",licence:"ODbL",of:"lamps"};static BOUNDS={south:48.8156,north:48.9022,west:2.2241,east:2.4698};static ENDPOINT="https://opendata.paris.fr/api/explore/v2.1/catalog/datasets/eclairage-public/records";static PAGE=100;static MAX=150;static MAX_PAGES=4;static METRES_PER_DEGREE=111320;static SAME_COLUMN_M=.5;static MIN_HEIGHT_M=2;fetchImpl;constructor(t){this.fetchImpl=t??fetch.bind(globalThis)}covers(t,e){const o=L.BOUNDS;return t>=o.south&&t<=o.north&&e>=o.west&&e<=o.east}async lampsNear(t,e){const o=[];let s=[];for(let n=0;n<L.MAX_PAGES&&s.length<L.MAX;n++){const a=await this.fetchImpl(L.query(t,e,L.PAGE,n*L.PAGE));if(!a.ok)throw new Error(`opendata.paris.fr refused (${a.status})`);const r=(await a.json()).results??[];if(o.push(...r),s=L.lampsFrom(o,t),r.length<L.PAGE)break}return s.slice(0,L.MAX)}static query(t,e,o,s){const n=`geom'POINT(${t.lng.toFixed(6)} ${t.lat.toFixed(6)})'`,a=new URLSearchParams({select:"geo_point_2d,lib_ouvrag,lampe_temperature_couleur,lampe_flux,support_hauteur",where:`within_distance(geo_point_2d,${n},${Math.round(e)}m)`,order_by:`distance(geo_point_2d,${n})`,limit:String(o),offset:String(s)});return`${L.ENDPOINT}?${a}`}static lampsFrom(t,e){const o=Math.cos(e.lat*Math.PI/180),s=a=>{const r=typeof a=="number"?a:Number.parseFloat(a??"");return Number.isFinite(r)&&r>0?r:void 0},n=[];for(const a of t){const r=a.geo_point_2d;if(!r||a.lib_ouvrag==="Projecteur")continue;const i=Math.round((r.lon-e.lng)*L.METRES_PER_DEGREE*o*10)/10,h=Math.round((r.lat-e.lat)*L.METRES_PER_DEGREE*10)/10,c=s(a.lampe_flux),l=n.find(d=>Math.hypot(d.eastM-i,d.northM-h)<L.SAME_COLUMN_M);if(l){c!==void 0&&(l.lumens=(l.lumens??0)+c);continue}const f=s(a.lampe_temperature_couleur),M=s(a.support_hauteur);n.push({eastM:i,northM:h,...M!==void 0&&M>=L.MIN_HEIGHT_M?{heightM:M}:{},...f!==void 0?{colorTemperatureK:f}:{},...c!==void 0?{lumens:c}:{},...a.lib_ouvrag==="Console"?{mount:"wall"}:{}})}return n}}class T{constructor(t,e){this.roads=t,this.fetchImpl=e??fetch.bind(globalThis)}credit={name:"Ville de Paris, Signalisation lumineuse tricolore",url:"https://opendata.paris.fr/explore/dataset/signalisation-tricolore/",licence:"ODbL",of:"signals"};static BOUNDS={south:48.8156,north:48.9022,west:2.2241,east:2.4698};static ENDPOINT="https://opendata.paris.fr/api/explore/v2.1/catalog/datasets/signalisation-tricolore/records";static PAGE=100;static MAX_PAGES=5;static MAX=160;static METRES_PER_DEGREE=111320;static SAME_POST_M=.8;static SEARCH_M=15;static PEDESTRIAN_ALONG_M=.4;fetchImpl;covers(t,e){const o=T.BOUNDS;return t>=o.south&&t<=o.north&&e>=o.west&&e<=o.east}async signalsNear(t,e){const o=(e+T.SEARCH_M)/T.METRES_PER_DEGREE,s=o/Math.cos(t.lat*Math.PI/180),[n,a]=await Promise.all([this.lenses(t,e),this.roads.getRoads({south:t.lat-o,north:t.lat+o,west:t.lng-s,east:t.lng+s})]);return T.signalsFrom(n,a,t)}async lenses(t,e){const o=[];for(let s=0;s<T.MAX_PAGES;s++){const n=await this.fetchImpl(T.query(t,e,T.PAGE,s*T.PAGE));if(!n.ok)throw new Error(`opendata.paris.fr refused (${n.status})`);const a=(await n.json()).results??[];if(o.push(...a),a.length<T.PAGE)break}return o}static query(t,e,o,s){const n=`geom'POINT(${t.lng.toFixed(6)} ${t.lat.toFixed(6)})'`,a=new URLSearchParams({select:"geo_point_2d,lib_regime",where:`within_distance(geo_point_2d,${n},${Math.round(e)}m)`,order_by:`distance(geo_point_2d,${n})`,limit:String(o),offset:String(s)});return`${T.ENDPOINT}?${a}`}static signalsFrom(t,e,o){const s=Math.cos(o.lat*Math.PI/180),n=(h,c)=>[(c-o.lng)*T.METRES_PER_DEGREE*s,(h-o.lat)*T.METRES_PER_DEGREE],a=[];for(const h of t){if(!h.geo_point_2d)continue;const c=n(h.geo_point_2d.lat,h.geo_point_2d.lon),l=(h.lib_regime??"").toUpperCase(),f=/ROUGE|JAUNE|VERT/.test(l),M=/PASSEZ|ATTENDEZ/.test(l);if(!f&&!M)continue;let d=a.find(g=>Math.hypot(g.at[0]-c[0],g.at[1]-c[1])<T.SAME_POST_M);d||a.push(d={at:c,vehicles:0,pedestrians:0}),f&&d.vehicles++,M&&d.pedestrians++}const r=e.map(h=>({way:h,points:h.points.map(c=>n(c.lat,c.lng))})),i=[];for(const h of a){const c=T.nearestRoad(h.at,r);if(!c)continue;const[l,f]=c.unit,M=T.heading(c.unit),d=(h.at[0]-c.foot[0])*f-(h.at[1]-c.foot[1])*l>=0,g=c.way.direction,p=g==="forward"?M:g==="backward"?(M+180)%360:d?M:(M+180)%360,E=w=>Math.round(w*10)/10,v=w=>E((w%360+360)%360);if(h.vehicles>0&&i.push({eastM:E(h.at[0]),northM:E(h.at[1]),headingDeg:v(p+180),for:"vehicles",phase:j.phaseOf(p)}),h.pedestrians>0){const w=T.heading([c.foot[0]-h.at[0],c.foot[1]-h.at[1]]),m=h.vehicles>0?T.PEDESTRIAN_ALONG_M:0;i.push({eastM:E(h.at[0]+l*m),northM:E(h.at[1]+f*m),headingDeg:v(Number.isNaN(w)?M+90:w),for:"pedestrians",phase:j.phaseOf(M)})}}return i.sort((h,c)=>Math.hypot(h.eastM,h.northM)-Math.hypot(c.eastM,c.northM)).slice(0,T.MAX)}static nearestRoad(t,e){let o;for(const{way:s,points:n}of e)for(let a=1;a<n.length;a++){const[r,i]=n[a-1],[h,c]=n[a],l=Math.hypot(h-r,c-i);if(l===0)continue;const f=[(h-r)/l,(c-i)/l],M=Math.max(0,Math.min(l,(t[0]-r)*f[0]+(t[1]-i)*f[1])),d=[r+f[0]*M,i+f[1]*M],g=Math.hypot(t[0]-d[0],t[1]-d[1]);g<=T.SEARCH_M&&(!o||g<o.distance)&&(o={way:s,unit:f,foot:d,distance:g})}return o}static heading([t,e]){return t===0&&e===0?Number.NaN:Math.round((Math.atan2(t,e)*180/Math.PI+360)%360*10)/10}}const K=[{id:"ign-lidar-topo",name:"IGN LiDAR HD + BD TOPO",credit:"© IGN, LiDAR HD and BD TOPO, Licence Ouverte 2.0; street lamps © OpenStreetMap contributors",creditUrl:"https://geoservices.ign.fr/lidarhd",create:()=>new I(new F({},new u({},k.TOWN_LAMPS,k.TOWN_SIGNALS)))},{id:"ign-lidar-hd",name:"IGN LiDAR HD",credit:"© IGN, LiDAR HD, Licence Ouverte 2.0; street lamps © OpenStreetMap contributors",creditUrl:"https://geoservices.ign.fr/lidarhd",create:()=>new I(new ot({},new u({},k.TOWN_LAMPS,k.TOWN_SIGNALS)))},{id:"ign-bd-topo",name:"IGN BD TOPO",credit:"© IGN, BD TOPO, Licence Ouverte 2.0; street lamps © OpenStreetMap contributors",creditUrl:"https://geoservices.ign.fr/bdtopo",create:()=>new I(new nt({},new u({},k.TOWN_LAMPS,k.TOWN_SIGNALS)))},{id:"osm-buildings",name:"OpenStreetMap buildings",credit:"Buildings and street lamps © OpenStreetMap contributors (ODbL)",creditUrl:"https://www.openstreetmap.org/copyright",create:()=>new I(new W({},new u({},k.TOWN_LAMPS,k.TOWN_SIGNALS)))}];class k{static DEFAULT_ID=K[0].id;static WORLD_ID="osm-buildings";static TOWN_LAMPS=[new L];static TOWN_SIGNALS=[new T(new et)];static NONE="none";static byId(t){return t===k.NONE?void 0:K.find(e=>e.id===t)??K[0]}static providerFor(t,e,o){const s=k.byId(t)?.create();if(t!==void 0&&t!==k.DEFAULT_ID)return s?.covers(e,o)?s:void 0;const n=K.find(r=>r.id===k.WORLD_ID).create(),a=[s,n].filter(r=>r!==void 0&&r.covers(e,o));return a.length>1?new st(a):a[0]}}export{K as SURROUNDINGS_SOURCES,k as SurroundingsSources};
|