nspasojevic commited on
Commit
31c1412
·
verified ·
1 Parent(s): 3a5470f

Interactive 3D controls, hidden GLB chip and black expanded-view rail

Browse files
licenses/extras-usd-search-explorer-ui-bundle-javascript-dependencies.txt CHANGED
The diff for this file is too large to render. See raw diff
 
services/explorer/dist/build-info.json CHANGED
@@ -1,8 +1,8 @@
1
  {
2
  "product": "simready-central-slim-explorer",
3
- "version": "slim-partner-usd-efb47b55",
4
- "bundle_id": "main.9eeeca83.js",
5
- "built_at": "2026-10-13T17:33:20Z",
6
  "flags": {
7
  "public_mode": true,
8
  "email_auth": false,
@@ -35,5 +35,5 @@
35
  "native_usd": true,
36
  "usd_reader": "rust-pilot-v1"
37
  },
38
- "source": "efb47b55"
39
  }
 
1
  {
2
  "product": "simready-central-slim-explorer",
3
+ "version": "slim-partner-usd-33f3a096",
4
+ "bundle_id": "main.f2f625ec.js",
5
+ "built_at": "2026-10-13T19:25:45Z",
6
  "flags": {
7
  "public_mode": true,
8
  "email_auth": false,
 
35
  "native_usd": true,
36
  "usd_reader": "rust-pilot-v1"
37
  },
38
+ "source": "33f3a096"
39
  }
