diff --git a/404.html b/404.html new file mode 100644 index 0000000..82b0592 --- /dev/null +++ b/404.html @@ -0,0 +1,33 @@ + + + + + + + + + Overlays Capture Architecture + + + + +

404

That's a Four-Oh-Four.
Take me home
+ + + diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..d91dd8d --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +oca.colossi.network \ No newline at end of file diff --git a/assets/404.1edfdf19.js b/assets/404.1edfdf19.js new file mode 100644 index 0000000..21fc0de --- /dev/null +++ b/assets/404.1edfdf19.js @@ -0,0 +1 @@ +import{_ as d,f as i,u as f,g as p,r as v,o as k,c as L,a as o,t as c,b as g,w as x,h as l,d as B}from"./app.ebda841e.js";const N={class:"theme-container"},T={class:"theme-default-content"},b=o("h1",null,"404",-1),C=i({__name:"404",setup(M){var a,s,n;const r=f(),e=p(),t=(a=e.value.notFound)!=null?a:["Not Found"],u=()=>t[Math.floor(Math.random()*t.length)],_=(s=e.value.home)!=null?s:r.value,m=(n=e.value.backToHome)!=null?n:"Back to home";return(R,V)=>{const h=v("RouterLink");return k(),L("div",N,[o("div",T,[b,o("blockquote",null,c(u()),1),g(h,{to:l(_)},{default:x(()=>[B(c(l(m)),1)]),_:1},8,["to"])])])}}});var D=d(C,[["__file","404.vue"]]);export{D as default}; diff --git a/assets/404.html.72046180.js b/assets/404.html.72046180.js new file mode 100644 index 0000000..cf7ac5a --- /dev/null +++ b/assets/404.html.72046180.js @@ -0,0 +1 @@ +import{_ as e,o as _,c}from"./app.ebda841e.js";const r={};function t(o,a){return _(),c("div")}var s=e(r,[["render",t],["__file","404.html.vue"]]);export{s as default}; diff --git a/assets/404.html.7d858b3d.js b/assets/404.html.7d858b3d.js new file mode 100644 index 0000000..c4c5770 --- /dev/null +++ b/assets/404.html.7d858b3d.js @@ -0,0 +1 @@ +const t=JSON.parse('{"key":"v-3706649a","path":"/404.html","title":"","lang":"en-US","frontmatter":{"layout":"404"},"excerpt":"","headers":[],"git":{},"filePathRelative":null}');export{t as data}; diff --git a/assets/Layout.eb79ccda.js b/assets/Layout.eb79ccda.js new file mode 100644 index 0000000..981ad09 --- /dev/null +++ b/assets/Layout.eb79ccda.js @@ -0,0 +1 @@ +import{_ as C,r as A,o as n,c as i,b as $,f as S,i as P,j as h,k as _e,h as e,F as H,l as R,a as g,t as x,m as w,n as z,p as Y,q as T,w as N,s as ve,v as k,d as j,x as X,y as Te,z as xe,A as Ne,B as J,C as Q,D as E,E as K,G as pe,H as he,u as me,g as I,T as fe,I as O,J as be,K as q,L as G,M as Be,N as Ie,O as Z,P as ge,Q as ke,e as He,R as ee,S as Me,U,V as te,W as De,X as Pe,Y as Ee,Z as Ae}from"./app.ebda841e.js";const Re={},Fe={class:"theme-default-content"};function Oe(v,a){const t=A("Content");return n(),i("div",Fe,[$(t)])}var ze=C(Re,[["render",Oe],["__file","HomeContent.vue"]]);const We={key:0,class:"features"},Ve=S({__name:"HomeFeatures",setup(v){const a=P(),t=h(()=>_e(a.value.features)?a.value.features:[]);return(l,r)=>e(t).length?(n(),i("div",We,[(n(!0),i(H,null,R(e(t),p=>(n(),i("div",{key:p.title,class:"feature"},[g("h2",null,x(p.title),1),g("p",null,x(p.details),1)]))),128))])):w("",!0)}});var Ue=C(Ve,[["__file","HomeFeatures.vue"]]);const je=["innerHTML"],Ke=["textContent"],qe=S({__name:"HomeFooter",setup(v){const a=P(),t=h(()=>a.value.footer),l=h(()=>a.value.footerHtml);return(r,p)=>e(t)?(n(),i(H,{key:0},[e(l)?(n(),i("div",{key:0,class:"footer",innerHTML:e(t)},null,8,je)):(n(),i("div",{key:1,class:"footer",textContent:x(e(t))},null,8,Ke))],64)):w("",!0)}});var Ge=C(qe,[["__file","HomeFooter.vue"]]);const Xe=["href","rel","target","aria-label"],Ye=S({inheritAttrs:!1}),Je=S({...Ye,__name:"AutoLink",props:{item:{type:Object,required:!0}},setup(v){const a=v,t=z(),l=Ne(),{item:r}=Y(a),p=h(()=>X(r.value.link)),m=h(()=>Te(r.value.link)||xe(r.value.link)),c=h(()=>{if(!m.value){if(r.value.target)return r.value.target;if(p.value)return"_blank"}}),o=h(()=>c.value==="_blank"),s=h(()=>!p.value&&!m.value&&!o.value),u=h(()=>{if(!m.value){if(r.value.rel)return r.value.rel;if(o.value)return"noopener noreferrer"}}),d=h(()=>r.value.ariaLabel||r.value.text),_=h(()=>{const y=Object.keys(l.value.locales);return y.length?!y.some(f=>f===r.value.link):r.value.link!=="/"}),b=h(()=>_.value?t.path.startsWith(r.value.link):!1),L=h(()=>s.value?r.value.activeMatch?new RegExp(r.value.activeMatch).test(t.path):b.value:!1);return(y,f)=>{const B=A("RouterLink"),M=A("AutoLinkExternalIcon");return e(s)?(n(),T(B,ve({key:0,class:{"router-link-active":e(L)},to:e(r).link,"aria-label":e(d)},y.$attrs),{default:N(()=>[k(y.$slots,"before"),j(" "+x(e(r).text)+" ",1),k(y.$slots,"after")]),_:3},16,["class","to","aria-label"])):(n(),i("a",ve({key:1,class:"external-link",href:e(r).link,rel:e(u),target:e(c),"aria-label":e(d)},y.$attrs),[k(y.$slots,"before"),j(" "+x(e(r).text)+" ",1),e(o)?(n(),T(M,{key:0})):w("",!0),k(y.$slots,"after")],16,Xe))}}});var D=C(Je,[["__file","AutoLink.vue"]]);const Qe={class:"hero"},Ze={key:0,id:"main-title"},et={key:1,class:"description"},tt={key:2,class:"actions"},at=S({__name:"HomeHero",setup(v){const a=P(),t=J(),l=Q(),r=h(()=>l.value&&a.value.heroImageDark!==void 0?a.value.heroImageDark:a.value.heroImage),p=h(()=>a.value.heroText===null?null:a.value.heroText||t.value.title||"Hello"),m=h(()=>a.value.heroAlt||p.value||"hero"),c=h(()=>a.value.tagline===null?null:a.value.tagline||t.value.description||"Welcome to your VuePress site"),o=h(()=>_e(a.value.actions)?a.value.actions.map(({text:u,link:d,type:_="primary"})=>({text:u,link:d,type:_})):[]),s=()=>{if(!r.value)return null;const u=K("img",{src:pe(r.value),alt:m.value});return a.value.heroImageDark===void 0?u:K(he,()=>u)};return(u,d)=>(n(),i("header",Qe,[$(s),e(p)?(n(),i("h1",Ze,x(e(p)),1)):w("",!0),e(c)?(n(),i("p",et,x(e(c)),1)):w("",!0),e(o).length?(n(),i("p",tt,[(n(!0),i(H,null,R(e(o),_=>(n(),T(D,{key:_.text,class:E(["action-button",[_.type]]),item:_},null,8,["class","item"]))),128))])):w("",!0)]))}});var nt=C(at,[["__file","HomeHero.vue"]]);const ot={class:"home"},rt=S({__name:"Home",setup(v){return(a,t)=>(n(),i("main",ot,[$(nt),$(Ue),$(ze),$(Ge)]))}});var st=C(rt,[["__file","Home.vue"]]);const lt=S({__name:"NavbarBrand",setup(v){const a=me(),t=J(),l=I(),r=Q(),p=h(()=>l.value.home||a.value),m=h(()=>t.value.title),c=h(()=>r.value&&l.value.logoDark!==void 0?l.value.logoDark:l.value.logo),o=()=>{if(!c.value)return null;const s=K("img",{class:"logo",src:pe(c.value),alt:m.value});return l.value.logoDark===void 0?s:K(he,()=>s)};return(s,u)=>{const d=A("RouterLink");return n(),T(d,{to:e(p)},{default:N(()=>[$(o),e(m)?(n(),i("span",{key:0,class:E(["site-name",{"can-hide":e(c)}])},x(e(m)),3)):w("",!0)]),_:1},8,["to"])}}});var ut=C(lt,[["__file","NavbarBrand.vue"]]);const it=S({__name:"DropdownTransition",setup(v){const a=l=>{l.style.height=l.scrollHeight+"px"},t=l=>{l.style.height=""};return(l,r)=>(n(),T(fe,{name:"dropdown",onEnter:a,onAfterEnter:t,onBeforeLeave:a},{default:N(()=>[k(l.$slots,"default")]),_:3}))}});var $e=C(it,[["__file","DropdownTransition.vue"]]);const ct=["aria-label"],vt={class:"title"},dt=g("span",{class:"arrow down"},null,-1),_t=["aria-label"],pt={class:"title"},ht={class:"navbar-dropdown"},mt={class:"navbar-dropdown-subtitle"},ft={key:1},bt={class:"navbar-dropdown-subitem-wrapper"},gt=S({__name:"NavbarDropdown",props:{item:{type:Object,required:!0}},setup(v){const a=v,{item:t}=Y(a),l=h(()=>t.value.ariaLabel||t.value.text),r=O(!1),p=z();be(()=>p.path,()=>{r.value=!1});const m=o=>{o.detail===0?r.value=!r.value:r.value=!1},c=(o,s)=>s[s.length-1]===o;return(o,s)=>(n(),i("div",{class:E(["navbar-dropdown-wrapper",{open:r.value}])},[g("button",{class:"navbar-dropdown-title",type:"button","aria-label":e(l),onClick:m},[g("span",vt,x(e(t).text),1),dt],8,ct),g("button",{class:"navbar-dropdown-title-mobile",type:"button","aria-label":e(l),onClick:s[0]||(s[0]=u=>r.value=!r.value)},[g("span",pt,x(e(t).text),1),g("span",{class:E(["arrow",r.value?"down":"right"])},null,2)],8,_t),$($e,null,{default:N(()=>[q(g("ul",ht,[(n(!0),i(H,null,R(e(t).children,u=>(n(),i("li",{key:u.text,class:"navbar-dropdown-item"},[u.children?(n(),i(H,{key:0},[g("h4",mt,[u.link?(n(),T(D,{key:0,item:u,onFocusout:d=>c(u,e(t).children)&&u.children.length===0&&(r.value=!1)},null,8,["item","onFocusout"])):(n(),i("span",ft,x(u.text),1))]),g("ul",bt,[(n(!0),i(H,null,R(u.children,d=>(n(),i("li",{key:d.link,class:"navbar-dropdown-subitem"},[$(D,{item:d,onFocusout:_=>c(d,u.children)&&c(u,e(t).children)&&(r.value=!1)},null,8,["item","onFocusout"])]))),128))])],64)):(n(),T(D,{key:1,item:u,onFocusout:d=>c(u,e(t).children)&&(r.value=!1)},null,8,["item","onFocusout"]))]))),128))],512),[[G,r.value]])]),_:1})],2))}});var kt=C(gt,[["__file","NavbarDropdown.vue"]]);const de=v=>decodeURI(v).replace(/#.*$/,"").replace(/(index)?\.(md|html)$/,""),$t=(v,a)=>{if(a.hash===v)return!0;const t=de(a.path),l=de(v);return t===l},Le=(v,a)=>v.link&&$t(v.link,a)?!0:v.children?v.children.some(t=>Le(t,a)):!1,ye=v=>!X(v)||/github\.com/.test(v)?"GitHub":/bitbucket\.org/.test(v)?"Bitbucket":/gitlab\.com/.test(v)?"GitLab":/gitee\.com/.test(v)?"Gitee":null,Lt={GitHub:":repo/edit/:branch/:path",GitLab:":repo/-/edit/:branch/:path",Gitee:":repo/edit/:branch/:path",Bitbucket:":repo/src/:branch/:path?mode=edit&spa=0&at=:branch&fileviewer=file-view-default"},yt=({docsRepo:v,editLinkPattern:a})=>{if(a)return a;const t=ye(v);return t!==null?Lt[t]:null},wt=({docsRepo:v,docsBranch:a,docsDir:t,filePathRelative:l,editLinkPattern:r})=>{if(!l)return null;const p=yt({docsRepo:v,editLinkPattern:r});return p?p.replace(/:repo/,X(v)?v:`https://github.com/${v}`).replace(/:branch/,a).replace(/:path/,Be(`${Ie(t)}/${l}`)):null},Ct={key:0,class:"navbar-items"},St=S({__name:"NavbarItems",setup(v){const a=()=>{const s=Z(),u=me(),d=J(),_=I();return h(()=>{var B,M;const b=Object.keys(d.value.locales);if(b.length<2)return[];const L=s.currentRoute.value.path,y=s.currentRoute.value.fullPath;return[{text:(B=_.value.selectLanguageText)!=null?B:"unknown language",ariaLabel:(M=_.value.selectLanguageAriaLabel)!=null?M:"unkown language",children:b.map(F=>{var oe,re,se,le,ue,ie;const W=(re=(oe=d.value.locales)==null?void 0:oe[F])!=null?re:{},ae=(le=(se=_.value.locales)==null?void 0:se[F])!=null?le:{},ne=`${W.lang}`,Ce=(ue=ae.selectLanguageName)!=null?ue:ne;let V;if(ne===d.value.lang)V=y;else{const ce=L.replace(u.value,F);s.getRoutes().some(Se=>Se.path===ce)?V=ce:V=(ie=ae.home)!=null?ie:F}return{text:Ce,link:V}})}]})},t=()=>{const s=I(),u=h(()=>s.value.repo),d=h(()=>u.value?ye(u.value):null),_=h(()=>u.value&&!X(u.value)?`https://github.com/${u.value}`:u.value),b=h(()=>_.value?s.value.repoLabel?s.value.repoLabel:d.value===null?"Source":d.value:null);return h(()=>!_.value||!b.value?[]:[{text:b.value,link:_.value}])},l=s=>ge(s)?ke(s):s.children?{...s,children:s.children.map(l)}:s,p=(()=>{const s=I();return h(()=>(s.value.navbar||[]).map(l))})(),m=a(),c=t(),o=h(()=>[...p.value,...m.value,...c.value]);return(s,u)=>e(o).length?(n(),i("nav",Ct,[(n(!0),i(H,null,R(e(o),d=>(n(),i("div",{key:d.text,class:"navbar-item"},[d.children?(n(),T(kt,{key:0,item:d},null,8,["item"])):(n(),T(D,{key:1,item:d},null,8,["item"]))]))),128))])):w("",!0)}});var we=C(St,[["__file","NavbarItems.vue"]]);const Tt=["title"],xt={class:"icon",focusable:"false",viewBox:"0 0 32 32"},Nt=He('',9),Bt=[Nt],It={class:"icon",focusable:"false",viewBox:"0 0 32 32"},Ht=g("path",{d:"M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z",fill:"currentColor"},null,-1),Mt=[Ht],Dt=S({__name:"ToggleColorModeButton",setup(v){const a=I(),t=Q(),l=()=>{t.value=!t.value};return(r,p)=>(n(),i("button",{class:"toggle-color-mode-button",title:e(a).toggleColorMode,onClick:l},[q((n(),i("svg",xt,Bt,512)),[[G,!e(t)]]),q((n(),i("svg",It,Mt,512)),[[G,e(t)]])],8,Tt))}});var Pt=C(Dt,[["__file","ToggleColorModeButton.vue"]]);const Et=["title"],At=g("div",{class:"icon","aria-hidden":"true"},[g("span"),g("span"),g("span")],-1),Rt=[At],Ft=S({__name:"ToggleSidebarButton",emits:["toggle"],setup(v){const a=I();return(t,l)=>(n(),i("div",{class:"toggle-sidebar-button",title:e(a).toggleSidebar,"aria-expanded":"false",role:"button",tabindex:"0",onClick:l[0]||(l[0]=r=>t.$emit("toggle"))},Rt,8,Et))}});var Ot=C(Ft,[["__file","ToggleSidebarButton.vue"]]);const zt=S({__name:"Navbar",emits:["toggle-sidebar"],setup(v){const a=I(),t=O(null),l=O(null),r=O(0),p=h(()=>r.value?{maxWidth:r.value+"px"}:{});ee(()=>{const o=m(t.value,"paddingLeft")+m(t.value,"paddingRight"),s=()=>{var u;window.innerWidth<=719?r.value=0:r.value=t.value.offsetWidth-o-(((u=l.value)==null?void 0:u.offsetWidth)||0)};s(),window.addEventListener("resize",s,!1),window.addEventListener("orientationchange",s,!1)});function m(c,o){var d,_,b;const s=(b=(_=(d=c==null?void 0:c.ownerDocument)==null?void 0:d.defaultView)==null?void 0:_.getComputedStyle(c,null))==null?void 0:b[o],u=Number.parseInt(s,10);return Number.isNaN(u)?0:u}return(c,o)=>{const s=A("NavbarSearch");return n(),i("header",{ref_key:"navbar",ref:t,class:"navbar"},[$(Ot,{onToggle:o[0]||(o[0]=u=>c.$emit("toggle-sidebar"))}),g("span",{ref_key:"navbarBrand",ref:l},[$(ut)],512),g("div",{class:"navbar-items-wrapper",style:Me(e(p))},[k(c.$slots,"before"),$(we,{class:"can-hide"}),k(c.$slots,"after"),e(a).colorModeSwitch?(n(),T(Pt,{key:0})):w("",!0),$(s)],4)],512)}}});var Wt=C(zt,[["__file","Navbar.vue"]]);const Vt={class:"page-meta"},Ut={key:0,class:"meta-item edit-link"},jt={key:1,class:"meta-item last-updated"},Kt={class:"meta-item-label"},qt={class:"meta-item-info"},Gt={key:2,class:"meta-item contributors"},Xt={class:"meta-item-label"},Yt={class:"meta-item-info"},Jt=["title"],Qt=j(", "),Zt=S({__name:"PageMeta",setup(v){const a=()=>{const o=I(),s=U(),u=P();return h(()=>{var M,F,W;if(!((F=(M=u.value.editLink)!=null?M:o.value.editLink)!=null?F:!0))return null;const{repo:_,docsRepo:b=_,docsBranch:L="main",docsDir:y="",editLinkText:f}=o.value;if(!b)return null;const B=wt({docsRepo:b,docsBranch:L,docsDir:y,filePathRelative:s.value.filePathRelative,editLinkPattern:(W=u.value.editLinkPattern)!=null?W:o.value.editLinkPattern});return B?{text:f!=null?f:"Edit this page",link:B}:null})},t=()=>{const o=I(),s=U(),u=P();return h(()=>{var b,L,y,f;return!((L=(b=u.value.lastUpdated)!=null?b:o.value.lastUpdated)!=null?L:!0)||!((y=s.value.git)!=null&&y.updatedTime)?null:new Date((f=s.value.git)==null?void 0:f.updatedTime).toLocaleString()})},l=()=>{const o=I(),s=U(),u=P();return h(()=>{var _,b,L,y;return((b=(_=u.value.contributors)!=null?_:o.value.contributors)!=null?b:!0)&&(y=(L=s.value.git)==null?void 0:L.contributors)!=null?y:null})},r=I(),p=a(),m=t(),c=l();return(o,s)=>{const u=A("ClientOnly");return n(),i("footer",Vt,[e(p)?(n(),i("div",Ut,[$(D,{class:"meta-item-label",item:e(p)},null,8,["item"])])):w("",!0),e(m)?(n(),i("div",jt,[g("span",Kt,x(e(r).lastUpdatedText)+": ",1),$(u,null,{default:N(()=>[g("span",qt,x(e(m)),1)]),_:1})])):w("",!0),e(c)&&e(c).length?(n(),i("div",Gt,[g("span",Xt,x(e(r).contributorsText)+": ",1),g("span",Yt,[(n(!0),i(H,null,R(e(c),(d,_)=>(n(),i(H,{key:_},[g("span",{class:"contributor",title:`email: ${d.email}`},x(d.name),9,Jt),_!==e(c).length-1?(n(),i(H,{key:0},[Qt],64)):w("",!0)],64))),128))])])):w("",!0)])}}});var ea=C(Zt,[["__file","PageMeta.vue"]]);const ta={key:0,class:"page-nav"},aa={class:"inner"},na={key:0,class:"prev"},oa={key:1,class:"next"},ra=S({__name:"PageNav",setup(v){const a=o=>o===!1?null:ge(o)?ke(o):De(o)?o:!1,t=(o,s,u)=>{const d=o.findIndex(_=>_.link===s);if(d!==-1){const _=o[d+u];return _!=null&&_.link?_:null}for(const _ of o)if(_.children){const b=t(_.children,s,u);if(b)return b}return null},l=P(),r=te(),p=z(),m=h(()=>{const o=a(l.value.prev);return o!==!1?o:t(r.value,p.path,-1)}),c=h(()=>{const o=a(l.value.next);return o!==!1?o:t(r.value,p.path,1)});return(o,s)=>e(m)||e(c)?(n(),i("nav",ta,[g("p",aa,[e(m)?(n(),i("span",na,[$(D,{item:e(m)},null,8,["item"])])):w("",!0),e(c)?(n(),i("span",oa,[$(D,{item:e(c)},null,8,["item"])])):w("",!0)])])):w("",!0)}});var sa=C(ra,[["__file","PageNav.vue"]]);const la={class:"page"},ua={class:"theme-default-content"},ia=S({__name:"Page",setup(v){return(a,t)=>{const l=A("Content");return n(),i("main",la,[k(a.$slots,"top"),g("div",ua,[k(a.$slots,"content-top"),$(l),k(a.$slots,"content-bottom")]),$(ea),$(sa),k(a.$slots,"bottom")])}}});var ca=C(ia,[["__file","Page.vue"]]);const va={class:"sidebar-item-children"},da=S({__name:"SidebarItem",props:{item:{type:Object,required:!0},depth:{type:Number,required:!1,default:0}},setup(v){const a=v,{item:t,depth:l}=Y(a),r=z(),p=Z(),m=h(()=>Le(t.value,r)),c=h(()=>({"sidebar-item":!0,"sidebar-heading":l.value===0,active:m.value,collapsible:t.value.collapsible})),o=O(!0),s=O(void 0);return t.value.collapsible&&(o.value=m.value,s.value=()=>{o.value=!o.value},p.afterEach(()=>{o.value=m.value})),(u,d)=>{var b;const _=A("SidebarItem",!0);return n(),i("li",null,[e(t).link?(n(),T(D,{key:0,class:E(e(c)),item:e(t)},null,8,["class","item"])):(n(),i("p",{key:1,tabindex:"0",class:E(e(c)),onClick:d[0]||(d[0]=(...L)=>s.value&&s.value(...L)),onKeydown:d[1]||(d[1]=Pe((...L)=>s.value&&s.value(...L),["enter"]))},[j(x(e(t).text)+" ",1),e(t).collapsible?(n(),i("span",{key:0,class:E(["arrow",o.value?"down":"right"])},null,2)):w("",!0)],34)),(b=e(t).children)!=null&&b.length?(n(),T($e,{key:2},{default:N(()=>[q(g("ul",va,[(n(!0),i(H,null,R(e(t).children,L=>(n(),T(_,{key:`${e(l)}${L.text}${L.link}`,item:L,depth:e(l)+1},null,8,["item","depth"]))),128))],512),[[G,o.value]])]),_:1})):w("",!0)])}}});var _a=C(da,[["__file","SidebarItem.vue"]]);const pa={key:0,class:"sidebar-items"},ha=S({__name:"SidebarItems",setup(v){const a=z(),t=te();return ee(()=>{be(()=>a.hash,l=>{const r=document.querySelector(".sidebar");if(!r)return;const p=document.querySelector(`.sidebar a.sidebar-item[href="${a.path}${l}"]`);if(!p)return;const{top:m,height:c}=r.getBoundingClientRect(),{top:o,height:s}=p.getBoundingClientRect();om+c&&p.scrollIntoView(!1)})}),(l,r)=>e(t).length?(n(),i("ul",pa,[(n(!0),i(H,null,R(e(t),p=>(n(),T(_a,{key:p.link||p.text,item:p},null,8,["item"]))),128))])):w("",!0)}});var ma=C(ha,[["__file","SidebarItems.vue"]]);const fa={class:"sidebar"},ba=S({__name:"Sidebar",setup(v){return(a,t)=>(n(),i("aside",fa,[$(we),k(a.$slots,"top"),$(ma),k(a.$slots,"bottom")]))}});var ga=C(ba,[["__file","Sidebar.vue"]]);const ka=S({__name:"Layout",setup(v){const a=U(),t=P(),l=I(),r=h(()=>t.value.navbar!==!1&&l.value.navbar!==!1),p=te(),m=O(!1),c=f=>{m.value=typeof f=="boolean"?f:!m.value},o={x:0,y:0},s=f=>{o.x=f.changedTouches[0].clientX,o.y=f.changedTouches[0].clientY},u=f=>{const B=f.changedTouches[0].clientX-o.x,M=f.changedTouches[0].clientY-o.y;Math.abs(B)>Math.abs(M)&&Math.abs(B)>40&&(B>0&&o.x<=80?c(!0):c(!1))},d=h(()=>[{"no-navbar":!r.value,"no-sidebar":!p.value.length,"sidebar-open":m.value},t.value.pageClass]);let _;ee(()=>{_=Z().afterEach(()=>{c(!1)})}),Ee(()=>{_()});const b=Ae(),L=b.resolve,y=b.pending;return(f,B)=>(n(),i("div",{class:E(["theme-container",e(d)]),onTouchstart:s,onTouchend:u},[k(f.$slots,"navbar",{},()=>[e(r)?(n(),T(Wt,{key:0,onToggleSidebar:c},{before:N(()=>[k(f.$slots,"navbar-before")]),after:N(()=>[k(f.$slots,"navbar-after")]),_:3})):w("",!0)]),g("div",{class:"sidebar-mask",onClick:B[0]||(B[0]=M=>c(!1))}),k(f.$slots,"sidebar",{},()=>[$(ga,null,{top:N(()=>[k(f.$slots,"sidebar-top")]),bottom:N(()=>[k(f.$slots,"sidebar-bottom")]),_:3})]),k(f.$slots,"page",{},()=>[e(t).home?(n(),T(st,{key:0})):(n(),T(fe,{key:1,name:"fade-slide-y",mode:"out-in",onBeforeEnter:e(L),onBeforeLeave:e(y)},{default:N(()=>[(n(),T(ca,{key:e(a).path},{top:N(()=>[k(f.$slots,"page-top")]),"content-top":N(()=>[k(f.$slots,"page-content-top")]),"content-bottom":N(()=>[k(f.$slots,"page-content-bottom")]),bottom:N(()=>[k(f.$slots,"page-bottom")]),_:3}))]),_:3},8,["onBeforeEnter","onBeforeLeave"]))])],34))}});var La=C(ka,[["__file","Layout.vue"]]);export{La as default}; diff --git a/assets/app.ebda841e.js b/assets/app.ebda841e.js new file mode 100644 index 0000000..d7aa3f7 --- /dev/null +++ b/assets/app.ebda841e.js @@ -0,0 +1,10 @@ +const bo={},gs="modulepreload",xo={},vs="/",J=function(t,n){return!n||n.length===0?t():Promise.all(n.map(r=>{if(r=`${vs}${r}`,r in xo)return;xo[r]=!0;const o=r.endsWith(".css"),i=o?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${r}"]${i}`))return;const a=document.createElement("link");if(a.rel=o?"stylesheet":gs,o||(a.as="script",a.crossOrigin=""),a.href=r,document.head.appendChild(a),o)return new Promise((s,l)=>{a.addEventListener("load",s),a.addEventListener("error",()=>l(new Error(`Unable to preload CSS for ${r}`)))})})).then(()=>t())},bs={"v-8daa1a0e":()=>J(()=>import("./index.html.0be935a4.js"),[]).then(({data:e})=>e),"v-67f865c9":()=>J(()=>import("./community.html.c8c320d5.js"),[]).then(({data:e})=>e),"v-39072b1a":()=>J(()=>import("./contribute.html.c182be00.js"),[]).then(({data:e})=>e),"v-0c525774":()=>J(()=>import("./v1.1.0-rc.html.4be20950.js"),[]).then(({data:e})=>e),"v-1a2ad06e":()=>J(()=>import("./getting-started.html.7e654f7f.js"),[]).then(({data:e})=>e),"v-5b69fa59":()=>J(()=>import("./oca-browser.html.23c0003d.js"),[]).then(({data:e})=>e),"v-12ca5e22":()=>J(()=>import("./oca-bundle.html.9f7247d9.js"),[]).then(({data:e})=>e),"v-2327417c":()=>J(()=>import("./oca-data-vault.html.8bcb5cfa.js"),[]).then(({data:e})=>e),"v-35180e35":()=>J(()=>import("./oca-file.html.6b0b48e0.js"),[]).then(({data:e})=>e),"v-10867f72":()=>J(()=>import("./oca-parser.html.9a708d47.js"),[]).then(({data:e})=>e),"v-11796e4e":()=>J(()=>import("./oca-presenter.html.4aca7ec3.js"),[]).then(({data:e})=>e),"v-38173727":()=>J(()=>import("./oca-repository.html.060cee0a.js"),[]).then(({data:e})=>e),"v-73b65308":()=>J(()=>import("./oca-transformer.html.0a6ff5ac.js"),[]).then(({data:e})=>e),"v-65ea5a6f":()=>J(()=>import("./oca-validator.html.896f6695.js"),[]).then(({data:e})=>e),"v-093dab99":()=>J(()=>import("./tour.html.4cd67885.js"),[]).then(({data:e})=>e),"v-b038aa76":()=>J(()=>import("./index.html.c08fa903.js"),[]).then(({data:e})=>e),"v-37e1c06f":()=>J(()=>import("./faq.html.4cbc8522.js"),[]).then(({data:e})=>e),"v-1c7b2593":()=>J(()=>import("./introduction.html.06e57d04.js"),[]).then(({data:e})=>e),"v-28942eea":()=>J(()=>import("./oca-vs-others-comparison.html.432b158d.js"),[]).then(({data:e})=>e),"v-7e593ce5":()=>J(()=>import("./references.html.e76e6324.js"),[]).then(({data:e})=>e),"v-d8f2b400":()=>J(()=>import("./index.html.a718e17a.js"),[]).then(({data:e})=>e),"v-4753f562":()=>J(()=>import("./swiss-passport-example.html.80ef1437.js"),[]).then(({data:e})=>e),"v-3706649a":()=>J(()=>import("./404.html.7d858b3d.js"),[]).then(({data:e})=>e)};function Br(e,t){const n=Object.create(null),r=e.split(",");for(let o=0;o!!n[o.toLowerCase()]:o=>!!n[o]}const ys="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",ws=Br(ys);function Pi(e){return!!e||e===""}function Yn(e){if(G(e)){const t={};for(let n=0;n{if(n){const r=n.split(xs);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function wn(e){let t="";if(he(e))t=e;else if(G(e))for(let n=0;nhe(e)?e:e==null?"":G(e)||_e(e)&&(e.toString===Ii||!ee(e.toString))?JSON.stringify(e,Ri,2):String(e),Ri=(e,t)=>t&&t.__v_isRef?Ri(e,t.value):$t(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o])=>(n[`${r} =>`]=o,n),{})}:Si(t)?{[`Set(${t.size})`]:[...t.values()]}:_e(t)&&!G(t)&&!zi(t)?String(t):t,pe={},Ft=[],Ye=()=>{},Cs=()=>!1,As=/^on[^a-z]/,_n=e=>As.test(e),Vr=e=>e.startsWith("onUpdate:"),Ce=Object.assign,Ur=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Ts=Object.prototype.hasOwnProperty,oe=(e,t)=>Ts.call(e,t),G=Array.isArray,$t=e=>Jn(e)==="[object Map]",Si=e=>Jn(e)==="[object Set]",ee=e=>typeof e=="function",he=e=>typeof e=="string",qr=e=>typeof e=="symbol",_e=e=>e!==null&&typeof e=="object",Li=e=>_e(e)&&ee(e.then)&&ee(e.catch),Ii=Object.prototype.toString,Jn=e=>Ii.call(e),Os=e=>Jn(e).slice(8,-1),zi=e=>Jn(e)==="[object Object]",Kr=e=>he(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,an=Br(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Gn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Ps=/-(\w)/g,Qe=Gn(e=>e.replace(Ps,(t,n)=>n?n.toUpperCase():"")),Rs=/\B([A-Z])/g,St=Gn(e=>e.replace(Rs,"-$1").toLowerCase()),Qn=Gn(e=>e.charAt(0).toUpperCase()+e.slice(1)),sr=Gn(e=>e?`on${Qn(e)}`:""),pn=(e,t)=>!Object.is(e,t),lr=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Mi=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Eo;const Ss=()=>Eo||(Eo=typeof globalThis!="undefined"?globalThis:typeof self!="undefined"?self:typeof window!="undefined"?window:typeof global!="undefined"?global:{});let Me;class Ls{constructor(t=!1){this.active=!0,this.effects=[],this.cleanups=[],!t&&Me&&(this.parent=Me,this.index=(Me.scopes||(Me.scopes=[])).push(this)-1)}run(t){if(this.active){const n=Me;try{return Me=this,t()}finally{Me=n}}}on(){Me=this}off(){Me=this.parent}stop(t){if(this.active){let n,r;for(n=0,r=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},Di=e=>(e.w&mt)>0,Ni=e=>(e.n&mt)>0,Ds=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r{(c==="length"||c>=r)&&s.push(l)});else switch(n!==void 0&&s.push(a.get(n)),t){case"add":G(e)?Kr(n)&&s.push(a.get("length")):(s.push(a.get(Tt)),$t(e)&&s.push(a.get(kr)));break;case"delete":G(e)||(s.push(a.get(Tt)),$t(e)&&s.push(a.get(kr)));break;case"set":$t(e)&&s.push(a.get(Tt));break}if(s.length===1)s[0]&&Cr(s[0]);else{const l=[];for(const c of s)c&&l.push(...c);Cr(Wr(l))}}function Cr(e,t){const n=G(e)?e:[...e];for(const r of n)r.computed&&Co(r);for(const r of n)r.computed||Co(r)}function Co(e,t){(e!==Ke||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const Hs=Br("__proto__,__v_isRef,__isVue"),$i=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(qr)),Fs=Jr(),$s=Jr(!1,!0),js=Jr(!0),Ao=Bs();function Bs(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=se(this);for(let i=0,a=this.length;i{e[t]=function(...n){Wt();const r=se(this)[t].apply(this,n);return Yt(),r}}),e}function Jr(e=!1,t=!1){return function(r,o,i){if(o==="__v_isReactive")return!e;if(o==="__v_isReadonly")return e;if(o==="__v_isShallow")return t;if(o==="__v_raw"&&i===(e?t?ol:qi:t?Ui:Vi).get(r))return r;const a=G(r);if(!e&&a&&oe(Ao,o))return Reflect.get(Ao,o,i);const s=Reflect.get(r,o,i);return(qr(o)?$i.has(o):Hs(o))||(e||He(r,"get",o),t)?s:ke(s)?a&&Kr(o)?s:s.value:_e(s)?e?Zr(s):Jt(s):s}}const Vs=ji(),Us=ji(!0);function ji(e=!1){return function(n,r,o,i){let a=n[r];if(hn(a)&&ke(a)&&!ke(o))return!1;if(!e&&!hn(o)&&(Ar(o)||(o=se(o),a=se(a)),!G(n)&&ke(a)&&!ke(o)))return a.value=o,!0;const s=G(n)&&Kr(r)?Number(r)e,Zn=e=>Reflect.getPrototypeOf(e);function An(e,t,n=!1,r=!1){e=e.__v_raw;const o=se(e),i=se(t);n||(t!==i&&He(o,"get",t),He(o,"get",i));const{has:a}=Zn(o),s=r?Gr:n?eo:mn;if(a.call(o,t))return s(e.get(t));if(a.call(o,i))return s(e.get(i));e!==o&&e.get(t)}function Tn(e,t=!1){const n=this.__v_raw,r=se(n),o=se(e);return t||(e!==o&&He(r,"has",e),He(r,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function On(e,t=!1){return e=e.__v_raw,!t&&He(se(e),"iterate",Tt),Reflect.get(e,"size",e)}function To(e){e=se(e);const t=se(this);return Zn(t).has.call(t,e)||(t.add(e),nt(t,"add",e,e)),this}function Oo(e,t){t=se(t);const n=se(this),{has:r,get:o}=Zn(n);let i=r.call(n,e);i||(e=se(e),i=r.call(n,e));const a=o.call(n,e);return n.set(e,t),i?pn(t,a)&&nt(n,"set",e,t):nt(n,"add",e,t),this}function Po(e){const t=se(this),{has:n,get:r}=Zn(t);let o=n.call(t,e);o||(e=se(e),o=n.call(t,e)),r&&r.call(t,e);const i=t.delete(e);return o&&nt(t,"delete",e,void 0),i}function Ro(){const e=se(this),t=e.size!==0,n=e.clear();return t&&nt(e,"clear",void 0,void 0),n}function Pn(e,t){return function(r,o){const i=this,a=i.__v_raw,s=se(a),l=t?Gr:e?eo:mn;return!e&&He(s,"iterate",Tt),a.forEach((c,d)=>r.call(o,l(c),l(d),i))}}function Rn(e,t,n){return function(...r){const o=this.__v_raw,i=se(o),a=$t(i),s=e==="entries"||e===Symbol.iterator&&a,l=e==="keys"&&a,c=o[e](...r),d=n?Gr:t?eo:mn;return!t&&He(i,"iterate",l?kr:Tt),{next(){const{value:h,done:f}=c.next();return f?{value:h,done:f}:{value:s?[d(h[0]),d(h[1])]:d(h),done:f}},[Symbol.iterator](){return this}}}}function ot(e){return function(...t){return e==="delete"?!1:this}}function Gs(){const e={get(i){return An(this,i)},get size(){return On(this)},has:Tn,add:To,set:Oo,delete:Po,clear:Ro,forEach:Pn(!1,!1)},t={get(i){return An(this,i,!1,!0)},get size(){return On(this)},has:Tn,add:To,set:Oo,delete:Po,clear:Ro,forEach:Pn(!1,!0)},n={get(i){return An(this,i,!0)},get size(){return On(this,!0)},has(i){return Tn.call(this,i,!0)},add:ot("add"),set:ot("set"),delete:ot("delete"),clear:ot("clear"),forEach:Pn(!0,!1)},r={get(i){return An(this,i,!0,!0)},get size(){return On(this,!0)},has(i){return Tn.call(this,i,!0)},add:ot("add"),set:ot("set"),delete:ot("delete"),clear:ot("clear"),forEach:Pn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=Rn(i,!1,!1),n[i]=Rn(i,!0,!1),t[i]=Rn(i,!1,!0),r[i]=Rn(i,!0,!0)}),[e,n,t,r]}const[Qs,Zs,Xs,el]=Gs();function Qr(e,t){const n=t?e?el:Xs:e?Zs:Qs;return(r,o,i)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?r:Reflect.get(oe(n,o)&&o in r?n:r,o,i)}const tl={get:Qr(!1,!1)},nl={get:Qr(!1,!0)},rl={get:Qr(!0,!1)},Vi=new WeakMap,Ui=new WeakMap,qi=new WeakMap,ol=new WeakMap;function il(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function al(e){return e.__v_skip||!Object.isExtensible(e)?0:il(Os(e))}function Jt(e){return hn(e)?e:Xr(e,!1,Bi,tl,Vi)}function sl(e){return Xr(e,!1,Js,nl,Ui)}function Zr(e){return Xr(e,!0,Ys,rl,qi)}function Xr(e,t,n,r,o){if(!_e(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=o.get(e);if(i)return i;const a=al(e);if(a===0)return e;const s=new Proxy(e,a===2?r:n);return o.set(e,s),s}function jt(e){return hn(e)?jt(e.__v_raw):!!(e&&e.__v_isReactive)}function hn(e){return!!(e&&e.__v_isReadonly)}function Ar(e){return!!(e&&e.__v_isShallow)}function Ki(e){return jt(e)||hn(e)}function se(e){const t=e&&e.__v_raw;return t?se(t):e}function Wi(e){return Nn(e,"__v_skip",!0),e}const mn=e=>_e(e)?Jt(e):e,eo=e=>_e(e)?Zr(e):e;function Yi(e){pt&&Ke&&(e=se(e),Fi(e.dep||(e.dep=Wr())))}function Ji(e,t){e=se(e),e.dep&&Cr(e.dep)}function ke(e){return!!(e&&e.__v_isRef===!0)}function Te(e){return Qi(e,!1)}function Gi(e){return Qi(e,!0)}function Qi(e,t){return ke(e)?e:new ll(e,t)}class ll{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:se(t),this._value=n?t:mn(t)}get value(){return Yi(this),this._value}set value(t){t=this.__v_isShallow?t:se(t),pn(t,this._rawValue)&&(this._rawValue=t,this._value=this.__v_isShallow?t:mn(t),Ji(this))}}function Ot(e){return ke(e)?e.value:e}const cl={get:(e,t,n)=>Ot(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return ke(o)&&!ke(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function Zi(e){return jt(e)?e:new Proxy(e,cl)}function Yf(e){const t=G(e)?new Array(e.length):{};for(const n in e)t[n]=dl(e,n);return t}class ul{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}}function dl(e,t,n){const r=e[t];return ke(r)?r:new ul(e,t,n)}class fl{constructor(t,n,r,o){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this._dirty=!0,this.effect=new Yr(t,()=>{this._dirty||(this._dirty=!0,Ji(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=r}get value(){const t=se(this);return Yi(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function pl(e,t,n=!1){let r,o;const i=ee(e);return i?(r=e,o=Ye):(r=e.get,o=e.set),new fl(r,o,i||!o,n)}function ht(e,t,n,r){let o;try{o=r?e(...r):e()}catch(i){xn(i,t,n)}return o}function Be(e,t,n,r){if(ee(e)){const i=ht(e,t,n,r);return i&&Li(i)&&i.catch(a=>{xn(a,t,n)}),i}const o=[];for(let i=0;i>>1;gn(De[r])Xe&&De.splice(t,1)}function ta(e,t,n,r){G(e)?n.push(...e):(!t||!t.includes(e,e.allowRecurse?r+1:r))&&n.push(e),ea()}function vl(e){ta(e,on,sn,Dt)}function bl(e){ta(e,ct,ln,Nt)}function Xn(e,t=null){if(sn.length){for(Or=t,on=[...new Set(sn)],sn.length=0,Dt=0;Dtgn(n)-gn(r)),Nt=0;Nte.id==null?1/0:e.id;function na(e){Tr=!1,Hn=!0,Xn(e),De.sort((n,r)=>gn(n)-gn(r));const t=Ye;try{for(Xe=0;Xeb.trim())),h&&(o=n.map(Mi))}let s,l=r[s=sr(t)]||r[s=sr(Qe(t))];!l&&i&&(l=r[s=sr(St(t))]),l&&Be(l,e,6,o);const c=r[s+"Once"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[s])return;e.emitted[s]=!0,Be(c,e,6,o)}}function ra(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const i=e.emits;let a={},s=!1;if(!ee(e)){const l=c=>{const d=ra(c,t,!0);d&&(s=!0,Ce(a,d))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!i&&!s?(r.set(e,null),null):(G(i)?i.forEach(l=>a[l]=null):Ce(a,i),r.set(e,a),a)}function er(e,t){return!e||!_n(t)?!1:(t=t.slice(2).replace(/Once$/,""),oe(e,t[0].toLowerCase()+t.slice(1))||oe(e,St(t))||oe(e,t))}let Ae=null,oa=null;function $n(e){const t=Ae;return Ae=e,oa=e&&e.type.__scopeId||null,t}function wl(e,t=Ae,n){if(!t||e._n)return e;const r=(...o)=>{r._d&&jo(-1);const i=$n(t),a=e(...o);return $n(i),r._d&&jo(1),a};return r._n=!0,r._c=!0,r._d=!0,r}function cr(e){const{type:t,vnode:n,proxy:r,withProxy:o,props:i,propsOptions:[a],slots:s,attrs:l,emit:c,render:d,renderCache:h,data:f,setupState:b,ctx:w,inheritAttrs:I}=e;let T,g;const y=$n(e);try{if(n.shapeFlag&4){const D=o||r;T=qe(d.call(D,D,h,i,b,f,w)),g=l}else{const D=t;T=qe(D.length>1?D(i,{attrs:l,slots:s,emit:c}):D(i,null)),g=t.props?l:_l(l)}}catch(D){un.length=0,xn(D,e,1),T=ye(Ne)}let P=T;if(g&&I!==!1){const D=Object.keys(g),{shapeFlag:U}=P;D.length&&U&7&&(a&&D.some(Vr)&&(g=xl(g,a)),P=gt(P,g))}return n.dirs&&(P=gt(P),P.dirs=P.dirs?P.dirs.concat(n.dirs):n.dirs),n.transition&&(P.transition=n.transition),T=P,$n(y),T}const _l=e=>{let t;for(const n in e)(n==="class"||n==="style"||_n(n))&&((t||(t={}))[n]=e[n]);return t},xl=(e,t)=>{const n={};for(const r in e)(!Vr(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function El(e,t,n){const{props:r,children:o,component:i}=e,{props:a,children:s,patchFlag:l}=t,c=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?So(r,a,c):!!a;if(l&8){const d=t.dynamicProps;for(let h=0;he.__isSuspense;function ia(e,t){t&&t.pendingBranch?G(e)?t.effects.push(...e):t.effects.push(e):bl(e)}function Pt(e,t){if(xe){let n=xe.provides;const r=xe.parent&&xe.parent.provides;r===n&&(n=xe.provides=Object.create(r)),n[e]=t}}function Ee(e,t,n=!1){const r=xe||Ae;if(r){const o=r.parent==null?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides;if(o&&e in o)return o[e];if(arguments.length>1)return n&&ee(t)?t.call(r.proxy):t}}const Lo={};function tt(e,t,n){return aa(e,t,n)}function aa(e,t,{immediate:n,deep:r,flush:o,onTrack:i,onTrigger:a}=pe){const s=xe;let l,c=!1,d=!1;if(ke(e)?(l=()=>e.value,c=Ar(e)):jt(e)?(l=()=>e,r=!0):G(e)?(d=!0,c=e.some(g=>jt(g)||Ar(g)),l=()=>e.map(g=>{if(ke(g))return g.value;if(jt(g))return At(g);if(ee(g))return ht(g,s,2)})):ee(e)?t?l=()=>ht(e,s,2):l=()=>{if(!(s&&s.isUnmounted))return h&&h(),Be(e,s,3,[f])}:l=Ye,t&&r){const g=l;l=()=>At(g())}let h,f=g=>{h=T.onStop=()=>{ht(g,s,4)}};if(Ut)return f=Ye,t?n&&Be(t,s,3,[l(),d?[]:void 0,f]):l(),Ye;let b=d?[]:Lo;const w=()=>{if(!!T.active)if(t){const g=T.run();(r||c||(d?g.some((y,P)=>pn(y,b[P])):pn(g,b)))&&(h&&h(),Be(t,s,3,[g,b===Lo?void 0:b,f]),b=g)}else T.run()};w.allowRecurse=!!t;let I;o==="sync"?I=w:o==="post"?I=()=>Se(w,s&&s.suspense):I=()=>vl(w);const T=new Yr(l,I);return t?n?w():b=T.run():o==="post"?Se(T.run.bind(T),s&&s.suspense):T.run(),()=>{T.stop(),s&&s.scope&&Ur(s.scope.effects,T)}}function Al(e,t,n){const r=this.proxy,o=he(e)?e.includes(".")?sa(r,e):()=>r[e]:e.bind(r,r);let i;ee(t)?i=t:(i=t.handler,n=t);const a=xe;Vt(this);const s=aa(o,i.bind(r),n);return a?Vt(a):Rt(),s}function sa(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;o{At(n,t)});else if(zi(e))for(const n in e)At(e[n],t);return e}function Tl(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return vt(()=>{e.isMounted=!0}),oo(()=>{e.isUnmounting=!0}),e}const $e=[Function,Array],Ol={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:$e,onEnter:$e,onAfterEnter:$e,onEnterCancelled:$e,onBeforeLeave:$e,onLeave:$e,onAfterLeave:$e,onLeaveCancelled:$e,onBeforeAppear:$e,onAppear:$e,onAfterAppear:$e,onAppearCancelled:$e},setup(e,{slots:t}){const n=Ra(),r=Tl();let o;return()=>{const i=t.default&&ua(t.default(),!0);if(!i||!i.length)return;let a=i[0];if(i.length>1){for(const I of i)if(I.type!==Ne){a=I;break}}const s=se(e),{mode:l}=s;if(r.isLeaving)return ur(a);const c=Io(a);if(!c)return ur(a);const d=Pr(c,s,r,n);Rr(c,d);const h=n.subTree,f=h&&Io(h);let b=!1;const{getTransitionKey:w}=c.type;if(w){const I=w();o===void 0?o=I:I!==o&&(o=I,b=!0)}if(f&&f.type!==Ne&&(!kt(c,f)||b)){const I=Pr(f,s,r,n);if(Rr(f,I),l==="out-in")return r.isLeaving=!0,I.afterLeave=()=>{r.isLeaving=!1,n.update()},ur(a);l==="in-out"&&c.type!==Ne&&(I.delayLeave=(T,g,y)=>{const P=ca(r,f);P[String(f.key)]=f,T._leaveCb=()=>{g(),T._leaveCb=void 0,delete d.delayedLeave},d.delayedLeave=y})}return a}}},la=Ol;function ca(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function Pr(e,t,n,r){const{appear:o,mode:i,persisted:a=!1,onBeforeEnter:s,onEnter:l,onAfterEnter:c,onEnterCancelled:d,onBeforeLeave:h,onLeave:f,onAfterLeave:b,onLeaveCancelled:w,onBeforeAppear:I,onAppear:T,onAfterAppear:g,onAppearCancelled:y}=t,P=String(e.key),D=ca(n,e),U=(m,Y)=>{m&&Be(m,r,9,Y)},$=(m,Y)=>{const F=Y[1];U(m,Y),G(m)?m.every(q=>q.length<=1)&&F():m.length<=1&&F()},M={mode:i,persisted:a,beforeEnter(m){let Y=s;if(!n.isMounted)if(o)Y=I||s;else return;m._leaveCb&&m._leaveCb(!0);const F=D[P];F&&kt(e,F)&&F.el._leaveCb&&F.el._leaveCb(),U(Y,[m])},enter(m){let Y=l,F=c,q=d;if(!n.isMounted)if(o)Y=T||l,F=g||c,q=y||d;else return;let _=!1;const z=m._enterCb=R=>{_||(_=!0,R?U(q,[m]):U(F,[m]),M.delayedLeave&&M.delayedLeave(),m._enterCb=void 0)};Y?$(Y,[m,z]):z()},leave(m,Y){const F=String(e.key);if(m._enterCb&&m._enterCb(!0),n.isUnmounting)return Y();U(h,[m]);let q=!1;const _=m._leaveCb=z=>{q||(q=!0,Y(),z?U(w,[m]):U(b,[m]),m._leaveCb=void 0,D[F]===e&&delete D[F])};D[F]=e,f?$(f,[m,_]):_()},clone(m){return Pr(m,t,n,r)}};return M}function ur(e){if(En(e))return e=gt(e),e.children=null,e}function Io(e){return En(e)?e.children?e.children[0]:void 0:e}function Rr(e,t){e.shapeFlag&6&&e.component?Rr(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function ua(e,t=!1,n){let r=[],o=0;for(let i=0;i1)for(let i=0;i!!e.type.__asyncLoader;function ge(e){ee(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,timeout:i,suspensible:a=!0,onError:s}=e;let l=null,c,d=0;const h=()=>(d++,l=null,f()),f=()=>{let b;return l||(b=l=t().catch(w=>{if(w=w instanceof Error?w:new Error(String(w)),s)return new Promise((I,T)=>{s(w,()=>I(h()),()=>T(w),d+1)});throw w}).then(w=>b!==l&&l?l:(w&&(w.__esModule||w[Symbol.toStringTag]==="Module")&&(w=w.default),c=w,w)))};return Ve({name:"AsyncComponentWrapper",__asyncLoader:f,get __asyncResolved(){return c},setup(){const b=xe;if(c)return()=>dr(c,b);const w=y=>{l=null,xn(y,b,13,!r)};if(a&&b.suspense||Ut)return f().then(y=>()=>dr(y,b)).catch(y=>(w(y),()=>r?ye(r,{error:y}):null));const I=Te(!1),T=Te(),g=Te(!!o);return o&&setTimeout(()=>{g.value=!1},o),i!=null&&setTimeout(()=>{if(!I.value&&!T.value){const y=new Error(`Async component timed out after ${i}ms.`);w(y),T.value=y}},i),f().then(()=>{I.value=!0,b.parent&&En(b.parent.vnode)&&ro(b.parent.update)}).catch(y=>{w(y),T.value=y}),()=>{if(I.value&&c)return dr(c,b);if(T.value&&r)return ye(r,{error:T.value});if(n&&!g.value)return ye(n)}}})}function dr(e,{vnode:{ref:t,props:n,children:r,shapeFlag:o},parent:i}){const a=ye(e,n,r);return a.ref=t,a}const En=e=>e.type.__isKeepAlive;function Pl(e,t){da(e,"a",t)}function Rl(e,t){da(e,"da",t)}function da(e,t,n=xe){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(tr(t,r,n),n){let o=n.parent;for(;o&&o.parent;)En(o.parent.vnode)&&Sl(r,t,n,o),o=o.parent}}function Sl(e,t,n,r){const o=tr(t,e,r,!0);io(()=>{Ur(r[t],o)},n)}function tr(e,t,n=xe,r=!1){if(n){const o=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...a)=>{if(n.isUnmounted)return;Wt(),Vt(n);const s=Be(t,n,e,a);return Rt(),Yt(),s});return r?o.unshift(i):o.push(i),i}}const rt=e=>(t,n=xe)=>(!Ut||e==="sp")&&tr(e,t,n),fa=rt("bm"),vt=rt("m"),Ll=rt("bu"),Il=rt("u"),oo=rt("bum"),io=rt("um"),zl=rt("sp"),Ml=rt("rtg"),Dl=rt("rtc");function Nl(e,t=xe){tr("ec",e,t)}function Jf(e,t){const n=Ae;if(n===null)return e;const r=or(n)||n.proxy,o=e.dirs||(e.dirs=[]);for(let i=0;it(a,s,void 0,i&&i[s]));else{const a=Object.keys(e);o=new Array(a.length);for(let s=0,l=a.length;sUn(t)?!(t.type===Ne||t.type===Le&&!ma(t.children)):!0)?e:null}const Sr=e=>e?Sa(e)?or(e)||e.proxy:Sr(e.parent):null,jn=Ce(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Sr(e.parent),$root:e=>Sr(e.root),$emit:e=>e.emit,$options:e=>va(e),$forceUpdate:e=>e.f||(e.f=()=>ro(e.update)),$nextTick:e=>e.n||(e.n=no.bind(e.proxy)),$watch:e=>Al.bind(e)}),jl={get({_:e},t){const{ctx:n,setupState:r,data:o,props:i,accessCache:a,type:s,appContext:l}=e;let c;if(t[0]!=="$"){const b=a[t];if(b!==void 0)switch(b){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return i[t]}else{if(r!==pe&&oe(r,t))return a[t]=1,r[t];if(o!==pe&&oe(o,t))return a[t]=2,o[t];if((c=e.propsOptions[0])&&oe(c,t))return a[t]=3,i[t];if(n!==pe&&oe(n,t))return a[t]=4,n[t];Lr&&(a[t]=0)}}const d=jn[t];let h,f;if(d)return t==="$attrs"&&He(e,"get",t),d(e);if((h=s.__cssModules)&&(h=h[t]))return h;if(n!==pe&&oe(n,t))return a[t]=4,n[t];if(f=l.config.globalProperties,oe(f,t))return f[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:i}=e;return o!==pe&&oe(o,t)?(o[t]=n,!0):r!==pe&&oe(r,t)?(r[t]=n,!0):oe(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:i}},a){let s;return!!n[a]||e!==pe&&oe(e,a)||t!==pe&&oe(t,a)||(s=i[0])&&oe(s,a)||oe(r,a)||oe(jn,a)||oe(o.config.globalProperties,a)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:oe(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};let Lr=!0;function Bl(e){const t=va(e),n=e.proxy,r=e.ctx;Lr=!1,t.beforeCreate&&Mo(t.beforeCreate,e,"bc");const{data:o,computed:i,methods:a,watch:s,provide:l,inject:c,created:d,beforeMount:h,mounted:f,beforeUpdate:b,updated:w,activated:I,deactivated:T,beforeDestroy:g,beforeUnmount:y,destroyed:P,unmounted:D,render:U,renderTracked:$,renderTriggered:M,errorCaptured:m,serverPrefetch:Y,expose:F,inheritAttrs:q,components:_,directives:z,filters:R}=t;if(c&&Vl(c,r,null,e.appContext.config.unwrapInjectedRef),a)for(const X in a){const ne=a[X];ee(ne)&&(r[X]=ne.bind(n))}if(o){const X=o.call(n,n);_e(X)&&(e.data=Jt(X))}if(Lr=!0,i)for(const X in i){const ne=i[X],we=ee(ne)?ne.bind(n,n):ee(ne.get)?ne.get.bind(n,n):Ye,Oe=!ee(ne)&&ee(ne.set)?ne.set.bind(n):Ye,Ie=ve({get:we,set:Oe});Object.defineProperty(r,X,{enumerable:!0,configurable:!0,get:()=>Ie.value,set:Fe=>Ie.value=Fe})}if(s)for(const X in s)ga(s[X],r,n,X);if(l){const X=ee(l)?l.call(n):l;Reflect.ownKeys(X).forEach(ne=>{Pt(ne,X[ne])})}d&&Mo(d,e,"c");function H(X,ne){G(ne)?ne.forEach(we=>X(we.bind(n))):ne&&X(ne.bind(n))}if(H(fa,h),H(vt,f),H(Ll,b),H(Il,w),H(Pl,I),H(Rl,T),H(Nl,m),H(Dl,$),H(Ml,M),H(oo,y),H(io,D),H(zl,Y),G(F))if(F.length){const X=e.exposed||(e.exposed={});F.forEach(ne=>{Object.defineProperty(X,ne,{get:()=>n[ne],set:we=>n[ne]=we})})}else e.exposed||(e.exposed={});U&&e.render===Ye&&(e.render=U),q!=null&&(e.inheritAttrs=q),_&&(e.components=_),z&&(e.directives=z)}function Vl(e,t,n=Ye,r=!1){G(e)&&(e=Ir(e));for(const o in e){const i=e[o];let a;_e(i)?"default"in i?a=Ee(i.from||o,i.default,!0):a=Ee(i.from||o):a=Ee(i),ke(a)&&r?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>a.value,set:s=>a.value=s}):t[o]=a}}function Mo(e,t,n){Be(G(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function ga(e,t,n,r){const o=r.includes(".")?sa(n,r):()=>n[r];if(he(e)){const i=t[e];ee(i)&&tt(o,i)}else if(ee(e))tt(o,e.bind(n));else if(_e(e))if(G(e))e.forEach(i=>ga(i,t,n,r));else{const i=ee(e.handler)?e.handler.bind(n):t[e.handler];ee(i)&&tt(o,i,e)}}function va(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:a}}=e.appContext,s=i.get(t);let l;return s?l=s:!o.length&&!n&&!r?l=t:(l={},o.length&&o.forEach(c=>Bn(l,c,a,!0)),Bn(l,t,a)),i.set(t,l),l}function Bn(e,t,n,r=!1){const{mixins:o,extends:i}=t;i&&Bn(e,i,n,!0),o&&o.forEach(a=>Bn(e,a,n,!0));for(const a in t)if(!(r&&a==="expose")){const s=Ul[a]||n&&n[a];e[a]=s?s(e[a],t[a]):t[a]}return e}const Ul={data:Do,props:_t,emits:_t,methods:_t,computed:_t,beforeCreate:Pe,created:Pe,beforeMount:Pe,mounted:Pe,beforeUpdate:Pe,updated:Pe,beforeDestroy:Pe,beforeUnmount:Pe,destroyed:Pe,unmounted:Pe,activated:Pe,deactivated:Pe,errorCaptured:Pe,serverPrefetch:Pe,components:_t,directives:_t,watch:Kl,provide:Do,inject:ql};function Do(e,t){return t?e?function(){return Ce(ee(e)?e.call(this,this):e,ee(t)?t.call(this,this):t)}:t:e}function ql(e,t){return _t(Ir(e),Ir(t))}function Ir(e){if(G(e)){const t={};for(let n=0;n0)&&!(a&16)){if(a&8){const d=e.vnode.dynamicProps;for(let h=0;h{l=!0;const[f,b]=ya(h,t,!0);Ce(a,f),b&&s.push(...b)};!n&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!i&&!l)return r.set(e,Ft),Ft;if(G(i))for(let d=0;d-1,b[1]=I<0||w-1||oe(b,"default"))&&s.push(h)}}}const c=[a,s];return r.set(e,c),c}function No(e){return e[0]!=="$"}function Ho(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:e===null?"null":""}function Fo(e,t){return Ho(e)===Ho(t)}function $o(e,t){return G(t)?t.findIndex(n=>Fo(n,e)):ee(t)&&Fo(t,e)?0:-1}const wa=e=>e[0]==="_"||e==="$stable",ao=e=>G(e)?e.map(qe):[qe(e)],Jl=(e,t,n)=>{if(t._n)return t;const r=wl((...o)=>ao(t(...o)),n);return r._c=!1,r},_a=(e,t,n)=>{const r=e._ctx;for(const o in e){if(wa(o))continue;const i=e[o];if(ee(i))t[o]=Jl(o,i,r);else if(i!=null){const a=ao(i);t[o]=()=>a}}},xa=(e,t)=>{const n=ao(t);e.slots.default=()=>n},Gl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=se(t),Nn(t,"_",n)):_a(t,e.slots={})}else e.slots={},t&&xa(e,t);Nn(e.slots,rr,1)},Ql=(e,t,n)=>{const{vnode:r,slots:o}=e;let i=!0,a=pe;if(r.shapeFlag&32){const s=t._;s?n&&s===1?i=!1:(Ce(o,t),!n&&s===1&&delete o._):(i=!t.$stable,_a(t,o)),a=t}else t&&(xa(e,t),a={default:1});if(i)for(const s in o)!wa(s)&&!(s in a)&&delete o[s]};function Ea(){return{app:null,config:{isNativeTag:Cs,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Zl=0;function Xl(e,t){return function(r,o=null){ee(r)||(r=Object.assign({},r)),o!=null&&!_e(o)&&(o=null);const i=Ea(),a=new Set;let s=!1;const l=i.app={_uid:Zl++,_component:r,_props:o,_container:null,_context:i,_instance:null,version:bc,get config(){return i.config},set config(c){},use(c,...d){return a.has(c)||(c&&ee(c.install)?(a.add(c),c.install(l,...d)):ee(c)&&(a.add(c),c(l,...d))),l},mixin(c){return i.mixins.includes(c)||i.mixins.push(c),l},component(c,d){return d?(i.components[c]=d,l):i.components[c]},directive(c,d){return d?(i.directives[c]=d,l):i.directives[c]},mount(c,d,h){if(!s){const f=ye(r,o);return f.appContext=i,d&&t?t(f,c):e(f,c,h),s=!0,l._container=c,c.__vue_app__=l,or(f.component)||f.component.proxy}},unmount(){s&&(e(null,l._container),delete l._container.__vue_app__)},provide(c,d){return i.provides[c]=d,l}};return l}}function Vn(e,t,n,r,o=!1){if(G(e)){e.forEach((f,b)=>Vn(f,t&&(G(t)?t[b]:t),n,r,o));return}if(Bt(r)&&!o)return;const i=r.shapeFlag&4?or(r.component)||r.component.proxy:r.el,a=o?null:i,{i:s,r:l}=e,c=t&&t.r,d=s.refs===pe?s.refs={}:s.refs,h=s.setupState;if(c!=null&&c!==l&&(he(c)?(d[c]=null,oe(h,c)&&(h[c]=null)):ke(c)&&(c.value=null)),ee(l))ht(l,s,12,[a,d]);else{const f=he(l),b=ke(l);if(f||b){const w=()=>{if(e.f){const I=f?d[l]:l.value;o?G(I)&&Ur(I,i):G(I)?I.includes(i)||I.push(i):f?(d[l]=[i],oe(h,l)&&(h[l]=d[l])):(l.value=[i],e.k&&(d[e.k]=l.value))}else f?(d[l]=a,oe(h,l)&&(h[l]=a)):b&&(l.value=a,e.k&&(d[e.k]=a))};a?(w.id=-1,Se(w,n)):w()}}}let it=!1;const Sn=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",Ln=e=>e.nodeType===8;function ec(e){const{mt:t,p:n,o:{patchProp:r,createText:o,nextSibling:i,parentNode:a,remove:s,insert:l,createComment:c}}=e,d=(g,y)=>{if(!y.hasChildNodes()){n(null,g,y),Fn(),y._vnode=g;return}it=!1,h(y.firstChild,g,null,null,null),Fn(),y._vnode=g,it&&console.error("Hydration completed but contains mismatches.")},h=(g,y,P,D,U,$=!1)=>{const M=Ln(g)&&g.data==="[",m=()=>I(g,y,P,D,U,M),{type:Y,ref:F,shapeFlag:q,patchFlag:_}=y,z=g.nodeType;y.el=g,_===-2&&($=!1,y.dynamicChildren=null);let R=null;switch(Y){case vn:z!==3?y.children===""?(l(y.el=o(""),a(g),g),R=g):R=m():(g.data!==y.children&&(it=!0,g.data=y.children),R=i(g));break;case Ne:z!==8||M?R=m():R=i(g);break;case cn:if(z!==1&&z!==3)R=m();else{R=g;const re=!y.children.length;for(let H=0;H{$=$||!!y.dynamicChildren;const{type:M,props:m,patchFlag:Y,shapeFlag:F,dirs:q}=y,_=M==="input"&&q||M==="option";if(_||Y!==-1){if(q&&Ge(y,null,P,"created"),m)if(_||!$||Y&48)for(const R in m)(_&&R.endsWith("value")||_n(R)&&!an(R))&&r(g,R,null,m[R],!1,void 0,P);else m.onClick&&r(g,"onClick",null,m.onClick,!1,void 0,P);let z;if((z=m&&m.onVnodeBeforeMount)&&je(z,P,y),q&&Ge(y,null,P,"beforeMount"),((z=m&&m.onVnodeMounted)||q)&&ia(()=>{z&&je(z,P,y),q&&Ge(y,null,P,"mounted")},D),F&16&&!(m&&(m.innerHTML||m.textContent))){let R=b(g.firstChild,y,g,P,D,U,$);for(;R;){it=!0;const re=R;R=R.nextSibling,s(re)}}else F&8&&g.textContent!==y.children&&(it=!0,g.textContent=y.children)}return g.nextSibling},b=(g,y,P,D,U,$,M)=>{M=M||!!y.dynamicChildren;const m=y.children,Y=m.length;for(let F=0;F{const{slotScopeIds:M}=y;M&&(U=U?U.concat(M):M);const m=a(g),Y=b(i(g),y,m,P,D,U,$);return Y&&Ln(Y)&&Y.data==="]"?i(y.anchor=Y):(it=!0,l(y.anchor=c("]"),m,Y),Y)},I=(g,y,P,D,U,$)=>{if(it=!0,y.el=null,$){const Y=T(g);for(;;){const F=i(g);if(F&&F!==Y)s(F);else break}}const M=i(g),m=a(g);return s(g),n(null,y,m,M,P,D,Sn(m),U),M},T=g=>{let y=0;for(;g;)if(g=i(g),g&&Ln(g)&&(g.data==="["&&y++,g.data==="]")){if(y===0)return i(g);y--}return g};return[d,h]}const Se=ia;function tc(e){return nc(e,ec)}function nc(e,t){const n=Ss();n.__VUE__=!0;const{insert:r,remove:o,patchProp:i,createElement:a,createText:s,createComment:l,setText:c,setElementText:d,parentNode:h,nextSibling:f,setScopeId:b=Ye,cloneNode:w,insertStaticContent:I}=e,T=(u,p,v,k=null,E=null,A=null,N=!1,O=null,L=!!p.dynamicChildren)=>{if(u===p)return;u&&!kt(u,p)&&(k=B(u),Re(u,E,A,!0),u=null),p.patchFlag===-2&&(L=!1,p.dynamicChildren=null);const{type:C,ref:K,shapeFlag:V}=p;switch(C){case vn:g(u,p,v,k);break;case Ne:y(u,p,v,k);break;case cn:u==null&&P(p,v,k,N);break;case Le:z(u,p,v,k,E,A,N,O,L);break;default:V&1?$(u,p,v,k,E,A,N,O,L):V&6?R(u,p,v,k,E,A,N,O,L):(V&64||V&128)&&C.process(u,p,v,k,E,A,N,O,L,ce)}K!=null&&E&&Vn(K,u&&u.ref,A,p||u,!p)},g=(u,p,v,k)=>{if(u==null)r(p.el=s(p.children),v,k);else{const E=p.el=u.el;p.children!==u.children&&c(E,p.children)}},y=(u,p,v,k)=>{u==null?r(p.el=l(p.children||""),v,k):p.el=u.el},P=(u,p,v,k)=>{[u.el,u.anchor]=I(u.children,p,v,k,u.el,u.anchor)},D=({el:u,anchor:p},v,k)=>{let E;for(;u&&u!==p;)E=f(u),r(u,v,k),u=E;r(p,v,k)},U=({el:u,anchor:p})=>{let v;for(;u&&u!==p;)v=f(u),o(u),u=v;o(p)},$=(u,p,v,k,E,A,N,O,L)=>{N=N||p.type==="svg",u==null?M(p,v,k,E,A,N,O,L):F(u,p,E,A,N,O,L)},M=(u,p,v,k,E,A,N,O)=>{let L,C;const{type:K,props:V,shapeFlag:W,transition:Q,patchFlag:ie,dirs:ue}=u;if(u.el&&w!==void 0&&ie===-1)L=u.el=w(u.el);else{if(L=u.el=a(u.type,A,V&&V.is,V),W&8?d(L,u.children):W&16&&Y(u.children,L,null,k,E,A&&K!=="foreignObject",N,O),ue&&Ge(u,null,k,"created"),V){for(const me in V)me!=="value"&&!an(me)&&i(L,me,null,V[me],A,u.children,k,E,S);"value"in V&&i(L,"value",null,V.value),(C=V.onVnodeBeforeMount)&&je(C,k,u)}m(L,u,u.scopeId,N,k)}ue&&Ge(u,null,k,"beforeMount");const de=(!E||E&&!E.pendingBranch)&&Q&&!Q.persisted;de&&Q.beforeEnter(L),r(L,p,v),((C=V&&V.onVnodeMounted)||de||ue)&&Se(()=>{C&&je(C,k,u),de&&Q.enter(L),ue&&Ge(u,null,k,"mounted")},E)},m=(u,p,v,k,E)=>{if(v&&b(u,v),k)for(let A=0;A{for(let C=L;C{const O=p.el=u.el;let{patchFlag:L,dynamicChildren:C,dirs:K}=p;L|=u.patchFlag&16;const V=u.props||pe,W=p.props||pe;let Q;v&&bt(v,!1),(Q=W.onVnodeBeforeUpdate)&&je(Q,v,p,u),K&&Ge(p,u,v,"beforeUpdate"),v&&bt(v,!0);const ie=E&&p.type!=="foreignObject";if(C?q(u.dynamicChildren,C,O,v,k,ie,A):N||we(u,p,O,null,v,k,ie,A,!1),L>0){if(L&16)_(O,p,V,W,v,k,E);else if(L&2&&V.class!==W.class&&i(O,"class",null,W.class,E),L&4&&i(O,"style",V.style,W.style,E),L&8){const ue=p.dynamicProps;for(let de=0;de{Q&&je(Q,v,p,u),K&&Ge(p,u,v,"updated")},k)},q=(u,p,v,k,E,A,N)=>{for(let O=0;O{if(v!==k){for(const O in k){if(an(O))continue;const L=k[O],C=v[O];L!==C&&O!=="value"&&i(u,O,C,L,N,p.children,E,A,S)}if(v!==pe)for(const O in v)!an(O)&&!(O in k)&&i(u,O,v[O],null,N,p.children,E,A,S);"value"in k&&i(u,"value",v.value,k.value)}},z=(u,p,v,k,E,A,N,O,L)=>{const C=p.el=u?u.el:s(""),K=p.anchor=u?u.anchor:s("");let{patchFlag:V,dynamicChildren:W,slotScopeIds:Q}=p;Q&&(O=O?O.concat(Q):Q),u==null?(r(C,v,k),r(K,v,k),Y(p.children,v,K,E,A,N,O,L)):V>0&&V&64&&W&&u.dynamicChildren?(q(u.dynamicChildren,W,v,E,A,N,O),(p.key!=null||E&&p===E.subTree)&&ka(u,p,!0)):we(u,p,v,K,E,A,N,O,L)},R=(u,p,v,k,E,A,N,O,L)=>{p.slotScopeIds=O,u==null?p.shapeFlag&512?E.ctx.activate(p,v,k,N,L):re(p,v,k,E,A,N,L):H(u,p,L)},re=(u,p,v,k,E,A,N)=>{const O=u.component=dc(u,k,E);if(En(u)&&(O.ctx.renderer=ce),fc(O),O.asyncDep){if(E&&E.registerDep(O,X),!u.el){const L=O.subTree=ye(Ne);y(null,L,p,v)}return}X(O,u,p,v,E,A,N)},H=(u,p,v)=>{const k=p.component=u.component;if(El(u,p,v))if(k.asyncDep&&!k.asyncResolved){ne(k,p,v);return}else k.next=p,gl(k.update),k.update();else p.el=u.el,k.vnode=p},X=(u,p,v,k,E,A,N)=>{const O=()=>{if(u.isMounted){let{next:K,bu:V,u:W,parent:Q,vnode:ie}=u,ue=K,de;bt(u,!1),K?(K.el=ie.el,ne(u,K,N)):K=ie,V&&lr(V),(de=K.props&&K.props.onVnodeBeforeUpdate)&&je(de,Q,K,ie),bt(u,!0);const me=cr(u),Ue=u.subTree;u.subTree=me,T(Ue,me,h(Ue.el),B(Ue),u,E,A),K.el=me.el,ue===null&&kl(u,me.el),W&&Se(W,E),(de=K.props&&K.props.onVnodeUpdated)&&Se(()=>je(de,Q,K,ie),E)}else{let K;const{el:V,props:W}=p,{bm:Q,m:ie,parent:ue}=u,de=Bt(p);if(bt(u,!1),Q&&lr(Q),!de&&(K=W&&W.onVnodeBeforeMount)&&je(K,ue,p),bt(u,!0),V&&Z){const me=()=>{u.subTree=cr(u),Z(V,u.subTree,u,E,null)};de?p.type.__asyncLoader().then(()=>!u.isUnmounted&&me()):me()}else{const me=u.subTree=cr(u);T(null,me,v,k,u,E,A),p.el=me.el}if(ie&&Se(ie,E),!de&&(K=W&&W.onVnodeMounted)){const me=p;Se(()=>je(K,ue,me),E)}(p.shapeFlag&256||ue&&Bt(ue.vnode)&&ue.vnode.shapeFlag&256)&&u.a&&Se(u.a,E),u.isMounted=!0,p=v=k=null}},L=u.effect=new Yr(O,()=>ro(C),u.scope),C=u.update=()=>L.run();C.id=u.uid,bt(u,!0),C()},ne=(u,p,v)=>{p.component=u;const k=u.vnode.props;u.vnode=p,u.next=null,Yl(u,p.props,k,v),Ql(u,p.children,v),Wt(),Xn(void 0,u.update),Yt()},we=(u,p,v,k,E,A,N,O,L=!1)=>{const C=u&&u.children,K=u?u.shapeFlag:0,V=p.children,{patchFlag:W,shapeFlag:Q}=p;if(W>0){if(W&128){Ie(C,V,v,k,E,A,N,O,L);return}else if(W&256){Oe(C,V,v,k,E,A,N,O,L);return}}Q&8?(K&16&&S(C,E,A),V!==C&&d(v,V)):K&16?Q&16?Ie(C,V,v,k,E,A,N,O,L):S(C,E,A,!0):(K&8&&d(v,""),Q&16&&Y(V,v,k,E,A,N,O,L))},Oe=(u,p,v,k,E,A,N,O,L)=>{u=u||Ft,p=p||Ft;const C=u.length,K=p.length,V=Math.min(C,K);let W;for(W=0;WK?S(u,E,A,!0,!1,V):Y(p,v,k,E,A,N,O,L,V)},Ie=(u,p,v,k,E,A,N,O,L)=>{let C=0;const K=p.length;let V=u.length-1,W=K-1;for(;C<=V&&C<=W;){const Q=u[C],ie=p[C]=L?ut(p[C]):qe(p[C]);if(kt(Q,ie))T(Q,ie,v,null,E,A,N,O,L);else break;C++}for(;C<=V&&C<=W;){const Q=u[V],ie=p[W]=L?ut(p[W]):qe(p[W]);if(kt(Q,ie))T(Q,ie,v,null,E,A,N,O,L);else break;V--,W--}if(C>V){if(C<=W){const Q=W+1,ie=QW)for(;C<=V;)Re(u[C],E,A,!0),C++;else{const Q=C,ie=C,ue=new Map;for(C=ie;C<=W;C++){const ze=p[C]=L?ut(p[C]):qe(p[C]);ze.key!=null&&ue.set(ze.key,C)}let de,me=0;const Ue=W-ie+1;let It=!1,yo=0;const Zt=new Array(Ue);for(C=0;C=Ue){Re(ze,E,A,!0);continue}let Je;if(ze.key!=null)Je=ue.get(ze.key);else for(de=ie;de<=W;de++)if(Zt[de-ie]===0&&kt(ze,p[de])){Je=de;break}Je===void 0?Re(ze,E,A,!0):(Zt[Je-ie]=C+1,Je>=yo?yo=Je:It=!0,T(ze,p[Je],v,null,E,A,N,O,L),me++)}const wo=It?rc(Zt):Ft;for(de=wo.length-1,C=Ue-1;C>=0;C--){const ze=ie+C,Je=p[ze],_o=ze+1{const{el:A,type:N,transition:O,children:L,shapeFlag:C}=u;if(C&6){Fe(u.component.subTree,p,v,k);return}if(C&128){u.suspense.move(p,v,k);return}if(C&64){N.move(u,p,v,ce);return}if(N===Le){r(A,p,v);for(let V=0;VO.enter(A),E);else{const{leave:V,delayLeave:W,afterLeave:Q}=O,ie=()=>r(A,p,v),ue=()=>{V(A,()=>{ie(),Q&&Q()})};W?W(A,ie,ue):ue()}else r(A,p,v)},Re=(u,p,v,k=!1,E=!1)=>{const{type:A,props:N,ref:O,children:L,dynamicChildren:C,shapeFlag:K,patchFlag:V,dirs:W}=u;if(O!=null&&Vn(O,null,v,u,!0),K&256){p.ctx.deactivate(u);return}const Q=K&1&&W,ie=!Bt(u);let ue;if(ie&&(ue=N&&N.onVnodeBeforeUnmount)&&je(ue,p,u),K&6)j(u.component,v,k);else{if(K&128){u.suspense.unmount(v,k);return}Q&&Ge(u,null,p,"beforeUnmount"),K&64?u.type.remove(u,p,v,E,ce,k):C&&(A!==Le||V>0&&V&64)?S(C,p,v,!1,!0):(A===Le&&V&384||!E&&K&16)&&S(L,p,v),k&&Qt(u)}(ie&&(ue=N&&N.onVnodeUnmounted)||Q)&&Se(()=>{ue&&je(ue,p,u),Q&&Ge(u,null,p,"unmounted")},v)},Qt=u=>{const{type:p,el:v,anchor:k,transition:E}=u;if(p===Le){x(v,k);return}if(p===cn){U(u);return}const A=()=>{o(v),E&&!E.persisted&&E.afterLeave&&E.afterLeave()};if(u.shapeFlag&1&&E&&!E.persisted){const{leave:N,delayLeave:O}=E,L=()=>N(v,A);O?O(u.el,A,L):L()}else A()},x=(u,p)=>{let v;for(;u!==p;)v=f(u),o(u),u=v;o(p)},j=(u,p,v)=>{const{bum:k,scope:E,update:A,subTree:N,um:O}=u;k&&lr(k),E.stop(),A&&(A.active=!1,Re(N,u,p,v)),O&&Se(O,p),Se(()=>{u.isUnmounted=!0},p),p&&p.pendingBranch&&!p.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===p.pendingId&&(p.deps--,p.deps===0&&p.resolve())},S=(u,p,v,k=!1,E=!1,A=0)=>{for(let N=A;Nu.shapeFlag&6?B(u.component.subTree):u.shapeFlag&128?u.suspense.next():f(u.anchor||u.el),le=(u,p,v)=>{u==null?p._vnode&&Re(p._vnode,null,null,!0):T(p._vnode||null,u,p,null,null,null,v),Fn(),p._vnode=u},ce={p:T,um:Re,m:Fe,r:Qt,mt:re,mc:Y,pc:we,pbc:q,n:B,o:e};let te,Z;return t&&([te,Z]=t(ce)),{render:le,hydrate:te,createApp:Xl(le,te)}}function bt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function ka(e,t,n=!1){const r=e.children,o=t.children;if(G(r)&&G(o))for(let i=0;i>1,e[n[s]]0&&(t[r]=n[i-1]),n[i]=r)}}for(i=n.length,a=n[i-1];i-- >0;)n[i]=a,a=t[a];return n}const oc=e=>e.__isTeleport,Le=Symbol(void 0),vn=Symbol(void 0),Ne=Symbol(void 0),cn=Symbol(void 0),un=[];let We=null;function nr(e=!1){un.push(We=e?null:[])}function ic(){un.pop(),We=un[un.length-1]||null}let bn=1;function jo(e){bn+=e}function Ca(e){return e.dynamicChildren=bn>0?We||Ft:null,ic(),bn>0&&We&&We.push(e),e}function Aa(e,t,n,r,o,i){return Ca(Pa(e,t,n,r,o,i,!0))}function Ta(e,t,n,r,o){return Ca(ye(e,t,n,r,o,!0))}function Un(e){return e?e.__v_isVNode===!0:!1}function kt(e,t){return e.type===t.type&&e.key===t.key}const rr="__vInternal",Oa=({key:e})=>e!=null?e:null,Mn=({ref:e,ref_key:t,ref_for:n})=>e!=null?he(e)||ke(e)||ee(e)?{i:Ae,r:e,k:t,f:!!n}:e:null;function Pa(e,t=null,n=null,r=0,o=null,i=e===Le?0:1,a=!1,s=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Oa(t),ref:t&&Mn(t),scopeId:oa,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null};return s?(lo(l,n),i&128&&e.normalize(l)):n&&(l.shapeFlag|=he(n)?8:16),bn>0&&!a&&We&&(l.patchFlag>0||i&6)&&l.patchFlag!==32&&We.push(l),l}const ye=ac;function ac(e,t=null,n=null,r=0,o=null,i=!1){if((!e||e===Fl)&&(e=Ne),Un(e)){const s=gt(e,t,!0);return n&&lo(s,n),bn>0&&!i&&We&&(s.shapeFlag&6?We[We.indexOf(e)]=s:We.push(s)),s.patchFlag|=-2,s}if(vc(e)&&(e=e.__vccOpts),t){t=sc(t);let{class:s,style:l}=t;s&&!he(s)&&(t.class=wn(s)),_e(l)&&(Ki(l)&&!G(l)&&(l=Ce({},l)),t.style=Yn(l))}const a=he(e)?1:Cl(e)?128:oc(e)?64:_e(e)?4:ee(e)?2:0;return Pa(e,t,n,r,o,a,i,!0)}function sc(e){return e?Ki(e)||rr in e?Ce({},e):e:null}function gt(e,t,n=!1){const{props:r,ref:o,patchFlag:i,children:a}=e,s=t?lc(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:s,key:s&&Oa(s),ref:t&&t.ref?n&&o?G(o)?o.concat(Mn(t)):[o,Mn(t)]:Mn(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Le?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&>(e.ssContent),ssFallback:e.ssFallback&>(e.ssFallback),el:e.el,anchor:e.anchor}}function so(e=" ",t=0){return ye(vn,null,e,t)}function Qf(e,t){const n=ye(cn,null,e);return n.staticCount=t,n}function Zf(e="",t=!1){return t?(nr(),Ta(Ne,null,e)):ye(Ne,null,e)}function qe(e){return e==null||typeof e=="boolean"?ye(Ne):G(e)?ye(Le,null,e.slice()):typeof e=="object"?ut(e):ye(vn,null,String(e))}function ut(e){return e.el===null||e.memo?e:gt(e)}function lo(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(G(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),lo(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(rr in t)?t._ctx=Ae:o===3&&Ae&&(Ae.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else ee(t)?(t={default:t,_ctx:Ae},n=32):(t=String(t),r&64?(n=16,t=[so(t)]):n=8);e.children=t,e.shapeFlag|=n}function lc(...e){const t={};for(let n=0;nxe||Ae,Vt=e=>{xe=e,e.scope.on()},Rt=()=>{xe&&xe.scope.off(),xe=null};function Sa(e){return e.vnode.shapeFlag&4}let Ut=!1;function fc(e,t=!1){Ut=t;const{props:n,children:r}=e.vnode,o=Sa(e);Wl(e,n,o,t),Gl(e,r);const i=o?pc(e,t):void 0;return Ut=!1,i}function pc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Wi(new Proxy(e.ctx,jl));const{setup:r}=n;if(r){const o=e.setupContext=r.length>1?mc(e):null;Vt(e),Wt();const i=ht(r,e,0,[e.props,o]);if(Yt(),Rt(),Li(i)){if(i.then(Rt,Rt),t)return i.then(a=>{Bo(e,a,t)}).catch(a=>{xn(a,e,0)});e.asyncDep=i}else Bo(e,i,t)}else La(e,t)}function Bo(e,t,n){ee(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:_e(t)&&(e.setupState=Zi(t)),La(e,n)}let Vo;function La(e,t,n){const r=e.type;if(!e.render){if(!t&&Vo&&!r.render){const o=r.template;if(o){const{isCustomElement:i,compilerOptions:a}=e.appContext.config,{delimiters:s,compilerOptions:l}=r,c=Ce(Ce({isCustomElement:i,delimiters:s},a),l);r.render=Vo(o,c)}}e.render=r.render||Ye}Vt(e),Wt(),Bl(e),Yt(),Rt()}function hc(e){return new Proxy(e.attrs,{get(t,n){return He(e,"get","$attrs"),t[n]}})}function mc(e){const t=r=>{e.exposed=r||{}};let n;return{get attrs(){return n||(n=hc(e))},slots:e.slots,emit:e.emit,expose:t}}function or(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Zi(Wi(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in jn)return jn[n](e)}}))}function gc(e,t=!0){return ee(e)?e.displayName||e.name:e.name||t&&e.__name}function vc(e){return ee(e)&&"__vccOpts"in e}const ve=(e,t)=>pl(e,t,Ut);function be(e,t,n){const r=arguments.length;return r===2?_e(t)&&!G(t)?Un(t)?ye(e,null,[t]):ye(e,t):ye(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Un(n)&&(n=[n]),ye(e,t,n))}const bc="3.2.37",yc="http://www.w3.org/2000/svg",Ct=typeof document!="undefined"?document:null,Uo=Ct&&Ct.createElement("template"),wc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t?Ct.createElementNS(yc,e):Ct.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>Ct.createTextNode(e),createComment:e=>Ct.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ct.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},cloneNode(e){const t=e.cloneNode(!0);return"_value"in e&&(t._value=e._value),t},insertStaticContent(e,t,n,r,o,i){const a=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===i||!(o=o.nextSibling)););else{Uo.innerHTML=r?`${e}`:e;const s=Uo.content;if(r){const l=s.firstChild;for(;l.firstChild;)s.appendChild(l.firstChild);s.removeChild(l)}t.insertBefore(s,n)}return[a?a.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function _c(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function xc(e,t,n){const r=e.style,o=he(n);if(n&&!o){for(const i in n)Mr(r,i,n[i]);if(t&&!he(t))for(const i in t)n[i]==null&&Mr(r,i,"")}else{const i=r.display;o?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=i)}}const qo=/\s*!important$/;function Mr(e,t,n){if(G(n))n.forEach(r=>Mr(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Ec(e,t);qo.test(n)?e.setProperty(St(r),n.replace(qo,""),"important"):e[r]=n}}const Ko=["Webkit","Moz","ms"],fr={};function Ec(e,t){const n=fr[t];if(n)return n;let r=Qe(t);if(r!=="filter"&&r in e)return fr[t]=r;r=Qn(r);for(let o=0;o{let e=Date.now,t=!1;if(typeof window!="undefined"){Date.now()>document.createEvent("Event").timeStamp&&(e=performance.now.bind(performance));const n=navigator.userAgent.match(/firefox\/(\d+)/i);t=!!(n&&Number(n[1])<=53)}return[e,t]})();let Dr=0;const Tc=Promise.resolve(),Oc=()=>{Dr=0},Pc=()=>Dr||(Tc.then(Oc),Dr=Ia());function Rc(e,t,n,r){e.addEventListener(t,n,r)}function Sc(e,t,n,r){e.removeEventListener(t,n,r)}function Lc(e,t,n,r,o=null){const i=e._vei||(e._vei={}),a=i[t];if(r&&a)a.value=r;else{const[s,l]=Ic(t);if(r){const c=i[t]=zc(r,o);Rc(e,s,c,l)}else a&&(Sc(e,s,a,l),i[t]=void 0)}}const Yo=/(?:Once|Passive|Capture)$/;function Ic(e){let t;if(Yo.test(e)){t={};let n;for(;n=e.match(Yo);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[St(e.slice(2)),t]}function zc(e,t){const n=r=>{const o=r.timeStamp||Ia();(Ac||o>=n.attached-1)&&Be(Mc(r,n.value),t,5,[r])};return n.value=e,n.attached=Pc(),n}function Mc(e,t){if(G(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const Jo=/^on[a-z]/,Dc=(e,t,n,r,o=!1,i,a,s,l)=>{t==="class"?_c(e,r,o):t==="style"?xc(e,n,r):_n(t)?Vr(t)||Lc(e,t,n,r,a):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Nc(e,t,r,o))?Cc(e,t,r,i,a,s,l):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),kc(e,t,r,o))};function Nc(e,t,n,r){return r?!!(t==="innerHTML"||t==="textContent"||t in e&&Jo.test(t)&&ee(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||Jo.test(t)&&he(n)?!1:t in e}const at="transition",Xt="animation",co=(e,{slots:t})=>be(la,Hc(e),t);co.displayName="Transition";const za={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};co.props=Ce({},la.props,za);const yt=(e,t=[])=>{G(e)?e.forEach(n=>n(...t)):e&&e(...t)},Go=e=>e?G(e)?e.some(t=>t.length>1):e.length>1:!1;function Hc(e){const t={};for(const _ in e)_ in za||(t[_]=e[_]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:i=`${n}-enter-from`,enterActiveClass:a=`${n}-enter-active`,enterToClass:s=`${n}-enter-to`,appearFromClass:l=i,appearActiveClass:c=a,appearToClass:d=s,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:f=`${n}-leave-active`,leaveToClass:b=`${n}-leave-to`}=e,w=Fc(o),I=w&&w[0],T=w&&w[1],{onBeforeEnter:g,onEnter:y,onEnterCancelled:P,onLeave:D,onLeaveCancelled:U,onBeforeAppear:$=g,onAppear:M=y,onAppearCancelled:m=P}=t,Y=(_,z,R)=>{wt(_,z?d:s),wt(_,z?c:a),R&&R()},F=(_,z)=>{_._isLeaving=!1,wt(_,h),wt(_,b),wt(_,f),z&&z()},q=_=>(z,R)=>{const re=_?M:y,H=()=>Y(z,_,R);yt(re,[z,H]),Qo(()=>{wt(z,_?l:i),st(z,_?d:s),Go(re)||Zo(z,r,I,H)})};return Ce(t,{onBeforeEnter(_){yt(g,[_]),st(_,i),st(_,a)},onBeforeAppear(_){yt($,[_]),st(_,l),st(_,c)},onEnter:q(!1),onAppear:q(!0),onLeave(_,z){_._isLeaving=!0;const R=()=>F(_,z);st(_,h),Bc(),st(_,f),Qo(()=>{!_._isLeaving||(wt(_,h),st(_,b),Go(D)||Zo(_,r,T,R))}),yt(D,[_,R])},onEnterCancelled(_){Y(_,!1),yt(P,[_])},onAppearCancelled(_){Y(_,!0),yt(m,[_])},onLeaveCancelled(_){F(_),yt(U,[_])}})}function Fc(e){if(e==null)return null;if(_e(e))return[pr(e.enter),pr(e.leave)];{const t=pr(e);return[t,t]}}function pr(e){return Mi(e)}function st(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function wt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function Qo(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let $c=0;function Zo(e,t,n,r){const o=e._endId=++$c,i=()=>{o===e._endId&&r()};if(n)return setTimeout(i,n);const{type:a,timeout:s,propCount:l}=jc(e,t);if(!a)return r();const c=a+"end";let d=0;const h=()=>{e.removeEventListener(c,f),i()},f=b=>{b.target===e&&++d>=l&&h()};setTimeout(()=>{d(n[w]||"").split(", "),o=r(at+"Delay"),i=r(at+"Duration"),a=Xo(o,i),s=r(Xt+"Delay"),l=r(Xt+"Duration"),c=Xo(s,l);let d=null,h=0,f=0;t===at?a>0&&(d=at,h=a,f=i.length):t===Xt?c>0&&(d=Xt,h=c,f=l.length):(h=Math.max(a,c),d=h>0?a>c?at:Xt:null,f=d?d===at?i.length:l.length:0);const b=d===at&&/\b(transform|all)(,|$)/.test(n[at+"Property"]);return{type:d,timeout:h,propCount:f,hasTransform:b}}function Xo(e,t){for(;e.lengthei(n)+ei(e[r])))}function ei(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function Bc(){return document.body.offsetHeight}const Vc={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Xf=(e,t)=>n=>{if(!("key"in n))return;const r=St(n.key);if(t.some(o=>o===r||Vc[o]===r))return e(n)},ep={beforeMount(e,{value:t},{transition:n}){e._vod=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):en(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),en(e,!0),r.enter(e)):r.leave(e,()=>{en(e,!1)}):en(e,t))},beforeUnmount(e,{value:t}){en(e,t)}};function en(e,t){e.style.display=t?e._vod:"none"}const Uc=Ce({patchProp:Dc},wc);let hr,ti=!1;function qc(){return hr=ti?hr:tc(Uc),ti=!0,hr}const Kc=(...e)=>{const t=qc().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Wc(r);if(o)return n(o,!0,o instanceof SVGElement)},t};function Wc(e){return he(e)?document.querySelector(e):e}const Yc=JSON.parse('{"base":"/","lang":"en-US","title":"Overlays Capture Architecture","description":"Official OCA resources","head":[],"locales":{}}');var Jc=([e,t,n])=>e==="meta"&&t.name?`${e}.${t.name}`:["title","base"].includes(e)?e:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,t,n]),Gc=e=>{const t=new Set,n=[];return e.forEach(r=>{const o=Jc(r);t.has(o)||(t.add(o),n.push(r))}),n},Qc=e=>/^(https?:)?\/\//.test(e),tp=e=>/^mailto:/.test(e),np=e=>/^tel:/.test(e),Ma=e=>Object.prototype.toString.call(e)==="[object Object]",Zc=e=>e.replace(/\/$/,""),Xc=e=>e.replace(/^\//,""),Da=(e,t)=>{const n=Object.keys(e).sort((r,o)=>{const i=o.split("/").length-r.split("/").length;return i!==0?i:o.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"};const Na={"v-8daa1a0e":ge(()=>J(()=>import("./index.html.68c8f5ec.js"),[])),"v-67f865c9":ge(()=>J(()=>import("./community.html.6f9c1363.js"),[])),"v-39072b1a":ge(()=>J(()=>import("./contribute.html.5553a315.js"),[])),"v-0c525774":ge(()=>J(()=>import("./v1.1.0-rc.html.26435266.js"),[])),"v-1a2ad06e":ge(()=>J(()=>import("./getting-started.html.65b22eac.js"),[])),"v-5b69fa59":ge(()=>J(()=>import("./oca-browser.html.5670c628.js"),[])),"v-12ca5e22":ge(()=>J(()=>import("./oca-bundle.html.1d0d149b.js"),[])),"v-2327417c":ge(()=>J(()=>import("./oca-data-vault.html.8d3d4a9e.js"),[])),"v-35180e35":ge(()=>J(()=>import("./oca-file.html.722dd629.js"),[])),"v-10867f72":ge(()=>J(()=>import("./oca-parser.html.419f5a5c.js"),[])),"v-11796e4e":ge(()=>J(()=>import("./oca-presenter.html.67d05130.js"),[])),"v-38173727":ge(()=>J(()=>import("./oca-repository.html.6c1ab427.js"),[])),"v-73b65308":ge(()=>J(()=>import("./oca-transformer.html.1eedc301.js"),[])),"v-65ea5a6f":ge(()=>J(()=>import("./oca-validator.html.9f8a6ced.js"),[])),"v-093dab99":ge(()=>J(()=>import("./tour.html.603f3b62.js"),[])),"v-b038aa76":ge(()=>J(()=>import("./index.html.a4fd9040.js"),[])),"v-37e1c06f":ge(()=>J(()=>import("./faq.html.3f04bc8f.js"),[])),"v-1c7b2593":ge(()=>J(()=>import("./introduction.html.f59a7865.js"),[])),"v-28942eea":ge(()=>J(()=>import("./oca-vs-others-comparison.html.7c557ad3.js"),[])),"v-7e593ce5":ge(()=>J(()=>import("./references.html.8dcfee41.js"),[])),"v-d8f2b400":ge(()=>J(()=>import("./index.html.be7f5525.js"),[])),"v-4753f562":ge(()=>J(()=>import("./swiss-passport-example.html.dec0619e.js"),[])),"v-3706649a":ge(()=>J(()=>import("./404.html.72046180.js"),[]))},eu={404:ge(()=>J(()=>import("./404.1edfdf19.js"),[])),Layout:ge(()=>J(()=>import("./Layout.eb79ccda.js"),[]))};var Ha=Te(bs),Fa=Zr({key:"",path:"",title:"",lang:"",frontmatter:{},excerpt:"",headers:[]}),et=Te(Fa),kn=()=>et;bo.webpackHot&&(__VUE_HMR_RUNTIME__.updatePageData=e=>{Ha.value[e.key]=()=>Promise.resolve(e),e.key===et.value.key&&(et.value=e)});var $a=Symbol(""),tu=()=>{const e=Ee($a);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},ja=Symbol(""),nu=()=>{const e=Ee(ja);if(!e)throw new Error("usePageHead() is called without provider.");return e},ru=Symbol(""),Ba=Symbol(""),ou=()=>{const e=Ee(Ba);if(!e)throw new Error("usePageLang() is called without provider.");return e},uo=Symbol(""),iu=()=>{const e=Ee(uo);if(!e)throw new Error("useRouteLocale() is called without provider.");return e},ft=Te(Yc),au=()=>ft;bo.webpackHot&&(__VUE_HMR_RUNTIME__.updateSiteData=e=>{ft.value=e});var Va=Symbol(""),rp=()=>{const e=Ee(Va);if(!e)throw new Error("useSiteLocaleData() is called without provider.");return e},su=Symbol(""),xt=Jt({resolvePageData:async e=>{const t=Ha.value[e],n=await(t==null?void 0:t());return n!=null?n:Fa},resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,t,n)=>{const r=he(t.description)?t.description:n.description,o=[...G(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:r}]];return Gc(o)},resolvePageHeadTitle:(e,t)=>`${e.title?`${e.title} | `:""}${t.title}`,resolvePageLang:e=>e.lang||"en",resolveRouteLocale:(e,t)=>Da(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t]})}),lu=Ve({name:"ClientOnly",setup(e,t){const n=Te(!1);return vt(()=>{n.value=!0}),()=>{var r,o;return n.value?(o=(r=t.slots).default)==null?void 0:o.call(r):null}}}),cu=Ve({name:"Content",props:{pageKey:{type:String,required:!1,default:""}},setup(e){const t=kn(),n=ve(()=>Na[e.pageKey||t.value.key]);return()=>n.value?be(n.value):be("div","404 Not Found")}}),ni=Ve({name:"Vuepress",setup(){const e=kn(),t=ve(()=>{let n;if(e.value.path){const r=e.value.frontmatter.layout;he(r)?n=r:n="Layout"}else n="404";return eu[n]||Hl(n,!1)});return()=>be(t.value)}}),uu=e=>Qc(e)?e:`${au().value.base}${Xc(e)}`,Lt=e=>e;function Ua(e,t,n){var r,o,i;t===void 0&&(t=50),n===void 0&&(n={});var a=(r=n.isImmediate)!=null&&r,s=(o=n.callback)!=null&&o,l=n.maxWait,c=Date.now(),d=[];function h(){if(l!==void 0){var b=Date.now()-c;if(b+t>=l)return l-b}return t}var f=function(){var b=[].slice.call(arguments),w=this;return new Promise(function(I,T){var g=a&&i===void 0;if(i!==void 0&&clearTimeout(i),i=setTimeout(function(){if(i=void 0,c=Date.now(),!a){var P=e.apply(w,b);s&&s(P),d.forEach(function(D){return(0,D.resolve)(P)}),d=[]}},h()),g){var y=e.apply(w,b);return s&&s(y),I(y)}d.push({resolve:I,reject:T})})};return f.cancel=function(b){i!==void 0&&clearTimeout(i),d.forEach(function(w){return(0,w.reject)(b)}),d=[]},f}/*! + * vue-router v4.0.16 + * (c) 2022 Eduardo San Martin Morote + * @license MIT + */const qa=typeof Symbol=="function"&&typeof Symbol.toStringTag=="symbol",Gt=e=>qa?Symbol(e):"_vr_"+e,du=Gt("rvlm"),ri=Gt("rvd"),ir=Gt("r"),fo=Gt("rl"),Nr=Gt("rvl"),Ht=typeof window!="undefined";function fu(e){return e.__esModule||qa&&e[Symbol.toStringTag]==="Module"}const fe=Object.assign;function mr(e,t){const n={};for(const r in t){const o=t[r];n[r]=Array.isArray(o)?o.map(e):e(o)}return n}const dn=()=>{},pu=/\/$/,hu=e=>e.replace(pu,"");function gr(e,t,n="/"){let r,o={},i="",a="";const s=t.indexOf("?"),l=t.indexOf("#",s>-1?s:0);return s>-1&&(r=t.slice(0,s),i=t.slice(s+1,l>-1?l:t.length),o=e(i)),l>-1&&(r=r||t.slice(0,l),a=t.slice(l,t.length)),r=bu(r!=null?r:t,n),{fullPath:r+(i&&"?")+i+a,path:r,query:o,hash:a}}function mu(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function oi(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function gu(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&qt(t.matched[r],n.matched[o])&&Ka(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function qt(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Ka(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!vu(e[n],t[n]))return!1;return!0}function vu(e,t){return Array.isArray(e)?ii(e,t):Array.isArray(t)?ii(t,e):e===t}function ii(e,t){return Array.isArray(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function bu(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/");let o=n.length-1,i,a;for(i=0;i({left:window.pageXOffset,top:window.pageYOffset});function Eu(e){let t;if("el"in e){const n=e.el,r=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=xu(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.pageXOffset,t.top!=null?t.top:window.pageYOffset)}function ai(e,t){return(history.state?history.state.position-t:-1)+e}const Hr=new Map;function ku(e,t){Hr.set(e,t)}function Cu(e){const t=Hr.get(e);return Hr.delete(e),t}let Au=()=>location.protocol+"//"+location.host;function Wa(e,t){const{pathname:n,search:r,hash:o}=t,i=e.indexOf("#");if(i>-1){let s=o.includes(e.slice(i))?e.slice(i).length:1,l=o.slice(s);return l[0]!=="/"&&(l="/"+l),oi(l,"")}return oi(n,e)+r+o}function Tu(e,t,n,r){let o=[],i=[],a=null;const s=({state:f})=>{const b=Wa(e,location),w=n.value,I=t.value;let T=0;if(f){if(n.value=b,t.value=f,a&&a===w){a=null;return}T=I?f.position-I.position:0}else r(b);o.forEach(g=>{g(n.value,w,{delta:T,type:yn.pop,direction:T?T>0?fn.forward:fn.back:fn.unknown})})};function l(){a=n.value}function c(f){o.push(f);const b=()=>{const w=o.indexOf(f);w>-1&&o.splice(w,1)};return i.push(b),b}function d(){const{history:f}=window;!f.state||f.replaceState(fe({},f.state,{scroll:ar()}),"")}function h(){for(const f of i)f();i=[],window.removeEventListener("popstate",s),window.removeEventListener("beforeunload",d)}return window.addEventListener("popstate",s),window.addEventListener("beforeunload",d),{pauseListeners:l,listen:c,destroy:h}}function si(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?ar():null}}function Ou(e){const{history:t,location:n}=window,r={value:Wa(e,n)},o={value:t.state};o.value||i(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function i(l,c,d){const h=e.indexOf("#"),f=h>-1?(n.host&&document.querySelector("base")?e:e.slice(h))+l:Au()+e+l;try{t[d?"replaceState":"pushState"](c,"",f),o.value=c}catch(b){console.error(b),n[d?"replace":"assign"](f)}}function a(l,c){const d=fe({},t.state,si(o.value.back,l,o.value.forward,!0),c,{position:o.value.position});i(l,d,!0),r.value=l}function s(l,c){const d=fe({},o.value,t.state,{forward:l,scroll:ar()});i(d.current,d,!0);const h=fe({},si(r.value,l,null),{position:d.position+1},c);i(l,h,!1),r.value=l}return{location:r,state:o,push:s,replace:a}}function Pu(e){e=yu(e);const t=Ou(e),n=Tu(e,t.state,t.location,t.replace);function r(i,a=!0){a||n.pauseListeners(),history.go(i)}const o=fe({location:"",base:e,go:r,createHref:_u.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function Ru(e){return typeof e=="string"||e&&typeof e=="object"}function Ya(e){return typeof e=="string"||typeof e=="symbol"}const Ze={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},Ja=Gt("nf");var li;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(li||(li={}));function Kt(e,t){return fe(new Error,{type:e,[Ja]:!0},t)}function lt(e,t){return e instanceof Error&&Ja in e&&(t==null||!!(e.type&t))}const ci="[^/]+?",Su={sensitive:!1,strict:!1,start:!0,end:!0},Lu=/[.+*?^${}()[\]/\\]/g;function Iu(e,t){const n=fe({},Su,t),r=[];let o=n.start?"^":"";const i=[];for(const c of e){const d=c.length?[]:[90];n.strict&&!c.length&&(o+="/");for(let h=0;h1&&(d.endsWith("/")?d=d.slice(0,-1):h=!0);else throw new Error(`Missing required param "${w}"`);d+=y}}return d}return{re:a,score:r,keys:i,parse:s,stringify:l}}function zu(e,t){let n=0;for(;nt.length?t.length===1&&t[0]===40+40?1:-1:0}function Mu(e,t){let n=0;const r=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const Du={type:0,value:""},Nu=/[a-zA-Z0-9_]/;function Hu(e){if(!e)return[[]];if(e==="/")return[[Du]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(b){throw new Error(`ERR (${n})/"${c}": ${b}`)}let n=0,r=n;const o=[];let i;function a(){i&&o.push(i),i=[]}let s=0,l,c="",d="";function h(){!c||(n===0?i.push({type:0,value:c}):n===1||n===2||n===3?(i.length>1&&(l==="*"||l==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),i.push({type:1,value:c,regexp:d,repeatable:l==="*"||l==="+",optional:l==="*"||l==="?"})):t("Invalid state to consume buffer"),c="")}function f(){c+=l}for(;s{a(y)}:dn}function a(d){if(Ya(d)){const h=r.get(d);h&&(r.delete(d),n.splice(n.indexOf(h),1),h.children.forEach(a),h.alias.forEach(a))}else{const h=n.indexOf(d);h>-1&&(n.splice(h,1),d.record.name&&r.delete(d.record.name),d.children.forEach(a),d.alias.forEach(a))}}function s(){return n}function l(d){let h=0;for(;h=0&&(d.record.path!==n[h].record.path||!Ga(d,n[h]));)h++;n.splice(h,0,d),d.record.name&&!di(d)&&r.set(d.record.name,d)}function c(d,h){let f,b={},w,I;if("name"in d&&d.name){if(f=r.get(d.name),!f)throw Kt(1,{location:d});I=f.record.name,b=fe(ju(h.params,f.keys.filter(y=>!y.optional).map(y=>y.name)),d.params),w=f.stringify(b)}else if("path"in d)w=d.path,f=n.find(y=>y.re.test(w)),f&&(b=f.parse(w),I=f.record.name);else{if(f=h.name?r.get(h.name):n.find(y=>y.re.test(h.path)),!f)throw Kt(1,{location:d,currentLocation:h});I=f.record.name,b=fe({},h.params,d.params),w=f.stringify(b)}const T=[];let g=f;for(;g;)T.unshift(g.record),g=g.parent;return{name:I,path:w,params:b,matched:T,meta:Uu(T)}}return e.forEach(d=>i(d)),{addRoute:i,resolve:c,removeRoute:a,getRoutes:s,getRecordMatcher:o}}function ju(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function Bu(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:Vu(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||{}:{default:e.component}}}function Vu(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="boolean"?n:n[r];return t}function di(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Uu(e){return e.reduce((t,n)=>fe(t,n.meta),{})}function fi(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function Ga(e,t){return t.children.some(n=>n===e||Ga(e,n))}const Qa=/#/g,qu=/&/g,Ku=/\//g,Wu=/=/g,Yu=/\?/g,Za=/\+/g,Ju=/%5B/g,Gu=/%5D/g,Xa=/%5E/g,Qu=/%60/g,es=/%7B/g,Zu=/%7C/g,ts=/%7D/g,Xu=/%20/g;function po(e){return encodeURI(""+e).replace(Zu,"|").replace(Ju,"[").replace(Gu,"]")}function ed(e){return po(e).replace(es,"{").replace(ts,"}").replace(Xa,"^")}function Fr(e){return po(e).replace(Za,"%2B").replace(Xu,"+").replace(Qa,"%23").replace(qu,"%26").replace(Qu,"`").replace(es,"{").replace(ts,"}").replace(Xa,"^")}function td(e){return Fr(e).replace(Wu,"%3D")}function nd(e){return po(e).replace(Qa,"%23").replace(Yu,"%3F")}function rd(e){return e==null?"":nd(e).replace(Ku,"%2F")}function qn(e){try{return decodeURIComponent(""+e)}catch{}return""+e}function od(e){const t={};if(e===""||e==="?")return t;const r=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;oi&&Fr(i)):[r&&Fr(r)]).forEach(i=>{i!==void 0&&(t+=(t.length?"&":"")+n,i!=null&&(t+="="+i))})}return t}function id(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=Array.isArray(r)?r.map(o=>o==null?null:""+o):r==null?r:""+r)}return t}function tn(){let e=[];function t(r){return e.push(r),()=>{const o=e.indexOf(r);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e,reset:n}}function dt(e,t,n,r,o){const i=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise((a,s)=>{const l=h=>{h===!1?s(Kt(4,{from:n,to:t})):h instanceof Error?s(h):Ru(h)?s(Kt(2,{from:t,to:h})):(i&&r.enterCallbacks[o]===i&&typeof h=="function"&&i.push(h),a())},c=e.call(r&&r.instances[o],t,n,l);let d=Promise.resolve(c);e.length<3&&(d=d.then(l)),d.catch(h=>s(h))})}function vr(e,t,n,r){const o=[];for(const i of e)for(const a in i.components){let s=i.components[a];if(!(t!=="beforeRouteEnter"&&!i.instances[a]))if(ad(s)){const c=(s.__vccOpts||s)[t];c&&o.push(dt(c,n,r,i,a))}else{let l=s();o.push(()=>l.then(c=>{if(!c)return Promise.reject(new Error(`Couldn't resolve component "${a}" at "${i.path}"`));const d=fu(c)?c.default:c;i.components[a]=d;const f=(d.__vccOpts||d)[t];return f&&dt(f,n,r,i,a)()}))}}return o}function ad(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function hi(e){const t=Ee(ir),n=Ee(fo),r=ve(()=>t.resolve(Ot(e.to))),o=ve(()=>{const{matched:l}=r.value,{length:c}=l,d=l[c-1],h=n.matched;if(!d||!h.length)return-1;const f=h.findIndex(qt.bind(null,d));if(f>-1)return f;const b=mi(l[c-2]);return c>1&&mi(d)===b&&h[h.length-1].path!==b?h.findIndex(qt.bind(null,l[c-2])):f}),i=ve(()=>o.value>-1&&ud(n.params,r.value.params)),a=ve(()=>o.value>-1&&o.value===n.matched.length-1&&Ka(n.params,r.value.params));function s(l={}){return cd(l)?t[Ot(e.replace)?"replace":"push"](Ot(e.to)).catch(dn):Promise.resolve()}return{route:r,href:ve(()=>r.value.href),isActive:i,isExactActive:a,navigate:s}}const sd=Ve({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:hi,setup(e,{slots:t}){const n=Jt(hi(e)),{options:r}=Ee(ir),o=ve(()=>({[gi(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[gi(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const i=t.default&&t.default(n);return e.custom?i:be("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},i)}}}),ld=sd;function cd(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function ud(e,t){for(const n in t){const r=t[n],o=e[n];if(typeof r=="string"){if(r!==o)return!1}else if(!Array.isArray(o)||o.length!==r.length||r.some((i,a)=>i!==o[a]))return!1}return!0}function mi(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const gi=(e,t,n)=>e!=null?e:t!=null?t:n,dd=Ve({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=Ee(Nr),o=ve(()=>e.route||r.value),i=Ee(ri,0),a=ve(()=>o.value.matched[i]);Pt(ri,i+1),Pt(du,a),Pt(Nr,o);const s=Te();return tt(()=>[s.value,a.value,e.name],([l,c,d],[h,f,b])=>{c&&(c.instances[d]=l,f&&f!==c&&l&&l===h&&(c.leaveGuards.size||(c.leaveGuards=f.leaveGuards),c.updateGuards.size||(c.updateGuards=f.updateGuards))),l&&c&&(!f||!qt(c,f)||!h)&&(c.enterCallbacks[d]||[]).forEach(w=>w(l))},{flush:"post"}),()=>{const l=o.value,c=a.value,d=c&&c.components[e.name],h=e.name;if(!d)return vi(n.default,{Component:d,route:l});const f=c.props[e.name],b=f?f===!0?l.params:typeof f=="function"?f(l):f:null,I=be(d,fe({},b,t,{onVnodeUnmounted:T=>{T.component.isUnmounted&&(c.instances[h]=null)},ref:s}));return vi(n.default,{Component:I,route:l})||I}}});function vi(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const ns=dd;function fd(e){const t=$u(e.routes,e),n=e.parseQuery||od,r=e.stringifyQuery||pi,o=e.history,i=tn(),a=tn(),s=tn(),l=Gi(Ze);let c=Ze;Ht&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const d=mr.bind(null,x=>""+x),h=mr.bind(null,rd),f=mr.bind(null,qn);function b(x,j){let S,B;return Ya(x)?(S=t.getRecordMatcher(x),B=j):B=x,t.addRoute(B,S)}function w(x){const j=t.getRecordMatcher(x);j&&t.removeRoute(j)}function I(){return t.getRoutes().map(x=>x.record)}function T(x){return!!t.getRecordMatcher(x)}function g(x,j){if(j=fe({},j||l.value),typeof x=="string"){const Z=gr(n,x,j.path),u=t.resolve({path:Z.path},j),p=o.createHref(Z.fullPath);return fe(Z,u,{params:f(u.params),hash:qn(Z.hash),redirectedFrom:void 0,href:p})}let S;if("path"in x)S=fe({},x,{path:gr(n,x.path,j.path).path});else{const Z=fe({},x.params);for(const u in Z)Z[u]==null&&delete Z[u];S=fe({},x,{params:h(x.params)}),j.params=h(j.params)}const B=t.resolve(S,j),le=x.hash||"";B.params=d(f(B.params));const ce=mu(r,fe({},x,{hash:ed(le),path:B.path})),te=o.createHref(ce);return fe({fullPath:ce,hash:le,query:r===pi?id(x.query):x.query||{}},B,{redirectedFrom:void 0,href:te})}function y(x){return typeof x=="string"?gr(n,x,l.value.path):fe({},x)}function P(x,j){if(c!==x)return Kt(8,{from:j,to:x})}function D(x){return M(x)}function U(x){return D(fe(y(x),{replace:!0}))}function $(x){const j=x.matched[x.matched.length-1];if(j&&j.redirect){const{redirect:S}=j;let B=typeof S=="function"?S(x):S;return typeof B=="string"&&(B=B.includes("?")||B.includes("#")?B=y(B):{path:B},B.params={}),fe({query:x.query,hash:x.hash,params:x.params},B)}}function M(x,j){const S=c=g(x),B=l.value,le=x.state,ce=x.force,te=x.replace===!0,Z=$(S);if(Z)return M(fe(y(Z),{state:le,force:ce,replace:te}),j||S);const u=S;u.redirectedFrom=j;let p;return!ce&&gu(r,B,S)&&(p=Kt(16,{to:u,from:B}),Oe(B,B,!0,!1)),(p?Promise.resolve(p):Y(u,B)).catch(v=>lt(v)?lt(v,2)?v:we(v):X(v,u,B)).then(v=>{if(v){if(lt(v,2))return M(fe(y(v.to),{state:le,force:ce,replace:te}),j||u)}else v=q(u,B,!0,te,le);return F(u,B,v),v})}function m(x,j){const S=P(x,j);return S?Promise.reject(S):Promise.resolve()}function Y(x,j){let S;const[B,le,ce]=pd(x,j);S=vr(B.reverse(),"beforeRouteLeave",x,j);for(const Z of B)Z.leaveGuards.forEach(u=>{S.push(dt(u,x,j))});const te=m.bind(null,x,j);return S.push(te),zt(S).then(()=>{S=[];for(const Z of i.list())S.push(dt(Z,x,j));return S.push(te),zt(S)}).then(()=>{S=vr(le,"beforeRouteUpdate",x,j);for(const Z of le)Z.updateGuards.forEach(u=>{S.push(dt(u,x,j))});return S.push(te),zt(S)}).then(()=>{S=[];for(const Z of x.matched)if(Z.beforeEnter&&!j.matched.includes(Z))if(Array.isArray(Z.beforeEnter))for(const u of Z.beforeEnter)S.push(dt(u,x,j));else S.push(dt(Z.beforeEnter,x,j));return S.push(te),zt(S)}).then(()=>(x.matched.forEach(Z=>Z.enterCallbacks={}),S=vr(ce,"beforeRouteEnter",x,j),S.push(te),zt(S))).then(()=>{S=[];for(const Z of a.list())S.push(dt(Z,x,j));return S.push(te),zt(S)}).catch(Z=>lt(Z,8)?Z:Promise.reject(Z))}function F(x,j,S){for(const B of s.list())B(x,j,S)}function q(x,j,S,B,le){const ce=P(x,j);if(ce)return ce;const te=j===Ze,Z=Ht?history.state:{};S&&(B||te?o.replace(x.fullPath,fe({scroll:te&&Z&&Z.scroll},le)):o.push(x.fullPath,le)),l.value=x,Oe(x,j,S,te),we()}let _;function z(){_||(_=o.listen((x,j,S)=>{const B=g(x),le=$(B);if(le){M(fe(le,{replace:!0}),B).catch(dn);return}c=B;const ce=l.value;Ht&&ku(ai(ce.fullPath,S.delta),ar()),Y(B,ce).catch(te=>lt(te,12)?te:lt(te,2)?(M(te.to,B).then(Z=>{lt(Z,20)&&!S.delta&&S.type===yn.pop&&o.go(-1,!1)}).catch(dn),Promise.reject()):(S.delta&&o.go(-S.delta,!1),X(te,B,ce))).then(te=>{te=te||q(B,ce,!1),te&&(S.delta?o.go(-S.delta,!1):S.type===yn.pop&<(te,20)&&o.go(-1,!1)),F(B,ce,te)}).catch(dn)}))}let R=tn(),re=tn(),H;function X(x,j,S){we(x);const B=re.list();return B.length?B.forEach(le=>le(x,j,S)):console.error(x),Promise.reject(x)}function ne(){return H&&l.value!==Ze?Promise.resolve():new Promise((x,j)=>{R.add([x,j])})}function we(x){return H||(H=!x,z(),R.list().forEach(([j,S])=>x?S(x):j()),R.reset()),x}function Oe(x,j,S,B){const{scrollBehavior:le}=e;if(!Ht||!le)return Promise.resolve();const ce=!S&&Cu(ai(x.fullPath,0))||(B||!S)&&history.state&&history.state.scroll||null;return no().then(()=>le(x,j,ce)).then(te=>te&&Eu(te)).catch(te=>X(te,x,j))}const Ie=x=>o.go(x);let Fe;const Re=new Set;return{currentRoute:l,addRoute:b,removeRoute:w,hasRoute:T,getRoutes:I,resolve:g,options:e,push:D,replace:U,go:Ie,back:()=>Ie(-1),forward:()=>Ie(1),beforeEach:i.add,beforeResolve:a.add,afterEach:s.add,onError:re.add,isReady:ne,install(x){const j=this;x.component("RouterLink",ld),x.component("RouterView",ns),x.config.globalProperties.$router=j,Object.defineProperty(x.config.globalProperties,"$route",{enumerable:!0,get:()=>Ot(l)}),Ht&&!Fe&&l.value===Ze&&(Fe=!0,D(o.location).catch(le=>{}));const S={};for(const le in Ze)S[le]=ve(()=>l.value[le]);x.provide(ir,j),x.provide(fo,Jt(S)),x.provide(Nr,l);const B=x.unmount;Re.add(x),x.unmount=function(){Re.delete(x),Re.size<1&&(c=Ze,_&&_(),_=null,l.value=Ze,Fe=!1,H=!1),B()}}}}function zt(e){return e.reduce((t,n)=>t.then(()=>n()),Promise.resolve())}function pd(e,t){const n=[],r=[],o=[],i=Math.max(t.matched.length,e.matched.length);for(let a=0;aqt(c,s))?r.push(s):n.push(s));const l=e.matched[a];l&&(t.matched.find(c=>qt(c,l))||o.push(l))}return[n,r,o]}function ho(){return Ee(ir)}function mo(){return Ee(fo)}const hd=({headerLinkSelector:e,headerAnchorSelector:t,delay:n,offset:r=5})=>{const o=ho(),i=kn(),s=Ua(()=>{var T,g,y,P;const l=Math.max(window.scrollY,document.documentElement.scrollTop,document.body.scrollTop);if(Math.abs(l-0)b.some(U=>U.hash===D.hash));for(let D=0;D=((g=(T=U.parentElement)==null?void 0:T.offsetTop)!=null?g:0)-r,m=!$||l<((P=(y=$.parentElement)==null?void 0:y.offsetTop)!=null?P:0)-r;if(!(M&&m))continue;const F=decodeURIComponent(o.currentRoute.value.hash),q=decodeURIComponent(U.hash);if(F===q)return;if(f){for(let _=D+1;_{s(),window.addEventListener("scroll",s)}),oo(()=>{window.removeEventListener("scroll",s)}),tt(()=>i.value.path,s)},bi=async(e,...t)=>{const{scrollBehavior:n}=e.options;e.options.scrollBehavior=void 0,await e.replace(...t).finally(()=>e.options.scrollBehavior=n)},md="a.sidebar-item",gd=".header-anchor",vd=300,bd=5;var yd=Lt({setup(){hd({headerLinkSelector:md,headerAnchorSelector:gd,delay:vd,offset:bd})}});const yi=()=>window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,wd=()=>window.scrollTo({top:0,behavior:"smooth"});const _d=Ve({name:"BackToTop",setup(){const e=Te(0),t=ve(()=>e.value>300),n=Ua(()=>{e.value=yi()},100);vt(()=>{e.value=yi(),window.addEventListener("scroll",()=>n())});const r=be("div",{class:"back-to-top",onClick:wd});return()=>be(co,{name:"back-to-top"},()=>t.value?r:null)}});var xd=Lt({rootComponents:[_d]});const Ed=be("svg",{class:"external-link-icon",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"},[be("path",{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}),be("polygon",{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"})]),kd=Ve({name:"ExternalLinkIcon",props:{locales:{type:Object,required:!1,default:()=>({})}},setup(e){const t=iu(),n=ve(()=>{var r;return(r=e.locales[t.value])!=null?r:{openInNewWindow:"open in new window"}});return()=>be("span",[Ed,be("span",{class:"external-link-icon-sr-only"},n.value.openInNewWindow)])}}),Cd={"/":{openInNewWindow:"open in new window"}};var Ad=Lt({enhance({app:e}){e.component("ExternalLinkIcon",be(kd,{locales:Cd}))}});/*! medium-zoom 1.0.6 | MIT License | https://github.com/francoischalifour/medium-zoom */var Et=Object.assign||function(e){for(var t=1;t1&&arguments[1]!==void 0?arguments[1]:{},r=window.Promise||function(_){function z(){}_(z,z)},o=function(_){var z=_.target;if(z===Y){w();return}P.indexOf(z)!==-1&&I({target:z})},i=function(){if(!(U||!m.original)){var _=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs($-_)>M.scrollOffset&&setTimeout(w,150)}},a=function(_){var z=_.key||_.keyCode;(z==="Escape"||z==="Esc"||z===27)&&w()},s=function(){var _=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},z=_;if(_.background&&(Y.style.background=_.background),_.container&&_.container instanceof Object&&(z.container=Et({},M.container,_.container)),_.template){var R=Dn(_.template)?_.template:document.querySelector(_.template);z.template=R}return M=Et({},M,z),P.forEach(function(re){re.dispatchEvent(Mt("medium-zoom:update",{detail:{zoom:F}}))}),F},l=function(){var _=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return e(Et({},M,_))},c=function(){for(var _=arguments.length,z=Array(_),R=0;R<_;R++)z[R]=arguments[R];var re=z.reduce(function(H,X){return[].concat(H,_i(X))},[]);return re.filter(function(H){return P.indexOf(H)===-1}).forEach(function(H){P.push(H),H.classList.add("medium-zoom-image")}),D.forEach(function(H){var X=H.type,ne=H.listener,we=H.options;re.forEach(function(Oe){Oe.addEventListener(X,ne,we)})}),F},d=function(){for(var _=arguments.length,z=Array(_),R=0;R<_;R++)z[R]=arguments[R];m.zoomed&&w();var re=z.length>0?z.reduce(function(H,X){return[].concat(H,_i(X))},[]):P;return re.forEach(function(H){H.classList.remove("medium-zoom-image"),H.dispatchEvent(Mt("medium-zoom:detach",{detail:{zoom:F}}))}),P=P.filter(function(H){return re.indexOf(H)===-1}),F},h=function(_,z){var R=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return P.forEach(function(re){re.addEventListener("medium-zoom:"+_,z,R)}),D.push({type:"medium-zoom:"+_,listener:z,options:R}),F},f=function(_,z){var R=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return P.forEach(function(re){re.removeEventListener("medium-zoom:"+_,z,R)}),D=D.filter(function(re){return!(re.type==="medium-zoom:"+_&&re.listener.toString()===z.toString())}),F},b=function(){var _=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},z=_.target,R=function(){var H={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},X=void 0,ne=void 0;if(M.container)if(M.container instanceof Object)H=Et({},H,M.container),X=H.width-H.left-H.right-M.margin*2,ne=H.height-H.top-H.bottom-M.margin*2;else{var we=Dn(M.container)?M.container:document.querySelector(M.container),Oe=we.getBoundingClientRect(),Ie=Oe.width,Fe=Oe.height,Re=Oe.left,Qt=Oe.top;H=Et({},H,{width:Ie,height:Fe,left:Re,top:Qt})}X=X||H.width-M.margin*2,ne=ne||H.height-M.margin*2;var x=m.zoomedHd||m.original,j=wi(x)?X:x.naturalWidth||X,S=wi(x)?ne:x.naturalHeight||ne,B=x.getBoundingClientRect(),le=B.top,ce=B.left,te=B.width,Z=B.height,u=Math.min(j,X)/te,p=Math.min(S,ne)/Z,v=Math.min(u,p),k=(-ce+(X-te)/2+M.margin+H.left)/v,E=(-le+(ne-Z)/2+M.margin+H.top)/v,A="scale("+v+") translate3d("+k+"px, "+E+"px, 0)";m.zoomed.style.transform=A,m.zoomedHd&&(m.zoomedHd.style.transform=A)};return new r(function(re){if(z&&P.indexOf(z)===-1){re(F);return}var H=function Ie(){U=!1,m.zoomed.removeEventListener("transitionend",Ie),m.original.dispatchEvent(Mt("medium-zoom:opened",{detail:{zoom:F}})),re(F)};if(m.zoomed){re(F);return}if(z)m.original=z;else if(P.length>0){var X=P;m.original=X[0]}else{re(F);return}if(m.original.dispatchEvent(Mt("medium-zoom:open",{detail:{zoom:F}})),$=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,U=!0,m.zoomed=Pd(m.original),document.body.appendChild(Y),M.template){var ne=Dn(M.template)?M.template:document.querySelector(M.template);m.template=document.createElement("div"),m.template.appendChild(ne.content.cloneNode(!0)),document.body.appendChild(m.template)}if(document.body.appendChild(m.zoomed),window.requestAnimationFrame(function(){document.body.classList.add("medium-zoom--opened")}),m.original.classList.add("medium-zoom-image--hidden"),m.zoomed.classList.add("medium-zoom-image--opened"),m.zoomed.addEventListener("click",w),m.zoomed.addEventListener("transitionend",H),m.original.getAttribute("data-zoom-src")){m.zoomedHd=m.zoomed.cloneNode(),m.zoomedHd.removeAttribute("srcset"),m.zoomedHd.removeAttribute("sizes"),m.zoomedHd.src=m.zoomed.getAttribute("data-zoom-src"),m.zoomedHd.onerror=function(){clearInterval(we),console.warn("Unable to reach the zoom image target "+m.zoomedHd.src),m.zoomedHd=null,R()};var we=setInterval(function(){m.zoomedHd.complete&&(clearInterval(we),m.zoomedHd.classList.add("medium-zoom-image--opened"),m.zoomedHd.addEventListener("click",w),document.body.appendChild(m.zoomedHd),R())},10)}else if(m.original.hasAttribute("srcset")){m.zoomedHd=m.zoomed.cloneNode(),m.zoomedHd.removeAttribute("sizes"),m.zoomedHd.removeAttribute("loading");var Oe=m.zoomedHd.addEventListener("load",function(){m.zoomedHd.removeEventListener("load",Oe),m.zoomedHd.classList.add("medium-zoom-image--opened"),m.zoomedHd.addEventListener("click",w),document.body.appendChild(m.zoomedHd),R()})}else R()})},w=function(){return new r(function(_){if(U||!m.original){_(F);return}var z=function R(){m.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(m.zoomed),m.zoomedHd&&document.body.removeChild(m.zoomedHd),document.body.removeChild(Y),m.zoomed.classList.remove("medium-zoom-image--opened"),m.template&&document.body.removeChild(m.template),U=!1,m.zoomed.removeEventListener("transitionend",R),m.original.dispatchEvent(Mt("medium-zoom:closed",{detail:{zoom:F}})),m.original=null,m.zoomed=null,m.zoomedHd=null,m.template=null,_(F)};U=!0,document.body.classList.remove("medium-zoom--opened"),m.zoomed.style.transform="",m.zoomedHd&&(m.zoomedHd.style.transform=""),m.template&&(m.template.style.transition="opacity 150ms",m.template.style.opacity=0),m.original.dispatchEvent(Mt("medium-zoom:close",{detail:{zoom:F}})),m.zoomed.addEventListener("transitionend",z)})},I=function(){var _=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},z=_.target;return m.original?w():b({target:z})},T=function(){return M},g=function(){return P},y=function(){return m.original},P=[],D=[],U=!1,$=0,M=n,m={original:null,zoomed:null,zoomedHd:null,template:null};Object.prototype.toString.call(t)==="[object Object]"?M=t:(t||typeof t=="string")&&c(t),M=Et({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},M);var Y=Od(M.background);document.addEventListener("click",o),document.addEventListener("keyup",a),document.addEventListener("scroll",i),window.addEventListener("resize",w);var F={open:b,close:w,toggle:I,update:s,clone:l,attach:c,detach:d,on:h,off:f,getOptions:T,getImages:g,getZoomedImage:y};return F};function Sd(e,t){t===void 0&&(t={});var n=t.insertAt;if(!(!e||typeof document=="undefined")){var r=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",n==="top"&&r.firstChild?r.insertBefore(o,r.firstChild):r.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}var Ld=".medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}";Sd(Ld);var Id=Rd;const zd=Symbol("mediumZoom");const Md=".theme-default-content > img, .theme-default-content :not(a) > img",Dd={},Nd=300;var Hd=Lt({enhance({app:e,router:t}){const n=Id(Dd);n.refresh=(r=Md)=>{n.detach(),n.attach(r)},e.provide(zd,n),t.afterEach(()=>{setTimeout(()=>n.refresh(),Nd)})}});/** + * NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress + * @license MIT + */const ae={settings:{minimum:.08,easing:"ease",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'
'},status:null,set:e=>{const t=ae.isStarted();e=br(e,ae.settings.minimum,1),ae.status=e===1?null:e;const n=ae.render(!t),r=n.querySelector(ae.settings.barSelector),o=ae.settings.speed,i=ae.settings.easing;return n.offsetWidth,Fd(a=>{zn(r,{transform:"translate3d("+xi(e)+"%,0,0)",transition:"all "+o+"ms "+i}),e===1?(zn(n,{transition:"none",opacity:"1"}),n.offsetWidth,setTimeout(function(){zn(n,{transition:"all "+o+"ms linear",opacity:"0"}),setTimeout(function(){ae.remove(),a()},o)},o)):setTimeout(()=>a(),o)}),ae},isStarted:()=>typeof ae.status=="number",start:()=>{ae.status||ae.set(0);const e=()=>{setTimeout(()=>{!ae.status||(ae.trickle(),e())},ae.settings.trickleSpeed)};return ae.settings.trickle&&e(),ae},done:e=>!e&&!ae.status?ae:ae.inc(.3+.5*Math.random()).set(1),inc:e=>{let t=ae.status;return t?(typeof e!="number"&&(e=(1-t)*br(Math.random()*t,.1,.95)),t=br(t+e,0,.994),ae.set(t)):ae.start()},trickle:()=>ae.inc(Math.random()*ae.settings.trickleRate),render:e=>{if(ae.isRendered())return document.getElementById("nprogress");Ei(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=ae.settings.template;const n=t.querySelector(ae.settings.barSelector),r=e?"-100":xi(ae.status||0),o=document.querySelector(ae.settings.parent);return zn(n,{transition:"all 0 linear",transform:"translate3d("+r+"%,0,0)"}),o!==document.body&&Ei(o,"nprogress-custom-parent"),o==null||o.appendChild(t),t},remove:()=>{ki(document.documentElement,"nprogress-busy"),ki(document.querySelector(ae.settings.parent),"nprogress-custom-parent");const e=document.getElementById("nprogress");e&&$d(e)},isRendered:()=>!!document.getElementById("nprogress")},br=(e,t,n)=>en?n:e,xi=e=>(-1+e)*100,Fd=function(){const e=[];function t(){const n=e.shift();n&&n(t)}return function(n){e.push(n),e.length===1&&t()}}(),zn=function(){const e=["Webkit","O","Moz","ms"],t={};function n(a){return a.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(s,l){return l.toUpperCase()})}function r(a){const s=document.body.style;if(a in s)return a;let l=e.length;const c=a.charAt(0).toUpperCase()+a.slice(1);let d;for(;l--;)if(d=e[l]+c,d in s)return d;return a}function o(a){return a=n(a),t[a]||(t[a]=r(a))}function i(a,s,l){s=o(s),a.style[s]=l}return function(a,s){for(const l in s){const c=s[l];c!==void 0&&Object.prototype.hasOwnProperty.call(s,l)&&i(a,l,c)}}}(),rs=(e,t)=>(typeof e=="string"?e:go(e)).indexOf(" "+t+" ")>=0,Ei=(e,t)=>{const n=go(e),r=n+t;rs(n,t)||(e.className=r.substring(1))},ki=(e,t)=>{const n=go(e);if(!rs(e,t))return;const r=n.replace(" "+t+" "," ");e.className=r.substring(1,r.length-1)},go=e=>(" "+(e.className||"")+" ").replace(/\s+/gi," "),$d=e=>{e&&e.parentNode&&e.parentNode.removeChild(e)};const jd=()=>{vt(()=>{const e=ho(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach(n=>{t.has(n.path)||ae.start()}),e.afterEach(n=>{t.add(n.path),ae.done()})})};var Bd=Lt({setup(){jd()}});const Vd=JSON.parse(`{"repoLabel":"Contribute","docsRepo":"the-human-colossus-foundation/oca-spec","lastUpdated":true,"logo":"images/oca-logo.png","logoDark":"images/oca-logo-white.png","editLink":false,"contributors":false,"sidebar":"auto","sidebarDepth":4,"navbar":[{"text":"Guide","children":[{"text":"Introduction","link":"/guide/introduction"},{"text":"Applications","link":"/guide/applications"},{"text":"FAQ","link":"/guide/faq"}]},{"text":"Specification","children":[{"text":"v1.0.1","link":"/specification"},{"text":"Contribute","link":"https://github.com/the-human-colossus-foundation/oca-spec"}]},{"text":"Ecosystem","children":[{"text":"Ecosystem Tour","link":"/ecosystem/tour"},{"text":"OCA Parser","link":"/ecosystem/oca-parser"},{"text":"OCA Browser","link":"/ecosystem/oca-browser"},{"text":"OCA Repository","link":"/ecosystem/oca-repository"},{"text":"OCA Data Vault","link":"/ecosystem/oca-data-vault"},{"text":"OCA Validator","link":"/ecosystem/oca-validator"},{"text":"OCA Transformer","link":"/ecosystem/oca-transformer"},{"text":"OCA Bundle","link":"/ecosystem/oca-bundle"},{"text":"Get Started","link":"/ecosystem/getting-started"}]},{"text":"Community","link":"/community"}],"locales":{"/":{"selectLanguageName":"English"}},"colorMode":"auto","colorModeSwitch":true,"repo":null,"selectLanguageText":"Languages","selectLanguageAriaLabel":"Select language","editLinkText":"Edit this page","lastUpdatedText":"Last Updated","contributorsText":"Contributors","notFound":["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."],"backToHome":"Take me home","openInNewWindow":"open in new window","toggleColorMode":"toggle color mode","toggleSidebar":"toggle sidebar"}`),os=Te(Vd),Ud=()=>os;bo.webpackHot&&(__VUE_HMR_RUNTIME__.updateThemeData=e=>{os.value=e});const is=Symbol(""),qd=()=>{const e=Ee(is);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},Kd=(e,t)=>{var n;return{...e,...(n=e.locales)==null?void 0:n[t]}};var Wd=Lt({enhance({app:e}){const t=Ud(),n=e._context.provides[uo],r=ve(()=>Kd(t.value,n.value));e.provide(is,r),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return r.value}}})}}),as=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n};const Yd=Ve({__name:"Badge",props:{type:{type:String,required:!1,default:"tip"},text:{type:String,required:!1,default:""},vertical:{type:String,required:!1,default:void 0}},setup(e){return(t,n)=>(nr(),Aa("span",{class:wn(["badge",e.type]),style:Yn({verticalAlign:e.vertical})},[ha(t.$slots,"default",{},()=>[so(ks(e.text),1)])],6))}});var Jd=as(Yd,[["__file","Badge.vue"]]);const Gd=Ve({name:"CodeGroup",setup(e,{slots:t}){const n=Te(-1),r=Te([]),o=(s=n.value)=>{s{s>0?n.value=s-1:n.value=r.value.length-1,r.value[n.value].focus()},a=(s,l)=>{s.key===" "||s.key==="Enter"?(s.preventDefault(),n.value=l):s.key==="ArrowRight"?(s.preventDefault(),o(l)):s.key==="ArrowLeft"&&(s.preventDefault(),i(l))};return()=>{var l;const s=(((l=t.default)==null?void 0:l.call(t))||[]).filter(c=>c.type.name==="CodeGroupItem").map(c=>(c.props===null&&(c.props={}),c));return s.length===0?null:(n.value<0||n.value>s.length-1?(n.value=s.findIndex(c=>c.props.active===""||c.props.active===!0),n.value===-1&&(n.value=0)):s.forEach((c,d)=>{c.props.active=d===n.value}),be("div",{class:"code-group"},[be("div",{class:"code-group__nav"},be("ul",{class:"code-group__ul"},s.map((c,d)=>{const h=d===n.value;return be("li",{class:"code-group__li"},be("button",{ref:f=>{f&&(r.value[d]=f)},class:{"code-group__nav-tab":!0,"code-group__nav-tab-active":h},ariaPressed:h,ariaExpanded:h,onClick:()=>n.value=d,onKeydown:f=>a(f,d)},c.props.title))}))),s]))}}}),Qd=["aria-selected"],Zd=Ve({name:"CodeGroupItem"}),Xd=Ve({...Zd,props:{title:{type:String,required:!0},active:{type:Boolean,required:!1,default:!1}},setup(e){return(t,n)=>(nr(),Aa("div",{class:wn(["code-group-item",{"code-group-item__active":e.active}]),"aria-selected":e.active},[ha(t.$slots,"default")],10,Qd))}});var ef=as(Xd,[["__file","CodeGroupItem.vue"]]);function ss(e){return zs()?(Ms(e),!0):!1}var Ci;const Cn=typeof window!="undefined",tf=e=>typeof e=="string",yr=()=>{};Cn&&((Ci=window==null?void 0:window.navigator)==null?void 0:Ci.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent);function nf(e,t){function n(...r){e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})}return n}const ls=e=>e();function rf(e=ls){const t=Te(!0);function n(){t.value=!1}function r(){t.value=!0}return{isActive:t,pause:n,resume:r,eventFilter:(...i)=>{t.value&&e(...i)}}}function of(e,t=!0){Ra()?fa(e):t?e():no(e)}var Ai=Object.getOwnPropertySymbols,af=Object.prototype.hasOwnProperty,sf=Object.prototype.propertyIsEnumerable,lf=(e,t)=>{var n={};for(var r in e)af.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Ai)for(var r of Ai(e))t.indexOf(r)<0&&sf.call(e,r)&&(n[r]=e[r]);return n};function cf(e,t,n={}){const r=n,{eventFilter:o=ls}=r,i=lf(r,["eventFilter"]);return tt(e,nf(o,t),i)}var uf=Object.defineProperty,df=Object.defineProperties,ff=Object.getOwnPropertyDescriptors,Kn=Object.getOwnPropertySymbols,cs=Object.prototype.hasOwnProperty,us=Object.prototype.propertyIsEnumerable,Ti=(e,t,n)=>t in e?uf(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,pf=(e,t)=>{for(var n in t||(t={}))cs.call(t,n)&&Ti(e,n,t[n]);if(Kn)for(var n of Kn(t))us.call(t,n)&&Ti(e,n,t[n]);return e},hf=(e,t)=>df(e,ff(t)),mf=(e,t)=>{var n={};for(var r in e)cs.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Kn)for(var r of Kn(e))t.indexOf(r)<0&&us.call(e,r)&&(n[r]=e[r]);return n};function gf(e,t,n={}){const r=n,{eventFilter:o}=r,i=mf(r,["eventFilter"]),{eventFilter:a,pause:s,resume:l,isActive:c}=rf(o);return{stop:cf(e,t,hf(pf({},i),{eventFilter:a})),pause:s,resume:l,isActive:c}}function vf(e){var t;const n=Ot(e);return(t=n==null?void 0:n.$el)!=null?t:n}const Wn=Cn?window:void 0;Cn&&window.document;Cn&&window.navigator;Cn&&window.location;function bf(...e){let t,n,r,o;if(tf(e[0])?([n,r,o]=e,t=Wn):[t,n,r,o]=e,!t)return yr;let i=yr;const a=tt(()=>vf(t),l=>{i(),l&&(l.addEventListener(n,r,o),i=()=>{l.removeEventListener(n,r,o),i=yr})},{immediate:!0,flush:"post"}),s=()=>{a(),i()};return ss(s),s}function yf(e,t={}){const{window:n=Wn}=t,r=Boolean(n&&"matchMedia"in n);let o;const i=Te(!1),a=()=>{!r||(o||(o=n.matchMedia(e)),i.value=o.matches)};return of(()=>{a(),o&&("addEventListener"in o?o.addEventListener("change",a):o.addListener(a),ss(()=>{"removeEventListener"in o?o.removeEventListener("change",a):o.removeListener(a)}))}),i}const $r=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:typeof global!="undefined"?global:typeof self!="undefined"?self:{},jr="__vueuse_ssr_handlers__";$r[jr]=$r[jr]||{};const wf=$r[jr];function _f(e,t){return wf[e]||t}function xf(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"||Array.isArray(e)?"object":Number.isNaN(e)?"any":"number"}const Ef={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}};function kf(e,t,n,r={}){var o;const{flush:i="pre",deep:a=!0,listenToStorageChanges:s=!0,writeDefaults:l=!0,shallow:c,window:d=Wn,eventFilter:h,onError:f=$=>{console.error($)}}=r,b=(c?Gi:Te)(t);if(!n)try{n=_f("getDefaultStorage",()=>{var $;return($=Wn)==null?void 0:$.localStorage})()}catch($){f($)}if(!n)return b;const w=Ot(t),I=xf(w),T=(o=r.serializer)!=null?o:Ef[I],{pause:g,resume:y}=gf(b,()=>P(b.value),{flush:i,deep:a,eventFilter:h});return d&&s&&bf(d,"storage",U),U(),b;function P($){try{$==null?n.removeItem(e):n.setItem(e,T.write($))}catch(M){f(M)}}function D($){if(!($&&$.key!==e)){g();try{const M=$?$.newValue:n.getItem(e);return M==null?(l&&w!==null&&n.setItem(e,T.write(w)),w):typeof M!="string"?M:T.read(M)}catch(M){f(M)}finally{y()}}}function U($){$&&$.key!==e||(b.value=D($))}}function Cf(e){return yf("(prefers-color-scheme: dark)",e)}var Oi;(function(e){e.UP="UP",e.RIGHT="RIGHT",e.DOWN="DOWN",e.LEFT="LEFT",e.NONE="NONE"})(Oi||(Oi={}));const ds=Symbol(""),op=()=>{const e=Ee(ds);if(!e)throw new Error("useDarkMode() is called without provider.");return e},Af=()=>{const e=ms(),t=Cf(),n=kf("vuepress-color-scheme",e.value.colorMode),r=ve({get(){return e.value.colorModeSwitch?n.value==="auto"?t.value:n.value==="dark":e.value.colorMode==="dark"},set(o){o===t.value?n.value="auto":n.value=o?"dark":"light"}});Pt(ds,r),Tf(r)},Tf=e=>{const t=(n=e.value)=>{const r=window==null?void 0:window.document.querySelector("html");r==null||r.classList.toggle("dark",n)};vt(()=>{tt(e,t,{immediate:!0})}),io(()=>t())},fs=(...e)=>{const n=ho().resolve(...e),r=n.matched[n.matched.length-1];if(!(r!=null&&r.redirect))return n;const{redirect:o}=r,i=ee(o)?o(n):o,a=he(i)?{path:i}:i;return fs({hash:n.hash,query:n.query,params:n.params,...a})},Of=e=>{const t=fs(encodeURI(e));return{text:t.meta.title||e,link:t.name==="404"?e:t.fullPath}};let wr=null,nn=null;const Pf={wait:()=>wr,pending:()=>{wr=new Promise(e=>nn=e)},resolve:()=>{nn==null||nn(),wr=null,nn=null}},Rf=()=>Pf,ps=Symbol("sidebarItems"),ip=()=>{const e=Ee(ps);if(!e)throw new Error("useSidebarItems() is called without provider.");return e},Sf=()=>{const e=ms(),t=tu(),n=ve(()=>Lf(t.value,e.value));Pt(ps,n)},Lf=(e,t)=>{var o,i,a,s;const n=(i=(o=e.sidebar)!=null?o:t.sidebar)!=null?i:"auto",r=(s=(a=e.sidebarDepth)!=null?a:t.sidebarDepth)!=null?s:2;return e.home||n===!1?[]:n==="auto"?zf(r):G(n)?hs(n,r):Ma(n)?Mf(n,r):[]},If=(e,t)=>({text:e.title,link:`#${e.slug}`,children:vo(e.children,t)}),vo=(e,t)=>t>0?e.map(n=>If(n,t-1)):[],zf=e=>{const t=kn();return[{text:t.value.title,children:vo(t.value.headers,e)}]},hs=(e,t)=>{const n=mo(),r=kn(),o=i=>{var s;let a;if(he(i)?a=Of(i):a=i,a.children)return{...a,children:a.children.map(l=>o(l))};if(a.link===n.path){const l=((s=r.value.headers[0])==null?void 0:s.level)===1?r.value.headers[0].children:r.value.headers;return{...a,children:vo(l,t)}}return a};return e.map(i=>o(i))},Mf=(e,t)=>{var i;const n=mo(),r=Da(e,n.path),o=(i=e[r])!=null?i:[];return hs(o,t)},ms=()=>qd();var Df=Lt({enhance({app:e,router:t}){e.component("Badge",Jd),e.component("CodeGroup",Gd),e.component("CodeGroupItem",ef),e.component("AutoLinkExternalIcon",()=>{const r=e.component("ExternalLinkIcon");return r?be(r):null}),e.component("NavbarSearch",()=>{const r=e.component("Docsearch")||e.component("SearchBox");return r?be(r):null});const n=t.options.scrollBehavior;t.options.scrollBehavior=async(...r)=>(await Rf().wait(),n(...r))},setup(){Af(),Sf()}});const _r=[yd,xd,Ad,Hd,Bd,Wd,Df],Nf=[["v-8daa1a0e","/",{title:"Overlays Capture Architecture"},["/index.html","/README.md"]],["v-67f865c9","/community.html",{title:"OCA Community"},["/community","/community.md"]],["v-39072b1a","/contribute.html",{title:""},["/contribute","/contribute.md"]],["v-0c525774","/v1.1.0-rc.html",{title:"OCA Spec - 1.1.0-rc"},["/v1.1.0-rc","/v1.1.0-rc.md"]],["v-1a2ad06e","/ecosystem/getting-started.html",{title:"Getting started"},["/ecosystem/getting-started","/ecosystem/getting-started.md"]],["v-5b69fa59","/ecosystem/oca-browser.html",{title:"OCA Browser"},["/ecosystem/oca-browser","/ecosystem/oca-browser.md"]],["v-12ca5e22","/ecosystem/oca-bundle.html",{title:"OCA Bundle"},["/ecosystem/oca-bundle","/ecosystem/oca-bundle.md"]],["v-2327417c","/ecosystem/oca-data-vault.html",{title:""},["/ecosystem/oca-data-vault","/ecosystem/oca-data-vault.md"]],["v-35180e35","/ecosystem/oca-file.html",{title:""},["/ecosystem/oca-file","/ecosystem/oca-file.md"]],["v-10867f72","/ecosystem/oca-parser.html",{title:"OCA Parser"},["/ecosystem/oca-parser","/ecosystem/oca-parser.md"]],["v-11796e4e","/ecosystem/oca-presenter.html",{title:"OCA Presenter"},["/ecosystem/oca-presenter","/ecosystem/oca-presenter.md"]],["v-38173727","/ecosystem/oca-repository.html",{title:"OCA Repository"},["/ecosystem/oca-repository","/ecosystem/oca-repository.md"]],["v-73b65308","/ecosystem/oca-transformer.html",{title:"OCA Transformer"},["/ecosystem/oca-transformer","/ecosystem/oca-transformer.md"]],["v-65ea5a6f","/ecosystem/oca-validator.html",{title:"OCA Validator"},["/ecosystem/oca-validator","/ecosystem/oca-validator.md"]],["v-093dab99","/ecosystem/tour.html",{title:"OCA Ecosystem Tour"},["/ecosystem/tour","/ecosystem/tour.md"]],["v-b038aa76","/specification/",{title:"OCA Technical Specification"},["/specification/index.html","/specification/README.md"]],["v-37e1c06f","/guide/faq.html",{title:"FAQ"},["/guide/faq","/guide/faq.md"]],["v-1c7b2593","/guide/introduction.html",{title:"Introduction"},["/guide/introduction","/guide/introduction.md"]],["v-28942eea","/guide/oca-vs-others-comparison.html",{title:"OCA vs others comparison"},["/guide/oca-vs-others-comparison","/guide/oca-vs-others-comparison.md"]],["v-7e593ce5","/guide/references.html",{title:"References"},["/guide/references","/guide/references.md"]],["v-d8f2b400","/guide/applications/",{title:"Applications"},["/guide/applications/index.html","/guide/applications/README.md"]],["v-4753f562","/guide/applications/swiss-passport-example.html",{title:"Swiss Passport Example"},["/guide/applications/swiss-passport-example","/guide/applications/swiss-passport-example.md"]],["v-3706649a","/404.html",{title:""},["/404"]]];var Hf=()=>Nf.reduce((e,[t,n,r,o])=>(e.push({name:t,path:n,component:ni,meta:r},...o.map(i=>({path:i,redirect:n}))),e),[{name:"404",path:"/:catchAll(.*)",component:ni}]),Ff=Pu,$f=()=>{const e=fd({history:Ff(Zc(ft.value.base)),routes:Hf(),scrollBehavior:(t,n,r)=>r||(t.hash?{el:t.hash}:{top:0})});return e.beforeResolve(async(t,n)=>{var r;(t.path!==n.path||n===Ze)&&([et.value]=await Promise.all([xt.resolvePageData(t.name),(r=Na[t.name])==null?void 0:r.__asyncLoader()]))}),e},jf=e=>{e.component("ClientOnly",lu),e.component("Content",cu)},Bf=(e,t)=>{const n=ve(()=>xt.resolveRouteLocale(ft.value.locales,t.currentRoute.value.path)),r=ve(()=>xt.resolveSiteLocaleData(ft.value,n.value)),o=ve(()=>xt.resolvePageFrontmatter(et.value)),i=ve(()=>xt.resolvePageHeadTitle(et.value,r.value)),a=ve(()=>xt.resolvePageHead(i.value,o.value,r.value)),s=ve(()=>xt.resolvePageLang(et.value));return e.provide(uo,n),e.provide(Va,r),e.provide($a,o),e.provide(ru,i),e.provide(ja,a),e.provide(Ba,s),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>o.value},$head:{get:()=>a.value},$headTitle:{get:()=>i.value},$lang:{get:()=>s.value},$page:{get:()=>et.value},$routeLocale:{get:()=>n.value},$site:{get:()=>ft.value},$siteLocale:{get:()=>r.value},$withBase:{get:()=>uu}}),{pageData:et,pageFrontmatter:o,pageHead:a,pageHeadTitle:i,pageLang:s,routeLocale:n,siteData:ft,siteLocaleData:r}},Vf=()=>{const e=mo(),t=nu(),n=ou(),r=Te([]),o=()=>{t.value.forEach(a=>{const s=Uf(a);s&&r.value.push(s)})},i=()=>{document.documentElement.lang=n.value,r.value.forEach(a=>{a.parentNode===document.head&&document.head.removeChild(a)}),r.value.splice(0,r.value.length),t.value.forEach(a=>{const s=qf(a);s!==null&&(document.head.appendChild(s),r.value.push(s))})};Pt(su,i),vt(()=>{o(),i(),tt(()=>e.path,()=>i())})},Uf=([e,t,n=""])=>{const r=Object.entries(t).map(([s,l])=>he(l)?`[${s}="${l}"]`:l===!0?`[${s}]`:"").join(""),o=`head > ${e}${r}`;return Array.from(document.querySelectorAll(o)).find(s=>s.innerText===n)||null},qf=([e,t,n])=>{if(!he(e))return null;const r=document.createElement(e);return Ma(t)&&Object.entries(t).forEach(([o,i])=>{he(i)?r.setAttribute(o,i):i===!0&&r.setAttribute(o,"")}),he(n)&&r.appendChild(document.createTextNode(n)),r},Kf=Kc,Wf=async()=>{var n;const e=Kf({name:"VuepressApp",setup(){var r;Vf();for(const o of _r)(r=o.setup)==null||r.call(o);return()=>[be(ns),..._r.flatMap(({rootComponents:o=[]})=>o.map(i=>be(i)))]}}),t=$f();jf(e),Bf(e,t);for(const r of _r)await((n=r.enhance)==null?void 0:n.call(r,{app:e,router:t,siteData:ft}));return e.use(t),{app:e,router:t}};Wf().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{au as A,rp as B,op as C,wn as D,be as E,Le as F,uu as G,lu as H,Te as I,tt as J,Jf as K,ep as L,Xc as M,Zc as N,ho as O,he as P,Of as Q,vt as R,Yn as S,co as T,kn as U,ip as V,Ma as W,Xf as X,io as Y,Rf as Z,as as _,Pa as a,ye as b,Aa as c,Wf as createVueApp,so as d,Qf as e,Ve as f,ms as g,Ot as h,tu as i,ve as j,G as k,Gf as l,Zf as m,mo as n,nr as o,Yf as p,Ta as q,Hl as r,lc as s,ks as t,iu as u,ha as v,wl as w,Qc as x,tp as y,np as z}; diff --git a/assets/back-to-top.8efcbe56.svg b/assets/back-to-top.8efcbe56.svg new file mode 100644 index 0000000..8323678 --- /dev/null +++ b/assets/back-to-top.8efcbe56.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/community.html.6f9c1363.js b/assets/community.html.6f9c1363.js new file mode 100644 index 0000000..468c003 --- /dev/null +++ b/assets/community.html.6f9c1363.js @@ -0,0 +1 @@ +import{_ as s,r,o as a,c as i,a as e,b as n,d as o}from"./app.ebda841e.js";const c={},l=e("h1",null,"OCA Community",-1),u=e("p",null,"OCA Community is an open forum on Matrix that welcomes you to join and ask questions about OCA, learn how to implement OCA and discuss where OCA can apply.",-1),_=o("Matrix channel: "),h={href:"https://matrix.to/#/#oca-community:matrix.org",target:"_blank",rel:"noopener noreferrer"},d=o(" https://matrix.to/#/#oca-community:matrix.org "),m=o("If you want to get involved in further developing the OCA specification, please "),f={href:"https://humancolossus.foundation/home/#newsletter",target:"_blank",rel:"noopener noreferrer"},p=o(" sign up for the Human Colossus Foundation newsletter "),y=o(" to stay tuned for the official launch of the Decentralised Semantics Working Group."),x=o("If you want to report bugs and offer feedback on features, you can do so directly via "),g={href:"https://github.com/THCLab/oca-ecosystem/issues",target:"_blank",rel:"noopener noreferrer"},C=o(" GitHub Issues "),b=o(".");function k(v,w){const t=r("ExternalLinkIcon");return a(),i("div",null,[l,u,e("ul",null,[e("li",null,[_,e("a",h,[d,n(t)])])]),e("p",null,[m,e("a",f,[p,n(t)]),y]),e("p",null,[x,e("a",g,[C,n(t)]),b])])}var O=s(c,[["render",k],["__file","community.html.vue"]]);export{O as default}; diff --git a/assets/community.html.c8c320d5.js b/assets/community.html.c8c320d5.js new file mode 100644 index 0000000..99a77dd --- /dev/null +++ b/assets/community.html.c8c320d5.js @@ -0,0 +1 @@ +const t=JSON.parse('{"key":"v-67f865c9","path":"/community.html","title":"OCA Community","lang":"en-US","frontmatter":{"title":"OCA Community","description":"OCA Community"},"excerpt":"","headers":[],"git":{"updatedTime":1698417852000},"filePathRelative":"community.md"}');export{t as data}; diff --git a/assets/contribute.html.5553a315.js b/assets/contribute.html.5553a315.js new file mode 100644 index 0000000..2d93494 --- /dev/null +++ b/assets/contribute.html.5553a315.js @@ -0,0 +1 @@ +import{_ as e,o as t,c}from"./app.ebda841e.js";const r={};function o(_,n){return t(),c("div")}var s=e(r,[["render",o],["__file","contribute.html.vue"]]);export{s as default}; diff --git a/assets/contribute.html.c182be00.js b/assets/contribute.html.c182be00.js new file mode 100644 index 0000000..00f338b --- /dev/null +++ b/assets/contribute.html.c182be00.js @@ -0,0 +1 @@ +const t=JSON.parse('{"key":"v-39072b1a","path":"/contribute.html","title":"","lang":"en-US","frontmatter":{},"excerpt":"","headers":[],"git":{"updatedTime":1698417852000},"filePathRelative":"contribute.md"}');export{t as data}; diff --git a/assets/faq.html.3f04bc8f.js b/assets/faq.html.3f04bc8f.js new file mode 100644 index 0000000..5495c53 --- /dev/null +++ b/assets/faq.html.3f04bc8f.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as a,e as n}from"./app.ebda841e.js";const i={},o=n('

FAQ

How do you define the data capture and exchange process?

OCA defines both schema (for persistent database records) and forms (for transient credentials) in data capture. For example, in the covid certificate scenario, this would be the granular data capture definitions required for structured vaccination credentials, COVID-19 antigen test credentials, and COVID-19 citizen recovery credentials.

OCA brings a common architecture for defining source structures from which to transform to a specific target structure in terms of data exchange. For example, for the covid certificate scenario, this would be the transformation process from OCA schemas to W3C-compliant Verifiable Credentials.

OCA offers a solution to two distinct areas of data management: (i.) data harmonisation, which involves transforming datasets to fit together in a common architecture; and (ii.) semantic harmonisation, the process of ensuring that \u2013 as part of data harmonisation \u2013 the meaning and context of data remains uniformly understood by all interacting actors, regardless of how it was collected initially. In other words, OCA harmonises database models. In addition, it is a solution to semantic harmonisation between data models and data representation formats.

Since the capture base in OCA defines a purest single dataset as the stable base, what is the principle of defining purest?

By \u201Cpurest\u201D, we mean the most generic base objects to preserve data context and enable seamless global data harmonisation.

The main objective of OCA is to ensure that data context is not lost further into the data pipeline. Instead of each different jurisdiction defining its capture bases, OCA encourages the reuse of existing artefacts (capture bases and overlays) by allowing jurisdictions to extend schema definitions based on their local rules and regulations for preserving context. By encouraging the reuse of OCA artefacts, the chance for data language unification increases. Since creating one global data model for all use cases is impossible, OCA focuses on unifying context, not on attribute names and set naming conventions. In this way, OCA enables seamless global data harmonisation across jurisdictions. As with other ontologies, global data governance authorities would define the schema definitions and share them with associated jurisdictional authorities.

In context, data harmonisation would involve every national public health agency creating a mapping overlay to map from their source attributes to those defined in a generic capture base. The capture base should be uniform for all countries, jurisdictions and locales. Ideally, the standard format of the capture bases would be defined and agreed upon by an international consortium of data governance authorities (e.g., public health agencies). In the covid credential scenario, eHealth Network effectively took on that role for the EU. The World Health Organisation would be a good option for obtaining global consensus on standard capture bases for a global pandemic.

Why is OCA useful for data decentralisation?

By data decentralisation, we mean freeing up data for societal benefit. For example, in the covid certificate scenario, the World Health Organisation could search for structured real-time data for global analytics and trend analysis to monitor the disease response throughout the pandemic. OCA supports this process by providing a stable foundation for data harmonisation where all captured data is in a uniform structure for data aggregation.

Because data lakes contain contextual issues with stored data, OCA aligns with a trustworthy data mesh instead where data resides within purpose-based domains. This ethos changes the current mindset from siloed aggregation with weak data context ("I have it but do not understand it") to requesting data from decentralised sources with well-structured context ("I understand it and have access when needed"). OCA enables this mindset shift by decoupling semantic context from the data, allowing both semantic queries and semantic+data queries. In addition, interfaces provide access to the data where OCA definitions help construct criteria requests based on well-maintained context.

OCA supports a content-based network where self-addressing identifiers represent the data rather than the data location, allowing explicit consent and data sharing rules to be cryptographically bound to the payload while allowing permissioned access to data for social benefit in global, jurisdictional, or local ecosystems. In short, OCA does not dictate how or where countries, jurisdictions and locales should store data. That is up to the requirements of the use case and any business requirements. For example, in the covid certificate scenario, as long as the World Health Organisation can request access to stored anonymised data for each country (formatted to OCA), the structured data could be used for trend analysis.

How does OCA protect privacy?

It is important to note that OCA is a data capture architecture. It defines the format of data capture at the point of system ingestion. It is not a rules engine. In other words, if a verifier wants to cache data, they can do that. That is their business. However, OCA does contain a blinding block, which allows the issuer to flag any attributes that could potentially unblind the identity of a governing entity. With identifying attributes flagged in the capture base, all corresponding data can be treated as sensitive throughout the data lifecycle and encrypted or removed at any stage, thus reducing the risk of identifying governing entities in blinded datasets. OCA does not dictate how flagged data should be encrypted. That is a secondary process step that a rules engine would define.

By introducing deterministic identifiers for all semantic objects (i.e., self-addressing identifiers), data remains traceable throughout the ecosystem. In addition, the Data Subject can control data usage throughout the lifecycle by leveraging ACDC (Authentic Chain Data Containers). Auditors also have a mechanism to efficiently audit the transaction log, checking if the verifier has consent for caching the data.

Will OCA be used in the rules engine mentioned in the GHP blueprint?

Rules engines are software systems that execute one or more business rules in a runtime production environment. They would deal with any executable processing beyond the initial data capture process, including algorithmic processing such as masking rules and encryption techniques on flagged data. Take processing of an event recipient\u2019s name where an OCA capture base contains the attributes givenName (e.g., \u201CPaul\u201D), middleName (e.g., \u201CKaine\u201D), and familyName (e.g., \u201CKnowles\u201D), for example. A particular jurisdiction (e.g., the Canadian government) might only want to see the resolution of the first letter of the given name and the family name (e.g., \u201CP Knowles\u201D). A rules engine, not OCA, would perform that processing step. In other words, in the context of the GHP blueprint, OCA schema attributes can be referenced by rules engines. The rules engines would define the data resolution in a paper-based or digital credential according to the requirements of the jurisdiction it serves.

OCA artefacts are verifiable, a necessary characteristic for a secure system. Without that characteristic, weak fundamentals would underpin any associated rules definitions, introducing an added security risk to the system.

What is the bottleneck of rule engine and OCA implementation?

The main bottleneck is a lack of funding to help drive the first GHP reference implementation. A few expert developers and subject matter experts are continuing to contribute to the reference implementation cause, but we have to pay developers for their time. It would be great to see some corporate organisations that will benefit from the GHP implementation work set aside some funds to help expedite the development process. As things currently stand, that has not happened yet. OCA can ensure high data quality, but we need a strong reference implementation guide to pitch to governments to demonstrate globally interoperable health and travel passes in a production environment. Lack of funding is the main bottleneck at this stage.

Could you please explain "OCA follows a content-centric networking (CCN) approach with a SAID referencing each object"?

A content-centric network is an approach where the focus is not where the data is but what it is. That changes security applications, where self-addressing identifiers represent the data rather than the data location. In this manner, security can be applied to the data as it moves through the data lifecycle. On the flip side, if securing the data location were the focus, different security rules could apply for each different location.

To confuse matters, the identity community is now using self-addressing identifiers (SAI) rather than Self-Addressing Identifier (SAID). The joys of working with moving semantic terminology! In any case, to consider data to be both authentic and secure, SAIs must be applied.

OCA supports a content-based network where SAIs represent the data rather than the data location, allowing explicit consent and data sharing rules to be cryptographically bound to the data payload while allowing permissioned access to data for social benefit in global, jurisdictional, or local ecosystems.

If some authentic organization proposes a new solution B that defines a standard schema/format and directly maps each countries/regions current schema/format to this standard schema/format, what is the advantage of OCA compared with this solution B

As described in the official documentation, the beauty of OCA is that the architecture is extensible by design. Thus, in addition to the core overlays, there will inevitably be other optional overlays to include in the stack in future: e.g., a Mapping Overlay, a Type Overlay, a Unit Overlay, and a Cardinality Overlay. Overlay extensibility makes OCA a powerful solution for semantic harmonisation, ensuring that the meaning and context of data remains uniformly understood by all interacting actors.

OCA provides a seamless solution for language translations (one does not need to duplicate the other JSON layers to translate into other languages). However, it goes much deeper than that. It works better for ALL colouration points in a schema. It is all about maintaining rich context throughout the journey of the data lifecycle. That cannot happen at an attribute level without preserving the context of each attribute in association with the other attributes in the schema. In other words, context is maintained at a schema level, not at an attribute level. For example, an issuer may need to store cardinality information for each attribute (i.e., Required/Optional). That can change per jurisdiction, but, more importantly, the governance decision behind each of those inputs is dependent on the attribute's relationship with all of the other schema attributes in context. Once that rich context is lost and the data resides in an aggregated data set for statistical analysis, the generated insights can become inaccurate. OCA was built specifically for that purpose.

Without OCA, issuers face the same problems that exist in the current data landscape. OCA is an architecture that addresses harmonisation, security and extensibility of its artefacts over time.

',29),s=[o];function r(c,d){return t(),a("div",null,s)}var l=e(i,[["render",r],["__file","faq.html.vue"]]);export{l as default}; diff --git a/assets/faq.html.4cbc8522.js b/assets/faq.html.4cbc8522.js new file mode 100644 index 0000000..197e0b0 --- /dev/null +++ b/assets/faq.html.4cbc8522.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-37e1c06f","path":"/guide/faq.html","title":"FAQ","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"How do you define the data capture and exchange process?","slug":"how-do-you-define-the-data-capture-and-exchange-process","children":[]},{"level":2,"title":"Since the capture base in OCA defines a purest single dataset as the stable base, what is the principle of defining purest?","slug":"since-the-capture-base-in-oca-defines-a-purest-single-dataset-as-the-stable-base-what-is-the-principle-of-defining-purest","children":[]},{"level":2,"title":"Why is OCA useful for data decentralisation?","slug":"why-is-oca-useful-for-data-decentralisation","children":[]},{"level":2,"title":"How does OCA protect privacy?","slug":"how-does-oca-protect-privacy","children":[]},{"level":2,"title":"Will OCA be used in the rules engine mentioned in the GHP blueprint?","slug":"will-oca-be-used-in-the-rules-engine-mentioned-in-the-ghp-blueprint","children":[]},{"level":2,"title":"What is the bottleneck of rule engine and OCA implementation?","slug":"what-is-the-bottleneck-of-rule-engine-and-oca-implementation","children":[]},{"level":2,"title":"Could you please explain \\"OCA follows a content-centric networking (CCN) approach with a SAID referencing each object\\"?","slug":"could-you-please-explain-oca-follows-a-content-centric-networking-ccn-approach-with-a-said-referencing-each-object","children":[]},{"level":2,"title":"If some authentic organization proposes a new solution B that defines a standard schema/format and directly maps each countries/regions current schema/format to this standard schema/format, what is the advantage of OCA compared with this solution B","slug":"if-some-authentic-organization-proposes-a-new-solution-b-that-defines-a-standard-schema-format-and-directly-maps-each-countries-regions-current-schema-format-to-this-standard-schema-format-what-is-the-advantage-of-oca-compared-with-this-solution-b","children":[]}],"git":{"updatedTime":1698417852000},"filePathRelative":"guide/faq.md"}');export{e as data}; diff --git a/assets/getting-started.html.65b22eac.js b/assets/getting-started.html.65b22eac.js new file mode 100644 index 0000000..3a9b3fb --- /dev/null +++ b/assets/getting-started.html.65b22eac.js @@ -0,0 +1,12 @@ +import{_ as r,r as i,o as c,c as d,a as s,b as t,w as l,d as e,e as a}from"./app.ebda841e.js";const p={},u=s("h1",null,"Getting started",-1),h=s("h2",{id:"quick-start",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#quick-start","aria-hidden":"true"},"#"),e(" Quick Start")],-1),_={class:"custom-container tip"},m=s("p",{class:"custom-container-title"},"Prerequisites",-1),f=e("Install "),k={href:"https://www.docker.com/",target:"_blank",rel:"noopener noreferrer"},b=e("docker"),g=e(" and "),v={href:"https://docs.docker.com/compose/",target:"_blank",rel:"noopener noreferrer"},w=e("docker-compose"),y=a(`

To serve OCA ecosystem on your machine, run the following commands in your command line:

curl https://raw.githubusercontent.com/THCLab/oca-ecosystem/main/docker-compose.yml > docker-compose.yml
+docker-compose up
+
`,2),C=e("This command will serve "),x={href:"http://localhost:8000",target:"_blank",rel:"noopener noreferrer"},q=e("OCA Browser"),O=e(" on port 8000 by default."),L=s("h3",{id:"with-default-layouts",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#with-default-layouts","aria-hidden":"true"},"#"),e(" with default layouts")],-1),S=e("Download "),A={href:"https://github.com/THCLab/oca-ecosystem/raw/main/examples/swiss_passport/digital_passport.xlsx",target:"_blank",rel:"noopener noreferrer"},T=e("XLS Swiss Passport example"),H=s("li",null,[e("Go to "),s("code",null,"Develop -> XLS to OCA Converter"),e(" and select XLS in "),s("code",null,"Select OCA File"),e(" field")],-1),D=s("li",null,[e("Click "),s("code",null,"Convert"),e(" button and download generated file (OCA Bundle)")],-1),B=e("Download "),I={href:"https://github.com/THCLab/oca-ecosystem/tree/main/examples/swiss_passport/entries",target:"_blank",rel:"noopener noreferrer"},X=e("entries files"),P=e(" and upload them to data-vault with listed command:"),F=a(`
for f in examples/swiss_passport/entries/*; do;
+  curl -X POST "http://localhost:9293/api/v1/files" -H "accept: */*" -H "Content-Type: multipart/form-data" -F "file=@$f";
+done;
+

Hosting entries in Data Vault allows to reuse complex entries in many OCAs. You can link Entry Code Overlay or Entries Overlay with entries in Data Vault by it's SAI instead of keeping all entries data inside Overlays.

  • Go to Preview and select OCA Bundle file
  • As a result OCA Form and Credential are rendered with default layouts

custom layouts

`,4),E=e("Download "),V={href:"https://github.com/THCLab/oca-ecosystem/raw/main/examples/swiss_passport/digital_passport.xlsx",target:"_blank",rel:"noopener noreferrer"},N=e("XLS Swiss Passport example"),G=e(" and "),R={href:"https://github.com/THCLab/oca-ecosystem/tree/main/examples/swiss_passport/layouts",target:"_blank",rel:"noopener noreferrer"},$=e("layouts files"),M=e("Download "),Q={href:"https://github.com/THCLab/oca-ecosystem/tree/main/examples/swiss_passport/assets",target:"_blank",rel:"noopener noreferrer"},Y=e("assets files"),j=e(" and upload them to data-vault with listed command:"),z=a(`
for f in examples/swiss_passport/assets/*; do;
+  curl -X POST "http://localhost:9293/api/v1/files" -H "accept: */*" -H "Content-Type: multipart/form-data" -F "file=@$f";
+done;
+

Assets may be images, fonts etc. used in custom layout.

`,2),J=s("li",null,[e("In "),s("code",null,"Develop -> XLS to OCA Converter"),e(" select XLS file as before")],-1),K=s("li",null,[e("In "),s("code",null,"Select Credential Layout file"),e(" and "),s("code",null,"Select Form Layout file"),e(" fields select downloaded layouts files")],-1),U=s("li",null,[e("Click "),s("code",null,"Convert"),e(" button and download generated file (OCA Bundle)")],-1),W=e("Download "),Z={href:"https://github.com/THCLab/oca-ecosystem/tree/main/examples/swiss_passport/entries",target:"_blank",rel:"noopener noreferrer"},ee=e("entries files"),se=e(" and upload them to data-vault with listed command:"),te=a(`
for f in examples/swiss_passport/entries/*; do;
+  curl -X POST "http://localhost:9293/api/v1/files" -H "accept: */*" -H "Content-Type: multipart/form-data" -F "file=@$f";
+done;
+
  • Go to Preview and select OCA Bundle file
  • As a result OCA Form and Credential are rendered with custom defined layouts
`,2),ne=e("Learn more"),ae=e(" about defining custom layouts"),oe=a('

OCA References

TODO

Tutorial

Defining OCA in xls file

',4),le=e("Download "),ie={href:"https://github.com/THCLab/oca-parser-xls/raw/main/templates/template.xlsx",target:"_blank",rel:"noopener noreferrer"},re=e("template"),ce=e(" file"),de=e("In "),pe=s("code",null,"Main",-1),ue=e(" sheet columns A, B, C and D stores definition of "),he=e("Capture Base"),_e=e("Columns from E to N stores definition of "),me=e("Overlays"),fe=e(" that are not language specific"),ke=e("Other sheets named by "),be={href:"https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes",target:"_blank",rel:"noopener noreferrer"},ge=e("ISO_639-1 language code"),ve=e(" stores definition of language specific "),we=e("Overlays");function ye(Ce,xe){const n=i("ExternalLinkIcon"),o=i("RouterLink");return c(),d("div",null,[u,h,s("div",_,[m,s("ul",null,[s("li",null,[f,s("a",k,[b,t(n)]),g,s("a",v,[w,t(n)])])])]),y,s("p",null,[C,s("a",x,[q,t(n)]),O]),L,s("ul",null,[s("li",null,[S,s("a",A,[T,t(n)])]),H,D,s("li",null,[B,s("a",I,[X,t(n)]),P])]),F,s("ul",null,[s("li",null,[E,s("a",V,[N,t(n)]),G,s("a",R,[$,t(n)])]),s("li",null,[M,s("a",Q,[Y,t(n)]),j])]),z,s("ul",null,[J,K,U,s("li",null,[W,s("a",Z,[ee,t(n)]),se])]),te,s("p",null,[t(o,{to:"/guide/getting-started.html#defining-custom-layouts"},{default:l(()=>[ne]),_:1}),ae]),oe,s("ul",null,[s("li",null,[le,s("a",ie,[re,t(n)]),ce]),s("li",null,[de,pe,ue,t(o,{to:"/v1.0.0.html#capture-base"},{default:l(()=>[he]),_:1})]),s("li",null,[_e,t(o,{to:"/v1.0.0.html#overlays"},{default:l(()=>[me]),_:1}),fe]),s("li",null,[ke,s("a",be,[ge,t(n)]),ve,t(o,{to:"/v1.0.0.html#overlays"},{default:l(()=>[we]),_:1})])])])}var Oe=r(p,[["render",ye],["__file","getting-started.html.vue"]]);export{Oe as default}; diff --git a/assets/getting-started.html.7e654f7f.js b/assets/getting-started.html.7e654f7f.js new file mode 100644 index 0000000..d2e8627 --- /dev/null +++ b/assets/getting-started.html.7e654f7f.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-1a2ad06e","path":"/ecosystem/getting-started.html","title":"Getting started","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Quick Start","slug":"quick-start","children":[{"level":3,"title":"with default layouts","slug":"with-default-layouts","children":[]},{"level":3,"title":"custom layouts","slug":"custom-layouts","children":[]},{"level":3,"title":"OCA References","slug":"oca-references","children":[]}]},{"level":2,"title":"Tutorial","slug":"tutorial","children":[{"level":3,"title":"Defining OCA in xls file","slug":"defining-oca-in-xls-file","children":[]}]}],"git":{"updatedTime":1698417852000},"filePathRelative":"ecosystem/getting-started.md"}');export{e as data}; diff --git a/assets/index.html.0be935a4.js b/assets/index.html.0be935a4.js new file mode 100644 index 0000000..6c2bd7e --- /dev/null +++ b/assets/index.html.0be935a4.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-8daa1a0e","path":"/","title":"Overlays Capture Architecture","lang":"en-US","frontmatter":{"home":true,"title":"Overlays Capture Architecture","description":"Official OCA website","heroImage":"/images/oca-logo.png","heroImageDark":"/images/oca-logo-white.png","actions":[{"text":"Introduction","link":"/guide/introduction","type":"primary"}],"features":[{"title":"Content driven","details":"Immutable objects backed by Self-Addressing Identifiers cryptographically bound to the content, assure about security and portability"},{"title":"Simplified data pooling","details":"Decoupling can occur at any time as overlays are linked objects. With all colouration definitions stored in the overlays, combining data from related sources becomes seamless."},{"title":"Stable capture base","details":"All extension and colouration definitions are applied in the overlays, enabling issuers to edit one or more of the linked objects to create simple updates rather than reissue capture bases on an ongoing basis."},{"title":"Flagged attributes","details":"Issuers can flag attributes in the capture base that could potentially unblind the identity of a governing entity"},{"title":"Internationalisation","details":"A separate linked data object captures character set encoding definitions. Thus, a single report definition can contain different attribute forms for different languages."},{"title":"Credential presentation","details":"Support for flexible credential presentation, in secure and controled way"},{"title":"Composability","details":"Cryptographically linked objects allow for high reusability, nesting, and referencing already existing capture base increasing interoperability of created objects."},{"title":"Data validation","details":"Ensure captured data records are OCA bundle schema compliant"},{"title":"Data transformation","details":"Datasets transformation using tranformation overlays"}],"footer":"EUPL 1.2 Licensed | Copyright \xA9 2018-present Human Colossus Foundation"},"excerpt":"","headers":[],"git":{"updatedTime":1698417852000},"filePathRelative":"README.md"}');export{e as data}; diff --git a/assets/index.html.68c8f5ec.js b/assets/index.html.68c8f5ec.js new file mode 100644 index 0000000..eb01811 --- /dev/null +++ b/assets/index.html.68c8f5ec.js @@ -0,0 +1 @@ +import{_ as e,o as c,c as r}from"./app.ebda841e.js";const t={};function _(n,o){return c(),r("div")}var s=e(t,[["render",_],["__file","index.html.vue"]]);export{s as default}; diff --git a/assets/index.html.a4fd9040.js b/assets/index.html.a4fd9040.js new file mode 100644 index 0000000..e5cb3fb --- /dev/null +++ b/assets/index.html.a4fd9040.js @@ -0,0 +1,317 @@ +import{_ as o,r as i,o as r,c as p,a as e,b as s,d as n,e as t}from"./app.ebda841e.js";var l="/images/spec-table1.png",c="/images/spec-fig1.png",u="/images/spec-fig2.png",d="/images/spec-table2.png",h="/images/spec-table3.png",m="/images/spec-fig3.png",v="/images/spec-fig4.png";const f={},k=e("h1",null,"OCA Technical Specification",-1),b=e("dt",null," Latest published version: ",-1),g={href:"https://oca.colossi.network/specification/",target:"_blank",rel:"noopener noreferrer"},y=n("https://oca.colossi.network/specification/"),q=n(" ("),_={href:"https://humancolossus.foundation/s/HCF-Overlays-Capture-Architecture-OCA-v1.pdf",target:"_blank",rel:"noopener noreferrer"},w=n("Download as PDF"),x=n(")"),O=e("dt",null," Author: ",-1),C=n("Paul Knowles ("),I={href:"https://humancolossus.foundation/",target:"_blank",rel:"noopener noreferrer"},A=n(" Human Colossus Foundation "),T=n(")"),S=e("dt",null," Editors: ",-1),E=e("p",null,"Ryan Barrett (Stratosoft LLC)",-1),M=n("Robert Mitwicki ("),D={href:"https://humancolossus.foundation/",target:"_blank",rel:"noopener noreferrer"},P=n(" Human Colossus Foundation "),R=n(")"),j=n("Michal Pietrus ("),N={href:"https://argonauths.eu/",target:"_blank",rel:"noopener noreferrer"},F=n(" ArgonAUTHs "),B=n(")"),U=n("Marcin Olichwiruk ("),Y={href:"https://argonauths.eu/",target:"_blank",rel:"noopener noreferrer"},G=n(" ArgonAUTHs "),Z=n(")"),V=n("Philippe Page ("),L={href:"https://humancolossus.foundation/",target:"_blank",rel:"noopener noreferrer"},K=n(" Human Colossus Foundation "),W=n(")"),H=e("dt",null," Copyrights: ",-1),Q=e("dd",null," Human Colossus Foundation, EUPL v1.2 licence. ",-1),z=e("dt",null," Governance: ",-1),J=n("The Decentralised Semantics Working Group maintains the OCA specification at "),X={href:"https://humancolossus.foundation",target:"_blank",rel:"noopener noreferrer"},$=n(" Human Colossus Foundation "),ee=n(". Comments regarding this specification can be provided as issues on the official "),ne={href:"https://humancolossus.",target:"_blank",rel:"noopener noreferrer"},ae=n(" OCA Github "),se=n("."),te=e("dt",null," Contact: ",-1),oe=e("dd",null,[e("p",null,[e("a",{href:"mailto:contact@humancolossus.org"}," contact@humancolossus.org ")])],-1),ie=t(`

Disclaimer

Strictly following DDE Principle 1.4 [HCF2022], OCA schema objects MUST be resolvable solely upon the encoded cryptographic digest of their content to ensure objectual integrity.

All code snippets in this version of the document are in JavaScript Object Notation (JSON) [ISO21778] format. However, any serialisation format applies as long as all OCA objects have proper semantics.

Introduction

This section is non-normative.

How does OCA work?

OCA is based on the FAIR data principles [FAIR2016], a set of guiding principles to make data findable, accessible, interoperable, and reusable, to enable scientific data management and stewardship, and to be relevant to all digital economy stakeholders.

OCA represents transient objects (domain-agnostic) and persistent schemas (domain-specific) as multi-dimensional objects consisting of a stable capture base and interoperable overlays. By introducing overlays as linked task-specific objects within the schema stack, the architecture offers an optimal level of efficiency and interoperability in alignment with FAIR principles.

What is a Capture Base?

A Capture Base is the purest and simplest form of a schema, defining the structural characteristics of a dataset. It is the foundational layer upon which to bind task-specific objects to enhance the meaning of inputted data.

What are Overlays?

Overlays are task-specific objects that provide cryptographically-bound layers of definitional or contextual metadata to a Capture Base. Any actor interacting with a published Capture Base can use Overlays to transform how inputted data and metadata are displayed to a viewer or guide an agent in applying a custom process to captured data.

OCA object types

An OCA object is either a Capture Base or a task-specific Overlay with a deterministic relationship to a Capture Base. When amalgamated as a Bundle, OCA objects provide the necessary structural, definitional, and contextual information to determine the meaning of inputted data at the time of data capture.

Capture Base

A Capture Base is a stable base object that defines a single dataset in its purest form, providing a structural base to harmonise data. The object defines attribute names and types. It also contains a flagging block that allows schema issuers to mark potentially dangerous attributes that may capture identifying information about entities (i.e., personally identifiable information (PII) or quasi-identifiable information (QII)). Once flagged, all corresponding data can be treated as high-risk throughout the data lifecycle and encrypted or removed at any stage, reducing the risk of re-identification attacks against blinded datasets.

The Capture Base consists of the following attributes:

{
+   "type":"spec/capture_base/1.0",
+   "classification":"GICS:45102010",
+   "attributes":{
+      "dateOfBirth":"DateTime",
+      "documentNumber":"Text",
+      "documentType":"Array[Text]",
+      "fullName":"Text",
+      "height":"Numeric",
+      "issuingState":"Text",
+      "photoImage":"Binary",
+      "sex":"Text"
+   },
+   "flagged_attributes":[
+      "documentNumber",
+      "fullName",
+      "dateOfBirth",
+      "photoImage"
+   ]
+}
+

Example 1. Code snippet for a Capture Base.

Type

The type attribute identifies the schema object type.

type = "spec/capture_base/" sem_ver
+sem_ver = DIGIT "." DIGIT
+

Listing: ABNF core rules [RFC5234]

Classification

The "classification" attribute is for capturing a standardised classification scheme and taxonomy code to identify the primary sector, area, or topic of a published schema's intended use. Taxonomy codes provide a means for classifying schemas into groupings according to similar functions, markets, products, or services, ultimately leading to better search results for users interested in different categories.

Note: All classification schemes are supported. RECOMMENDED schemes include the Global Industry Classification Standard (GICS) [GICS] for industry sector classification and the Sustainable Development Goals (SDGs) [UNSDG] for the categorisation of humanitarian advocacy and outreach activities.

classification = taxonomy ":" identifier
+taxonomy = 1*( ALPHA / DIGIT / "-" )
+identifier = 1*( ALPHA / DIGIT / "-" / "." )
+

Listing: ABNF core rules

Example

For the GICS classification: "classification": "GICS:10101010"

For the SDG classification: "classification": "SDG:1.1"

Attributes

The "attributes" attribute maps key-value pairs where the key is the attribute name and the value is the attribute type.

Attribute name

An attribute name is a string that uniquely identifies an attribute within an OCA layer and is used to reference that attribute by other layers throughout the OCA bundle.

Attribute type

An attribute type determines the attribute's syntax and how attributes of that type are compared and sorted. A Capture Base recognises seven core data types:

  • Text: a data type that defines a human-readable sequence of characters and the words they form, subsequently encoded into computer-readable formats such as ASCII [RFC0020].

  • Numeric: a data type that defines anything relating to or containing numbers. Examples of numeric data types include 8-byte integers, fixed precision and scale numeric data, floating precision number data, integer (whole number) data, and monetary data values.

  • Reference: a data type that defines a Self-Addressing IDentifier (SAID) [SAID] that references a set of attributes through its associated parent. For example, the reference data type enables the development of nested data objects, where the organisation of information is in layers or where objects contain other similar objects. SAID is an identifier that is deterministically generated from and embedded in the content it identifies, making it and its data mutually tamper-evident.

  • Boolean: a data type where the data only has two possible variables: true or false. In computer science, Boolean is an identification classifier for calculating logical truth values and algebraic variables.

  • Binary: a data type that defines a binary code signal, a series of electrical pulses representing numbers, characters, and performed operations. Based on a binary number system, each digit position represents a power of two (e.g., 4, 8, 16, etc.). A set of four binary digits or bits in binary code represents each decimal number (0 to 9). Each digit has two possible states: off and on (usually symbolised by 0 and 1). Combining basic Boolean algebraic operations on binary numbers makes it possible to represent each of the four fundamental arithmetic operations of addition, subtraction, multiplication, and division.

  • DateTime: a data type that defines the number of seconds or clock ticks that have elapsed since the defined epoch for that computer or platform. Common formats include dates (e.g., YYYY-MM-DD), times (e.g., hh:mm:ss), dates and times concatenated (e.g., YYYY-MM-DDThh:mm:ss.sss+zz:zz), and durations (e.g., PnYnMnD).

    Note: The ISO 8601 [ISO8601] date and time format is the RECOMMENDED representation format for the dateTime data type, in which the Unix epoch is 1970-01-01T00:00:00Z.

    For the Unix epoch example:

    Data type: DateTime
    Character encoding: UTF-8 (default)
    Standard: ISO 8601
    Format: YYYY-MM-DDThh:mm:ssZ

  • Array[data type]: a data type that defines a structure that holds several data items or elements of the same data type. When you want to store many pieces of data that are related and have the same data type, it is often better to use an array instead of many separate variables (e.g., Array[Text], Array[Numeric], etc.).

Flagged attributes

Any attributes defined in a Capture Base that may contain identifying information about entities (i.e., personally identifiable information (PII) or quasi-identifiable information (QII)) can be flagged.

The Blinding Identity Taxonomy (BIT) [KAN2020] is a practical tool for any practitioner whose organisation has custody or control of a dataset containing identifiable information about entities, including a natural person, organisation, or device with signing capabilities that make that entity uniquely identifiable. For example, data protection officers and schema issuers can use the BIT to flag a list of elements which require cryptographic encoding to reduce the risk of identifying a data principal.

Overlays

Overlays are cryptographically-linked objects that provide layers of task-oriented definitional or contextual information to a Capture Base. Any actor interacting with a published Capture Base can use Overlays to add metadata to the underlying object, transform how information is displayed to a viewer, or guide an agent in applying a custom process to captured data.

Overlays consist of the following attributes:

Common attributes

Capture base

The capture_base attribute contains the SAID of the Capture Base to cryptographically anchor to that parent object.

Type

The type attribute identifies the schema object type.

type = "spec/overlay/" overlay_name "/" sem_ver
+overlay_name = ALPHA
+sem_ver = DIGIT "." DIGIT
+

Listing: ABNF core rules

Language

The International Organization for Standardization (ISO) [ISO] has standardised two lists of language-related codes: the language codes called ISO 639-1 alpha-2 [ISO639] codes ("Codes for the representation of names of languages") and ISO 3166-1 alpha-2 [ISO3166] codes ("Codes for the representation of names of countries"). Both consist of two letters. The language code is written in lowercase while the country code is written in uppercase. However, both ISO classifications may be combined to differentiate regional languages.

The language attribute MUST contain either the two-letter language code (lowercase) for a national language or the combined language (lowercase)/country (uppercase) code for a regional language or locale.

Table 1Table 1. An example of ISO standard values for language and combined language/country codes.

Semantic Overlays

Semantic overlays provide contextual meaning to describe objects and their relationships.

Fig 1Figure 1. In a balanced network, semantic overlays determine the meaning and use of what is put in, taken in, or operated on by any process or system.

Character Encoding Overlay

A Character Encoding Overlay defines the process of assigning numbers to graphical characters, especially the written characters of human language, allowing them to be stored, transmitted, and transformed using digital computers. Character encoding using internationally accepted standards permits worldwide interchange of text in electronic form.

In addition to the capture_base and type attributes (see Common attributes), the Character Encoding Overlay MAY include the following attributes:

  • default_character_encoding

    The "default_character_encoding" attribute specifies the default character encoding for the attributes contained in the parent Capture Base.

    The most common default character set is UTF-8 [RFC3629], which accounts for 98% of all web pages in the World Wide Web and up to 100.0% for some languages, as of 2021.

  • attr_character_encoding

    The attr_character_encoding attribute maps key-value pairs where the key is the attribute name and the value is the character encoding.

    Any attributes contained in the attr_character_encoding attribute override the behaviour of the default_character_encoding attribute.

    There are many encoding standards including Base64 [RFC4648], UTF-8, and ASCII to name a few. Each standard has a purpose, and applications using those encoding standards expect to receive data compliant with that encoding standard. The most popular types of character encoding are ASCII and Unicode [UNICODE]. While ASCII is still supported by nearly all text editors, Unicode is more commonly used because it supports a larger character set. Unicode is often defined as UTF-8, UTF-16 [RFC2781], or UTF-32 [ISO10646], which refer to different Unicode standards.

    An example of character encoding for a text format:

    Data type: Text
    Character encoding: UTF-8 (default)
    Standard: ReGex
    Format: [A-Z0-9]{9}

    An example of binary-to-text encoding for an image format:

    Data type: Binary
    Character encoding: Base64
    Standard: ISO/IEC 10918
    Format: image/jpeg

    {
    +  "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
    +  "type":"spec/overlays/character_encoding/1.0",
    +  "default_character_encoding":"utf-8",
    +  "attribute_character_encoding":{
    +      "photoImage":"base64"
    +  }
    +}
    +
    +

    Example 2. Code snippet for a Character Encoding Overlay.

Format Overlay

A Format Overlay defines an input and display format for data fields. The data format enables conversion of the input buffer to the program variable and displays program variable data to form fields.

In addition to the capture_base and type attributes (see Common attributes), the Format Overlay MUST include the following attribute:

  • attribute_formats

    The "attribute_formats" attribute maps key-value pairs where the key is the attribute name and the value is the format.

The inputted format values are dependent on the following core data types as defined by the attribute types in the Capture Base:

  • Text: The inputted format value for this core data type MAY be a regular expression [REGEX], a sequence of characters that specifies a search pattern in text.

  • Binary: The inputted format value for this core data type MAY be a MIME type registered with the Internet Assigned Numbers Authority (IANA) [IANA]

  • DateTime: The inputted format value for this core data type MAY be a date and time representation as defined by ISO 8601, a standard for the worldwide exchange and communication of date and time-related data.

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/format/1.0",
+   "attribute_formats":{
+      "dateOfBirth":"YYYY-MM-DD",
+      "documentNumber":"[A-Z0-9]{9}",
+      "photoImage":"image/jpeg",
+      "sex":"[A-Z]{1}"
+   }
+}
+

Example 3. Code snippet for a Format Overlay.

Information Overlay

[language-specific object]

An Information Overlay defines attribute field descriptions and usage notes to assist the data entry process or to add context to presented data.

In addition to the capture_base, type, and language attributes (see Common attributes), the Information Overlay MUST include the following attribute:

  • attribute_information

    The attribute_information attribute maps key-value pairs where the key is the attribute name and the value is the informational prose in a specific language.

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/information/1.0",
+   "language":"en",
+   "attribute_information":{
+      "dateOfBirth":"Holder\u2019s date of birth as recorded by the issuing State or organization.",
+      "documentNumber":"Unique identification number of the document.",
+      "documentType":"The word for "passport" in the language of the issuing State or organization.",
+      "fullName":"Full name of the passport holder.",
+      "height":"Recorded height of the passport holder.",
+      "issuingState":"Name of the State or organization responsible for issuing the passport.",
+      "photoImage":"Portrait image of the passport holder.",
+      "sex":"Sex of the passport holder."
+   }
+}
+

Example 4. Code snippet for an Information Overlay (language: en).

Label Overlay

[language-specific object]

A Label Overlay defines attribute and category labels. For example, for an attribute named dateOfBirth, you may wish to display the label as Date of birth, which is more meaningful and user-friendly when displayed to an end user in places such as form inputs and error messages.

In addition to the capture_base, type, and language attributes (see Common attributes), the Label Overlay MUST include the following attribute:

  • attribute_labels

    The attribute_labels attribute maps key-value pairs where the key is the attribute name and the value is a human-meaningful attribute label in a specific language.

and MAY include the following attributes:

  • attribute_categories

    The attribute_categories attribute contains category identifiers.

  • category_labels

    The attribute_categories attribute maps key-value pairs where the key is the attribute name and the value is a human-meaningful category label in a specific language.

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/label/1.0",
+   "language":"en",
+   "attribute_labels":{
+      "dateOfBirth":"Date of birth",
+      "documentNumber":"Passport Number",
+      "documentType":"Document",
+      "fullName":"Name",
+      "height":"Height",
+      "issuingState":"Issuing State or organization (in full)",
+      "photoImage":"Portrait image",
+      "sex":"Sex"
+   },
+   "attribute_categories":[
+      "_cat-1_",
+      "_cat-2_",
+      "_cat-3_",
+      "_cat-4_"
+   ],
+   "category_labels":{
+      "_cat-1_":"Mandatory header",
+      "_cat-2_":"Mandatory personal data elements",
+      "_cat-3_":"Mandatory identification feature",
+      "_cat-4_":"Optional data elements"
+   }
+}
+

Example 5. Code snippet for a Label Overlay (language: en).

Meta Overlay

[language-specific object]

A Meta Overlay defines any language-specific information about a schema. It is used for discovery and identification and includes elements such as the schema name and description.

In addition to the capture_base, type, and language attributes (see Common attributes), the Meta Overlay SHOULD include the following attributes:

  • name

    The name attribute contains the name of the schema in a specific language.

  • description

    The description attribute contains a description of the schema in a specific language.

and MAY include other attributes at the discretion of the overlay producer, such as an "affiliation" attribute in the example below. How the overlay producer conveys the purpose of the additional attributes in the Meta Overlay is outside the scope of this specification.

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/meta/1.0",
+   "language":"en",
+   "name":"Digital Passport",
+   "description":"An example of a Digital Passport schema",
+   "affiliation":"The Government of Antarctica"
+}
+

Example 6. Code snippet for a Meta Overlay (language: en).

Standard Overlay

A Standard Overlay defines a documented agreement or technical specification published by a standards organisation used to represent, format, define, structure, tag, transmit, manipulate, use, and manage data.

In addition to the capture_base and type attributes (see Common attributes), the Standard Overlay MUST include the following attribute:

  • attr_standards

    The attr_standards attribute maps key-value pairs where the key is the attribute name and the value is the standard.

There are many international standards organisations establishing tens of thousands of standards covering almost every conceivable topic. The three largest and most well-established standards organisations are the International Organization for Standardization (ISO), the International Electrotechnical Commission (IEC) [IEC], and the International Telecommunication Union (ITU) [ITU]. Standards tend to contain the acronym of the standards organisation followed by an internal document identifier.

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/standard/1.0",
+   "attr_standards":{
+      "dateOfBirth":"ISO 8601"
+   }
+}
+

Example 7. Code snippet for a Standard Overlay.

Inputs Overlays

Inputs overlays provide predefined inputs for data attestations.

Fig 2Figure 2. In a balanced network, inputs overlays determine what is put in, taken in, or operated on by any process or system.

Cardinality Overlay

A Cardinality Overlay defines the minimum and maximum number of values that an attribute can have. For a relationship, the cardinality interval specifies the minimum and maximum number of relationship targets.

In addition to the capture_base and type attributes (see Common attributes), the Cardinality Overlay MUST include the following attribute:

  • attr_cardinality

    The attr_cardinality attribute maps key-value pairs where the key is the attribute name and the value is the cardinality interval.

The logic of cardinality intervals is as follows:

  • n : The cardinality interval denotes exactly n entries;
  • n- : The cardinality interval denotes a minimum of n entries;
  • n-m : The cardinality interval denotes a minimum of n and maximum of m entries;
  • -m : The cardinality interval denotes a maximum of m entries.

Note that n and m are positive integers.

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/cardinality/1.0",
+   "attr_cardinality":{
+      "documentType":"1-2"
+   }
+}
+

Example 8. Code snippet for a Cardinality Overlay.

Conditional Overlay

A Conditional Overlay defines conditional expressions (or rules) that trigger specific computations or actions depending on whether, upon evaluation, programmer-defined Boolean expressions return true or false values. Met conditions can have a direct impact on data capture and data validation processes where, for example, expressions:

  • MAY facilitate schema extensions;
  • MAY enable schema abstractions;
  • MAY activate validation processes.

In addition to the capture_base and type attributes (see Common attributes), the Conditional Overlay MUST include the following attributes:

  • attribute_conditions

    The attribute_conditions attribute maps key-value pairs where the key is the attribute name and the value is the conditional expression.

    Expressions MAY contain placeholders to be substituted by values defined by the attribute_dependencies attribute.

    conditional-statement = 1*conditional-expression
    +conditional-expression = equality-relational / equality-relational logical-operator
    +equality-relational = equality-expression / relational-expression
    +logical-operator = *SP ("and" / "or") *SP
    +equality-expression = assignment eql-op assignment
    +eql-op = "=="/ "~="
    +relational-expression  = assignment relational-op assignment
    +relational-op = "<" / ">" / "<=" / ">="
    +assignment = *SP (ALPHA / DIGIT / "\\\${" DIGIT "}") *SP
    +

    Listing: ABNF core rules

  • attribute_dependencies

    The attribute_dependencies attribute maps key-value pairs where the key is the attribute name and the value is an array value which triggers the evaluation process of the conditional expression defined by the attribute_conditions attribute.

{
+  "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+  "type":"spec/overlays/conditional/1.0",
+  "attribute_conditions":{
+      "idCardNumber":"\${0}=='ID_CARD'",
+      "passportNumber":"\${0}=='PASSPORT'"
+  },
+  "attribute_dependencies":{
+      "idCardNumber":[
+        "documentType"
+      ],
+      "passportNumber":[
+        "documentType"
+      ]
+  }
+}
+
+// Entry code overlay with options for \`documentType\`
+{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/entry_code/1.0",
+   "attribute_entry_codes":{
+      "documentType":[
+         "ID_CARD",
+         "PASSPORT"
+      ]
+   }
+}
+

Example 9. Code snippet for a Conditional Overlay. When the condition matches for idCardNumber, that is, documentType matches ID_CARD, the default behavior is to apply other overlays to idCardNumber, i.e., conformance. \${0} is an integer placeholder that refers to a replacement value during the substitution process. The attribute_dependencies attribute provides that replacement value through an array of attributes. Therefore, the placeholder's integer value refers to an array index that points to the value. In other words, documentType is bound by the integer placeholder, which triggers the evaluation process of the expression.

Conformance Overlay

A Conformance Overlay indicates whether data entry for each attribute is mandatory or optional.

In addition to the capture_base and type attributes (see Common attributes), the Conformance Overlay MAY include the following attributes:

  • attribute_conformance

    The attribute_conformance attribute maps key-value pairs where the key is the attribute name and the value is the data entry conformance of the attribute, which is set to either M (mandatory) or O (optional).

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/conformance/1.0",
+   "attribute_conformance":{
+      "dateOfBirth":"M",
+      "documentNumber":"M",
+      "documentType":"M",
+      "fullName":"M",
+      "height":"O",
+      "issuingState":"M",
+      "photoImage":"M",
+      "sex":"M"
+   }
+}
+

Example 10. Code snippet for a Conformance Overlay.

Entry Code Overlay

An Entry Code Overlay defines the entry keys in a series of key-value pairs stored in a code table (also known as a "lookup table") or dataset. The key is a unique identifier that points to its associated value.

Table 2Table 2. An example of how the values in an array of key-value pairs provided by an Entry Code Overlay subsequently define a set of pre-defined entry keys in a nested series of key-value pairs. The specified values are often standardised categorisation codes, valuable data inputs for statistical analysis, machine learning (ML), and artificial intelligence (AI) algorithms.

In addition to the capture_base and type attributes (see Common attributes), the Entry Code Overlay MUST include the following attribute:

  • attribute_entry_codes

    The attribute_entry_codes attribute maps key-value pairs where the key is the attribute name and the value is either:

    • a set of pre-defined entry keys for a nested series of key-value pairs; or

    • a SAID that references a code table from an external data source to retrieve an array of pre-defined entry keys for a nested series of key-value pairs. See Code Tables for more information on code tables.

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/entry_code/1.0",
+   "attribute_entry_codes":{
+      "documentType":[
+         "PE",
+         "PM"
+      ],
+      "issuingState":"EGyWgdQR9dW_I5oHlHBMoO9AA_eMeb2p3XzcCRCBbKCM",
+      "sex":[
+         "F",
+         "M",
+         "X"
+      ]
+   }
+}
+

Example 11. Code snippet for an Entry Code Overlay.

Entry Overlay

[language-specific object]

An Entry Overlay defines the entry values in a series of key-value pairs stored in a code table (also known as a "lookup table") or dataset. A value is either the identified data or a pointer to that data.

Table 3Table 3. An example of how an Entry Overlay can leverage a set of pre-defined entry keys in a nested series of key-value pairs provided by an Entry Code Overlay to provide human-meaningful values in a specified national or regional language.

In addition to the capture_base, type, and language attributes (see Common attributes), the Entry Overlay MUST include the following attribute:

  • attribute_entries

    The attribute_entries attribute maps key-value pairs where the key is the attribute name and the value is either:

    • a set of pre-defined values in a nested series of key-value pairs that are human-meaningful and language-dependent where the entry keys are taken from an associated Entry Code Overlay; or

    • a SAID that references a code table from an external data source to retrieve an array of pre-defined values from a nested series of key-value pairs that are human-meaningful and language-dependent where the entry keys are taken from an associated Entry Code Overlay. See Code Tables for more information.

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/entry/1.0",
+   "language":"en",
+   "attribute_entries":{
+      "documentType":{
+         "PE":"DIPLOMATIC PASSPORT",
+         "PM":"PASSPORT"
+      },
+      "issuingState":"Els6NxGvFfyL5aiBWR3j7YiaS7F4j4O-F0EIlZu-dO0g",
+      "sex":{
+         "F":"Female",
+         "M":"Male",
+         "X":"Unspecified"
+      }
+   }
+}
+

Example 12. Code snippet for an Entry Overlay (language: en).

Unit Overlay

A Unit Overlay defines the units of measurement adopted by convention or law, used as a standard for measuring the same kind of quantitative data. The RECOMMENDED system to use is the International System of Units (SI) [BIPM], French Syst\xE8me International d\u2019Unit\xE9s, an international decimal system of weights and measures derived from and extending the metric system of units.

Adopted by the 11th General Conference on Weights and Measures (CGPM) in 1960, it is abbreviated SI in all languages. To date, the SI comprises seven base units: the meter (m), the kilogram (kg), the second (s), the ampere (A), the kelvin (K), the candela (cd) and the mole (mol).

Fig 3

Figure 3. The seven defining constants of the SI.

In addition to the capture_base and type attributes (see Common attributes), the Unit Overlay SHOULD include the following attribute:

  • metric_system

    The metric_system attribute contains the acronym of the chosen system of units (a coherent system of units of measurement) used for defining attribute units.

and MUST include the following attribute:

  • attribute_units

    The attribute_units attribute maps key-value pairs where the key is the attribute name and the value is a standard unit of measurement from a known metric system.

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/unit/1.0",
+   "metric_system":"SI",
+   "attribute_units":{
+      "height":"cm"
+   }
+}
+

Example 13. Code snippet for a Unit Overlay.

Transformation Overlays

Transformation overlays provide information to convert data from one format or structure to another, such as raw data to processed, or unstructured to structured.

Attribute Mapping Overlay

An Attribute Mapping Overlay defines attribute mappings between two distinct data models. Data mapping provides a preliminary step for data integration tasks, including data transformation or data mediation between a data source and a destination or consolidation of multiple databases into a single database and identifying redundant columns of data for consolidation or elimination.

{
+  "capture_base":"Ev_RaB-gIOn8VAB3sg40mINxjiYRxdLVQrgce0aZbFcc",
+  "type":"spec/overlays/mapping/1.0",
+  "attribute_mapping":{
+    "first_name":"firstName",
+    "last_name":"surname"
+  }
+}
+

Example 14. Code snippet for an Attribute Mapping Overlay.

Entry Code Mapping Overlay

An Entry Code Mapping Overlay defines the entry key mappings between two distinct code tables or datasets.

{
+   "capture_base":"Ev_RaB-gIOn8VAB3sg40mINxjiYRxdLVQrgce0aZbFcc",
+   "type":"spec/overlays/entry_code_mapping/1.0",
+   "attr_entry_codes_mapping":{
+      "country_code":[
+         "AFG:AF",
+         "ALB:AL",
+         "DZA:DZ",
+         "ASM:AS",
+         "AND:AD",
+         "AGO:AO",
+         "AIA:AI",
+         "ATA:AQ",
+         "ATG:AG",
+         "..."
+      ]
+   }
+}
+

Example 15. Code snippet for an Entry Code Mapping Overlay.

Subset Overlay

A Subset Overlay defines a customised version of a published schema containing a subset of source attributes, including their properties, types, codes, and relationship dependencies required for the information exchange.

{
+  "capture_base": "EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+  "type": "spec/overlays/subset/1.0",
+  "attributes": [
+    "dateOfBirth",
+    "documentNumber",
+    "documentType"
+  ]
+}
+

Example 16. Code snippet for a Subset Overlay.

Unit Mapping Overlay

A Unit Mapping Overlay defines target units for quantitative data when converting between different units of measurement. Conversion of units is the conversion between different units of measurement for the same quantity, typically through multiplicative conversion factors (see Code Table for Unit mappings for more information on conversion factors) which change the measured quantity value without changing its effects. The process of conversion depends on the specific situation and the intended purpose. This may be governed by regulation, contract, technical specifications or other published standards.

In addition to the capture_base and type attributes (see Common attributes), the Unit Mapping Overlay MUST include the following attributes:

  • metric_system

    The metric_system attribute contains the acronym of the chosen system of units (a coherent system of units of measurement) used for defining attribute units.

  • code_table

    The code_table attribute contains a SAID that references an external code table. See Code Tables for more information.

  • attr_units

    The attr_units attribute maps key-value pairs where the key is the attribute name and the value is the desired unit of measurement.

{
+  "capture_base":"Ev_RaB-gIOn8VAB3sg40mINxjiYRxdLVQrgce0aZbFcc",
+  "type":"spec/overlays/unit/1.0",
+  "metric_system":"SI",
+  "code_table":"E3YDLacdI1GSGWhHywzrb5B0hOL/9TYWBsUkXC8fA4EY",
+  "attr_units":{
+    "blood_glucose":"mg/dL"
+  }
+}
+

Example 17. Code snippet for a Unit Mapping Overlay.

Presentation Overlays

Presentation overlays provide information to display digital documents at the application layer, including digital forms and credentials.

Layout Overlay

[Currently under review by Decentralised Semantics Working Group]

A Layout Overlay defines presentation information required by an application to display a digital document, including a digital form or credential.

Disclaimer:

Collaborators in several open communities have shown an interest in leveraging OCA\u2019s "task-specific" ethos to work on new overlay types to ensure that data presentation (see Presentation) is both extensible and interoperable. Deprecation of the Layout Overlay in favour of a more granular approach is likely in the future.

Sensitive Overlay

A Sensitive Overlay defines attributes not necessarily flagged in the Capture Base that need protecting against unwarranted disclosure. For example, data that requires protection for legal or ethical reasons, personal privacy, or proprietary considerations.

In addition to the capture_base and type attributes (see Common attributes), the Sensitive Overlay MUST include the following attribute:

  • attributes

    The attributes attribute is an array of attributes considered sensitive.

{
+  "capture_base": "EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+  "type": "spec/overlays/sensitive/1.0",
+  "attributes": [
+    "sex"
+  ]
+}
+

Example 19. Code snippet for a Sensitive Overlay

Bundle

An OCA Bundle contains a set of OCA objects consisting of a Capture Base and bound Overlays. An encoded cryptographic digest of the contained objects produces a deterministic identifier for the bundle.

The following object types are REQUIRED in any OCA bundle to preserve the minimum amount of structural, definitional, and contextual information to capture the meaning of inputted data.

  • Capture base
  • Character encoding overlay
  • Format overlay

The cardinality of several overlay types, particularly the language-specific ones (Entry, Information, Label, and Meta), can be multiple depending on the number of defined supported languages.

 EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis.json
+\u251C\u2500\u2500 E3SAKe0z83pfBnhhcZl19PGGKBheb35WeCJ3V6RdqwY8.json
+\u251C\u2500\u2500 Ejx0o0yuwp99vi0V-ssP6URZIXRMGj1oNKIZ1BXi4sHU.json
+\u251C\u2500\u2500 EZv1B5nNl4Rty8CXFTALhr8T6qXeO0CcKliM03sdrkRA.json
+\u251C\u2500\u2500 Eri3NLi1fr4QrKoFfTlK31KvWpwrSgGaZ0LLuWYQaZfI.json
+\u251C\u2500\u2500 EY0UZ8aYAPusaWk_TON8c20gHth2tvZs4eWh7XAfXBcY.json
+\u251C\u2500\u2500 E1mqEb4f6eOMgu5zR857WWlMUwGYwPzZgiM6sWRZkQ0M.json
+\u251C\u2500\u2500 ESEMKWoKKIf5qvngKecV-ei8MwcQc_pPWCH1FrTWajAM.json
+\u251C\u2500\u2500 EyzKEWuMs8kspj4r70_Lc8sdppnDx-hb9QqUQywjmDRY.json
+\u251C\u2500\u2500 EIGknekgJFqjgQ8ah2NwL8zNWbFrllvXVLqezgB6U3Yg.json
+\u251C\u2500\u2500 EgBxL29VsxoZso7YFirlMP334ZuC1mkel-lO7TxPxEq8.json
+\u251C\u2500\u2500 ED9PH0ZBaOci-nbnYfPgYZWGQdkyWxA-nW3REmB3vhu0.json
+\u251C\u2500\u2500 ElJEQGfAvfJEuB7JeNIcvmAPO2DIOaKkpkZyvxO-gQoc.json
+\u251C\u2500\u2500 EpW9bQGs0Lk6k5cJikN0Ep-DN6z29fwZIsbVzMBgTlWY.json
+\u251C\u2500\u2500 EIGj0LQKT9-6gCLV2QZVgi4YQZhrUl0-GKbN7sFTCSAI.json
+\u251C\u2500\u2500 EHDwC_Ucuttrsxh2NVptgBnyG4EMbG5D8QsdbeF9G9-M.json
+\u2514\u2500\u2500 meta.json
+

Example 20. A representation of an OCA Bundle as a ZIP file containing a Capture Base (first row), multiple Overlays, and a metafile (meta.json) that provides key-value mappings between the file names and the names of the OCA object types. Apart from the metafile, each file name directly represents the encoded cryptographic digest of the file.

See Appendix A for more information on the content of a metafile (meta.json in the above example).

If well-structured, the metadata in an OCA bundle can facilitate many ways for users to search for information, present results, and even manipulate and present information objects without compromising their integrity.

Code Tables

A code table is an external dataset structured as either:

  • an array of data; or
  • a map of key-value pairs.

A code table MUST be identifiable, verifiable, and resolvable by a SAID.

Code Table for Keys

A Code Table for Keys provides an anchor to a reusable dataset for a common purpose, such as a list of country codes. Therefore, this object MAY be a reference target in an Entry Code Overlay. See Entry Code Overlay for more information.

A Code Table for Keys MUST include the following attribute:

  • keys

    The keys attribute is an array of pre-defined entry keys for a nested series of key-value pairs. A key is a unique identifier that points to an associated value.

{
+   "keys":[ "AF", "AL", "DZ", "AS", "AD", "AO", "AI", "AQ", "AG", "..." ]
+}
+

Example 21. Code snippet for a Code Table for Keys, providing an anchor for, in this case, two-character ISO country codes.

Code Table for Key-Value pairs

A Code Table for Key-Value pairs provides a mapping of input values to output values.

A Code Table for Key-Value pairs MUST include the following attribute:

  • entries

    The "entries" attribute is a map of key-value pairs, where the key is the input value (the source) and the value is the output value (the product).

{
+   "entries":{
+      "AFG":"AF", "ALB":"AL", "DZA":"DZ", "ASM":"AS", "AND":"AD",
+      "AGO":"AO", "AIA":"AI", "ATA":"AQ", "ATG":"AG", "..."
+   }
+}
+

Example 22. Code snippet for a Code Table for Key-Value pairs, providing a mapping from, in this case, three-character to two-character ISO country codes.

Code Table for Unit mappings

A Code Table for Unit mappings provides a mapping of input units to output units for quantitative data.

The unit conversion process consists of the following steps:

  1. Read source unit.
  2. Read target unit.
  3. Convert source unit to target unit.

Conversion between units is defined as follows:

Target unit = source unit * conversion factor + offset
+

Except when converting between temperature units, offset equals 0 in most cases.

An example of Celsius to Kelvin conversion:

  1. Given 37 Celsius
  2. Expect Kelvin
  3. 37 * 1 + 273.15 = 310.15 K

An example of Celsius to Fahrenheit conversion:

  1. Given 37 Celsius
  2. Expect Fahrenheit
  3. 37 * 1.8 + 32 = 98.6 F

Implementers MAY find E.J. Roschke\u2019s "Units and Unit Conversions" (2001) [ROS2001] a helpful resource for conversion factors.

A Code Table for Unit mappings MUST include the following attribute:

  • entries

    The entries attribute is a map of key-value pairs, where the key denotes the conversion from source to target (e.g., m->mm or deg_c->deg_f) and the value contains the conversion factor and the offset.

    All units and unit prefixes follow the "Data Protocols Lightweight Standards and Patterns for Data" [BER2013] proposal for describing units associated with numeric quantities.

{
+   "entries":{
+      "m->mm":{
+         "cf":1000
+      },
+      "m->yd":{
+         "cf":1.0936133
+      },
+      "deg_c->deg_f":{
+         "cf":1.8,
+         "o":32
+      }
+   }
+}
+

Example 23. Code snippet for a Code Table for Unit mappings.

Code Table for Unit mappings is in denormalised form, meaning that the conversion between units and unit prefixes is pre-defined for all standard unit conversions for maximum efficiency.

Basic concepts

This section is non-normative.

Characters provide the essential elements required for written language in the physical world. In the digital world, stored sequences of bytes known as "data" represent these elements. However, without a system of interpretation, data has no inherent morphological, definitional, or contextual meaning. This interpretation is provided by "metadata", sets of data that provide meaning to any stored sequence of bytes.

OCA is a core utility architecture for capturing the metadata necessary to interpret and preserve the meaning of inputted data. In addition, the architecture introduces a comprehensive solution to support data validation, transformation, and presentation requirements throughout a data lifecycle.

Fig 4

Figure 4. Universal OCA lifecycle.

Capture

Data capture is the process of collecting structured and unstructured information electronically and converting it into data readable by a computer.

Data capture MAY involve Semantic, Inputs, and Presentation Overlays.

Validation

Data validation is the process of checking the integrity, accuracy and structure of data before it is used for a business operation.

Data validation MAY involve Semantic and Inputs Overlays.

Transformation

Data transformation is the process of converting data from one format to another, typically from the format of a source system into the required format of a destination system.

Data transformation MUST involve Transformation Overlays.

Presentation

Data presentation is the process of using various graphical formats to visually represent the relationship between two or more data sets so that, based on the results, the reader or verifier can make an informed decision.

Data presentation MAY involve Semantic, Inputs, and Presentation Overlays.

Conventions and Definitions

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted when, and only when, they appear in all capitals, as described in RFC 2119 [RFC2119].

References

Normative References

',244),re=e("dt",{id:"ref-ISO21778"}," [ISO21778] ",-1),pe=n("ISO/IEC 21778:2017, Information technology \u2014 The JSON data interchange syntax (2017) "),le={href:"https://www.iso.org/standard/71616.html",target:"_blank",rel:"noopener noreferrer"},ce=n(" https://www.iso.org/standard/71616.html "),ue=e("dt",{id:"ref-SAID"}," [SAID] ",-1),de=n("Smith, S. Self-Addressing IDentifier (SAID) (2022) "),he={href:"https://datatracker.ietf.org/doc/html/draft-ssmith-said",target:"_blank",rel:"noopener noreferrer"},me=n(" https://datatracker.ietf.org/doc/html/draft-ssmith-said "),ve=e("h3",{id:"informative-references",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#informative-references","aria-hidden":"true"},"#"),n(" Informative References")],-1),fe=e("dt",{id:"ref-ISO21778"}," [ISO21778] ",-1),ke=n("ISO/IEC 21778:2017, Information technology \u2014 The JSON data interchange syntax (2017) "),be={href:"https://www.iso.org/standard/71616.html",target:"_blank",rel:"noopener noreferrer"},ge=n(" https://www.iso.org/standard/71616.html "),ye=e("dt",{id:"ref-SAID"}," [SAID] ",-1),qe=n("Smith, S. Self-Addressing IDentifier (SAID) (2022) "),_e={href:"https://datatracker.ietf.org/doc/html/draft-ssmith-said",target:"_blank",rel:"noopener noreferrer"},we=n(" https://datatracker.ietf.org/doc/html/draft-ssmith-said "),xe=e("dt",{id:"ref-BER2013"}," [BER2013] ",-1),Oe=n("Berkeley, A., Pollock, R., Smith, J. Data Protocols Lightweight Standards and Patterns for Data, Version 0.1 (2013) "),Ce={href:"http://dataprotocols.org/units/",target:"_blank",rel:"noopener noreferrer"},Ie=n("http://dataprotocols.org/units/"),Ae=e("dt",{id:"ref-BIPM"}," [BIPM] ",-1),Te=n("Bureau International des Poids et Mesures (BIPM). The International System of Units (SI) "),Se={href:"https://www.bipm.org/en/measurement-units",target:"_blank",rel:"noopener noreferrer"},Ee=n("https://www.bipm.org/en/measurement-units"),Me=e("dt",{id:"ref-BRU2019"}," [BRU2019] ",-1),De=n("Brush, K. Digital ecosystem (2019) "),Pe={href:"https://www.techtarget.com/searchcio/definition/digital-ecosystem",target:"_blank",rel:"noopener noreferrer"},Re=n("https://www.techtarget.com/searchcio/definition/digital-ecosystem"),je=e("dt",{id:"ref-FAIR2016"}," [FAIR2016] ",-1),Ne=n("Wilkinson, M. et al. The FAIR Guiding Principles for scientific data management and stewardship (2016) "),Fe={href:"https://www.nature.com/articles/sdata201618",target:"_blank",rel:"noopener noreferrer"},Be=n(" https://www.nature.com/articles/sdata201618"),Ue=e("dt",{id:"ref-GICS"}," [GICS] ",-1),Ye=n("MSCI. The Global Industry Classification Standard (GICS\xAE) "),Ge={href:"https://www.msci.com/our-solutions/indexes/gics",target:"_blank",rel:"noopener noreferrer"},Ze=n("https://www.msci.com/our-solutions/indexes/gics"),Ve=e("dt",{id:"ref-HCF2022"}," [HCF2022] ",-1),Le=n("Human Colossus Foundation. Principles of a Dynamic Data Economy (DDE), Version 1.0 (2022) "),Ke={href:"https://static1.squarespace.com/static/5ead4c8660689c348c80958e/t/62f288b25f9c364d7945e6eb/1660061875006/HCF+DDE+Principles+v1.0.0.pdf",target:"_blank",rel:"noopener noreferrer"},We=n("https://static1.squarespace.com/static/5ead4c8660689c348c80958e/t/62f288b25f9c364d7945e6eb/1660061875006/HCF+DDE+Principles+v1.0.0.pdf"),He=e("dt",{id:"ref-IANA"}," [IANA] ",-1),Qe=n("Internet Assigned Numbers Authority (IANA) "),ze={href:"https://www.iana.org/",target:"_blank",rel:"noopener noreferrer"},Je=n("https://www.iana.org/"),Xe=e("dt",{id:"ref-ICAO"}," [ICAO] ",-1),$e=n("International Civil Aviation Organization (ICAO) "),en={href:"https://www.icao.int/Pages/default.aspx",target:"_blank",rel:"noopener noreferrer"},nn=n("https://www.icao.int/Pages/default.aspx"),an=e("dt",{id:"ref-ICAO9303"}," [ICAO9303] ",-1),sn=n("Doc 9303, Machine Readable Travel Documents, Eighth Edition - Part 3: Specifications Common to all MRTDs (2021) "),tn={href:"https://www.icao.int/publications/Documents/9303_p3_cons_en.pdf",target:"_blank",rel:"noopener noreferrer"},on=n("https://www.icao.int/publications/Documents/9303_p3_cons_en.pdf"),rn=e("dt",{id:"ref-IEC"}," [IEC] ",-1),pn=n("International Electrotechnical Commission (IEC) "),ln={href:"https://iec.ch/homepage",target:"_blank",rel:"noopener noreferrer"},cn=n("https://iec.ch/homepage"),un=e("dt",{id:"ref-ISO"}," [ISO] ",-1),dn=n("International Organization for Standardization (ISO) "),hn={href:"https://www.iso.org/home.html",target:"_blank",rel:"noopener noreferrer"},mn=n("https://www.iso.org/home.html"),vn=e("dt",{id:"ref-ISO639"}," [ISO639] ",-1),fn=n("ISO 639-1:2002, Codes for the representation of names of languages \u2014 Part 1: Alpha-2 code (2019) "),kn={href:"https://www.iso.org/standard/22109.html",target:"_blank",rel:"noopener noreferrer"},bn=n("https://www.iso.org/standard/22109.html"),gn=e("dt",{id:"ref-ISO3166"}," [ISO3166] ",-1),yn=n("ISO 3166-1:2020, Codes for the representation of names of countries and their subdivisions \u2014 Part 1: Country code (2020) "),qn={href:"https://www.iso.org/standard/72482.html",target:"_blank",rel:"noopener noreferrer"},_n=n("https://www.iso.org/standard/72482.html"),wn=e("dt",{id:"ref-ISO7501"}," [ISO7501] ",-1),xn=n("ISO/IEC 7501-1:2008, Identification cards \u2014 Machine readable travel documents \u2014 Part 1: Machine-readable passport (2021) "),On={href:"https://www.iso.org/standard/45562.html",target:"_blank",rel:"noopener noreferrer"},Cn=n("https://www.iso.org/standard/45562.html"),In=e("dt",{id:"ref-ISO8601"}," [ISO8601] ",-1),An=n("ISO 8601:2019, Date and time format (2019) "),Tn={href:"https://www.iso.org/iso-8601-date-and-time-format.html",target:"_blank",rel:"noopener noreferrer"},Sn=n("https://www.iso.org/iso-8601-date-and-time-format.html"),En=e("dt",{id:"ref-ISO10646"}," [ISO10646] ",-1),Mn=n("ISO/IEC 10646:2020, Information technology \u2014 Universal coded character set (UCS) (2020) "),Dn={href:"https://www.iso.org/standard/76835.html",target:"_blank",rel:"noopener noreferrer"},Pn=n("https://www.iso.org/standard/76835.html"),Rn=e("dt",{id:"ref-ITU"}," [ITU] ",-1),jn=n("International Telecommunication Union (ITU) "),Nn={href:"https://www.itu.int/en/Pages/default.aspx",target:"_blank",rel:"noopener noreferrer"},Fn=n("https://www.itu.int/en/Pages/default.aspx"),Bn=e("dt",{id:"ref-KAN2020"}," [KAN2020] ",-1),Un=n("Knowles, P., Klingenstein, K., Wunderlich, J. Blinding Identity Taxonomy (BIT), Version 1.0 (2020, Kantara Initiative) "),Yn={href:"https://docs.kantarainitiative.org/Blinding-Identity-Taxonomy-Report-Version-1.0.pdf",target:"_blank",rel:"noopener noreferrer"},Gn=n("https://docs.kantarainitiative.org/Blinding-Identity-Taxonomy-Report-Version-1.0.pdf"),Zn=e("dt",{id:"ref-KNO2022"}," [KNO2022] ",-1),Vn=n("Knowles, P., Mitwicki, R., Page, P. Decentralised semantics in distributed data ecosystems: Ensuring the structural, definitional, and contextual harmonisation and integrity of deterministic objects and objectual relationships (2022) "),Ln={href:"http://star.informatik.rwth-aachen.de/Publications/CEUR-WS/Vol-3249/paper4-OSS.pdf",target:"_blank",rel:"noopener noreferrer"},Kn=n("http://star.informatik.rwth-aachen.de/Publications/CEUR-WS/Vol-3249/paper4-OSS.pdf"),Wn=e("dt",{id:"ref-REGEX"}," [REGEX] ",-1),Hn=n("DOCS.RS, Crate RegEx (Regular Expression), Version 1.6.0 "),Qn={href:"https://docs.rs/regex/latest/regex/#syntax",target:"_blank",rel:"noopener noreferrer"},zn=n(" https://docs.rs/regex/latest/regex/#syntax"),Jn=e("dt",{id:"ref-RFC0020"}," [RFC0020] ",-1),Xn=n("Cerf, V. ASCII format for network interchange, STD 80, RFC 20, DOI 10.17487/RFC0020 (October 1969) "),$n={href:"https://www.rfc-editor.org/info/rfc20",target:"_blank",rel:"noopener noreferrer"},ea=n("https://www.rfc-editor.org/info/rfc20"),na=e("dt",{id:"ref-RFC2119"}," [RFC2119] ",-1),aa=n("Bradner, S. Key words for use in RFCs to Indicate Requirement Levels, BCP 14, RFC 2119, DOI 10.17487/RFC2119 (March 1997) "),sa={href:"https://www.rfc-editor.org/rfc/rfc2119",target:"_blank",rel:"noopener noreferrer"},ta=n("https://www.rfc-editor.org/rfc/rfc2119"),oa=e("dt",{id:"ref-RFC2781"}," [RFC2781] ",-1),ia=n("Hoffman, P., Yergeau, F. UTF-16, an encoding of ISO 10646, RFC 2781, DOI 10.17487/RFC2781 (February 2000) "),ra={href:"https://www.rfc-editor.org/info/rfc2781",target:"_blank",rel:"noopener noreferrer"},pa=n(" https://www.rfc-editor.org/info/rfc2781"),la=e("dt",{id:"ref-RFC3629"}," [RFC3629] ",-1),ca=n("Yergeau, F. UTF-8, a transformation format of ISO 10646, STD 63, RFC 3629, DOI 10.17487/RFC3629 (November 2003) "),ua={href:"https://www.rfc-editor.org/rfc/rfc3629",target:"_blank",rel:"noopener noreferrer"},da=n("https://www.rfc-editor.org/rfc/rfc3629"),ha=e("dt",{id:"ref-RFC4648"}," [RFC4648] ",-1),ma=n("Josefsson, S. The Base16, Base32, and Base64 Data Encodings, RFC 4648, DOI 10.17487/RFC4648 (October 2006) "),va={href:"https://www.rfc-editor.org/info/rfc4648",target:"_blank",rel:"noopener noreferrer"},fa=n("https://www.rfc-editor.org/info/rfc4648"),ka=e("dt",{id:"ref-RFC5234"}," [RFC5234] ",-1),ba=n("Crocker, D., Ed., Overell, P. Augmented BNF for Syntax Specifications: ABNF, RFC 5234 (January 2008) "),ga={href:"https://datatracker.ietf.org/doc/html/rfc5234",target:"_blank",rel:"noopener noreferrer"},ya=n("https://datatracker.ietf.org/doc/html/rfc5234"),qa=e("dt",{id:"ref-UN"}," [UN] ",-1),_a=n("United Nations "),wa={href:"https://www.un.org/en/",target:"_blank",rel:"noopener noreferrer"},xa=n("https://www.un.org/en/"),Oa=e("dt",{id:"ref-UNICODE"}," [UNICODE] ",-1),Ca=n("Unicode "),Ia={href:"https://home.unicode.org/",target:"_blank",rel:"noopener noreferrer"},Aa=n("https://home.unicode.org/"),Ta=e("dt",{id:"ref-UNSDG"}," [UNSDG] ",-1),Sa=n("United Nations. Sustainable Development Goals (SDGs) "),Ea={href:"https://sdgs.un.org/goals",target:"_blank",rel:"noopener noreferrer"},Ma=n("https://sdgs.un.org/goals"),Da=t(`

Appendices

Appendix A. An example of Metafile content

{
+  "files": {
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] character_encoding": "E3SAKe0z83pfBnhhcZl19PGGKBheb35WeCJ3V6RdqwY8",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] conditional": "Ejx0o0yuwp99vi0V-ssP6URZIXRMGj1oNKIZ1BXi4sHU",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] conformance": "EZv1B5nNl4Rty8CXFTALhr8T6qXeO0CcKliM03sdrkRA",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] entry (en)": "Eri3NLi1fr4QrKoFfTlK31KvWpwrSgGaZ0LLuWYQaZfI",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] entry (fr)": "EY0UZ8aYAPusaWk_TON8c20gHth2tvZs4eWh7XAfXBcY",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] entry_code": "E1mqEb4f6eOMgu5zR857WWlMUwGYwPzZgiM6sWRZkQ0M",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] format": "ESEMKWoKKIf5qvngKecV-ei8MwcQc_pPWCH1FrTWajAM",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] information (en)": "EyzKEWuMs8kspj4r70_Lc8sdppnDx-hb9QqUQywjmDRY",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] information (fr)": "EIGknekgJFqjgQ8ah2NwL8zNWbFrllvXVLqezgB6U3Yg",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] label (en)": "EgBxL29VsxoZso7YFirlMP334ZuC1mkel-lO7TxPxEq8",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] label (fr)": "ED9PH0ZBaOci-nbnYfPgYZWGQdkyWxA-nW3REmB3vhu0",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] layout": "ElJEQGfAvfJEuB7JeNIcvmAPO2DIOaKkpkZyvxO-gQoc",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] meta (en)": "EpW9bQGs0Lk6k5cJikN0Ep-DN6z29fwZIsbVzMBgTlWY",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] meta (fr)": "EIGj0LQKT9-6gCLV2QZVgi4YQZhrUl0-GKbN7sFTCSAI",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] unit": "EHDwC_Ucuttrsxh2NVptgBnyG4EMbG5D8QsdbeF9G9-M",
+    "capture_base-0": "EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis"
+  },
+  "root": "EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis"
+}
+
`,3);function Pa(Ra,ja){const a=i("ExternalLinkIcon");return r(),p("div",null,[k,e("dl",null,[b,e("dd",null,[e("p",null,[e("a",g,[y,s(a)]),q,e("a",_,[w,s(a)]),x])]),O,e("dd",null,[e("p",null,[C,e("a",I,[A,s(a)]),T])]),S,e("dd",null,[E,e("p",null,[M,e("a",D,[P,s(a)]),R]),e("p",null,[j,e("a",N,[F,s(a)]),B]),e("p",null,[U,e("a",Y,[G,s(a)]),Z]),e("p",null,[V,e("a",L,[K,s(a)]),W])]),H,Q,z,e("dd",null,[e("p",null,[J,e("a",X,[$,s(a)]),ee,e("a",ne,[ae,s(a)]),se])]),te,oe]),ie,e("dl",null,[re,e("dd",null,[e("p",null,[pe,e("a",le,[ce,s(a)])])]),ue,e("dd",null,[e("p",null,[de,e("a",he,[me,s(a)])])])]),ve,e("div",null,[e("dl",null,[fe,e("dd",null,[e("p",null,[ke,e("a",be,[ge,s(a)])])]),ye,e("dd",null,[e("p",null,[qe,e("a",_e,[we,s(a)])])]),xe,e("dd",null,[e("p",null,[Oe,e("a",Ce,[Ie,s(a)])])]),Ae,e("dd",null,[e("p",null,[Te,e("a",Se,[Ee,s(a)])])]),Me,e("dd",null,[e("p",null,[De,e("a",Pe,[Re,s(a)])])]),je,e("dd",null,[e("p",null,[Ne,e("a",Fe,[Be,s(a)])])]),Ue,e("dd",null,[e("p",null,[Ye,e("a",Ge,[Ze,s(a)])])]),Ve,e("dd",null,[e("p",null,[Le,e("a",Ke,[We,s(a)])])]),He,e("dd",null,[e("p",null,[Qe,e("a",ze,[Je,s(a)])])]),Xe,e("dd",null,[e("p",null,[$e,e("a",en,[nn,s(a)])])]),an,e("dd",null,[e("p",null,[sn,e("a",tn,[on,s(a)])])]),rn,e("dd",null,[e("p",null,[pn,e("a",ln,[cn,s(a)])])]),un,e("dd",null,[e("p",null,[dn,e("a",hn,[mn,s(a)])])]),vn,e("dd",null,[e("p",null,[fn,e("a",kn,[bn,s(a)])])]),gn,e("dd",null,[e("p",null,[yn,e("a",qn,[_n,s(a)])])]),wn,e("dd",null,[e("p",null,[xn,e("a",On,[Cn,s(a)])])]),In,e("dd",null,[e("p",null,[An,e("a",Tn,[Sn,s(a)])])]),En,e("dd",null,[e("p",null,[Mn,e("a",Dn,[Pn,s(a)])])]),Rn,e("dd",null,[e("p",null,[jn,e("a",Nn,[Fn,s(a)])])]),Bn,e("dd",null,[e("p",null,[Un,e("a",Yn,[Gn,s(a)])])]),Zn,e("dd",null,[e("p",null,[Vn,e("a",Ln,[Kn,s(a)])])]),Wn,e("dd",null,[e("p",null,[Hn,e("a",Qn,[zn,s(a)])])]),Jn,e("dd",null,[e("p",null,[Xn,e("a",$n,[ea,s(a)])])]),na,e("dd",null,[e("p",null,[aa,e("a",sa,[ta,s(a)])])]),oa,e("dd",null,[e("p",null,[ia,e("a",ra,[pa,s(a)])])]),la,e("dd",null,[e("p",null,[ca,e("a",ua,[da,s(a)])])]),ha,e("dd",null,[e("p",null,[ma,e("a",va,[fa,s(a)])])]),ka,e("dd",null,[e("p",null,[ba,e("a",ga,[ya,s(a)])])]),qa,e("dd",null,[e("p",null,[_a,e("a",wa,[xa,s(a)])])]),Oa,e("dd",null,[e("p",null,[Ca,e("a",Ia,[Aa,s(a)])])]),Ta,e("dd",null,[e("p",null,[Sa,e("a",Ea,[Ma,s(a)])])])])]),Da])}var Fa=o(f,[["render",Pa],["__file","index.html.vue"]]);export{Fa as default}; diff --git a/assets/index.html.a718e17a.js b/assets/index.html.a718e17a.js new file mode 100644 index 0000000..e9454cd --- /dev/null +++ b/assets/index.html.a718e17a.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-d8f2b400","path":"/guide/applications/","title":"Applications","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Use case #1: Data transformation using overlays","slug":"use-case-1-data-transformation-using-overlays","children":[]},{"level":2,"title":"Use case #2: Object presentation using overlays","slug":"use-case-2-object-presentation-using-overlays","children":[]},{"level":2,"title":"Use case #3: Internationalisation using language-specific overlays","slug":"use-case-3-internationalisation-using-language-specific-overlays","children":[]},{"level":2,"title":"Use case #4: Distributed custodianship of task-specific objects","slug":"use-case-4-distributed-custodianship-of-task-specific-objects","children":[]},{"level":2,"title":"Use case #5: Internet of Things (IoT) applications using overlays","slug":"use-case-5-internet-of-things-iot-applications-using-overlays","children":[]}],"git":{"updatedTime":1698417852000},"filePathRelative":"guide/applications/README.md"}');export{e as data}; diff --git a/assets/index.html.be7f5525.js b/assets/index.html.be7f5525.js new file mode 100644 index 0000000..913e314 --- /dev/null +++ b/assets/index.html.be7f5525.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,e as i}from"./app.ebda841e.js";var n="/images/use-case-transformation.png",s="/images/use-case-presentation.png",o="/images/use-case-i18n.png",r="/images/use-case-transformation2.png";const l={},c=i('

Applications

Although "data harmonisation" is the core characteristic of the Semantic domain, OCA must also support the "objectual integrity" of any digital object and its relationships with other objects.

Use case #1: Data transformation using overlays

Data transformation is a crucial data management requirement for integration, migration, data warehousing, and data preparation, involving converting data from one format to another (e.g., a database file, XML document or Excel spreadsheet). These modifications typically involve converting a raw data source into a cleansed, validated, and ready-to-use format. OCA allows an issuer to transform data morphologically, operating on subsets of data while maintaining information over the data supply chain. Applied to machine learning (ML), OCA thus enables direct linkage of an ML-generated image with the training data used to produce the final result. Separating overlays from the defined capture base offers a harmonisation solution between data models and data representation formats and from unstructured to structured data. Data harmonisation involves transforming datasets to fit together structurally while ensuring the definitional and contextual meaning of the source data is uniformly understood by all interacting actors, regardless of how it was collected initially.

Use case transformationFigure 3. Data transformation. Decentralised semantics offer a harmonisation solution between data models and data representation formats, or from unstructured to structured data.

By issuing and controlling a set of proprietary transformation overlays, purpose-driven service providers can securely map source attribute names, entry codes, or unit conversions to a standard capture base defined by either a centralised organisation or a multistakeholder data governance administration. Capture bases provide a substrate for data harmonisation. Specifically, a cryptographic link is established from the transformation overlays to a consensually-defined capture base, ensuring the integrity of those objectual relationships and facilitating a secure means for data harmonisation.

Transformation overlays include:

  • Attribute mapping
  • Entry code mapping
  • Subset
  • Unit mapping

Use case #2: Object presentation using overlays

In many instances of object presentation, the legal entity that issues the original data capture form may differ from the entity that issues the presentation objects required to produce an associated credential. For example, national passport issuance provides an opportunistic use case to demonstrate the advantages of this particular characteristic.

The International Civil Aviation Organization (ICAO) [3], a specialised agency of the United Nations [4], is tasked with planning and developing standards for safe international air transport. ICAO\u2019s primary role is to provide standards that will help regulate aviation worldwide. One of those standards is ICAO Document 9303 [5] (endorsed by the International Organization for Standardization (ISO) [6] and the International Electrotechnical Commission (IEC) [7] as ISO/IEC 7501-1 [8]), a global standard for machine-readable travel documents (MRTD), including the data capture requirements of a machine-readable passport (MRP). As a result, ICAO is well-positioned to be the primary issuer of a standard capture base and the core overlays required for MRP form inputs, semantics, and presentation.

However, the issuance of any presentation objects needed to produce a national passport with branded design requirements would be under the remit of issuing governmental agencies, including cantonal passport offices in the country and at its embassies or consulates overseas. As an example for Switzerland, the Swiss Government is the authority to act as the primary issuer of presentation overlays to produce a branded Swiss passport, a credential identifying a traveller as a Swiss citizen or national with a right to protection while abroad, and a right to return to Switzerland. The capture base and overlays are identifiable by Self-Addressing IDentifiers (SAID) [9], a particular type of content-addressable identifier based on a self-referential cryptographic digest. These identifiers are deterministic. In other words, there is no randomness in the identifier generation process, ensuring the objectual integrity of the digital objects and their relationships.

Use case presentationFigure 4. Dynamic presentation. The decentralised control of presentation overlays within a governed ecosystem enables the autonomous rendering of different transient objects cryptographically bound to the same capture base.

In this particular use case, authorised Swiss governmental agencies would inevitably store an instance of the ICAO-issued MRP objects in local repositories. However, the SAIDs of those digital objects would remain unchanged from the original identifiers held in an ICAO repository. As the object identifiers are deterministic, the dynamic presentation of national passports, in this case, can be established securely by maintaining a cryptographic thread from the presentation overlays to a standard capture base for global standardisation. Note that a national passport is an example of a credential presentation. However, for different use cases, the presentation of other transient object types, such as digital forms, contracts, and receipts, would also benefit from the dynamic issuance of presentation overlays.

Presentation overlays include:

  • Layout
  • Sensitive

Use case #3: Internationalisation using language-specific overlays

Internationalisation involves designing and developing a product for target audiences that vary in culture, region, or language. The internationalisation of transient digital objects across ecosystems is essential for service providers to participate in a global market.

Let us take Switzerland as an example of a multilingual country. It is officially quadrilingual, with German, French, Italian, and Romansh as its national languages. However, many other minority languages, such as English, are becoming increasingly important. Since Switzerland is a federation, the sovereign cantons define their official language according to the primary language spoken by their inhabitants.

Use case i18nFigure 5. Internationalisation. Switzerland is a quadrilingual country. The decentralised control of language-specific overlays would enable cantonal authorities to translate official documents issued by the Swiss national federal government into their region\u2019s official language(s).

Presenting information for a purpose-driven activity in a language understandable to all recipients has commonly involved replicating digital forms, credentials, notices, and contracts into various languages based on user preferences. With federated or centralised governance authorities maintaining digital objects in multiple languages, internal data management inefficiencies are common to many organisations, institutions, and governments.

The FAIR (Findable, Accessible, Interoperable, and Reusable) data principles [10] support the reusability of digital assets. Still, many legal entities have difficulty streamlining data management practices and processes to comply with these guiding principles.

OCA offers a solution for the internationalisation of digital objects within data ecosystems by enabling various authorised entities to control a different set of language-specific overlays for a particular transient object, such as a digital form, with a data governance administration defining and issuing a standard capture base and core language-agnostic or default language overlays.

With cantonal participation being an essential ingredient of Swiss-style federalism, separating language-specific overlays from any capture bases and core language-agnostic overlays issued by the federal government would enable a collaborative solution to internationalisation. In this scenario, decentralised semantics allow sets of language-specific overlays to be controlled and maintained by different cantons depending on their primary spoken language. In other words, distributed control of language-specific overlays would enable regional authorities to manage the official translation of any document issued by a national federal government into their region\u2019s official language(s).

The above example is globally scalable, with OCA enabling the translation of any digital object under established governance while preserving its objectual integrity. More importantly, it significantly impacts objectual inclusiveness within digital systems. Within an ecosystem, OCA allows for transient object design in a particular language, where additional interoperable language-specific overlays, including those for minority or indigenous languages, can be added dynamically.

Whether defining schemas within a centralised organisation or a multistakeholder data governance administration, OCA offers a network-agnostic solution for data harmonisation within any governance framework.

Language-specific overlays include:

  • Entry
  • Information
  • Label
  • Meta

See Swiss Passport example in action.

Use case #4: Distributed custodianship of task-specific objects

Distributed custodianship of capture bases, overlays, code tables, and other assets enables the responsibility of separate tasks to reside with different actors without compromising the objectual integrity of the overall semantic structure. As a result, multiple actors from various institutions can contribute to developing schemas for complex use cases, supply chains, and data flows supported by multistakeholder data governance administrations and frameworks.

Use case #5: Internet of Things (IoT) applications using overlays

The Internet of Things (IoT) describes physical objects (or groups of such objects) with sensors, processing ability, software, and other technologies that connect and exchange data with other devices and systems over the Internet or other communications networks. IoT data collection involves using sensors to track the performance of devices connected to the Internet of Things. In addition, the sensors track the status of the IoT network by collecting and transmitting real-time data that is stored and retrieved at any moment.

IoT applications make continuous, thorough measurements possible through low-power and wireless sensor nodes. Many existing IoT measurement mechanisms focus on obtaining real-time measurements, enabling improved insights on changes in the measurand. The closeness between the measurement's result and the measurand's true value indicates the measurement's accuracy. As such, a unit, a factor used to express the quantity of the measurand, often accompanies the measurement as a standardised quantity defined and adopted by convention or law.

Aligning measurement units is particularly important in areas requiring data sharing or conversion between units. For example, independent IoT sensors may use different units to represent their measurements, and a mapping is needed when consolidating their data.

Use case presentationFigure 6. Unit conversions for measurements captured by IoT devices. Unit mapping overlays can be strongly bound to capture bases containing unit overlays with unit conversion tables providing recipes for seamless measurement conversions.

By issuing and controlling unit mapping overlays, purpose-driven service providers can provide source units for continuous measurements captured and transmitted by IoT devices. Capture bases and associated unit overlays issued and controlled by data governance administrations offer a target for unit harmonisation with unit conversion tables providing the recipe for seamless measurement conversions. Specifically, a cryptographic link is established from the unit mapping overlays to consensually-defined capture bases and unit overlays, ensuring the integrity of those objectual relationships and facilitating a secure means for unit harmonisation.

Overlays required for unit conversions include:

  • Unit mapping (source)
  • Unit (target)
',39),d=[c];function u(p,h){return a(),t("div",null,d)}var m=e(l,[["render",u],["__file","index.html.vue"]]);export{m as default}; diff --git a/assets/index.html.c08fa903.js b/assets/index.html.c08fa903.js new file mode 100644 index 0000000..78bc179 --- /dev/null +++ b/assets/index.html.c08fa903.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-b038aa76","path":"/specification/","title":"OCA Technical Specification","lang":"en-US","frontmatter":{"sidebarDepth":5,"description":"Official OCA specification"},"excerpt":"","headers":[{"level":2,"title":"Introduction","slug":"introduction","children":[{"level":3,"title":"How does OCA work?","slug":"how-does-oca-work","children":[{"level":4,"title":"What is a Capture Base?","slug":"what-is-a-capture-base","children":[]},{"level":4,"title":"What are Overlays?","slug":"what-are-overlays","children":[]}]}]},{"level":2,"title":"OCA object types","slug":"oca-object-types","children":[{"level":3,"title":"Capture Base","slug":"capture-base","children":[{"level":4,"title":"Type","slug":"type","children":[]},{"level":4,"title":"Classification","slug":"classification","children":[]},{"level":4,"title":"Attributes","slug":"attributes","children":[{"level":5,"title":"Attribute name","slug":"attribute-name","children":[]},{"level":5,"title":"Attribute type","slug":"attribute-type","children":[]}]},{"level":4,"title":"Flagged attributes","slug":"flagged-attributes","children":[]}]},{"level":3,"title":"Overlays","slug":"overlays","children":[{"level":4,"title":"Common attributes","slug":"common-attributes","children":[{"level":5,"title":"Capture base","slug":"capture-base-1","children":[]},{"level":5,"title":"Type","slug":"type-1","children":[]},{"level":5,"title":"Language","slug":"language","children":[]}]},{"level":4,"title":"Semantic Overlays","slug":"semantic-overlays","children":[{"level":5,"title":"Character Encoding Overlay","slug":"character-encoding-overlay","children":[]},{"level":5,"title":"Format Overlay","slug":"format-overlay","children":[]},{"level":5,"title":"Information Overlay","slug":"information-overlay","children":[]},{"level":5,"title":"Label Overlay","slug":"label-overlay","children":[]},{"level":5,"title":"Meta Overlay","slug":"meta-overlay","children":[]},{"level":5,"title":"Standard Overlay","slug":"standard-overlay","children":[]}]},{"level":4,"title":"Inputs Overlays","slug":"inputs-overlays","children":[{"level":5,"title":"Cardinality Overlay","slug":"cardinality-overlay","children":[]},{"level":5,"title":"Conditional Overlay","slug":"conditional-overlay","children":[]},{"level":5,"title":"Conformance Overlay","slug":"conformance-overlay","children":[]},{"level":5,"title":"Entry Code Overlay","slug":"entry-code-overlay","children":[]},{"level":5,"title":"Entry Overlay","slug":"entry-overlay","children":[]},{"level":5,"title":"Unit Overlay","slug":"unit-overlay","children":[]}]},{"level":4,"title":"Transformation Overlays","slug":"transformation-overlays","children":[{"level":5,"title":"Attribute Mapping Overlay","slug":"attribute-mapping-overlay","children":[]},{"level":5,"title":"Entry Code Mapping Overlay","slug":"entry-code-mapping-overlay","children":[]},{"level":5,"title":"Subset Overlay","slug":"subset-overlay","children":[]},{"level":5,"title":"Unit Mapping Overlay","slug":"unit-mapping-overlay","children":[]}]},{"level":4,"title":"Presentation Overlays","slug":"presentation-overlays","children":[{"level":5,"title":"Layout Overlay","slug":"layout-overlay","children":[]},{"level":5,"title":"Sensitive Overlay","slug":"sensitive-overlay","children":[]}]}]},{"level":3,"title":"Bundle","slug":"bundle","children":[]},{"level":3,"title":"Code Tables","slug":"code-tables","children":[{"level":4,"title":"Code Table for Keys","slug":"code-table-for-keys","children":[]},{"level":4,"title":"Code Table for Key-Value pairs","slug":"code-table-for-key-value-pairs","children":[]},{"level":4,"title":"Code Table for Unit mappings","slug":"code-table-for-unit-mappings","children":[]}]}]},{"level":2,"title":"Basic concepts","slug":"basic-concepts","children":[{"level":3,"title":"Capture","slug":"capture","children":[]},{"level":3,"title":"Validation","slug":"validation","children":[]},{"level":3,"title":"Transformation","slug":"transformation","children":[]},{"level":3,"title":"Presentation","slug":"presentation","children":[]}]},{"level":2,"title":"Conventions and Definitions","slug":"conventions-and-definitions","children":[]},{"level":2,"title":"References","slug":"references","children":[{"level":3,"title":"Normative References","slug":"normative-references","children":[]},{"level":3,"title":"Informative References","slug":"informative-references","children":[]}]},{"level":2,"title":"Appendices","slug":"appendices","children":[{"level":3,"title":"Appendix A. An example of Metafile content","slug":"appendix-a-an-example-of-metafile-content","children":[]}]}],"git":{"updatedTime":1698417852000},"filePathRelative":"specification/README.md"}');export{e as data}; diff --git a/assets/introduction.html.06e57d04.js b/assets/introduction.html.06e57d04.js new file mode 100644 index 0000000..8882c80 --- /dev/null +++ b/assets/introduction.html.06e57d04.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-1c7b2593","path":"/guide/introduction.html","title":"Introduction","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Semantic domain","slug":"semantic-domain","children":[{"level":3,"title":"What is Data semantics?","slug":"what-is-data-semantics","children":[]},{"level":3,"title":"What is Decentralised semantics?","slug":"what-is-decentralised-semantics","children":[]}]},{"level":2,"title":"Why decentralise semantics?","slug":"why-decentralise-semantics","children":[]},{"level":2,"title":"What is Overlays Capture Architecture (OCA)?","slug":"what-is-overlays-capture-architecture-oca","children":[]},{"level":2,"title":"Benefits","slug":"benefits","children":[]},{"level":2,"title":"Concepts","slug":"concepts","children":[]},{"level":2,"title":"A brief of history","slug":"a-brief-of-history","children":[]}],"git":{"updatedTime":1698417852000},"filePathRelative":"guide/introduction.md"}');export{e as data}; diff --git a/assets/introduction.html.f59a7865.js b/assets/introduction.html.f59a7865.js new file mode 100644 index 0000000..7cd4be3 --- /dev/null +++ b/assets/introduction.html.f59a7865.js @@ -0,0 +1 @@ +import{_ as r,r as n,o as c,c as d,a as t,b as a,w as h,e as o,d as e}from"./app.ebda841e.js";var l="/images/overlays-overview.png",p="/images/overlays-to-form.png";const u={},m=o('

Introduction

Semantic domain

Semantic domain [passive] / the meaning and use of what is put in, taken in, or operated on by any process or system.

What is Data semantics?

Data semantics is the study of the meaning and use of specific pieces of data in computer programming and other areas that employ data. When studying a language, semantics refers to what individual words mean and what they mean when put together to form phrases or sentences. Data semantics focuses on how a data object represents a concept or object in the real world.

What is Decentralised semantics?

Decentralised semantics is a term that describes the separation of semantic (\u201Cdefinitional\u201D) and pragmatic (\u201Ccontextual\u201D) tasks into task-specific objects that, when combined, provide a digital representation of a complex object.

In data processing, metadata is definitional data that provides information about or documentation of other data managed within an application or environment. Contextual data is the background information that provides a broader understanding of an event, person, or item.

Overlays overviewFigure 1. Decentralised semantics. A complex digital object shown as an amalgamation of task-specific objects.

In the domain of decentralised semantics, task-specific objects are called "Overlays". They provide layers of definitional or contextual information to a stable base object called a \u201CCapture Base\u201D.

Decentralised semantics requires the provision of deterministic object identifiers. An object is deemed deterministic if any operation\u2019s result and final state depend solely on the initial state and the operation\u2019s arguments. Object identifiers must be resolvable via the object's digest to be deemed deterministic.

Why decentralise semantics?

',12),f=e("Working across governance boundaries is tricky because there is no common language of communication between "),g={href:"https://www.techtarget.com/searchcio/definition/digital-ecosystem",target:"_blank",rel:"noopener noreferrer"},b=e(" digital ecosystems "),y=e(". How can we hope to understand one another when we speak different languages? Add to that the complexities of language evolution and diverse governance frameworks; maintaining proper context is challenging in the current digital landscape."),v=e('The primary objective of decentralised semantics is "data harmonisation", which refers to all efforts to combine data from different sources and provide users with an equivalent view of data from various studies. This objective involves the morphologic ("structural"), semantic ("definitional"), and pragmatic ("contextual") harmonisation of digital objects for a common purpose. It also provides an opportunity to structure unstructured data while offering a long-term solution for data language unification within and across distributed data ecosystems. Pending successful data harmonisation within a distributed data ecosystem, content provided by \u201Coverlays\u201D underpins structured search queries for improved insights and analytics. The key benefit of decentralised semantics is the "distributed custodianship" of task-specific objects (see '),_=e("Distributed custodianship of task-specific objects"),w=e(" for more information on distributed custodianship) without compromising the objectual integrity of the overall semantic structure. Furthermore, object interoperability is essential in an agile data economy where multiple actors from various institutions participate in complex use cases, supply chains, and data flows supported by multi-stakeholder data governance administrations and frameworks. Decentralised semantics offers an evolutionary implementation for domain-driven design, an approach to software development that centres the development on programming a domain model with a rich understanding of the processes and rules of a domain."),k=o('

What is Overlays Capture Architecture (OCA)?

Overlays Capture Architecture (OCA) is an explicit representation of task-specific objects that have deterministic relationships with other objects. These \u201COverlays\u201D define individual semantic tasks, which, when combined, provide additional context to the object. An OCA bundle consists of a \u201CCapture Base\u201D and \u201COverlays\u201D. The sum of its parts represents a contextually-rich schema.

The segregation of overlays by task enables interoperability in the construction process of any digital object without compromising the integrity of the semantic structure, modular components, or the relationship between those objects.

Overlays to formFigure 2. Semantic interoperability. Segregating task-specific objects (overlays) within a standard architecture enables different authorised controllers to update specific structural, definitional, or contextual components of the same semantic structure.

OCA is ontology-agnostic, offering a harmonisation solution between data models and data representation formats while providing a roadmap to resolve privacy-compliant data sharing between servers, networks, and across sectoral or jurisdictional boundaries.

The deterministic interplay between overlays combined with the unicity of the composite bundle is proving to be an exciting field of research.

Benefits

OCA offers many advantages, including:

  • Simplified data pooling. Decoupling can occur at any time as overlays are linked objects. With all colouration definitions stored in the overlays, combining data from related sources becomes seamless. Overlays can be removed from the base objects before the data merging process and reapplied to ensure consistent colouration post data pooling.
  • Stable capture bases. Most schema updates occur at the application stage. In the case of OCA, all extension and colouration definitions are applied in the overlays, enabling issuers to edit one or more of the linked objects to create simple updates rather than reissue capture bases on an ongoing basis.
  • Flagged attributes for encryption. By referencing the Blinding Identity Taxonomy (BIT), issuers can flag attributes in the capture base that could potentially unblind the identity of a governing entity. With attributes flagged at the base object layer, all corresponding data can be treated as sensitive throughout a data lifecycle and encrypted or removed at any stage, making associated governing entity identification impossible.
  • Data decentralisation. Capture base definitions can remain in their purest form as a standard base to decentralise data. Thus, once the data holder has given adequate consent, data controllers can contribute anonymous data upon which 3rd parties can trigger granular criteria searches for matched data, eliminating the need for data silos and encouraging consented data sharing. In addition, self-determination regarding the secondary use of personal data empowers the data holder.
  • Internationalisation. A separate linked data object captures character set encoding definitions. Thus, a single report definition c:qaan contain different attribute forms for different languages available to users, based on a user's locale and other language preferences.

Concepts

',10),j=e("OCA follows a "),x={href:"https://en.wikipedia.org/wiki/Content_centric_networking",target:"_blank",rel:"noopener noreferrer"},A=e("content centric networking"),C=e(" (CCN) approach by utilzing "),O={href:"https://datatracker.ietf.org/doc/html/draft-ssmith-said",target:"_blank",rel:"noopener noreferrer"},I=e("Self-Addressing Identifiers"),D=e(" (SAID) for deterministic content identification. For that reason OCA strongly relies on cryptographic security characteristics. Each OCA object is equipped with a SAID, which is cryptographically bound to the content of the object. SAID assures immutability and is deterministically generated directly from the content. Furthermore it can be verified without need to interact with any service or provider relying on."),T=t("h2",{id:"a-brief-of-history",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#a-brief-of-history","aria-hidden":"true"},"#"),e(" A brief of history")],-1),S=e("For several years concept of OCA (formerly ODCA) was incubated within communities like "),W={href:"https://wiki.trustoverip.org/display/HOME/Inputs+and+Semantics+Working+Group",target:"_blank",rel:"noopener noreferrer"},B=e("Inputs and Semantics Working Group"),q=e(" at "),F={href:"https://trustoverip.org/working-groups/decentralized-semantics/",target:"_blank",rel:"noopener noreferrer"},E=e("Trust over IP"),N=e(" as well as Hyperledger Aries "),L={href:"https://github.com/hyperledger/aries-rfcs/tree/main/concepts/0013-overlays",target:"_blank",rel:"noopener noreferrer"},V=e("RFC-0014"),H=e(".");function R(z,G){const i=n("ExternalLinkIcon"),s=n("RouterLink");return c(),d("div",null,[m,t("p",null,[f,t("a",g,[b,a(i)]),y]),t("p",null,[v,a(s,{to:"/guide/use-cases.html#use-case-4-distributed-custodianship-of-task-specific-objects"},{default:h(()=>[_]),_:1}),w]),k,t("p",null,[j,t("a",x,[A,a(i)]),C,t("a",O,[I,a(i)]),D]),T,t("p",null,[S,t("a",W,[B,a(i)]),q,t("a",F,[E,a(i)]),N,t("a",L,[V,a(i)]),H])])}var P=r(u,[["render",R],["__file","introduction.html.vue"]]);export{P as default}; diff --git a/assets/oca-browser.html.23c0003d.js b/assets/oca-browser.html.23c0003d.js new file mode 100644 index 0000000..c6899f5 --- /dev/null +++ b/assets/oca-browser.html.23c0003d.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-5b69fa59","path":"/ecosystem/oca-browser.html","title":"OCA Browser","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Try it","slug":"try-it","children":[]},{"level":2,"title":"Installation","slug":"installation","children":[{"level":5,"title":"Example","slug":"example","children":[]}]}],"git":{"updatedTime":1698417852000},"filePathRelative":"ecosystem/oca-browser.md"}');export{e as data}; diff --git a/assets/oca-browser.html.5670c628.js b/assets/oca-browser.html.5670c628.js new file mode 100644 index 0000000..a8ebc36 --- /dev/null +++ b/assets/oca-browser.html.5670c628.js @@ -0,0 +1 @@ +import{_ as s,r as a,o as r,c as i,a as e,b as n,d as o,e as c}from"./app.ebda841e.js";const l={},d=e("h1",null,"OCA Browser",-1),h=e("p",null,[o("The "),e("strong",null,"OCA Browser"),o(" is an utility to create and preview OCA Bundles using WEB interface. The OCA Browser supports:")],-1),_=e("ul",null,[e("li",null,"form preview, so how the data can be captured using this bundle,"),e("li",null,"credential preview, so how the data can be presented using this bundle.")],-1),u=e("h2",{id:"try-it",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#try-it","aria-hidden":"true"},"#"),o(" Try it")],-1),p=o("An instance of the OCA Browser is ready for you, under our Argo sandbox where you can play with it without the need to look into the code. You can find it "),m={href:"https://browser.oca.argo.colossi.network/#/",target:"_blank",rel:"noopener noreferrer"},f=o("HERE"),w=e("p",null,"But if you are brave enough and ready for hands-on activity keep reading.",-1),b=e("h2",{id:"installation",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#installation","aria-hidden":"true"},"#"),o(" Installation")],-1),y=o("Navigate to the "),g={href:"https://github.com/THCLab/oca-browser",target:"_blank",rel:"noopener noreferrer"},v=o("OCA Browser repository"),k=o(" to download latest source code. It comes with a "),B=e("code",null,"Dockerfile",-1),x=o(" and it is possible to pack it as a service into Docker image and run as a container."),A=o("Alternatively, there is a pre-baked "),C={href:"https://github.com/THCLab/oca-ecosystem/blob/main/docker-compose.yml",target:"_blank",rel:"noopener noreferrer"},O=e("code",null,"docker-compose.yml",-1),T=o(" file"),E=o(" that includes OCA Repository, Browser and Data Vault already configured. To run it locally, download the compose file and then run "),I=e("code",null,"docker compose up",-1),N=o(" in the directory with "),L=e("code",null,"docker-compose.yml",-1),V=o("."),H={class:"custom-container tip"},D=e("p",{class:"custom-container-title"},"TIP",-1),R=o("It can be a viable alternative to use OCA Browser that is already established. For that, visit "),S={href:"https://browser.oca.argo.colossi.network/#/",target:"_blank",rel:"noopener noreferrer"},q=o("OCA Browser"),F=o(" page."),G=e("h5",{id:"example",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#example","aria-hidden":"true"},"#"),o(" Example")],-1),P=o("Navigate to "),W={href:"https://github.com/THCLab/oca-ecosystem/tree/main/examples/custom_layouts",target:"_blank",rel:"noopener noreferrer"},X=o("the example"),Y=o(" and download XLS file along with layouts."),j=c("
  • Navigate to the develop menu item and provide all required files. If the transformation process succeeded, next to convert button a link will pop up that follows to a newly created OCA Bundle.
  • Go to preview menu item and upload OCA Bundle. A form and credential preview will be shown.
",1);function z(J,K){const t=a("ExternalLinkIcon");return r(),i("div",null,[d,h,_,u,e("p",null,[p,e("a",m,[f,n(t)])]),w,b,e("p",null,[y,e("a",g,[v,n(t)]),k,B,x]),e("p",null,[A,e("a",C,[O,T,n(t)]),E,I,N,L,V]),e("div",H,[D,e("p",null,[R,e("a",S,[q,n(t)]),F])]),G,e("p",null,[P,e("a",W,[X,n(t)]),Y]),j])}var Q=s(l,[["render",z],["__file","oca-browser.html.vue"]]);export{Q as default}; diff --git a/assets/oca-bundle.html.1d0d149b.js b/assets/oca-bundle.html.1d0d149b.js new file mode 100644 index 0000000..dde4b24 --- /dev/null +++ b/assets/oca-bundle.html.1d0d149b.js @@ -0,0 +1 @@ +import{_ as n,r as c,o as s,c as a,a as t,b as _,w as l,d as e}from"./app.ebda841e.js";const r={},i=t("h1",null,"OCA Bundle",-1),d=e("Refer to the "),u=e(" Specification Bundle "),f=e(" section.");function h(p,m){const o=c("RouterLink");return s(),a("div",null,[i,t("p",null,[d,_(o,{to:"/specification/#bundle"},{default:l(()=>[u]),_:1}),f])])}var x=n(r,[["render",h],["__file","oca-bundle.html.vue"]]);export{x as default}; diff --git a/assets/oca-bundle.html.9f7247d9.js b/assets/oca-bundle.html.9f7247d9.js new file mode 100644 index 0000000..4ab0a35 --- /dev/null +++ b/assets/oca-bundle.html.9f7247d9.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-12ca5e22","path":"/ecosystem/oca-bundle.html","title":"OCA Bundle","lang":"en-US","frontmatter":{},"excerpt":"","headers":[],"git":{"updatedTime":1698417852000},"filePathRelative":"ecosystem/oca-bundle.md"}');export{e as data}; diff --git a/assets/oca-data-vault.html.8bcb5cfa.js b/assets/oca-data-vault.html.8bcb5cfa.js new file mode 100644 index 0000000..57b4776 --- /dev/null +++ b/assets/oca-data-vault.html.8bcb5cfa.js @@ -0,0 +1 @@ +const t=JSON.parse('{"key":"v-2327417c","path":"/ecosystem/oca-data-vault.html","title":"","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"OCA Data Vault","slug":"oca-data-vault","children":[]}],"git":{"updatedTime":1698417852000},"filePathRelative":"ecosystem/oca-data-vault.md"}');export{t as data}; diff --git a/assets/oca-data-vault.html.8d3d4a9e.js b/assets/oca-data-vault.html.8d3d4a9e.js new file mode 100644 index 0000000..46728e7 --- /dev/null +++ b/assets/oca-data-vault.html.8d3d4a9e.js @@ -0,0 +1 @@ +import{_ as s,r as n,o as r,c as l,a as t,b as o,d as a}from"./app.ebda841e.js";const c={},i=t("h2",{id:"oca-data-vault",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#oca-data-vault","aria-hidden":"true"},"#"),a(" OCA Data Vault")],-1),d=t("p",null,"OCA Data Vault is a simple PoC data storage implementation showcasing how to consume and provide data described by OCA.",-1),_=t("p",null,"This project implementation is for showcasing purposes only, not for production systems or real-life use cases.",-1),u=t("li",null,"License: EUPL 1.2",-1),h=a("Data Valut on Argo: "),p={href:"https://data-vault.argo.colossi.network/",target:"_blank",rel:"noopener noreferrer"},m=a("https://data-vault.argo.colossi.network/"),f=a("Source code: "),v={href:"https://github.com/THCLab/oca-data-vault",target:"_blank",rel:"noopener noreferrer"},b=a("https://github.com/THCLab/oca-data-vault");function g(k,x){const e=n("ExternalLinkIcon");return r(),l("div",null,[i,d,_,t("ul",null,[u,t("li",null,[h,t("a",p,[m,o(e)])]),t("li",null,[f,t("a",v,[b,o(e)])])])])}var V=s(c,[["render",g],["__file","oca-data-vault.html.vue"]]);export{V as default}; diff --git a/assets/oca-file.html.6b0b48e0.js b/assets/oca-file.html.6b0b48e0.js new file mode 100644 index 0000000..13d80c0 --- /dev/null +++ b/assets/oca-file.html.6b0b48e0.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-35180e35","path":"/ecosystem/oca-file.html","title":"","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Introduction","slug":"introduction","children":[]},{"level":2,"title":"Main characteristics","slug":"main-characteristics","children":[{"level":3,"title":"Deterministic through layered architecture","slug":"deterministic-through-layered-architecture","children":[]},{"level":3,"title":"Text based format","slug":"text-based-format","children":[]},{"level":3,"title":"Pleasant DSL","slug":"pleasant-dsl","children":[]},{"level":3,"title":"Version control system compliant","slug":"version-control-system-compliant","children":[]}]}],"git":{"updatedTime":1698417852000},"filePathRelative":"ecosystem/oca-file.md"}');export{e as data}; diff --git a/assets/oca-file.html.722dd629.js b/assets/oca-file.html.722dd629.js new file mode 100644 index 0000000..5e0c072 --- /dev/null +++ b/assets/oca-file.html.722dd629.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as a,e as i}from"./app.ebda841e.js";const n={},s=i('

Introduction

This section is informative

Since day one, OCA constructs, called OCA Bundles, were created using XLS spreadsheets. The XLS-based template defined within a spreadsheet enabled the creation of matrices with rows as attributes and columns as metadata for these attributes. As versatile as error-prone, this solution is.

A different, unified and deterministic solution is required to enable the true power of long-term maintenance of OCA Bundles, the most fundamental building blocks of the OCA Ecosystem.

This document proposes a novel OCA Bundle long-term maintenance concept: OCAfile. The OCAfile consists of layers and is equipped with a custom Domain-Specific Language (DSL) to leverage OCA Bundles creation.

Main characteristics

This section is informative

Deterministic through layered architecture

The OCAfile benefits from the concept of versioning each new operation by building a provenance log of all operations made upon the Bundle since the genesis operation. Recall that a provenance log is an append-only log that consists of items, where each new item is defined as follows: digest(previous item) | current item. Calculating the digest upon it gives the current item (layer) digest. See below for a step-by-step example.

As digests determine layers, any new OCA Bundle construct might already benefit from a previously defined OCA Bundle. That is because both OCA Bundles might involve the same attribute names, for example. The directed acyclic graph keeps the layers in vertices (their digests). It ensures the unambiguous resolution of any layer.

Text based format

The OCAfile remains text based for readability

Pleasant DSL

The OCAfile relies on a domain-specific language (DSL) that is human and machine-readable to achieve deterministic layering. The DSL enables the creation and manipulation of the OCA Bundle during its lifetime.

Version control system compliant

As opposed to binary files, text files enable meaningful changes control under a version control system (VCS).

',16),r=[s];function o(c,d){return t(),a("div",null,r)}var h=e(n,[["render",o],["__file","oca-file.html.vue"]]);export{h as default}; diff --git a/assets/oca-parser.html.419f5a5c.js b/assets/oca-parser.html.419f5a5c.js new file mode 100644 index 0000000..dd68eee --- /dev/null +++ b/assets/oca-parser.html.419f5a5c.js @@ -0,0 +1,3 @@ +import{_ as n,r as s,o as l,c as i,a as e,b as o,d as t,e as r}from"./app.ebda841e.js";const d={},c=e("h1",null,"OCA Parser",-1),h=t("The "),p=e("strong",null,"OCA Parser",-1),u=t(" enables creating OCA Bundles from XLS files. Using favorite XLS editor, the OCA Capture Base along with its overlays can be constructed. See our "),_={href:"https://github.com/THCLab/oca-parser-xls/raw/main/templates/template.xlsx",target:"_blank",rel:"noopener noreferrer"},m=t("template file"),f=t(" to get overview of how it has to be defined so that parser can read it properly and transform into OCA bundle."),b=e("p",null,"OCA Parser is delivered as a binary and runs from command line interface.",-1),g={class:"custom-container tip"},x=e("p",{class:"custom-container-title"},"TIP",-1),y=t("It can be a viable alternative to use OCA Parser as a WEB service. Visit "),C={href:"https://browser.oca.argo.colossi.network/#/",target:"_blank",rel:"noopener noreferrer"},v=t("OCA Browser"),w=t(" page that allows to create OCA Bundles as well."),A=e("h2",{id:"download-and-installation",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#download-and-installation","aria-hidden":"true"},"#"),t(" Download and installation")],-1),O=t("Navigate to the "),L={href:"https://github.com/THCLab/oca-parser-xls/releases",target:"_blank",rel:"noopener noreferrer"},S=t("releases page"),k=t(" to get latest available release."),T=r('

Usage

Parser provides parse command for parsing XLS files. See ./parser.bin parse -h for more help.

Creating OCA bundle from XLS file

When OCA Bundle has been defined in XLS, use the following command to parse it into OCA bundle: ./parser.bin parse oca -p some_xls_file.xlsx Additionally --zip flag can be used that packs the bundle into zip file. An OCA Bundle may contain layout files that define the layout of OCA Capture Base on screen. Currently two types of layouts are supported and can be added into the bundle:

  • credential layout \u2013 for OCA bundle presentation purposes,
  • form layout \u2013 for OCA bundle data capture, or in other words how to render the form.

To add them into the bundle, parse command requires additional flags:

  • --credential-layout <credential-layout> Path to YAML file with Credential Layout.
  • --form-layout <form-layout> Path to YAML file with Form Layout.
Example
',8),B=t("Navigate to "),P={href:"https://github.com/THCLab/oca-ecosystem/tree/main/examples/custom_layouts",target:"_blank",rel:"noopener noreferrer"},I=t("the example"),X=t(" and download XLS file along with layouts. Use the following command:"),E=r(`
./parser.bin parse oca -p simple_oca.xlsx --credential-layout credential.yml  --form-layout form.yml --zip
+

to create the OCA bundle that includes both layout files.

Creating OCA Code Table from XLS file

Parser has yet another parsing utility to create proper structure. When the Entry Overlay ought to refer to an external standard, ie. country codes or simply becomes too big in size to be a part of OCA bundle, it can be referred to an external source through its digest. This external source is the OCA Code Table that provides the entries.

`,4),N=t("See "),z={href:"https://github.com/THCLab/oca-ecosystem/raw/main/examples/ISO_3166-1_alpha-2.xlsx",target:"_blank",rel:"noopener noreferrer"},H=t("example code table"),V=t(" created for the purpose to be ISO compliant for country codes. Using this code table, entry codes can be created using the following command:"),U=e("div",{class:"language-text ext-text line-numbers-mode"},[e("pre",{class:"language-text"},[e("code",null,`./parser.bin parse entries -p ISO_3166-1_alpha-2.xlsx --zip +`)]),e("div",{class:"line-numbers","aria-hidden":"true"},[e("div",{class:"line-number"})])],-1),W=t("Finally, an empty template file can be found "),F={href:"https://github.com/THCLab/oca-ecosystem/raw/main/examples/oca-code-table-template.xlsx",target:"_blank",rel:"noopener noreferrer"},M=t("here"),Y=t(".");function q(D,j){const a=s("ExternalLinkIcon");return l(),i("div",null,[c,e("p",null,[h,p,u,e("a",_,[m,o(a)]),f]),b,e("div",g,[x,e("p",null,[y,e("a",C,[v,o(a)]),w])]),A,e("p",null,[O,e("a",L,[S,o(a)]),k]),T,e("p",null,[B,e("a",P,[I,o(a)]),X]),E,e("p",null,[N,e("a",z,[H,o(a)]),V]),U,e("p",null,[W,e("a",F,[M,o(a)]),Y])])}var J=n(d,[["render",q],["__file","oca-parser.html.vue"]]);export{J as default}; diff --git a/assets/oca-parser.html.9a708d47.js b/assets/oca-parser.html.9a708d47.js new file mode 100644 index 0000000..9515f9b --- /dev/null +++ b/assets/oca-parser.html.9a708d47.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-10867f72","path":"/ecosystem/oca-parser.html","title":"OCA Parser","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Download and installation","slug":"download-and-installation","children":[]},{"level":2,"title":"Usage","slug":"usage","children":[{"level":3,"title":"Creating OCA bundle from XLS file","slug":"creating-oca-bundle-from-xls-file","children":[{"level":5,"title":"Example","slug":"example","children":[]}]},{"level":3,"title":"Creating OCA Code Table from XLS file","slug":"creating-oca-code-table-from-xls-file","children":[]}]}],"git":{"updatedTime":1698417852000},"filePathRelative":"ecosystem/oca-parser.md"}');export{e as data}; diff --git a/assets/oca-presenter.html.4aca7ec3.js b/assets/oca-presenter.html.4aca7ec3.js new file mode 100644 index 0000000..1608f97 --- /dev/null +++ b/assets/oca-presenter.html.4aca7ec3.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-11796e4e","path":"/ecosystem/oca-presenter.html","title":"OCA Presenter","lang":"en-US","frontmatter":{},"excerpt":"","headers":[],"git":{"updatedTime":1698417852000},"filePathRelative":"ecosystem/oca-presenter.md"}');export{e as data}; diff --git a/assets/oca-presenter.html.67d05130.js b/assets/oca-presenter.html.67d05130.js new file mode 100644 index 0000000..722f264 --- /dev/null +++ b/assets/oca-presenter.html.67d05130.js @@ -0,0 +1 @@ +import{_ as t,o,c as r,a as e}from"./app.ebda841e.js";const s={},c=e("h1",null,"OCA Presenter",-1),n=e("p",null,"TO DO",-1),_=[c,n];function a(l,d){return o(),r("div",null,_)}var f=t(s,[["render",a],["__file","oca-presenter.html.vue"]]);export{f as default}; diff --git a/assets/oca-repository.html.060cee0a.js b/assets/oca-repository.html.060cee0a.js new file mode 100644 index 0000000..dcda27f --- /dev/null +++ b/assets/oca-repository.html.060cee0a.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-38173727","path":"/ecosystem/oca-repository.html","title":"OCA Repository","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Applications","slug":"applications","children":[]},{"level":2,"title":"Download and installation","slug":"download-and-installation","children":[]},{"level":2,"title":"Usage","slug":"usage","children":[]},{"level":2,"title":"Concepts","slug":"concepts","children":[]},{"level":2,"title":"Sandbox","slug":"sandbox","children":[]}],"git":{"updatedTime":1698417852000},"filePathRelative":"ecosystem/oca-repository.md"}');export{e as data}; diff --git a/assets/oca-repository.html.6c1ab427.js b/assets/oca-repository.html.6c1ab427.js new file mode 100644 index 0000000..782dc4d --- /dev/null +++ b/assets/oca-repository.html.6c1ab427.js @@ -0,0 +1,2 @@ +import{_ as a,r as i,o as r,c,a as e,b as n,d as t,e as s}from"./app.ebda841e.js";const l={},h=e("h1",null,"OCA Repository",-1),d=t("The "),_=e("strong",null,"OCA repository",-1),p=t(" is a key concept of the OCA Ecosystem. It enables to manage, store and share OCA Objects like: "),u=e("a",{href:"/ecosystem/oca-bundle"}," OCA Bundles ",-1),f=t(" and "),g=e("a",{href:"/ecosystem/oca-file"}," OCAFiles ",-1),m=t(". The interface is exposed through "),b={href:"https://repository.oca.argo.colossi.network/",target:"_blank",rel:"noopener noreferrer"},y=t(" REST API "),v=t("."),k=s('

The OCA repository operates under governance. It can be public (open access) or private (limited access).

Applications

The OCA repository serves as a central component in the ecosystem, providing storage, management, and sharing capabilities for various semantic needs. It supports multiple use cases, such as:

  • Storing verifiable credential schemas
  • Managing schemas for capturing and transforming data from IoT devices
  • Acting as a repository for document schemas
  • And more

Download and installation

',5),A=t("Navigate to the "),x={href:"https://github.com/THCLab/oca-repository-rs",target:"_blank",rel:"noopener noreferrer"},C=t("OCA Repository GitHub repository"),w=t(" to get the sources of reference implementation."),O=e("li",null,"A viable alternative is to directly download Docker image that contains the latest release",-1),I=s(`
docker pull humancolossus/oca-repository:latest
+

Usage

`,2),T=t("See "),S={href:"https://repository.oca.argo.colossi.network/",target:"_blank",rel:"noopener noreferrer"},N=t("OpenAPI Specification"),B=t(" to get all available endpoints."),E=e("h2",{id:"concepts",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#concepts","aria-hidden":"true"},"#"),t(" Concepts")],-1),R=t("OCA Repository implements "),D={href:"https://en.wikipedia.org/wiki/Content_centric_networking",target:"_blank",rel:"noopener noreferrer"},V=t(" content centric networking "),L=t(" (CCN) concept tu uniquely identify all the resources stored in the repository. The resources are identified through "),H={href:"https://datatracker.ietf.org/doc/html/draft-ssmith-said",target:"_blank",rel:"noopener noreferrer"},P=t("SAID's"),j=t(" so by calculating the product of the one way hash function, that becomes the identifier of the resource. By deriving SAID's from the content it creates cryptographic binding between identifier and the content."),q=e("li",null,"No ambiguity of the content thanks to unambiguous identifiers.",-1),z=e("h2",{id:"sandbox",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#sandbox","aria-hidden":"true"},"#"),t(" Sandbox")],-1),F=e("p",null,"An example of the OCA repository is hosted under Argo playground:",-1),G={href:"https://repository.oca.argo.colossi.network/",target:"_blank",rel:"noopener noreferrer"},K=t("https://repository.oca.argo.colossi.network/"),M=e("p",null,"It is an example of public OCA repository where anyone can publish their own schema. Keep in mind that for this repository there is no authentication nor authorization means everything uploaded there is available publicy to everyone, use only for testing.",-1);function U(J,Q){const o=i("ExternalLinkIcon");return r(),c("div",null,[h,e("p",null,[d,_,p,u,f,g,m,e("a",b,[y,n(o)]),v]),k,e("ul",null,[e("li",null,[A,e("a",x,[C,n(o)]),w]),O]),I,e("p",null,[T,e("a",S,[N,n(o)]),B]),E,e("ul",null,[e("li",null,[R,e("a",D,[V,n(o)]),L,e("a",H,[P,n(o)]),j]),q]),z,F,e("p",null,[e("a",G,[K,n(o)])]),M])}var X=a(l,[["render",U],["__file","oca-repository.html.vue"]]);export{X as default}; diff --git a/assets/oca-transformer.html.0a6ff5ac.js b/assets/oca-transformer.html.0a6ff5ac.js new file mode 100644 index 0000000..20f4374 --- /dev/null +++ b/assets/oca-transformer.html.0a6ff5ac.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-73b65308","path":"/ecosystem/oca-transformer.html","title":"OCA Transformer","lang":"en-US","frontmatter":{},"excerpt":"","headers":[],"git":{"updatedTime":1698417852000},"filePathRelative":"ecosystem/oca-transformer.md"}');export{e as data}; diff --git a/assets/oca-transformer.html.1eedc301.js b/assets/oca-transformer.html.1eedc301.js new file mode 100644 index 0000000..b868669 --- /dev/null +++ b/assets/oca-transformer.html.1eedc301.js @@ -0,0 +1 @@ +import{_ as o,o as r,c as t,a as e}from"./app.ebda841e.js";const s={},a=e("h1",null,"OCA Transformer",-1),c=e("p",null,"MORE INFORMATION COMING SOON",-1),n=[a,c];function _(l,f){return r(),t("div",null,n)}var d=o(s,[["render",_],["__file","oca-transformer.html.vue"]]);export{d as default}; diff --git a/assets/oca-validator.html.896f6695.js b/assets/oca-validator.html.896f6695.js new file mode 100644 index 0000000..63e9991 --- /dev/null +++ b/assets/oca-validator.html.896f6695.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-65ea5a6f","path":"/ecosystem/oca-validator.html","title":"OCA Validator","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Installation","slug":"installation","children":[{"level":3,"title":"Rust","slug":"rust","children":[]},{"level":3,"title":"Typescript and JavaScript (Node.JS based)","slug":"typescript-and-javascript-node-js-based","children":[]}]},{"level":2,"title":"Usage","slug":"usage","children":[{"level":3,"title":"Rust","slug":"rust-1","children":[]},{"level":3,"title":"Typescript and JavaScript (Node.JS based)","slug":"typescript-and-javascript-node-js-based-1","children":[]}]}],"git":{"updatedTime":1698417852000},"filePathRelative":"ecosystem/oca-validator.md"}');export{e as data}; diff --git a/assets/oca-validator.html.9f8a6ced.js b/assets/oca-validator.html.9f8a6ced.js new file mode 100644 index 0000000..94bb2d3 --- /dev/null +++ b/assets/oca-validator.html.9f8a6ced.js @@ -0,0 +1,30 @@ +import{_ as i,r as c,o as l,c as u,a as n,b as s,w as e,d as a,e as p}from"./app.ebda841e.js";const r={},d=n("h1",null,"OCA Validator",-1),k=n("p",null,[n("strong",null,"OCA Validator"),a(" enables entry (or an array of entries) verification against predefined rules, given by the "),n("a",{href:"/ecosystem/oca-bundle"}," OCA Bundle "),a(". The verification executed on an entry, that is a map of key-value pairs, encompasses:")],-1),v=a("type checking, so whether a value matches the expected type (defined in "),m=a("Capture Base"),_=a(") or can be implicitly coerced to it;"),h=a("task (overlay) specific verification, including: "),b=a(" character encoding overlay "),f=a(" format overlay "),y=a(" cardinality overlay "),g=a(" conformance overlay "),x=a(" entry code overlay "),q=p(`

Installation

Rust

[dependencies]
+oca_conductor = "0.2.6"
+oca_zip_resolver = "0.2.6"
+

Typescript and JavaScript (Node.JS based)

npm i oca-data-validator
+

Usage

Rust

use oca_conductor::data_set::DataSet;
+use oca_conductor::data_set::JSONDataSet;
+use oca_conductor::Validator;
+use oca_zip_resolver::resolve_from_zip;
+
+fn main() {
+    let oca_result = resolve_from_zip("oca_bundle.zip");
+    let mut validator = Validator::new(oca_result.unwrap());
+    validator.add_data_set(JSONDataSet::new(
+        r#"{ "email": "test@example.com", "licensess": ["A"] }"#.to_string(),
+    ));
+    let validation_result = validator.validate();
+    println!("{:?}", validation_result); // Ok(())
+}
+
`,8),w=a("See also "),S={href:"https://github.com/THCLab/oca-conductor/blob/main/conductor/src/validator/mod.rs",target:"_blank",rel:"noopener noreferrer"},V=a(" tests "),j=a(" available for "),C=n("code",null,"validator",-1),N=a(" module."),z=p(`

Typescript and JavaScript (Node.JS based)

import { resolveFromZip, Validator } from "oca-data-validator";
+
+const oca = resolveFromZip(\`oca_bundle.zip\`);
+let validator = new Validator(oca);
+
+const result = validator.validate({
+  'email': 'test@example.com',
+  'licenses': ["A"],
+});
+
+console.log(result); // true
+
`,2),J=a("See also "),L={href:"https://github.com/THCLab/oca-conductor/tree/main/bindings/node.js/pkg/validator/test",target:"_blank",rel:"noopener noreferrer"},O=a("here"),T=a(" for more integration tests.");function A(B,R){const t=c("RouterLink"),o=c("ExternalLinkIcon");return l(),u("div",null,[d,k,n("ul",null,[n("li",null,[v,s(t,{to:"/specification/#capture-base"},{default:e(()=>[m]),_:1}),_]),n("li",null,[h,n("ul",null,[n("li",null,[s(t,{to:"/specification/#character-encoding-overlay"},{default:e(()=>[b]),_:1})]),n("li",null,[s(t,{to:"/specification/#format-overlay"},{default:e(()=>[f]),_:1})]),n("li",null,[s(t,{to:"/specification/#cardinality-overlay"},{default:e(()=>[y]),_:1})]),n("li",null,[s(t,{to:"/specification/#conformance-overlay"},{default:e(()=>[g]),_:1})]),n("li",null,[s(t,{to:"/specification/#entry-code-overlay"},{default:e(()=>[x]),_:1})])])])]),q,n("p",null,[w,n("a",S,[V,s(o)]),j,C,N]),z,n("p",null,[J,n("a",L,[O,s(o)]),T])])}var E=i(r,[["render",A],["__file","oca-validator.html.vue"]]);export{E as default}; diff --git a/assets/oca-vs-others-comparison.html.432b158d.js b/assets/oca-vs-others-comparison.html.432b158d.js new file mode 100644 index 0000000..b71879f --- /dev/null +++ b/assets/oca-vs-others-comparison.html.432b158d.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-28942eea","path":"/guide/oca-vs-others-comparison.html","title":"OCA vs others comparison","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"OCA vs. JSON Schema","slug":"oca-vs-json-schema","children":[]},{"level":2,"title":"OCA vs. JSON-LD","slug":"oca-vs-json-ld","children":[]},{"level":2,"title":"OCA vs. Data Mesh","slug":"oca-vs-data-mesh","children":[]}],"git":{"updatedTime":1698417852000},"filePathRelative":"guide/oca-vs-others-comparison.md"}');export{e as data}; diff --git a/assets/oca-vs-others-comparison.html.7c557ad3.js b/assets/oca-vs-others-comparison.html.7c557ad3.js new file mode 100644 index 0000000..a2f20b6 --- /dev/null +++ b/assets/oca-vs-others-comparison.html.7c557ad3.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as s,e as o}from"./app.ebda841e.js";const t={},n=o('

OCA vs others comparison

Although OCA brings novel concepts to context preserving data capture and data harmonization, it is often being asked how it is different to what is already well-established in the industry. The next sections provide a detailed comparison of OCA vs. X technology.

OCA vs. JSON Schema

OCA vs. JSON-LD

OCA vs. Data Mesh

',5),c=[n];function r(h,i){return a(),s("div",null,c)}var l=e(t,[["render",r],["__file","oca-vs-others-comparison.html.vue"]]);export{l as default}; diff --git a/assets/references.html.8dcfee41.js b/assets/references.html.8dcfee41.js new file mode 100644 index 0000000..38ff9bc --- /dev/null +++ b/assets/references.html.8dcfee41.js @@ -0,0 +1 @@ +import{_ as o,r as s,o as a,c,a as e,b as n,d as t}from"./app.ebda841e.js";const l={},i=e("h1",null,"References",-1),_={href:"https://github.com/hyperledger/aries-rfcs/tree/main/concepts/0013-overlays",target:"_blank",rel:"noopener noreferrer"},p=t("Hyperledger Aries RFC-0013"),d={href:"https://wiki.trustoverip.org/display/HOME/Inputs+and+Semantics+Working+Group",target:"_blank",rel:"noopener noreferrer"},u=t("Inputs and Semantics Working Group");function f(h,m){const r=s("ExternalLinkIcon");return a(),c("div",null,[i,e("ul",null,[e("li",null,[e("a",_,[p,n(r)])]),e("li",null,[e("a",d,[u,n(r)])])])])}var g=o(l,[["render",f],["__file","references.html.vue"]]);export{g as default}; diff --git a/assets/references.html.e76e6324.js b/assets/references.html.e76e6324.js new file mode 100644 index 0000000..87fe67e --- /dev/null +++ b/assets/references.html.e76e6324.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-7e593ce5","path":"/guide/references.html","title":"References","lang":"en-US","frontmatter":{},"excerpt":"","headers":[],"git":{"updatedTime":1698417852000},"filePathRelative":"guide/references.md"}');export{e as data}; diff --git a/assets/style.a453aad4.css b/assets/style.a453aad4.css new file mode 100644 index 0000000..fcdf9d8 --- /dev/null +++ b/assets/style.a453aad4.css @@ -0,0 +1 @@ +:root{--back-to-top-z-index: 5;--back-to-top-color: #3eaf7c;--back-to-top-color-hover: #71cda3}.back-to-top{cursor:pointer;position:fixed;bottom:2rem;right:2.5rem;width:2rem;height:1.2rem;background-color:var(--back-to-top-color);-webkit-mask:url(/assets/back-to-top.8efcbe56.svg) no-repeat;mask:url(/assets/back-to-top.8efcbe56.svg) no-repeat;z-index:var(--back-to-top-z-index)}.back-to-top:hover{background-color:var(--back-to-top-color-hover)}@media (max-width: 959px){.back-to-top{display:none}}.back-to-top-enter-active,.back-to-top-leave-active{transition:opacity .3s}.back-to-top-enter-from,.back-to-top-leave-to{opacity:0}:root{--external-link-icon-color: #aaa}.external-link-icon{position:relative;display:inline-block;color:var(--external-link-icon-color);vertical-align:middle;top:-1px}.external-link-icon-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}:root{--medium-zoom-z-index: 100;--medium-zoom-bg-color: #ffffff;--medium-zoom-opacity: 1}.medium-zoom-overlay{background-color:var(--medium-zoom-bg-color)!important;z-index:var(--medium-zoom-z-index)}.medium-zoom-overlay~img{z-index:calc(var(--medium-zoom-z-index) + 1)}.medium-zoom--opened .medium-zoom-overlay{opacity:var(--medium-zoom-opacity)}:root{--nprogress-color: #29d;--nprogress-z-index: 1031}#nprogress{pointer-events:none}#nprogress .bar{background:var(--nprogress-color);position:fixed;z-index:var(--nprogress-z-index);top:0;left:0;width:100%;height:2px}:root{--c-brand: #3eaf7c;--c-brand-light: #4abf8a;--c-bg: #ffffff;--c-bg-light: #f3f4f5;--c-bg-lighter: #eeeeee;--c-bg-navbar: var(--c-bg);--c-bg-sidebar: var(--c-bg);--c-bg-arrow: #cccccc;--c-text: #2c3e50;--c-text-accent: var(--c-brand);--c-text-light: #3a5169;--c-text-lighter: #4e6e8e;--c-text-lightest: #6a8bad;--c-text-quote: #999999;--c-border: #eaecef;--c-border-dark: #dfe2e5;--c-tip: #42b983;--c-tip-bg: var(--c-bg-light);--c-tip-title: var(--c-text);--c-tip-text: var(--c-text);--c-tip-text-accent: var(--c-text-accent);--c-warning: #e7c000;--c-warning-bg: #fffae3;--c-warning-title: #ad9000;--c-warning-text: #746000;--c-warning-text-accent: var(--c-text);--c-danger: #cc0000;--c-danger-bg: #ffe0e0;--c-danger-title: #990000;--c-danger-text: #660000;--c-danger-text-accent: var(--c-text);--c-details-bg: #eeeeee;--c-badge-tip: var(--c-tip);--c-badge-warning: var(--c-warning);--c-badge-danger: var(--c-danger);--t-color: .3s ease;--t-transform: .3s ease;--code-bg-color: #282c34;--code-hl-bg-color: rgba(0, 0, 0, .66);--code-ln-color: #9e9e9e;--code-ln-wrapper-width: 3.5rem;--font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--font-family-code: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace;--navbar-height: 3.6rem;--navbar-padding-v: .7rem;--navbar-padding-h: 1.5rem;--sidebar-width: 20rem;--sidebar-width-mobile: calc(var(--sidebar-width) * .82);--content-width: 740px;--homepage-width: 960px}.back-to-top{--back-to-top-color: var(--c-brand);--back-to-top-color-hover: var(--c-brand-light)}.DocSearch{--docsearch-primary-color: var(--c-brand);--docsearch-text-color: var(--c-text);--docsearch-highlight-color: var(--c-brand);--docsearch-muted-color: var(--c-text-quote);--docsearch-container-background: rgba(9, 10, 17, .8);--docsearch-modal-background: var(--c-bg-light);--docsearch-searchbox-background: var(--c-bg-lighter);--docsearch-searchbox-focus-background: var(--c-bg);--docsearch-searchbox-shadow: inset 0 0 0 2px var(--c-brand);--docsearch-hit-color: var(--c-text-light);--docsearch-hit-active-color: var(--c-bg);--docsearch-hit-background: var(--c-bg);--docsearch-hit-shadow: 0 1px 3px 0 var(--c-border-dark);--docsearch-footer-background: var(--c-bg)}.external-link-icon{--external-link-icon-color: var(--c-text-quote)}.medium-zoom-overlay{--medium-zoom-bg-color: var(--c-bg)}#nprogress{--nprogress-color: var(--c-brand)}.pwa-popup{--pwa-popup-text-color: var(--c-text);--pwa-popup-bg-color: var(--c-bg);--pwa-popup-border-color: var(--c-brand);--pwa-popup-shadow: 0 4px 16px var(--c-brand);--pwa-popup-btn-text-color: var(--c-bg);--pwa-popup-btn-bg-color: var(--c-brand);--pwa-popup-btn-hover-bg-color: var(--c-brand-light)}.search-box{--search-bg-color: var(--c-bg);--search-accent-color: var(--c-brand);--search-text-color: var(--c-text);--search-border-color: var(--c-border);--search-item-text-color: var(--c-text-lighter);--search-item-focus-bg-color: var(--c-bg-light)}html.dark{--c-brand: #3aa675;--c-brand-light: #349469;--c-bg: #22272e;--c-bg-light: #2b313a;--c-bg-lighter: #262c34;--c-text: #adbac7;--c-text-light: #96a7b7;--c-text-lighter: #8b9eb0;--c-text-lightest: #8094a8;--c-border: #3e4c5a;--c-border-dark: #34404c;--c-tip: #318a62;--c-warning: #ceab00;--c-warning-bg: #7e755b;--c-warning-title: #ceac03;--c-warning-text: #362e00;--c-danger: #940000;--c-danger-bg: #806161;--c-danger-title: #610000;--c-danger-text: #3a0000;--c-details-bg: #323843;--code-hl-bg-color: #363b46}html.dark .DocSearch{--docsearch-logo-color: var(--c-text);--docsearch-modal-shadow: inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309;--docsearch-key-shadow: inset 0 -2px 0 0 #282d55, inset 0 0 1px 1px #51577d, 0 2px 2px 0 rgba(3, 4, 9, .3);--docsearch-key-gradient: linear-gradient(-225deg, #444950, #1c1e21);--docsearch-footer-shadow: inset 0 1px 0 0 rgba(73, 76, 106, .5), 0 -4px 8px 0 rgba(0, 0, 0, .2)}html,body{padding:0;margin:0;background-color:var(--c-bg);transition:background-color var(--t-color)}html.dark{color-scheme:dark}html{font-size:16px}body{font-family:var(--font-family);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:1rem;color:var(--c-text)}a{font-weight:500;color:var(--c-text-accent);text-decoration:none;overflow-wrap:break-word}p a code{font-weight:400;color:var(--c-text-accent)}kbd{font-family:var(--font-family-code);color:var(--c-text);background:var(--c-bg-lighter);border:solid .15rem var(--c-border-dark);border-bottom:solid .25rem var(--c-border-dark);border-radius:.15rem;padding:0 .15em}code{font-family:var(--font-family-code);color:var(--c-text-lighter);padding:.25rem .5rem;margin:0;font-size:.85em;background-color:var(--c-bg-lighter);border-radius:3px;overflow-wrap:break-word;transition:background-color var(--t-color)}blockquote{font-size:1rem;color:var(--c-text-quote);border-left:.2rem solid var(--c-border-dark);margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ul,ol{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}h1:focus-visible,h2:focus-visible,h3:focus-visible,h4:focus-visible,h5:focus-visible,h6:focus-visible{outline:none}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid var(--c-border);transition:border-color var(--t-color)}h3{font-size:1.35rem}h4{font-size:1.15rem}h5{font-size:1.05rem}h6{font-size:1rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}a.header-anchor:focus-visible{opacity:1}p,ul,ol{line-height:1.7}hr{border:0;border-top:1px solid var(--c-border)}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto;transition:border-color var(--t-color)}tr{border-top:1px solid var(--c-border-dark);transition:border-color var(--t-color)}tr:nth-child(2n){background-color:var(--c-bg-light);transition:background-color var(--t-color)}th,td{padding:.6em 1em;border:1px solid var(--c-border-dark);transition:border-color var(--t-color)}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:6px solid var(--c-bg-arrow)}.arrow.down{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid var(--c-bg-arrow)}.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:6px solid var(--c-bg-arrow)}.arrow.left{border-top:4px solid transparent;border-bottom:4px solid transparent;border-right:6px solid var(--c-bg-arrow)}.badge{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:var(--c-bg);vertical-align:top;transition:color var(--t-color),background-color var(--t-color)}.badge.tip{background-color:var(--c-badge-tip)}.badge.warning{background-color:var(--c-badge-warning)}.badge.danger{background-color:var(--c-badge-danger)}.table-of-contents .badge{vertical-align:middle}.badge+.badge{margin-left:5px}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:var(--font-family-code);font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#999}.token.punctuation{color:#ccc}.token.tag,.token.attr-name,.token.namespace,.token.deleted{color:#ec5975}.token.function-name{color:#6196cc}.token.boolean,.token.number,.token.function{color:#f08d49}.token.property,.token.class-name,.token.constant,.token.symbol{color:#f8c555}.token.selector,.token.important,.token.atrule,.token.keyword,.token.builtin{color:#cc99cd}.token.string,.token.char,.token.attr-value,.token.regex,.token.variable{color:#7ec699}.token.operator,.token.entity,.token.url{color:#67cdcc}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:#3eaf7c}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.3rem 1.5rem;margin:.85rem 0;border-radius:6px;overflow:auto}.theme-default-content pre code,.theme-default-content pre[class*=language-] code{color:#fff;padding:0;background-color:transparent;border-radius:0;overflow-wrap:unset;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.theme-default-content .line-number{font-family:var(--font-family-code)}div[class*=language-]{position:relative;background-color:var(--code-bg-color);border-radius:6px}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:var(--code-ln-color)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent!important;position:relative;z-index:1}div[class*=language-] .highlight-lines{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlight-line{background-color:var(--code-hl-bg-color)}div[class*=language-]:not(.line-numbers-mode) .line-numbers{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlight-line{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlight-line:before{content:" ";position:absolute;z-index:2;left:0;top:0;display:block;width:var(--code-ln-wrapper-width);height:100%}div[class*=language-].line-numbers-mode pre{margin-left:var(--code-ln-wrapper-width);padding-left:1rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers{position:absolute;top:0;width:var(--code-ln-wrapper-width);text-align:center;color:var(--code-ln-color);padding-top:1.25rem;line-height:1.4;counter-reset:line-number}div[class*=language-].line-numbers-mode .line-numbers .line-number{position:relative;z-index:3;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:1.4em}div[class*=language-].line-numbers-mode .line-numbers .line-number:before{counter-increment:line-number;content:counter(line-number);font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;top:0;left:0;width:var(--code-ln-wrapper-width);height:100%;border-radius:6px 0 0 6px;border-right:1px solid var(--code-hl-bg-color)}div[class*=language-].ext-c:before{content:"c"}div[class*=language-].ext-cpp:before{content:"cpp"}div[class*=language-].ext-cs:before{content:"cs"}div[class*=language-].ext-css:before{content:"css"}div[class*=language-].ext-dart:before{content:"dart"}div[class*=language-].ext-docker:before{content:"docker"}div[class*=language-].ext-fs:before{content:"fs"}div[class*=language-].ext-go:before{content:"go"}div[class*=language-].ext-html:before{content:"html"}div[class*=language-].ext-java:before{content:"java"}div[class*=language-].ext-js:before{content:"js"}div[class*=language-].ext-json:before{content:"json"}div[class*=language-].ext-kt:before{content:"kt"}div[class*=language-].ext-less:before{content:"less"}div[class*=language-].ext-makefile:before{content:"makefile"}div[class*=language-].ext-md:before{content:"md"}div[class*=language-].ext-php:before{content:"php"}div[class*=language-].ext-py:before{content:"py"}div[class*=language-].ext-rb:before{content:"rb"}div[class*=language-].ext-rs:before{content:"rs"}div[class*=language-].ext-sass:before{content:"sass"}div[class*=language-].ext-scss:before{content:"scss"}div[class*=language-].ext-sh:before{content:"sh"}div[class*=language-].ext-styl:before{content:"styl"}div[class*=language-].ext-ts:before{content:"ts"}div[class*=language-].ext-toml:before{content:"toml"}div[class*=language-].ext-vue:before{content:"vue"}div[class*=language-].ext-yml:before{content:"yml"}@media (max-width: 419px){.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.code-group__nav{margin-top:.85rem;margin-bottom:calc(-1.7rem - 6px);padding-bottom:calc(1.7rem - 6px);padding-left:10px;padding-top:10px;border-top-left-radius:6px;border-top-right-radius:6px;background-color:var(--code-bg-color)}.code-group__ul{margin:auto 0;padding-left:0;display:inline-flex;list-style:none}.code-group__nav-tab{border:0;padding:5px;cursor:pointer;background-color:transparent;font-size:.85em;line-height:1.4;color:#ffffffe6;font-weight:600}.code-group__nav-tab:focus{outline:none}.code-group__nav-tab:focus-visible{outline:1px solid rgba(255,255,255,.9)}.code-group__nav-tab-active{border-bottom:var(--c-brand) 1px solid}@media (max-width: 419px){.code-group__nav{margin-left:-1.5rem;margin-right:-1.5rem;border-radius:0}}.code-group-item{display:none}.code-group-item__active{display:block}.code-group-item>pre{background-color:orange}.custom-container{transition:color var(--t-color),border-color var(--t-color),background-color var(--t-color)}.custom-container .custom-container-title{font-weight:600}.custom-container .custom-container-title:not(:only-child){margin-bottom:-.4rem}.custom-container.tip,.custom-container.warning,.custom-container.danger{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-container.tip{border-color:var(--c-tip);background-color:var(--c-tip-bg);color:var(--c-tip-text)}.custom-container.tip .custom-container-title{color:var(--c-tip-title)}.custom-container.tip a{color:var(--c-tip-text-accent)}.custom-container.warning{border-color:var(--c-warning);background-color:var(--c-warning-bg);color:var(--c-warning-text)}.custom-container.warning .custom-container-title{color:var(--c-warning-title)}.custom-container.warning a{color:var(--c-warning-text-accent)}.custom-container.danger{border-color:var(--c-danger);background-color:var(--c-danger-bg);color:var(--c-danger-text)}.custom-container.danger .custom-container-title{color:var(--c-danger-title)}.custom-container.danger a{color:var(--c-danger-text-accent)}.custom-container.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:var(--c-details-bg)}.custom-container.details h4{margin-top:0}.custom-container.details figure:last-child,.custom-container.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-container.details summary{outline:none;cursor:pointer}.home{padding:var(--navbar-height) 2rem 0;max-width:var(--homepage-width);margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero h1,.home .hero .description,.home .hero .actions{margin:1.8rem auto}.home .hero .actions{display:flex;flex-wrap:wrap;gap:1rem;justify-content:center}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:var(--c-text-lightest)}.home .hero .action-button{display:inline-block;font-size:1.2rem;padding:.8rem 1.6rem;border-width:2px;border-style:solid;border-radius:4px;transition:background-color var(--t-color);box-sizing:border-box}.home .hero .action-button.primary{color:var(--c-bg);background-color:var(--c-brand);border-color:var(--c-brand)}.home .hero .action-button.primary:hover{background-color:var(--c-brand-light)}.home .hero .action-button.secondary{color:var(--c-brand);background-color:var(--c-bg);border-color:var(--c-brand)}.home .hero .action-button.secondary:hover{color:var(--c-bg);background-color:var(--c-brand-light)}.home .features{border-top:1px solid var(--c-border);transition:border-color var(--t-color);padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:var(--c-text-light)}.home .feature p{color:var(--c-text-lighter)}.home .theme-default-content{padding:0;margin:0}.home .footer{padding:2.5rem;border-top:1px solid var(--c-border);text-align:center;color:var(--c-text-lighter);transition:border-color var(--t-color)}@media (max-width: 719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width: 419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero h1,.home .hero .description,.home .hero .actions{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.page{padding-top:var(--navbar-height);padding-left:var(--sidebar-width)}.navbar{position:fixed;z-index:20;top:0;left:0;right:0;height:var(--navbar-height);box-sizing:border-box;border-bottom:1px solid var(--c-border);background-color:var(--c-bg-navbar);transition:background-color var(--t-color),border-color var(--t-color)}.sidebar{font-size:16px;width:var(--sidebar-width);position:fixed;z-index:10;margin:0;top:var(--navbar-height);left:0;bottom:0;box-sizing:border-box;border-right:1px solid var(--c-border);overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--c-brand) var(--c-border);background-color:var(--c-bg-sidebar);transition:transform var(--t-transform),background-color var(--t-color),border-color var(--t-color)}.sidebar::-webkit-scrollbar{width:7px}.sidebar::-webkit-scrollbar-track{background-color:var(--c-border)}.sidebar::-webkit-scrollbar-thumb{background-color:var(--c-brand)}.sidebar-mask{position:fixed;z-index:9;top:0;left:0;width:100vw;height:100vh;display:none}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(1){transform:rotate(45deg) translate3d(5.5px,5.5px,0)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(2){transform:scale3d(0,1,1)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(3){transform:rotate(-45deg) translate3d(6px,-6px,0)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(1),.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(3){transform-origin:center}.theme-container.no-navbar .theme-default-content h1,.theme-container.no-navbar .theme-default-content h2,.theme-container.no-navbar .theme-default-content h3,.theme-container.no-navbar .theme-default-content h4,.theme-container.no-navbar .theme-default-content h5,.theme-container.no-navbar .theme-default-content h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .page{padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width: 720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}.theme-default-content a:hover{text-decoration:underline}.theme-default-content img{max-width:100%}.theme-default-content h1,.theme-default-content h2,.theme-default-content h3,.theme-default-content h4,.theme-default-content h5,.theme-default-content h6{margin-top:calc(.5rem - var(--navbar-height));padding-top:calc(1rem + var(--navbar-height));margin-bottom:0}.theme-default-content h1:first-child,.theme-default-content h2:first-child,.theme-default-content h3:first-child,.theme-default-content h4:first-child,.theme-default-content h5:first-child,.theme-default-content h6:first-child{margin-bottom:1rem}.theme-default-content h1:first-child+p,.theme-default-content h1:first-child+pre,.theme-default-content h1:first-child+.custom-container,.theme-default-content h2:first-child+p,.theme-default-content h2:first-child+pre,.theme-default-content h2:first-child+.custom-container,.theme-default-content h3:first-child+p,.theme-default-content h3:first-child+pre,.theme-default-content h3:first-child+.custom-container,.theme-default-content h4:first-child+p,.theme-default-content h4:first-child+pre,.theme-default-content h4:first-child+.custom-container,.theme-default-content h5:first-child+p,.theme-default-content h5:first-child+pre,.theme-default-content h5:first-child+.custom-container,.theme-default-content h6:first-child+p,.theme-default-content h6:first-child+pre,.theme-default-content h6:first-child+.custom-container{margin-top:2rem}@media (max-width: 959px){.sidebar{font-size:15px;width:var(--sidebar-width-mobile)}.page{padding-left:var(--sidebar-width-mobile)}}@media (max-width: 719px){.sidebar{top:0;padding-top:var(--navbar-height);transform:translate(-100%)}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translate(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width: 419px){h1{font-size:1.9rem}}.navbar{--navbar-line-height: calc( var(--navbar-height) - 2 * var(--navbar-padding-v) );padding:var(--navbar-padding-v) var(--navbar-padding-h);line-height:var(--navbar-line-height)}.navbar .logo{height:var(--navbar-line-height);margin-right:var(--navbar-padding-v);vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:var(--c-text);position:relative}.navbar .navbar-items-wrapper{display:flex;position:absolute;box-sizing:border-box;top:var(--navbar-padding-v);right:var(--navbar-padding-h);height:var(--navbar-line-height);padding-left:var(--navbar-padding-h);white-space:nowrap;font-size:.9rem}.navbar .navbar-items-wrapper .search-box{flex:0 0 auto;vertical-align:top}@media (max-width: 719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.navbar-items{display:inline-block}.navbar-items a{display:inline-block;line-height:1.4rem;color:inherit}.navbar-items a:hover,.navbar-items a.router-link-active{color:var(--c-text-accent)}.navbar-items .navbar-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:var(--navbar-line-height)}.navbar-items .navbar-item:first-child{margin-left:0}@media (max-width: 719px){.navbar-items .navbar-item{margin-left:0}}@media (min-width: 719px){.navbar-items a:hover,.navbar-items a.router-link-active{color:var(--c-text)}.navbar-item>a:hover,.navbar-item>a.router-link-active{margin-bottom:-2px;border-bottom:2px solid var(--c-text-accent)}}.toggle-sidebar-button{position:absolute;top:.6rem;left:1rem;display:none;padding:.6rem;cursor:pointer}.toggle-sidebar-button .icon{display:flex;flex-direction:column;justify-content:center;align-items:center;width:1.25rem;height:1.25rem;cursor:inherit}.toggle-sidebar-button .icon span{display:inline-block;width:100%;height:2px;border-radius:2px;background-color:var(--c-text);transition:transform var(--t-transform)}.toggle-sidebar-button .icon span:nth-child(2){margin:6px 0}@media screen and (max-width: 719px){.toggle-sidebar-button{display:block}}.toggle-color-mode-button{display:flex;margin:auto;margin-left:1rem;border:0;background:none;color:var(--c-text);opacity:.8;cursor:pointer}.toggle-color-mode-button:hover{opacity:1}.toggle-color-mode-button .icon{width:1.25rem;height:1.25rem}.DocSearch{transition:background-color var(--t-color)}.navbar-dropdown-wrapper{cursor:pointer}.navbar-dropdown-wrapper .navbar-dropdown-title,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:var(--c-text)}.navbar-dropdown-wrapper .navbar-dropdown-title:hover,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile:hover{border-color:transparent}.navbar-dropdown-wrapper .navbar-dropdown-title .arrow,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:none;font-weight:600;font-size:inherit}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile:hover{color:var(--c-text-accent)}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item{color:inherit;line-height:1.7rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle{margin:.45rem 0 0;border-top:1px solid var(--c-border);padding:1rem 0 .45rem;font-size:.9rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>span{padding:0 1.5rem 0 1.25rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>a{font-weight:inherit}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>a.router-link-active:after{display:none}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem-wrapper{padding:0;list-style:none}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem-wrapper .navbar-dropdown-subitem{font-size:.9em}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a:hover,.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.router-link-active{color:var(--c-text-accent)}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid var(--c-text-accent);border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item:first-child .navbar-dropdown-subtitle{margin-top:0;padding-top:0;border-top:0}@media (max-width: 719px){.navbar-dropdown-wrapper.open .navbar-dropdown-title,.navbar-dropdown-wrapper.open .navbar-dropdown-title-mobile{margin-bottom:.5rem}.navbar-dropdown-wrapper .navbar-dropdown-title,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:none}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:block}.navbar-dropdown-wrapper .navbar-dropdown{transition:height .1s ease-out;overflow:hidden}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle{border-top:0;margin-top:0;padding-top:0;padding-bottom:0}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle,.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item>a{font-size:15px;line-height:2rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width: 720px){.navbar-dropdown-wrapper{height:1.8rem}.navbar-dropdown-wrapper:hover .navbar-dropdown,.navbar-dropdown-wrapper.open .navbar-dropdown{display:block!important}.navbar-dropdown-wrapper.open:blur{display:none}.navbar-dropdown-wrapper .navbar-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:var(--c-bg-navbar);padding:.6rem 0;border:1px solid var(--c-border);border-bottom-color:var(--c-border-dark);text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.page{padding-bottom:2rem;display:block}.page .theme-default-content{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem;padding-top:0}@media (max-width: 959px){.page .theme-default-content{padding:2rem}}@media (max-width: 419px){.page .theme-default-content{padding:1.5rem}}.page-meta{max-width:var(--content-width);margin:0 auto;padding:1rem 2.5rem;overflow:auto}@media (max-width: 959px){.page-meta{padding:2rem}}@media (max-width: 419px){.page-meta{padding:1.5rem}}.page-meta .meta-item{cursor:default;margin-top:.8rem}.page-meta .meta-item .meta-item-label{font-weight:500;color:var(--c-text-lighter)}.page-meta .meta-item .meta-item-info{font-weight:400;color:var(--c-text-quote)}.page-meta .edit-link{display:inline-block;margin-right:.25rem}.page-meta .last-updated{float:right}@media (max-width: 719px){.page-meta .last-updated{font-size:.8em;float:none}.page-meta .contributors{font-size:.8em}}.page-nav{max-width:var(--content-width);margin:0 auto;padding:1rem 2.5rem 2rem;padding-bottom:0}@media (max-width: 959px){.page-nav{padding:2rem}}@media (max-width: 419px){.page-nav{padding:1.5rem}}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid var(--c-border);transition:border-color var(--t-color);padding-top:1rem;overflow:auto}.page-nav .prev a:before{content:"\2190"}.page-nav .next{float:right}.page-nav .next a:after{content:"\2192"}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .navbar-items{display:none;border-bottom:1px solid var(--c-border);transition:border-color var(--t-color);padding:.5rem 0 .75rem}.sidebar .navbar-items a{font-weight:600}.sidebar .navbar-items .navbar-item{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar .sidebar-items{padding:1.5rem 0}@media (max-width: 719px){.sidebar .navbar-items{display:block}.sidebar .navbar-items .navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar .sidebar-items{padding:1rem 0}}.sidebar-item{cursor:default;border-left:.25rem solid transparent;color:var(--c-text)}.sidebar-item:focus-visible{outline-width:1px;outline-offset:-1px}.sidebar-item.active:not(p.sidebar-heading){font-weight:600;color:var(--c-text-accent);border-left-color:var(--c-text-accent)}.sidebar-item.sidebar-heading{transition:color .15s ease;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0}.sidebar-item.sidebar-heading.collapsible{cursor:pointer}.sidebar-item.sidebar-heading.collapsible+.sidebar-item-children{transition:height .1s ease-out;overflow:hidden;margin-bottom:.75rem}.sidebar-item.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-item:not(.sidebar-heading){font-size:1em;font-weight:400;display:inline-block;margin:0;padding:.35rem 1rem .35rem 2rem;line-height:1.4;width:100%;box-sizing:border-box}.sidebar-item:not(.sidebar-heading)+.sidebar-item-children{padding-left:1rem;font-size:.95em}.sidebar-item-children .sidebar-item-children .sidebar-item:not(.sidebar-heading){padding:.25rem 1rem .25rem 1.75rem}.sidebar-item-children .sidebar-item-children .sidebar-item:not(.sidebar-heading).active{font-weight:500;border-left-color:transparent}a.sidebar-heading+.sidebar-item-children .sidebar-item:not(.sidebar-heading).active{border-left-color:transparent}a.sidebar-item{cursor:pointer}a.sidebar-item:hover{color:var(--c-text-accent)}.table-of-contents .badge{vertical-align:middle}.dropdown-enter-from,.dropdown-leave-to{height:0!important}.fade-slide-y-enter-active{transition:all .2s ease}.fade-slide-y-leave-active{transition:all .2s cubic-bezier(1,.5,.8,1)}.fade-slide-y-enter-from,.fade-slide-y-leave-to{transform:translateY(10px);opacity:0}.references-tbl{border-color:transparent;border:none}.references-tbl tr,.references-tbl td{border:none}.references-tbl tr:nth-child(2n){background-color:transparent}.references-tbl td:nth-child(1){font-weight:700}dl{display:grid;grid-template:auto/8em 40em}dt{font-weight:700;scroll-margin-top:40px}dt,dd{margin:0 0 1em;padding:.3em .5em}dt p,dd p{margin:0;padding:0;line-height:1.5} diff --git a/assets/swiss-passport-example.html.80ef1437.js b/assets/swiss-passport-example.html.80ef1437.js new file mode 100644 index 0000000..487009b --- /dev/null +++ b/assets/swiss-passport-example.html.80ef1437.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-4753f562","path":"/guide/applications/swiss-passport-example.html","title":"Swiss Passport Example","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Create OCA Bundle","slug":"create-oca-bundle","children":[]},{"level":2,"title":"Form and Credential preview","slug":"form-and-credential-preview","children":[]},{"level":2,"title":"Adding authentication taste","slug":"adding-authentication-taste","children":[]}],"git":{"updatedTime":1698417852000},"filePathRelative":"guide/applications/swiss-passport-example.md"}');export{e as data}; diff --git a/assets/swiss-passport-example.html.dec0619e.js b/assets/swiss-passport-example.html.dec0619e.js new file mode 100644 index 0000000..062f797 --- /dev/null +++ b/assets/swiss-passport-example.html.dec0619e.js @@ -0,0 +1,41 @@ +import{_ as r,r as a,o as p,c as l,a as s,b as n,w as i,d as e,e as c}from"./app.ebda841e.js";const u={},d=s("h1",null,"Swiss Passport Example",-1),h=e("Below we introduce a step by step guidance of utilizing "),_=e(" Semantic (Label) "),k=e(" and "),v=e(" Presentation "),m=e(" Overlays in action for rendering credential \u2013 Swiss Passport specimen."),b=s("h2",{id:"create-oca-bundle",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#create-oca-bundle","aria-hidden":"true"},"#"),e(" Create OCA Bundle")],-1),f=e("The process starts with defining the passport schema, including all the attributes, their types, formats, etc. For this purpose, "),g={href:"https://github.com/THCLab/oca-parser-xls/raw/main/templates/template.xlsx",target:"_blank",rel:"noopener noreferrer"},q=e(" an empty XLS template "),w=e(" can be used or an already pre-baked template, available "),y={href:"https://github.com/THCLab/oca-ecosystem/raw/main/examples/swiss_passport/digital_passport.xlsx",target:"_blank",rel:"noopener noreferrer"},C=e("here"),I=e(". We will continue with the latter template."),x=e("The next step is to create "),A=s("a",{href:"/ecosystem/oca-bundle"}," OCA Bundle ",-1),S=e(" from the template and to do so, we will use the "),T=s("a",{href:"/ecosystem/oca-browser"}," OCA Browser ",-1),D=e(" feature named "),B=s("code",null,"Develop",-1),E=e(". Within our Sandbox, we host OCA Browser and we will use it to create the Bundle. The browser is accessible "),O={href:"https://browser.oca.argo.colossi.network/#/",target:"_blank",rel:"noopener noreferrer"},L=e("here"),M=e("."),U=e("In the "),F=s("code",null,"Select OCA File",-1),R=e(" we use "),K={href:"https://github.com/THCLab/oca-ecosystem/raw/main/examples/swiss_passport/digital_passport.xlsx",target:"_blank",rel:"noopener noreferrer"},N=e("pre-baked template"),j=e(". "),G=s("code",null,"Select OCA references files",-1),W=e(" we leave empty and for "),P=s("code",null,"Credential",-1),H=e(" and "),J=s("code",null,"Form",-1),V=e(" layout, we use "),z={href:"https://github.com/THCLab/oca-ecosystem/tree/main/examples/swiss_passport/layouts",target:"_blank",rel:"noopener noreferrer"},X=e("these layouts"),Z=e("."),Q=s("p",null,[e("To conduct the conversion, click on the "),s("code",null,"convert"),e(" button. If it succeeds, below you shall see the following: "),s("code",null,"Success! Click here to download OCA Bundle"),e(".")],-1),Y=s("h2",{id:"form-and-credential-preview",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#form-and-credential-preview","aria-hidden":"true"},"#"),e(" Form and Credential preview")],-1),$=e("As the Bundle is created, we go to the next "),ee=s("a",{href:"/ecosystem/oca-browser"}," OCA Browser ",-1),se=e(" feature named "),ne={href:"https://browser.oca.argo.colossi.network/#/preview",target:"_blank",rel:"noopener noreferrer"},te=s("code",null,"Preview",-1),oe=e(),ae=e("."),ie=s("p",null,[e("In the "),s("code",null,"Pick OCA Bundle ZIP file"),e(" upload the Bundle created in the previous step. As a result, in the "),s("code",null,"FORM"),e(" tab the form preview will be rendered. This is the preview of the OCA Bundle using presentation overlays in the WEB space.")],-1),ce={class:"custom-container tip"},re=s("p",{class:"custom-container-title"},"Form and Credential translations",-1),pe=e("The "),le={href:"https://github.com/THCLab/oca-ecosystem/raw/main/examples/swiss_passport/digital_passport.xlsx",target:"_blank",rel:"noopener noreferrer"},ue=e("pre-baked template"),de=e(" comes with two translations: English and French. Any number can be added, but for the sake of this example, we use only these two."),he=s("p",null,"In the preview, both, so the Form and Credential contain a select widget to change the translation.",-1),_e=e("In the "),ke=s("code",null,"CREDENTIAL",-1),ve=e(" tab a passport specimen can be seen. Notice it is only the preview of the layout and schema. The data entries are missing. For preview all these combined we will use different tool that can be accessible "),me={href:"https://demo.oca.argo.colossi.network/credential.html",target:"_blank",rel:"noopener noreferrer"},be=e("here"),fe=e("."),ge=c(`

We reuse the same OCA Bundle we created in the previous step. In the Preview record SAID we use pre-prepared data record with SAID: ESEFRI_In7btcko9ov2IElxTKogunrDcv187n9Be7Kvc. The data record behind is given as follows:

{
+  "documentType": "PA",
+  "issuingState": "CHE",
+  "issuingStateCode": "che",
+  "documentNumber": "c0000000",
+  "primaryIdentifier": "John",
+  "secondaryIdentifier": "Citizen",
+  "nationality": "CHE",
+  "dateOfBirth": "28.01.0000",
+  "personalNumber": "",
+  "sex": "M",
+  "placeOfBirth": "Luzern LU",
+  "optionalPersonalData": "170",
+  "dateOfIssue": "11.07.0000",
+  "issuedBy": "Luzern LU",
+  "dateOfExpiry": "11.07.0000"
+}
+
`,2),qe=e("It is stored on "),we={href:"https://data-vault.argo.colossi.network/",target:"_blank",rel:"noopener noreferrer"},ye=e("https://data-vault.argo.colossi.network/"),Ce=e(". As a next step, click "),Ie=s("code",null,"Load",-1),xe=e(" that triggers rendering the preview. This time data record is visible."),Ae={class:"custom-container tip"},Se=s("p",{class:"custom-container-title"},"Custom data record",-1),Te=e("For preview any data record can be used. To do so, visit "),De={href:"https://data-vault.argo.colossi.network/",target:"_blank",rel:"noopener noreferrer"},Be=e("https://data-vault.argo.colossi.network/"),Ee=e(" page where Swagger interface is available. Use the "),Oe=s("code",null,"GET /files/{DRI}",-1),Le=e(" endpoint and then "),Me=s("code",null,"try it out",-1),Ue=e(" button. As input provide known SAID: "),Fe=s("code",null,"ESEFRI_In7btcko9ov2IElxTKogunrDcv187n9Be7Kvc",-1),Re=e(" and download the JSON file."),Ke=e("Changed JSON you can reupload to "),Ne={href:"https://data-vault.argo.colossi.network/",target:"_blank",rel:"noopener noreferrer"},je=e("https://data-vault.argo.colossi.network/"),Ge=e(" via "),We=s("code",null,"POST /files",-1),Pe=e(" endpoint and use the returned SAID as input for the "),He=s("code",null,"Preview record SAID",-1),Je=e(" field."),Ve=s("h2",{id:"adding-authentication-taste",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#adding-authentication-taste","aria-hidden":"true"},"#"),e(" Adding authentication taste")],-1),ze=s("p",null,"Whether the data can be proven to come from a verifiable source is the responsibility of an upper layer \u2013 the authentication layer. The authentication layer relies on public key cryptography. During the verification process, by verifying the signature along with the payload, it gives the non-repudiable answer whether the data has tampered.",-1),Xe=s("p",null,"In the following demo we introduce novel, authentication layer-related concepts:",-1),Ze={href:"https://www.ietf.org/archive/id/draft-ssmith-acdc-02.html",target:"_blank",rel:"noopener noreferrer"},Qe=e("ACDC"),Ye=e(" \u2013 Authentic Chained Data Containers;"),$e={href:"http://dkms.colossi.network/",target:"_blank",rel:"noopener noreferrer"},es=e("DKMS"),ss=e(" \u2013 Decentralised Key Management System."),ns={href:"https://demo.oca.argo.colossi.network/acdc.html",target:"_blank",rel:"noopener noreferrer"},ts=e("Here"),os=e(" we demonstrate a "),as={href:"https://www.ietf.org/archive/id/draft-ssmith-acdc-02.html#name-compact-acdc",target:"_blank",rel:"noopener noreferrer"},is=e(" compact ACDC "),cs=e(" that represents the passport credential. The sample credential in the "),rs=s("code",null,"Issue",-1),ps=e(" section is defined as follows:"),ls=c(`
{
+  "v":"ACDC10JSON00011c_",
+  "i":"DdUXsE9lsnc5vbSOQVG8khiqe-ICXd6F-Gf5nkfWRxFs",
+  "s":"Eohm-VG6JcT2HwU9IvM_Ujp6lIgwhg34TvXUtVqv_L3I",
+  "a":"ESEFRI_In7btcko9ov2IElxTKogunrDcv187n9Be7Kvc",
+  "p":[],
+  "r":[],
+  "d":"EQD7oAeqJOWoWYzrI1cu_Bzipr3RcpBsGkThK_L1eUEA"
+}
+

It is a map of key-value pairs, where s and a are interesting in particular. s stands for schema, and a stands for attributes. In s we use SAID of the OCA Bundle from the above example and in a we use data record SAID from the above example. By doing this, we embedded OCA into the ACDC.

The ACDC itself is not yet signed and we sign it using public key cryptography. For the sake of the example, assume the key pair is generated from a 32 bytes seed MDM0ZjczNmEyMGM1NDUyZGI3M2E3ODU1MTVjOGJiZTU=. Using private key of such key pair, this creates the 64 bytes length signature T6XBbjKSISmpJN9WMRxw3ay+6oL3ww0K0AbQGLP4Mx3McTd8LMQ0Un0RKUnHtH5WR2yhb6r+SSuO43iZddloDA==. (using ED25519 algorithm). We can verify the signature using JavaScript and tweetnacl library. The following code snippet presents the verification:

let nacl = require("tweetnacl");
+
+let keypair = nacl.sign.keyPair.fromSeed(
+  Buffer.from("MDM0ZjczNmEyMGM1NDUyZGI3M2E3ODU1MTVjOGJiZTU=", "base64")
+);
+let result = nacl.sign.detached.verify(
+  Buffer.from(\`{"v":"ACDC10JSON00011c_","i":"DdUXsE9lsnc5vbSOQVG8khiqe-ICXd6F-Gf5nkfWRxFs","s":"Eohm-VG6JcT2HwU9IvM_Ujp6lIgwhg34TvXUtVqv_L3I","a":"ESEFRI_In7btcko9ov2IElxTKogunrDcv187n9Be7Kvc","p":[],"r":[],"d":"EQD7oAeqJOWoWYzrI1cu_Bzipr3RcpBsGkThK_L1eUEA"}\`, "utf8"),
+  Buffer.from(
+    "T6XBbjKSISmpJN9WMRxw3ay+6oL3ww0K0AbQGLP4Mx3McTd8LMQ0Un0RKUnHtH5WR2yhb6r+SSuO43iZddloDA==",
+    "base64"
+  ),
+  keypair.publicKey
+);
+console.log(result); // true
+

Skipping all the details related to the authentication layer, that take place before the presentation layer is employed, we can finally render credential directly from an ACDC credential to see the passport specimen preview. The OCA Bundle containing all the details for presentation is unknown to the ACDC, therefore it has to be resolved from a third-party service, where the Bundle is stored. It can be an OCA Repository instance, however, it is not essential. OCA Bundle can be stored anywhere from AWS S3 to IPFS.

`,5);function us(ds,hs){const o=a("RouterLink"),t=a("ExternalLinkIcon");return p(),l("div",null,[d,s("p",null,[h,n(o,{to:"/specification/#label-overlay"},{default:i(()=>[_]),_:1}),k,n(o,{to:"/specification/#presentation-overlays"},{default:i(()=>[v]),_:1}),m]),b,s("p",null,[f,s("a",g,[q,n(t)]),w,s("a",y,[C,n(t)]),I]),s("p",null,[x,A,S,T,D,B,E,s("a",O,[L,n(t)]),M]),s("p",null,[U,F,R,s("a",K,[N,n(t)]),j,G,W,P,H,J,V,s("a",z,[X,n(t)]),Z]),Q,Y,s("p",null,[$,ee,se,s("a",ne,[te,oe,n(t)]),ae]),ie,s("div",ce,[re,s("p",null,[pe,s("a",le,[ue,n(t)]),de]),he]),s("p",null,[_e,ke,ve,s("a",me,[be,n(t)]),fe]),ge,s("p",null,[qe,s("a",we,[ye,n(t)]),Ce,Ie,xe]),s("div",Ae,[Se,s("p",null,[Te,s("a",De,[Be,n(t)]),Ee,Oe,Le,Me,Ue,Fe,Re]),s("p",null,[Ke,s("a",Ne,[je,n(t)]),Ge,We,Pe,He,Je])]),Ve,ze,Xe,s("ul",null,[s("li",null,[s("a",Ze,[Qe,n(t)]),Ye]),s("li",null,[s("a",$e,[es,n(t)]),ss])]),s("p",null,[s("a",ns,[ts,n(t)]),os,s("a",as,[is,n(t)]),cs,rs,ps]),ls])}var ks=r(u,[["render",us],["__file","swiss-passport-example.html.vue"]]);export{ks as default}; diff --git a/assets/tour.html.4cd67885.js b/assets/tour.html.4cd67885.js new file mode 100644 index 0000000..ce0a5a9 --- /dev/null +++ b/assets/tour.html.4cd67885.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-093dab99","path":"/ecosystem/tour.html","title":"OCA Ecosystem Tour","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Ecosystem components applications","slug":"ecosystem-components-applications","children":[{"level":3,"title":"Preparing OCA bundle","slug":"preparing-oca-bundle","children":[]},{"level":3,"title":"Context preserving data capture","slug":"context-preserving-data-capture","children":[]},{"level":3,"title":"Data harmonization through data transformation","slug":"data-harmonization-through-data-transformation","children":[]},{"level":3,"title":"Data presentation","slug":"data-presentation","children":[]}]},{"level":2,"title":"OCA playground","slug":"oca-playground","children":[]}],"git":{"updatedTime":1698417852000},"filePathRelative":"ecosystem/tour.md"}');export{e as data}; diff --git a/assets/tour.html.603f3b62.js b/assets/tour.html.603f3b62.js new file mode 100644 index 0000000..b0abbbc --- /dev/null +++ b/assets/tour.html.603f3b62.js @@ -0,0 +1 @@ +import{_ as i,r as t,o as c,c as d,a,b as o,w as l,e as r,d as e}from"./app.ebda841e.js";var h="/images/create-oca-bundle.png",p="/images/cont-pres-data-capture.png",m="/images/oca-transformation.png";const u={},f=r('

OCA Ecosystem Tour

There are many additional concepts defined on top of OCA that on their own require further explanation. Thus, the OCA Ecosystem emerged as an umbrella for the building blocks. It bounds all the basic concepts that play important role in this ecosystem. Around the concepts, components are defined that come along with the reference implementation.

The OCA Ecosystem consists of the following components:

',4),_=e("Refer also to the "),g=e("Basic Concepts"),b=e(" section of the specification."),y=r('

Ecosystem components applications

Preparing OCA bundle

Create OCA bundle

Context preserving data capture

Context preserving data capture

Data harmonization through data transformation

Context preserving data capture

Data presentation

OCA playground

OCA can be tested and developed on Argo, a dedicated sandbox environment hosted by Human Colossus Foundation.

',10),C=e("Link to Argo: "),A={href:"https://argo.colossi.network/",target:"_blank",rel:"noopener noreferrer"},x=e("https://argo.colossi.network/");function O(v,w){const n=t("RouterLink"),s=t("ExternalLinkIcon");return c(),d("div",null,[f,a("p",null,[_,o(n,{to:"/specification/#basic-concepts"},{default:l(()=>[g]),_:1}),b]),y,a("p",null,[C,a("a",A,[x,o(s)])])])}var k=i(u,[["render",O],["__file","tour.html.vue"]]);export{k as default}; diff --git a/assets/v1.1.0-rc.html.26435266.js b/assets/v1.1.0-rc.html.26435266.js new file mode 100644 index 0000000..af11341 --- /dev/null +++ b/assets/v1.1.0-rc.html.26435266.js @@ -0,0 +1,257 @@ +import{_ as o,r as i,o as p,c as r,a,b as s,e,d as n}from"./app.ebda841e.js";var l="/images/oca_overview.png",u="/images/rugby-semantic.png",c="/images/rugby-input.png",d="/images/si.png";const m={},q=e('

Overlays Capture Architecture Specification

Version 1.1.0-rc

Changelog

  • Introduce Credential Overlay
  • Introduce Form Overlay

Introduction

Overlays Capture Architecture (OCA) offers a solution to harmonisation between data models and data representation formats. Primarily devised for semantic object interoperability and privacy compliant data sharing, OCA is a proposed global standard for data capture that promises to significantly enhance the ability to define, manage, and use data in terms of simplicity, accuracy, and allocation of resources.Overlays Capture Architecture (OCA) offers a solution to harmonisation between data models and data representation formats. Primarily devised for semantic object interoperability and privacy compliant data sharing, OCA is a proposed global standard for data capture that promises to significantly enhance the ability to define, manage, and use data in terms of simplicity, accuracy, and allocation of resources.

OCA represents a form (domain-agnostic) and schema (domain-specific) as a multi-dimensional object consisting of a stable Capture Base and interoperable Overlays. By introducing Overlays as task-oriented linked objects within the OCA stack, the architecture offers an optimal level of both efficiency and interoperability in alignment with FAIR principles.

OCA overview

',8),y=n("The "),k={href:"https://www.nature.com/articles/sdata201618",target:"_blank",rel:"noopener noreferrer"},g=n("FAIR Data Principles"),v=n(" (Wilkinson et al., 2016), a set of guiding principles to make data findable, accessible, interoperable, and reusable; guide scientific data management and stewardship; and are relevant to all digital economy stakeholders."),f=e(`

Capture base

A Capture Base is a stable base object that defines a single dataset in its purest form, providing a standard base to harmonise data. The object defines attribute names and types. The construct also includes a flagging block, allowing the issuer of a form or schema to flag any attributes where identifying information about entities* may be captured. With flagged attributes, all corresponding data can be treated as high-risk throughout the data lifecycle and encrypted or removed at any stage, reducing the risk of re-identification attacks against blinded datasets.

{
+  "type": "spec/capture_base/1.0",
+  "classification": "GICS:45102010",
+  "attributes": {
+    "dateOfBirth": "Date",
+    "dateOfExpiry": "Date",
+    "dateOfIssue": "Date",
+    "documentCode": "Text",
+    "documentNumber": "Text",
+    "documentType": "Text",
+    "fullName": "Text",
+    "issuedBy": "Text",
+    "issuingState": "Text",
+    "issuingStateCode": "Text",
+    "nationality": "Text",
+    "optionalData": "Text",
+    "optionalDocumentData": "Text",
+    "optionalPersonalData": "Text",
+    "personalNumber": "Text",
+    "photoImage": "Binary",
+    "placeOfBirth": "Text",
+    "primaryIdentifier": "Text",
+    "secondaryIdentifier": "Text",
+    "sex": "Text",
+    "signatureImage": "Binary"
+  },
+  "flagged_attributes": [
+    "documentNumber",
+    "fullName",
+    "primaryIdentifier",
+    "secondaryIdentifier",
+    "dateOfBirth",
+    "personalNumber",
+    "placeOfBirth",
+    "optionalPersonalData",
+    "optionalDocumentData",
+    "signatureImage",
+    "photoImage",
+    "optionalData"
+  ]
+}
+

Attribute name

An attribute name is a string that identifies an attribute.

Attribute type

An attribute type determines the attribute's syntax and how attributes of that type are compared and sorted. A Capture Base recognises seven core attribute types:

  • Text: a data type that defines a human-readable sequence of characters and the words they form, subsequently encoded into computer-readable formats such as ASCII.
  • Numeric: a data type that defines anything of, relating to, or containing numbers. The numbering system consists of ten different digits: 0, 1, 2, 3, 4, 5, 6, 7, 8, and 9.
  • Reference: a data type that defines a self-addressing identifier (SAI) that references a set of attributes through its associated parent. SAID is an identifier that is deterministically generated from and embedded in the content it identifies, making it and its data mutually tamper-evident.
  • Boolean: a data type where the data only has two possible variables: true or false. In computer science, Boolean is an identification classifier for working out logical truth values and algebraic variables.
  • Binary: a data type that defines a binary code signal, a series of electrical pulses representing numbers, characters, and performed operations. Based on a binary number system, each digit position represents a power of two (e.g., 4, 8, 16, etc.). In binary code, a set of four binary digits or bits represents each decimal number (0 to 9). Each digit only has two possible states: off and on (usually symbolised by 0 and 1). Combining basic Boolean algebraic operations on binary numbers makes it possible to represent each of the four fundamental arithmetic operations of addition, subtraction, multiplication, and division.
  • DateTime: a data type that defines the number of seconds or clock ticks that have elapsed since the defined epoch for that computer or platform. Common formats (see 'Format Overlay') include dates (e.g., YYYY-MM-DD), times (e.g., hh:mm:ss), dates and times concatenated (e.g., YYYY-MM-DDThh:mm:ss.sss+zz:zz), and durations (e.g., PnYnMnD).
  • Array [attribute type]: a data type that defines a structure that holds several data items or elements of the same data type. When you want to store many pieces of data that are related and have the same data type, it is often better to use an array instead of many separate variables (e.g. array[text], array[numeric], etc.).

Flagged attributes

`,9),h=n("Any attributes defined in a Capture Base that may contain identifying information about entities* (i.e., personally identifiable information (PII) or quasi-identifiable information (QII)) can be flagged. The "),b={href:"https://docs.kantarainitiative.org/Blinding-Identity-Taxonomy-Report-Version-1.0.pdf",target:"_blank",rel:"noopener noreferrer"},x=n("Blinding Identity Taxonomy"),_=n(" (BIT), a definitive list of what constitutes identifying information, is available at "),O={href:"https://docs.kantarainitiative.org/Blinding-Identity-Taxonomy-Report-Version-1.0.pdf",target:"_blank",rel:"noopener noreferrer"},w=n("here"),I=n("."),z=e('

*Note: Entities may be (but not necessarily) natural persons.

Overlays

Overlays are cryptographically-linked objects that provide layers of task-oriented contextual information to a Capture Base. Any actor interacting with a published Capture Base can use Overlays to transform how information is displayed to a viewer or guide an agent in applying a custom process to captured data.

Semantic Overlays

Semantic overlays provide contextual meaning to describe objects and their relationships, including attributes, forms, and schemas.

Semantic

Figure 3.1. In a balanced network, semantic overlays determine the meaning and use of what is put in, taken in, or operated on by any process or system.

Character Encoding Overlay

A Character Encoding Overlay defines the process of assigning numbers to graphical characters, especially the written characters of human language, allowing them to be stored, transmitted, and transformed using digital computers. Character encoding using internationally accepted standards permits worldwide interchange of text in electronic form. The default character set is UTF-8, which is the most common encoding for the World Wide Web, accounting for 98% of all web pages, and up to 100.0% for some languages, as of 2021.

Examples: ASCII, ISO-8859-1, UTF-8, etc.

{
+  "capture_base": "EPMaG1h2hVxKCZ5_3KoNNwgAyd4Eq8zrxK3xgaaRsz2M",
+  "type": "spec/overlays/character_encoding/1.0",
+  "default_character_encoding": "utf-8",
+  "attr_character_encoding": {
+    "dateOfBirth": "utf-8",
+    "dateOfExpiry": "utf-8",
+    "dateOfIssue": "utf-8",
+    "documentCode": "utf-8",
+    "documentNumber": "utf-8",
+    "documentType": "utf-8",
+    "fullName": "utf-8",
+    "issuedBy": "utf-8",
+    "issuingState": "utf-8",
+    "issuingStateCode": "utf-8",
+    "nationality": "utf-8",
+    "optionalData": "utf-8",
+    "optionalDocumentData": "utf-8",
+    "optionalPersonalData": "utf-8",
+    "personalNumber": "utf-8",
+    "photoImage": "base64",
+    "placeOfBirth": "utf-8",
+    "primaryIdentifier": "utf-8",
+    "secondaryIdentifier": "utf-8",
+    "sex": "utf-8",
+    "signatureImage": "base64"
+  }
+}
+

Code snippet for a Character Encoding Overlay

Format Overlay

A Format Overlay defines an input and display format for numeric and date fields. The data format enables the conversion of the input buffer to the program variable and displays program variable data to form fields.

Examples: YYYY-MM-DD, (?<=:25:)\\d{8}(?=/), (\\d+(,\\d*)?)|(,\\d+), etc.

{
+  "capture_base": "EPMaG1h2hVxKCZ5_3KoNNwgAyd4Eq8zrxK3xgaaRsz2M",
+  "type": "spec/overlays/format/1.0",
+  "attr_formats": {
+    "dateOfBirth": "YYnMMnDD",
+    "dateOfExpiry": "YYnMMnDD",
+    "dateOfIssue": "YYnMMnDD",
+    "documentCode": "P[A-Z0-9]{1}",
+    "documentNumber": "[A-Z0-9]{9}",
+    "issuingStateCode": "[A-Z]{3}",
+    "personalNumber": "[A-Z0-9]{14}",
+    "photoImage": "image/jpeg",
+    "signatureImage": "image/jpeg"
+  }
+}
+
+

Code snippet for a Format Overlay

Information Overlay

[language-specific object]

An Information Overlay defines attribute field descriptions and usage notes to assist the data entry process.

{
+  "capture_base": "EPMaG1h2hVxKCZ5_3KoNNwgAyd4Eq8zrxK3xgaaRsz2M",
+  "type": "spec/overlays/information/1.0",
+  "language": "en",
+  "attr_information": {
+    "dateOfBirth": "Holder\u2019s date of birth as recorded by the issuing State or organization. If the date of birth is unknown, see Doc 9303-3 for guidance.",
+    "dateOfExpiry": "Date of expiry of the MRP. For additional details see Doc 9303-3.",
+    "dateOfIssue": "For details see Doc 9303-3.",
+    "documentCode": "Capital letter P to designate an MRP. One additional capital letter may be used, in the character position after the letter P and at the discretion of the issuing State or organization, to designate other types of passports such as MRP issued to diplomatic staff, an MRP issued for travel on government business, or a passport issued for a special purpose.",
+    "documentNumber": "As given by the issuing State or organization to uniquely identify the document from all other MRTDs issued by the State or organization. For additional details see Doc 9303-3.",
+    "documentType": "The word for \u201Cpassport\u201D in the language of the issuing State or organization.",
+    "fullName": "The full name of the holder, as identified by the issuing State or organization. For additional details see Doc 9303-3.",
+    "issuedBy": "Authority or issuing organization for the MRP. This field shall be used to indicate the issuing authority or issuing organization and, optionally, its location, which may be personalized within this field. For additional details see Doc 9303-3.",
+    "issuingState": "The name of the State or organization responsible for issuing the MRP shall be displayed in full.",
+    "issuingStateCode": "As abbreviated in the three-letter code specified in Doc 9303-3.",
+    "nationality": "For details see Doc 9303-3.",
+    "optionalData": "Additional optional data elements at the discretion of the issuing State or organization. For additional details see Doc 9303-3.",
+    "optionalDocumentData": "Optional data elements relating to the document. For additional details see Doc 9303-3.",
+    "optionalPersonalData": "Optional personal data elements e.g. personal identification number or fingerprint, at the discretion of the issuing State or organization. If a fingerprint is included in this field, it should be presented as a 1:1 representation of the original. If a date is included, it shall follow the form of presentation described in Doc 9303-3.",
+    "personalNumber": "Field optionally used for personal identification number given to holder by the issuing State or organization. For additional details see Doc 9303-3. ",
+    "photoImage": "This field shall contain a portrait of the holder. The portrait shall not be larger than 45.0 mm x 35.0 mm_x005F_x000B_(1.77 in x 1.38 in) nor smaller than 32.0 mm x 26.0 mm (1.26 in x 1.02 in). The position of the field concerned shall be aligned to the left of Zones II, III and IV. See Doc 9303-3 for additional specifications for the portrait.",
+    "placeOfBirth": "Field optionally used for city and State of the holder\u2019s birthplace. Refer to Doc 9303-3 for further details. ",
+    "primaryIdentifier": "Predominant component(s) of the name of the holder as described in Doc 9303-3. In cases where the predominant component(s) of the name of the holder (e.g. where this consists of composite names) cannot be shown in full or in the same order, owing to space limitations of Field(s) 06 and/or 07 or national practice, the most important component(s) (as determined by the State or organization) of the primary identifier shall be inserted.",
+    "secondaryIdentifier": "Secondary component(s) of the name of the holder as described in Doc 9303-3. The most important component(s) (as determined by the State or organization) of the secondary identifier of the holder shall be inserted in full, up to the maximum dimensions of the field frame. Other components, where necessary, may be represented by initials. Where the holder\u2019s name has only predominant component(s), this data field shall be left blank. A State may optionally utilize the whole zone comprising Fields 06 and 07 as a single field. In such a case, the primary identifier shall be placed first, followed by a comma and a space, followed by the secondary identifier. ",
+    "sex": "Sex of the holder, to be specified by use of the single initial commonly used in the language of the State or organization where the document is issued and, if translation into English, French or Spanish is necessary, followed by an oblique and the capital letter F for female, M for male, or X for unspecified.",
+    "signatureImage": "At the discretion of the issuing State or organization, the signature or usual mark may be located in Zone VI. The size of the field to be allocated to the signature or usual mark on the adjoining page shall be at the discretion of the issuing State or organization, subject to the overall dimensional limits of the MRP. For additional details see Doc 9303-3."
+  }
+}
+

Code snippet for an Information Overlay

Label Overlay

[language-specific object]

A Label Overlay defines category and display labels for attributes. For example, given an attribute named firstName, you may want to display a label First Name which is more user-friendly when displayed to end users in places such as form inputs and error messages.

{
+  "capture_base": "EPMaG1h2hVxKCZ5_3KoNNwgAyd4Eq8zrxK3xgaaRsz2M",
+  "type": "spec/overlays/label/1.0",
+  "language": "en",
+  "attr_labels": {
+    "dateOfBirth": "Date of birth",
+    "dateOfExpiry": "Date of expiry",
+    "dateOfIssue": "Date of issue",
+    "documentCode": "Document code",
+    "documentNumber": "Passport Number",
+    "documentType": "Document",
+    "fullName": "Name",
+    "issuedBy": "Authority or issuing organization",
+    "issuingState": "Issuing State or organization (in full)",
+    "issuingStateCode": "Issuing State or organization (in code)",
+    "nationality": "Nationality",
+    "optionalData": "Optional data elements",
+    "optionalDocumentData": "Optional document data elements",
+    "optionalPersonalData": "Optional personal data elements",
+    "personalNumber": "Personal number",
+    "photoImage": "Identification feature",
+    "placeOfBirth": "Place of birth",
+    "primaryIdentifier": "Primary Identifier",
+    "secondaryIdentifier": "Secondary Identifier",
+    "sex": "Sex",
+    "signatureImage": "Holder\u2019s signature or usual mark"
+  },
+  "attr_categories": [
+    "_cat-1_",
+    "_cat-2_",
+    "_cat-3_",
+    "_cat-4_",
+    "_cat-5_",
+    "_cat-6_"
+  ],
+  "cat_labels": {
+    "_cat-1_": "Mandatory header",
+    "_cat-2_": "Mandatory and optional personal data elements",
+    "_cat-3_": "Mandatory and optional document data elements",
+    "_cat-4_": "Mandatory holder\u2019s signature or usual mark (original or reproduction)",
+    "_cat-5_": "Mandatory identification feature",
+    "_cat-6_": "Optional data elements"
+  },
+  "cat_attributes": {
+    "_cat-1_": [
+      "issuingState",
+      "documentType",
+      "documentCode",
+      "issuingStateCode",
+      "documentNumber"
+    ],
+    "_cat-2_": [
+      "fullName",
+      "primaryIdentifier",
+      "secondaryIdentifier",
+      "nationality",
+      "dateOfBirth",
+      "personalNumber",
+      "sex",
+      "placeOfBirth",
+      "optionalPersonalData"
+    ],
+    "_cat-3_": [
+      "dateOfIssue",
+      "issuedBy",
+      "dateOfExpiry",
+      "optionalDocumentData"
+    ],
+    "_cat-4_": [
+      "signatureImage"
+    ],
+    "_cat-5_": [
+      "photoImage"
+    ],
+    "_cat-6_": [
+      "optionalData"
+    ]
+  }
+}
+

Code snippet for a Label Overlay

Meta Overlay

[language-specific object]

A Meta Overlay defines the descriptive information about a schema or form. It is used for discovery and identification and includes elements such as form name and description.

{
+  "capture_base": "EPMaG1h2hVxKCZ5_3KoNNwgAyd4Eq8zrxK3xgaaRsz2M",
+  "type": "spec/overlays/meta/1.0",
+  "language": "en",
+  "name": "VIZ for Digital Passport",
+  "description": "A form to be used for capturing Visual Inspection Zone data for a Digital Passport"
+}
+
+

Code snippet for a Meta Overlay

Standards Overlay

A Standards Overlay defines a documented agreement or technical specification published by a standards organisation used to represent, format, define, structure, tag, transmit, manipulate, use, and manage data.

Examples: ISO 3166-1 alpha-2, SNOMED CT, IETF RFC 2246 (1999), etc.

TODO
+
+

Code snippet for a Standards Overlay

Inputs Overlays

Inputs overlays provide predefined inputs for data attestations, including claims, credentials, and records.

OCA Input

In a balanced network, inputs overlays determine what is put in, taken in, or operated on by any process or system.

Cardinality Overlay

A Cardinality Overlay defines the relational information between attributes, which later models need when modelling the actual table architecture. For example, without knowing the relationship cardinality, one cannot model the tables and key restrictions between them. Typical uses include setting data entry requirements on specific fields (i.e., Mandatory or Optional) and setting conditional attribute dependencies according to the chosen entries of a parent attribute.

TODO
+
+

Code snippet for a Cardinality Overlay

Conditional Overlay

A Conditional Overlay defines conditional logic where input conditions for one attribute cause a process change to another. It also allows the application of a child schema based on the outcome of a parent schema, much like the if/then/else constructs seen in traditional programming languages.

Entry Code Overlay

An Entry Code Overlay defines the entry keys in a series of key-value pairs stored in a code table (aka lookup table) or dataset. The key is a unique identifier that points to its associated value.

Examples: CA, CA-BC, NA, etc.

{
+  "capture_base": "EPMaG1h2hVxKCZ5_3KoNNwgAyd4Eq8zrxK3xgaaRsz2M",
+  "type": "spec/overlays/entry_code/1.0",
+  "attr_entry_codes": {
+    "documentType": [
+      "PASSPORT"
+    ],
+    "issuingState": "EWSSp1MZQfVWl-u4l4eDprRp-bLE-xLe0gSTNVwkuqNA",
+    "issuingStateCode": "EWSSp1MZQfVWl-u4l4eDprRp-bLE-xLe0gSTNVwkuqNA",
+    "nationality": "EcOqelFTDay0reu_CesOIUfWVF7htg4IvSOrrXuIMaXU",
+    "sex": [
+      "F",
+      "M",
+      "X"
+    ]
+  }
+}
+
+

Code snippet for an Entry Code Overlay

Entry Overlay

[language-specific object]

An Entry Overlay defines the entry values in a series of key-value pairs stored in a code table (aka lookup table) or dataset. A value is either the identified data or a pointer to that data.

Examples: Canada, British Columbia, North America, etc.

{
+  "capture_base": "EPMaG1h2hVxKCZ5_3KoNNwgAyd4Eq8zrxK3xgaaRsz2M",
+  "type": "spec/overlays/entry/1.0",
+  "language": "en",
+  "attr_entries": {
+    "documentType": {
+      "PASSPORT": "PASSPORT"
+    },
+    "issuingState": "ECfBoOwdcHhQfNtWA5qTKOo9egoxHKXxby6R8Jujpk-o",
+    "issuingStateCode": "EnmO60xL2IsIv-_AC2PgLdJtzqsfuNqa8BihsiNWgz5o",
+    "nationality": "EAr0uvi1743P2VXXqd08a-yX8K_aejHCkdjaW8lWZ_xw",
+    "sex": {
+      "F": "Female",
+      "M": "Male",
+      "X": "Unspecified"
+    }
+  }
+}
+

Unit Overlay

`,58),C=n("A Unit Overlay defines the units of measurement adopted by convention or law, used as a standard for measuring the same kind of quantity. The recommended system to use is the International System of Units (SI), French Syst\xE8me International d\u2019Unit\xE9s, an international decimal system of weights and measures derived from and extending the metric system of units. Adopted by the 11th General Conference on Weights and Measures (CGPM) in 1960, it is abbreviated SI in all languages. To date, the SI comprises seven base units: the meter (m), the kilogram (kg), the second (s), the ampere (A), the kelvin (K), the candela (cd) and the mole (mol). More information on the SI is available "),S={href:"https://www.bipm.org/en/measurement-units",target:"_blank",rel:"noopener noreferrer"},D=n("here"),N=n("."),A=e('

SI

The seven defining constants of the SI

TODO
+

Code snippet for a Unit Overlay

Transformation Overlays

Transformation overlays provide information to convert data from one format or structure to another, such as raw data to processed, or unstructured to structured.

Mapping Overlay

A Mapping Overlay defines attribute mappings between two distinct data models. Data mapping provides a preliminary step for data integration tasks, including data transformation or data mediation between a data source and a destination or consolidation of multiple databases into a single database and identifying redundant columns of data for consolidation or elimination.

Masking Overlay

A Masking Overlay defines the process of masking or obfuscating sensitive data so that it is of no or little value to unauthorised intruders while still being usable by software or authorised personnel. The main reason for applying masking to a data field is to protect personally identifiable, quasi-identifiable, sensitive personal, or commercially sensitive data.

Subset Overlay

A Subset Overlay defines a customised version of a published schema or form containing a subset of source attributes, including their properties, types, codes, and relationship dependencies required for the information exchange.

Presentation Overlays

Presentation overlays provide information to display data objects at the application layer, including forms and credentials.

Credential Layout Overlay

A Credential Layout Overlay defines presentation information required by an application to display a digital credential.

{
+  "capture_base": "EPMaG1h2hVxKCZ5_3KoNNwgAyd4Eq8zrxK3xgaaRsz2M",
+  "type": "spec/overlays/credential_layout/1.0",
+  "layout": "config:\\n  width: 980px\\n  height: 1400px\\n  style: \\"@import url('https://fonts.googleapis.com/css2?family=Nanum+Gothic:wght@700&display=swap'); @font-face { font-family: 'Euphemia'; src: url('https://data-vault.argo.colossi.network/api/v1/files/zQmVwGQNiz8nGHJW1ZvgCyi1Sx1WZeGwJRfdyLedxUJG1Np'); } @font-face { font-family: 'OCRB 10 Pitch BT'; src: url('https://data-vault.argo.colossi.network/api/v1/files/zQmPWK7khoAebbJDZsmgQgjyH2hsThYYPBKWbSbV5tn8NrC'); }\\"\\npages:\\n  - config:\\n      style: \\"width: 980px; height: 700px; margin: 0;\\"\\n      background_image: SAI:zQmf4NGbt4q7ufjK1dNaQdMaJgGLXigAYJWXGc1cjaASXxc\\n      name: Page 0\\n    elements:\\n      - type: row\\n        config:\\n          style: \\"height: 32px;\\"\\n        elements:\\n      - type: row\\n        elements:\\n          - type: col\\n            size: 4\\n            config:\\n              style: \\"padding-right: 0;\\"\\n            elements:\\n              - type: row\\n                config:\\n                  style: \\"height: 130px; font-size: 23px; color: #233067; font-family: Nanum Gothic; letter-spacing: 1.2px;\\"\\n                elements:\\n                  - type: col\\n                    size: 8\\n                    config:\\n                      style: \\"text-align: right; padding-right: 30px;\\"\\n                    elements:\\n                      - type: row\\n                        elements:\\n                          - type: col\\n                            elements:\\n                            - type: content\\n                              label: passport\\n                  - type: col\\n                    size: 4\\n              - type: row\\n                config:\\n                  style: \\"margin-top: 20px;\\"\\n                elements:\\n                  - type: col\\n                    size: 3\\n                  - type: col\\n                    size: 7\\n                    config:\\n                      style: \\"padding-left: 4px; padding-right: 0;\\"\\n                    elements:\\n                      - type: attribute\\n                        name: photoImage\\n                        part: data\\n                        config:\\n                          style: \\"height: 281px; width: 203px;\\"\\n          - type: col\\n            size: 8\\n            config:\\n              style: \\"padding-left: 0; margin-left: -1px;\\"\\n            elements:\\n              - type: row\\n                config:\\n                  style: \\"font-size: 23px; color: #233067; font-family: 'Nanum Gothic'; letter-spacing: 1.2px;\\"\\n                elements:\\n                  - type: attribute\\n                    name: issuingState\\n                    part: data\\n                    config:\\n                      style: \\"letter-spacing: 0.2px;\\"\\n              - type: row\\n                config:\\n                  style: \\"margin-top: 16px; font-size: 11px; color: #233067; font-family: 'Nanum Gothic';\\"\\n                elements:\\n                  - type: col\\n                    size: 3\\n                    config:\\n                      style: \\"padding-left: 0; font-size: 11px;\\"\\n                    elements:\\n                      - type: content\\n                        text: Type\\n                      - type: attribute\\n                        name: documentType\\n                        part: code\\n                        config:\\n                          style: \\"font-size: 21px; color: #222222; font-family: Euphemia; text-transform: uppercase;\\"\\n                  - type: col\\n                    size: 3\\n                    config:\\n                      style: \\"padding: 0; margin-left: -20px;\\"\\n                    elements:\\n                      - type: content\\n                        text: Code\\n                      - type: attribute\\n                        name: issuingStateCode\\n                        part: code\\n                        config:\\n                          style: \\"font-size: 21px; color: #222222; font-family: Euphemia; text-transform: uppercase;\\"\\n                  - type: col\\n                    size: 6\\n                    config:\\n                      style: \\"padding: 0;\\"\\n                    elements:\\n                      - type: row\\n                        elements:\\n                          - type: content\\n                            text: Pass Passeport\\n                            config:\\n                              style: \\"padding-left: 13px; letter-spacing: 0.3px;\\"\\n                      - type: row\\n                        elements:\\n                          - type: content\\n                            text: Passaporto Passaport Passport No N\xB0 Nr\\n                            config:\\n                              style: \\"padding-left: 13px; letter-spacing: 0.3px;\\"\\n                      - type: attribute\\n                        name: documentNumber\\n                        part: data\\n                        config:\\n                          style: \\"font-size: 21px; color: #222222; font-family: Euphemia; text-transform: uppercase;\\"\\n              - type: row\\n                config:\\n                  style: \\"margin-top: -6px; font-size: 10.5px; color: #233067; font-family: 'Nanum Gothic';\\"\\n                elements:\\n                  - type: col\\n                    config:\\n                      style: \\"padding-left: 0; letter-spacing: 0.2px;\\"\\n                    elements:\\n                      - type: content\\n                        text: 1 Name Nom\\n                      - type: content\\n                        text: Cognome Num Surname\\n                      - type: attribute\\n                        name: primaryIdentifier\\n                        part: data\\n                        config:\\n                          style: \\"font-size: 19px; color: #222222; font-family: Euphemia; margin-top: -1px; margin-bottom: 1px;\\"\\n              - type: row\\n                config:\\n                  style: \\"margin-top: 0px; font-size: 10.5px; color: #233067; font-family: 'Nanum Gothic';\\"\\n                elements:\\n                  - type: col\\n                    config:\\n                      style: \\"padding-left: 0; letter-spacing: 0.2px;\\"\\n                    elements:\\n                      - type: content\\n                        text: 2 Vorname(n) Prenom(s)\\n                      - type: content\\n                        text: Nome(i) Num(s) Given name(s)\\n                      - type: attribute\\n                        name: secondaryIdentifier\\n                        part: data\\n                        config:\\n                          style: \\"font-size: 19px; color: #222222; font-family: Euphemia; margin-top: -2px; margin-bottom: 2px;\\"\\n              - type: row\\n                config:\\n                  style: \\"margin-top: 0px; font-size: 11px; color: #233067; font-family: 'Nanum Gothic';\\"\\n                elements:\\n                  - type: col\\n                    config:\\n                      style: \\"padding-left: 0; letter-spacing: 0.25px;\\"\\n                    elements:\\n                      - type: content\\n                        text: 3 Nationalitat Nationalite\\n                      - type: content\\n                        text: Cittadinanza Naziunalitad Nationality\\n                      - type: attribute\\n                        name: nationality\\n                        part: data\\n                        config:\\n                          style: \\"font-size: 19px; color: #222222; font-family: Euphemia; margin-top: -2px; margin-bottom: 2px;\\"\\n              - type: row\\n                config:\\n                  style: \\"margin-top: 0px; font-size: 10px; letter-spacing: 0.65px; color: #233067; font-family: 'Nanum Gothic';\\"\\n                elements:\\n                  - type: col\\n                    size: 5\\n                    config:\\n                      style: \\"padding-left: 0;\\"\\n                    elements:\\n                      - type: content\\n                        text: 4 Geburtsdatum Date de naissance\\n                      - type: content\\n                        text: Data di nascita Data da naschientscha Date of birth\\n                      - type: attribute\\n                        name: dateOfBirth\\n                        part: data\\n                        config:\\n                          style: \\"font-size: 19px; color: #222222; font-family: Euphemia; margin-top: -2px; margin-bottom: 2px;\\"\\n                  - type: col\\n                    size: 3\\n                    config:\\n                      style: \\"padding-left: 35px;\\"\\n                    elements:\\n                      - type: content\\n                        text: 5 Geschlecht Sexe\\n                      - type: content\\n                        text: Sesso Schlattaina Sex\\n                      - type: attribute\\n                        name: sex\\n                        part: code\\n                        config:\\n                          style: \\"font-size: 21px; color: #222222; font-family: Euphemia; margin-top: -2px; margin-bottom: 2px;\\"\\n                  - type: col\\n                    size: 4\\n                    config:\\n                      style: \\"padding-left: 5px;\\"\\n                    elements:\\n                      - type: content\\n                        text: 6 Grosse Taille\\n                      - type: content\\n                        text: Statura Grondezza Height\\n                      - type: attribute\\n                        name: optionalPersonalData\\n                        part: data\\n                        config:\\n                          style: \\"display: inline-block; font-size: 21px; color: #222222; font-family: Euphemia; margin-top: -2px; margin-bottom: 2px;\\"\\n                      - type: content\\n                        text: cm\\n                        config:\\n                          style: \\"display: inline-block; font-size: 21px; color: #222222; font-family: Euphemia; margin-top: -2px; margin-bottom: 2px; padding-left: 10px;\\"\\n              - type: row\\n                config:\\n                  style: \\"margin-top: -2px; font-size: 10px; letter-spacing: 0.65px; color: #233067; font-family: 'Nanum Gothic';\\"\\n                elements:\\n                  - type: col\\n                    config:\\n                      style: \\"padding-left: 0;\\"\\n                    elements:\\n                      - type: content\\n                        text: 7 Heimatort Lieu d'origine\\n                      - type: content\\n                        text: Luogo di attinenza Lieu d'origin Place of origin\\n                      - type: attribute\\n                        name: placeOfBirth\\n                        part: data\\n                        config:\\n                          style: \\"font-size: 19px; color: #222222; font-family: Euphemia;\\"\\n              - type: row\\n                config:\\n                  style: \\"margin-top: 2px; font-size: 10px; letter-spacing: 0.65px; color: #233067; font-family: 'Nanum Gothic';\\"\\n                elements:\\n                  - type: col\\n                    size: 5\\n                    config:\\n                      style: \\"padding-left: 0;\\"\\n                    elements:\\n                      - type: content\\n                        text: 8 Ausgestellt am Delivre le\\n                      - type: content\\n                        text: Rilascuato il Emess ils Date of issue\\n                      - type: attribute\\n                        name: dateOfIssue\\n                        part: data\\n                        config:\\n                          style: \\"font-size: 19px; color: #222222; font-family: Euphemia;\\"\\n                  - type: col\\n                    size: 7\\n                    config:\\n                      style: \\"padding-left: 35px;\\"\\n                    elements:\\n                      - type: content\\n                        text: 9 Behorde Autorite\\n                      - type: content\\n                        text: Autorita Autoritad Authority\\n                      - type: attribute\\n                        name: issuedBy\\n                        part: data\\n                        config:\\n                          style: \\"font-size: 21px; color: #222222; font-family: Euphemia;\\"\\n              - type: row\\n                config:\\n                  style: \\"margin-top: -1px; font-size: 10px; letter-spacing: 0.65px; color: #233067; font-family: 'Nanum Gothic';\\"\\n                elements:\\n                  - type: col\\n                    config:\\n                      style: \\"padding-left: 0;\\"\\n                    elements:\\n                      - type: content\\n                        text: 10 Gultig bis Date d'expiration\\n                      - type: content\\n                        text: Data di scadenza Data da scadenza Date of expiry\\n                      - type: attribute\\n                        name: dateOfExpiry\\n                        part: data\\n                        config:\\n                          style: \\"font-size: 19px; color: #222222; font-family: Euphemia; margin-top: -2px; margin-bottom: 2px;\\"\\n      - type: row\\n        config:\\n          style: \\"height: 50px;\\"\\n        elements:\\n      - type: row\\n        config:\\n          style: \\"margin-top: 45px; font-family: 'OCRB 10 Pitch BT'; font-size: 31px;\\"\\n        elements:\\n          - type: col\\n            elements:\\n              - type: row\\n                config:\\n                  style: \\"padding-left: 50px; font-size: 31px; letter-spacing: 1.84px;\\"\\n                elements:\\n                  - type: col\\n                    config:\\n                      style: \\"white-space: nowrap; overflow: hidden; max-width: 895px;\\"\\n                    elements:\\n                      - type: content\\n                        text: P<\\n                        config:\\n                          style: \\"display: inline-block; text-transform: uppercase;\\"\\n                      - type: attribute\\n                        name: issuingStateCode\\n                        part: code\\n                        config:\\n                          style: \\"display: inline-block; text-transform: uppercase;\\"\\n                      - type: attribute\\n                        name: secondaryIdentifier\\n                        part: data\\n                        config:\\n                          style: \\"display: inline-block; text-transform: uppercase;\\"\\n                      - type: content\\n                        text: <<\\n                        config:\\n                          style: \\"display: inline-block; text-transform: uppercase;\\"\\n                      - type: attribute\\n                        name: primaryIdentifier\\n                        part: data\\n                        config:\\n                          style: \\"display: inline-block; text-transform: uppercase;\\"\\n                      - type: content\\n                        text: <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\\n                        config:\\n                          style: \\"display: inline-block; text-transform: uppercase;\\"\\n              - type: row\\n                config:\\n                  style: \\"margin-top: 10px; padding-left: 45px; font-size: 30px; letter-spacing: 1.77px;\\"\\n                elements:\\n                  - type: col\\n                    elements:\\n                      - type: attribute\\n                        name: documentNumber\\n                        part: data\\n                        config:\\n                          style: \\"display: inline-block; text-transform: uppercase;\\"\\n                      - type: content\\n                        text: <0\\n                        config:\\n                          style: \\"display: inline-block; text-transform: uppercase;\\"\\n                      - type: attribute\\n                        name: issuingStateCode\\n                        part: code\\n                        config:\\n                          style: \\"display: inline-block; text-transform: uppercase;\\"\\n                      - type: content\\n                        text: \\"0000000\\"\\n                        config:\\n                          style: \\"display: inline-block; text-transform: uppercase;\\"\\n                      - type: attribute\\n                        name: sex\\n                        part: code\\n                        config:\\n                          style: \\"display: inline-block; text-transform: uppercase;\\"\\n                      - type: content\\n                        text: 0000000<<<<<<<<<<<<<<<<0\\n                        config:\\n                          style: \\"display: inline-block; text-transform: uppercase;\\"\\n  - config:\\n      style: \\"width: 980px; height: 700px; margin: 0;\\"\\n      background_image: SAI:zQmQQgMSzaL8LkkxSR9FsZYBsU4ouoMXxNTXF6uuAtZEPkg\\n      name: Page 1\\n    elements:\\n      - type: row\\n        config:\\n          style: \\"height: 160px;\\"\\n        elements:\\n      - type: row\\n        elements:\\n          - type: col\\n            size: 4\\n          - type: col\\n            size: 4\\n            config:\\n              style: \\"display: flex; justify-content: center;\\"\\n            elements:\\n              - type: attribute\\n                name: signatureImage\\n                part: data\\n          - type: col\\n            size: 4\\nlabels:\\n  passport:\\n    en: Passport\\n    fr: Passeport\\n"
+}
+
+
+

Code snippet for a Credential Layout Overlay

Form Layout Overlay

A Form Layout Overlay defines presentation information required by an application to display a digital form.


+{
+  "capture_base": "EPMaG1h2hVxKCZ5_3KoNNwgAyd4Eq8zrxK3xgaaRsz2M",
+  "type": "spec/overlays/form_layout/1.0",
+  "layout": "rows:\\n  - config:\\n      style: 'justify-content: space-between;'\\n    elements:\\n      - type: meta\\n        name: language\\n      - type: meta\\n        name: name\\n  - elements:\\n      - type: meta\\n        name: description\\n  - config:\\n      style: 'border-style: dashed;'\\n    elements:\\n      - type: category\\n        name: _cat-1_\\n  - elements:\\n      - type: attribute\\n        name: documentType\\n        part: input\\n      - type: attribute\\n        name: issuingStateCode\\n        part: input\\n      - type: attribute\\n        name: documentNumber\\n        part: input\\n  - config:\\n      style: 'border-style: dashed;'\\n    elements:\\n      - type: category\\n        name: _cat-2_\\n  - elements:\\n      - type: attribute\\n        name: primaryIdentifier\\n        part: input\\n      - type: attribute\\n        name: secondaryIdentifier\\n        part: input\\n      - type: attribute\\n        name: nationality\\n        part: input\\n      - type: attribute\\n        name: dateOfBirth\\n        part: input\\n      - type: attribute\\n        name: placeOfBirth\\n        part: input\\n      - type: attribute\\n        name: sex\\n        part: input\\n      - type: attribute\\n        name: optionalPersonalData\\n        part: input\\n  - config:\\n      style: 'border-style: dashed;'\\n    elements:\\n      - type: category\\n        name: _cat-3_\\n  - elements:\\n      - type: attribute\\n        name: dateOfIssue\\n        part: input\\n      - type: attribute\\n        name: issuedBy\\n        part: input\\n  - config:\\n      style: 'border-style: dashed;'\\n    elements:\\n      - type: category\\n        name: _cat-4_\\n  - elements:\\n      - type: attribute\\n        name: signatureImage\\n        part: input\\n  - config:\\n      style: 'border-style: dashed;'\\n    elements:\\n      - type: category\\n        name: _cat-5_\\n  - elements:\\n      - type: attribute\\n        name: photoImage\\n        part: input\\n"
+}
+
+

Code snippet for a Form Layout Overlay

Sensitive Overlay

A Sensitive Overlay defines attributes not necessarily flagged in the Capture Base that need protecting against unwarranted disclosure. For example, data that requires protection for legal or ethical reasons, personal privacy, or proprietary considerations.

TODO
+
`,25);function T(E,j){const t=i("ExternalLinkIcon");return p(),r("div",null,[q,a("p",null,[y,a("a",k,[g,s(t)]),v]),f,a("p",null,[h,a("a",b,[x,s(t)]),_,a("a",O,[w,s(t)]),I]),z,a("p",null,[C,a("a",S,[D,s(t)]),N]),A])}var M=o(m,[["render",T],["__file","v1.1.0-rc.html.vue"]]);export{M as default}; diff --git a/assets/v1.1.0-rc.html.4be20950.js b/assets/v1.1.0-rc.html.4be20950.js new file mode 100644 index 0000000..cd7c026 --- /dev/null +++ b/assets/v1.1.0-rc.html.4be20950.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-0c525774","path":"/v1.1.0-rc.html","title":"OCA Spec - 1.1.0-rc","lang":"en-US","frontmatter":{"title":"OCA Spec - 1.1.0-rc","description":"Official OCA specification"},"excerpt":"","headers":[{"level":2,"title":"Version 1.1.0-rc","slug":"version-1-1-0-rc","children":[{"level":3,"title":"Changelog","slug":"changelog","children":[]}]},{"level":2,"title":"Introduction","slug":"introduction","children":[]},{"level":2,"title":"Capture base","slug":"capture-base","children":[{"level":3,"title":"Attribute name","slug":"attribute-name","children":[]},{"level":3,"title":"Attribute type","slug":"attribute-type","children":[]},{"level":3,"title":"Flagged attributes","slug":"flagged-attributes","children":[]}]},{"level":2,"title":"Overlays","slug":"overlays","children":[]},{"level":2,"title":"Semantic Overlays","slug":"semantic-overlays","children":[{"level":3,"title":"Character Encoding Overlay","slug":"character-encoding-overlay","children":[]},{"level":3,"title":"Format Overlay","slug":"format-overlay","children":[]},{"level":3,"title":"Information Overlay","slug":"information-overlay","children":[]},{"level":3,"title":"Label Overlay","slug":"label-overlay","children":[]},{"level":3,"title":"Meta Overlay","slug":"meta-overlay","children":[]},{"level":3,"title":"Standards Overlay","slug":"standards-overlay","children":[]}]},{"level":2,"title":"Inputs Overlays","slug":"inputs-overlays","children":[{"level":3,"title":"Cardinality Overlay","slug":"cardinality-overlay","children":[]},{"level":3,"title":"Conditional Overlay","slug":"conditional-overlay","children":[]},{"level":3,"title":"Entry Code Overlay","slug":"entry-code-overlay","children":[]},{"level":3,"title":"Entry Overlay","slug":"entry-overlay","children":[]},{"level":3,"title":"Unit Overlay","slug":"unit-overlay","children":[]}]},{"level":2,"title":"Transformation Overlays","slug":"transformation-overlays","children":[{"level":3,"title":"Mapping Overlay","slug":"mapping-overlay","children":[]},{"level":3,"title":"Masking Overlay","slug":"masking-overlay","children":[]},{"level":3,"title":"Subset Overlay","slug":"subset-overlay","children":[]}]},{"level":2,"title":"Presentation Overlays","slug":"presentation-overlays","children":[{"level":3,"title":"Credential Layout Overlay","slug":"credential-layout-overlay","children":[]},{"level":3,"title":"Form Layout Overlay","slug":"form-layout-overlay","children":[]},{"level":3,"title":"Sensitive Overlay","slug":"sensitive-overlay","children":[]}]}],"git":{"updatedTime":1698417852000},"filePathRelative":"v1.1.0-rc.md"}');export{e as data}; diff --git a/community.html b/community.html new file mode 100644 index 0000000..52780a0 --- /dev/null +++ b/community.html @@ -0,0 +1,33 @@ + + + + + + + + + OCA Community | Overlays Capture Architecture + + + + +

OCA Community

OCA Community is an open forum on Matrix that welcomes you to join and ask questions about OCA, learn how to implement OCA and discuss where OCA can apply.

If you want to get involved in further developing the OCA specification, please sign up for the Human Colossus Foundation newsletter open in new window to stay tuned for the official launch of the Decentralised Semantics Working Group.

If you want to report bugs and offer feedback on features, you can do so directly via GitHub Issues open in new window.

Last Updated:
+ + + diff --git a/contribute.html b/contribute.html new file mode 100644 index 0000000..fc9bfc6 --- /dev/null +++ b/contribute.html @@ -0,0 +1,33 @@ + + + + + + + + + Overlays Capture Architecture + + + + + + + + diff --git a/ecosystem/getting-started.html b/ecosystem/getting-started.html new file mode 100644 index 0000000..d39011c --- /dev/null +++ b/ecosystem/getting-started.html @@ -0,0 +1,44 @@ + + + + + + + + + Getting started | Overlays Capture Architecture + + + + +

Getting started

Quick Start

To serve OCA ecosystem on your machine, run the following commands in your command line:

curl https://raw.githubusercontent.com/THCLab/oca-ecosystem/main/docker-compose.yml > docker-compose.yml
+docker-compose up
+

This command will serve OCA Browseropen in new window on port 8000 by default.

with default layouts

for f in examples/swiss_passport/entries/*; do;
+  curl -X POST "http://localhost:9293/api/v1/files" -H "accept: */*" -H "Content-Type: multipart/form-data" -F "file=@$f";
+done;
+

Hosting entries in Data Vault allows to reuse complex entries in many OCAs. You can link Entry Code Overlay or Entries Overlay with entries in Data Vault by it's SAI instead of keeping all entries data inside Overlays.

  • Go to Preview and select OCA Bundle file
  • As a result OCA Form and Credential are rendered with default layouts

custom layouts

for f in examples/swiss_passport/assets/*; do;
+  curl -X POST "http://localhost:9293/api/v1/files" -H "accept: */*" -H "Content-Type: multipart/form-data" -F "file=@$f";
+done;
+

Assets may be images, fonts etc. used in custom layout.

  • In Develop -> XLS to OCA Converter select XLS file as before
  • In Select Credential Layout file and Select Form Layout file fields select downloaded layouts files
  • Click Convert button and download generated file (OCA Bundle)
  • Download entries filesopen in new window and upload them to data-vault with listed command:
for f in examples/swiss_passport/entries/*; do;
+  curl -X POST "http://localhost:9293/api/v1/files" -H "accept: */*" -H "Content-Type: multipart/form-data" -F "file=@$f";
+done;
+
  • Go to Preview and select OCA Bundle file
  • As a result OCA Form and Credential are rendered with custom defined layouts

Learn more about defining custom layouts

OCA References

TODO

Tutorial

Defining OCA in xls file

Last Updated:
+ + + diff --git a/ecosystem/oca-browser.html b/ecosystem/oca-browser.html new file mode 100644 index 0000000..84ed7e1 --- /dev/null +++ b/ecosystem/oca-browser.html @@ -0,0 +1,33 @@ + + + + + + + + + OCA Browser | Overlays Capture Architecture + + + + +

OCA Browser

The OCA Browser is an utility to create and preview OCA Bundles using WEB interface. The OCA Browser supports:

  • form preview, so how the data can be captured using this bundle,
  • credential preview, so how the data can be presented using this bundle.

Try it

An instance of the OCA Browser is ready for you, under our Argo sandbox where you can play with it without the need to look into the code. You can find it HEREopen in new window

But if you are brave enough and ready for hands-on activity keep reading.

Installation

Navigate to the OCA Browser repositoryopen in new window to download latest source code. It comes with a Dockerfile and it is possible to pack it as a service into Docker image and run as a container.

Alternatively, there is a pre-baked docker-compose.yml fileopen in new window that includes OCA Repository, Browser and Data Vault already configured. To run it locally, download the compose file and then run docker compose up in the directory with docker-compose.yml.

TIP

It can be a viable alternative to use OCA Browser that is already established. For that, visit OCA Browseropen in new window page.

Example

Navigate to the exampleopen in new window and download XLS file along with layouts.

  • Navigate to the develop menu item and provide all required files. If the transformation process succeeded, next to convert button a link will pop up that follows to a newly created OCA Bundle.
  • Go to preview menu item and upload OCA Bundle. A form and credential preview will be shown.
Last Updated:
+ + + diff --git a/ecosystem/oca-bundle.html b/ecosystem/oca-bundle.html new file mode 100644 index 0000000..3a93f47 --- /dev/null +++ b/ecosystem/oca-bundle.html @@ -0,0 +1,33 @@ + + + + + + + + + OCA Bundle | Overlays Capture Architecture + + + + + + + + diff --git a/ecosystem/oca-data-vault.html b/ecosystem/oca-data-vault.html new file mode 100644 index 0000000..69441ad --- /dev/null +++ b/ecosystem/oca-data-vault.html @@ -0,0 +1,33 @@ + + + + + + + + + Overlays Capture Architecture + + + + +

OCA Data Vault

OCA Data Vault is a simple PoC data storage implementation showcasing how to consume and provide data described by OCA.

This project implementation is for showcasing purposes only, not for production systems or real-life use cases.

Last Updated:
+ + + diff --git a/ecosystem/oca-file.html b/ecosystem/oca-file.html new file mode 100644 index 0000000..8611ffa --- /dev/null +++ b/ecosystem/oca-file.html @@ -0,0 +1,33 @@ + + + + + + + + + Overlays Capture Architecture + + + + +

Introduction

This section is informative

Since day one, OCA constructs, called OCA Bundles, were created using XLS spreadsheets. The XLS-based template defined within a spreadsheet enabled the creation of matrices with rows as attributes and columns as metadata for these attributes. As versatile as error-prone, this solution is.

A different, unified and deterministic solution is required to enable the true power of long-term maintenance of OCA Bundles, the most fundamental building blocks of the OCA Ecosystem.

This document proposes a novel OCA Bundle long-term maintenance concept: OCAfile. The OCAfile consists of layers and is equipped with a custom Domain-Specific Language (DSL) to leverage OCA Bundles creation.

Main characteristics

This section is informative

Deterministic through layered architecture

The OCAfile benefits from the concept of versioning each new operation by building a provenance log of all operations made upon the Bundle since the genesis operation. Recall that a provenance log is an append-only log that consists of items, where each new item is defined as follows: digest(previous item) | current item. Calculating the digest upon it gives the current item (layer) digest. See below for a step-by-step example.

As digests determine layers, any new OCA Bundle construct might already benefit from a previously defined OCA Bundle. That is because both OCA Bundles might involve the same attribute names, for example. The directed acyclic graph keeps the layers in vertices (their digests). It ensures the unambiguous resolution of any layer.

Text based format

The OCAfile remains text based for readability

Pleasant DSL

The OCAfile relies on a domain-specific language (DSL) that is human and machine-readable to achieve deterministic layering. The DSL enables the creation and manipulation of the OCA Bundle during its lifetime.

Version control system compliant

As opposed to binary files, text files enable meaningful changes control under a version control system (VCS).

Last Updated:
+ + + diff --git a/ecosystem/oca-parser.html b/ecosystem/oca-parser.html new file mode 100644 index 0000000..58000fb --- /dev/null +++ b/ecosystem/oca-parser.html @@ -0,0 +1,35 @@ + + + + + + + + + OCA Parser | Overlays Capture Architecture + + + + +

OCA Parser

The OCA Parser enables creating OCA Bundles from XLS files. Using favorite XLS editor, the OCA Capture Base along with its overlays can be constructed. See our template fileopen in new window to get overview of how it has to be defined so that parser can read it properly and transform into OCA bundle.

OCA Parser is delivered as a binary and runs from command line interface.

TIP

It can be a viable alternative to use OCA Parser as a WEB service. Visit OCA Browseropen in new window page that allows to create OCA Bundles as well.

Download and installation

Navigate to the releases pageopen in new window to get latest available release.

Usage

Parser provides parse command for parsing XLS files. See ./parser.bin parse -h for more help.

Creating OCA bundle from XLS file

When OCA Bundle has been defined in XLS, use the following command to parse it into OCA bundle: ./parser.bin parse oca -p some_xls_file.xlsx Additionally --zip flag can be used that packs the bundle into zip file. An OCA Bundle may contain layout files that define the layout of OCA Capture Base on screen. Currently two types of layouts are supported and can be added into the bundle:

  • credential layout – for OCA bundle presentation purposes,
  • form layout – for OCA bundle data capture, or in other words how to render the form.

To add them into the bundle, parse command requires additional flags:

  • --credential-layout <credential-layout> Path to YAML file with Credential Layout.
  • --form-layout <form-layout> Path to YAML file with Form Layout.
Example

Navigate to the exampleopen in new window and download XLS file along with layouts. Use the following command:

./parser.bin parse oca -p simple_oca.xlsx --credential-layout credential.yml  --form-layout form.yml --zip
+

to create the OCA bundle that includes both layout files.

Creating OCA Code Table from XLS file

Parser has yet another parsing utility to create proper structure. When the Entry Overlay ought to refer to an external standard, ie. country codes or simply becomes too big in size to be a part of OCA bundle, it can be referred to an external source through its digest. This external source is the OCA Code Table that provides the entries.

See example code tableopen in new window created for the purpose to be ISO compliant for country codes. Using this code table, entry codes can be created using the following command:

./parser.bin parse  entries -p ISO_3166-1_alpha-2.xlsx  --zip
+

Finally, an empty template file can be found hereopen in new window.

Last Updated:
+ + + diff --git a/ecosystem/oca-presenter.html b/ecosystem/oca-presenter.html new file mode 100644 index 0000000..f2120f4 --- /dev/null +++ b/ecosystem/oca-presenter.html @@ -0,0 +1,33 @@ + + + + + + + + + OCA Presenter | Overlays Capture Architecture + + + + + + + + diff --git a/ecosystem/oca-repository.html b/ecosystem/oca-repository.html new file mode 100644 index 0000000..866421d --- /dev/null +++ b/ecosystem/oca-repository.html @@ -0,0 +1,34 @@ + + + + + + + + + OCA Repository | Overlays Capture Architecture + + + + +

OCA Repository

The OCA repository is a key concept of the OCA Ecosystem. It enables to manage, store and share OCA Objects like: OCA Bundles and OCAFiles . The interface is exposed through REST API open in new window.

The OCA repository operates under governance. It can be public (open access) or private (limited access).

Applications

The OCA repository serves as a central component in the ecosystem, providing storage, management, and sharing capabilities for various semantic needs. It supports multiple use cases, such as:

  • Storing verifiable credential schemas
  • Managing schemas for capturing and transforming data from IoT devices
  • Acting as a repository for document schemas
  • And more

Download and installation

docker pull humancolossus/oca-repository:latest
+

Usage

See OpenAPI Specificationopen in new window to get all available endpoints.

Concepts

  • OCA Repository implements content centric networking open in new window (CCN) concept tu uniquely identify all the resources stored in the repository. The resources are identified through SAID'sopen in new window so by calculating the product of the one way hash function, that becomes the identifier of the resource. By deriving SAID's from the content it creates cryptographic binding between identifier and the content.
  • No ambiguity of the content thanks to unambiguous identifiers.

Sandbox

An example of the OCA repository is hosted under Argo playground:

https://repository.oca.argo.colossi.network/open in new window

It is an example of public OCA repository where anyone can publish their own schema. Keep in mind that for this repository there is no authentication nor authorization means everything uploaded there is available publicy to everyone, use only for testing.

Last Updated:
+ + + diff --git a/ecosystem/oca-transformer.html b/ecosystem/oca-transformer.html new file mode 100644 index 0000000..c502054 --- /dev/null +++ b/ecosystem/oca-transformer.html @@ -0,0 +1,33 @@ + + + + + + + + + OCA Transformer | Overlays Capture Architecture + + + + + + + + diff --git a/ecosystem/oca-validator.html b/ecosystem/oca-validator.html new file mode 100644 index 0000000..29fe8c2 --- /dev/null +++ b/ecosystem/oca-validator.html @@ -0,0 +1,62 @@ + + + + + + + + + OCA Validator | Overlays Capture Architecture + + + + +

OCA Validator

OCA Validator enables entry (or an array of entries) verification against predefined rules, given by the OCA Bundle . The verification executed on an entry, that is a map of key-value pairs, encompasses:

Installation

Rust

[dependencies]
+oca_conductor = "0.2.6"
+oca_zip_resolver = "0.2.6"
+

Typescript and JavaScript (Node.JS based)

npm i oca-data-validator
+

Usage

Rust

use oca_conductor::data_set::DataSet;
+use oca_conductor::data_set::JSONDataSet;
+use oca_conductor::Validator;
+use oca_zip_resolver::resolve_from_zip;
+
+fn main() {
+    let oca_result = resolve_from_zip("oca_bundle.zip");
+    let mut validator = Validator::new(oca_result.unwrap());
+    validator.add_data_set(JSONDataSet::new(
+        r#"{ "email": "test@example.com", "licensess": ["A"] }"#.to_string(),
+    ));
+    let validation_result = validator.validate();
+    println!("{:?}", validation_result); // Ok(())
+}
+

See also tests open in new window available for validator module.

Typescript and JavaScript (Node.JS based)

import { resolveFromZip, Validator } from "oca-data-validator";
+
+const oca = resolveFromZip(`oca_bundle.zip`);
+let validator = new Validator(oca);
+
+const result = validator.validate({
+  'email': 'test@example.com',
+  'licenses': ["A"],
+});
+
+console.log(result); // true
+

See also hereopen in new window for more integration tests.

Last Updated:
+ + + diff --git a/ecosystem/tour.html b/ecosystem/tour.html new file mode 100644 index 0000000..372630d --- /dev/null +++ b/ecosystem/tour.html @@ -0,0 +1,33 @@ + + + + + + + + + OCA Ecosystem Tour | Overlays Capture Architecture + + + + +

OCA Ecosystem Tour

There are many additional concepts defined on top of OCA that on their own require further explanation. Thus, the OCA Ecosystem emerged as an umbrella for the building blocks. It bounds all the basic concepts that play important role in this ecosystem. Around the concepts, components are defined that come along with the reference implementation.

The OCA Ecosystem consists of the following components:

Refer also to the Basic Concepts section of the specification.

Ecosystem components applications

Preparing OCA bundle

Create OCA bundle

Context preserving data capture

Context preserving data capture

Data harmonization through data transformation

Context preserving data capture

Data presentation

OCA playground

OCA can be tested and developed on Argo, a dedicated sandbox environment hosted by Human Colossus Foundation.

Link to Argo: https://argo.colossi.network/open in new window

Last Updated:
+ + + diff --git a/guide/applications/index.html b/guide/applications/index.html new file mode 100644 index 0000000..970df9c --- /dev/null +++ b/guide/applications/index.html @@ -0,0 +1,33 @@ + + + + + + + + + Applications | Overlays Capture Architecture + + + + +

Applications

Although "data harmonisation" is the core characteristic of the Semantic domain, OCA must also support the "objectual integrity" of any digital object and its relationships with other objects.

Use case #1: Data transformation using overlays

Data transformation is a crucial data management requirement for integration, migration, data warehousing, and data preparation, involving converting data from one format to another (e.g., a database file, XML document or Excel spreadsheet). These modifications typically involve converting a raw data source into a cleansed, validated, and ready-to-use format. OCA allows an issuer to transform data morphologically, operating on subsets of data while maintaining information over the data supply chain. Applied to machine learning (ML), OCA thus enables direct linkage of an ML-generated image with the training data used to produce the final result. Separating overlays from the defined capture base offers a harmonisation solution between data models and data representation formats and from unstructured to structured data. Data harmonisation involves transforming datasets to fit together structurally while ensuring the definitional and contextual meaning of the source data is uniformly understood by all interacting actors, regardless of how it was collected initially.

Use case transformationFigure 3. Data transformation. Decentralised semantics offer a harmonisation solution between data models and data representation formats, or from unstructured to structured data.

By issuing and controlling a set of proprietary transformation overlays, purpose-driven service providers can securely map source attribute names, entry codes, or unit conversions to a standard capture base defined by either a centralised organisation or a multistakeholder data governance administration. Capture bases provide a substrate for data harmonisation. Specifically, a cryptographic link is established from the transformation overlays to a consensually-defined capture base, ensuring the integrity of those objectual relationships and facilitating a secure means for data harmonisation.

Transformation overlays include:

  • Attribute mapping
  • Entry code mapping
  • Subset
  • Unit mapping

Use case #2: Object presentation using overlays

In many instances of object presentation, the legal entity that issues the original data capture form may differ from the entity that issues the presentation objects required to produce an associated credential. For example, national passport issuance provides an opportunistic use case to demonstrate the advantages of this particular characteristic.

The International Civil Aviation Organization (ICAO) [3], a specialised agency of the United Nations [4], is tasked with planning and developing standards for safe international air transport. ICAO’s primary role is to provide standards that will help regulate aviation worldwide. One of those standards is ICAO Document 9303 [5] (endorsed by the International Organization for Standardization (ISO) [6] and the International Electrotechnical Commission (IEC) [7] as ISO/IEC 7501-1 [8]), a global standard for machine-readable travel documents (MRTD), including the data capture requirements of a machine-readable passport (MRP). As a result, ICAO is well-positioned to be the primary issuer of a standard capture base and the core overlays required for MRP form inputs, semantics, and presentation.

However, the issuance of any presentation objects needed to produce a national passport with branded design requirements would be under the remit of issuing governmental agencies, including cantonal passport offices in the country and at its embassies or consulates overseas. As an example for Switzerland, the Swiss Government is the authority to act as the primary issuer of presentation overlays to produce a branded Swiss passport, a credential identifying a traveller as a Swiss citizen or national with a right to protection while abroad, and a right to return to Switzerland. The capture base and overlays are identifiable by Self-Addressing IDentifiers (SAID) [9], a particular type of content-addressable identifier based on a self-referential cryptographic digest. These identifiers are deterministic. In other words, there is no randomness in the identifier generation process, ensuring the objectual integrity of the digital objects and their relationships.

Use case presentationFigure 4. Dynamic presentation. The decentralised control of presentation overlays within a governed ecosystem enables the autonomous rendering of different transient objects cryptographically bound to the same capture base.

In this particular use case, authorised Swiss governmental agencies would inevitably store an instance of the ICAO-issued MRP objects in local repositories. However, the SAIDs of those digital objects would remain unchanged from the original identifiers held in an ICAO repository. As the object identifiers are deterministic, the dynamic presentation of national passports, in this case, can be established securely by maintaining a cryptographic thread from the presentation overlays to a standard capture base for global standardisation. Note that a national passport is an example of a credential presentation. However, for different use cases, the presentation of other transient object types, such as digital forms, contracts, and receipts, would also benefit from the dynamic issuance of presentation overlays.

Presentation overlays include:

  • Layout
  • Sensitive

Use case #3: Internationalisation using language-specific overlays

Internationalisation involves designing and developing a product for target audiences that vary in culture, region, or language. The internationalisation of transient digital objects across ecosystems is essential for service providers to participate in a global market.

Let us take Switzerland as an example of a multilingual country. It is officially quadrilingual, with German, French, Italian, and Romansh as its national languages. However, many other minority languages, such as English, are becoming increasingly important. Since Switzerland is a federation, the sovereign cantons define their official language according to the primary language spoken by their inhabitants.

Use case i18nFigure 5. Internationalisation. Switzerland is a quadrilingual country. The decentralised control of language-specific overlays would enable cantonal authorities to translate official documents issued by the Swiss national federal government into their region’s official language(s).

Presenting information for a purpose-driven activity in a language understandable to all recipients has commonly involved replicating digital forms, credentials, notices, and contracts into various languages based on user preferences. With federated or centralised governance authorities maintaining digital objects in multiple languages, internal data management inefficiencies are common to many organisations, institutions, and governments.

The FAIR (Findable, Accessible, Interoperable, and Reusable) data principles [10] support the reusability of digital assets. Still, many legal entities have difficulty streamlining data management practices and processes to comply with these guiding principles.

OCA offers a solution for the internationalisation of digital objects within data ecosystems by enabling various authorised entities to control a different set of language-specific overlays for a particular transient object, such as a digital form, with a data governance administration defining and issuing a standard capture base and core language-agnostic or default language overlays.

With cantonal participation being an essential ingredient of Swiss-style federalism, separating language-specific overlays from any capture bases and core language-agnostic overlays issued by the federal government would enable a collaborative solution to internationalisation. In this scenario, decentralised semantics allow sets of language-specific overlays to be controlled and maintained by different cantons depending on their primary spoken language. In other words, distributed control of language-specific overlays would enable regional authorities to manage the official translation of any document issued by a national federal government into their region’s official language(s).

The above example is globally scalable, with OCA enabling the translation of any digital object under established governance while preserving its objectual integrity. More importantly, it significantly impacts objectual inclusiveness within digital systems. Within an ecosystem, OCA allows for transient object design in a particular language, where additional interoperable language-specific overlays, including those for minority or indigenous languages, can be added dynamically.

Whether defining schemas within a centralised organisation or a multistakeholder data governance administration, OCA offers a network-agnostic solution for data harmonisation within any governance framework.

Language-specific overlays include:

  • Entry
  • Information
  • Label
  • Meta

See Swiss Passport example in action.

Use case #4: Distributed custodianship of task-specific objects

Distributed custodianship of capture bases, overlays, code tables, and other assets enables the responsibility of separate tasks to reside with different actors without compromising the objectual integrity of the overall semantic structure. As a result, multiple actors from various institutions can contribute to developing schemas for complex use cases, supply chains, and data flows supported by multistakeholder data governance administrations and frameworks.

Use case #5: Internet of Things (IoT) applications using overlays

The Internet of Things (IoT) describes physical objects (or groups of such objects) with sensors, processing ability, software, and other technologies that connect and exchange data with other devices and systems over the Internet or other communications networks. IoT data collection involves using sensors to track the performance of devices connected to the Internet of Things. In addition, the sensors track the status of the IoT network by collecting and transmitting real-time data that is stored and retrieved at any moment.

IoT applications make continuous, thorough measurements possible through low-power and wireless sensor nodes. Many existing IoT measurement mechanisms focus on obtaining real-time measurements, enabling improved insights on changes in the measurand. The closeness between the measurement's result and the measurand's true value indicates the measurement's accuracy. As such, a unit, a factor used to express the quantity of the measurand, often accompanies the measurement as a standardised quantity defined and adopted by convention or law.

Aligning measurement units is particularly important in areas requiring data sharing or conversion between units. For example, independent IoT sensors may use different units to represent their measurements, and a mapping is needed when consolidating their data.

Use case presentationFigure 6. Unit conversions for measurements captured by IoT devices. Unit mapping overlays can be strongly bound to capture bases containing unit overlays with unit conversion tables providing recipes for seamless measurement conversions.

By issuing and controlling unit mapping overlays, purpose-driven service providers can provide source units for continuous measurements captured and transmitted by IoT devices. Capture bases and associated unit overlays issued and controlled by data governance administrations offer a target for unit harmonisation with unit conversion tables providing the recipe for seamless measurement conversions. Specifically, a cryptographic link is established from the unit mapping overlays to consensually-defined capture bases and unit overlays, ensuring the integrity of those objectual relationships and facilitating a secure means for unit harmonisation.

Overlays required for unit conversions include:

  • Unit mapping (source)
  • Unit (target)
Last Updated:
+ + + diff --git a/guide/applications/swiss-passport-example.html b/guide/applications/swiss-passport-example.html new file mode 100644 index 0000000..04f6b01 --- /dev/null +++ b/guide/applications/swiss-passport-example.html @@ -0,0 +1,73 @@ + + + + + + + + + Swiss Passport Example | Overlays Capture Architecture + + + + +

Swiss Passport Example

Below we introduce a step by step guidance of utilizing Semantic (Label) and Presentation Overlays in action for rendering credential – Swiss Passport specimen.

Create OCA Bundle

The process starts with defining the passport schema, including all the attributes, their types, formats, etc. For this purpose, an empty XLS template open in new window can be used or an already pre-baked template, available hereopen in new window. We will continue with the latter template.

The next step is to create OCA Bundle from the template and to do so, we will use the OCA Browser feature named Develop. Within our Sandbox, we host OCA Browser and we will use it to create the Bundle. The browser is accessible hereopen in new window.

In the Select OCA File we use pre-baked templateopen in new window. Select OCA references files we leave empty and for Credential and Form layout, we use these layoutsopen in new window.

To conduct the conversion, click on the convert button. If it succeeds, below you shall see the following: Success! Click here to download OCA Bundle.

Form and Credential preview

As the Bundle is created, we go to the next OCA Browser feature named Preview open in new window.

In the Pick OCA Bundle ZIP file upload the Bundle created in the previous step. As a result, in the FORM tab the form preview will be rendered. This is the preview of the OCA Bundle using presentation overlays in the WEB space.

Form and Credential translations

The pre-baked templateopen in new window comes with two translations: English and French. Any number can be added, but for the sake of this example, we use only these two.

In the preview, both, so the Form and Credential contain a select widget to change the translation.

In the CREDENTIAL tab a passport specimen can be seen. Notice it is only the preview of the layout and schema. The data entries are missing. For preview all these combined we will use different tool that can be accessible hereopen in new window.

We reuse the same OCA Bundle we created in the previous step. In the Preview record SAID we use pre-prepared data record with SAID: ESEFRI_In7btcko9ov2IElxTKogunrDcv187n9Be7Kvc. The data record behind is given as follows:

{
+  "documentType": "PA",
+  "issuingState": "CHE",
+  "issuingStateCode": "che",
+  "documentNumber": "c0000000",
+  "primaryIdentifier": "John",
+  "secondaryIdentifier": "Citizen",
+  "nationality": "CHE",
+  "dateOfBirth": "28.01.0000",
+  "personalNumber": "",
+  "sex": "M",
+  "placeOfBirth": "Luzern LU",
+  "optionalPersonalData": "170",
+  "dateOfIssue": "11.07.0000",
+  "issuedBy": "Luzern LU",
+  "dateOfExpiry": "11.07.0000"
+}
+

It is stored on https://data-vault.argo.colossi.network/open in new window. As a next step, click Load that triggers rendering the preview. This time data record is visible.

Custom data record

For preview any data record can be used. To do so, visit https://data-vault.argo.colossi.network/open in new window page where Swagger interface is available. Use the GET /files/{DRI} endpoint and then try it out button. As input provide known SAID: ESEFRI_In7btcko9ov2IElxTKogunrDcv187n9Be7Kvc and download the JSON file.

Changed JSON you can reupload to https://data-vault.argo.colossi.network/open in new window via POST /files endpoint and use the returned SAID as input for the Preview record SAID field.

Adding authentication taste

Whether the data can be proven to come from a verifiable source is the responsibility of an upper layer – the authentication layer. The authentication layer relies on public key cryptography. During the verification process, by verifying the signature along with the payload, it gives the non-repudiable answer whether the data has tampered.

In the following demo we introduce novel, authentication layer-related concepts:

Hereopen in new window we demonstrate a compact ACDC open in new window that represents the passport credential. The sample credential in the Issue section is defined as follows:

{
+  "v":"ACDC10JSON00011c_",
+  "i":"DdUXsE9lsnc5vbSOQVG8khiqe-ICXd6F-Gf5nkfWRxFs",
+  "s":"Eohm-VG6JcT2HwU9IvM_Ujp6lIgwhg34TvXUtVqv_L3I",
+  "a":"ESEFRI_In7btcko9ov2IElxTKogunrDcv187n9Be7Kvc",
+  "p":[],
+  "r":[],
+  "d":"EQD7oAeqJOWoWYzrI1cu_Bzipr3RcpBsGkThK_L1eUEA"
+}
+

It is a map of key-value pairs, where s and a are interesting in particular. s stands for schema, and a stands for attributes. In s we use SAID of the OCA Bundle from the above example and in a we use data record SAID from the above example. By doing this, we embedded OCA into the ACDC.

The ACDC itself is not yet signed and we sign it using public key cryptography. For the sake of the example, assume the key pair is generated from a 32 bytes seed MDM0ZjczNmEyMGM1NDUyZGI3M2E3ODU1MTVjOGJiZTU=. Using private key of such key pair, this creates the 64 bytes length signature T6XBbjKSISmpJN9WMRxw3ay+6oL3ww0K0AbQGLP4Mx3McTd8LMQ0Un0RKUnHtH5WR2yhb6r+SSuO43iZddloDA==. (using ED25519 algorithm). We can verify the signature using JavaScript and tweetnacl library. The following code snippet presents the verification:

let nacl = require("tweetnacl");
+
+let keypair = nacl.sign.keyPair.fromSeed(
+  Buffer.from("MDM0ZjczNmEyMGM1NDUyZGI3M2E3ODU1MTVjOGJiZTU=", "base64")
+);
+let result = nacl.sign.detached.verify(
+  Buffer.from(`{"v":"ACDC10JSON00011c_","i":"DdUXsE9lsnc5vbSOQVG8khiqe-ICXd6F-Gf5nkfWRxFs","s":"Eohm-VG6JcT2HwU9IvM_Ujp6lIgwhg34TvXUtVqv_L3I","a":"ESEFRI_In7btcko9ov2IElxTKogunrDcv187n9Be7Kvc","p":[],"r":[],"d":"EQD7oAeqJOWoWYzrI1cu_Bzipr3RcpBsGkThK_L1eUEA"}`, "utf8"),
+  Buffer.from(
+    "T6XBbjKSISmpJN9WMRxw3ay+6oL3ww0K0AbQGLP4Mx3McTd8LMQ0Un0RKUnHtH5WR2yhb6r+SSuO43iZddloDA==",
+    "base64"
+  ),
+  keypair.publicKey
+);
+console.log(result); // true
+

Skipping all the details related to the authentication layer, that take place before the presentation layer is employed, we can finally render credential directly from an ACDC credential to see the passport specimen preview. The OCA Bundle containing all the details for presentation is unknown to the ACDC, therefore it has to be resolved from a third-party service, where the Bundle is stored. It can be an OCA Repository instance, however, it is not essential. OCA Bundle can be stored anywhere from AWS S3 to IPFS.

Last Updated:
+ + + diff --git a/guide/faq.html b/guide/faq.html new file mode 100644 index 0000000..5e73708 --- /dev/null +++ b/guide/faq.html @@ -0,0 +1,33 @@ + + + + + + + + + FAQ | Overlays Capture Architecture + + + + +

FAQ

How do you define the data capture and exchange process?

OCA defines both schema (for persistent database records) and forms (for transient credentials) in data capture. For example, in the covid certificate scenario, this would be the granular data capture definitions required for structured vaccination credentials, COVID-19 antigen test credentials, and COVID-19 citizen recovery credentials.

OCA brings a common architecture for defining source structures from which to transform to a specific target structure in terms of data exchange. For example, for the covid certificate scenario, this would be the transformation process from OCA schemas to W3C-compliant Verifiable Credentials.

OCA offers a solution to two distinct areas of data management: (i.) data harmonisation, which involves transforming datasets to fit together in a common architecture; and (ii.) semantic harmonisation, the process of ensuring that – as part of data harmonisation – the meaning and context of data remains uniformly understood by all interacting actors, regardless of how it was collected initially. In other words, OCA harmonises database models. In addition, it is a solution to semantic harmonisation between data models and data representation formats.

Since the capture base in OCA defines a purest single dataset as the stable base, what is the principle of defining purest?

By “purest”, we mean the most generic base objects to preserve data context and enable seamless global data harmonisation.

The main objective of OCA is to ensure that data context is not lost further into the data pipeline. Instead of each different jurisdiction defining its capture bases, OCA encourages the reuse of existing artefacts (capture bases and overlays) by allowing jurisdictions to extend schema definitions based on their local rules and regulations for preserving context. By encouraging the reuse of OCA artefacts, the chance for data language unification increases. Since creating one global data model for all use cases is impossible, OCA focuses on unifying context, not on attribute names and set naming conventions. In this way, OCA enables seamless global data harmonisation across jurisdictions. As with other ontologies, global data governance authorities would define the schema definitions and share them with associated jurisdictional authorities.

In context, data harmonisation would involve every national public health agency creating a mapping overlay to map from their source attributes to those defined in a generic capture base. The capture base should be uniform for all countries, jurisdictions and locales. Ideally, the standard format of the capture bases would be defined and agreed upon by an international consortium of data governance authorities (e.g., public health agencies). In the covid credential scenario, eHealth Network effectively took on that role for the EU. The World Health Organisation would be a good option for obtaining global consensus on standard capture bases for a global pandemic.

Why is OCA useful for data decentralisation?

By data decentralisation, we mean freeing up data for societal benefit. For example, in the covid certificate scenario, the World Health Organisation could search for structured real-time data for global analytics and trend analysis to monitor the disease response throughout the pandemic. OCA supports this process by providing a stable foundation for data harmonisation where all captured data is in a uniform structure for data aggregation.

Because data lakes contain contextual issues with stored data, OCA aligns with a trustworthy data mesh instead where data resides within purpose-based domains. This ethos changes the current mindset from siloed aggregation with weak data context ("I have it but do not understand it") to requesting data from decentralised sources with well-structured context ("I understand it and have access when needed"). OCA enables this mindset shift by decoupling semantic context from the data, allowing both semantic queries and semantic+data queries. In addition, interfaces provide access to the data where OCA definitions help construct criteria requests based on well-maintained context.

OCA supports a content-based network where self-addressing identifiers represent the data rather than the data location, allowing explicit consent and data sharing rules to be cryptographically bound to the payload while allowing permissioned access to data for social benefit in global, jurisdictional, or local ecosystems. In short, OCA does not dictate how or where countries, jurisdictions and locales should store data. That is up to the requirements of the use case and any business requirements. For example, in the covid certificate scenario, as long as the World Health Organisation can request access to stored anonymised data for each country (formatted to OCA), the structured data could be used for trend analysis.

How does OCA protect privacy?

It is important to note that OCA is a data capture architecture. It defines the format of data capture at the point of system ingestion. It is not a rules engine. In other words, if a verifier wants to cache data, they can do that. That is their business. However, OCA does contain a blinding block, which allows the issuer to flag any attributes that could potentially unblind the identity of a governing entity. With identifying attributes flagged in the capture base, all corresponding data can be treated as sensitive throughout the data lifecycle and encrypted or removed at any stage, thus reducing the risk of identifying governing entities in blinded datasets. OCA does not dictate how flagged data should be encrypted. That is a secondary process step that a rules engine would define.

By introducing deterministic identifiers for all semantic objects (i.e., self-addressing identifiers), data remains traceable throughout the ecosystem. In addition, the Data Subject can control data usage throughout the lifecycle by leveraging ACDC (Authentic Chain Data Containers). Auditors also have a mechanism to efficiently audit the transaction log, checking if the verifier has consent for caching the data.

Will OCA be used in the rules engine mentioned in the GHP blueprint?

Rules engines are software systems that execute one or more business rules in a runtime production environment. They would deal with any executable processing beyond the initial data capture process, including algorithmic processing such as masking rules and encryption techniques on flagged data. Take processing of an event recipient’s name where an OCA capture base contains the attributes givenName (e.g., “Paul”), middleName (e.g., “Kaine”), and familyName (e.g., “Knowles”), for example. A particular jurisdiction (e.g., the Canadian government) might only want to see the resolution of the first letter of the given name and the family name (e.g., “P Knowles”). A rules engine, not OCA, would perform that processing step. In other words, in the context of the GHP blueprint, OCA schema attributes can be referenced by rules engines. The rules engines would define the data resolution in a paper-based or digital credential according to the requirements of the jurisdiction it serves.

OCA artefacts are verifiable, a necessary characteristic for a secure system. Without that characteristic, weak fundamentals would underpin any associated rules definitions, introducing an added security risk to the system.

What is the bottleneck of rule engine and OCA implementation?

The main bottleneck is a lack of funding to help drive the first GHP reference implementation. A few expert developers and subject matter experts are continuing to contribute to the reference implementation cause, but we have to pay developers for their time. It would be great to see some corporate organisations that will benefit from the GHP implementation work set aside some funds to help expedite the development process. As things currently stand, that has not happened yet. OCA can ensure high data quality, but we need a strong reference implementation guide to pitch to governments to demonstrate globally interoperable health and travel passes in a production environment. Lack of funding is the main bottleneck at this stage.

Could you please explain "OCA follows a content-centric networking (CCN) approach with a SAID referencing each object"?

A content-centric network is an approach where the focus is not where the data is but what it is. That changes security applications, where self-addressing identifiers represent the data rather than the data location. In this manner, security can be applied to the data as it moves through the data lifecycle. On the flip side, if securing the data location were the focus, different security rules could apply for each different location.

To confuse matters, the identity community is now using self-addressing identifiers (SAI) rather than Self-Addressing Identifier (SAID). The joys of working with moving semantic terminology! In any case, to consider data to be both authentic and secure, SAIs must be applied.

OCA supports a content-based network where SAIs represent the data rather than the data location, allowing explicit consent and data sharing rules to be cryptographically bound to the data payload while allowing permissioned access to data for social benefit in global, jurisdictional, or local ecosystems.

If some authentic organization proposes a new solution B that defines a standard schema/format and directly maps each countries/regions current schema/format to this standard schema/format, what is the advantage of OCA compared with this solution B

As described in the official documentation, the beauty of OCA is that the architecture is extensible by design. Thus, in addition to the core overlays, there will inevitably be other optional overlays to include in the stack in future: e.g., a Mapping Overlay, a Type Overlay, a Unit Overlay, and a Cardinality Overlay. Overlay extensibility makes OCA a powerful solution for semantic harmonisation, ensuring that the meaning and context of data remains uniformly understood by all interacting actors.

OCA provides a seamless solution for language translations (one does not need to duplicate the other JSON layers to translate into other languages). However, it goes much deeper than that. It works better for ALL colouration points in a schema. It is all about maintaining rich context throughout the journey of the data lifecycle. That cannot happen at an attribute level without preserving the context of each attribute in association with the other attributes in the schema. In other words, context is maintained at a schema level, not at an attribute level. For example, an issuer may need to store cardinality information for each attribute (i.e., Required/Optional). That can change per jurisdiction, but, more importantly, the governance decision behind each of those inputs is dependent on the attribute's relationship with all of the other schema attributes in context. Once that rich context is lost and the data resides in an aggregated data set for statistical analysis, the generated insights can become inaccurate. OCA was built specifically for that purpose.

Without OCA, issuers face the same problems that exist in the current data landscape. OCA is an architecture that addresses harmonisation, security and extensibility of its artefacts over time.

Last Updated:
+ + + diff --git a/guide/introduction.html b/guide/introduction.html new file mode 100644 index 0000000..53af066 --- /dev/null +++ b/guide/introduction.html @@ -0,0 +1,33 @@ + + + + + + + + + Introduction | Overlays Capture Architecture + + + + +

Introduction

Semantic domain

Semantic domain [passive] / the meaning and use of what is put in, taken in, or operated on by any process or system.

What is Data semantics?

Data semantics is the study of the meaning and use of specific pieces of data in computer programming and other areas that employ data. When studying a language, semantics refers to what individual words mean and what they mean when put together to form phrases or sentences. Data semantics focuses on how a data object represents a concept or object in the real world.

What is Decentralised semantics?

Decentralised semantics is a term that describes the separation of semantic (“definitional”) and pragmatic (“contextual”) tasks into task-specific objects that, when combined, provide a digital representation of a complex object.

In data processing, metadata is definitional data that provides information about or documentation of other data managed within an application or environment. Contextual data is the background information that provides a broader understanding of an event, person, or item.

Overlays overviewFigure 1. Decentralised semantics. A complex digital object shown as an amalgamation of task-specific objects.

In the domain of decentralised semantics, task-specific objects are called "Overlays". They provide layers of definitional or contextual information to a stable base object called a “Capture Base”.

Decentralised semantics requires the provision of deterministic object identifiers. An object is deemed deterministic if any operation’s result and final state depend solely on the initial state and the operation’s arguments. Object identifiers must be resolvable via the object's digest to be deemed deterministic.

Why decentralise semantics?

Working across governance boundaries is tricky because there is no common language of communication between digital ecosystems open in new window. How can we hope to understand one another when we speak different languages? Add to that the complexities of language evolution and diverse governance frameworks; maintaining proper context is challenging in the current digital landscape.

The primary objective of decentralised semantics is "data harmonisation", which refers to all efforts to combine data from different sources and provide users with an equivalent view of data from various studies. This objective involves the morphologic ("structural"), semantic ("definitional"), and pragmatic ("contextual") harmonisation of digital objects for a common purpose. It also provides an opportunity to structure unstructured data while offering a long-term solution for data language unification within and across distributed data ecosystems. Pending successful data harmonisation within a distributed data ecosystem, content provided by “overlays” underpins structured search queries for improved insights and analytics. The key benefit of decentralised semantics is the "distributed custodianship" of task-specific objects (see Distributed custodianship of task-specific objects for more information on distributed custodianship) without compromising the objectual integrity of the overall semantic structure. Furthermore, object interoperability is essential in an agile data economy where multiple actors from various institutions participate in complex use cases, supply chains, and data flows supported by multi-stakeholder data governance administrations and frameworks. Decentralised semantics offers an evolutionary implementation for domain-driven design, an approach to software development that centres the development on programming a domain model with a rich understanding of the processes and rules of a domain.

What is Overlays Capture Architecture (OCA)?

Overlays Capture Architecture (OCA) is an explicit representation of task-specific objects that have deterministic relationships with other objects. These “Overlays” define individual semantic tasks, which, when combined, provide additional context to the object. An OCA bundle consists of a “Capture Base” and “Overlays”. The sum of its parts represents a contextually-rich schema.

The segregation of overlays by task enables interoperability in the construction process of any digital object without compromising the integrity of the semantic structure, modular components, or the relationship between those objects.

Overlays to formFigure 2. Semantic interoperability. Segregating task-specific objects (overlays) within a standard architecture enables different authorised controllers to update specific structural, definitional, or contextual components of the same semantic structure.

OCA is ontology-agnostic, offering a harmonisation solution between data models and data representation formats while providing a roadmap to resolve privacy-compliant data sharing between servers, networks, and across sectoral or jurisdictional boundaries.

The deterministic interplay between overlays combined with the unicity of the composite bundle is proving to be an exciting field of research.

Benefits

OCA offers many advantages, including:

  • Simplified data pooling. Decoupling can occur at any time as overlays are linked objects. With all colouration definitions stored in the overlays, combining data from related sources becomes seamless. Overlays can be removed from the base objects before the data merging process and reapplied to ensure consistent colouration post data pooling.
  • Stable capture bases. Most schema updates occur at the application stage. In the case of OCA, all extension and colouration definitions are applied in the overlays, enabling issuers to edit one or more of the linked objects to create simple updates rather than reissue capture bases on an ongoing basis.
  • Flagged attributes for encryption. By referencing the Blinding Identity Taxonomy (BIT), issuers can flag attributes in the capture base that could potentially unblind the identity of a governing entity. With attributes flagged at the base object layer, all corresponding data can be treated as sensitive throughout a data lifecycle and encrypted or removed at any stage, making associated governing entity identification impossible.
  • Data decentralisation. Capture base definitions can remain in their purest form as a standard base to decentralise data. Thus, once the data holder has given adequate consent, data controllers can contribute anonymous data upon which 3rd parties can trigger granular criteria searches for matched data, eliminating the need for data silos and encouraging consented data sharing. In addition, self-determination regarding the secondary use of personal data empowers the data holder.
  • Internationalisation. A separate linked data object captures character set encoding definitions. Thus, a single report definition c:qaan contain different attribute forms for different languages available to users, based on a user's locale and other language preferences.

Concepts

OCA follows a content centric networkingopen in new window (CCN) approach by utilzing Self-Addressing Identifiersopen in new window (SAID) for deterministic content identification. For that reason OCA strongly relies on cryptographic security characteristics. Each OCA object is equipped with a SAID, which is cryptographically bound to the content of the object. SAID assures immutability and is deterministically generated directly from the content. Furthermore it can be verified without need to interact with any service or provider relying on.

A brief of history

For several years concept of OCA (formerly ODCA) was incubated within communities like Inputs and Semantics Working Groupopen in new window at Trust over IPopen in new window as well as Hyperledger Aries RFC-0014open in new window.

Last Updated:
+ + + diff --git a/guide/oca-vs-others-comparison.html b/guide/oca-vs-others-comparison.html new file mode 100644 index 0000000..ca80d81 --- /dev/null +++ b/guide/oca-vs-others-comparison.html @@ -0,0 +1,33 @@ + + + + + + + + + OCA vs others comparison | Overlays Capture Architecture + + + + +

OCA vs others comparison

Although OCA brings novel concepts to context preserving data capture and data harmonization, it is often being asked how it is different to what is already well-established in the industry. The next sections provide a detailed comparison of OCA vs. X technology.

OCA vs. JSON Schema

OCA vs. JSON-LD

OCA vs. Data Mesh

Last Updated:
+ + + diff --git a/guide/references.html b/guide/references.html new file mode 100644 index 0000000..8e440a2 --- /dev/null +++ b/guide/references.html @@ -0,0 +1,33 @@ + + + + + + + + + References | Overlays Capture Architecture + + + + + + + + diff --git a/images/cont-pres-data-capture.png b/images/cont-pres-data-capture.png new file mode 100644 index 0000000..69ac593 Binary files /dev/null and b/images/cont-pres-data-capture.png differ diff --git a/images/create-oca-bundle.png b/images/create-oca-bundle.png new file mode 100644 index 0000000..2682971 Binary files /dev/null and b/images/create-oca-bundle.png differ diff --git a/images/oca-logo-white.png b/images/oca-logo-white.png new file mode 100644 index 0000000..b3d9bc8 Binary files /dev/null and b/images/oca-logo-white.png differ diff --git a/images/oca-logo.png b/images/oca-logo.png new file mode 100644 index 0000000..c0ae53b Binary files /dev/null and b/images/oca-logo.png differ diff --git a/images/oca-transformation.png b/images/oca-transformation.png new file mode 100644 index 0000000..110c575 Binary files /dev/null and b/images/oca-transformation.png differ diff --git a/images/oca.png b/images/oca.png new file mode 100644 index 0000000..a41cef5 Binary files /dev/null and b/images/oca.png differ diff --git a/images/oca_overview.png b/images/oca_overview.png new file mode 100644 index 0000000..bc8a118 Binary files /dev/null and b/images/oca_overview.png differ diff --git a/images/overlays-overview.png b/images/overlays-overview.png new file mode 100644 index 0000000..520aa2b Binary files /dev/null and b/images/overlays-overview.png differ diff --git a/images/overlays-to-form.png b/images/overlays-to-form.png new file mode 100644 index 0000000..f7a22fb Binary files /dev/null and b/images/overlays-to-form.png differ diff --git a/images/rugby-input.png b/images/rugby-input.png new file mode 100644 index 0000000..4aa21a9 Binary files /dev/null and b/images/rugby-input.png differ diff --git a/images/rugby-semantic.png b/images/rugby-semantic.png new file mode 100644 index 0000000..0aa8e5f Binary files /dev/null and b/images/rugby-semantic.png differ diff --git a/images/si.png b/images/si.png new file mode 100644 index 0000000..b06b81b Binary files /dev/null and b/images/si.png differ diff --git a/images/spec-fig1.png b/images/spec-fig1.png new file mode 100644 index 0000000..31ca688 Binary files /dev/null and b/images/spec-fig1.png differ diff --git a/images/spec-fig2.png b/images/spec-fig2.png new file mode 100644 index 0000000..cc75c25 Binary files /dev/null and b/images/spec-fig2.png differ diff --git a/images/spec-fig3.png b/images/spec-fig3.png new file mode 100644 index 0000000..385fec7 Binary files /dev/null and b/images/spec-fig3.png differ diff --git a/images/spec-fig4.png b/images/spec-fig4.png new file mode 100644 index 0000000..3a80975 Binary files /dev/null and b/images/spec-fig4.png differ diff --git a/images/spec-table1.png b/images/spec-table1.png new file mode 100644 index 0000000..c2edc6e Binary files /dev/null and b/images/spec-table1.png differ diff --git a/images/spec-table2.png b/images/spec-table2.png new file mode 100644 index 0000000..a80cf7a Binary files /dev/null and b/images/spec-table2.png differ diff --git a/images/spec-table3.png b/images/spec-table3.png new file mode 100644 index 0000000..53cc9e6 Binary files /dev/null and b/images/spec-table3.png differ diff --git a/images/use-case-i18n.png b/images/use-case-i18n.png new file mode 100644 index 0000000..c001fb6 Binary files /dev/null and b/images/use-case-i18n.png differ diff --git a/images/use-case-presentation.png b/images/use-case-presentation.png new file mode 100644 index 0000000..ae0ef75 Binary files /dev/null and b/images/use-case-presentation.png differ diff --git a/images/use-case-transformation.png b/images/use-case-transformation.png new file mode 100644 index 0000000..7624c66 Binary files /dev/null and b/images/use-case-transformation.png differ diff --git a/images/use-case-transformation2.png b/images/use-case-transformation2.png new file mode 100644 index 0000000..3e77ad2 Binary files /dev/null and b/images/use-case-transformation2.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..2a205c2 --- /dev/null +++ b/index.html @@ -0,0 +1,33 @@ + + + + + + + + + Overlays Capture Architecture | Overlays Capture Architecture + + + + +

Overlays Capture Architecture

Official OCA resources

Introduction

Content driven

Immutable objects backed by Self-Addressing Identifiers cryptographically bound to the content, assure about security and portability

Simplified data pooling

Decoupling can occur at any time as overlays are linked objects. With all colouration definitions stored in the overlays, combining data from related sources becomes seamless.

Stable capture base

All extension and colouration definitions are applied in the overlays, enabling issuers to edit one or more of the linked objects to create simple updates rather than reissue capture bases on an ongoing basis.

Flagged attributes

Issuers can flag attributes in the capture base that could potentially unblind the identity of a governing entity

Internationalisation

A separate linked data object captures character set encoding definitions. Thus, a single report definition can contain different attribute forms for different languages.

Credential presentation

Support for flexible credential presentation, in secure and controled way

Composability

Cryptographically linked objects allow for high reusability, nesting, and referencing already existing capture base increasing interoperability of created objects.

Data validation

Ensure captured data records are OCA bundle schema compliant

Data transformation

Datasets transformation using tranformation overlays

+ + + diff --git a/specification/index.html b/specification/index.html new file mode 100644 index 0000000..cfa067d --- /dev/null +++ b/specification/index.html @@ -0,0 +1,349 @@ + + + + + + + + + OCA Technical Specification | Overlays Capture Architecture + + + + +

OCA Technical Specification

Latest published version:

https://oca.colossi.network/specification/open in new window (Download as PDFopen in new window)

Author:

Paul Knowles ( Human Colossus Foundation open in new window)

Editors:

Ryan Barrett (Stratosoft LLC)

Robert Mitwicki ( Human Colossus Foundation open in new window)

Michal Pietrus ( ArgonAUTHs open in new window)

Marcin Olichwiruk ( ArgonAUTHs open in new window)

Philippe Page ( Human Colossus Foundation open in new window)

Copyrights:
Human Colossus Foundation, EUPL v1.2 licence.
Governance:

The Decentralised Semantics Working Group maintains the OCA specification at Human Colossus Foundation open in new window. Comments regarding this specification can be provided as issues on the official OCA Github open in new window.

Contact:

contact@humancolossus.org

Disclaimer

Strictly following DDE Principle 1.4 [HCF2022], OCA schema objects MUST be resolvable solely upon the encoded cryptographic digest of their content to ensure objectual integrity.

All code snippets in this version of the document are in JavaScript Object Notation (JSON) [ISO21778] format. However, any serialisation format applies as long as all OCA objects have proper semantics.

Introduction

This section is non-normative.

How does OCA work?

OCA is based on the FAIR data principles [FAIR2016], a set of guiding principles to make data findable, accessible, interoperable, and reusable, to enable scientific data management and stewardship, and to be relevant to all digital economy stakeholders.

OCA represents transient objects (domain-agnostic) and persistent schemas (domain-specific) as multi-dimensional objects consisting of a stable capture base and interoperable overlays. By introducing overlays as linked task-specific objects within the schema stack, the architecture offers an optimal level of efficiency and interoperability in alignment with FAIR principles.

What is a Capture Base?

A Capture Base is the purest and simplest form of a schema, defining the structural characteristics of a dataset. It is the foundational layer upon which to bind task-specific objects to enhance the meaning of inputted data.

What are Overlays?

Overlays are task-specific objects that provide cryptographically-bound layers of definitional or contextual metadata to a Capture Base. Any actor interacting with a published Capture Base can use Overlays to transform how inputted data and metadata are displayed to a viewer or guide an agent in applying a custom process to captured data.

OCA object types

An OCA object is either a Capture Base or a task-specific Overlay with a deterministic relationship to a Capture Base. When amalgamated as a Bundle, OCA objects provide the necessary structural, definitional, and contextual information to determine the meaning of inputted data at the time of data capture.

Capture Base

A Capture Base is a stable base object that defines a single dataset in its purest form, providing a structural base to harmonise data. The object defines attribute names and types. It also contains a flagging block that allows schema issuers to mark potentially dangerous attributes that may capture identifying information about entities (i.e., personally identifiable information (PII) or quasi-identifiable information (QII)). Once flagged, all corresponding data can be treated as high-risk throughout the data lifecycle and encrypted or removed at any stage, reducing the risk of re-identification attacks against blinded datasets.

The Capture Base consists of the following attributes:

{
+   "type":"spec/capture_base/1.0",
+   "classification":"GICS:45102010",
+   "attributes":{
+      "dateOfBirth":"DateTime",
+      "documentNumber":"Text",
+      "documentType":"Array[Text]",
+      "fullName":"Text",
+      "height":"Numeric",
+      "issuingState":"Text",
+      "photoImage":"Binary",
+      "sex":"Text"
+   },
+   "flagged_attributes":[
+      "documentNumber",
+      "fullName",
+      "dateOfBirth",
+      "photoImage"
+   ]
+}
+

Example 1. Code snippet for a Capture Base.

Type

The type attribute identifies the schema object type.

type = "spec/capture_base/" sem_ver
+sem_ver = DIGIT "." DIGIT
+

Listing: ABNF core rules [RFC5234]

Classification

The "classification" attribute is for capturing a standardised classification scheme and taxonomy code to identify the primary sector, area, or topic of a published schema's intended use. Taxonomy codes provide a means for classifying schemas into groupings according to similar functions, markets, products, or services, ultimately leading to better search results for users interested in different categories.

Note: All classification schemes are supported. RECOMMENDED schemes include the Global Industry Classification Standard (GICS) [GICS] for industry sector classification and the Sustainable Development Goals (SDGs) [UNSDG] for the categorisation of humanitarian advocacy and outreach activities.

classification = taxonomy ":" identifier
+taxonomy = 1*( ALPHA / DIGIT / "-" )
+identifier = 1*( ALPHA / DIGIT / "-" / "." )
+

Listing: ABNF core rules

Example

For the GICS classification: "classification": "GICS:10101010"

For the SDG classification: "classification": "SDG:1.1"

Attributes

The "attributes" attribute maps key-value pairs where the key is the attribute name and the value is the attribute type.

Attribute name

An attribute name is a string that uniquely identifies an attribute within an OCA layer and is used to reference that attribute by other layers throughout the OCA bundle.

Attribute type

An attribute type determines the attribute's syntax and how attributes of that type are compared and sorted. A Capture Base recognises seven core data types:

  • Text: a data type that defines a human-readable sequence of characters and the words they form, subsequently encoded into computer-readable formats such as ASCII [RFC0020].

  • Numeric: a data type that defines anything relating to or containing numbers. Examples of numeric data types include 8-byte integers, fixed precision and scale numeric data, floating precision number data, integer (whole number) data, and monetary data values.

  • Reference: a data type that defines a Self-Addressing IDentifier (SAID) [SAID] that references a set of attributes through its associated parent. For example, the reference data type enables the development of nested data objects, where the organisation of information is in layers or where objects contain other similar objects. SAID is an identifier that is deterministically generated from and embedded in the content it identifies, making it and its data mutually tamper-evident.

  • Boolean: a data type where the data only has two possible variables: true or false. In computer science, Boolean is an identification classifier for calculating logical truth values and algebraic variables.

  • Binary: a data type that defines a binary code signal, a series of electrical pulses representing numbers, characters, and performed operations. Based on a binary number system, each digit position represents a power of two (e.g., 4, 8, 16, etc.). A set of four binary digits or bits in binary code represents each decimal number (0 to 9). Each digit has two possible states: off and on (usually symbolised by 0 and 1). Combining basic Boolean algebraic operations on binary numbers makes it possible to represent each of the four fundamental arithmetic operations of addition, subtraction, multiplication, and division.

  • DateTime: a data type that defines the number of seconds or clock ticks that have elapsed since the defined epoch for that computer or platform. Common formats include dates (e.g., YYYY-MM-DD), times (e.g., hh:mm:ss), dates and times concatenated (e.g., YYYY-MM-DDThh:mm:ss.sss+zz:zz), and durations (e.g., PnYnMnD).

    Note: The ISO 8601 [ISO8601] date and time format is the RECOMMENDED representation format for the dateTime data type, in which the Unix epoch is 1970-01-01T00:00:00Z.

    For the Unix epoch example:

    Data type: DateTime
    Character encoding: UTF-8 (default)
    Standard: ISO 8601
    Format: YYYY-MM-DDThh:mm:ssZ

  • Array[data type]: a data type that defines a structure that holds several data items or elements of the same data type. When you want to store many pieces of data that are related and have the same data type, it is often better to use an array instead of many separate variables (e.g., Array[Text], Array[Numeric], etc.).

Flagged attributes

Any attributes defined in a Capture Base that may contain identifying information about entities (i.e., personally identifiable information (PII) or quasi-identifiable information (QII)) can be flagged.

The Blinding Identity Taxonomy (BIT) [KAN2020] is a practical tool for any practitioner whose organisation has custody or control of a dataset containing identifiable information about entities, including a natural person, organisation, or device with signing capabilities that make that entity uniquely identifiable. For example, data protection officers and schema issuers can use the BIT to flag a list of elements which require cryptographic encoding to reduce the risk of identifying a data principal.

Overlays

Overlays are cryptographically-linked objects that provide layers of task-oriented definitional or contextual information to a Capture Base. Any actor interacting with a published Capture Base can use Overlays to add metadata to the underlying object, transform how information is displayed to a viewer, or guide an agent in applying a custom process to captured data.

Overlays consist of the following attributes:

Common attributes

Capture base

The capture_base attribute contains the SAID of the Capture Base to cryptographically anchor to that parent object.

Type

The type attribute identifies the schema object type.

type = "spec/overlay/" overlay_name "/" sem_ver
+overlay_name = ALPHA
+sem_ver = DIGIT "." DIGIT
+

Listing: ABNF core rules

Language

The International Organization for Standardization (ISO) [ISO] has standardised two lists of language-related codes: the language codes called ISO 639-1 alpha-2 [ISO639] codes ("Codes for the representation of names of languages") and ISO 3166-1 alpha-2 [ISO3166] codes ("Codes for the representation of names of countries"). Both consist of two letters. The language code is written in lowercase while the country code is written in uppercase. However, both ISO classifications may be combined to differentiate regional languages.

The language attribute MUST contain either the two-letter language code (lowercase) for a national language or the combined language (lowercase)/country (uppercase) code for a regional language or locale.

Table 1Table 1. An example of ISO standard values for language and combined language/country codes.

Semantic Overlays

Semantic overlays provide contextual meaning to describe objects and their relationships.

Fig 1Figure 1. In a balanced network, semantic overlays determine the meaning and use of what is put in, taken in, or operated on by any process or system.

Character Encoding Overlay

A Character Encoding Overlay defines the process of assigning numbers to graphical characters, especially the written characters of human language, allowing them to be stored, transmitted, and transformed using digital computers. Character encoding using internationally accepted standards permits worldwide interchange of text in electronic form.

In addition to the capture_base and type attributes (see Common attributes), the Character Encoding Overlay MAY include the following attributes:

  • default_character_encoding

    The "default_character_encoding" attribute specifies the default character encoding for the attributes contained in the parent Capture Base.

    The most common default character set is UTF-8 [RFC3629], which accounts for 98% of all web pages in the World Wide Web and up to 100.0% for some languages, as of 2021.

  • attr_character_encoding

    The attr_character_encoding attribute maps key-value pairs where the key is the attribute name and the value is the character encoding.

    Any attributes contained in the attr_character_encoding attribute override the behaviour of the default_character_encoding attribute.

    There are many encoding standards including Base64 [RFC4648], UTF-8, and ASCII to name a few. Each standard has a purpose, and applications using those encoding standards expect to receive data compliant with that encoding standard. The most popular types of character encoding are ASCII and Unicode [UNICODE]. While ASCII is still supported by nearly all text editors, Unicode is more commonly used because it supports a larger character set. Unicode is often defined as UTF-8, UTF-16 [RFC2781], or UTF-32 [ISO10646], which refer to different Unicode standards.

    An example of character encoding for a text format:

    Data type: Text
    Character encoding: UTF-8 (default)
    Standard: ReGex
    Format: [A-Z0-9]{9}

    An example of binary-to-text encoding for an image format:

    Data type: Binary
    Character encoding: Base64
    Standard: ISO/IEC 10918
    Format: image/jpeg

    {
    +  "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
    +  "type":"spec/overlays/character_encoding/1.0",
    +  "default_character_encoding":"utf-8",
    +  "attribute_character_encoding":{
    +      "photoImage":"base64"
    +  }
    +}
    +
    +

    Example 2. Code snippet for a Character Encoding Overlay.

Format Overlay

A Format Overlay defines an input and display format for data fields. The data format enables conversion of the input buffer to the program variable and displays program variable data to form fields.

In addition to the capture_base and type attributes (see Common attributes), the Format Overlay MUST include the following attribute:

  • attribute_formats

    The "attribute_formats" attribute maps key-value pairs where the key is the attribute name and the value is the format.

The inputted format values are dependent on the following core data types as defined by the attribute types in the Capture Base:

  • Text: The inputted format value for this core data type MAY be a regular expression [REGEX], a sequence of characters that specifies a search pattern in text.

  • Binary: The inputted format value for this core data type MAY be a MIME type registered with the Internet Assigned Numbers Authority (IANA) [IANA]

  • DateTime: The inputted format value for this core data type MAY be a date and time representation as defined by ISO 8601, a standard for the worldwide exchange and communication of date and time-related data.

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/format/1.0",
+   "attribute_formats":{
+      "dateOfBirth":"YYYY-MM-DD",
+      "documentNumber":"[A-Z0-9]{9}",
+      "photoImage":"image/jpeg",
+      "sex":"[A-Z]{1}"
+   }
+}
+

Example 3. Code snippet for a Format Overlay.

Information Overlay

[language-specific object]

An Information Overlay defines attribute field descriptions and usage notes to assist the data entry process or to add context to presented data.

In addition to the capture_base, type, and language attributes (see Common attributes), the Information Overlay MUST include the following attribute:

  • attribute_information

    The attribute_information attribute maps key-value pairs where the key is the attribute name and the value is the informational prose in a specific language.

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/information/1.0",
+   "language":"en",
+   "attribute_information":{
+      "dateOfBirth":"Holder’s date of birth as recorded by the issuing State or organization.",
+      "documentNumber":"Unique identification number of the document.",
+      "documentType":"The word for "passport" in the language of the issuing State or organization.",
+      "fullName":"Full name of the passport holder.",
+      "height":"Recorded height of the passport holder.",
+      "issuingState":"Name of the State or organization responsible for issuing the passport.",
+      "photoImage":"Portrait image of the passport holder.",
+      "sex":"Sex of the passport holder."
+   }
+}
+

Example 4. Code snippet for an Information Overlay (language: en).

Label Overlay

[language-specific object]

A Label Overlay defines attribute and category labels. For example, for an attribute named dateOfBirth, you may wish to display the label as Date of birth, which is more meaningful and user-friendly when displayed to an end user in places such as form inputs and error messages.

In addition to the capture_base, type, and language attributes (see Common attributes), the Label Overlay MUST include the following attribute:

  • attribute_labels

    The attribute_labels attribute maps key-value pairs where the key is the attribute name and the value is a human-meaningful attribute label in a specific language.

and MAY include the following attributes:

  • attribute_categories

    The attribute_categories attribute contains category identifiers.

  • category_labels

    The attribute_categories attribute maps key-value pairs where the key is the attribute name and the value is a human-meaningful category label in a specific language.

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/label/1.0",
+   "language":"en",
+   "attribute_labels":{
+      "dateOfBirth":"Date of birth",
+      "documentNumber":"Passport Number",
+      "documentType":"Document",
+      "fullName":"Name",
+      "height":"Height",
+      "issuingState":"Issuing State or organization (in full)",
+      "photoImage":"Portrait image",
+      "sex":"Sex"
+   },
+   "attribute_categories":[
+      "_cat-1_",
+      "_cat-2_",
+      "_cat-3_",
+      "_cat-4_"
+   ],
+   "category_labels":{
+      "_cat-1_":"Mandatory header",
+      "_cat-2_":"Mandatory personal data elements",
+      "_cat-3_":"Mandatory identification feature",
+      "_cat-4_":"Optional data elements"
+   }
+}
+

Example 5. Code snippet for a Label Overlay (language: en).

Meta Overlay

[language-specific object]

A Meta Overlay defines any language-specific information about a schema. It is used for discovery and identification and includes elements such as the schema name and description.

In addition to the capture_base, type, and language attributes (see Common attributes), the Meta Overlay SHOULD include the following attributes:

  • name

    The name attribute contains the name of the schema in a specific language.

  • description

    The description attribute contains a description of the schema in a specific language.

and MAY include other attributes at the discretion of the overlay producer, such as an "affiliation" attribute in the example below. How the overlay producer conveys the purpose of the additional attributes in the Meta Overlay is outside the scope of this specification.

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/meta/1.0",
+   "language":"en",
+   "name":"Digital Passport",
+   "description":"An example of a Digital Passport schema",
+   "affiliation":"The Government of Antarctica"
+}
+

Example 6. Code snippet for a Meta Overlay (language: en).

Standard Overlay

A Standard Overlay defines a documented agreement or technical specification published by a standards organisation used to represent, format, define, structure, tag, transmit, manipulate, use, and manage data.

In addition to the capture_base and type attributes (see Common attributes), the Standard Overlay MUST include the following attribute:

  • attr_standards

    The attr_standards attribute maps key-value pairs where the key is the attribute name and the value is the standard.

There are many international standards organisations establishing tens of thousands of standards covering almost every conceivable topic. The three largest and most well-established standards organisations are the International Organization for Standardization (ISO), the International Electrotechnical Commission (IEC) [IEC], and the International Telecommunication Union (ITU) [ITU]. Standards tend to contain the acronym of the standards organisation followed by an internal document identifier.

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/standard/1.0",
+   "attr_standards":{
+      "dateOfBirth":"ISO 8601"
+   }
+}
+

Example 7. Code snippet for a Standard Overlay.

Inputs Overlays

Inputs overlays provide predefined inputs for data attestations.

Fig 2Figure 2. In a balanced network, inputs overlays determine what is put in, taken in, or operated on by any process or system.

Cardinality Overlay

A Cardinality Overlay defines the minimum and maximum number of values that an attribute can have. For a relationship, the cardinality interval specifies the minimum and maximum number of relationship targets.

In addition to the capture_base and type attributes (see Common attributes), the Cardinality Overlay MUST include the following attribute:

  • attr_cardinality

    The attr_cardinality attribute maps key-value pairs where the key is the attribute name and the value is the cardinality interval.

The logic of cardinality intervals is as follows:

  • n : The cardinality interval denotes exactly n entries;
  • n- : The cardinality interval denotes a minimum of n entries;
  • n-m : The cardinality interval denotes a minimum of n and maximum of m entries;
  • -m : The cardinality interval denotes a maximum of m entries.

Note that n and m are positive integers.

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/cardinality/1.0",
+   "attr_cardinality":{
+      "documentType":"1-2"
+   }
+}
+

Example 8. Code snippet for a Cardinality Overlay.

Conditional Overlay

A Conditional Overlay defines conditional expressions (or rules) that trigger specific computations or actions depending on whether, upon evaluation, programmer-defined Boolean expressions return true or false values. Met conditions can have a direct impact on data capture and data validation processes where, for example, expressions:

  • MAY facilitate schema extensions;
  • MAY enable schema abstractions;
  • MAY activate validation processes.

In addition to the capture_base and type attributes (see Common attributes), the Conditional Overlay MUST include the following attributes:

  • attribute_conditions

    The attribute_conditions attribute maps key-value pairs where the key is the attribute name and the value is the conditional expression.

    Expressions MAY contain placeholders to be substituted by values defined by the attribute_dependencies attribute.

    conditional-statement = 1*conditional-expression
    +conditional-expression = equality-relational / equality-relational logical-operator
    +equality-relational = equality-expression / relational-expression
    +logical-operator = *SP ("and" / "or") *SP
    +equality-expression = assignment eql-op assignment
    +eql-op = "=="/ "~="
    +relational-expression  = assignment relational-op assignment
    +relational-op = "<" / ">" / "<=" / ">="
    +assignment = *SP (ALPHA / DIGIT / "\${" DIGIT "}") *SP
    +

    Listing: ABNF core rules

  • attribute_dependencies

    The attribute_dependencies attribute maps key-value pairs where the key is the attribute name and the value is an array value which triggers the evaluation process of the conditional expression defined by the attribute_conditions attribute.

{
+  "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+  "type":"spec/overlays/conditional/1.0",
+  "attribute_conditions":{
+      "idCardNumber":"${0}=='ID_CARD'",
+      "passportNumber":"${0}=='PASSPORT'"
+  },
+  "attribute_dependencies":{
+      "idCardNumber":[
+        "documentType"
+      ],
+      "passportNumber":[
+        "documentType"
+      ]
+  }
+}
+
+// Entry code overlay with options for `documentType`
+{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/entry_code/1.0",
+   "attribute_entry_codes":{
+      "documentType":[
+         "ID_CARD",
+         "PASSPORT"
+      ]
+   }
+}
+

Example 9. Code snippet for a Conditional Overlay. When the condition matches for idCardNumber, that is, documentType matches ID_CARD, the default behavior is to apply other overlays to idCardNumber, i.e., conformance. ${0} is an integer placeholder that refers to a replacement value during the substitution process. The attribute_dependencies attribute provides that replacement value through an array of attributes. Therefore, the placeholder's integer value refers to an array index that points to the value. In other words, documentType is bound by the integer placeholder, which triggers the evaluation process of the expression.

Conformance Overlay

A Conformance Overlay indicates whether data entry for each attribute is mandatory or optional.

In addition to the capture_base and type attributes (see Common attributes), the Conformance Overlay MAY include the following attributes:

  • attribute_conformance

    The attribute_conformance attribute maps key-value pairs where the key is the attribute name and the value is the data entry conformance of the attribute, which is set to either M (mandatory) or O (optional).

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/conformance/1.0",
+   "attribute_conformance":{
+      "dateOfBirth":"M",
+      "documentNumber":"M",
+      "documentType":"M",
+      "fullName":"M",
+      "height":"O",
+      "issuingState":"M",
+      "photoImage":"M",
+      "sex":"M"
+   }
+}
+

Example 10. Code snippet for a Conformance Overlay.

Entry Code Overlay

An Entry Code Overlay defines the entry keys in a series of key-value pairs stored in a code table (also known as a "lookup table") or dataset. The key is a unique identifier that points to its associated value.

Table 2Table 2. An example of how the values in an array of key-value pairs provided by an Entry Code Overlay subsequently define a set of pre-defined entry keys in a nested series of key-value pairs. The specified values are often standardised categorisation codes, valuable data inputs for statistical analysis, machine learning (ML), and artificial intelligence (AI) algorithms.

In addition to the capture_base and type attributes (see Common attributes), the Entry Code Overlay MUST include the following attribute:

  • attribute_entry_codes

    The attribute_entry_codes attribute maps key-value pairs where the key is the attribute name and the value is either:

    • a set of pre-defined entry keys for a nested series of key-value pairs; or

    • a SAID that references a code table from an external data source to retrieve an array of pre-defined entry keys for a nested series of key-value pairs. See Code Tables for more information on code tables.

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/entry_code/1.0",
+   "attribute_entry_codes":{
+      "documentType":[
+         "PE",
+         "PM"
+      ],
+      "issuingState":"EGyWgdQR9dW_I5oHlHBMoO9AA_eMeb2p3XzcCRCBbKCM",
+      "sex":[
+         "F",
+         "M",
+         "X"
+      ]
+   }
+}
+

Example 11. Code snippet for an Entry Code Overlay.

Entry Overlay

[language-specific object]

An Entry Overlay defines the entry values in a series of key-value pairs stored in a code table (also known as a "lookup table") or dataset. A value is either the identified data or a pointer to that data.

Table 3Table 3. An example of how an Entry Overlay can leverage a set of pre-defined entry keys in a nested series of key-value pairs provided by an Entry Code Overlay to provide human-meaningful values in a specified national or regional language.

In addition to the capture_base, type, and language attributes (see Common attributes), the Entry Overlay MUST include the following attribute:

  • attribute_entries

    The attribute_entries attribute maps key-value pairs where the key is the attribute name and the value is either:

    • a set of pre-defined values in a nested series of key-value pairs that are human-meaningful and language-dependent where the entry keys are taken from an associated Entry Code Overlay; or

    • a SAID that references a code table from an external data source to retrieve an array of pre-defined values from a nested series of key-value pairs that are human-meaningful and language-dependent where the entry keys are taken from an associated Entry Code Overlay. See Code Tables for more information.

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/entry/1.0",
+   "language":"en",
+   "attribute_entries":{
+      "documentType":{
+         "PE":"DIPLOMATIC PASSPORT",
+         "PM":"PASSPORT"
+      },
+      "issuingState":"Els6NxGvFfyL5aiBWR3j7YiaS7F4j4O-F0EIlZu-dO0g",
+      "sex":{
+         "F":"Female",
+         "M":"Male",
+         "X":"Unspecified"
+      }
+   }
+}
+

Example 12. Code snippet for an Entry Overlay (language: en).

Unit Overlay

A Unit Overlay defines the units of measurement adopted by convention or law, used as a standard for measuring the same kind of quantitative data. The RECOMMENDED system to use is the International System of Units (SI) [BIPM], French Système International d’Unités, an international decimal system of weights and measures derived from and extending the metric system of units.

Adopted by the 11th General Conference on Weights and Measures (CGPM) in 1960, it is abbreviated SI in all languages. To date, the SI comprises seven base units: the meter (m), the kilogram (kg), the second (s), the ampere (A), the kelvin (K), the candela (cd) and the mole (mol).

Fig 3

Figure 3. The seven defining constants of the SI.

In addition to the capture_base and type attributes (see Common attributes), the Unit Overlay SHOULD include the following attribute:

  • metric_system

    The metric_system attribute contains the acronym of the chosen system of units (a coherent system of units of measurement) used for defining attribute units.

and MUST include the following attribute:

  • attribute_units

    The attribute_units attribute maps key-value pairs where the key is the attribute name and the value is a standard unit of measurement from a known metric system.

{
+   "capture_base":"EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+   "type":"spec/overlays/unit/1.0",
+   "metric_system":"SI",
+   "attribute_units":{
+      "height":"cm"
+   }
+}
+

Example 13. Code snippet for a Unit Overlay.

Transformation Overlays

Transformation overlays provide information to convert data from one format or structure to another, such as raw data to processed, or unstructured to structured.

Attribute Mapping Overlay

An Attribute Mapping Overlay defines attribute mappings between two distinct data models. Data mapping provides a preliminary step for data integration tasks, including data transformation or data mediation between a data source and a destination or consolidation of multiple databases into a single database and identifying redundant columns of data for consolidation or elimination.

{
+  "capture_base":"Ev_RaB-gIOn8VAB3sg40mINxjiYRxdLVQrgce0aZbFcc",
+  "type":"spec/overlays/mapping/1.0",
+  "attribute_mapping":{
+    "first_name":"firstName",
+    "last_name":"surname"
+  }
+}
+

Example 14. Code snippet for an Attribute Mapping Overlay.

Entry Code Mapping Overlay

An Entry Code Mapping Overlay defines the entry key mappings between two distinct code tables or datasets.

{
+   "capture_base":"Ev_RaB-gIOn8VAB3sg40mINxjiYRxdLVQrgce0aZbFcc",
+   "type":"spec/overlays/entry_code_mapping/1.0",
+   "attr_entry_codes_mapping":{
+      "country_code":[
+         "AFG:AF",
+         "ALB:AL",
+         "DZA:DZ",
+         "ASM:AS",
+         "AND:AD",
+         "AGO:AO",
+         "AIA:AI",
+         "ATA:AQ",
+         "ATG:AG",
+         "..."
+      ]
+   }
+}
+

Example 15. Code snippet for an Entry Code Mapping Overlay.

Subset Overlay

A Subset Overlay defines a customised version of a published schema containing a subset of source attributes, including their properties, types, codes, and relationship dependencies required for the information exchange.

{
+  "capture_base": "EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+  "type": "spec/overlays/subset/1.0",
+  "attributes": [
+    "dateOfBirth",
+    "documentNumber",
+    "documentType"
+  ]
+}
+

Example 16. Code snippet for a Subset Overlay.

Unit Mapping Overlay

A Unit Mapping Overlay defines target units for quantitative data when converting between different units of measurement. Conversion of units is the conversion between different units of measurement for the same quantity, typically through multiplicative conversion factors (see Code Table for Unit mappings for more information on conversion factors) which change the measured quantity value without changing its effects. The process of conversion depends on the specific situation and the intended purpose. This may be governed by regulation, contract, technical specifications or other published standards.

In addition to the capture_base and type attributes (see Common attributes), the Unit Mapping Overlay MUST include the following attributes:

  • metric_system

    The metric_system attribute contains the acronym of the chosen system of units (a coherent system of units of measurement) used for defining attribute units.

  • code_table

    The code_table attribute contains a SAID that references an external code table. See Code Tables for more information.

  • attr_units

    The attr_units attribute maps key-value pairs where the key is the attribute name and the value is the desired unit of measurement.

{
+  "capture_base":"Ev_RaB-gIOn8VAB3sg40mINxjiYRxdLVQrgce0aZbFcc",
+  "type":"spec/overlays/unit/1.0",
+  "metric_system":"SI",
+  "code_table":"E3YDLacdI1GSGWhHywzrb5B0hOL/9TYWBsUkXC8fA4EY",
+  "attr_units":{
+    "blood_glucose":"mg/dL"
+  }
+}
+

Example 17. Code snippet for a Unit Mapping Overlay.

Presentation Overlays

Presentation overlays provide information to display digital documents at the application layer, including digital forms and credentials.

Layout Overlay

[Currently under review by Decentralised Semantics Working Group]

A Layout Overlay defines presentation information required by an application to display a digital document, including a digital form or credential.

Disclaimer:

Collaborators in several open communities have shown an interest in leveraging OCA’s "task-specific" ethos to work on new overlay types to ensure that data presentation (see Presentation) is both extensible and interoperable. Deprecation of the Layout Overlay in favour of a more granular approach is likely in the future.

Sensitive Overlay

A Sensitive Overlay defines attributes not necessarily flagged in the Capture Base that need protecting against unwarranted disclosure. For example, data that requires protection for legal or ethical reasons, personal privacy, or proprietary considerations.

In addition to the capture_base and type attributes (see Common attributes), the Sensitive Overlay MUST include the following attribute:

  • attributes

    The attributes attribute is an array of attributes considered sensitive.

{
+  "capture_base": "EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis",
+  "type": "spec/overlays/sensitive/1.0",
+  "attributes": [
+    "sex"
+  ]
+}
+

Example 19. Code snippet for a Sensitive Overlay

Bundle

An OCA Bundle contains a set of OCA objects consisting of a Capture Base and bound Overlays. An encoded cryptographic digest of the contained objects produces a deterministic identifier for the bundle.

The following object types are REQUIRED in any OCA bundle to preserve the minimum amount of structural, definitional, and contextual information to capture the meaning of inputted data.

  • Capture base
  • Character encoding overlay
  • Format overlay

The cardinality of several overlay types, particularly the language-specific ones (Entry, Information, Label, and Meta), can be multiple depending on the number of defined supported languages.

 EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis.json
+├── E3SAKe0z83pfBnhhcZl19PGGKBheb35WeCJ3V6RdqwY8.json
+├── Ejx0o0yuwp99vi0V-ssP6URZIXRMGj1oNKIZ1BXi4sHU.json
+├── EZv1B5nNl4Rty8CXFTALhr8T6qXeO0CcKliM03sdrkRA.json
+├── Eri3NLi1fr4QrKoFfTlK31KvWpwrSgGaZ0LLuWYQaZfI.json
+├── EY0UZ8aYAPusaWk_TON8c20gHth2tvZs4eWh7XAfXBcY.json
+├── E1mqEb4f6eOMgu5zR857WWlMUwGYwPzZgiM6sWRZkQ0M.json
+├── ESEMKWoKKIf5qvngKecV-ei8MwcQc_pPWCH1FrTWajAM.json
+├── EyzKEWuMs8kspj4r70_Lc8sdppnDx-hb9QqUQywjmDRY.json
+├── EIGknekgJFqjgQ8ah2NwL8zNWbFrllvXVLqezgB6U3Yg.json
+├── EgBxL29VsxoZso7YFirlMP334ZuC1mkel-lO7TxPxEq8.json
+├── ED9PH0ZBaOci-nbnYfPgYZWGQdkyWxA-nW3REmB3vhu0.json
+├── ElJEQGfAvfJEuB7JeNIcvmAPO2DIOaKkpkZyvxO-gQoc.json
+├── EpW9bQGs0Lk6k5cJikN0Ep-DN6z29fwZIsbVzMBgTlWY.json
+├── EIGj0LQKT9-6gCLV2QZVgi4YQZhrUl0-GKbN7sFTCSAI.json
+├── EHDwC_Ucuttrsxh2NVptgBnyG4EMbG5D8QsdbeF9G9-M.json
+└── meta.json
+

Example 20. A representation of an OCA Bundle as a ZIP file containing a Capture Base (first row), multiple Overlays, and a metafile (meta.json) that provides key-value mappings between the file names and the names of the OCA object types. Apart from the metafile, each file name directly represents the encoded cryptographic digest of the file.

See Appendix A for more information on the content of a metafile (meta.json in the above example).

If well-structured, the metadata in an OCA bundle can facilitate many ways for users to search for information, present results, and even manipulate and present information objects without compromising their integrity.

Code Tables

A code table is an external dataset structured as either:

  • an array of data; or
  • a map of key-value pairs.

A code table MUST be identifiable, verifiable, and resolvable by a SAID.

Code Table for Keys

A Code Table for Keys provides an anchor to a reusable dataset for a common purpose, such as a list of country codes. Therefore, this object MAY be a reference target in an Entry Code Overlay. See Entry Code Overlay for more information.

A Code Table for Keys MUST include the following attribute:

  • keys

    The keys attribute is an array of pre-defined entry keys for a nested series of key-value pairs. A key is a unique identifier that points to an associated value.

{
+   "keys":[ "AF", "AL", "DZ", "AS", "AD", "AO", "AI", "AQ", "AG", "..." ]
+}
+

Example 21. Code snippet for a Code Table for Keys, providing an anchor for, in this case, two-character ISO country codes.

Code Table for Key-Value pairs

A Code Table for Key-Value pairs provides a mapping of input values to output values.

A Code Table for Key-Value pairs MUST include the following attribute:

  • entries

    The "entries" attribute is a map of key-value pairs, where the key is the input value (the source) and the value is the output value (the product).

{
+   "entries":{
+      "AFG":"AF", "ALB":"AL", "DZA":"DZ", "ASM":"AS", "AND":"AD",
+      "AGO":"AO", "AIA":"AI", "ATA":"AQ", "ATG":"AG", "..."
+   }
+}
+

Example 22. Code snippet for a Code Table for Key-Value pairs, providing a mapping from, in this case, three-character to two-character ISO country codes.

Code Table for Unit mappings

A Code Table for Unit mappings provides a mapping of input units to output units for quantitative data.

The unit conversion process consists of the following steps:

  1. Read source unit.
  2. Read target unit.
  3. Convert source unit to target unit.

Conversion between units is defined as follows:

Target unit = source unit * conversion factor + offset
+

Except when converting between temperature units, offset equals 0 in most cases.

An example of Celsius to Kelvin conversion:

  1. Given 37 Celsius
  2. Expect Kelvin
  3. 37 * 1 + 273.15 = 310.15 K

An example of Celsius to Fahrenheit conversion:

  1. Given 37 Celsius
  2. Expect Fahrenheit
  3. 37 * 1.8 + 32 = 98.6 F

Implementers MAY find E.J. Roschke’s "Units and Unit Conversions" (2001) [ROS2001] a helpful resource for conversion factors.

A Code Table for Unit mappings MUST include the following attribute:

  • entries

    The entries attribute is a map of key-value pairs, where the key denotes the conversion from source to target (e.g., m->mm or deg_c->deg_f) and the value contains the conversion factor and the offset.

    All units and unit prefixes follow the "Data Protocols Lightweight Standards and Patterns for Data" [BER2013] proposal for describing units associated with numeric quantities.

{
+   "entries":{
+      "m->mm":{
+         "cf":1000
+      },
+      "m->yd":{
+         "cf":1.0936133
+      },
+      "deg_c->deg_f":{
+         "cf":1.8,
+         "o":32
+      }
+   }
+}
+

Example 23. Code snippet for a Code Table for Unit mappings.

Code Table for Unit mappings is in denormalised form, meaning that the conversion between units and unit prefixes is pre-defined for all standard unit conversions for maximum efficiency.

Basic concepts

This section is non-normative.

Characters provide the essential elements required for written language in the physical world. In the digital world, stored sequences of bytes known as "data" represent these elements. However, without a system of interpretation, data has no inherent morphological, definitional, or contextual meaning. This interpretation is provided by "metadata", sets of data that provide meaning to any stored sequence of bytes.

OCA is a core utility architecture for capturing the metadata necessary to interpret and preserve the meaning of inputted data. In addition, the architecture introduces a comprehensive solution to support data validation, transformation, and presentation requirements throughout a data lifecycle.

Fig 4

Figure 4. Universal OCA lifecycle.

Capture

Data capture is the process of collecting structured and unstructured information electronically and converting it into data readable by a computer.

Data capture MAY involve Semantic, Inputs, and Presentation Overlays.

Validation

Data validation is the process of checking the integrity, accuracy and structure of data before it is used for a business operation.

Data validation MAY involve Semantic and Inputs Overlays.

Transformation

Data transformation is the process of converting data from one format to another, typically from the format of a source system into the required format of a destination system.

Data transformation MUST involve Transformation Overlays.

Presentation

Data presentation is the process of using various graphical formats to visually represent the relationship between two or more data sets so that, based on the results, the reader or verifier can make an informed decision.

Data presentation MAY involve Semantic, Inputs, and Presentation Overlays.

Conventions and Definitions

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted when, and only when, they appear in all capitals, as described in RFC 2119 [RFC2119].

References

Normative References

[ISO21778]

ISO/IEC 21778:2017, Information technology — The JSON data interchange syntax (2017) https://www.iso.org/standard/71616.html open in new window

[SAID]

Smith, S. Self-Addressing IDentifier (SAID) (2022) https://datatracker.ietf.org/doc/html/draft-ssmith-said open in new window

Informative References

[ISO21778]

ISO/IEC 21778:2017, Information technology — The JSON data interchange syntax (2017) https://www.iso.org/standard/71616.html open in new window

[SAID]

Smith, S. Self-Addressing IDentifier (SAID) (2022) https://datatracker.ietf.org/doc/html/draft-ssmith-said open in new window

[BER2013]

Berkeley, A., Pollock, R., Smith, J. Data Protocols Lightweight Standards and Patterns for Data, Version 0.1 (2013) http://dataprotocols.org/units/open in new window

[BIPM]

Bureau International des Poids et Mesures (BIPM). The International System of Units (SI) https://www.bipm.org/en/measurement-unitsopen in new window

[BRU2019]

Brush, K. Digital ecosystem (2019) https://www.techtarget.com/searchcio/definition/digital-ecosystemopen in new window

[FAIR2016]

Wilkinson, M. et al. The FAIR Guiding Principles for scientific data management and stewardship (2016) https://www.nature.com/articles/sdata201618open in new window

[GICS]

MSCI. The Global Industry Classification Standard (GICS®) https://www.msci.com/our-solutions/indexes/gicsopen in new window

[HCF2022]

Human Colossus Foundation. Principles of a Dynamic Data Economy (DDE), Version 1.0 (2022) https://static1.squarespace.com/static/5ead4c8660689c348c80958e/t/62f288b25f9c364d7945e6eb/1660061875006/HCF+DDE+Principles+v1.0.0.pdfopen in new window

[IANA]

Internet Assigned Numbers Authority (IANA) https://www.iana.org/open in new window

[ICAO]

International Civil Aviation Organization (ICAO) https://www.icao.int/Pages/default.aspxopen in new window

[ICAO9303]

Doc 9303, Machine Readable Travel Documents, Eighth Edition - Part 3: Specifications Common to all MRTDs (2021) https://www.icao.int/publications/Documents/9303_p3_cons_en.pdfopen in new window

[IEC]

International Electrotechnical Commission (IEC) https://iec.ch/homepageopen in new window

[ISO]

International Organization for Standardization (ISO) https://www.iso.org/home.htmlopen in new window

[ISO639]

ISO 639-1:2002, Codes for the representation of names of languages — Part 1: Alpha-2 code (2019) https://www.iso.org/standard/22109.htmlopen in new window

[ISO3166]

ISO 3166-1:2020, Codes for the representation of names of countries and their subdivisions — Part 1: Country code (2020) https://www.iso.org/standard/72482.htmlopen in new window

[ISO7501]

ISO/IEC 7501-1:2008, Identification cards — Machine readable travel documents — Part 1: Machine-readable passport (2021) https://www.iso.org/standard/45562.htmlopen in new window

[ISO8601]

ISO 8601:2019, Date and time format (2019) https://www.iso.org/iso-8601-date-and-time-format.htmlopen in new window

[ISO10646]

ISO/IEC 10646:2020, Information technology — Universal coded character set (UCS) (2020) https://www.iso.org/standard/76835.htmlopen in new window

[ITU]

International Telecommunication Union (ITU) https://www.itu.int/en/Pages/default.aspxopen in new window

[KAN2020]

Knowles, P., Klingenstein, K., Wunderlich, J. Blinding Identity Taxonomy (BIT), Version 1.0 (2020, Kantara Initiative) https://docs.kantarainitiative.org/Blinding-Identity-Taxonomy-Report-Version-1.0.pdfopen in new window

[KNO2022]

Knowles, P., Mitwicki, R., Page, P. Decentralised semantics in distributed data ecosystems: Ensuring the structural, definitional, and contextual harmonisation and integrity of deterministic objects and objectual relationships (2022) http://star.informatik.rwth-aachen.de/Publications/CEUR-WS/Vol-3249/paper4-OSS.pdfopen in new window

[REGEX]

DOCS.RS, Crate RegEx (Regular Expression), Version 1.6.0 https://docs.rs/regex/latest/regex/#syntaxopen in new window

[RFC0020]

Cerf, V. ASCII format for network interchange, STD 80, RFC 20, DOI 10.17487/RFC0020 (October 1969) https://www.rfc-editor.org/info/rfc20open in new window

[RFC2119]

Bradner, S. Key words for use in RFCs to Indicate Requirement Levels, BCP 14, RFC 2119, DOI 10.17487/RFC2119 (March 1997) https://www.rfc-editor.org/rfc/rfc2119open in new window

[RFC2781]

Hoffman, P., Yergeau, F. UTF-16, an encoding of ISO 10646, RFC 2781, DOI 10.17487/RFC2781 (February 2000) https://www.rfc-editor.org/info/rfc2781open in new window

[RFC3629]

Yergeau, F. UTF-8, a transformation format of ISO 10646, STD 63, RFC 3629, DOI 10.17487/RFC3629 (November 2003) https://www.rfc-editor.org/rfc/rfc3629open in new window

[RFC4648]

Josefsson, S. The Base16, Base32, and Base64 Data Encodings, RFC 4648, DOI 10.17487/RFC4648 (October 2006) https://www.rfc-editor.org/info/rfc4648open in new window

[RFC5234]

Crocker, D., Ed., Overell, P. Augmented BNF for Syntax Specifications: ABNF, RFC 5234 (January 2008) https://datatracker.ietf.org/doc/html/rfc5234open in new window

[UN]

United Nations https://www.un.org/en/open in new window

[UNICODE]

Unicode https://home.unicode.org/open in new window

[UNSDG]

United Nations. Sustainable Development Goals (SDGs) https://sdgs.un.org/goalsopen in new window

Appendices

Appendix A. An example of Metafile content

{
+  "files": {
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] character_encoding": "E3SAKe0z83pfBnhhcZl19PGGKBheb35WeCJ3V6RdqwY8",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] conditional": "Ejx0o0yuwp99vi0V-ssP6URZIXRMGj1oNKIZ1BXi4sHU",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] conformance": "EZv1B5nNl4Rty8CXFTALhr8T6qXeO0CcKliM03sdrkRA",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] entry (en)": "Eri3NLi1fr4QrKoFfTlK31KvWpwrSgGaZ0LLuWYQaZfI",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] entry (fr)": "EY0UZ8aYAPusaWk_TON8c20gHth2tvZs4eWh7XAfXBcY",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] entry_code": "E1mqEb4f6eOMgu5zR857WWlMUwGYwPzZgiM6sWRZkQ0M",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] format": "ESEMKWoKKIf5qvngKecV-ei8MwcQc_pPWCH1FrTWajAM",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] information (en)": "EyzKEWuMs8kspj4r70_Lc8sdppnDx-hb9QqUQywjmDRY",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] information (fr)": "EIGknekgJFqjgQ8ah2NwL8zNWbFrllvXVLqezgB6U3Yg",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] label (en)": "EgBxL29VsxoZso7YFirlMP334ZuC1mkel-lO7TxPxEq8",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] label (fr)": "ED9PH0ZBaOci-nbnYfPgYZWGQdkyWxA-nW3REmB3vhu0",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] layout": "ElJEQGfAvfJEuB7JeNIcvmAPO2DIOaKkpkZyvxO-gQoc",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] meta (en)": "EpW9bQGs0Lk6k5cJikN0Ep-DN6z29fwZIsbVzMBgTlWY",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] meta (fr)": "EIGj0LQKT9-6gCLV2QZVgi4YQZhrUl0-GKbN7sFTCSAI",
+    "[EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis] unit": "EHDwC_Ucuttrsxh2NVptgBnyG4EMbG5D8QsdbeF9G9-M",
+    "capture_base-0": "EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis"
+  },
+  "root": "EVyoqPYxoPiZOneM84MN-7D0oOR03vCr5gg1hf3pxnis"
+}
+
Last Updated:
+ + + diff --git a/v1.1.0-rc.html b/v1.1.0-rc.html new file mode 100644 index 0000000..998921b --- /dev/null +++ b/v1.1.0-rc.html @@ -0,0 +1,289 @@ + + + + + + + + + OCA Spec - 1.1.0-rc | Overlays Capture Architecture + + + + +

Overlays Capture Architecture Specification

Version 1.1.0-rc

Changelog

  • Introduce Credential Overlay
  • Introduce Form Overlay

Introduction

Overlays Capture Architecture (OCA) offers a solution to harmonisation between data models and data representation formats. Primarily devised for semantic object interoperability and privacy compliant data sharing, OCA is a proposed global standard for data capture that promises to significantly enhance the ability to define, manage, and use data in terms of simplicity, accuracy, and allocation of resources.Overlays Capture Architecture (OCA) offers a solution to harmonisation between data models and data representation formats. Primarily devised for semantic object interoperability and privacy compliant data sharing, OCA is a proposed global standard for data capture that promises to significantly enhance the ability to define, manage, and use data in terms of simplicity, accuracy, and allocation of resources.

OCA represents a form (domain-agnostic) and schema (domain-specific) as a multi-dimensional object consisting of a stable Capture Base and interoperable Overlays. By introducing Overlays as task-oriented linked objects within the OCA stack, the architecture offers an optimal level of both efficiency and interoperability in alignment with FAIR principles.

OCA overview

The FAIR Data Principlesopen in new window (Wilkinson et al., 2016), a set of guiding principles to make data findable, accessible, interoperable, and reusable; guide scientific data management and stewardship; and are relevant to all digital economy stakeholders.

Capture base

A Capture Base is a stable base object that defines a single dataset in its purest form, providing a standard base to harmonise data. The object defines attribute names and types. The construct also includes a flagging block, allowing the issuer of a form or schema to flag any attributes where identifying information about entities* may be captured. With flagged attributes, all corresponding data can be treated as high-risk throughout the data lifecycle and encrypted or removed at any stage, reducing the risk of re-identification attacks against blinded datasets.

{
+  "type": "spec/capture_base/1.0",
+  "classification": "GICS:45102010",
+  "attributes": {
+    "dateOfBirth": "Date",
+    "dateOfExpiry": "Date",
+    "dateOfIssue": "Date",
+    "documentCode": "Text",
+    "documentNumber": "Text",
+    "documentType": "Text",
+    "fullName": "Text",
+    "issuedBy": "Text",
+    "issuingState": "Text",
+    "issuingStateCode": "Text",
+    "nationality": "Text",
+    "optionalData": "Text",
+    "optionalDocumentData": "Text",
+    "optionalPersonalData": "Text",
+    "personalNumber": "Text",
+    "photoImage": "Binary",
+    "placeOfBirth": "Text",
+    "primaryIdentifier": "Text",
+    "secondaryIdentifier": "Text",
+    "sex": "Text",
+    "signatureImage": "Binary"
+  },
+  "flagged_attributes": [
+    "documentNumber",
+    "fullName",
+    "primaryIdentifier",
+    "secondaryIdentifier",
+    "dateOfBirth",
+    "personalNumber",
+    "placeOfBirth",
+    "optionalPersonalData",
+    "optionalDocumentData",
+    "signatureImage",
+    "photoImage",
+    "optionalData"
+  ]
+}
+

Attribute name

An attribute name is a string that identifies an attribute.

Attribute type

An attribute type determines the attribute's syntax and how attributes of that type are compared and sorted. A Capture Base recognises seven core attribute types:

  • Text: a data type that defines a human-readable sequence of characters and the words they form, subsequently encoded into computer-readable formats such as ASCII.
  • Numeric: a data type that defines anything of, relating to, or containing numbers. The numbering system consists of ten different digits: 0, 1, 2, 3, 4, 5, 6, 7, 8, and 9.
  • Reference: a data type that defines a self-addressing identifier (SAI) that references a set of attributes through its associated parent. SAID is an identifier that is deterministically generated from and embedded in the content it identifies, making it and its data mutually tamper-evident.
  • Boolean: a data type where the data only has two possible variables: true or false. In computer science, Boolean is an identification classifier for working out logical truth values and algebraic variables.
  • Binary: a data type that defines a binary code signal, a series of electrical pulses representing numbers, characters, and performed operations. Based on a binary number system, each digit position represents a power of two (e.g., 4, 8, 16, etc.). In binary code, a set of four binary digits or bits represents each decimal number (0 to 9). Each digit only has two possible states: off and on (usually symbolised by 0 and 1). Combining basic Boolean algebraic operations on binary numbers makes it possible to represent each of the four fundamental arithmetic operations of addition, subtraction, multiplication, and division.
  • DateTime: a data type that defines the number of seconds or clock ticks that have elapsed since the defined epoch for that computer or platform. Common formats (see 'Format Overlay') include dates (e.g., YYYY-MM-DD), times (e.g., hh:mm:ss), dates and times concatenated (e.g., YYYY-MM-DDThh:mm:ss.sss+zz:zz), and durations (e.g., PnYnMnD).
  • Array [attribute type]: a data type that defines a structure that holds several data items or elements of the same data type. When you want to store many pieces of data that are related and have the same data type, it is often better to use an array instead of many separate variables (e.g. array[text], array[numeric], etc.).

Flagged attributes

Any attributes defined in a Capture Base that may contain identifying information about entities* (i.e., personally identifiable information (PII) or quasi-identifiable information (QII)) can be flagged. The Blinding Identity Taxonomyopen in new window (BIT), a definitive list of what constitutes identifying information, is available at hereopen in new window.

*Note: Entities may be (but not necessarily) natural persons.

Overlays

Overlays are cryptographically-linked objects that provide layers of task-oriented contextual information to a Capture Base. Any actor interacting with a published Capture Base can use Overlays to transform how information is displayed to a viewer or guide an agent in applying a custom process to captured data.

Semantic Overlays

Semantic overlays provide contextual meaning to describe objects and their relationships, including attributes, forms, and schemas.

Semantic

Figure 3.1. In a balanced network, semantic overlays determine the meaning and use of what is put in, taken in, or operated on by any process or system.

Character Encoding Overlay

A Character Encoding Overlay defines the process of assigning numbers to graphical characters, especially the written characters of human language, allowing them to be stored, transmitted, and transformed using digital computers. Character encoding using internationally accepted standards permits worldwide interchange of text in electronic form. The default character set is UTF-8, which is the most common encoding for the World Wide Web, accounting for 98% of all web pages, and up to 100.0% for some languages, as of 2021.

Examples: ASCII, ISO-8859-1, UTF-8, etc.

{
+  "capture_base": "EPMaG1h2hVxKCZ5_3KoNNwgAyd4Eq8zrxK3xgaaRsz2M",
+  "type": "spec/overlays/character_encoding/1.0",
+  "default_character_encoding": "utf-8",
+  "attr_character_encoding": {
+    "dateOfBirth": "utf-8",
+    "dateOfExpiry": "utf-8",
+    "dateOfIssue": "utf-8",
+    "documentCode": "utf-8",
+    "documentNumber": "utf-8",
+    "documentType": "utf-8",
+    "fullName": "utf-8",
+    "issuedBy": "utf-8",
+    "issuingState": "utf-8",
+    "issuingStateCode": "utf-8",
+    "nationality": "utf-8",
+    "optionalData": "utf-8",
+    "optionalDocumentData": "utf-8",
+    "optionalPersonalData": "utf-8",
+    "personalNumber": "utf-8",
+    "photoImage": "base64",
+    "placeOfBirth": "utf-8",
+    "primaryIdentifier": "utf-8",
+    "secondaryIdentifier": "utf-8",
+    "sex": "utf-8",
+    "signatureImage": "base64"
+  }
+}
+

Code snippet for a Character Encoding Overlay

Format Overlay

A Format Overlay defines an input and display format for numeric and date fields. The data format enables the conversion of the input buffer to the program variable and displays program variable data to form fields.

Examples: YYYY-MM-DD, (?<=:25:)\d{8}(?=/), (\d+(,\d*)?)|(,\d+), etc.

{
+  "capture_base": "EPMaG1h2hVxKCZ5_3KoNNwgAyd4Eq8zrxK3xgaaRsz2M",
+  "type": "spec/overlays/format/1.0",
+  "attr_formats": {
+    "dateOfBirth": "YYnMMnDD",
+    "dateOfExpiry": "YYnMMnDD",
+    "dateOfIssue": "YYnMMnDD",
+    "documentCode": "P[A-Z0-9]{1}",
+    "documentNumber": "[A-Z0-9]{9}",
+    "issuingStateCode": "[A-Z]{3}",
+    "personalNumber": "[A-Z0-9]{14}",
+    "photoImage": "image/jpeg",
+    "signatureImage": "image/jpeg"
+  }
+}
+
+

Code snippet for a Format Overlay

Information Overlay

[language-specific object]

An Information Overlay defines attribute field descriptions and usage notes to assist the data entry process.

{
+  "capture_base": "EPMaG1h2hVxKCZ5_3KoNNwgAyd4Eq8zrxK3xgaaRsz2M",
+  "type": "spec/overlays/information/1.0",
+  "language": "en",
+  "attr_information": {
+    "dateOfBirth": "Holder’s date of birth as recorded by the issuing State or organization. If the date of birth is unknown, see Doc 9303-3 for guidance.",
+    "dateOfExpiry": "Date of expiry of the MRP. For additional details see Doc 9303-3.",
+    "dateOfIssue": "For details see Doc 9303-3.",
+    "documentCode": "Capital letter P to designate an MRP. One additional capital letter may be used, in the character position after the letter P and at the discretion of the issuing State or organization, to designate other types of passports such as MRP issued to diplomatic staff, an MRP issued for travel on government business, or a passport issued for a special purpose.",
+    "documentNumber": "As given by the issuing State or organization to uniquely identify the document from all other MRTDs issued by the State or organization. For additional details see Doc 9303-3.",
+    "documentType": "The word for “passport” in the language of the issuing State or organization.",
+    "fullName": "The full name of the holder, as identified by the issuing State or organization. For additional details see Doc 9303-3.",
+    "issuedBy": "Authority or issuing organization for the MRP. This field shall be used to indicate the issuing authority or issuing organization and, optionally, its location, which may be personalized within this field. For additional details see Doc 9303-3.",
+    "issuingState": "The name of the State or organization responsible for issuing the MRP shall be displayed in full.",
+    "issuingStateCode": "As abbreviated in the three-letter code specified in Doc 9303-3.",
+    "nationality": "For details see Doc 9303-3.",
+    "optionalData": "Additional optional data elements at the discretion of the issuing State or organization. For additional details see Doc 9303-3.",
+    "optionalDocumentData": "Optional data elements relating to the document. For additional details see Doc 9303-3.",
+    "optionalPersonalData": "Optional personal data elements e.g. personal identification number or fingerprint, at the discretion of the issuing State or organization. If a fingerprint is included in this field, it should be presented as a 1:1 representation of the original. If a date is included, it shall follow the form of presentation described in Doc 9303-3.",
+    "personalNumber": "Field optionally used for personal identification number given to holder by the issuing State or organization. For additional details see Doc 9303-3. ",
+    "photoImage": "This field shall contain a portrait of the holder. The portrait shall not be larger than 45.0 mm x 35.0 mm_x005F_x000B_(1.77 in x 1.38 in) nor smaller than 32.0 mm x 26.0 mm (1.26 in x 1.02 in). The position of the field concerned shall be aligned to the left of Zones II, III and IV. See Doc 9303-3 for additional specifications for the portrait.",
+    "placeOfBirth": "Field optionally used for city and State of the holder’s birthplace. Refer to Doc 9303-3 for further details. ",
+    "primaryIdentifier": "Predominant component(s) of the name of the holder as described in Doc 9303-3. In cases where the predominant component(s) of the name of the holder (e.g. where this consists of composite names) cannot be shown in full or in the same order, owing to space limitations of Field(s) 06 and/or 07 or national practice, the most important component(s) (as determined by the State or organization) of the primary identifier shall be inserted.",
+    "secondaryIdentifier": "Secondary component(s) of the name of the holder as described in Doc 9303-3. The most important component(s) (as determined by the State or organization) of the secondary identifier of the holder shall be inserted in full, up to the maximum dimensions of the field frame. Other components, where necessary, may be represented by initials. Where the holder’s name has only predominant component(s), this data field shall be left blank. A State may optionally utilize the whole zone comprising Fields 06 and 07 as a single field. In such a case, the primary identifier shall be placed first, followed by a comma and a space, followed by the secondary identifier. ",
+    "sex": "Sex of the holder, to be specified by use of the single initial commonly used in the language of the State or organization where the document is issued and, if translation into English, French or Spanish is necessary, followed by an oblique and the capital letter F for female, M for male, or X for unspecified.",
+    "signatureImage": "At the discretion of the issuing State or organization, the signature or usual mark may be located in Zone VI. The size of the field to be allocated to the signature or usual mark on the adjoining page shall be at the discretion of the issuing State or organization, subject to the overall dimensional limits of the MRP. For additional details see Doc 9303-3."
+  }
+}
+

Code snippet for an Information Overlay

Label Overlay

[language-specific object]

A Label Overlay defines category and display labels for attributes. For example, given an attribute named firstName, you may want to display a label First Name which is more user-friendly when displayed to end users in places such as form inputs and error messages.

{
+  "capture_base": "EPMaG1h2hVxKCZ5_3KoNNwgAyd4Eq8zrxK3xgaaRsz2M",
+  "type": "spec/overlays/label/1.0",
+  "language": "en",
+  "attr_labels": {
+    "dateOfBirth": "Date of birth",
+    "dateOfExpiry": "Date of expiry",
+    "dateOfIssue": "Date of issue",
+    "documentCode": "Document code",
+    "documentNumber": "Passport Number",
+    "documentType": "Document",
+    "fullName": "Name",
+    "issuedBy": "Authority or issuing organization",
+    "issuingState": "Issuing State or organization (in full)",
+    "issuingStateCode": "Issuing State or organization (in code)",
+    "nationality": "Nationality",
+    "optionalData": "Optional data elements",
+    "optionalDocumentData": "Optional document data elements",
+    "optionalPersonalData": "Optional personal data elements",
+    "personalNumber": "Personal number",
+    "photoImage": "Identification feature",
+    "placeOfBirth": "Place of birth",
+    "primaryIdentifier": "Primary Identifier",
+    "secondaryIdentifier": "Secondary Identifier",
+    "sex": "Sex",
+    "signatureImage": "Holder’s signature or usual mark"
+  },
+  "attr_categories": [
+    "_cat-1_",
+    "_cat-2_",
+    "_cat-3_",
+    "_cat-4_",
+    "_cat-5_",
+    "_cat-6_"
+  ],
+  "cat_labels": {
+    "_cat-1_": "Mandatory header",
+    "_cat-2_": "Mandatory and optional personal data elements",
+    "_cat-3_": "Mandatory and optional document data elements",
+    "_cat-4_": "Mandatory holder’s signature or usual mark (original or reproduction)",
+    "_cat-5_": "Mandatory identification feature",
+    "_cat-6_": "Optional data elements"
+  },
+  "cat_attributes": {
+    "_cat-1_": [
+      "issuingState",
+      "documentType",
+      "documentCode",
+      "issuingStateCode",
+      "documentNumber"
+    ],
+    "_cat-2_": [
+      "fullName",
+      "primaryIdentifier",
+      "secondaryIdentifier",
+      "nationality",
+      "dateOfBirth",
+      "personalNumber",
+      "sex",
+      "placeOfBirth",
+      "optionalPersonalData"
+    ],
+    "_cat-3_": [
+      "dateOfIssue",
+      "issuedBy",
+      "dateOfExpiry",
+      "optionalDocumentData"
+    ],
+    "_cat-4_": [
+      "signatureImage"
+    ],
+    "_cat-5_": [
+      "photoImage"
+    ],
+    "_cat-6_": [
+      "optionalData"
+    ]
+  }
+}
+

Code snippet for a Label Overlay

Meta Overlay

[language-specific object]

A Meta Overlay defines the descriptive information about a schema or form. It is used for discovery and identification and includes elements such as form name and description.

{
+  "capture_base": "EPMaG1h2hVxKCZ5_3KoNNwgAyd4Eq8zrxK3xgaaRsz2M",
+  "type": "spec/overlays/meta/1.0",
+  "language": "en",
+  "name": "VIZ for Digital Passport",
+  "description": "A form to be used for capturing Visual Inspection Zone data for a Digital Passport"
+}
+
+

Code snippet for a Meta Overlay

Standards Overlay

A Standards Overlay defines a documented agreement or technical specification published by a standards organisation used to represent, format, define, structure, tag, transmit, manipulate, use, and manage data.

Examples: ISO 3166-1 alpha-2, SNOMED CT, IETF RFC 2246 (1999), etc.

TODO
+
+

Code snippet for a Standards Overlay

Inputs Overlays

Inputs overlays provide predefined inputs for data attestations, including claims, credentials, and records.

OCA Input

In a balanced network, inputs overlays determine what is put in, taken in, or operated on by any process or system.

Cardinality Overlay

A Cardinality Overlay defines the relational information between attributes, which later models need when modelling the actual table architecture. For example, without knowing the relationship cardinality, one cannot model the tables and key restrictions between them. Typical uses include setting data entry requirements on specific fields (i.e., Mandatory or Optional) and setting conditional attribute dependencies according to the chosen entries of a parent attribute.

TODO
+
+

Code snippet for a Cardinality Overlay

Conditional Overlay

A Conditional Overlay defines conditional logic where input conditions for one attribute cause a process change to another. It also allows the application of a child schema based on the outcome of a parent schema, much like the if/then/else constructs seen in traditional programming languages.

Entry Code Overlay

An Entry Code Overlay defines the entry keys in a series of key-value pairs stored in a code table (aka lookup table) or dataset. The key is a unique identifier that points to its associated value.

Examples: CA, CA-BC, NA, etc.

{
+  "capture_base": "EPMaG1h2hVxKCZ5_3KoNNwgAyd4Eq8zrxK3xgaaRsz2M",
+  "type": "spec/overlays/entry_code/1.0",
+  "attr_entry_codes": {
+    "documentType": [
+      "PASSPORT"
+    ],
+    "issuingState": "EWSSp1MZQfVWl-u4l4eDprRp-bLE-xLe0gSTNVwkuqNA",
+    "issuingStateCode": "EWSSp1MZQfVWl-u4l4eDprRp-bLE-xLe0gSTNVwkuqNA",
+    "nationality": "EcOqelFTDay0reu_CesOIUfWVF7htg4IvSOrrXuIMaXU",
+    "sex": [
+      "F",
+      "M",
+      "X"
+    ]
+  }
+}
+
+

Code snippet for an Entry Code Overlay

Entry Overlay

[language-specific object]

An Entry Overlay defines the entry values in a series of key-value pairs stored in a code table (aka lookup table) or dataset. A value is either the identified data or a pointer to that data.

Examples: Canada, British Columbia, North America, etc.

{
+  "capture_base": "EPMaG1h2hVxKCZ5_3KoNNwgAyd4Eq8zrxK3xgaaRsz2M",
+  "type": "spec/overlays/entry/1.0",
+  "language": "en",
+  "attr_entries": {
+    "documentType": {
+      "PASSPORT": "PASSPORT"
+    },
+    "issuingState": "ECfBoOwdcHhQfNtWA5qTKOo9egoxHKXxby6R8Jujpk-o",
+    "issuingStateCode": "EnmO60xL2IsIv-_AC2PgLdJtzqsfuNqa8BihsiNWgz5o",
+    "nationality": "EAr0uvi1743P2VXXqd08a-yX8K_aejHCkdjaW8lWZ_xw",
+    "sex": {
+      "F": "Female",
+      "M": "Male",
+      "X": "Unspecified"
+    }
+  }
+}
+

Unit Overlay

A Unit Overlay defines the units of measurement adopted by convention or law, used as a standard for measuring the same kind of quantity. The recommended system to use is the International System of Units (SI), French Système International d’Unités, an international decimal system of weights and measures derived from and extending the metric system of units. Adopted by the 11th General Conference on Weights and Measures (CGPM) in 1960, it is abbreviated SI in all languages. To date, the SI comprises seven base units: the meter (m), the kilogram (kg), the second (s), the ampere (A), the kelvin (K), the candela (cd) and the mole (mol). More information on the SI is available hereopen in new window.

SI

The seven defining constants of the SI

TODO
+

Code snippet for a Unit Overlay

Transformation Overlays

Transformation overlays provide information to convert data from one format or structure to another, such as raw data to processed, or unstructured to structured.

Mapping Overlay

A Mapping Overlay defines attribute mappings between two distinct data models. Data mapping provides a preliminary step for data integration tasks, including data transformation or data mediation between a data source and a destination or consolidation of multiple databases into a single database and identifying redundant columns of data for consolidation or elimination.

Masking Overlay

A Masking Overlay defines the process of masking or obfuscating sensitive data so that it is of no or little value to unauthorised intruders while still being usable by software or authorised personnel. The main reason for applying masking to a data field is to protect personally identifiable, quasi-identifiable, sensitive personal, or commercially sensitive data.

Subset Overlay

A Subset Overlay defines a customised version of a published schema or form containing a subset of source attributes, including their properties, types, codes, and relationship dependencies required for the information exchange.

Presentation Overlays

Presentation overlays provide information to display data objects at the application layer, including forms and credentials.

Credential Layout Overlay

A Credential Layout Overlay defines presentation information required by an application to display a digital credential.

{
+  "capture_base": "EPMaG1h2hVxKCZ5_3KoNNwgAyd4Eq8zrxK3xgaaRsz2M",
+  "type": "spec/overlays/credential_layout/1.0",
+  "layout": "config:\n  width: 980px\n  height: 1400px\n  style: \"@import url('https://fonts.googleapis.com/css2?family=Nanum+Gothic:wght@700&display=swap'); @font-face { font-family: 'Euphemia'; src: url('https://data-vault.argo.colossi.network/api/v1/files/zQmVwGQNiz8nGHJW1ZvgCyi1Sx1WZeGwJRfdyLedxUJG1Np'); } @font-face { font-family: 'OCRB 10 Pitch BT'; src: url('https://data-vault.argo.colossi.network/api/v1/files/zQmPWK7khoAebbJDZsmgQgjyH2hsThYYPBKWbSbV5tn8NrC'); }\"\npages:\n  - config:\n      style: \"width: 980px; height: 700px; margin: 0;\"\n      background_image: SAI:zQmf4NGbt4q7ufjK1dNaQdMaJgGLXigAYJWXGc1cjaASXxc\n      name: Page 0\n    elements:\n      - type: row\n        config:\n          style: \"height: 32px;\"\n        elements:\n      - type: row\n        elements:\n          - type: col\n            size: 4\n            config:\n              style: \"padding-right: 0;\"\n            elements:\n              - type: row\n                config:\n                  style: \"height: 130px; font-size: 23px; color: #233067; font-family: Nanum Gothic; letter-spacing: 1.2px;\"\n                elements:\n                  - type: col\n                    size: 8\n                    config:\n                      style: \"text-align: right; padding-right: 30px;\"\n                    elements:\n                      - type: row\n                        elements:\n                          - type: col\n                            elements:\n                            - type: content\n                              label: passport\n                  - type: col\n                    size: 4\n              - type: row\n                config:\n                  style: \"margin-top: 20px;\"\n                elements:\n                  - type: col\n                    size: 3\n                  - type: col\n                    size: 7\n                    config:\n                      style: \"padding-left: 4px; padding-right: 0;\"\n                    elements:\n                      - type: attribute\n                        name: photoImage\n                        part: data\n                        config:\n                          style: \"height: 281px; width: 203px;\"\n          - type: col\n            size: 8\n            config:\n              style: \"padding-left: 0; margin-left: -1px;\"\n            elements:\n              - type: row\n                config:\n                  style: \"font-size: 23px; color: #233067; font-family: 'Nanum Gothic'; letter-spacing: 1.2px;\"\n                elements:\n                  - type: attribute\n                    name: issuingState\n                    part: data\n                    config:\n                      style: \"letter-spacing: 0.2px;\"\n              - type: row\n                config:\n                  style: \"margin-top: 16px; font-size: 11px; color: #233067; font-family: 'Nanum Gothic';\"\n                elements:\n                  - type: col\n                    size: 3\n                    config:\n                      style: \"padding-left: 0; font-size: 11px;\"\n                    elements:\n                      - type: content\n                        text: Type\n                      - type: attribute\n                        name: documentType\n                        part: code\n                        config:\n                          style: \"font-size: 21px; color: #222222; font-family: Euphemia; text-transform: uppercase;\"\n                  - type: col\n                    size: 3\n                    config:\n                      style: \"padding: 0; margin-left: -20px;\"\n                    elements:\n                      - type: content\n                        text: Code\n                      - type: attribute\n                        name: issuingStateCode\n                        part: code\n                        config:\n                          style: \"font-size: 21px; color: #222222; font-family: Euphemia; text-transform: uppercase;\"\n                  - type: col\n                    size: 6\n                    config:\n                      style: \"padding: 0;\"\n                    elements:\n                      - type: row\n                        elements:\n                          - type: content\n                            text: Pass Passeport\n                            config:\n                              style: \"padding-left: 13px; letter-spacing: 0.3px;\"\n                      - type: row\n                        elements:\n                          - type: content\n                            text: Passaporto Passaport Passport No N° Nr\n                            config:\n                              style: \"padding-left: 13px; letter-spacing: 0.3px;\"\n                      - type: attribute\n                        name: documentNumber\n                        part: data\n                        config:\n                          style: \"font-size: 21px; color: #222222; font-family: Euphemia; text-transform: uppercase;\"\n              - type: row\n                config:\n                  style: \"margin-top: -6px; font-size: 10.5px; color: #233067; font-family: 'Nanum Gothic';\"\n                elements:\n                  - type: col\n                    config:\n                      style: \"padding-left: 0; letter-spacing: 0.2px;\"\n                    elements:\n                      - type: content\n                        text: 1 Name Nom\n                      - type: content\n                        text: Cognome Num Surname\n                      - type: attribute\n                        name: primaryIdentifier\n                        part: data\n                        config:\n                          style: \"font-size: 19px; color: #222222; font-family: Euphemia; margin-top: -1px; margin-bottom: 1px;\"\n              - type: row\n                config:\n                  style: \"margin-top: 0px; font-size: 10.5px; color: #233067; font-family: 'Nanum Gothic';\"\n                elements:\n                  - type: col\n                    config:\n                      style: \"padding-left: 0; letter-spacing: 0.2px;\"\n                    elements:\n                      - type: content\n                        text: 2 Vorname(n) Prenom(s)\n                      - type: content\n                        text: Nome(i) Num(s) Given name(s)\n                      - type: attribute\n                        name: secondaryIdentifier\n                        part: data\n                        config:\n                          style: \"font-size: 19px; color: #222222; font-family: Euphemia; margin-top: -2px; margin-bottom: 2px;\"\n              - type: row\n                config:\n                  style: \"margin-top: 0px; font-size: 11px; color: #233067; font-family: 'Nanum Gothic';\"\n                elements:\n                  - type: col\n                    config:\n                      style: \"padding-left: 0; letter-spacing: 0.25px;\"\n                    elements:\n                      - type: content\n                        text: 3 Nationalitat Nationalite\n                      - type: content\n                        text: Cittadinanza Naziunalitad Nationality\n                      - type: attribute\n                        name: nationality\n                        part: data\n                        config:\n                          style: \"font-size: 19px; color: #222222; font-family: Euphemia; margin-top: -2px; margin-bottom: 2px;\"\n              - type: row\n                config:\n                  style: \"margin-top: 0px; font-size: 10px; letter-spacing: 0.65px; color: #233067; font-family: 'Nanum Gothic';\"\n                elements:\n                  - type: col\n                    size: 5\n                    config:\n                      style: \"padding-left: 0;\"\n                    elements:\n                      - type: content\n                        text: 4 Geburtsdatum Date de naissance\n                      - type: content\n                        text: Data di nascita Data da naschientscha Date of birth\n                      - type: attribute\n                        name: dateOfBirth\n                        part: data\n                        config:\n                          style: \"font-size: 19px; color: #222222; font-family: Euphemia; margin-top: -2px; margin-bottom: 2px;\"\n                  - type: col\n                    size: 3\n                    config:\n                      style: \"padding-left: 35px;\"\n                    elements:\n                      - type: content\n                        text: 5 Geschlecht Sexe\n                      - type: content\n                        text: Sesso Schlattaina Sex\n                      - type: attribute\n                        name: sex\n                        part: code\n                        config:\n                          style: \"font-size: 21px; color: #222222; font-family: Euphemia; margin-top: -2px; margin-bottom: 2px;\"\n                  - type: col\n                    size: 4\n                    config:\n                      style: \"padding-left: 5px;\"\n                    elements:\n                      - type: content\n                        text: 6 Grosse Taille\n                      - type: content\n                        text: Statura Grondezza Height\n                      - type: attribute\n                        name: optionalPersonalData\n                        part: data\n                        config:\n                          style: \"display: inline-block; font-size: 21px; color: #222222; font-family: Euphemia; margin-top: -2px; margin-bottom: 2px;\"\n                      - type: content\n                        text: cm\n                        config:\n                          style: \"display: inline-block; font-size: 21px; color: #222222; font-family: Euphemia; margin-top: -2px; margin-bottom: 2px; padding-left: 10px;\"\n              - type: row\n                config:\n                  style: \"margin-top: -2px; font-size: 10px; letter-spacing: 0.65px; color: #233067; font-family: 'Nanum Gothic';\"\n                elements:\n                  - type: col\n                    config:\n                      style: \"padding-left: 0;\"\n                    elements:\n                      - type: content\n                        text: 7 Heimatort Lieu d'origine\n                      - type: content\n                        text: Luogo di attinenza Lieu d'origin Place of origin\n                      - type: attribute\n                        name: placeOfBirth\n                        part: data\n                        config:\n                          style: \"font-size: 19px; color: #222222; font-family: Euphemia;\"\n              - type: row\n                config:\n                  style: \"margin-top: 2px; font-size: 10px; letter-spacing: 0.65px; color: #233067; font-family: 'Nanum Gothic';\"\n                elements:\n                  - type: col\n                    size: 5\n                    config:\n                      style: \"padding-left: 0;\"\n                    elements:\n                      - type: content\n                        text: 8 Ausgestellt am Delivre le\n                      - type: content\n                        text: Rilascuato il Emess ils Date of issue\n                      - type: attribute\n                        name: dateOfIssue\n                        part: data\n                        config:\n                          style: \"font-size: 19px; color: #222222; font-family: Euphemia;\"\n                  - type: col\n                    size: 7\n                    config:\n                      style: \"padding-left: 35px;\"\n                    elements:\n                      - type: content\n                        text: 9 Behorde Autorite\n                      - type: content\n                        text: Autorita Autoritad Authority\n                      - type: attribute\n                        name: issuedBy\n                        part: data\n                        config:\n                          style: \"font-size: 21px; color: #222222; font-family: Euphemia;\"\n              - type: row\n                config:\n                  style: \"margin-top: -1px; font-size: 10px; letter-spacing: 0.65px; color: #233067; font-family: 'Nanum Gothic';\"\n                elements:\n                  - type: col\n                    config:\n                      style: \"padding-left: 0;\"\n                    elements:\n                      - type: content\n                        text: 10 Gultig bis Date d'expiration\n                      - type: content\n                        text: Data di scadenza Data da scadenza Date of expiry\n                      - type: attribute\n                        name: dateOfExpiry\n                        part: data\n                        config:\n                          style: \"font-size: 19px; color: #222222; font-family: Euphemia; margin-top: -2px; margin-bottom: 2px;\"\n      - type: row\n        config:\n          style: \"height: 50px;\"\n        elements:\n      - type: row\n        config:\n          style: \"margin-top: 45px; font-family: 'OCRB 10 Pitch BT'; font-size: 31px;\"\n        elements:\n          - type: col\n            elements:\n              - type: row\n                config:\n                  style: \"padding-left: 50px; font-size: 31px; letter-spacing: 1.84px;\"\n                elements:\n                  - type: col\n                    config:\n                      style: \"white-space: nowrap; overflow: hidden; max-width: 895px;\"\n                    elements:\n                      - type: content\n                        text: P<\n                        config:\n                          style: \"display: inline-block; text-transform: uppercase;\"\n                      - type: attribute\n                        name: issuingStateCode\n                        part: code\n                        config:\n                          style: \"display: inline-block; text-transform: uppercase;\"\n                      - type: attribute\n                        name: secondaryIdentifier\n                        part: data\n                        config:\n                          style: \"display: inline-block; text-transform: uppercase;\"\n                      - type: content\n                        text: <<\n                        config:\n                          style: \"display: inline-block; text-transform: uppercase;\"\n                      - type: attribute\n                        name: primaryIdentifier\n                        part: data\n                        config:\n                          style: \"display: inline-block; text-transform: uppercase;\"\n                      - type: content\n                        text: <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n                        config:\n                          style: \"display: inline-block; text-transform: uppercase;\"\n              - type: row\n                config:\n                  style: \"margin-top: 10px; padding-left: 45px; font-size: 30px; letter-spacing: 1.77px;\"\n                elements:\n                  - type: col\n                    elements:\n                      - type: attribute\n                        name: documentNumber\n                        part: data\n                        config:\n                          style: \"display: inline-block; text-transform: uppercase;\"\n                      - type: content\n                        text: <0\n                        config:\n                          style: \"display: inline-block; text-transform: uppercase;\"\n                      - type: attribute\n                        name: issuingStateCode\n                        part: code\n                        config:\n                          style: \"display: inline-block; text-transform: uppercase;\"\n                      - type: content\n                        text: \"0000000\"\n                        config:\n                          style: \"display: inline-block; text-transform: uppercase;\"\n                      - type: attribute\n                        name: sex\n                        part: code\n                        config:\n                          style: \"display: inline-block; text-transform: uppercase;\"\n                      - type: content\n                        text: 0000000<<<<<<<<<<<<<<<<0\n                        config:\n                          style: \"display: inline-block; text-transform: uppercase;\"\n  - config:\n      style: \"width: 980px; height: 700px; margin: 0;\"\n      background_image: SAI:zQmQQgMSzaL8LkkxSR9FsZYBsU4ouoMXxNTXF6uuAtZEPkg\n      name: Page 1\n    elements:\n      - type: row\n        config:\n          style: \"height: 160px;\"\n        elements:\n      - type: row\n        elements:\n          - type: col\n            size: 4\n          - type: col\n            size: 4\n            config:\n              style: \"display: flex; justify-content: center;\"\n            elements:\n              - type: attribute\n                name: signatureImage\n                part: data\n          - type: col\n            size: 4\nlabels:\n  passport:\n    en: Passport\n    fr: Passeport\n"
+}
+
+
+

Code snippet for a Credential Layout Overlay

Form Layout Overlay

A Form Layout Overlay defines presentation information required by an application to display a digital form.


+{
+  "capture_base": "EPMaG1h2hVxKCZ5_3KoNNwgAyd4Eq8zrxK3xgaaRsz2M",
+  "type": "spec/overlays/form_layout/1.0",
+  "layout": "rows:\n  - config:\n      style: 'justify-content: space-between;'\n    elements:\n      - type: meta\n        name: language\n      - type: meta\n        name: name\n  - elements:\n      - type: meta\n        name: description\n  - config:\n      style: 'border-style: dashed;'\n    elements:\n      - type: category\n        name: _cat-1_\n  - elements:\n      - type: attribute\n        name: documentType\n        part: input\n      - type: attribute\n        name: issuingStateCode\n        part: input\n      - type: attribute\n        name: documentNumber\n        part: input\n  - config:\n      style: 'border-style: dashed;'\n    elements:\n      - type: category\n        name: _cat-2_\n  - elements:\n      - type: attribute\n        name: primaryIdentifier\n        part: input\n      - type: attribute\n        name: secondaryIdentifier\n        part: input\n      - type: attribute\n        name: nationality\n        part: input\n      - type: attribute\n        name: dateOfBirth\n        part: input\n      - type: attribute\n        name: placeOfBirth\n        part: input\n      - type: attribute\n        name: sex\n        part: input\n      - type: attribute\n        name: optionalPersonalData\n        part: input\n  - config:\n      style: 'border-style: dashed;'\n    elements:\n      - type: category\n        name: _cat-3_\n  - elements:\n      - type: attribute\n        name: dateOfIssue\n        part: input\n      - type: attribute\n        name: issuedBy\n        part: input\n  - config:\n      style: 'border-style: dashed;'\n    elements:\n      - type: category\n        name: _cat-4_\n  - elements:\n      - type: attribute\n        name: signatureImage\n        part: input\n  - config:\n      style: 'border-style: dashed;'\n    elements:\n      - type: category\n        name: _cat-5_\n  - elements:\n      - type: attribute\n        name: photoImage\n        part: input\n"
+}
+
+

Code snippet for a Form Layout Overlay

Sensitive Overlay

A Sensitive Overlay defines attributes not necessarily flagged in the Capture Base that need protecting against unwarranted disclosure. For example, data that requires protection for legal or ethical reasons, personal privacy, or proprietary considerations.

TODO
+
Last Updated:
+ + +