]> Entropealabs - photography.git/commitdiff
add exif data
authorChristopher Coté <chris@entropealabs.com>
Thu, 10 Feb 2022 21:12:57 +0000 (16:12 -0500)
committerChristopher Coté <chris@entropealabs.com>
Thu, 10 Feb 2022 21:12:57 +0000 (16:12 -0500)
src/index.js
www/index.html
www/js/index.js
www/js/index.js.map

index 0a1ffd9d94285ab1cb48cbdb70569de5260ce49b..1a86b10f2cb4f53cd6251cef384c0da9cc562729 100644 (file)
@@ -140,10 +140,16 @@ function image(image){
     hour: 'numeric', minute: 'numeric', second: 'numeric',
     hour12: false
   }
-  dt.innerText = Intl.DateTimeFormat('en-US', options).format(image.datetime);
+  dt.innerHTML = Intl.DateTimeFormat('en-US', options).format(image.datetime);
+
+  let exif = document.createElement("span");
+  exif.className = "exif";
+  exif.innerHTML = " ƒ" + image.aperture + " | " + secs(image.exposure_time) + " | " + image.focal_length + "mm | ISO" + image.iso;
+
   w.appendChild(i);
   w.appendChild(u);
   w.appendChild(dt);
+  w.appendChild(exif)
   return w;
 }
 
@@ -158,4 +164,16 @@ function tag(tag){
   return t;
 }
 
+function secs(time){
+  if(time >= 1){
+    return time + "\"";
+  }else if(time == 0){
+    return "&infin;";
+  }else{
+    let den = 1 / time;
+    den = Math.floor(den);
+    return "<sup>1</sup>&frasl;<sub>"+ den +"</sub>\"";
+  }
+}
+
 init();
index ce9a5e6c965edbac4963e1bc3ae8bfe4f3abeb4e..6a1be22b96a6e3b94de41837185bf2baa4f8f612 100644 (file)
         float: right;
         font-size: 10px;
       }
+      
+      span.exif{
+        margin-top: 7px;
+        float: left;
+        font-size: 10px;
+      }
 
       #tags{
         max-width: 900px;
