From 95b25f9b85af47eb74d19a4b0af1b93ddf5328b8 Mon Sep 17 00:00:00 2001 From: Joshua Ramon Enslin Date: Wed, 22 Jan 2025 15:20:46 +0100 Subject: [PATCH] Add license, readme --- LICENSE | 21 +++++++++++++++++++++ README.md | 16 ++++++++++++++++ dependencies/MDAllowedValueSets | 2 +- dependencies/MDErrorReporter | 2 +- dependencies/MDImporterConcordanceLists | 2 +- dependencies/MD_STD | 2 +- public/index.htm | 6 +++--- public/static/js/qa.js | 4 ++-- public/static/js/qa.min.js | 2 +- 9 files changed, 47 insertions(+), 10 deletions(-) create mode 100644 LICENSE create mode 100644 README.md diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..dc0916a --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 museum-digital + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..7d8489e --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +Concordance checker web interface for imports to museum-digital +=============================================================== + +This repository contains a very small web app enabling users +to upload a list of terms (separated by a newline) and compare +them to the concordance lists used during imports to md. +Entries that are not yet matched to any value of md's controlled +lists can henceforth be matched using the web UI. The tool will +finally generate the necessary lines of code to register the +relevant terms in the concordance lists. + +See also +-------- + +- [Repository for concordance lists](https://gitea.armuli.eu/museum-digital/MDImporterConcordanceLists) +- [Repository for museum-digital's controlled lists](https://gitea.armuli.eu/museum-digital/MDAllowedValueSets) diff --git a/dependencies/MDAllowedValueSets b/dependencies/MDAllowedValueSets index dbd15ea..61edc14 160000 --- a/dependencies/MDAllowedValueSets +++ b/dependencies/MDAllowedValueSets @@ -1 +1 @@ -Subproject commit dbd15ea26baa4bc37bf31e99c6a17ec8ffa876e9 +Subproject commit 61edc14240dc73e446a34fd1f511c62657011326 diff --git a/dependencies/MDErrorReporter b/dependencies/MDErrorReporter index b1d25b4..4ec6bc4 160000 --- a/dependencies/MDErrorReporter +++ b/dependencies/MDErrorReporter @@ -1 +1 @@ -Subproject commit b1d25b494175e79d5f33f7a65a45767195c997f9 +Subproject commit 4ec6bc49ea7aa8a1a035445a68492c23e8155d9e diff --git a/dependencies/MDImporterConcordanceLists b/dependencies/MDImporterConcordanceLists index 0adcbd2..2cb782c 160000 --- a/dependencies/MDImporterConcordanceLists +++ b/dependencies/MDImporterConcordanceLists @@ -1 +1 @@ -Subproject commit 0adcbd2d5d7df896a99aedbf2f569050d23f69b3 +Subproject commit 2cb782cef47dbd400a22034c6cea8a3dd6ac89e3 diff --git a/dependencies/MD_STD b/dependencies/MD_STD index 9948ee5..b9d82d6 160000 --- a/dependencies/MD_STD +++ b/dependencies/MD_STD @@ -1 +1 @@ -Subproject commit 9948ee5d3da9fc072a9ea62341630700794dcd92 +Subproject commit b9d82d672ad36940c04e7a219a27ca6d419e7cb7 diff --git a/public/index.htm b/public/index.htm index ea37160..f8aae97 100644 --- a/public/index.htm +++ b/public/index.htm @@ -7,7 +7,7 @@ - + @@ -32,8 +32,8 @@ - - + + \ No newline at end of file diff --git a/public/static/js/qa.js b/public/static/js/qa.js index b183fd6..62a8b84 100644 --- a/public/static/js/qa.js +++ b/public/static/js/qa.js @@ -477,8 +477,8 @@ class ConcPage { const licenseLine = document.createElement("p"); const license = document.createElement("a"); - license.textContent = "CC BY 4.0"; - license.href = "https://creativecommons.org/licenses/by/4.0/"; + license.textContent = "MIT-Licensed"; + license.href = "https://opensource.org/license/mit"; licenseLine.appendChild(license); licenseLine.appendChild(this.createPlainTextElem("span", " @ ")); diff --git a/public/static/js/qa.min.js b/public/static/js/qa.min.js index 8cae36c..4a7bb92 100644 --- a/public/static/js/qa.min.js +++ b/public/static/js/qa.min.js @@ -1 +1 @@ -"use strict";const MAX_INPUT_SIZE=1048576;'serviceWorker'in navigator&&(console.log("Registering service worker"),navigator.serviceWorker.register('/sw.js'));class ConcPage{lang;tls;domWrapper;domUploaderWrapper;domResultsWrapper;domMainWrapper;constructor(d,e){this.lang=d,this.tls=Object.freeze(e);let c=document.createElement("div");c.id="contentWrapper",this.domWrapper=c;let a=document.createElement("div");a.id="uploader",a.classList.add("uploader"),this.domUploaderWrapper=a;let b=document.createElement("div");b.id="results",b.classList.add("results"),this.domResultsWrapper=b;let f=document.createElement("main");this.domMainWrapper=f}downloadFromString(b,c){const d=new Blob([c],{type:"text/plain"}),a=document.createElement("a");a.download=b,a.href=window.URL.createObjectURL(d),a.dataset.downloadurl=["text/plain",a.download,a.href].join(":");const e=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!0});a.dispatchEvent(e),a.remove()}renderGenHeader(){const b=document.createElement("header");b.id="mainHeader";const a=document.createElement("a");a.id="logoArea",a.href="https://www.museum-digital.org/";const d=document.createElement("img");d.src="/static/img/mdlogo-code.svg",d.alt="Logo of museum-digital",a.appendChild(d);const l=document.createElement("h2");l.textContent="museum-digital",a.appendChild(l),b.appendChild(a);const c=document.createElement("nav"),f=document.createElement("a");f.href="https://en.about.museum-digital.org/about",f.textContent=this.tls.about,c.appendChild(f);const g=document.createElement("div"),h=document.createElement("a");h.textContent=this.tls.contact,h.href="https://en.about.museum-digital.org/contact/",g.appendChild(h);const i=document.createElement("div"),e=document.createElement("a");e.textContent=this.tls.imprint,e.href="https://en.about.museum-digital.org/impressum",i.appendChild(e);const j=document.createElement("a");j.textContent=this.tls.privacy_policy,j.href="https://en.about.museum-digital.org/privacy/",i.appendChild(j),g.appendChild(i),c.appendChild(g);const k=document.createElement("a");k.textContent=this.tls.news,k.href="https://blog.museum-digital.org/",c.appendChild(k),b.appendChild(c),document.body.appendChild(b)}renderHeader(){const b=document.createElement("header");b.id="appHeader";const c=document.createElement("h1"),a=document.createElement("img");a.width="70",a.height="70",a.src="/static/img/mdlogo-code.svg",a.alt="",c.appendChild(a),c.appendChild(this.createPlainTextElem("span","museum-digital:"+this.tls.concordance_checker)),b.appendChild(c),document.body.appendChild(b)}createP(b){const a=document.createElement("p");return a.textContent=b,a}createPlainTextElem(b,c){const a=document.createElement(b);return a.textContent=c,a}renderText(){const a=document.createElement("h2");a.textContent=this.tls.quality_assessment_tools,this.domMainWrapper.appendChild(a),this.domMainWrapper.appendChild(this.createP(this.tls.intro)),this.domWrapper.appendChild(this.domMainWrapper)}generateBoilerplateForTableSection(f){const a=document.createElement("div"),c=document.createElement("h3");c.textContent=f,a.appendChild(c);const b=document.createElement("table"),d=document.createElement("thead");b.appendChild(d);const e=document.createElement("tbody");return b.appendChild(e),a.appendChild(b),{section:a,thead:d,tbody:e}}generateListResponse(d,e,a,b){while(this.domResultsWrapper.firstChild)this.domResultsWrapper.removeChild(this.domResultsWrapper.firstChild);if(b.passed.length===void 0){const c=this.generateBoilerplateForTableSection(this.tls.passed),d=document.createElement("tr");for(const b of['Input','Match']){const a=document.createElement("th");a.textContent=b,d.appendChild(a)}c.thead.appendChild(d);for(const f in b.passed){const d=b.passed[f],e=document.createElement("tr");e.appendChild(this.createPlainTextElem("td",f)),a[d]?e.appendChild(this.createPlainTextElem("td",a[d])):(valueTd.textContent=d,e.appendChild(this.createPlainTextElem("td",d))),c.tbody.appendChild(e)}this.domResultsWrapper.appendChild(c.section)}const c=this;if(b.not_passed.length!==0){const f=this.generateBoilerplateForTableSection(this.tls.not_yet_matched),h=document.createElement("tr");for(const b of['Input','Select Your Match']){const a=document.createElement("th");a.textContent=b,h.appendChild(a)}f.thead.appendChild(h);let i=[];for(let e of b.not_passed){const d=document.createElement("tr");d.appendChild(this.createPlainTextElem("td",e));const g=document.createElement("td"),c=document.createElement("select");c.setAttribute('data-input',e);for(const d in a){const b=document.createElement("option");b.value=d,b.textContent=a[d],c.appendChild(b)}i.push(c),g.appendChild(c),d.appendChild(g),f.tbody.appendChild(d)}this.domResultsWrapper.appendChild(f.section);const g=document.createElement("button");g.textContent=this.tls.generate_code_snippet,f.section.appendChild(g);const j=document.createElement("div");g.addEventListener('click',function(){let g=[],h=!1;a[1]!==void 0&&a[1]!==null&&(h=!0);for(let a of i){let b=("'"+a.getAttribute("data-input")+"'").padEnd(40," ")+" => ";h===!0?b+=a.value+",":b+="'"+a.value+"',",b+=' // '+e[a.value],g.push(b),a.setAttribute("readonly","readonly")}const f=" ".repeat(8)+g.join("\n"+" ".repeat(8));console.log(f);const b=c.createP(f);b.id="resultsP",b.style.fontFamily="Monospace, Courier",b.style.whiteSpace="pre-wrap",j.appendChild(b),b.scrollIntoView({block:"start",behavior:"smooth"}),c.downloadFromString("new-concordance-"+d+'.htm',f)}),this.domResultsWrapper.appendChild(j)}this.domResultsWrapper.scrollIntoView({block:"start",behavior:"smooth"})}renderUploader(){const a=document.createElement("select"),e=document.documentElement.getAttribute("data-lists").split(',');for(const c of e){const b=document.createElement("option");b.textContent=this.tls[c],b.value=c,a.appendChild(b)}this.domUploaderWrapper.appendChild(a);const b=document.createElement("textarea");b.placeholder=this.tls.one_line_per_entry,this.domUploaderWrapper.appendChild(b);const c=document.createElement("button");c.textContent=this.tls.submit,this.domUploaderWrapper.appendChild(c);const d=this;c.addEventListener('click',async function(h){h.stopPropagation(),h.preventDefault();const e=await window.fetch('/static/json/tls.'+a.value+'.en.json',{method:'GET',cache:'no-cache'});if(e.status!==200){const a=await c.text();window.alert(a)}const i=await e.json(),f=await window.fetch('/static/json/tls.'+a.value+'.'+d.lang+'.json',{method:'GET',cache:'no-cache'});if(f.status!==200){const a=await c.text();window.alert(a)}const j=await f.json();let g=[];g.push('terms='+encodeURIComponent(b.value));const c=await window.fetch('/api/evaluate/'+a.value,{method:'POST',cache:'no-cache',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:g.join("&")});if(c.status!==200){const a=await c.text();window.alert(a)}const k=await c.json();d.generateListResponse(a.value,i,j,k)}),this.domWrapper.appendChild(this.domUploaderWrapper),this.domWrapper.appendChild(this.domResultsWrapper)}renderFooter(){const e=document.createElement("footer"),c=document.createElement("div");if('serviceWorker'in navigator){const a=document.createElement("span");a.textContent=this.tls.reload_application,a.setAttribute("tabindex",1),a.addEventListener('click',function(a){Promise.all(['conc-cache-v1'].map(function(a){caches.has(a).then(function(b){b===!0&&caches.delete(a).then(function(a){})})})),location.reload()},{passive:!0,once:!0}),c.appendChild(a)}const h=document.documentElement.getAttribute("data-allowed-langs").split(','),f=document.createElement("div");for(let b of h){const a=document.createElement("a");a.href="#"+b,a.textContent=b,a.style.textTranform="uppercase",a.addEventListener('click',function(a){a.preventDefault(),sessionStorage.setItem("lang",b),location.reload()}),f.appendChild(a)}c.appendChild(f),e.appendChild(c);const a=document.createElement("p"),d=document.createElement("a");d.textContent="CC BY 4.0",d.href="https://creativecommons.org/licenses/by/4.0/",a.appendChild(d),a.appendChild(this.createPlainTextElem("span"," @ "));const b=document.createElement("a");b.textContent="Joshua Ramon Enslin",b.href="https://www.jrenslin.de",b.setAttribute("rel","author"),a.appendChild(b),a.appendChild(this.createPlainTextElem("span",", "));const g=document.createElement("span");g.textContent="2023",a.appendChild(g),e.appendChild(a),document.body.appendChild(e)}}(async function(){function c(){const c=document.documentElement.getAttribute("data-allowed-langs").split(','),a=sessionStorage.getItem("lang");if(a!==void 0&&c.includes(a))return a;if(navigator.language===void 0)return'en';const b=navigator.language.toLowerCase().substr(0,2);return console.log(b),c.includes(b)?b:'en'}const a=c();document.documentElement.setAttribute("lang",a),document.body.classList.add("loading");let e=0,b;function d(){document.body.classList.remove("loading");const c=new ConcPage(a,b);c.renderGenHeader(),c.renderHeader(),c.renderText(),c.renderUploader(),document.body.appendChild(c.domWrapper),c.renderFooter()}window.fetch('/static/json/tls.'+a+'.json',{method:'GET',cache:'no-cache',credentials:'same-origin'}).then(function(a){return a.json()}).then(function(a){b=a,d()})})() \ No newline at end of file +"use strict";const MAX_INPUT_SIZE=1048576;'serviceWorker'in navigator&&(console.log("Registering service worker"),navigator.serviceWorker.register('/sw.js'));class ConcPage{lang;tls;domWrapper;domUploaderWrapper;domResultsWrapper;domMainWrapper;constructor(d,e){this.lang=d,this.tls=Object.freeze(e);let c=document.createElement("div");c.id="contentWrapper",this.domWrapper=c;let a=document.createElement("div");a.id="uploader",a.classList.add("uploader"),this.domUploaderWrapper=a;let b=document.createElement("div");b.id="results",b.classList.add("results"),this.domResultsWrapper=b;let f=document.createElement("main");this.domMainWrapper=f}downloadFromString(b,c){const d=new Blob([c],{type:"text/plain"}),a=document.createElement("a");a.download=b,a.href=window.URL.createObjectURL(d),a.dataset.downloadurl=["text/plain",a.download,a.href].join(":");const e=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!0});a.dispatchEvent(e),a.remove()}renderGenHeader(){const b=document.createElement("header");b.id="mainHeader";const a=document.createElement("a");a.id="logoArea",a.href="https://www.museum-digital.org/";const d=document.createElement("img");d.src="/static/img/mdlogo-code.svg",d.alt="Logo of museum-digital",a.appendChild(d);const l=document.createElement("h2");l.textContent="museum-digital",a.appendChild(l),b.appendChild(a);const c=document.createElement("nav"),f=document.createElement("a");f.href="https://en.about.museum-digital.org/about",f.textContent=this.tls.about,c.appendChild(f);const g=document.createElement("div"),h=document.createElement("a");h.textContent=this.tls.contact,h.href="https://en.about.museum-digital.org/contact/",g.appendChild(h);const i=document.createElement("div"),e=document.createElement("a");e.textContent=this.tls.imprint,e.href="https://en.about.museum-digital.org/impressum",i.appendChild(e);const j=document.createElement("a");j.textContent=this.tls.privacy_policy,j.href="https://en.about.museum-digital.org/privacy/",i.appendChild(j),g.appendChild(i),c.appendChild(g);const k=document.createElement("a");k.textContent=this.tls.news,k.href="https://blog.museum-digital.org/",c.appendChild(k),b.appendChild(c),document.body.appendChild(b)}renderHeader(){const b=document.createElement("header");b.id="appHeader";const c=document.createElement("h1"),a=document.createElement("img");a.width="70",a.height="70",a.src="/static/img/mdlogo-code.svg",a.alt="",c.appendChild(a),c.appendChild(this.createPlainTextElem("span","museum-digital:"+this.tls.concordance_checker)),b.appendChild(c),document.body.appendChild(b)}createP(b){const a=document.createElement("p");return a.textContent=b,a}createPlainTextElem(b,c){const a=document.createElement(b);return a.textContent=c,a}renderText(){const a=document.createElement("h2");a.textContent=this.tls.quality_assessment_tools,this.domMainWrapper.appendChild(a),this.domMainWrapper.appendChild(this.createP(this.tls.intro)),this.domWrapper.appendChild(this.domMainWrapper)}generateBoilerplateForTableSection(f){const a=document.createElement("div"),c=document.createElement("h3");c.textContent=f,a.appendChild(c);const b=document.createElement("table"),d=document.createElement("thead");b.appendChild(d);const e=document.createElement("tbody");return b.appendChild(e),a.appendChild(b),{section:a,thead:d,tbody:e}}generateListResponse(d,e,a,b){while(this.domResultsWrapper.firstChild)this.domResultsWrapper.removeChild(this.domResultsWrapper.firstChild);if(b.passed.length===void 0){const c=this.generateBoilerplateForTableSection(this.tls.passed),d=document.createElement("tr");for(const b of['Input','Match']){const a=document.createElement("th");a.textContent=b,d.appendChild(a)}c.thead.appendChild(d);for(const f in b.passed){const d=b.passed[f],e=document.createElement("tr");e.appendChild(this.createPlainTextElem("td",f)),a[d]?e.appendChild(this.createPlainTextElem("td",a[d])):(valueTd.textContent=d,e.appendChild(this.createPlainTextElem("td",d))),c.tbody.appendChild(e)}this.domResultsWrapper.appendChild(c.section)}const c=this;if(b.not_passed.length!==0){const f=this.generateBoilerplateForTableSection(this.tls.not_yet_matched),h=document.createElement("tr");for(const b of['Input','Select Your Match']){const a=document.createElement("th");a.textContent=b,h.appendChild(a)}f.thead.appendChild(h);let i=[];for(let e of b.not_passed){const d=document.createElement("tr");d.appendChild(this.createPlainTextElem("td",e));const g=document.createElement("td"),c=document.createElement("select");c.setAttribute('data-input',e);for(const d in a){const b=document.createElement("option");b.value=d,b.textContent=a[d],c.appendChild(b)}i.push(c),g.appendChild(c),d.appendChild(g),f.tbody.appendChild(d)}this.domResultsWrapper.appendChild(f.section);const g=document.createElement("button");g.textContent=this.tls.generate_code_snippet,f.section.appendChild(g);const j=document.createElement("div");g.addEventListener('click',function(){let g=[],h=!1;a[1]!==void 0&&a[1]!==null&&(h=!0);for(let a of i){let b=("'"+a.getAttribute("data-input")+"'").padEnd(40," ")+" => ";h===!0?b+=a.value+",":b+="'"+a.value+"',",b+=' // '+e[a.value],g.push(b),a.setAttribute("readonly","readonly")}const f=" ".repeat(8)+g.join("\n"+" ".repeat(8));console.log(f);const b=c.createP(f);b.id="resultsP",b.style.fontFamily="Monospace, Courier",b.style.whiteSpace="pre-wrap",j.appendChild(b),b.scrollIntoView({block:"start",behavior:"smooth"}),c.downloadFromString("new-concordance-"+d+'.htm',f)}),this.domResultsWrapper.appendChild(j)}this.domResultsWrapper.scrollIntoView({block:"start",behavior:"smooth"})}renderUploader(){const a=document.createElement("select"),e=document.documentElement.getAttribute("data-lists").split(',');for(const c of e){const b=document.createElement("option");b.textContent=this.tls[c],b.value=c,a.appendChild(b)}this.domUploaderWrapper.appendChild(a);const b=document.createElement("textarea");b.placeholder=this.tls.one_line_per_entry,this.domUploaderWrapper.appendChild(b);const c=document.createElement("button");c.textContent=this.tls.submit,this.domUploaderWrapper.appendChild(c);const d=this;c.addEventListener('click',async function(h){h.stopPropagation(),h.preventDefault();const e=await window.fetch('/static/json/tls.'+a.value+'.en.json',{method:'GET',cache:'no-cache'});if(e.status!==200){const a=await c.text();window.alert(a)}const i=await e.json(),f=await window.fetch('/static/json/tls.'+a.value+'.'+d.lang+'.json',{method:'GET',cache:'no-cache'});if(f.status!==200){const a=await c.text();window.alert(a)}const j=await f.json();let g=[];g.push('terms='+encodeURIComponent(b.value));const c=await window.fetch('/api/evaluate/'+a.value,{method:'POST',cache:'no-cache',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:g.join("&")});if(c.status!==200){const a=await c.text();window.alert(a)}const k=await c.json();d.generateListResponse(a.value,i,j,k)}),this.domWrapper.appendChild(this.domUploaderWrapper),this.domWrapper.appendChild(this.domResultsWrapper)}renderFooter(){const e=document.createElement("footer"),c=document.createElement("div");if('serviceWorker'in navigator){const a=document.createElement("span");a.textContent=this.tls.reload_application,a.setAttribute("tabindex",1),a.addEventListener('click',function(a){Promise.all(['conc-cache-v1'].map(function(a){caches.has(a).then(function(b){b===!0&&caches.delete(a).then(function(a){})})})),location.reload()},{passive:!0,once:!0}),c.appendChild(a)}const h=document.documentElement.getAttribute("data-allowed-langs").split(','),f=document.createElement("div");for(let b of h){const a=document.createElement("a");a.href="#"+b,a.textContent=b,a.style.textTranform="uppercase",a.addEventListener('click',function(a){a.preventDefault(),sessionStorage.setItem("lang",b),location.reload()}),f.appendChild(a)}c.appendChild(f),e.appendChild(c);const a=document.createElement("p"),d=document.createElement("a");d.textContent="MIT-Licensed",d.href="https://opensource.org/license/mit",a.appendChild(d),a.appendChild(this.createPlainTextElem("span"," @ "));const b=document.createElement("a");b.textContent="Joshua Ramon Enslin",b.href="https://www.jrenslin.de",b.setAttribute("rel","author"),a.appendChild(b),a.appendChild(this.createPlainTextElem("span",", "));const g=document.createElement("span");g.textContent="2023",a.appendChild(g),e.appendChild(a),document.body.appendChild(e)}}(async function(){function c(){const c=document.documentElement.getAttribute("data-allowed-langs").split(','),a=sessionStorage.getItem("lang");if(a!==void 0&&c.includes(a))return a;if(navigator.language===void 0)return'en';const b=navigator.language.toLowerCase().substr(0,2);return console.log(b),c.includes(b)?b:'en'}const a=c();document.documentElement.setAttribute("lang",a),document.body.classList.add("loading");let e=0,b;function d(){document.body.classList.remove("loading");const c=new ConcPage(a,b);c.renderGenHeader(),c.renderHeader(),c.renderText(),c.renderUploader(),document.body.appendChild(c.domWrapper),c.renderFooter()}window.fetch('/static/json/tls.'+a+'.json',{method:'GET',cache:'no-cache',credentials:'same-origin'}).then(function(a){return a.json()}).then(function(a){b=a,d()})})() \ No newline at end of file