diff --git a/__wasm/deno_rust_wasm_qr_decode/index.htm b/__wasm/deno_rust_wasm_qr_decode/index.htm
new file mode 100644
index 0000000..b7caace
--- /dev/null
+++ b/__wasm/deno_rust_wasm_qr_decode/index.htm
@@ -0,0 +1,11 @@
+
+
+ Wasm QR Test
+
+
+
+ Drop file(s) here
+
+
+
+
\ No newline at end of file
diff --git a/__wasm/deno_rust_wasm_qr_decode/index.js b/__wasm/deno_rust_wasm_qr_decode/index.js
new file mode 100644
index 0000000..a68bd61
--- /dev/null
+++ b/__wasm/deno_rust_wasm_qr_decode/index.js
@@ -0,0 +1,47 @@
+import { instantiate } from "./lib/rs_lib.generated.js";
+const { decode_qr } = await instantiate();
+
+function handleDragOver(evt) {
+ evt.stopPropagation && evt.stopPropagation();
+ evt.preventDefault && evt.preventDefault();
+ evt.dataTransfer.dropEffect = 'copy';
+}
+
+function handleFileSelect(evt) {
+ evt.stopPropagation && evt.stopPropagation();
+ evt.preventDefault && evt.preventDefault();
+ var files = evt.target.files || evt.dataTransfer.files;
+ if (files.length > 1) {
+ alert("Too many files!");
+ return;
+ }
+ var f = files[0];
+ if (f.size > 20 * 1024 * 1024) {
+ alert("File: " + f.name + " too large: " + f.size);
+ return;
+ }
+ console.info("N: " + f.name);
+ console.info("T: " + f.type);
+ console.info("S: " + f.size);
+ console.info("M: " + f.lastModifiedDate);
+
+ var reader = new FileReader();
+ reader.onloadend = function(evt) {
+ // console.info(evt);
+ if (evt.target.readyState == FileReader.DONE) {
+ let bs = evt.target.result;
+ // debugger;
+ console.log(typeof bs);
+ console.log(bs);
+ let qr_result = decode_qr(bs);
+ console.log(qr_result);
+ }
+ };
+ var blob = f.slice(0, f.size);
+ // console.info("B: " + blob);
+ reader.readAsArrayBuffer(blob);
+}
+
+var sfile = document.getElementById("sfile");
+sfile.addEventListener("dragover", handleDragOver, false);
+sfile.addEventListener("drop", handleFileSelect, false);