services/explorer/dist/index.html CHANGED
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/ds.png"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="SimReady Central — SimReady asset search"/><meta name="ui-version" content="slim-partner-usd-efb47b55"><script src="/config.js"></script><title>SimReady Central</title><script defer="defer" src="/static/js/main.9eeeca83.js"></script><link href="/static/css/main.1d1f5271.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
 
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/ds.png"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="SimReady Central — SimReady asset search"/><meta name="ui-version" content="slim-partner-usd-33f3a096"><script src="/config.js"></script><title>SimReady Central</title><script defer="defer" src="/static/js/main.f2f625ec.js"></script><link href="/static/css/main.1d1f5271.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
services/explorer/dist/static/js/13.492f8275.chunk.js ADDED
@@ -0,0 +1 @@
 
 
1
+ "use strict";(self.webpackChunkdeepsearch_ui=self.webpackChunkdeepsearch_ui||[]).push([[13,857],{1219(){},2973(e,r,t){t.d(r,{A:()=>v});var n=t(9379),a=t(5043),i=t(3139),s=t(5597),o=t(3333),l=t(6796),c=t(9885),d=t(9207),u=t(5260),h=t(579);const p=Object.freeze({position:[3,-4,2],target:[0,0,0]}),m=Object.freeze({maxPixels:2073600,reference:"square"});function v(e){let{asset:r,mode:t,reader:v=c.Me,cameraRecipe:f,onTelemetry:w,backLabel:g="USD comparison",showImplementationNote:b=!0,nativeMountOnly:x=!1,presentation:y="white-studio",showMount:j=!0}=e;const[S,M]=(0,a.useState)(null),[A,k]=(0,a.useState)("Loading"),[U,D]=(0,a.useState)(null),L=(0,a.useRef)(0),C=(0,a.useRef)(!1),R=(0,a.useRef)(w),N=(0,a.useRef)(f);N.current=f,R.current=w;const B=(0,a.useCallback)(e=>{var n;const a=(null===e||void 0===e?void 0:e.message)||"This renderer could not load the asset";D(a),k("Failed"),null===(n=R.current)||void 0===n||n.call(R,{assetId:r.id,renderer:t,status:"failed",error:a})},[r.id,t]);(0,a.useEffect)(()=>{var e;const a=new AbortController;let i=null;M(null),D(null),k("Loading"),C.current=!1,L.current=performance.now(),null===(e=R.current)||void 0===e||e.call(R,{assetId:r.id,renderer:t,status:"loading"});return(async()=>{var e;if("reference"===t){var s;const[e,t]=await Promise.all([(0,l._z)(r.articulation.url,{signal:a.signal,maxBytes:2097152,sha256:r.articulation.sha256,expectedBytes:r.articulation.bytes}),(0,l._z)(r.current.url,{signal:a.signal,maxBytes:67108864,sha256:r.current.sha256,expectedBytes:r.current.bytes})]);if(a.signal.aborted)return null;const n=JSON.parse((new TextDecoder).decode(e));if(1!==n.version||"gltf"!==n.frame||!Array.isArray(n.bodies)||!n.bodies.length||!Array.isArray(n.joints))throw new Error("Unsupported reference articulation export");return i=URL.createObjectURL(new Blob([t],{type:"model/gltf-binary"})),{glbUrl:i,articulation:n,store:(0,o.createJointStore)(n),view:r.view||(null===(s=r.clipMeta)||void 0===s?void 0:s.camera)||p,clipMeta:r.clipMeta,sourceVerified:!0,sha256:r.current.sha256,fetchAndVerifyMs:performance.now()-L.current}}const c=r.nativeBaseline,h=await v({url:c.url,signal:a.signal,expectedSha256:c.sha256,onProgress:e=>{a.signal.aborted||k(e)}});if(a.signal.aborted)return null;const m=performance.now(),f=!1===c.motionQualified?(0,d.nativeUsdVisualMapping)(h):(0,d.nativeUsdArticulation)(h);f.articulation.kind=c.presentationKind;const w=(0,n.A)((0,n.A)({},h.metrics),{},{mappingMs:performance.now()-m});return{usdModel:{loadScene:async e=>{const r=await(0,u.createUsdScene)(h,f,(0,n.A)((0,n.A)({},e),{},{baseUrl:c.url,renderBothSides:!0,textureConcurrency:["lightusd-parallel","lightusd-packed"].includes(t)?4:1}));return Object.assign(w,r.userData.usdLoading),r}},articulation:f.articulation,store:(0,o.createJointStore)(f.articulation),view:r.view||(null===(e=r.clipMeta)||void 0===e?void 0:e.camera)||p,clipMeta:r.clipMeta,metrics:w,sourceVerified:!0,sha256:c.sha256}})().then(e=>{!a.signal.aborted&&e&&(M((0,n.A)((0,n.A)({},e),{},{inspectCamera:!0,presentation:y,renderPixelBudget:m,previewMount:!j||x&&"reference"===t?null:r.previewMount||null})),k("Preparing viewport"))}).catch(e=>{a.signal.aborted||B(e)}),()=>{a.abort(),i&&URL.revokeObjectURL(i)}},[r,t,v,B,x,y,j]);const E=(0,i.A)({resetKey:"".concat(r.id,":").concat(t),modelKey:"".concat(r.id,":").concat(t),active:!0,imageTab:!1,model:S,modelPending:!S&&!U,onModelUnavailable:B,workspace:{portal:!0,lazyShell:!0,onEscape:"self",labels:{back:g,dock:"Dock viewer"}}});return(0,a.useEffect)(()=>{if(!S||!E.viewerApi||C.current)return;if(S.store.setPose(S.store.homes,"instant"),"reference"!==t&&N.current)try{E.viewerApi.setInspectionCamera(N.current)}catch(n){return void B(n)}let e=!1;return k("Completing first frame"),E.viewerApi.waitForInspectionDraw().then(n=>{var a,i,s,o,l;e||(n.drawn?(C.current=!0,k("Ready"),null===(a=R.current)||void 0===a||a.call(R,{assetId:r.id,renderer:t,status:"ready",readyMs:performance.now()-L.current,firstCompletedDraw:n.drawn,gpuSynchronized:n.gpuSynchronized,sourceVerified:S.sourceVerified,sha256:S.sha256,fetchAndVerifyMs:S.fetchAndVerifyMs,readerMs:null===(i=S.metrics)||void 0===i?void 0:i.loadMs,heapBytes:null===(s=S.metrics)||void 0===s?void 0:s.wasmHeapBytes,metrics:S.metrics,jointCount:S.store.ids.length,pixelBuffer:E.viewerApi.renderSize,assetStorage:E.viewerApi.assetStorage,camera:E.viewerApi.cameraDiagnostics,cameraMatched:"reference"!==t&&(o=E.viewerApi.cameraDiagnostics,l=N.current,Boolean(o&&l&&o.frame===l.frame&&["position","target","up","verticalFovDegrees","near","far","viewMatrix","projectionMatrix"].every(e=>{const r=Array.isArray(o[e])?o[e]:[o[e]],t=Array.isArray(l[e])?l[e]:[l[e]];return r.length===t.length&&r.every((e,r)=>Number.isFinite(e)&&Number.isFinite(t[r])&&Math.abs(e-t[r])<=1e-8*Math.max(1,Math.abs(e)))}))),scope:"reference"===t?r.referenceScope:"Native USD geometry; same shared PBR viewport. No source MDL execution."})):B(new Error(n.error||"The viewport closed before completing its first frame")))}).catch(r=>{e||B(r)}),()=>{e=!0}},[r,t,S,E.viewerApi,B]),(0,h.jsxs)("section",{className:"ur2-shared","data-testid":"round2-shared-pane","data-engine":t,children:[(0,h.jsx)("p",{role:"status","data-testid":"round2-status",children:A}),U&&(0,h.jsx)("p",{role:"alert",children:U}),(0,h.jsx)("div",{className:"ur2-stage",ref:E.regionRef,tabIndex:-1,children:(0,h.jsx)(s.z_,{ctl:E,fileName:r.label,renderPicture:()=>null})}),S&&(0,h.jsxs)("div",{className:"ur2-actions",children:[(0,h.jsx)("button",{onClick:()=>{var e;return null===(e=E.viewerApi)||void 0===e?void 0:e.resetView()},children:"Reset camera"}),S.store.ids.length>0&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("button",{disabled:!E.viewerApi,onClick:E.expandPose,children:"Move individual joints"}),(0,h.jsx)("button",{onClick:()=>S.store.setAll(0),children:"Home pose"}),(0,h.jsx)("button",{onClick:()=>S.store.playSequence(),children:"Play joint sequence"})]})]}),(null===S||void 0===S?void 0:S.store.ids.length)>0&&(0,h.jsxs)("p",{className:"ur2-note",children:["Move individual joints opens the same pose workspace as the GLB viewer: select a joint and adjust its position.",b&&"reference"!==t&&" This view loads USD geometry and source joint data directly; it does not use Apple\u2019s model element or a GLB geometry substitute."]}),(0,h.jsx)(s.Vo,{ctl:E,fileName:r.label,topOffset:0})]})}},3013(e,r,t){t.r(r),t.d(r,{default:()=>d});var n=t(9379),a=t(5043),i=t(2973),s=t(6857),o=t(8276),l=(t(1219),t(579));const c=e=>Number.isFinite(e)?"".concat((e/1e3).toFixed(2)," s"):"\u2014";function d(){var e,r;const[t,d]=(0,a.useState)(null),[u,h]=(0,a.useState)(null),[p,m]=(0,a.useState)(new URLSearchParams(window.location.search).get("robot")||"franka"),[v,f]=(0,a.useState)("lightusd-packed"),[w,g]=(0,a.useState)({}),[b,x]=(0,a.useState)(""),y="1"===new URLSearchParams(window.location.search).get("qualify");(0,a.useEffect)(()=>{const e=new AbortController;return fetch("".concat("","/usd-central/manifest.json"),{signal:e.signal,cache:"no-cache"}).then(e=>{if(!e.ok)throw new Error("The robot catalog is unavailable");return e.json()}).then(e=>d((0,o.I)(e))).catch(r=>{e.signal.aborted||h(r.message)}),()=>e.abort()},[]);const j=(null===t||void 0===t?void 0:t.examples.find(e=>e.id===p))||(null===t||void 0===t?void 0:t.examples[0]),S=(null===t||void 0===t?void 0:t.examples.filter(e=>"ready"===e.status).length)||0,M="reference"===v,A=j&&(M?j.current&&j.articulation:"ready"===j.status||y&&"candidate"===j.status);return(0,l.jsxs)("main",{className:"ur2-page usd-central",children:[(0,l.jsxs)("header",{className:"usc-header",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("span",{className:"ur2-eyebrow",children:"SIMREADY CENTRAL \xb7 USD ENVIRONMENT"}),(0,l.jsx)("h1",{children:"Robots you can move"}),(0,l.jsx)("p",{children:"Source USD assets with Central\u2019s familiar joint controls."})]}),(0,l.jsx)("a",{href:"https://stg-simready-central.nvidia.com/ui/",target:"_blank",rel:"noreferrer",children:"Open Central staging \u2197"})]}),u&&(0,l.jsx)("p",{role:"alert",children:u}),!t&&!u&&(0,l.jsx)("p",{role:"status",children:"Loading robots\u2026"}),t&&(0,l.jsxs)("div",{className:"usc-layout",children:[(0,l.jsxs)("aside",{"aria-label":"Robot catalog",children:[(0,l.jsx)("label",{htmlFor:"usc-search",children:"Find a robot"}),(0,l.jsx)("input",{id:"usc-search",type:"search",value:b,onChange:e=>x(e.target.value),placeholder:"Arm, hand, gripper\u2026"}),(0,l.jsxs)("p",{className:"ur2-note",children:[S," of ",t.examples.length," ready for USD joint interaction"]}),(0,l.jsx)("nav",{className:"usc-robots",children:t.examples.filter(e=>"".concat(e.label," ").concat(e.kind).toLowerCase().includes(b.toLowerCase())).map(e=>(0,l.jsxs)("button",{"aria-pressed":e.id===(null===j||void 0===j?void 0:j.id),onClick:()=>function(e){m(e.id),f("lightusd-packed");const r=new URL(window.location.href);r.searchParams.set("robot",e.id),window.history.replaceState(null,"",r)}(e),"data-robot":e.id,children:[e.poster&&(0,l.jsx)("img",{src:e.poster.url,alt:"",loading:"lazy",width:"88",height:"55"}),(0,l.jsxs)("span",{children:[(0,l.jsx)("strong",{children:e.label}),(0,l.jsx)("small",{children:"ready"===e.status?"Interactive 3D":"candidate"===e.status?"Testing joints":"USD needs attention"})]})]},e.id))})]}),j&&(0,l.jsxs)("section",{className:"ur2-pane","aria-label":"Robot preview",children:[(0,l.jsxs)("div",{className:"usc-title",children:[(0,l.jsx)("h2",{children:j.label}),(0,l.jsx)("span",{children:j.kind})]}),(0,l.jsxs)("div",{className:"ur2-nav","aria-label":"Preview format",children:[(0,l.jsx)("button",{"aria-pressed":!M,onClick:()=>f("lightusd-packed"),children:"Interactive 3D"}),(0,l.jsx)("button",{"aria-pressed":M,disabled:!j.current||!j.articulation,onClick:()=>f("reference"),children:"Current GLB reference"}),!M&&"ready"===j.status&&j.package&&(0,l.jsx)("a",{href:j.package.url,download:!0,children:"Download USD package"})]}),A?(0,l.jsx)(i.A,{asset:j,mode:v,reader:s.readLightUsdSnapshotRound2,backLabel:"Robot library",showImplementationNote:!1,nativeMountOnly:!0,presentation:"rtx-media",showMount:!1,onTelemetry:function(e){g(r=>(0,n.A)((0,n.A)({},r),{},{["".concat(e.assetId,":").concat(e.renderer)]:e}))}},"".concat(j.id,":").concat(v)):(0,l.jsxs)("div",{className:"ur2-unavailable",children:[(0,l.jsx)("h3",{children:"USD joint interaction is not ready for this robot"}),(0,l.jsx)("p",{children:j.reason||"This source is still being checked."}),(0,l.jsx)("p",{children:"The current GLB reference is available using the labelled button above."})]}),(0,l.jsxs)("table",{"aria-label":"Opening speed this visit",children:[(0,l.jsx)("thead",{children:(0,l.jsxs)("tr",{children:[(0,l.jsx)("th",{children:"Ready this visit"}),(0,l.jsx)("th",{children:"Interactive 3D"}),(0,l.jsx)("th",{children:"Current GLB"})]})}),(0,l.jsx)("tbody",{children:(0,l.jsxs)("tr",{children:[(0,l.jsx)("td",{children:"Completed first frame"}),(0,l.jsx)("td",{"data-testid":"usc-native-ready",children:c(null===(e=w["".concat(j.id,":lightusd-packed")])||void 0===e?void 0:e.readyMs)}),(0,l.jsx)("td",{children:c(null===(r=w["".concat(j.id,":reference")])||void 0===r?void 0:r.readyMs)})]})})]}),(0,l.jsx)("p",{className:"ur2-note",children:"Times reflect this browser and connection, including downloading and drawing the asset. Open each format to measure it."}),(0,l.jsxs)("details",{children:[(0,l.jsx)("summary",{children:"About this USD preview"}),(0,l.jsx)("p",{children:"USD supplies the geometry, materials and joint definitions. LightUSD reads it in the browser; Central\u2019s shared renderer and pose controls display and move it. Materials are prepared for browser PBR rendering; MDL and RTX are not executed here."}),(0,l.jsx)("p",{children:"The downloadable USD retains joint definitions. Interactive controls are supplied by this viewer, rather than stored as a user interface in the file."}),(0,l.jsx)("p",{children:"Experimental environment. Browser joint checks do not establish simulation validity or collision safety."})]})]})]})]})}},6857(e,r,t){t.r(r),t.d(r,{readLightUsdSnapshotRound2:()=>c});var n=t(9379),a=t(9885),i=t(7863);const s=()=>new DOMException("USD load cancelled","AbortError");let o;function l(e){const r=new URL(e,window.location.href);if(r.origin!==window.location.origin)throw new Error("USD review resources must use this origin");return r.href}async function c(){let{file:e,url:r,filename:t,getHeaders:c,signal:d,onProgress:u,expectedSha256:h,snapshotCache:p}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(null!==d&&void 0!==d&&d.aborted)throw s();const m=performance.now(),v=(0,a.mx)(t||(null===e||void 0===e?void 0:e.name)||r);if((null===e||void 0===e?void 0:e.size)>a.Z6)throw new Error("USD layer exceeds the 64 MiB qualification limit");const f="",w="public-central-robot-demo-v1"===(null===p||void 0===p?void 0:p.context)&&!e&&!c&&/^[a-f0-9]{64}$/.test(h||""),g=await function(e,r,t){const n=()=>fetch("".concat(e,"/usd-round2/lightusd/snapshot-v2/runtime.json"),{signal:t?void 0:r,credentials:"same-origin",cache:t?"default":"no-store"}).then(e=>{if(!e.ok)throw new Error("The isolated LightUSD experiment runtime is not installed");return e.json()});return t?(o||(o=n().catch(e=>{throw o=null,e})),o):n()}(f,d,w);if(1!==g.version||"lightusd-next-loaded-layer"!==g.reader||"1.0.0-rc4"!==g.readerVersion||1!==g.loadedLayerApi||1!==g.viewerSnapshotApi||"simready-viewer-snapshot-v2"!==g.variant||"string"!==typeof g.revision||!g.revision)throw new Error("The isolated LightUSD runtime manifest is unsupported");const b=new URL("".concat(f.replace(/\/$/,""),"/"),window.location.origin),x=l(new URL(g.worker,b).href),y=w?JSON.stringify([p.context,l(r),h,g.revision,x]):null,j=(0,a.yM)(y);if(null!==d&&void 0!==d&&d.aborted)throw s();var S;if(j)return j.metrics=(0,n.A)((0,n.A)({},j.metrics),{},{snapshotCacheSourceWorkerMs:null===(S=j.metrics)||void 0===S?void 0:S.workerMs,runtimeMs:0,physicsMs:0,opinionMs:0,geometryMs:0,workerMs:0,wasmHeapBytes:0,downloadMs:0,verificationMs:0,snapshotCacheHit:!0,loadMs:performance.now()-m}),j;null===u||void 0===u||u("download");const M=performance.now(),A=e?await e.arrayBuffer():await(0,a.HX)(await fetch(l(r),{signal:d,credentials:"same-origin",headers:(null===c||void 0===c?void 0:c())||{}}),d);if(A.byteLength>a.Z6)throw new Error("USD layer exceeds the 64 MiB qualification limit");if(null!==d&&void 0!==d&&d.aborted)throw s();const k=performance.now()-M,U=performance.now(),D=void 0===h?null:await(0,i.n)(A,h,"USD layer"),L=void 0===h?0:performance.now()-U;if(null!==d&&void 0!==d&&d.aborted)throw s();return new Promise((e,r)=>{let t,i,o=!1;const l=(n,a)=>{var s;o||(o=!0,clearTimeout(i),null===d||void 0===d||d.removeEventListener("abort",c),null===(s=t)||void 0===s||s.terminate(),n?r(n):e(a))},c=()=>l(s());try{if(t=new Worker(x,{type:"module",name:"simready-lightusd-snapshot-round2"}),null===d||void 0===d||d.addEventListener("abort",c,{once:!0}),null!==d&&void 0!==d&&d.aborted)return void c();t.onerror=e=>l(new Error(e.message||"LightUSD worker failed")),t.onmessageerror=()=>l(new Error("LightUSD result could not be transferred")),t.onmessage=e=>{let{data:r}=e;if("progress"===r.type)null===u||void 0===u||u(r.stage);else if("error"===r.type)l(new Error(r.message));else if("result"===r.type){if(r.result.metrics=(0,n.A)((0,n.A)({},r.result.metrics),{},{downloadMs:k,verificationMs:L,loadMs:performance.now()-m,runtimeWasmBytes:g.wasmBytes,runtimeRevision:g.revision,snapshotCacheHit:!1}),D&&(r.result.metrics.sourceSha256=D),y)try{(0,a.eH)(y,r.result)}catch(t){}l(null,r.result)}},i=setTimeout(()=>l(new Error("LightUSD exceeded the 60 second parse limit")),6e4),t.postMessage({bytes:A,filename:v},[A])}catch(h){l(h)}})}}}]);
services/explorer/dist/static/js/main.f2f625ec.js ADDED
The diff for this file is too large to render. See raw diff
 