index f8f8423be772fd1d7a140a38f6d0571dc802074b..05ad9c18f9f005d83ab84790a63f7369c39d279b 100644 (file)
@@ -1,2 +1,2 @@
-(()=>{var d=null,l={},o=[],f=null;function p(){g()}function g(){fetch("config.json").then(e=>e.json()).then(e=>_(e))}function _(e){d=e.media_server,E()}function E(){fetch("metadata.json").then(e=>e.json()).then(e=>C(e))}function C(e){e.forEach(t=>t.datetime=new Date(t.datetime)),e.sort((t,n)=>t.datetime<n.datetime),o=e,e.forEach(t=>{t.tags.forEach(n=>{l[n]=l[n]?l[n]:[],l[n].push(t)})}),w(),x(),j()}function w(){l.latest=[];for(var e=0;e<10;e++)l.latest.push(o[e])}function j(){let e=window.location.hash;e=e.substring(1),console.log(e),v(e)?s(e):y(e)?k(e):s("latest")}function v(e){return l[e]}function y(e){return o.find(t=>t.hash==e)}function s(e){window.scroll(0,0);let t=document.getElementById("media");for(u(e),r(e);t.firstChild;)t.removeChild(t.firstChild);f=e,l[e].forEach(n=>{let a=m(n);t.appendChild(a)})}function k(e){let t=document.getElementById("media");for(;t.firstChild;)t.removeChild(t.firstChild);let n=o.find(i=>i.hash==e),a=m(n);t.appendChild(a),r(n.hash)}function r(e){let n=e.split(" ").map(a=>a[0].toUpperCase()+a.substring(1)).join(" ");document.getElementById("tag").innerHTML=n}function x(){let e=document.getElementById("tags"),t=Object.keys(l);t.sort(),t.forEach(n=>{let a=B(n);e.appendChild(a)})}function m(e){let t=document.createElement("div");t.className="img";let n=document.createElement("img");n.src=d+e.path,n.onclick=h=>u(e.hash),n.style.height=e.height+"px";let a=document.createElement("ul");a.className="image-tags",e.tags.forEach(h=>{let c=document.createElement("li");c.innerText=h,c.className="img-tag",c.onclick=I=>s(h),a.appendChild(c)});let i=document.createElement("span");return i.className="datetime",i.innerText=e.datetime,t.appendChild(n),t.appendChild(a),t.appendChild(i),t}function u(e){window.location.hash=e}function B(e){let t=document.createElement("li");return t.innerText=e,t.onclick=n=>s(e),t}p();})();
+(()=>{var u=null,l={},s=[],p=null;function g(){_()}function _(){fetch("config.json").then(e=>e.json()).then(e=>E(e))}function E(e){u=e.media_server,C()}function C(){fetch("metadata.json").then(e=>e.json()).then(e=>w(e))}function w(e){e.forEach(t=>t.datetime=new Date(t.datetime)),e=e.sort((t,n)=>t.datetime<n.datetime?1:t.datetime>n.datetime?-1:0),s=e,e.forEach(t=>{t.tags.forEach(n=>{l[n]=l[n]?l[n]:[],l[n].push(t)})}),y(),x(),j()}function y(){l.latest=[];for(var e=0;e<10;e++)l.latest.push(s[e])}function j(){let e=window.location.hash;e=e.substring(1),console.log(e),v(e)?o(e):I(e)?T(e):o("latest")}function v(e){return l[e]}function I(e){return s.find(t=>t.hash==e)}function o(e){window.scroll(0,0);let t=document.getElementById("media");for(f(e),h(e);t.firstChild;)t.removeChild(t.firstChild);p=e,l[e].forEach(n=>{let i=m(n);t.appendChild(i)})}function T(e){let t=document.getElementById("media");for(;t.firstChild;)t.removeChild(t.firstChild);let n=s.find(a=>a.hash==e),i=m(n);t.appendChild(i),h(n.hash)}function h(e){let n=e.split(" ").map(i=>i[0].toUpperCase()+i.substring(1)).join(" ");document.getElementById("tag").innerHTML=n}function x(){let e=document.getElementById("tags"),t=Object.keys(l);t.sort(),t.forEach(n=>{let i=N(n);e.appendChild(i)})}function m(e){let t=document.createElement("div");t.className="img";let n=document.createElement("img");n.src=u+e.path,n.onclick=d=>f(e.hash);let i=document.createElement("ul");i.className="image-tags",e.tags.forEach(d=>{let r=document.createElement("li");r.innerText=d,r.className="img-tag",r.onclick=k=>o(d),i.appendChild(r)});let a=document.createElement("span");a.className="datetime",options={year:"numeric",month:"numeric",day:"numeric",hour:"numeric",minute:"numeric",second:"numeric",hour12:!1},a.innerHTML=Intl.DateTimeFormat("en-US",options).format(e.datetime);let c=document.createElement("span");return c.className="exif",c.innerHTML=" \u0192"+e.aperture+" | "+b(e.exposure_time)+" | "+e.focal_length+"mm | ISO"+e.iso,t.appendChild(n),t.appendChild(i),t.appendChild(a),t.appendChild(c),t}function f(e){window.location.hash=e}function N(e){let t=document.createElement("li");return t.innerText=e,t.onclick=n=>o(e),t}function b(e){if(e>=1)return e+'"';if(e==0)return"&infin;";{let t=1/e;return t=Math.floor(t),"<sup>1</sup>&frasl;<sub>"+t+'</sub>"'}}g();})();
 //# sourceMappingURL=index.js.map
