diff --git a/README.md b/README.md index 0a92aae30..9cf30065a 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,7 @@ Apps are listed in the Bangle.js menu, accessible from a clock app via the middl * `app.png` - app icon - 48x48px * `app-icon.js` - JS version of the icon (made with http://www.espruino.com/Image+Converter) for use in Bangle.js's menu * `app.js` - app code +* `ChangeLog` - A file containing a list of changes to your app so users can see what's changed #### `app-icon.js` @@ -189,9 +190,23 @@ When the widget is to be drawn, `x` and `y` values are set up in `WIDGETS["mywid and `draw` can then use `this.x` and `this.y` to figure out where it needs to draw to. +### ChangeLog + +This is a file containing a list of changes to your app so users can see what's changed, for example: + +``` +0.01: New App! +0.02: Changed the colors +0.03: Made the app run quicker +``` + +Entries should be newest last, with the version number of the last entry matching the version in `metadata.json` + +Please keep the same format at the example as the file needs to be parsed by the BangleApps tools. + ### `app.info` format -This is the file that's **auto-generated** and loaded onto Bangle.js by the App Loader, +This is the file that's **auto-generated** from `metadata.json` and loaded onto Bangle.js by the App Loader, and which gives information about the app for the Launcher. ``` diff --git a/apps/ac_ac/ChangeLog b/apps/ac_ac/ChangeLog new file mode 100644 index 000000000..307e4165d --- /dev/null +++ b/apps/ac_ac/ChangeLog @@ -0,0 +1,2 @@ +0.01: initial release +1.00: first official release (also fixes bug in Customizer) \ No newline at end of file diff --git a/apps/ac_ac/Customizer.html b/apps/ac_ac/Customizer.html index f2aa79920..ae40be939 100644 --- a/apps/ac_ac/Customizer.html +++ b/apps/ac_ac/Customizer.html @@ -321,7 +321,7 @@ function chosenClockHands () { switch (ClockHands) { - case 'simple': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-simpled-clock-hands/main/ClockHands.js')" + case 'simple': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-simple-clock-hands/main/ClockHands.js')" case 'rounded': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-rounded-clock-hands/main/ClockHands.js')" case 'hollow': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-hollow-clock-hands/main/ClockHands.js')" case 'custom': return "require('" + ClockHandsURL + "')" diff --git a/apps/ac_ac/metadata.json b/apps/ac_ac/metadata.json index a4f3de0ac..4dbe93834 100644 --- a/apps/ac_ac/metadata.json +++ b/apps/ac_ac/metadata.json @@ -1,7 +1,7 @@ { "id": "ac_ac", "name": "A Configurable Analog Clock", "shortName":"Configurable Clock", - "version":"0.03", + "version":"1.00", "description": "AC-AC, a highly customizable analog clock with several clock faces, hands and complications to choose from", "icon": "app-icon.png", "type": "clock", diff --git a/apps/alarm/boot.js b/apps/alarm/boot.js index dffb3a37f..47dae5361 100644 --- a/apps/alarm/boot.js +++ b/apps/alarm/boot.js @@ -7,7 +7,7 @@ active = active.sort((a,b)=>(a.hr-b.hr)+(a.last-b.last)*24); var hr = time.getHours()+(time.getMinutes()/60)+(time.getSeconds()/3600); if (!require('Storage').read("alarm.js")) { - console.log(/*LANG*/"No alarm app!"); + console.log("No alarm app!"); require('Storage').write('alarm.json',"[]"); } else { var t = 3600000*(active[0].hr-hr); diff --git a/apps/arrow/README.md b/apps/arrow/README.md index 4b77dbc42..2833eab24 100644 --- a/apps/arrow/README.md +++ b/apps/arrow/README.md @@ -43,3 +43,7 @@ charge. This app is based in the work done by [jeffmer](https://github.com/jeffmer/JeffsBangleAppsDev) + +Written by: [Hugh Barney](https://github.com/hughbarney) For support +and discussion please post in the [Bangle JS +Forum](http://forum.espruino.com/microcosms/1424/) diff --git a/apps/authentiwatch/ChangeLog b/apps/authentiwatch/ChangeLog index 7a902a731..7d6f96026 100644 --- a/apps/authentiwatch/ChangeLog +++ b/apps/authentiwatch/ChangeLog @@ -2,3 +2,4 @@ 0.02: Fix JSON save format 0.03: Add "Calculating" placeholder, update JSON save format 0.04: Fix tapping at very bottom of list, exit on inactivity +0.05: Add support for bulk importing and exporting tokens diff --git a/apps/authentiwatch/README.md b/apps/authentiwatch/README.md index 8d0e74a0c..cc25e9604 100644 --- a/apps/authentiwatch/README.md +++ b/apps/authentiwatch/README.md @@ -3,6 +3,15 @@ * GitHub: https://github.com/andrewgoz/Authentiwatch <-- Report bugs here * Bleeding edge AppLoader: https://andrewgoz.github.io/Authentiwatch/ +## Important! + +Tokens are stored *ONLY* on the watch. Make sure you do one or more of the following: + +* Make a backup copy of the "authentiwatch.json" file. +* Export all your tokens to another device or print the QR code. + +Keep those copies safe and secure. + ## Supports * Google Authenticator compatible 2-factor authentication @@ -14,8 +23,8 @@ * Between 6 and 10 digits * Phone/PC configuration web page: * Add/edit/delete/arrange tokens - * Scan QR codes - * Produce scannable QR codes + * Scan token and migration(import) QR codes + * Produce scannable token and migration(export) QR codes ## Usage @@ -24,6 +33,8 @@ * Swipe right to exit to the app launcher. * Swipe left on selected counter token to advance the counter to the next value. +![Screenshot](screenshot.png) + ## Creator Andrew Gregory (andrew.gregory at gmail) diff --git a/apps/authentiwatch/app.js b/apps/authentiwatch/app.js index c0cb608c0..640183230 100644 --- a/apps/authentiwatch/app.js +++ b/apps/authentiwatch/app.js @@ -1,4 +1,5 @@ -const tokenentryheight = 46; +const tokenextraheight = 16; +var tokendigitsheight = 30; // Hash functions const crypto = require("crypto"); const algos = { @@ -44,9 +45,6 @@ function b32decode(seedstr) { } } } - if (bitcount > 0) { - retstr += String.fromCharCode(buf << (8 - bitcount)); - } var retbuf = new Uint8Array(retstr.length); for (i in retstr) { retbuf[i] = retstr.charCodeAt(i); @@ -117,27 +115,31 @@ function drawToken(id, r) { var y1 = r.y; var x2 = r.x + r.w - 1; var y2 = r.y + r.h - 1; - var adj, sz; + var adj, lbl, sz; g.setClipRect(Math.max(x1, Bangle.appRect.x ), Math.max(y1, Bangle.appRect.y ), Math.min(x2, Bangle.appRect.x2), Math.min(y2, Bangle.appRect.y2)); + lbl = tokens[id].label.substr(0, 10); if (id == state.curtoken) { // current token g.setColor(g.theme.fgH); g.setBgColor(g.theme.bgH); - g.setFont("Vector", 16); + g.setFont("Vector", tokenextraheight); // center just below top line g.setFontAlign(0, -1, 0); adj = y1; } else { g.setColor(g.theme.fg); g.setBgColor(g.theme.bg); - g.setFont("Vector", 30); + sz = tokendigitsheight; + do { + g.setFont("Vector", sz--); + } while (g.stringWidth(lbl) > r.w); // center in box g.setFontAlign(0, 0, 0); adj = (y1 + y2) / 2; } g.clearRect(x1, y1, x2, y2); - g.drawString(tokens[id].label.substr(0, 10), (x1 + x2) / 2, adj, false); + g.drawString(lbl, (x1 + x2) / 2, adj, false); if (id == state.curtoken) { if (tokens[id].period > 0) { // timed - draw progress bar @@ -148,14 +150,14 @@ function drawToken(id, r) { // counter - draw triangle as swipe hint let yc = (y1 + y2) / 2; g.fillPoly([0, yc, 10, yc - 10, 10, yc + 10, 0, yc]); - adj = 10; + adj = 12; } // digits just below label - sz = 30; + sz = tokendigitsheight; do { g.setFont("Vector", sz--); } while (g.stringWidth(state.otp) > (r.w - adj)); - g.drawString(state.otp, (x1 + adj + x2) / 2, y1 + 16, false); + g.drawString(state.otp, (x1 + adj + x2) / 2, y1 + tokenextraheight, false); } // shaded lines top and bottom g.setColor(0.5, 0.5, 0.5); @@ -196,15 +198,15 @@ function draw() { } if (tokens.length > 0) { var drewcur = false; - var id = Math.floor(state.listy / tokenentryheight); - var y = id * tokenentryheight + Bangle.appRect.y - state.listy; + var id = Math.floor(state.listy / (tokendigitsheight + tokenextraheight)); + var y = id * (tokendigitsheight + tokenextraheight) + Bangle.appRect.y - state.listy; while (id < tokens.length && y < Bangle.appRect.y2) { - drawToken(id, {x:Bangle.appRect.x, y:y, w:Bangle.appRect.w, h:tokenentryheight}); + drawToken(id, {x:Bangle.appRect.x, y:y, w:Bangle.appRect.w, h:(tokendigitsheight + tokenextraheight)}); if (id == state.curtoken && (tokens[id].period <= 0 || state.nextTime != 0)) { drewcur = true; } id += 1; - y += tokenentryheight; + y += (tokendigitsheight + tokenextraheight); } if (drewcur) { // the current token has been drawn - schedule a redraw @@ -226,7 +228,7 @@ function draw() { state.nexttime = 0; } } else { - g.setFont("Vector", 30); + g.setFont("Vector", tokendigitsheight); g.setFontAlign(0, 0, 0); g.drawString(notokens, Bangle.appRect.x + Bangle.appRect.w / 2, Bangle.appRect.y + Bangle.appRect.h / 2, false); } @@ -238,18 +240,18 @@ function draw() { function onTouch(zone, e) { if (e) { - var id = Math.floor((state.listy + (e.y - Bangle.appRect.y)) / tokenentryheight); + var id = Math.floor((state.listy + (e.y - Bangle.appRect.y)) / (tokendigitsheight + tokenextraheight)); if (id == state.curtoken || tokens.length == 0 || id >= tokens.length) { id = -1; } if (state.curtoken != id) { if (id != -1) { - var y = id * tokenentryheight - state.listy; + var y = id * (tokendigitsheight + tokenextraheight) - state.listy; if (y < 0) { state.listy += y; y = 0; } - y += tokenentryheight; + y += (tokendigitsheight + tokenextraheight); if (y > Bangle.appRect.h) { state.listy += (y - Bangle.appRect.h); } @@ -266,12 +268,15 @@ function onTouch(zone, e) { function onDrag(e) { if (e.x > g.getWidth() || e.y > g.getHeight()) return; if (e.dx == 0 && e.dy == 0) return; - var newy = Math.min(state.listy - e.dy, tokens.length * tokenentryheight - Bangle.appRect.h); + var newy = Math.min(state.listy - e.dy, tokens.length * (tokendigitsheight + tokenextraheight) - Bangle.appRect.h); state.listy = Math.max(0, newy); draw(); } function onSwipe(e) { + if (e == 1) { + exitApp(); + } if (e == -1 && state.curtoken != -1 && tokens[state.curtoken].period <= 0) { tokens[state.curtoken].period--; let newsettings={tokens:tokens,misc:settings.misc}; @@ -296,7 +301,7 @@ function bangle1Btn(e) { state.curtoken = Math.max(state.curtoken, 0); state.curtoken = Math.min(state.curtoken, tokens.length - 1); var fakee = {}; - fakee.y = state.curtoken * tokenentryheight - state.listy + Bangle.appRect.y; + fakee.y = state.curtoken * (tokendigitsheight + tokenextraheight) - state.listy + Bangle.appRect.y; state.curtoken = -1; state.nextTime = 0; onTouch(0, fakee); diff --git a/apps/authentiwatch/interface.html b/apps/authentiwatch/interface.html index 26533b17b..d2213b819 100644 --- a/apps/authentiwatch/interface.html +++ b/apps/authentiwatch/interface.html @@ -7,7 +7,10 @@ + + +

   Select Fonts to upload:

+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+

+ + +
+ + diff --git a/apps/contourclock/font-BarlowCond.json b/apps/contourclock/font-BarlowCond.json new file mode 100644 index 000000000..2388b7383 --- /dev/null +++ b/apps/contourclock/font-BarlowCond.json @@ -0,0 +1,17 @@ +{ + "name":"BarlowCond", + "size":"100", + "characters":[ + {"width" : "61", "buffer":"VVVVVVX//////1VVVVVVVVVVVVf///////9VVVVVVVVVVX/wAAAAAA/9VVVVVVVVVX/AAAAAAAAP9VVVVVVVVfwAAAAAAAAAP9VVVVVVVfwAAAAAAAAAAP1VVVVVV/AAAAAAAAAAAAPVVVVVV/AAAAAAAAAAAAA9VVVVV8AAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAA/AAAAAAAAD3wAAAAAAAA/8AAAAAAAA98AAAAAAAA9XwAAAAAAAD/AAAAAAAAPV8AAAAAAAA/wAAAAAAAPVfAAAAAAAAP8AAAAAAAD1XwAAAAAAAD/AAAAAAAA9VfAAAAAAAA/wAAAAAAAPVXwAAAAAAAP8AAAAAAAD1V8AAAAAAAD/AAAAAAAA9VfAAAAAAAA/wAAAAAAAPVXwAAAAAAAP8AAAAAAAD1V8AAAAAAAD/AAAAAAAA9VfAAAAAAAA/wAAAAAAAPVXwAAAAAAAP8AAAAAAAD1V8AAAAAAAD/AAAAAAAA9VfAAAAAAAA/wAAAAAAAPVXwAAAAAAAP8AAAAAAAD1V8AAAAAAAD/AAAAAAAA9VfAAAAAAAA/wAAAAAAAPVXwAAAAAAAP8AAAAAAAD1V8AAAAAAAD/AAAAAAAA9VfAAAAAAAA/wAAAAAAAPVXwAAAAAAAP8AAAAAAAD1V8AAAAAAAD/AAAAAAAA9VfAAAAAAAA/wAAAAAAAPVXwAAAAAAAP8AAAAAAAD1V8AAAAAAAD/AAAAAAAA9VfAAAAAAAA/wAAAAAAAPVXwAAAAAAAP8AAAAAAAD1V8AAAAAAAD/AAAAAAAA9VfAAAAAAAA/wAAAAAAAPVXwAAAAAAAP8AAAAAAAD1V8AAAAAAAD/AAAAAAAA9VfAAAAAAAA/wAAAAAAAPVXwAAAAAAAP8AAAAAAAD1V8AAAAAAAD/AAAAAAAA9VfAAAAAAAA/wAAAAAAAPVXwAAAAAAAP8AAAAAAAD1V8AAAAAAAD/AAAAAAAA9VfAAAAAAAA/wAAAAAAAPVXwAAAAAAAP8AAAAAAAD1V8AAAAAAAD/AAAAAAAA9VfAAAAAAAA/wAAAAAAAPVXwAAAAAAAP8AAAAAAAD1V8AAAAAAAD/AAAAAAAA9VfAAAAAAAA/wAAAAAAAPVXwAAAAAAAP8AAAAAAAD1V8AAAAAAAD/AAAAAAAA9VfAAAAAAAA/wAAAAAAAPVXwAAAAAAAP8AAAAAAAD1V8AAAAAAAD/AAAAAAAA9V8AAAAAAAA/wAAAAAAAPVfAAAAAAAAP8AAAAAAAA9XwAAAAAAAD/AAAAAAAAPXwAAAAAAAD3wAAAAAAAA/wAAAAAAAA9fAAAAAAAADwAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAAD1VVVVV8AAAAAAAAAAAAD1VVVVVXwAAAAAAAAAAAP1VVVVVVfwAAAAAAAAAAP1VVVVVVV/wAAAAAAAAA/VVVVVVVVV/wAAAAAAAD/VVVVVVVVVV/////////9VVVVVVVVVVV////////1VVVVVQ=="}, + {"width" : "40", "buffer":"VVVVVVVVVVVVVVVVV/////////1VV///////////Vf/8AAAAAAAAD3/8AAAAAAAAAA//AAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAAD////wAAAAAAAA9f///AAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVXwAAAAAAAPVVVV8AAAAAAAD1VVVfAAAAAAAA9VVVX/////////VVVVf////////Q=="}, + {"width" : "63", "buffer":"VVVVVVVV/////9VVVVVVVVVVVVVV///////9VVVVVVVVVVVV//AAAAAD/1VVVVVVVVVVf/AAAAAAAD/VVVVVVVVVX/AAAAAAAAAP9VVVVVVVV/wAAAAAAAAAA/VVVVVVVX8AAAAAAAAAAAD1VVVVVV/AAAAAAAAAAAAA/VVVVVV8AAAAAAAAAAAAAP1VVVVfwAAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAA9fAAAAAAAAD/AAAAAAAAA98AAAAAAAAP/wAAAAAAAA98AAAAAAAA9V8AAAAAAAA98AAAAAAAA9V8AAAAAAAA98AAAAAAAA9VfAAAAAAAA98AAAAAAAA9VfAAAAAAAA98AAAAAAAA9VfAAAAAAAA98AAAAAAAA9VfAAAAAAAA98AAAAAAAA9VfAAAAAAAA98AAAAAAAA9V8AAAAAAAA98AAAAAAAA9V8AAAAAAAA98AAAAAAAA9V8AAAAAAAA9f////////1XwAAAAAAAA9X////////VXwAAAAAAAA9VVVVVVVVVVXwAAAAAAAA9VVVVVVVVVVfAAAAAAAAD1VVVVVVVVVVfAAAAAAAAD1VVVVVVVVVV8AAAAAAAAD1VVVVVVVVVV8AAAAAAAAD1VVVVVVVVVXwAAAAAAAAPVVVVVVVVVVfAAAAAAAAAPVVVVVVVVVVfAAAAAAAAAPVVVVVVVVVV8AAAAAAAAA9VVVVVVVVVXwAAAAAAAAA9VVVVVVVVVXwAAAAAAAAD1VVVVVVVVVfAAAAAAAAAD1VVVVVVVVV8AAAAAAAAAPVVVVVVVVVXwAAAAAAAAAPVVVVVVVVVfAAAAAAAAAA9VVVVVVVVVfAAAAAAAAAD1VVVVVVVVV8AAAAAAAAAD1VVVVVVVVXwAAAAAAAAAPVVVVVVVVVfAAAAAAAAAA9VVVVVVVVV8AAAAAAAAAD1VVVVVVVVXwAAAAAAAAAD1VVVVVVVVfAAAAAAAAAAPVVVVVVVVV8AAAAAAAAAA9VVVVVVVVV8AAAAAAAAAD1VVVVVVVVXwAAAAAAAAAD1VVVVVVVVfAAAAAAAAAAPVVVVVVVVV8AAAAAAAAAA9VVVVVVVVXwAAAAAAAAAD1VVVVVVVVfAAAAAAAAAAPVVVVVVVVV8AAAAAAAAAA9VVVVVVVVXwAAAAAAAAAD1VVVVVVVVfAAAAAAAAAAPVVVVVVVVVfAAAAAAAAAA9VVVVVVVVV8AAAAAAAAAD1VVVVVVVVXwAAAAAAAAAPVVVVVVVVVfAAAAAAAAAA9VVVVVVVVV8AAAAAAAAAD1VVVVVVVVXwAAAAAAAAAD1VVVVVVVVfAAAAAAAAAAA////////VfAAAAAAAAAAAP///////9fAAAAAAAAAAAAAAAAAAA/fAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAPf////////////////////X///////////////////9"}, + {"width" : "61", "buffer":"VVVVVVVVVVVVVVVVVVVVVf//////////////////Vf//////////////////9XwAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9f///////AAAAAAAAAAA9V///////8AAAAAAAAAAPVVVVVVVVXwAAAAAAAAAD1VVVVVVVXwAAAAAAAAAD1VVVVVVVXwAAAAAAAAAD1VVVVVVVXwAAAAAAAAAD1VVVVVVVXwAAAAAAAAAD1VVVVVVVXwAAAAAAAAAD1VVVVVVVXwAAAAAAAAAD1VVVVVVVXwAAAAAAAAAD1VVVVVVVXwAAAAAAAAAD1VVVVVVVXwAAAAAAAAAD1VVVVVVVXwAAAAAAAAAD1VVVVVVVXwAAAAAAAAAD1VVVVVVVXwAAAAAAAAAA9VVVVVVVXwAAAAAAAAAA9VVVVVVVXwAAAAAAAAAA9VVVVVVVXwAAAAAAAAAAD1VVVVVVV8AAAAAAAAAAAP1VVVVVVXwAAAAAAAAAAA/1VVVVVV8AAAAAAAAAAAA/VVVVVVXwAAAAAAAAAAAA9VVVVVVfAAAAAAAAAAAAD1VVVVVV8AAAAAAAAAAAAPVVVVVVXwAAAAAAAAAAAA9VVVVVVfAAAAAAAAAAAAD1VVVVVV8AAAAAAAAAAAA9VVVVVVXwAAAAAAAAAAAD1VVVVVVfAAD8AAAAAAAA9VVVVVVV8AD/wAAAAAAAPVVVVVVVXwP1fAAAAAAAA9VVVVVVVf/1V8AAAAAAAPVVVVVVVV/VVXwAAAAAAD1VVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVXwAAAAAAA9VVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVXwAAAAAAA9VVVVVVVVVVV8AAAAAAAPf////////VVfAAAAAAAD/////////9VXwAAAAAAA/wAAAAAAAPVV8AAAAAAAP8AAAAAAAD1VfAAAAAAAD/AAAAAAAA9VXwAAAAAAA/wAAAAAAAPVV8AAAAAAAP8AAAAAAAD1VfAAAAAAAD/AAAAAAAA9VXwAAAAAAA/wAAAAAAAD1XwAAAAAAAP8AAAAAAAA9V8AAAAAAAD/AAAAAAAAD/8AAAAAAAD3wAAAAAAAAP8AAAAAAAA98AAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAA9VVVV/AAAAAAAAAAAAAD9VVVVX8AAAAAAAAAAAAD9VVVVVX8AAAAAAAAAAAD1VVVVVVfwAAAAAAAAAAP1VVVVVVVf8AAAAAAAAA/1VVVVVVVV//AAAAAAAP/VVVVVVVVVVf////////9VVVVVVVVVVVX///////VVVVVVQ=="}, + {"width" : "73", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf////////9VVVVVVVVVVVVVVf/////////VVVVVVVVVVVVVVXwAAAAAAAD1VVVVVVVVVVVVVXwAAAAAAAA9VVVVVVVVVVVVVV8AAAAAAAAPVVVVVVVVVVVVVVfAAAAAAAAD1VVVVVVVVVVVVVfAAAAAAAAA9VVVVVVVVVVVVVXwAAAAAAAA9VVVVVVVVVVVVVV8AAAAAAAAPVVVVVVVVVVVVVV8AAAAAAAAD1VVVVVVVVVVVVVfAAAAAAAAD1VVVVVVVVVVVVVXwAAAAAAAA9VVVVVVVVVVVVVXwAAAAAAAAPVVVVVVVVVVVVVV8AAAAAAAAD1VVVVVVVVVVVVVfAAAAAAAAD1VVVVVVVVVVVVVfAAAAAAAAA9VVVVVVVVVVVVVXwAAAAAAAAPVVVVVVVVVVVVVV8AAAAAAAAPVVVVVVVVVVVVVV8AAAAAAAAD1VVVVVVVVVVVVVfAAAAAAAAA9VVVVVVVVVVVVVXwAAAAAAAA9VVVVVVVVVVVVVV8AAAAAAAAPVVVVVVVVVVVVVV8AAAAAAAAD1VVVVVVVVVVVVVfAAAAAAAAD1VVVVVVVVVVVVVfAAAAAAAAA9VVVVVVVVVVVVVXwAAAAAAAAPVVVVVVVVVVVVVV8AAAAAAAAD1VVVVVVVVVVVVVfAAAAAAAAD1VVVVVVVVVVVVVfAAAAAAAAA9VVVVVVVVVVVVVXwAAAAAAAAPVVVVVVVVVVVVVV8AAAAAAAAPVVVVVVVVVVVVVV8AAAAAAAAD1VVVVVVVVVVVVVfAAAAAAAAA9VVVVVVVVVVVVVXwAAAAAAAA9VVVVVVVVVVVVVXwAAAAAAAAPVVVVVVVVVVVVVV8AAAAAAAAD1VVVVVVVVVVVVVfAAAAAAAAA9VVVVVVVVVVVVVfAAAAAAAAA9VVVVVVVVVVVVVXwAAAAAAAAPV////////9VVVV8AAAAAAAAPV/////////1VVV8AAAAAAAAD1fAAAAAAAA9VVVfAAAAAAAAA9XwAAAAAAAPVVVXwAAAAAAAAPV8AAAAAAAD1VVXwAAAAAAAAPVfAAAAAAAA9VVV8AAAAAAAAD1XwAAAAAAAPVVVfAAAAAAAAA9V8AAAAAAAD1VVfAAAAAAAAA9VfAAAAAAAA9VVXwAAAAAAAAPVXwAAAAAAAPVVV8AAAAAAAAD1V8AAAAAAAD1VVfAAAAAAAAA9VfAAAAAAAA9VVfAAAAAAAAAD//AAAAAAAAD/9XwAAAAAAAAAP/AAAAAAAAAP/18AAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAAAAAA//V////////////wAAAAAAAA//VVVVVVVVVVVVVfAAAAAAAA9VVVVVVVVVVVVVVXwAAAAAAAPVVVVVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVVVVVfAAAAAAAA9VVVVVVVVVVVVVVXwAAAAAAAPVVVVVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVVVVVfAAAAAAAA9VVVVVVVVVVVVVVXwAAAAAAAPVVVVVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVVVVVfAAAAAAAA9VVVVVVVVVVVVVVXwAAAAAAAPVVVVVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVVVVVfAAAAAAAA9VVVVVVVVVVVVVVXwAAAAAAAPVVVVVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVVVVVfAAAAAAAA9VVVVVVVVVVVVVVXwAAAAAAAPVVVVVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVVVVVfAAAAAAAA9VVVVVVVVVVVVVVXwAAAAAAAPVVVVVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVVVVVf////////1VVVVVVVVVVVVVVV////////1VVQ=="}, + {"width" : "61", "buffer":"VVVVVVVVVVVVVVVVVVVVX///////////////////3////////////////////8AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAA/wAAAAAAAA///////////8AAAAAAAA///////////fAAAAAAAA9VVVVVVVVVVXwAAAAAAAPVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVfAAAAAAAA9VVVVVVVVVVXwAAAAAAAPVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVfAAAAAAAA9VVVVVVVVVVXwAAAAAAAPVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVfAAAAAAAA9VVVVVVVVVVXwAAAAAAAPVVVVVVVVVVV8AAAAAAAD1VVf1VVVVVVfAAAAAAAA9V/////VVVVXwAAAAAAAPX//A///VVVV8AAAAAAAA/8AAAAD/VVVfAAAAAAAADwAAAAAD9VVXwAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAA/wAAAAAAAAPwAAAAAAAAP8AAAAAAAAP/AAAAAAAAD/AAAAAAAAPV8AAAAAAAA//////////VXwAAAAAAAPf////////VV8AAAAAAAD1VVVVVVVVVVfAAAAAAAA9VVVVVVVVVVXwAAAAAAAPVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVfAAAAAAAA9VVVVVVVVVVXwAAAAAAAPX///////9VV8AAAAAAAD3////////9VfAAAAAAAA/wAAAAAAAPVXwAAAAAAAP8AAAAAAAD1V8AAAAAAAD/AAAAAAAAPVfAAAAAAAA/wAAAAAAAD1XwAAAAAAAP8AAAAAAAA9XwAAAAAAAD/AAAAAAAAD/wAAAAAAAA/wAAAAAAAAPwAAAAAAAAPfAAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAA/VVVVX8AAAAAAAAAAAAA/VVVVVfwAAAAAAAAAAAD9VVVVVVfwAAAAAAAAAAD9VVVVVVV/wAAAAAAAAA/1VVVVVVVV/8AAAAAAAD/1VVVVVVVVV/////////9VVVVVVVVVVVf///////1VVVVVQ=="}, + {"width" : "62", "buffer":"VVVVVVVf/////VVVVVVVVVVVVVX///////9VVVVVVVVVVVf/8AAAAAP/1VVVVVVVVVf/AAAAAAAA/9VVVVVVVVX8AAAAAAAAAD/VVVVVVVX8AAAAAAAAAAA/VVVVVVV/AAAAAAAAAAAAPVVVVVV/AAAAAAAAAAAAAP1VVVVXwAAAAAAAAAAAAAP1VVVV8AAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAA9fAAAAAAAAA8AAAAAAAAD18AAAAAAAAP8AAAAAAAAPXwAAAAAAAD18AAAAAAAA9fAAAAAAAAPV8AAAAAAAD18AAAAAAAA9XwAAAAAAAPXwAAAAAAAPVfAAAAAAAA9fAAAAAAAA9V8AAAAAAAD18AAAAAAAD1XwAAAAAAAPXwAAAAAAAPVfAAAAAAAA9fAAAAAAAA9V8AAAAAAAD18AAAAAAAD1X/////////XwAAAAAAAPVV////////1fAAAAAAAA9VVVVVVVVVVV8AAAAAAAD1VVX1VVVVVVXwAAAAAAAPVf////1VVVVfAAAAAAAA9f//D//9VVVV8AAAAAAAD38AAAAD/VVVXwAAAAAAAD8AAAAAA/1VVfAAAAAAAADAAAAAAAP1VV8AAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAD3wAAAAAAAAPwAAAAAAAAPfAAAAAAAAD/wAAAAAAAA98AAAAAAAA9XwAAAAAAAD3wAAAAAAAD1XwAAAAAAAPfAAAAAAAAPVfAAAAAAAA98AAAAAAAD1V8AAAAAAAD3wAAAAAAAPVXwAAAAAAAD/AAAAAAAA9VfAAAAAAAAP8AAAAAAAD1V8AAAAAAAA/wAAAAAAAPVXwAAAAAAAD/AAAAAAAA9VfAAAAAAAAP8AAAAAAAD1V8AAAAAAAA/wAAAAAAAPVXwAAAAAAAD/AAAAAAAA9VfAAAAAAAAP8AAAAAAAD1V8AAAAAAAA/wAAAAAAAPVXwAAAAAAAD/AAAAAAAA9VfAAAAAAAAP8AAAAAAAD1V8AAAAAAAA/wAAAAAAAPVXwAAAAAAAD/AAAAAAAAPVfAAAAAAAAPfAAAAAAAA9XwAAAAAAAA98AAAAAAAA/8AAAAAAAAD3wAAAAAAAA/AAAAAAAAA9fAAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAA9VVVVX8AAAAAAAAAAAAA/VVVVVX8AAAAAAAAAAAAP1VVVVVV/AAAAAAAAAAAP1VVVVVVV/wAAAAAAAAAP9VVVVVVVVf/AAAAAAAA/9VVVVVVVVVX/////////9VVVVVVVVVVVf///////1VVVVVU="}, + {"width" : "60", "buffer":"VVVVVVVVVVVVVVVVVVVVf//////////////////9////////////////////8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAD//AAAAAAAAAP8AAAAAAP//wAAAAAAAAP8AAAAAA9VV8AAAAAAAAP8AAAAAA9VV8AAAAAAAAP8AAAAAA9VV8AAAAAAAAP8AAAAAA9VV8AAAAAAAA98AAAAAA9VXwAAAAAAAA9///////9VXwAAAAAAAA9f//////1VfAAAAAAAAD1VVVVVVVVVfAAAAAAAAD1VVVVVVVVVfAAAAAAAAD1VVVVVVVVVfAAAAAAAAD1VVVVVVVVV8AAAAAAAAPVVVVVVVVVV8AAAAAAAAPVVVVVVVVVV8AAAAAAAA9VVVVVVVVVXwAAAAAAAA9VVVVVVVVVXwAAAAAAAA9VVVVVVVVVXwAAAAAAAA9VVVVVVVVVXwAAAAAAAD1VVVVVVVVVfAAAAAAAAD1VVVVVVVVVfAAAAAAAAD1VVVVVVVVVfAAAAAAAAPVVVVVVVVVV8AAAAAAAAPVVVVVVVVVV8AAAAAAAAPVVVVVVVVVV8AAAAAAAA9VVVVVVVVVXwAAAAAAAA9VVVVVVVVVXwAAAAAAAA9VVVVVVVVVXwAAAAAAAD1VVVVVVVVVfAAAAAAAAD1VVVVVVVVVfAAAAAAAAD1VVVVVVVVVfAAAAAAAAD1VVVVVVVVV8AAAAAAAAPVVVVVVVVVV8AAAAAAAAPVVVVVVVVVV8AAAAAAAAPVVVVVVVVVV8AAAAAAAA9VVVVVVVVVXwAAAAAAAA9VVVVVVVVVXwAAAAAAAA9VVVVVVVVVXwAAAAAAAD1VVVVVVVVVfAAAAAAAAD1VVVVVVVVVfAAAAAAAAD1VVVVVVVVVfAAAAAAAAPVVVVVVVVVV8AAAAAAAAPVVVVVVVVVV8AAAAAAAAPVVVVVVVVVV8AAAAAAAAPVVVVVVVVVXwAAAAAAAA9VVVVVVVVVXwAAAAAAAA9VVVVVVVVVXwAAAAAAAA9VVVVVVVVVXwAAAAAAAD1VVVVVVVVVfAAAAAAAAD1VVVVVVVVVfAAAAAAAAD1VVVVVVVVVfAAAAAAAAPVVVVVVVVVV8AAAAAAAAPVVVVVVVVVV8AAAAAAAAPVVVVVVVVVV8AAAAAAAAPVVVVVVVVVXwAAAAAAAA9VVVVVVVVVXwAAAAAAAA9VVVVVVVVVXwAAAAAAAD1VVVVVVVVVfAAAAAAAAD1VVVVVVVVVfAAAAAAAAD1VVVVVVVVVfAAAAAAAAD1VVVVVVVVVfAAAAAAAAPVVVVVVVVVV8AAAAAAAAPVVVVVVVVVV8AAAAAAAAPVVVVVVVVVV8AAAAAAAA9VVVVVVVVVXwAAAAAAAA9VVVVVVVVVXwAAAAAAAA9VVVVVVVVVXwAAAAAAAD1VVVVVVVVVfAAAAAAAAD1VVVVVVVVVfAAAAAAAAD1VVVVVVVVVfAAAAAAAAD1VVVVVVVVV8AAAAAAAAPVVVVVVVVVV8AAAAAAAAPVVVVVVVVVV8AAAAAAAAPVVVVVVVVVV8AAAAAAAA9VVVVVVVVVV8AAAAAAAA9VVVVVVVVVV/////////1VVVVVVVVVVf////////VVVVVVVV"}, + {"width" : "60", "buffer":"VVVVVVf//////9VVVVVVVVVVVf////////9VVVVVVVVVX/wAAAAAAD/1VVVVVVVVfwAAAAAAAAD/VVVVVVVX8AAAAAAAAAAP1VVVVVVfwAAAAAAAAAAA/VVVVVV8AAAAAAAAAAAAP1VVVVXwAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAD8AAAAAAAAP8AAAAAAAAP/AAAAAAAAP8AAAAAAAA9XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAPfAAAAAAAD1XwAAAAAAAPfAAAAAAAD1XwAAAAAAA9fAAAAAAAD1XwAAAAAAA9fAAAAAAAA9fAAAAAAAA9XwAAAAAAAP8AAAAAAAA9XwAAAAAAADwAAAAAAAD1XwAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAD1VVVVXwAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAD1XwAAAAAAADwAAAAAAAD1fAAAAAAAAP8AAAAAAAA9fAAAAAAAA9fAAAAAAAA9fAAAAAAAA9XwAAAAAAA9fAAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAD1XwAAAAAAAP8AAAAAAAA9XwAAAAAAAP8AAAAAAAAP/AAAAAAAAPfAAAAAAAAD8AAAAAAAAPfAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAA/VVVVfAAAAAAAAAAAAAD1VVVVX8AAAAAAAAAAAAP1VVVVV/AAAAAAAAAAAA/VVVVVVXwAAAAAAAAAAD1VVVVVVV/AAAAAAAAAA/VVVVVVVVf8AAAAAAAAP9VVVVVVVVV/8AAAAAAP/VVVVVVVVVVX////////1VVVVVVVVVVVX//////1VVVVVV"}, + {"width" : "62", "buffer":"VVVVVVVf/////1VVVVVVVVVVVVX////////VVVVVVVVVVVX/8AAAAAD/9VVVVVVVVVf/AAAAAAAAP/VVVVVVVVX/AAAAAAAAAA/1VVVVVVX8AAAAAAAAAAAP9VVVVVV/AAAAAAAAAAAAD9VVVVVfAAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAD3wAAAAAAAADwAAAAAAAAPfAAAAAAAAA/wAAAAAAAA98AAAAAAAAPXwAAAAAAAD3wAAAAAAAA9XwAAAAAAAPfAAAAAAAAPVfAAAAAAAA98AAAAAAAA9V8AAAAAAAD3wAAAAAAAD1XwAAAAAAAPfAAAAAAAAPVfAAAAAAAAP8AAAAAAAA9V8AAAAAAAA/wAAAAAAAD1XwAAAAAAAD/AAAAAAAAPVfAAAAAAAAP8AAAAAAAA9V8AAAAAAAA/wAAAAAAAD1XwAAAAAAAD/AAAAAAAAPVfAAAAAAAAP8AAAAAAAA9V8AAAAAAAA/wAAAAAAAD1XwAAAAAAAD/AAAAAAAAPVfAAAAAAAAP8AAAAAAAA9V8AAAAAAAA/wAAAAAAAD1XwAAAAAAAD/AAAAAAAAPVfAAAAAAAAPfAAAAAAAA9V8AAAAAAAA98AAAAAAAA9fAAAAAAAAD3wAAAAAAAA/wAAAAAAAAPfAAAAAAAAA8AAAAAAAAA98AAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAAPVV/AAAAAAAAAAAAAAAAA9VV/AAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAAPVVVfwAAAAAPAAAAAAAAA9VVVf/AAAAP/AAAAAAAAD1VVVX//wP/9fAAAAAAAAPVVVVVf///9V8AAAAAAAA9VVVVVVX9VVXwAAAAAAAD1VVVVVVVVVVfAAAAAAAAPV////////9V8AAAAAAAA9f////////9XwAAAAAAAD18AAAAAAAD1fAAAAAAAAPfAAAAAAAAPV8AAAAAAAA98AAAAAAAA9XwAAAAAAAD3wAAAAAAAD1fAAAAAAAAPfAAAAAAAAPV8AAAAAAAA98AAAAAAAA9XwAAAAAAAD3wAAAAAAAD1fAAAAAAAAPfAAAAAAAAD3wAAAAAAAA9fAAAAAAAAD8AAAAAAAAD18AAAAAAAADAAAAAAAAAPXwAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAD1VVVV/AAAAAAAAAAAAAA9VVVVV/AAAAAAAAAAAAA/VVVVVVfwAAAAAAAAAAAP1VVVVVVfwAAAAAAAAAAP1VVVVVVVX/AAAAAAAAAP9VVVVVVVVX/wAAAAAAA/9VVVVVVVVVVf////////9VVVVVVVVVVVX///////1VVVVVU="}, + {"width" : "27", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf//VVVVVf////VVVV/wAA/1VVfwAAAA/VV/AAAAAP1V8AAAAAD1XwAAAAAA9fAAAAAAAPfAAAAAAAPfAAAAAAAP8AAAAAAAP8AAAAAAAP8AAAAAAAP8AAAAAAAP8AAAAAAAP8AAAAAAAP8AAAAAAAP8AAAAAAAP8AAAAAAAPfAAAAAAAPfAAAAAAAPXwAAAAAA9XwAAAAAA9V8AAAAAD1VfwAAAA/VVX/AAAP9VVVf////VVVVV///1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV///1VVVVf////VVVX/AAAP9VVfwAAAA/VV8AAAAAD1XwAAAAAA9XwAAAAAAPfAAAAAAAPfAAAAAAAPfAAAAAAAP8AAAAAAAP8AAAAAAAP8AAAAAAAP8AAAAAAAP8AAAAAAAP8AAAAAAAP8AAAAAAAP8AAAAAAAPfAAAAAAAPfAAAAAAAPfAAAAAAAPXwAAAAAA9V8AAAAAD1V/AAAAAP1VXwAAAA/VVV/wAA/1VVVf////VVVVVf//VVV"} + ] +} diff --git a/apps/contourclock/font-Nunito.json b/apps/contourclock/font-Nunito.json new file mode 100644 index 000000000..597cd1ac5 --- /dev/null +++ b/apps/contourclock/font-Nunito.json @@ -0,0 +1,17 @@ +{ + "name":"Nunito", + "size":"80", + "characters":[ + {"width" : "62", "buffer":"VVVVVVV//////9VVVVVVVVVVVVX////////1VVVVVVVVVVX/wAAAAAA/9VVVVVVVVVV/AAAAAAAAD/VVVVVVVVV/AAAAAAAAAA/VVVVVVVVfwAAAAAAAAAAP1VVVVVVXwAAAAAAAAAAAP1VVVVVV8AAAAAAAAAAAAD1VVVVVfAAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAAAPVVVVV8AAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAAPVVXwAAAAAAA/8AAAAAAAPVV8AAAAAAA//8AAAAAAA9VXwAAAAAAP1V8AAAAAAD1VfAAAAAAD1VV8AAAAAAD1XwAAAAAA9VVV8AAAAAAPVfAAAAAAD1VVV8AAAAAA9V8AAAAAA9VVVXwAAAAAD1XwAAAAAD1VVVfAAAAAAD18AAAAAAPVVVVfAAAAAAPXwAAAAAD1VVVV8AAAAAA9fAAAAAAPVVVVXwAAAAAD18AAAAAA9VVVVfAAAAAAPXwAAAAAD1VVVV8AAAAAAPfAAAAAAPVVVVXwAAAAAA98AAAAAA9VVVVXwAAAAAD/AAAAAAD1VVVVfAAAAAAP8AAAAAAPVVVVV8AAAAAA/wAAAAAA9VVVVXwAAAAAD/AAAAAAD1VVVVfAAAAAAP8AAAAAA9VVVVV8AAAAAA/wAAAAAD1VVVVXwAAAAAD/AAAAAAPVVVVVfAAAAAAP8AAAAAA9VVVVV8AAAAAA/wAAAAAD1VVVVXwAAAAAD/AAAAAAPVVVVVfAAAAAAP8AAAAAA9VVVVV8AAAAAA/wAAAAAA9VVVVXwAAAAAD/AAAAAAD1VVVVfAAAAAAP8AAAAAAPVVVVV8AAAAAA/wAAAAAA9VVVVXwAAAAAD3wAAAAAD1VVVVfAAAAAAPfAAAAAAPVVVVXwAAAAAA98AAAAAA9VVVVfAAAAAAD3wAAAAAD1VVVV8AAAAAA9fAAAAAAPVVVVXwAAAAAD18AAAAAA9VVVVfAAAAAAPXwAAAAAA9VVVV8AAAAAA9XwAAAAAD1VVVfAAAAAAD1fAAAAAAPVVVV8AAAAAA9V8AAAAAAPVVVXwAAAAAD1XwAAAAAA9VVV8AAAAAAPVXwAAAAAA9VVXwAAAAAA9VfAAAAAAA9VV8AAAAAAPVV8AAAAAAA9V/AAAAAAA9VV8AAAAAAA//wAAAAAAD1VXwAAAAAAA/wAAAAAAA9VVXwAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAAA9VVVVVXwAAAAAAAAAAAAPVVVVVVfwAAAAAAAAAAAD1VVVVVVfwAAAAAAAAAAD9VVVVVVVXwAAAAAAAAAA/VVVVVVVVX8AAAAAAAAA/VVVVVVVVVX/AAAAAAAA/1VVVVVVVVVV/8AAAAAD/1VVVVVVVVVVVf///////1VVVVVVVVVVVVV//////VVVVVVVQ=="}, + {"width" : "61", "buffer":"VVVVVVVVf////VVVVVVVVVVVVVVV/////9VVVVVVVVVVVVVX/AAAAD1VVVVVVVVVVVVf8AAAAAPVVVVVVVVVVVVfwAAAAAA9VVVVVVVVVVV/AAAAAAAPVVVVVVVVVVX/AAAAAAAA9VVVVVVVVVX8AAAAAAAAPVVVVVVVVVfwAAAAAAAAD1VVVVVVVVfwAAAAAAAAA9VVVVVVVV/AAAAAAAAAAPVVVVVVVV/AAAAAAAAAAD1VVVVVVX8AAAAAAAAAAA9VVVVVVX8AAAAAAAAAAAPVVVVVVXwAAAAAAAAAAAD1VVVVVXwAAAAAAAAAAAA9VVVVVXwAAAAAAAAAAAAPVVVVVV8AAAAAAAAAAAAD1VVVVVfAAAAAAAAAAAAA9VVVVVfAAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAAD1VVVVV8AAAAAAAAAAAAA9VVVVVfAAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAAD1VVVVVfAAAAAAAAAAAAA9VVVVVXwAAAAAAAAAAAAPVVVVVVfAAAAPAAAAAAAD1VVVVVXwAAA/8AAAAAAA9VVVVVVfAAD/XwAAAAAAPVVVVVVV///9V8AAAAAAD1VVVVVVX//1VfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVX///wAAAAAAA///9VVVV////wAAAAAAAD////VVX/wAAAAAAAAAAAAAAP9VX8AAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAA/VVf/////////////////VVV////////////////9VVVVVVVVVVVVVVVVVVVVVU="}, + {"width" : "61", "buffer":"VVVVV////////1VVVVVVVVVVf/////////9VVVVVVVVX/8AAAAAAAA/9VVVVVVVf/AAAAAAAAAAP9VVVVVV/wAAAAAAAAAAAP1VVVVV/AAAAAAAAAAAAAP1VVVV8AAAAAAAAAAAAAA/VVVV8AAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAPVV8AAAAAD/8AAAAAAAAD1VXwAAAD////AAAAAAAAPVVfAAA//1Vf8AAAAAAAD1VV/wP/1VVVXwAAAAAAA9VVX//9VVVVVfAAAAAAAPVVVV/VVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVV8AAAAAAA9VVVVVVVVVVV8AAAAAAA9VVVVVVVVVVV8AAAAAAAPVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVV8AAAAAAAD1VVVVVVVVVV8AAAAAAAA9VVVVVVVVVV8AAAAAAAA9VVVVVVVVVV8AAAAAAAA9VVVVVVVVVV8AAAAAAAA9VVVVVVVVVV8AAAAAAAAPVVVVVVVVVV8AAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAA//////1VVVXwAAAAAAAAD//////9VVXwAAAAAAAAAAAAAAA/9VXwAAAAAAAAAAAAAAAAP1V8AAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAA9VV/AAAAAAAAAAAAAAAD9VVX////////////////9VVVX///////////////1VVVVVVVVVVVVVVVVVVVVVU="}, + {"width" : "60", "buffer":"VVVVVf///////9VVVVVVVVVV//////////9VVVVVVVVf/wAAAAAAAD/1VVVVVVf/AAAAAAAAAAD/VVVVVX/wAAAAAAAAAAAP9VVVVfwAAAAAAAAAAAAA/VVVV8AAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAPVV8AAAAAD/8AAAAAAAAD1VfAAAA////8AAAAAAAD1VXwAA//9VX/AAAAAAAD1VV////VVVVXwAAAAAAD1VVf//VVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVX8AAAAAAPVVVVVVVVVVV/wAAAAAA9VVVVVVVX///8AAAAAAA9VVVVVVX////AAAAAAAD1VVVVVVf8AAAAAAAAAAD1VVVVVV8AAAAAAAAAAAPVVVVVVXwAAAAAAAAAAD9VVVVVVXwAAAAAAAAAAP1VVVVVVfAAAAAAAAAAA9VVVVVVVfAAAAAAAAAAD1VVVVVVVfAAAAAAAAAAD1VVVVVVVfAAAAAAAAAAA/VVVVVVVfAAAAAAAAAAAP1VVVVVVfAAAAAAAAAAAA/VVVVVVfAAAAAAAAAAAAP1VVVVVXwAAAAAAAAAAAA9VVVVVXwAAAAAAAAAAAAPVVVVVV8AAAAAAAAAAAAPVVVVVVfwAAAAAAAAAAAD1VVVVVX////8AAAAAAAD1VVVVVVf////8AAAAAAA9VVVVVVVVVVX/AAAAAAA9VVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVX/1VVVVVVV8AAAAAAPVX///1VVVVVXwAAAAAAPVf8AP/1VVVV/AAAAAAAPV8AAAP//9f/8AAAAAAAPXwAAAAP////AAAAAAAAPXwAAAAAADwAAAAAAAAAPfAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAD9VVVfAAAAAAAAAAAAAA/1VVVX/AAAAAAAAAAAAP9VVVVV//AAAAAAAAAAD/VVVVVVV//wAAAAAAAP/1VVVVVVVV//////////9VVVVVVVVVVf///////1VVVVVV"}, + {"width" : "65", "buffer":"VVVVVVVVVVVVf///1VVVVVVVVVVVVVVVVf////9VVVVVVVVVVVVVVVX8AAAD9VVVVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVVVVfAAAAAD1VVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVVXwAAAAAAAD1VVVVVVVVVVV8AAAAAAAAPVVVVVVVVVVVXwAAAAAAAA9VVVVVVVVVVV8AAAAAAAAD1VVVVVVVVVVfAAAAAAAAAPVVVVVVVVVVV8AAAAAAAAA9VVVVVVVVVVfAAAAAAAAAD1VVVVVVVVVXwAAAAAAAAAPVVVVVVVVVV8AAAAAAAAAA9VVVVVVVVVXwAAAAAAAAAD1VVVVVVVVV8AAAAAAAAAAPVVVVVVVVVfAAAAAAAAAAA9VVVVVVVVV8AAAAAAAAAAD1VVVVVVVVfAAAAAAAAAAAPVVVVVVVVXwAAAAAAAAAAA9VVVVVVVVfAAAAAAAAAAAD1VVVVVVVXwAAAAAAAAAAAPVVVVVVVV8AAAAAAAAAAAA9VVVVVVVXwAAAAAAAAAAAD1VVVVVVV8AAAAAAAAAAAAPVVVVVVVfAAAAAAAAAAAAA9VVVVVVV8AAAAAwAAAAAAD1VVVVVVfAAAAAPwAAAAAAPVVVVVVXwAAAAD3wAAAAAA9VVVVVVfAAAAA9fAAAAAAD1VVVVVXwAAAAD18AAAAAAPVVVVVV8AAAAA9XwAAAAAA9VVVVVfAAAAAPVfAAAAAAD1VVVVV8AAAAA9V8AAAAAAPVVVVVfAAAAAPVXwAAAAAA9VVVVXwAAAAD1VfAAAAAAD1VVVVfAAAAAPVV8AAAAAAPVVVVXwAAAAD1VXwAAAAAA9VVVV8AAAAAPVVfAAAAAAD1VVVXwAAAAD1VV8AAAAAAPVVVV8AAAAA9VVXwAAAAAA9VVVXwAAAAD1VVfAAAAAAD1VVV8AAAAAD///wAAAAAAD/1VXwAAAAAD//8AAAAAAAD//VfAAAAAAAAAAAAAAAAAAD/XwAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAAAPX8AAAAAAAAAAAAAAAAAAD1X/AAAAAAAAAAAAAAAAAD9VV////////8AAAAAAAD//VVVf///////8AAAAAAA//VVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVV8AAAAAD1VVVVVVVVVVVVVXwAAAAAPVVVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVVVVV8AAAAPVVVVVVVVVVVVVVVV/AAAP1VVVVVVVVVVVVVVVV////9VVVVVVVVVVVVVVVVVf//9VVVVVQ=="}, + {"width" : "60", "buffer":"VVVX///////////1VVVVVV///////////////VVVVX/8AAAAAAAAAAAP/9VVVfAAAAAAAAAAAAAAA/VVV8AAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAA/VVfAAAAAAAAAAAAAAP/1VVfAAAAAAA/////////VVVfAAAAAAD///////1VVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPV/////VVVVVVfAAAAAAD///////VVVVVfAAAAAAA/AAAAA/9VVVVfAAAAAAAAAAAAAA/1VVVfAAAAAAAAAAAAAAD9VVVfAAAAAAAAAAAAAAAP1VVfAAAAAAAAAAAAAAAD9VVfAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAA9XwAAAAAA//wAAAAAAAA9XwAAAAA////wAAAAAAA9XwAAAAP/VVf8AAAAAAA9V/AAAP/VVVVfAAAAAAAPVf////1VVVVXwAAAAAAPVV///1VVVVVV8AAAAAAPVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVV8AAAAAAPVVX1VVVVVVVV8AAAAAAPVX//1VVVVVVXwAAAAAAPV/8P/1VVVVVfAAAAAAA9X8AAP/9VVVX8AAAAAAA9fAAAAP//9//wAAAAAAA9fAAAAAD///8AAAAAAAA98AAAAAAADAAAAAAAAAD18AAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAP1VVXwAAAAAAAAAAAAAA/VVVV/AAAAAAAAAAAAAP1VVVVf/AAAAAAAAAAAD/VVVVVV//AAAAAAAAAA/1VVVVVVV//wAAAAAAD/9VVVVVVVVV//////////VVVVVVVVVVVf//////9VVVVVVV"}, + {"width" : "62", "buffer":"VVVVVVVVX///////1VVVVVVVVVVVf/////////VVVVVVVVVV//AAAAAAAD/9VVVVVVVV/8AAAAAAAAAP/VVVVVVVfwAAAAAAAAAAA/VVVVVVfwAAAAAAAAAAAAPVVVVVX8AAAAAAAAAAAAAPVVVVV8AAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAA9VV8AAAAAAAAD//AAAAAPVVfAAAAAAAAP////AAAA9VV8AAAAAAAP/VVf//AA/VVXwAAAAAAD9VVVVf///1VV8AAAAAAA9VVVVVVf/1VVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVV8AAAAAA9VVVX/VVVVVVVfAAAAAAPVVX////1VVVVV8AAAAAA9VX//AP/9VVVVXwAAAAAD1X/AAAAD/VVVVfAAAAAAPX/AAAAAA/VVVV8AAAAAD1/AAAAAAAP1VVXwAAAAAPfAAAAAAAAP1VV8AAAAAAPwAAAAAAAAD1VXwAAAAAAMAAAAAAAAAD1VfAAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAAPXwAAAAAAAAA/AAAAAAAA9fAAAAAAAAA//wAAAAAAA98AAAAAAAA/1fwAAAAAAD3wAAAAAAAP1VXwAAAAAAPfAAAAAAAD1VVXwAAAAAA9fAAAAAAAPVVVXwAAAAAD18AAAAAAD1VVVXwAAAAAD3wAAAAAAPVVVVfAAAAAAPfAAAAAAA9VVVV8AAAAAA98AAAAAAD1VVVXwAAAAAD3wAAAAAAPVVVVfAAAAAAPXwAAAAAA9VVVV8AAAAAA9fAAAAAAD1VVVXwAAAAAPV8AAAAAAPVVVVfAAAAAA9XwAAAAAA9VVVV8AAAAAD1XwAAAAAA9VVVfAAAAAAPVfAAAAAAD1VVXwAAAAAA9V8AAAAAAD1VV8AAAAAAD1V8AAAAAAD9V/AAAAAAA9VXwAAAAAAD//wAAAAAAD1VXwAAAAAAA/wAAAAAAAPVVfAAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAD1VVVVXwAAAAAAAAAAAAA9VVVVVXwAAAAAAAAAAAAPVVVVVVX8AAAAAAAAAAAD1VVVVVVX8AAAAAAAAAAD9VVVVVVVV/AAAAAAAAAD/VVVVVVVVV/8AAAAAAAD/VVVVVVVVVVf/wAAAAAD/VVVVVVVVVVVV////////VVVVVVVVVVVVVX//////VVVVVVQ=="}, + {"width" : "63", "buffer":"VVV//////////////1VVVVX/////////////////VVV//AAAAAAAAAAAAAAP/9VX8AAAAAAAAAAAAAAAAA/VXwAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAA9X8AAAAAAAAAAAAAAAAAA9Vf/wAAAAAAAAAAAAAAAD1VX/////////wAAAAAAAD1VVVf///////8AAAAAAAPVVVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVXwAAAAAPVVVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVVVVfwAAA/1VVVVVVVVVVVVVVX/////VVVVVVVVVVVVVVVVf///VVVVVVVVVVVVV"}, + {"width" : "64", "buffer":"VVVVVVX///////9VVVVVVVVVVVV//////////VVVVVVVVVVX/wAAAAAAAP/1VVVVVVVVf8AAAAAAAAAD/1VVVVVVV/wAAAAAAAAAAA/VVVVVVV/AAAAAAAAAAAAA/VVVVVV8AAAAAAAAAAAAAD9VVVVV8AAAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAAD1VfAAAAAAAD//wAAAAAAA9VXwAAAAAAD///wAAAAAAPVV8AAAAAAD1VV/AAAAAAA9VfAAAAAAD1VVV8AAAAAAPVXwAAAAAD1VVVfAAAAAAD1V8AAAAAD1VVVV8AAAAAA9VfAAAAAA9VVVVfAAAAAAPVXwAAAAAPVVVVXwAAAAAD1V8AAAAAD1VVVV8AAAAAD1VfAAAAAA9VVVVfAAAAAA9VXwAAAAAPVVVVXwAAAAAPVVfAAAAAA9VVVXwAAAAAD1VXwAAAAAD1VVXwAAAAAA9VV8AAAAAAPVVXwAAAAAA9VVXwAAAAAA///wAAAAAAPVVV8AAAAAAD//wAAAAAAPVVVXwAAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAAAD1VVVVV8AAAAAAAAAAAAAD1VVVVVXwAAAAAAAAAAAAD1VVVVVVfAAAAAAAAAAAAA9VVVVVVfAAAAAAAAAAAAAD1VVVVV/AAAAAAAAAAAAAAPVVVVV/AAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAAA9VXwAAAAAAD///AAAAAAAD1XwAAAAAAP////AAAAAAA9V8AAAAAAP1VVX8AAAAAAD18AAAAAAPVVVVXwAAAAAA9fAAAAAAPVVVVVfAAAAAAPXwAAAAAPVVVVVV8AAAAAD18AAAAAD1VVVVVfAAAAAAPfAAAAAA9VVVVVV8AAAAAD3wAAAAAPVVVVVVfAAAAAA/wAAAAAD1VVVVVfAAAAAAP8AAAAAA9VVVVVXwAAAAAD/AAAAAAPVVVVVV8AAAAAA98AAAAAA9VVVVV8AAAAAAPfAAAAAAD1VVVV8AAAAAAD3wAAAAAAP9VVX8AAAAAAD18AAAAAAA////8AAAAAAA9fAAAAAAAAP//wAAAAAAAPV8AAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAAP1VVVV/AAAAAAAAAAAAAAP1VVVVX8AAAAAAAAAAAAA/VVVVVVX8AAAAAAAAAAAD/VVVVVVVf/AAAAAAAAAA/9VVVVVVVVf/8AAAAAAAP/1VVVVVVVVVX/////////9VVVVVVVVVVVVf///////VVVVVVU="}, + {"width" : "61", "buffer":"VVVVVV///////VVVVVVVVVVVVX////////1VVVVVVVVVVf8AAAAAAD/1VVVVVVVVV/wAAAAAAAA/1VVVVVVVX/AAAAAAAAAA/VVVVVVVX8AAAAAAAAAAA9VVVVVVXwAAAAAAAAAAAD9VVVVVXwAAAAAAAAAAAAP1VVVVXwAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAA9VV8AAAAAAA//AAAAAAAD1V8AAAAAAA//8AAAAAAA9VfAAAAAAA9VXwAAAAAAD1XwAAAAAA9VVfAAAAAAA9XwAAAAAA9VVV8AAAAAAD18AAAAAA9VVVXwAAAAAA9fAAAAAAPVVVV8AAAAAAPXwAAAAAPVVVVXwAAAAAD18AAAAAD1VVVV8AAAAAAPfAAAAAA9VVVVfAAAAAAD3wAAAAAPVVVVXwAAAAAA98AAAAAD1VVVV8AAAAAAPfAAAAAA9VVVVfAAAAAAA/wAAAAAD1VVVfAAAAAAAP8AAAAAA9VVVXwAAAAAAD/AAAAAAD1VVV8AAAAAAA/wAAAAAA9VVV8AAAAAAAP8AAAAAAD9VV8AAAAAAAD/AAAAAAAP/f8AAAAAAAA98AAAAAAAP/8AAAAAAAAPfAAAAAAAADAAAAAAAAAD3wAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAPVV8AAAAAAAAAMAAAAAAD1VXwAAAAAAAAPwAAAAAA9VVfAAAAAAAAPfAAAAAAPVVV/AAAAAAA/XwAAAAAD1VVX/AAAAAD/V8AAAAAA9VVVX/wAAAP9VfAAAAAA9VVVVX/////1VfAAAAAAPVVVVVV////VVXwAAAAAD1VVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVfAAAAAAA9VVf//VVVVVV/AAAAAAA9VV////1VVVX/AAAAAAAPVV/AAD//9f/8AAAAAAAPVV8AAAA////wAAAAAAAD1VfAAAAAAPAAAAAAAAAD1VfAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAP1VVV8AAAAAAAAAAAAAAP1VVVfAAAAAAAAAAAAAAPVVVVV8AAAAAAAAAAAAA/VVVVVXwAAAAAAAAAAAA/VVVVVVf8AAAAAAAAAAP9VVVVVVV/8AAAAAAAAA/9VVVVVVVVf/wAAAAAA//VVVVVVVVVVf////////9VVVVVVVVVVVV//////9VVVVVVVVU="}, + {"width" : "25", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX//1VVVVf///9VVV/wAA/1VV/AAAAPVV8AAAAA9V8AAAAAD1fAAAAAA9fAAAAAAD3wAAAAAA/wAAAAAAP8AAAAAAD/AAAAAAA/wAAAAAAP8AAAAAAD/AAAAAAA/wAAAAAAPfAAAAAAD3wAAAAAA98AAAAAA9XwAAAAAPVfAAAAAPVV8AAAAPVVX/AAA/VVVf////VVVVX//9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf//VVVVX////1VVX/AAD/VVXwAAAA9VXwAAAAD1XwAAAAAPXwAAAAAD18AAAAAAPfAAAAAAD/AAAAAAA/wAAAAAAP8AAAAAAD/AAAAAAA/wAAAAAAP8AAAAAAD/AAAAAAA98AAAAAAPfAAAAAAD18AAAAAD1fAAAAAA9V8AAAAA9VXwAAAA9VVf8AAP9VVV////9VVVVf//VVU="} + ] +} diff --git a/apps/contourclock/font-OpenSansEC.json b/apps/contourclock/font-OpenSansEC.json new file mode 100644 index 000000000..8d09bb2f5 --- /dev/null +++ b/apps/contourclock/font-OpenSansEC.json @@ -0,0 +1,17 @@ +{ + "name":"OpenSansEC", + "size":"100", + "characters":[ + {"width" : "55", "buffer":"VVVVVV//////1VVVVVVVVVVf///////1VVVVVVVVVf8AAAAAA/1VVVVVVVV/AAAAAAAA/VVVVVVVV/AAAAAAAAA9VVVVVVV8AAAAAAAAAD1VVVVVV8AAAAAAAAAAPVVVVVV8AAAAAAAAAAA9VVVVVfAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAPVVV8AAAAAA/wAAAAAD1VVfAAAAAA//AAAAAA9VVXwAAAAA9V8AAAAAD1VXwAAAAA9VXwAAAAA9VV8AAAAA9VVfAAAAAPVVfAAAAAPVVV8AAAAA9VfAAAAAPVVVfAAAAAPVXwAAAAD1VVXwAAAAD1V8AAAAD1VVVfAAAAA9VfAAAAA9VVVXwAAAAD1XwAAAAPVVVV8AAAAA9XwAAAAD1VVVfAAAAAPV8AAAAA9VVVXwAAAAD1fAAAAAPVVVVfAAAAA9XwAAAAPVVVVXwAAAAPV8AAAAD1VVVV8AAAAA9fAAAAA9VVVVfAAAAAPfAAAAAPVVVVXwAAAAD3wAAAAD1VVVV8AAAAA98AAAAA9VVVVfAAAAAPfAAAAAPVVVVXwAAAAD3wAAAAD1VVVV8AAAAA98AAAAA9VVVVfAAAAAPfAAAAAPVVVVXwAAAAD3wAAAAD1VVVV8AAAAA98AAAAA9VVVVfAAAAAPfAAAAAPVVVVXwAAAAD3wAAAAD1VVVVfAAAAAP8AAAAA9VVVVXwAAAAD/AAAAAPVVVVV8AAAAA/wAAAAD1VVVVfAAAAAP8AAAAA9VVVVXwAAAAD/AAAAAPVVVVV8AAAAA/wAAAAD1VVVVfAAAAAP8AAAAA9VVVVXwAAAAD/AAAAAPVVVVV8AAAAA/wAAAAD1VVVVfAAAAAP8AAAAA9VVVVXwAAAAD/AAAAAPVVVVV8AAAAA/wAAAAD1VVVVfAAAAAP8AAAAA9VVVVXwAAAAD/AAAAAPVVVVV8AAAAA/wAAAAD1VVVVfAAAAAP8AAAAA9VVVVXwAAAAD/AAAAAPVVVVV8AAAAD3wAAAAD1VVVV8AAAAA98AAAAA9VVVVfAAAAAPfAAAAAPVVVVXwAAAAD3wAAAAD1VVVV8AAAAA98AAAAA9VVVVfAAAAAPfAAAAAPVVVVXwAAAAD3wAAAAD1VVVV8AAAAA98AAAAA9VVVVfAAAAAPfAAAAAPVVVVXwAAAAD3wAAAAD1VVVV8AAAAA9fAAAAA9VVVVfAAAAAPXwAAAAPVVVVXwAAAAD18AAAAD1VVVV8AAAAD1fAAAAAPVVVVfAAAAA9XwAAAAD1VVVXwAAAAPV8AAAAA9VVVXwAAAAD1XwAAAAPVVVV8AAAAA9V8AAAAD1VVVfAAAAAPVfAAAAA9VVVXwAAAAPVXwAAAAD1VVXwAAAAD1V8AAAAA9VVV8AAAAA9VXwAAAAD1VVfAAAAAPVV8AAAAA9VVfAAAAAPVVfAAAAAD1VfAAAAAD1VV8AAAAAP1/AAAAAD1VVfAAAAAA//AAAAAA9VVXwAAAAAA8AAAAAAPVVVfAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAA9VVVVfAAAAAAAAAAAA9VVVVV8AAAAAAAAAAAPVVVVVfAAAAAAAAAAAPVVVVVV8AAAAAAAAAAPVVVVVVXwAAAAAAAAAPVVVVVVVfwAAAAAAAA/VVVVVVVV/wAAAAAAD/VVVVVVVVV/wAAAAAP9VVVVVVVVVV///////1VVVVVVVVVVV//////VVVVVVQ=="}, + {"width" : "44", "buffer":"VVVVVVVVV/////9VVVVVVVV//////1VVVVVVVfwAAAAPVVVVVVVXwAAAAA9VVVVVVV8AAAAAD1VVVVVVfAAAAAAPVVVVVVXwAAAAAA9VVVVVV8AAAAAAD1VVVVVfAAAAAAAPVVVVVXwAAAAAAA9VVVVV8AAAAAAAD1VVVV/AAAAAAAAPVVVVfwAAAAAAAA9VVVXwAAAAAAAAD1VVV8AAAAAAAAAPVVVfAAAAAAAAAA9VVXwAAAAAAAAAD1VV8AAAAAAAAAAPVVfAAAAAAAAAAA9VXwAAAAAAAAAAD1V8AAAAAAAAAAAPVfAAAAAAAAAAAA9XwAAAAADAAAAAD18AAAAAA/AAAAAPfAAAAAAPfAAAAA/wAAAAAD18AAAAD3wAAAAA9XwAAAAPXwAAAAPVfAAAAA9XwAAAD1V8AAAAD1XwAAA9VXwAAAAPVXwAAPVVfAAAAA9VXwAD1VV8AAAAD1VfAA9VVfAAAAAPVVfAD1VV8AAAAA9VVfA9VVXwAAAAD1VVf/VVVfAAAAAPVVVf1VVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVXwAAAAD1VVVVVVVfAAAAAPVVVVVVVV8AAAAA9VVVVVVVX//////1VVVVVVVf//////VVVVVVVVVVVVVVU="}, + {"width" : "55", "buffer":"VVVVVX//////1VVVVVVVVVV////////9VVVVVVVVX/wAAAAAA/9VVVVVVVX8AAAAAAAAP1VVVVVVfwAAAAAAAAAPVVVVVVfwAAAAAAAAAA9VVVVVfAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAPVVVV/AAAAAAAAAAAAA9VVV/AAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAA9VfAAAAAA//8AAAAAAPVV8AAAAD///wAAAAAA9VXwAAAD9VVfAAAAAAPVVfAAAP1VVV8AAAAAD1VV8AAP1VVVXwAAAAA9VVXwAPVVVVVfAAAAAPVVVfAPVVVVVXwAAAAD1VVV8PVVVVVV8AAAAAPVVVX/VVVVVVXwAAAAD1VVVfVVVVVVV8AAAAA9VVVVVVVVVVVfAAAAAPVVVVVVVVVVVXwAAAAD1VVVVVVVVVVV8AAAAA9VVVVVVVVVVVfAAAAAPVVVVVVVVVVVXwAAAAD1VVVVVVVVVVV8AAAAA9VVVVVVVVVVVfAAAAA9VVVVVVVVVVVfAAAAAPVVVVVVVVVVVXwAAAAD1VVVVVVVVVVV8AAAAA9VVVVVVVVVVVfAAAAAPVVVVVVVVVVVXwAAAAD1VVVVVVVVVVXwAAAAD1VVVVVVVVVVV8AAAAA9VVVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAAD1VVVVVVVVVVXwAAAAD1VVVVVVVVVVXwAAAAA9VVVVVVVVVVV8AAAAAPVVVVVVVVVVV8AAAAAPVVVVVVVVVVVfAAAAAD1VVVVVVVVVVfAAAAAD1VVVVVVVVVVXwAAAAA9VVVVVVVVVVXwAAAAA9VVVVVVVVVVXwAAAAAPVVVVVVVVVVV8AAAAAPVVVVVVVVVVV8AAAAAD1VVVVVVVVVV8AAAAAD1VVVVVVVVVVfAAAAAA9VVVVVVVVVVfAAAAAA9VVVVVVVVVVfAAAAAA9VVVVVVVVVVXwAAAAAPVVVVVVVVVVXwAAAAAPVVVVVVVVVVXwAAAAAPVVVVVVVVVVV8AAAAAD1VVVVVVVVVV8AAAAAD1VVVVVVVVVV8AAAAAD1VVVVVVVVVV8AAAAAD1VVVVVVVVVVfAAAAAA9VVVVVVVVVVfAAAAAA9VVVVVVVVVVfAAAAAA9VVVVVVVVVVXwAAAAA9VVVVVVVVVVXwAAAAAPVVVVVVVVVVXwAAAAAPVVVVVVVVVVV8AAAAAPVVVVVVVVVVV8AAAAAPVVVVVVVVVVV8AAAAAD1VVVVVVVVVV8AAAAAD1VVVVVVVVVVfAAAAAD1VVVVVVVVVVfAAAAAD1VVVVVVVVVVfAAAAAD1VVVVVVVVVVXwAAAAA9VVVVVVVVVVXwAAAAA9VVVVVVVVVVXwAAAAA9VVVVVVVVVVXwAAAAA9VVVVVVVVVVV8AAAAAPVVVVVVVVVVV8AAAAAPVVVVVVVVVVV8AAAAAA//////////9fAAAAAAD//////////fAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAD3/////////////////9//////////////////VVVVVVVVVVVVVVVVVVQ=="}, + {"width" : "55", "buffer":"VVVVV///////1VVVVVVVVVf////////9VVVVVVVX/8AAAAAAA/9VVVVVVX/AAAAAAAAAP1VVVVVfwAAAAAAAAAAP1VVVVfwAAAAAAAAAAA/VVVV/AAAAAAAAAAAAA9VVV/AAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAA9VXwAAAAA/wAAAAAAAPVVfAAAA///8AAAAAAD1VV8AAD/9V/wAAAAAAPVVfAAP9VVVfAAAAAAD1VV8AP1VVVV8AAAAAA9VVXw/VVVVVXwAAAAAPVVV8/VVVVVVfAAAAAD1VVX9VVVVVVXwAAAAA9VVVdVVVVVVVfAAAAAPVVVVVVVVVVVXwAAAAD1VVVVVVVVVVV8AAAAA9VVVVVVVVVVVfAAAAAPVVVVVVVVVVVXwAAAAD1VVVVVVVVVVV8AAAAA9VVVVVVVVVVVfAAAAAPVVVVVVVVVVVXwAAAAD1VVVVVVVVVVV8AAAAD1VVVVVVVVVVVfAAAAA9VVVVVVVVVVVXwAAAAPVVVVVVVVVVVXwAAAAPVVVVVVVVVVVV8AAAAD1VVVVVVVVVVV8AAAAA9VVVVVVVVVVV8AAAAA9VVVVVVVVVVV8AAAAAPVVVVVVVVVVV8AAAAAPVVVVVVVVVVX8AAAAAPVVVVVVVVVV/8AAAAAPVVVVVVX////wAAAAAP1VVVVVV///8AAAAAAPVVVVVVVfAAAAAAAAA/VVVVVVVXwAAAAAAAA/VVVVVVVV8AAAAAAAD9VVVVVVVVfAAAAAAAD9VVVVVVVVXwAAAAAAD1VVVVVVVVV8AAAAAAAP9VVVVVVVVfAAAAAAAA//VVVVVVVXwAAAAAAAAP9VVVVVVV8AAAAAAAAAD9VVVVVVfAAAAAAAAAAP1VVVVVXwAAAAAAAAAAPVVVVVV//8AAAAAAAAA9VVVVVf////AAAAAAAD1VVVVVVVf//wAAAAAA9VVVVVVVVVX/AAAAAAD1VVVVVVVVVV/AAAAAAPVVVVVVVVVVX8AAAAAD1VVVVVVVVVVXwAAAAAPVVVVVVVVVVVfAAAAAD1VVVVVVVVVVXwAAAAA9VVVVVVVVVVVfAAAAAPVVVVVVVVVVVXwAAAAA9VVVVVVVVVVV8AAAAAPVVVVVVVVVVVXwAAAAD1VVVVVVVVVVV8AAAAA9VVVVVVVVVVVfAAAAAPVVVVVVVVVVVXwAAAAD1VVVVVVVVVVV8AAAAA9VVVVVVVVVVVfAAAAAPVVVVVVVVVVVXwAAAAD1VVVVVVVVVVV8AAAAA9VVVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAAD1VVVVVVVVVVXwAAAAA9VVVVVVVVVVV8AAAAAPdVVVVVVVVVV8AAAAAPf9VVVVVVVVV8AAAAAD3/9VVVVVVVV8AAAAAA98P/VVVVVVV8AAAAAAPfAP/VVVVVX8AAAAAAPXwAD//VVV/8AAAAAAD18AAD/////wAAAAAAD1fAAAAD//8AAAAAAAA9XwAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAP1VV8AAAAAAAAAAAAAP1VVfAAAAAAAAAAAAA/VVVX/AAAAAAAAAAAA/VVVVf/AAAAAAAAAAP9VVVVVX/8AAAAAAAD/9VVVVVVX//////////VVVVVVVVVf///////1VVVVVVQ=="}, + {"width" : "60", "buffer":"VVVVVVVVVX//////9VVVVVVVVVVVVX//////9VVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVV8AAAAAAA9VVVVVVVVVVV8AAAAAAA9VVVVVVVVVVV8AAAAAAA9VVVVVVVVVVXwAAAAAAA9VVVVVVVVVVXwAAAAAAA9VVVVVVVVVVfAAAAAAAA9VVVVVVVVVVfAAAAAAAA9VVVVVVVVVV8AAAAAAAA9VVVVVVVVVV8AAAAAAAA9VVVVVVVVVXwAAAAAAAA9VVVVVVVVVXwAAAAAAAA9VVVVVVVVVfAAAAAAAAA9VVVVVVVVVfAAAAAAAAA9VVVVVVVVV8AAAAAAAAA9VVVVVVVVV8AAAAAAAAA9VVVVVVVVXwAAAAAAAAA9VVVVVVVVXwAAAAAAAAA9VVVVVVVVfAAAAAAAAAA9VVVVVVVVfAAAAAAAAAA9VVVVVVVVfAAAAMAAAAA9VVVVVVVV8AAAA/AAAAA9VVVVVVVV8AAAD3wAAAA9VVVVVVVXwAAAD3wAAAA9VVVVVVVXwAAAD3wAAAA9VVVVVVVfAAAAPXwAAAA9VVVVVVVfAAAAPXwAAAA9VVVVVVV8AAAA9XwAAAA9VVVVVVV8AAAA9XwAAAA9VVVVVVXwAAAD1XwAAAA9VVVVVVXwAAAD1XwAAAA9VVVVVVfAAAAD1XwAAAA9VVVVVVfAAAAPVXwAAAA9VVVVVV8AAAAPVXwAAAA9VVVVVV8AAAA9VXwAAAA9VVVVVXwAAAA9VXwAAAA9VVVVVXwAAAD1VXwAAAA9VVVVVfAAAAD1VXwAAAA9VVVVVfAAAAPVVXwAAAA9VVVVVfAAAAPVVXwAAAA9VVVVV8AAAA9VVXwAAAA9VVVVV8AAAA9VVXwAAAA9VVVVXwAAAD1VVXwAAAA9VVVVXwAAAD1VVXwAAAA9VVVVfAAAAD1VVXwAAAA9VVVVfAAAAPVVVXwAAAA9VVVV8AAAAPVVVXwAAAA9VVVV8AAAA9VVVXwAAAA9VVVXwAAAA9VVVXwAAAA9VVVXwAAAD1VVVXwAAAA9VVVfAAAAD1VVVXwAAAA9VVVfAAAAPVVVVXwAAAA9VVV8AAAAPVVVVXwAAAA9VVV8AAAAD/////AAAAAP///8AAAAA////8AAAAAD///8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAP//////////8AAAAAD//////////////AAAAAP///VVVVVVVVVVXwAAAA9VVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVVVX/////9VVVVVVVVVVVVVX/////9VVVVVVVVVVVVVVVVVVVVVVV"}, + {"width" : "53", "buffer":"VX//////////////VVVf/////////////9VVV8AAAAAAAAAAAAD1VVXwAAAAAAAAAAAAPVVVfAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAD1VVfAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAA9VVXwAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAA9VVXwAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAA9VVXwAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAPVVV8AAAAA////////9VVXwAAAAP////////1VVfAAAAD1VVVVVVVVVVV8AAAAPVVVVVVVVVVVXwAAAA9VVVVVVVVVVVfAAAAD1VVVVVVVVVVXwAAAAPVVVVVVVVVVVfAAAAA9VVVVVVVVVVV8AAAAD1VVVVVVVVVVXwAAAAPVVVVVVVVVVVfAAAAA9VVVVVVVVVVV8AAAAD1VVVVVVVVVVXwAAAAPVVVVVVVVVVVfAAAAA9VVVVVVVVVVV8AAAAD1VVVVVVVVVVXwAAAAPVVVVVVVVVVVfAAAAD1VVVVVVVVVVV8AAAAPVVVVVVVVVVVXwAAAA9VVVVVVVVVVVfAAAAD1VVVVVVVVVVV8AAAAPVVVVVVVVVVVXwAAAAP////9VVVVVVfAAAAAP/////VVVVVXwAAAAAAAAAA/1VVVVfAAAAAAAAAAAP9VVVV8AAAAAAAAAAAD/VVVXwAAAAAAAAAAAA/VVVfAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAPVVXwAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAPVV/AAAA/wAAAAAAAAPVV/AD////8AAAAAAA9VVf///1X/8AAAAAAA9VVf/VVVVV/AAAAAAD1VVVVVVVVV/AAAAAAPVVVVVVVVVVfAAAAAA9VVVVVVVVVVfAAAAAA9VVVVVVVVVV8AAAAAD1VVVVVVVVVV8AAAAAPVVVVVVVVVVXwAAAAA9VVVVVVVVVVfAAAAAD1VVVVVVVVVVfAAAAAPVVVVVVVVVVV8AAAAA9VVVVVVVVVVXwAAAAD1VVVVVVVVVVfAAAAAPVVVVVVVVVVV8AAAAA9VVVVVVVVVVXwAAAAD1VVVVVVVVVVfAAAAAPVVVVVVVVVVV8AAAAA9VVVVVVVVVVXwAAAAD1VVVVVVVVVVfAAAAAPVVVVVVVVVVV8AAAAA9VVVVVVVVVVXwAAAAD1VVVVVVVVVV8AAAAAPVVVVVVVVVVXwAAAAA9VVVVVVVVVVfAAAAAD3VVVVVVVVVXwAAAAA9/1VVVVVVVVfAAAAAD3/9VVVVVVVXwAAAAAPfD/VVVVVVV8AAAAAA98A/1VVVVVfAAAAAAPXwAP/VVVVfwAAAAAA9fAAD/////8AAAAAAPV8AAAP///8AAAAAAA9XwAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAD1VXwAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAD1VVXwAAAAAAAAAAAD9VVVX8AAAAAAAAAAA/VVVVX/AAAAAAAAAD/VVVVVV//AAAAAAAP/1VVVVVVf/////////VVVVVVVVVf//////9VVVVVVU="}, + {"width" : "56", "buffer":"VVVVVVVVVf//////9VVVVVVVVVX////////1VVVVVVVVX/8AAAAAAPVVVVVVVVX/AAAAAAAA9VVVVVVVX/AAAAAAAAD1VVVVVVV/AAAAAAAAAPVVVVVVVfAAAAAAAAAA9VVVVVVXwAAAAAAAAAD1VVVVVV8AAAAAAAAAAPVVVVVVfAAAAAAAAAAA9VVVVVXwAAAAAAAAAAD1VVVVV8AAAAAAAAAAAPVVVVVfAAAAAAAAAAAA9VVVVV8AAAAAAAAAAAD1VVVVfAAAAAAAA///8PVVVVXwAAAAAAD/////9VVVVfAAAAAAD/1VVV/1VVVXwAAAAAD/VVVVVVVVVVfAAAAAA/VVVVVVVVVVXwAAAAAPVVVVVVVVVVVfAAAAAD1VVVVVVVVVVXwAAAAA9VVVVVVVVVVVfAAAAAPVVVVVVVVVVVV8AAAAD1VVVVVVVVVVVfAAAAA9VVVVVVVVVVVV8AAAAD1VVVVVVVVVVVXwAAAA9VVVVVVVVVVVVfAAAAD1VVVVVVVVVVVXwAAAAPVVVVVVVVVVVVfAAAAD1VVVVVVVVVVVV8AAAAPVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVV8AAAAPVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVVfAAAAD1VVVVVVVVVVVV8AAAAPVVV///9VVVVVXwAAAD1VX/////VVVVVfAAAAPVX/wAAA/1VVVV8AAAA9V/AAAAAP9VVVfAAAAD1fAAAAAAD9VVV8AAAAPXwAAAAAAA9VVXwAAAA98AAAAAAAA9VVfAAAAD/AAAAAAAAD1VV8AAAAx8AAAAAAAAD1VXwAAAAzAAAAAAAAAD1VfAAAAAwAAAAAAAAAPVV8AAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAD1XwAAAAAAD//AAAAAAPVfAAAAAAA///AAAAAAPV8AAAAAAPVVfAAAAAA9XwAAAAAD1VVfAAAAAD1fAAAAAA9VVV8AAAAAPV8AAAAAPVVVV8AAAAAPfAAAAAA9VVVXwAAAAA98AAAAAPVVVVXwAAAAD18AAAAA9VVVVfAAAAAPXwAAAAD1VVVV8AAAAA9fAAAAAPVVVVXwAAAAD18AAAAA9VVVVXwAAAAPXwAAAAD1VVVVfAAAAAPfAAAAA9VVVVV8AAAAA98AAAAD1VVVVXwAAAAD3wAAAAPVVVVVfAAAAAPfAAAAA9VVVVV8AAAAA98AAAAD1VVVVXwAAAAD3wAAAAD1VVVVfAAAAAPfAAAAAPVVVVV8AAAAA98AAAAA9VVVVXwAAAAPXwAAAAD1VVVVfAAAAA9fAAAAAPVVVVV8AAAAD1fAAAAA9VVVVfAAAAAPV8AAAAD1VVVV8AAAAA9XwAAAAPVVVVXwAAAAD1fAAAAAPVVVVfAAAAAPV8AAAAA9VVVXwAAAAD1V8AAAAD1VVVfAAAAAPVXwAAAAD1VVV8AAAAA9VfAAAAAPVVVfAAAAAD1V8AAAAAPVVXwAAAAA9VV8AAAAAPVV8AAAAAD1VXwAAAAAP1/AAAAAAPVVXwAAAAAP/wAAAAAD1VVfAAAAAADwAAAAAAPVVV8AAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAD1VVVVfAAAAAAAAAAAA9VVVVVfAAAAAAAAAAAPVVVVVVfAAAAAAAAAAD1VVVVVVfAAAAAAAAAA9VVVVVVVfwAAAAAAAA/VVVVVVVVf8AAAAAAAP1VVVVVVVVX/AAAAAA/1VVVVVVVVVV///////9VVVVVVVVVVVf/////1VVVVVU="}, + {"width" : "54", "buffer":"VVVVVVVVVVVVVVVVVV////////////////////////////////////8AAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAP///////////AAAAAA9///////////wAAAAA9VVVVVVVVVVV8AAAAA9VVVVVVVVVVV8AAAAD1VVVVVVVVVVV8AAAAD1VVVVVVVVVVXwAAAAD1VVVVVVVVVVXwAAAAPVVVVVVVVVVVXwAAAAPVVVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAA9VVVVVVVVVVVfAAAAA9VVVVVVVVVVV8AAAAA9VVVVVVVVVVV8AAAAD1VVVVVVVVVVV8AAAAD1VVVVVVVVVVXwAAAAD1VVVVVVVVVVXwAAAAPVVVVVVVVVVVXwAAAAPVVVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAA9VVVVVVVVVVV8AAAAA9VVVVVVVVVVV8AAAAA9VVVVVVVVVVV8AAAAD1VVVVVVVVVVXwAAAAD1VVVVVVVVVVXwAAAAD1VVVVVVVVVVXwAAAAPVVVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAA9VVVVVVVVVVV8AAAAA9VVVVVVVVVVV8AAAAA9VVVVVVVVVVV8AAAAD1VVVVVVVVVVXwAAAAD1VVVVVVVVVVXwAAAAD1VVVVVVVVVVXwAAAAD1VVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAA9VVVVVVVVVVV8AAAAA9VVVVVVVVVVV8AAAAA9VVVVVVVVVVV8AAAAA9VVVVVVVVVVXwAAAAD1VVVVVVVVVVXwAAAAD1VVVVVVVVVVXwAAAAD1VVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAAPVVVVVVVVVVV8AAAAA9VVVVVVVVVVV8AAAAA9VVVVVVVVVVV8AAAAA9VVVVVVVVVVXwAAAAD1VVVVVVVVVVXwAAAAD1VVVVVVVVVVXwAAAAD1VVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAAPVVVVVVVVVVV8AAAAA9VVVVVVVVVVV8AAAAA9VVVVVVVVVVV8AAAAA9VVVVVVVVVVXwAAAAA9VVVVVVVVVVXwAAAAD1VVVVVVVVVVXwAAAAD1VVVVVVVVVVfAAAAAD1VVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAAPVVVVVVVVVVV8AAAAAPVVVVVVVVVVV8AAAAA9VVVVVVVVVVV8AAAAA9VVVVVVVVVVXwAAAAA9VVVVVVVVVVXwAAAAD1VVVVVVVVVVfAAAAAD1VVVVVVVVVVfAAAAAD1VVVVVVVVVVfAAAAAPVVVVVVVVVVV8AAAAAPVVVVVVVVVVV8AAAAAPVVVVVVVVVVV8AAAAAPVVVVVVVVVVXwAAAAA9VVVVVVVVVVXwAAAAA9VVVVVVVVVVXwAAAAA9VVVVVVVVVVXwAAAAD1VVVVVVVVVVfAAAAAD1VVVVVVVVVVf//////1VVVVVVVVVVf//////VVVVVVVVVVVVVVVVVVVVVVVVVVV"}, + {"width" : "56", "buffer":"VVVVVVf/////9VVVVVVVVVVV////////1VVVVVVVVV/8AAAAAA/9VVVVVVVVfwAAAAAAAD9VVVVVVVfwAAAAAAAAA/VVVVVVX8AAAAAAAAAA/VVVVVV8AAAAAAAAAAAPVVVVVfAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAD1VV8AAAAAAP/AAAAAAPVVXwAAAAAP//AAAAAAPVV8AAAAAD9VfAAAAAA9VXwAAAAA9VVfAAAAAD1VfAAAAAPVVVfAAAAAD1V8AAAAA9VVVfAAAAAPVfAAAAAPVVVV8AAAAA9V8AAAAA9VVVXwAAAAD1XwAAAAD1VVVXwAAAAPVfAAAAAPVVVVfAAAAA9V8AAAAA9VVVV8AAAAD1XwAAAAPVVVVXwAAAAPVfAAAAAPVVVVfAAAAA9V8AAAAA9VVVV8AAAAD1XwAAAAD1VVVXwAAAAPVfAAAAAPVVVV8AAAAA9VfAAAAA9VVVXwAAAAD1V8AAAAA9VVVfAAAAAPVXwAAAAD1VVV8AAAAD1VfAAAAAPVVVfAAAAAPVVfAAAAAPVVXwAAAAA9VV8AAAAAPVVfAAAAAPVVXwAAAAAPVXwAAAAA9VVXwAAAAAPV8AAAAAPVVVfAAAAAAPfAAAAAA9VVVfAAAAAAPwAAAAAPVVVVfAAAAAAMAAAAAD1VVVV8AAAAAAAAAAAA9VVVVV8AAAAAAAAAAAP1VVVVV8AAAAAAAAAAD9VVVVVV8AAAAAAAAAA9VVVVVVV8AAAAAAAAAPVVVVVVVV8AAAAAAAAD1VVVVVVVV8AAAAAAAA9VVVVVVVVV8AAAAAAAD1VVVVVVVVfAAAAAAAAD1VVVVVVVXwAAAAAAAAD1VVVVVVV8AAAAAAAAAD1VVVVVVfAAAAAAAAAAD1VVVVVXwAAAAAAAAAAD1VVVVV8AAAAAAAAAAAD1VVVVfAAAAAAAAAAAAD1VVVXwAAAAADAAAAAAD1VVV8AAAAAA/AAAAAAD1VVXwAAAAAPfAAAAAAPVVV8AAAAAD1fAAAAAAPVVXwAAAAA9VfAAAAAAPVV8AAAAAPVVfAAAAAA9VXwAAAAD1VVfAAAAAA9V8AAAAA9VVVfAAAAAD1XwAAAAD1VVVfAAAAAPVfAAAAA9VVVV8AAAAAPXwAAAAD1VVVV8AAAAA9fAAAAAPVVVVXwAAAAD18AAAAD1VVVVXwAAAAPXwAAAAPVVVVVfAAAAAPfAAAAA9VVVVV8AAAAA98AAAAD1VVVVV8AAAAD3wAAAAPVVVVVXwAAAAPfAAAAA9VVVVVfAAAAA/wAAAAD1VVVVV8AAAAD/AAAAAPVVVVVXwAAAAPfAAAAA9VVVVVfAAAAA98AAAAD1VVVVV8AAAAD3wAAAAPVVVVVfAAAAAPfAAAAA9VVVVV8AAAAA98AAAAA9VVVVXwAAAAPXwAAAAD1VVVV8AAAAA9fAAAAAD1VVVXwAAAAD18AAAAAD1VVV8AAAAAPV8AAAAAD1VVfAAAAAD1XwAAAAAD9V/wAAAAAPVfAAAAAAD//8AAAAAA9VfAAAAAAA/wAAAAAAPVV8AAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAD1VVVfwAAAAAAAAAAAA9VVVVfwAAAAAAAAAAAPVVVVVXwAAAAAAAAAAD1VVVVVX8AAAAAAAAAD9VVVVVVX/AAAAAAAAD/VVVVVVVV/8AAAAAAP/VVVVVVVVVf////////VVVVVVVVVVV//////9VVVVVU="}, + {"width" : "56", "buffer":"VVVVVVf/////VVVVVVVVVVVV///////9VVVVVVVVVV/8AAAAAP/VVVVVVVVVfwAAAAAAA/VVVVVVVVXwAAAAAAAAPVVVVVVVX8AAAAAAAAAPVVVVVVV/AAAAAAAAAAPVVVVVVXwAAAAAAAAAAPVVVVVV8AAAAAAAAAAAPVVVVVfAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAD1VVXwAAAAAAMAAAAAAD1VVfAAAAAAP/AAAAAAPVVXwAAAAAD9/AAAAAA9VVfAAAAAA9VfAAAAAA9VXwAAAAAPVVfAAAAAD1VfAAAAAD1VVfAAAAAPVV8AAAAA9VVVfAAAAAPVXwAAAAD1VVV8AAAAA9V8AAAAA9VVVV8AAAAD1XwAAAAD1VVVXwAAAAPVfAAAAAPVVVVfAAAAAPV8AAAAA9VVVVfAAAAA9XwAAAAPVVVVV8AAAAD1fAAAAA9VVVVXwAAAAPXwAAAAD1VVVVfAAAAA9fAAAAAPVVVVV8AAAAA98AAAAA9VVVVV8AAAAD3wAAAAD1VVVVXwAAAAPfAAAAAPVVVVVfAAAAA98AAAAA9VVVVV8AAAAD3wAAAAD1VVVVXwAAAAPfAAAAAPVVVVVfAAAAA98AAAAA9VVVVV8AAAAD3wAAAAD1VVVVXwAAAAD/AAAAAPVVVVVfAAAAAPfAAAAA9VVVVXwAAAAA98AAAAA9VVVVfAAAAAD3wAAAAD1VVVV8AAAAAPfAAAAAPVVVVfAAAAAA98AAAAA9VVVV8AAAAAD3wAAAAA9VVVfAAAAAAPfAAAAAD1VVXwAAAAAA9fAAAAAD1VVfAAAAAAD18AAAAAD1VXwAAAAAAPXwAAAAAD9f8AAAAAAA9XwAAAAAD//AAAAAAAD1fAAAAAAA8AAAAAAAAPV8AAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAD1VfAAAAAAAAADAAAAAPVVfAAAAAAAAA/AAAAA9VV8AAAAAAAAPfAAAAD1VV8AAAAAAAA98AAAAPVVV8AAAAAAAPXwAAAA9VVV/AAAAAAD1fAAAAD1VVV/wAAAAD9V8AAAA9VVVVf/AAAP/VfAAAAD1VVVVX/////VV8AAAAPVVVVVVf//9VVXwAAAA9VVVVVVVVVVVVfAAAAD1VVVVVVVVVVVV8AAAA9VVVVVVVVVVVVfAAAAD1VVVVVVVVVVVV8AAAAPVVVVVVVVVVVVXwAAAA9VVVVVVVVVVVV8AAAAD1VVVVVVVVVVVXwAAAA9VVVVVVVVVVVVfAAAAD1VVVVVVVVVVVXwAAAAPVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVXwAAAAPVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVfAAAAAD1VVVVVVVVVVV8AAAAA9VVVVVVVVVVV/AAAAAD1VVVVVVVVVVfwAAAAA9VVVVVVVVVVXwAAAAAD1VVVVVVVVVX8AAAAAA9VVVVf9VVVf/AAAAAAD1VVVV//////AAAAAAA9VVVVXw///8AAAAAAAD1VVVVfAAAAAAAAAAAA9VVVVV8AAAAAAAAAAAPVVVVVXwAAAAAAAAAAD1VVVVVfAAAAAAAAAAAPVVVVVV8AAAAAAAAAAD1VVVVVXwAAAAAAAAAA9VVVVVVfAAAAAAAAAA/VVVVVVV8AAAAAAAAAP1VVVVVVXwAAAAAAAAP1VVVVVVVfAAAAAAAAD9VVVVVVVV8AAAAAAAP9VVVVVVVVXwAAAAAA//VVVVVVVVVf///////9VVVVVVVVVV///////1VVVVVVVVU="}, + {"width" : "23", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf//1VVV////9VVf8AAD/VXwAAAA/V8AAAAA9XwAAAAA98AAAAAD3wAAAAAPfAAAAAA98AAAAAD/AAAAAAP8AAAAAA/wAAAAAD/AAAAAAPfAAAAAA98AAAAAD3wAAAAAPfAAAAAA9fAAAAAD1fAAAAA9V/AAAA/VVf8AD/1VVf///1VVVV//VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf///VVVf////1VX8AAAP1V8AAAAD1fAAAAAD3wAAAAAPfAAAAAA98AAAAAD3wAAAAAP8AAAAAA/wAAAAAD/AAAAAAP8AAAAAA/wAAAAAD3wAAAAAPfAAAAAA98AAAAAD3wAAAAAPXwAAAAA9XwAAAAPVX/////1VX////9U="} + ] +} diff --git a/apps/contourclock/font-SairaEC.json b/apps/contourclock/font-SairaEC.json new file mode 100644 index 000000000..ec3f6c990 --- /dev/null +++ b/apps/contourclock/font-SairaEC.json @@ -0,0 +1,17 @@ +{ + "name":"SairaEC", + "size":"100", + "characters":[ + {"width" : "51", "buffer":"VVVVf///////9VVVVVVVf/////////1VVVVVV/wAAAAAAAD/VVVVVfwAAAAAAAAAP1VVVV/AAAAAAAAAAA9VVVV8AAAAAAAAAAAPVVVXwAAAAAAAAAAAPVVVfAAAAAAAAAAAAD1VVfAAAAAAAAAAAAA9VV8AAAAAAAAAAAAA9VV8AAAAAAAAAAAAAPVXwAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAA9fAAAAAAA/AAAAAAA9fAAAAAAD/wAAAAAA9fAAAAAAPV8AAAAAA98AAAAAA9V8AAAAAA98AAAAAA9VfAAAAAA98AAAAAA9VfAAAAAA98AAAAAA9VfAAAAAA98AAAAAA9VfAAAAAA98AAAAAD1VfAAAAAA98AAAAAD1VfAAAAAA98AAAAAD1VfAAAAAA98AAAAAD1VfAAAAAA98AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAAP8AAAAAD1VfAAAAAA98AAAAAD1VfAAAAAA98AAAAAD1VfAAAAAA98AAAAAD1VfAAAAAA98AAAAAA9VfAAAAAA98AAAAAA9VfAAAAAA98AAAAAA9VfAAAAAA98AAAAAA9VfAAAAAA98AAAAAA9V8AAAAAA9fAAAAAAPXwAAAAAA9fAAAAAAD/AAAAAAA9fAAAAAAA8AAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAPVV8AAAAAAAAAAAAA9VVfAAAAAAAAAAAAA9VVfAAAAAAAAAAAAD1VVXwAAAAAAAAAAAD1VVV8AAAAAAAAAAAPVVVV/AAAAAAAAAAD9VVVVfwAAAAAAAAAP1VVVVV/wAAAAAAAP9VVVVVVf/////////1VVVVVVVf///////1VVVV"}, + {"width" : "37", "buffer":"VVVVVV//////1VVVVX//////9VVVVf8AAAAAPVVVV/wAAAAAD1VVX/AAAAAAA9VVf8AAAAAAAPVV/wAAAAAAAD1X/AAAAAAAAA9X8AAAAAAAAAPfwAAAAAAAAAD/wAAAAAAAAAA/wAAAAAAAAAAP8AAAAAAAAAAD/AAAAAAAAAAA/wAAAAAAAAAAP8AAAAAAAAAAD/AAAAAAAAAAA/wAAAAAAAAAAP8AAAAAAAAAAD/AAAAAAAAAAA/wAAAAAAAAAAP8AAAAAAAAAAD/AAAAAAAAAAA/wAAAAAAAAAAP8AAAAAAAAAAD/AAAMAAAAAAA/wAA/wAAAAAAP8AP/fAAAAAAD/D/9XwAAAAAA///VV8AAAAAAP/1VVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV8AAAAAAPVVVVfAAAAAAD1VVVXwAAAAAA9VVVV////////VVVVf///////w=="}, + {"width" : "50", "buffer":"Vf//////////1VVVV////////////9VVVX8AAAAAAAAAAD/VVVfAAAAAAAAAAAA/VVV8AAAAAAAAAAAAPVVXwAAAAAAAAAAAAPVVfAAAAAAAAAAAAAPVV8AAAAAAAAAAAAA9VXwAAAAAAAAAAAAA9VfAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAD1XwAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAA9XwAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAPXwAAAAAAAAAAAAAA9fAD////8AAAAAAAD1////////AAAAAAAPX//VVVVV/AAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAD1VVVVVVVVfAAAAAAPVVVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAD1VVVVVVVVfAAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVXwAAAAAAPVVVVVVVV8AAAAAAA9VVVVVVV/AAAAAAAD1VVVVVVfwAAAAAAAPVVVVVVfwAAAAAAAD1VVVVVX8AAAAAAAAPVVVVVX8AAAAAAAAA9VVVVX/AAAAAAAAAD1VVVV/AAAAAAAAAA9VVVV/AAAAAAAAAAD1VVVfwAAAAAAAAAAPVVVfwAAAAAAAAAAD1VVX8AAAAAAAAAAA9VVV8AAAAAAAAAAAD1VVfAAAAAAAAAAAA9VVXwAAAAAAAAAAAPVVVfAAAAAAAAAAAP1VVXwAAAAAAAAAAD9VVVfAAAAAAAAAAD9VVVXwAAAAAAAAAA/VVVVfAAAAAAAAAA/VVVVV8AAAAAAAAA/1VVVVXwAAAAAAAAP1VVVVVfAAAAAAAAP1VVVVVXwAAAAAAAD9VVVVVVfAAAAAAAD9VVVVVVV8AAAAAAA/VVVVVVVXwAAAAAAPVVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAD1VVVVVVVVfAAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAD1VVVVVVVVfAAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAD1VVVVVVVVfAAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAA/////////fAAAAAAA/////////8AAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAD/////////////////////////////////0="}, + {"width" : "50", "buffer":"VX//////////1VVVV////////////9VVVf/AAAAAAAAAAD/VVV8AAAAAAAAAAAA/VVXwAAAAAAAAAAAAPVVfAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAPVXwAAAAAAAAAAAAAPVfAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAA9XwAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAPXwAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAA98A/////8AAAAAAAD3////////AAAAAAAPX/1VVVVV/AAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAD1VVVVVVVVfAAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAD1VVVVVVVVfAAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAD1VVVVVVVVfAAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAD1VVVVVVVVfAAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVfAAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVV/AAAAAAD1VVf/////wAAAAAA9VVV/////wAAAAAAD1VVXwAAAAAAAAAAAPVVVfAAAAAAAAAAAD1VVV8AAAAAAAAAAAPVVVXwAAAAAAAAAAD1VVVfAAAAAAAAAAA9VVVV8AAAAAAAAAA/VVVVXwAAAAAAAAAP1VVVVfAAAAAAAAAD1VVVVV8AAAAAAAAAPVVVVVXwAAAAAAAAAP1VVVVfAAAAAAAAAAP1VVVV8AAAAAAAAAAD9VVVXwAAAAAAAAAAD9VVVfAAAAAAAAAAAD1VVV8AAAAAAAAAAAD1VVXwAAAAAAAAAAAD1VVfAAAAAAAAAAAAPVVV/////8AAAAAAA9VVX/////8AAAAAAA9VVVVVVVV8AAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVVfAAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAD1VVVVVVVVfAAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAD1VVVVVVVVfAAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAD1VVVVVVVVfAAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVfAAAAAAA9//9VVVVfwAAAAAAD////////8AAAAAAAP8AA////8AAAAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAPXwAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAD18AAAAAAAAAAAAAA9XwAAAAAAAAAAAAAD1fAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAPVXwAAAAAAAAAAAAD9VfAAAAAAAAAAAAA/VV8AAAAAAAAAAAA/VVX/wAAAAAAAAAA/1VVX////////////1VVVVX//////////1VVVU="}, + {"width" : "56", "buffer":"VVVV///////9VVVVVVVVVVf///////1VVVVVVVVVV8AAAAAAPVVVVVVVVVVXwAAAAAA9VVVVVVVVVVfAAAAAAPVVVVVVVVVVV8AAAAAA9VVVVVVVVVVXwAAAAAD1VVVVVVVVVV8AAAAAAPVVVVVVVVVVXwAAAAAA9VVVVVVVVVVfAAAAAAPVVVVVVVVVVV8AAAAAA9VVVVVVVVVVXwAAAAAD1VVVVVVVVVV8AAAAAAPVVVVVVVVVVXwAAAAAA9VVVVVVVVVVfAAAAAAPVVVVVVVVVVV8AAAAAA9VVVVVVVVVVXwAAAAAD1VVVVVVVVVVfAAAAAAPVVVVVVVVVVXwAAAAAA9VVVVVVVVVVfAAAAAAPVVVVVVVVVVV8AAAAAA9VVVVVVVVVVXwAAAAAD1VVVVVVVVVVfAAAAAAPVVVVVVVVVVXwAAAAAD1VVVVVVVVVVfAAAAAAPVVVVVVVVVVV8AAAAAA9VVVVVVVVVVXwAAAAAD1VVVVVVVVVVfAAAAAAPVVVVVVVVVVV8AAAAAD1VVVVVVVVVVfAAAAAAPVVVVVVVVVVV8AAAAAA9VVVVVVVVVVXwAAAAAD1VVVVVVVVVVfAAAAAAPVVVVVVVVVVV8AAAAAD1VVVVVVVVVVXwAAAAAPVVVVVVVVVVV8AAAAAA9VVVVVVVVVVXwAAAAAD1VVVVVVVVVVfAAAAAAPVVVVVVVVVVV8AAAAAD1VVVVVVVVVVXwAAAAAPVVVVVVVVVVVfAAAAAA9VX/////1VVXwAAAAAD1Vf/////VVVfAAAAAA9VV8AAAA9VVV8AAAAAD1VfAAAAD1VVXwAAAAAPVV8AAAAPVVVfAAAAAA9VXwAAAA9VVXwAAAAAD1V8AAAAD1VVfAAAAAA9VXwAAAAPVVV8AAAAAD1VfAAAAA9VVXwAAAAAPVV8AAAAD1VVfAAAAAA9VfAAAAAPVVV8AAAAAD1V8AAAAA9VVfAAAAAA9VXwAAAAD1VV8AAAAAD1V8AAAAAPVVXwAAAAAPVXwAAAAA9VVfAAAAAA9VfAAAAAD1VV8AAAAAPVXwAAAAAPVVfAAAAAA9VfAAAAAA9VV8AAAAAD1V8AAAAAD1VXwAAAAAPVXwAAAAAPVVfAAAAAA9V8AAAAAA9VV8AAAAAA//AAAAAAA//3wAAAAAA/wAAAAAAA//8AAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAD/////////wAAAAAAA///////////wAAAAAAP/9VVVVVVVVXwAAAAAD1VVVVVVVVVVfAAAAAAPVVVVVVVVVVV8AAAAAA9VVVVVVVVVVXwAAAAAD1VVVVVVVVVVfAAAAAAPVVVVVVVVVVV8AAAAAA9VVVVVVVVVVXwAAAAAD1VVVVVVVVVVfAAAAAAPVVVVVVVVVVV8AAAAAA9VVVVVVVVVVXwAAAAAD1VVVVVVVVVVfAAAAAAPVVVVVVVVVVV8AAAAAA9VVVVVVVVVVXwAAAAAD1VVVVVVVVVVfAAAAAAPVVVVVVVVVVV8AAAAAA9VVVVVVVVVVXwAAAAAD1VVVVVVVVVVf///////VVVVVVVVVVV///////9VU="}, + {"width" : "50", "buffer":"f//////////////9V///////////////1XwAAAAAAAAAAAAAPVfAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAD1XwAAAAAAAAAAAAAPVfAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAD1XwAAAAAAAAAAAAAPVfAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAD1XwAAAAAAAAAAAAAPVfAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAD1XwAAAAAAAAAAAAAPVfAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAD1XwAAAAAAAAAAAAAPVfAAAAAAAAAAAAAA9V8AAAAAAP///////1XwAAAAAD////////VfAAAAAA9VVVVVVVVV8AAAAAD1VVVVVVVVXwAAAAAPVVVVVVVVVfAAAAAA9VVVVVVVVV8AAAAAD1VVVVVVVVXwAAAAAPVVVVVVVVVfAAAAAA9VVVVVVVVV8AAAAAD1VVVVVVVVXwAAAAAPVVVVVVVVVfAAAAAA9VVVVVVVVV8AAAAAD1VVVVVVVVXwAAAAAPVVVVVVVVVfAAAAAA9VVVVVVVVV8AAAAAD1VVVVVVVVXwAAAAAD////1VVVVfAAAAAAD/////VVVV8AAAAAAAAAAD/VVVXwAAAAAAAAAAAP1VVfAAAAAAAAAAAAP1VV8AAAAAAAAAAAAD1VXwAAAAAAAAAAAAD1VfAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAPVXwAAAAAAAAAAAAA9VfAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAD1XwAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAA9XwAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAPXwAAAAAAAAAAAAAA9f//////8AAAAAAAD1////////AAAAAAAPV1VVVVVV/AAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAD1VVVVVVVVfAAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1//9VVVV/wAAAAAAPf///////8AAAAAAA98AA////wAAAAAAAD3wAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAPXwAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAD18AAAAAAAAAAAAAA9XwAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAD1XwAAAAAAAAAAAAAPVfAAAAAAAAAAAAAD1V8AAAAAAAAAAAAA9VXwAAAAAAAAAAAAP1VfAAAAAAAAAAAAD9VV8AAAAAAAAAAAD9VVX/wAAAAAAAAAD/VVVX////////////VVVVVX//////////VVVVU="}, + {"width" : "51", "buffer":"VVVVVX////////9VVVVVVV//////////9VVVVVf8AAAAAAAAD/1VVVV/AAAAAAAAAAD1VVVXwAAAAAAAAAAD1VVVfAAAAAAAAAAAD1VVV8AAAAAAAAAAAD1VVXwAAAAAAAAAAAD1VVfAAAAAAAAAAAAD1VVfAAAAAAAAAAAAD1VV8AAAAAAAAAAAAD1VXwAAAAAAAAAAAAD1VXwAAAAAAAAAAAAD1VfAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAD1V8AAAAAAAAAAAAAD1V8AAAAAAAD///8AD1V8AAAAAAD///////1XwAAAAAAP9VVVX//1XwAAAAAA9VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAA9VVVVVVVVVfAAAAAA9VVVVVVVVVfAAAAAA9VVVVVVVVVfAAAAAA9VVVVVVVVVfAAAAAA9VVVVVVVVVfAAAAAA9VV////VVVfAAAAAA9Vf////9VVfAAAAAA9X/AAAA/VVfAAAAAA9fwAAAAD1VfAAAAAA98AAAAAA9VfAAAAAA98AAAAAAPVfAAAAAAPwAAAAAAPV8AAAAAADAAAAAAAD18AAAAAAAAAAAAAAD18AAAAAAAAAAAAAAD18AAAAAAAAAAAAAAA98AAAAAAAAAAAAAAA98AAAAAAAAAAAAAAA98AAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAA/wAAAAAAP8AAAAAAD/8AAAAAAP8AAAAAAPVfAAAAAAP8AAAAAAPVfAAAAAAP8AAAAAAPVXwAAAAAPfAAAAAA9VXwAAAAAPfAAAAAA9VXwAAAAAPfAAAAAA9VXwAAAAAPfAAAAAA9VXwAAAAAPfAAAAAA9VXwAAAAAPfAAAAAA9VXwAAAAAPfAAAAAA9VXwAAAAAPfAAAAAA9VXwAAAAAPfAAAAAA9VXwAAAAAPfAAAAAA9VXwAAAAAPfAAAAAA9VXwAAAAAPfAAAAAA9VXwAAAAAPfAAAAAA9VXwAAAAAPfAAAAAA9VXwAAAAAPfAAAAAA9VXwAAAAAPfAAAAAA9VXwAAAAAPfAAAAAA9VXwAAAAAPfAAAAAAPVXwAAAAAPfAAAAAAPVXwAAAAAPXwAAAAAPVfAAAAAAPXwAAAAAPVfAAAAAAPXwAAAAAD/8AAAAAAPXwAAAAAA/wAAAAAAPXwAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAA9V8AAAAAAAAAAAAAA9V8AAAAAAAAAAAAAA9V8AAAAAAAAAAAAAD1VfAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAPVVXwAAAAAAAAAAAA9VVV8AAAAAAAAAAAA9VVV8AAAAAAAAAAAD1VVVfAAAAAAAAAAAD1VVVXwAAAAAAAAAA/VVVVV/AAAAAAAAAD9VVVVVf8AAAAAAAD/VVVVVVV/////////9VVVVVVVX///////9VVVV"}, + {"width" : "50", "buffer":"//////////////////////////////////AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAA/////////wAAAAAAD/////////wAAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAD1VVVVVVVVfAAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAD1VVVVVVVVfAAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVXwAAAAAAPVVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVfAAAAAAA9VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVfAAAAAAA9VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVVfAAAAAAD1VVVVVVVXwAAAAAAPVVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVfAAAAAAA9VVVVVVVV8AAAAAAPVVVVVVVVXwAAAAAA9VVVVVVVV8AAAAAAD1VVVVVVVXwAAAAAAPVVVVVVVVfAAAAAAD1VVVVVVVV8AAAAAAPVVVVVVVVf///////9VVVVVVVV////////VVVVVVVU="}, + {"width" : "53", "buffer":"VVVVf////////VVVVVVVVf/////////9VVVVVVf8AAAAAAAAP9VVVVVX8AAAAAAAAAA/VVVVV8AAAAAAAAAAA/VVVVfAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAPVVV8AAAAAAAAAAAAA9VVXwAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAA9XwAAAAAAP8AAAAAAA9fAAAAAAD/8AAAAAAD18AAAAAA9V8AAAAAAPXwAAAAAD1V8AAAAAA9fAAAAAAPVXwAAAAAD18AAAAAA9VfAAAAAAPXwAAAAAD1V8AAAAAA9fAAAAAAPVXwAAAAAD18AAAAAA9VfAAAAAAPXwAAAAAD1V8AAAAAA9fAAAAAAPVXwAAAAAD18AAAAAA9VfAAAAAAPXwAAAAAD1V8AAAAAA9fAAAAAAPVXwAAAAAD18AAAAAA9VfAAAAAAPXwAAAAAD1V8AAAAAA9fAAAAAAPVXwAAAAAPV8AAAAAA9VfAAAAAA9V8AAAAAD1V8AAAAAD1XwAAAAAPVXwAAAAAPVfAAAAAA9VfAAAAAA9V8AAAAAD1V8AAAAAPVV8AAAAAD1/AAAAAA9VXwAAAAAD/wAAAAAD1VXwAAAAADwAAAAAA9VVfAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAPVVVV/AAAAAAAAAAAD1VVVV/wAAAAAAAAAD9VVVVVfwAAAAAAAAA/VVVVVVXwAAAAAAAAPVVVVVVV8AAAAAAAAAPVVVVVV/AAAAAAAAAAPVVVVVfwAAAAAAAAAAP1VVVXwAAAAAAAAAAAP1VVV8AAAAAAAAAAAAD1VVfAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAPVXwAAAAAAPwAAAAAAPVfAAAAAAD/wAAAAAA9XwAAAAAA9XwAAAAAD1fAAAAAAPVXwAAAAAD18AAAAAA9VfAAAAAAPXwAAAAAD1V8AAAAAA98AAAAAAPVXwAAAAAD3wAAAAAA9VfAAAAAAPfAAAAAAD1V8AAAAAAP8AAAAAAPVXwAAAAAA/wAAAAAA9VfAAAAAAD/AAAAAAD1V8AAAAAAP8AAAAAAPVXwAAAAAA/wAAAAAA9VfAAAAAAD/AAAAAAD1V8AAAAAAP8AAAAAAPVXwAAAAAA/wAAAAAA9VfAAAAAAD/AAAAAAD1V8AAAAAAP8AAAAAAPVXwAAAAAA/wAAAAAA9VfAAAAAAD/AAAAAAD1V8AAAAAAP8AAAAAAPVXwAAAAAA/wAAAAAA9VfAAAAAAD/AAAAAAA9XwAAAAAAP8AAAAAAA/8AAAAAAD3wAAAAAAA/AAAAAAAPfAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAPVVVXwAAAAAAAAAAAD1VVVXwAAAAAAAAAAD9VVVVX8AAAAAAAAAA/VVVVVX/wAAAAAAAD/VVVVVVV//////////1VVVVVVVX////////VVVVU="}, + {"width" : "51", "buffer":"VVVVf///////9VVVVVVVX/////////1VVVVVV/wAAAAAAAD/VVVVVX8AAAAAAAAAP1VVVVfAAAAAAAAAAA9VVVV8AAAAAAAAAAAPVVVXwAAAAAAAAAAAPVVVXwAAAAAAAAAAAD1VVfAAAAAAAAAAAAD1VVfAAAAAAAAAAAAA9VV8AAAAAAAAAAAAA9VV8AAAAAAAAAAAAAPVV8AAAAAAAAAAAAAPVXwAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAD1fAAAAAAA/AAAAAAA9fAAAAAAD/wAAAAAA9fAAAAAAPV8AAAAAA9fAAAAAA9VfAAAAAA9fAAAAAA9VfAAAAAA9fAAAAAA9VfAAAAAA9fAAAAAA9VfAAAAAA9fAAAAAA9VfAAAAAA98AAAAAA9VfAAAAAAP8AAAAAA9VfAAAAAAP8AAAAAA9VfAAAAAAP8AAAAAA9VfAAAAAAP8AAAAAA9VfAAAAAAP8AAAAAA9VfAAAAAAP8AAAAAA9VfAAAAAAP8AAAAAA9VfAAAAAAP8AAAAAA9VfAAAAAAP8AAAAAA9VfAAAAAAP8AAAAAA9VfAAAAAAP8AAAAAA9VfAAAAAAP8AAAAAA9VfAAAAAAP8AAAAAA9VfAAAAAAP8AAAAAA9VfAAAAAAP8AAAAAA9VfAAAAAAP8AAAAAA9VfAAAAAAP8AAAAAAPV8AAAAAAPfAAAAAAD/wAAAAAAPfAAAAAAA/AAAAAAAPfAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAPV8AAAAAAAwAAAAAAPVfAAAAAAD8AAAAAAPVXwAAAAAPfAAAAAAPVX8AAAAA9fAAAAAAPVV/wAAAP1fAAAAAAPVVX/////VfAAAAAAPVVVf///1VfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAA9VVVVVVVVVfAAAAAA9VVVVVVVVVfAAAAAA9VVVVVVVVVfAAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAA9VVVVVVVVXwAAAAAD1V///VVVX/AAAAAAD1V///////8AAAAAAD1V8AA///8AAAAAAAD1V8AAAAAAAAAAAAAPVV8AAAAAAAAAAAAAPVV8AAAAAAAAAAAAAPVV8AAAAAAAAAAAAA9VV8AAAAAAAAAAAAA9VV8AAAAAAAAAAAAA9VV8AAAAAAAAAAAAD1VV8AAAAAAAAAAAAD1VV8AAAAAAAAAAAAPVVV8AAAAAAAAAAAAPVVV8AAAAAAAAAAAA9VVV8AAAAAAAAAAAD1VVV8AAAAAAAAAAAPVVVV8AAAAAAAAAAD9VVVV8AAAAAAAAAAP1VVVV/8AAAAAAAAP9VVVVVf//////////1VVVVVVX////////1VVVVV"}, + {"width" : "22", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX//////////////8AAAAAD/AAAAAA/wAAAAAP8AAAAAD/AAAAAA/wAAAAAP8AAAAAD/AAAAAA/wAAAAAP8AAAAAD/AAAAAA/wAAAAAP8AAAAAD/AAAAAA/wAAAAAP8AAAAAD/AAAAAA/wAAAAAP8AAAAAD///////9///////VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV///////////////wAAAAAP8AAAAAD/AAAAAA/wAAAAAP8AAAAAD/AAAAAA/wAAAAAP8AAAAAD/AAAAAA/wAAAAAP8AAAAAD/AAAAAA/wAAAAAP8AAAAAD/AAAAAA/wAAAAAP8AAAAAD/AAAAAA///////////////w=="} + ] +} diff --git a/apps/contourclock/font-Teko.json b/apps/contourclock/font-Teko.json new file mode 100644 index 000000000..25c88401e --- /dev/null +++ b/apps/contourclock/font-Teko.json @@ -0,0 +1,17 @@ +{ + "name":"Teko", + "size":"99", + "characters":[ + {"width" : "50", "buffer":"VVV//////////9VVVVVf///////////VVVVfwAAAAAAAAAA/1VVX8AAAAAAAAAAAP1VV8AAAAAAAAAAAAD1VfAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAPVfAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAA9fAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAP8AAAAAAP/8AAAAAA/wAAAAAD//8AAAAAD/AAAAAA9VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAD1VXwAAAAA/wAAAAAPVV8AAAAAD/AAAAAAP//AAAAAAP8AAAAAAP/wAAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAD3wAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAPVV8AAAAAAAAAAAAD1VX8AAAAAAAAAAAA9VVX8AAAAAAAAAAA/VVVV////////////1VVVV///////////1VVA="}, + {"width" : "31", "buffer":"/////////////////////wAAAAAAAAP8AAAAAAAAD/AAAAAAAAA/wAAAAAAAAP8AAAAAAAAD/AAAAAAAAA/wAAAAAAAAP8AAAAAAAAD/AAAAAAAAA/wAAAAAAAAP8AAAAAAAAD/AAAAAAAAA/wAAAAAAAAP8AAAAAAAAD/AAAAAAAAA/wAAAAAAAAP///wAAAAAD////AAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVXwAAAAA9VVV8AAAAAPVVVfAAAAAD1VVX//////9VVV///////A"}, + {"width" : "49", "buffer":"VVV//////////1VVVVV///////////1VVVX8AAAAAAAAAA/VVVX8AAAAAAAAAAA9VVXwAAAAAAAAAAAD1VXwAAAAAAAAAAAAPVV8AAAAAAAAAAAAA9V8AAAAAAAAAAAAAPVfAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAD18AAAAAAAAAAAAAAPfAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAP8AAAAAAP/wAAAAAD/AAAAAAP//AAAAAA/wAAAAAPVV8AAAAAP8AAAAAPVVfAAAAAD/AAAAAD1VV8AAAAA/wAAAAA9VVfAAAAAP8AAAAAPVVXwAAAAD/AAAAAD1VV8AAAAA/wAAAAA9VVfAAAAAP8AAAAAPVVXwAAAAD/AAAAAD1VV8AAAAA/wAAAAA9VVfAAAAAP8AAAAAPVVXwAAAAD/AAAAAD1VV8AAAAA///////9VVfAAAAAP///////VVXwAAAAD1VVVVVVVVV8AAAAA9VVVVVVVVVfAAAAAPVVVVVVVVVfAAAAAD1VVVVVVVVXwAAAAA9VVVVVVVVV8AAAAAPVVVVVVVVVfAAAAAD1VVVVVVVVXwAAAAA9VVVVVVVVXwAAAAAPVVVVVVVVV8AAAAAPVVVVVVVVVfAAAAAD1VVVVVVVVfAAAAAA9VVVVVVVVXwAAAAAPVVVVVVVVXwAAAAAD1VVVVVVVXwAAAAAD1VVVVVVVV8AAAAAA9VVVVVVVV8AAAAAA9VVVVVVVV8AAAAAAPVVVVVVVVfAAAAAAPVVVVVVVVfAAAAAAD1VVVVVVVfAAAAAAD1VVVVVVVXwAAAAAA9VVVVVVVXwAAAAAA9VVVVVVVXwAAAAAAPVVVVVVVV8AAAAAAPVVVVVVVV8AAAAAAD1VVVVVVV8AAAAAAD1VVVVVVV8AAAAAAD1VVVVVVVfAAAAAAD1VVVVVVVfAAAAAAA9VVVVVVVfAAAAAAA9VVVVVVVXwAAAAAAPVVVVVVVXwAAAAAAPVVVVVVVXwAAAAAAPVVVVVVVV8AAAAAAD1VVVVVVV8AAAAAAD1VVVVVVV8AAAAAAD1VVVVVVVfAAAAAAA9VVVVVVVfAAAAAAA9VVVVVVVfAAAAAAA9VVVVVVVfAAAAAAAPVVVVVVVXwAAAAAAPVVVVVVVXwAAAAAAPVVVVVVVXwAAAAAAD1VVVVVVV8AAAAAAD1VVVVVVV8AAAAAAD1VVVVVVV8AAAAAAA9VVVVVVVfAAAAAAAD///////fAAAAAAAAP//////3wAAAAAAAAAAAAAA98AAAAAAAAAAAAAAPfAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAA98AAAAAAAAAAAAAAPfAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAA98AAAAAAAAAAAAAAPfAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAA98AAAAAAAAAAAAAAPfAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAA98AAAAAAAAAAAAAAPfAAAAAAAAAAAAAAD3///////////////9////////////////A=="}, + {"width" : "50", "buffer":"VVV//////////1VVVVVf//////////9VVVVfwAAAAAAAAAD/VVVX8AAAAAAAAAAA/VVV8AAAAAAAAAAAA9VVXwAAAAAAAAAAAA9VV8AAAAAAAAAAAAA9VfAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAD1XwAAAAAAAAAAAAAPV8AAAAAAAAAAAAAA9XwAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAPfAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAA98AAAAAAP/wAAAAAA/wAAAAAD//wAAAAAD/AAAAAA9VXwAAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA///////9VVfAAAAAD3//////1VV8AAAAA9VVVVVVVVVXwAAAAD1VVVVVVVVVfAAAAAPVVVVVVVVVV8AAAAA9VVVVVVVVVXwAAAAD1VVVVVVVVVfAAAAAPVVVVVVVVVXwAAAAA9VVVVVX///8AAAAAD1VVVVV////AAAAAAPVVVVVXwAAAAAAAAD1VVVVVfAAAAAAAAAPVVVVVV8AAAAAAAAA9VVVVVXwAAAAAAAAPVVVVVVfAAAAAAAAA9VVVVVV8AAAAAAAAPVVVVVVXwAAAAAAAA9VVVVVVfAAAAAAAAPVVVVVVV8AAAAAAAA9VVVVVVXwAAAAAAAA9VVVVVVfAAAAAAAAA9VVVVVV8AAAAAAAAA9VVVVVXwAAAAAAAAD1VVVVVfAAAAAAAAAPVVVVVV8AAAAAAAAAPVVVVVXwAAAAAAAAA9VVVVVf///wAAAAAD1VVVVVf///wAAAAAPVVVVVVVVVXwAAAAA9VVVVVVVVVXwAAAAD1VVVVVVVVVfAAAAAPVVVVVVVVVV8AAAAA9VVVVVVVVVXwAAAAD1VVVVVVVVVfAAAAAD1VVVVVVVVV8AAAAAPVVVVVVVVVXwAAAAA///////9VVfAAAAAD///////1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVXwAAAAA/wAAAAA9VVfAAAAAD/AAAAAD1VV8AAAAAP8AAAAAD1VfAAAAAA/wAAAAAPVV8AAAAAD/AAAAAAP//AAAAAAP8AAAAAAP/wAAAAAD3wAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAD18AAAAAAAAAAAAAAPXwAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAPXwAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAPVfAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAPVV8AAAAAAAAAAAAA9VV8AAAAAAAAAAAAPVVV8AAAAAAAAAAAD1VVV8AAAAAAAAAAD9VVVV////////////VVVVV///////////VVVA="}, + {"width" : "59", "buffer":"VVVVVVVVVf//////1VVVVVVVVVVVX///////VVVVVVVVVVVVfAAAAAD1VVVVVVVVVVVXwAAAAAPVVVVVVVVVVVVfAAAAAD1VVVVVVVVVVVXwAAAAAPVVVVVVVVVVVVfAAAAAD1VVVVVVVVVVVXwAAAAAPVVVVVVVVVVVVfAAAAAD1VVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVfAAAAAD1VVVVVVVVVVVXwAAAAAPVVVVVVVVVVVVfAAAAAD1VVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVV8AAAAAD1VVVVVVVVVVVXwAAAAA9VVVVVVVVVVVV8AAAAAD1VVVVVVVVVVVXwAAAAA9f//////VVVVV8AAAAAD1//////9VVVVXwAAAAA9XwAAAAD1VVVV8AAAAAD1fAAAAAPVVVVXwAAAAA9V8AAAAA9VVVV8AAAAAD1XwAAAAD1VVVXwAAAAA9VfAAAAAPVVVV8AAAAAD1V8AAAAA9VVVXwAAAAA9VXwAAAAD1VVV8AAAAAD1VfAAAAAPVVVXwAAAAA9VV8AAAAA9VVV8AAAAAD1VXwAAAAD1VVXwAAAAA9VVfAAAAAPVVV8AAAAAD1VV8AAAAA9VVXwAAAAA9VVXwAAAAD1VV8AAAAAD1VVfAAAAAPVVXwAAAAA9VVV8AAAAA9VVfAAAAAD1VVXwAAAAD1VV8AAAAA9VVVfAAAAAPVVXwAAAAD1VVV8AAAAA9VVfAAAAAD////AAAAAA///8AAAAAD///wAAAAAA///wAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAP//////////wAAAAAA//9//////////wAAAAAP//VVVVVVVVVVXwAAAAD1VVVVVVVVVVVVfAAAAAPVVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVVXwAAAAD1VVVVVVVVVVVVfAAAAAPVVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVVXwAAAAD1VVVVVVVVVVVVfAAAAAPVVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVVXwAAAAD1VVVVVVVVVVVVfAAAAAPVVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVVXwAAAAD1VVVVVVVVVVVVfAAAAAPVVVVVVVVVVVVV//////9VVVVVVVVVVVVX//////1VVA"}, + {"width" : "51", "buffer":"f///////////////9f///////////////9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAP////////9fAAAAAA/////////1fAAAAAD1VVVVVVVVVfAAAAAD1VVVVVVVVVfAAAAAD1VVVVVVVVVfAAAAAD1VVVVVVVVVfAAAAAD1VVVVVVVVVfAAAAAD1VVVVVVVVVfAAAAAD1VVVVVVVVVfAAAAAD1VVVVVVVVVfAAAAAD1VVVVVVVVVfAAAAAD1VVVVVVVVVfAAAAAD1VVVVVVVVVfAAAAAD1VVVVVVVVVfAAAAAD1VVVVVVVVVfAAAAAA/////1VVVVfAAAAAAP/////9VVVfAAAAAAAAAAAP/1VVfAAAAAAAAAAAAD9VVfAAAAAAAAAAAAAP1VfAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAPf////////8AAAAAAPf/////////AAAAAAPVVVVVVVVVXwAAAAAPVVVVVVVVVV8AAAAAPVVVVVVVVVV8AAAAAPVVVVVVVVVV8AAAAAPVVVVVVVVVV8AAAAAPVVVVVVVVVV8AAAAAPVVVVVVVVVV8AAAAAPVVVVVVVVVV8AAAAAPVVVVVVVVVV8AAAAAPVVVVVVVVVV8AAAAAPf//////VVV8AAAAAP///////VVV8AAAAAP8AAAAAPVVV8AAAAAP8AAAAAPVVV8AAAAAP8AAAAAPVVV8AAAAAP8AAAAAPVVV8AAAAAP8AAAAAPVVV8AAAAAP8AAAAAPVVV8AAAAAP8AAAAAPVVV8AAAAAP8AAAAAPVVV8AAAAAP8AAAAAPVVV8AAAAAP8AAAAAPVVV8AAAAAP8AAAAAPVVV8AAAAAP8AAAAAPVVV8AAAAAP8AAAAAD1VV8AAAAAP8AAAAAD1VXwAAAAAP8AAAAAA///AAAAAAP8AAAAAAP/8AAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAPVV8AAAAAAAAAAAAAPVVfAAAAAAAAAAAAA9VVXwAAAAAAAAAAAD1VVX8AAAAAAAAAAA/VVVVf///////////9VVVVX///////////VVVA"}, + {"width" : "50", "buffer":"VVV//////////1VVVVVf//////////9VVVVfwAAAAAAAAAD9VVVX8AAAAAAAAAAA/VVV8AAAAAAAAAAAA9VVfAAAAAAAAAAAAA9VV8AAAAAAAAAAAAA9VfAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAD1XwAAAAAAAAAAAAAPV8AAAAAAAAAAAAAA9XwAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAPfAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAA98AAAAAA//wAAAAAD3wAAAAAP//wAAAAAPfAAAAAD1VXwAAAAA98AAAAAPVVXwAAAAD3wAAAAA9VVfAAAAAPfAAAAAD1VV8AAAAA98AAAAAPVVXwAAAAD3wAAAAA9VVfAAAAAPfAAAAAD1VV8AAAAA98AAAAAPVVXwAAAAD3wAAAAA9VVfAAAAAPfAAAAAD1VV//////98AAAAAPVVX//////3wAAAAA9VVVVVVVVVfAAAAAD1VVVVVVVVV8AAAAAPVVVVVVVVVXwAAAAA9VVVVVVVVVfAAAAAD1VVVVVVVVV8AAAAAPVVVVVVVVVXwAAAAA9VVVVVVVVVfAAAAAD1VVVVVVVVV8AAAAAD/////1VVVXwAAAAAD//////1VVfAAAAAAAAAAAD/9VV8AAAAAAAAAAAAD9VXwAAAAAAAAAAAAA9VfAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAA9XwAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAP8AAAAAA//8AAAAAA/wAAAAAP//8AAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVV8AAAAA/wAAAAA9VVXwAAAAD/AAAAAD1VVfAAAAAP8AAAAAPVVV8AAAAA/wAAAAA9VVXwAAAAD/AAAAAD1VVfAAAAAP8AAAAAPVVV8AAAAA/wAAAAA9VVXwAAAAD/AAAAAD1VVfAAAAAP8AAAAAPVVV8AAAAA/wAAAAA9VVXwAAAAD/AAAAAD1VVfAAAAAP8AAAAAPVVV8AAAAA/wAAAAA9VVXwAAAAD/AAAAAD1VVfAAAAAP8AAAAAPVVV8AAAAA/wAAAAA9VVXwAAAAD/AAAAAD1VVfAAAAAP8AAAAAPVVV8AAAAA/wAAAAAPVVfAAAAAD/AAAAAAP//wAAAAAP8AAAAAAP/8AAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAA98AAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAD3wAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAD1V8AAAAAAAAAAAAAPVV8AAAAAAAAAAAAD1VX8AAAAAAAAAAAA9VVX8AAAAAAAAAAA/VVVV////////////1VVVV///////////1VVA="}, + {"width" : "48", "buffer":"////////////////////////////////8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAA98AAAAAAAAAAAAAA98AAAAAAAAAAAAAA9////////wAAAAAA9////////8AAAAAD1VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAD1VVVVVVVV8AAAAAPVVVVVVVVV8AAAAAPVVVVVVVVV8AAAAAPVVVVVVVVV8AAAAA9VVVVVVVVXwAAAAA9VVVVVVVVXwAAAAA9VVVVVVVVXwAAAAA9VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAD1VVVVVVVV8AAAAAPVVVVVVVVV8AAAAAPVVVVVVVVV8AAAAAPVVVVVVVVXwAAAAAPVVVVVVVVXwAAAAA9VVVVVVVVXwAAAAA9VVVVVVVVXwAAAAA9VVVVVVVVfAAAAAA9VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAD1VVVVVVVV8AAAAAPVVVVVVVVV8AAAAAPVVVVVVVVV8AAAAAPVVVVVVVVXwAAAAAPVVVVVVVVXwAAAAA9VVVVVVVVXwAAAAA9VVVVVVVVXwAAAAA9VVVVVVVVfAAAAAA9VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAD1VVVVVVVV8AAAAAD1VVVVVVVV8AAAAAD1VVVVVVVV8AAAAAPVVVVVVVVV8AAAAAPVVVVVVVVXwAAAAAPVVVVVVVVXwAAAAAPVVVVVVVVXwAAAAA9VVVVVVVVXwAAAAA9VVVVVVVVfAAAAAA9VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAD1VVVVVVVV8AAAAAD1VVVVVVVV8AAAAAD1VVVVVVVV8AAAAAPVVVVVVVVV8AAAAAPVVVVVVVVXwAAAAAPVVVVVVVVXwAAAAAPVVVVVVVVXwAAAAA9VVVVVVVVfAAAAAA9VVVVVVVVfAAAAAA9VVVVVVVVfAAAAAA9VVVVVVVVfAAAAAD1VVVVVVVV8AAAAAD1VVVVVVVV8AAAAAD1VVVVVVVV8AAAAAD1VVVVVVVV8AAAAAPVVVVVVVVXwAAAAAPVVVVVVVVXwAAAAAPVVVVVVVVXwAAAAA9VVVVVVVVfAAAAAA9VVVVVVVVfAAAAAA9VVVVVVVVfAAAAAA9VVVVVVVVfAAAAAD1VVVVVVVV8AAAAAD1VVVVVVVV8AAAAAD1VVVVVVVV8AAAAAD1VVVVVVVXwAAAAAPVVVVVVVVXwAAAAAPVVVVVVVVXwAAAAAPVVVVVVVVXwAAAAA9VVVVVVVVfAAAAAA9VVVVVVVVf//////9VVVVVVVVf//////9VVVVVVV"}, + {"width" : "51", "buffer":"VVV///////////VVVVVX///////////1VVVV/AAAAAAAAAAA/VVVX8AAAAAAAAAAAP1VVfAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAPVV8AAAAAAAAAAAAAPVXwAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAP/8AAAAAAP8AAAAAA///AAAAAAP8AAAAAD1VXwAAAAAP8AAAAAPVVV8AAAAAP8AAAAA9VVV8AAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAA98AAAAA9VVVfAAAAA9fAAAAAPVVV8AAAAA9fAAAAAPVVV8AAAAA9fAAAAAD///wAAAAA9fAAAAAA///AAAAAA9XwAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAPVV8AAAAAAAAAAAAAPVVfAAAAAAAAAAAAA9VVXwAAAAAAAAAAAD1VVXwAAAAAAAAAAAA9VVfAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAPVXwAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAA///AAAAAA9fAAAAAD///wAAAAA9fAAAAAPVVV8AAAAA98AAAAAPVVV8AAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAA9VVVfAAAAAP8AAAAAPVVV8AAAAAP8AAAAAPVVV8AAAAAP8AAAAAD///wAAAAAP8AAAAAA///AAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAPVV8AAAAAAAAAAAAAPVVfAAAAAAAAAAAAA9VVXwAAAAAAAAAAAD1VVX8AAAAAAAAAAA/VVVVf///////////9VVVVX///////////VVVA"}, + {"width" : "50", "buffer":"VVV//////////9VVVVV////////////VVVVfwAAAAAAAAAA/VVVXwAAAAAAAAAAAP1VV8AAAAAAAAAAAAPVVfAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAPVfAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAA9fAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAP8AAAAAA//8AAAAAA/wAAAAAP//8AAAAAD/AAAAAD1VV8AAAAAP8AAAAAPVVV8AAAAA/wAAAAA9VVXwAAAAD/AAAAAPVVVfAAAAAP8AAAAA9VVV8AAAAA/wAAAAD1VVXwAAAAD/AAAAAPVVVfAAAAAP8AAAAA9VVV8AAAAA/wAAAAD1VVXwAAAAD/AAAAAPVVVfAAAAAP8AAAAA9VVV8AAAAA/wAAAAD1VVXwAAAAD/AAAAAPVVVfAAAAAP8AAAAA9VVV8AAAAA/wAAAAD1VVXwAAAAD/AAAAAPVVVfAAAAAP8AAAAA9VVV8AAAAA/wAAAAD1VVXwAAAAD/AAAAAPVVVfAAAAAP8AAAAA9VVV8AAAAA/wAAAAA9VVXwAAAAD/AAAAAD1VVfAAAAAP8AAAAAD1VV8AAAAA/wAAAAAD///AAAAAD/AAAAAAD//wAAAAAP8AAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAPV8AAAAAAAAAAAAAA9XwAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAPVX8AAAAAAAAAAAAA9VX8AAAAAAAAAAAAD1VV//AAAAAAAAAAAPVVV///////AAAAAA9VVVVf/////AAAAAD1VVVVVVVVVfAAAAAPVVVVVVVVVV8AAAAA9VVVVVVVVVXwAAAAD1VVVVVVVVVfAAAAAPVVVVVVVVVV8AAAAA9VVVVVVVVVXwAAAAD1VVVVVVVVVfAAAAAPVVVVVVVVVV8AAAAA9//////9VVXwAAAAD3//////1VVfAAAAAPfAAAAAPVVV8AAAAA98AAAAA9VVXwAAAAD3wAAAAD1VVfAAAAAPfAAAAAPVVV8AAAAA98AAAAA9VVXwAAAAD3wAAAAD1VVfAAAAAPfAAAAAD1VV8AAAAA98AAAAAPVVfAAAAAD3wAAAAAP//wAAAAAPfAAAAAAP/8AAAAAA98AAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAA9XwAAAAAAAAAAAAAD1XwAAAAAAAAAAAAA9VfAAAAAAAAAAAAAD1VfAAAAAAAAAAAAA9VV8AAAAAAAAAAAAD1VV8AAAAAAAAAAAA9VVV/AAAAAAAAAAA/VVVV////////////1VVVVf//////////1VVA="}, + {"width" : "20", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//////////////AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA//////////////VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/////////////wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA//////////////"} + ] +} diff --git a/apps/contourclock/fonts/BarlowCond-p1.png b/apps/contourclock/fonts/BarlowCond-p1.png new file mode 100644 index 000000000..fc1e66797 Binary files /dev/null and b/apps/contourclock/fonts/BarlowCond-p1.png differ diff --git a/apps/contourclock/fonts/BarlowCond-p2.png b/apps/contourclock/fonts/BarlowCond-p2.png new file mode 100644 index 000000000..09f0cd5b6 Binary files /dev/null and b/apps/contourclock/fonts/BarlowCond-p2.png differ diff --git a/apps/contourclock/fonts/BebasNeue-p1.png b/apps/contourclock/fonts/BebasNeue-p1.png new file mode 100644 index 000000000..7bcec6894 Binary files /dev/null and b/apps/contourclock/fonts/BebasNeue-p1.png differ diff --git a/apps/contourclock/fonts/BebasNeue-p2.png b/apps/contourclock/fonts/BebasNeue-p2.png new file mode 100644 index 000000000..9ef333b06 Binary files /dev/null and b/apps/contourclock/fonts/BebasNeue-p2.png differ diff --git a/apps/contourclock/fonts/Dekko-p1.png b/apps/contourclock/fonts/Dekko-p1.png new file mode 100644 index 000000000..de2da2646 Binary files /dev/null and b/apps/contourclock/fonts/Dekko-p1.png differ diff --git a/apps/contourclock/fonts/Dekko-p2.png b/apps/contourclock/fonts/Dekko-p2.png new file mode 100644 index 000000000..d82129543 Binary files /dev/null and b/apps/contourclock/fonts/Dekko-p2.png differ diff --git a/apps/contourclock/fonts/DinAlternate-p1.png b/apps/contourclock/fonts/DinAlternate-p1.png new file mode 100644 index 000000000..5957d2c5a Binary files /dev/null and b/apps/contourclock/fonts/DinAlternate-p1.png differ diff --git a/apps/contourclock/fonts/DinAlternate-p2.png b/apps/contourclock/fonts/DinAlternate-p2.png new file mode 100644 index 000000000..fdc9b38a3 Binary files /dev/null and b/apps/contourclock/fonts/DinAlternate-p2.png differ diff --git a/apps/contourclock/fonts/Impact-p1.png b/apps/contourclock/fonts/Impact-p1.png new file mode 100644 index 000000000..5ce675ba4 Binary files /dev/null and b/apps/contourclock/fonts/Impact-p1.png differ diff --git a/apps/contourclock/fonts/Impact-p2.png b/apps/contourclock/fonts/Impact-p2.png new file mode 100644 index 000000000..0474caea8 Binary files /dev/null and b/apps/contourclock/fonts/Impact-p2.png differ diff --git a/apps/contourclock/fonts/Nunito-p1.png b/apps/contourclock/fonts/Nunito-p1.png new file mode 100644 index 000000000..44697c671 Binary files /dev/null and b/apps/contourclock/fonts/Nunito-p1.png differ diff --git a/apps/contourclock/fonts/Nunito-p2.png b/apps/contourclock/fonts/Nunito-p2.png new file mode 100644 index 000000000..4312d15ec Binary files /dev/null and b/apps/contourclock/fonts/Nunito-p2.png differ diff --git a/apps/contourclock/fonts/OpenSansEC-p1.png b/apps/contourclock/fonts/OpenSansEC-p1.png new file mode 100644 index 000000000..c5fe85494 Binary files /dev/null and b/apps/contourclock/fonts/OpenSansEC-p1.png differ diff --git a/apps/contourclock/fonts/OpenSansEC-p2.png b/apps/contourclock/fonts/OpenSansEC-p2.png new file mode 100644 index 000000000..f1d6381f2 Binary files /dev/null and b/apps/contourclock/fonts/OpenSansEC-p2.png differ diff --git a/apps/contourclock/fonts/Phosphate-p1.png b/apps/contourclock/fonts/Phosphate-p1.png new file mode 100644 index 000000000..2d0786c0a Binary files /dev/null and b/apps/contourclock/fonts/Phosphate-p1.png differ diff --git a/apps/contourclock/fonts/Phosphate-p2.png b/apps/contourclock/fonts/Phosphate-p2.png new file mode 100644 index 000000000..af11fea32 Binary files /dev/null and b/apps/contourclock/fonts/Phosphate-p2.png differ diff --git a/apps/contourclock/fonts/Quicksand-p1.png b/apps/contourclock/fonts/Quicksand-p1.png new file mode 100644 index 000000000..692fb9253 Binary files /dev/null and b/apps/contourclock/fonts/Quicksand-p1.png differ diff --git a/apps/contourclock/fonts/Quicksand-p2.png b/apps/contourclock/fonts/Quicksand-p2.png new file mode 100644 index 000000000..00ac7aef4 Binary files /dev/null and b/apps/contourclock/fonts/Quicksand-p2.png differ diff --git a/apps/contourclock/fonts/SairaEC-p1.png b/apps/contourclock/fonts/SairaEC-p1.png new file mode 100644 index 000000000..82b43af02 Binary files /dev/null and b/apps/contourclock/fonts/SairaEC-p1.png differ diff --git a/apps/contourclock/fonts/SairaEC-p2.png b/apps/contourclock/fonts/SairaEC-p2.png new file mode 100644 index 000000000..d32fd51b4 Binary files /dev/null and b/apps/contourclock/fonts/SairaEC-p2.png differ diff --git a/apps/contourclock/fonts/Teko-p1.png b/apps/contourclock/fonts/Teko-p1.png new file mode 100644 index 000000000..6c33087f9 Binary files /dev/null and b/apps/contourclock/fonts/Teko-p1.png differ diff --git a/apps/contourclock/fonts/Teko-p2.png b/apps/contourclock/fonts/Teko-p2.png new file mode 100644 index 000000000..8dcd86d43 Binary files /dev/null and b/apps/contourclock/fonts/Teko-p2.png differ diff --git a/apps/contourclock/fonts/Yumaro-p1.png b/apps/contourclock/fonts/Yumaro-p1.png new file mode 100644 index 000000000..5e99dd668 Binary files /dev/null and b/apps/contourclock/fonts/Yumaro-p1.png differ diff --git a/apps/contourclock/fonts/Yumaro-p2.png b/apps/contourclock/fonts/Yumaro-p2.png new file mode 100644 index 000000000..ac72818f5 Binary files /dev/null and b/apps/contourclock/fonts/Yumaro-p2.png differ diff --git a/apps/contourclock/fonts/YuseiMagic-p1.png b/apps/contourclock/fonts/YuseiMagic-p1.png new file mode 100644 index 000000000..27485a658 Binary files /dev/null and b/apps/contourclock/fonts/YuseiMagic-p1.png differ diff --git a/apps/contourclock/fonts/YuseiMagic-p2.png b/apps/contourclock/fonts/YuseiMagic-p2.png new file mode 100644 index 000000000..5b01ea036 Binary files /dev/null and b/apps/contourclock/fonts/YuseiMagic-p2.png differ diff --git a/apps/contourclock/fonts/temp b/apps/contourclock/fonts/temp new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/contourclock/fonts/temp @@ -0,0 +1 @@ + diff --git a/apps/contourclock/lib.js b/apps/contourclock/lib.js index 41f778a9a..65a4622f4 100644 --- a/apps/contourclock/lib.js +++ b/apps/contourclock/lib.js @@ -1,49 +1,49 @@ exports.drawClock = function(fontIndex) { - var digits = []; - if (!require("Storage").read("contourclock-"+Math.abs(parseInt(fontIndex+0.5))+".json")) return (false); - var font = JSON.parse(require("Storage").read("contourclock-"+Math.abs(parseInt(fontIndex+0.5))+".json")); + var digits = []; + fontFile=require("Storage").read("contourclock-"+Math.abs(parseInt(fontIndex+0.5))+".json"); + if (fontFile==undefined) return(false); //exit if font file not found + var font = JSON.parse(fontFile); for (var n in font.characters) { digits.push({width: parseInt(font.characters[n].width), - height: font.size, - bpp: 2, - transparent: 1, - buffer:E.toArrayBuffer(atob(font.characters[n].buffer))}); + height: font.size, + bpp: 2, + transparent: 1, + buffer:E.toArrayBuffer(atob(font.characters[n].buffer))}); + } + if (n!=10) return (false); //font file seems to be invalid + var x=0; + var y = g.getHeight()/2-digits[0].height/2; + var date = new Date(); + g.clearRect(0,38,g.getWidth()-1,138); + d1=parseInt(date.getHours()/10); + d2=parseInt(date.getHours()%10); + d3=10; + d4=parseInt(date.getMinutes()/10); + d5=parseInt(date.getMinutes()%10); + w1=digits[d1].width; + w2=digits[d2].width; + w3=digits[d3].width; + w4=digits[d4].width; + w5=digits[d5].width; + squeeze=(g.getWidth()-w5)/(w1+w2+w3+w4); + if (fontIndex<0) { + fg=g.theme.fg; + bg=g.theme.bg; + g.setColor(bg); + g.setBgColor(fg); + } + g.drawImage(digits[d1],x,y); + x+=parseInt(w1*squeeze); + g.drawImage(digits[d2],x,y); + x+=parseInt(w2*squeeze); + g.drawImage(digits[d3],x,y); + x+=parseInt(w3*squeeze); + g.drawImage(digits[d4],x,y); + x+=parseInt(w4*squeeze); + g.drawImage(digits[d5],x,y); + if (fontIndex<0) { + g.setColor(fg); + g.setBgColor(bg); + } + return font.name; } - var x=0; - var y = g.getHeight()/2-digits[0].height/2; - var date = new Date(); - //g.clearRect(0,24,g.getWidth()-1,137); - - g.clearRect(0,38,g.getWidth()-1,138); - d1=parseInt(date.getHours()/10); - d2=parseInt(date.getHours()%10); - d3=10; - d4=parseInt(date.getMinutes()/10); - d5=parseInt(date.getMinutes()%10); - w1=digits[d1].width; - w2=digits[d2].width; - w3=digits[d3].width; - w4=digits[d4].width; - w5=digits[d5].width; - squeeze=(g.getWidth()-w5)/(w1+w2+w3+w4); - if (fontIndex<0) { - fg=g.theme.fg; - bg=g.theme.bg; - g.setColor(bg); - g.setBgColor(fg); - } - g.drawImage(digits[d1],x,y); - x+=parseInt(w1*squeeze); - g.drawImage(digits[d2],x,y); - x+=parseInt(w2*squeeze); - g.drawImage(digits[d3],x,y); - x+=parseInt(w3*squeeze); - g.drawImage(digits[d4],x,y); - x+=parseInt(w4*squeeze); - g.drawImage(digits[d5],x,y); - if (fontIndex<0) { - g.setColor(fg); - g.setBgColor(bg); - } - return font.name; -} diff --git a/apps/contourclock/metadata.json b/apps/contourclock/metadata.json index d324a2dc7..a5d764f2d 100644 --- a/apps/contourclock/metadata.json +++ b/apps/contourclock/metadata.json @@ -1,28 +1,18 @@ { "id": "contourclock", "name": "Contour Clock", "shortName" : "Contour Clock", - "version":"0.20", + "version":"0.24", "icon": "app.png", "description": "A Minimalist clockface with large Digits. Now with more fonts!", "screenshots" : [{"url":"cc-screenshot-1.png"},{"url":"cc-screenshot-2.png"}], "tags": "clock", - "allow_emulator":true, + "custom": "custom.html", "supports" : ["BANGLEJS2"], "type": "clock", "storage": [ {"name":"contourclock.app.js","url":"app.js"}, - {"name":"contourclock.settings.js","url":"contourclock.settings.js"}, - {"name":"contourclock","url":"lib.js"}, - {"name":"contourclock-0.json","url":"font-Impact.json"}, - {"name":"contourclock-1.json","url":"font-Yumaro.json"}, - {"name":"contourclock-2.json","url":"font-DinAlternate.json"}, - {"name":"contourclock-3.json","url":"font-BebasNeue.json"}, - {"name":"contourclock-4.json","url":"font-Dekko.json"}, - {"name":"contourclock-5.json","url":"font-Dosis.json"}, - {"name":"contourclock-6.json","url":"font-Phosphate.json"}, - {"name":"contourclock-7.json","url":"font-Quicksand.json"}, - {"name":"contourclock-8.json","url":"font-SairaCond.json"}, - {"name":"contourclock-9.json","url":"font-YuseiMagic.json"}, + {"name":"contourclock.settings.js","url":"contourclock.settings.js"}, + {"name":"contourclock","url":"lib.js"}, {"name":"contourclock.img","url":"app-icon.js","evaluate":true} ] } diff --git a/apps/dtlaunch/ChangeLog b/apps/dtlaunch/ChangeLog index 62a0cab9f..556472eaa 100644 --- a/apps/dtlaunch/ChangeLog +++ b/apps/dtlaunch/ChangeLog @@ -5,3 +5,4 @@ 0.05: add Bangle 2 version 0.06: Adds settings page (hide clocks or launchers) 0.07: Adds setting for directly launching app on touch for Bangle 2 +0.08: Optimize line wrapping for Bangle 2 diff --git a/apps/dtlaunch/app-b2.js b/apps/dtlaunch/app-b2.js index 800ec456c..96e562add 100644 --- a/apps/dtlaunch/app-b2.js +++ b/apps/dtlaunch/app-b2.js @@ -45,11 +45,23 @@ function draw_icon(p,n,selected) { g.setColor(g.theme.fg); try{g.drawImage(apps[p*4+n].icon,x+12,y+4);} catch(e){} g.setFontAlign(0,-1,0).setFont("6x8",1); - var txt = apps[p*4+n].name.split(" "); - for (var i = 0; i < txt.length; i++) { - txt[i] = txt[i].trim(); - g.drawString(txt[i],x+36,y+54+i*8); + var txt = apps[p*4+n].name.replace(/([a-z])([A-Z])/g, "$1 $2").split(" "); + var lineY = 0; + var line = ""; + while (txt.length > 0){ + var c = txt.shift(); + + if (c.length + 1 + line.length > 13){ + if (line.length > 0){ + g.drawString(line.trim(),x+36,y+54+lineY*8); + lineY++; + } + line = c; + } else { + line += " " + c; + } } + g.drawString(line.trim(),x+36,y+54+lineY*8); } function drawPage(p){ diff --git a/apps/dtlaunch/metadata.json b/apps/dtlaunch/metadata.json index 8ff5bd592..6cd1dbe73 100644 --- a/apps/dtlaunch/metadata.json +++ b/apps/dtlaunch/metadata.json @@ -1,7 +1,7 @@ { "id": "dtlaunch", "name": "Desktop Launcher", - "version": "0.07", + "version": "0.08", "description": "Desktop style App Launcher with six (four for Bangle 2) apps per page - fast access if you have lots of apps installed.", "screenshots": [{"url":"shot1.png"},{"url":"shot2.png"},{"url":"shot3.png"}], "icon": "icon.png", diff --git a/apps/floralclk/metadata.json b/apps/floralclk/metadata.json index 43323abaa..d4848b0d8 100644 --- a/apps/floralclk/metadata.json +++ b/apps/floralclk/metadata.json @@ -2,7 +2,7 @@ "id": "floralclk", "name": "Floral Clock", "version": "0.01", - "description": "A clock with a flower background by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: Works on any Bangle.js 2 but requires firmware 2v11 or later on Bangle.js 1**", + "description": "A clock with a flower background by [Lillith May](https://www.instagram.com/_lilustrations_/)", "icon": "app.png", "screenshots": [{"url":"screenshot_floral.png"}], "type": "clock", diff --git a/apps/gbmusic/ChangeLog b/apps/gbmusic/ChangeLog index 316b98a84..8b1a3e4aa 100644 --- a/apps/gbmusic/ChangeLog +++ b/apps/gbmusic/ChangeLog @@ -6,3 +6,4 @@ 0.06: Bangle.js 2 support 0.07: Fix "previous" button image 0.08: Fix scrolling title background color +0.09: Move event listener from widget to boot code, stops music from showing up in messages diff --git a/apps/gbmusic/app.js b/apps/gbmusic/app.js index 1bddf70f7..c8395f745 100644 --- a/apps/gbmusic/app.js +++ b/apps/gbmusic/app.js @@ -175,10 +175,8 @@ function rIcon(l) { } let layout; function makeUI() { - global.gbmusic_active = true; // we don't need our widget (needed for <2.09 devices) Bangle.loadWidgets(); Bangle.drawWidgets(); - delete (global.gbmusic_active); const Layout = require("Layout"); layout = new Layout({ type: "v", c: [ @@ -331,7 +329,7 @@ function formatNum(info) { * Update music info * @param {Object} info - Gadgetbridge musicinfo event */ -function musicInfo(info) { +function info(info) { scrollStop(); layout.title.label = info.track || ""; layout.album.label = info.album || ""; @@ -360,7 +358,7 @@ let tPxt, tIxt; // Timeouts to eXiT when Paused/Inactive for too long * Update music state * @param {Object} e - Gadgetbridge musicstate event */ -function musicState(e) { +function state(e) { stat = e.state; // if paused for five minutes, load the clock // (but timeout resets if we get new info, even while paused) @@ -584,8 +582,8 @@ function startEmulator() { println: (line) => {console.log("Bluetooth:", line);}, }; // some example info - GB({"t": "musicinfo", "artist": "Some Artist Name", "album": "The Album Name", "track": "The Track Title Goes Here", "dur": 241, "c": 2, "n": 2}); - GB({"t": "musicstate", "state": "play", "position": 0, "shuffle": 1, "repeat": 1}); + info({"t": "musicinfo", "artist": "Some Artist Name", "album": "The Album Name", "track": "The Track Title Goes Here", "dur": 241, "c": 2, "n": 2}); + state({"t": "musicstate", "state": "play", "position": 0, "shuffle": 1, "repeat": 1}); } } function startWatches() { @@ -596,25 +594,6 @@ function startWatches() { function start() { makeUI(); - // start listening for music updates - const _GB = global.GB; - global.GB = (event) => { - // we eat music events! - switch(event.t) { - case "musicinfo": - musicInfo(event); - break; - case "musicstate": - musicState(event); - break; - default: - // pass on other events - if (_GB) { - setTimeout(_GB, 0, event); - } - return; - } - }; startWatches(); tick(); startEmulator(); @@ -625,11 +604,11 @@ function init() { let saved = require("Storage").readJSON("gbmusic.load.json", true); require("Storage").erase("gbmusic.load.json"); if (saved) { - // autoloaded: load state was saved by widget + // autoloaded: load state as saved by widget auto = true; start(); - musicInfo(saved.info); - musicState(saved.state); + info(saved.info); + state(saved.state); return; } diff --git a/apps/gbmusic/boot.js b/apps/gbmusic/boot.js new file mode 100644 index 000000000..154f85c2b --- /dev/null +++ b/apps/gbmusic/boot.js @@ -0,0 +1,37 @@ +setTimeout( // make other boot code run first, so we override e.g. android.boot.js GB + () => { + const APP = global.__FILE__==="gbmusic.app.js", + a = !!(require("Storage").readJSON("gbmusic.json", 1) || {}).autoStart; + + let s, i; // state, info + /** + * Save current song and check if we want to load the gbmusic app + * + * Only runs while other apps are loaded + */ + function check() { + if (s!=="play" || !i || !a || !Bangle.CLOCK) return; // only launch app if we know which song we are playing, and autoLoad is enabled + delete (i.t); + // store info and launch music app + require("Storage").writeJSON("gbmusic.load.json", { + state: s, + info: i, + }); + load("gbmusic.app.js"); + } + + global.GB = (_GB => e => { + // we eat music events! + switch(e.t) { + case "musicinfo": + i = e; + return APP ? info(e) : check(); + case "musicstate": + s = e.state; + return APP ? state(e) : check(); + default: + // pass on other events + if (_GB) setTimeout(_GB, 0, e); + } + })(global.GB); + }, 1); diff --git a/apps/gbmusic/metadata.json b/apps/gbmusic/metadata.json index 9400f70e0..f578f1f48 100644 --- a/apps/gbmusic/metadata.json +++ b/apps/gbmusic/metadata.json @@ -2,7 +2,7 @@ "id": "gbmusic", "name": "Gadgetbridge Music Controls", "shortName": "Music Controls", - "version": "0.08", + "version": "0.09", "description": "Control the music on your Gadgetbridge-connected phone", "icon": "icon.png", "screenshots": [{"url":"screenshot_v1.png"},{"url":"screenshot_v2.png"}], @@ -14,7 +14,7 @@ "storage": [ {"name":"gbmusic.app.js","url":"app.js"}, {"name":"gbmusic.settings.js","url":"settings.js"}, - {"name":"gbmusic.wid.js","url":"widget.js"}, + {"name":"gbmusic.boot.js","url":"boot.js"}, {"name":"gbmusic.img","url":"icon.js","evaluate":true} ], "data": [{"name":"gbmusic.json"},{"name":"gbmusic.load.json"}] diff --git a/apps/gbmusic/widget.js b/apps/gbmusic/widget.js deleted file mode 100644 index 86bda99a1..000000000 --- a/apps/gbmusic/widget.js +++ /dev/null @@ -1,44 +0,0 @@ -(() => { - if (global.gbmusic_active || !(require("Storage").readJSON("gbmusic.json", 1) || {}).autoStart) { - return; - } - if (typeof __FILE__ === 'string') { // only exists since 2v09 - const info = require("Storage").readJSON(__FILE__.split(".")[0]+".info", 1) || false; - if (info && info.type!=="clock") { // info can have no type (but then it isn't a clock) - return; - } - } - - let state, info; - function checkMusic() { - if (state!=="play" || !info) { - return; - } - // playing music: launch music app - require("Storage").writeJSON("gbmusic.load.json", { - state: state, - info: info, - }); - load("gbmusic.app.js"); - } - - const _GB = global.GB; - global.GB = (event) => { - // we eat music events! - switch(event.t) { - case "musicinfo": - info = event; - delete (info.t); - checkMusic(); - break; - case "musicstate": - state = event.state; - checkMusic(); - break; - default: - if (_GB) { - setTimeout(_GB, 0, event); - } - } - }; -})(); diff --git a/apps/gpssetup/README.md b/apps/gpssetup/README.md index 8e64c6a30..8c9445ec9 100644 --- a/apps/gpssetup/README.md +++ b/apps/gpssetup/README.md @@ -107,3 +107,8 @@ try { * Some useful code on Github can be found [here](https://portal.u-blox.com/s/question/0D52p0000925T00CAE/ublox-max-m8q-getting-stuck-when-sleeping-with-extint-pin-control) and [here](https://github.com/thasti/utrak/blob/master/gps.c) + + +Written by: [Hugh Barney, with support from Gordon Williams](https://github.com/hughbarney) For support +and discussion please post in the [Bangle JS +Forum](http://forum.espruino.com/microcosms/1424/) diff --git a/apps/health/metadata.json b/apps/health/metadata.json index eafc2657c..8bb986c57 100644 --- a/apps/health/metadata.json +++ b/apps/health/metadata.json @@ -2,7 +2,7 @@ "id": "health", "name": "Health Tracking", "version": "0.11", - "description": "Logs health data and provides an app to view it (requires firmware 2v10.100 or later)", + "description": "Logs health data and provides an app to view it", "icon": "app.png", "tags": "tool,system,health", "supports": ["BANGLEJS","BANGLEJS2"], diff --git a/apps/hrm/ChangeLog b/apps/hrm/ChangeLog index 4a01008ac..e559adfb6 100644 --- a/apps/hrm/ChangeLog +++ b/apps/hrm/ChangeLog @@ -5,3 +5,4 @@ 0.05: Tweaks for 'HRM-raw' handling 0.06: Add widgets 0.07: Update scaling for new firmware +0.08: Don't force backlight on/watch unlocked on Bangle 2 diff --git a/apps/hrm/heartrate.js b/apps/hrm/heartrate.js index 2e6a34985..305f0e1bc 100644 --- a/apps/hrm/heartrate.js +++ b/apps/hrm/heartrate.js @@ -1,5 +1,8 @@ -Bangle.setLCDPower(1); -Bangle.setLCDTimeout(0); +if (process.env.HWVERSION == 1) { + Bangle.setLCDPower(1); + Bangle.setLCDTimeout(0); +} + Bangle.setHRMPower(1); var hrmInfo, hrmOffset = 0; var hrmInterval; diff --git a/apps/hrm/metadata.json b/apps/hrm/metadata.json index 027e75d67..3e94c163c 100644 --- a/apps/hrm/metadata.json +++ b/apps/hrm/metadata.json @@ -1,7 +1,7 @@ { "id": "hrm", "name": "Heart Rate Monitor", - "version": "0.07", + "version": "0.08", "description": "Measure your heart rate and see live sensor data", "icon": "heartrate.png", "tags": "health", diff --git a/apps/kitchen/README.md b/apps/kitchen/README.md index 2a1b148fd..102881d15 100644 --- a/apps/kitchen/README.md +++ b/apps/kitchen/README.md @@ -280,3 +280,8 @@ The following error codes will be displayed if one of the dependancies is not me * Add a small graph to the heart rate monitor app * Add a facility to call the Arrow calibration process * Maybe create waypoints.json file if missing + + +Written by: [Hugh Barney](https://github.com/hughbarney) For support +and discussion please post in the [Bangle JS +Forum](http://forum.espruino.com/microcosms/1424/) diff --git a/apps/launch/settings.js b/apps/launch/settings.js index 1bb3d5c9a..60422e75c 100644 --- a/apps/launch/settings.js +++ b/apps/launch/settings.js @@ -8,7 +8,7 @@ require("Storage").write("launch.json",settings); } const appMenu = { - /*LANG*/"": {"title": /*LANG*/"Launcher Settings"}, + "": {"title": /*LANG*/"Launcher Settings"}, /*LANG*/"< Back": back, /*LANG*/"Font": { value: fonts.includes(settings.font)? fonts.indexOf(settings.font) : fonts.indexOf("12x20"), diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index 1abd519ab..7d8fecb1e 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -11,4 +11,8 @@ 0.11: Show the gadgetbridge weather temperature (settings). 0.12: Added humidity as an option to display. 0.13: Improved battery visualization. -0.14: Added altitude as an option to display. \ No newline at end of file +0.14: Added altitude as an option to display. +0.15: Using wpedom to count steps. +0.16: Improved stability. Wind can now be shown. +0.17: Settings for mph/kph and other minor improvements. +0.18: Fullscreen mode can now be enabled or disabled in the settings. \ No newline at end of file diff --git a/apps/lcars/README.md b/apps/lcars/README.md index 017be246c..f979b2304 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -1,8 +1,9 @@ # LCARS clock A simple LCARS inspired clock. -Note: To display the steps, the health app is required. If this app is not installed, the data will not be shown. -To contribute you can open a PR at this [GitHub Repo]( https://github.com/peerdavid/BangleApps) +Note: To display the steps, the wpedom app is required. To show weather data +such as temperature, humidity or window you BangleJS must be connected +with Gadgetbride and the weather app must be installed. ## Control * Tap left / right to change between screens. @@ -10,7 +11,7 @@ To contribute you can open a PR at this [GitHub Repo]( https://github.com/peerda ## Features * LCARS Style watch face. - * Full screen mode - widgets are still loaded but not shown. + * Enable or disable fullscreen mode (widgets are always loaded, but hidden if fullscreen). * Tab on left/right to switch between different screens. * Cusomizable data that is shown on screen 1 (steps, weather etc.) * Shows random and real images of planets. @@ -19,25 +20,23 @@ To contribute you can open a PR at this [GitHub Repo]( https://github.com/peerda * Display graphs (day or month) for steps + hrm on the second screen. ## Data that can be configured - * Steps - Steps loaded via the health module + * Steps - Steps loaded via the wpedom app. * Battery - Current battery level in % * VREF - Voltage of battery * HRM - Last measured HRM * Temp - Weather temperature loaded via the weather module + gadgetbridge * Humidity - Humidity loaded via the weather module + gadgetbridge + * Wind - Wind loaded via the weather module + gadgetbridge. Set kph / mph in the settings. * Altitude - Shows the altitude in m. * CoreT - Temperature of device ## Multiple screens support Access different screens via tap on the left/ right side of the screen -![](screenshot.png) +![](screenshot_1.png) ![](screenshot_2.png) -# Ideas -- Tap top / bottom to disable steps (also icon) and start a timer - ## Contributors - [David Peer](https://github.com/peerdavid). - [Adam Schmalhofer](https://github.com/adamschmalhofer). diff --git a/apps/lcars/bg_left_small.png b/apps/lcars/bg_left_small.png new file mode 100644 index 000000000..bfdb110d9 Binary files /dev/null and b/apps/lcars/bg_left_small.png differ diff --git a/apps/lcars/bg_right_small.png b/apps/lcars/bg_right_small.png new file mode 100644 index 000000000..df9d32b38 Binary files /dev/null and b/apps/lcars/bg_right_small.png differ diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 81a501481..7d5da2d8e 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -5,7 +5,9 @@ let settings = { alarm: -1, dataRow1: "Steps", dataRow2: "Temp", - dataRow3: "Battery" + dataRow3: "Battery", + speed: "kph", + fullscreen: false, }; let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; for (const key in saved_settings) { @@ -29,23 +31,39 @@ let lcarsViewPos = 0; // let hrmValue = 0; var plotMonth = false; + /* * Requirements and globals */ -var bgLeft = { +var bgLeftFullscreen = { width : 27, height : 176, bpp : 3, transparent : 0, buffer : require("heatshrink").decompress(atob("AAUM2XLlgCCwAJBBAuy4EAmQIF5cggAIGlmwgYIG2XIF42wF4ImGF4ImHJoQmGJoQdJhZNHNY47CgRNGBIJZHHgRiGBIRQ/KH5QCAFCh/eX5Q/KAwdCAGVbtu27YCCoAJBkuWrNlAQRGCiwRDAQPQBIMJCIYCBsAJBgomEtu0WoQmEy1YBIMBHYttIwQ7FyxQ/KHFlFAQ7F2weCHYplKChRTCCg5TCHw5TMAD0GzVp0wCCBBGaBIMaBAtpwECBA2mwEJBAugDgMmCIwJBF5EABAtoeQQvGCYQdPJoI7LMQzTCLJKAGzAJBO4xQ/KGQA8UP7y/KH5QnAHih/eX5Q/GQ4JCGRJlKCgxTDBAwgCCg5TCHwxTCNA4A==")) }; -var bgRight = { +var bgLeftNotFullscreen = { + width : 27, height : 152, bpp : 3, + transparent : 0, + buffer : require("heatshrink").decompress(atob("AAUM2XLlgCCwAJBBAuy4EAmQIF5cggAIGlmwgYIG2XIF42wF4ImGF4ImHJoQmGJoQdJhZNHNY47CgRNGBIJZHHgRiGBIRQ/KH5QCAGVbtu27YCCoAJBkuWrNlAQRkCiwRDAQPQBIMJCIYCBsAJBgomEtu0WoQmEy1YBIMBHYttIwQ7FyxQ/KHFlFAQ7F2weCHYplKChRTCCg5TCHw5TMAD0GzVp0wCCBBGaBIMaBAtpwECBA2mwEJBAugDgMmCIwJBF5EABAtoeQQvGCYQdPJoI7LMQzTCLJKAGzAJBO4xQ/KGQA8UP7y/KH5QnAHih/eX5Q/GQ4JCGRJlKCgxTDBAwgCCg5TCHwxTCNA4A=")) +}; + +var bgRightFullscreen = { width : 27, height : 176, bpp : 3, transparent : 0, buffer : require("heatshrink").decompress(atob("lmy5YCDBIUyBAmy5AJBhYUG2EAhgIFAQMAgQIGCgQABCg4ABEAwUNFI2AKZHAKZEgGRZTGOIUDQxJxGKH5Q/agwAnUP7y/KH4yGeVYAJrdt23bAQVABIMly1ZsoCCMgUWCIYCB6AJBhIRDAQNgBIMFEwlt2i1CEwmWrAJBgI7FtpGCHYuWKH5QxEwpQDlo7F0A7IqBZBEwo7BCIwCBJo53CJoxiCJpIAdgOmzVpAQR/CgAIEAQJ2CBAoCBBIMmCg1oD4QLGFQUCCjQ+CKYw+CKY4JCKYwoCGRMaGREJDoroCgwdFzBlLKH5QvAHih/eX5Q/KE4A8UP7y/KH5QGDpg7HJoxZCCIx3CJowmCF4yACJox/CgAA=")) }; +var bgRightNotFullscreen = { + width : 27, height : 152, bpp : 3, + transparent : 0, + buffer : require("heatshrink").decompress(atob("lmy5YCDBIUyBAmy5AJBhYUG2EAhgIFAQMAgQIGCgQABCg4ABEAwUNFI2AKZHAKZEgGRZTGOIUDQxJxGKH5Q/agwAxrdt23bAQVABIMly1ZsoCCMgUWCIYCB6AJBhIRDAQNgBIMFEwlt2i1CEwmWrAJBgI7FtpGCHYuWKH5QxEwpQDlo7F0A7IqBZBEwo7BCIwCBJo53CJoxiCJpIAdgOmzVpAQR/CgAIEAQJ2CBAoCBBIMmCg1oD4QLGFQUCCjQ+CKYw+CKY4JCKYwoCGRMaGREJDoroCgwdFzBlLKH5QvAHih/eX5Q/KE4A8UP7y/KH5QGDpg7HJoxZCCIx3CJowmCF4yACJox/CgA=")) +}; + +var bgLeft = settings.fullscreen ? bgLeftFullscreen : bgLeftNotFullscreen; +var bgRight= settings.fullscreen ? bgRightFullscreen : bgRightNotFullscreen; + var iconEarth = { width : 50, height : 50, bpp : 3, buffer : require("heatshrink").decompress(atob("AFtx48ECBsDwU5k/yhARLjgjBjlzAQMQEZcIkOP/fn31IEZgCBnlz58cEpM4geugEgwU/8+WNZJHDuHHvgmBCQ8goEOnVgJoMnyV58mACItHI4X8uAFBuVHnnz4BuGxk4////Egz3IkmWvPgNw8f/prB//BghTC+AjE7848eMjNnzySBwUJkmf/BuGuPDAQIjBiPHhhTCSQnjMo0ITANJn44Dg8MuFBggCCiFBcAJ0Bv5xEh+ITo2OhHkyf/OIQdBWwVHhgjBNwUE+fP/5EEgePMoYLBhMgyVJk/+BQQdC688I4XxOIc8v//NAvr+QEBj/5NwKVBy1/QYUciPBhk1EAJrC+KeC489QYaMBgU/8BNB9+ChEjz1Jkn/QYMBDQIgCcYTCCiP/nlzJQmenMAgV4//uy/9wRaB/1J8iVCcAfHjt9TYYICnhKCgRKBw159/v//r927OIeeoASBDQccvv3791KYVDBYPLJQeCnPnz//AAP6ocEjEkXgMgJQtz79fLAP8KYkccAcJ8Gf/f/xu/cAMQ4eP5MlyQRCMolx40YsOGBAPfnnzU4KVDpKMBvz8Dh0/8me7IICgkxJQXPIgZTD58sEgcJk+eNoONnFBhk4/5uB/pcDg5KD+4mEv4CBXISVDhEn31/8/+mH7x//JQK5CAAMB4JBCnnxJQf/+fJEgkAa4L+CAQOOjMn/1bXIRxDJQXx58f//Hhlz/88EgsChMgz/Zs/+nfkyV/8huDOI6SD498NwoACi1Z8+S/Plz17/+QCI7jC+ZxBmfPnojIAAMDcYWSp//2wRJEwq2GABECjMgNYwAmA=")) @@ -121,18 +139,22 @@ function queueDraw() { function printRow(text, value, y, c){ g.setFontAntonioMedium(); g.setFontAlign(-1,-1,0); - g.setColor(c); - g.fillRect(79, y-2, 85 ,y+18); - - g.setFontAlign(0,-1,0); - g.drawString(value, 110, y); + // Print background g.setColor(c); g.setFontAlign(-1,-1,0); - g.fillRect(133, y-2, 165 ,y+18); - g.fillCircle(161, y+8, 10); + g.fillRect(80, y-2, 165 ,y+18); + g.fillCircle(163, y+8, 10); g.setColor(cBlack); g.drawString(text, 135, y); + + // Plot text + width = g.stringWidth(value); + g.setColor(cBlack); + g.fillRect(130-width-8, y-2, 130, y+18); + g.setColor(c); + g.setFontAlign(1,-1,0); + g.drawString(value, 126, y); } @@ -174,6 +196,11 @@ function _drawData(key, y, c){ var weather = getWeather(); value = weather.hum; + } else if (key == "WIND"){ + text = "WND"; + var weather = getWeather(); + value = weather.wind; + } else if (key == "ALTITUDE"){ should_print= false; text = "ALT"; @@ -207,7 +234,7 @@ function drawHorizontalBgLine(color, x1, x2, y, h){ function drawInfo(){ - if(lcarsViewPos != 0){ + if(lcarsViewPos != 0 || !settings.fullscreen){ return; } @@ -248,16 +275,16 @@ function drawState(){ hours % 4 == 1 ? iconMars : hours % 4 == 2 ? iconMoon : iconEarth; - g.drawImage(iconImg, 24, 118); + g.drawImage(iconImg, 23, 118); g.setColor(cWhite); - g.drawString("STATUS", 24+25, 108); + g.drawString("STATUS", 23+26, 108); } else { // Alarm within symbol g.setColor(cOrange); - g.drawString("ALARM", 24+25, 108); + g.drawString("ALARM", 23+26, 108); g.setColor(cWhite); g.setFontAntonioLarge(); - g.drawString(getAlarmMinutes(), 24+25, 108+35); + g.drawString(getAlarmMinutes(), 23+26, 108+35); } g.setFontAlign(-1, -1, 0); @@ -266,9 +293,10 @@ function drawState(){ function drawPosition0(){ // Draw background image - g.drawImage(bgLeft, 0, 0); - drawHorizontalBgLine(cBlue, 25, 120, 0, 4); - drawHorizontalBgLine(cBlue, 130, 176, 0, 4); + var offset = settings.fullscreen ? 0 : 24; + g.drawImage(bgLeft, 0, offset); + drawHorizontalBgLine(cBlue, 25, 120, offset, 4); + drawHorizontalBgLine(cBlue, 130, 176, offset, 4); drawHorizontalBgLine(cPurple, 20, 70, 80, 4); drawHorizontalBgLine(cPurple, 80, 176, 80, 4); drawHorizontalBgLine(cOrange, 35, 110, 87, 4); @@ -294,15 +322,26 @@ function drawPosition0(){ var currentDate = new Date(); var timeStr = locale.time(currentDate,1); g.setFontAntonioLarge(); - g.drawString(timeStr, 27, 10); + if(settings.fullscreen){ + g.drawString(timeStr, 27, 10); + } else { + g.drawString(timeStr, 27, 33); + } // Write date g.setColor(cWhite); g.setFontAntonioMedium(); - var dayStr = locale.dow(currentDate, true).toUpperCase(); - dayStr += " " + currentDate.getDate(); - dayStr += " " + locale.month(currentDate, 1).toUpperCase(); - g.drawString(dayStr, 30, 56); + if(settings.fullscreen){ + var dayStr = locale.dow(currentDate, true).toUpperCase(); + dayStr += " " + currentDate.getDate(); + dayStr += " " + locale.month(currentDate, 1).toUpperCase(); + g.drawString(dayStr, 30, 56); + } else { + var dayStr = locale.dow(currentDate, true).toUpperCase(); + var date = currentDate.getDate(); + g.drawString(dayStr, 128, 35); + g.drawString(date, 128, 55); + } // Draw data g.setFontAlign(-1, -1, 0); @@ -317,8 +356,11 @@ function drawPosition0(){ function drawPosition1(){ // Draw background image - g.drawImage(bgRight, 149, 0); - drawHorizontalBgLine(cBlue, 0, 140, 0, 4); + var offset = settings.fullscreen ? 0 : 24; + g.drawImage(bgRight, 149, offset); + if(settings.fullscreen){ + drawHorizontalBgLine(cBlue, 0, 140, offset, 4); + } drawHorizontalBgLine(cPurple, 0, 80, 80, 4); drawHorizontalBgLine(cPurple, 90, 150, 80, 4); drawHorizontalBgLine(cOrange, 0, 50, 87, 4); @@ -378,8 +420,13 @@ function drawPosition1(){ g.setFontAlign(1, 1, 0); g.setFontAntonioMedium(); g.setColor(cWhite); - g.drawString("M-HRM", 154, 27); - g.drawString("M-STEPS [K]", 154, 115); + + if(settings.fullscreen){ + g.drawString("M-HRM", 154, 27); + g.drawString("M-STEPS [K]", 154, 115); + } else { + g.drawString("MONTH", 154, 115); + } // Plot day } else { @@ -419,28 +466,40 @@ function drawPosition1(){ g.setFontAlign(1, 1, 0); g.setFontAntonioMedium(); g.setColor(cWhite); - g.drawString("D-HRM", 154, 27); - g.drawString("D-STEPS", 154, 115); + + if(settings.fullscreen){ + g.drawString("D-HRM", 154, 27); + g.drawString("D-STEPS", 154, 115); + } else { + g.drawString("DAY", 154, 115); + } } } function draw(){ - // First handle alarm to show this correctly afterwards - handleAlarm(); + // Queue draw first to ensure that its called in one minute again. + queueDraw(); - // Next draw the watch face - g.reset(); - g.clearRect(0, 0, g.getWidth(), g.getHeight()); + // First handle alarm to show this correctly afterwards + handleAlarm(); - // Draw current lcars position - if(lcarsViewPos == 0){ - drawPosition0(); - } else if (lcarsViewPos == 1) { - drawPosition1(); - } + // Next draw the watch face + g.reset(); + g.clearRect(0, 0, g.getWidth(), g.getHeight()); - // Queue draw in one minute - queueDraw(); + // Draw current lcars position + if(lcarsViewPos == 0){ + drawPosition0(); + } else if (lcarsViewPos == 1) { + drawPosition1(); + } + + // After drawing the watch face, we can draw the widgets + if(settings.fullscreen){ + for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} + } else { + Bangle.drawWidgets(); + } } @@ -448,30 +507,31 @@ function draw(){ * Step counter via widget */ function getSteps() { - var steps = 0; - let health; - try { - health = require("health"); + try{ + if (WIDGETS.wpedom !== undefined) { + return WIDGETS.wpedom.getSteps(); + } else if (WIDGETS.activepedom !== undefined) { + return WIDGETS.activepedom.getSteps(); + } } catch(ex) { - return steps; + // In case we failed, we can only show 0 steps. } - health.readDay(new Date(), h=>steps+=h.steps); - return steps; + return 0; } function getWeather(){ - var weather; + var weatherJson; try { - weather = require('weather').get(); + weatherJson = storage.readJSON('weather.json'); } catch(ex) { // Return default } - if (weather === undefined){ - weather = { + if(weatherJson === undefined){ + return { temp: "-", hum: "-", txt: "-", @@ -479,12 +539,22 @@ function getWeather(){ wdir: "-", wrose: "-" }; - } else { - weather.temp = locale.temp(Math.round(weather.temp-273.15)) - weather.hum = weather.hum + "%"; } - return weather; + var weather = weatherJson.weather; + + // Temperature + weather.temp = locale.temp(weather.temp-273.15); + + // Humidity + weather.hum = weather.hum + "%"; + + // Wind + const wind = locale.speed(weather.wind).match(/^(\D*\d*)(.*)$/); + var speedFactor = settings.speed == "kph" ? 1.0 : 1.0 / 1.60934; + weather.wind = Math.round(wind[1] * speedFactor); + + return weather } @@ -632,16 +702,7 @@ Bangle.on('touch', function(btn, e){ // Show launcher when middle button pressed Bangle.setUI("clock"); Bangle.loadWidgets(); -/* - * we are not drawing the widgets as we are taking over the whole screen - * so we will blank out the draw() functions of each widget and change the - * area to the top bar doesn't get cleared. - */ -for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} // Clear the screen once, at startup and draw clock g.setTheme({bg:"#000",fg:"#fff",dark:true}).clear(); draw(); - -// After drawing the watch face, we can draw the widgets -// Bangle.drawWidgets(); diff --git a/apps/lcars/lcars.settings.js b/apps/lcars/lcars.settings.js index 076dea4d1..75add1ece 100644 --- a/apps/lcars/lcars.settings.js +++ b/apps/lcars/lcars.settings.js @@ -7,7 +7,9 @@ alarm: -1, dataRow1: "Battery", dataRow2: "Steps", - dataRow3: "Temp" + dataRow3: "Temp", + speed: "kph", + fullscreen: false, }; let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; for (const key in saved_settings) { @@ -18,35 +20,53 @@ storage.write(SETTINGS_FILE, settings) } - var data_options = ["Steps", "Battery", "VREF", "HRM", "Temp", "Humidity", "Altitude", "CoreT"]; + var dataOptions = ["Steps", "Battery", "VREF", "HRM", "Temp", "Humidity", "Wind", "Altitude", "CoreT"]; + var speedOptions = ["kph", "mph"]; E.showMenu({ '': { 'title': 'LCARS Clock' }, '< Back': back, 'Row 1': { - value: 0 | data_options.indexOf(settings.dataRow1), - min: 0, max: 7, - format: v => data_options[v], + value: 0 | dataOptions.indexOf(settings.dataRow1), + min: 0, max: 8, + format: v => dataOptions[v], onchange: v => { - settings.dataRow1 = data_options[v]; + settings.dataRow1 = dataOptions[v]; save(); }, }, 'Row 2': { - value: 0 | data_options.indexOf(settings.dataRow2), - min: 0, max: 7, - format: v => data_options[v], + value: 0 | dataOptions.indexOf(settings.dataRow2), + min: 0, max: 8, + format: v => dataOptions[v], onchange: v => { - settings.dataRow2 = data_options[v]; + settings.dataRow2 = dataOptions[v]; save(); }, }, 'Row 3': { - value: 0 | data_options.indexOf(settings.dataRow3), - min: 0, max: 7, - format: v => data_options[v], + value: 0 | dataOptions.indexOf(settings.dataRow3), + min: 0, max: 8, + format: v => dataOptions[v], onchange: v => { - settings.dataRow3 = data_options[v]; + settings.dataRow3 = dataOptions[v]; + save(); + }, + }, + 'Full Screen': { + value: settings.fullscreen, + format: () => (settings.fullscreen ? 'Yes' : 'No'), + onchange: () => { + settings.fullscreen = !settings.fullscreen; + save(); + }, + }, + 'Speed': { + value: 0 | speedOptions.indexOf(settings.speed), + min: 0, max: 1, + format: v => speedOptions[v], + onchange: v => { + settings.speed = speedOptions[v]; save(); }, } diff --git a/apps/lcars/metadata.json b/apps/lcars/metadata.json index 2d04ebdf6..e6ca10f79 100644 --- a/apps/lcars/metadata.json +++ b/apps/lcars/metadata.json @@ -3,13 +3,15 @@ "name": "LCARS Clock", "shortName":"LCARS", "icon": "lcars.png", - "version":"0.14", + "version":"0.18", "readme": "README.md", "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", "type": "clock", "tags": "clock", - "screenshots": [{"url":"screenshot.png"}], + "screenshots": [ + {"url":"screenshot_1.png"}, + {"url":"screenshot_3.png"}], "storage": [ {"name":"lcars.app.js","url":"lcars.app.js"}, {"name":"lcars.img","url":"lcars.icon.js","evaluate":true}, diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png deleted file mode 100644 index 120229fba..000000000 Binary files a/apps/lcars/screenshot.png and /dev/null differ diff --git a/apps/lcars/screenshot_1.png b/apps/lcars/screenshot_1.png new file mode 100644 index 000000000..09a604069 Binary files /dev/null and b/apps/lcars/screenshot_1.png differ diff --git a/apps/lcars/screenshot_2.png b/apps/lcars/screenshot_2.png index 52ad295c4..a7a94db39 100644 Binary files a/apps/lcars/screenshot_2.png and b/apps/lcars/screenshot_2.png differ diff --git a/apps/lcars/screenshot_3.png b/apps/lcars/screenshot_3.png new file mode 100644 index 000000000..931ea15de Binary files /dev/null and b/apps/lcars/screenshot_3.png differ diff --git a/apps/locale/locale.html b/apps/locale/locale.html index 90a2e8d40..b23225d5f 100644 --- a/apps/locale/locale.html +++ b/apps/locale/locale.html @@ -10,6 +10,9 @@ +
+ +

Then click

@@ -106,12 +109,18 @@ exports = { name : "en_GB", currencySym:"£", const lang = languageSelector.options[languageSelector.selectedIndex].value; console.log(`Language ${lang}`); + const translations = document.getElementById('translations').checked; + console.log(`Translations: ${translations}`); + const locale = locales[lang]; if (!locale) { alert(`Language ${lang} not found!`); return; } + if (!translations) + locale.trans = null; + const codePageName = "ISO8859-1"; if (locale.codePage) codePageName = locale.codePage; diff --git a/apps/locale/locales.js b/apps/locale/locales.js index 428e0c773..073f4903f 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -258,7 +258,7 @@ var locales = { temperature: "°C", ampm: { 0: "", 1: "" }, timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" }, - datePattern: { 0: "%A %d %B %Y", "1": "%d/%m/%Y" }, // dimanche 1 mars 2020 // 01/03/2020 + datePattern: { 0: "%d %B %Y", "1": "%d/%m/%Y" }, // 1 mars 2020 // 01/03/2020 abmonth: "janv,févr,mars,avril,mai,juin,juil,août,sept,oct,nov,déc", month: "janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre", abday: "dim,lun,mar,mer,jeu,ven,sam", diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 522534af0..4811cd19b 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -28,3 +28,6 @@ Spread message action buttons out Back button now goes back to list of messages If showMessage called with no message (eg all messages deleted) now return to the clock (fix #1267) +0.19: Use a larger font for message text if it'll fit +0.20: Allow tapping on the body to show a scrollable view of the message and title in a bigger font (fix #1405, #1031) +0.21: Improve list readability on dark theme diff --git a/apps/messages/README.md b/apps/messages/README.md index 23f9ba5c1..a355a58ac 100644 --- a/apps/messages/README.md +++ b/apps/messages/README.md @@ -26,19 +26,15 @@ When a new message is received: When a message is shown, you'll see a screen showing the message title and text. -### Android - -* The 'back-arrow' button goes back to Messages, marking the current message as read. -* If shown, the 'tick' button opens the notification on the phone -* If shown, the 'cross' button dismisses the notification on the phone -* The top-left icon shows more options, for instance deleting the message of marking unread - -### iOS - -* The 'back-arrow' button goes back to Messages, marking the current message as read. -* If shown, the 'tick' button responds positively to the notification (accept call/etc) -* If shown, the 'cross' button responds negatively to the notification (dismiss call/etc) +* The 'back-arrow' button (or physical button on Bangle.js 2) goes back to Messages, marking the current message as read. * The top-left icon shows more options, for instance deleting the message of marking unread +* On Bangle.js 2 you can tap on the message body to view a scrollable version of the title and text (or can use the top-left icon + `View Message`) +* If shown, the 'tick' button: + * **Android** opens the notification on the phone + * **iOS** responds positively to the notification (accept call/etc) +* If shown, the 'cross' button: + * **Android** dismisses the notification on the phone + * **iOS** responds negatively to the notification (dismiss call/etc) ## Images _1. Screenshot of a notification_ diff --git a/apps/messages/app.js b/apps/messages/app.js index 3e692a0cc..4aaf97369 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -27,7 +27,7 @@ var fontBig = g.getFonts().includes("12x20")?"12x20":"6x8:2"; var fontLarge = g.getFonts().includes("6x15")?"6x15:2":"6x8:4"; var colBg = g.theme.dark ? "#141":"#4f4"; var colSBg1 = g.theme.dark ? "#121":"#cFc"; -var colSBg2 = g.theme.dark ? "#242":"#9F9"; +var colSBg2 = g.theme.dark ? "#000":"#9F9"; // hack for 2v10 firmware's lack of ':size' font handling try { g.setFont("6x8:2"); @@ -198,9 +198,39 @@ function showMusicMessage(msg) { layout.render(); } +function showMessageScroller(msg) { + var bodyFont = fontBig; + g.setFont(bodyFont); + var lines = []; + if (msg.title) lines = g.wrapString(msg.title, g.getWidth()-10) + var titleCnt = lines.length; + if (titleCnt) lines.push(""); // add blank line after title + lines = lines.concat(g.wrapString(msg.body, g.getWidth()-10),["",/*LANG*/"< Back"]); + E.showScroller({ + h : g.getFontHeight(), // height of each menu item in pixels + c : lines.length, // number of menu items + // a function to draw a menu item + draw : function(idx, r) { + // FIXME: in 2v13 onwards, clearRect(r) will work fine. There's a bug in 2v12 + g.setBgColor(idx=lines.length-2) + showMessage(msg.id); + } + }); + // ensure button-press on Bangle.js 2 takes us back + if (process.env.HWVERSION>1) Bangle.btnWatches = [ + setWatch(() => showMessage(msg.id), BTN1, {repeat:1,edge:"falling"}) + ]; +} + function showMessageSettings(msg) { E.showMenu({"":{"title":/*LANG*/"Message"}, "< Back" : () => showMessage(msg.id), + /*LANG*/"View Message" : () => { + showMessageScroller(msg); + }, /*LANG*/"Delete" : () => { MESSAGES = MESSAGES.filter(m=>m.id!=msg.id); saveMessages(); @@ -245,12 +275,13 @@ function showMessage(msgid) { title = (lines.length>2) ? lines.slice(0,2).join("\n")+"..." : lines.join("\n"); } } + function goBack() { + msg.new = false; saveMessages(); // read mail + cancelReloadTimeout(); // don't auto-reload to clock now + checkMessages({clockIfNoMsg:1,clockIfAllRead:0,showMsgIfUnread:0}); + } var buttons = [ - {type:"btn", src:getBackImage(), cb:()=>{ - msg.new = false; saveMessages(); // read mail - cancelReloadTimeout(); // don't auto-reload to clock now - checkMessages({clockIfNoMsg:1,clockIfAllRead:0,showMsgIfUnread:0}); - }} // back + {type:"btn", src:getBackImage(), cb:goBack} // back ]; if (msg.positive) { buttons.push({fillx:1}); @@ -270,9 +301,18 @@ function showMessage(msgid) { checkMessages({clockIfNoMsg:1,clockIfAllRead:1,showMsgIfUnread:1}); }}); } - var bodyFont = fontMedium; - lines = g.setFont(bodyFont).wrapString(msg.body, g.getWidth()-10); - var body = (lines.length>4) ? lines.slice(0,4).join("\n")+"..." : lines.join("\n"); + // If body of message is only two lines long w/ large font, use large font. + var body=msg.body, bodyFont = fontLarge, lines; + if (body) { + var w = g.getWidth()-48; + if (g.setFont(bodyFont).stringWidth(body) > w * 2) + bodyFont = fontMedium; + if (g.setFont(bodyFont).stringWidth(body) > w) { + lines = g.setFont(bodyFont).wrapString(msg.body, g.getWidth()-10); + body = (lines.length>4) ? lines.slice(0,4).join("\n")+"..." : lines.join("\n"); + } + } + layout = new Layout({ type:"v", c: [ {type:"h", fillx:1, bgCol:colBg, c: [ { type:"btn", src:getMessageImage(msg), col:getMessageImageCol(msg), pad: 3, cb:()=>{ @@ -284,11 +324,18 @@ function showMessage(msgid) { title?{type:"txt", font:titleFont, label:title, bgCol:colBg, fillx:1, pad:2 }:{}, ]}, ]}, - {type:"txt", font:bodyFont, label:body, fillx:1, filly:1, pad:2 }, + {type:"txt", font:bodyFont, label:body, fillx:1, filly:1, pad:2, cb:()=>{ + // allow tapping to show a larger version + showMessageScroller(msg); + } }, {type:"h",fillx:1, c: buttons} ]}); g.clearRect(Bangle.appRect); layout.render(); + // ensure button-press on Bangle.js 2 takes us back + if (process.env.HWVERSION>1) Bangle.btnWatches = [ + setWatch(goBack, BTN1, {repeat:1,edge:"falling"}) + ]; } diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index 901419913..6834693ae 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.18", + "version": "0.21", "description": "App to display notifications from iOS and Gadgetbridge", "icon": "app.png", "type": "app", diff --git a/apps/mylocation/ChangeLog b/apps/mylocation/ChangeLog index 653f859ae..b9eba67f4 100644 --- a/apps/mylocation/ChangeLog +++ b/apps/mylocation/ChangeLog @@ -1,2 +1,3 @@ 0.01: First release 0.02: Enhanced icon, make it bolder +0.03: Fixed issue with defaulting back to London diff --git a/apps/mylocation/metadata.json b/apps/mylocation/metadata.json index b26a97290..a7fd8356c 100644 --- a/apps/mylocation/metadata.json +++ b/apps/mylocation/metadata.json @@ -4,7 +4,7 @@ "icon": "mylocation.png", "type": "app", "screenshots": [{"url":"screenshot_1.png"}], - "version":"0.02", + "version":"0.03", "description": "Sets and stores the lat and long of your preferred City or it can be set from the GPS. mylocation.json can be used by other apps that need your main location lat and lon. See README", "readme": "README.md", "tags": "tool,utility", diff --git a/apps/mylocation/mylocation.app.js b/apps/mylocation/mylocation.app.js index fb2f73fa7..27ab17ea5 100644 --- a/apps/mylocation/mylocation.app.js +++ b/apps/mylocation/mylocation.app.js @@ -9,32 +9,35 @@ let s = { 'lat': 51.5072, 'lon': 0.1276, 'location': "London" -} +}; function loadSettings() { - settings = require('Storage').readJSON(SETTINGS_FILE, 1) || s; + settings = require('Storage').readJSON(SETTINGS_FILE, 1) || {}; + for (const key in settings) { + s[key] = settings[key] + } } function save() { - settings = s - require('Storage').write(SETTINGS_FILE, settings) + settings = s; + require('Storage').write(SETTINGS_FILE, settings); } -const locations = ["London", "Newcastle", "Edinburgh", "Paris", "New York", "Tokyo","???"]; -const lats = [51.5072 ,54.9783 ,55.9533 ,48.8566 ,40.7128 ,35.6762, 0.0]; -const lons = [-0.1276 ,-1.6178 ,-3.1883 ,2.3522 , -74.0060 ,139.6503, 0.0]; +const locations = ["London" ,"Newcastle","Edinburgh", "Paris" , "New York" , "Tokyo" , "Frankfurt", "Auckland", "???"]; +const lats = [ 51.5072 , 54.9783 , 55.9533 , 48.8566 , 40.7128 , 35.6762 , 50.1236 , -36.9 , 0.0 ]; +const lons = [ -0.1276 , -1.6178 , -3.1883 , 2.3522 , -74.0060 , 139.6503 , 8.6553 , 174.7832 , 0.0 ]; function setFromGPS() { Bangle.on('GPS', (gps) => { //console.log("."); if (gps.fix === 0) return; //console.log("fix from GPS"); - s = {'lat': gps.lat, 'lon': gps.lon, 'location': '???' } + s = {'lat': gps.lat, 'lon': gps.lon, 'location': '???' }; Bangle.buzz(1500); // buzz on first position Bangle.setGPSPower(0); save(); - Bangle.setUI("updown", ()=>{ load() }); + Bangle.setUI("updown", ()=>{ load(); }); E.showPrompt("Location has been saved from the GPS fix",{ title:"Location Saved", buttons : {"OK":1} @@ -49,13 +52,13 @@ function setFromGPS() { } function showMainMenu() { - console.log("showMainMenu"); + //console.log("showMainMenu"); const mainmenu = { '': { 'title': 'My Location' }, '{ load(); }, 'City': { value: 0 | locations.indexOf(s.location), - min: 0, max: 6, + min: 0, max: locations.length - 1, format: v => locations[v], onchange: v => { if (v != 6) { @@ -67,7 +70,7 @@ function showMainMenu() { } }, 'Set From GPS': ()=>{ setFromGPS(); } - } + }; return E.showMenu(mainmenu); } diff --git a/apps/neonx/ChangeLog b/apps/neonx/ChangeLog new file mode 100644 index 000000000..af7f83942 --- /dev/null +++ b/apps/neonx/ChangeLog @@ -0,0 +1 @@ +0.01: Initial release diff --git a/apps/neonx/README.md b/apps/neonx/README.md new file mode 100644 index 000000000..d836dfab3 --- /dev/null +++ b/apps/neonx/README.md @@ -0,0 +1,20 @@ +# Neon X and IO X Clock + +| ![Neon X](neonx-screenshot.png) | ![Neon IO X](neoniox-screenshot.png) | +|---------------------------------|--------------------------------------| +|
Neon X
|
Neon IO X
| + +This is a clock based on Pebble's Neon X and Neon IO X watchfaces by Sam Jerichow. +Can be switched between in the Settings menu, which can be accessed through +the app/widget settings menu of the Bangle.js + +## Settings + +### Neon IO X: +Activate the Neon IO X clock look, a bit hard to read until one gets used to it. + +### Thickness +The thickness of watch lines, from 1 to 5. + +### Date on touch +Shows the current date as DD MM on touch and reverts back to time after 5 seconds or with another touch. diff --git a/apps/neonx/metadata.json b/apps/neonx/metadata.json new file mode 100644 index 000000000..41b16d11b --- /dev/null +++ b/apps/neonx/metadata.json @@ -0,0 +1,20 @@ +{ + "id": "neonx", + "name": "Neon X & IO X Clock", + "shortName": "Neon X Clock", + "version": "0.01", + "description": "Pebble Neon X & Neon IO X for Bangle.js", + "icon": "neonx.png", + "type": "clock", + "readme": "README.md", + "tags": "neonx,neonio,neoniox,clock", + "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url": "neonx-screenshot.png"}, {"url": "neoniox-screenshot.png"}], + "storage": [ + {"name": "neonx.app.js", "url": "neonx.app.js"}, + {"name": "neonx.img", "url": "neonx-icon.js", "evaluate": true}, + {"name": "neonx.settings.js", "url": "neonx.settings.js"} + ], + "data": [{"name": "neonx.json"}] +} diff --git a/apps/neonx/neoniox-screenshot.png b/apps/neonx/neoniox-screenshot.png new file mode 100644 index 000000000..0b33b0819 Binary files /dev/null and b/apps/neonx/neoniox-screenshot.png differ diff --git a/apps/neonx/neonx-icon.js b/apps/neonx/neonx-icon.js new file mode 100644 index 000000000..3ed628b0b --- /dev/null +++ b/apps/neonx/neonx-icon.js @@ -0,0 +1 @@ +E.toArrayBuffer(atob("MDCDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAwAAAAAAAAAALaAAAAAAAAAAG2AAAAAAAAAALaAAAAAAAAAAG2AAAAAAAAAALaAAAAAAAAAAG2AAAAAAAAAALaAAAAAAAAAAG2AAAAAAAAAALaAAAAAAAAAAG2AAAAAAAAAALaAAAAAAAAAAG2AAAAAAAAAALaAAAAAAAAAAG2AAAAAAAAAALaAAAAAAAAAAG2AAAAAAAAAALaAAAAAAAAAAG2AAAAAAAAAALaAAAAAAAAAAG2AAAAAAAAAALaAAAAAAAAAAG2AAAAAAAAAALaAAAAAAAAAAG2AAAAAAAAAALaAAAAAAAAAAG2AAAAAAAAAALaAAAAAAAAAAG2AAAAAAAAAALaAAAAAAAAAAG2AAAAAAAAAALaAAAAAAAAAAG2AAAAAAAAAALaAAAAAAAAAAG2AAAAAAAAAALaAAAAAAAAAAG2AAAAAAAAAABQAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAgABttttttttsAAEkAAAAAAAEkANtttttttttgAEkAAAAAAAEkABttttttttsAAEkAAAAAAAEkAAAAAAAAAAAAAEkAAAAAAAEkAAAAAAAAAAAAAEkAAAAAAAEkAAAAAAAAAAAAAEkAAAAAAAEkAAAAAAAAAAAAAEkAAAAAAAEkAAAAAAAAAAAAAEkAAAAAAAEkAAAAAAAAAAAAAEkAAAAAAAEkAAAAAAAAAAAAAAgAAAAAAAEkAAAAAAAAAAAAAAAAAAAAAAEkAAAAAAAAAAAAAAAAAAAAAAEkAAAAAAAAAAAAAAAAAAAAAAEkAAAAAAAAAAAAAAAAAAAAAAEkAAAAAAAAAAAAAAAAAAAAAAEkAAAAAAAAAAAAAAAAAAAAAAEkAAAAAAAAAAAAAAAAAAAAAAEkABttttttttsAAAAAAAAAAAEkANtttttttttgAAAAAAAAAAAgABttttttttsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==")) diff --git a/apps/neonx/neonx-screenshot.png b/apps/neonx/neonx-screenshot.png new file mode 100644 index 000000000..f18348f52 Binary files /dev/null and b/apps/neonx/neonx-screenshot.png differ diff --git a/apps/neonx/neonx.app.js b/apps/neonx/neonx.app.js new file mode 100644 index 000000000..967fc8582 --- /dev/null +++ b/apps/neonx/neonx.app.js @@ -0,0 +1,153 @@ +/** + * Bangle.js Neon X/IO X Clock + * + * Author: Bundyo + * Repo: https://github.com/bundyo/BangleApps/tree/master/apps/neonx + * Initial code based on Numerals Clock by Raik M. + * Pebble Watchface Author: Sam Jerichow + * Created: February 2022 + */ + +const digits = { + 0:[[15,15,85,15,85,85,15,85,15,15]], + 1:[[85,15,85,85]], + 2:[[15,15,85,15,85,50], [15,50,15,85,85,85]], + 3:[[15,15,85,15,85,85,15,85]], + 4:[[15,15,15,50], [85,15,85,85]], + 5:[[85,15,15,15,15,50], [85,50,85,85,15,85]], + 6:[[85,15,15,15,15,85,85,85,85,50]], + 7:[[15,15,85,15,85,85]], + 8:[[15,15,85,15],[15,85,85,85]], + 9:[[15,50,15,15,85,15,85,85,15,85]], +}; + +const colors = { + x: [ + ["#FF00FF", "#00FFFF"], + ["#00FF00", "#FFFF00"] + ], + io: [ + ["#FF00FF", "#FFFF00"], + ["#00FF00", "#00FFFF"] + ] +}; + +const is12hour = (require("Storage").readJSON("setting.json",1)||{})["12hour"]||false; +const screenWidth = g.getWidth(); +const halfWidth = screenWidth / 2; +const scale = screenWidth / 240; +const REFRESH_RATE = 10E3; + +let interval = 0; +let showingDate = false; + +function drawLine(poly, thickness){ + for (let i = 0; i < poly.length; i = i + 2){ + if (poly[i + 2] === undefined) { + break; + } + + if (poly[i] !== poly[i + 2]) { + g.fillRect(poly[i], poly[i + 1] - thickness / 2, poly[i + 2], poly[i + 3] + thickness / 2); + } else { + g.fillRect(poly[i] - thickness / 2, poly[i + 1], poly[i + 2] + thickness / 2, poly[i + 3]); + } + + g.fillCircle(poly[i], poly[i + 1], thickness / 2); + g.fillCircle(poly[i + 2], poly[i + 3], thickness / 2); + } +} + +let settings = require('Storage').readJSON('neonx.json', 1); + +if (!settings) { + settings = { + thickness: 4, + io: 0, + showDate: 1 + }; +} + +function drawClock(num){ + let tx, ty; + + for (let x = 0; x <= 1; x++) { + for (let y = 0; y <= 1; y++) { + const current = ((y + 1) * 2 + x - 1); + let newScale = scale; + + g.setColor(colors[settings.io ? 'io' : 'x'][y][x]); + + if (!settings.io) { + tx = (x * 100 + 18) * newScale; + ty = (y * 100 + 32) * newScale; + } else { + newScale = 0.33 + current * 0.4; + + tx = (halfWidth - 139) * newScale + halfWidth; + ty = (halfWidth - 139) * newScale + halfWidth + 12; + } + + for (let i = 0; i < digits[num[y][x]].length; i++) { + drawLine(g.transformVertices(digits[num[y][x]][i], { x: tx, y: ty, scale: newScale}), settings.thickness); + } + } + } +} + +function draw(date){ + let d = new Date(); + let l1, l2; + + showingDate = date; + + if (date) { + setUpdateInt(0); + + l1 = ('0' + (new Date()).getDate()).substr(-2); + l2 = ('0' + ((new Date()).getMonth() + 1)).substr(-2); + + setTimeout(_ => { + draw(); + setUpdateInt(1); + }, 5000); + } else { + l1 = ('0' + (d.getHours() % (is12hour ? 12 : 24))).substr(-2); + l2 = ('0' + d.getMinutes()).substr(-2); + } + + g.clearRect(0,24,240,240); + + drawClock([l1, l2]); +} + +function setUpdateInt(set){ + if (interval) { + clearInterval(interval); + } + + if (set) { + interval = setInterval(draw, REFRESH_RATE); + } +} + +g.clear(1); + +Bangle.setUI("clock"); + +setUpdateInt(1); +draw(); + +if (settings.showDate) { + Bangle.on('touch', () => draw(!showingDate)); +} + +Bangle.on('lcdPower', function(on){ + if (on){ + draw(); + setUpdateInt(1); + } else setUpdateInt(0); +}); + +Bangle.loadWidgets(); +Bangle.drawWidgets(); diff --git a/apps/neonx/neonx.png b/apps/neonx/neonx.png new file mode 100644 index 000000000..5c7563051 Binary files /dev/null and b/apps/neonx/neonx.png differ diff --git a/apps/neonx/neonx.settings.js b/apps/neonx/neonx.settings.js new file mode 100644 index 000000000..0e205e03b --- /dev/null +++ b/apps/neonx/neonx.settings.js @@ -0,0 +1,54 @@ +(function(back) { + function updateSettings() { + storage.write('neonx.json', neonXSettings); + } + + function resetSettings() { + neonXSettings = { + thickness: 4, + io: 0, + showDate: 1 + }; + + updateSettings(); + } + + let neonXSettings = storage.readJSON('neonx.json',1); + + if (!neonXSettings) resetSettings(); + + let thicknesses = [1, 2, 3, 4, 5]; + + const menu = { + "" : { "title":"Neon X & IO"}, + "< Back": back, + "Neon IO X": { + value: 0 | neonXSettings.io, + min: 0, max: 1, + format: v => v ? "On" : "Off", + onchange: v => { + neonXSettings.io = v; + updateSettings(); + } + }, + "Thickness": { + value: 0 | thicknesses.indexOf(neonXSettings.thickness), + min: 0, max: thicknesses.length - 1, + format: v => thicknesses[v], + onchange: v => { + neonXSettings.thickness = thicknesses[v]; + updateSettings(); + } + }, + "Date on touch": { + value: 0 | neonXSettings.showDate, + min: 0, max: 1, + format: v => v ? "On" : "Off", + onchange: v => { + neonXSettings.showDate = v; + updateSettings(); + } + } + }; + E.showMenu(menu); +}) diff --git a/apps/pastel/ChangeLog b/apps/pastel/ChangeLog index c81d0cacc..d133697b3 100644 --- a/apps/pastel/ChangeLog +++ b/apps/pastel/ChangeLog @@ -11,3 +11,8 @@ 0.11: Changed cycle on minute to prevInfo to avoid the 2nd one being the blank line 0.12: Removed dependancy on widpedom, now uses Bangle.getHealthStatus("day").steps which requires 2.11.27 firmware to reset at midnight +0.13: call process.memory(false) to avoid triggering a GC of memory + supported in pre 2.12.13 firmware +0.14: incorporated lazybones idle timer, configuration settings to come +0.15: fixed tendancy for mylocation to default to London + added setting to enable/disable idle timer warning diff --git a/apps/pastel/metadata.json b/apps/pastel/metadata.json index 1a311599c..da3c18eae 100644 --- a/apps/pastel/metadata.json +++ b/apps/pastel/metadata.json @@ -2,8 +2,8 @@ "id": "pastel", "name": "Pastel Clock", "shortName": "Pastel", - "version": "0.12", - "description": "A Configurable clock with custom fonts, background and weather display. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times. Requires firmware 2.11.27", + "version": "0.15", + "description": "A Configurable clock with custom fonts, background and weather display. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", "icon": "pastel.png", "dependencies": {"mylocation":"app","weather":"app"}, "screenshots": [{"url":"screenshot_pastel.png"}, {"url":"weather_icons.png"}], diff --git a/apps/pastel/pastel.app.js b/apps/pastel/pastel.app.js index d9dfb0da5..605b78ad0 100644 --- a/apps/pastel/pastel.app.js +++ b/apps/pastel/pastel.app.js @@ -4,9 +4,18 @@ const storage = require('Storage'); const locale = require("locale"); const SETTINGS_FILE = "pastel.json"; const LOCATION_FILE = "mylocation.json"; +const w = g.getWidth(); +const h = g.getHeight(); let settings; let location; +// variable for controlling idle alert +let lastStep = getTime(); +let lastStepTime = '??'; +let warned = 0; +let idle = false; +let IDLE_MINUTES = 26; + // cloud, sun, partSun, snow, rain, storm, error // create 1 bit, max contrast, brightness set to 85 var cloudIcon = require("heatshrink").decompress(atob("kEggIfcj+AAYM/8ADBuFwAYPAmADCCAMBwEf8ADBhFwg4aBnEPAYMYjAVBhgDDDoQDHCYc4jwDB+EP///FYIDBMTgA==")); @@ -16,16 +25,24 @@ var snowIcon = require("heatshrink").decompress(atob("kEggITQj/AAYM98ADBsEwAYPAj var rainIcon = require("heatshrink").decompress(atob("kEggIPMh+AAYM/8ADBuFwAYPgmADB4EbAYOAj/ggOAhnwg4aBnAeCjEcCIMMjADCDoQDHjAPCnAXCuEP///8EDAYJECAAXBwkAgPDhwDBwUMgEEhkggEOjFgFgMQLYQAOA==")); var errIcon = require("heatshrink").decompress(atob("kEggILIgOAAYsD4ADBg/gAYMGsADBhkwAYsYjADCjgDBmEMAYNxxwDBsOGAYPBwYDEgOBwOAgYDB4EDHYPAgwDBsADDhgDBFIcwjAHBjE4AYMcmADBhhNCKIcG/4AGOw4A==")); +// saves having to recode all the small font calls +function setSmallFont() { + g.setFontLatoSmall(); +} function loadSettings() { settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; settings.grid = settings.grid||false; settings.font = settings.font||"Lato"; + settings.idle_check = settings.idle_check||true; } // requires the myLocation app function loadLocation() { - location = require("Storage").readJSON(LOCATION_FILE,1)||{"lat":51.5072,"lon":0.1276,"location":"London"}; + location = require("Storage").readJSON(LOCATION_FILE,1)||{}; + location.lat = location.lat||51.5072; + location.lon = location.lon||0.1276; + location.location = location.location||"London"; } function extractTime(d){ @@ -71,19 +88,20 @@ function getSteps() { if (WIDGETS.wpedom !== undefined) return WIDGETS.wpedom.getSteps(); else - return '???' + return '???'; } } const infoData = { ID_BLANK: { calc: () => '' }, - ID_DATE: { calc: () => {var d = (new Date).toString().split(" "); return d[2] + ' ' + d[1] + ' ' + d[3];} }, - ID_DAY: { calc: () => {var d = require("locale").dow(new Date).toLowerCase(); return d[0].toUpperCase() + d.substring(1);} }, + ID_DATE: { calc: () => {var d = (new Date()).toString().split(" "); return d[2] + ' ' + d[1] + ' ' + d[3];} }, + ID_DAY: { calc: () => {var d = require("locale").dow(new Date()).toLowerCase(); return d[0].toUpperCase() + d.substring(1);} }, ID_SR: { calc: () => 'Sunrise: ' + sunRise }, ID_SS: { calc: () => 'Sunset: ' + sunSet }, ID_STEP: { calc: () => 'Steps: ' + getSteps() }, + ID_LAST: { calc: () => 'Last Step: ' + lastStepTime }, ID_BATT: { calc: () => 'Battery: ' + E.getBattery() + '%' }, - ID_MEM: { calc: () => {var val = process.memory(); return 'Ram: ' + Math.round(val.usage*100/val.total) + '%';} }, + ID_MEM: { calc: () => {var val = process.memory(false); return 'Ram: ' + Math.round(val.usage*100/val.total) + '%';} }, ID_ID: { calc: () => {var val = NRF.getAddress().split(':'); return 'Id: ' + val[4] + val[5];} }, ID_FW: { calc: () => 'Fw: ' + process.env.VERSION } }; @@ -152,6 +170,14 @@ function getWeather() { } function draw() { + if (!idle) + drawClock(); + else + drawIdle(); + queueDraw(); +} + +function drawClock() { var d = new Date(); var da = d.toString().split(" "); var time = da[4].substr(0,5); @@ -166,11 +192,8 @@ function draw() { if (parseInt(hh) > 12) hh = h2.substr(h2.length -2); - var w = g.getWidth(); - var h = g.getHeight(); var x = (g.getWidth()/2); var y = (g.getHeight()/3); - var weatherJson = getWeather(); var w_temp; var w_icon; @@ -190,7 +213,8 @@ function draw() { } g.reset(); - g.clearRect(0, 30, w, h - 24); + g.setColor(g.theme.bg); + g.fillRect(Bangle.appRect); // draw a grid like graph paper if (settings.grid && process.env.HWVERSION !=1) { @@ -249,6 +273,141 @@ function draw() { queueDraw(); } + +///////////////// IDLE TIMER ///////////////////////////////////// + +function log_debug(o) { + //print(o); +} + +function drawIdle() { + let mins = Math.round((getTime() - lastStep) / 60); + g.reset(); + g.setColor(g.theme.bg); + g.fillRect(Bangle.appRect); + g.setColor(g.theme.fg); + setSmallFont(); + g.setFontAlign(0, 0); + g.drawString('Last step was', w/2, (h/3)); + g.drawString(mins + ' minutes ago', w/2, 20+(h/3)); + dismissBtn.draw(); +} + +/////////////// BUTTON CLASS /////////////////////////////////////////// + +// simple on screen button class +function BUTTON(name,x,y,w,h,c,f,tx) { + this.name = name; + this.x = x; + this.y = y; + this.w = w; + this.h = h; + this.color = c; + this.callback = f; + this.text = tx; +} + +// if pressed the callback +BUTTON.prototype.check = function(x,y) { + //console.log(this.name + ":check() x=" + x + " y=" + y +"\n"); + + if (x>= this.x && x<= (this.x + this.w) && y>= this.y && y<= (this.y + this.h)) { + log_debug(this.name + ":callback\n"); + this.callback(); + return true; + } + return false; +}; + +BUTTON.prototype.draw = function() { + g.setColor(this.color); + g.fillRect(this.x, this.y, this.x + this.w, this.y + this.h); + g.setColor("#000"); // the icons and boxes are drawn black + setSmallFont(); + g.setFontAlign(0, 0); + g.drawString(this.text, (this.x + this.w/2), (this.y + this.h/2)); + g.drawRect(this.x, this.y, (this.x + this.w), (this.y + this.h)); +}; + +function dismissPrompt() { + idle = false; + warned = false; + lastStep = getTime(); + Bangle.buzz(100); + draw(); +} + +var dismissBtn = new BUTTON("big",0, 3*h/4 ,w, h/4, "#0ff", dismissPrompt, "Dismiss"); + +Bangle.on('touch', function(button, xy) { + if (idle && dismissBtn.check(xy.x, xy.y)) return; +}); + +// if we get a step then we are not idle +Bangle.on('step', s => { + setLastStepTime(); + lastStep = getTime(); + // redraw if we had been idle + if (idle == true) { + dismissPrompt(); + } + idle = false; + warned = 0; +}); + +function setLastStepTime() { + var date = new Date(); + lastStepTime = require("locale").time(date,1); +} + +function checkIdle() { + if (!settings.idle_check) { + idle = false; + warned = false; + return; + } + + let hour = (new Date()).getHours(); + let active = (hour >= 9 && hour < 21); + //let active = true; + let dur = getTime() - lastStep; + + if (active && dur > IDLE_MINUTES * 60) { + drawIdle(); + if (warned++ < 3) { + buzzer(warned); + log_debug("checkIdle: warned=" + warned); + Bangle.setLocked(false); + } + idle = true; + } else { + idle = false; + warned = 0; + } +} + +setLastStepTime(); + +// timeout for multi-buzzer +var buzzTimeout; + +// n buzzes +function buzzer(n) { + log_debug("buzzer n=" + n); + + if (n-- < 1) return; + Bangle.buzz(250); + + if (buzzTimeout) clearTimeout(buzzTimeout); + buzzTimeout = setTimeout(function() { + buzzTimeout = undefined; + buzzer(n); + }, 500); +} + + +/////////////////////////////////////////////////////////////////////////////// + // timeout used to update every minute var drawTimeout; @@ -258,6 +417,7 @@ function queueDraw() { drawTimeout = setTimeout(function() { drawTimeout = undefined; prevInfo(); + checkIdle(); draw(); }, 60000 - (Date.now() % 60000)); } diff --git a/apps/pastel/pastel.settings.js b/apps/pastel/pastel.settings.js index bf83fa7c2..26dafd271 100644 --- a/apps/pastel/pastel.settings.js +++ b/apps/pastel/pastel.settings.js @@ -5,6 +5,7 @@ let s = { 'grid': false, 'weather': false, + 'idle_check': true, 'font': "Lato" } @@ -51,6 +52,24 @@ s.weather = !s.weather; save(); }, + }, + // for use when the new menu system goes live + /* + 'Idle Warning': { + value: s.idle_check, + onchange : v => { + s.idle_check = v; + save(); + }, + }, + */ + 'Idle Warning': { + value: s.idle_check, + format: () => (s.idle_check ? 'Yes' : 'No'), + onchange: () => { + s.idle_check = !s.idle_check; + save(); + }, } }) }) diff --git a/apps/recorder/ChangeLog b/apps/recorder/ChangeLog index 890d97389..60477ae97 100644 --- a/apps/recorder/ChangeLog +++ b/apps/recorder/ChangeLog @@ -13,3 +13,5 @@ Move recording for CoreTemp to its own app 0.08: Memory usage improvements for recorder app itself 0.09: Show correct number for log in overwrite prompt +0.10: Fix broken recorder settings (when launched from settings app) +0.11: Fix KML and GPX export when there is no GPS data diff --git a/apps/recorder/interface.html b/apps/recorder/interface.html index 0535b2d51..8cf339e85 100644 --- a/apps/recorder/interface.html +++ b/apps/recorder/interface.html @@ -4,12 +4,18 @@
+
+ + - + + + + + + - - + diff --git a/bin/language_scan.js b/bin/language_scan.js index ba0914ad9..6385caf49 100755 --- a/bin/language_scan.js +++ b/bin/language_scan.js @@ -5,6 +5,16 @@ outputs a list of strings that have been found. See https://github.com/espruino/BangleApps/issues/1311 */ +let translate = false; +if (process.env.DEEPL) { + // Requires translate + // npm i translate + translate = require("translate"); + translate.engine = "deepl"; // Or "yandex", "libre", "deepl" + translate.key = process.env.DEEPL; // Requires API key (which are free) + translate.url = process.env.TURL; +} + var IGNORE_STRINGS = [ "5x5","6x8","6x8:2","4x6","12x20","6x15","5x9Numeric7Seg", "Vector", // fonts "---","...","*","##","00","GPS","ram", @@ -12,7 +22,11 @@ var IGNORE_STRINGS = [ "sortorder","tl","tr", "function","object", // typeof=== "txt", // layout styles - "play","stop","pause", // music state + "play","stop","pause", "volumeup", "volumedown", // music state + "${hours}:${minutes}:${seconds}", "${hours}:${minutes}", + "BANGLEJS", + "fgH", "bgH", "m/s", + "undefined", "kbmedia", "NONE", ]; var IGNORE_FUNCTION_PARAMS = [ @@ -64,13 +78,20 @@ function isNotString(s, wasFnCall, wasArrayAccess) { if (wasArrayAccess && IGNORE_ARRAY_ACCESS.includes(wasArrayAccess)) return true; if (s=="Storage") console.log("isNotString",s,wasFnCall); - if (s.length<2) return true; // too short + if (s.length<3) return true; // too short if (s.length>40) return true; // too long if (s[0]=="#") return true; // a color - if (s.endsWith(".json") || s.endsWith(".img")) return true; // a filename + if (s.endsWith('.log') || s.endsWith('.js') || s.endsWith(".info") || s.endsWith(".csv") || s.endsWith(".json") || s.endsWith(".img") || s.endsWith(".txt")) return true; // a filename if (s.endsWith("=")) return true; // probably base64 if (s.startsWith("BTN")) return true; // button name if (IGNORE_STRINGS.includes(s)) return true; // one we know to ignore + if (!isNaN(parseFloat(s)) && isFinite(s)) return true; //is number + if (s.match(/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/)) return true; //roman number + if (!s.match(/.*[A-Z].*/i)) return true; // No letters + if (s.match(/.*[0-9].*/i)) return true; // No letters + if (s.match(/.*\(.*\).*/)) return true; // is function + if (s.match(/[A-Za-z]+[A-Z]([A-Z]|[a-z])*/)) return true; // is camel case + if (s.includes('_')) return true; return false; } @@ -115,6 +136,7 @@ apps.forEach((app,appIdx) => { if (previousString.includes("/*LANG*/")) { // translated! addString(translatedStrings, tok.value, shortFilePath); } else { // untranslated - potential to translate? + // filter out numbers if (!isNotString(tok.value, wasFnCall, wasArrayAccess)) { addString(untranslatedStrings, tok.value, shortFilePath); } @@ -137,6 +159,27 @@ untranslatedStrings.sort((a,b)=>a.uses - b.uses); translatedStrings.sort((a,b)=>a.uses - b.uses); +/* + * @description Add lang to start of string + * @param str string to add LANG to + * @param file file that string is found + * @returns void + */ +//TODO fix settings bug +function applyLANG(str, file) { + fs.readFile(file, 'utf8', function (err,data) { + if (err) { + return console.log(err); + } + const regex = new RegExp(`(.*)((? translatedStrings.find(t=>t.str==e.str)).map(e=>`${JSON.stringify(e.str)} (${e.files.join(",")})`).join("\n")); +const wordsToAdd = untranslatedStrings.filter(e => translatedStrings.find(t=>t.str==e.str)); + +// Uncomment to add LANG to all strings +// THIS IS EXPERIMENTAL +//wordsToAdd.forEach(e => e.files.forEach(a => applyLANG(e.str, a))); + +log(wordsToAdd.map(e=>`${JSON.stringify(e.str)} (${e.uses} uses)`).join("\n")); log(""); + //process.exit(1); log("Possible English Strings that could be translated"); log("================================================================="); @@ -157,20 +207,41 @@ log(untranslatedStrings.filter(e => e.uses>2).filter(e => !translatedStrings.fin log(""); //process.exit(1); -var languages = JSON.parse(fs.readFileSync(BASEDIR+"/lang/index.json").toString()); -languages.forEach(language => { - if (language.code=="en_GB") { - console.log("Ignoring "+language.code); - return; +let languages = JSON.parse(fs.readFileSync(`${BASEDIR}/lang/index.json`).toString()); +for (let language of languages) { + if (language.code == "en_GB") { + console.log(`Ignoring ${language.code}`); + continue; } - console.log("Scanning "+language.code); + console.log(`Scanning ${language.code}`); log(language.code); log("=========="); - var translations = JSON.parse(fs.readFileSync(BASEDIR+"/lang/"+language.url).toString()); - translatedStrings.forEach(str => { - if (!translations.GLOBAL[str.str]) - console.log(`Missing translation for ${JSON.stringify(str)}`); + let translations = JSON.parse(fs.readFileSync(`${BASEDIR}/lang/${language.url}`).toString()); + let translationPromises = []; + translatedStrings.forEach(translationItem => { + if (!translations.GLOBAL[translationItem.str]) { + console.log(`Missing GLOBAL translation for ${JSON.stringify(translationItem)}`); + translationItem.files.forEach(file => { + let m = file.match(/\/([a-zA-Z0-9_-]*)\//g); + if (m && m[0]) { + let appName = m[0].replaceAll("/", ""); + if (translations[appName] && translations[appName][translationItem.str]) { + console.log(` but LOCAL translation found in \"${appName}\"`); + } else if (translate && language.code !== "tr_TR") { // Auto Translate + translationPromises.push(new Promise(async (resolve) => { + const translation = await translate(translationItem.str, language.code.split("_")[0]); + console.log("Translating:", translationItem.str, translation); + translations.GLOBAL[translationItem.str] = translation; + resolve() + })) + } + } + }); + } + }); + Promise.all(translationPromises).then(() => { + fs.writeFileSync(`${BASEDIR}/lang/${language.url}`, JSON.stringify(translations, null, 4)) }); log(""); -}); +} console.log("Done."); diff --git a/core b/core index c243e6e71..3093d78a5 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit c243e6e71f88358de720ad16ba8515b32b8d650f +Subproject commit 3093d78a5d752cbf03ea8f9a1a7c0b50b9c8123b diff --git a/index.html b/index.html index 64bf1d44c..6c9a21bf8 100644 --- a/index.html +++ b/index.html @@ -144,7 +144,7 @@
  Translations (BETA - more info) +   Translations (BETA - more info). Any apps that are uploaded to Bangle.js after changing this will have any text automatically translated.
diff --git a/lang/bg_BG.json b/lang/bg_BG.json new file mode 100644 index 000000000..8e7fb50bb --- /dev/null +++ b/lang/bg_BG.json @@ -0,0 +1,163 @@ +{ + "//": "Bulgarian language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Connected": "Свързан", + "circle 1": "кръг 1", + "week": "седмица", + "weather circle": "метеорологичен кръг", + "Timer": "Таймер", + "circle count": "брой кръгове", + "Keep Msgs": "Дръжте Msgs", + "Auto snooze": "Автоматична дрямка", + "Foreground": "На преден план", + "battery warn": "предупреждение за батерията", + "color": "цвят", + "Vibration": "Вибрации", + "New Timer": "Нов таймер", + "App Source\nNot found": "Източник на приложения\nНе е намерен", + "circle 2": "кръг 2", + "Circle": "Кръг", + "Record Run": "Записване на рекорд", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "steps": "стъпки", + "Beep": "Бип", + "Unread timer": "Непрочетен таймер", + "Delete all messages": "Изтриване на всички съобщения", + "Music": "Музика", + "minimum": "минимум", + "BLE": "BLE", + "goal": "цел", + "Save": "Запазете", + "maximum": "максимален", + "(repeat)": "(повторение)", + "circle 3": "кръг 3", + "Steps": "Стъпки", + "Bluetooth": "Bluetooth", + "Alarm": "Аларма", + "colorize icon": "оцветяване на икона", + "circle 4": "кръг 4", + "Loading": "Зареждане на", + "step length": "дължина на стъпката", + "HID": "HID", + "Heartrate": "Сърдечен ритъм", + "Dark BW": "Тъмно BW", + "Customize": "Персонализиране на", + "valid period": "валиден период", + "Sleep": "Сън", + "distance goal": "цел за разстояние", + "LCD": "LCD", + "data": "данни", + "Vector font size": "Размер на векторния шрифт", + "Mark Unread": "Маркирайте непрочетеното", + "heartrate": "сърдечен ритъм", + "Show clocks": "Показване на часовници", + "New Alarm": "Нова аларма", + "Are you sure": "Сигурни ли сте, че", + "Highlight BG": "Подчертаване на BG", + "Remove": "Премахване на", + "No Messages": "Няма съобщения", + "Delete All Messages": "Изтриване на всички съобщения", + "Foreground 2": "Преден план 2", + "Launcher Settings": "Настройки на стартера", + "Compact Storage": "Компактно съхранение", + "min. confidence": "мин. доверие", + "Connect device\nto add to\nwhitelist": "Свързване на устройството\nда добавите към\nбял списък", + "LCD Brightness": "Яркост на LCD дисплея", + "Highlight FG": "Изтъкване на FG", + "Twist Threshold": "Праг на усукване", + "Add Device": "Добавяне на устройство", + "LCD Timeout": "Време за изключване на LCD", + "Twist Timeout": "Време за завъртане", + "Log": "Log", + "Time Zone": "Часова зона", + "Clock Style": "Стил на часовника", + "Debug Info": "Информация за отстраняването на грешки", + "Wake on Touch": "Събуждане при докосване", + "View Message": "Преглед на съобщението", + "Quiet Mode": "Тих режим", + "Background 2": "Контекст 2", + "Light BW": "Светлина BW", + "show widgets": "показване на уиджети", + "Font": "Шрифт", + "Piezo": "Piezo", + "Make Connectable": "Свържете се", + "Apps": "Приложения", + "Background": "Фон", + "Twist Max Y": "Twist Max Y", + "Utils": "Услуги", + "Programmable": "Програмируем", + "Wake on BTN2": "Събуждане на BTN2", + "Utilities": "Комунални услуги", + "TAP right top/bottom": "TAP дясно отгоре/отдолу", + "Wake on BTN1": "Събуждане на BTN1", + "Passkey BETA": "Passkey BETA", + "Wake on BTN3": "Събуждане на BTN3", + "Wake on Twist": "Събуждане на Twist", + "Wake on FaceUp": "Събуждане в FaceUp", + "No Clocks Found": "Не са намерени часовници", + "Reset to Defaults": "Възстановяване на настройките по подразбиране", + "Compacting...\nTakes approx\n1 minute": "Уплътняване...\nОтнема приблизително\n1 минута", + "Rewrite Settings": "Настройки за пренаписване", + "Stay Connectable": "Останете свързани", + "Turn Off": "Изключване", + "This will remove everything": "Това ще премахне всичко", + "Flatten Battery": "Сплескайте батерията", + "Reset Settings": "Нулиране на настройките", + "Connectable": "Свързване на", + "Storage": "Съхранение", + "start&lap/reset, BTN1: EXIT": "стартиране и застъпване/ нулиране, BTN1: EXIT", + "Month": "Месец", + "App Settings": "Настройки на приложението", + "Side": "Страна", + "Invalid settings": "Невалидни настройки", + "Date": "Дата", + "No app has settings": "Няма приложение с настройки", + "on": "на", + "Left": "Вляво", + "Minute": "Минута", + "Year": "Година", + "Second": "Втори", + "Hour": "Час", + "Reset all widgets": "Нулиране на всички уиджети", + "Widgets": "Уиджети", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Сплескване на батерията - това може да отнеме часове.\nДълго натиснете бутона, за да отмените", + "TIMER": "ТАЙМЕР", + "Right": "Вдясно", + "Reset": "Нулиране на", + "Reset All": "Нулиране на всички", + "Sort Order": "Ред на сортиране", + "ALARM": "АЛАРМА", + "Minutes": "Протоколи", + "Hours": "Часове", + "Vibrate": "Вибрация", + "off": "от", + "Delete": "Изтриване на", + "Repeat": "Повторете", + "Message": "Съобщение", + "Enabled": "Разрешено", + "Settings": "Настройки", + "System": "Система", + "Alerts": "Сигнали", + "Theme": "Тема", + "Hide": "Скрий", + "Show": "Покажи", + "Messages": "Съобщения", + "Set Time": "Време за настройка", + "Whitelist": "Бял списък", + "On": "На", + "Select Clock": "Избор на часовник", + "Locale": "Местоположение", + "No": "Не", + "Error in settings": "Грешка в настройките", + "Factory Reset": "Фабрично нулиране", + "Disable": "Деактивиране на", + "Off": "Изключено", + "Yes": "Да", + "Ok": "Добре", + "Back": "Обратно" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/cs_CZ.json b/lang/cs_CZ.json index 3f4fc87f1..0b56e69ed 100644 --- a/lang/cs_CZ.json +++ b/lang/cs_CZ.json @@ -1,53 +1,185 @@ { - "//":"Czech language translations", - "GLOBAL": { - "//":"Translations that apply for all apps", - "Alarm" : "Budík", - "Hour" : "Hodina", - "Hours" : "Hodiny", - "Minute" : "Minuta", - "Minutes" : "Minuty", - "Second" : "Sekunda", - "Seconds" : "Sekundy", - "Month" : "Měsíc", - "Enabled" : "Povoleno", - "Background" : "Pozadí", - "Connected" : "Připojeno", - "Settings" : "Nastavení", - "Save" : "Uložit", - "Back" : "Zpět", - "Repeat" : "Opakovat", - "Delete" : "Smazat", - "Sleep" : "Uspat", - "Alarms" : "Budíky", - "ALARM!" : "BUDÍK!", - - " (repeat)" : " (opakovat)", - "< Back" : "< Zpět", - "> Delete" : "> Smazat", - "> Save" : " > Uložit", - "ALARM " : "BUDÍK ", - - "Add Device" : "Přidat zařízení", - "App Settings" : "Nast. Aplikací", - "Apps" : "Aplikace" - - }, - "alarm": { - "//":"App-specific overrides", - "Alarm/Timer" : "Budik/Časovač", - "rpt" : "Opk.", - "New Alarm" : "Nový budík", - "New Timer" : "Nový časovač", - "Auto snooze" : "Auto odložit" - }, - "setting" : { - "Quiet Mode" : "Tichý režim" - - }, - "messages": { - "Are you sure?" : "Opravdu?" - } - - -} + "//": "Czech language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarm": "Budík", + "Hour": "Hodina", + "Hours": "Hodiny", + "Minute": "Minuta", + "Minutes": "Minuty", + "Second": "Sekunda", + "Seconds": "Sekundy", + "Month": "Měsíc", + "Enabled": "Povoleno", + "Background": "Pozadí", + "Connected": "Připojeno", + "Settings": "Nastavení", + "Save": "Uložit", + "Back": "Zpět", + "Repeat": "Opakovat", + "Delete": "Smazat", + "Sleep": "Uspat", + "Alarms": "Budíky", + "ALARM!": "BUDÍK!", + " (repeat)": " (opakovat)", + "< Back": "< Zpět", + "> Delete": "> Smazat", + "> Save": " > Uložit", + "ALARM ": "BUDÍK ", + "Add Device": "Přidat zařízení", + "App Settings": "Nast. Aplikací", + "Apps": "Aplikace", + "valid period": "doba platnosti", + "Font": "Písmo", + "circle count": "počet kroužků", + "min. confidence": "min. důvěra", + "circle 1": "okruh 1", + "circle 3": "kruh 3", + "step length": "délka kroku", + "Highlight FG": "Zvýraznění FG", + "Storage": "Úložiště", + "show widgets": "zobrazit widgety", + "Highlight BG": "Zvýraznění BG", + "Foreground 2": "Popředí 2", + "BLE": "BLE", + "Light BW": "Light BW", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "Show clocks": "Zobrazit hodiny", + "Delete All Messages": "Odstranění všech zpráv", + "data": "data", + "Mark Unread": "Označit nepřečtené", + "Launcher Settings": "Nastavení spouštěče", + "circle 4": "kruh 4", + "App Source\nNot found": "Zdroj aplikace\nNenalezeno", + "Twist Timeout": "Twist Timeout", + "Dark BW": "Dark BW", + "Flatten Battery": "Zploštění baterie", + "Make Connectable": "Připojení", + "Wake on Touch": "Probuzení při dotyku", + "Twist Threshold": "Prahová hodnota Twist", + "Debug Info": "Informace o ladění", + "Time Zone": "Časové pásmo", + "battery warn": "upozornění na baterii", + "Remove": "Odstranění stránky", + "maximum": "maximum", + "Vector font size": "Velikost vektorového písma", + "Vibration": "Vibrace", + "(repeat)": "(opakování)", + "week": "týden", + "Yes\ndefinitely": "Ano\nurčitě", + "heartrate": "srdeční frekvence", + "Foreground": "Přední stránka", + "Clock Style": "Styl hodin", + "music": "hudba", + "Delete all messages": "Odstranění všech zpráv", + "Piezo": "Piezo", + "Log": "Přihlásit se", + "Twist Max Y": "Twist Max Y", + "STEPS": "KROKY", + "View Message": "Zobrazit zprávu", + "Heartrate": "Srdeční frekvence", + "TAP right top/bottom": "TAP vpravo nahoře/dole", + "Utils": "Utils", + "Programmable": "Programovatelné", + "Rewrite Settings": "Nastavení přepisu", + "Wake on BTN2": "Probuďte se na BTN2", + "Utilities": "Komunální služby", + "Compacting...\nTakes approx\n1 minute": "Zhutňování...\nTrvá přibližně\n1 minuta", + "Wake on FaceUp": "Probuzení na FaceUp", + "Wake on BTN1": "Probuďte se na BTN1", + "Wake on Twist": "Probuzení na Twistu", + "This will remove everything": "Tím se odstraní vše.", + "Keep Msgs": "Uchovávejte zprávy Msgs", + "Background 2": "Pozadí 2", + "Reset Settings": "Obnovení nastavení", + "Are you sure": "Jste si jistý, že", + "Stay Connectable": "Zůstaňte ve spojení", + "HID": "HID", + "colorize icon": "vybarvit ikonu", + "distance goal": "vzdálenostní cíl", + "circle 2": "kruh 2", + "Record Run": "Rekordní běh", + "Connectable": "Připojitelné", + "Side": "Strana", + "No app has settings": "Žádná aplikace nemá nastavení", + "Date": "Datum", + "OFF": "OFF", + "No Messages": "Žádné zprávy", + "Turn Off": "Vypnout", + "Invalid settings": "Neplatné nastavení", + "Unread timer": "Nepřečtený časovač", + "weather circle": "povětrnostní kruh", + "minimum": "minimum", + "Customize": "Přizpůsobení", + "Bluetooth": "Bluetooth", + "Circle": "Kruh", + "LCD": "LCD", + "Compact Storage": "Kompaktní úložiště", + "LCD Timeout": "Časový limit LCD", + "Connect device\nto add to\nwhitelist": "Připojení zařízení\npřidat do\nwhitelist", + "LCD Brightness": "Jas displeje LCD", + "TIMER": "ČASOVAČ", + "Reset All": "Obnovit vše", + "Left": "Vlevo", + "Reset": "Obnovení", + "goal": "cíl", + "Alerts": "Upozornění", + "Locale": "Lokalita", + "Beep": "Pípnutí", + "Vibrate": "Vibrace", + "Message": "Zpráva", + "System": "Systém", + "on": "na adrese", + "Sort Order": "Pořadí řazení", + "Right": "Vpravo", + "Select Clock": "Vybrat hodiny", + "Reset to Defaults": "Obnovení výchozího nastavení", + "Wake on BTN3": "Probuďte se na BTN3", + "Passkey BETA": "Passkey BETA", + "No Clocks Found": "Nebyly nalezeny žádné hodiny", + "Reset all widgets": "Obnovení všech widgetů", + "Widgets": "Widgety", + "Sleep Phase Alarm": "Alarm fáze spánku", + "Error in settings": "Chyba v nastavení", + "Timer": "Časovač", + "ALARM": "ALARM", + "Disable": "Zakázat", + "BACK": "ZPĚT", + "Whitelist": "Bílá listina", + "Factory Reset": "Obnovení továrního nastavení", + "Set Time": "Nastavený čas", + "Hide": "Skrýt", + "Messages": "Zprávy", + "On": "Na adrese", + "Show": "Zobrazit", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Zploštění baterie - může trvat hodiny.\nDlouhým stisknutím tlačítka zrušíte", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "No": "Ne", + "Ok": "Ok", + "Yes": "Ano", + "Steps": "Kroky", + "Year": "Rok", + "steps": "kroky", + "back": "zpět", + "Music": "Hudba", + "Loading": "Načítání", + "off": "mimo", + "color": "barva", + "Off": "Vypnuto", + "Theme": "Téma" + }, + "alarm": { + "//": "App-specific overrides", + "Alarm/Timer": "Budik/Časovač", + "rpt": "Opk.", + "New Alarm": "Nový budík", + "New Timer": "Nový časovač", + "Auto snooze": "Auto odložit" + }, + "setting": { + "Quiet Mode": "Tichý režim" + }, + "messages": { + "Are you sure?": "Opravdu?" + } +} \ No newline at end of file diff --git a/lang/da_DA.json b/lang/da_DA.json new file mode 100644 index 000000000..59aea3068 --- /dev/null +++ b/lang/da_DA.json @@ -0,0 +1,163 @@ +{ + "//": "Danish language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "New Alarm": "Ny alarm", + "Alarm": "Alarm", + "New Timer": "Ny timer", + "Save": "Gem", + "(repeat)": "(gentagelse)", + "circle 1": "kreds 1", + "circle 3": "kreds 3", + "circle 2": "kreds 2", + "Auto snooze": "Automatisk slumretid", + "circle 4": "cirkel 4", + "show widgets": "vise widgets", + "Connected": "Tilsluttet", + "Keep Msgs": "Behold msgs", + "min. confidence": "min. tillid", + "heartrate": "hjertefrekvens", + "steps": "trin", + "week": "uge", + "Sleep": "Søvn", + "circle count": "antal cirkler", + "goal": "mål", + "Timer": "Timer", + "Steps": "Trin", + "valid period": "gyldighedsperiode", + "step length": "trinlængde", + "minimum": "minimum", + "weather circle": "vejrkreds", + "maximum": "maksimum", + "data": "data", + "Circle": "Cirkel", + "Heartrate": "Hjertefrekvens", + "battery warn": "batteri advarer", + "App Source\nNot found": "App-kilde\nIkke fundet", + "colorize icon": "farvelægge ikonet", + "distance goal": "mål for afstand", + "TAP right top/bottom": "TAP højre top/bund", + "color": "farve", + "View Message": "Vis besked", + "Show clocks": "Vis ure", + "Mark Unread": "Markér ulæst", + "Unread timer": "Ulæst timer", + "Loading": "Indlæsning", + "Launcher Settings": "Indstillinger for startopsætningen", + "Bluetooth": "Bluetooth", + "Music": "Musik", + "Font": "Skrifttype", + "Vector font size": "Vektor skriftstørrelse", + "BTNs 1:startlap 2:exit 3:reset": "BTN'er 1:startlap 2:exit 3:reset", + "No Messages": "Ingen meddelelser", + "Are you sure": "Er du sikker på", + "Delete All Messages": "Slet alle meddelelser", + "Record Run": "Rekordløb", + "Delete all messages": "Slet alle meddelelser", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "Vibration": "Vibrationer", + "HID": "HID", + "Make Connectable": "Gør det muligt at forbinde", + "LCD": "LCD", + "BLE": "BLE", + "Utils": "Utils", + "Piezo": "Piezo", + "Apps": "Apps", + "Background": "Baggrund", + "Customize": "Tilpas", + "Beep": "Bip", + "Quiet Mode": "Stille tilstand", + "Dark BW": "Mørk BW", + "Programmable": "Programmerbar", + "Passkey BETA": "Passkey BETA", + "Light BW": "Light BW", + "Highlight FG": "fremhæve FG", + "Background 2": "Baggrund 2", + "Foreground": "Forgrund", + "Highlight BG": "fremhæve BG", + "Foreground 2": "Forgrund 2", + "LCD Timeout": "LCD Timeout", + "Remove": "Fjern", + "Wake on BTN2": "Wake på BTN2", + "LCD Brightness": "LCD lysstyrke", + "Add Device": "Tilføj enhed", + "Wake on BTN1": "Vågn op på BTN1", + "Connect device\nto add to\nwhitelist": "Tilslut enhed\ntil at tilføje til\nwhitelist", + "Wake on BTN3": "Wake på BTN3", + "Wake on FaceUp": "Vågn op på FaceUp", + "Log": "Log", + "Debug Info": "Info om fejlfinding", + "Wake on Twist": "Vågn op på Twist", + "Wake on Touch": "Vågn op ved berøring", + "Clock Style": "Ur stil", + "Time Zone": "Tidszone", + "Twist Max Y": "Drej Max Y", + "Twist Threshold": "Twist tærskel", + "Compact Storage": "Kompakt opbevaring", + "Twist Timeout": "Twist Timeout", + "Storage": "Opbevaring", + "Utilities": "Hjælpeprogrammer", + "Rewrite Settings": "Omskrivning af indstillinger", + "No Clocks Found": "Ingen ure fundet", + "Reset to Defaults": "Nulstil til standardindstillingerne", + "Compacting...\nTakes approx\n1 minute": "Komprimering...\nTager ca.\n1 minut", + "Connectable": "Tilslutbar", + "Reset Settings": "Nulstil indstillinger", + "Stay Connectable": "Forbliv forbundet", + "Flatten Battery": "Flade batterier", + "Minute": "Minut", + "This will remove everything": "Dette vil fjerne alt", + "Turn Off": "Sluk for", + "Hour": "Timer", + "Month": "Måned", + "Second": "Anden", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Udfladning af batteriet - dette kan tage flere timer.\nTryk længe på knappen for at annullere", + "Year": "År", + "Widgets": "Widgets", + "Date": "Dato", + "Side": "Side", + "Left": "Venstre", + "App Settings": "App-indstillinger", + "No app has settings": "Ingen app har indstillinger", + "Invalid settings": "Ugyldige indstillinger", + "Reset All": "Nulstil alt", + "on": "på", + "TIMER": "TIMER", + "Right": "Højre", + "Sort Order": "Sorteringsrækkefølge", + "Reset": "Nulstil", + "Reset all widgets": "Nulstil alle widgets", + "ALARM": "ALARM", + "Settings": "Indstillinger", + "Alerts": "Advarsler", + "System": "System", + "Theme": "Tema", + "Locale": "Lokale", + "Vibrate": "Vibrere", + "Enabled": "Aktiveret", + "Hours": "Timer", + "Delete": "Slet", + "Minutes": "Protokol", + "Message": "Besked", + "Repeat": "Gentag", + "off": "off", + "Whitelist": "Whitelist", + "Show": "Vis", + "Messages": "Meddelelser", + "On": "På", + "Hide": "Skjul", + "Set Time": "Indstil tid", + "Factory Reset": "Fabriksnulstilling", + "Disable": "Deaktivere", + "Error in settings": "Fejl i indstillingerne", + "Select Clock": "Vælg ur", + "No": "Nej", + "Yes": "Ja", + "Ok": "Ok", + "Off": "Off", + "Back": "Tilbage" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/de_DE.json b/lang/de_DE.json index b4acfe675..8c893e6ad 100644 --- a/lang/de_DE.json +++ b/lang/de_DE.json @@ -1,28 +1,173 @@ { - "//":"German language translations", - "GLOBAL": { - "//":"Translations that apply for all apps", - "Alarm" : "Wecker", - "Hours" : "Stunden", - "Minutes" : "Minuten", - "Enabled" : "Aktiviert", - "Settings" : "Einstellungen", - "Save" : "Speichern", - "Back" : "Zurück", - "Repeat" : "Wiederholen", - "Delete" : "Löschen", - "Sleep" : "Schlummern", - "Alarms" : "Wecker", - "New Alarm" : "Neuer Wecker", - "ALARM!" : "ALARM!", - "Yes" : "Ja", - "No" : "Nein", - "On" : "Ein", - "Off" : "Aus", - "Ok" : "OK" - }, - "alarm": { - "//":"App-specific overrides", - "rpt" : "Wdh." - } -} + "//": "German language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarm": "Wecker", + "Hours": "Stunden", + "Minutes": "Minuten", + "Enabled": "Aktiviert", + "Settings": "Einstellungen", + "Save": "Speichern", + "Back": "Zurück", + "Repeat": "Wiederholen", + "Delete": "Löschen", + "Sleep": "Schlummern", + "Alarms": "Wecker", + "New Alarm": "Neuer Wecker", + "ALARM!": "ALARM!", + "Yes": "Ja", + "No": "Nein", + "On": "Ein", + "Off": "Aus", + "Ok": "OK", + "New Timer": "Neue Zeitschaltuhr", + "(repeat)": "(Wiederholung)", + "music": "Musik", + "Keep Msgs": "Msgs behalten", + "circle count": "Kreiszahl", + "Auto snooze": "Automatisches Schlummern", + "week": "Woche", + "Heartrate": "Herzfrequenz", + "minimum": "Minimum", + "weather circle": "Wetterkreis", + "circle 3": "Kreis 3", + "show widgets": "Widgets anzeigen", + "circle 4": "Kreis 4", + "circle 1": "Kreis 1", + "circle 2": "Kreis 2", + "battery warn": "Batteriewarnung", + "heartrate": "Herzfrequenz", + "data": "Daten", + "step length": "Schrittlänge", + "valid period": "Gültigkeitsdauer", + "colorize icon": "Symbol einfärben", + "min. confidence": "Mindestvertrauen", + "maximum": "maximal", + "distance goal": "Fernziel", + "Circle": "Kreis", + "Yes\ndefinitely": "Ja\ndefinitiv", + "TAP right top/bottom": "TAP rechts oben/unten", + "Are you sure": "Sind Sie sicher, dass", + "STEPS": "SCHRITTE", + "Mark Unread": "Ungelesen markieren", + "Delete all messages": "Alle Nachrichten löschen", + "Unread timer": "Ungelesener Timer", + "Quiet Mode": "Leiser Modus", + "Utils": "Werkzeuge", + "Piezo": "Piezo", + "LCD": "LCD", + "Record Run": "Rekordlauf", + "Apps": "Apps", + "Delete All Messages": "Alle Nachrichten löschen", + "start&lap/reset, BTN1: EXIT": "Start&Runde/Zurücksetzen, BTN1: EXIT", + "No Messages": "Keine Nachrichten", + "Bluetooth": "Bluetooth", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "View Message": "Nachricht anzeigen", + "Vector font size": "Vektor-Schriftgröße", + "Light BW": "Licht BW", + "BLE": "BLE", + "Make Connectable": "Verbindbar machen", + "Vibration": "Vibration", + "Foreground": "Vorderseite", + "Customize": "Anpassen", + "HID": "HID", + "Dark BW": "Dunkel BW", + "Passkey BETA": "Hauptschlüssel BETA", + "Show clocks": "Uhren anzeigen", + "Font": "Schriftart", + "Launcher Settings": "Launcher-Einstellungen", + "App Source\nNot found": "App-Quelle\nNicht gefunden", + "Programmable": "Programmierbar", + "Background 2": "Hintergrund 2", + "Foreground 2": "Vordergrund 2", + "Add Device": "Gerät hinzufügen", + "Highlight BG": "Hervorhebung BG", + "Background": "Hintergrund", + "Highlight FG": "Highlight FG", + "Wake on Touch": "Wecken bei Berührung", + "Twist Timeout": "Twist Timeout", + "Twist Max Y": "Twist Max Y", + "LCD Timeout": "LCD-Zeitüberschreitung", + "LCD Brightness": "LCD-Helligkeit", + "Utilities": "Versorgungsunternehmen", + "Log": "Protokoll", + "Compact Storage": "Kompakte Lagerung", + "Wake on BTN3": "Wake auf BTN3", + "Twist Threshold": "Schwellenwert verdrehen", + "Remove": "entfernen", + "Connect device\nto add to\nwhitelist": "Gerät verbinden\nzum Hinzufügen zur\nWhitelist", + "Debug Info": "Debug-Informationen", + "Time Zone": "Zeitzone", + "Clock Style": "Uhr Stil", + "Wake on BTN2": "Wake auf BTN2", + "Wake on FaceUp": "Wake on FaceUp", + "Wake on BTN1": "Wake auf BTN1", + "Wake on Twist": "Wake on Twist", + "Connectable": "Anschließbar", + "Second": "Zweite", + "Minute": "Minute", + "Turn Off": "Ausschalten", + "No Clocks Found": "Keine Uhren gefunden", + "App Settings": "App-Einstellungen", + "Hour": "Stunde", + "Reset to Defaults": "Auf Standardwerte zurücksetzen", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Entladen der Batterie - dies kann Stunden dauern.\nLanger Tastendruck zum Abbrechen", + "Reset Settings": "Einstellungen zurücksetzen", + "Rewrite Settings": "Einstellungen umschreiben", + "Compacting...\nTakes approx\n1 minute": "Verdichten...\nDauert ca.\n1 Minute", + "Stay Connectable": "Anschlussfähig bleiben", + "Storage": "Lagerung", + "This will remove everything": "Dadurch wird alles entfernt", + "on": "auf", + "TIMER": "TIMER", + "Widgets": "Widgets", + "goal": "Ziel", + "Beep": "Piep", + "Reset": "Zurücksetzen", + "No app has settings": "Keine App hat Einstellungen", + "Month": "Monat", + "Reset All": "Alle zurücksetzen", + "Flatten Battery": "Batterie abflachen", + "Right": "Rechts", + "Side": "Seite", + "Left": "Links", + "Sleep Phase Alarm": "Schlafphasenalarm", + "Date": "Datum", + "Sort Order": "Sortierreihenfolge", + "OFF": "AUS", + "Invalid settings": "Ungültige Einstellungen", + "Message": "Nachricht", + "Vibrate": "Vibrieren", + "Reset all widgets": "Alle Widgets zurücksetzen", + "System": "System", + "Alerts": "Warnungen", + "Locale": "Schauplatz", + "Whitelist": "Whitelist", + "Select Clock": "Uhr auswählen", + "Disable": "Deaktivieren Sie", + "Timer": "Zeitschaltuhr", + "Error in settings": "Fehler in den Einstellungen", + "Set Time": "Zeit einstellen", + "ALARM": "ALARM", + "BACK": "ZURÜCK", + "Factory Reset": "Werksreset", + "steps": "Schritte", + "Connected": "Verbunden", + "Show": "anzeigen", + "Messages": "Nachrichten", + "Hide": "Ausblenden", + "back": "zurück", + "Steps": "Schritte", + "Year": "Jahr", + "Loading": "Laden", + "Music": "Musik", + "color": "Farbe", + "off": "aus", + "Theme": "Thema" + }, + "alarm": { + "//": "App-specific overrides", + "rpt": "Wdh." + } +} \ No newline at end of file diff --git a/lang/el_EL.json b/lang/el_EL.json new file mode 100644 index 000000000..38ef6a01f --- /dev/null +++ b/lang/el_EL.json @@ -0,0 +1,163 @@ +{ + "//": "Greek language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Save": "Αποθήκευση", + "week": "εβδομάδα", + "Keep Msgs": "Κρατήστε τα Msgs", + "New Alarm": "Νέος συναγερμός", + "Connected": "Συνδεδεμένο", + "Circle": "Κύκλος", + "maximum": "μέγιστο", + "Heartrate": "Καρδιακός ρυθμός", + "step length": "μήκος βήματος", + "valid period": "περίοδος ισχύος", + "(repeat)": "(επανάληψη)", + "min. confidence": "ελάχιστη εμπιστοσύνη", + "New Timer": "Νέος χρονοδιακόπτης", + "Sleep": "Ύπνος", + "Timer": "Χρονοδιακόπτης", + "Alarm": "Συναγερμός", + "goal": "γκολ", + "distance goal": "στόχος απόστασης", + "Steps": "Βήματα", + "minimum": "ελάχιστο", + "circle 4": "κύκλος 4", + "steps": "βήματα", + "circle 2": "κύκλος 2", + "circle 1": "κύκλος 1", + "weather circle": "κύκλος καιρού", + "circle count": "Αριθμός κύκλων", + "heartrate": "καρδιακός ρυθμός", + "circle 3": "κύκλος 3", + "show widgets": "Εμφάνιση widgets", + "battery warn": "προειδοποίηση μπαταρίας", + "Vector font size": "Μέγεθος γραμματοσειράς διανύσματος", + "Font": "Γραμματοσειρά", + "colorize icon": "χρωματισμός εικονιδίου", + "Show clocks": "Εμφάνιση ρολογιών", + "color": "χρώμα", + "Launcher Settings": "Ρυθμίσεις εκτοξευτή", + "App Source\nNot found": "Πηγή εφαρμογής\nΔεν βρέθηκε", + "Loading": "Φόρτωση", + "data": "δεδομένα", + "View Message": "Προβολή μηνύματος", + "Delete all messages": "Διαγραφή όλων των μηνυμάτων", + "Mark Unread": "Mark Unread", + "Are you sure": "Είσαι σίγουρος", + "Delete All Messages": "Διαγραφή όλων των μηνυμάτων", + "Unread timer": "Χρονοδιακόπτης χωρίς ανάγνωση", + "Apps": "Εφαρμογές", + "Record Run": "Τρέξιμο ρεκόρ", + "No Messages": "Δεν υπάρχουν μηνύματα", + "Music": "Μουσική", + "Bluetooth": "Bluetooth", + "LCD": "LCD", + "Piezo": "Piezo", + "Quiet Mode": "Αθόρυβη λειτουργία", + "Make Connectable": "Κάντε Connectable", + "Utils": "Utils", + "Vibration": "Δονήσεις", + "Programmable": "Προγραμματιζόμενο", + "Beep": "Μπιπ", + "Passkey BETA": "Passkey BETA", + "Wake on Touch": "Αφύπνιση στο άγγιγμα", + "Twist Max Y": "Twist Max Y", + "Time Zone": "Ζώνη ώρας", + "Remove": "Αφαιρέστε το", + "Add Device": "Προσθήκη συσκευής", + "LCD Brightness": "Φωτεινότητα LCD", + "LCD Timeout": "Χρονικό όριο LCD", + "Twist Timeout": "Twist Timeout", + "Highlight BG": "Επισημάνετε το BG", + "Highlight FG": "Επισημάνετε το FG", + "Light BW": "Ελαφρύ BW", + "Foreground 2": "Πρόσθιο πεδίο 2", + "Background": "Ιστορικό", + "Background 2": "Ιστορικό 2", + "HID": "HID", + "Dark BW": "Σκούρο BW", + "BLE": "BLE", + "Customize": "Προσαρμογή", + "Debug Info": "Πληροφορίες εντοπισμού σφαλμάτων", + "Rewrite Settings": "Ρυθμίσεις επανεγγραφής", + "Storage": "Αποθήκευση", + "Flatten Battery": "Επίπεδη μπαταρία", + "Clock Style": "Στυλ ρολογιού", + "Compact Storage": "Συμπαγής αποθήκευση", + "Utilities": "Υπηρεσίες κοινής ωφέλειας", + "Log": "Ημερολόγιο", + "Right": "Δεξιά", + "Month": "Μήνας", + "Side": "Πλευρά", + "No app has settings": "Καμία εφαρμογή δεν έχει ρυθμίσεις", + "Widgets": "Widgets", + "Left": "Αριστερά", + "Reset All": "Επαναφορά όλων", + "Invalid settings": "Μη έγκυρες ρυθμίσεις", + "Reset": "Επαναφορά", + "Sort Order": "Σειρά ταξινόμησης", + "TAP right top/bottom": "TAP δεξιά πάνω/κάτω", + "Wake on BTN2": "Wake στο BTN2", + "Connect device\nto add to\nwhitelist": "Σύνδεση συσκευής\nγια να προσθέσετε\nλευκή λίστα", + "Wake on FaceUp": "Wake στο FaceUp", + "Wake on BTN1": "Wake στο BTN1", + "Wake on BTN3": "Wake στο BTN3", + "Foreground": "Πρόσφατα στοιχεία", + "Wake on Twist": "Wake on Twist", + "Auto snooze": "Αυτόματη επαναφορά", + "Twist Threshold": "Κατώφλι συστροφής", + "Compacting...\nTakes approx\n1 minute": "Συμπίεση...\nΠαίρνει περίπου\n1 λεπτό", + "Connectable": "Συνδεόμενο", + "Repeat": "Επανάληψη", + "No Clocks Found": "Δεν βρέθηκαν ρολόγια", + "TIMER": "TIMER", + "App Settings": "Ρυθμίσεις εφαρμογής", + "Stay Connectable": "Μείνετε συνδεδεμένοι", + "Second": "Δεύτερο", + "Minute": "Λεπτό", + "Date": "Ημερομηνία", + "This will remove everything": "Αυτό θα αφαιρέσει τα πάντα", + "Reset to Defaults": "Επαναφορά στις προεπιλογές", + "Vibrate": "Δονήσεις", + "Hour": "Ώρα", + "Turn Off": "Απενεργοποίηση", + "Reset Settings": "Επαναφορά ρυθμίσεων", + "Year": "Έτος", + "Message": "Μήνυμα", + "Locale": "Τοπική τοποθεσία", + "Alerts": "Ειδοποιήσεις", + "Theme": "Θέμα", + "Error in settings": "Σφάλμα στις ρυθμίσεις", + "Disable": "Απενεργοποίηση", + "Factory Reset": "Επαναφορά εργοστασιακών ρυθμίσεων", + "System": "Σύστημα", + "Ok": "Εντάξει", + "Yes": "Ναι", + "On": "Στο", + "Settings": "Ρυθμίσεις", + "Select Clock": "Επιλέξτε Ρολόι", + "Off": "Off", + "Back": "Πίσω", + "No": "Όχι", + "Delete": "Διαγραφή", + "Enabled": "Ενεργοποιημένο", + "Hours": "Ώρες", + "ALARM": "ALARM", + "on": "στο", + "off": "off", + "Minutes": "Πρακτικά", + "Reset all widgets": "Επαναφορά όλων των widgets", + "Hide": "Απόκρυψη", + "Messages": "Μηνύματα", + "Show": "Εμφάνιση", + "Set Time": "Ρύθμιση χρόνου", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "start&lap/reset, BTN1: EXIT": "εκκίνηση&γύρος/επαναφορά, BTN1: ΕΞΟΔΟΣ", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Εξομάλυνση της μπαταρίας - αυτό μπορεί να διαρκέσει ώρες.\nΠατήστε παρατεταμένα το κουμπί για ακύρωση", + "Whitelist": "Λευκή λίστα" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/es_ES.json b/lang/es_ES.json index a3e7ede3f..d381582e3 100644 --- a/lang/es_ES.json +++ b/lang/es_ES.json @@ -1,28 +1,173 @@ { - "//":"Spanish language translations", - "GLOBAL": { - "//":"Translations that apply for all apps", - "Alarms" : "Alarmas", - "Hours" : "Horas", - "Minutes" : "Minutos", - "Enabled" : "Activados", - "Save" : "Ahorrar", - "Back" : "Regresa", - "Repeat" : "Repetición", - "Delete" : "Borrar", - "ALARM!" : "ALARM", - "Sleep" : "Dormir", - "Alarms" : "Alarmas", - "New Alarm" : "Nueva alarma", - "ALARM!" : "ALARM!", - "Yes" : "Si", - "No" : "No", - "On" : "Encendido", - "Off" : "Apagado", - "Ok" : "OK" - }, - "alarm": { - "//":"App-specific overrides", - "rpt" : "rep." - } -} + "//": "Spanish language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarms": "Alarmas", + "Hours": "Horas", + "Minutes": "Minutos", + "Enabled": "Activados", + "Save": "Ahorrar", + "Back": "Regresa", + "Repeat": "Repetición", + "Delete": "Borrar", + "ALARM!": "ALARM!", + "Sleep": "Dormir", + "New Alarm": "Nueva alarma", + "Yes": "Si", + "No": "No", + "On": "Encendido", + "Off": "Apagado", + "Ok": "OK", + "(repeat)": "(repetir)", + "New Timer": "Nuevo temporizador", + "music": "música", + "circle 2": "círculo 2", + "circle 1": "círculo 1", + "Keep Msgs": "Mantener Msgs", + "circle 3": "círculo 3", + "week": "semana", + "Auto snooze": "Repetición automática de la alarma", + "show widgets": "mostrar widgets", + "min. confidence": "confianza mínima", + "circle 4": "círculo 4", + "circle count": "recuento de círculos", + "heartrate": "ritmo cardíaco", + "Heartrate": "El ritmo cardíaco", + "weather circle": "círculo meteorológico", + "battery warn": "aviso de batería", + "minimum": "mínimo", + "distance goal": "objetivo de distancia", + "valid period": "período de validez", + "maximum": "máximo", + "step length": "longitud del paso", + "data": "datos", + "colorize icon": "colorear el icono", + "Circle": "Círculo", + "Launcher Settings": "Configuración del lanzador", + "App Source\nNot found": "Fuente de la aplicación\nNo se ha encontrado", + "Show clocks": "Mostrar relojes", + "Font": "Fuente", + "TAP right top/bottom": "TAP derecho superior/inferior", + "Yes\ndefinitely": "Sí\ndefinitivamente", + "View Message": "Ver mensaje", + "Delete all messages": "Borrar todos los mensajes", + "STEPS": "PASOS", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "Are you sure": "¿Está seguro de que", + "Vector font size": "Tamaño de la fuente vectorial", + "Mark Unread": "Marcar como no leído", + "No Messages": "No hay mensajes", + "Delete All Messages": "Borrar todos los mensajes", + "LCD": "LCD", + "Apps": "Aplicaciones", + "Unread timer": "Temporizador no leído", + "Record Run": "Carrera de récords", + "Bluetooth": "Bluetooth", + "Quiet Mode": "Modo silencioso", + "Piezo": "Piezo", + "Make Connectable": "Hacer conectable", + "Programmable": "Programable", + "Vibration": "Vibración", + "Passkey BETA": "Passkey BETA", + "Customize": "Personalice", + "HID": "HID", + "Utils": "Utilidades", + "Light BW": "Luz BW", + "BLE": "BLE", + "Dark BW": "BW oscuro", + "Background 2": "Antecedentes 2", + "Foreground 2": "Primer plano 2", + "Foreground": "Primer plano", + "Highlight BG": "Resaltar BG", + "Connect device\nto add to\nwhitelist": "Conectar dispositivo\npara añadirlo a la\nlista blanca", + "Highlight FG": "Destacar FG", + "Background": "Antecedentes", + "Add Device": "Añadir dispositivo", + "Remove": "Eliminar", + "Wake on BTN3": "Wake en BTN3", + "Twist Max Y": "Twist Max Y", + "LCD Timeout": "Tiempo de espera del LCD", + "Twist Threshold": "Umbral de giro", + "Wake on BTN2": "Wake en BTN2", + "Wake on BTN1": "Wake en BTN1", + "Wake on Twist": "Despertar en Twist", + "LCD Brightness": "Brillo del LCD", + "Log": "Registro", + "Time Zone": "Huso horario", + "Wake on FaceUp": "Despierta en FaceUp", + "Wake on Touch": "Despertar al tacto", + "Twist Timeout": "Tiempo de espera de la torsión", + "Compact Storage": "Almacenamiento compacto", + "Clock Style": "Estilo de reloj", + "Storage": "Almacenamiento", + "Utilities": "Servicios públicos", + "Compacting...\nTakes approx\n1 minute": "La compactación...\nTarda aproximadamente\n1 minuto", + "Debug Info": "Información de depuración", + "Rewrite Settings": "Reescribir la configuración", + "Flatten Battery": "Aplastar la batería", + "Turn Off": "Apagar", + "This will remove everything": "Esto eliminará todo", + "Reset Settings": "Restablecer la configuración", + "Month": "Mes", + "Second": "Segundo", + "Date": "Fecha", + "Reset to Defaults": "Restablecer los valores predeterminados", + "Hour": "Hora", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Aplastar la batería - esto puede llevar horas.\nPulsar prolongadamente el botón para cancelar", + "Stay Connectable": "Manténgase conectado", + "Minute": "Minuta", + "No Clocks Found": "No se han encontrado relojes", + "Connectable": "Conectable", + "No app has settings": "Ninguna aplicación tiene ajustes", + "Invalid settings": "Ajustes no válidos", + "App Settings": "Configuración de la aplicación", + "Side": "Lado", + "OFF": "OFF", + "Sleep Phase Alarm": "Alarma de fase de sueño", + "Widgets": "Widgets", + "Left": "Izquierda", + "Sort Order": "Orden de clasificación", + "TIMER": "TEMPORIZADOR", + "goal": "objetivo", + "Right": "A la derecha", + "on": "en", + "Alarm": "Alarma", + "Reset All": "Restablecer todo", + "Reset all widgets": "Restablecer todos los widgets", + "Reset": "Reiniciar", + "Beep": "Bip", + "System": "Sistema", + "Locale": "Localidad", + "Message": "Mensaje", + "Set Time": "Hora de la cita", + "Vibrate": "Vibrar", + "Alerts": "Alertas", + "Timer": "Temporizador", + "Error in settings": "Error en la configuración", + "Select Clock": "Seleccionar reloj", + "Whitelist": "Lista blanca", + "Disable": "Desactivar", + "BACK": "VOLVER", + "Factory Reset": "Restablecimiento de fábrica", + "Connected": "Conectado", + "ALARM": "ALARMA", + "Messages": "Mensajes", + "Settings": "Ajustes", + "Show": "Mostrar", + "Hide": "Ocultar", + "steps": "pasos", + "back": "volver", + "Steps": "Pasos", + "Year": "Año", + "Loading": "Cargando", + "Music": "Música", + "color": "color", + "off": "fuera de", + "Theme": "Tema" + }, + "alarm": { + "//": "App-specific overrides", + "rpt": "rep." + } +} \ No newline at end of file diff --git a/lang/et_ET.json b/lang/et_ET.json new file mode 100644 index 000000000..33be5bf6c --- /dev/null +++ b/lang/et_ET.json @@ -0,0 +1,163 @@ +{ + "//": "Estonian language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "New Alarm": "Uus häire", + "Alarm": "Häire", + "Save": "Salvesta", + "Timer": "Taimer", + "(repeat)": "(kordus)", + "New Timer": "Uus taimer", + "circle 2": "ring 2", + "week": "nädal", + "circle 4": "ring 4", + "circle count": "ringide arv", + "Sleep": "Sleep", + "circle 3": "ring 3", + "Keep Msgs": "Hoidke Msgs", + "heartrate": "südame löögisagedus", + "circle 1": "ring 1", + "Connected": "Ühendatud", + "steps": "sammud", + "battery warn": "aku hoiatus", + "show widgets": "Näita vidinaid", + "minimum": "minimaalne", + "Heartrate": "Südame löögisagedus", + "weather circle": "ilmastikuring", + "Loading": "Laadimine", + "Launcher Settings": "Käivitajate seaded", + "color": "värv", + "Font": "Font", + "colorize icon": "värvida ikooni", + "Steps": "Sammud", + "step length": "sammu pikkus", + "Auto snooze": "Automaatne snooze", + "TAP right top/bottom": "TAP paremal üleval/alla", + "maximum": "maksimaalne", + "distance goal": "kauguse eesmärk", + "valid period": "kehtivusaeg", + "min. confidence": "min. usaldus", + "data": "andmed", + "Circle": "Ring", + "goal": "eesmärk", + "Delete all messages": "Kustuta kõik sõnumid", + "Are you sure": "Oled sa kindel, et", + "App Source\nNot found": "Rakenduse allikas\nEi leitud", + "Show clocks": "Näita kellasid", + "View Message": "Vaata sõnumit", + "Vector font size": "Vektori kirjasuurus", + "Mark Unread": "Märgi lugemata", + "Delete All Messages": "Kustuta kõik sõnumid", + "No Messages": "Sõnumid puuduvad", + "Bluetooth": "Bluetooth", + "LCD": "LCD", + "Unread timer": "Lugemata taimer", + "Record Run": "Record Run", + "Music": "Muusika", + "Beep": "Helisema", + "Piezo": "Piezo", + "Apps": "Rakendused", + "Utils": "Utils", + "Vibration": "Vibratsioon", + "BLE": "BLE", + "Make Connectable": "Tee ühendatavaks", + "Programmable": "Programmeeritav", + "Light BW": "Kerge BW", + "Passkey BETA": "Passkey BETA", + "HID": "HID", + "Quiet Mode": "Vaikne režiim", + "Background": "Taustaks", + "Customize": "Kohandada", + "Dark BW": "Tume BW", + "LCD Timeout": "LCD Timeout", + "Background 2": "Taust 2", + "Highlight FG": "FG esiletõstmine", + "Add Device": "Seadme lisamine", + "Highlight BG": "Rõhutage BG", + "Remove": "Eemaldage", + "LCD Brightness": "LCD heledus", + "Foreground 2": "Teadmised 2", + "Time Zone": "Ajavöönd", + "Debug Info": "Debug-info", + "Twist Max Y": "Twist Max Y", + "Twist Timeout": "Twist Timeout", + "Foreground": "Esialgsed teadmised", + "Wake on BTN3": "Wake on BTN3", + "Connect device\nto add to\nwhitelist": "Seadme ühendamine\nlisada\nvalimisnimekirja", + "Wake on BTN2": "Wake on BTN2", + "Wake on Touch": "Wake on Touch", + "Wake on FaceUp": "FaceUp'i ärkamine", + "Compact Storage": "Kompaktne ladustamine", + "Wake on Twist": "Wake on Twist", + "Clock Style": "Kella stiil", + "Wake on BTN1": "Wake on BTN1", + "Utilities": "Kommunaalteenused", + "Twist Threshold": "Twist künnis", + "Log": "Logi", + "Reset Settings": "Seadete lähtestamine", + "Rewrite Settings": "Ümberkirjutamise seaded", + "Hour": "Tund", + "Stay Connectable": "Jääge ühendatavaks", + "Flatten Battery": "Aku tasandamine", + "This will remove everything": "See eemaldab kõik", + "Minute": "Hetk", + "App Settings": "Rakenduse seaded", + "No app has settings": "Ühelgi rakendusel ei ole seadeid", + "Invalid settings": "Väärad seaded", + "Date": "Kuupäev", + "Year": "Aasta", + "Side": "Side", + "Turn Off": "Lülita välja", + "Storage": "Ladustamine", + "Second": "Teine", + "Right": "Õigus", + "Left": "Vasakpoolne", + "Month": "Kuu", + "TIMER": "TIMER", + "Reset to Defaults": "Lähtestamine vaikimisi seadistustele", + "Compacting...\nTakes approx\n1 minute": "Tihendamine...\nKulub umbes\n1 minut", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Aku tasandamine - see võib võtta tunde.\nTühistamiseks vajutage pikalt nuppu", + "ALARM": "ALARM", + "Reset All": "Reset All", + "Hours": "Tunnid", + "off": "välja", + "Widgets": "Vidinad", + "Reset all widgets": "Nullida kõik vidinad", + "on": "aadressil", + "Connectable": "Ühendatav", + "No Clocks Found": "Kellasid ei leitud", + "BTNs 1:startlap 2:exit 3:reset": "BTNid 1:startlap 2:exit 3:reset", + "Sort Order": "Sorteerimisjärjekord", + "Reset": "Reset", + "System": "Süsteem", + "Message": "Sõnum", + "Settings": "Seaded", + "Locale": "Locale", + "Alerts": "Hoiatused", + "Enabled": "Lubatud", + "Theme": "Teema", + "Minutes": "Protokoll", + "Delete": "Kustuta", + "Set Time": "Määratud aeg", + "Select Clock": "Valige kell", + "Hide": "Peida", + "Messages": "Sõnumid", + "Ok": "Ok", + "Show": "Näita", + "On": "Veebilehel", + "Factory Reset": "Tehase lähtestamine", + "Error in settings": "Viga seadetes", + "Disable": "Lülita välja", + "Repeat": "Kordus", + "Vibrate": "Vibreerima", + "Whitelist": "Valge nimekiri", + "No": "Ei", + "Yes": "Jah", + "Off": "Väljaspool", + "Back": "Tagasi" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/fi_FI.json b/lang/fi_FI.json index eb1d826d8..162e6a556 100644 --- a/lang/fi_FI.json +++ b/lang/fi_FI.json @@ -1,21 +1,173 @@ { - "//":"Finnish language translations", - "GLOBAL": { - "//":"Translations that apply for all apps", - "Alarms" : "Hälytykset", - "Hours" : "Tunnit", - "Minutes" : "Minuutit", - "Enabled" : "Aktivoitu", - "New Alarm" : "Uusi hälytys", - "Save" : "Tallenna", - "Back" : "Paluu", - "Repeat" : "Toista", - "Delete" : "Poista", - "ALARM!" : "ALARM", - "Sleep" : "Nukkuminen" - }, - "alarm": { - "//":"App-specific overrides", - "rpt" : "toistaa" - } -} + "//": "Finnish language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarms": "Hälytykset", + "Hours": "Tunnit", + "Minutes": "Minuutit", + "Enabled": "Aktivoitu", + "New Alarm": "Uusi hälytys", + "Save": "Tallenna", + "Back": "Paluu", + "Repeat": "Toista", + "Delete": "Poista", + "ALARM!": "ALARM", + "Sleep": "Nukkuminen", + "New Timer": "Uusi ajastin", + "(repeat)": "(toista)", + "music": "musiikki", + "circle count": "ympyröiden lukumäärä", + "Keep Msgs": "Pidä Msgs", + "Auto snooze": "Automaattinen torkku", + "battery warn": "akkuvaroitus", + "heartrate": "syke", + "circle 4": "ympyrä 4", + "circle 2": "ympyrä 2", + "min. confidence": "min. luottamus", + "show widgets": "näytä widgetit", + "step length": "askelpituus", + "weather circle": "sääpiiri", + "circle 1": "ympyrä 1", + "circle 3": "ympyrä 3", + "week": "viikko", + "minimum": "vähintään", + "colorize icon": "väritä kuvake", + "data": "tiedot", + "distance goal": "etäisyystavoite", + "Circle": "Circle", + "valid period": "voimassaoloaika", + "maximum": "maksimi", + "Heartrate": "Sydämen syke", + "Mark Unread": "Merkitse lukematon", + "Delete all messages": "Poista kaikki viestit", + "LCD": "LCD", + "Apps": "Sovellukset", + "TAP right top/bottom": "TAP oikealle ylhäältä/alhaalta", + "App Source\nNot found": "Sovelluksen lähde\nEi löydy", + "STEPS": "STEPS", + "Launcher Settings": "Laukaisimen asetukset", + "Show clocks": "Näytä kellot", + "Vector font size": "Vektorin fonttikoko", + "Font": "Fontti", + "Yes\ndefinitely": "Kyllä\nehdottomasti", + "Bluetooth": "Bluetooth", + "Record Run": "Ennätysjuoksu", + "View Message": "Näytä viesti", + "No Messages": "Ei viestejä", + "Unread timer": "Lukematon ajastin", + "Are you sure": "Oletko varma, että", + "Delete All Messages": "Poista kaikki viestit", + "Highlight FG": "Korosta FG", + "Foreground 2": "Tulosaineisto 2", + "Foreground": "Tulosaineisto", + "Make Connectable": "Tee liitettäväksi", + "Quiet Mode": "Hiljainen tila", + "BLE": "BLE", + "Dark BW": "Tumma BW", + "Background": "Tausta", + "Background 2": "Tausta 2", + "Utils": "Utils", + "Vibration": "Tärinä", + "Piezo": "Piezo", + "HID": "HID", + "Light BW": "Vaalea BW", + "Programmable": "Ohjelmoitava", + "Customize": "Mukauta", + "Passkey BETA": "Passkey BETA", + "BTNs 1:startlap 2:exit 3:reset": "BTN:t 1:käynnistys 2:poistuminen 3:nollaus", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "Utilities": "Apuohjelmat", + "Time Zone": "Aikavyöhyke", + "Clock Style": "Kello tyyli", + "Compact Storage": "Kompakti varastointi", + "Log": "Tukki", + "Debug Info": "Vianmääritystiedot", + "Twist Max Y": "Twist Max Y", + "Twist Timeout": "Twist Timeout", + "Remove": "Poista", + "LCD Timeout": "LCD-aikakatkaisu", + "LCD Brightness": "LCD-kirkkaus", + "Wake on Touch": "Herätys kosketuksesta", + "Wake on BTN3": "Wake BTN3:lla", + "Wake on Twist": "Wake on Twist", + "Wake on BTN2": "Wake BTN2:lla", + "Wake on FaceUp": "Wake on FaceUp", + "Twist Threshold": "Twist-kynnysarvo", + "Add Device": "Lisää laite", + "Highlight BG": "Korosta BG", + "Wake on BTN1": "Wake BTN1:llä", + "Connect device\nto add to\nwhitelist": "Yhdistä laite\nlisätäksesi\nwhitelist", + "Reset to Defaults": "Nollaa oletusasetukset", + "No Clocks Found": "Kelloja ei löydy", + "Hour": "Tunti", + "Date": "Päivämäärä", + "Stay Connectable": "Pysy yhteyksissä", + "Minute": "Minuutti", + "Second": "Toinen", + "Connectable": "Liitettävissä", + "Turn Off": "Kytke pois päältä", + "This will remove everything": "Tämä poistaa kaiken", + "Reset Settings": "Nollaa asetukset", + "Right": "Oikea", + "Left": "Vasen", + "Side": "Sivu", + "Sort Order": "Lajittelujärjestys", + "Reset All": "Nollaa kaikki", + "Widgets": "Widgetit", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Akun tyhjentäminen - tämä voi kestää tunteja.\nPeruuta painamalla pitkään painiketta", + "Compacting...\nTakes approx\n1 minute": "Tiivistäminen...\nKestää noin\n1 minuutti", + "Storage": "Varastointi", + "Rewrite Settings": "Uudelleenkirjoitusasetukset", + "Flatten Battery": "Litistä akku", + "Invalid settings": "Virheelliset asetukset", + "OFF": "OFF", + "Sleep Phase Alarm": "Univaiheen hälytys", + "No app has settings": "Missään sovelluksessa ei ole asetuksia", + "App Settings": "Sovelluksen asetukset", + "Month": "Kuukausi", + "Reset": "Nollaa", + "Alarm": "Hälytys", + "Beep": "Beep", + "goal": "tavoite", + "on": "osoitteessa", + "Reset all widgets": "Nollaa kaikki widgetit", + "Select Clock": "Valitse Kello", + "Vibrate": "Värinä", + "Message": "Viesti", + "TIMER": "AJASTIN", + "Alerts": "Hälytykset", + "Locale": "Paikkakunta", + "Set Time": "Aseta aika", + "System": "Järjestelmä", + "Disable": "Poista käytöstä", + "Whitelist": "Whitelist", + "Error in settings": "Virhe asetuksissa", + "BACK": "TAKAISIN", + "Factory Reset": "Tehdasasetusten palautus", + "Timer": "Ajastin", + "Connected": "Yhdistetty", + "ALARM": "HÄLYTYS", + "Messages": "Viestit", + "Hide": "Piilota", + "Ok": "Ok", + "Show": "Näytä", + "On": "Osoitteessa", + "No": "Ei", + "Settings": "Asetukset", + "steps": "vaiheet", + "back": "takaisin", + "Steps": "Askeleet", + "Yes": "Kyllä", + "Year": "Vuosi", + "Loading": "Ladataan", + "Music": "Musiikki", + "color": "väri", + "off": "off", + "Off": "Off", + "Theme": "Teema" + }, + "alarm": { + "//": "App-specific overrides", + "rpt": "toistaa" + } +} \ No newline at end of file diff --git a/lang/fr_FR.json b/lang/fr_FR.json index 209574424..ad0f03b0c 100644 --- a/lang/fr_FR.json +++ b/lang/fr_FR.json @@ -1,21 +1,173 @@ { - "//":"French language translations", - "GLOBAL": { - "//":"Translations that apply for all apps", - "Alarms" : "Réveils", - "Hours" : "Heures", - "Minutes" : "Minutes", - "Enabled" : "Activé", - "New Alarm" : "Nouveau Réveil", - "Save" : "Sauvegarder", - "Back" : "Retour", - "Repeat" : "Répétition", - "Delete" : "Supprimer", - "ALARM!" : "ALARM!", - "Sleep" : "Sommeil" - }, - "alarm": { - "//":"App-specific overrides", - "rpt" : "rép." - } -} + "//": "French language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarms": "Réveils", + "Hours": "Heures", + "Minutes": "Minutes", + "Enabled": "Activé", + "New Alarm": "Nouveau Réveil", + "Save": "Sauvegarder", + "Back": "Retour", + "Repeat": "Répétition", + "Delete": "Supprimer", + "ALARM!": "ALARM!", + "Sleep": "Sommeil", + "New Timer": "Nouveau Timer", + "Keep Msgs": "Garder les messages", + "(repeat)": "(répétition)", + "week": "semaine", + "Auto snooze": "Réveil automatique", + "music": "musique", + "circle 2": "cercle 2", + "circle 3": "cercle 3", + "circle count": "nombre de cercles", + "weather circle": "cercle météorologique", + "circle 4": "cercle 4", + "show widgets": "afficher les widgets", + "heartrate": "fréquence cardiaque", + "battery warn": "alerte batterie", + "circle 1": "cercle 1", + "maximum": "maximum", + "min. confidence": "confiance minimale", + "step length": "longueur des pas", + "minimum": "minimum", + "Circle": "Cercle", + "valid period": "période de validité", + "Heartrate": "Fréquence cardiaque", + "distance goal": "objectif de distance", + "Yes\ndefinitely": "Oui\ndéfinitivement", + "data": "données", + "colorize icon": "coloriser l'icône", + "TAP right top/bottom": "TAP droit haut/bas", + "App Source\nNot found": "Source de l'application\nNon trouvé", + "Font": "Police", + "STEPS": "ÉTAPES", + "Vector font size": "Taille de la police vectorielle", + "Show clocks": "Montrer les horloges", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "No Messages": "Aucun message", + "View Message": "Afficher le message", + "Launcher Settings": "Paramètres du lanceur", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1 : EXIT", + "Make Connectable": "Rendre connectable", + "Piezo": "Piezo", + "Programmable": "Programmable", + "HID": "HID", + "Mark Unread": "Marquer comme non lu", + "Are you sure": "Vous êtes sûr", + "Dark BW": "Dark BW", + "Delete all messages": "Supprimer tous les messages", + "Delete All Messages": "Supprimer tous les messages", + "Vibration": "Vibration", + "Quiet Mode": "Mode silencieux", + "Passkey BETA": "Passkey BETA", + "BLE": "BLE", + "Foreground 2": "Premier plan 2", + "Background": "Contexte", + "Record Run": "Record Run", + "Utils": "Utils", + "Bluetooth": "Bluetooth", + "Apps": "Apps", + "Customize": "Personnalisez", + "Background 2": "Contexte 2", + "Light BW": "Light BW", + "LCD": "LCD", + "Unread timer": "Minuterie non lue", + "Foreground": "Premier plan", + "Remove": "Retirer", + "Highlight FG": "Highlight FG", + "Add Device": "Ajouter un dispositif", + "Highlight BG": "Mettre en évidence BG", + "Wake on BTN1": "Réveil sur BTN1", + "Connect device\nto add to\nwhitelist": "Connecter le dispositif\nà ajouter à\nliste blanche", + "LCD Timeout": "Temporisation de l'écran LCD", + "LCD Brightness": "Luminosité de l'écran LCD", + "Wake on BTN2": "Wake sur BTN2", + "Wake on BTN3": "Wake sur BTN3", + "Wake on FaceUp": "Réveillez-vous sur FaceUp", + "Wake on Touch": "Réveil au toucher", + "Twist Threshold": "Seuil de torsion", + "Wake on Twist": "Réveil sur Twist", + "Reset to Defaults": "Réinitialisation des valeurs par défaut", + "Utilities": "Utilitaires", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Mise à plat de la batterie - cela peut prendre des heures.\nAppuyez longuement sur le bouton pour annuler", + "Flatten Battery": "Aplatir la batterie", + "Storage": "Stockage", + "Reset Settings": "Réinitialiser les paramètres", + "Log": "Journal de bord", + "Rewrite Settings": "Paramètres de réécriture", + "Compacting...\nTakes approx\n1 minute": "Compactage...\nPrend environ\n1 minute", + "Time Zone": "Fuseau horaire", + "Clock Style": "Style de l'horloge", + "Debug Info": "Informations de débogage", + "Twist Max Y": "Twist Max Y", + "Twist Timeout": "Twist Timeout", + "Compact Storage": "Stockage compact", + "App Settings": "Paramètres de l'application", + "No app has settings": "Aucune application n'a de paramètres", + "Sleep Phase Alarm": "Alarme de phase de sommeil", + "Month": "Mois", + "Turn Off": "Désactiver", + "This will remove everything": "Cela va supprimer tout", + "Date": "Date", + "Hour": "Heure", + "Right": "Droit", + "Left": "Gauche", + "No Clocks Found": "Aucune horloge trouvée", + "Sort Order": "Ordre de tri", + "OFF": "OFF", + "Side": "Côté", + "TIMER": "TIMER", + "Reset All": "Réinitialiser tout", + "Second": "Deuxièmement", + "Connectable": "Connectable", + "Minute": "Minute", + "Stay Connectable": "Restez connecté", + "Invalid settings": "Paramètres non valides", + "Widgets": "Widgets", + "Vibrate": "Vibrer", + "Reset all widgets": "Réinitialiser tous les widgets", + "Whitelist": "Liste blanche", + "Set Time": "Définir l'heure", + "System": "Système", + "Connected": "Connecté", + "Alerts": "Alertes", + "Locale": "Locale", + "Alarm": "Alarme", + "Reset": "Réinitialiser", + "on": "sur", + "Beep": "Bip", + "Factory Reset": "Réinitialisation d'usine", + "Select Clock": "Sélectionner l'horloge", + "Disable": "Désactiver", + "Message": "Message", + "goal": "objectif", + "Show": "Afficher", + "Hide": "Cacher", + "Messages": "Messages", + "BACK": "BACK", + "Error in settings": "Erreur dans les paramètres", + "Timer": "Minuterie", + "On": "Sur", + "No": "Non", + "Ok": "Ok", + "steps": "étapes", + "Settings": "Paramètres", + "ALARM": "ALARME", + "back": "dos", + "Yes": "Oui", + "Steps": "Étapes", + "Year": "Année", + "Loading": "Chargement", + "Music": "Musique", + "color": "couleur", + "Off": "Off", + "off": "off", + "Theme": "Thème" + }, + "alarm": { + "//": "App-specific overrides", + "rpt": "rép." + } +} \ No newline at end of file diff --git a/lang/hu_HU.json b/lang/hu_HU.json index 8e5df6ed7..62d956a3c 100644 --- a/lang/hu_HU.json +++ b/lang/hu_HU.json @@ -1,21 +1,173 @@ { - "//":"Spanish language translations", - "GLOBAL": { - "//":"Translations that apply for all apps", - "Alarms" : "Riasztások", - "Hours" : "Óra", - "Minutes" : "Perc", - "Enabled" : "Aktiválva", - "New Alarm" : "Új riasztás", - "Save" : "Mentés", - "Back" : "Vissza", - "Repeat" : "Ismétlés", - "Delete" : "Törlés", - "ALARM!" : "ALARM!", - "Sleep" : "Alvás" - }, - "alarm": { - "//":"App-specific overrides", - "rpt" : "ismétlés" - } -} + "//": "Spanish language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarms": "Riasztások", + "Hours": "Óra", + "Minutes": "Perc", + "Enabled": "Aktiválva", + "New Alarm": "Új riasztás", + "Save": "Mentés", + "Back": "Vissza", + "Repeat": "Ismétlés", + "Delete": "Törlés", + "ALARM!": "ALARM!", + "Sleep": "Alvás", + "New Timer": "Új időzítő", + "Auto snooze": "Automatikus szundi", + "(repeat)": "(ismétlés)", + "Keep Msgs": "Msgs megtartása", + "music": "zene", + "week": "hét", + "min. confidence": "min. bizalom", + "minimum": "minimum", + "data": "adatok", + "Heartrate": "Szívritmus", + "battery warn": "akkumulátor figyelmeztetés", + "maximum": "maximum", + "show widgets": "widgetek megjelenítése", + "circle count": "körök száma", + "circle 1": "1. kör", + "circle 4": "4. kör", + "heartrate": "szívritmus", + "circle 3": "3. kör", + "circle 2": "2. kör", + "valid period": "érvényes időszak", + "step length": "lépéshossz", + "distance goal": "távolsági cél", + "Circle": "Kör", + "colorize icon": "ikon színezése", + "weather circle": "időjárási kör", + "TAP right top/bottom": "TAP jobbra fent/alul", + "Launcher Settings": "Indító beállításai", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "Yes\ndefinitely": "Igen\nhatározottan", + "App Source\nNot found": "Alkalmazás forrása\nNem található", + "No Messages": "Nincs üzenet", + "Unread timer": "Olvasatlan időzítő", + "Record Run": "Rekord futás", + "Font": "Betűtípus", + "Vector font size": "Vektor betűméret", + "Show clocks": "Mutassa az órákat", + "Delete all messages": "Minden üzenet törlése", + "Are you sure": "Biztos vagy benne, hogy", + "Delete All Messages": "Minden üzenet törlése", + "STEPS": "LÉPÉSEK", + "Apps": "Alkalmazások", + "View Message": "Üzenet megtekintése", + "LCD": "LCD", + "Bluetooth": "Bluetooth", + "Piezo": "Piezo", + "Utils": "Utils", + "BTNs 1:startlap 2:exit 3:reset": "BTN-ek 1:startlap 2:exit 3:reset", + "Mark Unread": "Mark Unread", + "LCD Brightness": "LCD fényerő", + "Customize": "Testreszabás", + "Light BW": "Világos BW", + "Background": "Háttér", + "Highlight BG": "Kiemelés BG", + "Highlight FG": "FG kiemelése", + "Foreground": "Új információk és jogok", + "Foreground 2": "Előtérben 2", + "Background 2": "Háttér 2", + "Remove": "Távolítsa el a", + "Connect device\nto add to\nwhitelist": "Eszköz csatlakoztatása\nhozzáadni a\nfehérlistára", + "Add Device": "Eszköz hozzáadása", + "Dark BW": "Sötét BW", + "Passkey BETA": "Passkey BETA", + "HID": "HID", + "Wake on BTN3": "Wake a BTN3-on", + "Wake on BTN1": "Wake a BTN1-en", + "Wake on BTN2": "Wake a BTN2-n", + "BLE": "BLE", + "Vibration": "Rezgés", + "Make Connectable": "Csatlakoztathatóvá tenni", + "Programmable": "Programozható", + "Quiet Mode": "Csendes üzemmód", + "Twist Threshold": "Twist küszöbérték", + "Wake on FaceUp": "Ébredj a FaceUp-on", + "Twist Timeout": "Twist Timeout", + "Utilities": "Közművek", + "Twist Max Y": "Twist Max Y", + "Time Zone": "Időzóna", + "Log": "Napló", + "Clock Style": "Óra stílus", + "Compact Storage": "Kompakt tárolás", + "Storage": "Tárolás", + "Wake on Twist": "Wake on Twist", + "Debug Info": "Hibaelhárítási információ", + "Flatten Battery": "Lapos akkumulátor", + "Wake on Touch": "Ébresztés érintésre", + "LCD Timeout": "LCD Timeout", + "Rewrite Settings": "Újraírási beállítások", + "This will remove everything": "Ez mindent eltávolít", + "Turn Off": "Kikapcsolás", + "Stay Connectable": "Maradjon összekapcsolható", + "Reset to Defaults": "Alapértelmezettre visszaállítása", + "Reset Settings": "Beállítások visszaállítása", + "Compacting...\nTakes approx\n1 minute": "Tömörítés...\nKb.\n1 perc", + "No Clocks Found": "Nem találtak órákat", + "TIMER": "TIMER", + "Connectable": "Csatlakoztatható", + "Side": "Oldal", + "Reset all widgets": "Minden widget alaphelyzetbe állítása", + "Reset All": "Minden visszaállítása", + "Left": "Balra", + "Widgets": "Widgetek", + "Right": "Jobbra", + "Sort Order": "Rendezési sorrend", + "Date": "Dátum", + "Hour": "Óra", + "goal": "cél", + "Beep": "Beep", + "Reset": "Reset", + "on": "a oldalon", + "App Settings": "Alkalmazás beállításai", + "OFF": "OFF", + "No app has settings": "Egyetlen alkalmazás sem rendelkezik beállításokkal", + "Invalid settings": "Érvénytelen beállítások", + "Minute": "Perc", + "Sleep Phase Alarm": "Alvási fázis riasztás", + "Second": "Második", + "Month": "Hónap", + "Alarm": "Riasztás", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Az akkumulátor lapítása - ez órákig is eltarthat.\nHosszan nyomja meg a gombot a törléshez", + "Whitelist": "Fehér lista", + "Alerts": "Riasztások", + "Disable": "A letiltása", + "Set Time": "Beállított idő", + "Select Clock": "Óra kiválasztása", + "Message": "Üzenet", + "System": "Rendszer", + "Vibrate": "Rezgés", + "Locale": "Helyszín", + "Factory Reset": "Gyári visszaállítás", + "BACK": "VISSZA", + "ALARM": "ALARM", + "Timer": "Időzítő", + "Connected": "Csatlakoztatva", + "Error in settings": "Hiba a beállításokban", + "Messages": "Üzenetek", + "Ok": "Oké", + "No": "Nem", + "back": "vissza", + "steps": "lépések", + "Year": "Év", + "Steps": "Lépések", + "On": "A oldalon.", + "Settings": "Beállítások", + "Hide": "Rejtsd el", + "Show": "Mutasd meg a", + "Yes": "Igen", + "Loading": "Betöltés", + "Music": "Zene", + "color": "szín", + "off": "off", + "Off": "Off", + "Theme": "Téma" + }, + "alarm": { + "//": "App-specific overrides", + "rpt": "ismétlés" + } +} \ No newline at end of file diff --git a/lang/index.json b/lang/index.json index 3d492783d..2a9ecfd42 100644 --- a/lang/index.json +++ b/lang/index.json @@ -9,5 +9,17 @@ {"code":"it_IT","name":"Italian","url":"it_IT.json"}, {"code":"nl_NL","name":"Dutch","url":"nl_NL.json"}, {"code":"sv_SE","name":"Swedish","url":"sv_SE.json"}, - {"code":"tr_TR","name":"Turkish","url":"tr_TR.json"} + {"code":"tr_TR","name":"Turkish","url":"tr_TR.json"}, + {"code":"ru_RU","name":"Russian","url":"ru_RU.json", "disabled":"Characters not in ISO Latin codepage"}, + {"code":"pt_PT","name":"Portuguese","url":"pt_PT.json"}, + {"code":"bg_BG","name":"Bulgarian","url":"bg_BG.json", "disabled":"Characters not in ISO Latin codepage"}, + {"code":"da_DA","name":"Danish","url":"da_DA.json"}, + {"code":"el_EL","name":"Greek","url":"el_EL.json", "disabled":"Characters not in ISO Latin codepage"}, + {"code":"et_ET","name":"Estonian","url":"et_ET.json"}, + {"code":"lt_LT","name":"Lithuanian","url":"lt_LT.json"}, + {"code":"lv_LV","name":"Latvian","url":"lv_LV.json"}, + {"code":"pl_PL","name":"Polish","url":"pl_PL.json"}, + {"code":"ro_RO","name":"Romanian","url":"ro_RO.json"}, + {"code":"sk_SK","name":"Slovak","url":"sk_SK.json"}, + {"code":"sl_SL","name":"Slovenian","url":"sl_SL.json"} ] diff --git a/lang/it_IT.json b/lang/it_IT.json index 96293cbf3..07545e1e7 100644 --- a/lang/it_IT.json +++ b/lang/it_IT.json @@ -1,21 +1,186 @@ { - "//":"Italian language translations", - "GLOBAL": { - "//":"Translations that apply for all apps", - "Alarms" : "Sveglie", - "Hours" : "Ore", - "Minutes" : "Minuti", - "Enabled" : "Attiva", - "New Alarm" : "Nuova sveglia", - "Save" : "Salva", - "Back" : "Indietro", - "Repeat" : "Ripeti", - "Delete" : "Cancella", - "ALARM!" : "SVEGLIA!", - "Sleep" : "Dormi" - }, - "alarm": { - "//":"App-specific overrides", - "rpt" : "ripeti" - } -} + "//1": "Italian language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "On": "On", + "on": "on", + "Off": "Off", + "off": "off", + "Ok": "Ok", + "Yes": "Sì", + "No": "No", + "Alarm": "Sveglia", + "ALARM": "SVEGLIA", + "Alarms": "Sveglie", + "Date": "Data", + "Year": "Anno", + "Month": "Mese", + "Day": "Giorno", + "Hour": "Ora", + "Hours": "Ore", + "Minute": "Minuto", + "Minutes": "Minuti", + "Second": "Secondo", + "Seconds": "Secondi", + "week": "settimana", + "Week": "Settimana", + "Enabled": "Attivo/a", + "New Alarm": "Nuova sveglia", + "Save": "Salva", + "Cancel": "Annulla", + "Back": "Indietro", + "Repeat": "Ripeti", + "Delete": "Cancella", + "ALARM!": "SVEGLIA!", + "Sleep": "Dormi", + "Timer": "Timer", + "TIMER": "TIMER", + "New Timer": "Nuovo timer", + "(repeat)": "(ripeti)", + "Auto snooze": "Posticipa automaticamente", + "Connected": "Connesso", + "Delete all messages": "Cancella tutti i messaggi", + "Delete All Messages": "Cancella tutti i messaggi", + "Message": "Messaggio", + "Messages": "Messaggi", + "No Messages": "Nessun messaggio", + "Keep Msgs": "Tieni i messaggi", + "Mark Unread": "Segna come non letto", + "Vibrate": "Vibrazione", + "Are you sure": "Sei sicuro/a", + "Music": "Musica", + "Apps": "App", + "App Settings": "Impostazioni app", + "Bluetooth": "Bluetooth", + "BLE": "BLE", + "Make Connectable": "Rendi collegabile", + "Programmable": "Programmabile", + "Remove": "Rimuovi", + "Utils": "Utilità", + "LCD": "LCD", + "LCD Brightness": "Luminosità LCD", + "LCD Timeout": "Timeout LCD", + "Wake on BTN1": "Risveglia con BTN1", + "Wake on BTN2": "Risveglia con BTN2", + "Wake on BTN3": "Risveglia con BTN3", + "Wake on FaceUp": "Risveglia a faccia in su", + "Wake on Touch": "Risveglia al tocco", + "Wake on Twist": "Risveglia con polso", + "Twist Timeout": "Timeout torsione", + "Twist Max Y": "Torsione Y max", + "Twist Threshold": "Soglia torsione", + "Customize": "Personalizza", + "Add Device": "Aggiungi dispositivo", + "Left": "Sinistra", + "Right": "Destra", + "Widgets": "Widget", + "Settings": "Impostazioni", + "No app has settings": "Non ci sono app con delle impostazioni", + "System": "Sistema", + "Alerts": "Avvisi", + "Theme": "Tema", + "Foreground": "Primo piano", + "Background": "Sfondo", + "Foreground 2": "Primo piano 2", + "Background 2": "Sfondo 2", + "Highlight FG": "Selezione PP", + "Highlight BG": "Selezione Sf", + "Utilities": "Utilità", + "Storage": "Memoria", + "Compact Storage": "Compatta memoria", + "Select Clock": "Seleziona orologio", + "No Clocks Found": "Nessun orologio trovato", + "Locale": "Localizzazione", + "Set Time": "Imposta orario", + "Time Zone": "Fuso orario", + "Whitelist": "Whitelist", + "Quiet Mode": "Modalità silenziosa", + "Disable": "Disabilita", + "Vibration": "Vibrazione", + "Show": "Mostra", + "Hide": "Nascondi", + "Rewrite Settings": "Riscrivi impostazioni", + "Reset Settings": "Reset impostazioni", + "Factory Reset": "Ripristino condizioni iniziali", + "Flatten Battery": "Scarica la batteria", + "Turn Off": "Spegni", + "This will remove everything": "Questo rimuoverà TUTTO", + "Error in settings": "Errore nelle impostazioni", + "Invalid settings": "Impostazioni non valide", + "Loading": "Caricamento", + "Launcher Settings": "Impostazioni Launcher", + "Font": "Font", + "Show clocks": "Mostra orologi", + "Log": "Log", + "Steps": "Passi", + "steps": "passi", + "music": "musica", + "circle 4": "cerchio 4", + "circle 3": "cerchio 3", + "circle 1": "cerchio 1", + "circle 2": "cerchio 2", + "circle count": "conteggio dei cerchi", + "minimum": "minimo", + "weather circle": "cerchio meteorologico", + "show widgets": "mostra i widget", + "heartrate": "frequenza cardiaca", + "battery warn": "avvertire la batteria", + "Heartrate": "Battito cardiaco", + "valid period": "periodo valido", + "distance goal": "obiettivo di distanza", + "min. confidence": "fiducia minima", + "maximum": "massimo", + "Circle": "Cerchio", + "data": "dati", + "step length": "lunghezza del passo", + "View Message": "Visualizza il messaggio", + "Yes\ndefinitely": "Sì\nsicuramente", + "Piezo": "Piezo", + "colorize icon": "colorare l'icona", + "STEPS": "PASSI", + "TAP right top/bottom": "TAP in alto/basso a destra", + "HID": "HID", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "Passkey BETA": "Passkey BETA", + "goal": "obiettivo", + "Beep": "Bip", + "Debug Info": "Informazioni di debug", + "OFF": "OFF", + "Reset": "Reset", + "Sleep Phase Alarm": "Allarme della fase di sonno", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "back": "indietro", + "color": "colore", + "BACK": "INDIETRO" + }, + "//2": "App-specific overrides", + "launch": { + "Vector font size": "Dim. font vett.", + "App Source\nNot found": "Codice app\nnon trovato" + }, + "messages": { + "Unread timer": "Timer msg non letti" + }, + "run": { + "Record Run": "Registra corsa" + }, + "setting": { + "Clock Style": "Formato ora", + "Compacting...\nTakes approx\n1 minute": "Compattamento in corso...\nCi vorrà circa un minuto", + "//1": "The new line before 'operazione' improves the layout", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Scaricamento batteria in corso - l'\noperazione può richiedere ore. Tieni premuto il pulsante per annullare", + "Reset to Defaults": "Ripristinare le impostazioni predefinite", + "Connectable": "Collegamento", + "Connect device\nto add to\nwhitelist": "Collega un\ndispositivo\nper metterlo\nin whitelist", + "Stay Connectable": "Rimanere collegabile", + "Light BW": "Chiaro", + "Dark BW": "Scuro" + }, + "wid_edit": { + "Reset": "Ripristina", + "Reset All": "Ripristina tutto", + "Reset all widgets": "Ripristina tutti i widget", + "Sort Order": "Ordinamento", + "Side": "Lato" + } +} \ No newline at end of file diff --git a/lang/lt_LT.json b/lang/lt_LT.json new file mode 100644 index 000000000..2ea7dca90 --- /dev/null +++ b/lang/lt_LT.json @@ -0,0 +1,163 @@ +{ + "//": "Lithuanian language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "New Alarm": "Naujas žadintuvas", + "(repeat)": "(pakartoti)", + "Alarm": "Signalizacija", + "Save": "Išsaugoti", + "New Timer": "Naujas laikmatis", + "Sleep": "Miegas", + "circle count": "ratų skaičius", + "Timer": "Laikmatis", + "week": "savaitė", + "Connected": "Prijungta", + "circle 2": "2 ratas", + "Auto snooze": "Automatinis snaudimas", + "circle 1": "1 ratas", + "show widgets": "rodyti valdiklius", + "Keep Msgs": "Laikyti Msgs", + "weather circle": "orų ratas", + "step length": "žingsnio ilgis", + "steps": "žingsniai", + "circle 3": "3 ratas", + "battery warn": "įspėjimas apie akumuliatorių", + "min. confidence": "min. pasitikėjimas", + "maximum": "didžiausias", + "valid period": "galiojantis laikotarpis", + "minimum": "minimalus", + "heartrate": "širdies ritmas", + "circle 4": "4 ratas", + "goal": "tikslas", + "data": "duomenys", + "distance goal": "atstumo tikslas", + "Steps": "Žingsniai", + "Heartrate": "Širdies ritmas", + "Show clocks": "Rodyti laikrodžius", + "View Message": "Peržiūrėti žinutę", + "color": "", + "colorize icon": "nuspalvinti piktogramą", + "Circle": "Apskritimas", + "Delete all messages": "Ištrinti visus pranešimus", + "Font": "Šriftas", + "TAP right top/bottom": "TAP dešinėje viršuje / apačioje", + "No Messages": "Jokių pranešimų", + "Launcher Settings": "Paleidimo programos nustatymai", + "App Source\nNot found": "Programėlės šaltinis\nNerastas", + "Loading": "Pakrovimas", + "Vector font size": "Vektorinio šrifto dydis", + "Music": "Muzika", + "Are you sure": "Ar tikrai", + "Delete All Messages": "Ištrinti visus pranešimus", + "Mark Unread": "Pažymėti Neskaityta", + "LCD": "LCD", + "Apps": "Programėlės", + "Record Run": "Rekordinis paleidimas", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "Unread timer": "Neperskaitytas laikmatis", + "Bluetooth": "\"Bluetooth\"", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "Dark BW": "Tamsus BW", + "Programmable": "Programuojamas", + "Make Connectable": "Sukurkite \"Connectable", + "BLE": "BLE", + "Passkey BETA": "Passkey BETA", + "HID": "HID", + "Utils": "Paslaugos", + "Quiet Mode": "Tylusis režimas", + "Beep": "Pyptelėjimas", + "Piezo": "Piezo", + "Vibration": "Vibracija", + "Background": "Pagrindinė informacija", + "Customize": "Tinkinti", + "Foreground": "Naujos žinios", + "Light BW": "Šviesus BW", + "Add Device": "Pridėti įrenginį", + "Remove": "Pašalinti", + "Wake on BTN1": "Pabusti dėl BTN1", + "Wake on BTN3": "Pabusti dėl BTN3", + "Highlight FG": "Pabrėžti FG", + "Highlight BG": "Išryškinti BG", + "Twist Max Y": "Twist Max Y", + "Foreground 2": "Pirmas planas 2", + "Background 2": "Pagrindinė informacija 2", + "Clock Style": "Laikrodžio stilius", + "Log": "Žurnalas", + "Debug Info": "Derinimo informacija", + "Time Zone": "Laiko juosta", + "Wake on Touch": "Pabudimas palietus", + "Twist Threshold": "Sukimo slenkstis", + "Wake on FaceUp": "Atsibusti \"FaceUp", + "Wake on BTN2": "Pabusti dėl BTN2", + "Wake on Twist": "Pabusti dėl Twist", + "LCD Brightness": "LCD ekrano ryškumas", + "Twist Timeout": "Twist Timeout", + "Compact Storage": "Kompaktiškas saugojimas", + "Storage": "Saugykla", + "Utilities": "Komunalinės paslaugos", + "Compacting...\nTakes approx\n1 minute": "Suspaudžiant...\nUžtrunka maždaug\n1 minutė", + "No Clocks Found": "Laikrodžių nerasta", + "Reset Settings": "Nustatymų atstatymas", + "Flatten Battery": "Išlyginti akumuliatorių", + "Connect device\nto add to\nwhitelist": "Prijungti įrenginį\npridėti prie\nbaltąjį sąrašą", + "LCD Timeout": "LCD ekrano laiko limitas", + "Hour": "Valanda", + "Second": "Antrasis", + "Date": "Data", + "Turn Off": "Išjungti", + "This will remove everything": "Tai pašalins viską.", + "Connectable": "Prijungiama", + "Stay Connectable": "Palaikykite ryšį", + "Left": "Kairėje pusėje", + "Right": "Dešinė", + "Side": "Šoninė pusė", + "Invalid settings": "Netinkami nustatymai", + "Month": "Mėnuo", + "Year": "Metai", + "App Settings": "Programėlės nustatymai", + "Sort Order": "Rūšiavimo tvarka", + "Minute": "Minutė", + "No app has settings": "Jokia programa neturi nustatymų", + "Rewrite Settings": "Perrašymo nustatymai", + "Reset All": "Iš naujo nustatyti viską", + "Reset": "Iš naujo nustatyti", + "Reset to Defaults": "Iš naujo nustatyti numatytąsias reikšmes", + "Hours": "Valandos", + "ALARM": "ALARMAS", + "TIMER": "LAIKMATIS", + "Widgets": "Valdikliai", + "Reset all widgets": "Iš naujo nustatyti visus valdiklius", + "Minutes": "Protokolas", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Akumuliatoriaus išlyginimas - tai gali užtrukti kelias valandas.\nIlgai paspauskite mygtuką, kad atšauktumėte", + "on": "svetainėje", + "off": "iš", + "Message": "Žinutė", + "Repeat": "Pakartokite", + "Delete": "Ištrinti", + "Enabled": "Įjungta", + "System": "Sistema", + "Theme": "Tema", + "Vibrate": "Vibruoti", + "Settings": "Nustatymai", + "Alerts": "Įspėjimai", + "Error in settings": "Klaida nustatymuose", + "Messages": "Žinutės", + "Set Time": "Nustatytas laikas", + "Locale": "Vietovė", + "Select Clock": "Pasirinkite laikrodį", + "Whitelist": "Baltasis sąrašas", + "Disable": "Išjungti", + "Factory Reset": "Gamyklinis atstatymas", + "Show": "Rodyti", + "Hide": "Paslėpti", + "Yes": "Taip", + "Ok": "Gerai", + "No": "Ne", + "On": "Svetainėje", + "Off": "Išjungta", + "Back": "Atgal" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/lv_LV.json b/lang/lv_LV.json new file mode 100644 index 000000000..41525891f --- /dev/null +++ b/lang/lv_LV.json @@ -0,0 +1,163 @@ +{ + "//": "Latvian language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Save": "Saglabāt", + "Auto snooze": "Automātiskā snaudiena atlikšana", + "circle 1": "1 aplis", + "New Timer": "Jauns taimeris", + "New Alarm": "Jauns modinātājs", + "Sleep": "Miega režīms", + "circle count": "apļu skaits", + "Keep Msgs": "Glabāt Msgs", + "Timer": "Taimeris", + "week": "nedēļa", + "Connected": "Savienots", + "(repeat)": "(atkārtot)", + "circle 3": "aplis 3", + "circle 4": "4 aplis", + "Alarm": "Trauksmes signāls", + "steps": "soļi", + "heartrate": "sirdsdarbības ātrums", + "weather circle": "laikapstākļu aplis", + "circle 2": "2. aplis", + "minimum": "minimālais", + "battery warn": "brīdinājums par akumulatoru", + "min. confidence": "min. uzticēšanās", + "show widgets": "parādīt logrīkus", + "step length": "soļa garums", + "goal": "mērķis", + "distance goal": "attāluma mērķis", + "valid period": "derīguma termiņš", + "Circle": "Aplis", + "data": "dati", + "Steps": "Soļi", + "color": "krāsa", + "colorize icon": "iekrāsot ikonu", + "maximum": "maksimālais", + "Heartrate": "Sirdsdarbība", + "View Message": "Skatīt ziņojumu", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "TAP right top/bottom": "TAP pa labi augšā/apakšā", + "Mark Unread": "Atzīmēt Neizlasīts", + "Delete all messages": "Dzēst visus ziņojumus", + "Vector font size": "Vektora fonta lielums", + "Loading": "Iekraušana", + "Show clocks": "Rādīt pulksteņus", + "Font": "Fonts", + "App Source\nNot found": "Lietotņu avots\nNav atrasts", + "Launcher Settings": "Palaidēja iestatījumi", + "Delete All Messages": "Dzēst visus ziņojumus", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:izeja 3:resetēšana", + "Bluetooth": "Bluetooth", + "Are you sure": "Vai esat pārliecināts, ka", + "Utils": "Utils", + "Unread timer": "Neizlasīts taimeris", + "LCD": "LCD", + "Music": "Mūzika", + "No Messages": "Nav ziņojumu", + "Record Run": "Rekorda skrējiens", + "HID": "HID", + "Quiet Mode": "Klusais režīms", + "Highlight FG": "Izcelt FG", + "Programmable": "Programmējams", + "Passkey BETA": "Passkey BETA", + "Light BW": "Gaismas BW", + "Piezo": "Piezo", + "Make Connectable": "Padarīt savienojamu", + "Beep": "Pīkstiens", + "Dark BW": "Tumšs BW", + "Background": "Pamatinformācija", + "Vibration": "Vibrācija", + "Apps": "Aplikācijas", + "Foreground 2": "Priekšplāns 2", + "Background 2": "Pamatinformācija 2", + "Foreground": "Priekšplāns", + "Customize": "Pielāgojiet", + "Highlight BG": "Izcelt BG", + "BLE": "BLE", + "LCD Timeout": "LCD displeja laika ierobežojums", + "Twist Max Y": "Twist Max Y", + "Add Device": "Pievienot ierīci", + "Connect device\nto add to\nwhitelist": "Savienot ierīci\nlai pievienotu\nbalto sarakstu", + "Wake on Touch": "Pamosties pēc pieskāriena", + "Time Zone": "Laika josla", + "Wake on BTN3": "Wake par BTN3", + "Wake on BTN1": "Pamosties par BTN1", + "Wake on BTN2": "Wake par BTN2", + "LCD Brightness": "LCD ekrāna spilgtums", + "Remove": "Noņemt", + "Clock Style": "Pulksteņa stils", + "Debug Info": "Dzesēšanas informācija", + "Twist Timeout": "Twist laika ierobežojums", + "Wake on FaceUp": "Pamosties FaceUp", + "Twist Threshold": "Pagrieziena slieksnis", + "This will remove everything": "Tādējādi tiks noņemts viss", + "Utilities": "Komunālie pakalpojumi", + "Connectable": "Savienojams", + "Minute": "Minūtes", + "Stay Connectable": "Palieciet savienojami", + "Storage": "Uzglabāšana", + "Log": "Log", + "Wake on Twist": "Wake on Twist", + "Flatten Battery": "Izlīdzināt akumulatoru", + "Rewrite Settings": "Pārrakstīšanas iestatījumi", + "Compact Storage": "Kompakta uzglabāšana", + "Compacting...\nTakes approx\n1 minute": "Blīvēšanas...\nAizņem aptuveni\n1 minūte", + "Second": "Otrais", + "Reset Settings": "Iestatījumu atiestatīšana", + "Turn Off": "Izslēgt", + "Date": "Datums", + "Right": "Tiesības", + "Sort Order": "Kārtot pēc kārtas", + "No Clocks Found": "Nav atrasti pulksteņi", + "Reset to Defaults": "Atiestatīt noklusējuma iestatījumus", + "No app has settings": "Nevienā lietotnē nav iestatījumu", + "ALARM": "ALARM", + "Widgets": "Logrīki", + "off": "izslēgts", + "Invalid settings": "Nederīgi iestatījumi", + "Month": "Mēnesis", + "Side": "Sānu", + "Reset": "Atiestatīt", + "Reset All": "Atiestatīt visu", + "Hours": "Stundas", + "Repeat": "Atkārtojiet", + "Enabled": "Ieslēgts", + "Settings": "Iestatījumi", + "Message": "Ziņa", + "Minutes": "Protokols", + "App Settings": "Lietotņu iestatījumi", + "System": "Sistēma", + "Locale": "Vietne", + "Theme": "Tēma", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Akumulatora saplacināšana - tas var aizņemt vairākas stundas.\nIlgi nospiediet pogu, lai atceltu", + "Select Clock": "Izvēlieties pulksteni", + "Set Time": "Iestatītais laiks", + "Vibrate": "Vibrēt", + "Reset all widgets": "Visu logrīku atiestatīšana", + "Hour": "Stunda", + "Left": "Kreisā", + "TIMER": "TIMER", + "Year": "Gads", + "on": "vietnē", + "Alerts": "Brīdinājumi", + "Delete": "Dzēst", + "Whitelist": "Baltais saraksts", + "Messages": "Ziņojumi", + "Disable": "Atslēgt", + "Hide": "Paslēpt", + "Show": "Rādīt", + "On": "Uz", + "Factory Reset": "Rūpnīcas atiestatīšana", + "Error in settings": "Kļūda iestatījumos", + "Ok": "Labi", + "Yes": "Jā", + "No": "Nē", + "Back": "Atpakaļ", + "Off": "Izslēgts" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/nl_NL.json b/lang/nl_NL.json index a04e46928..0a39fefb2 100644 --- a/lang/nl_NL.json +++ b/lang/nl_NL.json @@ -1,21 +1,173 @@ { - "//":"Dutch language translations", - "GLOBAL": { - "//":"Translations that apply for all apps", - "Alarms" : "Alarmen", - "Hours" : "Uren", - "Minutes" : "Minuten", - "Enabled" : "Geactiveerd", - "New Alarm" : "Nieuw alarm", - "Save" : "Opslaan", - "Back" : "Terug", - "Repeat" : "Herhalen", - "Delete" : "Verwijderen", - "ALARM!" : "ALARV.", - "Sleep" : "Stand-by" - }, - "alarm": { - "//":"App-specific overrides", - "rpt" : "herhalen" - } -} + "//": "Dutch language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarms": "Alarmen", + "Hours": "Uren", + "Minutes": "Minuten", + "Enabled": "Geactiveerd", + "New Alarm": "Nieuw alarm", + "Save": "Opslaan", + "Back": "Terug", + "Repeat": "Herhalen", + "Delete": "Verwijderen", + "ALARM!": "ALARV.", + "Sleep": "Stand-by", + "New Timer": "Nieuwe Timer", + "(repeat)": "(herhaling)", + "music": "muziek", + "week": "week", + "Auto snooze": "Auto snooze", + "Keep Msgs": "Houd Msgs", + "circle count": "cirkeltelling", + "Heartrate": "Hartslag", + "weather circle": "weercirkel", + "circle 1": "cirkel 1", + "show widgets": "widgets tonen", + "circle 4": "cirkel 4", + "maximum": "maximum", + "circle 3": "cirkel 3", + "circle 2": "cirkel 2", + "minimum": "minimum", + "valid period": "geldige periode", + "heartrate": "hartslag", + "battery warn": "batterijwaarschuwing", + "data": "gegevens", + "step length": "staplengte", + "min. confidence": "min. vertrouwen", + "colorize icon": "pictogram inkleuren", + "distance goal": "afstandsdoel", + "Circle": "Cirkel", + "TAP right top/bottom": "TAP rechts boven/onder", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "Are you sure": "Weet je het zeker?", + "Font": "Lettertype", + "App Source\nNot found": "App Bron\nNiet gevonden", + "Launcher Settings": "Launcher Instellingen", + "Yes\ndefinitely": "Ja\nzeker", + "STEPS": "STAPPEN", + "Show clocks": "Toon klokken", + "Record Run": "Record run", + "No Messages": "Geen berichten.", + "View Message": "Bekijk bericht", + "Piezo": "Piëzo", + "BTNs 1:startlap 2:exit 3:reset": "BTN's 1:startlap 2:exit 3:reset", + "Vector font size": "Vector lettergrootte", + "Mark Unread": "Markeer ongelezen", + "Delete all messages": "Alle berichten verwijderen", + "LCD": "LCD", + "Utils": "Utils", + "Bluetooth": "Bluetooth", + "Delete All Messages": "Alle berichten verwijderen", + "Unread timer": "Ongelezen timer", + "Make Connectable": "Maak Verbindbaar", + "Quiet Mode": "Rustige modus", + "BLE": "BLE", + "Dark BW": "Donker BW", + "Apps": "Apps", + "Programmable": "Programmeerbaar", + "Vibration": "Trilling", + "HID": "HID", + "Foreground 2": "Voorgrond 2", + "Passkey BETA": "Passkey BETA", + "Background": "Achtergrond", + "Light BW": "Licht BW", + "Customize": "Aanpassen", + "Background 2": "Achtergrond 2", + "Highlight FG": "Markeer FG", + "Highlight BG": "Markeer BG", + "Foreground": "Voorgrond", + "LCD Timeout": "LCD Timeout", + "LCD Brightness": "LCD-helderheid", + "Remove": "Verwijder", + "Add Device": "Apparaat toevoegen", + "Connect device\nto add to\nwhitelist": "Apparaat aansluiten\ntoe te voegen aan\nwhitelist", + "Wake on Twist": "Wake on Twist", + "Wake on BTN2": "Wake op BTN2", + "Wake on BTN1": "Wake op BTN1", + "Wake on FaceUp": "Wakker worden op FaceUp", + "Log": "Log", + "Debug Info": "Debug info", + "Wake on BTN3": "Wake op BTN3", + "Flatten Battery": "Batterij plat maken", + "Rewrite Settings": "Instellingen herschrijven", + "Compact Storage": "Compacte opslag", + "Utilities": "Nutsbedrijven", + "Clock Style": "Klok Stijl", + "Time Zone": "Tijdzone", + "Twist Timeout": "Time-out draaien", + "Twist Max Y": "Twist Max Y", + "Twist Threshold": "Twist Drempel", + "Wake on Touch": "Wakker worden bij aanraking", + "Compacting...\nTakes approx\n1 minute": "Verdichten...\nDuurt ongeveer\n1 minuut", + "Reset to Defaults": "Terugzetten op standaardwaarden", + "No Clocks Found": "Geen klokken gevonden", + "Month": "Maand", + "Minute": "Minuutje", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Batterij leegmaken - dit kan uren duren.\nDruk lang op de knop om te annuleren", + "Sleep Phase Alarm": "Slaapfase alarm", + "Second": "Tweede", + "Turn Off": "Zet uit.", + "Hour": "Uur", + "Storage": "Opslag", + "Date": "Datum", + "Reset Settings": "Reset Instellingen", + "This will remove everything": "Dit zal alles verwijderen", + "Connectable": "Aansluitbaar", + "App Settings": "App-instellingen", + "No app has settings": "Geen app heeft instellingen", + "Stay Connectable": "Blijf verbonden", + "on": "op", + "Sort Order": "Sorteer volgorde", + "Widgets": "Widgets", + "Invalid settings": "Ongeldige instellingen", + "Reset All": "Alles resetten", + "Reset all widgets": "Reset alle widgets", + "OFF": "UIT", + "Left": "Links", + "Right": "Rechts", + "Side": "Zijde", + "TIMER": "TIMER", + "Alarm": "Alarm", + "goal": "doel", + "Reset": "Reset", + "Beep": "Beep", + "System": "Systeem", + "Locale": "Locale", + "Vibrate": "Trillen", + "Message": "Bericht", + "Alerts": "Waarschuwingen", + "Select Clock": "Selecteer Klok", + "Timer": "Timer", + "ALARM": "ALARM", + "Factory Reset": "Fabrieks reset", + "Hide": "Verberg", + "Messages": "Berichten", + "Error in settings": "Fout in instellingen", + "BACK": "ACHTER", + "Whitelist": "Whitelist", + "Set Time": "Tijd instellen", + "Disable": "Uitschakelen", + "Connected": "Aangesloten", + "On": "Op", + "Show": "Toon", + "Ok": "Ok", + "No": "Geen", + "Settings": "Instellingen", + "Steps": "Stappen", + "steps": "stappen", + "back": "terug", + "Year": "Jaar", + "Yes": "Ja", + "Loading": "Laden", + "Music": "Muziek", + "color": "kleur", + "off": "van", + "Off": "Uit", + "Theme": "Thema" + }, + "alarm": { + "//": "App-specific overrides", + "rpt": "herhalen" + } +} \ No newline at end of file diff --git a/lang/pl_PL.json b/lang/pl_PL.json new file mode 100644 index 000000000..b83d72600 --- /dev/null +++ b/lang/pl_PL.json @@ -0,0 +1,163 @@ +{ + "//": "Polish language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "New Alarm": "Nowy Alarm", + "(repeat)": "(powtórzenie)", + "Connected": "Podłączony", + "Timer": "Timer", + "Alarm": "Alarm", + "New Timer": "Nowy zegar", + "Sleep": "Sen", + "Save": "Zapisz", + "circle 1": "krąg 1", + "circle 3": "krąg 3", + "circle count": "liczenie okręgów", + "week": "tydzień", + "circle 2": "krąg 2", + "Keep Msgs": "Keep Msgs", + "weather circle": "koło klimatyczne", + "circle 4": "krąg 4", + "heartrate": "częstość akcji serca", + "Heartrate": "Heartrate", + "maximum": "maksimum", + "min. confidence": "min. pewność siebie", + "valid period": "okres ważności", + "distance goal": "cel odległościowy", + "Circle": "Koło", + "step length": "długość kroku", + "Steps": "Kroki", + "show widgets": "wyświetlać widżety", + "steps": "kroki", + "battery warn": "ostrzeżenie o akumulatorze", + "minimum": "minimum", + "data": "dane", + "color": "kolor", + "goal": "bramka", + "Auto snooze": "Automatyczna drzemka", + "TAP right top/bottom": "TAP prawy górny/dolny", + "Font": "Czcionka", + "Launcher Settings": "Ustawienia programu uruchamiającego", + "Mark Unread": "Zaznacz nieprzeczytane", + "Loading": "Ładowanie", + "Vector font size": "Rozmiar czcionki wektorowej", + "Show clocks": "Pokaż zegary", + "App Source\nNot found": "Źródło aplikacji\nNie znaleziono", + "colorize icon": "ubarwiać ikonę", + "Delete all messages": "Usuń wszystkie wiadomości", + "No Messages": "Brak komunikatów", + "Delete All Messages": "Usuń wszystkie wiadomości", + "Are you sure": "Czy jesteś pewien, że", + "View Message": "Wyświetl wiadomość", + "Music": "Muzyka", + "Record Run": "Rekordowy bieg", + "Bluetooth": "Bluetooth", + "Unread timer": "Nieprzeczytany zegar", + "Quiet Mode": "Tryb cichy", + "Make Connectable": "Spraw, aby można było się połączyć", + "Utils": "Narzędzia", + "Beep": "Beep", + "Apps": "Aplikacje", + "Piezo": "Piezo", + "BLE": "BLE", + "LCD": "LCD", + "Vibration": "Wibracje", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: WYJŚCIE", + "Foreground": "Foreground", + "Light BW": "Światło BW", + "HID": "HID", + "Dark BW": "Ciemna BW", + "Customize": "Dostosuj", + "Passkey BETA": "Passkey BETA", + "Background": "Tło", + "Background 2": "Tło 2", + "Highlight BG": "Podświetlenie BG", + "Foreground 2": "Nowa wiedza 2", + "Highlight FG": "Highlight FG", + "LCD Brightness": "Jasność LCD", + "Wake on Touch": "Wake on Touch", + "LCD Timeout": "LCD Timeout", + "Remove": "Usuń", + "Wake on Twist": "Wake on Twist", + "Wake on BTN3": "Wake na BTN3", + "Wake on BTN2": "Wake na BTN2", + "Connect device\nto add to\nwhitelist": "Podłącz urządzenie\ndodać do\nwhitelist", + "Wake on BTN1": "Wake na BTN1", + "Add Device": "Dodaj urządzenie", + "Programmable": "Programowalna strona", + "Wake on FaceUp": "Wake on FaceUp", + "Clock Style": "Styl zegara", + "Twist Threshold": "Próg skrętu", + "Time Zone": "Strefa czasowa", + "Twist Max Y": "Twist Max Y", + "Twist Timeout": "Twist Timeout", + "Utilities": "Narzędzia", + "Debug Info": "Debug Info", + "This will remove everything": "To spowoduje usunięcie wszystkiego", + "Compact Storage": "Kompaktowe przechowywanie", + "Flatten Battery": "Spłaszcz baterię", + "Log": "Dziennik Ustaw", + "Rewrite Settings": "Ustawienia przepisywania", + "Storage": "Przechowywanie", + "Reset Settings": "Resetuj ustawienia", + "Turn Off": "Wyłączyć", + "Minute": "Minuta", + "Stay Connectable": "Pozostań w kontakcie", + "Date": "Data", + "App Settings": "Ustawienia aplikacji", + "No app has settings": "Żadna aplikacja nie ma ustawień", + "Connectable": "Możliwość podłączenia", + "Year": "Rok", + "Second": "Drugi", + "No Clocks Found": "Nie znaleziono zegarów", + "Hour": "Godzina", + "Reset to Defaults": "Resetuj do ustawień domyślnych", + "Compacting...\nTakes approx\n1 minute": "Zagęszczanie...\nTrwa ok.\n1 minuta", + "Reset all widgets": "Wyzeruj wszystkie widżety", + "Right": "Prawo", + "Side": "Strona", + "TIMER": "TIMER", + "Sort Order": "Kolejność sortowania", + "Reset": "Reset", + "Invalid settings": "Nieprawidłowe ustawienia", + "Month": "Miesiąc", + "Widgets": "Widżety", + "Left": "Lewa", + "on": "na stronie", + "Delete": "Usuń", + "Hours": "Godziny", + "ALARM": "ALARM", + "Message": "Wiadomość", + "off": "poza", + "Reset All": "Resetuj wszystko", + "Minutes": "Protokół", + "Repeat": "Powtórz", + "Enabled": "Włączone", + "Vibrate": "Vibrate", + "Whitelist": "Whitelist", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Rozładowanie baterii - może to trwać godzinami.\nNaciśnij długo przycisk, aby anulować", + "Select Clock": "Wybierz zegar", + "Theme": "Temat", + "Locale": "Locale", + "Error in settings": "Błąd w ustawieniach", + "Disable": "Wyłącz", + "Settings": "Ustawienia", + "On": "Na stronie", + "Hide": "Ukryj", + "Messages": "Wiadomości", + "Factory Reset": "Reset fabryczny", + "System": "System", + "Alerts": "Wpisy", + "Set Time": "Ustawianie czasu", + "Ok": "Ok", + "Yes": "Tak", + "Show": "Pokaż", + "No": "Nie", + "Back": "Powrót", + "Off": "Poza" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/pt_PT.json b/lang/pt_PT.json new file mode 100644 index 000000000..837f7dab7 --- /dev/null +++ b/lang/pt_PT.json @@ -0,0 +1,167 @@ +{ + "//": "Portuguese language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "New Timer": "Novo Temporizador", + "New Alarm": "Novo Alarme", + "Auto snooze": "Soneca automática", + "week": "semana", + "circle 3": "círculo 3", + "(repeat)": "(repetir)", + "Save": "Salvar", + "Keep Msgs": "Manter Msgs", + "music": "música", + "circle 4": "círculo 4", + "circle 2": "círculo 2", + "circle count": "contagem em círculo", + "circle 1": "círculo 1", + "battery warn": "aviso de bateria", + "show widgets": "widgets de exposição", + "data": "dados", + "heartrate": "banda funerária", + "distance goal": "golo da distância", + "Circle": "Círculo", + "colorize icon": "ícone colorir", + "min. confidence": "min. confiança", + "minimum": "mínimo", + "maximum": "máximo", + "Heartrate": "Banda cardíaca", + "weather circle": "círculo meteorológico", + "step length": "comprimento do passo", + "valid period": "período válido", + "TAP right top/bottom": "TAP superior/inferior direita", + "Vector font size": "Tamanho de letra vectorial", + "Yes\ndefinitely": "Sim\ndefinitivamente", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "STEPS": "ETAPAS", + "Font": "Fonte", + "Show clocks": "Mostrar relógios", + "App Source\nNot found": "Fonte do aplicativo\nNão encontrado", + "Mark Unread": "Marcar como não lido", + "View Message": "Ver Mensagem", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: SAÍDA", + "Launcher Settings": "Configurações do lançador", + "Delete All Messages": "Apagar todas as mensagens", + "Delete all messages": "Apagar todas as mensagens", + "Utils": "Utils", + "LCD": "LCD", + "Apps": "Apps", + "Record Run": "Record Run", + "No Messages": "Sem Mensagens", + "Unread timer": "Temporizador não lido", + "Are you sure": "Tens a certeza", + "Make Connectable": "Tornar Conectável", + "Piezo": "Piezo", + "Bluetooth": "Bluetooth", + "BLE": "BLE", + "Programmable": "Programável", + "Vibration": "Vibração", + "Quiet Mode": "Modo Silencioso", + "Foreground": "Primeiro plano", + "Passkey BETA": "Passkey BETA", + "HID": "HID", + "Light BW": "BW Leve", + "Foreground 2": "Primeiro plano 2", + "Dark BW": "BW Escuro", + "Background": "Antecedentes", + "Highlight FG": "Destaque FG", + "Customize": "Personalizar", + "Background 2": "Antecedentes 2", + "Wake on BTN3": "Acorde no BTN3", + "Wake on BTN2": "Acorde no BTN2", + "Highlight BG": "Destaque BG", + "LCD Timeout": "Tempo limite do LCD", + "Wake on FaceUp": "Acorde no FaceUp", + "Wake on BTN1": "Acorde no BTN1", + "Wake on Twist": "Acorde na Twist", + "Wake on Touch": "Acorde ao Toque", + "Connect device\nto add to\nwhitelist": "Ligar dispositivo\npara adicionar a\nlista branca", + "Remove": "Remover", + "Add Device": "Adicionar dispositivo", + "LCD Brightness": "Luminosidade do LCD", + "Twist Max Y": "Torcer Max Y", + "Utilities": "Utilidades", + "Twist Threshold": "Limiar de Torção", + "Time Zone": "Fuso horário", + "Twist Timeout": "Twist Timeout", + "Clock Style": "Estilo Relógio", + "Debug Info": "Informação de Depuração", + "Log": "Diário de Bordo", + "Storage": "Armazenamento", + "Rewrite Settings": "Re-escrever configurações", + "Compacting...\nTakes approx\n1 minute": "A compactação...\nLeva aproximadamente\n1 minuto", + "Flatten Battery": "Bateria achatada", + "Reset Settings": "Redefinir configurações", + "Compact Storage": "Armazenamento compacto", + "Stay Connectable": "Fique Conectável", + "Turn Off": "Desligar", + "Connectable": "Conectável", + "This will remove everything": "Isto irá remover tudo", + "Date": "Data", + "Month": "Mês", + "Second": "Segundo", + "Minute": "Ata", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Bateria plana - isto pode demorar horas.\nBotão de pressão prolongada para cancelar", + "Reset to Defaults": "Redefinir para Padrões", + "Hour": "Hora", + "No Clocks Found": "Não foram encontrados relógios", + "Right": "Certo", + "No app has settings": "Nenhum aplicativo tem configurações", + "App Settings": "Configurações do aplicativo", + "OFF": "DESLIGADO", + "Side": "Lado", + "Left": "Esquerda", + "Sort Order": "Ordem de classificação", + "Widgets": "Widgets", + "Invalid settings": "Configurações inválidas", + "Sleep Phase Alarm": "Alarme da Fase do Sono", + "Alarm": "Alarme", + "Minutes": "Acta", + "TIMER": "TIMER", + "Hours": "Horário", + "on": "em", + "Reset All": "Reinicializar tudo", + "Repeat": "Repita", + "Delete": "Eliminar", + "Enabled": "Habilitado", + "Reset all widgets": "Redefinir todos os widgets", + "Reset": "Reinicialização", + "goal": "meta", + "Message": "Mensagem", + "Beep": "Bip", + "Vibrate": "Vibrar", + "System": "Sistema", + "Alerts": "Alertas", + "Locale": "Localização", + "Set Time": "Tempo Definido", + "Whitelist": "Lista branca", + "Select Clock": "Selecione Relógio", + "BACK": "VOLTAR", + "Timer": "Temporizador", + "Error in settings": "Erro nas configurações", + "Disable": "Desabilitar", + "Factory Reset": "Reinicialização de Fábrica", + "Connected": "Conectado", + "ALARM": "ALARME", + "Sleep": "Dormir", + "Messages": "Mensagens", + "Hide": "Esconder", + "Show": "Mostrar", + "On": "Em", + "Ok": "Ok", + "No": "Não", + "Settings": "Configurações", + "steps": "passos", + "back": "voltar", + "Steps": "Passos", + "Year": "Ano", + "Yes": "Sim", + "Loading": "Carregamento", + "Music": "Música", + "color": "cor", + "off": "em", + "Off": "Fora", + "Theme": "Tema", + "Back": "Voltar" + } +} \ No newline at end of file diff --git a/lang/ro_RO.json b/lang/ro_RO.json new file mode 100644 index 000000000..78ed27579 --- /dev/null +++ b/lang/ro_RO.json @@ -0,0 +1,163 @@ +{ + "//": "Romanian language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "New Alarm": "Alarma nouă", + "New Timer": "Noul cronometru", + "(repeat)": "(repetă)", + "Save": "Salvați", + "Auto snooze": "Repaus automat", + "Timer": "Cronometru", + "Alarm": "Alarma", + "circle 2": "cercul 2", + "circle 1": "cercul 1", + "Sleep": "Somnul", + "week": "săptămâna", + "circle count": "număr de cercuri", + "Connected": "Conectat", + "steps": "etape", + "battery warn": "avertizare baterie", + "heartrate": "ritmul cardiac", + "show widgets": "arată widget-uri", + "Keep Msgs": "Păstrați Msgs", + "circle 4": "cercul 4", + "circle 3": "cercul 3", + "minimum": "minim", + "Heartrate": "Ritmul cardiac", + "min. confidence": "încredere minimă", + "distance goal": "obiectivul de distanță", + "Steps": "Pași", + "color": "culoare", + "Circle": "Cerc", + "step length": "lungimea pasului", + "data": "date", + "maximum": "maxim", + "valid period": "perioada de valabilitate", + "weather circle": "cercul meteorologic", + "goal": "obiectiv", + "App Source\nNot found": "Sursa aplicației\nNu a fost găsit", + "Vector font size": "Dimensiunea fontului vectorial", + "colorize icon": "colorați pictograma", + "Show clocks": "Arată ceasuri", + "Loading": "Încărcare", + "Launcher Settings": "Setări lansator", + "Font": "Font", + "TAP right top/bottom": "TAP dreapta sus/jos", + "View Message": "Vezi mesajul", + "LCD": "LCD", + "Beep": "Beep", + "Vibration": "Vibrații", + "Bluetooth": "Bluetooth", + "Utils": "Utils", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "BTNs 1:startlap 2:exit 3:reset": "BTN-uri 1:startlap 2:exit 3:reset", + "Piezo": "Piezoelectrice", + "Customize": "Personalizați", + "Delete all messages": "Ștergeți toate mesajele", + "Apps": "Aplicații", + "Are you sure": "Ești sigur că", + "Music": "Muzică", + "Record Run": "Record Run", + "Mark Unread": "Marcați Unread", + "Foreground": "Prim-plan", + "Foreground 2": "Prim-plan 2", + "Background": "Fond", + "Passkey BETA": "Passkey BETA", + "Light BW": "Lumină BW", + "Dark BW": "Dark BW", + "Make Connectable": "Asigurați conectabilitatea", + "HID": "HID", + "Delete All Messages": "Ștergeți toate mesajele", + "No Messages": "Nu există mesaje", + "Unread timer": "Cronometru necitit", + "Quiet Mode": "Modul silențios", + "Programmable": "Programabil", + "BLE": "BLE", + "Highlight BG": "Evidențiați BG", + "Background 2": "Context 2", + "Highlight FG": "Evidențiați FG", + "Remove": "Eliminați", + "Connect device\nto add to\nwhitelist": "Conectați dispozitivul\npentru a adăuga la\nlista albă", + "LCD Brightness": "Luminozitatea LCD", + "Wake on FaceUp": "Trezirea pe FaceUp", + "LCD Timeout": "Timeout LCD", + "Add Device": "Adăugați dispozitiv", + "Wake on Touch": "Trezire la atingere", + "Wake on BTN1": "Trezirea pe BTN1", + "Wake on BTN3": "Trezirea pe BTN3", + "Debug Info": "Informații de depanare", + "Log": "Jurnal", + "Clock Style": "Stilul ceasului", + "Utilities": "Utilități", + "Wake on Twist": "Trezirea pe Twist", + "Wake on BTN2": "Trezirea pe BTN2", + "Twist Threshold": "Pragul de răsucire", + "Time Zone": "Fusul orar", + "Twist Timeout": "Twist Timeout", + "Twist Max Y": "Twist Max Y", + "Minute": "Minute", + "Month": "Luna", + "Second": "Al doilea", + "Hour": "Ora", + "Flatten Battery": "Aplatizare baterie", + "Storage": "Depozitare", + "Compact Storage": "Depozitare compactă", + "Reset Settings": "Resetare setări", + "Rewrite Settings": "Resetare Setări de rescriere", + "Stay Connectable": "Rămâneți conectați", + "No Clocks Found": "Nu s-au găsit ceasuri", + "Turn Off": "Oprire", + "This will remove everything": "Acest lucru va elimina totul", + "App Settings": "Setări aplicație", + "Year": "Anul", + "Connectable": "Conectabil", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Baterie de aplatizare - acest lucru poate dura ore.\nApăsați lung butonul pentru a anula", + "Compacting...\nTakes approx\n1 minute": "Compactarea...\nDurează aproximativ\n1 minut", + "Reset to Defaults": "Resetare la valorile implicite", + "Reset": "Resetare", + "Widgets": "Widgeturi", + "Reset all widgets": "Resetați toate widget-urile", + "No app has settings": "Nici o aplicație nu are setări", + "Left": "Stânga", + "Side": "Lateral", + "Date": "Data", + "Sort Order": "Ordinea de sortare", + "Invalid settings": "Setări nevalabile", + "Right": "Dreapta", + "Reset All": "Resetați toate", + "on": "pe", + "TIMER": "TIMER", + "off": "off", + "Message": "Mesaj", + "Vibrate": "Vibrare", + "ALARM": "ALARMĂ", + "Delete": "Ștergeți", + "Repeat": "Repetați", + "Enabled": "Activat", + "Settings": "Setări", + "Minutes": "Proces-verbal", + "Hours": "Ore", + "Theme": "Tema", + "Messages": "Mesaje", + "Hide": "Ascundeți", + "Alerts": "Alerte", + "Error in settings": "Eroare în setări", + "System": "Sistem", + "Disable": "Dezactivați", + "Set Time": "Set Time", + "Factory Reset": "Resetare din fabrică", + "Yes": "Da", + "Select Clock": "Selectați ceasul", + "Whitelist": "Lista albă", + "Locale": "Locale", + "Ok": "Ok", + "Show": "Arată", + "On": "Pe", + "No": "Nu", + "Off": "Off", + "Back": "Înapoi" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/ru_RU.json b/lang/ru_RU.json new file mode 100644 index 000000000..6bdf906fe --- /dev/null +++ b/lang/ru_RU.json @@ -0,0 +1,167 @@ +{ + "//": "Russian language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "New Alarm": "Новая сигнализация", + "(repeat)": "(повтор)", + "New Timer": "Новый таймер", + "Auto snooze": "Автоматическая дозагрузка", + "circle 4": "круг 4", + "Save": "Сохранить", + "Keep Msgs": "Сохраняйте сообщения", + "week": "неделя", + "circle count": "счётчик окружностей", + "circle 2": "круг 2", + "music": "музыка", + "battery warn": "предупреждение о разряде батареи", + "circle 1": "круг 1", + "maximum": "максимальный", + "min. confidence": "мин. уверенность", + "heartrate": "частота сердечных сокращений", + "Circle": "Круг", + "minimum": "минимум", + "Heartrate": "Пульс", + "show widgets": "показывать виджеты", + "weather circle": "метеорологический круг", + "data": "данные", + "step length": "длина шага", + "valid period": "период действия", + "distance goal": "дальняя цель", + "circle 3": "круг 3", + "TAP right top/bottom": "TAP справа сверху/снизу", + "Delete all messages": "Удалить все сообщения", + "Mark Unread": "Отметить непрочитанным", + "Unread timer": "Непрочитанный таймер", + "Launcher Settings": "Настройки запуска", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "View Message": "Посмотреть сообщение", + "No Messages": "Нет сообщений", + "Are you sure": "Вы уверены", + "Vector font size": "Размер векторного шрифта", + "colorize icon": "раскрасить иконку", + "Yes\ndefinitely": "Да\nопределенно", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "App Source\nNot found": "Источник приложения\nНе найдено", + "STEPS": "СТЕПЕНИ", + "Font": "Шрифт", + "Show clocks": "Показать часы", + "Vibration": "Вибрация", + "Bluetooth": "Bluetooth", + "Make Connectable": "Сделать соединяемым", + "Apps": "Приложения", + "Quiet Mode": "Тихий режим", + "LCD": "ЖК-ДИСПЛЕЙ", + "Programmable": "Программируемый", + "Passkey BETA": "Passkey BETA", + "Record Run": "Рекордный пробег", + "Delete All Messages": "Удалить все сообщения", + "Utils": "Утилиты", + "Piezo": "Пьезо", + "Foreground": "Передний план", + "Background": "Справочная информация", + "Dark BW": "Темный BW", + "HID": "HID", + "BLE": "BLE", + "Light BW": "Светлый BW", + "Highlight FG": "Выделите FG", + "Foreground 2": "Передний план 2", + "Customize": "Настроить", + "Wake on BTN2": "Вейк на BTN2", + "Wake on BTN1": "Проснись на BTN1", + "Wake on BTN3": "Уэйк на BTN3", + "Add Device": "Добавить устройство", + "LCD Brightness": "Яркость ЖК-дисплея", + "Wake on FaceUp": "Проснуться на FaceUp", + "Storage": "Хранение", + "Wake on Twist": "Проснуться на твисте", + "Connect device\nto add to\nwhitelist": "Подключить устройство\nдля добавления в\nбелый список", + "Background 2": "Справочная информация 2", + "Remove": "Удалить", + "Highlight BG": "Выделение BG", + "LCD Timeout": "Тайм-аут ЖК-дисплея", + "Twist Timeout": "Тайм-аут скручивания", + "Twist Threshold": "Порог скручивания", + "Wake on Touch": "Пробуждение при касании", + "Twist Max Y": "Twist Max Y", + "Stay Connectable": "Оставайтесь на связи", + "This will remove everything": "Это удалит все", + "Turn Off": "Выключить", + "Hour": "Час", + "Minute": "Минута", + "Reset to Defaults": "Сброс настроек по умолчанию", + "No Clocks Found": "Часы не найдены", + "Log": "Журнал", + "Debug Info": "Отладочная информация", + "Utilities": "Утилиты", + "Compact Storage": "Компактное хранение", + "Reset Settings": "Сброс настроек", + "Compacting...\nTakes approx\n1 minute": "Уплотнение...\nЗанимает приблизительно\n1 минута", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Сплющивание батареи - это может занять несколько часов.\nДлительное нажатие кнопки для отмены", + "Connectable": "Подключаемый", + "Clock Style": "Часовой стиль", + "Time Zone": "Часовой пояс", + "Flatten Battery": "Расплющить батарею", + "Rewrite Settings": "Настройки перезаписи", + "Sort Order": "Порядок сортировки", + "Right": "Справа", + "Left": "Слева", + "Side": "Сторона", + "Hours": "Часы", + "on": "на сайте", + "Widgets": "Виджеты", + "TIMER": "ТАЙМЕР", + "Date": "Дата", + "Month": "Месяц", + "OFF": "OFF", + "Reset All": "Сбросить все", + "Alarm": "Сигнализация", + "Reset all widgets": "Сброс всех виджетов", + "Delete": "Удалить", + "Invalid settings": "Недопустимые настройки", + "Second": "Второй", + "Sleep Phase Alarm": "Сигнализация фазы сна", + "No app has settings": "Ни одно приложение не имеет настроек", + "App Settings": "Настройки приложения", + "Repeat": "Повторите", + "System": "Система", + "Minutes": "Протоколы", + "Enabled": "Включено", + "Reset": "Сброс", + "Vibrate": "Вибрация", + "Alerts": "Оповещения", + "Select Clock": "Выберите часы", + "Set Time": "Установленное время", + "Locale": "Местность", + "Beep": "Звуковой сигнал", + "goal": "гол", + "Message": "Сообщение", + "ALARM": "АЛАРМ", + "Disable": "Отключить", + "Factory Reset": "Заводской сброс", + "Sleep": "Сон", + "Whitelist": "Белый список", + "Timer": "Таймер", + "Error in settings": "Ошибка в настройках", + "BACK": "BACK", + "Messages": "Сообщения", + "Show": "Показать", + "Hide": "Скрыть", + "Connected": "Подключено", + "On": "На сайте", + "No": "Нет", + "Ok": "Хорошо", + "Settings": "Настройки", + "steps": "шаги", + "back": "назад", + "Year": "Год", + "Steps": "Шаги", + "Yes": "Да", + "Loading": "Загрузка", + "color": "цвет", + "Music": "Музыка", + "Off": "На сайте", + "off": "отключен", + "Theme": "Тема", + "Back": "Назад" + } +} \ No newline at end of file diff --git a/lang/sk_SK.json b/lang/sk_SK.json new file mode 100644 index 000000000..6d7de7398 --- /dev/null +++ b/lang/sk_SK.json @@ -0,0 +1,163 @@ +{ + "//": "Slovak language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "New Alarm": "Nový alarm", + "New Timer": "Nový časovač", + "(repeat)": "(opakovanie)", + "Alarm": "Alarm", + "Save": "Uložiť", + "week": "týždeň", + "circle count": "počet kruhov", + "Timer": "Časovač", + "Sleep": "Spánok", + "circle 1": "okruh 1", + "Connected": "Pripojené", + "Auto snooze": "Automatické odloženie", + "circle 4": "kruh 4", + "heartrate": "srdcová frekvencia", + "steps": "kroky", + "circle 2": "kruh 2", + "Keep Msgs": "Uchovávajte správy Msgs", + "goal": "cieľ", + "circle 3": "kruh 3", + "distance goal": "cieľ vzdialenosti", + "show widgets": "zobraziť widgety", + "maximum": "maximum", + "minimum": "minimálne", + "Circle": "Kruh", + "valid period": "obdobie platnosti", + "Steps": "Kroky", + "data": "údaje", + "min. confidence": "min. dôvera", + "battery warn": "upozornenie na batériu", + "Heartrate": "Srdcová frekvencia", + "weather circle": "kruh počasia", + "step length": "dĺžka kroku", + "colorize icon": "vyfarbenie ikony", + "color": "farba", + "TAP right top/bottom": "TAP vpravo hore/dole", + "App Source\nNot found": "Zdroj aplikácie\nNenájdené", + "Loading": "Načítavanie", + "Font": "Písmo", + "Unread timer": "Neprečítaný časovač", + "Music": "Hudba", + "Mark Unread": "Označiť neprečítané", + "View Message": "Zobraziť správu", + "Launcher Settings": "Nastavenia spúšťača", + "Delete All Messages": "Odstránenie všetkých správ", + "Vector font size": "Veľkosť vektorového písma", + "Delete all messages": "Odstránenie všetkých správ", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "Are you sure": "Ste si istý, že", + "Show clocks": "Zobraziť hodiny", + "No Messages": "Žiadne správy", + "Record Run": "Rekordný beh", + "Apps": "Aplikácie", + "Piezo": "Piezoelektrické zariadenie", + "LCD": "LCD", + "Programmable": "Programovateľné", + "Utils": "Utils", + "Foreground 2": "Popredie 2", + "HID": "HID", + "Vibration": "Vibrácie", + "Make Connectable": "Urobiť pripojiteľné", + "Bluetooth": "Bluetooth", + "Quiet Mode": "Tichý režim", + "Beep": "Pípnutie", + "Passkey BETA": "Passkey BETA", + "Dark BW": "Tmavá BW", + "Light BW": "Light BW", + "Foreground": "Prvé miesto", + "Customize": "Prispôsobenie stránky", + "Background": "Pozadie", + "BLE": "BLE", + "LCD Brightness": "Jas LCD displeja", + "LCD Timeout": "Časový limit LCD displeja", + "Add Device": "Pridať zariadenie", + "Connect device\nto add to\nwhitelist": "Pripojenie zariadenia\npridať do\nwhitelist", + "Remove": "Odstránenie stránky", + "Highlight FG": "Zvýraznenie FG", + "Wake on Touch": "Prebudenie na dotyk", + "Background 2": "Pozadie 2", + "Wake on BTN1": "Prebuďte sa na BTN1", + "Wake on BTN2": "Prebuďte sa na BTN2", + "Wake on BTN3": "Prebuďte sa na BTN3", + "Highlight BG": "Zvýraznenie BG", + "Wake on FaceUp": "Prebudiť sa na FaceUp", + "Wake on Twist": "Prebudiť sa na Twiste", + "Utilities": "Komunálne služby", + "Rewrite Settings": "Nastavenia prepísania", + "Log": "Prihlásiť sa", + "Debug Info": "Informácie o ladení", + "Storage": "Úložisko", + "Compact Storage": "Kompaktné úložisko", + "Twist Max Y": "Twist Max Y", + "Twist Timeout": "Twist Timeout", + "Time Zone": "Časové pásmo", + "Reset Settings": "Obnovenie nastavení", + "Clock Style": "Štýl hodín", + "Compacting...\nTakes approx\n1 minute": "Zhutňovanie...\nTrvá približne\n1 minúta", + "Twist Threshold": "Prahová hodnota Twist", + "Stay Connectable": "Zostaňte pripojení", + "Flatten Battery": "Sploštenie batérie", + "This will remove everything": "Tým sa odstráni všetko.", + "Connectable": "Pripojiteľné", + "Turn Off": "Vypnúť", + "Reset to Defaults": "Obnovenie predvolených nastavení", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Sploštenie batérie - môže trvať niekoľko hodín.\nDlhým stlačením tlačidla zrušíte", + "No Clocks Found": "Nenašli sa žiadne hodiny", + "Side": "Strana", + "Date": "Dátum", + "Second": "Druhý", + "Hour": "Hodina", + "Minute": "Minúta", + "Left": "Vľavo", + "Year": "Rok", + "App Settings": "Nastavenia aplikácie", + "Widgets": "Widgety", + "Month": "Mesiac", + "No app has settings": "Žiadna aplikácia nemá nastavenia", + "Invalid settings": "Neplatné nastavenia", + "Sort Order": "Poradie triedenia", + "Reset All": "Obnoviť všetky", + "Reset": "Obnovenie", + "TIMER": "ČASOVAČ", + "Right": "Vpravo", + "Reset all widgets": "Obnovenie všetkých widgetov", + "ALARM": "ALARM", + "Minutes": "Zápisnica", + "Delete": "Odstrániť", + "off": "mimo", + "on": "na stránke .", + "Repeat": "Opakujte", + "System": "Systém", + "Enabled": "Povolené", + "Vibrate": "Vibrovať", + "Hours": "Hodiny", + "Settings": "Nastavenia", + "Select Clock": "Vybrať hodiny", + "Alerts": "Upozornenia", + "Message": "Správa", + "Theme": "Téma", + "Set Time": "Nastavený čas", + "Locale": "Lokalita", + "Disable": "Zakázať", + "Messages": "Správy", + "Error in settings": "Chyba v nastaveniach", + "Hide": "Skryť", + "Show": "Zobraziť", + "On": "Na stránke", + "Whitelist": "Biela listina", + "Yes": "Áno", + "Ok": "Ok", + "Factory Reset": "Obnovenie továrenského nastavenia", + "No": "Nie", + "Off": "Vypnuté", + "Back": "Späť" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/sl_SL.json b/lang/sl_SL.json new file mode 100644 index 000000000..bcf873bdd --- /dev/null +++ b/lang/sl_SL.json @@ -0,0 +1,163 @@ +{ + "//": "Slovenian language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarm": "Alarm", + "(repeat)": "(ponovitev)", + "New Timer": "Nov časovnik", + "New Alarm": "Nov alarm", + "Timer": "Časomer", + "Save": "Shrani", + "Connected": "Povezano", + "Keep Msgs": "Hranite sporočila Msgs", + "circle 4": "krog 4", + "circle 3": "krog 3", + "Auto snooze": "Samodejni dremež", + "circle 1": "krog 1", + "week": "teden", + "circle 2": "krog 2", + "Sleep": "Spanje", + "circle count": "štetje krogov", + "steps": "koraki", + "show widgets": "prikaži gradnike", + "heartrate": "srčni utrip", + "valid period": "veljavno obdobje", + "maximum": "največ", + "battery warn": "opozorilo o bateriji", + "weather circle": "vremenski krog", + "data": "podatki", + "goal": "cilj", + "step length": "dolžina koraka", + "minimum": "najmanjši", + "min. confidence": "min. zaupanje", + "Heartrate": "Srčni utrip", + "distance goal": "ciljna razdalja", + "Steps": "Koraki", + "color": "barva", + "colorize icon": "obarvanje ikone", + "App Source\nNot found": "Vir aplikacije\nNi najden", + "Show clocks": "Prikaži ure", + "TAP right top/bottom": "TAP desno zgoraj/spodaj", + "View Message": "Ogled sporočila", + "Circle": "Krog", + "Launcher Settings": "Nastavitve zaganjalnika", + "Vector font size": "Velikost vektorske pisave", + "Font": "Pisava", + "Loading": "Nalaganje", + "Delete all messages": "Brisanje vseh sporočil", + "No Messages": "Brez sporočil", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "Are you sure": "Ste prepričani, da", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "Mark Unread": "Označi neprebrano", + "Utils": "Utils", + "Record Run": "Rekordna vožnja", + "Delete All Messages": "Brisanje vseh sporočil", + "Unread timer": "Neprebrani časovnik", + "Music": "Glasba", + "LCD": "LCD", + "Apps": "Aplikacije", + "Bluetooth": "Bluetooth", + "Dark BW": "Temna BW", + "Vibration": "Vibracije", + "Quiet Mode": "Tihi način", + "Beep": "Beep", + "Passkey BETA": "Passkey BETA", + "Piezo": "Piezo", + "HID": "HID", + "Make Connectable": "Povežite se", + "BLE": "BLE", + "Programmable": "Programirljiv", + "Light BW": "Light BW", + "Background": "Ozadje", + "Customize": "Prilagodite", + "Background 2": "Ozadje 2", + "LCD Brightness": "Svetlost LCD-ja", + "Wake on BTN2": "Zbudi se na BTN2", + "Wake on BTN1": "Zbudite se na BTN1", + "LCD Timeout": "Časovna omejitev LCD", + "Twist Max Y": "Twist Max Y", + "Wake on Twist": "Prebudite se na Twist", + "Twist Threshold": "Prag zasuka", + "Foreground 2": "V ospredju 2", + "Foreground": "Novo okolje", + "Remove": "Odstranite", + "Time Zone": "Časovni pas", + "Wake on BTN3": "Wake na BTN3", + "Highlight FG": "Poudarite FG", + "Wake on Touch": "Zbujanje na dotik", + "Clock Style": "Stil ure", + "Highlight BG": "Poudarite BG", + "Add Device": "Dodajanje naprave", + "Connect device\nto add to\nwhitelist": "Povežite napravo\nza dodajanje v\nbeli seznam", + "Utilities": "Storitve", + "Wake on FaceUp": "Prebudite se v aplikaciji FaceUp", + "Compact Storage": "Kompaktno shranjevanje", + "Log": "Dnevnik", + "Debug Info": "Informacije o odpravljanju napak", + "Turn Off": "Izklopite", + "Flatten Battery": "Sploščena baterija", + "Reset to Defaults": "Ponastavitev na privzete nastavitve", + "Reset Settings": "Ponastavitev nastavitev", + "Twist Timeout": "Twist Timeout", + "This will remove everything": "To bo odstranilo vse", + "Rewrite Settings": "Nastavitve prepisovanja", + "Storage": "Shranjevanje", + "Compacting...\nTakes approx\n1 minute": "Zgoščevanje...\nVzame približno\n1 minuta", + "No Clocks Found": "Ure niso bile najdene", + "Stay Connectable": "Ostanite povezljivi", + "Minute": "Minuta", + "Connectable": "Povezljivost", + "Hour": "Ura", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Ploščati baterijo - to lahko traja več ur.\nDolgo pritisnite gumb za preklic", + "Second": "Drugi", + "Month": "Mesec", + "Date": "Datum", + "ALARM": "ALARM", + "Reset all widgets": "Ponastavitev vseh gradnikov", + "Reset All": "Ponastavi vse", + "TIMER": "TIMER", + "Widgets": "Pripomočki", + "Hours": "Ure", + "Minutes": "Zapisnik", + "Year": "Leto", + "No app has settings": "Nobena aplikacija nima nastavitev", + "App Settings": "Nastavitve aplikacije", + "Repeat": "Ponovite", + "Invalid settings": "Neveljavne nastavitve", + "Enabled": "Omogočeno", + "Reset": "Ponastavitev", + "off": "izklop", + "Side": "Stran", + "Sort Order": "Vrstni red", + "Left": "Leva stran", + "Right": "Desno", + "on": "na spletni strani .", + "Theme": "Tema", + "Locale": "Lokacija", + "Alerts": "Opozorila", + "Select Clock": "Izberite uro", + "System": "Sistem", + "Settings": "Nastavitve", + "Set Time": "Čas nastavitve", + "Whitelist": "Bela lista", + "Message": "Sporočilo", + "Vibrate": "Vibriranje", + "Delete": "Izbriši", + "Error in settings": "Napaka v nastavitvah", + "Messages": "Sporočila", + "Disable": "Onemogočite", + "Show": "Prikaži", + "Ok": "Ok", + "On": "Na spletni strani", + "Hide": "Skrij", + "Factory Reset": "Ponastavitev tovarniške nastavitve", + "Yes": "Da", + "No": "Ne", + "Off": "Izklopljeno", + "Back": "Nazaj" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/sv_SE.json b/lang/sv_SE.json index 3a006c2bf..6b35f5cdf 100644 --- a/lang/sv_SE.json +++ b/lang/sv_SE.json @@ -1,21 +1,173 @@ { - "//":"Swedish language translations", - "GLOBAL": { - "//":"Translations that apply for all apps", - "Alarms" : "Larm", - "Hours" : "Timmar", - "Minutes" : "Minuter", - "Enabled" : "Aktiverad", - "New Alarm" : "Ny alarm", - "Save" : "Spara", - "Back" : "Tillbaka", - "Repeat" : "Upprepning", - "Delete" : "Radera", - "ALARM!" : "ALURH!", - "Sleep" : "Sömn" - }, - "alarm": { - "//":"App-specific overrides", - "rpt" : "uppr." - } -} + "//": "Swedish language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarms": "Larm", + "Hours": "Timmar", + "Minutes": "Minuter", + "Enabled": "Aktiverad", + "New Alarm": "Ny alarm", + "Save": "Spara", + "Back": "Tillbaka", + "Repeat": "Upprepning", + "Delete": "Radera", + "ALARM!": "ALURH!", + "Sleep": "Sömn", + "circle 3": "cirkel 3", + "circle 1": "cirkel 1", + "music": "musik", + "week": "vecka", + "Keep Msgs": "Behåll meddelanden", + "Auto snooze": "Automatisk snooze", + "step length": "steglängd", + "Circle": "Cirkel", + "data": "uppgifter", + "colorize icon": "färglägga ikonen", + "min. confidence": "Min. förtroende", + "show widgets": "visa widgets", + "valid period": "giltig period", + "Heartrate": "Hjärtfrekvens", + "distance goal": "mål för distans", + "circle 4": "cirkel 4", + "circle count": "antal cirklar", + "minimum": "minimum", + "maximum": "maximal", + "New Timer": "Ny timer", + "battery warn": "batteri varning", + "heartrate": "hjärtfrekvens", + "circle 2": "cirkel 2", + "(repeat)": "(upprepning)", + "weather circle": "Vädercirkel", + "Delete All Messages": "Radera alla meddelanden", + "No Messages": "Inga meddelanden", + "Show clocks": "Visa klockor", + "STEPS": "STEG", + "TAP right top/bottom": "TAP höger upp/ner", + "View Message": "Visa meddelande", + "Mark Unread": "Markera oläst", + "Are you sure": "Är du säker på att", + "Delete all messages": "Radera alla meddelanden", + "Record Run": "Rekordkörning", + "Unread timer": "Oläst timer", + "Vibration": "Vibrationer", + "Utils": "Användaruppgifter", + "Quiet Mode": "Tyst läge", + "Passkey BETA": "Passkey BETA", + "Dark BW": "Mörk BW", + "BTNs 1:startlap 2:exit 3:reset": "BTN 1:startlap 2:exit 3:reset", + "start&lap/reset, BTN1: EXIT": "start&lap/återställning, BTN1: EXIT", + "BLE": "BLE", + "Programmable": "Programmerbar", + "Launcher Settings": "Inställningar för lanseringen", + "Vector font size": "Vektor teckensnittsstorlek", + "Font": "Typsnitt", + "Yes\ndefinitely": "Ja\ndefinitivt", + "App Source\nNot found": "App-källa\nEj funnen", + "Make Connectable": "Gör det möjligt att ansluta", + "HID": "HID", + "Bluetooth": "Bluetooth", + "Apps": "Appar", + "Piezo": "Piezo", + "LCD": "LCD", + "Foreground 2": "Förgrund 2", + "Light BW": "Ljus BW", + "Background": "Bakgrund", + "Remove": "Ta bort", + "Highlight BG": "Markera BG", + "Customize": "Anpassa", + "Highlight FG": "Highlight FG", + "Background 2": "Bakgrund 2", + "LCD Brightness": "Ljusstyrka på LCD-skärmen", + "Add Device": "Lägg till enhet", + "Wake on BTN1": "Vakna på BTN1", + "Wake on BTN2": "Vakna på BTN2", + "Twist Timeout": "Twist Timeout", + "Wake on Touch": "Vakna vid beröring", + "LCD Timeout": "LCD Timeout", + "Foreground": "Förgrund", + "Connect device\nto add to\nwhitelist": "Anslut enhet\nför att lägga till\nvitlista", + "Wake on FaceUp": "Vakna på FaceUp", + "Twist Threshold": "Tröskelvärde för vridning", + "Wake on BTN3": "Wake på BTN3", + "Clock Style": "Klockstil", + "Time Zone": "Tidszon", + "Twist Max Y": "Vridning Max Y", + "Stay Connectable": "Håll dig tillgänglig", + "This will remove everything": "Detta kommer att ta bort allt", + "Turn Off": "Stäng av", + "Connectable": "Anslutningsbar", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Platta batterier - detta kan ta flera timmar.\nTryck länge på knappen för att avbryta", + "Reset to Defaults": "Återställ till standardvärden", + "Utilities": "Verktyg", + "Flatten Battery": "Platta batterier", + "Debug Info": "Info om felsökning", + "Reset Settings": "Återställa inställningar", + "Wake on Twist": "Väckning på Twist", + "Compact Storage": "Kompakt förvaring", + "Log": "Logg", + "Rewrite Settings": "Omskrivning av inställningar", + "Compacting...\nTakes approx\n1 minute": "Komprimering...\nTar ca.\n1 minut", + "Storage": "Lagring", + "Second": "Andra", + "App Settings": "App-inställningar", + "Invalid settings": "Ogiltiga inställningar", + "Minute": "Protokoll", + "Sleep Phase Alarm": "Larm om sömnfas", + "No app has settings": "Ingen app har inställningar", + "Hour": "Timme", + "No Clocks Found": "Inga klockor hittades", + "Date": "Datum", + "Month": "Månad", + "Alarm": "Larm", + "Reset": "Återställ", + "Reset all widgets": "Återställ alla widgetar", + "TIMER": "TIMER", + "on": "på", + "OFF": "OFF", + "Side": "Sidan", + "Sort Order": "Sortering", + "Left": "Vänster", + "Right": "Höger", + "Reset All": "Återställ alla", + "Widgets": "Widgets", + "goal": "mål", + "Vibrate": "Vibrera", + "Message": "Meddelande", + "Beep": "Piper", + "Disable": "Inaktivera", + "Select Clock": "Välj klocka", + "Locale": "Lokalisering", + "Alerts": "Varningar", + "System": "System", + "Set Time": "Ställ in tid", + "Factory Reset": "Fabriksåterställning", + "Messages": "Meddelanden", + "Timer": "Timer", + "BACK": "TILLBAKA", + "Error in settings": "Fel i inställningarna", + "Whitelist": "Whitelist", + "ALARM": "ALARM", + "Hide": "Dölj", + "Connected": "Ansluten", + "Show": "Visa", + "On": "På", + "Ok": "Ok", + "No": "Ingen", + "Settings": "Inställningar", + "steps": "steg", + "back": "tillbaka", + "Steps": "Steg", + "Year": "År", + "Yes": "Ja", + "Loading": "Laddar", + "Music": "Musik", + "color": "färg", + "off": "off", + "Off": "Av", + "Theme": "Tema" + }, + "alarm": { + "//": "App-specific overrides", + "rpt": "uppr." + } +} \ No newline at end of file diff --git a/lang/tr_TR.json b/lang/tr_TR.json index c59bc7d6b..e153253df 100644 --- a/lang/tr_TR.json +++ b/lang/tr_TR.json @@ -1,21 +1,21 @@ { - "//":"Turkish language translations", - "GLOBAL": { - "//":"Translations that apply for all apps", - "Alarms" : "Alarmlar", - "Hours" : "Saat", - "Minutes" : "Dakika", - "Enabled" : "Etkinleştirildi", - "New Alarm" : "Yeni alarm", - "Save" : "Sakla", - "Back" : "Geriye", - "Repeat" : "Yineleme", - "Delete" : "Sil", - "ALARM!" : "ALARM!", - "Sleep" : "Uyku" - }, - "alarm": { - "//":"App-specific overrides", - "rpt" : "yineleme" - } -} + "//": "Turkish language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarms": "Alarmlar", + "Hours": "Saat", + "Minutes": "Dakika", + "Enabled": "Etkinleştirildi", + "New Alarm": "Yeni alarm", + "Save": "Sakla", + "Back": "Geriye", + "Repeat": "Yineleme", + "Delete": "Sil", + "ALARM!": "ALARM!", + "Sleep": "Uyku" + }, + "alarm": { + "//": "App-specific overrides", + "rpt": "yineleme" + } +} \ No newline at end of file diff --git a/lang/unicode-based/ja_JA.json b/lang/unicode-based/ja_JA.json new file mode 100644 index 000000000..2852fd9e3 --- /dev/null +++ b/lang/unicode-based/ja_JA.json @@ -0,0 +1,167 @@ +{ + "//": "Japanese language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "New Alarm": "新型アラーム", + "New Timer": "新型タイマー", + "Save": "保存", + "Keep Msgs": "Keep Msgs", + "circle count": "サークルカウント", + "(repeat)": "(繰り返し)", + "music": "音楽", + "Auto snooze": "オートスヌーズ", + "week": "ウィーク", + "circle 1": "サークル1", + "circle 3": "サークル3", + "circle 2": "サークル2", + "show widgets": "show widgets", + "heartrate": "心拍数", + "circle 4": "サークル4", + "battery warn": "バッテリー警告", + "valid period": "有効期間", + "maximum": "最大", + "weather circle": "ウェザーサークル", + "minimum": "ミニマム", + "step length": "ステップ長", + "distance goal": "距離目標", + "Circle": "サークル", + "min. confidence": "最低限の自信", + "colorize icon": "カラライズアイコン", + "Heartrate": "心拍数", + "data": "データ", + "Yes\ndefinitely": "はい。\n間違いなく", + "Launcher Settings": "ランチャー設定", + "TAP right top/bottom": "TAP右上/左下", + "Font": "フォント", + "Mark Unread": "マーク・アンリード", + "start&lap/reset, BTN1: EXIT": "スタート&ラップ&リセット、BTN1:EXIT", + "App Source\nNot found": "アプリソース\n見つからない", + "Show clocks": "時計の表示", + "STEPS": "ステップ", + "Vector font size": "ベクターのフォントサイズ", + "View Message": "メッセージを見る", + "Are you sure": "本当にいいの?", + "Bluetooth": "ブルートゥース", + "Unread timer": "未読のタイマー", + "Delete all messages": "すべてのメッセージの削除", + "No Messages": "メッセージなし", + "Record Run": "レコード・ラン", + "Apps": "アプリ", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "Delete All Messages": "全メッセージの削除", + "Vibration": "振動", + "Utils": "ユーティライゼーション", + "Piezo": "ピエゾ", + "BLE": "BLE", + "Make Connectable": "接続可能にする", + "HID": "HID", + "Light BW": "ライトBW", + "LCD": "LCD", + "Background": "背景", + "Foreground": "フォアグラウンド", + "Programmable": "プログラム可能", + "Customize": "カスタマイズ", + "Dark BW": "ダークBW", + "Background 2": "背景2", + "Quiet Mode": "クワイエットモード", + "Highlight FG": "ハイライトFG", + "Foreground 2": "フォアグラウンド2", + "Remove": "削除", + "Passkey BETA": "Passkey BETA", + "Add Device": "デバイスの追加", + "LCD Timeout": "LCDタイムアウト", + "Highlight BG": "ハイライトBG", + "LCD Brightness": "液晶ディスプレイの明るさ", + "Connect device\nto add to\nwhitelist": "接続機器\nに追加します。\nホワイトリスト", + "Wake on BTN3": "Wake on BTN3", + "Wake on BTN2": "Wake on BTN2", + "Time Zone": "タイムゾーン", + "Wake on Touch": "ウェイクオンタッチ", + "Twist Timeout": "ツイストタイムアウト", + "Wake on Twist": "ウェイクオンツイスト", + "Wake on BTN1": "Wake on BTN1", + "Log": "ログ", + "Wake on FaceUp": "Wake on FaceUp", + "Twist Max Y": "ツイストマックスY", + "Utilities": "ユーティリティー", + "Clock Style": "クロックスタイル", + "Rewrite Settings": "リライト設定", + "Flatten Battery": "バッテリーを平らにする", + "Debug Info": "デバッグ情報", + "Storage": "ストレージ", + "Reset Settings": "設定のリセット", + "Twist Threshold": "ツイスト・スレッショルド", + "Turn Off": "電源オフ", + "Compact Storage": "コンパクトなストレージ", + "Reset to Defaults": "初期設定へのリセット", + "Second": "セカンド", + "Compacting...\nTakes approx\n1 minute": "コンパクトにして...。\n所要時間約\n1分", + "Date": "日付", + "Minute": "分", + "Connectable": "接続可能", + "Stay Connectable": "Stay Connectable", + "Hour": "時間", + "No Clocks Found": "No Clock Found", + "App Settings": "アプリの設定", + "Flattening battery - this can take hours.\nLong-press button to cancel": "バッテリーのフラット化 - これには数時間かかります。\nボタンの長押しでキャンセル", + "Month": "月", + "OFF": "OFF", + "Right": "右", + "Widgets": "ウィジェット", + "Left": "左", + "Sort Order": "並び替え", + "Side": "サイド", + "No app has settings": "設定のないアプリ", + "Sleep Phase Alarm": "スリープフェーズアラーム", + "Invalid settings": "無効な設定", + "TIMER": "TIMER", + "Reset All": "すべてをリセット", + "This will remove everything": "これにより、すべてのものが削除されます。", + "Alarm": "アラーム", + "on": "で", + "Minutes": "分", + "Reset all widgets": "全ウィジェットのリセット", + "Hours": "時間", + "Enabled": "有効", + "Repeat": "リピート", + "Delete": "削除", + "Reset": "リセット", + "goal": "ゴール", + "Beep": "ビープ", + "Message": "メッセージ", + "System": "システム", + "Select Clock": "セレクトクロック", + "Locale": "ロケール", + "Vibrate": "振動", + "Alerts": "アラート", + "Whitelist": "ホワイトリスト", + "Set Time": "セット時間", + "Disable": "Disable", + "BACK": "BACK", + "ALARM": "ALARM", + "Timer": "タイマー", + "Error in settings": "設定のエラー", + "Factory Reset": "ファクトリーリセット", + "Sleep": "睡眠", + "Connected": "コネクテッド", + "Messages": "メッセージ", + "Hide": "隠す", + "Show": "ショー", + "On": "オン", + "Ok": "OK", + "No": "いいえ", + "Settings": "設定", + "steps": "ステップ", + "back": "バック", + "Steps": "ステップ", + "Year": "年", + "Yes": "はい。", + "Loading": "ローディング", + "Music": "音楽", + "color": "カラー", + "off": "オフ", + "Off": "オフ", + "Theme": "テーマ", + "Back": "バック" + } +} \ No newline at end of file diff --git a/lang/unicode-based/zh_ZH.json b/lang/unicode-based/zh_ZH.json new file mode 100644 index 000000000..4ff134b04 --- /dev/null +++ b/lang/unicode-based/zh_ZH.json @@ -0,0 +1,167 @@ +{ + "//": "Chinese language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "music": "音乐", + "distance goal": "距离目标", + "Save": "拯救", + "circle 3": "第3圈", + "Show clocks": "显示时钟", + "data": "数据", + "battery warn": "电池警告", + "heartrate": "心率", + "circle 2": "第2圈", + "circle 1": "第1圈", + "STEPS": "步骤", + "step length": "步长", + "New Timer": "新的计时器", + "colorize icon": "给图标着色", + "Auto snooze": "自动休眠", + "maximum": "最大限度", + "View Message": "查看留言", + "show widgets": "显示小工具", + "weather circle": "气象圈", + "Delete all messages": "删除所有信息", + "Launcher Settings": "启动器设置", + "Circle": "圆圈", + "No Messages": "没有消息", + "min. confidence": "最低限度的信心", + "circle count": "圈数", + "Keep Msgs": "保持信息畅通", + "(repeat)": "(重复)", + "App Source\nNot found": "应用程序来源\n未找到", + "Mark Unread": "标记未读", + "week": "周", + "Delete All Messages": "删除所有信息", + "New Alarm": "新警报", + "minimum": "最低限度", + "Heartrate": "心率", + "circle 4": "第4圈", + "Font": "字体", + "Vector font size": "矢量字体大小", + "Bluetooth": "蓝牙", + "Record Run": "记录运行", + "Are you sure": "你确定吗?", + "Unread timer": "未读计时器", + "Apps": "应用", + "start&lap/reset, BTN1: EXIT": "开始&lap/复位,BTN1:EXIT", + "TAP right top/bottom": "右侧顶部/底部的TAP", + "Yes\ndefinitely": "是的\n绝对", + "valid period": "有效期限", + "Utils": "充分利用", + "Customize": "定制", + "Quiet Mode": "静音模式", + "LCD": "液晶显示器", + "Programmable": "可编程", + "Light BW": "轻型BW", + "Vibration": "震动", + "Passkey BETA": "通行证 BETA", + "Make Connectable": "使之成为可连接的", + "Background 2": "背景2", + "Background": "背景介绍", + "HID": "氙气灯", + "Remove": "移除", + "Add Device": "添加设备", + "Highlight FG": "亮点FG", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "Highlight BG": "突出显示BG", + "Dark BW": "深色BW", + "Foreground 2": "前景2", + "Piezo": "压电式", + "Connect device\nto add to\nwhitelist": "连接设备\n来添加到\n白名单", + "LCD Brightness": "液晶显示器的亮度", + "LCD Timeout": "LCD超时", + "Wake on FaceUp": "在FaceUp上唤醒", + "Twist Timeout": "扭曲超时", + "Wake on BTN1": "在BTN1上唤醒", + "Wake on Twist": "在扭曲中醒来", + "Wake on Touch": "触摸时唤醒", + "Utilities": "公用事业", + "Twist Max Y": "扭转最大Y", + "Time Zone": "时区", + "Log": "纪录", + "Twist Threshold": "扭曲阈值", + "Wake on BTN3": "唤醒BTN3网站", + "Wake on BTN2": "在BTN2上唤醒", + "Debug Info": "调试信息", + "BLE": "BLE", + "Compact Storage": "紧凑型存储", + "Storage": "储存", + "Compacting...\nTakes approx\n1 minute": "压实...\n需要大约\n1分钟", + "Reset Settings": "重置设置", + "Clock Style": "钟表风格", + "Rewrite Settings": "重写设置", + "Flatten Battery": "扁平化电池", + "Foreground": "前景", + "Hour": "一小时", + "Reset to Defaults": "重置为默认值", + "Turn Off": "关掉", + "Connectable": "可连接", + "Stay Connectable": "保持联系", + "Minute": "分钟", + "Month": "月份", + "Flattening battery - this can take hours.\nLong-press button to cancel": "压扁电池 - 这可能需要几个小时。\n长按按钮可取消", + "Second": "第二次", + "This will remove everything": "这将删除一切", + "App Settings": "应用程序设置", + "Side": "侧面", + "No Clocks Found": "没有发现时钟", + "OFF": "关闭", + "Widgets": "小工具", + "Invalid settings": "无效的设置", + "Right": "对", + "No app has settings": "没有应用程序有设置", + "Left": "左边", + "Sleep Phase Alarm": "睡眠阶段报警", + "Sort Order": "排序顺序", + "Date": "日期", + "Reset all widgets": "重置所有小工具", + "on": "关于", + "Reset All": "全部重设", + "TIMER": "计时器", + "Hours": "小时", + "Alarm": "警报", + "Repeat": "重复进行", + "Reset": "复位", + "Minutes": "会议记录", + "Enabled": "已启用", + "goal": "目标", + "Beep": "哔哔声", + "Vibrate": "震动", + "Delete": "删除", + "Locale": "地区", + "System": "系统", + "Disable": "禁用", + "Select Clock": "选择时钟", + "Set Time": "设置时间", + "Alerts": "警报", + "Whitelist": "白名单", + "Error in settings": "设置中的错误", + "Factory Reset": "工厂重置", + "BACK": "返回", + "Timer": "计时器", + "Sleep": "睡眠", + "Messages": "留言", + "Hide": "隐藏", + "Connected": "已连接", + "ALARM": "警报", + "On": "在", + "Show": "显示", + "Ok": "好的", + "Message": "留言", + "steps": "步骤", + "No": "没有", + "Settings": "设置", + "back": "背面", + "Year": "年", + "Steps": "阶梯", + "Yes": "是", + "Loading": "负载", + "Music": "音乐", + "color": "颜色", + "off": "关闭", + "Off": "关闭", + "Theme": "主题", + "Back": "溯源" + } +} \ No newline at end of file diff --git a/loader.js b/loader.js index c6840cbb0..6b27736ae 100644 --- a/loader.js +++ b/loader.js @@ -179,6 +179,7 @@ window.addEventListener('load', (event) => { } catch(e) { console.error("lang/index.json Corrupted", e); } + languages = languages.filter( l=> l.disabled===undefined ); function reloadLanguage() { LANGUAGE = undefined; diff --git a/modules/Layout.js b/modules/Layout.js index fbd618524..134cc8103 100644 --- a/modules/Layout.js +++ b/modules/Layout.js @@ -164,7 +164,7 @@ function Layout(layout, options) { // Handler for touch events function touchHandler(l,e) { - if (l.type=="btn" && l.cb && e.x>=l.x && e.y>=l.y && e.x<=l.x+l.w && e.y<=l.y+l.h) { + if (l.cb && e.x>=l.x && e.y>=l.y && e.x<=l.x+l.w && e.y<=l.y+l.h) { if (e.type==2 && l.cbl) l.cbl(e); else if (l.cb) l.cb(e); } if (l.c) l.c.forEach(n => touchHandler(n,e));