services/explorer/dist/static/js/main.f2f625ec.js.LICENSE.txt ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * @license React
3
+ * react-dom.production.min.js
4
+ *
5
+ * Copyright (c) Facebook, Inc. and its affiliates.
6
+ *
7
+ * This source code is licensed under the MIT license found in the
8
+ * LICENSE file in the root directory of this source tree.
9
+ */
10
+
11
+ /**
12
+ * @license React
13
+ * react-jsx-runtime.production.min.js
14
+ *
15
+ * Copyright (c) Facebook, Inc. and its affiliates.
16
+ *
17
+ * This source code is licensed under the MIT license found in the
18
+ * LICENSE file in the root directory of this source tree.
19
+ */
20
+
21
+ /**
22
+ * @license React
23
+ * react.production.min.js
24
+ *
25
+ * Copyright (c) Facebook, Inc. and its affiliates.
26
+ *
27
+ * This source code is licensed under the MIT license found in the
28
+ * LICENSE file in the root directory of this source tree.
29
+ */
30
+
31
+ /**
32
+ * @license React
33
+ * scheduler.production.min.js
34
+ *
35
+ * Copyright (c) Facebook, Inc. and its affiliates.
36
+ *
37
+ * This source code is licensed under the MIT license found in the
38
+ * LICENSE file in the root directory of this source tree.
39
+ */
services/explorer/dist/third-party-notices.txt CHANGED
@@ -1,4 +1,4 @@
1
- Third-party notices — SimReady Central Explorer slim-partner-usd-efb47b55
2
 
3
  The software in this web application's browser bundle includes the packages below, each under its own
4
  license. Each entry gives the package, its version, its license and the license / notice text it ships.
 
1
+ Third-party notices — SimReady Central Explorer slim-partner-usd-33f3a096
2
 
3
  The software in this web application's browser bundle includes the packages below, each under its own
4
  license. Each entry gives the package, its version, its license and the license / notice text it ships.