index 1b5762fea82b66fb069aa1a7302193e737bdff5b..c004dd240c59b588b77a00942e7ff5a97b2b7aa3 100644 (file)
@@ -1,7 +1,7 @@
 {
   "version": 3,
   "sources": ["../../src/index.js"],
-  "sourcesContent": ["let server = null;\nlet tags = {};\nlet media = [];\nlet current_tag = null;\nlet current_hash = null;\n\nfunction init(){\n  get_config();\n}\n\nfunction get_config(){\n  fetch(\"config.json\")\n    .then(result => result.json())\n    .then(data => handle_config(data))\n}\n\nfunction handle_config(data){\n  server = data.media_server;\n  get_metadata();\n}\n\nfunction get_metadata(){\n  fetch(\"metadata.json\")\n    .then(result => result.json())\n    .then(data => process_media(data))\n}\n\nfunction process_media(items){\n  items.forEach(i => i.datetime = new Date(i.datetime));\n  items.sort((a, b) => a.datetime < b.datetime);\n  media = items;\n  items.forEach(i => {\n    i.tags.forEach(t => {\n      tags[t] = tags[t] ? tags[t] : [];\n      tags[t].push(i);\n    })\n  });\n  create_latest_ten();\n  create_tags();\n  parse_hash();\n}\n\nfunction create_latest_ten(){\n  tags[\"latest\"] = []\n  for(var i=0; i<10; i++){\n    tags[\"latest\"].push(media[i]);\n  }\n}\n\nfunction parse_hash(){\n  let hash = window.location.hash;\n  hash = hash.substring(1);\n  console.log(hash)\n  if(is_tag(hash)){\n    show_tag(hash);\n  }else if(is_image(hash)){\n    show_image(hash);\n  }else{\n    show_tag(\"latest\");\n  }\n}\n\nfunction is_tag(hash){\n  return tags[hash];\n}\n\nfunction is_image(hash){\n  return media.find(img => img.hash == hash);\n}\n\nfunction show_tag(tag){\n  window.scroll(0, 0);\n  let p = document.getElementById(\"media\");\n  set_hash(tag);\n  set_title(tag);\n  while(p.firstChild){\n    p.removeChild(p.firstChild);\n  }\n  current_tag = tag;\n  tags[tag].forEach(i => {\n    let img = image(i);\n    p.appendChild(img);\n  });\n}\n\nfunction show_image(hash){\n  let p = document.getElementById(\"media\");\n  while(p.firstChild){\n    p.removeChild(p.firstChild);\n  }\n  let img = media.find(img => img.hash == hash)\n  let i = image(img);\n  p.appendChild(i);\n  set_title(img.hash);\n}\n\nfunction set_title(tag){\n  let words = tag.split(\" \");\n  let t = words.map((word) => word[0].toUpperCase() + word.substring(1)).join(\" \");\n  document.getElementById(\"tag\").innerHTML = t;\n}\n\nfunction create_tags(){\n  let p = document.getElementById(\"tags\");\n  let ta = Object.keys(tags);\n  ta.sort();\n  ta.forEach(t => {\n    let ta = tag(t);\n    p.appendChild(ta);\n  })\n}\n\nfunction image(image){\n  let w = document.createElement(\"div\");\n  w.className = \"img\";\n  let i = document.createElement(\"img\");\n  i.src = server + image.path;\n  i.onclick = (e) => set_hash(image.hash);\n  i.style.height = image.height + \"px\";\n  let u = document.createElement(\"ul\");\n  u.className = \"image-tags\";\n  image.tags.forEach(t => {\n    let l = document.createElement(\"li\");\n    l.innerText = t;\n    l.className = \"img-tag\";\n    l.onclick = (e) => show_tag(t);\n    u.appendChild(l);\n  });\n  let dt = document.createElement(\"span\");\n  dt.className = \"datetime\";\n  dt.innerText = image.datetime;\n  w.appendChild(i);\n  w.appendChild(u);\n  w.appendChild(dt);\n  return w;\n}\n\nfunction set_hash(hash){\n  window.location.hash = hash;\n}\n\nfunction tag(tag){\n  let t = document.createElement(\"li\");\n  t.innerText = tag;\n  t.onclick = (e) => show_tag(tag);\n  return t;\n}\n\ninit();\n"],
-  "mappings": "MAAA,GAAI,GAAS,KACT,EAAO,GACP,EAAQ,GACR,EAAc,KAGlB,YAAe,CACb,IAGF,YAAqB,CACnB,MAAM,eACH,KAAK,GAAU,EAAO,QACtB,KAAK,GAAQ,EAAc,IAGhC,WAAuB,EAAK,CAC1B,EAAS,EAAK,aACd,IAGF,YAAuB,CACrB,MAAM,iBACH,KAAK,GAAU,EAAO,QACtB,KAAK,GAAQ,EAAc,IAGhC,WAAuB,EAAM,CAC3B,EAAM,QAAQ,GAAK,EAAE,SAAW,GAAI,MAAK,EAAE,WAC3C,EAAM,KAAK,CAAC,EAAG,IAAM,EAAE,SAAW,EAAE,UACpC,EAAQ,EACR,EAAM,QAAQ,GAAK,CACjB,EAAE,KAAK,QAAQ,GAAK,CAClB,EAAK,GAAK,EAAK,GAAK,EAAK,GAAK,GAC9B,EAAK,GAAG,KAAK,OAGjB,IACA,IACA,IAGF,YAA4B,CAC1B,EAAK,OAAY,GACjB,OAAQ,GAAE,EAAG,EAAE,GAAI,IACjB,EAAK,OAAU,KAAK,EAAM,IAI9B,YAAqB,CACnB,GAAI,GAAO,OAAO,SAAS,KAC3B,EAAO,EAAK,UAAU,GACtB,QAAQ,IAAI,GACZ,AAAG,EAAO,GACR,EAAS,GACL,AAAG,EAAS,GAChB,EAAW,GAEX,EAAS,UAIb,WAAgB,EAAK,CACnB,MAAO,GAAK,GAGd,WAAkB,EAAK,CACrB,MAAO,GAAM,KAAK,GAAO,EAAI,MAAQ,GAGvC,WAAkB,EAAI,CACpB,OAAO,OAAO,EAAG,GACjB,GAAI,GAAI,SAAS,eAAe,SAGhC,IAFA,EAAS,GACT,EAAU,GACJ,EAAE,YACN,EAAE,YAAY,EAAE,YAElB,EAAc,EACd,EAAK,GAAK,QAAQ,GAAK,CACrB,GAAI,GAAM,EAAM,GAChB,EAAE,YAAY,KAIlB,WAAoB,EAAK,CACvB,GAAI,GAAI,SAAS,eAAe,SAChC,KAAM,EAAE,YACN,EAAE,YAAY,EAAE,YAElB,GAAI,GAAM,EAAM,KAAK,GAAO,EAAI,MAAQ,GACpC,EAAI,EAAM,GACd,EAAE,YAAY,GACd,EAAU,EAAI,MAGhB,WAAmB,EAAI,CAErB,GAAI,GAAI,AADI,EAAI,MAAM,KACR,IAAI,AAAC,GAAS,EAAK,GAAG,cAAgB,EAAK,UAAU,IAAI,KAAK,KAC5E,SAAS,eAAe,OAAO,UAAY,EAG7C,YAAsB,CACpB,GAAI,GAAI,SAAS,eAAe,QAC5B,EAAK,OAAO,KAAK,GACrB,EAAG,OACH,EAAG,QAAQ,GAAK,CACd,GAAI,GAAK,EAAI,GACb,EAAE,YAAY,KAIlB,WAAe,EAAM,CACnB,GAAI,GAAI,SAAS,cAAc,OAC/B,EAAE,UAAY,MACd,GAAI,GAAI,SAAS,cAAc,OAC/B,EAAE,IAAM,EAAS,EAAM,KACvB,EAAE,QAAU,AAAC,GAAM,EAAS,EAAM,MAClC,EAAE,MAAM,OAAS,EAAM,OAAS,KAChC,GAAI,GAAI,SAAS,cAAc,MAC/B,EAAE,UAAY,aACd,EAAM,KAAK,QAAQ,GAAK,CACtB,GAAI,GAAI,SAAS,cAAc,MAC/B,EAAE,UAAY,EACd,EAAE,UAAY,UACd,EAAE,QAAU,AAAC,GAAM,EAAS,GAC5B,EAAE,YAAY,KAEhB,GAAI,GAAK,SAAS,cAAc,QAChC,SAAG,UAAY,WACf,EAAG,UAAY,EAAM,SACrB,EAAE,YAAY,GACd,EAAE,YAAY,GACd,EAAE,YAAY,GACP,EAGT,WAAkB,EAAK,CACrB,OAAO,SAAS,KAAO,EAGzB,WAAa,EAAI,CACf,GAAI,GAAI,SAAS,cAAc,MAC/B,SAAE,UAAY,EACd,EAAE,QAAU,AAAC,GAAM,EAAS,GACrB,EAGT",
+  "sourcesContent": ["let server = null;\nlet tags = {};\nlet media = [];\nlet current_tag = null;\nlet current_hash = null;\n\nfunction init(){\n  get_config();\n}\n\nfunction get_config(){\n  fetch(\"config.json\")\n    .then(result => result.json())\n    .then(data => handle_config(data))\n}\n\nfunction handle_config(data){\n  server = data.media_server;\n  get_metadata();\n}\n\nfunction get_metadata(){\n  fetch(\"metadata.json\")\n    .then(result => result.json())\n    .then(data => process_media(data))\n}\n\nfunction process_media(items){\n  items.forEach(i => i.datetime = new Date(i.datetime));\n  items = items.sort((a, b) => {\n    if(a.datetime < b.datetime){\n      return 1;\n    }else if(a.datetime > b.datetime){\n      return -1;\n    }else{\n      return 0;\n    }\n  });\n  media = items;\n  items.forEach(i => {\n    i.tags.forEach(t => {\n      tags[t] = tags[t] ? tags[t] : [];\n      tags[t].push(i);\n    })\n  });\n  create_latest_ten();\n  create_tags();\n  parse_hash();\n}\n\nfunction create_latest_ten(){\n  tags[\"latest\"] = []\n  for(var i=0; i<10; i++){\n    tags[\"latest\"].push(media[i]);\n  }\n}\n\nfunction parse_hash(){\n  let hash = window.location.hash;\n  hash = hash.substring(1);\n  console.log(hash)\n  if(is_tag(hash)){\n    show_tag(hash);\n  }else if(is_image(hash)){\n    show_image(hash);\n  }else{\n    show_tag(\"latest\");\n  }\n}\n\nfunction is_tag(hash){\n  return tags[hash];\n}\n\nfunction is_image(hash){\n  return media.find(img => img.hash == hash);\n}\n\nfunction show_tag(tag){\n  window.scroll(0, 0);\n  let p = document.getElementById(\"media\");\n  set_hash(tag);\n  set_title(tag);\n  while(p.firstChild){\n    p.removeChild(p.firstChild);\n  }\n  current_tag = tag;\n  tags[tag].forEach(i => {\n    let img = image(i);\n    p.appendChild(img);\n  });\n}\n\nfunction show_image(hash){\n  let p = document.getElementById(\"media\");\n  while(p.firstChild){\n    p.removeChild(p.firstChild);\n  }\n  let img = media.find(img => img.hash == hash)\n  let i = image(img);\n  p.appendChild(i);\n  set_title(img.hash);\n}\n\nfunction set_title(tag){\n  let words = tag.split(\" \");\n  let t = words.map((word) => word[0].toUpperCase() + word.substring(1)).join(\" \");\n  document.getElementById(\"tag\").innerHTML = t;\n}\n\nfunction create_tags(){\n  let p = document.getElementById(\"tags\");\n  let ta = Object.keys(tags);\n  ta.sort();\n  ta.forEach(t => {\n    let ta = tag(t);\n    p.appendChild(ta);\n  })\n}\n\nfunction image(image){\n  let w = document.createElement(\"div\");\n  w.className = \"img\";\n  let i = document.createElement(\"img\");\n  i.src = server + image.path;\n  i.onclick = (e) => set_hash(image.hash);\n  let u = document.createElement(\"ul\");\n  u.className = \"image-tags\";\n  image.tags.forEach(t => {\n    let l = document.createElement(\"li\");\n    l.innerText = t;\n    l.className = \"img-tag\";\n    l.onclick = (e) => show_tag(t);\n    u.appendChild(l);\n  });\n  let dt = document.createElement(\"span\");\n  dt.className = \"datetime\";\n  options = {\n    year: 'numeric', month: 'numeric', day: 'numeric',\n    hour: 'numeric', minute: 'numeric', second: 'numeric',\n    hour12: false\n  }\n  dt.innerHTML = Intl.DateTimeFormat('en-US', options).format(image.datetime);\n\n  let exif = document.createElement(\"span\");\n  exif.className = \"exif\";\n  exif.innerHTML = \" \u0192\" + image.aperture + \" | \" + secs(image.exposure_time) + \" | \" + image.focal_length + \"mm | ISO\" + image.iso;\n\n  w.appendChild(i);\n  w.appendChild(u);\n  w.appendChild(dt);\n  w.appendChild(exif)\n  return w;\n}\n\nfunction set_hash(hash){\n  window.location.hash = hash;\n}\n\nfunction tag(tag){\n  let t = document.createElement(\"li\");\n  t.innerText = tag;\n  t.onclick = (e) => show_tag(tag);\n  return t;\n}\n\nfunction secs(time){\n  if(time >= 1){\n    return time + \"\\\"\";\n  }else if(time == 0){\n    return \"&infin;\";\n  }else{\n    let den = 1 / time;\n    den = Math.floor(den);\n    return \"<sup>1</sup>&frasl;<sub>\"+ den +\"</sub>\\\"\";\n  }\n}\n\ninit();\n"],
+  "mappings": "MAAA,GAAI,GAAS,KACT,EAAO,GACP,EAAQ,GACR,EAAc,KAGlB,YAAe,CACb,IAGF,YAAqB,CACnB,MAAM,eACH,KAAK,GAAU,EAAO,QACtB,KAAK,GAAQ,EAAc,IAGhC,WAAuB,EAAK,CAC1B,EAAS,EAAK,aACd,IAGF,YAAuB,CACrB,MAAM,iBACH,KAAK,GAAU,EAAO,QACtB,KAAK,GAAQ,EAAc,IAGhC,WAAuB,EAAM,CAC3B,EAAM,QAAQ,GAAK,EAAE,SAAW,GAAI,MAAK,EAAE,WAC3C,EAAQ,EAAM,KAAK,CAAC,EAAG,IAClB,EAAE,SAAW,EAAE,SACT,EACA,EAAE,SAAW,EAAE,SACf,GAEA,GAGX,EAAQ,EACR,EAAM,QAAQ,GAAK,CACjB,EAAE,KAAK,QAAQ,GAAK,CAClB,EAAK,GAAK,EAAK,GAAK,EAAK,GAAK,GAC9B,EAAK,GAAG,KAAK,OAGjB,IACA,IACA,IAGF,YAA4B,CAC1B,EAAK,OAAY,GACjB,OAAQ,GAAE,EAAG,EAAE,GAAI,IACjB,EAAK,OAAU,KAAK,EAAM,IAI9B,YAAqB,CACnB,GAAI,GAAO,OAAO,SAAS,KAC3B,EAAO,EAAK,UAAU,GACtB,QAAQ,IAAI,GACZ,AAAG,EAAO,GACR,EAAS,GACL,AAAG,EAAS,GAChB,EAAW,GAEX,EAAS,UAIb,WAAgB,EAAK,CACnB,MAAO,GAAK,GAGd,WAAkB,EAAK,CACrB,MAAO,GAAM,KAAK,GAAO,EAAI,MAAQ,GAGvC,WAAkB,EAAI,CACpB,OAAO,OAAO,EAAG,GACjB,GAAI,GAAI,SAAS,eAAe,SAGhC,IAFA,EAAS,GACT,EAAU,GACJ,EAAE,YACN,EAAE,YAAY,EAAE,YAElB,EAAc,EACd,EAAK,GAAK,QAAQ,GAAK,CACrB,GAAI,GAAM,EAAM,GAChB,EAAE,YAAY,KAIlB,WAAoB,EAAK,CACvB,GAAI,GAAI,SAAS,eAAe,SAChC,KAAM,EAAE,YACN,EAAE,YAAY,EAAE,YAElB,GAAI,GAAM,EAAM,KAAK,GAAO,EAAI,MAAQ,GACpC,EAAI,EAAM,GACd,EAAE,YAAY,GACd,EAAU,EAAI,MAGhB,WAAmB,EAAI,CAErB,GAAI,GAAI,AADI,EAAI,MAAM,KACR,IAAI,AAAC,GAAS,EAAK,GAAG,cAAgB,EAAK,UAAU,IAAI,KAAK,KAC5E,SAAS,eAAe,OAAO,UAAY,EAG7C,YAAsB,CACpB,GAAI,GAAI,SAAS,eAAe,QAC5B,EAAK,OAAO,KAAK,GACrB,EAAG,OACH,EAAG,QAAQ,GAAK,CACd,GAAI,GAAK,EAAI,GACb,EAAE,YAAY,KAIlB,WAAe,EAAM,CACnB,GAAI,GAAI,SAAS,cAAc,OAC/B,EAAE,UAAY,MACd,GAAI,GAAI,SAAS,cAAc,OAC/B,EAAE,IAAM,EAAS,EAAM,KACvB,EAAE,QAAU,AAAC,GAAM,EAAS,EAAM,MAClC,GAAI,GAAI,SAAS,cAAc,MAC/B,EAAE,UAAY,aACd,EAAM,KAAK,QAAQ,GAAK,CACtB,GAAI,GAAI,SAAS,cAAc,MAC/B,EAAE,UAAY,EACd,EAAE,UAAY,UACd,EAAE,QAAU,AAAC,GAAM,EAAS,GAC5B,EAAE,YAAY,KAEhB,GAAI,GAAK,SAAS,cAAc,QAChC,EAAG,UAAY,WACf,QAAU,CACR,KAAM,UAAW,MAAO,UAAW,IAAK,UACxC,KAAM,UAAW,OAAQ,UAAW,OAAQ,UAC5C,OAAQ,IAEV,EAAG,UAAY,KAAK,eAAe,QAAS,SAAS,OAAO,EAAM,UAElE,GAAI,GAAO,SAAS,cAAc,QAClC,SAAK,UAAY,OACjB,EAAK,UAAY,UAAO,EAAM,SAAW,MAAQ,EAAK,EAAM,eAAiB,MAAQ,EAAM,aAAe,WAAa,EAAM,IAE7H,EAAE,YAAY,GACd,EAAE,YAAY,GACd,EAAE,YAAY,GACd,EAAE,YAAY,GACP,EAGT,WAAkB,EAAK,CACrB,OAAO,SAAS,KAAO,EAGzB,WAAa,EAAI,CACf,GAAI,GAAI,SAAS,cAAc,MAC/B,SAAE,UAAY,EACd,EAAE,QAAU,AAAC,GAAM,EAAS,GACrB,EAGT,WAAc,EAAK,CACjB,GAAG,GAAQ,EACT,MAAO,GAAO,IACV,GAAG,GAAQ,EACf,MAAO,UACJ,CACH,GAAI,GAAM,EAAI,EACd,SAAM,KAAK,MAAM,GACV,2BAA4B,EAAK,WAI5C",
   "names": []
 }