modules/luci-base/src/po2lmo
modules/luci-base/src/jsmin
modules/luci-base/src/contrib/lemon
-modules/luci-base/src/plural_formula.c
-modules/luci-base/src/plural_formula.h
+modules/luci-base/src/ucode/plural_formula.c
+modules/luci-base/src/ucode/plural_formula.h
+modules/luci-compat/src/contrib/lemon
+modules/luci-compat/src/plural_formula.c
+modules/luci-compat/src/plural_formula.h
docs/jsapi/*
!docs/jsapi/README.md
--- /dev/null
+'use strict';
+
+'require view';
+'require form';
+
+return view.extend({
+ render: function(data) {
+ var m, s, o;
+
+ m = new form.Map('luci', _('Custom Commands'),
+ _('This page allows you to configure custom shell commands which can be easily invoked from the web interface.'));
+
+ s = m.section(form.GridSection, 'command');
+ s.nodescriptions = true;
+ s.anonymous = true;
+ s.addremove = true;
+
+ o = s.option(form.Value, 'name', _('Description'),
+ _('A short textual description of the configured command'));
+
+ o = s.option(form.Value, 'command', _('Command'), _('Command line to execute'));
+ o.textvalue = function(section_id) {
+ return E('code', [ this.cfgvalue(section_id) ]);
+ };
+
+ o = s.option(form.Flag, 'param', _('Custom arguments'),
+ _('Allow the user to provide additional command line arguments'));
+
+ o = s.option(form.Flag, 'public', _('Public access'),
+ _('Allow executing the command and downloading its output without prior authentication'));
+
+ return m.render();
+ }
+});
+++ /dev/null
--- Copyright 2012 Jo-Philipp Wich <jow@openwrt.org>
--- Licensed to the public under the Apache License 2.0.
-
-module("luci.controller.commands", package.seeall)
-
-function index()
- entry({"admin", "system", "commands"}, firstchild(), _("Custom Commands"), 80).acl_depends = { "luci-app-commands" }
- entry({"admin", "system", "commands", "dashboard"}, template("commands"), _("Dashboard"), 1)
- entry({"admin", "system", "commands", "config"}, cbi("commands"), _("Configure"), 2)
- entry({"admin", "system", "commands", "run"}, call("action_run"), nil, 3).leaf = true
- entry({"admin", "system", "commands", "download"}, call("action_download"), nil, 3).leaf = true
-
- entry({"command"}, call("action_public"), nil, 1).leaf = true
-end
-
---- Decode a given string into arguments following shell quoting rules
---- [[abc \def "foo\"bar" abc'def']] -> [[abc def]] [[foo"bar]] [[abcdef]]
-local function parse_args(str)
- local args = { }
-
- local function isspace(c)
- if c == 9 or c == 10 or c == 11 or c == 12 or c == 13 or c == 32 then
- return c
- end
- end
-
- local function isquote(c)
- if c == 34 or c == 39 or c == 96 then
- return c
- end
- end
-
- local function isescape(c)
- if c == 92 then
- return c
- end
- end
-
- local function ismeta(c)
- if c == 36 or c == 92 or c == 96 then
- return c
- end
- end
-
- --- Convert given table of byte values into a Lua string and append it to
- --- the "args" table. Segment byte value sequence into chunks of 256 values
- --- to not trip over the parameter limit for string.char()
- local function putstr(bytes)
- local chunks = { }
- local csz = 256
- local upk = unpack
- local chr = string.char
- local min = math.min
- local len = #bytes
- local off
-
- for off = 1, len, csz do
- chunks[#chunks+1] = chr(upk(bytes, off, min(off + csz - 1, len)))
- end
-
- args[#args+1] = table.concat(chunks)
- end
-
- --- Scan substring defined by the indexes [s, e] of the string "str",
- --- perform unquoting and de-escaping on the fly and store the result in
- --- a table of byte values which is passed to putstr()
- local function unquote(s, e)
- local off, esc, quote
- local res = { }
-
- for off = s, e do
- local byte = str:byte(off)
- local q = isquote(byte)
- local e = isescape(byte)
- local m = ismeta(byte)
-
- if e then
- esc = true
- elseif esc then
- if m then res[#res+1] = 92 end
- res[#res+1] = byte
- esc = false
- elseif q and quote and q == quote then
- quote = nil
- elseif q and not quote then
- quote = q
- else
- if m then res[#res+1] = 92 end
- res[#res+1] = byte
- end
- end
-
- putstr(res)
- end
-
- --- Find substring boundaries in "str". Ignore escaped or quoted
- --- whitespace, pass found start- and end-index for each substring
- --- to unquote()
- local off, esc, start, quote
- for off = 1, #str + 1 do
- local byte = str:byte(off)
- local q = isquote(byte)
- local s = isspace(byte) or (off > #str)
- local e = isescape(byte)
-
- if esc then
- esc = false
- elseif e then
- esc = true
- elseif q and quote and q == quote then
- quote = nil
- elseif q and not quote then
- start = start or off
- quote = q
- elseif s and not quote then
- if start then
- unquote(start, off - 1)
- start = nil
- end
- else
- start = start or off
- end
- end
-
- --- If the "quote" is still set we encountered an unfinished string
- if quote then
- unquote(start, #str)
- end
-
- return args
-end
-
-local function parse_cmdline(cmdid, args)
- local uci = require "luci.model.uci".cursor()
- if uci:get("luci", cmdid) == "command" then
- local cmd = uci:get_all("luci", cmdid)
- local argv = parse_args(cmd.command)
- local i, v
-
- if cmd.param == "1" and args then
- for i, v in ipairs(parse_args(luci.http.urldecode(args))) do
- argv[#argv+1] = v
- end
- end
-
- for i, v in ipairs(argv) do
- if v:match("[^%w%.%-i/|]") then
- argv[i] = '"%s"' % v:gsub('"', '\\"')
- end
- end
-
- return argv
- end
-end
-
-function execute_command(callback, ...)
- local fs = require "nixio.fs"
- local argv = parse_cmdline(...)
- if argv then
- local outfile = os.tmpname()
- local errfile = os.tmpname()
-
- local rv = os.execute(table.concat(argv, " ") .. " >%s 2>%s" %{ outfile, errfile })
- local stdout = fs.readfile(outfile, 1024 * 512) or ""
- local stderr = fs.readfile(errfile, 1024 * 512) or ""
-
- fs.unlink(outfile)
- fs.unlink(errfile)
-
- local binary = not not (stdout:match("[%z\1-\8\14-\31]"))
-
- callback({
- ok = true,
- command = table.concat(argv, " "),
- stdout = not binary and stdout,
- stderr = stderr,
- exitcode = rv,
- binary = binary
- })
- else
- callback({
- ok = false,
- code = 404,
- reason = "No such command"
- })
- end
-end
-
-function return_json(result)
- if result.ok then
- luci.http.prepare_content("application/json")
- luci.http.write_json(result)
- else
- luci.http.status(result.code, result.reason)
- end
-end
-
-function action_run(...)
- execute_command(return_json, ...)
-end
-
-function return_html(result)
- if result.ok then
- require("luci.template")
- luci.template.render("commands_public", {
- exitcode = result.exitcode,
- stdout = result.stdout,
- stderr = result.stderr
- })
- else
- luci.http.status(result.code, result.reason)
- end
-
-end
-
-function action_download(...)
- local fs = require "nixio.fs"
- local argv = parse_cmdline(...)
- if argv then
- local fd = io.popen(table.concat(argv, " ") .. " 2>/dev/null")
- if fd then
- local chunk = fd:read(4096) or ""
- local name
- if chunk:match("[%z\1-\8\14-\31]") then
- luci.http.header("Content-Disposition", "attachment; filename=%s"
- % fs.basename(argv[1]):gsub("%W+", ".") .. ".bin")
- luci.http.prepare_content("application/octet-stream")
- else
- luci.http.header("Content-Disposition", "attachment; filename=%s"
- % fs.basename(argv[1]):gsub("%W+", ".") .. ".txt")
- luci.http.prepare_content("text/plain")
- end
-
- while chunk do
- luci.http.write(chunk)
- chunk = fd:read(4096)
- end
-
- fd:close()
- else
- luci.http.status(500, "Failed to execute command")
- end
- else
- luci.http.status(404, "No such command")
- end
-end
-
-
-function action_public(cmdid, args)
- local disp = false
- if string.sub(cmdid, -1) == "s" then
- disp = true
- cmdid = string.sub(cmdid, 1, -2)
- end
- local uci = require "luci.model.uci".cursor()
- if cmdid and
- uci:get("luci", cmdid) == "command" and
- uci:get("luci", cmdid, "public") == "1"
- then
- if disp then
- execute_command(return_html, cmdid, args)
- else
- action_download(cmdid, args)
- end
- else
- luci.http.status(403, "Access to command denied")
- end
- end
+++ /dev/null
--- Copyright 2012 Jo-Philipp Wich <jow@openwrt.org>
--- Licensed to the public under the Apache License 2.0.
-
-local m, s
-
-m = Map("luci", translate("Custom Commands"),
- translate("This page allows you to configure custom shell commands which can be easily invoked from the web interface."))
-
-s = m:section(TypedSection, "command", "")
-s.template = "cbi/tblsection"
-s.anonymous = true
-s.addremove = true
-
-
-s:option(Value, "name", translate("Description"),
- translate("A short textual description of the configured command"))
-
-s:option(Value, "command", translate("Command"),
- translate("Command line to execute"))
-
-s:option(Flag, "param", translate("Custom arguments"),
- translate("Allow the user to provide additional command line arguments"))
-
-s:option(Flag, "public", translate("Public access"),
- translate("Allow executing the command and downloading its output without prior authentication"))
-
-return m
+++ /dev/null
-<%#
- Copyright 2012 Jo-Philipp Wich <jow@openwrt.org>
- Licensed to the public under the Apache License 2.0.
--%>
-
-<% css = [[
-
-.commandbox {
- height: 12em;
- width: 30%;
- float: left;
- height: 12em;
- margin: 5px;
- position: relative;
-}
-
-.commandbox h3 {
- font-size: 1.5em !important;
- line-height: 2em !important;
- margin: 0 !important;
-}
-
-.commandbox input[type="text"] {
- width: 50% !important;
-}
-
-.commandbox div {
- position: absolute;
- left: 0;
- bottom: 1.5em;
-}
-
-]] -%>
-
-<%+header%>
-
-<script type="text/javascript">//<![CDATA[
- var stxhr = new XHR();
-
- function command_run(ev, id)
- {
- var args;
- var field = document.getElementById(id);
- if (field)
- args = encodeURIComponent(field.value);
-
- var legend = document.getElementById('command-rc-legend');
- var output = document.getElementById('command-rc-output');
-
- if (legend && output)
- {
- output.innerHTML =
- '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> ' +
- '<%:Waiting for command to complete...%>'
- ;
-
- legend.parentNode.style.display = 'block';
- legend.style.display = 'inline';
-
- stxhr.get('<%=url('admin/system/commands/run')%>/' + id + (args ? '/' + args : ''), null,
- function(x, st)
- {
- if (st)
- {
- if (st.binary)
- st.stdout = '[<%:Binary data not displayed, download instead.%>]';
-
- legend.style.display = 'none';
- output.innerHTML = String.format(
- '<pre><strong># %h\n</strong>%h<span style="color:red">%h</span></pre>' +
- '<div class="alert-message warning">%s (<%:Code:%> %d)</div>',
- st.command, st.stdout, st.stderr,
- (st.exitcode == 0) ? '<%:Command successful%>' : '<%:Command failed%>',
- st.exitcode);
- }
- else
- {
- legend.style.display = 'none';
- output.innerHTML = '<span class="error"><%:Failed to execute command!%></span>';
- }
-
- location.hash = '#output';
- }
- );
- }
-
- ev.preventDefault();
- }
-
- function command_download(ev, id)
- {
- var args;
- var field = document.getElementById(id);
- if (field)
- args = encodeURIComponent(field.value);
-
- location.href = '<%=url('admin/system/commands/download')%>/' + id + (args ? '/' + args : '');
-
- ev.preventDefault();
- }
-
- function command_link(ev, id)
- {
- var legend = document.getElementById('command-rc-legend');
- var output = document.getElementById('command-rc-output');
-
- var args;
- var field = document.getElementById(id);
- if (field)
- args = encodeURIComponent(field.value);
-
- if (legend && output)
- {
- var prefix = location.protocol + '//' + location.host + '<%=url('command')%>/';
- var suffix = (args ? '/' + args : '');
-
- var link = prefix + id + suffix;
- var link_nodownload = prefix + id + "s" + suffix;
-
- legend.style.display = 'none';
- output.parentNode.style.display = 'block';
- output.innerHTML = String.format(
- '<div class="alert-message"><p><%:Download execution result%> <a href="%s">%s</a></p><p><%:Or display result%> <a href="%s">%s</a></p></div>',
- link, link, link_nodownload, link_nodownload
- );
-
- location.hash = '#output';
- }
-
- ev.preventDefault();
- }
-
-//]]></script>
-
-<%
- local uci = require "luci.model.uci".cursor()
- local commands = { }
-
- uci:foreach("luci", "command", function(s) commands[#commands+1] = s end)
-%>
-
-<form method="get" action="<%=pcdata(FULL_REQUEST_URI)%>">
- <div class="cbi-map">
- <h2 name="content"><%:Custom Commands%></h2>
- <% if #commands == 0 then %>
- <div class="cbi-section">
- <div class="table cbi-section-table">
- <div class="tr cbi-section-table-row">
- <p>
- <em><%:This section contains no values yet%></em>
- </p>
- </div>
- </div>
- </div>
- <% else %>
- <fieldset class="cbi-section">
- <% local _, command; for _, command in ipairs(commands) do %>
- <div class="commandbox">
- <h3><%=pcdata(command.name)%></h3>
- <p><%:Command:%> <code><%=pcdata(command.command)%></code></p>
- <% if command.param == "1" then %>
- <p><%:Arguments:%> <input type="text" id="<%=command['.name']%>" /></p>
- <% end %>
- <div>
- <button class="cbi-button cbi-button-apply" onclick="command_run(event, '<%=command['.name']%>')"><%:Run%></button>
- <button class="cbi-button cbi-button-download" onclick="command_download(event, '<%=command['.name']%>')"><%:Download%></button>
- <% if command.public == "1" then %>
- <button class="cbi-button cbi-button-link" onclick="command_link(event, '<%=command['.name']%>')"><%:Link%></button>
- <% end %>
- </div>
- </div>
- <% end %>
-
- <br style="clear:both" /><br />
- <a name="output"></a>
- </fieldset>
- <% end %>
-
- </div>
-
- <fieldset class="cbi-section" style="display:none">
- <legend id="command-rc-legend"><%:Collecting data...%></legend>
- <span id="command-rc-output"></span>
- </fieldset>
-</form>
-
-<%+footer%>
+++ /dev/null
-<%#
- Copyright 2016 t123yh <t123yh@outlook.com>
- Licensed to the public under the Apache License 2.0.
--%>
-
-<% css = [[
-.alert-success {
- color: #3c763d;
- background-color: #dff0d8;
- border-color: #d6e9c6;
-}
-
-.alert {
- padding: 15px;
- margin-bottom: 20px;
- border: 1px solid transparent;
- border-radius: 4px;
-}
-
-.alert-warning {
- color: #8a6d3b;
- background-color: #fcf8e3;
- border-color: #faebcc;
-}
-]] -%>
-
-<%+header%>
-
-<% if exitcode == 0 then %>
- <div class="alert alert-success" role="alert"> <%:Command executed successfully.%> </div>
-<% else %>
- <div class="alert alert-warning" role="alert"> <%:Command exited with status code %> <%= exitcode %> </div>
-<% end %>
-
-<% if stdout ~= "" then %>
- <h3><%:Standard Output%></h3>
- <pre><%= stdout %></pre>
-<% end %>
-
-<% if stderr ~= "" then %>
- <h3><%:Standard Error%></h3>
- <pre><%= stderr %></pre>
-<% end %>
-
-<script>
- <%# Display top bar on mobile devices -%>
- document.getElementsByClassName('brand')[0].style.setProperty("display", "block", "important");
-</script>
-
-<%+footer%>
\ No newline at end of file
--- /dev/null
+{
+ "admin/system/commands": {
+ "title": "Custom Commands",
+ "order": 80,
+ "action": {
+ "type": "firstchild"
+ },
+ "depends": {
+ "acl": [ "luci-app-commands" ]
+ }
+ },
+
+ "admin/system/commands/dashboard": {
+ "title": "Dashboard",
+ "order": 1,
+ "action": {
+ "type": "template",
+ "path": "commands"
+ }
+ },
+
+ "admin/system/commands/config": {
+ "title": "Configure",
+ "order": 2,
+ "action": {
+ "type": "view",
+ "path": "commands"
+ }
+ },
+
+ "admin/system/commands/run/*": {
+ "order": 3,
+ "action": {
+ "type": "function",
+ "module": "luci.controller.commands",
+ "function": "action_run"
+ }
+ },
+
+ "admin/system/commands/download/*": {
+ "order": 4,
+ "action": {
+ "type": "function",
+ "module": "luci.controller.commands",
+ "function": "action_download"
+ }
+ },
+
+ "command/*": {
+ "action": {
+ "type": "function",
+ "module": "luci.controller.commands",
+ "function": "action_public"
+ }
+ }
+}
--- /dev/null
+// Copyright 2012-2022 Jo-Philipp Wich <jow@openwrt.org>
+// Licensed to the public under the Apache License 2.0.
+
+'use strict';
+
+import { basename, mkstemp, popen } from 'fs';
+import { urldecode } from 'luci.http';
+
+// Decode a given string into arguments following shell quoting rules
+// [[abc\ def "foo\"bar" abc'def']] -> [[abc def]] [[foo"bar]] [[abcdef]]
+function parse_args(str) {
+ let args = [];
+
+ function isspace(c) {
+ if (c == 9 || c == 10 || c == 11 || c == 12 || c == 13 || c == 32)
+ return c;
+ }
+
+ function isquote(c) {
+ if (c == 34 || c == 39 || c == 96)
+ return c;
+ }
+
+ function isescape(c) {
+ if (c == 92)
+ return c;
+ }
+
+ function ismeta(c) {
+ if (c == 36 || c == 92 || c == 96)
+ return c;
+ }
+
+ // Scan substring defined by the indexes [s, e] of the string "str",
+ // perform unquoting and de-escaping on the fly and store the result
+ function unquote(start, end) {
+ let esc, quote, res = [];
+
+ for (let off = start; off < end; off++) {
+ const byte = ord(str, off);
+ const q = isquote(byte);
+ const e = isescape(byte);
+ const m = ismeta(byte);
+
+ if (esc) {
+ if (!m)
+ push(res, 92);
+
+ push(res, byte);
+ esc = false;
+ }
+ else if (e && quote != 39) {
+ esc = true;
+ }
+ else if (q && quote && q == quote) {
+ quote = null;
+ }
+ else if (q && !quote) {
+ quote = q;
+ }
+ else {
+ push(res, byte);
+ }
+ }
+
+ push(args, chr(...res));
+ }
+
+ // Find substring boundaries in "str". Ignore escaped or quoted
+ // whitespace, pass found start- and end-index for each substring
+ // to unquote()
+ let esc, start, quote;
+
+ for (let off = 0; off <= length(str); off++) {
+ const byte = ord(str, off);
+ const q = isquote(byte);
+ const s = isspace(byte) ?? (byte === null);
+ const e = isescape(byte);
+
+ if (esc) {
+ esc = false;
+ }
+ else if (e && quote != 39) {
+ esc = true;
+ start ??= off;
+ }
+ else if (q && quote && q == quote) {
+ quote = null;
+ }
+ else if (q && !quote) {
+ start ??= off;
+ quote = q;
+ }
+ else if (s && !quote) {
+ if (start !== null) {
+ unquote(start, off);
+ start = null;
+ }
+ }
+ else {
+ start ??= off;
+ }
+ }
+
+ // If the "quote" is still set we encountered an unfinished string
+ if (quote)
+ unquote(start, length(str));
+
+ return args;
+}
+
+function test_binary(str) {
+ for (let off = 0, byte = ord(str); off < length(str); byte = ord(str, ++off))
+ if (byte <= 8 || (byte >= 14 && byte <= 31))
+ return true;
+
+ return false;
+}
+
+function parse_cmdline(cmdid, args) {
+ if (uci.get('luci', cmdid) == 'command') {
+ let cmd = uci.get_all('luci', cmdid);
+ let argv = parse_args(cmd?.command);
+
+ if (cmd?.param == '1') {
+ if (length(args))
+ push(argv, ...(parse_args(urldecode(args)) ?? []));
+ else if (length(args = http.formvalue('args')))
+ push(argv, ...(parse_args(args) ?? []));
+ }
+
+ return map(argv, v => match(v, /[^\w.\/|-]/) ? `'${replace(v, "'", "'\\''")}'` : v);
+ }
+}
+
+function execute_command(callback, ...args) {
+ let argv = parse_cmdline(...args);
+
+ if (argv) {
+ let outfd = mkstemp();
+ let errfd = mkstemp();
+
+ const exitcode = system(`${join(' ', argv)} >&${outfd.fileno()} 2>&${errfd.fileno()}`);
+
+ outfd.seek(0);
+ errfd.seek(0);
+
+ const stdout = outfd.read(1024 * 512) ?? '';
+ const stderr = errfd.read(1024 * 512) ?? '';
+
+ outfd.close();
+ errfd.close();
+
+ const binary = test_binary(stdout);
+
+ callback({
+ ok: true,
+ command: join(' ', argv),
+ stdout: binary ? null : stdout,
+ stderr,
+ exitcode,
+ binary
+ });
+ }
+ else {
+ callback({
+ ok: false,
+ code: 404,
+ reason: "No such command"
+ });
+ }
+}
+
+function return_json(result) {
+ if (result.ok) {
+ http.prepare_content('application/json');
+ http.write_json(result);
+ }
+ else {
+ http.status(result.code, result.reason);
+ }
+}
+
+
+function return_html(result) {
+ if (result.ok) {
+ include('commands_public', result);
+ }
+ else {
+ http.status(result.code, result.reason);
+ }
+}
+
+return {
+ action_run: function(...args) {
+ execute_command(return_json, ...args);
+ },
+
+ action_download: function(...args) {
+ const argv = parse_cmdline(...args);
+
+ if (argv) {
+ const fd = popen(`${join(' ', argv)} 2>/dev/null`);
+
+ if (fd) {
+ let filename = replace(basename(argv[0]), /\W+/g, '.');
+ let chunk = fd.read(4096) ?? '';
+ let name;
+
+ if (test_binary(chunk)) {
+ http.header("Content-Disposition", `attachment; filename=${filename}.bin`);
+ http.prepare_content("application/octet-stream");
+ }
+ else {
+ http.header("Content-Disposition", `attachment; filename=${filename}.txt`);
+ http.prepare_content("text/plain");
+ }
+
+ while (length(chunk)) {
+ http.write(chunk);
+ chunk = fd.read(4096);
+ }
+
+ fd.close();
+ }
+ else {
+ http.status(500, "Failed to execute command");
+ }
+ }
+ else {
+ http.status(404, "No such command");
+ }
+ },
+
+ action_public: function(cmdid, ...args) {
+ let disp = false;
+
+ if (substr(cmdid, -1) == "s") {
+ disp = true;
+ cmdid = substr(cmdid, 0, -1);
+ }
+
+ if (cmdid &&
+ uci.get('luci', cmdid) == 'command' &&
+ uci.get('luci', cmdid, 'public') == '1')
+ {
+ if (disp)
+ execute_command(return_html, cmdid, ...args);
+ else
+ this.action_download(cmdid, args);
+ }
+ else {
+ http.status(403, "Access to command denied");
+ }
+ }
+};
--- /dev/null
+{#
+ Copyright 2012-2022 Jo-Philipp Wich <jo@mein.io>
+ Licensed to the public under the Apache License 2.0.
+-#}
+
+{%
+ include('header', { css: `
+ .commands {
+ display: flex;
+ flex-wrap: wrap;
+ }
+
+ .commandbox {
+ flex: 0 0 30%;
+ margin: .5em;
+ display: flex;
+ flex-direction: column;
+ }
+
+ .commandbox > p,
+ .commandbox > p > * {
+ display: block;
+ }
+
+ .commandbox div {
+ margin-top: auto;
+ }
+ ` });
+-%}
+
+<script type="text/javascript">//<![CDATA[
+ var stxhr = new XHR();
+
+ function command_run(ev, id)
+ {
+ var args;
+ var field = document.getElementById(id);
+ if (field)
+ args = encodeURIComponent(field.value);
+
+ var legend = document.getElementById('command-rc-legend');
+ var output = document.getElementById('command-rc-output');
+
+ if (legend && output)
+ {
+ output.innerHTML =
+ '<img src="{{ resource }}/icons/loading.gif" alt="{{ _('Loading') }}" style="vertical-align:middle" /> ' +
+ '{{ _('Waiting for command to complete...') }}'
+ ;
+
+ legend.parentNode.style.display = 'block';
+ legend.style.display = 'inline';
+
+ stxhr.get('{{ dispatcher.build_url('admin/system/commands/run') }}/' + id + (args ? '?args=' + args : ''), null,
+ function(x, st)
+ {
+ if (st)
+ {
+ if (st.binary)
+ st.stdout = '[{{ _('Binary data not displayed, download instead.') }}]';
+
+ legend.style.display = 'none';
+ output.innerHTML = String.format(
+ '<pre><strong># %h\n</strong>%h<span style="color:red">%h</span></pre>' +
+ '<div class="alert-message warning">%s ({{ _('Code:') }} %d)</div>',
+ st.command, st.stdout, st.stderr,
+ (st.exitcode == 0) ? '{{ _('Command successful') }}' : '{{ _('Command failed') }}',
+ st.exitcode);
+ }
+ else
+ {
+ legend.style.display = 'none';
+ output.innerHTML = '<span class="error">{{ _('Failed to execute command!') }}</span>';
+ }
+
+ location.hash = '#output';
+ }
+ );
+ }
+
+ ev.preventDefault();
+ }
+
+ function command_download(ev, id)
+ {
+ var args;
+ var field = document.getElementById(id);
+ if (field)
+ args = encodeURIComponent(field.value);
+
+ location.href = '{{ dispatcher.build_url('admin/system/commands/download') }}/' + id + (args ? '/' + args : '');
+
+ ev.preventDefault();
+ }
+
+ function command_link(ev, id)
+ {
+ var legend = document.getElementById('command-rc-legend');
+ var output = document.getElementById('command-rc-output');
+
+ var args;
+ var field = document.getElementById(id);
+ if (field)
+ args = encodeURIComponent(field.value);
+
+ if (legend && output)
+ {
+ var prefix = location.protocol + '//' + location.host + '{{ dispatcher.build_url('command') }}/';
+ var suffix = (args ? '?args=' + args : '');
+
+ var link = prefix + id + suffix;
+ var link_nodownload = prefix + id + "s" + suffix;
+
+ legend.style.display = 'none';
+ output.parentNode.style.display = 'block';
+ output.innerHTML = String.format(
+ '<div class="alert-message"><p>{{ _('Download execution result') }} <a href="%s">%s</a></p><p>{{ _('Or display result') }} <a href="%s">%s</a></p></div>',
+ link, link, link_nodownload, link_nodownload
+ );
+
+ location.hash = '#output';
+ }
+
+ ev.preventDefault();
+ }
+
+//]]></script>
+
+{%
+ const commands = [];
+
+ uci.foreach('luci', 'command', s => push(commands, s));
+-%}
+
+<form method="get" action="{{ entityencode(FULL_REQUEST_URI) }}">
+ <div class="cbi-map">
+ <h2 name="content">{{ _('Custom Commands') }}</h2>
+
+ {% if (length(commands) == 0): %}
+ <div class="cbi-section">
+ <div class="table cbi-section-table">
+ <div class="tr cbi-section-table-row">
+ <p>
+ <em>{{ _('This section contains no values yet') }}</em>
+ </p>
+ </div>
+ </div>
+ </div>
+ {% else %}
+ <div class="commands">
+ {% for (let command in commands): %}
+ <div class="commandbox">
+ <h3>{{ entityencode(command.name) }}</h3>
+ <p>{{ _('Command:') }} <code>{{ entityencode(command.command) }}</code></p>
+ {% if (command.param == "1"): %}
+ <p>{{ _('Arguments:') }} <input type="text" id="{{ command['.name'] }}" /></p>
+ {% endif %}
+ <div>
+ <button class="cbi-button cbi-button-apply" onclick="command_run(event, '{{ command['.name'] }}')">{{ _('Run') }}</button>
+ <button class="cbi-button cbi-button-download" onclick="command_download(event, '{{ command['.name'] }}')">{{ _('Download') }}</button>
+ {% if (command.public == "1"): %}
+ <button class="cbi-button cbi-button-link" onclick="command_link(event, '{{ command['.name'] }}')">{{ _('Link') }}</button>
+ {% endif %}
+ </div>
+ </div>
+ {% endfor %}
+
+ <a name="output"></a>
+ </div>
+ {% endif %}
+ </div>
+
+ <fieldset class="cbi-section" style="display:none">
+ <legend id="command-rc-legend">{{ _('Collecting data...') }}</legend>
+ <span id="command-rc-output"></span>
+ </fieldset>
+</form>
+
+{% include('footer') %}
--- /dev/null
+{#
+ Copyright 2016 t123yh <t123yh@outlook.com>
+ Copyright 2022 Jo-Philipp Wich <jo@mein.io>
+ Licensed to the public under the Apache License 2.0.
+-#}
+
+{%
+ include('header', { blank_page: true, css: `
+ .alert-success {
+ color: #3c763d;
+ background-color: #dff0d8;
+ border-color: #d6e9c6;
+ }
+
+ .alert {
+ padding: 15px;
+ margin-bottom: 20px;
+ border: 1px solid transparent;
+ border-radius: 4px;
+ }
+
+ .alert-warning {
+ color: #8a6d3b;
+ background-color: #fcf8e3;
+ border-color: #faebcc;
+ }
+ ` });
+-%}
+
+<div class="alert alert-success" role="alert">
+ {% if (exitcode == 0): %}
+ {{ _('Command executed successfully.') }}
+ {% else %}
+ {{ sprintf(_('Command exited with status code %d'), exitcode) }}
+ {% endif %}
+</div>
+
+{% if (length(stdout)): %}
+ <h3>{{ _('Standard Output') }}</h3>
+ <pre>{{ entityencode(stdout) }}</pre>
+{% endif %}
+
+{% if (length(stderr)): %}
+ <h3>{{ _('Standard Error') }}</h3>
+ <pre>{{ entityencode(stderr) }}</pre>
+{% endif %}
+
+{% include('footer', { blank_page: true }) %}
PKG_MAINTAINER:=Ansuel Smith <ansuelsmth@gmail.com>
LUCI_TITLE:=LuCI Support for Dynamic DNS Client (ddns-scripts)
-LUCI_DEPENDS:=+luci-mod-admin-full +ddns-scripts
+LUCI_DEPENDS:=+luci-mod-admin-full +luci-lua-runtime +ddns-scripts
LUCI_PKGARCH:=all
include ../../luci.mk
include $(TOPDIR)/rules.mk
LUCI_TITLE:=Freifunk DHCP-Splash application
-LUCI_DEPENDS:=+luci-compat +luci-lib-nixio +luci-lib-iptparser +tc +kmod-sched +iptables-mod-nat-extra +iptables-mod-ipopt
+LUCI_DEPENDS:=+luci-compat +luci-lib-nixio +luci-lib-iptparser +luci-lua-runtime +tc +kmod-sched +iptables-mod-nat-extra +iptables-mod-ipopt
define Package/luci-app-splash/conffiles
/etc/config/luci_splash
LUCI_TITLE:=LuCI Statistics Application
LUCI_DEPENDS:= \
+luci-base \
- +luci-lib-jsonc \
+collectd \
+rrdtool1 \
+collectd-mod-rrdtool \
fi
### create config
- /usr/bin/stat-genconfig > /var/etc/collectd.conf
+ /usr/libexec/stat-genconfig > /var/etc/collectd.conf
### workaround broken permissions on /tmp
chmod 1777 /tmp
+++ /dev/null
-#!/usr/bin/lua
-
---[[
-
-Luci statistics - collectd configuration generator
-(c) 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-$Id$
-
-]]--
-
-
-require("luci.model.uci")
-require("luci.util")
-require("luci.i18n")
-require("luci.jsonc")
-require("nixio.fs")
-
-local uci = luci.model.uci.cursor()
-local sections = uci:get_all( "luci_statistics" )
-
-
-function print(...)
- nixio.stdout:write(...)
- nixio.stdout:write("\n")
-end
-
-function section( plugin )
-
- local config = sections[ "collectd_" .. plugin ] or sections["collectd"]
-
- if type(config) == "table" and ( plugin == "collectd" or config.enable == "1" ) then
-
- local params = ""
-
- if type( plugins[plugin] ) == "function" then
- params = plugins[plugin]( config )
- else
- params = config_generic( config, plugins[plugin][1], plugins[plugin][2], plugins[plugin][3], plugin == "collectd" )
- end
-
-
- if plugin ~= "collectd" then
- print( "LoadPlugin " .. plugin )
-
- if params:len() > 0 then
- print( "<Plugin " .. plugin .. ">\n" .. params .. "</Plugin>\n" )
- else
- print( "" )
- end
- else
- print( params .. "\n" )
- end
- end
-end
-
-function config_generic( c, singles, bools, lists, nopad )
- local str = ""
-
- if type(c) == "table" then
-
- if type(singles) == "table" then
- for i, key in ipairs( singles ) do
- if preprocess[key] then
- c[key] = preprocess[key](c[key])
- end
-
- str = str .. _string( c[key], key, nopad )
- end
- end
-
- if type(bools) == "table" then
- for i, key in ipairs( bools ) do
- if preprocess[key] then
- c[key] = preprocess[key](c[key])
- end
-
- str = str .. _bool( c[key], key, nopad )
- end
- end
-
- if type(lists) == "table" then
- str = str .. _list_expand( c, lists, nopad )
- end
- end
-
- return str
-end
-
-function config_exec( c )
- local str = ""
-
- for s in pairs(sections) do
- for key, type in pairs({ Exec="collectd_exec_input", NotificationExec="collectd_exec_notify" }) do
- if sections[s][".type"] == type then
-
- cmd = sections[s].cmdline
-
- if cmd then
- cmd = cmd:gsub("^%s+", ""):gsub("%s+$", "")
- user = sections[s].cmduser or "nobody"
- group = sections[s].cmdgroup
-
- str = str .. "\t" .. key .. ' "' ..
- user .. ( group and ":" .. group or "" ) .. '" "' ..
- cmd:gsub('%s+', '" "') .. '"\n'
- end
- end
- end
- end
-
- return str
-end
-
-function config_curl( c )
- local str = ""
-
- for s in pairs(sections) do
- if sections[s][".type"] == "collectd_curl_page" then
- str = str .. "\t<Page \"" .. sections[s].name .. "\">\n" ..
- "\t\tURL \"" .. sections[s].url .. "\"\n" ..
- "\t\tMeasureResponseTime true\n" ..
- "\t</Page>\n"
- end
- end
-
- return str
-end
-
-function config_iptables( c )
- local str = ""
-
- for id, s in pairs(sections) do
- if s[".type"] == "collectd_iptables_match" or s[".type"] == "collectd_iptables_match6" then
- local tname = s.table and tostring(s.table)
- local chain = s.chain and tostring(s.chain)
-
- if tname and tname:match("^%S+$") and chain and chain:match("^%S+$") then
- local line = { #s[".type"] > 23 and "\tChain6" or "\tChain", tname, chain }
- local rule = s.rule and tostring(s.rule)
-
- if rule and rule:match("^%S+$") then
- line[#line+1] = rule
-
- local name = s.name and tostring(s.name)
- if name and name:match("^%S+$") then
- line[#line+1] = name
- end
- end
-
- str = str .. table.concat(line, " ") .. "\n"
- end
- end
- end
-
- return str
-end
-
-function config_network( c )
- local str = ""
-
- for s in pairs(sections) do
- for key, type in pairs({ Listen="collectd_network_listen", Server="collectd_network_server" }) do
- if sections[s][".type"] == type then
-
- host = sections[s].host
- port = sections[s].port
-
- if host then
- if port then
- str = str .. "\t" .. key .. " \"" .. host .. "\" \"" .. port .. "\"\n"
- else
- str = str .. "\t" .. key .. " \"" .. host .. "\"\n"
- end
- end
- end
- end
- end
-
- return str ..
- _string(c["MaxPacketSize"], "MaxPacketSize") ..
- _string(c["TimeToLive"], "TimeToLive") ..
- _bool(c["Forward"], "Forward") ..
- _bool(c["ReportStats"], "ReportStats")
-end
-
-
-function _list_expand( c, l, nopad )
- local str = ""
-
- for i, n in ipairs(l) do
- if c[n] then
- if preprocess[n] then
- c[n] = preprocess[n](c[n])
- end
-
- if n:find("(%w+)ses") then
- k = n:gsub("(%w+)ses$", "%1s")
- else
- k = n:gsub("(%w+)s$", "%1")
- end
-
- str = str .. _expand( c[n], k, nopad )
- end
- end
-
- return str
-end
-
-function _expand( s, n, nopad )
- local str = ""
-
- if type(s) == "string" then
- for i, v in ipairs( luci.util.split( s, "%s+", nil, true ) ) do
- str = str .. _string( v, n, nopad )
- end
- elseif type(s) == "table" then
- for i, v in ipairs(s) do
- str = str .. _string( v, n, nopad )
- end
- end
-
- return str
-end
-
-function _bool( s, n, nopad )
-
- local str = ""
- local pad = ""
- if not nopad then pad = "\t" end
-
- if s == "1" then
- str = pad .. n .. " true\n"
- elseif s == "0" then
- str = pad .. n .. " false\n"
- end
-
- return str
-end
-
-function _string( s, n, nopad )
-
- local str = ""
- local pad = ""
- if not nopad then pad = "\t" end
-
- if s then
- if s:find("[^%d]") or n == "Port" or n == "Irq" then
- if not s:find("[^%w]") and n ~= "Port" and n ~= "Irq" then
- str = pad .. n .. " " .. luci.util.trim(s)
- else
- str = pad .. n .. ' "' .. luci.util.trim(s) .. '"'
- end
- else
- str = pad .. n .. " " .. luci.util.trim(s)
- end
-
- str = str .. "\n"
- end
-
- return str
-end
-
-
-plugins = {
- collectd = {
- { "BaseDir", "Include", "PIDFile", "PluginDir", "TypesDB", "Interval", "ReadThreads", "Hostname" },
- { },
- { }
- },
- logfile = {
- { "LogLevel", "File" },
- { "Timestamp" },
- { }
- },
-}
-
-local plugin_dir = "/usr/share/luci/statistics/plugins/"
-for filename in nixio.fs.dir(plugin_dir) do
- local name = filename:gsub("%.json", "")
- if (name == "exec") then
- plugins[name] = config_exec
- elseif (name == "iptables") then
- plugins[name] = config_iptables
- elseif (name == "curl") then
- plugins[name] = config_curl
- elseif (name == "network") then
- plugins[name] = config_network
- else
- local plugin_def = luci.jsonc.parse(nixio.fs.readfile(plugin_dir .. filename))
- if type(plugin_def) == "table" then
- plugins[name] = plugin_def.legend
- end
- end
-end
-
-
-preprocess = {
- RRATimespans = function(val)
- local rv = { }
- for time in luci.util.imatch(val) do
- table.insert( rv, luci.util.parse_units(time) )
- end
- return table.concat(rv, " ")
- end
-}
-
-
-section("collectd")
-
-section("logfile")
-
-for plugin in pairs(plugins) do
- if (plugin ~= "collectd") and (plugin ~= "logfile") then
- section( plugin )
- end
-end
--- /dev/null
+#!/usr/bin/env ucode
+/*
+Luci statistics - collectd configuration generator
+(c) 2008-2022 Jo-Philipp Wich <jo@mein.io>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+*/
+
+'use strict';
+
+import { lsdir, open } from 'fs';
+import { cursor } from 'uci';
+
+const uci = cursor();
+const sections = uci.get_all('luci_statistics');
+
+const plugins = {
+ collectd: [
+ [ 'BaseDir', 'Include', 'PIDFile', 'PluginDir', 'TypesDB', 'Interval', 'ReadThreads', 'Hostname' ],
+ [],
+ []
+ ],
+ logfile: [
+ [ 'LogLevel', 'File' ],
+ [ 'Timestamp' ],
+ []
+ ],
+};
+
+function parse_units(ustr) {
+ let val = 0;
+
+ // unit map
+ const map = {
+ y : 60 * 60 * 24 * 366,
+ m : 60 * 60 * 24 * 31,
+ w : 60 * 60 * 24 * 7,
+ d : 60 * 60 * 24,
+ h : 60 * 60,
+ min: 60
+ };
+
+ // parse input string
+ for (let spec in match(lc(ustr), /([0-9.]+)([a-z]*)/g)) {
+ let num = +spec[1];
+ let mul = map[spec[2]] ?? map[substr(spec[2], 0, 1)] ?? 1;
+
+ val += num * mul;
+ }
+
+ return int(val);
+}
+
+const preprocess = {
+ RRATimespans: function(val) {
+ return join(' ', map(split(val, /\s+/), parse_units));
+ }
+};
+
+
+function _bool(s, n, nopad) {
+ if (s == '1')
+ return `${nopad ? '' : '\t'}${n} true\n`;
+
+ if (s == '0')
+ return `${nopad ? '' : '\t'}${n} false\n`;
+
+ return '';
+}
+
+function _string(s, n, nopad) {
+ if (s) {
+ if (n == 'Port' || n == 'Irq' || match(s, /[^0-9]/)) {
+ if (!match(s, /[^\w]/) && n != 'Port' && n != 'Irq')
+ return `${nopad ? '' : '\t'}${n} ${trim(s)}\n`;
+ else
+ return `${nopad ? '' : '\t'}${n} "${trim(s)}"\n`;
+ }
+ else {
+ return `${nopad ? '' : '\t'}${n} ${trim(s)}\n`;
+ }
+ }
+
+ return '';
+}
+
+function _expand(s, n, nopad) {
+ let str = "";
+
+ if (type(s) == 'string') {
+ for (let v in split(s, /\s+/))
+ str += _string(v, n, nopad);
+ }
+ else if (type(s) == 'array') {
+ for (let v in s)
+ str += _string(v, n, nopad);
+ }
+
+ return str;
+}
+
+function _list_expand(c, l, nopad) {
+ let str = '';
+
+ for (let n in l) {
+ if (c[n]) {
+ if (preprocess[n])
+ c[n] = preprocess[n](c[n]);
+
+ let m = match(n, /^(\w+)ses$/);
+ let k;
+
+ if (m)
+ k = `${m[1]}s`;
+ else
+ k = replace(n, /^(\w+)s$/, '$1');
+
+ str += _expand(c[n], k, nopad);
+ }
+ }
+
+ return str;
+}
+
+
+function config_generic(c, singles, bools, lists, nopad) {
+ let str = '';
+
+ if (c) {
+ for (let key in singles) {
+ if (preprocess[key])
+ c[key] = preprocess[key](c[key]);
+
+ str += _string(c[key], key, nopad);
+ }
+
+ for (let key in bools) {
+ if (preprocess[key])
+ c[key] = preprocess[key](c[key]);
+
+ str += _bool(c[key], key, nopad);
+ }
+
+ if (lists)
+ str += _list_expand(c, lists, nopad);
+ }
+
+ return str;
+}
+
+function config_exec(c) {
+ let str = "";
+
+ for (let k, s in sections) {
+ for (let key, type in { Exec: 'collectd_exec_input', NotificationExec: 'collectd_exec_notify' }) {
+ if (s['.type'] == type) {
+ let cmd = replace(trim(s.cmdline), /\s+/g, '" "');
+ let user = s.cmduser ?? 'nobody';
+ let group = s.cmdgroup;
+
+ if (cmd)
+ str += `\t${key} "${user}${group ? `:${group}` : ''}" "${cmd}"\n`;
+ }
+ }
+ }
+
+ return str;
+}
+
+function config_curl(c) {
+ let str = "";
+
+ for (let k, s in sections) {
+ if (s['.type'] == 'collectd_curl_page') {
+ str += `\t<Page "${s.name}">\n`
+ + `\t\tURL "${s.url}"\n`
+ + `\t\tMeasureResponseTime true\n`
+ + `\t</Page>\n`;
+ }
+ }
+
+ return str;
+}
+
+function config_iptables(c) {
+ let str = "";
+
+ for (let k, s in sections) {
+ for (let type, verb in { collectd_iptables_match: 'Chain', collectd_iptables_match6: 'Chain6' }) {
+ if (s['.type'] == type) {
+ let tname = `${s.table}`;
+ let chain = `${s.chain}`;
+
+ if (match(tname, /^\S+$/) && match(chain, /^\S+$/) && match(rule, /^\S+$/) && match(name, /^\S+$/)) {
+ str += `\t${verb} "${tname}" "${chain}"`;
+
+ let rule = `${s.rule}`;
+
+ if (match(rule, /^\S+$/)) {
+ str += ` "${rule}"`;
+
+ let name = `${s.name}`;
+
+ if (match(name, /^\S+$/))
+ str += ` "${name}"`;
+ }
+
+ str += '\n';
+ }
+ }
+ }
+ }
+
+ return str;
+}
+
+function config_network(c) {
+ let str = '';
+
+ for (let k, s in sections) {
+ for (let key, type in { Listen: 'collectd_network_listen', Server: 'collectd_network_server' }) {
+ if (s['.type'] == type && s.host) {
+ if (s.port)
+ str += `\t${key} "${s.host}" "${s.port}"\n`;
+ else
+ str += `\t${key} "${s.host}"\n`;
+ }
+ }
+ }
+
+ return str
+ + _string(c.MaxPacketSize, 'MaxPacketSize')
+ + _string(c.TimeToLive, 'TimeToLive')
+ + _bool(c.Forward, 'Forward')
+ + _bool(c.ReportStats, 'ReportStats')
+ ;
+}
+
+function section(plugin) {
+ let config = sections[`collectd_${plugin}`] ?? sections.collectd;
+
+ if (config && (plugin == 'collectd' || config.enable == '1')) {
+ let params;
+
+ if (type(plugins[plugin]) == 'function')
+ params = plugins[plugin](config);
+ else
+ params = config_generic(config, ...plugins[plugin], plugin == 'collectd');
+
+ if (plugin != 'collectd')
+ print(`LoadPlugin ${plugin}\n${length(params) ? `<Plugin ${plugin}>\n${params}</Plugin>\n` : ''}\n`);
+ else
+ print(`${params ?? ''}\n`);
+ }
+}
+
+
+let plugin_dir = '/usr/share/luci/statistics/plugins';
+
+for (let filename in lsdir(plugin_dir)) {
+ let name = replace(filename, /\.json$/, '');
+
+ switch (name) {
+ case 'exec': plugins[name] = config_exec; break;
+ case 'iptables': plugins[name] = config_iptables; break;
+ case 'curl': plugins[name] = config_curl; break;
+ case 'network': plugins[name] = config_network; break;
+ default:
+ plugins[name] = json(open(`${plugin_dir}/${filename}`))?.legend;
+ }
+}
+
+
+section('collectd');
+section('logfile');
+
+for (let plugin in plugins)
+ if (plugin != 'collectd' && plugin != 'logfile')
+ section(plugin);
include $(TOPDIR)/rules.mk
LUCI_TITLE:=Universal Plug & Play configuration module
-LUCI_DEPENDS:=+miniupnpd
+LUCI_DEPENDS:=+miniupnpd +rpcd-mod-ucode
include ../../luci.mk
+++ /dev/null
-#!/usr/bin/env lua
-
-local json = require "luci.jsonc"
-local UCI = require "luci.model.uci"
-local fs = require "nixio.fs"
-local sys = require "luci.sys"
-
-local methods = {
- get_status = {
- call = function()
- local uci = UCI.cursor()
- local lease_file = uci:get("upnpd", "config", "upnp_lease_file")
-
- local ipv4_hints = sys.net.ipv4_hints()
- local rule = { }
-
- local ipt = io.popen("iptables --line-numbers -t nat -xnvL MINIUPNPD 2>/dev/null")
- if ipt then
- local upnpf = lease_file and io.open(lease_file, "r")
- while true do
- local ln = ipt:read("*l")
- if not ln then
- break
- elseif ln:match("^%d+") then
- local num, proto, extport, intaddr, intport =
- ln:match("^(%d+).-([a-z]+).-dpt:(%d+) to:(%S-):(%d+)")
- local descr = ""
-
- if num and proto and extport and intaddr and intport then
- extport = tonumber(extport)
- intport = tonumber(intport)
-
- if upnpf then
- local uln = upnpf:read("*l")
- if uln then descr = uln:match(string.format("^%s:%d:%s:%d:%%d*:(.*)$", proto:upper(), extport, intaddr, intport)) end
- if not descr then descr = "" end
- end
-
- local host_hint, _, e
-
- for _,e in pairs(ipv4_hints) do
- if e[1] == intaddr then
- host_hint = e[2]
- break
- end
- end
-
- rule[#rule+1] = {
- num = num,
- proto = proto:upper(),
- extport = extport,
- intaddr = intaddr,
- host_hint = host_hint,
- intport = intport,
- descr = descr
- }
- end
- end
- end
-
- if upnpf then upnpf:close() end
- ipt:close()
- end
-
- local nft = io.popen("nft --handle list chain inet fw4 upnp_prerouting")
- if nft then
- local num = 1
- local upnpf = lease_file and io.open(lease_file, "r")
- while true do
- local ln = nft:read("*l")
- if not ln then
- break
- elseif ln:match("iif ") then
- local proto, extport, intaddr, intport =
- ln:match('^\t\tiif ".-" @nh,72,8 (0x[0-9a-f]+) th dport ([0-9]+) dnat ip to ([0-9%.]+):([0-9]+)')
- local descr = ""
-
- if (proto == "0x6" or proto == "0x11") and extport and intaddr and intport then
- proto = (proto == "0x6") and "TCP" or "UDP"
- extport = tonumber(extport)
- intport = tonumber(intport)
-
- if upnpf then
- local uln = upnpf:read("*l")
- if uln then descr = uln:match(string.format("^%s:%d:%s:%d:%%d*:(.*)$", proto, extport, intaddr, intport)) end
- if not descr then descr = "" end
- end
-
- local host_hint, _, e
-
- for _,e in pairs(ipv4_hints) do
- if e[1] == intaddr then
- host_hint = e[2]
- break
- end
- end
-
- rule[#rule+1] = {
- num = tostring(num),
- proto = proto,
- extport = extport,
- intaddr = intaddr,
- host_hint = host_hint,
- intport = intport,
- descr = descr
- }
-
- num = num + 1
- end
- end
- end
-
- if upnpf then upnpf:close() end
- nft:close()
- end
-
- return { rules = rule }
- end
- },
- delete_rule = {
- args = { token = "token" },
- call = function(args)
- local util = require "luci.util"
- local idx = args and tonumber(args.token)
- local res = {}
-
- if idx and idx > 0 then
- local uci = UCI.cursor()
-
- local lease_file = uci:get("upnpd", "config", "upnp_lease_file")
- if lease_file and fs.access(lease_file) then
- sys.call("sed -i -e '%dd' %s" %{ idx, util.shellquote(lease_file) })
- sys.call("/etc/init.d/miniupnpd restart")
- end
-
- uci.unload()
-
- return { result = "OK" }
- end
-
- return { result = "Bad request" }
- end
- }
-}
-
-local function parseInput()
- local parse = json.new()
- local done, err
-
- while true do
- local chunk = io.read(4096)
- if not chunk then
- break
- elseif not done and not err then
- done, err = parse:parse(chunk)
- end
- end
-
- if not done then
- print(json.stringify({ error = err or "Incomplete input" }))
- os.exit(1)
- end
-
- return parse:get()
-end
-
-local function validateArgs(func, uargs)
- local method = methods[func]
- if not method then
- print(json.stringify({ error = "Method not found" }))
- os.exit(1)
- end
-
- if type(uargs) ~= "table" then
- print(json.stringify({ error = "Invalid arguments" }))
- os.exit(1)
- end
-
- uargs.ubus_rpc_session = nil
-
- local k, v
- local margs = method.args or {}
- for k, v in pairs(uargs) do
- if margs[k] == nil or
- (v ~= nil and type(v) ~= type(margs[k]))
- then
- print(json.stringify({ error = "Invalid arguments" }))
- os.exit(1)
- end
- end
-
- return method
-end
-
-if arg[1] == "list" then
- local _, method, rv = nil, nil, {}
- for _, method in pairs(methods) do rv[_] = method.args or {} end
- print((json.stringify(rv):gsub(":%[%]", ":{}")))
-elseif arg[1] == "call" then
- local args = parseInput()
- local method = validateArgs(arg[2], args)
- local result, code = method.call(args)
- print((json.stringify(result):gsub("^%[%]$", "{}")))
- os.exit(code or 0)
-end
--- /dev/null
+// Copyright 2022 Jo-Philipp Wich <jo@mein.io>
+// Licensed to the public under the Apache License 2.0.
+
+'use strict';
+
+import { access, open, popen } from 'fs';
+import { connect } from 'ubus';
+import { cursor } from 'uci';
+
+// Establish ubus connection persistently outside of the call handler scope to
+// prevent premature GC'ing. Can be moved into `get_status` callback once
+// https://github.com/jow-/ucode/commit/a58fe4709f661b5f28e26701ea8638efccf5aeb6
+// is merged.
+const ubus = connect();
+
+const methods = {
+ get_status: {
+ call: function(req) {
+ const uci = cursor();
+
+ const rules = [];
+ const leases = [];
+
+ const leasefile = open(uci.get('upnpd', 'config', 'upnp_lease_file'), 'r');
+
+ if (leasefile) {
+ for (let line = leasefile.read('line'); length(line); line = leasefile.read('line')) {
+ const record = split(line, ':', 6);
+
+ if (length(record) == 6) {
+ push(leases, {
+ proto: uc(record[0]),
+ extport: +record[1],
+ intaddr: arrtoip(iptoarr(record[2])),
+ intport: +record[3],
+ expiry: +record[4],
+ description: trim(record[5])
+ });
+ }
+ }
+
+ leasefile.close();
+ }
+
+ const ipt = popen('iptables --line-numbers -t nat -xnvL MINIUPNPD 2>/dev/null');
+
+ if (ipt) {
+ for (let line = ipt.read('line'); length(line); line = ipt.read('line')) {
+ let m = match(line, /^([0-9]+)\s+([a-z]+).+dpt:([0-9]+) to:(\S+):([0-9]+)/);
+
+ if (m) {
+ push(rules, {
+ num: m[1],
+ proto: uc(m[2]),
+ extport: +m[3],
+ intaddr: arrtoip(iptoarr(m[4])),
+ intport: +m[5],
+ descr: ''
+ });
+ }
+ }
+
+ ipt.close();
+ }
+
+ const nft = popen('nft --handle list chain inet fw4 upnp_prerouting 2>/dev/null');
+
+ if (nft) {
+ for (let line = nft.read('line'), num = 1; length(line); line = nft.read('line')) {
+ let m = match(line, /^\t\tiif ".+" @nh,72,8 (0x6|0x11) th dport ([0-9]+) dnat ip to ([0-9.]+):([0-9]+)/);
+
+ if (m) {
+ push(rules, {
+ num: `${num}`,
+ proto: (m[1] == '0x6') ? 'TCP' : 'UDP',
+ extport: +m[2],
+ intaddr: arrtoip(iptoarr(m[3])),
+ intport: +m[4],
+ descr: ''
+ });
+
+ num++;
+ }
+ }
+
+ nft.close();
+ }
+
+ return ubus.defer('luci-rpc', 'getHostHints', {}, function(rc, host_hints) {
+ for (let rule in rules) {
+ for (let lease in leases) {
+ if (lease.proto == rule.proto &&
+ lease.intaddr == rule.intaddr &&
+ lease.intport == rule.intport &&
+ lease.extport == rule.extport)
+ {
+ rule.descr = lease.description;
+ break;
+ }
+ }
+
+ for (let mac, hint in host_hints) {
+ if (rule.intaddr in hint.ipaddrs) {
+ rule.host_hint = hint.name;
+ break;
+ }
+ }
+ }
+
+ req.reply({ rules });
+ });
+ }
+ },
+
+ delete_rule: {
+ args: { token: 'token' },
+ call: function(req) {
+ const idx = +req.args?.token;
+
+ if (idx > 0) {
+ const uci = cursor();
+ const leasefile = uci.get('upnpd', 'config', 'upnp_lease_file');
+
+ if (access(leasefile)) {
+ system(['sed', '-i', '-e', `${idx}d`, leasefile]);
+ system(['/etc/init.d/miniupnpd', 'restart']);
+ }
+
+ return { result: 'OK' };
+ }
+
+ return { result: 'Bad request' };
+ }
+ }
+};
+
+return { 'luci.upnp': methods };
+
+
use warnings;
use IPC::Open2;
use POSIX;
+use Text::Balanced qw(gen_extract_tagged);
$ENV{'LC_ALL'} = 'C';
POSIX::setlocale(POSIX::LC_ALL, 'C');
my %keywords = (
'.js' => [ '_:1', '_:1,2c', 'N_:2,3', 'N_:2,3,4c' ],
+ '.ut' => [ '_:1', '_:1,2c', 'N_:2,3', 'N_:2,3,4c' ],
+ '.uc' => [ '_:1', '_:1,2c', 'translate:1', 'translate:1,2c', 'N_:2,3', 'N_:2,3,4c', 'ntranslate:2,3', 'ntranslate:2,3,4c' ],
'.lua' => [ '_:1', '_:1,2c', 'translate:1', 'translate:1,2c', 'translatef:1', 'N_:2,3', 'N_:2,3,4c', 'ntranslate:2,3', 'ntranslate:2,3,4c' ],
'.htm' => [ '_:1', '_:1,2c', 'translate:1', 'translate:1,2c', 'translatef:1', 'N_:2,3', 'N_:2,3,4c', 'ntranslate:2,3', 'ntranslate:2,3,4c' ],
'.json' => [ '_:1', '_:1,2c' ]
if ($ext eq '.htm' || $ext eq '.lua') {
push @cmd, '--language=Lua';
}
- elsif ($ext eq '.js' || $ext eq '.json') {
+ elsif ($ext eq '.ut' || $ext eq '.uc' || $ext eq '.js' || $ext eq '.json') {
push @cmd, '--language=JavaScript';
}
return ("[==[$source]==]", @extra_function_keywords);
}
+sub preprocess_ut($$) {
+ my ($path, $source) = @_;
+
+ # Translate the .ut source into valid JavaScript code by enclosing template text
+ # in multiline comments and extracting blocks as plain code.
+ my $comt = gen_extract_tagged('{#', '#}', '(?s).*?(?=\{[#{%])');
+ my $expr = gen_extract_tagged('{{', '}}', '(?s).*?(?=\{[#{%])');
+ my $stmt = gen_extract_tagged('{%', '%}', '(?s).*?(?=\{[#{%])');
+
+ my $res = '';
+
+ while (length($source)) {
+ my ($block, $remain, $prefix);
+
+ ($block, $remain, $prefix) = $comt->($source);
+ ($block, $remain, $prefix) = $expr->($source) unless defined $block;
+ ($block, $remain, $prefix) = $stmt->($source) unless defined $block;
+
+ last unless defined $block;
+
+ $source = $remain;
+
+ $prefix =~ s!\*/!*\\/!g;
+ $res .= '/*' . $prefix . '*/';
+
+ if ($block =~ s!^\{#(.*)#}$!$1!s) {
+ $block =~ s!\*/!*\\/!g;
+ $res .= '/*' . $block . '*/';
+ }
+ elsif ($block =~ s!^\{\{(.*)}}$!$1!s) {
+ $block =~ s!^[+-]!!;
+ $block =~ s![+-]$!!;
+ $res .= '(' . $block . ')';
+ }
+ elsif ($block =~ s!^\{%(.*)%}$!$1!s) {
+ $block =~ s!^[+-]!!;
+ $block =~ s![+-]$!!;
+ $res .= '{' . $block . '}';
+ }
+ }
+
+ if ($source =~ m!^(.*)\{%[+-]?(.*)$!s) {
+ my $prefix = $1;
+ my $block = $2;
+
+ $prefix =~ s!\*/!*\\/!g;
+ $res .= '/*' . $prefix . '*/';
+ $res .= '{' . $block . '}';
+ }
+
+ return ($res);
+}
+
sub preprocess_lua($$) {
my ($path, $source) = @_;
print $msguniq_in "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n";
-if (open F, "find @ARGV -type f '(' -name '*.htm' -o -name '*.lua' -o -name '*.js' -o -path '*/menu.d/*.json' -o -path '*/acl.d/*.json' -o -path '*/statistics/plugins/*.json' ')' |")
+if (open F, "find @ARGV -type f '(' -name '*.htm' -o -name '*.lua' -o -name '*.js' -o -name '*.uc' -o -name '*.ut' -o -path '*/menu.d/*.json' -o -path '*/acl.d/*.json' -o -path '*/statistics/plugins/*.json' ')' |")
{
while (defined( my $file = readline F))
{
{
($source, @extra_function_keywords) = preprocess_htm($file, $source);
}
+ elsif ($file =~ m!\.ut$!)
+ {
+ ($source, @extra_function_keywords) = preprocess_ut($file, $source);
+ }
elsif ($file =~ m!\.lua$!)
{
($source, @extra_function_keywords) = preprocess_lua($file, $source);
echo -n "Updating modules/luci-base/po/templates/base.pot ... "
./build/i18n-scan.pl \
- modules/luci-base/ modules/luci-compat/ modules/luci-mod-admin-full/ \
+ modules/luci-base/ modules/luci-compat/ modules/luci-lua-runtime/ \
modules/luci-mod-network modules/luci-mod-status modules/luci-mod-system/ \
protocols/ themes/ \
> modules/luci-base/po/templates/base.pot
--- /dev/null
+#!/usr/bin/perl
+# zoneinfo2ucode.pl - Make ucode module from /usr/share/zoneinfo
+# Execute from within root of Luci feed, usually feeds/luci
+
+use strict;
+
+my %TZ;
+
+my $tzdin = $ARGV[0] || "/usr/share/zoneinfo";
+my $tzdout = $ARGV[1] || "./modules/luci-base/ucode/zoneinfo.uc";
+
+local $/ = "\012";
+open( ZTAB, "< $tzdin/zone.tab" ) || die "open($tzdin/zone.tab): $!";
+
+while( ! eof ZTAB ) {
+ chomp( my $line = readline ZTAB );
+ next if $line =~ /^#/ || $line =~ /^\s+$/;
+
+ my ( undef, undef, $zone, @comment ) = split /\s+/, $line;
+
+ printf STDERR "%-40s", $zone;
+
+ if( open ZONE, "< $tzdin/$zone" ) {
+ seek ZONE, -2, 2;
+
+ while( tell(ZONE) > 0 ) {
+ read ZONE, my $char, 1;
+ ( $char eq "\012" ) ? last : seek ZONE, -2, 1;
+ }
+
+ chomp( my $tz = readline ZONE );
+ print STDERR ( $tz || "(no tzinfo found)" ), "\n";
+ close ZONE;
+
+ if( $tz ) {
+ $zone =~ s/_/ /g;
+ $TZ{$zone} = $tz;
+ }
+ }
+ else
+ {
+ print STDERR "open($tzdin/$zone): $!\n";
+ }
+}
+
+close ZTAB;
+
+# Add Etc/GMT zones from manually as they are not in zone.tab
+$TZ{"Etc/GMT"} = "GMT0";
+$TZ{"Etc/GMT-1"} = "<+01>-1";
+$TZ{"Etc/GMT-2"} = "<+02>-2";
+$TZ{"Etc/GMT-3"} = "<+03>-3";
+$TZ{"Etc/GMT-4"} = "<+04>-4";
+$TZ{"Etc/GMT-5"} = "<+05>-5";
+$TZ{"Etc/GMT-6"} = "<+06>-6";
+$TZ{"Etc/GMT-7"} = "<+07>-7";
+$TZ{"Etc/GMT-8"} = "<+08>-8";
+$TZ{"Etc/GMT-9"} = "<+09>-9";
+$TZ{"Etc/GMT-10"} = "<+10>-10";
+$TZ{"Etc/GMT-11"} = "<+11>-11";
+$TZ{"Etc/GMT-12"} = "<+12>-12";
+$TZ{"Etc/GMT-13"} = "<+13>-13";
+$TZ{"Etc/GMT-14"} = "<+14>-14";
+$TZ{"Etc/GMT+1"} = "<-01>1";
+$TZ{"Etc/GMT+2"} = "<-02>2";
+$TZ{"Etc/GMT+3"} = "<-03>3";
+$TZ{"Etc/GMT+4"} = "<-04>4";
+$TZ{"Etc/GMT+5"} = "<-05>5";
+$TZ{"Etc/GMT+6"} = "<-06>6";
+$TZ{"Etc/GMT+7"} = "<-07>7";
+$TZ{"Etc/GMT+8"} = "<-08>8";
+$TZ{"Etc/GMT+9"} = "<-09>9";
+$TZ{"Etc/GMT+10"} = "<-10>10";
+$TZ{"Etc/GMT+11"} = "<-11>11";
+$TZ{"Etc/GMT+12"} = "<-12>12";
+
+open(O, "> $tzdout") || die "open($tzdout): $!\n";
+
+print STDERR "Writing time zones to $tzdout ... ";
+print O <<HEAD;
+// Autogenerated by zoneinfo2ucode.pl
+
+export default {
+HEAD
+
+foreach my $zone ( sort keys %TZ ) {
+ printf O "\t'%s': '%s',\n", $zone, $TZ{$zone}
+}
+
+print O "};\n";
+close O;
+
+print STDERR "done\n";
LUCI_DESCRIPTION:=Standard OpenWrt set including full admin with ppp support and the default Bootstrap theme
LUCI_DEPENDS:= \
+IPV6:luci-proto-ipv6 \
- +libiwinfo-lua \
+luci-app-attendedsysupgrade \
+luci-app-firewall \
+luci-app-opkg \
--- /dev/null
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=ucode-mod-html
+PKG_RELEASE:=1
+PKG_LICENSE:=ISC
+PKG_MAINTAINER:=Jo-Philipp Wich <jo@mein.io>
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/ucode-mod-html
+ SECTION:=utils
+ CATEGORY:=Utilities
+ TITLE:=ucode HTML utility library
+ DEPENDS:=+libucode
+endef
+
+define Package/ucode-mod-html/install
+ $(INSTALL_DIR) $(1)/usr/lib/ucode
+ $(CP) $(PKG_BUILD_DIR)/html.so $(1)/usr/lib/ucode/
+endef
+
+define Build/Configure
+endef
+
+define Build/Compile
+ $(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_LDFLAGS) $(FPIC) \
+ -Wall -ffunction-sections -Wl,--gc-sections -shared \
+ -o $(PKG_BUILD_DIR)/html.so $(PKG_BUILD_DIR)/html.c
+endef
+
+$(eval $(call BuildPackage,ucode-mod-html))
--- /dev/null
+/*
+ * Copyright (C) 2022 Jo-Philipp Wich <jo@mein.io>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <string.h>
+#include <limits.h>
+#include <unistd.h>
+#include <ctype.h>
+
+#include "ucode/module.h"
+
+
+typedef enum {
+ T_TEXT,
+ T_RAW,
+ T_OPEN,
+ T_ATTR,
+ T_CLOSE,
+ T_COMMENT,
+ T_CDATA,
+ T_PROCINST,
+ T_EOF
+} html_token_type_t;
+
+typedef bool (*html_token_callback_t)(html_token_type_t, const char *, size_t, void *);
+
+
+/* The array below encodes all named character entities as specified in
+ * https://html.spec.whatwg.org/multipage/named-characters.html#named-character-references
+ *
+ * Format of value is:
+ * bit 0 - 20: value of second unicode codepoint
+ * bit 21 - 31: unused
+ * bit 32 - 53: value of first unicode codepoint
+ * bit 54 - 62: unused
+ * bit 63: flag indicating whether semicolon is mandatory
+ *
+ * The array is pre-ordered to allow for efficient binary search.
+ */
+static const struct { const char *name; uint64_t value; } named_char_refs[] = {
+ { "AElig", 0x000000c600000000ULL },
+ { "AMP", 0x0000002600000000ULL },
+ { "Aacute", 0x000000c100000000ULL },
+ { "Abreve", 0x8000010200000000ULL },
+ { "Acirc", 0x000000c200000000ULL },
+ { "Acy", 0x8000041000000000ULL },
+ { "Afr", 0x8001d50400000000ULL },
+ { "Agrave", 0x000000c000000000ULL },
+ { "Alpha", 0x8000039100000000ULL },
+ { "Amacr", 0x8000010000000000ULL },
+ { "And", 0x80002a5300000000ULL },
+ { "Aogon", 0x8000010400000000ULL },
+ { "Aopf", 0x8001d53800000000ULL },
+ { "ApplyFunction", 0x8000206100000000ULL },
+ { "Aring", 0x000000c500000000ULL },
+ { "Ascr", 0x8001d49c00000000ULL },
+ { "Assign", 0x8000225400000000ULL },
+ { "Atilde", 0x000000c300000000ULL },
+ { "Auml", 0x000000c400000000ULL },
+ { "Backslash", 0x8000221600000000ULL },
+ { "Barv", 0x80002ae700000000ULL },
+ { "Barwed", 0x8000230600000000ULL },
+ { "Bcy", 0x8000041100000000ULL },
+ { "Because", 0x8000223500000000ULL },
+ { "Bernoullis", 0x8000212c00000000ULL },
+ { "Beta", 0x8000039200000000ULL },
+ { "Bfr", 0x8001d50500000000ULL },
+ { "Bopf", 0x8001d53900000000ULL },
+ { "Breve", 0x800002d800000000ULL },
+ { "Bscr", 0x8000212c00000000ULL },
+ { "Bumpeq", 0x8000224e00000000ULL },
+ { "CHcy", 0x8000042700000000ULL },
+ { "COPY", 0x000000a900000000ULL },
+ { "Cacute", 0x8000010600000000ULL },
+ { "Cap", 0x800022d200000000ULL },
+ { "CapitalDifferentialD", 0x8000214500000000ULL },
+ { "Cayleys", 0x8000212d00000000ULL },
+ { "Ccaron", 0x8000010c00000000ULL },
+ { "Ccedil", 0x000000c700000000ULL },
+ { "Ccirc", 0x8000010800000000ULL },
+ { "Cconint", 0x8000223000000000ULL },
+ { "Cdot", 0x8000010a00000000ULL },
+ { "Cedilla", 0x800000b800000000ULL },
+ { "CenterDot", 0x800000b700000000ULL },
+ { "Cfr", 0x8000212d00000000ULL },
+ { "Chi", 0x800003a700000000ULL },
+ { "CircleDot", 0x8000229900000000ULL },
+ { "CircleMinus", 0x8000229600000000ULL },
+ { "CirclePlus", 0x8000229500000000ULL },
+ { "CircleTimes", 0x8000229700000000ULL },
+ { "ClockwiseContourIntegral", 0x8000223200000000ULL },
+ { "CloseCurlyDoubleQuote", 0x8000201d00000000ULL },
+ { "CloseCurlyQuote", 0x8000201900000000ULL },
+ { "Colon", 0x8000223700000000ULL },
+ { "Colone", 0x80002a7400000000ULL },
+ { "Congruent", 0x8000226100000000ULL },
+ { "Conint", 0x8000222f00000000ULL },
+ { "ContourIntegral", 0x8000222e00000000ULL },
+ { "Copf", 0x8000210200000000ULL },
+ { "Coproduct", 0x8000221000000000ULL },
+ { "CounterClockwiseContourIntegral", 0x8000223300000000ULL },
+ { "Cross", 0x80002a2f00000000ULL },
+ { "Cscr", 0x8001d49e00000000ULL },
+ { "Cup", 0x800022d300000000ULL },
+ { "CupCap", 0x8000224d00000000ULL },
+ { "DD", 0x8000214500000000ULL },
+ { "DDotrahd", 0x8000291100000000ULL },
+ { "DJcy", 0x8000040200000000ULL },
+ { "DScy", 0x8000040500000000ULL },
+ { "DZcy", 0x8000040f00000000ULL },
+ { "Dagger", 0x8000202100000000ULL },
+ { "Darr", 0x800021a100000000ULL },
+ { "Dashv", 0x80002ae400000000ULL },
+ { "Dcaron", 0x8000010e00000000ULL },
+ { "Dcy", 0x8000041400000000ULL },
+ { "Del", 0x8000220700000000ULL },
+ { "Delta", 0x8000039400000000ULL },
+ { "Dfr", 0x8001d50700000000ULL },
+ { "DiacriticalAcute", 0x800000b400000000ULL },
+ { "DiacriticalDot", 0x800002d900000000ULL },
+ { "DiacriticalDoubleAcute", 0x800002dd00000000ULL },
+ { "DiacriticalGrave", 0x8000006000000000ULL },
+ { "DiacriticalTilde", 0x800002dc00000000ULL },
+ { "Diamond", 0x800022c400000000ULL },
+ { "DifferentialD", 0x8000214600000000ULL },
+ { "Dopf", 0x8001d53b00000000ULL },
+ { "Dot", 0x800000a800000000ULL },
+ { "DotDot", 0x800020dc00000000ULL },
+ { "DotEqual", 0x8000225000000000ULL },
+ { "DoubleContourIntegral", 0x8000222f00000000ULL },
+ { "DoubleDot", 0x800000a800000000ULL },
+ { "DoubleDownArrow", 0x800021d300000000ULL },
+ { "DoubleLeftArrow", 0x800021d000000000ULL },
+ { "DoubleLeftRightArrow", 0x800021d400000000ULL },
+ { "DoubleLeftTee", 0x80002ae400000000ULL },
+ { "DoubleLongLeftArrow", 0x800027f800000000ULL },
+ { "DoubleLongLeftRightArrow", 0x800027fa00000000ULL },
+ { "DoubleLongRightArrow", 0x800027f900000000ULL },
+ { "DoubleRightArrow", 0x800021d200000000ULL },
+ { "DoubleRightTee", 0x800022a800000000ULL },
+ { "DoubleUpArrow", 0x800021d100000000ULL },
+ { "DoubleUpDownArrow", 0x800021d500000000ULL },
+ { "DoubleVerticalBar", 0x8000222500000000ULL },
+ { "DownArrow", 0x8000219300000000ULL },
+ { "DownArrowBar", 0x8000291300000000ULL },
+ { "DownArrowUpArrow", 0x800021f500000000ULL },
+ { "DownBreve", 0x8000031100000000ULL },
+ { "DownLeftRightVector", 0x8000295000000000ULL },
+ { "DownLeftTeeVector", 0x8000295e00000000ULL },
+ { "DownLeftVector", 0x800021bd00000000ULL },
+ { "DownLeftVectorBar", 0x8000295600000000ULL },
+ { "DownRightTeeVector", 0x8000295f00000000ULL },
+ { "DownRightVector", 0x800021c100000000ULL },
+ { "DownRightVectorBar", 0x8000295700000000ULL },
+ { "DownTee", 0x800022a400000000ULL },
+ { "DownTeeArrow", 0x800021a700000000ULL },
+ { "Downarrow", 0x800021d300000000ULL },
+ { "Dscr", 0x8001d49f00000000ULL },
+ { "Dstrok", 0x8000011000000000ULL },
+ { "ENG", 0x8000014a00000000ULL },
+ { "ETH", 0x000000d000000000ULL },
+ { "Eacute", 0x000000c900000000ULL },
+ { "Ecaron", 0x8000011a00000000ULL },
+ { "Ecirc", 0x000000ca00000000ULL },
+ { "Ecy", 0x8000042d00000000ULL },
+ { "Edot", 0x8000011600000000ULL },
+ { "Efr", 0x8001d50800000000ULL },
+ { "Egrave", 0x000000c800000000ULL },
+ { "Element", 0x8000220800000000ULL },
+ { "Emacr", 0x8000011200000000ULL },
+ { "EmptySmallSquare", 0x800025fb00000000ULL },
+ { "EmptyVerySmallSquare", 0x800025ab00000000ULL },
+ { "Eogon", 0x8000011800000000ULL },
+ { "Eopf", 0x8001d53c00000000ULL },
+ { "Epsilon", 0x8000039500000000ULL },
+ { "Equal", 0x80002a7500000000ULL },
+ { "EqualTilde", 0x8000224200000000ULL },
+ { "Equilibrium", 0x800021cc00000000ULL },
+ { "Escr", 0x8000213000000000ULL },
+ { "Esim", 0x80002a7300000000ULL },
+ { "Eta", 0x8000039700000000ULL },
+ { "Euml", 0x000000cb00000000ULL },
+ { "Exists", 0x8000220300000000ULL },
+ { "ExponentialE", 0x8000214700000000ULL },
+ { "Fcy", 0x8000042400000000ULL },
+ { "Ffr", 0x8001d50900000000ULL },
+ { "FilledSmallSquare", 0x800025fc00000000ULL },
+ { "FilledVerySmallSquare", 0x800025aa00000000ULL },
+ { "Fopf", 0x8001d53d00000000ULL },
+ { "ForAll", 0x8000220000000000ULL },
+ { "Fouriertrf", 0x8000213100000000ULL },
+ { "Fscr", 0x8000213100000000ULL },
+ { "GJcy", 0x8000040300000000ULL },
+ { "GT", 0x0000003e00000000ULL },
+ { "Gamma", 0x8000039300000000ULL },
+ { "Gammad", 0x800003dc00000000ULL },
+ { "Gbreve", 0x8000011e00000000ULL },
+ { "Gcedil", 0x8000012200000000ULL },
+ { "Gcirc", 0x8000011c00000000ULL },
+ { "Gcy", 0x8000041300000000ULL },
+ { "Gdot", 0x8000012000000000ULL },
+ { "Gfr", 0x8001d50a00000000ULL },
+ { "Gg", 0x800022d900000000ULL },
+ { "Gopf", 0x8001d53e00000000ULL },
+ { "GreaterEqual", 0x8000226500000000ULL },
+ { "GreaterEqualLess", 0x800022db00000000ULL },
+ { "GreaterFullEqual", 0x8000226700000000ULL },
+ { "GreaterGreater", 0x80002aa200000000ULL },
+ { "GreaterLess", 0x8000227700000000ULL },
+ { "GreaterSlantEqual", 0x80002a7e00000000ULL },
+ { "GreaterTilde", 0x8000227300000000ULL },
+ { "Gscr", 0x8001d4a200000000ULL },
+ { "Gt", 0x8000226b00000000ULL },
+ { "HARDcy", 0x8000042a00000000ULL },
+ { "Hacek", 0x800002c700000000ULL },
+ { "Hat", 0x8000005e00000000ULL },
+ { "Hcirc", 0x8000012400000000ULL },
+ { "Hfr", 0x8000210c00000000ULL },
+ { "HilbertSpace", 0x8000210b00000000ULL },
+ { "Hopf", 0x8000210d00000000ULL },
+ { "HorizontalLine", 0x8000250000000000ULL },
+ { "Hscr", 0x8000210b00000000ULL },
+ { "Hstrok", 0x8000012600000000ULL },
+ { "HumpDownHump", 0x8000224e00000000ULL },
+ { "HumpEqual", 0x8000224f00000000ULL },
+ { "IEcy", 0x8000041500000000ULL },
+ { "IJlig", 0x8000013200000000ULL },
+ { "IOcy", 0x8000040100000000ULL },
+ { "Iacute", 0x000000cd00000000ULL },
+ { "Icirc", 0x000000ce00000000ULL },
+ { "Icy", 0x8000041800000000ULL },
+ { "Idot", 0x8000013000000000ULL },
+ { "Ifr", 0x8000211100000000ULL },
+ { "Igrave", 0x000000cc00000000ULL },
+ { "Im", 0x8000211100000000ULL },
+ { "Imacr", 0x8000012a00000000ULL },
+ { "ImaginaryI", 0x8000214800000000ULL },
+ { "Implies", 0x800021d200000000ULL },
+ { "Int", 0x8000222c00000000ULL },
+ { "Integral", 0x8000222b00000000ULL },
+ { "Intersection", 0x800022c200000000ULL },
+ { "InvisibleComma", 0x8000206300000000ULL },
+ { "InvisibleTimes", 0x8000206200000000ULL },
+ { "Iogon", 0x8000012e00000000ULL },
+ { "Iopf", 0x8001d54000000000ULL },
+ { "Iota", 0x8000039900000000ULL },
+ { "Iscr", 0x8000211000000000ULL },
+ { "Itilde", 0x8000012800000000ULL },
+ { "Iukcy", 0x8000040600000000ULL },
+ { "Iuml", 0x000000cf00000000ULL },
+ { "Jcirc", 0x8000013400000000ULL },
+ { "Jcy", 0x8000041900000000ULL },
+ { "Jfr", 0x8001d50d00000000ULL },
+ { "Jopf", 0x8001d54100000000ULL },
+ { "Jscr", 0x8001d4a500000000ULL },
+ { "Jsercy", 0x8000040800000000ULL },
+ { "Jukcy", 0x8000040400000000ULL },
+ { "KHcy", 0x8000042500000000ULL },
+ { "KJcy", 0x8000040c00000000ULL },
+ { "Kappa", 0x8000039a00000000ULL },
+ { "Kcedil", 0x8000013600000000ULL },
+ { "Kcy", 0x8000041a00000000ULL },
+ { "Kfr", 0x8001d50e00000000ULL },
+ { "Kopf", 0x8001d54200000000ULL },
+ { "Kscr", 0x8001d4a600000000ULL },
+ { "LJcy", 0x8000040900000000ULL },
+ { "LT", 0x0000003c00000000ULL },
+ { "Lacute", 0x8000013900000000ULL },
+ { "Lambda", 0x8000039b00000000ULL },
+ { "Lang", 0x800027ea00000000ULL },
+ { "Laplacetrf", 0x8000211200000000ULL },
+ { "Larr", 0x8000219e00000000ULL },
+ { "Lcaron", 0x8000013d00000000ULL },
+ { "Lcedil", 0x8000013b00000000ULL },
+ { "Lcy", 0x8000041b00000000ULL },
+ { "LeftAngleBracket", 0x800027e800000000ULL },
+ { "LeftArrow", 0x8000219000000000ULL },
+ { "LeftArrowBar", 0x800021e400000000ULL },
+ { "LeftArrowRightArrow", 0x800021c600000000ULL },
+ { "LeftCeiling", 0x8000230800000000ULL },
+ { "LeftDoubleBracket", 0x800027e600000000ULL },
+ { "LeftDownTeeVector", 0x8000296100000000ULL },
+ { "LeftDownVector", 0x800021c300000000ULL },
+ { "LeftDownVectorBar", 0x8000295900000000ULL },
+ { "LeftFloor", 0x8000230a00000000ULL },
+ { "LeftRightArrow", 0x8000219400000000ULL },
+ { "LeftRightVector", 0x8000294e00000000ULL },
+ { "LeftTee", 0x800022a300000000ULL },
+ { "LeftTeeArrow", 0x800021a400000000ULL },
+ { "LeftTeeVector", 0x8000295a00000000ULL },
+ { "LeftTriangle", 0x800022b200000000ULL },
+ { "LeftTriangleBar", 0x800029cf00000000ULL },
+ { "LeftTriangleEqual", 0x800022b400000000ULL },
+ { "LeftUpDownVector", 0x8000295100000000ULL },
+ { "LeftUpTeeVector", 0x8000296000000000ULL },
+ { "LeftUpVector", 0x800021bf00000000ULL },
+ { "LeftUpVectorBar", 0x8000295800000000ULL },
+ { "LeftVector", 0x800021bc00000000ULL },
+ { "LeftVectorBar", 0x8000295200000000ULL },
+ { "Leftarrow", 0x800021d000000000ULL },
+ { "Leftrightarrow", 0x800021d400000000ULL },
+ { "LessEqualGreater", 0x800022da00000000ULL },
+ { "LessFullEqual", 0x8000226600000000ULL },
+ { "LessGreater", 0x8000227600000000ULL },
+ { "LessLess", 0x80002aa100000000ULL },
+ { "LessSlantEqual", 0x80002a7d00000000ULL },
+ { "LessTilde", 0x8000227200000000ULL },
+ { "Lfr", 0x8001d50f00000000ULL },
+ { "Ll", 0x800022d800000000ULL },
+ { "Lleftarrow", 0x800021da00000000ULL },
+ { "Lmidot", 0x8000013f00000000ULL },
+ { "LongLeftArrow", 0x800027f500000000ULL },
+ { "LongLeftRightArrow", 0x800027f700000000ULL },
+ { "LongRightArrow", 0x800027f600000000ULL },
+ { "Longleftarrow", 0x800027f800000000ULL },
+ { "Longleftrightarrow", 0x800027fa00000000ULL },
+ { "Longrightarrow", 0x800027f900000000ULL },
+ { "Lopf", 0x8001d54300000000ULL },
+ { "LowerLeftArrow", 0x8000219900000000ULL },
+ { "LowerRightArrow", 0x8000219800000000ULL },
+ { "Lscr", 0x8000211200000000ULL },
+ { "Lsh", 0x800021b000000000ULL },
+ { "Lstrok", 0x8000014100000000ULL },
+ { "Lt", 0x8000226a00000000ULL },
+ { "Map", 0x8000290500000000ULL },
+ { "Mcy", 0x8000041c00000000ULL },
+ { "MediumSpace", 0x8000205f00000000ULL },
+ { "Mellintrf", 0x8000213300000000ULL },
+ { "Mfr", 0x8001d51000000000ULL },
+ { "MinusPlus", 0x8000221300000000ULL },
+ { "Mopf", 0x8001d54400000000ULL },
+ { "Mscr", 0x8000213300000000ULL },
+ { "Mu", 0x8000039c00000000ULL },
+ { "NJcy", 0x8000040a00000000ULL },
+ { "Nacute", 0x8000014300000000ULL },
+ { "Ncaron", 0x8000014700000000ULL },
+ { "Ncedil", 0x8000014500000000ULL },
+ { "Ncy", 0x8000041d00000000ULL },
+ { "NegativeMediumSpace", 0x8000200b00000000ULL },
+ { "NegativeThickSpace", 0x8000200b00000000ULL },
+ { "NegativeThinSpace", 0x8000200b00000000ULL },
+ { "NegativeVeryThinSpace", 0x8000200b00000000ULL },
+ { "NestedGreaterGreater", 0x8000226b00000000ULL },
+ { "NestedLessLess", 0x8000226a00000000ULL },
+ { "NewLine", 0x8000000a00000000ULL },
+ { "Nfr", 0x8001d51100000000ULL },
+ { "NoBreak", 0x8000206000000000ULL },
+ { "NonBreakingSpace", 0x800000a000000000ULL },
+ { "Nopf", 0x8000211500000000ULL },
+ { "Not", 0x80002aec00000000ULL },
+ { "NotCongruent", 0x8000226200000000ULL },
+ { "NotCupCap", 0x8000226d00000000ULL },
+ { "NotDoubleVerticalBar", 0x8000222600000000ULL },
+ { "NotElement", 0x8000220900000000ULL },
+ { "NotEqual", 0x8000226000000000ULL },
+ { "NotEqualTilde", 0x8000224200000338ULL },
+ { "NotExists", 0x8000220400000000ULL },
+ { "NotGreater", 0x8000226f00000000ULL },
+ { "NotGreaterEqual", 0x8000227100000000ULL },
+ { "NotGreaterFullEqual", 0x8000226700000338ULL },
+ { "NotGreaterGreater", 0x8000226b00000338ULL },
+ { "NotGreaterLess", 0x8000227900000000ULL },
+ { "NotGreaterSlantEqual", 0x80002a7e00000338ULL },
+ { "NotGreaterTilde", 0x8000227500000000ULL },
+ { "NotHumpDownHump", 0x8000224e00000338ULL },
+ { "NotHumpEqual", 0x8000224f00000338ULL },
+ { "NotLeftTriangle", 0x800022ea00000000ULL },
+ { "NotLeftTriangleBar", 0x800029cf00000338ULL },
+ { "NotLeftTriangleEqual", 0x800022ec00000000ULL },
+ { "NotLess", 0x8000226e00000000ULL },
+ { "NotLessEqual", 0x8000227000000000ULL },
+ { "NotLessGreater", 0x8000227800000000ULL },
+ { "NotLessLess", 0x8000226a00000338ULL },
+ { "NotLessSlantEqual", 0x80002a7d00000338ULL },
+ { "NotLessTilde", 0x8000227400000000ULL },
+ { "NotNestedGreaterGreater", 0x80002aa200000338ULL },
+ { "NotNestedLessLess", 0x80002aa100000338ULL },
+ { "NotPrecedes", 0x8000228000000000ULL },
+ { "NotPrecedesEqual", 0x80002aaf00000338ULL },
+ { "NotPrecedesSlantEqual", 0x800022e000000000ULL },
+ { "NotReverseElement", 0x8000220c00000000ULL },
+ { "NotRightTriangle", 0x800022eb00000000ULL },
+ { "NotRightTriangleBar", 0x800029d000000338ULL },
+ { "NotRightTriangleEqual", 0x800022ed00000000ULL },
+ { "NotSquareSubset", 0x8000228f00000338ULL },
+ { "NotSquareSubsetEqual", 0x800022e200000000ULL },
+ { "NotSquareSuperset", 0x8000229000000338ULL },
+ { "NotSquareSupersetEqual", 0x800022e300000000ULL },
+ { "NotSubset", 0x80002282000020d2ULL },
+ { "NotSubsetEqual", 0x8000228800000000ULL },
+ { "NotSucceeds", 0x8000228100000000ULL },
+ { "NotSucceedsEqual", 0x80002ab000000338ULL },
+ { "NotSucceedsSlantEqual", 0x800022e100000000ULL },
+ { "NotSucceedsTilde", 0x8000227f00000338ULL },
+ { "NotSuperset", 0x80002283000020d2ULL },
+ { "NotSupersetEqual", 0x8000228900000000ULL },
+ { "NotTilde", 0x8000224100000000ULL },
+ { "NotTildeEqual", 0x8000224400000000ULL },
+ { "NotTildeFullEqual", 0x8000224700000000ULL },
+ { "NotTildeTilde", 0x8000224900000000ULL },
+ { "NotVerticalBar", 0x8000222400000000ULL },
+ { "Nscr", 0x8001d4a900000000ULL },
+ { "Ntilde", 0x000000d100000000ULL },
+ { "Nu", 0x8000039d00000000ULL },
+ { "OElig", 0x8000015200000000ULL },
+ { "Oacute", 0x000000d300000000ULL },
+ { "Ocirc", 0x000000d400000000ULL },
+ { "Ocy", 0x8000041e00000000ULL },
+ { "Odblac", 0x8000015000000000ULL },
+ { "Ofr", 0x8001d51200000000ULL },
+ { "Ograve", 0x000000d200000000ULL },
+ { "Omacr", 0x8000014c00000000ULL },
+ { "Omega", 0x800003a900000000ULL },
+ { "Omicron", 0x8000039f00000000ULL },
+ { "Oopf", 0x8001d54600000000ULL },
+ { "OpenCurlyDoubleQuote", 0x8000201c00000000ULL },
+ { "OpenCurlyQuote", 0x8000201800000000ULL },
+ { "Or", 0x80002a5400000000ULL },
+ { "Oscr", 0x8001d4aa00000000ULL },
+ { "Oslash", 0x000000d800000000ULL },
+ { "Otilde", 0x000000d500000000ULL },
+ { "Otimes", 0x80002a3700000000ULL },
+ { "Ouml", 0x000000d600000000ULL },
+ { "OverBar", 0x8000203e00000000ULL },
+ { "OverBrace", 0x800023de00000000ULL },
+ { "OverBracket", 0x800023b400000000ULL },
+ { "OverParenthesis", 0x800023dc00000000ULL },
+ { "PartialD", 0x8000220200000000ULL },
+ { "Pcy", 0x8000041f00000000ULL },
+ { "Pfr", 0x8001d51300000000ULL },
+ { "Phi", 0x800003a600000000ULL },
+ { "Pi", 0x800003a000000000ULL },
+ { "PlusMinus", 0x800000b100000000ULL },
+ { "Poincareplane", 0x8000210c00000000ULL },
+ { "Popf", 0x8000211900000000ULL },
+ { "Pr", 0x80002abb00000000ULL },
+ { "Precedes", 0x8000227a00000000ULL },
+ { "PrecedesEqual", 0x80002aaf00000000ULL },
+ { "PrecedesSlantEqual", 0x8000227c00000000ULL },
+ { "PrecedesTilde", 0x8000227e00000000ULL },
+ { "Prime", 0x8000203300000000ULL },
+ { "Product", 0x8000220f00000000ULL },
+ { "Proportion", 0x8000223700000000ULL },
+ { "Proportional", 0x8000221d00000000ULL },
+ { "Pscr", 0x8001d4ab00000000ULL },
+ { "Psi", 0x800003a800000000ULL },
+ { "QUOT", 0x0000002200000000ULL },
+ { "Qfr", 0x8001d51400000000ULL },
+ { "Qopf", 0x8000211a00000000ULL },
+ { "Qscr", 0x8001d4ac00000000ULL },
+ { "RBarr", 0x8000291000000000ULL },
+ { "REG", 0x000000ae00000000ULL },
+ { "Racute", 0x8000015400000000ULL },
+ { "Rang", 0x800027eb00000000ULL },
+ { "Rarr", 0x800021a000000000ULL },
+ { "Rarrtl", 0x8000291600000000ULL },
+ { "Rcaron", 0x8000015800000000ULL },
+ { "Rcedil", 0x8000015600000000ULL },
+ { "Rcy", 0x8000042000000000ULL },
+ { "Re", 0x8000211c00000000ULL },
+ { "ReverseElement", 0x8000220b00000000ULL },
+ { "ReverseEquilibrium", 0x800021cb00000000ULL },
+ { "ReverseUpEquilibrium", 0x8000296f00000000ULL },
+ { "Rfr", 0x8000211c00000000ULL },
+ { "Rho", 0x800003a100000000ULL },
+ { "RightAngleBracket", 0x800027e900000000ULL },
+ { "RightArrow", 0x8000219200000000ULL },
+ { "RightArrowBar", 0x800021e500000000ULL },
+ { "RightArrowLeftArrow", 0x800021c400000000ULL },
+ { "RightCeiling", 0x8000230900000000ULL },
+ { "RightDoubleBracket", 0x800027e700000000ULL },
+ { "RightDownTeeVector", 0x8000295d00000000ULL },
+ { "RightDownVector", 0x800021c200000000ULL },
+ { "RightDownVectorBar", 0x8000295500000000ULL },
+ { "RightFloor", 0x8000230b00000000ULL },
+ { "RightTee", 0x800022a200000000ULL },
+ { "RightTeeArrow", 0x800021a600000000ULL },
+ { "RightTeeVector", 0x8000295b00000000ULL },
+ { "RightTriangle", 0x800022b300000000ULL },
+ { "RightTriangleBar", 0x800029d000000000ULL },
+ { "RightTriangleEqual", 0x800022b500000000ULL },
+ { "RightUpDownVector", 0x8000294f00000000ULL },
+ { "RightUpTeeVector", 0x8000295c00000000ULL },
+ { "RightUpVector", 0x800021be00000000ULL },
+ { "RightUpVectorBar", 0x8000295400000000ULL },
+ { "RightVector", 0x800021c000000000ULL },
+ { "RightVectorBar", 0x8000295300000000ULL },
+ { "Rightarrow", 0x800021d200000000ULL },
+ { "Ropf", 0x8000211d00000000ULL },
+ { "RoundImplies", 0x8000297000000000ULL },
+ { "Rrightarrow", 0x800021db00000000ULL },
+ { "Rscr", 0x8000211b00000000ULL },
+ { "Rsh", 0x800021b100000000ULL },
+ { "RuleDelayed", 0x800029f400000000ULL },
+ { "SHCHcy", 0x8000042900000000ULL },
+ { "SHcy", 0x8000042800000000ULL },
+ { "SOFTcy", 0x8000042c00000000ULL },
+ { "Sacute", 0x8000015a00000000ULL },
+ { "Sc", 0x80002abc00000000ULL },
+ { "Scaron", 0x8000016000000000ULL },
+ { "Scedil", 0x8000015e00000000ULL },
+ { "Scirc", 0x8000015c00000000ULL },
+ { "Scy", 0x8000042100000000ULL },
+ { "Sfr", 0x8001d51600000000ULL },
+ { "ShortDownArrow", 0x8000219300000000ULL },
+ { "ShortLeftArrow", 0x8000219000000000ULL },
+ { "ShortRightArrow", 0x8000219200000000ULL },
+ { "ShortUpArrow", 0x8000219100000000ULL },
+ { "Sigma", 0x800003a300000000ULL },
+ { "SmallCircle", 0x8000221800000000ULL },
+ { "Sopf", 0x8001d54a00000000ULL },
+ { "Sqrt", 0x8000221a00000000ULL },
+ { "Square", 0x800025a100000000ULL },
+ { "SquareIntersection", 0x8000229300000000ULL },
+ { "SquareSubset", 0x8000228f00000000ULL },
+ { "SquareSubsetEqual", 0x8000229100000000ULL },
+ { "SquareSuperset", 0x8000229000000000ULL },
+ { "SquareSupersetEqual", 0x8000229200000000ULL },
+ { "SquareUnion", 0x8000229400000000ULL },
+ { "Sscr", 0x8001d4ae00000000ULL },
+ { "Star", 0x800022c600000000ULL },
+ { "Sub", 0x800022d000000000ULL },
+ { "Subset", 0x800022d000000000ULL },
+ { "SubsetEqual", 0x8000228600000000ULL },
+ { "Succeeds", 0x8000227b00000000ULL },
+ { "SucceedsEqual", 0x80002ab000000000ULL },
+ { "SucceedsSlantEqual", 0x8000227d00000000ULL },
+ { "SucceedsTilde", 0x8000227f00000000ULL },
+ { "SuchThat", 0x8000220b00000000ULL },
+ { "Sum", 0x8000221100000000ULL },
+ { "Sup", 0x800022d100000000ULL },
+ { "Superset", 0x8000228300000000ULL },
+ { "SupersetEqual", 0x8000228700000000ULL },
+ { "Supset", 0x800022d100000000ULL },
+ { "THORN", 0x000000de00000000ULL },
+ { "TRADE", 0x8000212200000000ULL },
+ { "TSHcy", 0x8000040b00000000ULL },
+ { "TScy", 0x8000042600000000ULL },
+ { "Tab", 0x8000000900000000ULL },
+ { "Tau", 0x800003a400000000ULL },
+ { "Tcaron", 0x8000016400000000ULL },
+ { "Tcedil", 0x8000016200000000ULL },
+ { "Tcy", 0x8000042200000000ULL },
+ { "Tfr", 0x8001d51700000000ULL },
+ { "Therefore", 0x8000223400000000ULL },
+ { "Theta", 0x8000039800000000ULL },
+ { "ThickSpace", 0x8000205f0000200aULL },
+ { "ThinSpace", 0x8000200900000000ULL },
+ { "Tilde", 0x8000223c00000000ULL },
+ { "TildeEqual", 0x8000224300000000ULL },
+ { "TildeFullEqual", 0x8000224500000000ULL },
+ { "TildeTilde", 0x8000224800000000ULL },
+ { "Topf", 0x8001d54b00000000ULL },
+ { "TripleDot", 0x800020db00000000ULL },
+ { "Tscr", 0x8001d4af00000000ULL },
+ { "Tstrok", 0x8000016600000000ULL },
+ { "Uacute", 0x000000da00000000ULL },
+ { "Uarr", 0x8000219f00000000ULL },
+ { "Uarrocir", 0x8000294900000000ULL },
+ { "Ubrcy", 0x8000040e00000000ULL },
+ { "Ubreve", 0x8000016c00000000ULL },
+ { "Ucirc", 0x000000db00000000ULL },
+ { "Ucy", 0x8000042300000000ULL },
+ { "Udblac", 0x8000017000000000ULL },
+ { "Ufr", 0x8001d51800000000ULL },
+ { "Ugrave", 0x000000d900000000ULL },
+ { "Umacr", 0x8000016a00000000ULL },
+ { "UnderBar", 0x8000005f00000000ULL },
+ { "UnderBrace", 0x800023df00000000ULL },
+ { "UnderBracket", 0x800023b500000000ULL },
+ { "UnderParenthesis", 0x800023dd00000000ULL },
+ { "Union", 0x800022c300000000ULL },
+ { "UnionPlus", 0x8000228e00000000ULL },
+ { "Uogon", 0x8000017200000000ULL },
+ { "Uopf", 0x8001d54c00000000ULL },
+ { "UpArrow", 0x8000219100000000ULL },
+ { "UpArrowBar", 0x8000291200000000ULL },
+ { "UpArrowDownArrow", 0x800021c500000000ULL },
+ { "UpDownArrow", 0x8000219500000000ULL },
+ { "UpEquilibrium", 0x8000296e00000000ULL },
+ { "UpTee", 0x800022a500000000ULL },
+ { "UpTeeArrow", 0x800021a500000000ULL },
+ { "Uparrow", 0x800021d100000000ULL },
+ { "Updownarrow", 0x800021d500000000ULL },
+ { "UpperLeftArrow", 0x8000219600000000ULL },
+ { "UpperRightArrow", 0x8000219700000000ULL },
+ { "Upsi", 0x800003d200000000ULL },
+ { "Upsilon", 0x800003a500000000ULL },
+ { "Uring", 0x8000016e00000000ULL },
+ { "Uscr", 0x8001d4b000000000ULL },
+ { "Utilde", 0x8000016800000000ULL },
+ { "Uuml", 0x000000dc00000000ULL },
+ { "VDash", 0x800022ab00000000ULL },
+ { "Vbar", 0x80002aeb00000000ULL },
+ { "Vcy", 0x8000041200000000ULL },
+ { "Vdash", 0x800022a900000000ULL },
+ { "Vdashl", 0x80002ae600000000ULL },
+ { "Vee", 0x800022c100000000ULL },
+ { "Verbar", 0x8000201600000000ULL },
+ { "Vert", 0x8000201600000000ULL },
+ { "VerticalBar", 0x8000222300000000ULL },
+ { "VerticalLine", 0x8000007c00000000ULL },
+ { "VerticalSeparator", 0x8000275800000000ULL },
+ { "VerticalTilde", 0x8000224000000000ULL },
+ { "VeryThinSpace", 0x8000200a00000000ULL },
+ { "Vfr", 0x8001d51900000000ULL },
+ { "Vopf", 0x8001d54d00000000ULL },
+ { "Vscr", 0x8001d4b100000000ULL },
+ { "Vvdash", 0x800022aa00000000ULL },
+ { "Wcirc", 0x8000017400000000ULL },
+ { "Wedge", 0x800022c000000000ULL },
+ { "Wfr", 0x8001d51a00000000ULL },
+ { "Wopf", 0x8001d54e00000000ULL },
+ { "Wscr", 0x8001d4b200000000ULL },
+ { "Xfr", 0x8001d51b00000000ULL },
+ { "Xi", 0x8000039e00000000ULL },
+ { "Xopf", 0x8001d54f00000000ULL },
+ { "Xscr", 0x8001d4b300000000ULL },
+ { "YAcy", 0x8000042f00000000ULL },
+ { "YIcy", 0x8000040700000000ULL },
+ { "YUcy", 0x8000042e00000000ULL },
+ { "Yacute", 0x000000dd00000000ULL },
+ { "Ycirc", 0x8000017600000000ULL },
+ { "Ycy", 0x8000042b00000000ULL },
+ { "Yfr", 0x8001d51c00000000ULL },
+ { "Yopf", 0x8001d55000000000ULL },
+ { "Yscr", 0x8001d4b400000000ULL },
+ { "Yuml", 0x8000017800000000ULL },
+ { "ZHcy", 0x8000041600000000ULL },
+ { "Zacute", 0x8000017900000000ULL },
+ { "Zcaron", 0x8000017d00000000ULL },
+ { "Zcy", 0x8000041700000000ULL },
+ { "Zdot", 0x8000017b00000000ULL },
+ { "ZeroWidthSpace", 0x8000200b00000000ULL },
+ { "Zeta", 0x8000039600000000ULL },
+ { "Zfr", 0x8000212800000000ULL },
+ { "Zopf", 0x8000212400000000ULL },
+ { "Zscr", 0x8001d4b500000000ULL },
+ { "aacute", 0x000000e100000000ULL },
+ { "abreve", 0x8000010300000000ULL },
+ { "ac", 0x8000223e00000000ULL },
+ { "acE", 0x8000223e00000333ULL },
+ { "acd", 0x8000223f00000000ULL },
+ { "acirc", 0x000000e200000000ULL },
+ { "acute", 0x000000b400000000ULL },
+ { "acy", 0x8000043000000000ULL },
+ { "aelig", 0x000000e600000000ULL },
+ { "af", 0x8000206100000000ULL },
+ { "afr", 0x8001d51e00000000ULL },
+ { "agrave", 0x000000e000000000ULL },
+ { "alefsym", 0x8000213500000000ULL },
+ { "aleph", 0x8000213500000000ULL },
+ { "alpha", 0x800003b100000000ULL },
+ { "amacr", 0x8000010100000000ULL },
+ { "amalg", 0x80002a3f00000000ULL },
+ { "amp", 0x0000002600000000ULL },
+ { "and", 0x8000222700000000ULL },
+ { "andand", 0x80002a5500000000ULL },
+ { "andd", 0x80002a5c00000000ULL },
+ { "andslope", 0x80002a5800000000ULL },
+ { "andv", 0x80002a5a00000000ULL },
+ { "ang", 0x8000222000000000ULL },
+ { "ange", 0x800029a400000000ULL },
+ { "angle", 0x8000222000000000ULL },
+ { "angmsd", 0x8000222100000000ULL },
+ { "angmsdaa", 0x800029a800000000ULL },
+ { "angmsdab", 0x800029a900000000ULL },
+ { "angmsdac", 0x800029aa00000000ULL },
+ { "angmsdad", 0x800029ab00000000ULL },
+ { "angmsdae", 0x800029ac00000000ULL },
+ { "angmsdaf", 0x800029ad00000000ULL },
+ { "angmsdag", 0x800029ae00000000ULL },
+ { "angmsdah", 0x800029af00000000ULL },
+ { "angrt", 0x8000221f00000000ULL },
+ { "angrtvb", 0x800022be00000000ULL },
+ { "angrtvbd", 0x8000299d00000000ULL },
+ { "angsph", 0x8000222200000000ULL },
+ { "angst", 0x800000c500000000ULL },
+ { "angzarr", 0x8000237c00000000ULL },
+ { "aogon", 0x8000010500000000ULL },
+ { "aopf", 0x8001d55200000000ULL },
+ { "ap", 0x8000224800000000ULL },
+ { "apE", 0x80002a7000000000ULL },
+ { "apacir", 0x80002a6f00000000ULL },
+ { "ape", 0x8000224a00000000ULL },
+ { "apid", 0x8000224b00000000ULL },
+ { "apos", 0x8000002700000000ULL },
+ { "approx", 0x8000224800000000ULL },
+ { "approxeq", 0x8000224a00000000ULL },
+ { "aring", 0x000000e500000000ULL },
+ { "ascr", 0x8001d4b600000000ULL },
+ { "ast", 0x8000002a00000000ULL },
+ { "asymp", 0x8000224800000000ULL },
+ { "asympeq", 0x8000224d00000000ULL },
+ { "atilde", 0x000000e300000000ULL },
+ { "auml", 0x000000e400000000ULL },
+ { "awconint", 0x8000223300000000ULL },
+ { "awint", 0x80002a1100000000ULL },
+ { "bNot", 0x80002aed00000000ULL },
+ { "backcong", 0x8000224c00000000ULL },
+ { "backepsilon", 0x800003f600000000ULL },
+ { "backprime", 0x8000203500000000ULL },
+ { "backsim", 0x8000223d00000000ULL },
+ { "backsimeq", 0x800022cd00000000ULL },
+ { "barvee", 0x800022bd00000000ULL },
+ { "barwed", 0x8000230500000000ULL },
+ { "barwedge", 0x8000230500000000ULL },
+ { "bbrk", 0x800023b500000000ULL },
+ { "bbrktbrk", 0x800023b600000000ULL },
+ { "bcong", 0x8000224c00000000ULL },
+ { "bcy", 0x8000043100000000ULL },
+ { "bdquo", 0x8000201e00000000ULL },
+ { "becaus", 0x8000223500000000ULL },
+ { "because", 0x8000223500000000ULL },
+ { "bemptyv", 0x800029b000000000ULL },
+ { "bepsi", 0x800003f600000000ULL },
+ { "bernou", 0x8000212c00000000ULL },
+ { "beta", 0x800003b200000000ULL },
+ { "beth", 0x8000213600000000ULL },
+ { "between", 0x8000226c00000000ULL },
+ { "bfr", 0x8001d51f00000000ULL },
+ { "bigcap", 0x800022c200000000ULL },
+ { "bigcirc", 0x800025ef00000000ULL },
+ { "bigcup", 0x800022c300000000ULL },
+ { "bigodot", 0x80002a0000000000ULL },
+ { "bigoplus", 0x80002a0100000000ULL },
+ { "bigotimes", 0x80002a0200000000ULL },
+ { "bigsqcup", 0x80002a0600000000ULL },
+ { "bigstar", 0x8000260500000000ULL },
+ { "bigtriangledown", 0x800025bd00000000ULL },
+ { "bigtriangleup", 0x800025b300000000ULL },
+ { "biguplus", 0x80002a0400000000ULL },
+ { "bigvee", 0x800022c100000000ULL },
+ { "bigwedge", 0x800022c000000000ULL },
+ { "bkarow", 0x8000290d00000000ULL },
+ { "blacklozenge", 0x800029eb00000000ULL },
+ { "blacksquare", 0x800025aa00000000ULL },
+ { "blacktriangle", 0x800025b400000000ULL },
+ { "blacktriangledown", 0x800025be00000000ULL },
+ { "blacktriangleleft", 0x800025c200000000ULL },
+ { "blacktriangleright", 0x800025b800000000ULL },
+ { "blank", 0x8000242300000000ULL },
+ { "blk12", 0x8000259200000000ULL },
+ { "blk14", 0x8000259100000000ULL },
+ { "blk34", 0x8000259300000000ULL },
+ { "block", 0x8000258800000000ULL },
+ { "bne", 0x8000003d000020e5ULL },
+ { "bnequiv", 0x80002261000020e5ULL },
+ { "bnot", 0x8000231000000000ULL },
+ { "bopf", 0x8001d55300000000ULL },
+ { "bot", 0x800022a500000000ULL },
+ { "bottom", 0x800022a500000000ULL },
+ { "bowtie", 0x800022c800000000ULL },
+ { "boxDL", 0x8000255700000000ULL },
+ { "boxDR", 0x8000255400000000ULL },
+ { "boxDl", 0x8000255600000000ULL },
+ { "boxDr", 0x8000255300000000ULL },
+ { "boxH", 0x8000255000000000ULL },
+ { "boxHD", 0x8000256600000000ULL },
+ { "boxHU", 0x8000256900000000ULL },
+ { "boxHd", 0x8000256400000000ULL },
+ { "boxHu", 0x8000256700000000ULL },
+ { "boxUL", 0x8000255d00000000ULL },
+ { "boxUR", 0x8000255a00000000ULL },
+ { "boxUl", 0x8000255c00000000ULL },
+ { "boxUr", 0x8000255900000000ULL },
+ { "boxV", 0x8000255100000000ULL },
+ { "boxVH", 0x8000256c00000000ULL },
+ { "boxVL", 0x8000256300000000ULL },
+ { "boxVR", 0x8000256000000000ULL },
+ { "boxVh", 0x8000256b00000000ULL },
+ { "boxVl", 0x8000256200000000ULL },
+ { "boxVr", 0x8000255f00000000ULL },
+ { "boxbox", 0x800029c900000000ULL },
+ { "boxdL", 0x8000255500000000ULL },
+ { "boxdR", 0x8000255200000000ULL },
+ { "boxdl", 0x8000251000000000ULL },
+ { "boxdr", 0x8000250c00000000ULL },
+ { "boxh", 0x8000250000000000ULL },
+ { "boxhD", 0x8000256500000000ULL },
+ { "boxhU", 0x8000256800000000ULL },
+ { "boxhd", 0x8000252c00000000ULL },
+ { "boxhu", 0x8000253400000000ULL },
+ { "boxminus", 0x8000229f00000000ULL },
+ { "boxplus", 0x8000229e00000000ULL },
+ { "boxtimes", 0x800022a000000000ULL },
+ { "boxuL", 0x8000255b00000000ULL },
+ { "boxuR", 0x8000255800000000ULL },
+ { "boxul", 0x8000251800000000ULL },
+ { "boxur", 0x8000251400000000ULL },
+ { "boxv", 0x8000250200000000ULL },
+ { "boxvH", 0x8000256a00000000ULL },
+ { "boxvL", 0x8000256100000000ULL },
+ { "boxvR", 0x8000255e00000000ULL },
+ { "boxvh", 0x8000253c00000000ULL },
+ { "boxvl", 0x8000252400000000ULL },
+ { "boxvr", 0x8000251c00000000ULL },
+ { "bprime", 0x8000203500000000ULL },
+ { "breve", 0x800002d800000000ULL },
+ { "brvbar", 0x000000a600000000ULL },
+ { "bscr", 0x8001d4b700000000ULL },
+ { "bsemi", 0x8000204f00000000ULL },
+ { "bsim", 0x8000223d00000000ULL },
+ { "bsime", 0x800022cd00000000ULL },
+ { "bsol", 0x8000005c00000000ULL },
+ { "bsolb", 0x800029c500000000ULL },
+ { "bsolhsub", 0x800027c800000000ULL },
+ { "bull", 0x8000202200000000ULL },
+ { "bullet", 0x8000202200000000ULL },
+ { "bump", 0x8000224e00000000ULL },
+ { "bumpE", 0x80002aae00000000ULL },
+ { "bumpe", 0x8000224f00000000ULL },
+ { "bumpeq", 0x8000224f00000000ULL },
+ { "cacute", 0x8000010700000000ULL },
+ { "cap", 0x8000222900000000ULL },
+ { "capand", 0x80002a4400000000ULL },
+ { "capbrcup", 0x80002a4900000000ULL },
+ { "capcap", 0x80002a4b00000000ULL },
+ { "capcup", 0x80002a4700000000ULL },
+ { "capdot", 0x80002a4000000000ULL },
+ { "caps", 0x800022290000fe00ULL },
+ { "caret", 0x8000204100000000ULL },
+ { "caron", 0x800002c700000000ULL },
+ { "ccaps", 0x80002a4d00000000ULL },
+ { "ccaron", 0x8000010d00000000ULL },
+ { "ccedil", 0x000000e700000000ULL },
+ { "ccirc", 0x8000010900000000ULL },
+ { "ccups", 0x80002a4c00000000ULL },
+ { "ccupssm", 0x80002a5000000000ULL },
+ { "cdot", 0x8000010b00000000ULL },
+ { "cedil", 0x000000b800000000ULL },
+ { "cemptyv", 0x800029b200000000ULL },
+ { "cent", 0x000000a200000000ULL },
+ { "centerdot", 0x800000b700000000ULL },
+ { "cfr", 0x8001d52000000000ULL },
+ { "chcy", 0x8000044700000000ULL },
+ { "check", 0x8000271300000000ULL },
+ { "checkmark", 0x8000271300000000ULL },
+ { "chi", 0x800003c700000000ULL },
+ { "cir", 0x800025cb00000000ULL },
+ { "cirE", 0x800029c300000000ULL },
+ { "circ", 0x800002c600000000ULL },
+ { "circeq", 0x8000225700000000ULL },
+ { "circlearrowleft", 0x800021ba00000000ULL },
+ { "circlearrowright", 0x800021bb00000000ULL },
+ { "circledR", 0x800000ae00000000ULL },
+ { "circledS", 0x800024c800000000ULL },
+ { "circledast", 0x8000229b00000000ULL },
+ { "circledcirc", 0x8000229a00000000ULL },
+ { "circleddash", 0x8000229d00000000ULL },
+ { "cire", 0x8000225700000000ULL },
+ { "cirfnint", 0x80002a1000000000ULL },
+ { "cirmid", 0x80002aef00000000ULL },
+ { "cirscir", 0x800029c200000000ULL },
+ { "clubs", 0x8000266300000000ULL },
+ { "clubsuit", 0x8000266300000000ULL },
+ { "colon", 0x8000003a00000000ULL },
+ { "colone", 0x8000225400000000ULL },
+ { "coloneq", 0x8000225400000000ULL },
+ { "comma", 0x8000002c00000000ULL },
+ { "commat", 0x8000004000000000ULL },
+ { "comp", 0x8000220100000000ULL },
+ { "compfn", 0x8000221800000000ULL },
+ { "complement", 0x8000220100000000ULL },
+ { "complexes", 0x8000210200000000ULL },
+ { "cong", 0x8000224500000000ULL },
+ { "congdot", 0x80002a6d00000000ULL },
+ { "conint", 0x8000222e00000000ULL },
+ { "copf", 0x8001d55400000000ULL },
+ { "coprod", 0x8000221000000000ULL },
+ { "copy", 0x000000a900000000ULL },
+ { "copysr", 0x8000211700000000ULL },
+ { "crarr", 0x800021b500000000ULL },
+ { "cross", 0x8000271700000000ULL },
+ { "cscr", 0x8001d4b800000000ULL },
+ { "csub", 0x80002acf00000000ULL },
+ { "csube", 0x80002ad100000000ULL },
+ { "csup", 0x80002ad000000000ULL },
+ { "csupe", 0x80002ad200000000ULL },
+ { "ctdot", 0x800022ef00000000ULL },
+ { "cudarrl", 0x8000293800000000ULL },
+ { "cudarrr", 0x8000293500000000ULL },
+ { "cuepr", 0x800022de00000000ULL },
+ { "cuesc", 0x800022df00000000ULL },
+ { "cularr", 0x800021b600000000ULL },
+ { "cularrp", 0x8000293d00000000ULL },
+ { "cup", 0x8000222a00000000ULL },
+ { "cupbrcap", 0x80002a4800000000ULL },
+ { "cupcap", 0x80002a4600000000ULL },
+ { "cupcup", 0x80002a4a00000000ULL },
+ { "cupdot", 0x8000228d00000000ULL },
+ { "cupor", 0x80002a4500000000ULL },
+ { "cups", 0x8000222a0000fe00ULL },
+ { "curarr", 0x800021b700000000ULL },
+ { "curarrm", 0x8000293c00000000ULL },
+ { "curlyeqprec", 0x800022de00000000ULL },
+ { "curlyeqsucc", 0x800022df00000000ULL },
+ { "curlyvee", 0x800022ce00000000ULL },
+ { "curlywedge", 0x800022cf00000000ULL },
+ { "curren", 0x000000a400000000ULL },
+ { "curvearrowleft", 0x800021b600000000ULL },
+ { "curvearrowright", 0x800021b700000000ULL },
+ { "cuvee", 0x800022ce00000000ULL },
+ { "cuwed", 0x800022cf00000000ULL },
+ { "cwconint", 0x8000223200000000ULL },
+ { "cwint", 0x8000223100000000ULL },
+ { "cylcty", 0x8000232d00000000ULL },
+ { "dArr", 0x800021d300000000ULL },
+ { "dHar", 0x8000296500000000ULL },
+ { "dagger", 0x8000202000000000ULL },
+ { "daleth", 0x8000213800000000ULL },
+ { "darr", 0x8000219300000000ULL },
+ { "dash", 0x8000201000000000ULL },
+ { "dashv", 0x800022a300000000ULL },
+ { "dbkarow", 0x8000290f00000000ULL },
+ { "dblac", 0x800002dd00000000ULL },
+ { "dcaron", 0x8000010f00000000ULL },
+ { "dcy", 0x8000043400000000ULL },
+ { "dd", 0x8000214600000000ULL },
+ { "ddagger", 0x8000202100000000ULL },
+ { "ddarr", 0x800021ca00000000ULL },
+ { "ddotseq", 0x80002a7700000000ULL },
+ { "deg", 0x000000b000000000ULL },
+ { "delta", 0x800003b400000000ULL },
+ { "demptyv", 0x800029b100000000ULL },
+ { "dfisht", 0x8000297f00000000ULL },
+ { "dfr", 0x8001d52100000000ULL },
+ { "dharl", 0x800021c300000000ULL },
+ { "dharr", 0x800021c200000000ULL },
+ { "diam", 0x800022c400000000ULL },
+ { "diamond", 0x800022c400000000ULL },
+ { "diamondsuit", 0x8000266600000000ULL },
+ { "diams", 0x8000266600000000ULL },
+ { "die", 0x800000a800000000ULL },
+ { "digamma", 0x800003dd00000000ULL },
+ { "disin", 0x800022f200000000ULL },
+ { "div", 0x800000f700000000ULL },
+ { "divide", 0x000000f700000000ULL },
+ { "divideontimes", 0x800022c700000000ULL },
+ { "divonx", 0x800022c700000000ULL },
+ { "djcy", 0x8000045200000000ULL },
+ { "dlcorn", 0x8000231e00000000ULL },
+ { "dlcrop", 0x8000230d00000000ULL },
+ { "dollar", 0x8000002400000000ULL },
+ { "dopf", 0x8001d55500000000ULL },
+ { "dot", 0x800002d900000000ULL },
+ { "doteq", 0x8000225000000000ULL },
+ { "doteqdot", 0x8000225100000000ULL },
+ { "dotminus", 0x8000223800000000ULL },
+ { "dotplus", 0x8000221400000000ULL },
+ { "dotsquare", 0x800022a100000000ULL },
+ { "doublebarwedge", 0x8000230600000000ULL },
+ { "downarrow", 0x8000219300000000ULL },
+ { "downdownarrows", 0x800021ca00000000ULL },
+ { "downharpoonleft", 0x800021c300000000ULL },
+ { "downharpoonright", 0x800021c200000000ULL },
+ { "drbkarow", 0x8000291000000000ULL },
+ { "drcorn", 0x8000231f00000000ULL },
+ { "drcrop", 0x8000230c00000000ULL },
+ { "dscr", 0x8001d4b900000000ULL },
+ { "dscy", 0x8000045500000000ULL },
+ { "dsol", 0x800029f600000000ULL },
+ { "dstrok", 0x8000011100000000ULL },
+ { "dtdot", 0x800022f100000000ULL },
+ { "dtri", 0x800025bf00000000ULL },
+ { "dtrif", 0x800025be00000000ULL },
+ { "duarr", 0x800021f500000000ULL },
+ { "duhar", 0x8000296f00000000ULL },
+ { "dwangle", 0x800029a600000000ULL },
+ { "dzcy", 0x8000045f00000000ULL },
+ { "dzigrarr", 0x800027ff00000000ULL },
+ { "eDDot", 0x80002a7700000000ULL },
+ { "eDot", 0x8000225100000000ULL },
+ { "eacute", 0x000000e900000000ULL },
+ { "easter", 0x80002a6e00000000ULL },
+ { "ecaron", 0x8000011b00000000ULL },
+ { "ecir", 0x8000225600000000ULL },
+ { "ecirc", 0x000000ea00000000ULL },
+ { "ecolon", 0x8000225500000000ULL },
+ { "ecy", 0x8000044d00000000ULL },
+ { "edot", 0x8000011700000000ULL },
+ { "ee", 0x8000214700000000ULL },
+ { "efDot", 0x8000225200000000ULL },
+ { "efr", 0x8001d52200000000ULL },
+ { "eg", 0x80002a9a00000000ULL },
+ { "egrave", 0x000000e800000000ULL },
+ { "egs", 0x80002a9600000000ULL },
+ { "egsdot", 0x80002a9800000000ULL },
+ { "el", 0x80002a9900000000ULL },
+ { "elinters", 0x800023e700000000ULL },
+ { "ell", 0x8000211300000000ULL },
+ { "els", 0x80002a9500000000ULL },
+ { "elsdot", 0x80002a9700000000ULL },
+ { "emacr", 0x8000011300000000ULL },
+ { "empty", 0x8000220500000000ULL },
+ { "emptyset", 0x8000220500000000ULL },
+ { "emptyv", 0x8000220500000000ULL },
+ { "emsp", 0x8000200300000000ULL },
+ { "emsp13", 0x8000200400000000ULL },
+ { "emsp14", 0x8000200500000000ULL },
+ { "eng", 0x8000014b00000000ULL },
+ { "ensp", 0x8000200200000000ULL },
+ { "eogon", 0x8000011900000000ULL },
+ { "eopf", 0x8001d55600000000ULL },
+ { "epar", 0x800022d500000000ULL },
+ { "eparsl", 0x800029e300000000ULL },
+ { "eplus", 0x80002a7100000000ULL },
+ { "epsi", 0x800003b500000000ULL },
+ { "epsilon", 0x800003b500000000ULL },
+ { "epsiv", 0x800003f500000000ULL },
+ { "eqcirc", 0x8000225600000000ULL },
+ { "eqcolon", 0x8000225500000000ULL },
+ { "eqsim", 0x8000224200000000ULL },
+ { "eqslantgtr", 0x80002a9600000000ULL },
+ { "eqslantless", 0x80002a9500000000ULL },
+ { "equals", 0x8000003d00000000ULL },
+ { "equest", 0x8000225f00000000ULL },
+ { "equiv", 0x8000226100000000ULL },
+ { "equivDD", 0x80002a7800000000ULL },
+ { "eqvparsl", 0x800029e500000000ULL },
+ { "erDot", 0x8000225300000000ULL },
+ { "erarr", 0x8000297100000000ULL },
+ { "escr", 0x8000212f00000000ULL },
+ { "esdot", 0x8000225000000000ULL },
+ { "esim", 0x8000224200000000ULL },
+ { "eta", 0x800003b700000000ULL },
+ { "eth", 0x000000f000000000ULL },
+ { "euml", 0x000000eb00000000ULL },
+ { "euro", 0x800020ac00000000ULL },
+ { "excl", 0x8000002100000000ULL },
+ { "exist", 0x8000220300000000ULL },
+ { "expectation", 0x8000213000000000ULL },
+ { "exponentiale", 0x8000214700000000ULL },
+ { "fallingdotseq", 0x8000225200000000ULL },
+ { "fcy", 0x8000044400000000ULL },
+ { "female", 0x8000264000000000ULL },
+ { "ffilig", 0x8000fb0300000000ULL },
+ { "fflig", 0x8000fb0000000000ULL },
+ { "ffllig", 0x8000fb0400000000ULL },
+ { "ffr", 0x8001d52300000000ULL },
+ { "filig", 0x8000fb0100000000ULL },
+ { "fjlig", 0x800000660000006aULL },
+ { "flat", 0x8000266d00000000ULL },
+ { "fllig", 0x8000fb0200000000ULL },
+ { "fltns", 0x800025b100000000ULL },
+ { "fnof", 0x8000019200000000ULL },
+ { "fopf", 0x8001d55700000000ULL },
+ { "forall", 0x8000220000000000ULL },
+ { "fork", 0x800022d400000000ULL },
+ { "forkv", 0x80002ad900000000ULL },
+ { "fpartint", 0x80002a0d00000000ULL },
+ { "frac12", 0x000000bd00000000ULL },
+ { "frac13", 0x8000215300000000ULL },
+ { "frac14", 0x000000bc00000000ULL },
+ { "frac15", 0x8000215500000000ULL },
+ { "frac16", 0x8000215900000000ULL },
+ { "frac18", 0x8000215b00000000ULL },
+ { "frac23", 0x8000215400000000ULL },
+ { "frac25", 0x8000215600000000ULL },
+ { "frac34", 0x000000be00000000ULL },
+ { "frac35", 0x8000215700000000ULL },
+ { "frac38", 0x8000215c00000000ULL },
+ { "frac45", 0x8000215800000000ULL },
+ { "frac56", 0x8000215a00000000ULL },
+ { "frac58", 0x8000215d00000000ULL },
+ { "frac78", 0x8000215e00000000ULL },
+ { "frasl", 0x8000204400000000ULL },
+ { "frown", 0x8000232200000000ULL },
+ { "fscr", 0x8001d4bb00000000ULL },
+ { "gE", 0x8000226700000000ULL },
+ { "gEl", 0x80002a8c00000000ULL },
+ { "gacute", 0x800001f500000000ULL },
+ { "gamma", 0x800003b300000000ULL },
+ { "gammad", 0x800003dd00000000ULL },
+ { "gap", 0x80002a8600000000ULL },
+ { "gbreve", 0x8000011f00000000ULL },
+ { "gcirc", 0x8000011d00000000ULL },
+ { "gcy", 0x8000043300000000ULL },
+ { "gdot", 0x8000012100000000ULL },
+ { "ge", 0x8000226500000000ULL },
+ { "gel", 0x800022db00000000ULL },
+ { "geq", 0x8000226500000000ULL },
+ { "geqq", 0x8000226700000000ULL },
+ { "geqslant", 0x80002a7e00000000ULL },
+ { "ges", 0x80002a7e00000000ULL },
+ { "gescc", 0x80002aa900000000ULL },
+ { "gesdot", 0x80002a8000000000ULL },
+ { "gesdoto", 0x80002a8200000000ULL },
+ { "gesdotol", 0x80002a8400000000ULL },
+ { "gesl", 0x800022db0000fe00ULL },
+ { "gesles", 0x80002a9400000000ULL },
+ { "gfr", 0x8001d52400000000ULL },
+ { "gg", 0x8000226b00000000ULL },
+ { "ggg", 0x800022d900000000ULL },
+ { "gimel", 0x8000213700000000ULL },
+ { "gjcy", 0x8000045300000000ULL },
+ { "gl", 0x8000227700000000ULL },
+ { "glE", 0x80002a9200000000ULL },
+ { "gla", 0x80002aa500000000ULL },
+ { "glj", 0x80002aa400000000ULL },
+ { "gnE", 0x8000226900000000ULL },
+ { "gnap", 0x80002a8a00000000ULL },
+ { "gnapprox", 0x80002a8a00000000ULL },
+ { "gne", 0x80002a8800000000ULL },
+ { "gneq", 0x80002a8800000000ULL },
+ { "gneqq", 0x8000226900000000ULL },
+ { "gnsim", 0x800022e700000000ULL },
+ { "gopf", 0x8001d55800000000ULL },
+ { "grave", 0x8000006000000000ULL },
+ { "gscr", 0x8000210a00000000ULL },
+ { "gsim", 0x8000227300000000ULL },
+ { "gsime", 0x80002a8e00000000ULL },
+ { "gsiml", 0x80002a9000000000ULL },
+ { "gt", 0x0000003e00000000ULL },
+ { "gtcc", 0x80002aa700000000ULL },
+ { "gtcir", 0x80002a7a00000000ULL },
+ { "gtdot", 0x800022d700000000ULL },
+ { "gtlPar", 0x8000299500000000ULL },
+ { "gtquest", 0x80002a7c00000000ULL },
+ { "gtrapprox", 0x80002a8600000000ULL },
+ { "gtrarr", 0x8000297800000000ULL },
+ { "gtrdot", 0x800022d700000000ULL },
+ { "gtreqless", 0x800022db00000000ULL },
+ { "gtreqqless", 0x80002a8c00000000ULL },
+ { "gtrless", 0x8000227700000000ULL },
+ { "gtrsim", 0x8000227300000000ULL },
+ { "gvertneqq", 0x800022690000fe00ULL },
+ { "gvnE", 0x800022690000fe00ULL },
+ { "hArr", 0x800021d400000000ULL },
+ { "hairsp", 0x8000200a00000000ULL },
+ { "half", 0x800000bd00000000ULL },
+ { "hamilt", 0x8000210b00000000ULL },
+ { "hardcy", 0x8000044a00000000ULL },
+ { "harr", 0x8000219400000000ULL },
+ { "harrcir", 0x8000294800000000ULL },
+ { "harrw", 0x800021ad00000000ULL },
+ { "hbar", 0x8000210f00000000ULL },
+ { "hcirc", 0x8000012500000000ULL },
+ { "hearts", 0x8000266500000000ULL },
+ { "heartsuit", 0x8000266500000000ULL },
+ { "hellip", 0x8000202600000000ULL },
+ { "hercon", 0x800022b900000000ULL },
+ { "hfr", 0x8001d52500000000ULL },
+ { "hksearow", 0x8000292500000000ULL },
+ { "hkswarow", 0x8000292600000000ULL },
+ { "hoarr", 0x800021ff00000000ULL },
+ { "homtht", 0x8000223b00000000ULL },
+ { "hookleftarrow", 0x800021a900000000ULL },
+ { "hookrightarrow", 0x800021aa00000000ULL },
+ { "hopf", 0x8001d55900000000ULL },
+ { "horbar", 0x8000201500000000ULL },
+ { "hscr", 0x8001d4bd00000000ULL },
+ { "hslash", 0x8000210f00000000ULL },
+ { "hstrok", 0x8000012700000000ULL },
+ { "hybull", 0x8000204300000000ULL },
+ { "hyphen", 0x8000201000000000ULL },
+ { "iacute", 0x000000ed00000000ULL },
+ { "ic", 0x8000206300000000ULL },
+ { "icirc", 0x000000ee00000000ULL },
+ { "icy", 0x8000043800000000ULL },
+ { "iecy", 0x8000043500000000ULL },
+ { "iexcl", 0x000000a100000000ULL },
+ { "iff", 0x800021d400000000ULL },
+ { "ifr", 0x8001d52600000000ULL },
+ { "igrave", 0x000000ec00000000ULL },
+ { "ii", 0x8000214800000000ULL },
+ { "iiiint", 0x80002a0c00000000ULL },
+ { "iiint", 0x8000222d00000000ULL },
+ { "iinfin", 0x800029dc00000000ULL },
+ { "iiota", 0x8000212900000000ULL },
+ { "ijlig", 0x8000013300000000ULL },
+ { "imacr", 0x8000012b00000000ULL },
+ { "image", 0x8000211100000000ULL },
+ { "imagline", 0x8000211000000000ULL },
+ { "imagpart", 0x8000211100000000ULL },
+ { "imath", 0x8000013100000000ULL },
+ { "imof", 0x800022b700000000ULL },
+ { "imped", 0x800001b500000000ULL },
+ { "in", 0x8000220800000000ULL },
+ { "incare", 0x8000210500000000ULL },
+ { "infin", 0x8000221e00000000ULL },
+ { "infintie", 0x800029dd00000000ULL },
+ { "inodot", 0x8000013100000000ULL },
+ { "int", 0x8000222b00000000ULL },
+ { "intcal", 0x800022ba00000000ULL },
+ { "integers", 0x8000212400000000ULL },
+ { "intercal", 0x800022ba00000000ULL },
+ { "intlarhk", 0x80002a1700000000ULL },
+ { "intprod", 0x80002a3c00000000ULL },
+ { "iocy", 0x8000045100000000ULL },
+ { "iogon", 0x8000012f00000000ULL },
+ { "iopf", 0x8001d55a00000000ULL },
+ { "iota", 0x800003b900000000ULL },
+ { "iprod", 0x80002a3c00000000ULL },
+ { "iquest", 0x000000bf00000000ULL },
+ { "iscr", 0x8001d4be00000000ULL },
+ { "isin", 0x8000220800000000ULL },
+ { "isinE", 0x800022f900000000ULL },
+ { "isindot", 0x800022f500000000ULL },
+ { "isins", 0x800022f400000000ULL },
+ { "isinsv", 0x800022f300000000ULL },
+ { "isinv", 0x8000220800000000ULL },
+ { "it", 0x8000206200000000ULL },
+ { "itilde", 0x8000012900000000ULL },
+ { "iukcy", 0x8000045600000000ULL },
+ { "iuml", 0x000000ef00000000ULL },
+ { "jcirc", 0x8000013500000000ULL },
+ { "jcy", 0x8000043900000000ULL },
+ { "jfr", 0x8001d52700000000ULL },
+ { "jmath", 0x8000023700000000ULL },
+ { "jopf", 0x8001d55b00000000ULL },
+ { "jscr", 0x8001d4bf00000000ULL },
+ { "jsercy", 0x8000045800000000ULL },
+ { "jukcy", 0x8000045400000000ULL },
+ { "kappa", 0x800003ba00000000ULL },
+ { "kappav", 0x800003f000000000ULL },
+ { "kcedil", 0x8000013700000000ULL },
+ { "kcy", 0x8000043a00000000ULL },
+ { "kfr", 0x8001d52800000000ULL },
+ { "kgreen", 0x8000013800000000ULL },
+ { "khcy", 0x8000044500000000ULL },
+ { "kjcy", 0x8000045c00000000ULL },
+ { "kopf", 0x8001d55c00000000ULL },
+ { "kscr", 0x8001d4c000000000ULL },
+ { "lAarr", 0x800021da00000000ULL },
+ { "lArr", 0x800021d000000000ULL },
+ { "lAtail", 0x8000291b00000000ULL },
+ { "lBarr", 0x8000290e00000000ULL },
+ { "lE", 0x8000226600000000ULL },
+ { "lEg", 0x80002a8b00000000ULL },
+ { "lHar", 0x8000296200000000ULL },
+ { "lacute", 0x8000013a00000000ULL },
+ { "laemptyv", 0x800029b400000000ULL },
+ { "lagran", 0x8000211200000000ULL },
+ { "lambda", 0x800003bb00000000ULL },
+ { "lang", 0x800027e800000000ULL },
+ { "langd", 0x8000299100000000ULL },
+ { "langle", 0x800027e800000000ULL },
+ { "lap", 0x80002a8500000000ULL },
+ { "laquo", 0x000000ab00000000ULL },
+ { "larr", 0x8000219000000000ULL },
+ { "larrb", 0x800021e400000000ULL },
+ { "larrbfs", 0x8000291f00000000ULL },
+ { "larrfs", 0x8000291d00000000ULL },
+ { "larrhk", 0x800021a900000000ULL },
+ { "larrlp", 0x800021ab00000000ULL },
+ { "larrpl", 0x8000293900000000ULL },
+ { "larrsim", 0x8000297300000000ULL },
+ { "larrtl", 0x800021a200000000ULL },
+ { "lat", 0x80002aab00000000ULL },
+ { "latail", 0x8000291900000000ULL },
+ { "late", 0x80002aad00000000ULL },
+ { "lates", 0x80002aad0000fe00ULL },
+ { "lbarr", 0x8000290c00000000ULL },
+ { "lbbrk", 0x8000277200000000ULL },
+ { "lbrace", 0x8000007b00000000ULL },
+ { "lbrack", 0x8000005b00000000ULL },
+ { "lbrke", 0x8000298b00000000ULL },
+ { "lbrksld", 0x8000298f00000000ULL },
+ { "lbrkslu", 0x8000298d00000000ULL },
+ { "lcaron", 0x8000013e00000000ULL },
+ { "lcedil", 0x8000013c00000000ULL },
+ { "lceil", 0x8000230800000000ULL },
+ { "lcub", 0x8000007b00000000ULL },
+ { "lcy", 0x8000043b00000000ULL },
+ { "ldca", 0x8000293600000000ULL },
+ { "ldquo", 0x8000201c00000000ULL },
+ { "ldquor", 0x8000201e00000000ULL },
+ { "ldrdhar", 0x8000296700000000ULL },
+ { "ldrushar", 0x8000294b00000000ULL },
+ { "ldsh", 0x800021b200000000ULL },
+ { "le", 0x8000226400000000ULL },
+ { "leftarrow", 0x8000219000000000ULL },
+ { "leftarrowtail", 0x800021a200000000ULL },
+ { "leftharpoondown", 0x800021bd00000000ULL },
+ { "leftharpoonup", 0x800021bc00000000ULL },
+ { "leftleftarrows", 0x800021c700000000ULL },
+ { "leftrightarrow", 0x8000219400000000ULL },
+ { "leftrightarrows", 0x800021c600000000ULL },
+ { "leftrightharpoons", 0x800021cb00000000ULL },
+ { "leftrightsquigarrow", 0x800021ad00000000ULL },
+ { "leftthreetimes", 0x800022cb00000000ULL },
+ { "leg", 0x800022da00000000ULL },
+ { "leq", 0x8000226400000000ULL },
+ { "leqq", 0x8000226600000000ULL },
+ { "leqslant", 0x80002a7d00000000ULL },
+ { "les", 0x80002a7d00000000ULL },
+ { "lescc", 0x80002aa800000000ULL },
+ { "lesdot", 0x80002a7f00000000ULL },
+ { "lesdoto", 0x80002a8100000000ULL },
+ { "lesdotor", 0x80002a8300000000ULL },
+ { "lesg", 0x800022da0000fe00ULL },
+ { "lesges", 0x80002a9300000000ULL },
+ { "lessapprox", 0x80002a8500000000ULL },
+ { "lessdot", 0x800022d600000000ULL },
+ { "lesseqgtr", 0x800022da00000000ULL },
+ { "lesseqqgtr", 0x80002a8b00000000ULL },
+ { "lessgtr", 0x8000227600000000ULL },
+ { "lesssim", 0x8000227200000000ULL },
+ { "lfisht", 0x8000297c00000000ULL },
+ { "lfloor", 0x8000230a00000000ULL },
+ { "lfr", 0x8001d52900000000ULL },
+ { "lg", 0x8000227600000000ULL },
+ { "lgE", 0x80002a9100000000ULL },
+ { "lhard", 0x800021bd00000000ULL },
+ { "lharu", 0x800021bc00000000ULL },
+ { "lharul", 0x8000296a00000000ULL },
+ { "lhblk", 0x8000258400000000ULL },
+ { "ljcy", 0x8000045900000000ULL },
+ { "ll", 0x8000226a00000000ULL },
+ { "llarr", 0x800021c700000000ULL },
+ { "llcorner", 0x8000231e00000000ULL },
+ { "llhard", 0x8000296b00000000ULL },
+ { "lltri", 0x800025fa00000000ULL },
+ { "lmidot", 0x8000014000000000ULL },
+ { "lmoust", 0x800023b000000000ULL },
+ { "lmoustache", 0x800023b000000000ULL },
+ { "lnE", 0x8000226800000000ULL },
+ { "lnap", 0x80002a8900000000ULL },
+ { "lnapprox", 0x80002a8900000000ULL },
+ { "lne", 0x80002a8700000000ULL },
+ { "lneq", 0x80002a8700000000ULL },
+ { "lneqq", 0x8000226800000000ULL },
+ { "lnsim", 0x800022e600000000ULL },
+ { "loang", 0x800027ec00000000ULL },
+ { "loarr", 0x800021fd00000000ULL },
+ { "lobrk", 0x800027e600000000ULL },
+ { "longleftarrow", 0x800027f500000000ULL },
+ { "longleftrightarrow", 0x800027f700000000ULL },
+ { "longmapsto", 0x800027fc00000000ULL },
+ { "longrightarrow", 0x800027f600000000ULL },
+ { "looparrowleft", 0x800021ab00000000ULL },
+ { "looparrowright", 0x800021ac00000000ULL },
+ { "lopar", 0x8000298500000000ULL },
+ { "lopf", 0x8001d55d00000000ULL },
+ { "loplus", 0x80002a2d00000000ULL },
+ { "lotimes", 0x80002a3400000000ULL },
+ { "lowast", 0x8000221700000000ULL },
+ { "lowbar", 0x8000005f00000000ULL },
+ { "loz", 0x800025ca00000000ULL },
+ { "lozenge", 0x800025ca00000000ULL },
+ { "lozf", 0x800029eb00000000ULL },
+ { "lpar", 0x8000002800000000ULL },
+ { "lparlt", 0x8000299300000000ULL },
+ { "lrarr", 0x800021c600000000ULL },
+ { "lrcorner", 0x8000231f00000000ULL },
+ { "lrhar", 0x800021cb00000000ULL },
+ { "lrhard", 0x8000296d00000000ULL },
+ { "lrm", 0x8000200e00000000ULL },
+ { "lrtri", 0x800022bf00000000ULL },
+ { "lsaquo", 0x8000203900000000ULL },
+ { "lscr", 0x8001d4c100000000ULL },
+ { "lsh", 0x800021b000000000ULL },
+ { "lsim", 0x8000227200000000ULL },
+ { "lsime", 0x80002a8d00000000ULL },
+ { "lsimg", 0x80002a8f00000000ULL },
+ { "lsqb", 0x8000005b00000000ULL },
+ { "lsquo", 0x8000201800000000ULL },
+ { "lsquor", 0x8000201a00000000ULL },
+ { "lstrok", 0x8000014200000000ULL },
+ { "lt", 0x0000003c00000000ULL },
+ { "ltcc", 0x80002aa600000000ULL },
+ { "ltcir", 0x80002a7900000000ULL },
+ { "ltdot", 0x800022d600000000ULL },
+ { "lthree", 0x800022cb00000000ULL },
+ { "ltimes", 0x800022c900000000ULL },
+ { "ltlarr", 0x8000297600000000ULL },
+ { "ltquest", 0x80002a7b00000000ULL },
+ { "ltrPar", 0x8000299600000000ULL },
+ { "ltri", 0x800025c300000000ULL },
+ { "ltrie", 0x800022b400000000ULL },
+ { "ltrif", 0x800025c200000000ULL },
+ { "lurdshar", 0x8000294a00000000ULL },
+ { "luruhar", 0x8000296600000000ULL },
+ { "lvertneqq", 0x800022680000fe00ULL },
+ { "lvnE", 0x800022680000fe00ULL },
+ { "mDDot", 0x8000223a00000000ULL },
+ { "macr", 0x000000af00000000ULL },
+ { "male", 0x8000264200000000ULL },
+ { "malt", 0x8000272000000000ULL },
+ { "maltese", 0x8000272000000000ULL },
+ { "map", 0x800021a600000000ULL },
+ { "mapsto", 0x800021a600000000ULL },
+ { "mapstodown", 0x800021a700000000ULL },
+ { "mapstoleft", 0x800021a400000000ULL },
+ { "mapstoup", 0x800021a500000000ULL },
+ { "marker", 0x800025ae00000000ULL },
+ { "mcomma", 0x80002a2900000000ULL },
+ { "mcy", 0x8000043c00000000ULL },
+ { "mdash", 0x8000201400000000ULL },
+ { "measuredangle", 0x8000222100000000ULL },
+ { "mfr", 0x8001d52a00000000ULL },
+ { "mho", 0x8000212700000000ULL },
+ { "micro", 0x000000b500000000ULL },
+ { "mid", 0x8000222300000000ULL },
+ { "midast", 0x8000002a00000000ULL },
+ { "midcir", 0x80002af000000000ULL },
+ { "middot", 0x000000b700000000ULL },
+ { "minus", 0x8000221200000000ULL },
+ { "minusb", 0x8000229f00000000ULL },
+ { "minusd", 0x8000223800000000ULL },
+ { "minusdu", 0x80002a2a00000000ULL },
+ { "mlcp", 0x80002adb00000000ULL },
+ { "mldr", 0x8000202600000000ULL },
+ { "mnplus", 0x8000221300000000ULL },
+ { "models", 0x800022a700000000ULL },
+ { "mopf", 0x8001d55e00000000ULL },
+ { "mp", 0x8000221300000000ULL },
+ { "mscr", 0x8001d4c200000000ULL },
+ { "mstpos", 0x8000223e00000000ULL },
+ { "mu", 0x800003bc00000000ULL },
+ { "multimap", 0x800022b800000000ULL },
+ { "mumap", 0x800022b800000000ULL },
+ { "nGg", 0x800022d900000338ULL },
+ { "nGt", 0x8000226b000020d2ULL },
+ { "nGtv", 0x8000226b00000338ULL },
+ { "nLeftarrow", 0x800021cd00000000ULL },
+ { "nLeftrightarrow", 0x800021ce00000000ULL },
+ { "nLl", 0x800022d800000338ULL },
+ { "nLt", 0x8000226a000020d2ULL },
+ { "nLtv", 0x8000226a00000338ULL },
+ { "nRightarrow", 0x800021cf00000000ULL },
+ { "nVDash", 0x800022af00000000ULL },
+ { "nVdash", 0x800022ae00000000ULL },
+ { "nabla", 0x8000220700000000ULL },
+ { "nacute", 0x8000014400000000ULL },
+ { "nang", 0x80002220000020d2ULL },
+ { "nap", 0x8000224900000000ULL },
+ { "napE", 0x80002a7000000338ULL },
+ { "napid", 0x8000224b00000338ULL },
+ { "napos", 0x8000014900000000ULL },
+ { "napprox", 0x8000224900000000ULL },
+ { "natur", 0x8000266e00000000ULL },
+ { "natural", 0x8000266e00000000ULL },
+ { "naturals", 0x8000211500000000ULL },
+ { "nbsp", 0x000000a000000000ULL },
+ { "nbump", 0x8000224e00000338ULL },
+ { "nbumpe", 0x8000224f00000338ULL },
+ { "ncap", 0x80002a4300000000ULL },
+ { "ncaron", 0x8000014800000000ULL },
+ { "ncedil", 0x8000014600000000ULL },
+ { "ncong", 0x8000224700000000ULL },
+ { "ncongdot", 0x80002a6d00000338ULL },
+ { "ncup", 0x80002a4200000000ULL },
+ { "ncy", 0x8000043d00000000ULL },
+ { "ndash", 0x8000201300000000ULL },
+ { "ne", 0x8000226000000000ULL },
+ { "neArr", 0x800021d700000000ULL },
+ { "nearhk", 0x8000292400000000ULL },
+ { "nearr", 0x8000219700000000ULL },
+ { "nearrow", 0x8000219700000000ULL },
+ { "nedot", 0x8000225000000338ULL },
+ { "nequiv", 0x8000226200000000ULL },
+ { "nesear", 0x8000292800000000ULL },
+ { "nesim", 0x8000224200000338ULL },
+ { "nexist", 0x8000220400000000ULL },
+ { "nexists", 0x8000220400000000ULL },
+ { "nfr", 0x8001d52b00000000ULL },
+ { "ngE", 0x8000226700000338ULL },
+ { "nge", 0x8000227100000000ULL },
+ { "ngeq", 0x8000227100000000ULL },
+ { "ngeqq", 0x8000226700000338ULL },
+ { "ngeqslant", 0x80002a7e00000338ULL },
+ { "nges", 0x80002a7e00000338ULL },
+ { "ngsim", 0x8000227500000000ULL },
+ { "ngt", 0x8000226f00000000ULL },
+ { "ngtr", 0x8000226f00000000ULL },
+ { "nhArr", 0x800021ce00000000ULL },
+ { "nharr", 0x800021ae00000000ULL },
+ { "nhpar", 0x80002af200000000ULL },
+ { "ni", 0x8000220b00000000ULL },
+ { "nis", 0x800022fc00000000ULL },
+ { "nisd", 0x800022fa00000000ULL },
+ { "niv", 0x8000220b00000000ULL },
+ { "njcy", 0x8000045a00000000ULL },
+ { "nlArr", 0x800021cd00000000ULL },
+ { "nlE", 0x8000226600000338ULL },
+ { "nlarr", 0x8000219a00000000ULL },
+ { "nldr", 0x8000202500000000ULL },
+ { "nle", 0x8000227000000000ULL },
+ { "nleftarrow", 0x8000219a00000000ULL },
+ { "nleftrightarrow", 0x800021ae00000000ULL },
+ { "nleq", 0x8000227000000000ULL },
+ { "nleqq", 0x8000226600000338ULL },
+ { "nleqslant", 0x80002a7d00000338ULL },
+ { "nles", 0x80002a7d00000338ULL },
+ { "nless", 0x8000226e00000000ULL },
+ { "nlsim", 0x8000227400000000ULL },
+ { "nlt", 0x8000226e00000000ULL },
+ { "nltri", 0x800022ea00000000ULL },
+ { "nltrie", 0x800022ec00000000ULL },
+ { "nmid", 0x8000222400000000ULL },
+ { "nopf", 0x8001d55f00000000ULL },
+ { "not", 0x000000ac00000000ULL },
+ { "notin", 0x8000220900000000ULL },
+ { "notinE", 0x800022f900000338ULL },
+ { "notindot", 0x800022f500000338ULL },
+ { "notinva", 0x8000220900000000ULL },
+ { "notinvb", 0x800022f700000000ULL },
+ { "notinvc", 0x800022f600000000ULL },
+ { "notni", 0x8000220c00000000ULL },
+ { "notniva", 0x8000220c00000000ULL },
+ { "notnivb", 0x800022fe00000000ULL },
+ { "notnivc", 0x800022fd00000000ULL },
+ { "npar", 0x8000222600000000ULL },
+ { "nparallel", 0x8000222600000000ULL },
+ { "nparsl", 0x80002afd000020e5ULL },
+ { "npart", 0x8000220200000338ULL },
+ { "npolint", 0x80002a1400000000ULL },
+ { "npr", 0x8000228000000000ULL },
+ { "nprcue", 0x800022e000000000ULL },
+ { "npre", 0x80002aaf00000338ULL },
+ { "nprec", 0x8000228000000000ULL },
+ { "npreceq", 0x80002aaf00000338ULL },
+ { "nrArr", 0x800021cf00000000ULL },
+ { "nrarr", 0x8000219b00000000ULL },
+ { "nrarrc", 0x8000293300000338ULL },
+ { "nrarrw", 0x8000219d00000338ULL },
+ { "nrightarrow", 0x8000219b00000000ULL },
+ { "nrtri", 0x800022eb00000000ULL },
+ { "nrtrie", 0x800022ed00000000ULL },
+ { "nsc", 0x8000228100000000ULL },
+ { "nsccue", 0x800022e100000000ULL },
+ { "nsce", 0x80002ab000000338ULL },
+ { "nscr", 0x8001d4c300000000ULL },
+ { "nshortmid", 0x8000222400000000ULL },
+ { "nshortparallel", 0x8000222600000000ULL },
+ { "nsim", 0x8000224100000000ULL },
+ { "nsime", 0x8000224400000000ULL },
+ { "nsimeq", 0x8000224400000000ULL },
+ { "nsmid", 0x8000222400000000ULL },
+ { "nspar", 0x8000222600000000ULL },
+ { "nsqsube", 0x800022e200000000ULL },
+ { "nsqsupe", 0x800022e300000000ULL },
+ { "nsub", 0x8000228400000000ULL },
+ { "nsubE", 0x80002ac500000338ULL },
+ { "nsube", 0x8000228800000000ULL },
+ { "nsubset", 0x80002282000020d2ULL },
+ { "nsubseteq", 0x8000228800000000ULL },
+ { "nsubseteqq", 0x80002ac500000338ULL },
+ { "nsucc", 0x8000228100000000ULL },
+ { "nsucceq", 0x80002ab000000338ULL },
+ { "nsup", 0x8000228500000000ULL },
+ { "nsupE", 0x80002ac600000338ULL },
+ { "nsupe", 0x8000228900000000ULL },
+ { "nsupset", 0x80002283000020d2ULL },
+ { "nsupseteq", 0x8000228900000000ULL },
+ { "nsupseteqq", 0x80002ac600000338ULL },
+ { "ntgl", 0x8000227900000000ULL },
+ { "ntilde", 0x000000f100000000ULL },
+ { "ntlg", 0x8000227800000000ULL },
+ { "ntriangleleft", 0x800022ea00000000ULL },
+ { "ntrianglelefteq", 0x800022ec00000000ULL },
+ { "ntriangleright", 0x800022eb00000000ULL },
+ { "ntrianglerighteq", 0x800022ed00000000ULL },
+ { "nu", 0x800003bd00000000ULL },
+ { "num", 0x8000002300000000ULL },
+ { "numero", 0x8000211600000000ULL },
+ { "numsp", 0x8000200700000000ULL },
+ { "nvDash", 0x800022ad00000000ULL },
+ { "nvHarr", 0x8000290400000000ULL },
+ { "nvap", 0x8000224d000020d2ULL },
+ { "nvdash", 0x800022ac00000000ULL },
+ { "nvge", 0x80002265000020d2ULL },
+ { "nvgt", 0x8000003e000020d2ULL },
+ { "nvinfin", 0x800029de00000000ULL },
+ { "nvlArr", 0x8000290200000000ULL },
+ { "nvle", 0x80002264000020d2ULL },
+ { "nvlt", 0x8000003c000020d2ULL },
+ { "nvltrie", 0x800022b4000020d2ULL },
+ { "nvrArr", 0x8000290300000000ULL },
+ { "nvrtrie", 0x800022b5000020d2ULL },
+ { "nvsim", 0x8000223c000020d2ULL },
+ { "nwArr", 0x800021d600000000ULL },
+ { "nwarhk", 0x8000292300000000ULL },
+ { "nwarr", 0x8000219600000000ULL },
+ { "nwarrow", 0x8000219600000000ULL },
+ { "nwnear", 0x8000292700000000ULL },
+ { "oS", 0x800024c800000000ULL },
+ { "oacute", 0x000000f300000000ULL },
+ { "oast", 0x8000229b00000000ULL },
+ { "ocir", 0x8000229a00000000ULL },
+ { "ocirc", 0x000000f400000000ULL },
+ { "ocy", 0x8000043e00000000ULL },
+ { "odash", 0x8000229d00000000ULL },
+ { "odblac", 0x8000015100000000ULL },
+ { "odiv", 0x80002a3800000000ULL },
+ { "odot", 0x8000229900000000ULL },
+ { "odsold", 0x800029bc00000000ULL },
+ { "oelig", 0x8000015300000000ULL },
+ { "ofcir", 0x800029bf00000000ULL },
+ { "ofr", 0x8001d52c00000000ULL },
+ { "ogon", 0x800002db00000000ULL },
+ { "ograve", 0x000000f200000000ULL },
+ { "ogt", 0x800029c100000000ULL },
+ { "ohbar", 0x800029b500000000ULL },
+ { "ohm", 0x800003a900000000ULL },
+ { "oint", 0x8000222e00000000ULL },
+ { "olarr", 0x800021ba00000000ULL },
+ { "olcir", 0x800029be00000000ULL },
+ { "olcross", 0x800029bb00000000ULL },
+ { "oline", 0x8000203e00000000ULL },
+ { "olt", 0x800029c000000000ULL },
+ { "omacr", 0x8000014d00000000ULL },
+ { "omega", 0x800003c900000000ULL },
+ { "omicron", 0x800003bf00000000ULL },
+ { "omid", 0x800029b600000000ULL },
+ { "ominus", 0x8000229600000000ULL },
+ { "oopf", 0x8001d56000000000ULL },
+ { "opar", 0x800029b700000000ULL },
+ { "operp", 0x800029b900000000ULL },
+ { "oplus", 0x8000229500000000ULL },
+ { "or", 0x8000222800000000ULL },
+ { "orarr", 0x800021bb00000000ULL },
+ { "ord", 0x80002a5d00000000ULL },
+ { "order", 0x8000213400000000ULL },
+ { "orderof", 0x8000213400000000ULL },
+ { "ordf", 0x000000aa00000000ULL },
+ { "ordm", 0x000000ba00000000ULL },
+ { "origof", 0x800022b600000000ULL },
+ { "oror", 0x80002a5600000000ULL },
+ { "orslope", 0x80002a5700000000ULL },
+ { "orv", 0x80002a5b00000000ULL },
+ { "oscr", 0x8000213400000000ULL },
+ { "oslash", 0x000000f800000000ULL },
+ { "osol", 0x8000229800000000ULL },
+ { "otilde", 0x000000f500000000ULL },
+ { "otimes", 0x8000229700000000ULL },
+ { "otimesas", 0x80002a3600000000ULL },
+ { "ouml", 0x000000f600000000ULL },
+ { "ovbar", 0x8000233d00000000ULL },
+ { "par", 0x8000222500000000ULL },
+ { "para", 0x000000b600000000ULL },
+ { "parallel", 0x8000222500000000ULL },
+ { "parsim", 0x80002af300000000ULL },
+ { "parsl", 0x80002afd00000000ULL },
+ { "part", 0x8000220200000000ULL },
+ { "pcy", 0x8000043f00000000ULL },
+ { "percnt", 0x8000002500000000ULL },
+ { "period", 0x8000002e00000000ULL },
+ { "permil", 0x8000203000000000ULL },
+ { "perp", 0x800022a500000000ULL },
+ { "pertenk", 0x8000203100000000ULL },
+ { "pfr", 0x8001d52d00000000ULL },
+ { "phi", 0x800003c600000000ULL },
+ { "phiv", 0x800003d500000000ULL },
+ { "phmmat", 0x8000213300000000ULL },
+ { "phone", 0x8000260e00000000ULL },
+ { "pi", 0x800003c000000000ULL },
+ { "pitchfork", 0x800022d400000000ULL },
+ { "piv", 0x800003d600000000ULL },
+ { "planck", 0x8000210f00000000ULL },
+ { "planckh", 0x8000210e00000000ULL },
+ { "plankv", 0x8000210f00000000ULL },
+ { "plus", 0x8000002b00000000ULL },
+ { "plusacir", 0x80002a2300000000ULL },
+ { "plusb", 0x8000229e00000000ULL },
+ { "pluscir", 0x80002a2200000000ULL },
+ { "plusdo", 0x8000221400000000ULL },
+ { "plusdu", 0x80002a2500000000ULL },
+ { "pluse", 0x80002a7200000000ULL },
+ { "plusmn", 0x000000b100000000ULL },
+ { "plussim", 0x80002a2600000000ULL },
+ { "plustwo", 0x80002a2700000000ULL },
+ { "pm", 0x800000b100000000ULL },
+ { "pointint", 0x80002a1500000000ULL },
+ { "popf", 0x8001d56100000000ULL },
+ { "pound", 0x000000a300000000ULL },
+ { "pr", 0x8000227a00000000ULL },
+ { "prE", 0x80002ab300000000ULL },
+ { "prap", 0x80002ab700000000ULL },
+ { "prcue", 0x8000227c00000000ULL },
+ { "pre", 0x80002aaf00000000ULL },
+ { "prec", 0x8000227a00000000ULL },
+ { "precapprox", 0x80002ab700000000ULL },
+ { "preccurlyeq", 0x8000227c00000000ULL },
+ { "preceq", 0x80002aaf00000000ULL },
+ { "precnapprox", 0x80002ab900000000ULL },
+ { "precneqq", 0x80002ab500000000ULL },
+ { "precnsim", 0x800022e800000000ULL },
+ { "precsim", 0x8000227e00000000ULL },
+ { "prime", 0x8000203200000000ULL },
+ { "primes", 0x8000211900000000ULL },
+ { "prnE", 0x80002ab500000000ULL },
+ { "prnap", 0x80002ab900000000ULL },
+ { "prnsim", 0x800022e800000000ULL },
+ { "prod", 0x8000220f00000000ULL },
+ { "profalar", 0x8000232e00000000ULL },
+ { "profline", 0x8000231200000000ULL },
+ { "profsurf", 0x8000231300000000ULL },
+ { "prop", 0x8000221d00000000ULL },
+ { "propto", 0x8000221d00000000ULL },
+ { "prsim", 0x8000227e00000000ULL },
+ { "prurel", 0x800022b000000000ULL },
+ { "pscr", 0x8001d4c500000000ULL },
+ { "psi", 0x800003c800000000ULL },
+ { "puncsp", 0x8000200800000000ULL },
+ { "qfr", 0x8001d52e00000000ULL },
+ { "qint", 0x80002a0c00000000ULL },
+ { "qopf", 0x8001d56200000000ULL },
+ { "qprime", 0x8000205700000000ULL },
+ { "qscr", 0x8001d4c600000000ULL },
+ { "quaternions", 0x8000210d00000000ULL },
+ { "quatint", 0x80002a1600000000ULL },
+ { "quest", 0x8000003f00000000ULL },
+ { "questeq", 0x8000225f00000000ULL },
+ { "quot", 0x0000002200000000ULL },
+ { "rAarr", 0x800021db00000000ULL },
+ { "rArr", 0x800021d200000000ULL },
+ { "rAtail", 0x8000291c00000000ULL },
+ { "rBarr", 0x8000290f00000000ULL },
+ { "rHar", 0x8000296400000000ULL },
+ { "race", 0x8000223d00000331ULL },
+ { "racute", 0x8000015500000000ULL },
+ { "radic", 0x8000221a00000000ULL },
+ { "raemptyv", 0x800029b300000000ULL },
+ { "rang", 0x800027e900000000ULL },
+ { "rangd", 0x8000299200000000ULL },
+ { "range", 0x800029a500000000ULL },
+ { "rangle", 0x800027e900000000ULL },
+ { "raquo", 0x000000bb00000000ULL },
+ { "rarr", 0x8000219200000000ULL },
+ { "rarrap", 0x8000297500000000ULL },
+ { "rarrb", 0x800021e500000000ULL },
+ { "rarrbfs", 0x8000292000000000ULL },
+ { "rarrc", 0x8000293300000000ULL },
+ { "rarrfs", 0x8000291e00000000ULL },
+ { "rarrhk", 0x800021aa00000000ULL },
+ { "rarrlp", 0x800021ac00000000ULL },
+ { "rarrpl", 0x8000294500000000ULL },
+ { "rarrsim", 0x8000297400000000ULL },
+ { "rarrtl", 0x800021a300000000ULL },
+ { "rarrw", 0x8000219d00000000ULL },
+ { "ratail", 0x8000291a00000000ULL },
+ { "ratio", 0x8000223600000000ULL },
+ { "rationals", 0x8000211a00000000ULL },
+ { "rbarr", 0x8000290d00000000ULL },
+ { "rbbrk", 0x8000277300000000ULL },
+ { "rbrace", 0x8000007d00000000ULL },
+ { "rbrack", 0x8000005d00000000ULL },
+ { "rbrke", 0x8000298c00000000ULL },
+ { "rbrksld", 0x8000298e00000000ULL },
+ { "rbrkslu", 0x8000299000000000ULL },
+ { "rcaron", 0x8000015900000000ULL },
+ { "rcedil", 0x8000015700000000ULL },
+ { "rceil", 0x8000230900000000ULL },
+ { "rcub", 0x8000007d00000000ULL },
+ { "rcy", 0x8000044000000000ULL },
+ { "rdca", 0x8000293700000000ULL },
+ { "rdldhar", 0x8000296900000000ULL },
+ { "rdquo", 0x8000201d00000000ULL },
+ { "rdquor", 0x8000201d00000000ULL },
+ { "rdsh", 0x800021b300000000ULL },
+ { "real", 0x8000211c00000000ULL },
+ { "realine", 0x8000211b00000000ULL },
+ { "realpart", 0x8000211c00000000ULL },
+ { "reals", 0x8000211d00000000ULL },
+ { "rect", 0x800025ad00000000ULL },
+ { "reg", 0x000000ae00000000ULL },
+ { "rfisht", 0x8000297d00000000ULL },
+ { "rfloor", 0x8000230b00000000ULL },
+ { "rfr", 0x8001d52f00000000ULL },
+ { "rhard", 0x800021c100000000ULL },
+ { "rharu", 0x800021c000000000ULL },
+ { "rharul", 0x8000296c00000000ULL },
+ { "rho", 0x800003c100000000ULL },
+ { "rhov", 0x800003f100000000ULL },
+ { "rightarrow", 0x8000219200000000ULL },
+ { "rightarrowtail", 0x800021a300000000ULL },
+ { "rightharpoondown", 0x800021c100000000ULL },
+ { "rightharpoonup", 0x800021c000000000ULL },
+ { "rightleftarrows", 0x800021c400000000ULL },
+ { "rightleftharpoons", 0x800021cc00000000ULL },
+ { "rightrightarrows", 0x800021c900000000ULL },
+ { "rightsquigarrow", 0x8000219d00000000ULL },
+ { "rightthreetimes", 0x800022cc00000000ULL },
+ { "ring", 0x800002da00000000ULL },
+ { "risingdotseq", 0x8000225300000000ULL },
+ { "rlarr", 0x800021c400000000ULL },
+ { "rlhar", 0x800021cc00000000ULL },
+ { "rlm", 0x8000200f00000000ULL },
+ { "rmoust", 0x800023b100000000ULL },
+ { "rmoustache", 0x800023b100000000ULL },
+ { "rnmid", 0x80002aee00000000ULL },
+ { "roang", 0x800027ed00000000ULL },
+ { "roarr", 0x800021fe00000000ULL },
+ { "robrk", 0x800027e700000000ULL },
+ { "ropar", 0x8000298600000000ULL },
+ { "ropf", 0x8001d56300000000ULL },
+ { "roplus", 0x80002a2e00000000ULL },
+ { "rotimes", 0x80002a3500000000ULL },
+ { "rpar", 0x8000002900000000ULL },
+ { "rpargt", 0x8000299400000000ULL },
+ { "rppolint", 0x80002a1200000000ULL },
+ { "rrarr", 0x800021c900000000ULL },
+ { "rsaquo", 0x8000203a00000000ULL },
+ { "rscr", 0x8001d4c700000000ULL },
+ { "rsh", 0x800021b100000000ULL },
+ { "rsqb", 0x8000005d00000000ULL },
+ { "rsquo", 0x8000201900000000ULL },
+ { "rsquor", 0x8000201900000000ULL },
+ { "rthree", 0x800022cc00000000ULL },
+ { "rtimes", 0x800022ca00000000ULL },
+ { "rtri", 0x800025b900000000ULL },
+ { "rtrie", 0x800022b500000000ULL },
+ { "rtrif", 0x800025b800000000ULL },
+ { "rtriltri", 0x800029ce00000000ULL },
+ { "ruluhar", 0x8000296800000000ULL },
+ { "rx", 0x8000211e00000000ULL },
+ { "sacute", 0x8000015b00000000ULL },
+ { "sbquo", 0x8000201a00000000ULL },
+ { "sc", 0x8000227b00000000ULL },
+ { "scE", 0x80002ab400000000ULL },
+ { "scap", 0x80002ab800000000ULL },
+ { "scaron", 0x8000016100000000ULL },
+ { "sccue", 0x8000227d00000000ULL },
+ { "sce", 0x80002ab000000000ULL },
+ { "scedil", 0x8000015f00000000ULL },
+ { "scirc", 0x8000015d00000000ULL },
+ { "scnE", 0x80002ab600000000ULL },
+ { "scnap", 0x80002aba00000000ULL },
+ { "scnsim", 0x800022e900000000ULL },
+ { "scpolint", 0x80002a1300000000ULL },
+ { "scsim", 0x8000227f00000000ULL },
+ { "scy", 0x8000044100000000ULL },
+ { "sdot", 0x800022c500000000ULL },
+ { "sdotb", 0x800022a100000000ULL },
+ { "sdote", 0x80002a6600000000ULL },
+ { "seArr", 0x800021d800000000ULL },
+ { "searhk", 0x8000292500000000ULL },
+ { "searr", 0x8000219800000000ULL },
+ { "searrow", 0x8000219800000000ULL },
+ { "sect", 0x000000a700000000ULL },
+ { "semi", 0x8000003b00000000ULL },
+ { "seswar", 0x8000292900000000ULL },
+ { "setminus", 0x8000221600000000ULL },
+ { "setmn", 0x8000221600000000ULL },
+ { "sext", 0x8000273600000000ULL },
+ { "sfr", 0x8001d53000000000ULL },
+ { "sfrown", 0x8000232200000000ULL },
+ { "sharp", 0x8000266f00000000ULL },
+ { "shchcy", 0x8000044900000000ULL },
+ { "shcy", 0x8000044800000000ULL },
+ { "shortmid", 0x8000222300000000ULL },
+ { "shortparallel", 0x8000222500000000ULL },
+ { "shy", 0x000000ad00000000ULL },
+ { "sigma", 0x800003c300000000ULL },
+ { "sigmaf", 0x800003c200000000ULL },
+ { "sigmav", 0x800003c200000000ULL },
+ { "sim", 0x8000223c00000000ULL },
+ { "simdot", 0x80002a6a00000000ULL },
+ { "sime", 0x8000224300000000ULL },
+ { "simeq", 0x8000224300000000ULL },
+ { "simg", 0x80002a9e00000000ULL },
+ { "simgE", 0x80002aa000000000ULL },
+ { "siml", 0x80002a9d00000000ULL },
+ { "simlE", 0x80002a9f00000000ULL },
+ { "simne", 0x8000224600000000ULL },
+ { "simplus", 0x80002a2400000000ULL },
+ { "simrarr", 0x8000297200000000ULL },
+ { "slarr", 0x8000219000000000ULL },
+ { "smallsetminus", 0x8000221600000000ULL },
+ { "smashp", 0x80002a3300000000ULL },
+ { "smeparsl", 0x800029e400000000ULL },
+ { "smid", 0x8000222300000000ULL },
+ { "smile", 0x8000232300000000ULL },
+ { "smt", 0x80002aaa00000000ULL },
+ { "smte", 0x80002aac00000000ULL },
+ { "smtes", 0x80002aac0000fe00ULL },
+ { "softcy", 0x8000044c00000000ULL },
+ { "sol", 0x8000002f00000000ULL },
+ { "solb", 0x800029c400000000ULL },
+ { "solbar", 0x8000233f00000000ULL },
+ { "sopf", 0x8001d56400000000ULL },
+ { "spades", 0x8000266000000000ULL },
+ { "spadesuit", 0x8000266000000000ULL },
+ { "spar", 0x8000222500000000ULL },
+ { "sqcap", 0x8000229300000000ULL },
+ { "sqcaps", 0x800022930000fe00ULL },
+ { "sqcup", 0x8000229400000000ULL },
+ { "sqcups", 0x800022940000fe00ULL },
+ { "sqsub", 0x8000228f00000000ULL },
+ { "sqsube", 0x8000229100000000ULL },
+ { "sqsubset", 0x8000228f00000000ULL },
+ { "sqsubseteq", 0x8000229100000000ULL },
+ { "sqsup", 0x8000229000000000ULL },
+ { "sqsupe", 0x8000229200000000ULL },
+ { "sqsupset", 0x8000229000000000ULL },
+ { "sqsupseteq", 0x8000229200000000ULL },
+ { "squ", 0x800025a100000000ULL },
+ { "square", 0x800025a100000000ULL },
+ { "squarf", 0x800025aa00000000ULL },
+ { "squf", 0x800025aa00000000ULL },
+ { "srarr", 0x8000219200000000ULL },
+ { "sscr", 0x8001d4c800000000ULL },
+ { "ssetmn", 0x8000221600000000ULL },
+ { "ssmile", 0x8000232300000000ULL },
+ { "sstarf", 0x800022c600000000ULL },
+ { "star", 0x8000260600000000ULL },
+ { "starf", 0x8000260500000000ULL },
+ { "straightepsilon", 0x800003f500000000ULL },
+ { "straightphi", 0x800003d500000000ULL },
+ { "strns", 0x800000af00000000ULL },
+ { "sub", 0x8000228200000000ULL },
+ { "subE", 0x80002ac500000000ULL },
+ { "subdot", 0x80002abd00000000ULL },
+ { "sube", 0x8000228600000000ULL },
+ { "subedot", 0x80002ac300000000ULL },
+ { "submult", 0x80002ac100000000ULL },
+ { "subnE", 0x80002acb00000000ULL },
+ { "subne", 0x8000228a00000000ULL },
+ { "subplus", 0x80002abf00000000ULL },
+ { "subrarr", 0x8000297900000000ULL },
+ { "subset", 0x8000228200000000ULL },
+ { "subseteq", 0x8000228600000000ULL },
+ { "subseteqq", 0x80002ac500000000ULL },
+ { "subsetneq", 0x8000228a00000000ULL },
+ { "subsetneqq", 0x80002acb00000000ULL },
+ { "subsim", 0x80002ac700000000ULL },
+ { "subsub", 0x80002ad500000000ULL },
+ { "subsup", 0x80002ad300000000ULL },
+ { "succ", 0x8000227b00000000ULL },
+ { "succapprox", 0x80002ab800000000ULL },
+ { "succcurlyeq", 0x8000227d00000000ULL },
+ { "succeq", 0x80002ab000000000ULL },
+ { "succnapprox", 0x80002aba00000000ULL },
+ { "succneqq", 0x80002ab600000000ULL },
+ { "succnsim", 0x800022e900000000ULL },
+ { "succsim", 0x8000227f00000000ULL },
+ { "sum", 0x8000221100000000ULL },
+ { "sung", 0x8000266a00000000ULL },
+ { "sup", 0x8000228300000000ULL },
+ { "sup1", 0x000000b900000000ULL },
+ { "sup2", 0x000000b200000000ULL },
+ { "sup3", 0x000000b300000000ULL },
+ { "supE", 0x80002ac600000000ULL },
+ { "supdot", 0x80002abe00000000ULL },
+ { "supdsub", 0x80002ad800000000ULL },
+ { "supe", 0x8000228700000000ULL },
+ { "supedot", 0x80002ac400000000ULL },
+ { "suphsol", 0x800027c900000000ULL },
+ { "suphsub", 0x80002ad700000000ULL },
+ { "suplarr", 0x8000297b00000000ULL },
+ { "supmult", 0x80002ac200000000ULL },
+ { "supnE", 0x80002acc00000000ULL },
+ { "supne", 0x8000228b00000000ULL },
+ { "supplus", 0x80002ac000000000ULL },
+ { "supset", 0x8000228300000000ULL },
+ { "supseteq", 0x8000228700000000ULL },
+ { "supseteqq", 0x80002ac600000000ULL },
+ { "supsetneq", 0x8000228b00000000ULL },
+ { "supsetneqq", 0x80002acc00000000ULL },
+ { "supsim", 0x80002ac800000000ULL },
+ { "supsub", 0x80002ad400000000ULL },
+ { "supsup", 0x80002ad600000000ULL },
+ { "swArr", 0x800021d900000000ULL },
+ { "swarhk", 0x8000292600000000ULL },
+ { "swarr", 0x8000219900000000ULL },
+ { "swarrow", 0x8000219900000000ULL },
+ { "swnwar", 0x8000292a00000000ULL },
+ { "szlig", 0x000000df00000000ULL },
+ { "target", 0x8000231600000000ULL },
+ { "tau", 0x800003c400000000ULL },
+ { "tbrk", 0x800023b400000000ULL },
+ { "tcaron", 0x8000016500000000ULL },
+ { "tcedil", 0x8000016300000000ULL },
+ { "tcy", 0x8000044200000000ULL },
+ { "tdot", 0x800020db00000000ULL },
+ { "telrec", 0x8000231500000000ULL },
+ { "tfr", 0x8001d53100000000ULL },
+ { "there4", 0x8000223400000000ULL },
+ { "therefore", 0x8000223400000000ULL },
+ { "theta", 0x800003b800000000ULL },
+ { "thetasym", 0x800003d100000000ULL },
+ { "thetav", 0x800003d100000000ULL },
+ { "thickapprox", 0x8000224800000000ULL },
+ { "thicksim", 0x8000223c00000000ULL },
+ { "thinsp", 0x8000200900000000ULL },
+ { "thkap", 0x8000224800000000ULL },
+ { "thksim", 0x8000223c00000000ULL },
+ { "thorn", 0x000000fe00000000ULL },
+ { "tilde", 0x800002dc00000000ULL },
+ { "times", 0x000000d700000000ULL },
+ { "timesb", 0x800022a000000000ULL },
+ { "timesbar", 0x80002a3100000000ULL },
+ { "timesd", 0x80002a3000000000ULL },
+ { "tint", 0x8000222d00000000ULL },
+ { "toea", 0x8000292800000000ULL },
+ { "top", 0x800022a400000000ULL },
+ { "topbot", 0x8000233600000000ULL },
+ { "topcir", 0x80002af100000000ULL },
+ { "topf", 0x8001d56500000000ULL },
+ { "topfork", 0x80002ada00000000ULL },
+ { "tosa", 0x8000292900000000ULL },
+ { "tprime", 0x8000203400000000ULL },
+ { "trade", 0x8000212200000000ULL },
+ { "triangle", 0x800025b500000000ULL },
+ { "triangledown", 0x800025bf00000000ULL },
+ { "triangleleft", 0x800025c300000000ULL },
+ { "trianglelefteq", 0x800022b400000000ULL },
+ { "triangleq", 0x8000225c00000000ULL },
+ { "triangleright", 0x800025b900000000ULL },
+ { "trianglerighteq", 0x800022b500000000ULL },
+ { "tridot", 0x800025ec00000000ULL },
+ { "trie", 0x8000225c00000000ULL },
+ { "triminus", 0x80002a3a00000000ULL },
+ { "triplus", 0x80002a3900000000ULL },
+ { "trisb", 0x800029cd00000000ULL },
+ { "tritime", 0x80002a3b00000000ULL },
+ { "trpezium", 0x800023e200000000ULL },
+ { "tscr", 0x8001d4c900000000ULL },
+ { "tscy", 0x8000044600000000ULL },
+ { "tshcy", 0x8000045b00000000ULL },
+ { "tstrok", 0x8000016700000000ULL },
+ { "twixt", 0x8000226c00000000ULL },
+ { "twoheadleftarrow", 0x8000219e00000000ULL },
+ { "twoheadrightarrow", 0x800021a000000000ULL },
+ { "uArr", 0x800021d100000000ULL },
+ { "uHar", 0x8000296300000000ULL },
+ { "uacute", 0x000000fa00000000ULL },
+ { "uarr", 0x8000219100000000ULL },
+ { "ubrcy", 0x8000045e00000000ULL },
+ { "ubreve", 0x8000016d00000000ULL },
+ { "ucirc", 0x000000fb00000000ULL },
+ { "ucy", 0x8000044300000000ULL },
+ { "udarr", 0x800021c500000000ULL },
+ { "udblac", 0x8000017100000000ULL },
+ { "udhar", 0x8000296e00000000ULL },
+ { "ufisht", 0x8000297e00000000ULL },
+ { "ufr", 0x8001d53200000000ULL },
+ { "ugrave", 0x000000f900000000ULL },
+ { "uharl", 0x800021bf00000000ULL },
+ { "uharr", 0x800021be00000000ULL },
+ { "uhblk", 0x8000258000000000ULL },
+ { "ulcorn", 0x8000231c00000000ULL },
+ { "ulcorner", 0x8000231c00000000ULL },
+ { "ulcrop", 0x8000230f00000000ULL },
+ { "ultri", 0x800025f800000000ULL },
+ { "umacr", 0x8000016b00000000ULL },
+ { "uml", 0x000000a800000000ULL },
+ { "uogon", 0x8000017300000000ULL },
+ { "uopf", 0x8001d56600000000ULL },
+ { "uparrow", 0x8000219100000000ULL },
+ { "updownarrow", 0x8000219500000000ULL },
+ { "upharpoonleft", 0x800021bf00000000ULL },
+ { "upharpoonright", 0x800021be00000000ULL },
+ { "uplus", 0x8000228e00000000ULL },
+ { "upsi", 0x800003c500000000ULL },
+ { "upsih", 0x800003d200000000ULL },
+ { "upsilon", 0x800003c500000000ULL },
+ { "upuparrows", 0x800021c800000000ULL },
+ { "urcorn", 0x8000231d00000000ULL },
+ { "urcorner", 0x8000231d00000000ULL },
+ { "urcrop", 0x8000230e00000000ULL },
+ { "uring", 0x8000016f00000000ULL },
+ { "urtri", 0x800025f900000000ULL },
+ { "uscr", 0x8001d4ca00000000ULL },
+ { "utdot", 0x800022f000000000ULL },
+ { "utilde", 0x8000016900000000ULL },
+ { "utri", 0x800025b500000000ULL },
+ { "utrif", 0x800025b400000000ULL },
+ { "uuarr", 0x800021c800000000ULL },
+ { "uuml", 0x000000fc00000000ULL },
+ { "uwangle", 0x800029a700000000ULL },
+ { "vArr", 0x800021d500000000ULL },
+ { "vBar", 0x80002ae800000000ULL },
+ { "vBarv", 0x80002ae900000000ULL },
+ { "vDash", 0x800022a800000000ULL },
+ { "vangrt", 0x8000299c00000000ULL },
+ { "varepsilon", 0x800003f500000000ULL },
+ { "varkappa", 0x800003f000000000ULL },
+ { "varnothing", 0x8000220500000000ULL },
+ { "varphi", 0x800003d500000000ULL },
+ { "varpi", 0x800003d600000000ULL },
+ { "varpropto", 0x8000221d00000000ULL },
+ { "varr", 0x8000219500000000ULL },
+ { "varrho", 0x800003f100000000ULL },
+ { "varsigma", 0x800003c200000000ULL },
+ { "varsubsetneq", 0x8000228a0000fe00ULL },
+ { "varsubsetneqq", 0x80002acb0000fe00ULL },
+ { "varsupsetneq", 0x8000228b0000fe00ULL },
+ { "varsupsetneqq", 0x80002acc0000fe00ULL },
+ { "vartheta", 0x800003d100000000ULL },
+ { "vartriangleleft", 0x800022b200000000ULL },
+ { "vartriangleright", 0x800022b300000000ULL },
+ { "vcy", 0x8000043200000000ULL },
+ { "vdash", 0x800022a200000000ULL },
+ { "vee", 0x8000222800000000ULL },
+ { "veebar", 0x800022bb00000000ULL },
+ { "veeeq", 0x8000225a00000000ULL },
+ { "vellip", 0x800022ee00000000ULL },
+ { "verbar", 0x8000007c00000000ULL },
+ { "vert", 0x8000007c00000000ULL },
+ { "vfr", 0x8001d53300000000ULL },
+ { "vltri", 0x800022b200000000ULL },
+ { "vnsub", 0x80002282000020d2ULL },
+ { "vnsup", 0x80002283000020d2ULL },
+ { "vopf", 0x8001d56700000000ULL },
+ { "vprop", 0x8000221d00000000ULL },
+ { "vrtri", 0x800022b300000000ULL },
+ { "vscr", 0x8001d4cb00000000ULL },
+ { "vsubnE", 0x80002acb0000fe00ULL },
+ { "vsubne", 0x8000228a0000fe00ULL },
+ { "vsupnE", 0x80002acc0000fe00ULL },
+ { "vsupne", 0x8000228b0000fe00ULL },
+ { "vzigzag", 0x8000299a00000000ULL },
+ { "wcirc", 0x8000017500000000ULL },
+ { "wedbar", 0x80002a5f00000000ULL },
+ { "wedge", 0x8000222700000000ULL },
+ { "wedgeq", 0x8000225900000000ULL },
+ { "weierp", 0x8000211800000000ULL },
+ { "wfr", 0x8001d53400000000ULL },
+ { "wopf", 0x8001d56800000000ULL },
+ { "wp", 0x8000211800000000ULL },
+ { "wr", 0x8000224000000000ULL },
+ { "wreath", 0x8000224000000000ULL },
+ { "wscr", 0x8001d4cc00000000ULL },
+ { "xcap", 0x800022c200000000ULL },
+ { "xcirc", 0x800025ef00000000ULL },
+ { "xcup", 0x800022c300000000ULL },
+ { "xdtri", 0x800025bd00000000ULL },
+ { "xfr", 0x8001d53500000000ULL },
+ { "xhArr", 0x800027fa00000000ULL },
+ { "xharr", 0x800027f700000000ULL },
+ { "xi", 0x800003be00000000ULL },
+ { "xlArr", 0x800027f800000000ULL },
+ { "xlarr", 0x800027f500000000ULL },
+ { "xmap", 0x800027fc00000000ULL },
+ { "xnis", 0x800022fb00000000ULL },
+ { "xodot", 0x80002a0000000000ULL },
+ { "xopf", 0x8001d56900000000ULL },
+ { "xoplus", 0x80002a0100000000ULL },
+ { "xotime", 0x80002a0200000000ULL },
+ { "xrArr", 0x800027f900000000ULL },
+ { "xrarr", 0x800027f600000000ULL },
+ { "xscr", 0x8001d4cd00000000ULL },
+ { "xsqcup", 0x80002a0600000000ULL },
+ { "xuplus", 0x80002a0400000000ULL },
+ { "xutri", 0x800025b300000000ULL },
+ { "xvee", 0x800022c100000000ULL },
+ { "xwedge", 0x800022c000000000ULL },
+ { "yacute", 0x000000fd00000000ULL },
+ { "yacy", 0x8000044f00000000ULL },
+ { "ycirc", 0x8000017700000000ULL },
+ { "ycy", 0x8000044b00000000ULL },
+ { "yen", 0x000000a500000000ULL },
+ { "yfr", 0x8001d53600000000ULL },
+ { "yicy", 0x8000045700000000ULL },
+ { "yopf", 0x8001d56a00000000ULL },
+ { "yscr", 0x8001d4ce00000000ULL },
+ { "yucy", 0x8000044e00000000ULL },
+ { "yuml", 0x000000ff00000000ULL },
+ { "zacute", 0x8000017a00000000ULL },
+ { "zcaron", 0x8000017e00000000ULL },
+ { "zcy", 0x8000043700000000ULL },
+ { "zdot", 0x8000017c00000000ULL },
+ { "zeetrf", 0x8000212800000000ULL },
+ { "zeta", 0x800003b600000000ULL },
+ { "zfr", 0x8001d53700000000ULL },
+ { "zhcy", 0x8000043600000000ULL },
+ { "zigrarr", 0x800021dd00000000ULL },
+ { "zopf", 0x8001d56b00000000ULL },
+ { "zscr", 0x8001d4cf00000000ULL },
+ { "zwj", 0x8000200d00000000ULL },
+ { "zwnj", 0x8000200c00000000ULL },
+};
+
+static void
+ucv_stringbuf_addutf8(uc_stringbuf_t *buf, unsigned int code)
+{
+ unsigned char seq[5];
+ size_t len = 0;
+
+ switch (code) {
+ // disallow CR (https://html.spec.whatwg.org/multipage/syntax.html#character-references)
+ case 0xD:
+
+ // disallow controls (https://infra.spec.whatwg.org/#control) except whitespace
+ case 0x0 ... 0x8:
+ case 0xB:
+ case 0xE ... 0x1F:
+ case 0x7F ... 0x9F:
+
+ // disallow noncharacter (https://infra.spec.whatwg.org/#noncharacter)
+ case 0xFDD0 ... 0xFDEF:
+ case 0xFFFE ... 0xFFFF:
+ case 0x1FFFE ... 0x1FFFF:
+ case 0x2FFFE ... 0x2FFFF:
+ case 0x3FFFE ... 0x3FFFF:
+ case 0x4FFFE ... 0x4FFFF:
+ case 0x5FFFE ... 0x5FFFF:
+ case 0x6FFFE ... 0x6FFFF:
+ case 0x7FFFE ... 0x7FFFF:
+ case 0x8FFFE ... 0x8FFFF:
+ case 0x9FFFE ... 0x9FFFF:
+ case 0xAFFFE ... 0xAFFFF:
+ case 0xBFFFE ... 0xBFFFF:
+ case 0xCFFFE ... 0xCFFFF:
+ case 0xDFFFE ... 0xDFFFF:
+ case 0xEFFFE ... 0xEFFFF:
+ case 0xFFFFE ... 0xFFFFF:
+ case 0x10FFFE ... 0x10FFFF:
+ return;
+ }
+
+ if (code <= 0x7F) {
+ seq[len++] = code;
+ }
+ else if (code <= 0x7FF) {
+ seq[len++] = ((code >> 6) & 0x1F) | 0xC0;
+ seq[len++] = ( code & 0x3F) | 0x80;
+ }
+ else if (code <= 0xFFFF) {
+ seq[len++] = ((code >> 12) & 0x0F) | 0xE0;
+ seq[len++] = ((code >> 6) & 0x3F) | 0x80;
+ seq[len++] = ( code & 0x3F) | 0x80;
+ }
+ else if (code <= 0x10FFFF) {
+ seq[len++] = ((code >> 18) & 0x07) | 0xF0;
+ seq[len++] = ((code >> 12) & 0x3F) | 0x80;
+ seq[len++] = ((code >> 6) & 0x3F) | 0x80;
+ seq[len++] = ( code & 0x3F) | 0x80;
+ }
+
+ ucv_stringbuf_addstr(buf, (char *)seq, len);
+}
+
+static void
+expand_named_char_ref(uc_stringbuf_t *buf, const char *name, size_t len, bool semicolon)
+{
+ ssize_t l = 0;
+ ssize_t r = sizeof(named_char_refs) / sizeof(named_char_refs[0]) - 1;
+ ssize_t m;
+ int c;
+
+ while (l <= r) {
+ m = (l + r) / 2;
+ c = strncmp(named_char_refs[m].name, name, len);
+
+ if (c < 0) {
+ l = m + 1;
+ continue;
+ }
+
+ if (c > 0 || named_char_refs[m].name[len] != 0) {
+ r = m - 1;
+ continue;
+ }
+
+ if (!(named_char_refs[m].value & (1ULL << 63)) || semicolon) {
+ ucv_stringbuf_addutf8(buf, (named_char_refs[m].value >> 32) & 0x7FFFFFFFULL);
+ ucv_stringbuf_addutf8(buf, named_char_refs[m].value & 0xFFFFFFFFULL);
+
+ return;
+ }
+
+ break;
+ }
+
+ ucv_stringbuf_append(buf, "&");
+ ucv_stringbuf_addstr(buf, name, len);
+
+ if (semicolon)
+ ucv_stringbuf_append(buf, ";");
+}
+
+static void
+expand_char_refs(uc_stringbuf_t *buf, const char *s, size_t len, bool loose)
+{
+ const char *end = s + len, *p;
+ unsigned int u;
+ size_t elen;
+ char *e;
+
+ while (s < end) {
+ p = memchr(s, '&', end - s);
+ elen = 1;
+
+ if (!p) {
+ ucv_stringbuf_addstr(buf, s, end - s);
+ break;
+ }
+
+ ucv_stringbuf_addstr(buf, s, p - s);
+
+ while (isalpha(p[elen]))
+ elen++;
+
+ if (elen > 1) {
+ if (p[elen] == ';') {
+ expand_named_char_ref(buf, p + 1, elen - 1, true);
+ s = p + elen + 1;
+ }
+ else if (loose) {
+ expand_named_char_ref(buf, p + 1, elen - 1, false);
+ s = p + elen;
+ }
+ else {
+ ucv_stringbuf_addstr(buf, p, elen);
+ s = p + elen;
+ }
+ }
+ else if (p[elen] == '#') {
+ if ((p[++elen] | 32) == 'x') {
+ u = strtoul(p + ++elen, &e, 16);
+
+ if (e > p + elen && *e == ';') {
+ ucv_stringbuf_addutf8(buf, u);
+ s = e + 1;
+ }
+ else {
+ ucv_stringbuf_addstr(buf, p, e - p);
+ s = e;
+ }
+ }
+ else {
+ u = strtoul(p + elen, &e, 10);
+
+ if (e > p + elen && *e == ';') {
+ ucv_stringbuf_addutf8(buf, u);
+ s = e + 1;
+ }
+ else {
+ ucv_stringbuf_addstr(buf, p, e - p);
+ s = e;
+ }
+ }
+ }
+ else {
+ ucv_stringbuf_addstr(buf, p, elen);
+ s = p + elen;
+ }
+ }
+}
+
+static void
+ucv_stringbuf_addtext(uc_stringbuf_t *buf, const char *s, size_t len)
+{
+ bool space = (buf->bpos && isspace(buf->buf[buf->bpos - 1]));
+
+ while (space && isspace(*s)) {
+ s++;
+ len--;
+ }
+
+ while (len > 1 && isspace(s[len - 1]))
+ len--;
+
+ expand_char_refs(buf, s, len, true);
+}
+
+static bool
+_invoke_cb(const char *s, size_t len, html_token_callback_t cb,
+ html_token_type_t type, void *ud)
+{
+ size_t chunksize;
+
+ while (len > 0) {
+ chunksize = (len > 1024) ? 1024 : len;
+
+ if (!cb(type, s, chunksize, ud))
+ return false;
+
+ len -= chunksize;
+ s += chunksize;
+ }
+
+ return true;
+}
+
+#define invoke_cb(s, len, cb, type, ud) \
+ do { \
+ if (!_invoke_cb(s, len, cb, type, ud)) \
+ return false; \
+ } while(0)
+
+static size_t
+_memspn(const char *s, size_t n, const char *set, size_t m, bool invert)
+{
+ uint64_t mask[(1 << CHAR_BIT) / (sizeof(uint64_t) * CHAR_BIT)] = { 0 };
+
+ #define mask_off(n) mask[((unsigned char)(n) / (sizeof(mask[0]) * CHAR_BIT))]
+ #define mask_bit(n) (1ULL << ((unsigned char)(n) % (sizeof(mask[0]) * CHAR_BIT)))
+
+ /* NB: Nudge clang & gcc to unroll the mask initialization loop below.
+ * Since we only invoke _memspn() with constant set string literals
+ * containing only characters up to '>' (62), the loop below should
+ * be optimized into a single constant load opcode for mask[0].
+ */
+ #ifdef __clang__
+ #pragma unroll 255
+ #elif __GNUC__
+ #pragma GCC unroll 255
+ #endif
+ for (; m > 0; m--, set++)
+ mask_off(*set) |= mask_bit(*set);
+
+ for (m = 0; m < n; m++)
+ if (!(mask_off(s[m]) & mask_bit(s[m])) == !invert)
+ break;
+
+ #undef mask_off
+ #undef mask_bit
+
+ return m;
+}
+
+#define memspn(s, n, set) _memspn(s, n, set, sizeof(set) - 1, false)
+#define memcspn(s, n, set) _memspn(s, n, set, sizeof(set) - 1, true)
+
+static bool
+tokenize_html(const char *s, size_t len, html_token_callback_t cb, void *ud)
+{
+ const char *end = s + len, *p;
+ char raw[16] = { 0 };
+
+ enum {
+ SEARCH,
+ IDENTIFY,
+ COMMENT,
+ ATTR,
+ END
+ } state = 0;
+
+ while (state != END) {
+ switch (state) {
+ case SEARCH:
+ p = memchr(s, '<', end - s);
+
+ if (p) {
+ if (p != s)
+ invoke_cb(s, p - s, cb, raw[0] ? T_RAW : T_TEXT, ud);
+
+ s = p + 1;
+ state = IDENTIFY;
+ }
+ else {
+ state = END;
+ }
+
+ break;
+
+ case IDENTIFY:
+ if (*s == '/') {
+ p = memchr(s, '>', end - s);
+
+ if (p) {
+ while (p != s && isspace(p[-1]))
+ p--;
+
+ if (!raw[0] || !strncasecmp(s + 1, raw, p - s - 1)) {
+ invoke_cb(s + 1, p - s - 1, cb, T_CLOSE, ud);
+ raw[0] = 0;
+ }
+ else {
+ invoke_cb(s - 1, p - s + 2, cb, T_RAW, ud);
+ }
+
+ s = p + 1;
+ state = SEARCH;
+ }
+ else {
+ state = END;
+ }
+ }
+ else if (raw[0]) {
+ invoke_cb("<", 1, cb, T_RAW, ud);
+ state = SEARCH;
+ }
+ else if (*s == '!') {
+ state = COMMENT;
+ s++;
+ }
+ else {
+ p = s + memcspn(s, end - s, "/'\"> \f\r\t\n\0");
+
+ if (p != s) {
+ invoke_cb(s, p - s, cb, T_OPEN, ud);
+
+ if (!strncasecmp(s, "script", p - s) ||
+ !strncasecmp(s, "style", p - s)) {
+ memset(raw, 0, sizeof(raw));
+ memcpy(raw, s, p - s);
+ }
+
+ s = p + memspn(p, end - p, " \f\r\t\n\0");
+ state = ATTR;
+ }
+ else {
+ invoke_cb("<", 1, cb, T_TEXT, ud);
+ state = SEARCH;
+ }
+ }
+
+ break;
+
+ case COMMENT:
+ if (!strncmp(s, "--", 2)) {
+ p = memmem(s + 2, end - s - 2, "-->", 3);
+
+ if (p) {
+ invoke_cb(s + 2, p - s - 2, cb, raw[0] ? T_RAW : T_COMMENT, ud);
+ s = p + 3;
+ state = SEARCH;
+ }
+ else {
+ // unterminated comment
+ invoke_cb(s + 2, end - s - 2, cb, raw[0] ? T_RAW : T_COMMENT, ud);
+ s = NULL;
+ state = END;
+ }
+ }
+ else if (!strncasecmp(s, "[CDATA[", 7)) {
+ p = memmem(s + 7, end - s - 7, "]]>", 3);
+
+ if (p) {
+ invoke_cb(s + 7, p - s - 7, cb, raw[0] ? T_RAW : T_CDATA, ud);
+ s = p + 3;
+ state = SEARCH;
+ }
+ else {
+ // unterminated comment
+ invoke_cb(s + 7, end - s - 7, cb, raw[0] ? T_RAW : T_CDATA, ud);
+ s = NULL;
+ state = END;
+ }
+ }
+ else {
+ p = memchr(s, '>', end - s);
+
+ if (p) {
+ invoke_cb(s, p - s, cb, raw[0] ? T_RAW : T_PROCINST, ud);
+ s = p + 1;
+ state = SEARCH;
+ }
+ else {
+ // unterminated comment
+ invoke_cb(s, end - s, cb, raw[0] ? T_RAW : T_PROCINST, ud);
+ s = NULL;
+ state = END;
+ }
+ }
+
+ break;
+
+ case ATTR:
+ p = s + memcspn(s, end - s, "'\"> \f\r\t\n\0");
+
+ if (*p == '>') {
+ if (p != s) {
+ if ((p - s) > 1 || *s != '/')
+ invoke_cb(s, p - s, cb, T_ATTR, ud);
+ }
+
+ s = p + 1;
+ state = SEARCH;
+ }
+ else if (*p == '"' || *p == '\'') {
+ p = memchr(p + 1, *p, end - p);
+
+ if (p) {
+ invoke_cb(s, p - s + 1, cb, T_ATTR, ud);
+ s = p + 1;
+ }
+ else {
+ // unterminated quoted string
+ s = NULL;
+ state = END;
+ }
+ }
+ else if (*p) {
+ if (p != s)
+ invoke_cb(s, p - s, cb, T_ATTR, ud);
+
+ s = p + memspn(p, end - p, " \f\r\t\n\0");
+ }
+ else {
+ // eof
+ state = END;
+ }
+
+ break;
+
+ case END:
+ /* not reached */
+ }
+ }
+
+ if (s && *s)
+ invoke_cb(s, end - s, cb, raw[0] ? T_RAW : T_TEXT, ud);
+
+ invoke_cb("", 0, cb, T_EOF, ud);
+
+ return true;
+}
+
+
+static bool
+uc_html_tokenize_cb(html_token_type_t type, const char *s, size_t len, void *ud)
+{
+ const char *end = s + len, *val;
+ uc_vm_t *vm = ud;
+
+ uc_vm_stack_push(vm, ucv_get(uc_vm_stack_peek(vm, 0)));
+ uc_vm_stack_push(vm, ucv_int64_new(type));
+
+ val = (type == T_ATTR && s != NULL) ? memchr(s, '=', len) : NULL;
+
+ if (val) {
+ uc_vm_stack_push(vm, ucv_string_new_length(s, val - s));
+
+ val++;
+
+ if ((end - val) >= 2 && (*val == '"' || *val == '\'')) {
+ val++;
+ end--;
+ }
+
+ uc_vm_stack_push(vm, ucv_string_new_length(val, end - val));
+ }
+ else if (type == T_TEXT && s) {
+ uc_vm_stack_push(vm, ucv_string_new_length(s, end - s));
+ }
+ else if (s) {
+ uc_vm_stack_push(vm, ucv_string_new_length(s, len));
+ }
+
+ if (uc_vm_call(vm, false, 1 + !!s + !!val) == EXCEPTION_NONE) {
+ ucv_put(uc_vm_stack_pop(vm));
+
+ return true;
+ }
+
+ return false;
+}
+
+static uc_value_t *
+uc_html_tokenize(uc_vm_t *vm, size_t nargs)
+{
+ uc_value_t *input = uc_fn_arg(0);
+ uc_value_t *callback = uc_fn_arg(1);
+ bool res;
+
+ if (ucv_type(input) != UC_STRING)
+ return NULL;
+
+ if (!ucv_is_callable(callback))
+ return NULL;
+
+ uc_vm_stack_push(vm, ucv_get(callback));
+
+ res = tokenize_html(
+ ucv_string_get(input), ucv_string_length(input),
+ uc_html_tokenize_cb, vm);
+
+ ucv_put(uc_vm_stack_pop(vm));
+
+ return ucv_boolean_new(res);
+}
+
+
+static bool
+uc_html_striptags_cb(html_token_type_t type, const char *s, size_t len, void *ud)
+{
+ uc_stringbuf_t *buf = ud;
+
+ if (type == T_TEXT)
+ ucv_stringbuf_addtext(buf, s, len);
+ else if (type == T_OPEN && (unsigned int)buf->bpos > sizeof(uc_string_t))
+ ucv_stringbuf_append(buf, " ");
+
+ return true;
+}
+
+static uc_value_t *
+uc_html_striptags(uc_vm_t *vm, size_t nargs)
+{
+ uc_value_t *input = uc_fn_arg(0);
+ uc_stringbuf_t *buf;
+
+ if (ucv_type(input) != UC_STRING)
+ return NULL;
+
+ buf = ucv_stringbuf_new();
+
+ tokenize_html(
+ ucv_string_get(input), ucv_string_length(input),
+ uc_html_striptags_cb, buf);
+
+ return ucv_stringbuf_finish(buf);
+}
+
+
+static uc_value_t *
+uc_html_entitydecode(uc_vm_t *vm, size_t nargs)
+{
+ uc_value_t *input = uc_fn_arg(0);
+ uc_value_t *loose = uc_fn_arg(1);
+ uc_stringbuf_t *buf;
+
+ if (ucv_type(input) != UC_STRING)
+ return NULL;
+
+ buf = ucv_stringbuf_new();
+
+ expand_char_refs(buf, ucv_string_get(input), ucv_string_length(input),
+ ucv_is_truish(loose));
+
+ return ucv_stringbuf_finish(buf);
+}
+
+static uc_value_t *
+uc_html_entityencode(uc_vm_t *vm, size_t nargs)
+{
+ uc_value_t *input = uc_fn_arg(0);
+ uc_value_t *quote = uc_fn_arg(1);
+ const char *s, *p, *end;
+ uc_stringbuf_t *buf;
+
+ if (ucv_type(input) != UC_STRING)
+ return NULL;
+
+ s = ucv_string_get(input);
+ end = s + ucv_string_length(input);
+ buf = ucv_stringbuf_new();
+
+ while (s < end) {
+ if (ucv_is_truish(quote))
+ p = s + memcspn(s, end - s, "<&'\">\0");
+ else
+ p = s + memcspn(s, end - s, "<&>\0");
+
+ if (p != s)
+ ucv_stringbuf_addstr(buf, s, p - s);
+
+ if (p < end) {
+ switch (*p) {
+ case '"': ucv_stringbuf_append(buf, """); break;
+ case '&': ucv_stringbuf_append(buf, "&"); break;
+ case '\'': ucv_stringbuf_append(buf, "'"); break;
+ case '<': ucv_stringbuf_append(buf, "<"); break;
+ case '>': ucv_stringbuf_append(buf, ">"); break;
+ default: ucv_stringbuf_append(buf, "�");
+ }
+ }
+
+ s = p + 1;
+ }
+
+ if (s < end)
+ ucv_stringbuf_addstr(buf, s, end - s);
+
+ return ucv_stringbuf_finish(buf);
+}
+
+
+static const uc_function_list_t html_fns[] = {
+ { "tokenize", uc_html_tokenize },
+ { "striptags", uc_html_striptags },
+ { "entitydecode", uc_html_entitydecode },
+ { "entityencode", uc_html_entityencode },
+};
+
+void uc_module_init(uc_vm_t *vm, uc_value_t *scope)
+{
+ uc_function_list_register(scope, html_fns);
+
+ ucv_object_add(scope, "TEXT", ucv_int64_new(T_TEXT));
+ ucv_object_add(scope, "RAW", ucv_int64_new(T_RAW));
+ ucv_object_add(scope, "OPEN", ucv_int64_new(T_OPEN));
+ ucv_object_add(scope, "ATTR", ucv_int64_new(T_ATTR));
+ ucv_object_add(scope, "CLOSE", ucv_int64_new(T_CLOSE));
+ ucv_object_add(scope, "COMMENT", ucv_int64_new(T_COMMENT));
+ ucv_object_add(scope, "CDATA", ucv_int64_new(T_CDATA));
+ ucv_object_add(scope, "PROCINST", ucv_int64_new(T_PROCINST));
+ ucv_object_add(scope, "EOF", ucv_int64_new(T_EOF));
+}
static uc_value_t *
uc_lua_vm_claim_result(uc_vm_t *vm, lua_State *L, int oldtop)
{
- int nargs = lua_gettop(L) - oldtop, i;
+ int nargs = lua_gettop(L) - oldtop - 1, i;
uc_value_t *uv;
if (nargs > 1) {
uv = ucv_array_new_length(vm, nargs);
- for (i = 1; i <= nargs; i++)
+ for (i = 2; i <= nargs; i++)
ucv_array_push(uv, lua_to_ucv(L, oldtop + i, vm, NULL));
}
else if (nargs == 1) {
- uv = lua_to_ucv(L, oldtop + 1, vm, NULL);
+ uv = lua_to_ucv(L, oldtop + 2, vm, NULL);
}
else {
uv = NULL;
return uv;
}
+static int
+uc_lua_vm_pcall_error_cb(lua_State *L)
+{
+ const char *message = luaL_checkstring(L, 1);
+ uc_stringbuf_t *buf = xprintbuf_new();
+ lua_Debug ar;
+ int level;
+
+ ucv_stringbuf_printf(buf, "%s\n", message);
+
+ for (level = 1; lua_getstack(L, level, &ar) == 1; level++) {
+ if (lua_getinfo(L, "Snl", &ar) == 0)
+ continue;
+
+ if (level == 1) {
+ ucv_stringbuf_printf(buf, "\nIn %s(), file %s",
+ ar.name ? ar.name : "[anonymous function]", ar.short_src);
+
+ if (ar.currentline > -1)
+ ucv_stringbuf_printf(buf, ", line %d", ar.currentline);
+
+ ucv_stringbuf_append(buf, "\n");
+ }
+ else {
+ ucv_stringbuf_printf(buf, " called from function %s (%s",
+ ar.name ? ar.name : "[anonymous function]", ar.short_src);
+
+ if (ar.currentline > -1)
+ ucv_stringbuf_printf(buf, ":%d", ar.currentline);
+
+ ucv_stringbuf_append(buf, ")\n");
+ }
+ }
+
+ lua_pushstring(L, buf->buf);
+ printbuf_free(buf);
+
+ return 1;
+}
+
static uc_value_t *
uc_lua_vm_pcall(uc_vm_t *vm, lua_State *L, int oldtop)
{
uc_value_t *uv;
- switch (lua_pcall(L, lua_gettop(L) - oldtop - 1, LUA_MULTRET, 0)) {
+ switch (lua_pcall(L, lua_gettop(L) - oldtop - 2, LUA_MULTRET, oldtop + 1)) {
case LUA_ERRRUN:
case LUA_ERRMEM:
case LUA_ERRERR:
uc_vm_raise_exception(vm, EXCEPTION_RUNTIME,
- "Lua raised runtime exception: %s",
- lua_tostring(L, -1));
+ "%s", lua_tostring(L, -1));
uv = NULL;
break;
top = lua_gettop(*L);
+ lua_pushcfunction(*L, uc_lua_vm_pcall_error_cb);
lua_getglobal(*L, ucv_string_get(name));
for (i = 1; i < nargs; i++) {
top = lua_gettop(*L);
+ lua_pushcfunction(*L, uc_lua_vm_pcall_error_cb);
+
switch (luaL_loadstring(*L, ucv_string_get(source))) {
case LUA_ERRSYNTAX:
uc_vm_raise_exception(vm, EXCEPTION_SYNTAX,
- "Syntax error while compiling Lua code: %s",
- lua_tostring(*L, -1));
+ "%s", lua_tostring(*L, -1));
break;
top = lua_gettop(*L);
+ lua_pushcfunction(*L, uc_lua_vm_pcall_error_cb);
+
switch (luaL_loadfile(*L, ucv_string_get(path))) {
case LUA_ERRSYNTAX:
uc_vm_raise_exception(vm, EXCEPTION_SYNTAX,
oldtop = lua_gettop(L);
+ lua_pushcfunction(L, uc_lua_vm_pcall_error_cb);
lua_rawgeti(L, LUA_REGISTRYINDEX, (*lv)->ref);
for (i = 0; i < nargs; i++)
oldtop = lua_gettop(L);
+ lua_pushcfunction(L, uc_lua_vm_pcall_error_cb);
lua_rawgeti(L, LUA_REGISTRYINDEX, (*lv)->ref);
ucv_to_lua(vm, method, L, NULL);
lua_gettable(L, -2);
local coroutine = require "coroutine"
local table = require "table"
local lhttp = require "lucihttp"
-local nixio = require "nixio"
-local ltn12 = require "luci.ltn12"
-local table, ipairs, pairs, type, tostring, tonumber, error =
- table, ipairs, pairs, type, tostring, tonumber, error
+local L, table, ipairs, pairs, type, error = _G.L, table, ipairs, pairs, type, error
module "luci.http"
HTTP_MAX_CONTENT = 1024*100 -- 100 kB maximum content size
-context = util.threadlocal()
-
-Request = util.class()
-function Request.__init__(self, env, sourcein, sinkerr)
- self.input = sourcein
- self.error = sinkerr
-
-
- -- File handler nil by default to let .content() work
- self.filehandler = nil
-
- -- HTTP-Message table
- self.message = {
- env = env,
- headers = {},
- params = urldecode_params(env.QUERY_STRING or ""),
- }
-
- self.parsed_input = false
-end
-
-function Request.formvalue(self, name, noparse)
- if not noparse and not self.parsed_input then
- self:_parse_input()
- end
-
- if name then
- return self.message.params[name]
- else
- return self.message.params
- end
-end
-
-function Request.formvaluetable(self, prefix)
- local vals = {}
- prefix = prefix and prefix .. "." or "."
-
- if not self.parsed_input then
- self:_parse_input()
- end
-
- local void = self.message.params[nil]
- for k, v in pairs(self.message.params) do
- if k:find(prefix, 1, true) == 1 then
- vals[k:sub(#prefix + 1)] = tostring(v)
- end
- end
-
- return vals
-end
-
-function Request.content(self)
- if not self.parsed_input then
- self:_parse_input()
- end
-
- return self.message.content, self.message.content_length
-end
-
-function Request.getcookie(self, name)
- return lhttp.header_attribute("cookie; " .. (self:getenv("HTTP_COOKIE") or ""), name)
-end
-
-function Request.getenv(self, name)
- if name then
- return self.message.env[name]
- else
- return self.message.env
- end
-end
-
-function Request.setfilehandler(self, callback)
- self.filehandler = callback
-
- if not self.parsed_input then
- return
- end
-
- -- If input has already been parsed then uploads are stored as unlinked
- -- temporary files pointed to by open file handles in the parameter
- -- value table. Loop all params, and invoke the file callback for any
- -- param with an open file handle.
- local name, value
- for name, value in pairs(self.message.params) do
- if type(value) == "table" then
- while value.fd do
- local data = value.fd:read(1024)
- local eof = (not data or data == "")
-
- callback(value, data, eof)
-
- if eof then
- value.fd:close()
- value.fd = nil
- end
- end
- end
- end
-end
-
-function Request._parse_input(self)
- parse_message_body(
- self.input,
- self.message,
- self.filehandler
- )
- self.parsed_input = true
-end
-
function close()
- if not context.eoh then
- context.eoh = true
- coroutine.yield(3)
- end
-
- if not context.closed then
- context.closed = true
- coroutine.yield(5)
- end
+ L.http:close()
end
function content()
- return context.request:content()
+ return L.http:content()
end
function formvalue(name, noparse)
- return context.request:formvalue(name, noparse)
+ return L.http:formvalue(name, noparse)
end
function formvaluetable(prefix)
- return context.request:formvaluetable(prefix)
+ return L.http:formvaluetable(prefix)
end
function getcookie(name)
- return context.request:getcookie(name)
+ return L.http:getcookie(name)
end
-- or the environment table itself.
function getenv(name)
- return context.request:getenv(name)
+ return L.http:getenv(name)
end
function setfilehandler(callback)
- return context.request:setfilehandler(callback)
+ return L.http:setfilehandler(callback)
end
function header(key, value)
- if not context.headers then
- context.headers = {}
- end
- context.headers[key:lower()] = value
- coroutine.yield(2, key, value)
+ L.http:header(key, value)
end
function prepare_content(mime)
- if not context.headers or not context.headers["content-type"] then
- if mime == "application/xhtml+xml" then
- if not getenv("HTTP_ACCEPT") or
- not getenv("HTTP_ACCEPT"):find("application/xhtml+xml", nil, true) then
- mime = "text/html; charset=UTF-8"
- end
- header("Vary", "Accept")
- end
- header("Content-Type", mime)
- end
+ L.http:prepare_content(mime)
end
function source()
- return context.request.input
+ return L.http.input
end
function status(code, message)
- code = code or 200
- message = message or "OK"
- context.status = code
- coroutine.yield(1, code, message)
+ L.http:status(code, message)
end
-- This function is as a valid LTN12 sink.
-- If the content chunk is nil this function will automatically invoke close.
function write(content, src_err)
- if not content then
- if src_err then
- error(src_err)
- else
- close()
- end
- return true
- elseif #content == 0 then
- return true
- else
- if not context.eoh then
- if not context.status then
- status()
- end
- if not context.headers or not context.headers["content-type"] then
- header("Content-Type", "text/html; charset=utf-8")
- end
- if not context.headers["cache-control"] then
- header("Cache-Control", "no-cache")
- header("Expires", "0")
- end
- if not context.headers["x-frame-options"] then
- header("X-Frame-Options", "SAMEORIGIN")
- end
- if not context.headers["x-xss-protection"] then
- header("X-XSS-Protection", "1; mode=block")
- end
- if not context.headers["x-content-type-options"] then
- header("X-Content-Type-Options", "nosniff")
- end
-
- context.eoh = true
- coroutine.yield(3)
- end
- coroutine.yield(4, content)
- return true
+ if src_err then
+ error(src_err)
end
+
+ return L.print(content)
end
function splice(fd, size)
end
function redirect(url)
- if url == "" then url = "/" end
- status(302, "Found")
- header("Location", url)
- close()
+ L.http:redirect(url)
end
function build_querystring(q)
urlencode = util.urlencode
function write_json(x)
- util.serialize_json(x, write)
-end
-
--- from given url or string. Returns a table with urldecoded values.
--- Simple parameters are stored as string values associated with the parameter
--- name within the table. Parameters with multiple values are stored as array
--- containing the corresponding values.
-function urldecode_params(url, tbl)
- local parser, name
- local params = tbl or { }
-
- parser = lhttp.urlencoded_parser(function (what, buffer, length)
- if what == parser.TUPLE then
- name, value = nil, nil
- elseif what == parser.NAME then
- name = lhttp.urldecode(buffer)
- elseif what == parser.VALUE and name then
- params[name] = lhttp.urldecode(buffer) or ""
- end
-
- return true
- end)
-
- if parser then
- parser:parse((url or ""):match("[^?]*$"))
- parser:parse(nil)
- end
-
- return params
+ L.printf('%J', x)
end
-- separated by "&". Tables are encoded as parameters with multiple values by
return table.concat(enc, "")
end
--- Content-Type. Stores all extracted data associated with its parameter name
--- in the params table within the given message object. Multiple parameter
--- values are stored as tables, ordinary ones as strings.
--- If an optional file callback function is given then it is fed with the
--- file contents chunk by chunk and only the extracted file name is stored
--- within the params table. The callback function will be called subsequently
--- with three arguments:
--- o Table containing decoded (name, file) and raw (headers) mime header data
--- o String value containing a chunk of the file data
--- o Boolean which indicates whether the current chunk is the last one (eof)
-function mimedecode_message_body(src, msg, file_cb)
- local parser, header, field
- local len, maxlen = 0, tonumber(msg.env.CONTENT_LENGTH or nil)
-
- parser, err = lhttp.multipart_parser(msg.env.CONTENT_TYPE, function (what, buffer, length)
- if what == parser.PART_INIT then
- field = { }
-
- elseif what == parser.HEADER_NAME then
- header = buffer:lower()
-
- elseif what == parser.HEADER_VALUE and header then
- if header:lower() == "content-disposition" and
- lhttp.header_attribute(buffer, nil) == "form-data"
- then
- field.name = lhttp.header_attribute(buffer, "name")
- field.file = lhttp.header_attribute(buffer, "filename")
- field[1] = field.file
- end
-
- if field.headers then
- field.headers[header] = buffer
- else
- field.headers = { [header] = buffer }
- end
-
- elseif what == parser.PART_BEGIN then
- return not field.file
-
- elseif what == parser.PART_DATA and field.name and length > 0 then
- if field.file then
- if file_cb then
- file_cb(field, buffer, false)
- msg.params[field.name] = msg.params[field.name] or field
- else
- if not field.fd then
- field.fd = nixio.mkstemp(field.name)
- end
-
- if field.fd then
- field.fd:write(buffer)
- msg.params[field.name] = msg.params[field.name] or field
- end
- end
- else
- field.value = buffer
- end
-
- elseif what == parser.PART_END and field.name then
- if field.file and msg.params[field.name] then
- if file_cb then
- file_cb(field, "", true)
- elseif field.fd then
- field.fd:seek(0, "set")
- end
- else
- local val = msg.params[field.name]
-
- if type(val) == "table" then
- val[#val+1] = field.value or ""
- elseif val ~= nil then
- msg.params[field.name] = { val, field.value or "" }
- else
- msg.params[field.name] = field.value or ""
- end
- end
-
- field = nil
-
- elseif what == parser.ERROR then
- err = buffer
- end
-
- return true
- end, HTTP_MAX_CONTENT)
-
- return ltn12.pump.all(src, function (chunk)
- len = len + (chunk and #chunk or 0)
-
- if maxlen and len > maxlen + 2 then
- return nil, "Message body size exceeds Content-Length"
- end
-
- if not parser or not parser:parse(chunk) then
- return nil, err
- end
-
- return true
- end)
-end
-
--- Content-Type. Stores all extracted data associated with its parameter name
--- in the params table within the given message object. Multiple parameter
--- values are stored as tables, ordinary ones as strings.
-function urldecode_message_body(src, msg)
- local err, name, value, parser
- local len, maxlen = 0, tonumber(msg.env.CONTENT_LENGTH or nil)
-
- parser = lhttp.urlencoded_parser(function (what, buffer, length)
- if what == parser.TUPLE then
- name, value = nil, nil
- elseif what == parser.NAME then
- name = lhttp.urldecode(buffer, lhttp.DECODE_PLUS)
- elseif what == parser.VALUE and name then
- local val = msg.params[name]
-
- if type(val) == "table" then
- val[#val+1] = lhttp.urldecode(buffer, lhttp.DECODE_PLUS) or ""
- elseif val ~= nil then
- msg.params[name] = { val, lhttp.urldecode(buffer, lhttp.DECODE_PLUS) or "" }
- else
- msg.params[name] = lhttp.urldecode(buffer, lhttp.DECODE_PLUS) or ""
- end
- elseif what == parser.ERROR then
- err = buffer
- end
-
- return true
- end, HTTP_MAX_CONTENT)
-
- return ltn12.pump.all(src, function (chunk)
- len = len + (chunk and #chunk or 0)
-
- if maxlen and len > maxlen + 2 then
- return nil, "Message body size exceeds Content-Length"
- elseif len > HTTP_MAX_CONTENT then
- return nil, "Message body size exceeds maximum allowed length"
- end
-
- if not parser or not parser:parse(chunk) then
- return nil, err
- end
-
- return true
- end)
-end
-
--- This function will examine the Content-Type within the given message object
--- to select the appropriate content decoder.
--- Currently the application/x-www-urlencoded and application/form-data
--- mime types are supported. If the encountered content encoding can't be
--- handled then the whole message body will be stored unaltered as "content"
--- property within the given message object.
-function parse_message_body(src, msg, filecb)
- if msg.env.CONTENT_LENGTH or msg.env.REQUEST_METHOD == "POST" then
- local ctype = lhttp.header_attribute(msg.env.CONTENT_TYPE, nil)
-
- -- Is it multipart/mime ?
- if ctype == "multipart/form-data" then
- return mimedecode_message_body(src, msg, filecb)
-
- -- Is it application/x-www-form-urlencoded ?
- elseif ctype == "application/x-www-form-urlencoded" then
- return urldecode_message_body(src, msg)
-
- end
-
- -- Unhandled encoding
- -- If a file callback is given then feed it chunk by chunk, else
- -- store whole buffer in message.content
- local sink
-
- -- If we have a file callback then feed it
- if type(filecb) == "function" then
- local meta = {
- name = "raw",
- encoding = msg.env.CONTENT_TYPE
- }
- sink = function( chunk )
- if chunk then
- return filecb(meta, chunk, false)
- else
- return filecb(meta, nil, true)
- end
- end
- -- ... else append to .content
- else
- msg.content = ""
- msg.content_length = 0
-
- sink = function( chunk )
- if chunk then
- if ( msg.content_length + #chunk ) <= HTTP_MAX_CONTENT then
- msg.content = msg.content .. chunk
- msg.content_length = msg.content_length + #chunk
- return true
- else
- return nil, "POST data exceeds maximum allowed length"
- end
- end
- return true
- end
- end
-
- -- Pump data...
- while true do
- local ok, err = ltn12.pump.step( src, sink )
-
- if not ok and err then
- return nil, err
- elseif not ok then -- eof
- return true
- end
- end
-
- return true
- end
-
- return false
-end
+context = {
+ request = {
+ formvalue = function(self, ...) return formvalue(...) end;
+ formvaluetable = function(self, ...) return formvaluetable(...) end;
+ content = function(self, ...) return content(...) end;
+ getcookie = function(self, ...) return getcookie(...) end;
+ setfilehandler = function(self, ...) return setfilehandler(...) end;
+ message = L.http.message
+ }
+}
-- Scope manipulation routines
--
-coxpt = setmetatable({}, { __mode = "kv" })
-
-local tl_meta = {
- __mode = "k",
-
- __index = function(self, key)
- local t = rawget(self, coxpt[coroutine.running()]
- or coroutine.running() or 0)
- return t and t[key]
- end,
-
- __newindex = function(self, key, value)
- local c = coxpt[coroutine.running()] or coroutine.running() or 0
- local r = rawget(self, c)
- if not r then
- rawset(self, c, { [key] = value })
- else
- r[key] = value
- end
- end
-}
-
--- the current active coroutine. A thread local store is private a table object
--- whose values can't be accessed from outside of the running coroutine.
function threadlocal(tbl)
- return setmetatable(tbl or {}, tl_meta)
+ return tbl or {}
end
co = coroutine.create(newf)
end
coromap[co] = current
- coxpt[co] = coxpt[current] or current or 0
return performResume(err, co, ...)
end
end
include $(TOPDIR)/rules.mk
LUCI_TITLE:=RSA/X.509 Key Generator (required for LuCId SSL support)
-LUCI_DEPENDS:=+liblua
+LUCI_DEPENDS:=+lua +luci-lib-nixio
PKG_USE_MIPS16:=0
PKG_LICENSE:=LGPL-2.1
HTDOCS = /www
LUA_LIBRARYDIR = /usr/lib/lua
LUCI_LIBRARYDIR = $(LUA_LIBRARYDIR)/luci
+UCODE_LIBRARYDIR = /usr/share/ucode/luci
# 1: everything expect po subdir or only po subdir
PKG_GITBRANCH?=$(if $(DUMP),x,$(strip $(shell \
variant="LuCI"; \
if git log -1 >/dev/null 2>/dev/null; then \
- branch="$$(git branch --remote --verbose --no-abbrev --contains 2>/dev/null | \
- sed -rne 's|^[^/]+/([^ ]+) [a-f0-9]{40} .+$$|\1|p' | head -n1)"; \
+ branch=$$(git branch --remote --no-abbrev --contains 2>/dev/null | tail -n1); \
+ branch=$${branch:-$$(git branch --no-abbrev --contains 2>/dev/null)}; \
+ branch=$${branch#? }; branch=$${branch#*/}; \
if [ "$$branch" != "master" ]; then \
- variant="LuCI $$branch branch"; \
+ variant="LuCI $${branch:-unknown} branch"; \
else \
variant="LuCI Master"; \
fi; \
include $(INCLUDE_DIR)/package.mk
-# LUCI_SUBMENU: the submenu-item below the LuCI top-level menu inside OpoenWrt menuconfig
+# LUCI_SUBMENU: the submenu-item below the LuCI top-level menu inside OpenWrt menuconfig
# usually one of the LUCI_MENU.* definitions
# LUCI_SUBMENU_DEFAULT: the regular SUBMENU defined by LUCI_TYPE or derrived from the packagename
# LUCI_SUBMENU_FORCED: manually forced value SUBMENU to set to by explicit definiton
-# can be any string, "none" disables the creation of a submenu
+# can be any string, "none" disables the creation of a submenu
# most usefull in combination with LUCI_CATEGORY, to make the package appear
# anywhere in the menu structure
LUCI_SUBMENU_DEFAULT=$(if $(LUCI_MENU.$(LUCI_TYPE)),$(LUCI_MENU.$(LUCI_TYPE)),$(LUCI_MENU.app))
LUCI_SUBMENU=$(if $(LUCI_SUBMENU_FORCED),$(LUCI_SUBMENU_FORCED),$(LUCI_SUBMENU_DEFAULT))
+ifneq ($(wildcard ${CURDIR}/luasrc/*),)
+ ifneq ($(filter-out luci-lib-base luci-lua-runtime,$(PKG_NAME)),)
+ LUCI_DEPENDS += +luci-lua-runtime
+ endif
+endif
+
define Package/$(PKG_NAME)
SECTION:=$(LUCI_SECTION)
CATEGORY:=$(LUCI_CATEGORY)
endif
define Build/Prepare
- for d in luasrc htdocs root src; do \
+ for d in luasrc ucode htdocs root src; do \
if [ -d ./$$$$d ]; then \
mkdir -p $(PKG_BUILD_DIR)/$$$$d; \
$(CP) ./$$$$d/* $(PKG_BUILD_DIR)/$$$$d/; \
$(if $(CONFIG_LUCI_SRCDIET),$(call SrcDiet,$(1)$(LUCI_LIBRARYDIR)/),true)
$(call SubstituteVersion,$(1)$(LUCI_LIBRARYDIR)/)
endif
+ ifneq ($(wildcard ${CURDIR}/ucode),)
+ $(INSTALL_DIR) $(1)$(UCODE_LIBRARYDIR)
+ cp -pR $(PKG_BUILD_DIR)/ucode/* $(1)$(UCODE_LIBRARYDIR)/
+ $(call SubstituteVersion,$(1)$(UCODE_LIBRARYDIR)/)
+ endif
ifneq ($(wildcard ${CURDIR}/htdocs),)
$(INSTALL_DIR) $(1)$(HTDOCS)
cp -pR $(PKG_BUILD_DIR)/htdocs/* $(1)$(HTDOCS)/
ifndef Package/$(PKG_NAME)/postinst
define Package/$(PKG_NAME)/postinst
[ -n "$${IPKG_INSTROOT}" ] || { \
- rm -f /tmp/luci-indexcache
+ rm -f /tmp/luci-indexcache.*
rm -rf /tmp/luci-modulecache/
killall -HUP rpcd 2>/dev/null
exit 0
endif
# some generic macros that can be used by all packages
-ifeq ($(LUCI_MINIFY_JS),1)
+ifeq ($(LUCI_MINIFY_LUA),1)
define SrcDiet
$(FIND) $(1) -type f -name '*.lua' | while read src; do \
if LUA_PATH="$(STAGING_DIR_HOSTPKG)/lib/lua/5.1/?.lua" luasrcdiet --noopt-binequiv -o "$$$$src.o" "$$$$src"; \
$(SED) 's/<%# *\([^ ]*\)PKG_VERSION *%>/\1$(if $(PKG_VERSION),$(PKG_VERSION),$(PKG_SRC_VERSION))/g' \
-e 's/"\(<%= *\(media\|resource\) *%>[^"]*\.\(js\|css\)\)"/"\1?v=$(if $(PKG_VERSION),$(PKG_VERSION),$(PKG_SRC_VERSION))"/g' \
"$$$$src"; \
+ done; \
+ $(FIND) $(1) -type f -name '*.ut' | while read src; do \
+ $(SED) 's/{# *\([^ ]*\)PKG_VERSION *#}/\1$(if $(PKG_VERSION),$(PKG_VERSION),$(PKG_SRC_VERSION))/g' \
+ -e 's/"\({{ *\(media\|resource\) *}}[^"]*\.\(js\|css\)\)"/"\1?v=$(if $(PKG_VERSION),$(PKG_VERSION),$(PKG_SRC_VERSION))"/g' \
+ "$$$$src"; \
done
endef
default y
config LUCI_CSSTIDY
- bool "Minify CSS files"
- default y
+ bool "Minify CSS files"
+ default y
menu "Translations"$(foreach lang,$(LUCI_LANGUAGES),$(if $(LUCI_LANG.$(lang)),
#
-# Copyright (C) 2008-2015 The LuCI Team <luci@lists.subsignal.org>
+# Copyright (C) 2022 Jo-Philipp Wich <jo@mein.io>
#
# This is free software, licensed under the Apache License, Version 2.0 .
#
LUCI_TYPE:=mod
LUCI_BASENAME:=base
-LUCI_TITLE:=LuCI core libraries
-LUCI_DEPENDS:=+lua +luci-lib-nixio +luci-lib-ip +rpcd +libubus-lua +luci-lib-jsonc +liblucihttp-lua +luci-lib-base +rpcd-mod-file +rpcd-mod-luci +cgi-io
+LUCI_TITLE:=LuCI core runtime
+LUCI_DEPENDS:=\
+ +rpcd \
+ +rpcd-mod-file \
+ +rpcd-mod-luci \
+ +rpcd-mod-ucode \
+ +cgi-io \
+ +ucode \
+ +ucode-mod-fs \
+ +ucode-mod-uci \
+ +ucode-mod-ubus \
+ +ucode-mod-math \
+ +ucode-mod-html \
+ +liblucihttp-ucode
PKG_LICENSE:=MIT
/etc/config/ucitrack
endef
+define Package/luci-base/postinst
+#!/bin/sh
+
+if [ -z "$${PKG_INSTROOT}" ] && [ -f /etc/config/uhttpd ]; then
+ if ! uci -q get uhttpd.main.ucode_prefix | grep -sq /cgi-bin/luci; then
+ uci add_list uhttpd.main.ucode_prefix='/cgi-bin/luci=/usr/share/ucode/luci/uhttpd.uc'
+ uci commit uhttpd
+ service uhttpd reload
+ fi
+fi
+
+exit 0
+endef
+
include ../../luci.mk
define Host/Configure
-#!/usr/bin/lua
-require "luci.cacheloader"
-require "luci.sgi.cgi"
-luci.dispatcher.indexcache = "/tmp/luci-indexcache"
-luci.sgi.cgi.run()
+#!/usr/bin/env ucode
+
+'use strict';
+
+import { stdin, stdout } from 'fs';
+
+import dispatch from 'luci.dispatcher';
+import request from 'luci.http';
+
+const input_bufsize = 4096;
+let input_available = +getenv('CONTENT_LENGTH') || 0;
+
+function read(len) {
+ if (input_available == 0) {
+ stdin.close();
+
+ return null;
+ }
+
+ let chunk = stdin.read(min(input_available, len ?? input_bufsize, input_bufsize));
+
+ if (chunk == null) {
+ input_available = 0;
+ stdin.close();
+ }
+ else {
+ input_available -= length(chunk);
+ }
+
+ return chunk;
+}
+
+function write(data) {
+ return stdout.write(data);
+}
+
+let req = request(getenv(), read, write);
+
+dispatch(req);
+
+req.close();
+++ /dev/null
--- Copyright 2008 Steven Barth <steven@midlink.org>
--- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
--- Licensed to the public under the Apache License 2.0.
-
-local config = require "luci.config"
-local ccache = require "luci.ccache"
-
-module "luci.cacheloader"
-
-if config.ccache and config.ccache.enable == "1" then
- ccache.cache_ondemand()
-end
+++ /dev/null
--- Copyright 2008 Steven Barth <steven@midlink.org>
--- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
--- Licensed to the public under the Apache License 2.0.
-
-local io = require "io"
-local fs = require "nixio.fs"
-local util = require "luci.util"
-local nixio = require "nixio"
-local debug = require "debug"
-local string = require "string"
-local package = require "package"
-
-local type, loadfile = type, loadfile
-
-
-module "luci.ccache"
-
-function cache_ondemand(...)
- if debug.getinfo(1, 'S').source ~= "=?" then
- cache_enable(...)
- end
-end
-
-function cache_enable(cachepath, mode)
- cachepath = cachepath or "/tmp/luci-modulecache"
- mode = mode or "r--r--r--"
-
- local loader = package.loaders[2]
- local uid = nixio.getuid()
-
- if not fs.stat(cachepath) then
- fs.mkdir(cachepath)
- end
-
- local function _encode_filename(name)
- local encoded = ""
- for i=1, #name do
- encoded = encoded .. ("%2X" % string.byte(name, i))
- end
- return encoded
- end
-
- local function _load_sane(file)
- local stat = fs.stat(file)
- if stat and stat.uid == uid and stat.modestr == mode then
- return loadfile(file)
- end
- end
-
- local function _write_sane(file, func)
- if nixio.getuid() == uid then
- local fp = io.open(file, "w")
- if fp then
- fp:write(util.get_bytecode(func))
- fp:close()
- fs.chmod(file, mode)
- end
- end
- end
-
- package.loaders[2] = function(mod)
- local encoded = cachepath .. "/" .. _encode_filename(mod)
- local modcons = _load_sane(encoded)
-
- if modcons then
- return modcons
- end
-
- -- No cachefile
- modcons = loader(mod)
- if type(modcons) == "function" then
- _write_sane(encoded, modcons)
- end
- return modcons
- end
-end
+++ /dev/null
--- Copyright 2008 Steven Barth <steven@midlink.org>
--- Licensed to the public under the Apache License 2.0.
-
-local util = require "luci.util"
-module("luci.config",
- function(m)
- if pcall(require, "luci.model.uci") then
- local config = util.threadlocal()
- setmetatable(m, {
- __index = function(tbl, key)
- if not config[key] then
- config[key] = luci.model.uci.cursor():get_all("luci", key)
- end
- return config[key]
- end
- })
- end
- end)
+++ /dev/null
--- Copyright 2008 Steven Barth <steven@midlink.org>
--- Licensed to the public under the Apache License 2.0.
-
-module("luci.controller.admin.index", package.seeall)
-
-function action_logout()
- local dsp = require "luci.dispatcher"
- local utl = require "luci.util"
- local sid = dsp.context.authsession
-
- if sid then
- utl.ubus("session", "destroy", { ubus_rpc_session = sid })
-
- local url = dsp.build_url()
-
- if luci.http.getenv('HTTPS') == 'on' then
- luci.http.header("Set-Cookie", "sysauth_https=; expires=Thu, 01 Jan 1970 01:00:00 GMT; path=%s" % url)
- end
-
- luci.http.header("Set-Cookie", "sysauth_http=; expires=Thu, 01 Jan 1970 01:00:00 GMT; path=%s" % url)
- end
-
- luci.http.redirect(dsp.build_url())
-end
-
-function action_translations(lang)
- local i18n = require "luci.i18n"
- local http = require "luci.http"
- local fs = require "nixio".fs
-
- if lang and #lang > 0 then
- lang = i18n.setlanguage(lang)
- if lang then
- local s = fs.stat("%s/base.%s.lmo" %{ i18n.i18ndir, lang })
- if s then
- http.header("Cache-Control", "public, max-age=31536000")
- http.header("ETag", "%x-%x-%x" %{ s["ino"], s["size"], s["mtime"] })
- end
- end
- end
-
- http.prepare_content("application/javascript; charset=utf-8")
- http.write("window.TR=")
- http.write_json(i18n.dump())
-end
-
-local function ubus_reply(id, data, code, errmsg)
- local reply = { jsonrpc = "2.0", id = id }
- if errmsg then
- reply.error = {
- code = code,
- message = errmsg
- }
- elseif type(code) == "table" then
- reply.result = code
- else
- reply.result = { code, data }
- end
-
- return reply
-end
-
-local ubus_types = {
- nil,
- "array",
- "object",
- "string",
- nil, -- INT64
- "number",
- nil, -- INT16,
- "boolean",
- "double"
-}
-
-local function ubus_access(sid, obj, fun)
- local res, code = luci.util.ubus("session", "access", {
- ubus_rpc_session = sid,
- scope = "ubus",
- object = obj,
- ["function"] = fun
- })
-
- return (type(res) == "table" and res.access == true)
-end
-
-local function ubus_request(req)
- if type(req) ~= "table" or type(req.method) ~= "string" or req.jsonrpc ~= "2.0" or req.id == nil then
- return ubus_reply(nil, nil, -32600, "Invalid request")
-
- elseif req.method == "call" then
- if type(req.params) ~= "table" or #req.params < 3 then
- return ubus_reply(nil, nil, -32600, "Invalid parameters")
- end
-
- local sid, obj, fun, arg =
- req.params[1], req.params[2], req.params[3], req.params[4] or {}
- if type(arg) ~= "table" or arg.ubus_rpc_session ~= nil then
- return ubus_reply(req.id, nil, -32602, "Invalid parameters")
- end
-
- if sid == "00000000000000000000000000000000" and luci.dispatcher.context.authsession then
- sid = luci.dispatcher.context.authsession
- end
-
- if not ubus_access(sid, obj, fun) then
- return ubus_reply(req.id, nil, -32002, "Access denied")
- end
-
- arg.ubus_rpc_session = sid
-
- local res, code = luci.util.ubus(obj, fun, arg)
- return ubus_reply(req.id, res, code or 0)
-
- elseif req.method == "list" then
- if req.params == nil or (type(req.params) == "table" and #req.params == 0) then
- local objs = luci.util.ubus()
- return ubus_reply(req.id, nil, objs)
-
- elseif type(req.params) == "table" then
- local n, rv = nil, {}
- for n = 1, #req.params do
- if type(req.params[n]) ~= "string" then
- return ubus_reply(req.id, nil, -32602, "Invalid parameters")
- end
-
- local sig = luci.util.ubus(req.params[n])
- if sig and type(sig) == "table" then
- rv[req.params[n]] = {}
-
- local m, p
- for m, p in pairs(sig) do
- if type(p) == "table" then
- rv[req.params[n]][m] = {}
-
- local pn, pt
- for pn, pt in pairs(p) do
- rv[req.params[n]][m][pn] = ubus_types[pt] or "unknown"
- end
- end
- end
- end
- end
- return ubus_reply(req.id, nil, rv)
-
- else
- return ubus_reply(req.id, nil, -32602, "Invalid parameters")
- end
- end
-
- return ubus_reply(req.id, nil, -32601, "Method not found")
-end
-
-function action_ubus()
- local parser = require "luci.jsonc".new()
-
- luci.http.context.request:setfilehandler(function(_, s)
- if not s then
- return nil
- end
-
- local ok, err = parser:parse(s)
- return (not err or nil)
- end)
-
- luci.http.context.request:content()
-
- local json = parser:get()
- if json == nil or type(json) ~= "table" then
- luci.http.prepare_content("application/json")
- luci.http.write_json(ubus_reply(nil, nil, -32700, "Parse error"))
- return
- end
-
- local response
- if #json == 0 then
- response = ubus_request(json)
- else
- response = {}
-
- local _, request
- for _, request in ipairs(json) do
- response[_] = ubus_request(request)
- end
- end
-
- luci.http.prepare_content("application/json")
- luci.http.write_json(response)
-end
-
-function action_menu()
- local dsp = require "luci.dispatcher"
- local http = require "luci.http"
-
- local _, _, acls = dsp.is_authenticated({ methods = { "cookie:sysauth_https", "cookie:sysauth_http" } })
- local menu = dsp.menu_json(acls or {}) or {}
-
- http.prepare_content("application/json")
- http.write_json(menu)
-end
+++ /dev/null
--- Copyright 2008 Steven Barth <steven@midlink.org>
--- Copyright 2010-2019 Jo-Philipp Wich <jo@mein.io>
--- Licensed to the public under the Apache License 2.0.
-
-module("luci.controller.admin.uci", package.seeall)
-
-local function ubus_state_to_http(errstr)
- local map = {
- ["Invalid command"] = 400,
- ["Invalid argument"] = 400,
- ["Method not found"] = 404,
- ["Entry not found"] = 404,
- ["No data"] = 204,
- ["Permission denied"] = 403,
- ["Timeout"] = 504,
- ["Not supported"] = 500,
- ["Unknown error"] = 500,
- ["Connection failed"] = 503
- }
-
- local code = map[errstr] or 200
- local msg = errstr or "OK"
-
- luci.http.status(code, msg)
-
- if code ~= 204 then
- luci.http.prepare_content("text/plain")
- luci.http.write(msg)
- end
-end
-
-function action_apply_rollback()
- local uci = require "luci.model.uci"
- local token, errstr = uci:apply(true)
- if token then
- luci.http.prepare_content("application/json")
- luci.http.write_json({ token = token })
- else
- ubus_state_to_http(errstr)
- end
-end
-
-function action_apply_unchecked()
- local uci = require "luci.model.uci"
- local _, errstr = uci:apply(false)
- ubus_state_to_http(errstr)
-end
-
-function action_confirm()
- local uci = require "luci.model.uci"
- local token = luci.http.formvalue("token")
- local _, errstr = uci:confirm(token)
- ubus_state_to_http(errstr)
-end
-
-function action_revert()
- local uci = require "luci.model.uci"
- local changes = uci:changes()
-
- -- Collect files to be reverted
- local _, errstr, r, tbl
- for r, tbl in pairs(changes) do
- _, errstr = uci:revert(r)
- if errstr then
- break
- end
- end
-
- ubus_state_to_http(errstr or "OK")
-end
+++ /dev/null
--- Copyright 2008 Steven Barth <steven@midlink.org>
--- Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
--- Licensed to the public under the Apache License 2.0.
-
-local fs = require "nixio.fs"
-local sys = require "luci.sys"
-local util = require "luci.util"
-local xml = require "luci.xml"
-local http = require "luci.http"
-local nixio = require "nixio", require "nixio.util"
-
-module("luci.dispatcher", package.seeall)
-context = util.threadlocal()
-uci = require "luci.model.uci"
-i18n = require "luci.i18n"
-_M.fs = fs
-
--- Index table
-local index = nil
-
-local function check_fs_depends(spec)
- local fs = require "nixio.fs"
-
- for path, kind in pairs(spec) do
- if kind == "directory" then
- local empty = true
- for entry in (fs.dir(path) or function() end) do
- empty = false
- break
- end
- if empty then
- return false
- end
- elseif kind == "executable" then
- if fs.stat(path, "type") ~= "reg" or not fs.access(path, "x") then
- return false
- end
- elseif kind == "file" then
- if fs.stat(path, "type") ~= "reg" then
- return false
- end
- elseif kind == "absent" then
- if fs.stat(path, "type") then
- return false
- end
- end
- end
-
- return true
-end
-
-local function check_uci_depends_options(conf, s, opts)
- local uci = require "luci.model.uci"
-
- if type(opts) == "string" then
- return (s[".type"] == opts)
- elseif opts == true then
- for option, value in pairs(s) do
- if option:byte(1) ~= 46 then
- return true
- end
- end
- elseif type(opts) == "table" then
- for option, value in pairs(opts) do
- local sval = s[option]
- if type(sval) == "table" then
- local found = false
- for _, v in ipairs(sval) do
- if v == value then
- found = true
- break
- end
- end
- if not found then
- return false
- end
- elseif value == true then
- if sval == nil then
- return false
- end
- else
- if sval ~= value then
- return false
- end
- end
- end
- end
-
- return true
-end
-
-local function check_uci_depends_section(conf, sect)
- local uci = require "luci.model.uci"
-
- for section, options in pairs(sect) do
- local stype = section:match("^@([A-Za-z0-9_%-]+)$")
- if stype then
- local found = false
- uci:foreach(conf, stype, function(s)
- if check_uci_depends_options(conf, s, options) then
- found = true
- return false
- end
- end)
- if not found then
- return false
- end
- else
- local s = uci:get_all(conf, section)
- if not s or not check_uci_depends_options(conf, s, options) then
- return false
- end
- end
- end
-
- return true
-end
-
-local function check_uci_depends(conf)
- local uci = require "luci.model.uci"
-
- for config, values in pairs(conf) do
- if values == true then
- local found = false
- uci:foreach(config, nil, function(s)
- found = true
- return false
- end)
- if not found then
- return false
- end
- elseif type(values) == "table" then
- if not check_uci_depends_section(config, values) then
- return false
- end
- end
- end
-
- return true
-end
-
-local function check_acl_depends(require_groups, groups)
- if type(require_groups) == "table" and #require_groups > 0 then
- local writable = false
-
- for _, group in ipairs(require_groups) do
- local read = false
- local write = false
- if type(groups) == "table" and type(groups[group]) == "table" then
- for _, perm in ipairs(groups[group]) do
- if perm == "read" then
- read = true
- elseif perm == "write" then
- write = true
- end
- end
- end
- if not read and not write then
- return nil
- elseif write then
- writable = true
- end
- end
-
- return writable
- end
-
- return true
-end
-
-local function check_depends(spec)
- if type(spec.depends) ~= "table" then
- return true
- end
-
- if type(spec.depends.fs) == "table" then
- local satisfied = false
- local alternatives = (#spec.depends.fs > 0) and spec.depends.fs or { spec.depends.fs }
- for _, alternative in ipairs(alternatives) do
- if check_fs_depends(alternative) then
- satisfied = true
- break
- end
- end
- if not satisfied then
- return false
- end
- end
-
- if type(spec.depends.uci) == "table" then
- local satisfied = false
- local alternatives = (#spec.depends.uci > 0) and spec.depends.uci or { spec.depends.uci }
- for _, alternative in ipairs(alternatives) do
- if check_uci_depends(alternative) then
- satisfied = true
- break
- end
- end
- if not satisfied then
- return false
- end
- end
-
- return true
-end
-
-local function target_to_json(target, module)
- local action
-
- if target.type == "call" then
- action = {
- ["type"] = "call",
- ["module"] = module,
- ["function"] = target.name,
- ["parameters"] = target.argv
- }
- elseif target.type == "view" then
- action = {
- ["type"] = "view",
- ["path"] = target.view
- }
- elseif target.type == "template" then
- action = {
- ["type"] = "template",
- ["path"] = target.view
- }
- elseif target.type == "cbi" then
- action = {
- ["type"] = "cbi",
- ["path"] = target.model,
- ["config"] = target.config
- }
- elseif target.type == "form" then
- action = {
- ["type"] = "form",
- ["path"] = target.model
- }
- elseif target.type == "firstchild" then
- action = {
- ["type"] = "firstchild"
- }
- elseif target.type == "firstnode" then
- action = {
- ["type"] = "firstchild",
- ["recurse"] = true
- }
- elseif target.type == "arcombine" then
- if type(target.targets) == "table" then
- action = {
- ["type"] = "arcombine",
- ["targets"] = {
- target_to_json(target.targets[1], module),
- target_to_json(target.targets[2], module)
- }
- }
- end
- elseif target.type == "alias" then
- action = {
- ["type"] = "alias",
- ["path"] = table.concat(target.req, "/")
- }
- elseif target.type == "rewrite" then
- action = {
- ["type"] = "rewrite",
- ["path"] = table.concat(target.req, "/"),
- ["remove"] = target.n
- }
- end
-
- if target.post and action then
- action.post = target.post
- end
-
- return action
-end
-
-local function tree_to_json(node, json)
- local fs = require "nixio.fs"
- local util = require "luci.util"
-
- if type(node.nodes) == "table" then
- for subname, subnode in pairs(node.nodes) do
- local spec = {
- title = xml.striptags(subnode.title),
- order = subnode.order
- }
-
- if subnode.leaf then
- spec.wildcard = true
- end
-
- if subnode.cors then
- spec.cors = true
- end
-
- if subnode.setuser then
- spec.setuser = subnode.setuser
- end
-
- if subnode.setgroup then
- spec.setgroup = subnode.setgroup
- end
-
- if type(subnode.target) == "table" then
- spec.action = target_to_json(subnode.target, subnode.module)
- end
-
- if type(subnode.file_depends) == "table" then
- for _, v in ipairs(subnode.file_depends) do
- spec.depends = spec.depends or {}
- spec.depends.fs = spec.depends.fs or {}
-
- local ft = fs.stat(v, "type")
- if ft == "dir" then
- spec.depends.fs[v] = "directory"
- elseif v:match("/s?bin/") then
- spec.depends.fs[v] = "executable"
- else
- spec.depends.fs[v] = "file"
- end
- end
- end
-
- if type(subnode.uci_depends) == "table" then
- for k, v in pairs(subnode.uci_depends) do
- spec.depends = spec.depends or {}
- spec.depends.uci = spec.depends.uci or {}
- spec.depends.uci[k] = v
- end
- end
-
- if type(subnode.acl_depends) == "table" then
- for _, acl in ipairs(subnode.acl_depends) do
- spec.depends = spec.depends or {}
- spec.depends.acl = spec.depends.acl or {}
- spec.depends.acl[#spec.depends.acl + 1] = acl
- end
- end
-
- if (subnode.sysauth_authenticator ~= nil) or
- (subnode.sysauth ~= nil and subnode.sysauth ~= false)
- then
- if subnode.sysauth_authenticator == "htmlauth" then
- spec.auth = {
- login = true,
- methods = { "cookie:sysauth_https", "cookie:sysauth_http" }
- }
- elseif subname == "rpc" and subnode.module == "luci.controller.rpc" then
- spec.auth = {
- login = false,
- methods = { "query:auth", "cookie:sysauth_https", "cookie:sysauth_http" }
- }
- elseif subnode.module == "luci.controller.admin.uci" then
- spec.auth = {
- login = false,
- methods = { "param:sid" }
- }
- end
- elseif subnode.sysauth == false then
- spec.auth = {}
- end
-
- if not spec.action then
- spec.title = nil
- end
-
- spec.satisfied = check_depends(spec)
- json.children = json.children or {}
- json.children[subname] = tree_to_json(subnode, spec)
- end
- end
-
- return json
-end
-
-function build_url(...)
- local path = {...}
- local url = { http.getenv("SCRIPT_NAME") or "" }
-
- local p
- for _, p in ipairs(path) do
- if p:match("^[a-zA-Z0-9_%-%.%%/,;]+$") then
- url[#url+1] = "/"
- url[#url+1] = p
- end
- end
-
- if #path == 0 then
- url[#url+1] = "/"
- end
-
- return table.concat(url, "")
-end
-
-
-function error404(message)
- http.status(404, "Not Found")
- message = message or "Not Found"
-
- local function render()
- local template = require "luci.template"
- template.render("error404", {message=message})
- end
-
- if not util.copcall(render) then
- http.prepare_content("text/plain")
- http.write(message)
- end
-
- return false
-end
-
-function error500(message)
- util.perror(message)
- if not context.template_header_sent then
- http.status(500, "Internal Server Error")
- http.prepare_content("text/plain")
- http.write(message)
- else
- require("luci.template")
- if not util.copcall(luci.template.render, "error500", {message=message}) then
- http.prepare_content("text/plain")
- http.write(message)
- end
- end
- return false
-end
-
-local function determine_request_language()
- local conf = require "luci.config"
- assert(conf.main, "/etc/config/luci seems to be corrupt, unable to find section 'main'")
-
- local lang = conf.main.lang or "auto"
- if lang == "auto" then
- local aclang = http.getenv("HTTP_ACCEPT_LANGUAGE") or ""
- for aclang in aclang:gmatch("[%w_-]+") do
- local country, culture = aclang:match("^([a-z][a-z])[_-]([a-zA-Z][a-zA-Z])$")
- if country and culture then
- local cc = "%s_%s" %{ country, culture:lower() }
- if conf.languages[cc] then
- lang = cc
- break
- elseif conf.languages[country] then
- lang = country
- break
- end
- elseif conf.languages[aclang] then
- lang = aclang
- break
- end
- end
- end
-
- if lang == "auto" then
- lang = i18n.default
- end
-
- i18n.setlanguage(lang)
-end
-
-function httpdispatch(request, prefix)
- http.context.request = request
-
- local r = {}
- context.request = r
-
- local pathinfo = http.urldecode(request:getenv("PATH_INFO") or "", true)
-
- if prefix then
- for _, node in ipairs(prefix) do
- r[#r+1] = node
- end
- end
-
- local node
- for node in pathinfo:gmatch("[^/%z]+") do
- r[#r+1] = node
- end
-
- determine_request_language()
-
- local stat, err = util.coxpcall(function()
- dispatch(context.request)
- end, error500)
-
- http.close()
-
- --context._disable_memtrace()
-end
-
-local function require_post_security(target, args)
- if type(target) == "table" and target.type == "arcombine" and type(target.targets) == "table" then
- return require_post_security((type(args) == "table" and #args > 0) and target.targets[2] or target.targets[1], args)
- end
-
- if type(target) == "table" then
- if type(target.post) == "table" then
- local param_name, required_val, request_val
-
- for param_name, required_val in pairs(target.post) do
- request_val = http.formvalue(param_name)
-
- if (type(required_val) == "string" and
- request_val ~= required_val) or
- (required_val == true and request_val == nil)
- then
- return false
- end
- end
-
- return true
- end
-
- return (target.post == true)
- end
-
- return false
-end
-
-function test_post_security()
- if http.getenv("REQUEST_METHOD") ~= "POST" then
- http.status(405, "Method Not Allowed")
- http.header("Allow", "POST")
- return false
- end
-
- if http.formvalue("token") ~= context.authtoken then
- http.status(403, "Forbidden")
- luci.template.render("csrftoken")
- return false
- end
-
- return true
-end
-
-local function session_retrieve(sid, allowed_users)
- local sdat = util.ubus("session", "get", { ubus_rpc_session = sid })
- local sacl = util.ubus("session", "access", { ubus_rpc_session = sid })
-
- if type(sdat) == "table" and
- type(sdat.values) == "table" and
- type(sdat.values.token) == "string" and
- (not allowed_users or
- util.contains(allowed_users, sdat.values.username))
- then
- uci:set_session_id(sid)
- return sid, sdat.values, type(sacl) == "table" and sacl or {}
- end
-
- return nil, nil, nil
-end
-
-local function session_setup(user, pass)
- local login = util.ubus("session", "login", {
- username = user,
- password = pass,
- timeout = tonumber(luci.config.sauth.sessiontime)
- })
-
- local rp = context.requestpath
- and table.concat(context.requestpath, "/") or ""
-
- if type(login) == "table" and
- type(login.ubus_rpc_session) == "string"
- then
- util.ubus("session", "set", {
- ubus_rpc_session = login.ubus_rpc_session,
- values = { token = sys.uniqueid(16) }
- })
- nixio.syslog("info", tostring("luci: accepted login on /%s for %s from %s\n"
- %{ rp, user or "?", http.getenv("REMOTE_ADDR") or "?" }))
-
- return session_retrieve(login.ubus_rpc_session)
- end
- nixio.syslog("info", tostring("luci: failed login on /%s for %s from %s\n"
- %{ rp, user or "?", http.getenv("REMOTE_ADDR") or "?" }))
-end
-
-local function check_authentication(method)
- local auth_type, auth_param = method:match("^(%w+):(.+)$")
- local sid, sdat
-
- if auth_type == "cookie" then
- sid = http.getcookie(auth_param)
- elseif auth_type == "param" then
- sid = http.formvalue(auth_param)
- elseif auth_type == "query" then
- sid = http.formvalue(auth_param, true)
- end
-
- return session_retrieve(sid)
-end
-
-local function merge_trees(node_a, node_b)
- for k, v in pairs(node_b) do
- if k == "children" then
- node_a.children = node_a.children or {}
-
- for name, spec in pairs(v) do
- node_a.children[name] = merge_trees(node_a.children[name] or {}, spec)
- end
- else
- node_a[k] = v
- end
- end
-
- if type(node_a.action) == "table" and
- node_a.action.type == "firstchild" and
- node_a.children == nil
- then
- node_a.satisfied = false
- end
-
- return node_a
-end
-
-local function apply_tree_acls(node, acl)
- if type(node.children) == "table" then
- for _, child in pairs(node.children) do
- apply_tree_acls(child, acl)
- end
- end
-
- local perm
- if type(node.depends) == "table" then
- perm = check_acl_depends(node.depends.acl, acl["access-group"])
- else
- perm = true
- end
-
- if perm == nil then
- node.satisfied = false
- elseif perm == false then
- node.readonly = true
- end
-end
-
-function menu_json(acl)
- local tree = context.tree or createtree()
- local lua_tree = tree_to_json(tree, {
- action = {
- ["type"] = "firstchild",
- ["recurse"] = true
- }
- })
-
- local json_tree = createtree_json()
- local menu_tree = merge_trees(lua_tree, json_tree)
-
- if acl then
- apply_tree_acls(menu_tree, acl)
- end
-
- return menu_tree
-end
-
-local function init_template_engine(ctx)
- local tpl = require "luci.template"
- local media = luci.config.main.mediaurlbase
-
- if not pcall(tpl.Template, "themes/%s/header" % fs.basename(media)) then
- media = nil
- for name, theme in pairs(luci.config.themes) do
- if name:sub(1,1) ~= "." and pcall(tpl.Template,
- "themes/%s/header" % fs.basename(theme)) then
- media = theme
- end
- end
- assert(media, "No valid theme found")
- end
-
- local function _ifattr(cond, key, val, noescape)
- if cond then
- local env = getfenv(3)
- local scope = (type(env.self) == "table") and env.self
- if type(val) == "table" then
- if not next(val) then
- return ''
- else
- val = util.serialize_json(val)
- end
- end
-
- val = tostring(val or
- (type(env[key]) ~= "function" and env[key]) or
- (scope and type(scope[key]) ~= "function" and scope[key]) or "")
-
- if noescape ~= true then
- val = xml.pcdata(val)
- end
-
- return string.format(' %s="%s"', tostring(key), val)
- else
- return ''
- end
- end
-
- tpl.context.viewns = setmetatable({
- write = http.write;
- include = function(name) tpl.Template(name):render(getfenv(2)) end;
- translate = i18n.translate;
- translatef = i18n.translatef;
- export = function(k, v) if tpl.context.viewns[k] == nil then tpl.context.viewns[k] = v end end;
- striptags = xml.striptags;
- pcdata = xml.pcdata;
- media = media;
- theme = fs.basename(media);
- resource = luci.config.main.resourcebase;
- ifattr = function(...) return _ifattr(...) end;
- attr = function(...) return _ifattr(true, ...) end;
- url = build_url;
- }, {__index=function(tbl, key)
- if key == "controller" then
- return build_url()
- elseif key == "REQUEST_URI" then
- return build_url(unpack(ctx.requestpath))
- elseif key == "FULL_REQUEST_URI" then
- local url = { http.getenv("SCRIPT_NAME") or "", http.getenv("PATH_INFO") }
- local query = http.getenv("QUERY_STRING")
- if query and #query > 0 then
- url[#url+1] = "?"
- url[#url+1] = query
- end
- return table.concat(url, "")
- elseif key == "token" then
- return ctx.authtoken
- else
- return rawget(tbl, key) or _G[key]
- end
- end})
-
- return tpl
-end
-
-function is_authenticated(auth)
- if type(auth) == "table" and type(auth.methods) == "table" and #auth.methods > 0 then
- local sid, sdat, sacl
- for _, method in ipairs(auth.methods) do
- sid, sdat, sacl = check_authentication(method)
-
- if sid and sdat and sacl then
- return sid, sdat, sacl
- end
- end
- end
-end
-
-local function ctx_append(ctx, name, node)
- ctx.path = ctx.path or {}
- ctx.path[#ctx.path + 1] = name
-
- ctx.acls = ctx.acls or {}
-
- local acls = (type(node.depends) == "table" and type(node.depends.acl) == "table") and node.depends.acl or {}
- for _, acl in ipairs(acls) do
- ctx.acls[_] = acl
- end
-
- ctx.auth = node.auth or ctx.auth
- ctx.cors = node.cors or ctx.cors
- ctx.suid = node.setuser or ctx.suid
- ctx.sgid = node.setgroup or ctx.sgid
-
- return ctx
-end
-
-local function node_weight(node)
- local weight = node.order or 9999
-
- if weight > 9999 then
- weight = 9999
- end
-
- if type(node.auth) == "table" and node.auth.login then
- weight = weight + 10000
- end
-
- return weight
-end
-
-local function resolve_firstchild(node, sacl, login_allowed, ctx)
- local candidate = nil
- local candidate_ctx = nil
-
- for name, child in pairs(node.children) do
- if child.satisfied then
- if not sacl then
- local _
- _, _, sacl = is_authenticated(node.auth)
- end
-
- local cacl = (type(child.depends) == "table") and child.depends.acl or nil
- local login = login_allowed or (type(child.auth) == "table" and child.auth.login)
- if login or check_acl_depends(cacl, sacl and sacl["access-group"]) ~= nil then
- if child.title and type(child.action) == "table" then
- local child_ctx = ctx_append(util.clone(ctx, true), name, child)
- if child.action.type == "firstchild" then
- if not candidate or node_weight(candidate) > node_weight(child) then
- local have_grandchild = resolve_firstchild(child, sacl, login, child_ctx)
- if have_grandchild then
- candidate = child
- candidate_ctx = child_ctx
- end
- end
- elseif not child.firstchild_ineligible then
- if not candidate or node_weight(candidate) > node_weight(child) then
- candidate = child
- candidate_ctx = child_ctx
- end
- end
- end
- end
- end
- end
-
- if candidate then
- for k, v in pairs(candidate_ctx) do
- ctx[k] = v
- end
-
- return true
- end
-
- return false
-end
-
-local function resolve_page(tree, request_path)
- local node = tree
- local sacl = nil
- local login = false
- local ctx = {}
-
- for i, s in ipairs(request_path) do
- node = node.children and node.children[s]
-
- if not node or not node.satisfied then
- break
- end
-
- ctx_append(ctx, s, node)
-
- if not sacl then
- local _
- _, _, sacl = is_authenticated(node.auth)
- end
-
- if not login and type(node.auth) == "table" and node.auth.login then
- login = true
- end
-
- if node.wildcard then
- ctx.request_args = {}
- ctx.request_path = util.clone(ctx.path, true)
-
- for j = i + 1, #request_path do
- ctx.request_path[j] = request_path[j]
- ctx.request_args[j - i] = request_path[j]
- end
-
- break
- end
- end
-
- if node and type(node.action) == "table" and node.action.type == "firstchild" then
- resolve_firstchild(node, sacl, login, ctx)
- end
-
- ctx.acls = ctx.acls or {}
- ctx.path = ctx.path or {}
- ctx.request_args = ctx.request_args or {}
- ctx.request_path = ctx.request_path or util.clone(request_path, true)
-
- node = tree
-
- for _, s in ipairs(ctx.path or {}) do
- node = node.children[s]
- assert(node, "Internal node resolve error")
- end
-
- return node, ctx
-end
-
-function dispatch(request)
- --context._disable_memtrace = require "luci.debug".trap_memtrace("l")
- local ctx = context
-
- local auth, cors, suid, sgid
- local menu = menu_json()
- local page, lookup_ctx = resolve_page(menu, request)
- local action = (page and type(page.action) == "table") and page.action or {}
-
- local tpl = init_template_engine(ctx)
-
- ctx.args = lookup_ctx.request_args
- ctx.path = lookup_ctx.path
- ctx.dispatched = page
-
- ctx.requestpath = ctx.requestpath or lookup_ctx.request_path
- ctx.requestargs = ctx.requestargs or lookup_ctx.request_args
- ctx.requested = ctx.requested or page
-
- if type(lookup_ctx.auth) == "table" and next(lookup_ctx.auth) then
- local sid, sdat, sacl = is_authenticated(lookup_ctx.auth)
-
- if not (sid and sdat and sacl) and lookup_ctx.auth.login then
- local user = http.getenv("HTTP_AUTH_USER")
- local pass = http.getenv("HTTP_AUTH_PASS")
-
- if user == nil and pass == nil then
- user = http.formvalue("luci_username")
- pass = http.formvalue("luci_password")
- end
-
- if user and pass then
- sid, sdat, sacl = session_setup(user, pass)
- end
-
- if not sid then
- context.path = {}
-
- http.status(403, "Forbidden")
- http.header("X-LuCI-Login-Required", "yes")
-
- local scope = { duser = "root", fuser = user }
- local ok, res = util.copcall(tpl.render_string, [[<% include("themes/" .. theme .. "/sysauth") %>]], scope)
- if ok then
- return res
- end
- return tpl.render("sysauth", scope)
- end
-
- http.header("Set-Cookie", 'sysauth_%s=%s; path=%s; SameSite=Strict; HttpOnly%s' %{
- http.getenv("HTTPS") == "on" and "https" or "http",
- sid, build_url(), http.getenv("HTTPS") == "on" and "; secure" or ""
- })
-
- http.redirect(build_url(unpack(ctx.requestpath)))
- return
- end
-
- if not sid or not sdat or not sacl then
- http.status(403, "Forbidden")
- http.header("X-LuCI-Login-Required", "yes")
- return
- end
-
- ctx.authsession = sid
- ctx.authtoken = sdat.token
- ctx.authuser = sdat.username
- ctx.authacl = sacl
- end
-
- if #lookup_ctx.acls > 0 then
- local perm = check_acl_depends(lookup_ctx.acls, ctx.authacl and ctx.authacl["access-group"])
- if perm == nil then
- http.status(403, "Forbidden")
- return
- end
-
- if page then
- page.readonly = not perm
- end
- end
-
- if action.type == "arcombine" then
- action = (#lookup_ctx.request_args > 0) and action.targets[2] or action.targets[1]
- end
-
- if lookup_ctx.cors and http.getenv("REQUEST_METHOD") == "OPTIONS" then
- luci.http.status(200, "OK")
- luci.http.header("Access-Control-Allow-Origin", http.getenv("HTTP_ORIGIN") or "*")
- luci.http.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
- return
- end
-
- if require_post_security(action) then
- if not test_post_security() then
- return
- end
- end
-
- if lookup_ctx.sgid then
- sys.process.setgroup(lookup_ctx.sgid)
- end
-
- if lookup_ctx.suid then
- sys.process.setuser(lookup_ctx.suid)
- end
-
- if action.type == "view" then
- tpl.render("view", { view = action.path })
-
- elseif action.type == "call" then
- local ok, mod = util.copcall(require, action.module)
- if not ok then
- error500(mod)
- return
- end
-
- local func = mod[action["function"]]
-
- assert(func ~= nil,
- 'Cannot resolve function "' .. action["function"] .. '". Is it misspelled or local?')
-
- assert(type(func) == "function",
- 'The symbol "' .. action["function"] .. '" does not refer to a function but data ' ..
- 'of type "' .. type(func) .. '".')
-
- local argv = (type(action.parameters) == "table" and #action.parameters > 0) and { unpack(action.parameters) } or {}
- for _, s in ipairs(lookup_ctx.request_args) do
- argv[#argv + 1] = s
- end
-
- local ok, err = util.copcall(func, unpack(argv))
- if not ok then
- error500(err)
- end
-
- --elseif action.type == "firstchild" then
- -- tpl.render("empty_node_placeholder", getfenv(1))
-
- elseif action.type == "alias" then
- local sub_request = {}
- for name in action.path:gmatch("[^/]+") do
- sub_request[#sub_request + 1] = name
- end
-
- for _, s in ipairs(lookup_ctx.request_args) do
- sub_request[#sub_request + 1] = s
- end
-
- dispatch(sub_request)
-
- elseif action.type == "rewrite" then
- local sub_request = { unpack(request) }
- for i = 1, action.remove do
- table.remove(sub_request, 1)
- end
-
- local n = 1
- for s in action.path:gmatch("[^/]+") do
- table.insert(sub_request, n, s)
- n = n + 1
- end
-
- for _, s in ipairs(lookup_ctx.request_args) do
- sub_request[#sub_request + 1] = s
- end
-
- dispatch(sub_request)
-
- elseif action.type == "template" then
- tpl.render(action.path, getfenv(1))
-
- elseif action.type == "cbi" then
- _cbi({ config = action.config, model = action.path }, unpack(lookup_ctx.request_args))
-
- elseif action.type == "form" then
- _form({ model = action.path }, unpack(lookup_ctx.request_args))
-
- else
- if not menu.children then
- error404("No root node was registered, this usually happens if no module was installed.\n" ..
- "Install luci-mod-admin-full and retry. " ..
- "If the module is already installed, try removing the /tmp/luci-indexcache file.")
- else
- error404("No page is registered at '/" .. table.concat(lookup_ctx.request_path, "/") .. "'.\n" ..
- "If this url belongs to an extension, make sure it is properly installed.\n" ..
- "If the extension was recently installed, try removing the /tmp/luci-indexcache file.")
- end
- end
-end
-
-local function hash_filelist(files)
- local fprint = {}
- local n = 0
-
- for i, file in ipairs(files) do
- local st = fs.stat(file)
- if st then
- fprint[n + 1] = '%x' % st.ino
- fprint[n + 2] = '%x' % st.mtime
- fprint[n + 3] = '%x' % st.size
- n = n + 3
- end
- end
-
- return nixio.crypt(table.concat(fprint, "|"), "$1$"):sub(5):gsub("/", ".")
-end
-
-local function read_cachefile(file, reader)
- local euid = sys.process.info("uid")
- local fuid = fs.stat(file, "uid")
- local mode = fs.stat(file, "modestr")
-
- if euid ~= fuid or mode ~= "rw-------" then
- return nil
- end
-
- return reader(file)
-end
-
-function createindex()
- local controllers = { }
- local base = "%s/controller/" % util.libpath()
- local _, path
-
- for path in (fs.glob("%s*.lua" % base) or function() end) do
- controllers[#controllers+1] = path
- end
-
- for path in (fs.glob("%s*/*.lua" % base) or function() end) do
- controllers[#controllers+1] = path
- end
-
- local cachefile
-
- if indexcache then
- cachefile = "%s.%s.lua" %{ indexcache, hash_filelist(controllers) }
-
- local res = read_cachefile(cachefile, function(path) return loadfile(path)() end)
- if res then
- index = res
- return res
- end
-
- for file in (fs.glob("%s.*.lua" % indexcache) or function() end) do
- fs.unlink(file)
- end
- end
-
- index = {}
-
- for _, path in ipairs(controllers) do
- local modname = "luci.controller." .. path:sub(#base+1, #path-4):gsub("/", ".")
- local mod = require(modname)
- assert(mod ~= true,
- "Invalid controller file found\n" ..
- "The file '" .. path .. "' contains an invalid module line.\n" ..
- "Please verify whether the module name is set to '" .. modname ..
- "' - It must correspond to the file path!")
-
- local idx = mod.index
- if type(idx) == "function" then
- index[modname] = idx
- end
- end
-
- if cachefile then
- local f = nixio.open(cachefile, "w", 600)
- f:writeall(util.get_bytecode(index))
- f:close()
- end
-end
-
-function createtree_json()
- local json = require "luci.jsonc"
- local tree = {}
-
- local schema = {
- action = "table",
- auth = "table",
- cors = "boolean",
- depends = "table",
- order = "number",
- setgroup = "string",
- setuser = "string",
- title = "string",
- wildcard = "boolean",
- firstchild_ineligible = "boolean"
- }
-
- local files = {}
- local cachefile
-
- for file in (fs.glob("/usr/share/luci/menu.d/*.json") or function() end) do
- files[#files+1] = file
- end
-
- if indexcache then
- cachefile = "%s.%s.json" %{ indexcache, hash_filelist(files) }
-
- local res = read_cachefile(cachefile, function(path) return json.parse(fs.readfile(path) or "") end)
- if res then
- return res
- end
-
- for file in (fs.glob("%s.*.json" % indexcache) or function() end) do
- fs.unlink(file)
- end
- end
-
- for _, file in ipairs(files) do
- local data = json.parse(fs.readfile(file) or "")
- if type(data) == "table" then
- for path, spec in pairs(data) do
- if type(spec) == "table" then
- local node = tree
-
- for s in path:gmatch("[^/]+") do
- if s == "*" then
- node.wildcard = true
- break
- end
-
- node.children = node.children or {}
- node.children[s] = node.children[s] or {}
- node = node.children[s]
- end
-
- if node ~= tree then
- for k, t in pairs(schema) do
- if type(spec[k]) == t then
- node[k] = spec[k]
- end
- end
-
- node.satisfied = check_depends(spec)
- end
- end
- end
- end
- end
-
- if cachefile then
- local f = nixio.open(cachefile, "w", 600)
- f:writeall(json.stringify(tree))
- f:close()
- end
-
- return tree
-end
-
--- Build the index before if it does not exist yet.
-function createtree()
- if not index then
- createindex()
- end
-
- local ctx = context
- local tree = {nodes={}, inreq=true}
-
- ctx.treecache = setmetatable({}, {__mode="v"})
- ctx.tree = tree
-
- local scope = setmetatable({}, {__index = luci.dispatcher})
-
- for k, v in pairs(index) do
- scope._NAME = k
- setfenv(v, scope)
- v()
- end
-
- return tree
-end
-
-function assign(path, clone, title, order)
- local obj = node(unpack(path))
- obj.nodes = nil
- obj.module = nil
-
- obj.title = title
- obj.order = order
-
- setmetatable(obj, {__index = _create_node(clone)})
-
- return obj
-end
-
-function entry(path, target, title, order)
- local c = node(unpack(path))
-
- c.target = target
- c.title = title
- c.order = order
- c.module = getfenv(2)._NAME
-
- return c
-end
-
--- enabling the node.
-function get(...)
- return _create_node({...})
-end
-
-function node(...)
- local c = _create_node({...})
-
- c.module = getfenv(2)._NAME
- c.auto = nil
-
- return c
-end
-
-function lookup(...)
- local i, path = nil, {}
- for i = 1, select('#', ...) do
- local name, arg = nil, tostring(select(i, ...))
- for name in arg:gmatch("[^/]+") do
- path[#path+1] = name
- end
- end
-
- for i = #path, 1, -1 do
- local node = context.treecache[table.concat(path, ".", 1, i)]
- if node and (i == #path or node.leaf) then
- return node, build_url(unpack(path))
- end
- end
-end
-
-function _create_node(path)
- if #path == 0 then
- return context.tree
- end
-
- local name = table.concat(path, ".")
- local c = context.treecache[name]
-
- if not c then
- local last = table.remove(path)
- local parent = _create_node(path)
-
- c = {nodes={}, auto=true, inreq=true}
-
- parent.nodes[last] = c
- context.treecache[name] = c
- end
-
- return c
-end
-
--- Subdispatchers --
-
-function firstchild()
- return { type = "firstchild" }
-end
-
-function firstnode()
- return { type = "firstnode" }
-end
-
-function alias(...)
- return { type = "alias", req = { ... } }
-end
-
-function rewrite(n, ...)
- return { type = "rewrite", n = n, req = { ... } }
-end
-
-function call(name, ...)
- return { type = "call", argv = {...}, name = name }
-end
-
-function post_on(params, name, ...)
- return {
- type = "call",
- post = params,
- argv = { ... },
- name = name
- }
-end
-
-function post(...)
- return post_on(true, ...)
-end
-
-
-function template(name)
- return { type = "template", view = name }
-end
-
-function view(name)
- return { type = "view", view = name }
-end
-
-
-function _cbi(self, ...)
- local cbi = require "luci.cbi"
- local tpl = require "luci.template"
- local http = require "luci.http"
- local util = require "luci.util"
-
- local config = self.config or {}
- local maps = cbi.load(self.model, ...)
-
- local state = nil
-
- local function has_uci_access(config, level)
- local rv = util.ubus("session", "access", {
- ubus_rpc_session = context.authsession,
- scope = "uci", object = config,
- ["function"] = level
- })
-
- return (type(rv) == "table" and rv.access == true) or false
- end
-
- local i, res
- for i, res in ipairs(maps) do
- if util.instanceof(res, cbi.SimpleForm) then
- io.stderr:write("Model %s returns SimpleForm but is dispatched via cbi(),\n"
- % self.model)
-
- io.stderr:write("please change %s to use the form() action instead.\n"
- % table.concat(context.request, "/"))
- end
-
- res.flow = config
- local cstate = res:parse()
- if cstate and (not state or cstate < state) then
- state = cstate
- end
- end
-
- local function _resolve_path(path)
- return type(path) == "table" and build_url(unpack(path)) or path
- end
-
- if config.on_valid_to and state and state > 0 and state < 2 then
- http.redirect(_resolve_path(config.on_valid_to))
- return
- end
-
- if config.on_changed_to and state and state > 1 then
- http.redirect(_resolve_path(config.on_changed_to))
- return
- end
-
- if config.on_success_to and state and state > 0 then
- http.redirect(_resolve_path(config.on_success_to))
- return
- end
-
- if config.state_handler then
- if not config.state_handler(state, maps) then
- return
- end
- end
-
- http.header("X-CBI-State", state or 0)
-
- if not config.noheader then
- tpl.render("cbi/header", {state = state})
- end
-
- local redirect
- local messages
- local applymap = false
- local pageaction = true
- local parsechain = { }
- local writable = false
-
- for i, res in ipairs(maps) do
- if res.apply_needed and res.parsechain then
- local c
- for _, c in ipairs(res.parsechain) do
- parsechain[#parsechain+1] = c
- end
- applymap = true
- end
-
- if res.redirect then
- redirect = redirect or res.redirect
- end
-
- if res.pageaction == false then
- pageaction = false
- end
-
- if res.message then
- messages = messages or { }
- messages[#messages+1] = res.message
- end
- end
-
- for i, res in ipairs(maps) do
- local is_readable_map = has_uci_access(res.config, "read")
- local is_writable_map = has_uci_access(res.config, "write")
-
- writable = writable or is_writable_map
-
- res:render({
- firstmap = (i == 1),
- redirect = redirect,
- messages = messages,
- pageaction = pageaction,
- parsechain = parsechain,
- readable = is_readable_map,
- writable = is_writable_map
- })
- end
-
- if not config.nofooter then
- tpl.render("cbi/footer", {
- flow = config,
- pageaction = pageaction,
- redirect = redirect,
- state = state,
- autoapply = config.autoapply,
- trigger_apply = applymap,
- writable = writable
- })
- end
-end
-
-function cbi(model, config)
- return {
- type = "cbi",
- post = { ["cbi.submit"] = true },
- config = config,
- model = model
- }
-end
-
-
-function arcombine(trg1, trg2)
- return {
- type = "arcombine",
- env = getfenv(),
- targets = {trg1, trg2}
- }
-end
-
-
-function _form(self, ...)
- local cbi = require "luci.cbi"
- local tpl = require "luci.template"
- local http = require "luci.http"
-
- local maps = luci.cbi.load(self.model, ...)
- local state = nil
-
- local i, res
- for i, res in ipairs(maps) do
- local cstate = res:parse()
- if cstate and (not state or cstate < state) then
- state = cstate
- end
- end
-
- http.header("X-CBI-State", state or 0)
- tpl.render("header")
- for i, res in ipairs(maps) do
- res:render()
- end
- tpl.render("footer")
-end
-
-function form(model)
- return {
- type = "form",
- post = { ["cbi.submit"] = true },
- model = model
- }
-end
-
-translate = i18n.translate
-
--- This function does not actually translate the given argument but
--- is used by build/i18n-scan.pl to find translatable entries.
-function _(text)
- return text
-end
+++ /dev/null
----[[
-LuCI web dispatcher.
-]]
-module "luci.dispatcher"
-
----[[
-Build the URL relative to the server webroot from given virtual path.
-
-@class function
-@name build_url
-@param ... Virtual path
-@return Relative URL
-]]
-
----[[
-Check whether a dispatch node shall be visible
-
-@class function
-@name node_visible
-@param node Dispatch node
-@return Boolean indicating whether the node should be visible
-]]
-
----[[
-Return a sorted table of visible children within a given node
-
-@class function
-@name node_childs
-@param node Dispatch node
-@return Ordered table of child node names
-]]
-
----[[
-Send a 404 error code and render the "error404" template if available.
-
-@class function
-@name error404
-@param message Custom error message (optional)
-@return false
-]]
-
----[[
-Send a 500 error code and render the "error500" template if available.
-
-@class function
-@name error500
-@param message Custom error message (optional)#
-@return false
-]]
-
----[[
-Dispatch an HTTP request.
-
-@class function
-@name httpdispatch
-@param request LuCI HTTP Request object
-]]
-
----[[
-Dispatches a LuCI virtual path.
-
-@class function
-@name dispatch
-@param request Virtual path
-]]
-
----[[
-Generate the dispatching index using the native file-cache based strategy.
-
-
-@class function
-@name createindex
-]]
-
----[[
-Create the dispatching tree from the index.
-
-Build the index before if it does not exist yet.
-
-@class function
-@name createtree
-]]
-
----[[
-Clone a node of the dispatching tree to another position.
-
-@class function
-@name assign
-@param path Virtual path destination
-@param clone Virtual path source
-@param title Destination node title (optional)
-@param order Destination node order value (optional)
-@return Dispatching tree node
-]]
-
----[[
-Create a new dispatching node and define common parameters.
-
-@class function
-@name entry
-@param path Virtual path
-@param target Target function to call when dispatched.
-@param title Destination node title
-@param order Destination node order value (optional)
-@return Dispatching tree node
-]]
-
----[[
-Fetch or create a dispatching node without setting the target module or
-enabling the node.
-
-@class function
-@name get
-@param ... Virtual path
-@return Dispatching tree node
-]]
-
----[[
-Fetch or create a new dispatching node.
-
-@class function
-@name node
-@param ... Virtual path
-@return Dispatching tree node
-]]
-
----[[
-Lookup node in dispatching tree.
-
-@class function
-@name lookup
-@param ... Virtual path
-@return Node object, canonical url or nil if the path was not found.
-]]
-
----[[
-Alias the first (lowest order) page automatically
-
-
-@class function
-@name firstchild
-]]
-
----[[
-Create a redirect to another dispatching node.
-
-@class function
-@name alias
-@param ... Virtual path destination
-]]
-
----[[
-Rewrite the first x path values of the request.
-
-@class function
-@name rewrite
-@param n Number of path values to replace
-@param ... Virtual path to replace removed path values with
-]]
-
----[[
-Create a function-call dispatching target.
-
-@class function
-@name call
-@param name Target function of local controller
-@param ... Additional parameters passed to the function
-]]
-
----[[
-Create a template render dispatching target.
-
-@class function
-@name template
-@param name Template to be rendered
-]]
-
----[[
-Create a CBI model dispatching target.
-
-@class function
-@name cbi
-@param model CBI model to be rendered
-]]
-
----[[
-Create a combined dispatching target for non argv and argv requests.
-
-@class function
-@name arcombine
-@param trg1 Overview Target
-@param trg2 Detail Target
-]]
-
----[[
-Create a CBI form model dispatching target.
-
-@class function
-@name form
-@param model CBI form model tpo be rendered
-]]
-
----[[
-Access the luci.i18n translate() api.
-
-@class function
-@name translate
-@param text Text to translate
-]]
-
----[[
-No-op function used to mark translation entries for menu labels.
-
-This function does not actually translate the given argument but
-is used by build/i18n-scan.pl to find translatable entries.
-
-@class function
-@name _
-]]
-
+++ /dev/null
--- Copyright 2008 Steven Barth <steven@midlink.org>
--- Licensed to the public under the Apache License 2.0.
-
-local tparser = require "luci.template.parser"
-local util = require "luci.util"
-local tostring = tostring
-
-module "luci.i18n"
-
-i18ndir = util.libpath() .. "/i18n/"
-context = util.threadlocal()
-default = "en"
-
-
-function setlanguage(lang)
- local code, subcode = lang:match("^([A-Za-z][A-Za-z])[%-_]([A-Za-z][A-Za-z])$")
- if not (code and subcode) then
- subcode = lang:match("^([A-Za-z][A-Za-z])$")
- if not subcode then
- return nil
- end
- end
-
- context.parent = code and code:lower()
- context.lang = context.parent and context.parent.."-"..subcode:lower() or subcode:lower()
-
- if tparser.load_catalog(context.lang, i18ndir) and
- tparser.change_catalog(context.lang)
- then
- return context.lang
-
- elseif context.parent then
- if tparser.load_catalog(context.parent, i18ndir) and
- tparser.change_catalog(context.parent)
- then
- return context.parent
- end
- end
-
- return nil
-end
-
-function translate(key)
- return tparser.translate(key) or key
-end
-
-function translatef(key, ...)
- return tostring(translate(key)):format(...)
-end
-
-function dump()
- local rv = {}
- tparser.get_translations(function(k, v) rv[k] = v end)
- return rv
-end
+++ /dev/null
----[[
-LuCI translation library.
-]]
-module "luci.i18n"
-
----[[
-Set the context default translation language.
-
-@class function
-@name setlanguage
-@param lang An IETF/BCP 47 language tag or ISO3166 country code, e.g. "en-US" or "de"
-@return The effective loaded language, e.g. "en" for "en-US" - or nil on failure
-]]
-
----[[
-Return the translated value for a specific translation key.
-
-@class function
-@name translate
-@param key Default translation text
-@return Translated string
-]]
-
----[[
-Return the translated value for a specific translation key and use it as sprintf pattern.
-
-@class function
-@name translatef
-@param key Default translation text
-@param ... Format parameters
-@return Translated and formatted string
-]]
-
----[[
-Return all currently loaded translation strings as a key-value table. The key is the
-hexadecimal representation of the translation key while the value is the translated
-text content.
-
-@class function
-@name dump
-@return Key-value translation string table.
-]]
+++ /dev/null
--- Copyright 2008 Steven Barth <steven@midlink.org>
--- Licensed to the public under the Apache License 2.0.
-
-local os = require "os"
-local util = require "luci.util"
-local table = require "table"
-
-
-local setmetatable, rawget, rawset = setmetatable, rawget, rawset
-local require, getmetatable, assert = require, getmetatable, assert
-local error, pairs, ipairs, select = error, pairs, ipairs, select
-local type, tostring, tonumber, unpack = type, tostring, tonumber, unpack
-
--- The typical workflow for UCI is: Get a cursor instance from the
--- cursor factory, modify data (via Cursor.add, Cursor.delete, etc.),
--- save the changes to the staging area via Cursor.save and finally
--- Cursor.commit the data to the actual config files.
--- LuCI then needs to Cursor.apply the changes so daemons etc. are
--- reloaded.
-module "luci.model.uci"
-
-local ERRSTR = {
- "Invalid command",
- "Invalid argument",
- "Method not found",
- "Entry not found",
- "No data",
- "Permission denied",
- "Timeout",
- "Not supported",
- "Unknown error",
- "Connection failed"
-}
-
-local session_id = nil
-
-local function call(cmd, args)
- if type(args) == "table" and session_id then
- args.ubus_rpc_session = session_id
- end
- return util.ubus("uci", cmd, args)
-end
-
-
-function cursor()
- return _M
-end
-
-function cursor_state()
- return _M
-end
-
-function substate(self)
- return self
-end
-
-
-function get_confdir(self)
- return "/etc/config"
-end
-
-function get_savedir(self)
- return "/tmp/.uci"
-end
-
-function get_session_id(self)
- return session_id
-end
-
-function set_confdir(self, directory)
- return false
-end
-
-function set_savedir(self, directory)
- return false
-end
-
-function set_session_id(self, id)
- session_id = id
- return true
-end
-
-
-function load(self, config)
- return true
-end
-
-function save(self, config)
- return true
-end
-
-function unload(self, config)
- return true
-end
-
-
-function changes(self, config)
- local rv, err = call("changes", { config = config })
-
- if type(rv) == "table" and type(rv.changes) == "table" then
- return rv.changes
- elseif err then
- return nil, ERRSTR[err]
- else
- return { }
- end
-end
-
-
-function revert(self, config)
- local _, err = call("revert", { config = config })
- return (err == nil), ERRSTR[err]
-end
-
-function commit(self, config)
- local _, err = call("commit", { config = config })
- return (err == nil), ERRSTR[err]
-end
-
-function apply(self, rollback)
- local _, err
-
- if rollback then
- local sys = require "luci.sys"
- local conf = require "luci.config"
- local timeout = tonumber(conf and conf.apply and conf.apply.rollback or 90) or 0
-
- _, err = call("apply", {
- timeout = (timeout > 90) and timeout or 90,
- rollback = true
- })
-
- if not err then
- local now = os.time()
- local token = sys.uniqueid(16)
-
- util.ubus("session", "set", {
- ubus_rpc_session = "00000000000000000000000000000000",
- values = {
- rollback = {
- token = token,
- session = session_id,
- timeout = now + timeout
- }
- }
- })
-
- return token
- end
- else
- _, err = call("changes", {})
-
- if not err then
- if type(_) == "table" and type(_.changes) == "table" then
- local k, v
- for k, v in pairs(_.changes) do
- _, err = call("commit", { config = k })
- if err then
- break
- end
- end
- end
- end
-
- if not err then
- _, err = call("apply", { rollback = false })
- end
- end
-
- return (err == nil), ERRSTR[err]
-end
-
-function confirm(self, token)
- local is_pending, time_remaining, rollback_sid, rollback_token = self:rollback_pending()
-
- if is_pending then
- if token ~= rollback_token then
- return false, "Permission denied"
- end
-
- local _, err = util.ubus("uci", "confirm", {
- ubus_rpc_session = rollback_sid
- })
-
- if not err then
- util.ubus("session", "set", {
- ubus_rpc_session = "00000000000000000000000000000000",
- values = { rollback = {} }
- })
- end
-
- return (err == nil), ERRSTR[err]
- end
-
- return false, "No data"
-end
-
-function rollback(self)
- local is_pending, time_remaining, rollback_sid = self:rollback_pending()
-
- if is_pending then
- local _, err = util.ubus("uci", "rollback", {
- ubus_rpc_session = rollback_sid
- })
-
- if not err then
- util.ubus("session", "set", {
- ubus_rpc_session = "00000000000000000000000000000000",
- values = { rollback = {} }
- })
- end
-
- return (err == nil), ERRSTR[err]
- end
-
- return false, "No data"
-end
-
-function rollback_pending(self)
- local rv, err = util.ubus("session", "get", {
- ubus_rpc_session = "00000000000000000000000000000000",
- keys = { "rollback" }
- })
-
- local now = os.time()
-
- if type(rv) == "table" and
- type(rv.values) == "table" and
- type(rv.values.rollback) == "table" and
- type(rv.values.rollback.token) == "string" and
- type(rv.values.rollback.session) == "string" and
- type(rv.values.rollback.timeout) == "number" and
- rv.values.rollback.timeout > now
- then
- return true,
- rv.values.rollback.timeout - now,
- rv.values.rollback.session,
- rv.values.rollback.token
- end
-
- return false, ERRSTR[err]
-end
-
-
-function foreach(self, config, stype, callback)
- if type(callback) == "function" then
- local rv, err = call("get", {
- config = config,
- type = stype
- })
-
- if type(rv) == "table" and type(rv.values) == "table" then
- local sections = { }
- local res = false
- local index = 1
-
- local _, section
- for _, section in pairs(rv.values) do
- section[".index"] = section[".index"] or index
- sections[index] = section
- index = index + 1
- end
-
- table.sort(sections, function(a, b)
- return a[".index"] < b[".index"]
- end)
-
- for _, section in ipairs(sections) do
- local continue = callback(section)
- res = true
- if continue == false then
- break
- end
- end
- return res
- else
- return false, ERRSTR[err] or "No data"
- end
- else
- return false, "Invalid argument"
- end
-end
-
-local function _get(self, operation, config, section, option)
- if section == nil then
- return nil
- elseif type(option) == "string" and option:byte(1) ~= 46 then
- local rv, err = call(operation, {
- config = config,
- section = section,
- option = option
- })
-
- if type(rv) == "table" then
- return rv.value or nil
- elseif err then
- return false, ERRSTR[err]
- else
- return nil
- end
- elseif option == nil then
- local values = self:get_all(config, section)
- if values then
- return values[".type"], values[".name"]
- else
- return nil
- end
- else
- return false, "Invalid argument"
- end
-end
-
-function get(self, ...)
- return _get(self, "get", ...)
-end
-
-function get_state(self, ...)
- return _get(self, "state", ...)
-end
-
-function get_all(self, config, section)
- local rv, err = call("get", {
- config = config,
- section = section
- })
-
- if type(rv) == "table" and type(rv.values) == "table" then
- return rv.values
- elseif err then
- return false, ERRSTR[err]
- else
- return nil
- end
-end
-
-function get_bool(self, ...)
- local val = self:get(...)
- return (val == "1" or val == "true" or val == "yes" or val == "on")
-end
-
-function get_first(self, config, stype, option, default)
- local rv = default
-
- self:foreach(config, stype, function(s)
- local val = not option and s[".name"] or s[option]
-
- if type(default) == "number" then
- val = tonumber(val)
- elseif type(default) == "boolean" then
- val = (val == "1" or val == "true" or
- val == "yes" or val == "on")
- end
-
- if val ~= nil then
- rv = val
- return false
- end
- end)
-
- return rv
-end
-
-function get_list(self, config, section, option)
- if config and section and option then
- local val = self:get(config, section, option)
- return (type(val) == "table" and val or { val })
- end
- return { }
-end
-
-
-function section(self, config, stype, name, values)
- local rv, err = call("add", {
- config = config,
- type = stype,
- name = name,
- values = values
- })
-
- if type(rv) == "table" then
- return rv.section
- elseif err then
- return false, ERRSTR[err]
- else
- return nil
- end
-end
-
-
-function add(self, config, stype)
- return self:section(config, stype)
-end
-
-function set(self, config, section, option, ...)
- if select('#', ...) == 0 then
- local sname, err = self:section(config, option, section)
- return (not not sname), err
- else
- local _, err = call("set", {
- config = config,
- section = section,
- values = { [option] = select(1, ...) }
- })
- return (err == nil), ERRSTR[err]
- end
-end
-
-function set_list(self, config, section, option, value)
- if section == nil or option == nil then
- return false
- elseif value == nil or (type(value) == "table" and #value == 0) then
- return self:delete(config, section, option)
- elseif type(value) == "table" then
- return self:set(config, section, option, value)
- else
- return self:set(config, section, option, { value })
- end
-end
-
-function tset(self, config, section, values)
- local _, err = call("set", {
- config = config,
- section = section,
- values = values
- })
- return (err == nil), ERRSTR[err]
-end
-
-function reorder(self, config, section, index)
- local sections
-
- if type(section) == "string" and type(index) == "number" then
- local pos = 0
-
- sections = { }
-
- self:foreach(config, nil, function(s)
- if pos == index then
- pos = pos + 1
- end
-
- if s[".name"] ~= section then
- pos = pos + 1
- sections[pos] = s[".name"]
- else
- sections[index + 1] = section
- end
- end)
- elseif type(section) == "table" then
- sections = section
- else
- return false, "Invalid argument"
- end
-
- local _, err = call("order", {
- config = config,
- sections = sections
- })
-
- return (err == nil), ERRSTR[err]
-end
-
-
-function delete(self, config, section, option)
- local _, err = call("delete", {
- config = config,
- section = section,
- option = option
- })
- return (err == nil), ERRSTR[err]
-end
-
-function delete_all(self, config, stype, comparator)
- local _, err
- if type(comparator) == "table" then
- _, err = call("delete", {
- config = config,
- type = stype,
- match = comparator
- })
- elseif type(comparator) == "function" then
- local rv = call("get", {
- config = config,
- type = stype
- })
-
- if type(rv) == "table" and type(rv.values) == "table" then
- local sname, section
- for sname, section in pairs(rv.values) do
- if comparator(section) then
- _, err = call("delete", {
- config = config,
- section = sname
- })
- end
- end
- end
- elseif comparator == nil then
- _, err = call("delete", {
- config = config,
- type = stype
- })
- else
- return false, "Invalid argument"
- end
-
- return (err == nil), ERRSTR[err]
-end
+++ /dev/null
----[[
-LuCI UCI model library.
-
-The typical workflow for UCI is: Get a cursor instance from the
-cursor factory, modify data (via Cursor.add, Cursor.delete, etc.),
-save the changes to the staging area via Cursor.save and finally
-Cursor.commit the data to the actual config files.
-LuCI then needs to Cursor.apply the changes so daemons etc. are
-reloaded.
-@cstyle instance
-]]
-module "luci.model.uci"
-
----[[
-Create a new UCI-Cursor.
-
-@class function
-@name cursor
-@return UCI-Cursor
-]]
-
----[[
-Create a new Cursor initialized to the state directory.
-
-@class function
-@name cursor_state
-@return UCI cursor
-]]
-
----[[
-Applies UCI configuration changes.
-
-If the rollback parameter is set to true, the apply function will invoke the
-rollback mechanism which causes the configuration to be automatically reverted
-if no confirm() call occurs within a certain timeout.
-
-The current default timeout is 30s and can be increased using the
-"luci.apply.timeout" uci configuration key.
-
-@class function
-@name Cursor.apply
-@param rollback Enable rollback mechanism
-@return Boolean whether operation succeeded
-]]
-
----[[
-Confirms UCI apply process.
-
-If a previous UCI apply with rollback has been invoked using apply(true),
-this function confirms the process and cancels the pending rollback timer.
-
-If no apply with rollback session is active, the function has no effect and
-returns with a "No data" error.
-
-@class function
-@name Cursor.confirm
-@return Boolean whether operation succeeded
-]]
-
----[[
-Cancels UCI apply process.
-
-If a previous UCI apply with rollback has been invoked using apply(true),
-this function cancels the process and rolls back the configuration to the
-pre-apply state.
-
-If no apply with rollback session is active, the function has no effect and
-returns with a "No data" error.
-
-@class function
-@name Cursor.rollback
-@return Boolean whether operation succeeded
-]]
-
----[[
-Checks whether a pending rollback is scheduled.
-
-If a previous UCI apply with rollback has been invoked using apply(true),
-and has not been confirmed or rolled back yet, this function returns true
-and the remaining time until rollback in seconds. If no rollback is pending,
-the function returns false. On error, the function returns false and an
-additional string describing the error.
-
-@class function
-@name Cursor.rollback_pending
-@return Boolean whether rollback is pending
-@return Remaining time in seconds
-]]
-
----[[
-Delete all sections of a given type that match certain criteria.
-
-@class function
-@name Cursor.delete_all
-@param config UCI config
-@param type UCI section type
-@param comparator Function that will be called for each section and returns
- a boolean whether to delete the current section (optional)
-]]
-
----[[
-Create a new section and initialize it with data.
-
-@class function
-@name Cursor.section
-@param config UCI config
-@param type UCI section type
-@param name UCI section name (optional)
-@param values Table of key - value pairs to initialize the section with
-@return Name of created section
-]]
-
----[[
-Updated the data of a section using data from a table.
-
-@class function
-@name Cursor.tset
-@param config UCI config
-@param section UCI section name (optional)
-@param values Table of key - value pairs to update the section with
-]]
-
----[[
-Get a boolean option and return it's value as true or false.
-
-@class function
-@name Cursor.get_bool
-@param config UCI config
-@param section UCI section name
-@param option UCI option
-@return Boolean
-]]
-
----[[
-Get an option or list and return values as table.
-
-@class function
-@name Cursor.get_list
-@param config UCI config
-@param section UCI section name
-@param option UCI option
-@return table. If the option was not found, you will simply get an empty
- table.
-]]
-
----[[
-Get the given option from the first section with the given type.
-
-@class function
-@name Cursor.get_first
-@param config UCI config
-@param type UCI section type
-@param option UCI option (optional)
-@param default Default value (optional)
-@return UCI value
-]]
-
----[[
-Set given values as list. Setting a list option to an empty list
-has the same effect as deleting the option.
-
-@class function
-@name Cursor.set_list
-@param config UCI config
-@param section UCI section name
-@param option UCI option
-@param value Value or table. Non-table values will be set as single
- item UCI list.
-@return Boolean whether operation succeeded
-]]
-
----[[
-Create a sub-state of this cursor.
-
-The sub-state is tied to the parent cursor, means it the parent unloads or
-loads configs, the sub state will do so as well.
-
-@class function
-@name Cursor.substate
-@return UCI state cursor tied to the parent cursor
-]]
-
----[[
-Add an anonymous section.
-
-@class function
-@name Cursor.add
-@param config UCI config
-@param type UCI section type
-@return Name of created section
-]]
-
----[[
-Get a table of saved but uncommitted changes.
-
-@class function
-@name Cursor.changes
-@param config UCI config
-@return Table of changes
-@see Cursor.save
-]]
-
----[[
-Commit saved changes.
-
-@class function
-@name Cursor.commit
-@param config UCI config
-@return Boolean whether operation succeeded
-@see Cursor.revert
-@see Cursor.save
-]]
-
----[[
-Deletes a section or an option.
-
-@class function
-@name Cursor.delete
-@param config UCI config
-@param section UCI section name
-@param option UCI option (optional)
-@return Boolean whether operation succeeded
-]]
-
----[[
-Call a function for every section of a certain type.
-
-@class function
-@name Cursor.foreach
-@param config UCI config
-@param type UCI section type
-@param callback Function to be called
-@return Boolean whether operation succeeded
-]]
-
----[[
-Get a section type or an option
-
-@class function
-@name Cursor.get
-@param config UCI config
-@param section UCI section name
-@param option UCI option (optional)
-@return UCI value
-]]
-
----[[
-Get all sections of a config or all values of a section.
-
-@class function
-@name Cursor.get_all
-@param config UCI config
-@param section UCI section name (optional)
-@return Table of UCI sections or table of UCI values
-]]
-
----[[
-Manually load a config.
-
-@class function
-@name Cursor.load
-@param config UCI config
-@return Boolean whether operation succeeded
-@see Cursor.save
-@see Cursor.unload
-]]
-
----[[
-Revert saved but uncommitted changes.
-
-@class function
-@name Cursor.revert
-@param config UCI config
-@return Boolean whether operation succeeded
-@see Cursor.commit
-@see Cursor.save
-]]
-
----[[
-Saves changes made to a config to make them committable.
-
-@class function
-@name Cursor.save
-@param config UCI config
-@return Boolean whether operation succeeded
-@see Cursor.load
-@see Cursor.unload
-]]
-
----[[
-Set a value or create a named section.
-
-When invoked with three arguments `config`, `sectionname`, `sectiontype`,
-then a named section of the given type is created.
-
-When invoked with four arguments `config`, `sectionname`, `optionname` and
-`optionvalue` then the value of the specified option is set to the given value.
-
-@class function
-@name Cursor.set
-@param config UCI config
-@param section UCI section name
-@param option UCI option or UCI section type
-@param value UCI value or nothing if you want to create a section
-@return Boolean whether operation succeeded
-]]
-
----[[
-Get the configuration directory.
-
-@class function
-@name Cursor.get_confdir
-@return Configuration directory
-]]
-
----[[
-Get the directory for uncomitted changes.
-
-@class function
-@name Cursor.get_savedir
-@return Save directory
-]]
-
----[[
-Get the effective session ID.
-
-@class function
-@name Cursor.get_session_id
-@return String containing the session ID
-]]
-
----[[
-Set the configuration directory.
-
-@class function
-@name Cursor.set_confdir
-@param directory UCI configuration directory
-@return Boolean whether operation succeeded
-]]
-
----[[
-Set the directory for uncommitted changes.
-
-@class function
-@name Cursor.set_savedir
-@param directory UCI changes directory
-@return Boolean whether operation succeeded
-]]
-
----[[
-Set the effective session ID.
-
-@class function
-@name Cursor.set_session_id
-@param id String containing the session ID to set
-@return Boolean whether operation succeeded
-]]
-
----[[
-Discard changes made to a config.
-
-@class function
-@name Cursor.unload
-@param config UCI config
-@return Boolean whether operation succeeded
-@see Cursor.load
-@see Cursor.save
-]]
-
+++ /dev/null
--- Copyright 2008 Steven Barth <steven@midlink.org>
--- Licensed to the public under the Apache License 2.0.
-
-exectime = os.clock()
-module("luci.sgi.cgi", package.seeall)
-local ltn12 = require("luci.ltn12")
-require("nixio.util")
-require("luci.http")
-require("luci.sys")
-require("luci.dispatcher")
-
--- Limited source to avoid endless blocking
-local function limitsource(handle, limit)
- limit = limit or 0
- local BLOCKSIZE = ltn12.BLOCKSIZE
-
- return function()
- if limit < 1 then
- handle:close()
- return nil
- else
- local read = (limit > BLOCKSIZE) and BLOCKSIZE or limit
- limit = limit - read
-
- local chunk = handle:read(read)
- if not chunk then handle:close() end
- return chunk
- end
- end
-end
-
-function run()
- local r = luci.http.Request(
- luci.sys.getenv(),
- limitsource(io.stdin, tonumber(luci.sys.getenv("CONTENT_LENGTH"))),
- ltn12.sink.file(io.stderr)
- )
-
- local x = coroutine.create(luci.dispatcher.httpdispatch)
- local hcache = ""
- local active = true
-
- while coroutine.status(x) ~= "dead" do
- local res, id, data1, data2 = coroutine.resume(x, r)
-
- if not res then
- print("Status: 500 Internal Server Error")
- print("Content-Type: text/plain\n")
- print(id)
- break;
- end
-
- if active then
- if id == 1 then
- io.write("Status: " .. tostring(data1) .. " " .. data2 .. "\r\n")
- elseif id == 2 then
- hcache = hcache .. data1 .. ": " .. data2 .. "\r\n"
- elseif id == 3 then
- io.write(hcache)
- io.write("\r\n")
- elseif id == 4 then
- io.write(tostring(data1 or ""))
- elseif id == 5 then
- io.flush()
- io.close()
- active = false
- elseif id == 6 then
- data1:copyz(nixio.stdout, data2)
- data1:close()
- end
- end
- end
-end
+++ /dev/null
--- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
--- Licensed to the public under the Apache License 2.0.
-
-require "nixio.util"
-require "luci.http"
-require "luci.sys"
-require "luci.dispatcher"
-require "luci.ltn12"
-
-function handle_request(env)
- exectime = os.clock()
- local renv = {
- CONTENT_LENGTH = env.CONTENT_LENGTH,
- CONTENT_TYPE = env.CONTENT_TYPE,
- REQUEST_METHOD = env.REQUEST_METHOD,
- REQUEST_URI = env.REQUEST_URI,
- PATH_INFO = env.PATH_INFO,
- SCRIPT_NAME = env.SCRIPT_NAME:gsub("/+$", ""),
- SCRIPT_FILENAME = env.SCRIPT_NAME,
- SERVER_PROTOCOL = env.SERVER_PROTOCOL,
- QUERY_STRING = env.QUERY_STRING,
- DOCUMENT_ROOT = env.DOCUMENT_ROOT,
- HTTPS = env.HTTPS,
- REDIRECT_STATUS = env.REDIRECT_STATUS,
- REMOTE_ADDR = env.REMOTE_ADDR,
- REMOTE_NAME = env.REMOTE_NAME,
- REMOTE_PORT = env.REMOTE_PORT,
- REMOTE_USER = env.REMOTE_USER,
- SERVER_ADDR = env.SERVER_ADDR,
- SERVER_NAME = env.SERVER_NAME,
- SERVER_PORT = env.SERVER_PORT
- }
-
- local k, v
- for k, v in pairs(env.headers) do
- k = k:upper():gsub("%-", "_")
- renv["HTTP_" .. k] = v
- end
-
- local len = tonumber(env.CONTENT_LENGTH) or 0
- local function recv()
- if len > 0 then
- local rlen, rbuf = uhttpd.recv(4096)
- if rlen >= 0 then
- len = len - rlen
- return rbuf
- end
- end
- return nil
- end
-
- local send = uhttpd.send
-
- local req = luci.http.Request(
- renv, recv, luci.ltn12.sink.file(io.stderr)
- )
-
-
- local x = coroutine.create(luci.dispatcher.httpdispatch)
- local hcache = { }
- local active = true
-
- while coroutine.status(x) ~= "dead" do
- local res, id, data1, data2 = coroutine.resume(x, req)
-
- if not res then
- send("Status: 500 Internal Server Error\r\n")
- send("Content-Type: text/plain\r\n\r\n")
- send(tostring(id))
- break
- end
-
- if active then
- if id == 1 then
- send("Status: ")
- send(tostring(data1))
- send(" ")
- send(tostring(data2))
- send("\r\n")
- elseif id == 2 then
- hcache[data1] = data2
- elseif id == 3 then
- for k, v in pairs(hcache) do
- send(tostring(k))
- send(": ")
- send(tostring(v))
- send("\r\n")
- end
- send("\r\n")
- elseif id == 4 then
- send(tostring(data1 or ""))
- elseif id == 5 then
- active = false
- elseif id == 6 then
- data1:copyz(nixio.stdout, data2)
- end
- end
- end
-end
+++ /dev/null
--- Copyright 2009 Steven Barth <steven@midlink.org>
--- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
--- Licensed to the public under the Apache License 2.0.
-
-local util = require "luci.util"
-module("luci.store", util.threadlocal)
+++ /dev/null
--- Copyright 2008 Steven Barth <steven@midlink.org>
--- Licensed to the public under the Apache License 2.0.
-
-local io = require "io"
-local os = require "os"
-local table = require "table"
-local nixio = require "nixio"
-local fs = require "nixio.fs"
-local uci = require "luci.model.uci"
-
-local luci = {}
-luci.util = require "luci.util"
-luci.ip = require "luci.ip"
-
-local tonumber, ipairs, pairs, pcall, type, next, setmetatable, require, select, unpack =
- tonumber, ipairs, pairs, pcall, type, next, setmetatable, require, select, unpack
-
-
-module "luci.sys"
-
-function call(...)
- return os.execute(...) / 256
-end
-
-exec = luci.util.exec
-
--- containing the whole environment is returned otherwise this function returns
--- the corresponding string value for the given name or nil if no such variable
--- exists.
-getenv = nixio.getenv
-
-function hostname(newname)
- if type(newname) == "string" and #newname > 0 then
- fs.writefile( "/proc/sys/kernel/hostname", newname )
- return newname
- else
- return nixio.uname().nodename
- end
-end
-
-function httpget(url, stream, target)
- if not target then
- local source = stream and io.popen or luci.util.exec
- return source("wget -qO- %s" % luci.util.shellquote(url))
- else
- return os.execute("wget -qO %s %s" %
- {luci.util.shellquote(target), luci.util.shellquote(url)})
- end
-end
-
-function reboot()
- return os.execute("reboot >/dev/null 2>&1")
-end
-
-function syslog()
- return luci.util.exec("logread")
-end
-
-function dmesg()
- return luci.util.exec("dmesg")
-end
-
-function uniqueid(bytes)
- local rand = fs.readfile("/dev/urandom", bytes)
- return rand and nixio.bin.hexlify(rand)
-end
-
-function uptime()
- return nixio.sysinfo().uptime
-end
-
-
-net = {}
-
-local function _nethints(what, callback)
- local _, k, e, mac, ip, name, duid, iaid
- local cur = uci.cursor()
- local ifn = { }
- local hosts = { }
- local lookup = { }
-
- local function _add(i, ...)
- local k = select(i, ...)
- if k then
- if not hosts[k] then hosts[k] = { } end
- hosts[k][1] = select(1, ...) or hosts[k][1]
- hosts[k][2] = select(2, ...) or hosts[k][2]
- hosts[k][3] = select(3, ...) or hosts[k][3]
- hosts[k][4] = select(4, ...) or hosts[k][4]
- end
- end
-
- luci.ip.neighbors(nil, function(neigh)
- if neigh.mac and neigh.family == 4 then
- _add(what, neigh.mac:string(), neigh.dest:string(), nil, nil)
- elseif neigh.mac and neigh.family == 6 then
- _add(what, neigh.mac:string(), nil, neigh.dest:string(), nil)
- end
- end)
-
- if fs.access("/etc/ethers") then
- for e in io.lines("/etc/ethers") do
- mac, name = e:match("^([a-fA-F0-9:-]+)%s+(%S+)")
- mac = luci.ip.checkmac(mac)
- if mac and name then
- if luci.ip.checkip4(name) then
- _add(what, mac, name, nil, nil)
- else
- _add(what, mac, nil, nil, name)
- end
- end
- end
- end
-
- cur:foreach("dhcp", "dnsmasq",
- function(s)
- if s.leasefile and fs.access(s.leasefile) then
- for e in io.lines(s.leasefile) do
- mac, ip, name = e:match("^%d+ (%S+) (%S+) (%S+)")
- mac = luci.ip.checkmac(mac)
- if mac and ip then
- _add(what, mac, ip, nil, name ~= "*" and name)
- end
- end
- end
- end
- )
-
- cur:foreach("dhcp", "odhcpd",
- function(s)
- if type(s.leasefile) == "string" and fs.access(s.leasefile) then
- for e in io.lines(s.leasefile) do
- duid, iaid, name, _, ip = e:match("^# %S+ (%S+) (%S+) (%S+) (-?%d+) %S+ %S+ ([0-9a-f:.]+)/[0-9]+")
- mac = net.duid_to_mac(duid)
- if mac then
- if ip and iaid == "ipv4" then
- _add(what, mac, ip, nil, name ~= "*" and name)
- elseif ip then
- _add(what, mac, nil, ip, name ~= "*" and name)
- end
- end
- end
- end
- end
- )
-
- cur:foreach("dhcp", "host",
- function(s)
- for mac in luci.util.imatch(s.mac) do
- mac = luci.ip.checkmac(mac)
- if mac then
- _add(what, mac, s.ip, nil, s.name)
- end
- end
- end)
-
- for _, e in ipairs(nixio.getifaddrs()) do
- if e.name ~= "lo" then
- ifn[e.name] = ifn[e.name] or { }
- if e.family == "packet" and e.addr and #e.addr == 17 then
- ifn[e.name][1] = e.addr:upper()
- elseif e.family == "inet" then
- ifn[e.name][2] = e.addr
- elseif e.family == "inet6" then
- ifn[e.name][3] = e.addr
- end
- end
- end
-
- for _, e in pairs(ifn) do
- if e[what] and (e[2] or e[3]) then
- _add(what, e[1], e[2], e[3], e[4])
- end
- end
-
- for _, e in pairs(hosts) do
- lookup[#lookup+1] = (what > 1) and e[what] or (e[2] or e[3])
- end
-
- if #lookup > 0 then
- lookup = luci.util.ubus("network.rrdns", "lookup", {
- addrs = lookup,
- timeout = 250,
- limit = 1000
- }) or { }
- end
-
- for _, e in luci.util.kspairs(hosts) do
- callback(e[1], e[2], e[3], lookup[e[2]] or lookup[e[3]] or e[4])
- end
-end
-
--- Each entry contains the values in the following order:
--- [ "mac", "name" ]
-function net.mac_hints(callback)
- if callback then
- _nethints(1, function(mac, v4, v6, name)
- name = name or v4
- if name and name ~= mac then
- callback(mac, name or v4)
- end
- end)
- else
- local rv = { }
- _nethints(1, function(mac, v4, v6, name)
- name = name or v4
- if name and name ~= mac then
- rv[#rv+1] = { mac, name or v4 }
- end
- end)
- return rv
- end
-end
-
--- Each entry contains the values in the following order:
--- [ "ip", "name" ]
-function net.ipv4_hints(callback)
- if callback then
- _nethints(2, function(mac, v4, v6, name)
- name = name or mac
- if name and name ~= v4 then
- callback(v4, name)
- end
- end)
- else
- local rv = { }
- _nethints(2, function(mac, v4, v6, name)
- name = name or mac
- if name and name ~= v4 then
- rv[#rv+1] = { v4, name }
- end
- end)
- return rv
- end
-end
-
--- Each entry contains the values in the following order:
--- [ "ip", "name" ]
-function net.ipv6_hints(callback)
- if callback then
- _nethints(3, function(mac, v4, v6, name)
- name = name or mac
- if name and name ~= v6 then
- callback(v6, name)
- end
- end)
- else
- local rv = { }
- _nethints(3, function(mac, v4, v6, name)
- name = name or mac
- if name and name ~= v6 then
- rv[#rv+1] = { v6, name }
- end
- end)
- return rv
- end
-end
-
-function net.host_hints(callback)
- if callback then
- _nethints(1, function(mac, v4, v6, name)
- if mac and mac ~= "00:00:00:00:00:00" and (v4 or v6 or name) then
- callback(mac, v4, v6, name)
- end
- end)
- else
- local rv = { }
- _nethints(1, function(mac, v4, v6, name)
- if mac and mac ~= "00:00:00:00:00:00" and (v4 or v6 or name) then
- local e = { }
- if v4 then e.ipv4 = v4 end
- if v6 then e.ipv6 = v6 end
- if name then e.name = name end
- rv[mac] = e
- end
- end)
- return rv
- end
-end
-
-function net.conntrack(callback)
- local ok, nfct = pcall(io.lines, "/proc/net/nf_conntrack")
- if not ok or not nfct then
- return nil
- end
-
- local line, connt = nil, (not callback) and { }
- for line in nfct do
- local fam, l3, l4, rest =
- line:match("^(ipv[46]) +(%d+) +%S+ +(%d+) +(.+)$")
-
- local timeout, tuples = rest:match("^(%d+) +(.+)$")
-
- if not tuples then
- tuples = rest
- end
-
- if fam and l3 and l4 and not tuples:match("^TIME_WAIT ") then
- l4 = nixio.getprotobynumber(l4)
-
- local entry = {
- bytes = 0,
- packets = 0,
- layer3 = fam,
- layer4 = l4 and l4.name or "unknown",
- timeout = tonumber(timeout, 10)
- }
-
- local key, val
- for key, val in tuples:gmatch("(%w+)=(%S+)") do
- if key == "bytes" or key == "packets" then
- entry[key] = entry[key] + tonumber(val, 10)
- elseif key == "src" or key == "dst" then
- if entry[key] == nil then
- entry[key] = luci.ip.new(val):string()
- end
- elseif key == "sport" or key == "dport" then
- if entry[key] == nil then
- entry[key] = val
- end
- elseif val then
- entry[key] = val
- end
- end
-
- if callback then
- callback(entry)
- else
- connt[#connt+1] = entry
- end
- end
- end
-
- return callback and true or connt
-end
-
-function net.devices()
- local devs = {}
- local seen = {}
- for k, v in ipairs(nixio.getifaddrs()) do
- if v.name and not seen[v.name] then
- seen[v.name] = true
- devs[#devs+1] = v.name
- end
- end
- return devs
-end
-
-function net.duid_to_mac(duid)
- local b1, b2, b3, b4, b5, b6
-
- if type(duid) == "string" then
- -- DUID-LLT / Ethernet
- if #duid == 28 then
- b1, b2, b3, b4, b5, b6 = duid:match("^00010001(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)%x%x%x%x%x%x%x%x$")
-
- -- DUID-LL / Ethernet
- elseif #duid == 20 then
- b1, b2, b3, b4, b5, b6 = duid:match("^00030001(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)$")
-
- -- DUID-LL / Ethernet (Without Header)
- elseif #duid == 12 then
- b1, b2, b3, b4, b5, b6 = duid:match("^(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)$")
- end
- end
-
- return b1 and luci.ip.checkmac(table.concat({ b1, b2, b3, b4, b5, b6 }, ":"))
-end
-
-process = {}
-
-function process.info(key)
- local s = {uid = nixio.getuid(), gid = nixio.getgid()}
- return not key and s or s[key]
-end
-
-function process.list()
- local data = {}
- local k
- local ps = luci.util.execi("/bin/busybox top -bn1")
-
- if not ps then
- return
- end
-
- for line in ps do
- local pid, ppid, user, stat, vsz, mem, cpu, cmd = line:match(
- "^ *(%d+) +(%d+) +(%S.-%S) +([RSDZTW][<NW ][<N ]) +(%d+m?) +(%d+%%) +(%d+%%) +(.+)"
- )
-
- local idx = tonumber(pid)
- if idx and not cmd:match("top %-bn1") then
- data[idx] = {
- ['PID'] = pid,
- ['PPID'] = ppid,
- ['USER'] = user,
- ['STAT'] = stat,
- ['VSZ'] = vsz,
- ['%MEM'] = mem,
- ['%CPU'] = cpu,
- ['COMMAND'] = cmd
- }
- end
- end
-
- return data
-end
-
-function process.setgroup(gid)
- return nixio.setgid(gid)
-end
-
-function process.setuser(uid)
- return nixio.setuid(uid)
-end
-
-process.signal = nixio.kill
-
-local function xclose(fd)
- if fd and fd:fileno() > 2 then
- fd:close()
- end
-end
-
-function process.exec(command, stdout, stderr, nowait)
- local out_r, out_w, err_r, err_w
- if stdout then out_r, out_w = nixio.pipe() end
- if stderr then err_r, err_w = nixio.pipe() end
-
- local pid = nixio.fork()
- if pid == 0 then
- nixio.chdir("/")
-
- local null = nixio.open("/dev/null", "w+")
- if null then
- nixio.dup(out_w or null, nixio.stdout)
- nixio.dup(err_w or null, nixio.stderr)
- nixio.dup(null, nixio.stdin)
- xclose(out_w)
- xclose(out_r)
- xclose(err_w)
- xclose(err_r)
- xclose(null)
- end
-
- nixio.exec(unpack(command))
- os.exit(-1)
- end
-
- local _, pfds, rv = nil, {}, { code = -1, pid = pid }
-
- xclose(out_w)
- xclose(err_w)
-
- if out_r then
- pfds[#pfds+1] = {
- fd = out_r,
- cb = type(stdout) == "function" and stdout,
- name = "stdout",
- events = nixio.poll_flags("in", "err", "hup")
- }
- end
-
- if err_r then
- pfds[#pfds+1] = {
- fd = err_r,
- cb = type(stderr) == "function" and stderr,
- name = "stderr",
- events = nixio.poll_flags("in", "err", "hup")
- }
- end
-
- while #pfds > 0 do
- local nfds, err = nixio.poll(pfds, -1)
- if not nfds and err ~= nixio.const.EINTR then
- break
- end
-
- local i
- for i = #pfds, 1, -1 do
- local rfd = pfds[i]
- if rfd.revents > 0 then
- local chunk, err = rfd.fd:read(4096)
- if chunk and #chunk > 0 then
- if rfd.cb then
- rfd.cb(chunk)
- else
- rfd.buf = rfd.buf or {}
- rfd.buf[#rfd.buf + 1] = chunk
- end
- else
- table.remove(pfds, i)
- if rfd.buf then
- rv[rfd.name] = table.concat(rfd.buf, "")
- end
- rfd.fd:close()
- end
- end
- end
- end
-
- if not nowait then
- _, _, rv.code = nixio.waitpid(pid)
- end
-
- return rv
-end
-
-
-user = {}
-
--- { "uid", "gid", "name", "passwd", "dir", "shell", "gecos" }
-user.getuser = nixio.getpw
-
-function user.getpasswd(username)
- local pwe = nixio.getsp and nixio.getsp(username) or nixio.getpw(username)
- local pwh = pwe and (pwe.pwdp or pwe.passwd)
- if not pwh or #pwh < 1 then
- return nil, pwe
- else
- return pwh, pwe
- end
-end
-
-function user.checkpasswd(username, pass)
- local pwh, pwe = user.getpasswd(username)
- if pwe then
- return (pwh == nil or nixio.crypt(pass, pwh) == pwh)
- end
- return false
-end
-
-function user.setpasswd(username, password)
- return os.execute("(echo %s; sleep 1; echo %s) | passwd %s >/dev/null 2>&1" %{
- luci.util.shellquote(password),
- luci.util.shellquote(password),
- luci.util.shellquote(username)
- })
-end
-
-
-wifi = {}
-
-function wifi.getiwinfo(ifname)
- local ntm = require "luci.model.network"
-
- ntm.init()
-
- local wnet = ntm:get_wifinet(ifname)
- if wnet and wnet.iwinfo then
- return wnet.iwinfo
- end
-
- local wdev = ntm:get_wifidev(ifname)
- if wdev and wdev.iwinfo then
- return wdev.iwinfo
- end
-
- return { ifname = ifname }
-end
-
-
-init = {}
-init.dir = "/etc/init.d/"
-
-function init.names()
- local names = { }
- for name in fs.glob(init.dir.."*") do
- names[#names+1] = fs.basename(name)
- end
- return names
-end
-
-function init.index(name)
- name = fs.basename(name)
- if fs.access(init.dir..name) then
- return call("env -i sh -c 'source %s%s enabled; exit ${START:-255}' >/dev/null"
- %{ init.dir, name })
- end
-end
-
-local function init_action(action, name)
- name = fs.basename(name)
- if fs.access(init.dir..name) then
- return call("env -i %s%s %s >/dev/null" %{ init.dir, name, action })
- end
-end
-
-function init.enabled(name)
- return (init_action("enabled", name) == 0)
-end
-
-function init.enable(name)
- return (init_action("enable", name) == 0)
-end
-
-function init.disable(name)
- return (init_action("disable", name) == 0)
-end
-
-function init.start(name)
- return (init_action("start", name) == 0)
-end
-
-function init.stop(name)
- return (init_action("stop", name) == 0)
-end
-
-function init.restart(name)
- return (init_action("restart", name) == 0)
-end
-
-function init.reload(name)
- return (init_action("reload", name) == 0)
-end
+++ /dev/null
----[[
-LuCI Linux and POSIX system utilities.
-]]
-module "luci.sys"
-
----[[
-Execute a given shell command and return the error code
-
-@class function
-@name call
-@param ... Command to call
-@return Error code of the command
-]]
-
----[[
-Execute a given shell command and capture its standard output
-
-@class function
-@name exec
-@param command Command to call
-@return String containing the return the output of the command
-]]
-
----[[
-Retrieve information about currently mounted file systems.
-
-@class function
-@name mounts
-@return Table containing mount information
-]]
-
----[[
-Retrieve environment variables. If no variable is given then a table
-
-containing the whole environment is returned otherwise this function returns
-the corresponding string value for the given name or nil if no such variable
-exists.
-@class function
-@name getenv
-@param var Name of the environment variable to retrieve (optional)
-@return String containing the value of the specified variable
-@return Table containing all variables if no variable name is given
-]]
-
----[[
-Get or set the current hostname.
-
-@class function
-@name hostname
-@param String containing a new hostname to set (optional)
-@return String containing the system hostname
-]]
-
----[[
-Returns the contents of a documented referred by an URL.
-
-@class function
-@name httpget
-@param url The URL to retrieve
-@param stream Return a stream instead of a buffer
-@param target Directly write to target file name
-@return String containing the contents of given the URL
-]]
-
----[[
-Initiate a system reboot.
-
-@class function
-@name reboot
-@return Return value of os.execute()
-]]
-
----[[
-Retrieves the output of the "logread" command.
-
-@class function
-@name syslog
-@return String containing the current log buffer
-]]
-
----[[
-Retrieves the output of the "dmesg" command.
-
-@class function
-@name dmesg
-@return String containing the current log buffer
-]]
-
----[[
-Generates a random id with specified length.
-
-@class function
-@name uniqueid
-@param bytes Number of bytes for the unique id
-@return String containing hex encoded id
-]]
-
----[[
-Returns the current system uptime stats.
-
-@class function
-@name uptime
-@return String containing total uptime in seconds
-]]
-
----[[
-LuCI system utilities / network related functions.
-
-@class module
-@name luci.sys.net
-]]
-
----[[
-Returns a two-dimensional table of mac address hints.
-
-@class function
-@name net.mac_hints
-@return Table of table containing known hosts from various sources.
- Each entry contains the values in the following order:
- [ "mac", "name" ]
-]]
-
----[[
-Returns a two-dimensional table of IPv4 address hints.
-
-@class function
-@name net.ipv4_hints
-@return Table of table containing known hosts from various sources.
- Each entry contains the values in the following order:
- [ "ip", "name" ]
-]]
-
----[[
-Returns a two-dimensional table of IPv6 address hints.
-
-@class function
-@name net.ipv6_hints
-@return Table of table containing known hosts from various sources.
- Each entry contains the values in the following order:
- [ "ip", "name" ]
-]]
-
----[[
-Returns a two-dimensional table of host hints.
-
-@class function
-@name net.host_hints
-@return Table of table containing known hosts from various sources,
- indexed by mac address. Each subtable contains at least one
- of the fields "name", "ipv4" or "ipv6".
-]]
-
----[[
-Returns conntrack information
-
-@class function
-@name net.conntrack
-@return Table with the currently tracked IP connections
-]]
-
----[[
-Determine the names of available network interfaces.
-
-@class function
-@name net.devices
-@return Table containing all current interface names
-]]
-
----[[
-LuCI system utilities / process related functions.
-
-@class module
-@name luci.sys.process
-]]
-
----[[
-Get the current process id.
-
-@class function
-@name process.info
-@return Number containing the current pid
-]]
-
----[[
-Retrieve information about currently running processes.
-
-@class function
-@name process.list
-@return Table containing process information
-]]
-
----[[
-Set the gid of a process identified by given pid.
-
-@class function
-@name process.setgroup
-@param gid Number containing the Unix group id
-@return Boolean indicating successful operation
-@return String containing the error message if failed
-@return Number containing the error code if failed
-]]
-
----[[
-Set the uid of a process identified by given pid.
-
-@class function
-@name process.setuser
-@param uid Number containing the Unix user id
-@return Boolean indicating successful operation
-@return String containing the error message if failed
-@return Number containing the error code if failed
-]]
-
----[[
-Send a signal to a process identified by given pid.
-
-@class function
-@name process.signal
-@param pid Number containing the process id
-@param sig Signal to send (default: 15 [SIGTERM])
-@return Boolean indicating successful operation
-@return Number containing the error code if failed
-]]
-
----[[
-Execute a process, optionally capturing stdio.
-
-Executes the process specified by the given argv vector, e.g.
-`{ "/bin/sh", "-c", "echo 1" }` and waits for it to terminate unless a true
-value has been passed for the "nowait" parameter.
-
-When a function value is passed for the stdout or stderr arguments, the passed
-function is repeatedly called for each chunk read from the corresponding stdio
-stream. The read data is passed as string containing at most 4096 bytes at a
-time.
-
-When a true, non-function value is passed for the stdout or stderr arguments,
-the data of the corresponding stdio stream is read into an internal string
-buffer and returned as "stdout" or "stderr" field respectively in the result
-table.
-
-When a true value is passed to the nowait parameter, the function does not
-await process termination but returns as soon as all captured stdio streams
-have been closed or - if no streams are captured - immediately after launching
-the process.
-
-@class function
-@name process.exec
-@param commend Table containing the argv vector to execute
-@param stdout Callback function or boolean to indicate capturing (optional)
-@param stderr Callback function or boolean to indicate capturing (optional)
-@param nowait Don't wait for process termination when true (optional)
-@return Table containing at least the fields "code" which holds the exit
- status of the invoked process or "-1" on error and "pid", which
- contains the process id assigned to the spawned process. When
- stdout and/or stderr capturing has been requested, it additionally
- contains "stdout" and "stderr" fields respectively, holding the
- captured stdio data as string.
-]]
-
----[[
-LuCI system utilities / user related functions.
-
-@class module
-@name luci.sys.user
-]]
-
----[[
-Retrieve user information for given uid.
-
-@class function
-@name getuser
-@param uid Number containing the Unix user id
-@return Table containing the following fields:
--- { "uid", "gid", "name", "passwd", "dir", "shell", "gecos" }
-]]
-
----[[
-Retrieve the current user password hash.
-
-@class function
-@name user.getpasswd
-@param username String containing the username to retrieve the password for
-@return String containing the hash or nil if no password is set.
-@return Password database entry
-]]
-
----[[
-Test whether given string matches the password of a given system user.
-
-@class function
-@name user.checkpasswd
-@param username String containing the Unix user name
-@param pass String containing the password to compare
-@return Boolean indicating whether the passwords are equal
-]]
-
----[[
-Change the password of given user.
-
-@class function
-@name user.setpasswd
-@param username String containing the Unix user name
-@param password String containing the password to compare
-@return Number containing 0 on success and >= 1 on error
-]]
-
----[[
-LuCI system utilities / wifi related functions.
-
-@class module
-@name luci.sys.wifi
-]]
-
----[[
-Get wireless information for given interface.
-
-@class function
-@name wifi.getiwinfo
-@param ifname String containing the interface name
-@return A wrapped iwinfo object instance
-]]
-
----[[
-LuCI system utilities / init related functions.
-
-@class module
-@name luci.sys.init
-]]
-
----[[
-Get the names of all installed init scripts
-
-@class function
-@name init.names
-@return Table containing the names of all inistalled init scripts
-]]
-
----[[
-Get the index of he given init script
-
-@class function
-@name init.index
-@param name Name of the init script
-@return Numeric index value
-]]
-
----[[
-Test whether the given init script is enabled
-
-@class function
-@name init.enabled
-@param name Name of the init script
-@return Boolean indicating whether init is enabled
-]]
-
----[[
-Enable the given init script
-
-@class function
-@name init.enable
-@param name Name of the init script
-@return Boolean indicating success
-]]
-
----[[
-Disable the given init script
-
-@class function
-@name init.disable
-@param name Name of the init script
-@return Boolean indicating success
-]]
-
----[[
-Start the given init script
-
-@class function
-@name init.start
-@param name Name of the init script
-@return Boolean indicating success
-]]
-
----[[
-Stop the given init script
-
-@class function
-@name init.stop
-@param name Name of the init script
-@return Boolean indicating success
-]]
-
+++ /dev/null
--- Licensed to the public under the Apache License 2.0.
-
-local setmetatable, require, rawget, rawset = setmetatable, require, rawget, rawset
-
-module "luci.sys.zoneinfo"
-
-setmetatable(_M, {
- __index = function(t, k)
- if k == "TZ" and not rawget(t, k) then
- local m = require "luci.sys.zoneinfo.tzdata"
- rawset(t, k, rawget(m, k))
- elseif k == "OFFSET" and not rawget(t, k) then
- local m = require "luci.sys.zoneinfo.tzoffset"
- rawset(t, k, rawget(m, k))
- end
-
- return rawget(t, k)
- end
-})
+++ /dev/null
--- Licensed to the public under the Apache License 2.0.
-
-module "luci.sys.zoneinfo.tzdata"
-
-TZ = {
- { 'Africa/Abidjan', 'GMT0' },
- { 'Africa/Accra', 'GMT0' },
- { 'Africa/Addis Ababa', 'EAT-3' },
- { 'Africa/Algiers', 'CET-1' },
- { 'Africa/Asmara', 'EAT-3' },
- { 'Africa/Bamako', 'GMT0' },
- { 'Africa/Bangui', 'WAT-1' },
- { 'Africa/Banjul', 'GMT0' },
- { 'Africa/Bissau', 'GMT0' },
- { 'Africa/Blantyre', 'CAT-2' },
- { 'Africa/Brazzaville', 'WAT-1' },
- { 'Africa/Bujumbura', 'CAT-2' },
- { 'Africa/Cairo', 'EET-2' },
- { 'Africa/Casablanca', '<+01>-1' },
- { 'Africa/Ceuta', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Africa/Conakry', 'GMT0' },
- { 'Africa/Dakar', 'GMT0' },
- { 'Africa/Dar es Salaam', 'EAT-3' },
- { 'Africa/Djibouti', 'EAT-3' },
- { 'Africa/Douala', 'WAT-1' },
- { 'Africa/El Aaiun', '<+01>-1' },
- { 'Africa/Freetown', 'GMT0' },
- { 'Africa/Gaborone', 'CAT-2' },
- { 'Africa/Harare', 'CAT-2' },
- { 'Africa/Johannesburg', 'SAST-2' },
- { 'Africa/Juba', 'CAT-2' },
- { 'Africa/Kampala', 'EAT-3' },
- { 'Africa/Khartoum', 'CAT-2' },
- { 'Africa/Kigali', 'CAT-2' },
- { 'Africa/Kinshasa', 'WAT-1' },
- { 'Africa/Lagos', 'WAT-1' },
- { 'Africa/Libreville', 'WAT-1' },
- { 'Africa/Lome', 'GMT0' },
- { 'Africa/Luanda', 'WAT-1' },
- { 'Africa/Lubumbashi', 'CAT-2' },
- { 'Africa/Lusaka', 'CAT-2' },
- { 'Africa/Malabo', 'WAT-1' },
- { 'Africa/Maputo', 'CAT-2' },
- { 'Africa/Maseru', 'SAST-2' },
- { 'Africa/Mbabane', 'SAST-2' },
- { 'Africa/Mogadishu', 'EAT-3' },
- { 'Africa/Monrovia', 'GMT0' },
- { 'Africa/Nairobi', 'EAT-3' },
- { 'Africa/Ndjamena', 'WAT-1' },
- { 'Africa/Niamey', 'WAT-1' },
- { 'Africa/Nouakchott', 'GMT0' },
- { 'Africa/Ouagadougou', 'GMT0' },
- { 'Africa/Porto-Novo', 'WAT-1' },
- { 'Africa/Sao Tome', 'GMT0' },
- { 'Africa/Tripoli', 'EET-2' },
- { 'Africa/Tunis', 'CET-1' },
- { 'Africa/Windhoek', 'CAT-2' },
- { 'America/Adak', 'HST10HDT,M3.2.0,M11.1.0' },
- { 'America/Anchorage', 'AKST9AKDT,M3.2.0,M11.1.0' },
- { 'America/Anguilla', 'AST4' },
- { 'America/Antigua', 'AST4' },
- { 'America/Araguaina', '<-03>3' },
- { 'America/Argentina/Buenos Aires', '<-03>3' },
- { 'America/Argentina/Catamarca', '<-03>3' },
- { 'America/Argentina/Cordoba', '<-03>3' },
- { 'America/Argentina/Jujuy', '<-03>3' },
- { 'America/Argentina/La Rioja', '<-03>3' },
- { 'America/Argentina/Mendoza', '<-03>3' },
- { 'America/Argentina/Rio Gallegos', '<-03>3' },
- { 'America/Argentina/Salta', '<-03>3' },
- { 'America/Argentina/San Juan', '<-03>3' },
- { 'America/Argentina/San Luis', '<-03>3' },
- { 'America/Argentina/Tucuman', '<-03>3' },
- { 'America/Argentina/Ushuaia', '<-03>3' },
- { 'America/Aruba', 'AST4' },
- { 'America/Asuncion', '<-04>4<-03>,M10.1.0/0,M3.4.0/0' },
- { 'America/Atikokan', 'EST5' },
- { 'America/Bahia', '<-03>3' },
- { 'America/Bahia Banderas', 'CST6CDT,M4.1.0,M10.5.0' },
- { 'America/Barbados', 'AST4' },
- { 'America/Belem', '<-03>3' },
- { 'America/Belize', 'CST6' },
- { 'America/Blanc-Sablon', 'AST4' },
- { 'America/Boa Vista', '<-04>4' },
- { 'America/Bogota', '<-05>5' },
- { 'America/Boise', 'MST7MDT,M3.2.0,M11.1.0' },
- { 'America/Cambridge Bay', 'MST7MDT,M3.2.0,M11.1.0' },
- { 'America/Campo Grande', '<-04>4' },
- { 'America/Cancun', 'EST5' },
- { 'America/Caracas', '<-04>4' },
- { 'America/Cayenne', '<-03>3' },
- { 'America/Cayman', 'EST5' },
- { 'America/Chicago', 'CST6CDT,M3.2.0,M11.1.0' },
- { 'America/Chihuahua', 'MST7MDT,M4.1.0,M10.5.0' },
- { 'America/Costa Rica', 'CST6' },
- { 'America/Creston', 'MST7' },
- { 'America/Cuiaba', '<-04>4' },
- { 'America/Curacao', 'AST4' },
- { 'America/Danmarkshavn', 'GMT0' },
- { 'America/Dawson', 'MST7' },
- { 'America/Dawson Creek', 'MST7' },
- { 'America/Denver', 'MST7MDT,M3.2.0,M11.1.0' },
- { 'America/Detroit', 'EST5EDT,M3.2.0,M11.1.0' },
- { 'America/Dominica', 'AST4' },
- { 'America/Edmonton', 'MST7MDT,M3.2.0,M11.1.0' },
- { 'America/Eirunepe', '<-05>5' },
- { 'America/El Salvador', 'CST6' },
- { 'America/Fort Nelson', 'MST7' },
- { 'America/Fortaleza', '<-03>3' },
- { 'America/Glace Bay', 'AST4ADT,M3.2.0,M11.1.0' },
- { 'America/Goose Bay', 'AST4ADT,M3.2.0,M11.1.0' },
- { 'America/Grand Turk', 'EST5EDT,M3.2.0,M11.1.0' },
- { 'America/Grenada', 'AST4' },
- { 'America/Guadeloupe', 'AST4' },
- { 'America/Guatemala', 'CST6' },
- { 'America/Guayaquil', '<-05>5' },
- { 'America/Guyana', '<-04>4' },
- { 'America/Halifax', 'AST4ADT,M3.2.0,M11.1.0' },
- { 'America/Havana', 'CST5CDT,M3.2.0/0,M11.1.0/1' },
- { 'America/Hermosillo', 'MST7' },
- { 'America/Indiana/Indianapolis', 'EST5EDT,M3.2.0,M11.1.0' },
- { 'America/Indiana/Knox', 'CST6CDT,M3.2.0,M11.1.0' },
- { 'America/Indiana/Marengo', 'EST5EDT,M3.2.0,M11.1.0' },
- { 'America/Indiana/Petersburg', 'EST5EDT,M3.2.0,M11.1.0' },
- { 'America/Indiana/Tell City', 'CST6CDT,M3.2.0,M11.1.0' },
- { 'America/Indiana/Vevay', 'EST5EDT,M3.2.0,M11.1.0' },
- { 'America/Indiana/Vincennes', 'EST5EDT,M3.2.0,M11.1.0' },
- { 'America/Indiana/Winamac', 'EST5EDT,M3.2.0,M11.1.0' },
- { 'America/Inuvik', 'MST7MDT,M3.2.0,M11.1.0' },
- { 'America/Iqaluit', 'EST5EDT,M3.2.0,M11.1.0' },
- { 'America/Jamaica', 'EST5' },
- { 'America/Juneau', 'AKST9AKDT,M3.2.0,M11.1.0' },
- { 'America/Kentucky/Louisville', 'EST5EDT,M3.2.0,M11.1.0' },
- { 'America/Kentucky/Monticello', 'EST5EDT,M3.2.0,M11.1.0' },
- { 'America/Kralendijk', 'AST4' },
- { 'America/La Paz', '<-04>4' },
- { 'America/Lima', '<-05>5' },
- { 'America/Los Angeles', 'PST8PDT,M3.2.0,M11.1.0' },
- { 'America/Lower Princes', 'AST4' },
- { 'America/Maceio', '<-03>3' },
- { 'America/Managua', 'CST6' },
- { 'America/Manaus', '<-04>4' },
- { 'America/Marigot', 'AST4' },
- { 'America/Martinique', 'AST4' },
- { 'America/Matamoros', 'CST6CDT,M3.2.0,M11.1.0' },
- { 'America/Mazatlan', 'MST7MDT,M4.1.0,M10.5.0' },
- { 'America/Menominee', 'CST6CDT,M3.2.0,M11.1.0' },
- { 'America/Merida', 'CST6CDT,M4.1.0,M10.5.0' },
- { 'America/Metlakatla', 'AKST9AKDT,M3.2.0,M11.1.0' },
- { 'America/Mexico City', 'CST6CDT,M4.1.0,M10.5.0' },
- { 'America/Miquelon', '<-03>3<-02>,M3.2.0,M11.1.0' },
- { 'America/Moncton', 'AST4ADT,M3.2.0,M11.1.0' },
- { 'America/Monterrey', 'CST6CDT,M4.1.0,M10.5.0' },
- { 'America/Montevideo', '<-03>3' },
- { 'America/Montserrat', 'AST4' },
- { 'America/Nassau', 'EST5EDT,M3.2.0,M11.1.0' },
- { 'America/New York', 'EST5EDT,M3.2.0,M11.1.0' },
- { 'America/Nipigon', 'EST5EDT,M3.2.0,M11.1.0' },
- { 'America/Nome', 'AKST9AKDT,M3.2.0,M11.1.0' },
- { 'America/Noronha', '<-02>2' },
- { 'America/North Dakota/Beulah', 'CST6CDT,M3.2.0,M11.1.0' },
- { 'America/North Dakota/Center', 'CST6CDT,M3.2.0,M11.1.0' },
- { 'America/North Dakota/New Salem', 'CST6CDT,M3.2.0,M11.1.0' },
- { 'America/Nuuk', '<-03>3<-02>,M3.5.0/-2,M10.5.0/-1' },
- { 'America/Ojinaga', 'MST7MDT,M3.2.0,M11.1.0' },
- { 'America/Panama', 'EST5' },
- { 'America/Pangnirtung', 'EST5EDT,M3.2.0,M11.1.0' },
- { 'America/Paramaribo', '<-03>3' },
- { 'America/Phoenix', 'MST7' },
- { 'America/Port of Spain', 'AST4' },
- { 'America/Port-au-Prince', 'EST5EDT,M3.2.0,M11.1.0' },
- { 'America/Porto Velho', '<-04>4' },
- { 'America/Puerto Rico', 'AST4' },
- { 'America/Punta Arenas', '<-03>3' },
- { 'America/Rainy River', 'CST6CDT,M3.2.0,M11.1.0' },
- { 'America/Rankin Inlet', 'CST6CDT,M3.2.0,M11.1.0' },
- { 'America/Recife', '<-03>3' },
- { 'America/Regina', 'CST6' },
- { 'America/Resolute', 'CST6CDT,M3.2.0,M11.1.0' },
- { 'America/Rio Branco', '<-05>5' },
- { 'America/Santarem', '<-03>3' },
- { 'America/Santiago', '<-04>4<-03>,M9.1.6/24,M4.1.6/24' },
- { 'America/Santo Domingo', 'AST4' },
- { 'America/Sao Paulo', '<-03>3' },
- { 'America/Scoresbysund', '<-01>1<+00>,M3.5.0/0,M10.5.0/1' },
- { 'America/Sitka', 'AKST9AKDT,M3.2.0,M11.1.0' },
- { 'America/St Barthelemy', 'AST4' },
- { 'America/St Johns', 'NST3:30NDT,M3.2.0,M11.1.0' },
- { 'America/St Kitts', 'AST4' },
- { 'America/St Lucia', 'AST4' },
- { 'America/St Thomas', 'AST4' },
- { 'America/St Vincent', 'AST4' },
- { 'America/Swift Current', 'CST6' },
- { 'America/Tegucigalpa', 'CST6' },
- { 'America/Thule', 'AST4ADT,M3.2.0,M11.1.0' },
- { 'America/Thunder Bay', 'EST5EDT,M3.2.0,M11.1.0' },
- { 'America/Tijuana', 'PST8PDT,M3.2.0,M11.1.0' },
- { 'America/Toronto', 'EST5EDT,M3.2.0,M11.1.0' },
- { 'America/Tortola', 'AST4' },
- { 'America/Vancouver', 'PST8PDT,M3.2.0,M11.1.0' },
- { 'America/Whitehorse', 'MST7' },
- { 'America/Winnipeg', 'CST6CDT,M3.2.0,M11.1.0' },
- { 'America/Yakutat', 'AKST9AKDT,M3.2.0,M11.1.0' },
- { 'America/Yellowknife', 'MST7MDT,M3.2.0,M11.1.0' },
- { 'Antarctica/Casey', '<+11>-11' },
- { 'Antarctica/Davis', '<+07>-7' },
- { 'Antarctica/DumontDUrville', '<+10>-10' },
- { 'Antarctica/Macquarie', 'AEST-10AEDT,M10.1.0,M4.1.0/3' },
- { 'Antarctica/Mawson', '<+05>-5' },
- { 'Antarctica/McMurdo', 'NZST-12NZDT,M9.5.0,M4.1.0/3' },
- { 'Antarctica/Palmer', '<-03>3' },
- { 'Antarctica/Rothera', '<-03>3' },
- { 'Antarctica/Syowa', '<+03>-3' },
- { 'Antarctica/Troll', '<+00>0<+02>-2,M3.5.0/1,M10.5.0/3' },
- { 'Antarctica/Vostok', '<+06>-6' },
- { 'Arctic/Longyearbyen', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Asia/Aden', '<+03>-3' },
- { 'Asia/Almaty', '<+06>-6' },
- { 'Asia/Amman', '<+03>-3' },
- { 'Asia/Anadyr', '<+12>-12' },
- { 'Asia/Aqtau', '<+05>-5' },
- { 'Asia/Aqtobe', '<+05>-5' },
- { 'Asia/Ashgabat', '<+05>-5' },
- { 'Asia/Atyrau', '<+05>-5' },
- { 'Asia/Baghdad', '<+03>-3' },
- { 'Asia/Bahrain', '<+03>-3' },
- { 'Asia/Baku', '<+04>-4' },
- { 'Asia/Bangkok', '<+07>-7' },
- { 'Asia/Barnaul', '<+07>-7' },
- { 'Asia/Beirut', 'EET-2EEST,M3.5.0/0,M10.5.0/0' },
- { 'Asia/Bishkek', '<+06>-6' },
- { 'Asia/Brunei', '<+08>-8' },
- { 'Asia/Chita', '<+09>-9' },
- { 'Asia/Choibalsan', '<+08>-8' },
- { 'Asia/Colombo', '<+0530>-5:30' },
- { 'Asia/Damascus', '<+03>-3' },
- { 'Asia/Dhaka', '<+06>-6' },
- { 'Asia/Dili', '<+09>-9' },
- { 'Asia/Dubai', '<+04>-4' },
- { 'Asia/Dushanbe', '<+05>-5' },
- { 'Asia/Famagusta', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
- { 'Asia/Gaza', 'EET-2EEST,M3.4.4/50,M10.4.4/50' },
- { 'Asia/Hebron', 'EET-2EEST,M3.4.4/50,M10.4.4/50' },
- { 'Asia/Ho Chi Minh', '<+07>-7' },
- { 'Asia/Hong Kong', 'HKT-8' },
- { 'Asia/Hovd', '<+07>-7' },
- { 'Asia/Irkutsk', '<+08>-8' },
- { 'Asia/Jakarta', 'WIB-7' },
- { 'Asia/Jayapura', 'WIT-9' },
- { 'Asia/Jerusalem', 'IST-2IDT,M3.4.4/26,M10.5.0' },
- { 'Asia/Kabul', '<+0430>-4:30' },
- { 'Asia/Kamchatka', '<+12>-12' },
- { 'Asia/Karachi', 'PKT-5' },
- { 'Asia/Kathmandu', '<+0545>-5:45' },
- { 'Asia/Khandyga', '<+09>-9' },
- { 'Asia/Kolkata', 'IST-5:30' },
- { 'Asia/Krasnoyarsk', '<+07>-7' },
- { 'Asia/Kuala Lumpur', '<+08>-8' },
- { 'Asia/Kuching', '<+08>-8' },
- { 'Asia/Kuwait', '<+03>-3' },
- { 'Asia/Macau', 'CST-8' },
- { 'Asia/Magadan', '<+11>-11' },
- { 'Asia/Makassar', 'WITA-8' },
- { 'Asia/Manila', 'PST-8' },
- { 'Asia/Muscat', '<+04>-4' },
- { 'Asia/Nicosia', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
- { 'Asia/Novokuznetsk', '<+07>-7' },
- { 'Asia/Novosibirsk', '<+07>-7' },
- { 'Asia/Omsk', '<+06>-6' },
- { 'Asia/Oral', '<+05>-5' },
- { 'Asia/Phnom Penh', '<+07>-7' },
- { 'Asia/Pontianak', 'WIB-7' },
- { 'Asia/Pyongyang', 'KST-9' },
- { 'Asia/Qatar', '<+03>-3' },
- { 'Asia/Qostanay', '<+06>-6' },
- { 'Asia/Qyzylorda', '<+05>-5' },
- { 'Asia/Riyadh', '<+03>-3' },
- { 'Asia/Sakhalin', '<+11>-11' },
- { 'Asia/Samarkand', '<+05>-5' },
- { 'Asia/Seoul', 'KST-9' },
- { 'Asia/Shanghai', 'CST-8' },
- { 'Asia/Singapore', '<+08>-8' },
- { 'Asia/Srednekolymsk', '<+11>-11' },
- { 'Asia/Taipei', 'CST-8' },
- { 'Asia/Tashkent', '<+05>-5' },
- { 'Asia/Tbilisi', '<+04>-4' },
- { 'Asia/Tehran', '<+0330>-3:30' },
- { 'Asia/Thimphu', '<+06>-6' },
- { 'Asia/Tokyo', 'JST-9' },
- { 'Asia/Tomsk', '<+07>-7' },
- { 'Asia/Ulaanbaatar', '<+08>-8' },
- { 'Asia/Urumqi', '<+06>-6' },
- { 'Asia/Ust-Nera', '<+10>-10' },
- { 'Asia/Vientiane', '<+07>-7' },
- { 'Asia/Vladivostok', '<+10>-10' },
- { 'Asia/Yakutsk', '<+09>-9' },
- { 'Asia/Yangon', '<+0630>-6:30' },
- { 'Asia/Yekaterinburg', '<+05>-5' },
- { 'Asia/Yerevan', '<+04>-4' },
- { 'Atlantic/Azores', '<-01>1<+00>,M3.5.0/0,M10.5.0/1' },
- { 'Atlantic/Bermuda', 'AST4ADT,M3.2.0,M11.1.0' },
- { 'Atlantic/Canary', 'WET0WEST,M3.5.0/1,M10.5.0' },
- { 'Atlantic/Cape Verde', '<-01>1' },
- { 'Atlantic/Faroe', 'WET0WEST,M3.5.0/1,M10.5.0' },
- { 'Atlantic/Madeira', 'WET0WEST,M3.5.0/1,M10.5.0' },
- { 'Atlantic/Reykjavik', 'GMT0' },
- { 'Atlantic/South Georgia', '<-02>2' },
- { 'Atlantic/St Helena', 'GMT0' },
- { 'Atlantic/Stanley', '<-03>3' },
- { 'Australia/Adelaide', 'ACST-9:30ACDT,M10.1.0,M4.1.0/3' },
- { 'Australia/Brisbane', 'AEST-10' },
- { 'Australia/Broken Hill', 'ACST-9:30ACDT,M10.1.0,M4.1.0/3' },
- { 'Australia/Darwin', 'ACST-9:30' },
- { 'Australia/Eucla', '<+0845>-8:45' },
- { 'Australia/Hobart', 'AEST-10AEDT,M10.1.0,M4.1.0/3' },
- { 'Australia/Lindeman', 'AEST-10' },
- { 'Australia/Lord Howe', '<+1030>-10:30<+11>-11,M10.1.0,M4.1.0' },
- { 'Australia/Melbourne', 'AEST-10AEDT,M10.1.0,M4.1.0/3' },
- { 'Australia/Perth', 'AWST-8' },
- { 'Australia/Sydney', 'AEST-10AEDT,M10.1.0,M4.1.0/3' },
- { 'Etc/GMT', 'GMT0' },
- { 'Etc/GMT+1', '<-01>1' },
- { 'Etc/GMT+10', '<-10>10' },
- { 'Etc/GMT+11', '<-11>11' },
- { 'Etc/GMT+12', '<-12>12' },
- { 'Etc/GMT+2', '<-02>2' },
- { 'Etc/GMT+3', '<-03>3' },
- { 'Etc/GMT+4', '<-04>4' },
- { 'Etc/GMT+5', '<-05>5' },
- { 'Etc/GMT+6', '<-06>6' },
- { 'Etc/GMT+7', '<-07>7' },
- { 'Etc/GMT+8', '<-08>8' },
- { 'Etc/GMT+9', '<-09>9' },
- { 'Etc/GMT-1', '<+01>-1' },
- { 'Etc/GMT-10', '<+10>-10' },
- { 'Etc/GMT-11', '<+11>-11' },
- { 'Etc/GMT-12', '<+12>-12' },
- { 'Etc/GMT-13', '<+13>-13' },
- { 'Etc/GMT-14', '<+14>-14' },
- { 'Etc/GMT-2', '<+02>-2' },
- { 'Etc/GMT-3', '<+03>-3' },
- { 'Etc/GMT-4', '<+04>-4' },
- { 'Etc/GMT-5', '<+05>-5' },
- { 'Etc/GMT-6', '<+06>-6' },
- { 'Etc/GMT-7', '<+07>-7' },
- { 'Etc/GMT-8', '<+08>-8' },
- { 'Etc/GMT-9', '<+09>-9' },
- { 'Europe/Amsterdam', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Andorra', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Astrakhan', '<+04>-4' },
- { 'Europe/Athens', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
- { 'Europe/Belgrade', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Berlin', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Bratislava', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Brussels', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Bucharest', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
- { 'Europe/Budapest', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Busingen', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Chisinau', 'EET-2EEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Copenhagen', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Dublin', 'IST-1GMT0,M10.5.0,M3.5.0/1' },
- { 'Europe/Gibraltar', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Guernsey', 'GMT0BST,M3.5.0/1,M10.5.0' },
- { 'Europe/Helsinki', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
- { 'Europe/Isle of Man', 'GMT0BST,M3.5.0/1,M10.5.0' },
- { 'Europe/Istanbul', '<+03>-3' },
- { 'Europe/Jersey', 'GMT0BST,M3.5.0/1,M10.5.0' },
- { 'Europe/Kaliningrad', 'EET-2' },
- { 'Europe/Kirov', '<+03>-3' },
- { 'Europe/Kyiv', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
- { 'Europe/Lisbon', 'WET0WEST,M3.5.0/1,M10.5.0' },
- { 'Europe/Ljubljana', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/London', 'GMT0BST,M3.5.0/1,M10.5.0' },
- { 'Europe/Luxembourg', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Madrid', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Malta', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Mariehamn', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
- { 'Europe/Minsk', '<+03>-3' },
- { 'Europe/Monaco', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Moscow', 'MSK-3' },
- { 'Europe/Oslo', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Paris', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Podgorica', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Prague', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Riga', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
- { 'Europe/Rome', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Samara', '<+04>-4' },
- { 'Europe/San Marino', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Sarajevo', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Saratov', '<+04>-4' },
- { 'Europe/Simferopol', 'MSK-3' },
- { 'Europe/Skopje', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Sofia', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
- { 'Europe/Stockholm', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Tallinn', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
- { 'Europe/Tirane', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Ulyanovsk', '<+04>-4' },
- { 'Europe/Vaduz', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Vatican', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Vienna', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Vilnius', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
- { 'Europe/Volgograd', '<+03>-3' },
- { 'Europe/Warsaw', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Zagreb', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Zurich', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Indian/Antananarivo', 'EAT-3' },
- { 'Indian/Chagos', '<+06>-6' },
- { 'Indian/Christmas', '<+07>-7' },
- { 'Indian/Cocos', '<+0630>-6:30' },
- { 'Indian/Comoro', 'EAT-3' },
- { 'Indian/Kerguelen', '<+05>-5' },
- { 'Indian/Mahe', '<+04>-4' },
- { 'Indian/Maldives', '<+05>-5' },
- { 'Indian/Mauritius', '<+04>-4' },
- { 'Indian/Mayotte', 'EAT-3' },
- { 'Indian/Reunion', '<+04>-4' },
- { 'Pacific/Apia', '<+13>-13' },
- { 'Pacific/Auckland', 'NZST-12NZDT,M9.5.0,M4.1.0/3' },
- { 'Pacific/Bougainville', '<+11>-11' },
- { 'Pacific/Chatham', '<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45' },
- { 'Pacific/Chuuk', '<+10>-10' },
- { 'Pacific/Easter', '<-06>6<-05>,M9.1.6/22,M4.1.6/22' },
- { 'Pacific/Efate', '<+11>-11' },
- { 'Pacific/Fakaofo', '<+13>-13' },
- { 'Pacific/Fiji', '<+12>-12<+13>,M11.2.0,M1.2.3/99' },
- { 'Pacific/Funafuti', '<+12>-12' },
- { 'Pacific/Galapagos', '<-06>6' },
- { 'Pacific/Gambier', '<-09>9' },
- { 'Pacific/Guadalcanal', '<+11>-11' },
- { 'Pacific/Guam', 'ChST-10' },
- { 'Pacific/Honolulu', 'HST10' },
- { 'Pacific/Kanton', '<+13>-13' },
- { 'Pacific/Kiritimati', '<+14>-14' },
- { 'Pacific/Kosrae', '<+11>-11' },
- { 'Pacific/Kwajalein', '<+12>-12' },
- { 'Pacific/Majuro', '<+12>-12' },
- { 'Pacific/Marquesas', '<-0930>9:30' },
- { 'Pacific/Midway', 'SST11' },
- { 'Pacific/Nauru', '<+12>-12' },
- { 'Pacific/Niue', '<-11>11' },
- { 'Pacific/Norfolk', '<+11>-11<+12>,M10.1.0,M4.1.0/3' },
- { 'Pacific/Noumea', '<+11>-11' },
- { 'Pacific/Pago Pago', 'SST11' },
- { 'Pacific/Palau', '<+09>-9' },
- { 'Pacific/Pitcairn', '<-08>8' },
- { 'Pacific/Pohnpei', '<+11>-11' },
- { 'Pacific/Port Moresby', '<+10>-10' },
- { 'Pacific/Rarotonga', '<-10>10' },
- { 'Pacific/Saipan', 'ChST-10' },
- { 'Pacific/Tahiti', '<-10>10' },
- { 'Pacific/Tarawa', '<+12>-12' },
- { 'Pacific/Tongatapu', '<+13>-13' },
- { 'Pacific/Wake', '<+12>-12' },
- { 'Pacific/Wallis', '<+12>-12' },
-}
+++ /dev/null
--- Licensed to the public under the Apache License 2.0.
-
-module "luci.sys.zoneinfo.tzoffset"
-
-OFFSET = {
- gmt = 0, -- GMT
- eat = 10800, -- EAT
- cet = 3600, -- CET
- wat = 3600, -- WAT
- cat = 7200, -- CAT
- eet = 7200, -- EET
- sast = 7200, -- SAST
- hst = -36000, -- HST
- hdt = -32400, -- HDT
- akst = -32400, -- AKST
- akdt = -28800, -- AKDT
- ast = -14400, -- AST
- est = -18000, -- EST
- cst = -21600, -- CST
- cdt = -18000, -- CDT
- mst = -25200, -- MST
- mdt = -21600, -- MDT
- pst = -28800, -- PST
- pdt = -25200, -- PDT
- nst = -12600, -- NST
- ndt = -9000, -- NDT
- aest = 36000, -- AEST
- aedt = 39600, -- AEDT
- nzst = 43200, -- NZST
- nzdt = 46800, -- NZDT
- hkt = 28800, -- HKT
- wib = 25200, -- WIB
- wit = 32400, -- WIT
- ist = 7200, -- IST
- idt = 10800, -- IDT
- pkt = 18000, -- PKT
- wita = 28800, -- WITA
- kst = 32400, -- KST
- jst = 32400, -- JST
- wet = 0, -- WET
- acst = 34200, -- ACST
- acdt = 37800, -- ACDT
- awst = 28800, -- AWST
- msk = 10800, -- MSK
- sst = -39600, -- SST
-}
+++ /dev/null
--- Copyright 2008 Steven Barth <steven@midlink.org>
--- Licensed to the public under the Apache License 2.0.
-
-local util = require "luci.util"
-local config = require "luci.config"
-local tparser = require "luci.template.parser"
-
-local tostring, pairs, loadstring = tostring, pairs, loadstring
-local setmetatable, loadfile = setmetatable, loadfile
-local getfenv, setfenv, rawget = getfenv, setfenv, rawget
-local assert, type, error = assert, type, error
-
---- LuCI template library.
-module "luci.template"
-
-config.template = config.template or {}
-viewdir = config.template.viewdir or util.libpath() .. "/view"
-
-
--- Define the namespace for template modules
-context = util.threadlocal()
-
---- Render a certain template.
--- @param name Template name
--- @param scope Scope to assign to template (optional)
-function render(name, scope)
- return Template(name):render(scope or getfenv(2))
-end
-
---- Render a template from a string.
--- @param template Template string
--- @param scope Scope to assign to template (optional)
-function render_string(template, scope)
- return Template(nil, template):render(scope or getfenv(2))
-end
-
-
--- Template class
-Template = util.class()
-
--- Shared template cache to store templates in to avoid unnecessary reloading
-Template.cache = setmetatable({}, {__mode = "v"})
-
-
--- Constructor - Reads and compiles the template on-demand
-function Template.__init__(self, name, template)
- if name then
- self.template = self.cache[name]
- self.name = name
- else
- self.name = "[string]"
- end
-
- -- Create a new namespace for this template
- self.viewns = context.viewns
-
- -- If we have a cached template, skip compiling and loading
- if not self.template then
-
- -- Compile template
- local err
- local sourcefile
-
- if name then
- sourcefile = viewdir .. "/" .. name .. ".htm"
- self.template, _, err = tparser.parse(sourcefile)
- else
- sourcefile = "[string]"
- self.template, _, err = tparser.parse_string(template)
- end
-
- -- If we have no valid template throw error, otherwise cache the template
- if not self.template then
- error("Failed to load template '" .. self.name .. "'.\n" ..
- "Error while parsing template '" .. sourcefile .. "':\n" ..
- (err or "Unknown syntax error"))
- elseif name then
- self.cache[name] = self.template
- end
- end
-end
-
-
--- Renders a template
-function Template.render(self, scope)
- scope = scope or getfenv(2)
-
- -- Put our predefined objects in the scope of the template
- setfenv(self.template, setmetatable({}, {__index =
- function(tbl, key)
- return rawget(tbl, key) or self.viewns[key] or scope[key]
- end}))
-
- -- Now finally render the thing
- local stat, err = util.copcall(self.template)
- if not stat then
- error("Failed to execute template '" .. self.name .. "'.\n" ..
- "A runtime error occurred: " .. tostring(err or "(nil)"))
- end
-end
+++ /dev/null
--- Licensed to the public under the Apache License 2.0.
-
-module "luci.version"
-
-distname = "Host System"
-distversion = "SDK"
-
-luciname = "LuCI"
-luciversion = "SVN"
+++ /dev/null
-<%#
- Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
- Licensed to the public under the Apache License 2.0.
--%>
-
-<%+header%>
-
-<h2 name="content"><%:Form token mismatch%></h2>
-<br />
-
-<p class="alert-message"><%:The submitted security token is invalid or already expired!%></p>
-
-<p><%:
- In order to prevent unauthorized access to the system, your request has
- been blocked. Click "Continue »" below to return to the previous page.
-%></p>
-
-<hr />
-
-<p class="right">
- <strong><a href="#" onclick="window.history.back();">Continue »</a></strong>
-</p>
-
-<%+footer%>
+++ /dev/null
-<%#
- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
- Copyright 2018 Daniel F. Dickinson <cshored@thecshore.com>
- Licensed to the public under the Apache License 2.0.
--%>
-
-<%+header%>
-
-<p>Component not present.</p>
-
-<%+footer%>
+++ /dev/null
-<%#
- Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
- Licensed to the public under the Apache License 2.0.
--%>
-
-<%+header%>
-<h2 name="content">404 <%:Not Found%></h2>
-<p><%:Sorry, the object you requested was not found.%></p>
-<p><%=message%></p>
-<tt><%:Unable to dispatch%>: <%=url(unpack(luci.dispatcher.context.request))%></tt>
-<%+footer%>
+++ /dev/null
-<%#
- Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
- Licensed to the public under the Apache License 2.0.
--%>
-
-<%+header%>
-<h2 name="content">500 <%:Internal Server Error%></h2>
-<p><%:Sorry, the server encountered an unexpected error.%></p>
-<pre class="error500"><%=message%></pre>
-<%+footer%>
+++ /dev/null
-<%#
- Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008-2019 Jo-Philipp Wich <jo@mein.io>
- Licensed to the public under the Apache License 2.0.
--%>
-
-<%
- local is_rollback_pending, rollback_time_remaining, rollback_session, rollback_token = luci.model.uci:rollback_pending()
-
- if is_rollback_pending or trigger_apply or trigger_revert then
-%>
- <script type="text/javascript">
- document.addEventListener("luci-loaded", function() {
- <% if trigger_apply then -%>
- L.ui.changes.apply(true);
- <%- elseif trigger_revert then -%>
- L.ui.changes.revert();
- <%- else -%>
- L.ui.changes.confirm(true, Date.now() + <%=rollback_time_remaining%> * 1000, <%=luci.http.write_json(rollback_token)%>);
- <%- end %>
- });
- </script>
-<%
- end
-
- include("themes/" .. theme .. "/footer")
-%>
+++ /dev/null
-<%#
- Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008-2019 Jo-Philipp Wich <jo@mein.io>
- Licensed to the public under the Apache License 2.0.
--%>
-
-<%
- if not luci.dispatcher.context.template_header_sent then
- include("themes/" .. theme .. "/header")
- luci.dispatcher.context.template_header_sent = true
- end
-
- local applyconf = luci.config and luci.config.apply
-%>
-
-<script type="text/javascript" src="<%=resource%>/promis.min.js"></script>
-<script type="text/javascript" src="<%=resource%>/luci.js"></script>
-<script type="text/javascript">
- L = new LuCI(<%= luci.http.write_json({
- token = token,
- media = media,
- resource = resource,
- scriptname = luci.http.getenv("SCRIPT_NAME"),
- pathinfo = luci.http.getenv("PATH_INFO"),
- documentroot = luci.http.getenv("DOCUMENT_ROOT"),
- requestpath = luci.dispatcher.context.requestpath,
- dispatchpath = luci.dispatcher.context.path,
- pollinterval = luci.config.main.pollinterval or 5,
- ubuspath = luci.config.main.ubuspath or '/ubus/',
- sessionid = luci.dispatcher.context.authsession,
- nodespec = luci.dispatcher.context.dispatched,
- apply_rollback = math.max(applyconf and applyconf.rollback or 90, 90),
- apply_holdoff = math.max(applyconf and applyconf.holdoff or 4, 1),
- apply_timeout = math.max(applyconf and applyconf.timeout or 5, 1),
- apply_display = math.max(applyconf and applyconf.display or 1.5, 1),
- rollback_token = rollback_token
- }) %>);
-</script>
+++ /dev/null
-<%#
- Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
- Licensed to the public under the Apache License 2.0.
--%>
-
-<% include("themes/" .. theme .. "/indexer") %>
\ No newline at end of file
+++ /dev/null
-<%#
- Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008-2012 Jo-Philipp Wich <jow@openwrt.org>
- Licensed to the public under the Apache License 2.0.
--%>
-
-<%+header%>
-
-<form method="post" action="<%=pcdata(FULL_REQUEST_URI)%>">
- <%- if fuser then %>
- <div class="alert-message warning">
- <p><%:Invalid username and/or password! Please try again.%></p>
- </div>
- <% end -%>
-
- <div class="cbi-map">
- <h2 name="content"><%:Authorization Required%></h2>
- <div class="cbi-map-descr">
- <%:Please enter your username and password.%>
- </div>
- <div class="cbi-section"><div class="cbi-section-node">
- <div class="cbi-value">
- <label class="cbi-value-title" for="luci_username"><%:Username%></label>
- <div class="cbi-value-field">
- <input class="cbi-input-text" type="text" name="luci_username" id="luci_username" autocomplete="username" value="<%=duser%>" />
- </div>
- </div>
- <div class="cbi-value cbi-value-last">
- <label class="cbi-value-title" for="luci_password"><%:Password%></label>
- <div class="cbi-value-field">
- <input class="cbi-input-text" type="password" name="luci_password" id="luci_password" autocomplete="current-password"/>
- </div>
- </div>
- </div></div>
- </div>
-
- <div class="cbi-page-actions">
- <input type="submit" value="<%:Login%>" class="btn cbi-button cbi-button-apply" />
- <input type="reset" value="<%:Reset%>" class="btn cbi-button cbi-button-reset" />
- </div>
-</form>
-<script type="text/javascript">//<![CDATA[
- var input = document.getElementsByName('luci_password')[0];
- if (input)
- input.focus();
-//]]></script>
-
-<%
-local uci = require "luci.model.uci".cursor()
-local fs = require "nixio.fs"
-local https_key = uci:get("uhttpd", "main", "key")
-local https_port = uci:get("uhttpd", "main", "listen_https")
-if type(https_port) == "table" then
- https_port = https_port[1]
-end
-
-if https_port and fs.access(https_key) then
- https_port = https_port:match("(%d+)$")
-%>
-
-<script type="text/javascript">//<![CDATA[
- if (document.location.protocol != 'https:') {
- var url = 'https://' + window.location.hostname + ':' + '<%=https_port%>' + window.location.pathname;
- var img=new Image;
- img.onload=function(){window.location = url};
- img.src='https://' + window.location.hostname + ':' + '<%=https_port%>' + '<%=resource%>/icons/loading.gif?' + Math.random();
- setTimeout(function(){
- img.src=''
- }, 5000);
- }
-//]]></script>
-
-<% end %>
-
-<%+footer%>
+++ /dev/null
-<%+header%>
-
-<div id="view">
- <div class="spinning"><%:Loading view…%></div>
- <script type="text/javascript">
- L.require('ui').then(function(ui) {
- ui.instantiateView('<%=view%>');
- });
- </script>
-</div>
-
-<%+footer%>
+++ /dev/null
--- Copyright 2008 Steven Barth <steven@midlink.org>
--- Licensed to the public under the Apache License 2.0.
-
-local tparser = require "luci.template.parser"
-local string = require "string"
-
-local tostring = tostring
-
-module "luci.xml"
-
---
--- String and data manipulation routines
---
-
-function pcdata(value)
- return value and tparser.pcdata(tostring(value))
-end
-
-function striptags(value)
- return value and tparser.striptags(tostring(value))
-end
-
-
--- also register functions above in the central string class for convenience
-string.pcdata = pcdata
-string.striptags = striptags
+++ /dev/null
----[[
-LuCI utility functions.
-]]
-module "luci.xml"
-
----[[
-Create valid XML PCDATA from given string.
-
-@class function
-@name pcdata
-@param value String value containing the data to escape
-@return String value containing the escaped data
-]]
-
----[[
-Strip HTML tags from given string.
-
-@class function
-@name striptags
-@param value String containing the HTML text
-@return String with HTML tags stripped of
-]]
-
msgid "ATM device number"
msgstr "رقم جهاز ATM"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "معرف مزود نظام ATU-C"
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "قدرة الإرسال الإجمالية (ACTATP)"
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "المرفق"
msgid "Authoritative"
msgstr "موثوق"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "التفويض مطلوب"
msgid "Back to Overview"
msgstr "الرجوع إلى الملخص"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "الرجوع إلى التشكيل"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr "نسخ احتياطي / فلاش firmware"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "قائمة ملفات النسخ الاحتياطي"
msgstr "الفاصل الزمني بين العلامات"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
msgstr ""
"أغلق الاتصال غير النشط بعد مقدار الثواني المحدد ، واستخدم 0 لاستمرار الاتصال"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "إغلاق القائمة ..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr "عنوان DS-Lite AFTR"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "حالة DSL"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "معدل البيانات"
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr "الثواني الخطأ (ES)"
msgid "Force use of NAT-T"
msgstr "فرض استخدام NAT-T"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr "رمز النموذج غير متطابق"
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr "ثواني تصحيح الخطأ الأمامي (FECS)"
msgid "Global network options"
msgstr "خيارات الشبكة العالمية"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "قطع الخط"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr "رمز أخطاء (HEC)"
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "داخلي"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "خطأ في الخادم الداخلي"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr "الفاصل الزمني لإرسال حزم التعلم"
msgid "Invalid hexadecimal value"
msgstr "قيمة سداسية عشرية غير صالحة"
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "اسم المستخدم و / أو كلمة المرور غير صالحة! حاول مرة اخرى."
"يبدو أنك تحاول وميض صورة لا تتناسب مع ذاكرة الفلاش ، يرجى التحقق من ملف "
"الصورة!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "وقت الإستجابة"
msgid "Limit"
msgstr "حد"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr "توهين الخط (LATN)"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr "وضع الخط"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr "حالة الخط"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "جهوزية الخط"
msgstr "تحميل محتويات الدليل …"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "جارٍ تحميل العرض…"
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr "الشبكة المنطقية التي سيتم إضافة النفق إليها (جسور) (اختياري)."
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "تسجيل الدخول"
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr "فقدان ثانية الإشارة (LOSS)"
msgid "Lowest leased address as offset from the network address."
msgstr "أقل عنوان مؤجر تمت إزاحته من عنوان الشبكة."
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr "الأعلى. معدل البيانات الممكن تحقيقه (ATTNDR)"
msgid "No RX signal"
msgstr "لا توجد إشارة RX"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "لا توجد إدخالات في هذا الدليل"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "لا توجد ملفات"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "التشويش"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr "هامش التشويش (SNR)"
msgid "Noise:"
msgstr "التشويش:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr "أخطاء CRC غير استباقية (CRC_P)"
msgid "Normal"
msgstr "عادي"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "غير موجود"
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "فتح القائمة ..."
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "كلمة المرور"
msgid "Pkts."
msgstr "الحزم."
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "الرجاء إدخال اسم المستخدم وكلمة المرور الخاصة بك."
msgid "Potential negation of: %s"
msgstr "النفي المحتمل ل: s%"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "وضع إدارة الطاقة"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr "أخطاء CRC الاستباقية (CRCP_P)"
msgstr "سياسة إعادة الاختيار للمستخدم الأساسي"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr "الثواني التي بها أخطاء جسيمة (SES)"
msgstr "لمحة سريعة"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "إظهار قائمة ملفات النسخ الاحتياطي الحالية"
msgid "Signal / Noise"
msgstr "إشارة / تشويش"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "توهين الإشارة (SATN)"
msgid "Some fields are invalid, cannot save values!"
msgstr "بعض الحقول غير صالحة ، لا يمكن حفظ القيم!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "عذرا ، الشيء الذي طلبته لم يتم العثور عليه."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "عذرا ، واجه الخادم خطأ غير متوقع."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "الحالة"
msgid "System log buffer size"
msgstr "حجم المخزن المؤقت لسجل النظام"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "وضع%s المحدد غير متوافق مع تشفير%s"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr "رمز الأمان المقدم غير صالح أو انتهت صلاحيته بالفعل!"
msgid "There are no changes to apply"
msgstr "لا توجد تغييرات لتطبيقها"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr "لا يبدو هذا كملف PEM صالح"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr "تعذر تحديد واجهة المنبع"
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "غير قادر على الإرسال"
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr "الثواني غير المتاحة (UAS)"
msgid "User key (PEM encoded)"
msgstr "مفتاح المستخدم (مشفر PEM)"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "اسم المستخدم"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "إرجع >>"
+#~ msgid "Back to configuration"
+#~ msgstr "الرجوع إلى التشكيل"
+
+#~ msgid "Close list..."
+#~ msgstr "إغلاق القائمة ..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "خطأ في الخادم الداخلي"
+
+#~ msgid "No files found"
+#~ msgstr "لا توجد ملفات"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "عذرا ، واجه الخادم خطأ غير متوقع."
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
#~ "لا تقم بإعادة توجيه الطلبات التي لا يمكن الرد عليها بواسطة خوادم الأسماء "
msgid "ATM device number"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr ""
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr ""
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr ""
msgid "Authoritative"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr ""
msgid "Back to Overview"
msgstr "Обратно към Общ преглед"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Обратно към Конфигуриране"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr "Архивиране / Флаш на фърмуера"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Списък с файлове за архивиране"
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"Затваряне на неактивна връзка след зададения брой секунди, използвайте 0, за "
"да запазите връзката"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Затвори списъка..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr ""
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr ""
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr ""
msgid "Force use of NAT-T"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr ""
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
msgid "Global network options"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr ""
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr ""
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "Невалидно потребителско име и/или парола! Моля, опитайте отново."
"Изглежда, че се опитвате да флашнете фирмуеър, което не се побира във флаш "
"паметта, моля, проверете файла с изображението!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr ""
msgid "Limit"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr ""
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr ""
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
msgid "Lowest leased address as offset from the network address."
msgstr ""
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr ""
msgid "No RX signal"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr ""
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr ""
msgid "Noise:"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr ""
msgid "Normal"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr ""
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr ""
msgid "Pkts."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Моля, въведете потребителско име и парола."
msgid "Potential negation of: %s"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr ""
msgid "Signal / Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr ""
msgid "Some fields are invalid, cannot save values!"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr ""
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Статус"
msgid "System log buffer size"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr ""
msgid "There are no changes to apply"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr ""
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr ""
msgid "User key (PEM encoded)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Потребителско име"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr ""
+#~ msgid "Back to configuration"
+#~ msgstr "Обратно към Конфигуриране"
+
+#~ msgid "Close list..."
+#~ msgstr "Затвори списъка..."
+
#, fuzzy
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
msgid "ATM device number"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr ""
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr ""
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr ""
msgid "Authoritative"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr ""
msgid "Back to Overview"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr ""
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"persist connection"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr ""
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr ""
msgid "DUID"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr ""
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr ""
msgid "Force use of NAT-T"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr ""
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
msgid "Global network options"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr ""
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr ""
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr ""
"flash memory, please verify the image file!"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr ""
msgid "Limit"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr ""
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr ""
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
msgid "Lowest leased address as offset from the network address."
msgstr ""
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr ""
msgid "No RX signal"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr ""
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr ""
msgid "Noise:"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr ""
msgid "Normal"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr ""
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr ""
msgid "Pkts."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr ""
msgid "Potential negation of: %s"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr ""
msgid "Signal / Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr ""
msgid "Some fields are invalid, cannot save values!"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr ""
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "অবস্থা"
msgid "System log buffer size"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr ""
msgid "There are no changes to apply"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr ""
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr ""
msgid "User key (PEM encoded)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr ""
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "ATM device number"
msgstr "Número de dispositiu ATM"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "Identificador del proveïdor del sistema ATU-C"
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
#, fuzzy
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "Potència de transmissió agregada (ACTATP)"
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Annex"
msgid "Authoritative"
msgstr "Autoritzada"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Es requereix autenticació"
msgid "Back to Overview"
msgstr "Enrere al Resum"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Enrere a la configuració"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr "Còpia de seguretat i microprogramari"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Llista de còpies de seguretat"
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"persist connection"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Tanca la llista..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr ""
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr ""
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr ""
msgid "Force use of NAT-T"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr ""
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
msgid "Global network options"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Penja"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr ""
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "Intern"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "Error de servidor intern"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "Usuari i/o contrasenya invàlids! Si us plau prova-ho de nou."
"Sembla que intentes actualitzar una imatge que no hi cap a la memòria flaix, "
"si us plau verifica el fitxer d'imatge!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "Latència"
msgid "Limit"
msgstr "Límit"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr ""
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Entra"
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
msgid "Lowest leased address as offset from the network address."
msgstr ""
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr ""
msgid "No RX signal"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Cap fitxer trobat"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Soroll"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr ""
msgid "Noise:"
msgstr "Soroll:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr ""
msgid "Normal"
msgstr "Normal"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "No trobat"
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Obre una llista..."
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Contrasenya"
msgid "Pkts."
msgstr "Paquets"
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Si us plau entra el teu nom d'usuari i contrasenya."
msgid "Potential negation of: %s"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr ""
msgid "Signal / Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr ""
msgid "Some fields are invalid, cannot save values!"
msgstr "No es pot desar els valors perquè alguns camps estan invàlids!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "Tristament, l'object que heu sol·licitat no s'ha trobat."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "Tristament, el servidor ha encontrat un error inesperat."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Estat"
msgid "System log buffer size"
msgstr "Mida de la memòria intermèdia per al registre del sistema"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr ""
msgid "There are no changes to apply"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr ""
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr ""
msgid "User key (PEM encoded)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Nom d'usuari"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Enrere"
+#~ msgid "Back to configuration"
+#~ msgstr "Enrere a la configuració"
+
+#~ msgid "Close list..."
+#~ msgstr "Tanca la llista..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "Error de servidor intern"
+
+#~ msgid "No files found"
+#~ msgstr "Cap fitxer trobat"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "Tristament, el servidor ha encontrat un error inesperat."
+
#~ msgid "Default %d"
#~ msgstr "%d per defecte"
msgid "ATM device number"
msgstr "číslo ATM zařízení"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "ATU-C identifikace výrobce systému"
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "Celkový vysílací výkon (ACTATP)"
msgstr "Volitelný, krátký popis zařízení"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Annex"
msgid "Authoritative"
msgstr "Autoritativní"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Vyžadováno ověření se"
msgid "Back to Overview"
msgstr "Zpět na přehled"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Zpět na nastavení"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr "Zálohovat / nahrát firmware"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Seznam souborů k zálohování"
msgstr "Interval majáku (beacon)"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"Uzavírat neaktivní spojení po daném počtu sekund. Pro vypnutí časového "
"omezení použijte jako hodntu nulu"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Zavřít seznam…"
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "Stav DSL"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "Rychlost přenosu dat"
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr "Sekund s chybami (ES)"
msgid "Force use of NAT-T"
msgstr "Vynutit použití NAT-T"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr "Neshoda tokenu formuláře"
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr "Dopředné korekce chyb v sekundách (FECS)"
msgid "Global network options"
msgstr "Globální možnosti sítě"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Zavěsit"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr "Chyby kódu hlavičky (HEC)"
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "Interní"
-# Není co dodat.
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "Vnitřní chyba serveru"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr "Neplatná šestnáctková hodnota"
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "Špatné uživatelské jméno a/nebo heslo! Prosím zkuste to znovu."
"Vypadadá to, že se pokoušíte zapsat obraz, který se nevejde do flash paměti. "
"Prosím ověřte soubor s obrazem!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "Odezva"
msgid "Limit"
msgstr "Limit"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr "Útlum vedení (LATN)"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr "Režim linky"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr "Stav linky"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "Line Uptime"
msgstr "Načítání obsahu adresáře…"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "Načítání zobrazení…"
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Přihlásit"
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr "Ztráta signálních sekund (LOSS)"
msgid "Lowest leased address as offset from the network address."
msgstr "Nejnižší zapůjčenou adresu použít jako offset síťové adresy."
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr "Max. dosažitelná rychlost přenosu dat (ATTNDR)"
msgid "No RX signal"
msgstr "Žádný signál RX"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "V tomto adresáři nejsou žádné položky"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Nebyly nalezeny žádné soubory"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Šum"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr "Odstup signálu od šumu (SNR)"
msgid "Noise:"
msgstr "Šum:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr "Nepreemptivní CRC chyby (CRC_P)"
msgid "Normal"
msgstr "Normální"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "Nenalezeno"
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Otevřít seznam..."
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Heslo"
msgid "Pkts."
msgstr "paketů"
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Prosím vložte vaše uživatelské jméno a heslo."
msgid "Potential negation of: %s"
msgstr "Potenciální negace: %s"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "Režim řízení spotřeby"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr "Preemptivní chyby CRC (CRCP_P)"
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr "Silně chybné sekundy (SES)"
msgstr "Krátká preambule"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "Ukázat aktuální seznam záložních souborů"
msgid "Signal / Noise"
msgstr "Signál / šum"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "Útlum signálu (SATN)"
msgid "Some fields are invalid, cannot save values!"
msgstr "Některá pole obsahují neplatné hodnoty, nelze uložit!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "Omlouváme se, ale požadovaný objekt nebyl nalezen."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "Omlouváme se, na serveru došlo k neočekávané vyjímce."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Stav"
msgid "System log buffer size"
msgstr "Velikost bufferu systémového logu"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "Vybraný režim %s není kompatibilní s šifrováním %s"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr "Odeslaný bezpečnostní token je neplatný nebo již vypršel!"
msgid "There are no changes to apply"
msgstr "Žádné změny k provedení"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr "Toto nevypadá jako platný PEM soubor"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
#, fuzzy
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
msgid "Unable to determine upstream interface"
msgstr "Nelze určit odchozí WAN rozhraní"
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "Nelze odeslat"
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr "Počet nedostupných sekund (UAS)"
msgid "User key (PEM encoded)"
msgstr "Uživatelský klíč (PEM formát)"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Uživatelské jméno"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Zpět"
+#~ msgid "Back to configuration"
+#~ msgstr "Zpět na nastavení"
+
+#~ msgid "Close list..."
+#~ msgstr "Zavřít seznam…"
+
+# Není co dodat.
+#~ msgid "Internal Server Error"
+#~ msgstr "Vnitřní chyba serveru"
+
+#~ msgid "No files found"
+#~ msgstr "Nebyly nalezeny žádné soubory"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "Omlouváme se, na serveru došlo k neočekávané vyjímce."
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
#~ "Nepřeposílat požadavky, které nemohou být zodpovězeny veřejnými jmennými "
msgid "ATM device number"
msgstr "ATM-enhedsnummer"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "ATU-C-systemleverandør-id"
msgid "Aggregate Originator Messages"
msgstr "Aggregerede meddelelser fra afsender"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "ACTATP (Aggregate Transmit Power)"
msgstr "En valgfri, kort beskrivelse af denne enhed"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Bilag"
msgid "Authoritative"
msgstr "Autoritativ"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Autorisation påkrævet"
msgid "Back to Overview"
msgstr "Tilbage til Oversigt"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Tilbage til konfiguration"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr "Tilbage til peer-konfiguration"
msgstr "Backup / Flash Firmware"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Liste over backup-filer"
msgstr "Beacon-interval"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"Luk inaktiv forbindelse efter det angivne antal sekunder, brug 0 for at "
"opretholde forbindelsen"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Luk liste..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr "DS-Lite AFTR-adresse"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "DSL Status"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "Datahastighed"
msgid "Error getting PublicKey"
msgstr "Fejl ved hentning af Offentlig nøgle"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr "Fejlede sekunder (ES)"
msgid "Force use of NAT-T"
msgstr "Tving brug af NAT-T"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr "Form token uoverensstemmelse"
"Videresend DHCPv6-meddelelser mellem den udpegede master interface og "
"downstream-interfaces."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr "Fecs (Forward Error Correction Seconds)"
msgid "Global network options"
msgstr "Globale netværksindstillinger"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr "Gå til opgradering af firmware..."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Læg på"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr "Header Error Code Errors (HEC)"
"avoidance for at undgå broadcast loops, der kan få hele LAN'et til at gå i "
"stå."
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "Intern"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "Intern serverfejl"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr "Interval for afsendelse af læringspakker"
msgid "Invalid hexadecimal value"
msgstr "Ugyldig hexadecimal værdi"
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "Ugyldigt brugernavn og/eller password! Prøv venligst igen."
"Det ser ud til, at du forsøger at flashe et image, der ikke passer ind i "
"flashhukommelsen, kontrollere venligst imagefilen!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr "Sidste medlemsinterval"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "Latency"
msgid "Limit"
msgstr "Grænse"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr "Linjedæmpning (LATN)"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr "Linjetilstand"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr "Linjetilstand"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "Linje oppetid"
msgstr "Indlæser mappeindhold…"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "Indlæser visning…"
msgstr ""
"Logisk netværk, som tunnelen skal tilføjes til (overbrygges) (valgfrit)."
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Login"
msgid "Loose filtering"
msgstr "Løs filtrering"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr "Sekunder med tab af signal (LOSS)"
msgid "Lowest leased address as offset from the network address."
msgstr "Laveste leased adresse som forskydning fra netværksadressen."
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr "Max <abbr title=\"Router Advertisement\">RA</abbr>-interval"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr "Max. opnåelig datahastighed (ATTNDR)"
msgid "No RX signal"
msgstr "Intet RX-signal"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "Ingen poster i denne mappe"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Ingen filer fundet"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr "Der er ikke indlæst noget nftables-regelsæt."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Støj"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr "Støjmargin (SNR)"
msgid "Noise:"
msgstr "Støj:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr "Ikke-forebyggende CRC-fejl (CRC_P)"
msgid "Normal"
msgstr "Normal"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "Blev ikke fundet"
msgstr "Åbn oversigt over iptables-regler…"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Åbn listen..."
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr "Pass-through (spejler fysisk enhed til et enkelt MAC VLAN)"
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Adgangskode"
msgid "Pkts."
msgstr "Pkts."
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Indtast venligst dit brugernavn og din adgangskode."
msgid "Potential negation of: %s"
msgstr "Potentiel negation af: %s"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "Strømstyringstilstand"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr "Forudgående CRC-fejl (CRCP_P)"
msgstr "Politik for genvalg af primærslave"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr "Opsætning af ruter til proxied IPv6-naboer."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr "Alvorligt fejlbehæftede sekunder (SES)"
msgstr "Kort præambel"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "Vis den aktuelle backup-fil liste"
msgid "Signal / Noise"
msgstr "Signal / støj"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "Signaldæmpning (SATN)"
msgid "Some fields are invalid, cannot save values!"
msgstr "Nogle felter er ugyldige, kan ikke gemme værdier!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "Beklager, det objekt, du anmodede om, blev ikke fundet."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "Beklager, serveren stødte på en uventet fejl."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Status"
msgid "System log buffer size"
msgstr "Størrelse af systemlogbuffer"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "Den valgte %s-modus er ikke kompatibel med %s-kryptering"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr "Den indsendte sikkerhedstoken er ugyldigt eller allerede udløbet!"
msgid "There are no changes to apply"
msgstr "Der er ingen ændringer at anvende"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr "Dette ligner ikke en gyldig PEM-fil"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr "Kan ikke bestemme upstream interface"
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "Kan ikke sendes"
msgid "Unable to verify PIN"
msgstr "PIN-koden kunne ikke bekræftes"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr "Ikke-tilgængelige sekunder (UAS)"
msgid "User key (PEM encoded)"
msgstr "Brugernøgle (PEM kodet)"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Brugernavn"
msgid "You may add multiple records for the same domain."
msgstr "Du kan tilføje flere akter for det samme domæne."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Tilbage"
+#~ msgid "Back to configuration"
+#~ msgstr "Tilbage til konfiguration"
+
+#~ msgid "Close list..."
+#~ msgstr "Luk liste..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "Intern serverfejl"
+
+#~ msgid "No files found"
+#~ msgstr "Ingen filer fundet"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "Beklager, serveren stødte på en uventet fejl."
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
#~ "Videresend ikke forespørgsler, som ikke kan besvares af offentlige "
msgid "ATM device number"
msgstr "ATM Adapterindex"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "<abbr title=\"Internet Protokoll Version 4\">IPv4</abbr>-Adresse"
msgid "Aggregate Originator Messages"
msgstr "Originator-Nachrichten aggregieren"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "Vollständige Sendeleistung (ACTATP)"
msgstr "Kurze, optionale Beschreibung dieses Gerätes"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Anhang"
msgid "Authoritative"
msgstr "Authoritativ"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Autorisierung benötigt"
msgid "Back to Overview"
msgstr "Zurück zur Übersicht"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Zurück zur Konfiguration"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr "Zurück zur Konfiguration des Verbindungspartners"
msgstr "Backup / Firmware Update"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Liste zu sichernder Dateien"
msgstr "Beacon-Intervall"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"Inaktive Verbindungen nach Ablauf dieser Zeit in Sekunden schließen (0 um "
"die Verbindung immer aufrecht zu erhalten)"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Schließe Liste..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr "DS-Lite AFTR-Adresse"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "DSL-Status"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "Datenrate"
msgid "Error getting PublicKey"
msgstr "Fehler beim Abruf des öffentlichen Schlüssels"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr "Fehlersekunden (ES)"
msgid "Force use of NAT-T"
msgstr "Benutzung von NAT-T erzwingen"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr "Abweichendes Formular-Token"
"DHCPv6-Nachrichten zwischen der Master-Schnittstelle und nachgelagerten "
"Schnittstellen weiterleiten."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr "Fehlerkorrektursekunden (FECS)"
msgid "Global network options"
msgstr "Globale Netzwerkeinstellungen"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr "Gehe zum Firmware Upgrade..."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Auflegen"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr "Anzahl Header-Error-Code-Fehler (HEC)"
"Vermeidung zu aktivieren um Broadcast-Schleifen zu vermeiden welche das "
"Netzwerk stark beeinträchtigen können."
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "Intern"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "Interner Serverfehler"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr "Intervall für das Senden von Lernpaketen"
msgid "Invalid hexadecimal value"
msgstr "Ungültiger Hexadezimalwert"
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr ""
"Ungültiger Benutzername oder ungültiges Passwort! Bitte erneut versuchen."
"Das verwendete Image scheint zu groß für den internen Flash-Speicher zu "
"sein. Überprüfen Sie die Imagedatei!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr "Letzter-Teilnehmer-Intervall"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "Latenz"
msgid "Limit"
msgstr "Limit"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr "Dämpfung (LATN)"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr "Verbindungsmodus"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr "Verbindungsstatus"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "Verbindungsdauer"
msgstr "Lade Verzeichniseinträge…"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "Lade Seite…"
"Logisches Netzwerk, zu dem der Tunnel hinzugefügt wird (überbrückt) "
"(optional)."
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Anmelden"
msgid "Loose filtering"
msgstr "offene Filterung"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr "Signalverlustsekunden (LOSS)"
msgid "Lowest leased address as offset from the network address."
msgstr "Kleinste vergebene Adresse (Netzwerkadresse + x)."
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr "Maximales <abbr title=\"Router Advertisement\">RA</abbr>-Intervall"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr "Maximal erreichbare Datenrate (ATTNDR)"
msgid "No RX signal"
msgstr "Kein Signal empfangen"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "Keine Einträge in diesem Verzeichnis"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Keine Dateien gefunden"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr "Kein nftables-Regelwerk geladen."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Rauschen"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr "Signal-Rausch-Abstand (SNR)"
msgid "Noise:"
msgstr "Rauschen:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr "Nicht-präemptive CRC-Fehler (CRC_P)"
msgid "Normal"
msgstr "Normal"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "Nicht Gefunden"
msgstr "Übersicht der iptables-Regeln öffnen…"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Liste öffnen..."
msgstr ""
"Pass-through (Physischen Netzwerkadapter auf einzelnes MAC-VLAN spiegeln)"
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Passwort"
msgid "Pkts."
msgstr "Pkte."
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Bitte Benutzernamen und Passwort eingeben."
msgid "Potential negation of: %s"
msgstr "Mögliche Negation von: %s"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "Energiesparmodus"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr "Präemptive CRC-Fehler (CRCP_P)"
msgstr "Neuauswahlrichtlinie für primären Slave"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
"Netzwerkrouten für IPv6-Nachbarn installieren, die durch den NDP-Proxy "
"behandelt werden."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr "schwerwiegende Fehlersekunden (SES)"
msgstr "Kurze Präambel"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "Zeige aktuelle Liste der gesicherten Dateien"
msgid "Signal / Noise"
msgstr "Signal / Rauschen"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "Signaldämpfung (SATN)"
msgid "Some fields are invalid, cannot save values!"
msgstr "Einige Felder sind ungültig, kann das Formular nicht speichern!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "Entschuldigung, das anfgeforderte Objekt wurde nicht gefunden."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr ""
-"Entschuldigung, auf dem Server ist ein unerwarteter Fehler aufgetreten."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Status"
msgid "System log buffer size"
msgstr "Größe des Systemprotokoll-Puffers"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
"Der ausgewählte \"%s\" Betriebsmodus ist nicht kompatibel mit %s-"
"Verschlüsselung"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr ""
"Das mitgesendete Sicherheits-Token ist ungültig oder bereits abgelaufen!"
msgid "There are no changes to apply"
msgstr "Es gibt keine anzuwendenden Änderungen"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr "Dies scheint keine gültige PEM-Datei zu sein"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr "Upstream-Netzwerkadapter konnte nicht bestimmt werden"
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "Kann Anfrage nicht zustellen"
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr "Nicht verfügbare Sekunden (UAS)"
msgid "User key (PEM encoded)"
msgstr "PEM-kodierter Benutzerschlüssel"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Benutzername"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Zurück"
+#~ msgid "Back to configuration"
+#~ msgstr "Zurück zur Konfiguration"
+
+#~ msgid "Close list..."
+#~ msgstr "Schließe Liste..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "Interner Serverfehler"
+
+#~ msgid "No files found"
+#~ msgstr "Keine Dateien gefunden"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr ""
+#~ "Entschuldigung, auf dem Server ist ein unerwarteter Fehler aufgetreten."
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
#~ "Keine Anfragen weiterleiten welche nicht durch öffentliche Server "
msgid "ATM device number"
msgstr "Αριθμός συσκευής ATM"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "Αναγνωριστικό προμηθευτή συστήματος ATU-C"
msgid "Aggregate Originator Messages"
msgstr "Συγκεντρωτικά μηνύματα προέλευσης"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "Συνολική ισχύς μετάδοσης (ACTATP)"
msgstr "Μια προαιρετική, σύντομη περιγραφή για αυτήν τη συσκευή"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Annex"
msgid "Authoritative"
msgstr "Κύριος"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Απαιτείται Εξουσιοδότηση"
msgid "Back to Overview"
msgstr "Πίσω προς Επισκόπηση"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Πίσω προς παραμετροποίηση"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr "Αντίγραφο ασφαλείας / Εγγραφή FLASH Υλικολογισμικό"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Λίστα αρχείων για αντίγραφο ασφαλείας"
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"δευτερολέπτων, χρησιμοποιήστε 0 για να εξακολουθούν να υφίστανται επ' "
"αόριστον"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Κλείσιμο λίστας..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr ""
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr ""
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr ""
msgid "Force use of NAT-T"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr ""
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
msgid "Global network options"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Κρέμασμα"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr ""
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr ""
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "Άκυρο όνομα χρήστη και/ή κωδικός πρόσβασης! Παρακαλώ προσπαθήστε ξανά."
"Φαίνεται πως προσπαθείτε να φλασάρετε μια εικόνα που δεν χωράει στην μνήμη "
"flash, παρακαλώ επιβεβαιώστε το αρχείο εικόνας!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr ""
msgid "Limit"
msgstr "Όριο"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr ""
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Σύνδεση"
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
msgid "Lowest leased address as offset from the network address."
msgstr ""
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr ""
msgid "No RX signal"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Δε βρέθηκαν αρχεία"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Θόρυβος"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr ""
msgid "Noise:"
msgstr "Θόρυβος:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr ""
msgid "Normal"
msgstr "Φυσιολογικό"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr ""
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Κωδικός Πρόσβασης"
msgid "Pkts."
msgstr "Πκτ."
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Παρακαλώ εισάγετε όνομα χρήστη και κωδικό πρόσβασης."
msgid "Potential negation of: %s"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr ""
msgid "Signal / Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr ""
msgid "Some fields are invalid, cannot save values!"
msgstr "Κάποια πεδία δεν είναι έγκυρα, δεν μπορούν να αποθηκευτούν οι τιμές!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr ""
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Κατάσταση"
msgid "System log buffer size"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr ""
msgid "There are no changes to apply"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr ""
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr ""
msgid "User key (PEM encoded)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Όνομα Χρήστη"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Πίσω"
+#~ msgid "Back to configuration"
+#~ msgstr "Πίσω προς παραμετροποίηση"
+
+#~ msgid "Close list..."
+#~ msgstr "Κλείσιμο λίστας..."
+
+#~ msgid "No files found"
+#~ msgstr "Δε βρέθηκαν αρχεία"
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
#~ "Να μην προωθούνται αιτήματα τα οποία δεν μπορούν να απαντηθούν από "
msgid "ATM device number"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr ""
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr ""
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr ""
msgid "Authoritative"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr ""
msgid "Back to Overview"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr ""
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"persist connection"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr ""
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr ""
msgid "DUID"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr ""
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr ""
msgid "Force use of NAT-T"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr ""
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
msgid "Global network options"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr ""
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr ""
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr ""
"flash memory, please verify the image file!"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr ""
msgid "Limit"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr ""
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr ""
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
msgid "Lowest leased address as offset from the network address."
msgstr ""
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr ""
msgid "No RX signal"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr ""
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr ""
msgid "Noise:"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr ""
msgid "Normal"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr ""
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr ""
msgid "Pkts."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr ""
msgid "Potential negation of: %s"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr ""
msgid "Signal / Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr ""
msgid "Some fields are invalid, cannot save values!"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr ""
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr ""
msgid "System log buffer size"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr ""
msgid "There are no changes to apply"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr ""
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr ""
msgid "User key (PEM encoded)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr ""
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "ATM device number"
msgstr "Número de dispositivo ATM"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "ID del proveedor del sistema ATU-C"
msgid "Aggregate Originator Messages"
msgstr "Mensajes de originador agregados"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "Potencia de transmisión agregada (ACTATP)"
msgstr "Una breve descripción opcional de este dispositivo"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Anexo"
msgid "Authoritative"
msgstr "Autorizado"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Autorización requerida"
msgid "Back to Overview"
msgstr "Volver al resumen"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Volver a la configuración"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr "Volver a la configuración de pares"
msgstr "Respaldo / Grabar firmware"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Copia de seguridad de la lista de archivos"
msgstr "Intervalo de baliza"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"Cerrar las conexiones inactivas tras los segundos dados. Use 0 para una "
"conexión permanente"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Cerrar lista..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr "Dirección DS-Lite AFTR"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "Estado DSL"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "Velocidad de datos"
msgid "Error getting PublicKey"
msgstr "Error al obtener PublicKey"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr "Segundos errados (ES)"
msgid "Force use of NAT-T"
msgstr "Forzar uso de NAT-T"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr "No coincide el token del formulario"
"Reenvíe mensajes DHCPv6 entre la interfaz maestra designada y las interfaces "
"descendentes."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr "Segundos de corrección de errores de reenvío (FECS)"
msgid "Global network options"
msgstr "Opciones globales de red"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr "Ir a actualización de firmware..."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Suspender"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr "Errores de código de error de encabezado (HEC)"
"prevención de bucles de puente para evitar bucles de difusión que pueden "
"paralizar toda la LAN."
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "Interno"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "Error interno del servidor"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr "Intervalo para enviar paquetes de aprendizaje"
msgid "Invalid hexadecimal value"
msgstr "Valor hexadecimal inválido"
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "¡Nombre de usuario y/o contraseña no válidos! Por favor reintente."
"Parece que está intentando grabar una imagen de firmware mayor que la "
"memoria flash de su equipo. ¡Por favor, verifique el archivo!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr "Intervalo del último miembro"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "Latencia"
msgid "Limit"
msgstr "Límite"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr "Atenuación de línea (LATN)"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr "Modo de línea"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr "Estado de línea"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "Tiempo de actividad de línea"
msgstr "Cargando el contenido del directorio…"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "Cargando vista…"
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr "Red lógica a la que se agregará al túnel (puenteado) (opcional)."
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Iniciar sesión"
msgid "Loose filtering"
msgstr "Filtrado suelto"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr "Pérdida de segundos de señal (LOSS)"
msgid "Lowest leased address as offset from the network address."
msgstr "Dirección asignada más baja como compensación de la dirección de red."
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr "Intervalo máximo de <abbr title=\"Router Advertisement\">RA</abbr>"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr "Max. velocidad de datos alcanzable (ATTNDR)"
msgid "No RX signal"
msgstr "No hay señal RX"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "No hay entradas en este directorio"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "No se han encontrado archivos"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
#, fuzzy
msgid ""
msgid "No nftables ruleset loaded."
msgstr "No se ha cargado ningún conjunto de reglas de nftables."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Ruido"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr "Margen de ruido (SNR)"
msgid "Noise:"
msgstr "Ruido:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr "Errores de CRC no preventivos (CRC P)"
msgid "Normal"
msgstr "Normal"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "No encontrado"
msgstr "Abra la descripción general de las reglas de iptables…"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Abrir lista..."
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr "Traspasar (Duplicar dispositivo físico a una sola MAC VLAN)"
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Contraseña"
msgid "Pkts."
msgstr "Paq."
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Por favor, introduzca su nombre de usuario y contraseña."
msgid "Potential negation of: %s"
msgstr "negación potencial de: %s"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "Modo de administración de energía"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr "Errores preventivos de CRC (CRC P)"
msgstr "Política de reselección para esclavo primario"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr "Configurar rutas para vecinos IPv6 con proxy."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr "Segundos con errores graves (SES)"
msgstr "Preámbulo corto"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "Mostrar la lista actual de archivos a respaldar"
msgid "Signal / Noise"
msgstr "Señal / Ruido"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "Atenuación de señal (SATN)"
msgid "Some fields are invalid, cannot save values!"
msgstr "Algunos campos son inválidos, ¡no se pueden guardar!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "Objeto no encontrado."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "El servidor encontró un error inesperado."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Estado"
msgid "System log buffer size"
msgstr "Tamaño del buffer de registro del sistema"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "El modo %s seleccionado es incompatible con la encriptación %s"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr "¡El token de seguridad enviado no es válido o ya está vencido!"
msgid "There are no changes to apply"
msgstr "No hay cambios para aplicar"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr "Esto no parece un archivo PEM válido"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr "No se puede determinar la interfaz ascendente"
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "Imposible repartir"
msgid "Unable to verify PIN"
msgstr "No se puede verificar el PIN"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr "Segundos no disponibles (UAS)"
msgid "User key (PEM encoded)"
msgstr "Clave de usuario (codificada PEM)"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Nombre de usuario"
msgid "You may add multiple records for the same domain."
msgstr "Puede agregar varios registros para el mismo dominio."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Volver"
+#~ msgid "Back to configuration"
+#~ msgstr "Volver a la configuración"
+
+#~ msgid "Close list..."
+#~ msgstr "Cerrar lista..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "Error interno del servidor"
+
+#~ msgid "No files found"
+#~ msgstr "No se han encontrado archivos"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "El servidor encontró un error inesperado."
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
#~ "No reenviar consultas que no puedan ser respondidas por resolutores "
msgid "ATM device number"
msgstr "ATM-laitteen numero"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "ATU-C-järjestelmän toimittajan tunnus"
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "Yhteenlaskettu lähetysteho (ACTATP)"
msgstr "Valinnainen, lyhyt laitteen kuvaus"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Annex"
msgid "Authoritative"
msgstr "Määräävä"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Valtuutus vaaditaan"
msgid "Back to Overview"
msgstr "Takaisin yleiskatsaukseen"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Takaisin määritykseen"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr "Varmuuskopioi / Kirjoita laiteohjelmisto"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Varmuuskopioitavat tiedostot"
msgstr "Merkkikehysten väli"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"Sulje passiivinen yhteys määritetyn ajan kuluttua, käytä 0 pysyvän yhteyden "
"luomiseen"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Sulje luettelo ..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr "DS-Lite AFTR -osoite"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "DSL-tila"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "Tiedonsiirtonopeus"
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr "Virheelliset sekunnit (ES)"
msgid "Force use of NAT-T"
msgstr "Pakoita NAT-T käyttöön"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr "Lomakkeen tunnussanoman ristiriita"
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr "Välitettävien virheenkorjaus sekunnit (FECS)"
msgid "Global network options"
msgstr "Yleiset verkkoasetukset"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr "Siirry laiteohjelmiston päivitykseen..."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Katkaise"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr "Otsikon virhekoodit (HEC)"
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "Sisäinen"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "Sisäinen palvelinvirhe"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr "Oppimispakettien lähetysväli"
msgid "Invalid hexadecimal value"
msgstr "Virheellinen heksadesimaaliarvo"
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "Virheellinen käyttäjätunnus tai salasana! Yritä uudelleen."
"Näyttää siltä, että yrität kirjoittaa levykuvaa, joka ei sovi flash-"
"muistiin, tarkista levykuvatiedosto!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "Viive"
msgid "Limit"
msgstr "Raja"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr "Linjan vaimennus (LATN)"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr "Linja-tila"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr "Linjatila"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "Linjan käyttöaika"
msgstr "Ladataan hakemiston sisältöä…"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "Ladataan näkymää…"
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr "Looginen verkko, johon tunneli lisätään (sillataan) (valinnainen)."
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Kirjaudu sisään"
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr "Signaalin menetys sekuntia (LOSS)"
msgid "Lowest leased address as offset from the network address."
msgstr "Alin lainattu osoite verkko-osoitteesta laskettuna."
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr "Maks. Saavutettavissa oleva tiedonsiirtonopeus (ATTNDR)"
msgid "No RX signal"
msgstr "Ei RX-signaalia"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "Tässä hakemistossa ei ole merkintöjä"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Tiedostoja ei löytynyt"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Kohina"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr "Kohinasuhde (SNR)"
msgid "Noise:"
msgstr "Kohina:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr "Keskeytyksettömät CRC-virheet (CRC_P)"
msgid "Normal"
msgstr "Normaali"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "Ei löydy"
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Avaa lista..."
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Salasana"
msgid "Pkts."
msgstr "Paket."
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Anna käyttäjätunnus ja salasana."
msgid "Potential negation of: %s"
msgstr "Mahdollinen kieltäytyminen:%s"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "Virranhallintatila"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr "Keskeyttävät CRC-virheet (CRC_P)"
msgstr "Ensisijaisen orjan uudelleenvalintakäytäntö"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr "Severely Errored Seconds (SES)"
msgstr "Lyhyt johdanto-osa"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "Näytä nykyinen varmuuskopiotiedostoluettelo"
msgid "Signal / Noise"
msgstr "Signaali / Kohina"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "Signaalin vaimennus (SATN)"
msgid "Some fields are invalid, cannot save values!"
msgstr "Jotkin kentät eivät kelpaa, arvoja ei voi tallentaa!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "Pahus, pyytämääsi objektia ei löytynyt."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "Pahus, palvelin kohtasi odottamattoman virheen."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Tila"
msgid "System log buffer size"
msgstr "Järjestelmälokin puskurin koko"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "Valittu %s tila ei ole yhteensopiva salauksen %s kanssa"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr "Lähetetty suojaustunnus on virheellinen tai vanhentunut!"
msgid "There are no changes to apply"
msgstr "Ei muutoksia käyttöönotettavaksi"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr "Tämä ei näytä kelvolliselta PEM-tiedostolta"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr "Ylävirran sovitinta ei voitu selvittää"
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "Ei voida lähettää"
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr "Saavuttamattomissa (UAS)"
msgid "User key (PEM encoded)"
msgstr "Käyttäjäavain (PEM-koodattu)"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Käyttäjätunnus"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "«Takaisin"
+#~ msgid "Back to configuration"
+#~ msgstr "Takaisin määritykseen"
+
+#~ msgid "Close list..."
+#~ msgstr "Sulje luettelo ..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "Sisäinen palvelinvirhe"
+
+#~ msgid "No files found"
+#~ msgstr "Tiedostoja ei löytynyt"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "Pahus, palvelin kohtasi odottamattoman virheen."
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
#~ "Älä välitä eteenpäin kyselyitä, joihin julkiset nimipalvelimet eivät voi "
msgid "ATM device number"
msgstr "Numéro de périphérique ATM"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "ATU-C System Vendor ID"
msgid "Aggregate Originator Messages"
msgstr "Agréger les messages de l'expéditeur"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "Puissance d'émission globale (ACTATP)"
msgstr "Une courte description, optionnelle, pour cet appareil"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Annexe"
msgid "Authoritative"
msgstr "Autoritaire"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Autorisation requise"
msgid "Back to Overview"
msgstr "Retour à la vue générale"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Retour à la configuration"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr "Retour à la configuration des pairs"
msgstr "Sauvegarde / Mise à jour du micrologiciel"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Liste des fichiers de sauvegarde"
msgstr "Intervalle entre les balises"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"Fermer une connexion inactive après le délai donné en secondes, mettre 0 "
"pour garder les connexions"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Fermer la liste…"
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr "Adresse du DS-Lite AFTR"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "Statut DSL"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "Débit de données"
msgid "Error getting PublicKey"
msgstr "Erreur lors de l’obtention de la clé publique"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr "Erreurs de secondes (ES)"
msgid "Force use of NAT-T"
msgstr "Forcer l'utilisation de NAT-T"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr "Non-correspondance des jetons de formulaire"
"Transférer les messages DHCPv6 entre l'interface maître désignée et les "
"interfaces en aval."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr "Forward Error Correction Secondes (FECS)"
msgid "Global network options"
msgstr "Options globales de réseau"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr "Aller à la mise à niveau du firmware …"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Signal (HUP)"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr "Erreurs de code d'erreur d'en-tête (HEC)"
"la fonction de prévention des boucles de pont afin d'éviter les boucles de "
"diffusion qui peuvent paralyser l'ensemble du réseau local."
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "Interne"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "Erreur Serveur Interne"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr "Intervalle d'envoi des paquets d'apprentissage"
msgid "Invalid hexadecimal value"
msgstr "Valeur hexadécimale invalide"
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "Nom d'utilisateur et/ou mot de passe invalides ! Réessayez."
"L'image que vous essayez de flasher est vraisemblablement trop grosse pour "
"tenir dans la mémoire flash, merci de vérifier le fichier !"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr "Intervalle du dernier membre"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "Latence"
msgid "Limit"
msgstr "Limite"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr "Atténuation de la ligne (LATN)"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr "Mode ligne"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr "État de la ligne"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "Temps de fonctionnement de la ligne"
msgstr "Chargement du contenu des répertoires…"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "Chargement de la vue…"
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr "Réseau logique auquel le tunnel sera ajouté (ponté) (facultatif)."
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Connexion"
msgid "Loose filtering"
msgstr "Filtrage perdu"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr "Perte de secondes de signal (LOSS)"
"Adresse allouée la plus basse, spécifiée par un décalage à partir de "
"l'adresse réseau."
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr "Intervalle maximal <abbr title=\"Annonce de routeur\">RA</abbr>"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr "Débit de données max. atteignable (ATTNDR)"
msgid "No RX signal"
msgstr "Pas de signal RX"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "Aucune entrée dans ce répertoire"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Aucun fichier trouvé"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr "Aucun jeu de règles nftables n'est chargé."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Bruit"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr "Rapport signal sur bruit (SNR)"
msgid "Noise:"
msgstr "Bruit :"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr "Erreurs CRC non préemptives (CRC_P)"
msgid "Normal"
msgstr "Normal"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "Pas trouvé"
msgstr "Ouvrir l'aperçu des règles iptables…"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Ouvrir la liste…"
msgstr ""
"Pass-through (Mise en miroir du périphérique physique sur un seul VLAN MAC)"
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Mot de passe"
msgid "Pkts."
msgstr "Pqts."
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Saisissez votre nom d'utilisateur et mot de passe."
msgid "Potential negation of: %s"
msgstr "Négation potentielle de : %s"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "Mode de gestion de l'énergie"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr "Erreurs CRC préventives (CRCP_P)"
msgstr "Reselection politique pour esclave primaire"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr "Configurez les itinéraires pour les proxysIPv6 voisins."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr "Secondes gravement erronées (SES)"
msgstr "Préambule court"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "Afficher la liste des fichiers de la sauvegarde actuelle"
msgid "Signal / Noise"
msgstr "Signal / bruit"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "Atténuation du signal (SATN)"
msgid "Some fields are invalid, cannot save values!"
msgstr "Certains champs sont invalides, ne peut sauvegarder les valeurs !"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "Désolé, l'objet que vous avez demandé n'as pas été trouvé."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "Désolé, le serveur à rencontré une erreur inattendue."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "État"
msgid "System log buffer size"
msgstr "Taille du tampon du journal système"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "Le mode %s sélectionné n'est pas compatible avec le chiffrement %s"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr "Le jeton de sécurité soumis n'est pas valide ou a expiré !"
msgid "There are no changes to apply"
msgstr "Il n'y a aucun changement à appliquer"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr "Cela ne ressemble pas à un fichier PEM valide"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr "Impossible de déterminer l'interface en amont"
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "Impossible d'envoyer"
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr "Secondes non disponibles (UAS)"
msgid "User key (PEM encoded)"
msgstr "Clé utilisateur (codée PEM)"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Nom d'utilisateur"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Retour"
+#~ msgid "Back to configuration"
+#~ msgstr "Retour à la configuration"
+
+#~ msgid "Close list..."
+#~ msgstr "Fermer la liste…"
+
+#~ msgid "Internal Server Error"
+#~ msgstr "Erreur Serveur Interne"
+
+#~ msgid "No files found"
+#~ msgstr "Aucun fichier trouvé"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "Désolé, le serveur à rencontré une erreur inattendue."
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
#~ "Ne pas transmettre les requêtes qui ne peuvent être résolues par les "
msgid "ATM device number"
msgstr "מס' התקן של ATM"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr ""
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr ""
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr ""
msgid "Authoritative"
msgstr "מוסמך"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "דרוש אימות"
msgid "Back to Overview"
msgstr "חזרה לסקירה"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "חזרה להגדרות"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr "גיבוי / קושחת פלאש"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "גיבוי רשימת קבצים"
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"persist connection"
msgstr "סגור חיבורים לא פעילים אחרי מספר השניות שהוגדר, הזן 0 על-מנת לא לסגור"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "סגור רשימה..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr ""
msgid "DUID"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr ""
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr ""
msgid "Force use of NAT-T"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr ""
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
msgid "Global network options"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr ""
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr ""
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "שם משתמש ו/או סיסמה שגויים! אנא נסה שנית."
"flash memory, please verify the image file!"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr ""
msgid "Limit"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr ""
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr ""
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
msgid "Lowest leased address as offset from the network address."
msgstr ""
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr ""
msgid "No RX signal"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr ""
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr ""
msgid "Noise:"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr ""
msgid "Normal"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr ""
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr ""
msgid "Pkts."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "אנא הזן את שם המשתמש והסיסמה שלך:"
msgid "Potential negation of: %s"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr ""
msgid "Signal / Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr ""
msgid "Some fields are invalid, cannot save values!"
msgstr "חלק מהשדות אינם תקינים, אין אפשרות לשמור את הערכים!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "סליחה, אך האובייקט שביקשת אינו נמצא."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "סליחה, השרת נתקל בשגיאה לא צפויה."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "מצב"
msgid "System log buffer size"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr ""
msgid "There are no changes to apply"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr ""
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr ""
msgid "User key (PEM encoded)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "שם משתמש"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "<< אחורה"
+#~ msgid "Back to configuration"
+#~ msgstr "חזרה להגדרות"
+
+#~ msgid "Close list..."
+#~ msgstr "סגור רשימה..."
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "סליחה, השרת נתקל בשגיאה לא צפויה."
+
#~ msgid "TFTP Settings"
#~ msgstr "הגדרות TFTP"
msgid "ATM device number"
msgstr "ATM यंत्र अंक"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "ATU-C सिस्टम विक्रेता पहचान (ID)"
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr ""
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr ""
msgid "Authoritative"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr ""
msgid "Back to Overview"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr ""
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"persist connection"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr ""
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr ""
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr ""
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr ""
msgid "Force use of NAT-T"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr ""
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
msgid "Global network options"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr ""
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr ""
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr ""
"flash memory, please verify the image file!"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr ""
msgid "Limit"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr ""
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr ""
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
msgid "Lowest leased address as offset from the network address."
msgstr ""
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr ""
msgid "No RX signal"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr ""
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr ""
msgid "Noise:"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr ""
msgid "Normal"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr ""
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr ""
msgid "Pkts."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr ""
msgid "Potential negation of: %s"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr ""
msgid "Signal / Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr ""
msgid "Some fields are invalid, cannot save values!"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr ""
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr ""
msgid "System log buffer size"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr ""
msgid "There are no changes to apply"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr ""
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr ""
msgid "User key (PEM encoded)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr ""
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "ATM device number"
msgstr "ATM eszközszám"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "ATU-C rendszer gyártójának azonosítója"
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "Összesített átviteli teljesítmény (ACTATP)"
msgstr "Opcionális, rövid leírása az eszköznek"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Melléklet"
msgid "Authoritative"
msgstr "Hiteles"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Hitelesítés szükséges"
msgid "Back to Overview"
msgstr "Vissza az áttekintőhöz"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Vissza a beállításokhoz"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr "Biztonsági mentés vagy firmware beírása"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Biztonsági mentés fájllistája"
msgstr "Alapjel időköze"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"Inaktív kapcsolat lezárása a megadott másodpercek után, használjon 0-t "
"állandó kapcsolathoz"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Lista bezárása…"
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr "DS-Lite AFTR cím"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "DSL állapota"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "Adatsebesség"
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr "Hibás másodpercek (ES)"
msgid "Force use of NAT-T"
msgstr "NAT-T használatának kényszerítése"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr "Űrlaptoken eltérés"
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr "Továbbítási hiba javításának másodpercei (FECS)"
msgid "Global network options"
msgstr "Globális hálózati beállítások"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Befejezés"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr "Fejléc hibakódhibák (HEC)"
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "Belső"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "Belső kiszolgálóhiba"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr "Érvénytelen hexadecimális érték"
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "Érvénytelen felhasználónév és/vagy jelszó! Próbálja újra."
"Úgy tűnik, hogy olyan képfájlt próbál beírni, amely nem fér bele a flash-"
"memóriába. Ellenőrizze a képfájlt!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "Késleltetés"
msgid "Limit"
msgstr "Korlát"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr "Vonal csillapítása (LATN)"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr "Vonali mód"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr "Vonal állapota"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "Vonal működési ideje"
msgstr "Könyvtártartalmak betöltése…"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "Nézet betöltése…"
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Bejelentkezés"
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr "Jel vesztésének másodpercei (LOSS)"
msgid "Lowest leased address as offset from the network address."
msgstr "Legalacsonyabb bérelt cím a hálózati címtől való eltolásként."
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr "Legnagyobb elérhető adatsebesség (ATTNDR)"
msgid "No RX signal"
msgstr "Nincs RX jel"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "Nincsenek bejegyzések ebben a könyvtárban"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Nem találhatók fájlok"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Zaj"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr "Zajszint (SNR)"
msgid "Noise:"
msgstr "Zaj:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr "Nem megelőző CRC-hibák (CRC_P)"
msgid "Normal"
msgstr "Normál"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "Nem található"
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Lista megnyitása…"
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Jelszó"
msgid "Pkts."
msgstr "csom."
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Adja meg a felhasználónevét és a jelszavát."
msgid "Potential negation of: %s"
msgstr "Lehetséges tagadása ennek: %s"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "Energiakezelési mód"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr "Megelőző CRC-hibák (CRCP_P)"
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr "Súlyosan hibás másodpercek (SES)"
msgstr "Rövid előszó"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "Jelenlegi biztonsági mentés fájllista megjelenítése"
msgid "Signal / Noise"
msgstr "Jel/zaj"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "Jel csillapítása (SATN)"
msgid "Some fields are invalid, cannot save values!"
msgstr "Néhány mező érvénytelen, nem lehet menteni az értékeket!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "Elnézést, a kért objektum nem található."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "Elnézést, a kiszolgáló váratlan hibát észlelt."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Állapot"
msgid "System log buffer size"
msgstr "Rendszernapló-puffer mérete"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "A kiválasztott %s mód nem használható együtt %s titkosítással"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr "A beküldött biztonsági token érvénytelen vagy már lejárt!"
msgid "There are no changes to apply"
msgstr "Nincsenek alkalmazandó változtatások"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr "Ez nem tűnik érvényes PEM fájlnak"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr "Nem lehet meghatározni a külső csatolót"
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "Nem lehet elküldeni"
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr "Elérhetetlen másodpercek (UAS)"
msgid "User key (PEM encoded)"
msgstr "Felhasználói kulcs (PEM kódolású)"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Felhasználónév"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Vissza"
+#~ msgid "Back to configuration"
+#~ msgstr "Vissza a beállításokhoz"
+
+#~ msgid "Close list..."
+#~ msgstr "Lista bezárása…"
+
+#~ msgid "Internal Server Error"
+#~ msgstr "Belső kiszolgálóhiba"
+
+#~ msgid "No files found"
+#~ msgstr "Nem találhatók fájlok"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "Elnézést, a kiszolgáló váratlan hibát észlelt."
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
#~ "Ne továbbítsa azokat a kéréseket, amelyeket nem tudnak megválaszolni a "
msgid "ATM device number"
msgstr "Numero dispositivo ATM"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr ""
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr ""
msgstr "Una breve descrizione facoltativa per questo dispositivo"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Annex"
msgid "Authoritative"
msgstr "Autoritativo"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Autorizzazione Richiesta"
msgid "Back to Overview"
msgstr "Ritorna alla Panoramica"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Torna alla configurazione"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr "Backup / Flash Firmware"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Elenco dei file di backup"
msgstr "Intervallo Beacon"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"Chiudi le connessioni inattive dopo un determinato numero di secondi, usa 0 "
"per connessioni persistenti"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Chiudi elenco..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr ""
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr ""
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr ""
msgid "Force use of NAT-T"
msgstr "Forza uso del NAT-T"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr ""
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
msgid "Global network options"
msgstr "Opzioni di rete globali"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Disconnetti (SIGHUP)"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr ""
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "Interno"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "Errore del Server Interno"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "Username e/o password non validi! Per favore riprova."
"Sembra tu stia provando a scrivere un'immagine più grande delle dimensioni "
"della memoria flash, per favore controlla il file!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr ""
msgid "Limit"
msgstr "Limite"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "Caricamento pagina…"
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Login"
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
msgid "Lowest leased address as offset from the network address."
msgstr ""
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr "Intervallo massimo <abbr title=\"Router Advertisement\">RA</abbr>"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr ""
msgid "No RX signal"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Nessun file trovato"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Rumore"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr "Margine di Rumore (SNR)"
msgid "Noise:"
msgstr "Rumore:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr ""
msgid "Normal"
msgstr "Normale"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "Non Trovato"
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Apri lista..."
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Password"
msgid "Pkts."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Per favore inserisci il tuo username e la password."
msgid "Potential negation of: %s"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr "Secondi con errori gravi (SES)"
msgstr "Preambolo breve"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "Mostra l'elenco dei file sottoposti a backup"
msgid "Signal / Noise"
msgstr "Segnale / Rumore"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "Attenuazione del segnale (SATN)"
msgid "Some fields are invalid, cannot save values!"
msgstr "Alcuni campi non sono validi, non è possibile salvare i valori!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "Siamo spiacenti, l'oggetto che hai richiesto non è stato trovato."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "Spiacente, il server ha rilevato un errore imprevisto."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Stato"
msgid "System log buffer size"
msgstr "Dimensione buffer log di sistema"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "La modalità %s selezionata non è compatibile con la crittografia %s"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr ""
msgid "There are no changes to apply"
msgstr "Non ci sono modifiche da applicare"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr ""
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr ""
msgid "User key (PEM encoded)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Nome utente"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Indietro"
+#~ msgid "Back to configuration"
+#~ msgstr "Torna alla configurazione"
+
+#~ msgid "Close list..."
+#~ msgstr "Chiudi elenco..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "Errore del Server Interno"
+
+#~ msgid "No files found"
+#~ msgstr "Nessun file trovato"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "Spiacente, il server ha rilevato un errore imprevisto."
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
#~ "Non inoltrare le richieste che non possono essere risolte dai name server "
msgid "ATM device number"
msgstr "ATMデバイス番号"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "ATU-CシステムベンダーID"
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "総送信電力(ACTATP)"
msgstr "このデバイスの短い説明(オプション)"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Annex"
msgid "Authoritative"
msgstr "権威"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "ログイン"
msgid "Back to Overview"
msgstr "概要へ戻る"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "設定へ戻る"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr "バックアップ/フラッシュ"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "バックアップファイルリスト"
msgstr "ビーコン間隔"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"設定した秒数後に、非アクティブな接続を閉じます。0を設定した場合、接続を維持し"
"ます"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "リストを閉じる..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr "DS-Lite AFTRアドレス"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "DSLステータス"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "データレート"
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr "エラー秒数(ES)"
msgid "Force use of NAT-T"
msgstr "NAT-Tを強制的に使用"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr "フォームトークンの不一致"
"マスターとして指定されたインターフェースとダウンストリーム インターフェースと"
"の間で DHCPv6 メッセージを転送します"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr "前方誤り訂正秒(FECS)"
msgid "Global network options"
msgstr "グローバルネットワークオプション"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "ハングアップ"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr "ヘッダーエラーコードエラー(HEC)"
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "内部"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "内部サーバーエラー"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr "学習パケット送信間隔"
msgid "Invalid hexadecimal value"
msgstr "無効な16進数"
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr ""
"ユーザー名とパスワードのどちらかもしくは両方が間違っています!もう一度入力し"
"フラッシュしようとしたイメージファイルはこのフラッシュメモリー向けではありま"
"せん。イメージファイルを確認してください!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "遅延"
msgid "Limit"
msgstr "制限"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr "回線減衰(LATN)"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr "回線モード"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr "回線状態"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "回線稼働時間"
msgstr "ディレクトリの内容を読み込み中…"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "画面表示を読み込み中…"
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr "トンネルが追加される(ブリッジされる)論理ネットワーク(オプション)。"
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "ログイン"
msgid "Loose filtering"
msgstr "緩いフィルタリング"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr "信号損失秒数(LOSS)"
msgstr ""
"これはネットワークアドレスをオフセットとした、最小のリースアドレスです。"
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr "到達可能な最大データレート(ATTNDR)"
msgid "No RX signal"
msgstr "RX信号なし"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "このディレクトリ内にエントリーがありません"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "ファイルが見つかりません"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "ノイズ"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr "ノイズマージン(SNR)"
msgid "Noise:"
msgstr "ノイズ:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr "非プリエンプティブCRCエラー(CRC_P)"
msgid "Normal"
msgstr "標準"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "見つかりません"
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "リストを開く..."
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr "パススルー(物理デバイスを単一の MAC ベース VLAN へミラー)"
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "パスワード"
msgid "Pkts."
msgstr "パケット"
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "ユーザー名とパスワードを入力してください。"
msgid "Potential negation of: %s"
msgstr "存在しない可能性があります: %s"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "電力管理モード"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr "プリエンプティブCRCエラー(CRCP_P)"
msgstr "プライマリスレーブの再選択ポリシー"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr "重大エラー秒数(SES)"
msgstr "ショートプリアンブル"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "現在のバックアップファイルリストを表示"
msgid "Signal / Noise"
msgstr "信号強度 / ノイズ"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "信号減衰(SATN)"
msgid "Some fields are invalid, cannot save values!"
msgstr "フィールドに無効な値が設定されているため、保存できません!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr ""
"申し訳ありませんが、リクエストされたオブジェクトは見つかりませんでした。"
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "申し訳ありませんが、サーバーに予期しないエラーが発生しました。"
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "ステータス"
msgid "System log buffer size"
msgstr "システムログバッファサイズ"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "選択された%sモードは、%s暗号化と互換性がありません"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr "送信されたセキュリティトークンは無効または期限切れです!"
msgid "There are no changes to apply"
msgstr "適用する変更はありません"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr "これは有効なPEMファイルではないようです"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr "アップストリーム インターフェースを確定できません"
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "ディスパッチできません"
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr "使用不可秒数(UAS)"
msgid "User key (PEM encoded)"
msgstr "ユーザー鍵(PEMエンコード)"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "ユーザー名"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« 戻る"
+#~ msgid "Back to configuration"
+#~ msgstr "設定へ戻る"
+
+#~ msgid "Close list..."
+#~ msgstr "リストを閉じる..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "内部サーバーエラー"
+
+#~ msgid "No files found"
+#~ msgstr "ファイルが見つかりません"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "申し訳ありませんが、サーバーに予期しないエラーが発生しました。"
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr "パブリックDNSサーバーが応答できないリクエストを転送しない"
msgid "ATM device number"
msgstr "ATM 디바이스 번호"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "ATU-C 시스템 벤더 ID"
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "전송 전력 집계 (ACTATP)"
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr ""
msgid "Authoritative"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "인증이 필요합니다"
msgid "Back to Overview"
msgstr "개요로 이동"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "설정으로 돌아가기"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr "펌웨어 백업 / 플래시"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr ""
msgstr "비컨 간격"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"persist connection"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "목록 닫기..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr ""
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr ""
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr ""
msgid "Force use of NAT-T"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr ""
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
msgid "Global network options"
msgstr "전역 네트워크 옵션"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "중단"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr "Header Error Code Errors (HEC)"
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr ""
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr ""
"flash memory, please verify the image file!"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr ""
msgid "Limit"
msgstr "제한"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "회선 가동 시간"
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr ""
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "로그인"
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
msgid "Lowest leased address as offset from the network address."
msgstr ""
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr ""
msgid "No RX signal"
msgstr "RX 신호 없음"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr ""
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "노이즈"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr ""
msgid "Noise:"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr ""
msgid "Normal"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "목록 열람..."
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "암호"
msgid "Pkts."
msgstr "Pkts."
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "사용자이름과 암호를 입력해 주세요."
msgid "Potential negation of: %s"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "현재 백업 파일 목록 보기"
msgid "Signal / Noise"
msgstr "신호 / 노이즈"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "신호 감쇠 (SATN)"
msgid "Some fields are invalid, cannot save values!"
msgstr "일부 필드가 올바르지 않아, 값을 저장할 수 없습니다!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "죄송합니다, 요청하신 객체를 찾을 수 없습니다."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "죄송합니다, 서버가 예상치 못한 오류에 걸렸습니다."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "상태"
msgid "System log buffer size"
msgstr "시스템 로그 버퍼 크기"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "선택된 %s 모드는 %s 암호화 방식과 호환되지 않습니다"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr "전송된 보안 토큰이 잘못되었거나 이미 만료되었습니다!"
msgid "There are no changes to apply"
msgstr "변경된 사항이 없습니다"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr ""
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr ""
msgid "User key (PEM encoded)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "사용자이름"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« 이전"
+#~ msgid "Back to configuration"
+#~ msgstr "설정으로 돌아가기"
+
+#~ msgid "Close list..."
+#~ msgstr "목록 닫기..."
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "죄송합니다, 서버가 예상치 못한 오류에 걸렸습니다."
+
#~ msgid "Root directory for files served via TFTP."
#~ msgstr "TFTP 를 통해 제공되는 파일들의 root 디렉토리"
msgid "ATM device number"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr ""
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr ""
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr ""
msgid "Authoritative"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr ""
msgid "Back to Overview"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr ""
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"persist connection"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr ""
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr ""
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr ""
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr ""
msgid "Force use of NAT-T"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr ""
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
msgid "Global network options"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr ""
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr ""
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr ""
"flash memory, please verify the image file!"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr ""
msgid "Limit"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr ""
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr ""
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
msgid "Lowest leased address as offset from the network address."
msgstr ""
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr ""
msgid "No RX signal"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr ""
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr ""
msgid "Noise:"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr ""
msgid "Normal"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr ""
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "संकेतशब्द"
msgid "Pkts."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr ""
msgid "Potential negation of: %s"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr ""
msgid "Signal / Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr ""
msgid "Some fields are invalid, cannot save values!"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr ""
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "स्थिती"
msgid "System log buffer size"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr ""
msgid "There are no changes to apply"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr ""
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr ""
msgid "User key (PEM encoded)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "वापरकर्तानाव"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "ATM device number"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr ""
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr ""
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr ""
msgid "Authoritative"
msgstr "Pengesahan"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Otorisasi Diperlukan"
msgid "Back to Overview"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr ""
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"persist connection"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr ""
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr ""
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr ""
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr ""
msgid "Force use of NAT-T"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr ""
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
msgid "Global network options"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Menutup"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr ""
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr ""
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "Username dan / atau password tak sah! Sila cuba lagi."
"Tampak bahawa anda cuba untuk flash fail gambar yang tidak sesuai dengan "
"memori flash, sila buat pengesahan pada fail gambar!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr ""
msgid "Limit"
msgstr "Batas"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr ""
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Login"
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
msgid "Lowest leased address as offset from the network address."
msgstr ""
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr ""
msgid "No RX signal"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr ""
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Kebisingan"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr ""
msgid "Noise:"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr ""
msgid "Normal"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr ""
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Kata laluan"
msgid "Pkts."
msgstr "Pkts."
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Sila masukkan username dan kata laluan anda."
msgid "Potential negation of: %s"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr ""
msgid "Signal / Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr ""
msgid "Some fields are invalid, cannot save values!"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr ""
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Status"
msgid "System log buffer size"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr ""
msgid "There are no changes to apply"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr ""
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr ""
msgid "User key (PEM encoded)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Username"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "ATM device number"
msgstr "<abbr title=\"Asynchronous Transfer Mode\">ATM</abbr> enhetsnummer"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr ""
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr ""
msgstr "Valgfri kort beskrivelse av denne enheten"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr ""
msgid "Authoritative"
msgstr "Autoritativ"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Autorisasjon er nødvendig"
msgid "Back to Overview"
msgstr "Tilbake til oversikt"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Tilbake til konfigurasjon"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr "Sikkerhetskopiering/Firmware oppgradering"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Sikkerhetskopier filliste"
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"Lukk inaktiver tilkoblinger etter angitt antall sekunder, bruk 0 for en "
"kontinuerlig tilkobling"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Lukk liste..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "DSL-status"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "Datahastighet"
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr ""
msgid "Force use of NAT-T"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr ""
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
msgid "Global network options"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Slå av"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr ""
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "Intern server feil"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "Ugyldig brukernavn og/eller passord! Vennligst prøv igjen."
"Det virker som du prøver å flashe med en firmware som ikke passer inn i "
"flash-minnet, vennligst kontroller firmware filen!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr ""
msgid "Limit"
msgstr "Grense"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr ""
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Logg inn"
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
msgid "Lowest leased address as offset from the network address."
msgstr "Laveste leide adresse, forskjøvet fra nettverks adressen."
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr ""
msgid "No RX signal"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Ingen filer funnet"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Støy"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr ""
msgid "Noise:"
msgstr "Støy:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr ""
msgid "Normal"
msgstr "Normal"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "Ikke funnet"
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Åpne liste..."
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Passord"
msgid "Pkts."
msgstr "Pakker."
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Skriv inn ditt brukernavn og passord."
msgid "Potential negation of: %s"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "Vis gjeldende liste med sikkerhetskopifiler"
msgid "Signal / Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr ""
msgid "Some fields are invalid, cannot save values!"
msgstr "Noen felt er ugyldige, kan ikke lagre verdier!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "Beklager, objektet du spurte om ble ikke funnet."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "Beklager, det oppstod en uventet feil på serveren."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Status"
msgid "System log buffer size"
msgstr "System logg buffer størrelse"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr ""
msgid "There are no changes to apply"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "Kan ikke sende"
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr ""
msgid "User key (PEM encoded)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Brukernavn"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Tilbake"
+#~ msgid "Back to configuration"
+#~ msgstr "Tilbake til konfigurasjon"
+
+#~ msgid "Close list..."
+#~ msgstr "Lukk liste..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "Intern server feil"
+
+#~ msgid "No files found"
+#~ msgstr "Ingen filer funnet"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "Beklager, det oppstod en uventet feil på serveren."
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
#~ "Ikke videresend forespørsler som ikke kan besvares med offentlige "
msgid "ATM device number"
msgstr "ATM apparaatnummer"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "ATU-C Systeemleverancier-ID"
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "Geaggregeerd verzendvermogen (ACTATP)"
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr ""
msgid "Authoritative"
msgstr "Autoritatieve"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Autorisatie Vereist"
msgid "Back to Overview"
msgstr "Terug naar het overzicht"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Terug naar de configuratie"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr "Backup / Flash Firmware"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"persist connection"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr ""
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr ""
msgid "DUID"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr ""
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr ""
msgid "Force use of NAT-T"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr ""
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
msgid "Global network options"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr ""
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr ""
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr ""
"flash memory, please verify the image file!"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr ""
msgid "Limit"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr ""
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr ""
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
msgid "Lowest leased address as offset from the network address."
msgstr ""
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr ""
msgid "No RX signal"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr ""
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr ""
msgid "Noise:"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr ""
msgid "Normal"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr ""
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr ""
msgid "Pkts."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr ""
msgid "Potential negation of: %s"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr ""
msgid "Signal / Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr ""
msgid "Some fields are invalid, cannot save values!"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr ""
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr ""
msgid "System log buffer size"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr ""
msgid "There are no changes to apply"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr ""
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr ""
msgid "User key (PEM encoded)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr ""
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Terug"
+#~ msgid "Back to configuration"
+#~ msgstr "Terug naar de configuratie"
+
#~ msgid "Auto Refresh"
#~ msgstr "Automatisch Vernieuwen"
msgid "ATM device number"
msgstr "Numer urządzenia ATM"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "ID dostawcy systemu ATU-C"
msgid "Aggregate Originator Messages"
msgstr "Agregacja komunikatów inicjatora"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "Agregacja siły transmisji (ACTATP)"
msgstr "Opcjonalny, krótki opis tego urządzenia"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Annex"
msgid "Authoritative"
msgstr "Autorytatywny"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Wymagana autoryzacja"
msgid "Back to Overview"
msgstr "Wróć do przeglądu"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Wróć do konfiguracji"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr "Powrót do konfiguracji peerów"
msgstr "Kopia zapasowa / Aktualizacja firmware"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Lista plików kopii zapasowej"
msgstr "Interwał ramki (beacon)"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"Zamknij nieaktywne połączenia po określonym czasie podanym w sekundach, "
"wpisz 0, aby uzyskać stałe połączenie"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Zamknij listę..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr "Adres AFTR DS-Lite"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "Status DSL"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "Szybkość przesyłania danych"
msgid "Error getting PublicKey"
msgstr "Błąd uzyskiwania klucza publicznego"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr "Ilość błędów (ES)"
msgid "Force use of NAT-T"
msgstr "Wymuś użycie NAT-T"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr "Niepoprawna forma tokenu"
"Przekazuj komunikaty DHCPv6 między wyznaczonym interfejsem głównym a "
"interfejsami podrzędnymi."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr "Sekundy przekazywania korekty błędów (FECS)"
msgid "Global network options"
msgstr "Globalne opcje sieciowe"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr "Przejdź do aktualizacji firmware..."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Rozłącz"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr "Błędy kodu nagłówka (HEC)"
"unikania pętli mostowych w celu uniknięcia pętli rozgłoszeniowych, które "
"mogą doprowadzić do zatrzymania całej sieci LAN."
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "Wewnętrzny"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "Wewnętrzny błąd serwera"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr "Interwał wysyłania pakietów edukacyjnych"
msgid "Invalid hexadecimal value"
msgstr "Nieprawidłowa wartość szesnastkowa"
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "Niewłaściwy login i/lub hasło! Spróbuj ponownie."
"Wygląda na to, że próbujesz wgrać obraz, który nie mieści się w pamięci "
"flash, sprawdź plik obrazu!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr "Interwał ostatniego użytkownika"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "Opoźnienie"
msgid "Limit"
msgstr "Limit"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr "Tłumienie linii (LATN)"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr "Tryb linii"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr "Stan linii"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "Czas działania linii"
msgstr "Ładowanie zawartości katalogu.…"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "Ładowanie widoku…"
msgstr ""
"Sieć logiczna, do której tunel zostanie dodany (zmostkowy) (opcjonalnie)."
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Zaloguj"
msgid "Loose filtering"
msgstr "Luźne filtrowanie"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr "Utrata sygnału (LOSS)"
msgid "Lowest leased address as offset from the network address."
msgstr "Najniższy wydzierżawiony adres jako offset dla adresu sieci."
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr "Maksymalny odstęp czasu <abbr title=\"Router Advertisement\">RA</abbr>"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr "Maksymalna osiągalna przepustowość danych (ATTNDR)"
msgid "No RX signal"
msgstr "Brak sygnału RX"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "Brak wpisów w tym katalogu"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Nie znaleziono plików"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr "Nie załadowano zestawu reguł nftables."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Szum"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr "Margines szumów (SNR)"
msgid "Noise:"
msgstr "Szum:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr "Nieprzewidziane błedy CRC (CRC_P)"
msgid "Normal"
msgstr "Normalny"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "Nie znaleziono"
msgstr "Otwórz przegląd reguł iptables…"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Otwórz listę..."
msgstr ""
"Pass-through (kopia lustrzana urządzenia fizycznego do pojedynczego MAC VLAN)"
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Hasło"
msgid "Pkts."
msgstr "Pktw."
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Proszę wprowadzić swoją nazwę użytkownika i hasło."
msgid "Potential negation of: %s"
msgstr "Potencjalne odrzucenie: %s"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "Tryb zarządzania energią"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr "Przewidziane błedy CRC (CRCP_P)"
msgstr "Polityka reelekcji głównego niewolnika"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr "Ustawienie tras dla sąsiadów IPv6 z proxy."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr "Ilość poważnych błedów (SES)"
msgstr "Krótki wstęp"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "Pokaż aktualną listę plików kopii zapasowej"
msgid "Signal / Noise"
msgstr "Sygnał/Szum"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "Tłumienie sygnału (SATN)"
msgid "Some fields are invalid, cannot save values!"
msgstr "Wartości pewnych pól są niewłaściwe, nie mogę ich zachować!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "Przepraszamy, ale żądany obiekt nie został znaleziony."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "Przepraszamy, ale serwer napotkał nieoczekiwany błąd."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Status"
msgid "System log buffer size"
msgstr "Rozmiar bufora dziennika systemowego"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "Wybrany tryb %s jest niekompatybilny z szyfrowaniem %s"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr "Zgłoszony token bezpieczeństwa jest nieważny lub wygasł!"
msgid "There are no changes to apply"
msgstr "Nie ma żadnych zmian do zastosowania"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr "Nie wygląda to na ważny plik PEM"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr "Nie można określić interfejsu źródłowego"
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "Nie można wysłać"
msgid "Unable to verify PIN"
msgstr "Nie można zweryfikować kodu PIN"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr "Czas niedostępnośći (UAS)"
msgid "User key (PEM encoded)"
msgstr "Klucz użytkownika (zakodowany PEM)"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Nazwa użytkownika"
msgid "You may add multiple records for the same domain."
msgstr "Możesz dodać wiele rekordów dla tej samej domeny."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Wróć"
+#~ msgid "Back to configuration"
+#~ msgstr "Wróć do konfiguracji"
+
+#~ msgid "Close list..."
+#~ msgstr "Zamknij listę..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "Wewnętrzny błąd serwera"
+
+#~ msgid "No files found"
+#~ msgstr "Nie znaleziono plików"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "Przepraszamy, ale serwer napotkał nieoczekiwany błąd."
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
#~ "Nie przekazuj zapytań, które nie mogą być zrealizowane przez publiczne "
msgid "ATM device number"
msgstr "Número do aparelho ATM"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "ID do vendedor de sistema ATU-C"
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr ""
"Potência de Transmissão Agregada (<abbr title=\"Aggregate Transmit "
msgstr "Uma descrição opcional e curta para este aparelho"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Anexo"
msgid "Authoritative"
msgstr "Autoritário"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Autorização Requerida"
msgid "Back to Overview"
msgstr "Voltar à Visão Global"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Voltar à configuração"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr "Backup / Flash Firmware"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Lista de ficheiros para backup"
msgstr "Intervalo do quadro de monitorização (Beacon)"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"Fechar ligação inativa após um dado tempo em segundos, use 0 para manter a "
"ligação"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Fechar lista..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr "Endereço DS-Lite AFTR"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "Estado da DSL"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "Taxa de Dados"
msgid "Error getting PublicKey"
msgstr "Erro ao obter a PublicKey"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr "Segundos com erro (ES)"
msgid "Force use of NAT-T"
msgstr "Forçar o uso do NAT-T"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr "Chave electrónica do formulário não corresponde"
"Encaminhe as mensagens DHCPv6 entre a interface principal e as interfaces "
"\"downstream\"."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
"Encaminhar segundos da correção de erros ( <abbr title=\"Forward Error "
msgid "Global network options"
msgstr "Opções de rede globais"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr "Ir à atualização do firmware..."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Desligar"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr ""
"Erros de Código de Erro de Cabeçalho (<abbr title=\"Header Error Code\">HEC</"
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "Interno"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "Erro Interno do Servidor"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr "Intervalo para o Envio dos Pacotes de Aprendizagem"
msgid "Invalid hexadecimal value"
msgstr "Valor hexadecimal inválido"
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "Username e/ou password inválidos! Por favor, tente novamente."
"A imagem que está a tentar carregar aparenta não caber na flash do "
"equipamento, por favor verifique o ficheiro da imagem!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr "O intervalo do último membro"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "Latência"
msgid "Limit"
msgstr "Limite"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr "Atenuação de Linha (<abbr title=\"Line Attenuation\">LATN</abbr>)"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr "Modo da Linha"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr "Estado da Linha"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "Tempo de Ativo da Linha"
msgstr "Carregando o conteúdo do diretório…"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "Carregando visualização…"
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr "Rede lógica onde o túnel será adicionado (bridged) (opcional)."
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Login"
msgid "Loose filtering"
msgstr "Filtragem livre"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
"Segundos de Perda de Sinal (<abbr title=\"Loss of Signal Seconds\">LOSS</"
msgid "Lowest leased address as offset from the network address."
msgstr "O endereço mais baixo concedido como deslocamento do endereço da rede."
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr "Intervalo máximo <abbr title=\"Router Advertisement\">RA</abbr>"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr ""
"Taxa de Dados Atingível Máxima (<abbr title=\"Maximum Attainable Data "
msgid "No RX signal"
msgstr "Sem sinal RX"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "Não há entradas neste diretório"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Não foram encontrados ficheiros"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Ruído"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr ""
"Margem de Ruído (<abbr title=\"Razão entre Sinal e Ruído/Signal to Noise "
msgid "Noise:"
msgstr "Ruído:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr ""
"Erros CRC Não Preemptivos<abbr title=\"Non Pre-emptive CRC errors\">CRC_P</"
msgid "Normal"
msgstr "Normal"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "Não encontrado"
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Abrir lista..."
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr "Passagem direta (Aparelho físico espelhado para um único MAC VLAN)"
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Palavra-passe"
msgid "Pkts."
msgstr "Pcts."
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Insira o seu username e password."
msgid "Potential negation of: %s"
msgstr "Negação potencial de: %s"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "Modo de Gestão de Energia"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr ""
"Erros CRC Preemptivos<abbr title=\"Pre-emptive CRC errors\">CRCP_P</abbr>"
msgstr "Política de nova seleção para o escravo primário"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr "Configuração de rotas para vizinhos de IPv6 que fazem proxy."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
"Segundos com erro severos (<abbr title=\"Severely Errored Seconds\">SES</"
msgstr "Preâmbulo curto"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "Mostrar lista ficheiros para backup"
msgid "Signal / Noise"
msgstr "Sinal / Ruído"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "Atenuação do Sinal (<abbr title=\"Signal Attenuation\">SATN</abbr>)"
msgid "Some fields are invalid, cannot save values!"
msgstr "Alguns campos são inválidos, não é possível gravar valores!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "Lamento, o objecto que pediu não foi encontrado."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "Lamento, o servidor encontrou um erro inesperado."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Estado"
msgid "System log buffer size"
msgstr "Tamanho do buffer de registro do sistema"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "O modo %s selecionado é incompatível com a criptografia %s"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr "A chave eletrônica enviada é inválida ou já expirou!"
msgid "There are no changes to apply"
msgstr "Não há alterações a serem aplicadas"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr "Isto não parece ser um ficheiro PEM válido"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr "Não foi possível determinar a interface com a rede externa"
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "Não é possível a expedição"
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr ""
"Segundos de indisponibilidade (<abbr title=\"Unavailable Seconds\">UAS</"
msgid "User key (PEM encoded)"
msgstr "Chave do utilizador (codificada em formato PEM)"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Nome do utilizador"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Voltar"
+#~ msgid "Back to configuration"
+#~ msgstr "Voltar à configuração"
+
+#~ msgid "Close list..."
+#~ msgstr "Fechar lista..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "Erro Interno do Servidor"
+
+#~ msgid "No files found"
+#~ msgstr "Não foram encontrados ficheiros"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "Lamento, o servidor encontrou um erro inesperado."
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
#~ "Não encaminhar pedidos que não possam ser respondidos por servidores "
msgid "ATM device number"
msgstr "Número do dispositivo ATM"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "Identificador de"
msgid "Aggregate Originator Messages"
msgstr "Mensagens agregadas do originador"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr ""
"Potência de Transmissão Agregada (<abbr title=\"Aggregate Transmit "
msgstr "Uma descrição opcional e curta para este dispositivo"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Anexo"
msgid "Authoritative"
msgstr "Autoritário"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Autenticação Obrigatória"
msgid "Back to Overview"
msgstr "Voltar para Visão Geral"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Voltar para configuração"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr "Retorna à configuração de pares"
msgstr "Cópia de Segurança / Gravar Firmware"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Lista de arquivos para a cópia de segurança"
msgstr "Intervalo do quadro de monitoramento (Beacon)"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"Feche as conexões inativas após uma dada quantidade de segundos. Use 0 para "
"manter as conexões"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Fechar a lista..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr "Endereço DS-Lite AFTR"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "Estado da DSL"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "Taxa de Dados"
msgid "Error getting PublicKey"
msgstr "Houve um erro ao obter a PublicKey"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr "Segundos com erro (ES)"
msgid "Force use of NAT-T"
msgstr "Impor o uso de NAT-T"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr "Chave eletrônica do formulário não casa"
"Encaminhe as mensagens DHCPv6 entre a interface principal e as interfaces "
"\"downstream\"."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
"Segundos a frente de correção de erros ( <abbr title=\"Forward Error "
msgid "Global network options"
msgstr "Opção global de rede"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr "Ir para a atualização do firmware..."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Suspender"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr ""
"Erros de Código de Erro de Cabeçalho (<abbr title=\"Header Error Code\">HEC</"
"ponte, visando evitar os loops de transmissão que podem levar toda a LAN a "
"uma paralisação."
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "Interno"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "Erro Interno no Servidor"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr "Intervalo para o Envio dos Pacotes de Aprendizagem"
msgid "Invalid hexadecimal value"
msgstr "Valor hexadecimal inválido"
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "Usuário e/ou senha inválida! Por favor, tente novamente."
"A imagem que está a tentar carregar aparenta nao caber na flash do "
"equipamento. Por favor verifique o arquivo da imagem!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr "O intervalo do último membro"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "Latência"
msgid "Limit"
msgstr "Limite"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr "Atenuação de Linha (<abbr title=\"Line Attenuation\">LATN</abbr>)"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr "Modo da Linha"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr "Estado da Linha"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "Tempo de Atividade da Linha"
msgstr "Carregando conteúdo do diretório…"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "Carregando a visualização…"
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr "Rede lógica onde o túnel será adicionado (bridged) (opcional)."
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Entrar"
msgid "Loose filtering"
msgstr "Filtragem livre"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
"Segundos de Perda de Sinal (<abbr title=\"Loss of Signal Seconds\">LOSS</"
msgid "Lowest leased address as offset from the network address."
msgstr "O endereço mais baixo concedido como deslocamento do endereço da rede."
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr "Intervalo máximo <abbr title=\"Router Advertisement\">RA</abbr>"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr ""
"Taxa de Dados Atingível Máxima (<abbr title=\"Maximum Attainable Data "
msgid "No RX signal"
msgstr "Sem sinal RX"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "Nenhuma entrada neste diretório"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Nenhum arquivo encontrado"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr "Nenhuma regra nftables foi carregada."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Ruído"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr ""
"Margem de Ruído (<abbr title=\"Razão entre Sinal e Ruído/Signal to Noise "
msgid "Noise:"
msgstr "Ruído:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr ""
"Erros CRC Não Preemptivos<abbr title=\"Non Pre-emptive CRC errors\">CRC_P</"
msgid "Normal"
msgstr "Normal"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "Não Encontrado"
msgstr "Abrir a visão geral das regras do iptables…"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Abrir lista..."
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr "Passagem direta (Dispositivo físico espelhado para um único MAC VLAN)"
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Senha"
msgid "Pkts."
msgstr "Pcts."
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Entre com o nome do seu usuário e a senha."
msgid "Potential negation of: %s"
msgstr "Negação potencial de: %s"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "Modo de Gerenciamento de Energia"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr ""
"Erros CRC Preemptivos<abbr title=\"Pre-emptive CRC errors\">CRCP_P</abbr>"
msgstr "Política de nova seleção para o escravo primário"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr "Rotas de configuração para vizinhos IPv6 que tiverem proxy."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
"Segundos com erro severos (<abbr title=\"Severely Errored Seconds\">SES</"
msgstr "Preâmbulo curto"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "Mostra a lista atual de arquivos para a cópia de segurança"
msgid "Signal / Noise"
msgstr "Sinal / Ruído"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "Atenuação do Sinal (<abbr title=\"Signal Attenuation\">SATN</abbr>)"
msgid "Some fields are invalid, cannot save values!"
msgstr "Alguns campos estão inválidos e os valores não podem ser salvos!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "Desculpe o objeto solicitado não foi encontrado."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "Desculpe, o servidor encontrou um erro inesperado."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Condição Geral"
msgid "System log buffer size"
msgstr "Tamanho do buffer de registro do sistema"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "O modo %s selecionado é incompatível com a criptografia %s"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr "A chave eletrônica enviada é inválida ou já expirou!"
msgid "There are no changes to apply"
msgstr "Não há alterações a serem aplicadas"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr "Isso não se parece com um arquivo PEM válido"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr "Não foi possível determinar a interface com a rede externa"
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "Não é possível a expedição"
msgid "Unable to verify PIN"
msgstr "Não foi possível verificar o PIN"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr ""
"Segundos de indisponibilidade (<abbr title=\"Unavailable Seconds\">UAS</"
msgid "User key (PEM encoded)"
msgstr "Chave do usuário (codificada em formato PEM)"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Nome do usuário"
msgid "You may add multiple records for the same domain."
msgstr "Você pode adicionar vários registros para o mesmo domínio."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Voltar"
+#~ msgid "Back to configuration"
+#~ msgstr "Voltar para configuração"
+
+#~ msgid "Close list..."
+#~ msgstr "Fechar a lista..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "Erro Interno no Servidor"
+
+#~ msgid "No files found"
+#~ msgstr "Nenhum arquivo encontrado"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "Desculpe, o servidor encontrou um erro inesperado."
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
#~ "Não encaminhe as requisições que não possam ser respondidas pelos "
msgid "ATM device number"
msgstr "Număr echipament ATM"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "ID-ul furnizorului sistemului ATU-C"
msgid "Aggregate Originator Messages"
msgstr "Agregarea mesajelor inițiatorului"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "Puterea de transmisie agregată (ACTATP)"
msgstr "O scurtă descriere opțională pentru acest dispozitiv"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Anexa"
msgid "Authoritative"
msgstr "Autoritar"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Autorizație Necesară"
msgid "Back to Overview"
msgstr "Înapoi la Prezentare generală"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Înapoi la configurare"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr "Înapoi la configurația peer"
msgstr "Salvați / Scrieți Firmware"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Salvează lista de fișiere"
msgstr "Interval de semnalizare"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"Închideți conexiunea inactivă după un număr de secunde dat, utilizați 0 "
"pentru a menține conexiunea"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Închideți lista..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr "Adresa DS-Lite AFTR"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "Starea DSL"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "Rata de date"
msgid "Error getting PublicKey"
msgstr "Eroare la obținerea PublicKey"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr "Secunde eronate (ES)"
msgid "Force use of NAT-T"
msgstr "Forțați utilizarea NAT-T"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr "Necorespundere între simboluri de formular"
"Redirecționează mesajele DHCPv6 între interfața principală desemnată și "
"interfețele din downstream."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr "Secunde de corecție a erorilor înainte (FECS)"
msgid "Global network options"
msgstr "Opțiuni de rețea globală"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr "Mergeți la actualizarea firmware-ului..."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Închideți"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr "Erori de cod de eroare de antet (HEC)"
"evitare a buclelor de bridge pentru a evita buclele de difuzare care pot "
"bloca întreaga rețea LAN."
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "Internă"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "Eroare internă de server"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr "Interval pentru trimiterea pachetelor de învățare"
msgid "Invalid hexadecimal value"
msgstr "Valoare hexazecimală invalidă"
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr ""
"Numele de utilizator și/sau parola nevalide! Vă rugăm să încercați din nou."
"Se pare că încercați să scrieți o imagine care nu se încadrează în memoria "
"flash, vă rugăm să verificați fișierul imagine!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr "Intervalul ultimului membru"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "Latență"
msgid "Limit"
msgstr "Limită"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr "Atenuarea liniei (LATN)"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr "Mod linie"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr "Stare de linie"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "Timpul de funcționare a liniei"
msgstr "Încărcarea conținutului directorului…"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "Se încarcă vizualizarea…"
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr "Rețeaua logică la care va fi adăugat tunelul (punte) (opțional)."
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Autentificare"
msgid "Loose filtering"
msgstr "Filtrare liberă"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr "Secunde de pierdere a semnalului (LOSS)"
msgid "Lowest leased address as offset from the network address."
msgstr "Cea mai joasă adresă închiriată ca decalaj față de adresa de rețea."
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr "Intervalul maxim <abbr title=\"Router Advertisement\">RA</abbr>"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr "Max. Rata de date realizabilă (ATTNDR)"
msgid "No RX signal"
msgstr "Fără recepție semnal (RX)"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "Fără intrări în acest director"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Nu s-au găsit fișiere"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr "Nu s-a încărcat niciun set de reguli nftables."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Zgomot"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr "Marja de zgomot (SNR)"
msgid "Noise:"
msgstr "Zgomot:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr "Erori CRC non-preemptive (CRC_P)"
msgid "Normal"
msgstr "Normal"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "Nu a fost găsit"
msgstr "Deschideți prezentarea generală a regulilor iptables…"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Deschideți lista..."
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr "Pass-through (dispozitiv fizic în oglindă pentru un singur MAC VLAN)"
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Parolă"
msgid "Pkts."
msgstr "Pachete."
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Vă rugăm să introduceți numele de utilizator și parola."
msgid "Potential negation of: %s"
msgstr "Negație potențială a: %s"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "Modul de gestionare a energiei"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr "Erori CRC preemptive (CRCP_P)"
msgstr "Politica de realegere pentru secundara principală"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr "Configurarea rutelor pentru vecinii IPv6 proxi."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr "Secunde cu erori grave (SES)"
msgstr "Expunere Scurtă"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "Afișați lista curentă de fișiere de rezervă"
msgid "Signal / Noise"
msgstr "Semnal / Zgomot"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "Atenuarea semnalului (SATN)"
msgid "Some fields are invalid, cannot save values!"
msgstr "Unele câmpuri sunt invalide, nu se pot salva valorile!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "Ne pare rău, obiectul pe care l-ați solicitat nu a fost găsit."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "Ne pare rău, serverul a întâmpinat o eroare neașteptată."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Stare"
msgid "System log buffer size"
msgstr "Dimensiunea tamponului de jurnal de sistem"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "Modul %s selectat este incompatibil cu criptarea %s"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr "Tokenul de securitate trimis este nevalid sau a expirat deja!"
msgid "There are no changes to apply"
msgstr "Nu există modificări de aplicat"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr "Acesta nu pare a fi un fișier PEM valid"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr "Nu se poate determina interfața în flux ascendent"
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "Imposibilitatea de a expedia"
msgid "Unable to verify PIN"
msgstr "Nu se poate verifica PIN-ul"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr "Secunde indisponibile (UAS)"
msgid "User key (PEM encoded)"
msgstr "Cheie utilizator (codare PEM)"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Nume Utilizator"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Înapoi"
+#~ msgid "Back to configuration"
+#~ msgstr "Înapoi la configurare"
+
+#~ msgid "Close list..."
+#~ msgstr "Închideți lista..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "Eroare internă de server"
+
+#~ msgid "No files found"
+#~ msgstr "Nu s-au găsit fișiere"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "Ne pare rău, serverul a întâmpinat o eroare neașteptată."
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
#~ "Nu transmiteți interogări la care nu pot răspunde rezolvatorii publici."
msgid "ATM device number"
msgstr "ATM номер устройства"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "ATU-C идентификатор производителя"
msgid "Aggregate Originator Messages"
msgstr "Агрегировать сообщения отправителей"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "Общая мощность передачи (ACTATP)"
msgstr "Необязательное, краткое описание для этого устройства"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Annex"
msgid "Authoritative"
msgstr "Основной"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Веб-интерфейс"
msgid "Back to Overview"
msgstr "Назад к обзору"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Назад к настройкам"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr "Вернуться к конфигурации узла"
msgstr "Восстановление / Обновление"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Список файлов для резервного копирования"
msgstr "Интервал рассылки пакетов Beacon"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"Завершать неактивное соединение после заданного интервала (сек.), "
"используйте значение 0 для удержания неактивного соединения"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Закрыть список..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr "DS-Lite AFTR-адрес"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "Состояние DSL"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "Скорость передачи данных"
msgid "Error getting PublicKey"
msgstr "Ошибка получения публичного ключа"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr "Ошибочные секунды (ES)"
msgid "Force use of NAT-T"
msgstr "Принудительно использовать NAT-T"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr "Несоответствие маркеров формы"
"Пересылать сообщения DHCPv6 между назначенным мастер интерфейсом и "
"downstream интерфейсами."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr "Секунды прямой коррекции ошибок (FECS)"
msgid "Global network options"
msgstr "Основные настройки сети"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr "Перейти к обновлению прошивки..."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Перезапустить"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr "Ошибки контроля ошибок заголовка (HEC)"
"мостовых петель, чтобы избежать широковещательных петель, которые могут "
"привести к нарушению работы всей локальной сети."
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "Внутренний"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "Внутренняя ошибка сервера"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr "Интервал отправки обучающих (learning) пакетов"
msgid "Invalid hexadecimal value"
msgstr "Неверное шестнадцатеричное значение"
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "Неверный логин и/или пароль! Попробуйте снова."
"Оказалось, что вы пытаетесь прошить устройство прошивкой, которая по размеру "
"не помещается в чип флэш-памяти, проверьте ваш файл прошивки!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr "Интервал последнего членства"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "Задержка"
msgid "Limit"
msgstr "Предел"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr "Затухание линии (LATN)"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr "Режим линии"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr "Состояние Линии"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "Время бесперебойной работы линии"
msgstr "Загрузка содержимого директории…"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "Загрузка страницы…"
msgstr ""
"Логическая сеть, к которой будет добавлен туннель (мост) (опционально)."
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Войти"
msgid "Loose filtering"
msgstr "Слабая фильтрация"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr "Потеря сигнала в секундах (LOSS)"
msgid "Lowest leased address as offset from the network address."
msgstr "Минимальный адрес аренды."
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
"Максимальный интервал <abbr title=\"Router Advertisement\">RA</abbr> "
"сообщений"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr "Макс. достижимая скорость передачи данных (ATTNDR)"
msgid "No RX signal"
msgstr "Rx сигнал отсутствует"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "Нет элементов в этом каталоге"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Файлы не найдены"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr "Не загружен набор правил nftables."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Шум"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr "Соотношение сигнал/шум (SNR)"
msgid "Noise:"
msgstr "Шум:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr "Ошибки без предварительного CRC (CRC_P)"
msgid "Normal"
msgstr "Нормально"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "Не найдено"
msgstr "Открыть обзор правил iptables…"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Открыть список..."
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr "Pass-through (зеркалирование физического устройства в один MAC VLAN)"
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Пароль"
msgid "Pkts."
msgstr "пакетов"
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Пожалуйста, введите имя пользователя и пароль."
msgid "Potential negation of: %s"
msgstr "Потенциальное отрицание: %s"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "Режим управления питанием"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr "Предварительные ошибки CRC (CRCP_P)"
msgstr "Политика переизбрания для первичного ведомого"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr "Настройка маршрутов для проксированных соседей IPv6."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr "Число секунд с многочисленными ошибками (SES)"
msgstr "Короткая преамбула"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "Показать текущий список файлов резервной копии"
msgid "Signal / Noise"
msgstr "Сигнал / шум"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "Затухание сигнала (SATN)"
msgid "Some fields are invalid, cannot save values!"
msgstr "Некоторые значения полей недопустимы, невозможно сохранить информацию!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "Извините, запрошенный объект не был найден."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "Извините, сервер столкнулся с неожиданной ошибкой."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Состояние"
msgid "System log buffer size"
msgstr "Размер системного журнала"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "Выбранный режим %s несовместим с шифрованием %s"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr "Представленный маркер безопасности недействителен или уже истек!"
msgid "There are no changes to apply"
msgstr "Нет изменений для применения"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr "Это не похоже на корректный PEM файл"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr "Невозможно определить основной (upstream) интерфейс"
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "Невозможно обработать запрос для"
msgid "Unable to verify PIN"
msgstr "Не удается проверить PIN-код"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr "Секунды неготовности (UAS)"
msgid "User key (PEM encoded)"
msgstr "Ключ пользователя (PEM encoded)"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Имя пользователя"
msgid "You may add multiple records for the same domain."
msgstr "Вы можете добавить несколько записей для одного и того же домена."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Назад"
+#~ msgid "Back to configuration"
+#~ msgstr "Назад к настройкам"
+
+#~ msgid "Close list..."
+#~ msgstr "Закрыть список..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "Внутренняя ошибка сервера"
+
+#~ msgid "No files found"
+#~ msgstr "Файлы не найдены"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "Извините, сервер столкнулся с неожиданной ошибкой."
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
#~ "Не перенаправлять запросы, которые не могут быть обработаны публичными "
msgid "ATM device number"
msgstr "Číslo zariadenia ATM"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr ""
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr ""
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr ""
msgid "Authoritative"
msgstr "Autoritatívny"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Vyžaduje sa overenie totožnosti"
msgid "Back to Overview"
msgstr "Späť na prehľad"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Späť na konfiguráciu"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr "Zálohovať / nahrať firmvér"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"persist connection"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Zavrieť zoznam..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "Stav DSL"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "Prenosová rýchlosť"
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr ""
msgid "Force use of NAT-T"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr ""
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
msgid "Global network options"
msgstr "Globálne voľby siete"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Zložiť"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr ""
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "Interná chyba serveru"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr ""
"Zdá sa, že sa pokúšate nahrať obraz, ktorý sa nezmestí do pamäte flash. "
"Prosím, overte súbor obrazu!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "Oneskorenie"
msgid "Limit"
msgstr "Obmedzenie"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr "Režim linky"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr "Stav linky"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "Doba pripojenia linky"
msgstr "Načítava sa obsah priečinka…"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "Načítava sa zobrazenie…"
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Prihlásiť sa"
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr "Sekundy straty signálu (LOSS)"
msgid "Lowest leased address as offset from the network address."
msgstr ""
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr ""
msgid "No RX signal"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "V tomto adresári nie sú žiadne položky"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Nenašli sa žiadne súbory"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Šum"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr ""
msgid "Noise:"
msgstr "Šum:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr ""
msgid "Normal"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "Nenájdené"
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Otvoriť zoznam..."
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Heslo"
msgid "Pkts."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Prosím, zadajte vaše používateľské meno a heslo."
msgid "Potential negation of: %s"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "Režim správy napájania"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr ""
msgid "Signal / Noise"
msgstr "Signál / Šum"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr ""
msgid "Some fields are invalid, cannot save values!"
msgstr "Niektoré polia sú neplatné. Nedajú sa uložiť hodnoty!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "Prepáčte, objekt, ktorý ste požadovali sa nenašiel."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "Prepáčte, serve narazil na neočakávanú chybu."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Stav"
msgid "System log buffer size"
msgstr "Veľkosť vyrovnávacej pamäte systémového denníka"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "Vybraný režim %s nie je kompatibilný so šifrovaním %s"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr ""
msgid "There are no changes to apply"
msgstr "Nie sú žiadne zmeny na aplikovanie"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr ""
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr ""
msgid "User key (PEM encoded)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Používateľské meno"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Späť"
+#~ msgid "Back to configuration"
+#~ msgstr "Späť na konfiguráciu"
+
+#~ msgid "Close list..."
+#~ msgstr "Zavrieť zoznam..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "Interná chyba serveru"
+
+#~ msgid "No files found"
+#~ msgstr "Nenašli sa žiadne súbory"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "Prepáčte, serve narazil na neočakávanú chybu."
+
#~ msgid "Generate Key"
#~ msgstr "Generovať kľúč"
msgid "ATM device number"
msgstr "ATM enhetsnummer"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr ""
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr ""
msgstr "En valfri, kort beskrivning för den här enheten"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Tillbyggnad"
msgid "Authoritative"
msgstr "Auktoritär"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Tillstånd krävs"
msgid "Back to Overview"
msgstr "Backa till Överblick"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Backa till konfiguration"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr "Säkerhetskopiera / Flasha inre mjukvara"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Säkerhetskopiera fillista"
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"persist connection"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Stäng ner lista..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "DSL-status"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "Datahastighet"
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr ""
msgid "Force use of NAT-T"
msgstr "Tvinga användning av NAT-T"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr ""
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
msgid "Global network options"
msgstr "Globala nätverksalternativ"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Lägg på"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr ""
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "Internt"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "Internt server-fel"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "Ogiltigt användarnamn och/eller lösenord! Vänligen försök igen."
"flash memory, please verify the image file!"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "Latens"
msgid "Limit"
msgstr "Begränsa"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr ""
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Logga in"
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
msgid "Lowest leased address as offset from the network address."
msgstr ""
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr ""
msgid "No RX signal"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Inga filer hittades"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Buller"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr ""
msgid "Noise:"
msgstr "Buller:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr ""
msgid "Normal"
msgstr "Normal"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "Hittades inte"
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Öppna lista..."
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Lösenord"
msgid "Pkts."
msgstr "Pkt."
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Vänligen ange ditt användarnamn och lösenord."
msgid "Potential negation of: %s"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr ""
msgid "Signal / Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr ""
msgid "Some fields are invalid, cannot save values!"
msgstr "Några fält är ogiltiga, kan inte spara värden!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "Tyvärr, objektet som du frågade efter kunde inte hittas."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "Tyvärr, servern stötte på ett oväntat fel."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Status"
msgid "System log buffer size"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr ""
msgid "There are no changes to apply"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "Det går inte att skicka"
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr "Otillgängliga Sekunder (UAS)"
msgid "User key (PEM encoded)"
msgstr "Användarnyckel (PEM-krypterad)"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Användarnamn"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Bakåt"
+#~ msgid "Back to configuration"
+#~ msgstr "Backa till konfiguration"
+
+#~ msgid "Close list..."
+#~ msgstr "Stäng ner lista..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "Internt server-fel"
+
+#~ msgid "No files found"
+#~ msgstr "Inga filer hittades"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "Tyvärr, servern stötte på ett oväntat fel."
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
#~ "Vidarebefordra inte förfrågningar som inte kan ta emot svar från publika "
msgid "ATM device number"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr ""
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr ""
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr ""
msgid "Authoritative"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr ""
msgid "Back to Overview"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr ""
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"persist connection"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr ""
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr ""
msgid "DUID"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr ""
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr ""
msgid "Force use of NAT-T"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr ""
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
msgid "Global network options"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr ""
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr ""
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr ""
"flash memory, please verify the image file!"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr ""
msgid "Limit"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr ""
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr ""
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
msgid "Lowest leased address as offset from the network address."
msgstr ""
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr ""
msgid "No RX signal"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr ""
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr ""
msgid "Noise:"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr ""
msgid "Normal"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr ""
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr ""
msgid "Pkts."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr ""
msgid "Potential negation of: %s"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr ""
msgid "Signal / Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr ""
msgid "Some fields are invalid, cannot save values!"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr ""
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr ""
msgid "System log buffer size"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr ""
msgid "There are no changes to apply"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr ""
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr ""
msgid "User key (PEM encoded)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr ""
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "ATM device number"
msgstr "ATM cihaz numarası"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "ATU-C Sistem Satıcısı Kimliği"
msgid "Aggregate Originator Messages"
msgstr "Gönderen Mesajlarını Birleştir"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "Toplam İletim Gücü (ACTATP)"
msgstr "Bu cihaz için isteğe bağlı, kısa bir açıklama"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Annex"
msgid "Authoritative"
msgstr "Yetkili"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "İzin Gerekli"
msgid "Back to Overview"
msgstr "Genel Bakışa dön"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Yapılandırmaya dön"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr "Eş yapılandırmasına geri dön"
msgstr "Yedekleme/Sistem Yazılımı Yükleme"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Yedek dosya listesi"
msgstr "İşaret Aralığı"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"Belirli bir saniye süresinden sonra etkin olmayan bağlantıyı kapatın, "
"bağlantıyı sürdürmek için 0'ı kullanın"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Listeyi kapat..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr "DS-Lite AFTR adresi"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "DSL Durumu"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "Veri hızı"
msgid "Error getting PublicKey"
msgstr "PublicKey alınırken hata oluştu"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr "Hatalı saniye (ES)"
msgid "Force use of NAT-T"
msgstr "NAT-T'yi kullanmaya zorla"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr "Form belirteci uyuşmazlığı"
"DHCPv6 mesajlarını belirlenen ana arabirim ve aşağı akış arabirimleri "
"arasında ilet."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr "İleri Hata Düzeltme Saniyelesi (FECS)"
msgid "Global network options"
msgstr "Genel ağ seçenekleri"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr "Ürün yazılımı yükseltmesine git..."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Kapat"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr "Üstbilgi Hata Kodu Hataları (HEC)"
"döngülerinden kaçınmak için köprü döngüsünden kaçınmanın etkinleştirilmesi "
"tavsiye edilir."
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "İç"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "İç Sunucu Hatası"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr "Öğrenme Paketlerini Gönderme Aralığı"
msgid "Invalid hexadecimal value"
msgstr "Geçersiz onaltılık değer"
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "Geçersiz kullanıcı adı ve/veya şifre! Lütfen tekrar deneyin."
"Flash belleğe sığmayan bir görüntüyü flaş etmeye çalıştığınız anlaşılıyor, "
"lütfen görüntü dosyasını doğrulayın!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr "Son üye aralığı"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "Gecikme"
msgid "Limit"
msgstr "Sınır"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr "Hat Zayıflaması (LATN)"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr "Hat Modu"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr "Hat Durumu"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "Hat Çalışma Süresi"
msgstr "Dizin içeriği yükleniyor…"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "Görünüm yükleniyor…"
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr "Tünelin ekleneceği mantıksal ağ (köprülü) (isteğe bağlı)."
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Oturum Aç"
msgid "Loose filtering"
msgstr "Gevşek filtreleme"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr "Sinyal Saniye Kaybı (LOSS)"
msgid "Lowest leased address as offset from the network address."
msgstr "Ağ adresinden ofset olarak en düşük kiralanan adres."
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr "Maks <abbr title=\"Router Advertisement\">RA</abbr> aralığı"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr "Maks. Ulaşılabilir Veri Hızı (ATTNDR)"
msgid "No RX signal"
msgstr "RX sinyali yok"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "Bu dizinde giriş yok"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Dosya bulunamadı"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr "Yüklü nftables kural kümesi yok."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Gürültü"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr "Gürültü Marjı (SNR)"
msgid "Noise:"
msgstr "Gürültü:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr "Önleyici Olmayan CRC hataları (CRC_P)"
msgid "Normal"
msgstr "Normal"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "Bulunamadı"
msgstr "iptables kurallarına genel bakışı aç…"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Listeyi aç..."
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr "Geçiş (Fiziksel cihazı tek bir MAC VLAN'a yansıtın)"
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Parola"
msgid "Pkts."
msgstr "Pktler."
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Lütfen kullanıcı adınızı ve şifrenizi giriniz."
msgid "Potential negation of: %s"
msgstr "Olası olumsuzluk: %s"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "Güç Yönetimi Modu"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr "Önleyici CRC hataları (CRCP_P)"
msgstr "Birincil bağımlı için yeniden seçim politikası"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr "Proxy'li IPv6 komşuları için kurulum yolları."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr "Ciddi Şekilde Hatalı Saniyeler (SES)"
msgstr "Kısa Başlangıç"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "Mevcut yedekleme dosyası listesini göster"
msgid "Signal / Noise"
msgstr "Sinyal / Gürültü"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "Sinyal Zayıflaması (SATN)"
msgid "Some fields are invalid, cannot save values!"
msgstr "Bazı alanlar geçersizdir, değerler kaydedilemez!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "Üzgünüz, istediğiniz nesne bulunamadı."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "Üzgünüz, sunucu beklenmedik bir hatayla karşılaştı."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Durum"
msgid "System log buffer size"
msgstr "Sistem günlüğü arabellek boyutu"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "Seçilen %s modu, %s şifrelemesiyle uyumlu değil"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr "Gönderilen güvenlik jetonu geçersiz veya süresi zaten dolmuş!"
msgid "There are no changes to apply"
msgstr "Uygulanabilecek değişiklik yok"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr "Bu geçerli bir PEM dosyası gibi görünmüyor"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr "Yukarı akış arayüzü belirlenemiyor"
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "Gönderilemiyor"
msgid "Unable to verify PIN"
msgstr "PIN doğrulanamadı"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr "Kullanılamayan Saniyeler (UAS)"
msgid "User key (PEM encoded)"
msgstr "Kullanıcı anahtarı (PEM kodlu)"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Kullanıcı adı"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Geri"
+#~ msgid "Back to configuration"
+#~ msgstr "Yapılandırmaya dön"
+
+#~ msgid "Close list..."
+#~ msgstr "Listeyi kapat..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "İç Sunucu Hatası"
+
+#~ msgid "No files found"
+#~ msgstr "Dosya bulunamadı"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "Üzgünüz, sunucu beklenmedik bir hatayla karşılaştı."
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr "Genel ad sunucuları tarafından yanıtlanamayan istekleri iletme."
msgid "ATM device number"
msgstr "Номер ATM-пристрою"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "Ідентифікатор постачальника системи ATU-C"
msgid "Aggregate Originator Messages"
msgstr "Складати повідомлення відправників"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "Сукупна потужність передавача (ACTATP)"
msgstr "Необов'язковий, короткий опис для цього пристрою"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Annex"
msgid "Authoritative"
msgstr "Надійний"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Потрібна авторизація"
msgid "Back to Overview"
msgstr "Повернутися до переліку"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Повернутися до конфігурування"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr "Рез. копіювання / Перепрош."
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Список файлів резервних копій"
msgstr "Інтервал маяка"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"Закривати неактивні з'єднання після вказаного інтервалу часу (секунди). Для "
"утримання неактивних з'єднань використовуйте 0"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Згорнути список..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr "AFTR-адреса DS-Lite"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "Стан DSL"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "Швидк. передавання"
msgid "Error getting PublicKey"
msgstr "Помилка отримання публічного ключа"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr "Секунд з помилками (<abbr title=\"Errored seconds\">ES</abbr>)"
msgid "Force use of NAT-T"
msgstr "Примусово використовувати NAT-T"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr "Неузгодженість маркера форми"
"Пересилати повідомлення DHCPv6 між призначеним майстер-інтерфейсом та "
"downstream інтерфейсами."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr "Секунди прямого коригування помилок (FECS)"
msgid "Global network options"
msgstr "Глобальні параметри мережі"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr "Перейти до оновлення прошивки..."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Призупинити"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr ""
"Помилки коду помилок заголовка (<abbr title=\"Header Error Control\">HEC</"
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "Внутрішній"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "Внутрішня помилка сервера"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr "Інтервал відсилання навчальних (learning) пакетів"
msgid "Invalid hexadecimal value"
msgstr "Неприпустиме шістнадцяткове значення"
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "Неприпустиме ім'я користувача та/або пароль! Спробуйте ще раз."
"Схоже, що ви намагаєтеся прошити образ, який не вміщається до флеш-пам'яті! "
"Перевірте файл образу!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr "Інтервал останнього членства"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "Затримка"
msgid "Limit"
msgstr "Межа"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr "Затухання лінії"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr "Режим лінії"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr "Стан лінії"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "Час безперервної роботи лінії"
msgstr "Завантаження вмісту каталогу…"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "Завантаження подання…"
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr "Логічна мережа, до якої буде додано тунель (міст) (необов'язково)."
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Увійти"
msgid "Loose filtering"
msgstr "Слабка фільтрація"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
"Втрата сигналу в секундах (<abbr title=\"Loss of Signal Seconds\">LOSS</"
msgid "Lowest leased address as offset from the network address."
msgstr "Найнижча орендована адреса."
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
"Максимальний інтервал <abbr title=\"Router Advertisement\">RA</abbr> "
"повідомлень"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr "Макс. досяжна швидкість передачі даних (ATTNDR)"
msgid "No RX signal"
msgstr "Сигналу RX немає"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "У цьому каталозі немає записів"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Файли не знайдено"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Шум"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr "Співвідношення сигнал/шум"
msgid "Noise:"
msgstr "Шум:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr "Не запобіжні помилки CRC (CRC_P)"
msgid "Normal"
msgstr "Нормальна"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "Не знайдено"
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Відкрити список..."
msgstr ""
"Pass-through (дзеркальне відображення фізичного пристрою у один MAC VLAN)"
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Пароль"
msgid "Pkts."
msgstr "пакетів"
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Введіть ім'я користувача і пароль."
msgid "Potential negation of: %s"
msgstr "Потенційне заперечення: %s"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "Режим керування живленням"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr "Попереджувати помилки CRC (CRCP_P)"
msgstr "Політика повторного вибору первинного веденого"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr "Налаштування маршрутів для проксі-сусідів IPv6."
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
"Секунди з великою кількістю помилок (<abbr title=\"Severely Errored "
msgstr "Коротка преамбула"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "Показати поточний список файлів резервного копіювання"
msgid "Signal / Noise"
msgstr "Сигнал / шум"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "Затухання сигналу (SATN)"
msgid "Some fields are invalid, cannot save values!"
msgstr "Деякі поля є неприпустимими, неможливо зберегти значення!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "На жаль, об'єкт, який ви просили, не знайдено."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "На жаль, на сервері сталася неочікувана помилка."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Стан"
msgid "System log buffer size"
msgstr "Розмір буфера системного журналу"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "Обраний режим %s несумісний із шифруванням %s"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr "Поданий маркер безпеки недійсний або вже збіг!"
msgid "There are no changes to apply"
msgstr "Немає жодних змін до застосування"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr "Це не схоже на дійсний файл PEM"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr "Не вдалося визначити висхідний інтерфейс"
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "Не вдалося опрацювати запит"
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr "Недоступні секунди (<abbr title=\"Unavailable Seconds\">UAS</abbr>)"
msgid "User key (PEM encoded)"
msgstr "Ключ користувача (PEM-кодований)"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Ім'я користувача"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Назад"
+#~ msgid "Back to configuration"
+#~ msgstr "Повернутися до конфігурування"
+
+#~ msgid "Close list..."
+#~ msgstr "Згорнути список..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "Внутрішня помилка сервера"
+
+#~ msgid "No files found"
+#~ msgstr "Файли не знайдено"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "На жаль, на сервері сталася неочікувана помилка."
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
#~ "Не переспрямовувати запити, які не може бути оброблено відкритими "
msgid "ATM device number"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr ""
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr ""
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr ""
msgid "Authoritative"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr ""
msgid "Back to Overview"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr ""
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"persist connection"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr ""
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr ""
msgid "DUID"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr ""
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr ""
msgid "Force use of NAT-T"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr ""
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
msgid "Global network options"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr ""
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr ""
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr ""
"flash memory, please verify the image file!"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr ""
msgid "Limit"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr ""
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr ""
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
msgid "Lowest leased address as offset from the network address."
msgstr ""
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr ""
msgid "No RX signal"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr ""
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr ""
msgid "Noise:"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr ""
msgid "Normal"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr ""
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr ""
msgid "Pkts."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr ""
msgid "Potential negation of: %s"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr ""
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
msgstr "شورٹ Preamble"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr ""
msgid "Signal / Noise"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr ""
msgid "Some fields are invalid, cannot save values!"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr ""
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr ""
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr ""
msgid "System log buffer size"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr ""
msgid "There are no changes to apply"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr ""
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr ""
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr ""
msgid "User key (PEM encoded)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr ""
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "ATM device number"
msgstr "Số hiệu thiết bị ATM"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "Hệ thống cung cấp ID ATU-C"
msgid "Aggregate Originator Messages"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "Năng lượng truyền tổng hợp(ACTATP)"
msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr ""
msgid "Authoritative"
msgstr "Xác thực"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "Yêu cầu ủy quyền"
msgid "Back to Overview"
msgstr "Quay lại phần tổng quan"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "Quay lại phần cài đặt"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr ""
msgstr "Sao lưu / cập nhật phần mềm"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "Danh sách tập tin sau lưu"
msgstr "Chu kỳ Beacon"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"Đóng kết nối không hoạt động sau lượng thời gian đã cho, sử dụng 0 để luôn "
"duy trì kết nối"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "Danh sách đã đóng ..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr "Địa chỉ DS_-Lite AFTR"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "Trạng thái DSL"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "Tốc độ dữ liệu"
msgid "Error getting PublicKey"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr ""
msgid "Force use of NAT-T"
msgstr "Buộc dùng NAT-T"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr "Mẫu mã thông báo không khớp"
"downstream interfaces."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr ""
msgid "Global network options"
msgstr "Tùy chọn mạng toàn cầu"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "Hang Up"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr "Lỗi mã tiêu đề (HEC)"
"order to avoid broadcast loops that can bring the entire LAN to a standstill."
msgstr ""
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "Nội"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "Lỗi máy chủ nội"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr ""
msgid "Invalid hexadecimal value"
msgstr "Giá trị không hợp lệ"
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "Tên và mật mã không đúng. Xin thử lại "
"Dường như bạn cố gắng flash một hình ảnh không phù hợp với bộ nhớ flash, xin "
"vui lòng xác minh các tập tin hình ảnh!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "Độ trễ"
msgid "Limit"
msgstr "Giới hạn "
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr ""
msgstr "Đang tải nội dung thư mục..."
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "Tải cảnh..."
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "Đăng nhập "
msgid "Loose filtering"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr "Mất tín hiệu (LOSS)"
msgid "Lowest leased address as offset from the network address."
msgstr "Địa chỉ thuê thấp nhất dưới dạng bù từ địa chỉ mạng"
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr "Tối đa tốc độ dữ liệu đạt được (ATTNDR)"
msgid "No RX signal"
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "Không có gì trong đường dẫn này"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "Không tìm thấy tập tin"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "Nhiễu"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr "Tỉ lệ cường độ nhiễu (SRN)"
msgid "Noise:"
msgstr "Nhiễu:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr "Lỗi CRC không tiền phát sinh (CRC_P)"
msgid "Normal"
msgstr "Thường"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "Không tìm thấy"
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "Đang mở danh sách ..."
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "Mật mã"
msgid "Pkts."
msgstr ""
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "Nhập tên và mật mã"
msgid "Potential negation of: %s"
msgstr "Phủ định tiềm năng của: %s"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "Chế độ kiểm soát năng lượng"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr "Lỗi CRC ưu tiên (CRCP_P)"
msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr ""
msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "Hiển thị danh sách tập tin lưu trữ"
msgid "Signal / Noise"
msgstr "Tín hiệu / Nhiễu"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "Độ suy hao tín hiệu (SATN)"
msgid "Some fields are invalid, cannot save values!"
msgstr "Có trường không hợp lệ, không thể lưu giá trị!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "Xin lỗi, không thể tìm được đối tượng bạn yêu cầu"
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "Xin lỗi, máy chủ đã gặp lỗi không mong muốn"
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "Trạng thái"
msgid "System log buffer size"
msgstr "Kích cỡ bộ đệm nhật ký hệ thống"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "Chế độ %s được chọn không tương thích với mã hóa %s"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr "Mã thông báo bảo mật đã gửi không hợp lệ hoặc đã hết hạn!"
msgid "There are no changes to apply"
msgstr "Không có thay đổi nào để áp dụng"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr "Tập tin không giống như một tệp PEM hợp lệ"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr "Không thể xác định dòng dữ liệu giao diện mạng"
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "Không thể gửi"
msgid "Unable to verify PIN"
msgstr ""
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr ""
msgid "User key (PEM encoded)"
msgstr "Khóa người dùng (mã hóa PEM)"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "Tên người dùng "
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« Quay lại"
+#~ msgid "Back to configuration"
+#~ msgstr "Quay lại phần cài đặt"
+
+#~ msgid "Close list..."
+#~ msgstr "Danh sách đã đóng ..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "Lỗi máy chủ nội"
+
+#~ msgid "No files found"
+#~ msgstr "Không tìm thấy tập tin"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "Xin lỗi, máy chủ đã gặp lỗi không mong muốn"
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr ""
#~ "Không chuyển tiếp yêu cầu mà máy chủ tên công cộng không thể trả lời"
msgid "ATM device number"
msgstr "ATM 设备号码"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "ATU-C 系统供应商 ID"
msgid "Aggregate Originator Messages"
msgstr "聚合发起者消息"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "总发射功率(ACTATP)"
msgstr "此设备的可选简短描述"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "Annex"
msgid "Authoritative"
msgstr "唯一授权"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "需要授权"
msgid "Back to Overview"
msgstr "返回至概览"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "返回至配置"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr "返回 peer 配置"
msgstr "备份与升级"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "文件备份列表"
msgstr "信标间隔"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"persist connection"
msgstr "在给定时间(秒)后关闭非活动链接,0 为保持连接"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "关闭列表…"
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr "DS-Lite AFTR 地址"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "DSL 状态"
msgid "DUID"
msgstr "DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "数据速率"
msgid "Error getting PublicKey"
msgstr "获取公钥时出错"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr "错误秒数(ES)"
msgid "Force use of NAT-T"
msgstr "强制使用 NAT-T"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr "表单令牌不匹配"
"downstream interfaces."
msgstr "在指定的主接口和下游接口之间转发 DHCPv6 消息。"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr "前向纠错秒数(FECS)"
msgid "Global network options"
msgstr "全局网络选项"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr "转到固件升级…"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "挂起"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr "请求头错误代码错误(HEC)"
"在桥接 LAN 设置中,建议启用桥接环路避免功能,以避免可导致整个 LAN 停止的广播"
"环路。"
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "内部"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "内部服务器错误"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr "学习包发送间隔"
msgid "Invalid hexadecimal value"
msgstr "无效 16 进制值"
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "无效的用户名和/或密码!请重试。"
"flash memory, please verify the image file!"
msgstr "您尝试刷写的固件与此设备不兼容,请检查固件文件!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr "最后成员间隔"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "延迟"
msgid "Limit"
msgstr "客户数"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr "线路衰减(LATN)"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr "线路模式"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr "线路状态"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "线路运行时间"
msgstr "正在载入目录内容…"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "正在载入视图…"
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr "隧道将要被添加(桥接)到的逻辑网络(可选)。"
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "登录"
msgid "Loose filtering"
msgstr "宽松过滤"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr "信号丢失秒数(LOSS)"
msgid "Lowest leased address as offset from the network address."
msgstr "网络地址的起始分配基址。"
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr "最长 <abbr title=\"路由器通告\">RA</abbr> 间隔"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr "最大可达数据速率(ATTNDR)"
msgid "No RX signal"
msgstr "无接收信号"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "此目录中没有内容"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "未找到文件"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr "未加载 nftables 规则集。"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "噪声"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr "噪声容限(SNR)"
msgid "Noise:"
msgstr "噪声:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr "非抢占 CRC 错误(CRC_P)"
msgid "Normal"
msgstr "正常"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "未找到"
msgstr "打开 iptables 规则概况…"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "打开列表…"
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr "直通(将物理设备镜像到单个 MAC VLAN)"
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "密码"
msgid "Pkts."
msgstr "Pkts."
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "请输入用户名和密码。"
msgid "Potential negation of: %s"
msgstr "可能存在的冲突:%s"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "电源管理模式"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr "抢占式 CRC 错误(CRCP_P)"
msgstr "主从属设备的重选策略"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr "设置已代理 IPv6 邻居的路由。"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr "严重误码秒(SES)"
msgstr "Short Preamble"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "显示当前备份文件列表"
msgid "Signal / Noise"
msgstr "信号/噪声"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "信号衰减(SATN)"
msgid "Some fields are invalid, cannot save values!"
msgstr "一些字段的值无效,无法保存!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "对不起,请求的目标未找到。"
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "对不起,服务器遇到未知错误。"
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "状态"
msgid "System log buffer size"
msgstr "系统日志缓冲区大小"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "模式 %s 与 %s 加密方法不兼容"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr "提交的安全令牌无效或已过期!"
msgid "There are no changes to apply"
msgstr "没有待应用的更改"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr "这不是有效的 PEM 文件"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr "无法确认上游接口"
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "无法调度"
msgid "Unable to verify PIN"
msgstr "无法验证 PIN"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr "不可用秒数(UAS)"
msgid "User key (PEM encoded)"
msgstr "用户密钥(PEM)"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "用户名"
msgid "You may add multiple records for the same domain."
msgstr "你可以为同一个域添加多条记录。"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« 后退"
+#~ msgid "Back to configuration"
+#~ msgstr "返回至配置"
+
+#~ msgid "Close list..."
+#~ msgstr "关闭列表…"
+
+#~ msgid "Internal Server Error"
+#~ msgstr "内部服务器错误"
+
+#~ msgid "No files found"
+#~ msgstr "未找到文件"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "对不起,服务器遇到未知错误。"
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr "不转发公共域名服务器无法回应的请求。"
msgid "ATM device number"
msgstr "ATM裝置號碼"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
msgid "ATU-C System Vendor ID"
msgstr "ATU-C 系統廠牌 ID"
msgid "Aggregate Originator Messages"
msgstr "聚合發起方消息"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
msgid "Aggregate Transmit Power (ACTATP)"
msgstr "彙總發送功率(ACTATP)"
msgstr "此裝置的可選簡短描述"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1484
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
msgid "Annex"
msgstr "附件"
msgid "Authoritative"
msgstr "授權"
-#: modules/luci-base/luasrc/view/sysauth.htm:17
+#: modules/luci-base/ucode/template/sysauth.ut:17
#: themes/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js:11
msgid "Authorization Required"
msgstr "需要授權"
msgid "Back to Overview"
msgstr "返回至總覽"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48
-msgid "Back to configuration"
-msgstr "返回至設定"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:826
msgid "Back to peer configuration"
msgstr "返回 peer 設定"
msgstr "備份/燒錄韌體"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:351
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12
msgid "Backup file list"
msgstr "備份檔列表"
msgstr "訊號間隔"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
"persist connection"
msgstr "幾秒後關閉閒置的連線, 打0代表永遠連線"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49
-msgid "Close list..."
-msgstr "關閉清單..."
-
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:44
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:63
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2184
msgstr "DS-Lite AFTR 位址"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:1481
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:44
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45
msgid "DSL"
msgstr "DSL"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:15
msgid "DSL Status"
msgstr "DSL 狀態"
msgid "DUID"
msgstr "DHCP獨立式別碼DUID"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
msgid "Data Rate"
msgstr "資料速率"
msgid "Error getting PublicKey"
msgstr "獲取公鑰時出錯"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
msgid "Errored seconds (ES)"
msgstr "錯誤秒數 (ES)"
msgid "Force use of NAT-T"
msgstr "強制使用 NAT-T"
-#: modules/luci-base/luasrc/view/csrftoken.htm:8
+#: modules/luci-base/ucode/template/csrftoken.ut:8
msgid "Form token mismatch"
msgstr "表單權杖(token )不匹配"
"downstream interfaces."
msgstr "在指定的主介面和下游介面之間轉發 DHCPv6 訊息。"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29
msgid "Forward Error Correction Seconds (FECS)"
msgstr "前向糾錯校正秒數 (FECS)"
msgid "Global network options"
msgstr "全域網路選項"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:82
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:70
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:89
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:74
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:92
msgid "Go to firmware upgrade..."
msgstr "進入固件升級..."
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:72
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:60
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:64
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82
msgid "Go to password configuration..."
msgid "Hang Up"
msgstr "掛斷"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
msgid "Header Error Code Errors (HEC)"
msgstr "標頭錯誤原碼錯誤(HEC)"
"在橋接 LAN 設置中,建議啟用橋接環路避免功能,以避免可能導致整個 LAN 停止的廣"
"播環路。"
-#: modules/luci-base/luasrc/view/csrftoken.htm:13
+#: modules/luci-base/ucode/template/csrftoken.ut:13
msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgid "Internal"
msgstr "內部"
-#: modules/luci-base/luasrc/view/error500.htm:8
-msgid "Internal Server Error"
-msgstr "內部伺服器發生錯誤"
-
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:285
msgid "Interval For Sending Learning Packets"
msgstr "傳送學習中封包的時間間隔"
msgid "Invalid hexadecimal value"
msgstr "錯誤的十六進制數值"
-#: modules/luci-base/luasrc/view/sysauth.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:37
+#: modules/luci-base/ucode/template/sysauth.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:32
msgid "Invalid username and/or password! Please try again."
msgstr "不正確的使用者名稱和/或者密碼!請再試一次。"
"flash memory, please verify the image file!"
msgstr "您正使用不適用於此 Flash 的映像檔,請檢查映像檔!"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:89
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:77
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:96
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72
msgid "JavaScript required!"
msgid "Last member interval"
msgstr "最後成員間隔"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
msgid "Latency"
msgstr "延遲"
msgid "Limit"
msgstr "限制"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
msgid "Line Attenuation (LATN)"
msgstr "線路衰減(LATN)"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
msgid "Line Mode"
msgstr "線路模式"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18
msgid "Line State"
msgstr "線路狀態"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20
msgid "Line Uptime"
msgstr "線路已連線時間"
msgstr "讀取目錄內容…"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:1942
-#: modules/luci-base/luasrc/view/view.htm:4
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:45
+#: modules/luci-base/ucode/template/view.ut:4
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:12
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:40
msgid "Loading view…"
msgstr "載入畫面中…"
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
msgstr "(已橋接)隧道的邏輯網路將會被新增(可選的)."
-#: modules/luci-base/luasrc/view/sysauth.htm:38
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:41
+#: modules/luci-base/ucode/template/sysauth.ut:38
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:36
msgid "Login"
msgstr "登入"
msgid "Loose filtering"
msgstr "寬鬆過濾"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
msgid "Loss of Signal Seconds (LOSS)"
msgstr "信號秒漏失(LOSS)"
msgid "Lowest leased address as offset from the network address."
msgstr "DHCP 起始位置。"
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut:12
+msgid "Lua compatibility mode active"
+msgstr ""
+
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83
msgid "MAC"
msgid "Max <abbr title=\"Router Advertisement\">RA</abbr> interval"
msgstr "最長 <abbr title=\"Router Advertisement\">RA</abbr> 間隔"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23
msgid "Max. Attainable Data Rate (ATTNDR)"
msgstr "最高可達到的數據速率 (ATTNDR)"
msgid "No RX signal"
msgstr "沒有 RX 信號"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:80
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:68
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:87
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:72
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:90
msgid "No entries in this directory"
msgstr "在這目錄中缺乏項目"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82
-msgid "No files found"
-msgstr "未找到檔案"
-
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:833
msgid ""
"No fixed interface listening port defined, peers might not be able to "
msgid "No nftables ruleset loaded."
msgstr "未加載 nftables 規則集。"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:69
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:57
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:61
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79
msgid "No password set!"
msgid "Noise"
msgstr "雜訊比"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27
msgid "Noise Margin (SNR)"
msgstr "訊號雜訊比 (SNR)"
msgid "Noise:"
msgstr "雜訊比:"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
msgid "Non Pre-emptive CRC errors (CRC_P)"
msgstr "非搶先CRC錯誤 (CRC_P)"
msgid "Normal"
msgstr "正常"
-#: modules/luci-base/luasrc/view/error404.htm:8
+#: modules/luci-base/ucode/template/error404.ut:9
msgid "Not Found"
msgstr "尚未發現"
msgstr "打開 iptables 規則概述…"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:472
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
msgid "Open list..."
msgstr "開啟清單..."
msgid "Pass-through (Mirror physical device to single MAC VLAN)"
msgstr "直通 (Pass-through, 將物理裝置鏡像到單個 MAC VLAN)"
-#: modules/luci-base/luasrc/view/sysauth.htm:29
+#: modules/luci-base/ucode/template/sysauth.ut:29
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1690
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:103
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:24
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:19
msgid "Password"
msgstr "密碼"
msgid "Pkts."
msgstr "Pkts(流量單位)."
-#: modules/luci-base/luasrc/view/sysauth.htm:19
+#: modules/luci-base/ucode/template/sysauth.ut:19
msgid "Please enter your username and password."
msgstr "請輸入您的用戶名稱和密碼。"
msgid "Potential negation of: %s"
msgstr "可能反取: %s"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38
msgid "Power Management Mode"
msgstr "電源管理模式"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36
msgid "Pre-emptive CRC errors (CRCP_P)"
msgstr "搶先式CRC錯誤(CRCP_P)"
msgstr "實體界面的重選政策"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2197
-#: modules/luci-base/luasrc/view/sysauth.htm:39
+#: modules/luci-base/ucode/template/sysauth.ut:39
#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17
#: modules/luci-compat/luasrc/view/cbi/footer.htm:30
#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66
msgid "Setup routes for proxied IPv6 neighbours."
msgstr "設定已代理 IPv6 鄰居的路由。"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31
msgid "Severely Errored Seconds (SES)"
msgstr "嚴重錯誤秒數(SES)"
msgstr "簡短前序編碼"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:470
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18
msgid "Show current backup file list"
msgstr "顯示現今的備份檔清單"
msgid "Signal / Noise"
msgstr "信號 /雜訊比"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26
msgid "Signal Attenuation (SATN)"
msgstr "信號衰減(交互式SATN)"
msgid "Some fields are invalid, cannot save values!"
msgstr "有些欄位失效, 無法儲存數值!"
-#: modules/luci-base/luasrc/view/error404.htm:9
+#: modules/luci-base/ucode/template/error404.ut:10
msgid "Sorry, the object you requested was not found."
msgstr "抱歉, 您請求的這物件尚無發現."
-#: modules/luci-base/luasrc/view/error500.htm:9
-msgid "Sorry, the server encountered an unexpected error."
-msgstr "抱歉, 伺服器遭遇非預期的錯誤."
-
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442
msgid ""
"Sorry, there is no sysupgrade support present; a new firmware image must be "
#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:541
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929
-#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9
+#: modules/luci-mod-status/ucode/template/admin_status/index.ut:9
msgid "Status"
msgstr "狀態"
msgid "System log buffer size"
msgstr "系統日誌緩衝區大小"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:79
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:67
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:86
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:71
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:89
msgid "The selected %s mode is incompatible with %s encryption"
msgstr "選擇的模式 %s 與 %s 加密不相容"
-#: modules/luci-base/luasrc/view/csrftoken.htm:11
+#: modules/luci-base/ucode/template/csrftoken.ut:11
msgid "The submitted security token is invalid or already expired!"
msgstr "提交的安全權杖無效或已過期!"
msgid "There are no changes to apply"
msgstr "無可套用的變更"
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:70
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:58
#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:62
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80
msgid ""
msgstr "這看起來不像有效的PEM檔案"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:454
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
msgid "Unable to determine upstream interface"
msgstr "無法判斷上游介面"
-#: modules/luci-base/luasrc/view/error404.htm:11
+#: modules/luci-base/ucode/template/error404.ut:12
msgid "Unable to dispatch"
msgstr "無法發送"
msgid "Unable to verify PIN"
msgstr "無法驗證 PIN"
-#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32
+#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33
msgid "Unavailable Seconds (UAS)"
msgstr "不可用秒數 (UAS)"
msgid "User key (PEM encoded)"
msgstr "使用者金鑰(PEM編碼格式)"
-#: modules/luci-base/luasrc/view/sysauth.htm:23
+#: modules/luci-base/ucode/template/sysauth.ut:23
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:112
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:101
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/sysauth.htm:18
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut:13
msgid "Username"
msgstr "用戶名稱"
msgid "You may add multiple records for the same domain."
msgstr ""
-#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:90
+#: themes/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut:78
#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:97
#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73
msgid ""
msgid "« Back"
msgstr "« 倒退"
+#~ msgid "Back to configuration"
+#~ msgstr "返回至設定"
+
+#~ msgid "Close list..."
+#~ msgstr "關閉清單..."
+
+#~ msgid "Internal Server Error"
+#~ msgstr "內部伺服器發生錯誤"
+
+#~ msgid "No files found"
+#~ msgstr "未找到檔案"
+
+#~ msgid "Sorry, the server encountered an unexpected error."
+#~ msgstr "抱歉, 伺服器遭遇非預期的錯誤."
+
#~ msgid "Do not forward queries that cannot be answered by public resolvers."
#~ msgstr "不轉發公用名稱伺服器不能回答的請求。"
+++ /dev/null
-#!/usr/bin/env lua
-
-local json = require "luci.jsonc"
-local fs = require "nixio.fs"
-
-local function readfile(path)
- local s = fs.readfile(path)
- return s and (s:gsub("^%s+", ""):gsub("%s+$", ""))
-end
-
-local methods = {
- getInitList = {
- args = { name = "name" },
- call = function(args)
- local sys = require "luci.sys"
- local _, name, scripts = nil, nil, {}
- for _, name in ipairs(args.name and { args.name } or sys.init.names()) do
- local index = sys.init.index(name)
- if index then
- scripts[name] = { index = index, enabled = sys.init.enabled(name) }
- else
- return { error = "No such init script" }
- end
- end
- return scripts
- end
- },
-
- setInitAction = {
- args = { name = "name", action = "action" },
- call = function(args)
- local sys = require "luci.sys"
- if type(sys.init[args.action]) ~= "function" then
- return { error = "Invalid action" }
- end
- return { result = sys.init[args.action](args.name) }
- end
- },
-
- getLocaltime = {
- call = function(args)
- return { result = os.time() }
- end
- },
-
- setLocaltime = {
- args = { localtime = 0 },
- call = function(args)
- local sys = require "luci.sys"
- local date = os.date("*t", args.localtime)
- if date then
- sys.call("date -s '%04d-%02d-%02d %02d:%02d:%02d' >/dev/null" %{ date.year, date.month, date.day, date.hour, date.min, date.sec })
- sys.call("/etc/init.d/sysfixtime restart >/dev/null")
- end
- return { result = args.localtime }
- end
- },
-
- getTimezones = {
- call = function(args)
- local util = require "luci.util"
- local zones = require "luci.sys.zoneinfo"
-
- local tz = readfile("/etc/TZ")
- local res = util.ubus("uci", "get", {
- config = "system",
- section = "@system[0]",
- option = "zonename"
- })
-
- local result = {}
- local _, zone
- for _, zone in ipairs(zones.TZ) do
- result[zone[1]] = {
- tzstring = zone[2],
- active = (res and res.value == zone[1]) and true or nil
- }
- end
- return result
- end
- },
-
- getLEDs = {
- call = function()
- local iter = fs.dir("/sys/class/leds")
- local result = { }
-
- if iter then
- local led
- for led in iter do
- local m, s
-
- result[led] = { triggers = {} }
-
- s = readfile("/sys/class/leds/"..led.."/trigger")
- for s in (s or ""):gmatch("%S+") do
- m = s:match("^%[(.+)%]$")
- result[led].triggers[#result[led].triggers+1] = m or s
- result[led].active_trigger = m or result[led].active_trigger
- end
-
- s = readfile("/sys/class/leds/"..led.."/brightness")
- if s then
- result[led].brightness = tonumber(s)
- end
-
- s = readfile("/sys/class/leds/"..led.."/max_brightness")
- if s then
- result[led].max_brightness = tonumber(s)
- end
- end
- end
-
- return result
- end
- },
-
- getUSBDevices = {
- call = function()
- local fs = require "nixio.fs"
- local iter = fs.glob("/sys/bus/usb/devices/[0-9]*/manufacturer")
- local result = { }
-
- if iter then
- result.devices = {}
-
- local p
- for p in iter do
- local id = p:match("/([^/]+)/manufacturer$")
-
- result.devices[#result.devices+1] = {
- id = id,
- vid = readfile("/sys/bus/usb/devices/"..id.."/idVendor"),
- pid = readfile("/sys/bus/usb/devices/"..id.."/idProduct"),
- vendor = readfile("/sys/bus/usb/devices/"..id.."/manufacturer"),
- product = readfile("/sys/bus/usb/devices/"..id.."/product"),
- speed = tonumber((readfile("/sys/bus/usb/devices/"..id.."/product")))
- }
- end
- end
-
- iter = fs.glob("/sys/bus/usb/devices/*/*-port[0-9]*")
-
- if iter then
- result.ports = {}
-
- local p
- for p in iter do
- local port = p:match("([^/]+)$")
- local link = fs.readlink(p.."/device")
-
- result.ports[#result.ports+1] = {
- port = port,
- device = link and fs.basename(link)
- }
- end
- end
-
- return result
- end
- },
-
- getConntrackHelpers = {
- call = function()
- local ok, fd = pcall(io.open, "/usr/share/fw3/helpers.conf", "r")
- local rv = {}
-
- if not (ok and fd) then
- ok, fd = pcall(io.open, "/usr/share/firewall4/helpers", "r")
- end
-
- if ok and fd then
- local entry
-
- while true do
- local line = fd:read("*l")
- if not line then
- break
- end
-
- if line:match("^%s*config%s") then
- if entry then
- rv[#rv+1] = entry
- end
- entry = {}
- else
- local opt, val = line:match("^%s*option%s+(%S+)%s+(%S.*)$")
- if opt and val then
- opt = opt:gsub("^'(.+)'$", "%1"):gsub('^"(.+)"$', "%1")
- val = val:gsub("^'(.+)'$", "%1"):gsub('^"(.+)"$', "%1")
- entry[opt] = val
- end
- end
- end
-
- if entry then
- rv[#rv+1] = entry
- end
-
- fd:close()
- end
-
- return { result = rv }
- end
- },
-
- getFeatures = {
- call = function()
- local fs = require "nixio.fs"
- local rv = {}
- local ok, fd
-
- rv.firewall = fs.access("/sbin/fw3")
- rv.firewall4 = fs.access("/sbin/fw4")
- rv.opkg = fs.access("/bin/opkg")
- rv.offloading = fs.access("/sys/module/xt_FLOWOFFLOAD/refcnt") or fs.access("/sys/module/nft_flow_offload/refcnt")
- rv.br2684ctl = fs.access("/usr/sbin/br2684ctl")
- rv.swconfig = fs.access("/sbin/swconfig")
- rv.odhcpd = fs.access("/usr/sbin/odhcpd")
- rv.zram = fs.access("/sys/class/zram-control")
- rv.sysntpd = fs.readlink("/usr/sbin/ntpd") and true
- rv.ipv6 = fs.access("/proc/net/ipv6_route")
- rv.dropbear = fs.access("/usr/sbin/dropbear")
- rv.cabundle = fs.access("/etc/ssl/certs/ca-certificates.crt")
- rv.relayd = fs.access("/usr/sbin/relayd")
-
- local wifi_features = { "eap", "11n", "11ac", "11r", "acs", "sae", "owe", "suiteb192", "wep", "wps" }
-
- if fs.access("/usr/sbin/hostapd") then
- rv.hostapd = { cli = fs.access("/usr/sbin/hostapd_cli") }
-
- local _, feature
- for _, feature in ipairs(wifi_features) do
- rv.hostapd[feature] =
- (os.execute(string.format("/usr/sbin/hostapd -v%s >/dev/null 2>/dev/null", feature)) == 0)
- end
- end
-
- if fs.access("/usr/sbin/wpa_supplicant") then
- rv.wpasupplicant = { cli = fs.access("/usr/sbin/wpa_cli") }
-
- local _, feature
- for _, feature in ipairs(wifi_features) do
- rv.wpasupplicant[feature] =
- (os.execute(string.format("/usr/sbin/wpa_supplicant -v%s >/dev/null 2>/dev/null", feature)) == 0)
- end
- end
-
- ok, fd = pcall(io.popen, "dnsmasq --version 2>/dev/null")
- if ok then
- rv.dnsmasq = {}
-
- while true do
- local line = fd:read("*l")
- if not line then
- break
- end
-
- local opts = line:match("^Compile time options: (.+)$")
- if opts then
- local opt
- for opt in opts:gmatch("%S+") do
- local no = opt:match("^no%-(%S+)$")
- rv.dnsmasq[string.lower(no or opt)] = not no
- end
- break
- end
- end
-
- fd:close()
- end
-
- ok, fd = pcall(io.popen, "ipset --help 2>/dev/null")
- if ok then
- rv.ipset = {}
-
- local sets = false
-
- while true do
- local line = fd:read("*l")
- if not line then
- break
- elseif line:match("^Supported set types:") then
- sets = true
- elseif sets then
- local set, ver = line:match("^%s+(%S+)%s+(%d+)")
- if set and not rv.ipset[set] then
- rv.ipset[set] = tonumber(ver)
- end
- end
- end
-
- fd:close()
- end
-
- return rv
- end
- },
-
- getSwconfigFeatures = {
- args = { switch = "switch0" },
- call = function(args)
- local util = require "luci.util"
-
- -- Parse some common switch properties from swconfig help output.
- local swc, err = io.popen("swconfig dev %s help 2>/dev/null" % util.shellquote(args.switch))
- if swc then
- local is_port_attr = false
- local is_vlan_attr = false
- local rv = {}
-
- while true do
- local line = swc:read("*l")
- if not line then break end
-
- if line:match("^%s+%-%-vlan") then
- is_vlan_attr = true
-
- elseif line:match("^%s+%-%-port") then
- is_vlan_attr = false
- is_port_attr = true
-
- elseif line:match("cpu @") then
- rv.switch_title = line:match("^switch%d: %w+%((.-)%)")
- rv.num_vlans = tonumber(line:match("vlans: (%d+)")) or 16
- rv.min_vid = 1
-
- elseif line:match(": pvid") or line:match(": tag") or line:match(": vid") then
- if is_vlan_attr then rv.vid_option = line:match(": (%w+)") end
-
- elseif line:match(": enable_vlan4k") then
- rv.vlan4k_option = "enable_vlan4k"
-
- elseif line:match(": enable_vlan") then
- rv.vlan_option = "enable_vlan"
-
- elseif line:match(": enable_learning") then
- rv.learning_option = "enable_learning"
-
- elseif line:match(": enable_mirror_rx") then
- rv.mirror_option = "enable_mirror_rx"
-
- elseif line:match(": max_length") then
- rv.jumbo_option = "max_length"
- end
- end
-
- swc:close()
-
- if not next(rv) then
- return { error = "No such switch" }
- end
-
- return rv
- else
- return { error = err }
- end
- end
- },
-
- getSwconfigPortState = {
- args = { switch = "switch0" },
- call = function(args)
- local util = require "luci.util"
-
- local swc, err = io.popen("swconfig dev %s show 2>/dev/null" % util.shellquote(args.switch))
- if swc then
- local ports = { }
-
- while true do
- local line = swc:read("*l")
- if not line or (line:match("^VLAN %d+:") and #ports > 0) then
- break
- end
-
- local pnum = line:match("^Port (%d+):$")
- if pnum then
- port = {
- port = tonumber(pnum),
- duplex = false,
- speed = 0,
- link = false,
- auto = false,
- rxflow = false,
- txflow = false
- }
-
- ports[#ports+1] = port
- end
-
- if port then
- local m
-
- if line:match("full[%- ]duplex") then
- port.duplex = true
- end
-
- m = line:match(" speed:(%d+)")
- if m then
- port.speed = tonumber(m)
- end
-
- m = line:match("(%d+) Mbps")
- if m and port.speed == 0 then
- port.speed = tonumber(m)
- end
-
- m = line:match("link: (%d+)")
- if m and port.speed == 0 then
- port.speed = tonumber(m)
- end
-
- if line:match("link: ?up") or line:match("status: ?up") then
- port.link = true
- end
-
- if line:match("auto%-negotiate") or line:match("link:.-auto") then
- port.auto = true
- end
-
- if line:match("link:.-rxflow") then
- port.rxflow = true
- end
-
- if line:match("link:.-txflow") then
- port.txflow = true
- end
- end
- end
-
- swc:close()
-
- if not next(ports) then
- return { error = "No such switch" }
- end
-
- return { result = ports }
- else
- return { error = err }
- end
- end
- },
-
- setPassword = {
- args = { username = "root", password = "password" },
- call = function(args)
- local util = require "luci.util"
- return {
- result = (os.execute("(echo %s; sleep 1; echo %s) | /bin/busybox passwd %s >/dev/null 2>&1" %{
- luci.util.shellquote(args.password),
- luci.util.shellquote(args.password),
- luci.util.shellquote(args.username)
- }) == 0)
- }
- end
- },
-
- getBlockDevices = {
- call = function()
- local fs = require "nixio.fs"
-
- local block = io.popen("/sbin/block info", "r")
- if block then
- local rv = {}
-
- while true do
- local ln = block:read("*l")
- if not ln then
- break
- end
-
- local dev = ln:match("^/dev/(.-):")
- if dev then
- local s = tonumber((fs.readfile("/sys/class/block/" .. dev .."/size")))
- local e = {
- dev = "/dev/" .. dev,
- size = s and s * 512
- }
-
- local key, val = { }
- for key, val in ln:gmatch([[(%w+)="(.-)"]]) do
- e[key:lower()] = val
- end
-
- rv[dev] = e
- end
- end
-
- block:close()
-
- return rv
- else
- return { error = "Unable to execute block utility" }
- end
- end
- },
-
- setBlockDetect = {
- call = function()
- return { result = (os.execute("/sbin/block detect > /etc/config/fstab") == 0) }
- end
- },
-
- getMountPoints = {
- call = function()
- local fs = require "nixio.fs"
-
- local fd, err = io.open("/proc/mounts", "r")
- if fd then
- local rv = {}
-
- while true do
- local ln = fd:read("*l")
- if not ln then
- break
- end
-
- local device, mount, fstype, options, freq, pass = ln:match("^(%S*) (%S*) (%S*) (%S*) (%d+) (%d+)$")
- if device and mount then
- device = device:gsub("\\(%d+)", function(n) return string.char(tonumber(n, 8)) end)
- mount = mount:gsub("\\(%d+)", function(n) return string.char(tonumber(n, 8)) end)
-
- local stat = fs.statvfs(mount)
- if stat and stat.blocks > 0 then
- rv[#rv+1] = {
- device = device,
- mount = mount,
- size = stat.bsize * stat.blocks,
- avail = stat.bsize * stat.bavail,
- free = stat.bsize * stat.bfree
- }
- end
- end
- end
-
- fd:close()
-
- return { result = rv }
- else
- return { error = err }
- end
- end
- },
-
- getRealtimeStats = {
- args = { mode = "interface", device = "eth0" },
- call = function(args)
- local util = require "luci.util"
-
- local flags
- if args.mode == "interface" then
- flags = "-i %s" % util.shellquote(args.device)
- elseif args.mode == "wireless" then
- flags = "-r %s" % util.shellquote(args.device)
- elseif args.mode == "conntrack" then
- flags = "-c"
- elseif args.mode == "load" then
- flags = "-l"
- else
- return { error = "Invalid mode" }
- end
-
- local fd, err = io.popen("luci-bwc %s" % flags, "r")
- if fd then
- local parse = json.new()
- local done
-
- parse:parse("[")
-
- while true do
- local ln = fd:read("*l")
- if not ln then
- break
- end
-
- done, err = parse:parse((ln:gsub("%d+", "%1.0")))
-
- if done then
- err = "Unexpected JSON data"
- end
-
- if err then
- break
- end
- end
-
- fd:close()
-
- done, err = parse:parse("]")
-
- if err then
- return { error = err }
- elseif not done then
- return { error = "Incomplete JSON data" }
- else
- return { result = parse:get() }
- end
- else
- return { error = err }
- end
- end
- },
-
- getConntrackList = {
- call = function()
- local sys = require "luci.sys"
- return { result = sys.net.conntrack() }
- end
- },
-
- getProcessList = {
- call = function()
- local sys = require "luci.sys"
- local res = {}
- for _, v in pairs(sys.process.list()) do
- res[#res + 1] = v
- end
- return { result = res }
- end
- }
-}
-
-local function parseInput()
- local parse = json.new()
- local done, err
-
- while true do
- local chunk = io.read(4096)
- if not chunk then
- break
- elseif not done and not err then
- done, err = parse:parse(chunk)
- end
- end
-
- if not done then
- print(json.stringify({ error = err or "Incomplete input" }))
- os.exit(1)
- end
-
- return parse:get()
-end
-
-local function validateArgs(func, uargs)
- local method = methods[func]
- if not method then
- print(json.stringify({ error = "Method not found" }))
- os.exit(1)
- end
-
- if type(uargs) ~= "table" then
- print(json.stringify({ error = "Invalid arguments" }))
- os.exit(1)
- end
-
- uargs.ubus_rpc_session = nil
-
- local k, v
- local margs = method.args or {}
- for k, v in pairs(uargs) do
- if margs[k] == nil or
- (v ~= nil and type(v) ~= type(margs[k]))
- then
- print(json.stringify({ error = "Invalid arguments" }))
- os.exit(1)
- end
- end
-
- return method
-end
-
-if arg[1] == "list" then
- local _, method, rv = nil, nil, {}
- for _, method in pairs(methods) do rv[_] = method.args or {} end
- print((json.stringify(rv):gsub(":%[%]", ":{}")))
-elseif arg[1] == "call" then
- local args = parseInput()
- local method = validateArgs(arg[2], args)
- local result, code = method.call(args)
- print((json.stringify(result):gsub("^%[%]$", "{}")))
- os.exit(code or 0)
-end
"admin/translations/*": {
"action": {
- "type": "call",
+ "type": "function",
"module": "luci.controller.admin.index",
"function": "action_translations"
},
"admin/ubus/*": {
"action": {
- "type": "call",
+ "type": "function",
"module": "luci.controller.admin.index",
"function": "action_ubus"
},
"title": "Logout",
"order": 999,
"action": {
- "type": "call",
+ "type": "function",
"module": "luci.controller.admin.index",
"function": "action_logout"
},
"admin/uci/revert": {
"action": {
- "type": "call",
+ "type": "function",
"module": "luci.controller.admin.uci",
"function": "action_revert",
"post": true
"admin/uci/apply_rollback": {
"cors": true,
"action": {
- "type": "call",
+ "type": "function",
"module": "luci.controller.admin.uci",
"function": "action_apply_rollback",
"post": true
"admin/uci/apply_unchecked": {
"cors": true,
"action": {
- "type": "call",
+ "type": "function",
"module": "luci.controller.admin.uci",
"function": "action_apply_unchecked",
"post": true
"admin/uci/confirm": {
"cors": true,
"action": {
- "type": "call",
+ "type": "function",
"module": "luci.controller.admin.uci",
"function": "action_confirm"
},
"admin/menu": {
"action": {
- "type": "call",
+ "type": "function",
"module": "luci.controller.admin.index",
"function": "action_menu"
},
--- /dev/null
+// Copyright 2022 Jo-Philipp Wich <jo@mein.io>
+// Licensed to the public under the Apache License 2.0.
+
+'use strict';
+
+import { stdin, access, dirname, basename, open, popen, glob, lsdir, readfile, readlink, error } from 'fs';
+import { cursor } from 'uci';
+
+import { init_list, init_index, init_enabled, init_action, conntrack_list, process_list } from 'luci.sys';
+import { statvfs } from 'luci.core';
+
+import timezones from 'luci.zoneinfo';
+
+
+function shellquote(s) {
+ return `'${replace(s, "'", "'\\''")}'`;
+}
+
+const methods = {
+ getInitList: {
+ args: { name: 'name' },
+ call: function(request) {
+ let scripts = {};
+
+ for (let name in filter(init_list(), i => !request.args.name || i == request.args.name)) {
+ let idx = init_index(name);
+
+ scripts[name] = {
+ index: idx?.[0],
+ stop: idx?.[1],
+ enabled: init_enabled(name)
+ };
+ }
+
+ return length(scripts) ? scripts : { error: 'No such init script' };
+ }
+ },
+
+ setInitAction: {
+ args: { name: 'name', action: 'action' },
+ call: function(request) {
+ switch (request.args.action) {
+ case 'enable':
+ case 'disable':
+ case 'start':
+ case 'stop':
+ case 'restart':
+ case 'reload':
+ const rc = init_action(request.args.name, request.args.action);
+
+ if (rc === false)
+ return { error: 'No such init script' };
+
+ return { result: rc == 0 };
+
+ default:
+ return { error: 'Invalid action' };
+ }
+ }
+ },
+
+ getLocaltime: {
+ call: function(request) {
+ return { result: time() };
+ }
+ },
+
+ setLocaltime: {
+ args: { localtime: 0 },
+ call: function(request) {
+ let t = localtime(request.args.localtime);
+
+ if (t) {
+ system(sprintf('date -s "%04d-%02d-%02d %02d:%02d:%02d" >/dev/null', t.year, t.mon, t.mday, t.hour, t.min, t.sec));
+ system('/etc/init.d/sysfixtime restart >/dev/null');
+ }
+
+ return { result: request.args.localtime };
+ }
+ },
+
+ getTimezones: {
+ call: function(request) {
+ let tz = trim(readfile('/etc/TZ'));
+ let zn = cursor()?.get?.('system', '@system[0]', 'zonename');
+ let result = {};
+
+ for (let zone, tzstring in timezones) {
+ result[zone] = { tzstring };
+
+ if (zn == zone)
+ result[zone].active = true;
+ };
+
+ return result;
+ }
+ },
+
+ getLEDs: {
+ call: function() {
+ let result = {};
+
+ for (let led in lsdir('/sys/class/leds')) {
+ let s;
+
+ result[led] = { triggers: [] };
+
+ s = trim(readfile(`/sys/class/leds/${led}/trigger`));
+ for (let trigger in split(s, ' ')) {
+ push(result[led].triggers, trim(trigger, '[]'));
+
+ if (trigger != result[led].triggers[-1])
+ result[led].active_trigger = result[led].triggers[-1];
+ }
+
+ s = readfile(`/sys/class/leds/${led}/brightness`);
+ result[led].brightness = +s;
+
+ s = readfile(`/sys/class/leds/${led}/max_brightness`);
+ result[led].max_brightness = +s;
+ }
+
+ return result;
+ }
+ },
+
+ getUSBDevices: {
+ call: function() {
+ let result = { devices: [], ports: [] };
+
+ for (let path in glob('/sys/bus/usb/devices/[0-9]*/manufacturer')) {
+ let id = basename(dirname(path));
+
+ push(result.devices, {
+ id,
+ vid: trim(readfile(`/sys/bus/usb/devices/${id}/idVendor`)),
+ pid: trim(readfile(`/sys/bus/usb/devices/${id}/idProduct`)),
+ vendor: trim(readfile(path)),
+ product: trim(readfile(`/sys/bus/usb/devices/${id}/product`)),
+ speed: +readfile(`/sys/bus/usb/devices/${id}/speed`)
+ });
+ }
+
+ for (let path in glob('/sys/bus/usb/devices/*/*-port[0-9]*')) {
+ let port = basename(path);
+ let link = readlink(`${path}/device`);
+
+ push(result.ports, {
+ port,
+ device: basename(link)
+ });
+ }
+
+ return result;
+ }
+ },
+
+ getConntrackHelpers: {
+ call: function() {
+ const uci = cursor();
+ let helpers = [];
+
+ uci.load('/usr/share/firewall4/helpers');
+ uci.load('/usr/share/fw3/helpers.conf');
+
+ uci.foreach('helpers', 'helper', (s) => {
+ push(helpers, {
+ name: s.name,
+ description: s.description,
+ module: s.module,
+ family: s.family,
+ proto: s.proto,
+ port: s.port
+ });
+ });
+
+ return { result: helpers };
+ }
+ },
+
+ getFeatures: {
+ call: function() {
+ let result = {
+ firewall: access('/sbin/fw3') == true,
+ firewall4: access('/sbin/fw4') == true,
+ opkg: access('/bin/opkg') == true,
+ offloading: access('/sys/module/xt_FLOWOFFLOAD/refcnt') == true || access('/sys/module/nft_flow_offload/refcnt') == true,
+ br2684ctl: access('/usr/sbin/br2684ctl') == true,
+ swconfig: access('/sbin/swconfig') == true,
+ odhcpd: access('/usr/sbin/odhcpd') == true,
+ zram: access('/sys/class/zram-control') == true,
+ sysntpd: readlink('/usr/sbin/ntpd') != null,
+ ipv6: access('/proc/net/ipv6_route') == true,
+ dropbear: access('/usr/sbin/dropbear') == true,
+ cabundle: access('/etc/ssl/certs/ca-certificates.crt') == true,
+ relayd: access('/usr/sbin/relayd') == true,
+ };
+
+ const wifi_features = [ 'eap', '11n', '11ac', '11r', 'acs', 'sae', 'owe', 'suiteb192', 'wep', 'wps' ];
+
+ if (access('/usr/sbin/hostapd')) {
+ result.hostapd = { cli: access('/usr/sbin/hostapd_cli') == true };
+
+ for (let feature in wifi_features)
+ result.hostapd[feature] = system(`/usr/sbin/hostapd -v${feature} >/dev/null 2>/dev/null`) == 0;
+ }
+
+ if (access('/usr/sbin/wpa_supplicant')) {
+ result.wpasupplicant = { cli: access('/usr/sbin/wpa_cli') == true };
+
+ for (let feature in wifi_features)
+ result.wpasupplicant[feature] = system(`/usr/sbin/wpa_supplicant -v${feature} >/dev/null 2>/dev/null`) == 0;
+ }
+
+ let fd = popen('dnsmasq --version 2>/dev/null');
+
+ if (fd) {
+ const m = match(fd.read('all'), /^Compile time options: (.+)$/s);
+
+ for (let opt in split(m?.[1], ' ')) {
+ let f = replace(opt, 'no-', '', 1);
+
+ result.dnsmasq ??= {};
+ result.dnsmasq[lc(f)] = (f == opt);
+ }
+
+ fd.close();
+ }
+
+ fd = popen('ipset --help 2>/dev/null');
+
+ if (fd) {
+ for (let line = fd.read('line'), flag = false; length(line); line = fd.read('line')) {
+ if (line == 'Supported set types:\n') {
+ flag = true;
+ }
+ else if (flag) {
+ const m = match(line, /^ +([\w:,]+)\t+([0-9]+)\t/);
+
+ if (m) {
+ result.ipset ??= {};
+ result.ipset[m[1]] ??= +m[2];
+ }
+ }
+ }
+
+ fd.close();
+ }
+
+ return result;
+ }
+ },
+
+ getSwconfigFeatures: {
+ args: { switch: 'switch0' },
+ call: function(request) {
+ // Parse some common switch properties from swconfig help output.
+ const swc = popen(`swconfig dev ${shellquote(request.args.switch)} help 2>/dev/null`);
+
+ if (swc) {
+ let is_port_attr = false;
+ let is_vlan_attr = false;
+ let result = {};
+
+ for (let line = swc.read('line'); length(line); line = swc.read('line')) {
+ if (match(line, /^\s+--vlan/)) {
+ is_vlan_attr = true;
+ }
+ else if (match(line, /^\s+--port/)) {
+ is_vlan_attr = false;
+ is_port_attr = true;
+ }
+ else if (match(line, /cpu @/)) {
+ result.switch_title = match(line, /^switch[0-9]+: \w+\((.+)\)/)?.[1];
+ result.num_vlans = match(line, /vlans: ([0-9]+)/)?.[1] ?? 16;
+ result.min_vid = 1;
+ }
+ else if (match(line, /: (pvid|tag|vid)/)) {
+ if (is_vlan_attr)
+ result.vid_option = match(line, /: (\w+)/)?.[1];
+ }
+ else if (match(line, /: enable_vlan4k/)) {
+ result.vlan4k_option = 'enable_vlan4k';
+ }
+ else if (match(line, /: enable_vlan/)) {
+ result.vlan_option = 'enable_vlan';
+ }
+ else if (match(line, /: enable_learning/)) {
+ result.learning_option = 'enable_learning';
+ }
+ else if (match(line, /: enable_mirror_rx/)) {
+ result.mirror_option = 'enable_mirror_rx';
+ }
+ else if (match(line, /: max_length/)) {
+ result.jumbo_option = 'max_length';
+ }
+ }
+
+ swc.close();
+
+ if (!length(result))
+ return { error: 'No such switch' };
+
+ return result;
+ }
+ else {
+ return { error: error() };
+ }
+ }
+ },
+
+ getSwconfigPortState: {
+ args: { switch: 'switch0' },
+ call: function(request) {
+ const swc = popen(`swconfig dev ${shellquote(request.args.switch)} show 2>/dev/null`);
+
+ if (swc) {
+ let ports = [], port;
+
+ for (let line = swc.read('line'); length(line); line = swc.read('line')) {
+ if (match(line, /^VLAN [0-9]+:/) && length(ports))
+ break;
+
+ let pnum = match(line, /^Port ([0-9]+):/)?.[1];
+
+ if (pnum) {
+ port = {
+ port: +pnum,
+ duplex: false,
+ speed: 0,
+ link: false,
+ auto: false,
+ rxflow: false,
+ txflow: false
+ };
+
+ push(ports, port);
+ }
+
+ if (port) {
+ let m;
+
+ if (match(line, /full[ -]duplex/))
+ port.duplex = true;
+
+ if ((m = match(line, / speed:([0-9]+)/)) != null)
+ port.speed = +m[1];
+
+ if ((m = match(line, /([0-9]+) Mbps/)) != null && !port.speed)
+ port.speed = +m[1];
+
+ if ((m = match(line, /link: ([0-9]+)/)) != null && !port.speed)
+ port.speed = +m[1];
+
+ if (match(line, /(link|status): ?up/))
+ port.link = true;
+
+ if (match(line, /auto-negotiate|link:.*auto/))
+ port.auto = true;
+
+ if (match(line, /link:.*rxflow/))
+ port.rxflow = true;
+
+ if (match(line, /link:.*txflow/))
+ port.txflow = true;
+ }
+ }
+
+ swc.close();
+
+ if (!length(ports))
+ return { error: 'No such switch' };
+
+ return { result: ports };
+ }
+ else {
+ return { error: error() };
+ }
+ }
+ },
+
+ setPassword: {
+ args: { username: 'root', password: 'password' },
+ call: function(request) {
+ const u = shellquote(request.args.username);
+ const p = shellquote(request.args.password);
+
+ return {
+ result: system(`(echo ${p}; sleep 1; echo ${p}) | /bin/busybox passwd ${u} >/dev/null 2>&1`) == 0
+ };
+ }
+ },
+
+ getBlockDevices: {
+ call: function() {
+ const block = popen('/sbin/block info 2>/dev/null');
+
+ if (block) {
+ let result = {};
+
+ for (let line = block.read('line'); length(line); line = block.read('line')) {
+ let dev = match(line, /^\/dev\/([^:]+):/)?.[1];
+
+ if (dev) {
+ let e = result[dev] = {
+ dev: `/dev/${dev}`,
+ size: +readfile(`/sys/class/block/${dev}/size`) * 512
+ };
+
+ for (m in match(line, / (\w+)="([^"]+)"/g))
+ e[lc(m[1])] = m[2];
+ }
+ }
+
+ block.close();
+
+ return result;
+ }
+ else {
+ return { error: 'Unable to execute block utility' };
+ }
+ }
+ },
+
+ setBlockDetect: {
+ call: function() {
+ return { result: system('/sbin/block detect > /etc/config/fstab') == 0 };
+ }
+ },
+
+ getMountPoints: {
+ call: function() {
+ const fd = open('/proc/mounts', 'r');
+
+ if (fd) {
+ let result = [];
+
+ for (let line = fd.read('line'); length(line); line = fd.read('line')) {
+ const m = split(line, ' ');
+ const device = replace(m[0], /\\([0-9][0-9][0-9])/g, (m, n) => char(int(n, 8)));
+ const mount = replace(m[1], /\\([0-9][0-9][0-9])/g, (m, n) => char(int(n, 8)));
+ const stat = statvfs(mount);
+
+ if (stat?.blocks > 0) {
+ push(result, {
+ device, mount,
+ size: stat.bsize * stat.blocks,
+ avail: stat.bsize * stat.bavail,
+ free: stat.bsize * stat.bfree
+ });
+ }
+ }
+
+ fd.close();
+
+ return { result };
+ }
+ else {
+ return { error: error() };
+ }
+ }
+ },
+ getRealtimeStats: {
+ args: { mode: 'interface', device: 'eth0' },
+ call: function(request) {
+ let flags;
+
+ if (request.args.mode == 'interface')
+ flags = `-i ${shellquote(request.args.device)}`;
+ else if (request.args.mode == 'wireless')
+ flags = `-r ${shellquote(request.args.device)}`;
+ else if (request.args.mode == 'conntrack')
+ flags = '-c';
+ else if (request.args.mode == 'load')
+ flags = '-l';
+ else
+ return { error: 'Invalid mode' };
+
+ const fd = popen(`luci-bwc ${flags}`, 'r');
+
+ if (fd) {
+ let result;
+
+ try {
+ result = { result: json(`[${fd.read('all')}]`) };
+ }
+ catch (err) {
+ result = { error: err };
+ }
+
+ return result;
+ }
+ else {
+ return { error: error() };
+ }
+ }
+ },
+
+ getConntrackList: {
+ call: function() {
+ return { result: conntrack_list() };
+ }
+ },
+
+ getProcessList: {
+ call: function() {
+ return { result: process_list() };
+ }
+ }
+};
+
+return { luci: methods };
contrib/lemon: contrib/lemon.c contrib/lempar.c
cc -o contrib/lemon $<
-plural_formula.c: plural_formula.y contrib/lemon
+lib/plural_formula.c: lib/plural_formula.y contrib/lemon
./contrib/lemon -q $<
-template_lmo.c: plural_formula.c
+lib/lmo.c: lib/plural_formula.c
+
+core.so: lib/luci.o lib/lmo.o lib/plural_formula.o
+ $(CC) $(LDFLAGS) -shared -o $@ $^
+
+version.uc:
+ echo "export const revision = '$(LUCI_VERSION)', branch = '$(LUCI_GITBRANCH)';" > $@
clean:
- rm -f contrib/lemon po2lmo parser.so version.lua plural_formula.c plural_formula.h *.o
+ rm -f contrib/lemon lib/*.o lib/plural_formula.c lib/plural_formula.h core.so version.uc
jsmin: jsmin.o
$(CC) $(LDFLAGS) -o $@ $^
-po2lmo: po2lmo.o template_lmo.o plural_formula.o
+po2lmo: po2lmo.o lib/lmo.o lib/plural_formula.o
$(CC) $(LDFLAGS) -o $@ $^
-parser.so: template_parser.o template_utils.o template_lmo.o template_lualib.o plural_formula.o
- $(CC) $(LDFLAGS) -shared -o $@ $^
-
-version.lua:
- ./mkversion.sh $@ $(LUCI_VERSION) "$(LUCI_GITBRANCH)"
-
-compile: parser.so version.lua
+compile: core.so version.uc
install: compile
- mkdir -p $(DESTDIR)/usr/lib/lua/luci/template
- cp parser.so $(DESTDIR)/usr/lib/lua/luci/template/parser.so
- cp version.lua $(DESTDIR)/usr/lib/lua/luci/version.lua
+ mkdir -p $(DESTDIR)/usr/lib/ucode/luci
+ cp core.so $(DESTDIR)/usr/lib/ucode/luci/core.so
+
+ mkdir -p $(DESTDIR)/usr/share/ucode/luci
+ cp version.uc $(DESTDIR)/usr/share/ucode/luci/version.uc
--- /dev/null
+/*
+ * lmo - Lua Machine Objects - Base functions
+ *
+ * Copyright (C) 2009-2010 Jo-Philipp Wich <jow@openwrt.org>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "lmo.h"
+#include "plural_formula.h"
+
+/*
+ * Hash function from http://www.azillionmonkeys.com/qed/hash.html
+ * Copyright (C) 2004-2008 by Paul Hsieh
+ */
+
+uint32_t sfh_hash(const char *data, size_t len, uint32_t init)
+{
+ uint32_t hash = init, tmp;
+ int rem;
+
+ if (len <= 0 || data == NULL) return 0;
+
+ rem = len & 3;
+ len >>= 2;
+
+ /* Main loop */
+ for (;len > 0; len--) {
+ hash += sfh_get16(data);
+ tmp = (sfh_get16(data+2) << 11) ^ hash;
+ hash = (hash << 16) ^ tmp;
+ data += 2*sizeof(uint16_t);
+ hash += hash >> 11;
+ }
+
+ /* Handle end cases */
+ switch (rem) {
+ case 3: hash += sfh_get16(data);
+ hash ^= hash << 16;
+ hash ^= (signed char)data[sizeof(uint16_t)] << 18;
+ hash += hash >> 11;
+ break;
+ case 2: hash += sfh_get16(data);
+ hash ^= hash << 11;
+ hash += hash >> 17;
+ break;
+ case 1: hash += (signed char)*data;
+ hash ^= hash << 10;
+ hash += hash >> 1;
+ }
+
+ /* Force "avalanching" of final 127 bits */
+ hash ^= hash << 3;
+ hash += hash >> 5;
+ hash ^= hash << 4;
+ hash += hash >> 17;
+ hash ^= hash << 25;
+ hash += hash >> 6;
+
+ return hash;
+}
+
+uint32_t lmo_canon_hash(const char *str, int len,
+ const char *ctx, int ctxlen, int plural)
+{
+ char res[4096];
+ char *ptr, *end, prev;
+ int off;
+
+ if (!str)
+ return 0;
+
+ ptr = res;
+ end = res + sizeof(res);
+
+ if (ctx)
+ {
+ for (prev = ' ', off = 0; off < ctxlen; prev = *ctx, off++, ctx++)
+ {
+ if (ptr >= end)
+ return 0;
+
+ if (isspace(*ctx))
+ {
+ if (!isspace(prev))
+ *ptr++ = ' ';
+ }
+ else
+ {
+ *ptr++ = *ctx;
+ }
+ }
+
+ if ((ptr > res) && isspace(*(ptr-1)))
+ ptr--;
+
+ if (ptr >= end)
+ return 0;
+
+ *ptr++ = '\1';
+ }
+
+ for (prev = ' ', off = 0; off < len; prev = *str, off++, str++)
+ {
+ if (ptr >= end)
+ return 0;
+
+ if (isspace(*str))
+ {
+ if (!isspace(prev))
+ *ptr++ = ' ';
+ }
+ else
+ {
+ *ptr++ = *str;
+ }
+ }
+
+ if ((ptr > res) && isspace(*(ptr-1)))
+ ptr--;
+
+ if (plural > -1)
+ {
+ if (plural >= 100 || ptr + 3 >= end)
+ return 0;
+
+ ptr += snprintf(ptr, 3, "\2%d", plural);
+ }
+
+ return sfh_hash(res, ptr - res, ptr - res);
+}
+
+lmo_archive_t * lmo_open(const char *file)
+{
+ int in = -1;
+ uint32_t idx_offset = 0;
+ struct stat s;
+
+ lmo_archive_t *ar = NULL;
+
+ if (stat(file, &s) == -1)
+ goto err;
+
+ if ((in = open(file, O_RDONLY)) == -1)
+ goto err;
+
+ if ((ar = (lmo_archive_t *)malloc(sizeof(*ar))) != NULL)
+ {
+ memset(ar, 0, sizeof(*ar));
+
+ ar->fd = in;
+ ar->size = s.st_size;
+
+ fcntl(ar->fd, F_SETFD, fcntl(ar->fd, F_GETFD) | FD_CLOEXEC);
+
+ if ((ar->mmap = mmap(NULL, ar->size, PROT_READ, MAP_SHARED, ar->fd, 0)) == MAP_FAILED)
+ goto err;
+
+ idx_offset = ntohl(*((const uint32_t *)
+ (ar->mmap + ar->size - sizeof(uint32_t))));
+
+ if (idx_offset >= ar->size)
+ goto err;
+
+ ar->index = (lmo_entry_t *)(ar->mmap + idx_offset);
+ ar->length = (ar->size - idx_offset - sizeof(uint32_t)) / sizeof(lmo_entry_t);
+ ar->end = ar->mmap + ar->size;
+
+ return ar;
+ }
+
+err:
+ if (in > -1)
+ close(in);
+
+ if (ar != NULL)
+ {
+ if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED))
+ munmap(ar->mmap, ar->size);
+
+ free(ar);
+ }
+
+ return NULL;
+}
+
+void lmo_close(lmo_archive_t *ar)
+{
+ if (ar != NULL)
+ {
+ if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED))
+ munmap(ar->mmap, ar->size);
+
+ close(ar->fd);
+ free(ar);
+
+ ar = NULL;
+ }
+}
+
+
+lmo_catalog_t *_lmo_catalogs = NULL;
+lmo_catalog_t *_lmo_active_catalog = NULL;
+
+int lmo_load_catalog(const char *lang, const char *dir)
+{
+ DIR *dh = NULL;
+ char pattern[16];
+ char path[PATH_MAX];
+ struct dirent *de = NULL;
+
+ lmo_archive_t *ar = NULL;
+ lmo_catalog_t *cat = NULL;
+
+ if (!lmo_change_catalog(lang))
+ return 0;
+
+ if (!dir || !(dh = opendir(dir)))
+ goto err;
+
+ if (!(cat = malloc(sizeof(*cat))))
+ goto err;
+
+ memset(cat, 0, sizeof(*cat));
+
+ snprintf(cat->lang, sizeof(cat->lang), "%s", lang);
+ snprintf(pattern, sizeof(pattern), "*.%s.lmo", lang);
+
+ while ((de = readdir(dh)) != NULL)
+ {
+ if (!fnmatch(pattern, de->d_name, 0))
+ {
+ snprintf(path, sizeof(path), "%s/%s", dir, de->d_name);
+ ar = lmo_open(path);
+
+ if (ar)
+ {
+ ar->next = cat->archives;
+ cat->archives = ar;
+ }
+ }
+ }
+
+ closedir(dh);
+
+ cat->next = _lmo_catalogs;
+ _lmo_catalogs = cat;
+
+ if (!_lmo_active_catalog)
+ _lmo_active_catalog = cat;
+
+ return cat->archives ? 0 : -1;
+
+err:
+ if (dh) closedir(dh);
+ if (cat) free(cat);
+
+ return -1;
+}
+
+int lmo_change_catalog(const char *lang)
+{
+ lmo_catalog_t *cat;
+
+ for (cat = _lmo_catalogs; cat; cat = cat->next)
+ {
+ if (!strncmp(cat->lang, lang, sizeof(cat->lang)))
+ {
+ _lmo_active_catalog = cat;
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+static lmo_entry_t * lmo_find_entry(lmo_archive_t *ar, uint32_t hash)
+{
+ unsigned int m, l, r;
+ uint32_t k;
+
+ l = 0;
+ r = ar->length - 1;
+
+ while (1)
+ {
+ m = l + ((r - l) / 2);
+
+ if (r < l)
+ break;
+
+ k = ntohl(ar->index[m].key_id);
+
+ if (k == hash)
+ return &ar->index[m];
+
+ if (k > hash)
+ {
+ if (!m)
+ break;
+
+ r = m - 1;
+ }
+ else
+ {
+ l = m + 1;
+ }
+ }
+
+ return NULL;
+}
+
+void *pluralParseAlloc(void *(*)(size_t));
+void pluralParse(void *, int, int, void *);
+void pluralParseFree(void *, void (*)(void *));
+
+static int lmo_eval_plural(const char *expr, int len, int val)
+{
+ struct { int num; int res; } s = { .num = val, .res = -1 };
+ const char *p = NULL;
+ void *pParser = NULL;
+ int t, n;
+ char c;
+
+ while (len > 7) {
+ if (*expr == 'p') {
+ if (!strncmp(expr, "plural=", 7)) {
+ p = expr + 7;
+ len -= 7;
+ break;
+ }
+ }
+
+ expr++;
+ len--;
+ }
+
+ if (!p)
+ goto out;
+
+ pParser = pluralParseAlloc(malloc);
+
+ if (!pParser)
+ goto out;
+
+ while (len-- > 0) {
+ c = *p++;
+ t = -1;
+ n = 0;
+
+ switch (c) {
+ case ' ':
+ case '\t':
+ continue;
+
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ t = T_NUM;
+ n = c - '0';
+
+ while (*p >= '0' && *p <= '9') {
+ n *= 10;
+ n += *p - '0';
+ p++;
+ }
+
+ break;
+
+ case '=':
+ if (*p == '=') {
+ t = T_EQ;
+ p++;
+ }
+
+ break;
+
+ case '!':
+ if (*p == '=') {
+ t = T_NE;
+ p++;
+ }
+ else {
+ t = T_NOT;
+ }
+
+ break;
+
+ case '&':
+ if (*p == '&') {
+ t = T_AND;
+ p++;
+ }
+
+ break;
+
+ case '|':
+ if (*p == '|') {
+ t = T_OR;
+ p++;
+ }
+
+ break;
+
+ case '<':
+ if (*p == '=') {
+ t = T_LE;
+ p++;
+ }
+ else {
+ t = T_LT;
+ }
+
+ break;
+
+ case '>':
+ if (*p == '=') {
+ t = T_GE;
+ p++;
+ }
+ else {
+ t = T_GT;
+ }
+
+ break;
+
+ case '*':
+ t = T_MUL;
+ break;
+
+ case '/':
+ t = T_DIV;
+ break;
+
+ case '%':
+ t = T_MOD;
+ break;
+
+ case '+':
+ t = T_ADD;
+ break;
+
+ case '-':
+ t = T_SUB;
+ break;
+
+ case 'n':
+ t = T_N;
+ break;
+
+ case '?':
+ t = T_QMARK;
+ break;
+
+ case ':':
+ t = T_COLON;
+ break;
+
+ case '(':
+ t = T_LPAREN;
+ break;
+
+ case ')':
+ t = T_RPAREN;
+ break;
+
+ case ';':
+ case '\n':
+ case '\0':
+ t = 0;
+ break;
+ }
+
+ /* syntax error */
+ if (t < 0)
+ goto out;
+
+ pluralParse(pParser, t, n, &s);
+
+ /* eof */
+ if (t == 0)
+ break;
+ }
+
+ pluralParse(pParser, 0, 0, &s);
+
+out:
+ pluralParseFree(pParser, free);
+
+ return s.res;
+}
+
+int lmo_translate(const char *key, int keylen, char **out, int *outlen)
+{
+ return lmo_translate_ctxt(key, keylen, NULL, 0, out, outlen);
+}
+
+int lmo_translate_ctxt(const char *key, int keylen,
+ const char *ctx, int ctxlen,
+ char **out, int *outlen)
+{
+ uint32_t hash;
+ lmo_entry_t *e;
+ lmo_archive_t *ar;
+
+ if (!key || !_lmo_active_catalog)
+ return -2;
+
+ hash = lmo_canon_hash(key, keylen, ctx, ctxlen, -1);
+
+ if (hash > 0)
+ {
+ for (ar = _lmo_active_catalog->archives; ar; ar = ar->next)
+ {
+ if ((e = lmo_find_entry(ar, hash)) != NULL)
+ {
+ *out = ar->mmap + ntohl(e->offset);
+ *outlen = ntohl(e->length);
+ return 0;
+ }
+ }
+ }
+
+ return -1;
+}
+
+int lmo_translate_plural(int n, const char *skey, int skeylen,
+ const char *pkey, int pkeylen,
+ char **out, int *outlen)
+{
+ return lmo_translate_plural_ctxt(n, skey, skeylen, pkey, pkeylen,
+ NULL, 0, out, outlen);
+}
+
+int lmo_translate_plural_ctxt(int n, const char *skey, int skeylen,
+ const char *pkey, int pkeylen,
+ const char *ctx, int ctxlen,
+ char **out, int *outlen)
+{
+ int pid = -1;
+ uint32_t hash;
+ lmo_entry_t *e;
+ lmo_archive_t *ar;
+
+ if (!skey || !pkey || !_lmo_active_catalog)
+ return -2;
+
+ for (ar = _lmo_active_catalog->archives; ar; ar = ar->next) {
+ e = lmo_find_entry(ar, 0);
+
+ if (e != NULL) {
+ pid = lmo_eval_plural(ar->mmap + ntohl(e->offset), ntohl(e->length), n);
+ break;
+ }
+ }
+
+ if (pid == -1)
+ pid = (n != 1);
+
+ hash = lmo_canon_hash(skey, skeylen, ctx, ctxlen, pid);
+
+ if (hash == 0)
+ return -1;
+
+ for (ar = _lmo_active_catalog->archives; ar; ar = ar->next)
+ {
+ if ((e = lmo_find_entry(ar, hash)) != NULL)
+ {
+ *out = ar->mmap + ntohl(e->offset);
+ *outlen = ntohl(e->length);
+ return 0;
+ }
+ }
+
+ if (n != 1)
+ {
+ *out = (char *)pkey;
+ *outlen = pkeylen;
+ }
+ else
+ {
+ *out = (char *)skey;
+ *outlen = skeylen;
+ }
+
+ return 0;
+}
+
+void lmo_iterate(lmo_iterate_cb_t cb, void *priv)
+{
+ unsigned int i;
+ lmo_entry_t *e;
+ lmo_archive_t *ar;
+
+ if (!_lmo_active_catalog)
+ return;
+
+ for (ar = _lmo_active_catalog->archives; ar; ar = ar->next)
+ for (i = 0, e = &ar->index[0]; i < ar->length; e = &ar->index[++i])
+ cb(ntohl(e->key_id), ar->mmap + ntohl(e->offset), ntohl(e->length), priv);
+}
+
+void lmo_close_catalog(const char *lang)
+{
+ lmo_archive_t *ar, *next;
+ lmo_catalog_t *cat, *prev;
+
+ for (prev = NULL, cat = _lmo_catalogs; cat; prev = cat, cat = cat->next)
+ {
+ if (!strncmp(cat->lang, lang, sizeof(cat->lang)))
+ {
+ if (prev)
+ prev->next = cat->next;
+ else
+ _lmo_catalogs = cat->next;
+
+ for (ar = cat->archives; ar; ar = next)
+ {
+ next = ar->next;
+ lmo_close(ar);
+ }
+
+ free(cat);
+ break;
+ }
+ }
+}
--- /dev/null
+/*
+ * lmo - Lua Machine Objects - General header
+ *
+ * Copyright (C) 2009-2012 Jo-Philipp Wich <jow@openwrt.org>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _TEMPLATE_LMO_H_
+#define _TEMPLATE_LMO_H_
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fnmatch.h>
+#include <dirent.h>
+#include <ctype.h>
+#include <limits.h>
+
+#if (defined(__GNUC__) && defined(__i386__))
+#define sfh_get16(d) (*((const uint16_t *) (d)))
+#else
+#define sfh_get16(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
+ +(uint32_t)(((const uint8_t *)(d))[0]) )
+#endif
+
+#ifndef __hidden
+#define __hidden __attribute__((visibility("hidden")))
+#endif
+
+
+struct lmo_entry {
+ uint32_t key_id;
+ uint32_t val_id;
+ uint32_t offset;
+ uint32_t length;
+} __attribute__((packed));
+
+typedef struct lmo_entry lmo_entry_t;
+
+
+struct lmo_archive {
+ int fd;
+ int length;
+ uint32_t size;
+ lmo_entry_t *index;
+ char *mmap;
+ char *end;
+ struct lmo_archive *next;
+};
+
+typedef struct lmo_archive lmo_archive_t;
+
+
+struct lmo_catalog {
+ char lang[6];
+ struct lmo_archive *archives;
+ struct lmo_catalog *next;
+};
+
+typedef struct lmo_catalog lmo_catalog_t;
+
+typedef void (*lmo_iterate_cb_t)(uint32_t, const char *, int, void *);
+
+__hidden uint32_t sfh_hash(const char *data, size_t len, uint32_t init);
+__hidden uint32_t lmo_canon_hash(const char *data, int len,
+ const char *ctx, int ctxlen, int plural);
+
+__hidden lmo_archive_t * lmo_open(const char *file);
+__hidden void lmo_close(lmo_archive_t *ar);
+
+
+__hidden extern lmo_catalog_t *_lmo_catalogs;
+__hidden extern lmo_catalog_t *_lmo_active_catalog;
+
+__hidden int lmo_load_catalog(const char *lang, const char *dir);
+__hidden int lmo_change_catalog(const char *lang);
+__hidden int lmo_translate(const char *key, int keylen, char **out, int *outlen);
+__hidden int lmo_translate_ctxt(const char *key, int keylen,
+ const char *ctx, int ctxlen, char **out, int *outlen);
+__hidden int lmo_translate_plural(int n, const char *skey, int skeylen,
+ const char *pkey, int pkeylen,
+ char **out, int *outlen);
+__hidden int lmo_translate_plural_ctxt(int n, const char *skey, int skeylen,
+ const char *pkey, int pkeylen,
+ const char *ctx, int ctxlen,
+ char **out, int *outlen);
+__hidden void lmo_iterate(lmo_iterate_cb_t cb, void *priv);
+__hidden void lmo_close_catalog(const char *lang);
+
+#endif
--- /dev/null
+/*
+ * LuCI low level routines - ucode binding
+ *
+ * Copyright (C) 2009-2022 Jo-Philipp Wich <jo@mein.io>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "lmo.h"
+
+#include <pwd.h>
+#include <crypt.h>
+#include <shadow.h>
+#include <unistd.h>
+#include <signal.h>
+#include <errno.h>
+
+#include <sys/types.h>
+#include <sys/utsname.h>
+#include <sys/sysinfo.h>
+#include <sys/statvfs.h>
+
+#include <ucode/module.h>
+
+/* translation catalog functions */
+
+static uc_value_t *
+uc_luci_load_catalog(uc_vm_t *vm, size_t nargs) {
+ uc_value_t *lang = uc_fn_arg(0);
+ uc_value_t *dir = uc_fn_arg(1);
+
+ if (lang && ucv_type(lang) != UC_STRING)
+ return NULL;
+
+ if (dir && ucv_type(dir) != UC_STRING)
+ return NULL;
+
+ return ucv_boolean_new(lmo_load_catalog(
+ lang ? ucv_string_get(lang) : "en",
+ ucv_string_get(dir)) == 0);
+}
+
+static uc_value_t *
+uc_luci_close_catalog(uc_vm_t *vm, size_t nargs) {
+ uc_value_t *lang = uc_fn_arg(0);
+
+ if (lang && ucv_type(lang) != UC_STRING)
+ return NULL;
+
+ lmo_close_catalog(lang ? ucv_string_get(lang) : "en");
+
+ return ucv_boolean_new(true);
+}
+
+static uc_value_t *
+uc_luci_change_catalog(uc_vm_t *vm, size_t nargs) {
+ uc_value_t *lang = uc_fn_arg(0);
+
+ if (lang && ucv_type(lang) != UC_STRING)
+ return NULL;
+
+ return ucv_boolean_new(lmo_change_catalog(
+ lang ? ucv_string_get(lang) : "en") == 0);
+}
+
+static void
+uc_luci_get_translations_cb(uint32_t key, const char *val, int len, void *priv) {
+ uc_vm_t *vm = priv;
+
+ uc_vm_stack_push(vm, ucv_get(uc_vm_stack_peek(vm, 0)));
+ uc_vm_stack_push(vm, ucv_uint64_new(key));
+ uc_vm_stack_push(vm, ucv_string_new_length(val, (size_t)len));
+
+ if (uc_vm_call(vm, false, 2) == EXCEPTION_NONE)
+ ucv_put(uc_vm_stack_pop(vm));
+}
+
+static uc_value_t *
+uc_luci_get_translations(uc_vm_t *vm, size_t nargs) {
+ lmo_iterate(uc_luci_get_translations_cb, vm);
+
+ return ucv_boolean_new(true);
+}
+
+static uc_value_t *
+uc_luci_translate(uc_vm_t *vm, size_t nargs) {
+ uc_value_t *key = uc_fn_arg(0);
+ uc_value_t *ctx = uc_fn_arg(1);
+ int trlen;
+ char *tr;
+
+ if (ucv_type(key) != UC_STRING)
+ return NULL;
+
+ if (ctx && ucv_type(ctx) != UC_STRING)
+ return NULL;
+
+ if (lmo_translate_ctxt(ucv_string_get(key), ucv_string_length(key),
+ ucv_string_get(ctx), ucv_string_length(ctx),
+ &tr, &trlen) != 0)
+ return NULL;
+
+ return ucv_string_new_length(tr, (size_t)trlen);
+}
+
+static uc_value_t *
+uc_luci_ntranslate(uc_vm_t *vm, size_t nargs) {
+ uc_value_t *cnt = uc_fn_arg(0);
+ uc_value_t *skey = uc_fn_arg(1);
+ uc_value_t *pkey = uc_fn_arg(2);
+ uc_value_t *ctx = uc_fn_arg(3);
+ int trlen;
+ char *tr;
+
+ if (ucv_type(skey) != UC_STRING || ucv_type(pkey) != UC_STRING)
+ return NULL;
+
+ if (ctx && ucv_type(ctx) != UC_STRING)
+ return NULL;
+
+ if (lmo_translate_plural_ctxt(ucv_int64_get(cnt),
+ ucv_string_get(skey), ucv_string_length(skey),
+ ucv_string_get(pkey), ucv_string_length(pkey),
+ ucv_string_get(ctx), ucv_string_length(ctx),
+ &tr, &trlen) != 0)
+ return NULL;
+
+ return ucv_string_new_length(tr, (size_t)trlen);
+}
+
+static uc_value_t *
+uc_luci_hash(uc_vm_t *vm, size_t nargs) {
+ uc_value_t *key = uc_fn_arg(0);
+ uc_value_t *init = uc_fn_arg(1);
+
+ if (ucv_type(key) != UC_STRING)
+ return NULL;
+
+ if (init && ucv_type(init) != UC_INTEGER)
+ return NULL;
+
+ return ucv_uint64_new(sfh_hash(ucv_string_get(key), ucv_string_length(key),
+ init ? ucv_uint64_get(init) : ucv_string_length(key)));
+}
+
+
+/* user functions */
+
+static uc_value_t *
+uc_luci_getspnam(uc_vm_t *vm, size_t nargs) {
+ uc_value_t *name = uc_fn_arg(0), *rv;
+ struct spwd *s;
+
+ if (ucv_type(name) != UC_STRING)
+ return NULL;
+
+ s = getspnam(ucv_string_get(name));
+
+ if (!s)
+ return NULL;
+
+ rv = ucv_object_new(vm);
+
+ ucv_object_add(rv, "namp", ucv_string_new(s->sp_namp));
+ ucv_object_add(rv, "pwdp", ucv_string_new(s->sp_pwdp));
+ ucv_object_add(rv, "lstchg", ucv_int64_new(s->sp_lstchg));
+ ucv_object_add(rv, "min", ucv_int64_new(s->sp_min));
+ ucv_object_add(rv, "max", ucv_int64_new(s->sp_max));
+ ucv_object_add(rv, "warn", ucv_int64_new(s->sp_warn));
+ ucv_object_add(rv, "inact", ucv_int64_new(s->sp_inact));
+ ucv_object_add(rv, "expire", ucv_int64_new(s->sp_expire));
+
+ return rv;
+}
+
+static uc_value_t *
+uc_luci_getpwnam(uc_vm_t *vm, size_t nargs) {
+ uc_value_t *name = uc_fn_arg(0), *rv;
+ struct passwd *p;
+
+ if (ucv_type(name) != UC_STRING)
+ return NULL;
+
+ p = getpwnam(ucv_string_get(name));
+
+ if (!p)
+ return NULL;
+
+ rv = ucv_object_new(vm);
+
+ ucv_object_add(rv, "name", ucv_string_new(p->pw_name));
+ ucv_object_add(rv, "passwd", ucv_string_new(p->pw_passwd));
+ ucv_object_add(rv, "uid", ucv_int64_new(p->pw_uid));
+ ucv_object_add(rv, "gid", ucv_int64_new(p->pw_gid));
+ ucv_object_add(rv, "gecos", ucv_string_new(p->pw_gecos));
+ ucv_object_add(rv, "dir", ucv_string_new(p->pw_dir));
+ ucv_object_add(rv, "shell", ucv_string_new(p->pw_shell));
+
+ return rv;
+}
+
+static uc_value_t *
+uc_luci_crypt(uc_vm_t *vm, size_t nargs) {
+ uc_value_t *phrase = uc_fn_arg(0);
+ uc_value_t *setting = uc_fn_arg(1);
+ char *hash;
+
+ if (ucv_type(phrase) != UC_STRING || ucv_type(setting) != UC_STRING)
+ return NULL;
+
+ errno = 0;
+ hash = crypt(ucv_string_get(phrase), ucv_string_get(setting));
+
+ if (hash == NULL || errno != 0)
+ return NULL;
+
+ return ucv_string_new(hash);
+}
+
+static uc_value_t *
+uc_luci_getuid(uc_vm_t *vm, size_t nargs) {
+ return ucv_int64_new(getuid());
+}
+
+static uc_value_t *
+uc_luci_getgid(uc_vm_t *vm, size_t nargs) {
+ return ucv_int64_new(getgid());
+}
+
+static uc_value_t *
+uc_luci_setuid(uc_vm_t *vm, size_t nargs) {
+ uc_value_t *uid = uc_fn_arg(0);
+
+ if (ucv_type(uid) != UC_INTEGER)
+ return NULL;
+
+ return ucv_boolean_new(setuid(ucv_int64_get(uid)) == 0);
+}
+
+static uc_value_t *
+uc_luci_setgid(uc_vm_t *vm, size_t nargs) {
+ uc_value_t *gid = uc_fn_arg(0);
+
+ if (ucv_type(gid) != UC_INTEGER)
+ return NULL;
+
+ return ucv_boolean_new(setgid(ucv_int64_get(gid)) == 0);
+}
+
+
+/* misc functions */
+
+static uc_value_t *
+uc_luci_kill(uc_vm_t *vm, size_t nargs) {
+ uc_value_t *pid = uc_fn_arg(0);
+ uc_value_t *sig = uc_fn_arg(1);
+
+ if (ucv_type(pid) != UC_INTEGER || ucv_type(sig) != UC_INTEGER)
+ return NULL;
+
+ return ucv_boolean_new(kill(ucv_int64_get(pid), ucv_int64_get(sig)) == 0);
+}
+
+static uc_value_t *
+uc_luci_uname(uc_vm_t *vm, size_t nargs) {
+ struct utsname u;
+ uc_value_t *rv;
+
+ if (uname(&u) == -1)
+ return NULL;
+
+ rv = ucv_object_new(vm);
+
+ ucv_object_add(rv, "sysname", ucv_string_new(u.sysname));
+ ucv_object_add(rv, "nodename", ucv_string_new(u.nodename));
+ ucv_object_add(rv, "release", ucv_string_new(u.release));
+ ucv_object_add(rv, "version", ucv_string_new(u.version));
+ ucv_object_add(rv, "machine", ucv_string_new(u.machine));
+
+ return rv;
+}
+
+static uc_value_t *
+uc_luci_sysinfo(uc_vm_t *vm, size_t nargs) {
+ uc_value_t *rv, *loads;
+ struct sysinfo i;
+
+ if (sysinfo(&i) == -1)
+ return NULL;
+
+ rv = ucv_object_new(vm);
+ loads = ucv_array_new_length(vm, 3);
+
+ ucv_array_push(loads, ucv_uint64_new(i.loads[0]));
+ ucv_array_push(loads, ucv_uint64_new(i.loads[1]));
+ ucv_array_push(loads, ucv_uint64_new(i.loads[2]));
+
+ ucv_object_add(rv, "uptime", ucv_int64_new(i.uptime));
+ ucv_object_add(rv, "loads", loads);
+ ucv_object_add(rv, "totalram", ucv_uint64_new(i.totalram));
+ ucv_object_add(rv, "freeram", ucv_uint64_new(i.freeram));
+ ucv_object_add(rv, "sharedram", ucv_uint64_new(i.sharedram));
+ ucv_object_add(rv, "bufferram", ucv_uint64_new(i.bufferram));
+ ucv_object_add(rv, "totalswap", ucv_uint64_new(i.totalswap));
+ ucv_object_add(rv, "freeswap", ucv_uint64_new(i.freeswap));
+ ucv_object_add(rv, "procs", ucv_uint64_new(i.procs));
+ ucv_object_add(rv, "totalhigh", ucv_uint64_new(i.totalhigh));
+ ucv_object_add(rv, "freehigh", ucv_uint64_new(i.freehigh));
+ ucv_object_add(rv, "mem_unit", ucv_uint64_new(i.mem_unit));
+
+ return rv;
+}
+
+static uc_value_t *
+uc_luci_statvfs(uc_vm_t *vm, size_t nargs) {
+ uc_value_t *path = uc_fn_arg(0), *rv;
+ struct statvfs s;
+
+ if (ucv_type(path) != UC_STRING)
+ return NULL;
+
+ if (statvfs(ucv_string_get(path), &s) == -1)
+ return NULL;
+
+ rv = ucv_object_new(vm);
+
+ ucv_object_add(rv, "bsize", ucv_uint64_new(s.f_bsize));
+ ucv_object_add(rv, "frsize", ucv_uint64_new(s.f_frsize));
+
+ ucv_object_add(rv, "blocks", ucv_uint64_new(s.f_blocks));
+ ucv_object_add(rv, "bfree", ucv_uint64_new(s.f_bfree));
+ ucv_object_add(rv, "bavail", ucv_uint64_new(s.f_bavail));
+
+ ucv_object_add(rv, "files", ucv_uint64_new(s.f_files));
+ ucv_object_add(rv, "ffree", ucv_uint64_new(s.f_ffree));
+ ucv_object_add(rv, "favail", ucv_uint64_new(s.f_favail));
+
+ ucv_object_add(rv, "fsid", ucv_uint64_new(s.f_fsid));
+ ucv_object_add(rv, "flag", ucv_uint64_new(s.f_flag));
+ ucv_object_add(rv, "namemax", ucv_uint64_new(s.f_namemax));
+
+ return rv;
+}
+
+
+static const uc_function_list_t luci_fns[] = {
+ { "load_catalog", uc_luci_load_catalog },
+ { "close_catalog", uc_luci_close_catalog },
+ { "change_catalog", uc_luci_change_catalog },
+ { "get_translations", uc_luci_get_translations },
+ { "translate", uc_luci_translate },
+ { "ntranslate", uc_luci_ntranslate },
+ { "hash", uc_luci_hash },
+
+ { "getspnam", uc_luci_getspnam },
+ { "getpwnam", uc_luci_getpwnam },
+ { "crypt", uc_luci_crypt },
+ { "getuid", uc_luci_getuid },
+ { "setuid", uc_luci_setuid },
+ { "getgid", uc_luci_getgid },
+ { "setgid", uc_luci_setgid },
+
+ { "kill", uc_luci_kill },
+ { "uname", uc_luci_uname },
+ { "sysinfo", uc_luci_sysinfo },
+ { "statvfs", uc_luci_statvfs },
+};
+
+
+void uc_module_init(uc_vm_t *vm, uc_value_t *scope)
+{
+ uc_function_list_register(scope, luci_fns);
+}
--- /dev/null
+%name pluralParse
+%token_type {int}
+%extra_argument {struct parse_state *s}
+
+%right T_QMARK.
+%left T_OR.
+%left T_AND.
+%left T_EQ T_NE.
+%left T_LT T_LE T_GT T_GE.
+%left T_ADD T_SUB.
+%left T_MUL T_DIV T_MOD.
+%right T_NOT.
+%nonassoc T_COLON T_N T_LPAREN T_RPAREN.
+
+%include {
+#include <assert.h>
+
+struct parse_state {
+ int num;
+ int res;
+};
+}
+
+input ::= expr(A). { s->res = A; }
+
+expr(A) ::= expr(B) T_QMARK expr(C) T_COLON expr(D). { A = B ? C : D; }
+expr(A) ::= expr(B) T_OR expr(C). { A = B || C; }
+expr(A) ::= expr(B) T_AND expr(C). { A = B && C; }
+expr(A) ::= expr(B) T_EQ expr(C). { A = B == C; }
+expr(A) ::= expr(B) T_NE expr(C). { A = B != C; }
+expr(A) ::= expr(B) T_LT expr(C). { A = B < C; }
+expr(A) ::= expr(B) T_LE expr(C). { A = B <= C; }
+expr(A) ::= expr(B) T_GT expr(C). { A = B > C; }
+expr(A) ::= expr(B) T_GE expr(C). { A = B >= C; }
+expr(A) ::= expr(B) T_ADD expr(C). { A = B + C; }
+expr(A) ::= expr(B) T_SUB expr(C). { A = B - C; }
+expr(A) ::= expr(B) T_MUL expr(C). { A = B * C; }
+expr(A) ::= expr(B) T_DIV expr(C). { A = B / C; }
+expr(A) ::= expr(B) T_MOD expr(C). { A = B % C; }
+expr(A) ::= T_NOT expr(B). { A = !B; }
+expr(A) ::= T_N. { A = s->num; }
+expr(A) ::= T_NUM(B). { A = B; }
+expr(A) ::= T_LPAREN expr(B) T_RPAREN. { A = B; }
+++ /dev/null
-#!/bin/sh
-
-cat <<EOF > $1
-local pcall, dofile, _G = pcall, dofile, _G
-
-module "luci.version"
-
-if pcall(dofile, "/etc/openwrt_release") and _G.DISTRIB_DESCRIPTION then
- distname = ""
- distversion = _G.DISTRIB_DESCRIPTION
- if _G.DISTRIB_REVISION then
- distrevision = _G.DISTRIB_REVISION
- if not distversion:find(distrevision,1,true) then
- distversion = distversion .. " " .. distrevision
- end
- end
-else
- distname = "OpenWrt"
- distversion = "Development Snapshot"
-end
-
-luciname = "${3:-LuCI}"
-luciversion = "${2:-Git}"
-EOF
+++ /dev/null
-%name pluralParse
-%token_type {int}
-%extra_argument {struct parse_state *s}
-
-%right T_QMARK.
-%left T_OR.
-%left T_AND.
-%left T_EQ T_NE.
-%left T_LT T_LE T_GT T_GE.
-%left T_ADD T_SUB.
-%left T_MUL T_DIV T_MOD.
-%right T_NOT.
-%nonassoc T_COLON T_N T_LPAREN T_RPAREN.
-
-%include {
-#include <assert.h>
-
-struct parse_state {
- int num;
- int res;
-};
-}
-
-input ::= expr(A). { s->res = A; }
-
-expr(A) ::= expr(B) T_QMARK expr(C) T_COLON expr(D). { A = B ? C : D; }
-expr(A) ::= expr(B) T_OR expr(C). { A = B || C; }
-expr(A) ::= expr(B) T_AND expr(C). { A = B && C; }
-expr(A) ::= expr(B) T_EQ expr(C). { A = B == C; }
-expr(A) ::= expr(B) T_NE expr(C). { A = B != C; }
-expr(A) ::= expr(B) T_LT expr(C). { A = B < C; }
-expr(A) ::= expr(B) T_LE expr(C). { A = B <= C; }
-expr(A) ::= expr(B) T_GT expr(C). { A = B > C; }
-expr(A) ::= expr(B) T_GE expr(C). { A = B >= C; }
-expr(A) ::= expr(B) T_ADD expr(C). { A = B + C; }
-expr(A) ::= expr(B) T_SUB expr(C). { A = B - C; }
-expr(A) ::= expr(B) T_MUL expr(C). { A = B * C; }
-expr(A) ::= expr(B) T_DIV expr(C). { A = B / C; }
-expr(A) ::= expr(B) T_MOD expr(C). { A = B % C; }
-expr(A) ::= T_NOT expr(B). { A = !B; }
-expr(A) ::= T_N. { A = s->num; }
-expr(A) ::= T_NUM(B). { A = B; }
-expr(A) ::= T_LPAREN expr(B) T_RPAREN. { A = B; }
* limitations under the License.
*/
-#include "template_lmo.h"
+#include "lib/lmo.h"
static void die(const char *msg)
{
else
snprintf(key, sizeof(key), "%s", msg->id);
- key_id = sfh_hash(key, strlen(key));
- val_id = sfh_hash(msg->val[i], strlen(msg->val[i]));
+ len = strlen(key);
+ key_id = sfh_hash(key, len, len);
+
+ len = strlen(msg->val[i]);
+ val_id = sfh_hash(msg->val[i], len, len);
if (key_id != val_id) {
n_entries++;
+++ /dev/null
-/*
- * lmo - Lua Machine Objects - Base functions
- *
- * Copyright (C) 2009-2010 Jo-Philipp Wich <jow@openwrt.org>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "template_lmo.h"
-#include "plural_formula.h"
-
-/*
- * Hash function from http://www.azillionmonkeys.com/qed/hash.html
- * Copyright (C) 2004-2008 by Paul Hsieh
- */
-
-uint32_t sfh_hash(const char *data, int len)
-{
- uint32_t hash = len, tmp;
- int rem;
-
- if (len <= 0 || data == NULL) return 0;
-
- rem = len & 3;
- len >>= 2;
-
- /* Main loop */
- for (;len > 0; len--) {
- hash += sfh_get16(data);
- tmp = (sfh_get16(data+2) << 11) ^ hash;
- hash = (hash << 16) ^ tmp;
- data += 2*sizeof(uint16_t);
- hash += hash >> 11;
- }
-
- /* Handle end cases */
- switch (rem) {
- case 3: hash += sfh_get16(data);
- hash ^= hash << 16;
- hash ^= (signed char)data[sizeof(uint16_t)] << 18;
- hash += hash >> 11;
- break;
- case 2: hash += sfh_get16(data);
- hash ^= hash << 11;
- hash += hash >> 17;
- break;
- case 1: hash += (signed char)*data;
- hash ^= hash << 10;
- hash += hash >> 1;
- }
-
- /* Force "avalanching" of final 127 bits */
- hash ^= hash << 3;
- hash += hash >> 5;
- hash ^= hash << 4;
- hash += hash >> 17;
- hash ^= hash << 25;
- hash += hash >> 6;
-
- return hash;
-}
-
-uint32_t lmo_canon_hash(const char *str, int len,
- const char *ctx, int ctxlen, int plural)
-{
- char res[4096];
- char *ptr, *end, prev;
- int off;
-
- if (!str)
- return 0;
-
- ptr = res;
- end = res + sizeof(res);
-
- if (ctx)
- {
- for (prev = ' ', off = 0; off < ctxlen; prev = *ctx, off++, ctx++)
- {
- if (ptr >= end)
- return 0;
-
- if (isspace(*ctx))
- {
- if (!isspace(prev))
- *ptr++ = ' ';
- }
- else
- {
- *ptr++ = *ctx;
- }
- }
-
- if ((ptr > res) && isspace(*(ptr-1)))
- ptr--;
-
- if (ptr >= end)
- return 0;
-
- *ptr++ = '\1';
- }
-
- for (prev = ' ', off = 0; off < len; prev = *str, off++, str++)
- {
- if (ptr >= end)
- return 0;
-
- if (isspace(*str))
- {
- if (!isspace(prev))
- *ptr++ = ' ';
- }
- else
- {
- *ptr++ = *str;
- }
- }
-
- if ((ptr > res) && isspace(*(ptr-1)))
- ptr--;
-
- if (plural > -1)
- {
- if (plural >= 100 || ptr + 3 >= end)
- return 0;
-
- ptr += snprintf(ptr, 3, "\2%d", plural);
- }
-
- return sfh_hash(res, ptr - res);
-}
-
-lmo_archive_t * lmo_open(const char *file)
-{
- int in = -1;
- uint32_t idx_offset = 0;
- struct stat s;
-
- lmo_archive_t *ar = NULL;
-
- if (stat(file, &s) == -1)
- goto err;
-
- if ((in = open(file, O_RDONLY)) == -1)
- goto err;
-
- if ((ar = (lmo_archive_t *)malloc(sizeof(*ar))) != NULL)
- {
- memset(ar, 0, sizeof(*ar));
-
- ar->fd = in;
- ar->size = s.st_size;
-
- fcntl(ar->fd, F_SETFD, fcntl(ar->fd, F_GETFD) | FD_CLOEXEC);
-
- if ((ar->mmap = mmap(NULL, ar->size, PROT_READ, MAP_SHARED, ar->fd, 0)) == MAP_FAILED)
- goto err;
-
- idx_offset = ntohl(*((const uint32_t *)
- (ar->mmap + ar->size - sizeof(uint32_t))));
-
- if (idx_offset >= ar->size)
- goto err;
-
- ar->index = (lmo_entry_t *)(ar->mmap + idx_offset);
- ar->length = (ar->size - idx_offset - sizeof(uint32_t)) / sizeof(lmo_entry_t);
- ar->end = ar->mmap + ar->size;
-
- return ar;
- }
-
-err:
- if (in > -1)
- close(in);
-
- if (ar != NULL)
- {
- if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED))
- munmap(ar->mmap, ar->size);
-
- free(ar);
- }
-
- return NULL;
-}
-
-void lmo_close(lmo_archive_t *ar)
-{
- if (ar != NULL)
- {
- if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED))
- munmap(ar->mmap, ar->size);
-
- close(ar->fd);
- free(ar);
-
- ar = NULL;
- }
-}
-
-
-lmo_catalog_t *_lmo_catalogs = NULL;
-lmo_catalog_t *_lmo_active_catalog = NULL;
-
-int lmo_load_catalog(const char *lang, const char *dir)
-{
- DIR *dh = NULL;
- char pattern[16];
- char path[PATH_MAX];
- struct dirent *de = NULL;
-
- lmo_archive_t *ar = NULL;
- lmo_catalog_t *cat = NULL;
-
- if (!lmo_change_catalog(lang))
- return 0;
-
- if (!dir || !(dh = opendir(dir)))
- goto err;
-
- if (!(cat = malloc(sizeof(*cat))))
- goto err;
-
- memset(cat, 0, sizeof(*cat));
-
- snprintf(cat->lang, sizeof(cat->lang), "%s", lang);
- snprintf(pattern, sizeof(pattern), "*.%s.lmo", lang);
-
- while ((de = readdir(dh)) != NULL)
- {
- if (!fnmatch(pattern, de->d_name, 0))
- {
- snprintf(path, sizeof(path), "%s/%s", dir, de->d_name);
- ar = lmo_open(path);
-
- if (ar)
- {
- ar->next = cat->archives;
- cat->archives = ar;
- }
- }
- }
-
- closedir(dh);
-
- cat->next = _lmo_catalogs;
- _lmo_catalogs = cat;
-
- if (!_lmo_active_catalog)
- _lmo_active_catalog = cat;
-
- return cat->archives ? 0 : -1;
-
-err:
- if (dh) closedir(dh);
- if (cat) free(cat);
-
- return -1;
-}
-
-int lmo_change_catalog(const char *lang)
-{
- lmo_catalog_t *cat;
-
- for (cat = _lmo_catalogs; cat; cat = cat->next)
- {
- if (!strncmp(cat->lang, lang, sizeof(cat->lang)))
- {
- _lmo_active_catalog = cat;
- return 0;
- }
- }
-
- return -1;
-}
-
-static lmo_entry_t * lmo_find_entry(lmo_archive_t *ar, uint32_t hash)
-{
- unsigned int m, l, r;
- uint32_t k;
-
- l = 0;
- r = ar->length - 1;
-
- while (1)
- {
- m = l + ((r - l) / 2);
-
- if (r < l)
- break;
-
- k = ntohl(ar->index[m].key_id);
-
- if (k == hash)
- return &ar->index[m];
-
- if (k > hash)
- {
- if (!m)
- break;
-
- r = m - 1;
- }
- else
- {
- l = m + 1;
- }
- }
-
- return NULL;
-}
-
-void *pluralParseAlloc(void *(*)(size_t));
-void pluralParse(void *, int, int, void *);
-void pluralParseFree(void *, void (*)(void *));
-
-static int lmo_eval_plural(const char *expr, int len, int val)
-{
- struct { int num; int res; } s = { .num = val, .res = -1 };
- const char *p = NULL;
- void *pParser = NULL;
- int t, n;
- char c;
-
- while (len > 7) {
- if (*expr == 'p') {
- if (!strncmp(expr, "plural=", 7)) {
- p = expr + 7;
- len -= 7;
- break;
- }
- }
-
- expr++;
- len--;
- }
-
- if (!p)
- goto out;
-
- pParser = pluralParseAlloc(malloc);
-
- if (!pParser)
- goto out;
-
- while (len-- > 0) {
- c = *p++;
- t = -1;
- n = 0;
-
- switch (c) {
- case ' ':
- case '\t':
- continue;
-
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- t = T_NUM;
- n = c - '0';
-
- while (*p >= '0' && *p <= '9') {
- n *= 10;
- n += *p - '0';
- p++;
- }
-
- break;
-
- case '=':
- if (*p == '=') {
- t = T_EQ;
- p++;
- }
-
- break;
-
- case '!':
- if (*p == '=') {
- t = T_NE;
- p++;
- }
- else {
- t = T_NOT;
- }
-
- break;
-
- case '&':
- if (*p == '&') {
- t = T_AND;
- p++;
- }
-
- break;
-
- case '|':
- if (*p == '|') {
- t = T_OR;
- p++;
- }
-
- break;
-
- case '<':
- if (*p == '=') {
- t = T_LE;
- p++;
- }
- else {
- t = T_LT;
- }
-
- break;
-
- case '>':
- if (*p == '=') {
- t = T_GE;
- p++;
- }
- else {
- t = T_GT;
- }
-
- break;
-
- case '*':
- t = T_MUL;
- break;
-
- case '/':
- t = T_DIV;
- break;
-
- case '%':
- t = T_MOD;
- break;
-
- case '+':
- t = T_ADD;
- break;
-
- case '-':
- t = T_SUB;
- break;
-
- case 'n':
- t = T_N;
- break;
-
- case '?':
- t = T_QMARK;
- break;
-
- case ':':
- t = T_COLON;
- break;
-
- case '(':
- t = T_LPAREN;
- break;
-
- case ')':
- t = T_RPAREN;
- break;
-
- case ';':
- case '\n':
- case '\0':
- t = 0;
- break;
- }
-
- /* syntax error */
- if (t < 0)
- goto out;
-
- pluralParse(pParser, t, n, &s);
-
- /* eof */
- if (t == 0)
- break;
- }
-
- pluralParse(pParser, 0, 0, &s);
-
-out:
- pluralParseFree(pParser, free);
-
- return s.res;
-}
-
-int lmo_translate(const char *key, int keylen, char **out, int *outlen)
-{
- return lmo_translate_ctxt(key, keylen, NULL, 0, out, outlen);
-}
-
-int lmo_translate_ctxt(const char *key, int keylen,
- const char *ctx, int ctxlen,
- char **out, int *outlen)
-{
- uint32_t hash;
- lmo_entry_t *e;
- lmo_archive_t *ar;
-
- if (!key || !_lmo_active_catalog)
- return -2;
-
- hash = lmo_canon_hash(key, keylen, ctx, ctxlen, -1);
-
- if (hash > 0)
- {
- for (ar = _lmo_active_catalog->archives; ar; ar = ar->next)
- {
- if ((e = lmo_find_entry(ar, hash)) != NULL)
- {
- *out = ar->mmap + ntohl(e->offset);
- *outlen = ntohl(e->length);
- return 0;
- }
- }
- }
-
- return -1;
-}
-
-int lmo_translate_plural(int n, const char *skey, int skeylen,
- const char *pkey, int pkeylen,
- char **out, int *outlen)
-{
- return lmo_translate_plural_ctxt(n, skey, skeylen, pkey, pkeylen,
- NULL, 0, out, outlen);
-}
-
-int lmo_translate_plural_ctxt(int n, const char *skey, int skeylen,
- const char *pkey, int pkeylen,
- const char *ctx, int ctxlen,
- char **out, int *outlen)
-{
- int pid = -1;
- uint32_t hash;
- lmo_entry_t *e;
- lmo_archive_t *ar;
- const char *plural_formula;
-
- if (!skey || !pkey || !_lmo_active_catalog)
- return -2;
-
- for (ar = _lmo_active_catalog->archives; ar; ar = ar->next) {
- e = lmo_find_entry(ar, 0);
-
- if (e != NULL) {
- pid = lmo_eval_plural(ar->mmap + ntohl(e->offset), ntohl(e->length), n);
- break;
- }
- }
-
- if (pid == -1)
- pid = (n != 1);
-
- hash = lmo_canon_hash(skey, skeylen, ctx, ctxlen, pid);
-
- if (hash == 0)
- return -1;
-
- for (ar = _lmo_active_catalog->archives; ar; ar = ar->next)
- {
- if ((e = lmo_find_entry(ar, hash)) != NULL)
- {
- *out = ar->mmap + ntohl(e->offset);
- *outlen = ntohl(e->length);
- return 0;
- }
- }
-
- if (n != 1)
- {
- *out = (char *)pkey;
- *outlen = pkeylen;
- }
- else
- {
- *out = (char *)skey;
- *outlen = skeylen;
- }
-
- return 0;
-}
-
-void lmo_iterate(lmo_iterate_cb_t cb, void *priv)
-{
- unsigned int i;
- lmo_entry_t *e;
- lmo_archive_t *ar;
-
- if (!_lmo_active_catalog)
- return;
-
- for (ar = _lmo_active_catalog->archives; ar; ar = ar->next)
- for (i = 0, e = &ar->index[0]; i < ar->length; e = &ar->index[++i])
- cb(ntohl(e->key_id), ar->mmap + ntohl(e->offset), ntohl(e->length), priv);
-}
-
-void lmo_close_catalog(const char *lang)
-{
- lmo_archive_t *ar, *next;
- lmo_catalog_t *cat, *prev;
-
- for (prev = NULL, cat = _lmo_catalogs; cat; prev = cat, cat = cat->next)
- {
- if (!strncmp(cat->lang, lang, sizeof(cat->lang)))
- {
- if (prev)
- prev->next = cat->next;
- else
- _lmo_catalogs = cat->next;
-
- for (ar = cat->archives; ar; ar = next)
- {
- next = ar->next;
- lmo_close(ar);
- }
-
- free(cat);
- break;
- }
- }
-}
+++ /dev/null
-/*
- * lmo - Lua Machine Objects - General header
- *
- * Copyright (C) 2009-2012 Jo-Philipp Wich <jow@openwrt.org>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _TEMPLATE_LMO_H_
-#define _TEMPLATE_LMO_H_
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <string.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/mman.h>
-#include <arpa/inet.h>
-#include <unistd.h>
-#include <errno.h>
-#include <fnmatch.h>
-#include <dirent.h>
-#include <ctype.h>
-#include <limits.h>
-
-#if (defined(__GNUC__) && defined(__i386__))
-#define sfh_get16(d) (*((const uint16_t *) (d)))
-#else
-#define sfh_get16(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
- +(uint32_t)(((const uint8_t *)(d))[0]) )
-#endif
-
-
-struct lmo_entry {
- uint32_t key_id;
- uint32_t val_id;
- uint32_t offset;
- uint32_t length;
-} __attribute__((packed));
-
-typedef struct lmo_entry lmo_entry_t;
-
-
-struct lmo_archive {
- int fd;
- int length;
- uint32_t size;
- lmo_entry_t *index;
- char *mmap;
- char *end;
- struct lmo_archive *next;
-};
-
-typedef struct lmo_archive lmo_archive_t;
-
-
-struct lmo_catalog {
- char lang[6];
- struct lmo_archive *archives;
- struct lmo_catalog *next;
-};
-
-typedef struct lmo_catalog lmo_catalog_t;
-
-typedef void (*lmo_iterate_cb_t)(uint32_t, const char *, int, void *);
-
-uint32_t sfh_hash(const char *data, int len);
-uint32_t lmo_canon_hash(const char *data, int len,
- const char *ctx, int ctxlen, int plural);
-
-lmo_archive_t * lmo_open(const char *file);
-void lmo_close(lmo_archive_t *ar);
-
-
-extern lmo_catalog_t *_lmo_catalogs;
-extern lmo_catalog_t *_lmo_active_catalog;
-
-int lmo_load_catalog(const char *lang, const char *dir);
-int lmo_change_catalog(const char *lang);
-int lmo_translate(const char *key, int keylen, char **out, int *outlen);
-int lmo_translate_ctxt(const char *key, int keylen,
- const char *ctx, int ctxlen, char **out, int *outlen);
-int lmo_translate_plural(int n, const char *skey, int skeylen,
- const char *pkey, int pkeylen,
- char **out, int *outlen);
-int lmo_translate_plural_ctxt(int n, const char *skey, int skeylen,
- const char *pkey, int pkeylen,
- const char *ctx, int ctxlen,
- char **out, int *outlen);
-void lmo_iterate(lmo_iterate_cb_t cb, void *priv);
-void lmo_close_catalog(const char *lang);
-
-#endif
+++ /dev/null
-/*
- * LuCI Template - Lua binding
- *
- * Copyright (C) 2009 Jo-Philipp Wich <jow@openwrt.org>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "template_lualib.h"
-
-static int template_L_do_parse(lua_State *L, struct template_parser *parser, const char *chunkname)
-{
- int lua_status, rv;
-
- if (!parser)
- {
- lua_pushnil(L);
- lua_pushinteger(L, errno);
- lua_pushstring(L, strerror(errno));
- return 3;
- }
-
- lua_status = lua_load(L, template_reader, parser, chunkname);
-
- if (lua_status == 0)
- rv = 1;
- else
- rv = template_error(L, parser);
-
- template_close(parser);
-
- return rv;
-}
-
-int template_L_parse(lua_State *L)
-{
- const char *file = luaL_checkstring(L, 1);
- struct template_parser *parser = template_open(file);
-
- return template_L_do_parse(L, parser, file);
-}
-
-int template_L_parse_string(lua_State *L)
-{
- size_t len;
- const char *str = luaL_checklstring(L, 1, &len);
- struct template_parser *parser = template_string(str, len);
-
- return template_L_do_parse(L, parser, "[string]");
-}
-
-int template_L_utf8(lua_State *L)
-{
- size_t len = 0;
- const char *str = luaL_checklstring(L, 1, &len);
- char *res = utf8(str, len);
-
- if (res != NULL)
- {
- lua_pushstring(L, res);
- free(res);
-
- return 1;
- }
-
- return 0;
-}
-
-int template_L_pcdata(lua_State *L)
-{
- size_t len = 0;
- const char *str = luaL_checklstring(L, 1, &len);
- char *res = pcdata(str, len);
-
- if (res != NULL)
- {
- lua_pushstring(L, res);
- free(res);
-
- return 1;
- }
-
- return 0;
-}
-
-int template_L_striptags(lua_State *L)
-{
- size_t len = 0;
- const char *str = luaL_checklstring(L, 1, &len);
- char *res = striptags(str, len);
-
- if (res != NULL)
- {
- lua_pushstring(L, res);
- free(res);
-
- return 1;
- }
-
- return 0;
-}
-
-static int template_L_load_catalog(lua_State *L) {
- const char *lang = luaL_optstring(L, 1, "en");
- const char *dir = luaL_optstring(L, 2, NULL);
- lua_pushboolean(L, !lmo_load_catalog(lang, dir));
- return 1;
-}
-
-static int template_L_close_catalog(lua_State *L) {
- const char *lang = luaL_optstring(L, 1, "en");
- lmo_close_catalog(lang);
- return 0;
-}
-
-static int template_L_change_catalog(lua_State *L) {
- const char *lang = luaL_optstring(L, 1, "en");
- lua_pushboolean(L, !lmo_change_catalog(lang));
- return 1;
-}
-
-static void template_L_get_translations_cb(uint32_t key, const char *val, int len, void *priv) {
- lua_State *L = priv;
- char hex[9];
-
- luaL_checktype(L, 1, LUA_TFUNCTION);
- snprintf(hex, sizeof(hex), "%08x", key);
-
- lua_pushvalue(L, 1);
- lua_pushstring(L, hex);
- lua_pushlstring(L, val, len);
- lua_call(L, 2, 0);
-}
-
-static int template_L_get_translations(lua_State *L) {
- lmo_iterate(template_L_get_translations_cb, L);
- return 0;
-}
-
-static int template_L_translate(lua_State *L) {
- size_t len, ctxlen = 0;
- char *tr;
- int trlen;
- const char *key = luaL_checklstring(L, 1, &len);
- const char *ctx = luaL_optlstring(L, 2, NULL, &ctxlen);
-
- switch (lmo_translate_ctxt(key, len, ctx, ctxlen, &tr, &trlen))
- {
- case 0:
- lua_pushlstring(L, tr, trlen);
- return 1;
-
- case -1:
- return 0;
- }
-
- lua_pushnil(L);
- lua_pushstring(L, "no catalog loaded");
- return 2;
-}
-
-static int template_L_ntranslate(lua_State *L) {
- size_t slen, plen, ctxlen = 0;
- char *tr;
- int trlen;
- int n = luaL_checkinteger(L, 1);
- const char *skey = luaL_checklstring(L, 2, &slen);
- const char *pkey = luaL_checklstring(L, 3, &plen);
- const char *ctx = luaL_optlstring(L, 4, NULL, &ctxlen);
-
- switch (lmo_translate_plural_ctxt(n, skey, slen, pkey, plen, ctx, ctxlen, &tr, &trlen))
- {
- case 0:
- lua_pushlstring(L, tr, trlen);
- return 1;
-
- case -1:
- return 0;
- }
-
- lua_pushnil(L);
- lua_pushstring(L, "no catalog loaded");
- return 2;
-}
-
-static int template_L_hash(lua_State *L) {
- size_t len;
- const char *key = luaL_checklstring(L, 1, &len);
- lua_pushinteger(L, sfh_hash(key, len));
- return 1;
-}
-
-
-/* module table */
-static const luaL_reg R[] = {
- { "parse", template_L_parse },
- { "parse_string", template_L_parse_string },
- { "utf8", template_L_utf8 },
- { "pcdata", template_L_pcdata },
- { "striptags", template_L_striptags },
- { "load_catalog", template_L_load_catalog },
- { "close_catalog", template_L_close_catalog },
- { "change_catalog", template_L_change_catalog },
- { "get_translations", template_L_get_translations },
- { "translate", template_L_translate },
- { "ntranslate", template_L_ntranslate },
- { "hash", template_L_hash },
- { NULL, NULL }
-};
-
-LUALIB_API int luaopen_luci_template_parser(lua_State *L) {
- luaL_register(L, TEMPLATE_LUALIB_META, R);
- return 1;
-}
+++ /dev/null
-/*
- * LuCI Template - Lua library header
- *
- * Copyright (C) 2009 Jo-Philipp Wich <jow@openwrt.org>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _TEMPLATE_LUALIB_H_
-#define _TEMPLATE_LUALIB_H_
-
-#include "template_parser.h"
-#include "template_utils.h"
-#include "template_lmo.h"
-
-#define TEMPLATE_LUALIB_META "template.parser"
-
-LUALIB_API int luaopen_luci_template_parser(lua_State *L);
-
-#endif
+++ /dev/null
-/*
- * LuCI Template - Parser implementation
- *
- * Copyright (C) 2009-2012 Jo-Philipp Wich <jow@openwrt.org>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "template_parser.h"
-#include "template_utils.h"
-#include "template_lmo.h"
-
-
-/* leading and trailing code for different types */
-const char *gen_code[9][2] = {
- { NULL, NULL },
- { "write(\"", "\")" },
- { NULL, NULL },
- { "write(tostring(", " or \"\"))" },
- { "include(\"", "\")" },
- { "write(\"", "\")" },
- { "write(\"", "\")" },
- { NULL, " " },
- { NULL, NULL },
-};
-
-/* Simple strstr() like function that takes len arguments for both haystack and needle. */
-static char *strfind(char *haystack, int hslen, const char *needle, int ndlen)
-{
- int match = 0;
- int i, j;
-
- for( i = 0; i < hslen; i++ )
- {
- if( haystack[i] == needle[0] )
- {
- match = ((ndlen == 1) || ((i + ndlen) <= hslen));
-
- for( j = 1; (j < ndlen) && ((i + j) < hslen); j++ )
- {
- if( haystack[i+j] != needle[j] )
- {
- match = 0;
- break;
- }
- }
-
- if( match )
- return &haystack[i];
- }
- }
-
- return NULL;
-}
-
-struct template_parser * template_open(const char *file)
-{
- struct stat s;
- struct template_parser *parser;
-
- if (!(parser = malloc(sizeof(*parser))))
- goto err;
-
- memset(parser, 0, sizeof(*parser));
- parser->fd = -1;
- parser->file = file;
-
- if (stat(file, &s))
- goto err;
-
- if ((parser->fd = open(file, O_RDONLY)) < 0)
- goto err;
-
- parser->size = s.st_size;
- parser->data = mmap(NULL, parser->size, PROT_READ, MAP_PRIVATE,
- parser->fd, 0);
-
- if (parser->data != MAP_FAILED)
- {
- parser->off = parser->data;
- parser->cur_chunk.type = T_TYPE_INIT;
- parser->cur_chunk.s = parser->data;
- parser->cur_chunk.e = parser->data;
-
- return parser;
- }
-
-err:
- template_close(parser);
- return NULL;
-}
-
-struct template_parser * template_string(const char *str, uint32_t len)
-{
- struct template_parser *parser;
-
- if (!str) {
- errno = EINVAL;
- goto err;
- }
-
- if (!(parser = malloc(sizeof(*parser))))
- goto err;
-
- memset(parser, 0, sizeof(*parser));
- parser->fd = -1;
-
- parser->size = len;
- parser->data = (char*)str;
-
- parser->off = parser->data;
- parser->cur_chunk.type = T_TYPE_INIT;
- parser->cur_chunk.s = parser->data;
- parser->cur_chunk.e = parser->data;
-
- return parser;
-
-err:
- template_close(parser);
- return NULL;
-}
-
-void template_close(struct template_parser *parser)
-{
- if (!parser)
- return;
-
- if (parser->gc != NULL)
- free(parser->gc);
-
- /* if file is not set, we were parsing a string */
- if (parser->file) {
- if ((parser->data != NULL) && (parser->data != MAP_FAILED))
- munmap(parser->data, parser->size);
-
- if (parser->fd >= 0)
- close(parser->fd);
- }
-
- free(parser);
-}
-
-void template_text(struct template_parser *parser, const char *e)
-{
- const char *s = parser->off;
-
- if (s < (parser->data + parser->size))
- {
- if (parser->strip_after)
- {
- while ((s <= e) && isspace(*s))
- s++;
- }
-
- parser->cur_chunk.type = T_TYPE_TEXT;
- }
- else
- {
- parser->cur_chunk.type = T_TYPE_EOF;
- }
-
- parser->cur_chunk.line = parser->line;
- parser->cur_chunk.s = s;
- parser->cur_chunk.e = e;
-}
-
-void template_code(struct template_parser *parser, const char *e)
-{
- const char *s = parser->off;
-
- parser->strip_before = 0;
- parser->strip_after = 0;
-
- if (*s == '-')
- {
- parser->strip_before = 1;
- for (s++; (s <= e) && (*s == ' ' || *s == '\t'); s++);
- }
-
- if (*(e-1) == '-')
- {
- parser->strip_after = 1;
- for (e--; (e >= s) && (*e == ' ' || *e == '\t'); e--);
- }
-
- switch (*s)
- {
- /* comment */
- case '#':
- s++;
- parser->cur_chunk.type = T_TYPE_COMMENT;
- break;
-
- /* include */
- case '+':
- s++;
- parser->cur_chunk.type = T_TYPE_INCLUDE;
- break;
-
- /* translate */
- case ':':
- s++;
- parser->cur_chunk.type = T_TYPE_I18N;
- break;
-
- /* translate raw */
- case '_':
- s++;
- parser->cur_chunk.type = T_TYPE_I18N_RAW;
- break;
-
- /* expr */
- case '=':
- s++;
- parser->cur_chunk.type = T_TYPE_EXPR;
- break;
-
- /* code */
- default:
- parser->cur_chunk.type = T_TYPE_CODE;
- break;
- }
-
- parser->cur_chunk.line = parser->line;
- parser->cur_chunk.s = s;
- parser->cur_chunk.e = e;
-}
-
-static const char *
-template_format_chunk(struct template_parser *parser, size_t *sz)
-{
- const char *s, *p;
- const char *head, *tail;
- struct template_chunk *c = &parser->prv_chunk;
- struct template_buffer *buf;
-
- *sz = 0;
- s = parser->gc = NULL;
-
- if (parser->strip_before && c->type == T_TYPE_TEXT)
- {
- while ((c->e > c->s) && isspace(*(c->e - 1)))
- c->e--;
- }
-
- /* empty chunk */
- if (c->s == c->e)
- {
- if (c->type == T_TYPE_EOF)
- {
- *sz = 0;
- s = NULL;
- }
- else
- {
- *sz = 1;
- s = " ";
- }
- }
-
- /* format chunk */
- else if ((buf = buf_init(c->e - c->s)) != NULL)
- {
- if ((head = gen_code[c->type][0]) != NULL)
- buf_append(buf, head, strlen(head));
-
- switch (c->type)
- {
- case T_TYPE_TEXT:
- luastr_escape(buf, c->s, c->e - c->s, 0);
- break;
-
- case T_TYPE_EXPR:
- buf_append(buf, c->s, c->e - c->s);
- for (p = c->s; p < c->e; p++)
- parser->line += (*p == '\n');
- break;
-
- case T_TYPE_INCLUDE:
- luastr_escape(buf, c->s, c->e - c->s, 0);
- break;
-
- case T_TYPE_I18N:
- luastr_translate(buf, c->s, c->e - c->s, 1);
- break;
-
- case T_TYPE_I18N_RAW:
- luastr_translate(buf, c->s, c->e - c->s, 0);
- break;
-
- case T_TYPE_CODE:
- buf_append(buf, c->s, c->e - c->s);
- for (p = c->s; p < c->e; p++)
- parser->line += (*p == '\n');
- break;
- }
-
- if ((tail = gen_code[c->type][1]) != NULL)
- buf_append(buf, tail, strlen(tail));
-
- *sz = buf_length(buf);
- s = parser->gc = buf_destroy(buf);
-
- if (!*sz)
- {
- *sz = 1;
- s = " ";
- }
- }
-
- return s;
-}
-
-const char *template_reader(lua_State *L, void *ud, size_t *sz)
-{
- struct template_parser *parser = ud;
- int rem = parser->size - (parser->off - parser->data);
- char *tag;
-
- parser->prv_chunk = parser->cur_chunk;
-
- /* free previous string */
- if (parser->gc)
- {
- free(parser->gc);
- parser->gc = NULL;
- }
-
- /* before tag */
- if (!parser->in_expr)
- {
- if ((tag = strfind(parser->off, rem, "<%", 2)) != NULL)
- {
- template_text(parser, tag);
- parser->off = tag + 2;
- parser->in_expr = 1;
- }
- else
- {
- template_text(parser, parser->data + parser->size);
- parser->off = parser->data + parser->size;
- }
- }
-
- /* inside tag */
- else
- {
- if ((tag = strfind(parser->off, rem, "%>", 2)) != NULL)
- {
- template_code(parser, tag);
- parser->off = tag + 2;
- parser->in_expr = 0;
- }
- else
- {
- /* unexpected EOF */
- template_code(parser, parser->data + parser->size);
-
- *sz = 1;
- return "\033";
- }
- }
-
- return template_format_chunk(parser, sz);
-}
-
-int template_error(lua_State *L, struct template_parser *parser)
-{
- const char *err = luaL_checkstring(L, -1);
- const char *off = parser->prv_chunk.s;
- const char *ptr;
- char msg[1024];
- int line = 0;
- int chunkline = 0;
-
- if ((ptr = strfind((char *)err, strlen(err), "]:", 2)) != NULL)
- {
- chunkline = atoi(ptr + 2) - parser->prv_chunk.line;
-
- while (*ptr)
- {
- if (*ptr++ == ' ')
- {
- err = ptr;
- break;
- }
- }
- }
-
- if (strfind((char *)err, strlen(err), "'char(27)'", 10) != NULL)
- {
- off = parser->data + parser->size;
- err = "'%>' expected before end of file";
- chunkline = 0;
- }
-
- for (ptr = parser->data; ptr < off; ptr++)
- if (*ptr == '\n')
- line++;
-
- snprintf(msg, sizeof(msg), "Syntax error in %s:%d: %s",
- parser->file ? parser->file : "[string]", line + chunkline, err ? err : "(unknown error)");
-
- lua_pushnil(L);
- lua_pushinteger(L, line + chunkline);
- lua_pushstring(L, msg);
-
- return 3;
-}
+++ /dev/null
-/*
- * LuCI Template - Parser header
- *
- * Copyright (C) 2009 Jo-Philipp Wich <jow@openwrt.org>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _TEMPLATE_PARSER_H_
-#define _TEMPLATE_PARSER_H_
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/mman.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-
-#include <lua.h>
-#include <lualib.h>
-#include <lauxlib.h>
-
-
-/* code types */
-#define T_TYPE_INIT 0
-#define T_TYPE_TEXT 1
-#define T_TYPE_COMMENT 2
-#define T_TYPE_EXPR 3
-#define T_TYPE_INCLUDE 4
-#define T_TYPE_I18N 5
-#define T_TYPE_I18N_RAW 6
-#define T_TYPE_CODE 7
-#define T_TYPE_EOF 8
-
-
-struct template_chunk {
- const char *s;
- const char *e;
- int type;
- int line;
-};
-
-/* parser state */
-struct template_parser {
- int fd;
- uint32_t size;
- char *data;
- char *off;
- char *gc;
- int line;
- int in_expr;
- int strip_before;
- int strip_after;
- struct template_chunk prv_chunk;
- struct template_chunk cur_chunk;
- const char *file;
-};
-
-struct template_parser * template_open(const char *file);
-struct template_parser * template_string(const char *str, uint32_t len);
-void template_close(struct template_parser *parser);
-
-const char *template_reader(lua_State *L, void *ud, size_t *sz);
-int template_error(lua_State *L, struct template_parser *parser);
-
-#endif
+++ /dev/null
-/*
- * LuCI Template - Utility functions
- *
- * Copyright (C) 2010 Jo-Philipp Wich <jow@openwrt.org>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "template_utils.h"
-#include "template_lmo.h"
-
-/* initialize a buffer object */
-struct template_buffer * buf_init(int size)
-{
- struct template_buffer *buf;
-
- if (size <= 0)
- size = 1024;
-
- buf = (struct template_buffer *)malloc(sizeof(struct template_buffer));
-
- if (buf != NULL)
- {
- buf->fill = 0;
- buf->size = size;
- buf->data = malloc(buf->size);
-
- if (buf->data != NULL)
- {
- buf->dptr = buf->data;
- buf->data[0] = 0;
-
- return buf;
- }
-
- free(buf);
- }
-
- return NULL;
-}
-
-/* grow buffer */
-int buf_grow(struct template_buffer *buf, int size)
-{
- unsigned int off = (buf->dptr - buf->data);
- char *data;
-
- if (size <= 0)
- size = 1024;
-
- data = realloc(buf->data, buf->size + size);
-
- if (data != NULL)
- {
- buf->data = data;
- buf->dptr = data + off;
- buf->size += size;
-
- return buf->size;
- }
-
- return 0;
-}
-
-/* put one char into buffer object */
-int buf_putchar(struct template_buffer *buf, char c)
-{
- if( ((buf->fill + 1) >= buf->size) && !buf_grow(buf, 0) )
- return 0;
-
- *(buf->dptr++) = c;
- *(buf->dptr) = 0;
-
- buf->fill++;
- return 1;
-}
-
-/* append data to buffer */
-int buf_append(struct template_buffer *buf, const char *s, int len)
-{
- if ((buf->fill + len + 1) >= buf->size)
- {
- if (!buf_grow(buf, len + 1))
- return 0;
- }
-
- memcpy(buf->dptr, s, len);
- buf->fill += len;
- buf->dptr += len;
-
- *(buf->dptr) = 0;
-
- return len;
-}
-
-/* read buffer length */
-int buf_length(struct template_buffer *buf)
-{
- return buf->fill;
-}
-
-/* destroy buffer object and return pointer to data */
-char * buf_destroy(struct template_buffer *buf)
-{
- char *data = buf->data;
-
- free(buf);
- return data;
-}
-
-
-/* calculate the number of expected continuation chars */
-static inline int mb_num_chars(unsigned char c)
-{
- if ((c & 0xE0) == 0xC0)
- return 2;
- else if ((c & 0xF0) == 0xE0)
- return 3;
- else if ((c & 0xF8) == 0xF0)
- return 4;
- else if ((c & 0xFC) == 0xF8)
- return 5;
- else if ((c & 0xFE) == 0xFC)
- return 6;
-
- return 1;
-}
-
-/* test whether the given byte is a valid continuation char */
-static inline int mb_is_cont(unsigned char c)
-{
- return ((c >= 0x80) && (c <= 0xBF));
-}
-
-/* test whether the byte sequence at the given pointer with the given
- * length is the shortest possible representation of the code point */
-static inline int mb_is_shortest(unsigned char *s, int n)
-{
- switch (n)
- {
- case 2:
- /* 1100000x (10xxxxxx) */
- return !(((*s >> 1) == 0x60) &&
- ((*(s+1) >> 6) == 0x02));
-
- case 3:
- /* 11100000 100xxxxx (10xxxxxx) */
- return !((*s == 0xE0) &&
- ((*(s+1) >> 5) == 0x04) &&
- ((*(s+2) >> 6) == 0x02));
-
- case 4:
- /* 11110000 1000xxxx (10xxxxxx 10xxxxxx) */
- return !((*s == 0xF0) &&
- ((*(s+1) >> 4) == 0x08) &&
- ((*(s+2) >> 6) == 0x02) &&
- ((*(s+3) >> 6) == 0x02));
-
- case 5:
- /* 11111000 10000xxx (10xxxxxx 10xxxxxx 10xxxxxx) */
- return !((*s == 0xF8) &&
- ((*(s+1) >> 3) == 0x10) &&
- ((*(s+2) >> 6) == 0x02) &&
- ((*(s+3) >> 6) == 0x02) &&
- ((*(s+4) >> 6) == 0x02));
-
- case 6:
- /* 11111100 100000xx (10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx) */
- return !((*s == 0xF8) &&
- ((*(s+1) >> 2) == 0x20) &&
- ((*(s+2) >> 6) == 0x02) &&
- ((*(s+3) >> 6) == 0x02) &&
- ((*(s+4) >> 6) == 0x02) &&
- ((*(s+5) >> 6) == 0x02));
- }
-
- return 1;
-}
-
-/* test whether the byte sequence at the given pointer with the given
- * length is an UTF-16 surrogate */
-static inline int mb_is_surrogate(unsigned char *s, int n)
-{
- return ((n == 3) && (*s == 0xED) && (*(s+1) >= 0xA0) && (*(s+1) <= 0xBF));
-}
-
-/* test whether the byte sequence at the given pointer with the given
- * length is an illegal UTF-8 code point */
-static inline int mb_is_illegal(unsigned char *s, int n)
-{
- return ((n == 3) && (*s == 0xEF) && (*(s+1) == 0xBF) &&
- (*(s+2) >= 0xBE) && (*(s+2) <= 0xBF));
-}
-
-
-/* scan given source string, validate UTF-8 sequence and store result
- * in given buffer object */
-static int _validate_utf8(unsigned char **s, int l, struct template_buffer *buf)
-{
- unsigned char *ptr = *s;
- unsigned int o = 0, v, n;
-
- /* ascii byte without null */
- if ((*(ptr+0) >= 0x01) && (*(ptr+0) <= 0x7F))
- {
- if (!buf_putchar(buf, *ptr++))
- return 0;
-
- o = 1;
- }
-
- /* multi byte sequence */
- else if ((n = mb_num_chars(*ptr)) > 1)
- {
- /* count valid chars */
- for (v = 1; (v <= n) && ((o+v) < l) && mb_is_cont(*(ptr+v)); v++);
-
- switch (n)
- {
- case 6:
- case 5:
- /* five and six byte sequences are always invalid */
- if (!buf_putchar(buf, '?'))
- return 0;
-
- break;
-
- default:
- /* if the number of valid continuation bytes matches the
- * expected number and if the sequence is legal, copy
- * the bytes to the destination buffer */
- if ((v == n) && mb_is_shortest(ptr, n) &&
- !mb_is_surrogate(ptr, n) && !mb_is_illegal(ptr, n))
- {
- /* copy sequence */
- if (!buf_append(buf, (char *)ptr, n))
- return 0;
- }
-
- /* the found sequence is illegal, skip it */
- else
- {
- /* invalid sequence */
- if (!buf_putchar(buf, '?'))
- return 0;
- }
-
- break;
- }
-
- /* advance beyond the last found valid continuation char */
- o = v;
- ptr += v;
- }
-
- /* invalid byte (0x00) */
- else
- {
- if (!buf_putchar(buf, '?')) /* or 0xEF, 0xBF, 0xBD */
- return 0;
-
- o = 1;
- ptr++;
- }
-
- *s = ptr;
- return o;
-}
-
-/* sanitize given string and replace all invalid UTF-8 sequences with "?" */
-char * utf8(const char *s, unsigned int l)
-{
- struct template_buffer *buf = buf_init(l);
- unsigned char *ptr = (unsigned char *)s;
- unsigned int v, o;
-
- if (!buf)
- return NULL;
-
- for (o = 0; o < l; o++)
- {
- /* ascii char */
- if ((*ptr >= 0x01) && (*ptr <= 0x7F))
- {
- if (!buf_putchar(buf, (char)*ptr++))
- break;
- }
-
- /* invalid byte or multi byte sequence */
- else
- {
- if (!(v = _validate_utf8(&ptr, l - o, buf)))
- break;
-
- o += (v - 1);
- }
- }
-
- return buf_destroy(buf);
-}
-
-/* Sanitize given string and strip all invalid XML bytes
- * Validate UTF-8 sequences
- * Escape XML control chars */
-char * pcdata(const char *s, unsigned int l)
-{
- struct template_buffer *buf = buf_init(l);
- unsigned char *ptr = (unsigned char *)s;
- unsigned int o, v;
- char esq[8];
- int esl;
-
- if (!buf)
- return NULL;
-
- for (o = 0; o < l; o++)
- {
- /* Invalid XML bytes */
- if (((*ptr >= 0x00) && (*ptr <= 0x08)) ||
- ((*ptr >= 0x0B) && (*ptr <= 0x0C)) ||
- ((*ptr >= 0x0E) && (*ptr <= 0x1F)) ||
- (*ptr == 0x7F))
- {
- ptr++;
- }
-
- /* Escapes */
- else if ((*ptr == 0x26) ||
- (*ptr == 0x27) ||
- (*ptr == 0x22) ||
- (*ptr == 0x3C) ||
- (*ptr == 0x3E))
- {
- esl = snprintf(esq, sizeof(esq), "&#%i;", *ptr);
-
- if (!buf_append(buf, esq, esl))
- break;
-
- ptr++;
- }
-
- /* ascii char */
- else if (*ptr <= 0x7F)
- {
- buf_putchar(buf, (char)*ptr++);
- }
-
- /* multi byte sequence */
- else
- {
- if (!(v = _validate_utf8(&ptr, l - o, buf)))
- break;
-
- o += (v - 1);
- }
- }
-
- return buf_destroy(buf);
-}
-
-char * striptags(const char *s, unsigned int l)
-{
- struct template_buffer *buf = buf_init(l);
- unsigned char *ptr = (unsigned char *)s;
- unsigned char *end = ptr + l;
- unsigned char *tag;
- unsigned char prev;
- char esq[8];
- int esl;
-
- for (prev = ' '; ptr < end; ptr++)
- {
- if ((*ptr == '<') && ((ptr + 2) < end) &&
- ((*(ptr + 1) == '/') || isalpha(*(ptr + 1))))
- {
- for (tag = ptr; tag < end; tag++)
- {
- if (*tag == '>')
- {
- if (!isspace(prev))
- buf_putchar(buf, ' ');
-
- ptr = tag;
- prev = ' ';
- break;
- }
- }
- }
- else if (isspace(*ptr))
- {
- if (!isspace(prev))
- buf_putchar(buf, *ptr);
-
- prev = *ptr;
- }
- else
- {
- switch(*ptr)
- {
- case '"':
- case '\'':
- case '<':
- case '>':
- case '&':
- esl = snprintf(esq, sizeof(esq), "&#%i;", *ptr);
- buf_append(buf, esq, esl);
- break;
-
- default:
- buf_putchar(buf, *ptr);
- break;
- }
-
- prev = *ptr;
- }
- }
-
- return buf_destroy(buf);
-}
-
-void luastr_escape(struct template_buffer *out, const char *s, unsigned int l,
- int escape_xml)
-{
- int esl;
- char esq[8];
- char *ptr;
-
- for (ptr = (char *)s; ptr < (s + l); ptr++)
- {
- switch (*ptr)
- {
- case '\\':
- buf_append(out, "\\\\", 2);
- break;
-
- case '"':
- if (escape_xml)
- buf_append(out, """, 5);
- else
- buf_append(out, "\\\"", 2);
- break;
-
- case '\n':
- buf_append(out, "\\n", 2);
- break;
-
- case '\'':
- case '&':
- case '<':
- case '>':
- if (escape_xml)
- {
- esl = snprintf(esq, sizeof(esq), "&#%i;", *ptr);
- buf_append(out, esq, esl);
- break;
- }
-
- default:
- buf_putchar(out, *ptr);
- }
- }
-}
-
-void luastr_translate(struct template_buffer *out, const char *s, unsigned int l,
- int escape_xml)
-{
- int trlen, idlen = l, ctxtlen = 0, esc = 0;
- const char *p, *msgid = s, *msgctxt = NULL;
- char *tr;
-
- for (p = s; p < s + l; p++) {
- if (esc) {
- esc = 0;
- }
- else if (*p == '\\') {
- esc = 1;
- }
- else if (*p == '|') {
- idlen = p - s;
- msgctxt = p + 1;
- ctxtlen = s + l - msgctxt;
- break;
- }
- }
-
- if (!lmo_translate_ctxt(msgid, idlen, msgctxt, ctxtlen, &tr, &trlen))
- luastr_escape(out, tr, trlen, escape_xml);
- else
- luastr_escape(out, s, l, escape_xml);
-}
+++ /dev/null
-/*
- * LuCI Template - Utility header
- *
- * Copyright (C) 2010-2012 Jo-Philipp Wich <jow@openwrt.org>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _TEMPLATE_UTILS_H_
-#define _TEMPLATE_UTILS_H_
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-
-/* buffer object */
-struct template_buffer {
- char *data;
- char *dptr;
- unsigned int size;
- unsigned int fill;
-};
-
-struct template_buffer * buf_init(int size);
-int buf_grow(struct template_buffer *buf, int size);
-int buf_putchar(struct template_buffer *buf, char c);
-int buf_append(struct template_buffer *buf, const char *s, int len);
-int buf_length(struct template_buffer *buf);
-char * buf_destroy(struct template_buffer *buf);
-
-char * utf8(const char *s, unsigned int l);
-char * pcdata(const char *s, unsigned int l);
-char * striptags(const char *s, unsigned int l);
-
-void luastr_escape(struct template_buffer *out, const char *s, unsigned int l, int escape_xml);
-void luastr_translate(struct template_buffer *out, const char *s, unsigned int l, int escape_xml);
-
-#endif
--- /dev/null
+// Copyright 2022 Jo-Philipp Wich <jo@mein.io>
+// Licensed to the public under the Apache License 2.0.
+
+import { load_catalog, change_catalog, get_translations } from 'luci.core';
+
+const ubus_types = [
+ null,
+ 'array',
+ 'object',
+ 'string',
+ null, // INT64
+ 'number',
+ null, // INT16,
+ 'boolean',
+ 'double'
+];
+
+
+function ubus_reply(id, data, code, errmsg) {
+ const reply = { jsonrpc: '2.0', id };
+
+ if (errmsg)
+ reply.error = { code, message: errmsg };
+ else if (type(code) == 'object')
+ reply.result = code;
+ else
+ reply.result = [ code, data ];
+
+ return reply;
+}
+
+function ubus_access(sid, obj, fun) {
+ return (ubus.call('session', 'access', {
+ ubus_rpc_session: sid,
+ scope: 'ubus',
+ object: obj,
+ function: fun
+ })?.access == true);
+}
+
+function ubus_request(req) {
+ if (type(req?.method) != 'string' || req?.jsonrpc != '2.0' || req?.id == null)
+ return ubus_reply(null, null, -32600, 'Invalid request');
+
+ if (req.method == 'call') {
+ if (type(req?.params) != 'array' || length(req.params) < 3)
+ return ubus_reply(null, null, -32600, 'Invalid parameters');
+
+ let sid = req.params[0],
+ obj = req.params[1],
+ fun = req.params[2],
+ arg = req.params[3] ?? {};
+
+ if (type(arg) != 'object' || exists(arg, 'ubus_rpc_session'))
+ return ubus_reply(req.id, null, -32602, 'Invalid parameters');
+
+ if (sid == '00000000000000000000000000000000' && ctx.authsession)
+ sid = ctx.authsession;
+
+ if (!ubus_access(sid, obj, fun))
+ return ubus_reply(req.id, null, -32002, 'Access denied');
+
+ arg.ubus_rpc_session = sid;
+
+
+ // clear error
+ ubus.error();
+
+ const res = ubus.call(obj, fun, arg);
+
+ return ubus_reply(req.id, res, ubus.error(true) ?? 0);
+ }
+
+ if (req.method == 'list') {
+ if (req?.params == null || (type(req.params) == 'array' && length(req.params) == 0)) {
+ return ubus_reply(req.id, null, ubus.list());
+ }
+ else if (type(req.params) == 'array') {
+ const rv = {};
+
+ for (let param in req.params) {
+ if (type(param) != 'string')
+ return ubus_reply(req.id, null, -32602, 'Invalid parameters');
+
+ for (let m, p in ubus.list(param)?.[0]) {
+ for (let pn, pt in p) {
+ rv[param] ??= {};
+ rv[param][m] ??= {};
+ rv[param][m][pn] = ubus_types[pt] ?? 'unknown';
+ }
+ }
+ }
+
+ return ubus_reply(req.id, null, rv);
+ }
+ else {
+ return ubus_reply(req.id, null, -32602, 'Invalid parameters')
+ }
+ }
+
+ return ubus_reply(req.id, null, -32601, 'Method not found')
+}
+
+
+return {
+ action_ubus: function() {
+ let request;
+
+ try { request = json(http.content()); }
+ catch { request = null; }
+
+ http.prepare_content('application/json; charset=UTF-8');
+
+ if (type(request) == 'object')
+ http.write_json(ubus_request(request));
+ else if (type(request) == 'array')
+ http.write_json(map(request, ubus_request));
+ else
+ http.write_json(ubus_reply(null, null, -32700, 'Parse error'))
+ },
+
+ action_translations: function(reqlang) {
+ if (reqlang != null && reqlang != dispatcher.lang) {
+ load_catalog(reqlang, '/usr/lib/lua/luci/i18n');
+ change_catalog(reqlang);
+ }
+
+ http.prepare_content('application/javascript; charset=UTF-8');
+ http.write('window.TR={');
+
+ get_translations((key, val) => http.write(sprintf('"%08x":%J,', key, val)));
+
+ http.write('};');
+ },
+
+ action_logout: function() {
+ const url = dispatcher.build_url();
+
+ if (ctx.authsession) {
+ ubus.call('session', 'destroy', { ubus_rpc_session: ctx.authsession });
+
+ if (http.getenv('HTTPS') == 'on')
+ http.header('Set-Cookie', `sysauth_https=; expires=Thu, 01 Jan 1970 01:00:00 GMT; path=${url}`);
+
+ http.header('Set-Cookie', `sysauth_http=; expires=Thu, 01 Jan 1970 01:00:00 GMT; path=${url}`);
+ }
+
+ http.redirect(url);
+ },
+
+ action_menu: function() {
+ const session = dispatcher.is_authenticated({ methods: [ 'cookie:sysauth_https', 'cookie:sysauth_http' ] });
+ const menu = dispatcher.menu_json(session?.acls ?? {}) ?? {};
+
+ http.prepare_content('application/json; charset=UTF-8');
+ http.write_json(menu);
+ }
+};
--- /dev/null
+// Copyright 2022 Jo-Philipp Wich <jo@mein.io>
+// Licensed to the public under the Apache License 2.0.
+
+import { STATUS_NO_DATA, STATUS_PERMISSION_DENIED } from 'ubus';
+
+let last_ubus_error;
+
+const ubus_error_map = [
+ 200, 'OK',
+ 400, 'Invalid command',
+ 400, 'Invalid argument',
+ 404, 'Method not found',
+ 404, 'Not found',
+ 204, 'No data',
+ 403, 'Permission denied',
+ 504, 'Timeout',
+ 500, 'Not supported',
+ 500, 'Unknown error',
+ 503, 'Connection failed',
+ 500, 'Out of memory',
+ 400, 'Parse error',
+ 500, 'System error',
+];
+
+function ubus_call(object, method, args) {
+ ubus.error(); // clear previous error
+
+ let res = ubus.call(object, method, args);
+
+ last_ubus_error = ubus.error(true);
+
+ return res ?? !last_ubus_error;
+}
+
+function ubus_state_to_http(err) {
+ let code = ubus_error_map[(err << 1) + 0] ?? 200;
+ let msg = ubus_error_map[(err << 1) + 1] ?? 'OK';
+
+ http.status(code, msg);
+
+ if (code != 204) {
+ http.prepare_content('text/plain');
+ http.write(msg);
+ }
+}
+
+function uci_apply(rollback) {
+ if (rollback) {
+ const timeout = +(config?.apply?.rollback ?? 90) || 0;
+ const success = ubus_call('uci', 'apply', {
+ ubus_rpc_session: ctx.authsession,
+ timeout: max(timeout, 90),
+ rollback: true
+ });
+
+ if (success) {
+ const token = dispatcher.randomid(16);
+
+ ubus.call('session', 'set', {
+ ubus_rpc_session: '00000000000000000000000000000000',
+ values: {
+ rollback: {
+ token,
+ session: ctx.authsession,
+ timeout: time() + timeout
+ }
+ }
+ });
+
+ return token;
+ }
+
+ return null;
+ }
+ else {
+ let changes = ubus_call('uci', 'changes', { ubus_rpc_session: ctx.authsession })?.changes;
+
+ for (let config in changes)
+ if (!ubus_call('uci', 'commit', { ubus_rpc_session: ctx.authsession, config }))
+ return false;
+
+ return ubus_call('uci', 'apply', {
+ ubus_rpc_session: ctx.authsession,
+ rollback: false
+ });
+ }
+}
+
+function uci_confirm(token) {
+ const data = ubus.call('session', 'get', {
+ ubus_rpc_session: '00000000000000000000000000000000',
+ keys: [ 'rollback' ]
+ })?.values?.rollback;
+
+ if (type(data?.token) != 'string' || type(data?.session) != 'string' ||
+ type(data?.timeout) != 'int' || data.timeout < time()) {
+ last_ubus_error = STATUS_NO_DATA;
+
+ return false;
+ }
+
+ if (token != data.token) {
+ last_ubus_error = STATUS_PERMISSION_DENIED;
+
+ return false;
+ }
+
+ if (!ubus_call('uci', 'confirm', { ubus_rpc_session: data.session }))
+ return false;
+
+ ubus_call('session', 'set', {
+ ubus_rpc_session: '00000000000000000000000000000000',
+ values: { rollback: {} }
+ });
+
+ return true;
+}
+
+
+return {
+ action_apply_rollback: function() {
+ const token = uci_apply(true);
+
+ if (token) {
+ http.prepare_content('application/json; charset=UTF-8');
+ http.write_json({ token });
+ }
+ else {
+ ubus_state_to_http(last_ubus_error);
+ }
+ },
+
+ action_apply_unchecked: function() {
+ uci_apply(false);
+ ubus_state_to_http(last_ubus_error);
+ },
+
+ action_confirm: function() {
+ uci_confirm(http.formvalue('token'));
+ ubus_state_to_http(last_ubus_error);
+ },
+
+ action_revert: function() {
+ for (let config in ubus_call('uci', 'changes', { ubus_rpc_session: ctx.authsession })?.changes)
+ if (!ubus_call('uci', 'revert', { ubus_rpc_session: ctx.authsession, config }))
+ break;
+
+ ubus_state_to_http(last_ubus_error);
+ }
+};
--- /dev/null
+// Copyright 2022 Jo-Philipp Wich <jo@mein.io>
+// Licensed to the public under the Apache License 2.0.
+
+import { open, stat, glob, lsdir, unlink, basename } from 'fs';
+import { striptags, entityencode } from 'html';
+import { connect } from 'ubus';
+import { cursor } from 'uci';
+import { rand } from 'math';
+
+import { hash, load_catalog, change_catalog, translate, ntranslate, getuid } from 'luci.core';
+import { revision as luciversion, branch as luciname } from 'luci.version';
+import { default as LuCIRuntime } from 'luci.runtime';
+import { urldecode } from 'luci.http';
+
+let ubus = connect();
+let uci = cursor();
+
+let indexcache = "/tmp/luci-indexcache";
+
+let http, runtime, tree, luabridge;
+
+function error404(msg) {
+ http.status(404, 'Not Found');
+
+ try {
+ runtime.render('error404', { message: msg ?? 'Not found' });
+ }
+ catch {
+ http.header('Content-Type', 'text/plain; charset=UTF-8');
+ http.write(msg ?? 'Not found');
+ }
+
+ return false;
+}
+
+function error500(msg, ex) {
+ if (!http.eoh) {
+ http.status(500, 'Internal Server Error');
+ http.header('Content-Type', 'text/html; charset=UTF-8');
+ }
+
+ try {
+ runtime.render('error500', {
+ title: ex?.type ?? 'Runtime exception',
+ message: replace(
+ msg,
+ /(\s)((\/[A-Za-z0-9_.-]+)+:\d+|\[string "[^"]+"\]:\d+)/g,
+ '$1<code>$2</code>'
+ ),
+ exception: ex
+ });
+ }
+ catch {
+ http.write('<!--]]>--><!--\'>--><!--">-->\n');
+ http.write(`<p>${trim(ex)}</p>\n`);
+
+ if (ex) {
+ http.write(`<p>${trim(ex.message)}</p>\n`);
+ http.write(`<pre>${trim(ex.stacktrace[0].context)}</pre>\n`);
+ }
+ }
+
+ exit(0);
+}
+
+function load_luabridge(optional) {
+ if (luabridge == null) {
+ try {
+ luabridge = require('lua');
+ }
+ catch (ex) {
+ luabridge = false;
+
+ if (!optional)
+ error500('No Lua runtime installed');
+ }
+ }
+
+ return luabridge;
+}
+
+function determine_request_language() {
+ let lang = uci.get('luci', 'main', 'lang') || 'auto';
+
+ if (lang == 'auto') {
+ for (let tag in split(http.getenv('HTTP_ACCEPT_LANGUAGE'), ',')) {
+ tag = split(trim(split(tag, ';')?.[0]), '-');
+
+ if (tag) {
+ let cc = tag[1] ? `${tag[0]}_${lc(tag[1])}` : null;
+
+ if (cc && uci.get('luci', 'languages', cc)) {
+ lang = cc;
+ break;
+ }
+ else if (uci.get('luci', 'languages', tag[0])) {
+ lang = tag[0];
+ break;
+ }
+ }
+ }
+ }
+
+ if (lang == 'auto')
+ lang = 'en';
+
+ if (load_catalog(lang, '/usr/lib/lua/luci/i18n'))
+ change_catalog(lang);
+
+ return lang;
+}
+
+function determine_version() {
+ let res = { luciname, luciversion };
+
+ for (let f = open("/etc/os-release"), l = f?.read?.("line"); l; l = f.read?.("line")) {
+ let kv = split(l, '=', 2);
+
+ switch (kv[0]) {
+ case 'NAME':
+ res.distname = trim(kv[1], '"\' \n');
+ break;
+
+ case 'VERSION':
+ res.distversion = trim(kv[1], '"\' \n');
+ break;
+
+ case 'HOME_URL':
+ res.disturl = trim(kv[1], '"\' \n');
+ break;
+
+ case 'BUILD_ID':
+ res.distrevision = trim(kv[1], '"\' \n');
+ break;
+ }
+ }
+
+ return res;
+}
+
+function read_jsonfile(path, defval) {
+ let rv;
+
+ try {
+ rv = json(open(path, "r"));
+ }
+ catch (e) {
+ rv = defval;
+ }
+
+ return rv;
+}
+
+function read_cachefile(file, reader) {
+ let euid = getuid(),
+ fstat = stat(file),
+ fuid = fstat?.uid,
+ perm = fstat?.perm;
+
+ if (euid != fuid ||
+ perm?.group_read || perm?.group_write || perm?.group_exec ||
+ perm?.other_read || perm?.other_write || perm?.other_exec)
+ return null;
+
+ return reader(file);
+}
+
+function check_fs_depends(spec) {
+ for (let path, kind in spec) {
+ if (kind == 'directory') {
+ if (!length(lsdir(path)))
+ return false;
+ }
+ else if (kind == 'executable') {
+ let fstat = stat(path);
+
+ if (fstat?.type != 'file' || fstat?.user_exec == false)
+ return false;
+ }
+ else if (kind == 'file') {
+ let fstat = stat(path);
+
+ if (fstat?.type != 'file')
+ return false;
+ }
+ }
+
+ return true;
+}
+
+function check_uci_depends_options(conf, s, opts) {
+ if (type(opts) == 'string') {
+ return (s['.type'] == opts);
+ }
+ else if (opts === true) {
+ for (let option, value in s)
+ if (ord(option) != 46)
+ return true;
+ }
+ else if (type(opts) == 'object') {
+ for (let option, value in opts) {
+ let sval = s[option];
+
+ if (type(sval) == 'array') {
+ if (!(value in sval))
+ return false;
+ }
+ else if (value === true) {
+ if (sval == null)
+ return false;
+ }
+ else {
+ if (sval != value)
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+function check_uci_depends_section(conf, sect) {
+ for (let section, options in sect) {
+ let stype = match(section, /^@([A-Za-z0-9_-]+)$/);
+
+ if (stype) {
+ let found = false;
+
+ uci.load(conf);
+ uci.foreach(conf, stype[1], (s) => {
+ if (check_uci_depends_options(conf, s, options)) {
+ found = true;
+ return false;
+ }
+ });
+
+ if (!found)
+ return false;
+ }
+ else {
+ let s = uci.get_all(conf, section);
+
+ if (!s || !check_uci_depends_options(conf, s, options))
+ return false;
+ }
+ }
+
+ return true;
+}
+
+function check_uci_depends(conf) {
+ for (let config, values in conf) {
+ if (values == true) {
+ let found = false;
+
+ uci.load(config);
+ uci.foreach(config, null, () => { found = true });
+
+ if (!found)
+ return false;
+ }
+ else if (type(values) == 'object') {
+ if (!check_uci_depends_section(config, values))
+ return false;
+ }
+ }
+
+ return true;
+}
+
+function check_depends(spec) {
+ if (type(spec?.depends?.fs) in ['array', 'object']) {
+ let satisfied = false;
+ let alternatives = (type(spec.depends.fs) == 'array') ? spec.depends.fs : [ spec.depends.fs ];
+
+ for (let alternative in alternatives) {
+ if (check_fs_depends(alternative)) {
+ satisfied = true;
+ break;
+ }
+ }
+
+ if (!satisfied)
+ return false;
+ }
+
+ if (type(spec?.depends?.uci) in ['array', 'object']) {
+ let satisfied = false;
+ let alternatives = (type(spec.depends.uci) == 'array') ? spec.depends.uci : [ spec.depends.uci ];
+
+ for (let alternative in alternatives) {
+ if (check_uci_depends(alternative)) {
+ satisfied = true;
+ break;
+ }
+ }
+
+ if (!satisfied)
+ return false;
+ }
+
+ return true;
+}
+
+function check_acl_depends(require_groups, groups) {
+ if (length(require_groups)) {
+ let writable = false;
+
+ for (let group in require_groups) {
+ let read = ('read' in groups?.[group]);
+ let write = ('write' in groups?.[group]);
+
+ if (!read && !write)
+ return null;
+
+ if (write)
+ writable = true;
+ }
+
+ return writable;
+ }
+
+ return true;
+}
+
+function hash_filelist(files) {
+ let hashval = 0x1b756362;
+
+ for (let file in files) {
+ let st = stat(file);
+
+ if (st)
+ hashval = hash(sprintf("%x|%x|%x", st.ino, st.mtime, st.size), hashval);
+ }
+
+ return hashval;
+}
+
+function build_pagetree() {
+ let tree = { action: { type: 'firstchild' } };
+
+ let schema = {
+ action: 'object',
+ auth: 'object',
+ cors: 'bool',
+ depends: 'object',
+ order: 'int',
+ setgroup: 'string',
+ setuser: 'string',
+ title: 'string',
+ wildcard: 'bool',
+ firstchild_ineligible: 'bool'
+ };
+
+ let files = glob('/usr/share/luci/menu.d/*.json', '/usr/lib/lua/luci/controller/*.lua', '/usr/lib/lua/luci/controller/*/*.lua');
+ let cachefile;
+
+ if (indexcache) {
+ cachefile = sprintf('%s.%08x.json', indexcache, hash_filelist(files));
+
+ let res = read_cachefile(cachefile, read_jsonfile);
+
+ if (res)
+ return res;
+
+ for (let path in glob(indexcache + '.*.json'))
+ unlink(path);
+ }
+
+ for (let file in files) {
+ let data;
+
+ if (substr(file, -5) == '.json')
+ data = read_jsonfile(file);
+ else if (load_luabridge(true))
+ data = runtime.call('luci.dispatcher', 'process_lua_controller', file);
+ else
+ warn(`Lua controller ${file} present but no Lua runtime installed.\n`);
+
+ if (type(data) == 'object') {
+ for (let path, spec in data) {
+ if (type(spec) == 'object') {
+ let node = tree;
+
+ for (let s in match(path, /[^\/]+/g)) {
+ if (s[0] == '*') {
+ node.wildcard = true;
+ break;
+ }
+
+ node.children ??= {};
+ node.children[s[0]] ??= {};
+ node = node.children[s[0]];
+ }
+
+ if (node !== tree) {
+ for (let k, t in schema)
+ if (type(spec[k]) == t)
+ node[k] = spec[k];
+
+ node.satisfied = check_depends(spec);
+ }
+ }
+ }
+ }
+ }
+
+ if (cachefile) {
+ let fd = open(cachefile, 'w', 0600);
+
+ if (fd) {
+ fd.write(tree);
+ fd.close();
+ }
+ }
+
+ return tree;
+}
+
+function menu_json(acl) {
+ tree ??= build_pagetree();
+
+ return tree;
+}
+
+function ctx_append(ctx, name, node) {
+ ctx.path ??= [];
+ push(ctx.path, name);
+
+ ctx.acls ??= [];
+ push(ctx.acls, ...(node?.depends?.acl || []));
+
+ ctx.auth = node.auth || ctx.auth;
+ ctx.cors = node.cors || ctx.cors;
+ ctx.suid = node.setuser || ctx.suid;
+ ctx.sgid = node.setgroup || ctx.sgid;
+
+ return ctx;
+}
+
+function session_retrieve(sid, allowed_users) {
+ let sdat = ubus.call("session", "get", { ubus_rpc_session: sid });
+ let sacl = ubus.call("session", "access", { ubus_rpc_session: sid });
+
+ if (type(sdat?.values?.token) == 'string' &&
+ (!length(allowed_users) || sdat?.values?.username in allowed_users)) {
+ // uci:set_session_id(sid)
+ return {
+ sid,
+ data: sdat.values,
+ acls: length(sacl) ? sacl : {}
+ };
+ }
+
+ return null;
+}
+
+function randomid(num_bytes) {
+ let bytes = [];
+
+ while (num_bytes-- > 0)
+ push(bytes, sprintf('%02x', rand() % 256));
+
+ return join('', bytes);
+}
+
+function syslog(prio, msg) {
+ warn(sprintf("[%s] %s\n", prio, msg));
+}
+
+function session_setup(user, pass, path) {
+ let timeout = uci.get('luci', 'sauth', 'sessiontime');
+ let login = ubus.call("session", "login", {
+ username: user,
+ password: pass,
+ timeout: timeout ? +timeout : null
+ });
+
+ if (type(login?.ubus_rpc_session) == 'string') {
+ ubus.call("session", "set", {
+ ubus_rpc_session: login.ubus_rpc_session,
+ values: { token: randomid(16) }
+ });
+ syslog("info", sprintf("luci: accepted login on /%s for %s from %s",
+ join('/', path), user || "?", http.getenv("REMOTE_ADDR") || "?"));
+
+ return session_retrieve(login.ubus_rpc_session);
+ }
+
+ syslog("info", sprintf("luci: failed login on /%s for %s from %s",
+ join('/', path), user || "?", http.getenv("REMOTE_ADDR") || "?"));
+}
+
+function check_authentication(method) {
+ let m = match(method, /^([[:alpha:]]+):(.+)$/);
+ let sid;
+
+ switch (m?.[1]) {
+ case 'cookie':
+ sid = http.getcookie(m[2]);
+ break;
+
+ case 'param':
+ sid = http.formvalue(m[2]);
+ break;
+
+ case 'query':
+ sid = http.formvalue(m[2], true);
+ break;
+ }
+
+ return sid ? session_retrieve(sid) : null;
+}
+
+function is_authenticated(auth) {
+ for (let method in auth?.methods) {
+ let session = check_authentication(method);
+
+ if (session)
+ return session;
+ }
+
+ return null;
+}
+
+function node_weight(node) {
+ let weight = min(node.order ?? 9999, 9999);
+
+ if (node.auth?.login)
+ weight += 10000;
+
+ return weight;
+}
+
+function clone(src) {
+ switch (type(src)) {
+ case 'array':
+ return map(src, clone);
+
+ case 'object':
+ let dest = {};
+
+ for (let k, v in src)
+ dest[k] = clone(v);
+
+ return dest;
+
+ default:
+ return src;
+ }
+}
+
+function resolve_firstchild(node, session, login_allowed, ctx) {
+ let candidate, candidate_ctx;
+
+ for (let name, child in node.children) {
+ if (!child.satisfied)
+ continue;
+
+ if (!session)
+ session = is_authenticated(node.auth);
+
+ let cacl = child.depends?.acl;
+ let login = login_allowed || child.auth?.login;
+
+ if (login || check_acl_depends(cacl, session?.acls?.["access-group"]) != null) {
+ if (child.title && type(child.action) == "object") {
+ let child_ctx = ctx_append(clone(ctx), name, child);
+ if (child.action.type == "firstchild") {
+ if (!candidate || node_weight(candidate) > node_weight(child)) {
+ let have_grandchild = resolve_firstchild(child, session, login, child_ctx);
+ if (have_grandchild) {
+ candidate = child;
+ candidate_ctx = child_ctx;
+ }
+ }
+ }
+ else if (!child.firstchild_ineligible) {
+ if (!candidate || node_weight(candidate) > node_weight(child)) {
+ candidate = child;
+ candidate_ctx = child_ctx;
+ }
+ }
+ }
+ }
+ }
+
+ if (!candidate)
+ return false;
+
+ for (let k, v in candidate_ctx)
+ ctx[k] = v;
+
+ return true;
+}
+
+function resolve_page(tree, request_path) {
+ let node = tree;
+ let login = false;
+ let session = null;
+ let ctx = {};
+
+ for (let i, s in request_path) {
+ node = node.children?.[s];
+
+ if (!node?.satisfied)
+ break;
+
+ ctx_append(ctx, s, node);
+
+ if (!session)
+ session = is_authenticated(node.auth);
+
+ if (!login && node.auth?.login)
+ login = true;
+
+ if (node.wildcard) {
+ ctx.request_args = [];
+ ctx.request_path = ctx.path ? [ ...ctx.path ] : [];
+
+ while (++i < length(request_path)) {
+ push(ctx.request_path, request_path[i]);
+ push(ctx.request_args, request_path[i]);
+ }
+
+ break;
+ }
+ }
+
+ if (node?.action?.type == 'firstchild')
+ resolve_firstchild(node, session, login, ctx);
+
+ ctx.acls ??= {};
+ ctx.path ??= [];
+ ctx.request_args ??= [];
+ ctx.request_path ??= request_path ? [ ...request_path ] : [];
+
+ ctx.authsession = session?.sid;
+ ctx.authtoken = session?.data?.token;
+ ctx.authuser = session?.data?.username;
+ ctx.authacl = session?.acls;
+
+ node = tree;
+
+ for (let s in ctx.path) {
+ node = node.children[s];
+ assert(node, "Internal node resolve error");
+ }
+
+ return { node, ctx, session };
+}
+
+function require_post_security(target, args) {
+ if (target?.type == 'arcombine')
+ return require_post_security(length(args) ? target?.targets?.[1] : target?.targets?.[0], args);
+
+ if (type(target?.post) == 'object') {
+ for (let param_name, required_val in target.post) {
+ let request_val = http.formvalue(param_name);
+
+ if ((type(required_val) == 'string' && request_val != required_val) ||
+ (required_val == true && request_val == null))
+ return false;
+ }
+
+ return true;
+ }
+
+ return (target?.post == true);
+}
+
+function test_post_security(authtoken) {
+ if (http.getenv("REQUEST_METHOD") != "POST") {
+ http.status(405, "Method Not Allowed");
+ http.header("Allow", "POST");
+
+ return false;
+ }
+
+ if (http.formvalue("token") != authtoken) {
+ http.status(403, "Forbidden");
+ runtime.render("csrftoken");
+
+ return false;
+ }
+
+ return true;
+}
+
+function build_url(...path) {
+ let url = [ http.getenv('SCRIPT_NAME') ?? '' ];
+
+ for (let p in path)
+ if (match(p, /^[A-Za-z0-9_%.\/,;-]+$/))
+ push(url, '/', p);
+
+ if (length(url) == 1)
+ push(url, '/');
+
+ return join('', url);
+}
+
+function lookup(...segments) {
+ let node = menu_json();
+ let path = [];
+
+ for (let segment in segments)
+ for (let name in split(segment, '/'))
+ push(path, name);
+
+ for (let name in path) {
+ node = node.children[name];
+
+ if (!node)
+ return null;
+
+ if (node.leaf)
+ break;
+ }
+
+ return { node, url: build_url(...path) };
+}
+
+function rollback_pending() {
+ const now = time();
+ const rv = ubus.call('session', 'get', {
+ ubus_rpc_session: '00000000000000000000000000000000',
+ keys: [ 'rollback' ]
+ });
+
+ if (type(rv?.values?.rollback?.token) != 'string' ||
+ type(rv?.values?.rollback?.session) != 'string' ||
+ type(rv?.values?.rollback?.timeout) != 'int' ||
+ rv.values.rollback.timeout <= now)
+ return false;
+
+ return {
+ remaining: rv.values.rollback.timeout - now,
+ session: rv.values.rollback.session,
+ token: rv.values.rollback.token
+ };
+}
+
+let dispatch;
+
+function run_action(request_path, lang, tree, resolved, action) {
+ switch (action?.type) {
+ case 'template':
+ runtime.render(action.path, {});
+ break;
+
+ case 'view':
+ runtime.render('view', { view: action.path });
+ break;
+
+ case 'call':
+ http.write(render(() => {
+ runtime.call(action.module, action.function,
+ ...(action.parameters ?? []),
+ ...resolved.ctx.request_args
+ );
+ }));
+ break;
+
+ case 'function':
+ const mod = require(action.module);
+
+ assert(type(mod[action.function]) == 'function',
+ `Module '${action.module}' does not export function '${action.function}'`);
+
+ http.write(render(() => {
+ call(mod[action.function], mod, runtime.env,
+ ...(action.parameters ?? []),
+ ...resolved.ctx.request_args
+ );
+ }));
+ break;
+
+ case 'cbi':
+ http.write(render(() => {
+ runtime.call('luci.dispatcher', 'invoke_cbi_action',
+ action.path, null,
+ ...resolved.ctx.request_args
+ );
+ }));
+ break;
+
+ case 'form':
+ http.write(render(() => {
+ runtime.call('luci.dispatcher', 'invoke_form_action',
+ action.path,
+ ...resolved.ctx.request_args
+ );
+ }));
+ break;
+
+ case 'alias':
+ dispatch(http, [ ...split(action.path, '/'), ...resolved.ctx.request_args ]);
+ break;
+
+ case 'rewrite':
+ dispatch(http, [
+ ...splice([ ...request_path ], 0, action.remove),
+ ...split(action.path, '/'),
+ ...resolved.ctx.request_args
+ ]);
+ break;
+
+ case 'firstchild':
+ if (!length(tree.children))
+ error404("No root node was registered, this usually happens if no module was installed.\n" +
+ "Install luci-mod-admin-full and retry. " +
+ "If the module is already installed, try removing the /tmp/luci-indexcache file.");
+ else
+ error404(`No page is registered at '/${join("/", resolved.ctx.request_path)}'.\n` +
+ "If this url belongs to an extension, make sure it is properly installed.\n" +
+ "If the extension was recently installed, try removing the /tmp/luci-indexcache file.");
+ break;
+
+ default:
+ error500(`Unhandled action type ${action?.type ?? '?'}`);
+ }
+}
+
+dispatch = function(_http, path) {
+ http = _http;
+
+ let version = determine_version();
+ let lang = determine_request_language();
+
+ runtime = LuCIRuntime({
+ http,
+ ubus,
+ uci,
+ ctx: {},
+ version,
+ config: {
+ main: uci.get_all('luci', 'main') ?? {},
+ apply: uci.get_all('luci', 'apply') ?? {}
+ },
+ dispatcher: {
+ rollback_pending,
+ is_authenticated,
+ load_luabridge,
+ lookup,
+ menu_json,
+ build_url,
+ randomid,
+ error404,
+ error500,
+ lang
+ },
+ striptags,
+ entityencode,
+ _: (...args) => translate(...args) ?? args[0],
+ N_: (...args) => ntranslate(...args) ?? (n[0] == 1 ? n[1] : n[2]),
+ });
+
+ try {
+ let menu = menu_json();
+
+ path ??= map(match(http.getenv('PATH_INFO'), /[^\/]+/g), m => m[0]);
+
+ let resolved = resolve_page(menu, path);
+
+ runtime.env.ctx = resolved.ctx;
+ runtime.env.node = resolved.node;
+
+ if (length(resolved.ctx.auth)) {
+ let session = is_authenticated(resolved.ctx.auth);
+
+ if (!session && resolved.ctx.auth.login) {
+ let user = http.getenv('HTTP_AUTH_USER');
+ let pass = http.getenv('HTTP_AUTH_PASS');
+
+ if (user == null && pass == null) {
+ user = http.formvalue('luci_username');
+ pass = http.formvalue('luci_password');
+ }
+
+ if (user != null && pass != null)
+ session = session_setup(user, pass, resolved.ctx.request_path);
+
+ if (!session) {
+ resolved.ctx.path = [];
+
+ http.status(403, 'Forbidden');
+ http.header('X-LuCI-Login-Required', 'yes');
+
+ let scope = { duser: 'root', fuser: user };
+
+ try {
+ runtime.render(`themes/${basename(runtime.env.media)}/sysauth`, scope);
+ }
+ catch (e) {
+ runtime.render('sysauth', scope);
+ }
+
+ return;
+ }
+
+ let cookie_name = (http.getenv('HTTPS') == 'on') ? 'sysauth_https' : 'sysauth_http',
+ cookie_secure = (http.getenv('HTTPS') == 'on') ? '; secure' : '';
+
+ http.header('Set-Cookie', `${cookie_name}=${session.sid}; path=${build_url()}; SameSite=strict; HttpOnly${cookie_secure}`);
+ http.redirect(build_url(...resolved.ctx.request_path));
+
+ return;
+ }
+
+ if (!session) {
+ http.status(403, 'Forbidden');
+ http.header('X-LuCI-Login-Required', 'yes');
+
+ return;
+ }
+
+ resolved.ctx.authsession ??= session.sid;
+ resolved.ctx.authtoken ??= session.data?.token;
+ resolved.ctx.authuser ??= session.data?.username;
+ resolved.ctx.authacl ??= session.acls;
+ }
+
+ if (length(resolved.ctx.acls)) {
+ let perm = check_acl_depends(resolved.ctx.acls, resolved.ctx.authacl?.['access-group']);
+
+ if (perm == null) {
+ http.status(403, 'Forbidden');
+
+ return;
+ }
+
+ if (resolved.node)
+ resolved.node.readonly = !perm;
+ }
+
+ let action = resolved.node.action;
+
+ if (action?.type == 'arcombine')
+ action = length(resolved.ctx.request_args) ? action.targets?.[1] : action.targets?.[0];
+
+ if (resolved.ctx.cors && http.getenv('REQUEST_METHOD') == 'OPTIONS') {
+ http.status(200, 'OK');
+ http.header('Access-Control-Allow-Origin', http.getenv('HTTP_ORIGIN') ?? '*');
+ http.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
+
+ return;
+ }
+
+ if (require_post_security(action) && !test_post_security(resolved.ctx.authtoken))
+ return;
+
+ run_action(path, lang, menu, resolved, action);
+ }
+ catch (ex) {
+ error500('Unhandled exception during request dispatching', ex);
+ }
+};
+
+export default dispatch;
--- /dev/null
+// Copyright 2022 Jo-Philipp Wich <jo@mein.io>
+// Licensed to the public under the Apache License 2.0.
+
+import {
+ urlencode as _urlencode,
+ urldecode as _urldecode,
+ urlencoded_parser, multipart_parser, header_attribute,
+ ENCODE_IF_NEEDED, ENCODE_FULL, DECODE_IF_NEEDED, DECODE_PLUS
+} from 'lucihttp';
+
+import {
+ error as fserror,
+ stdin, stdout, mkstemp
+} from 'fs';
+
+// luci.http module scope
+export let HTTP_MAX_CONTENT = 1024*100; // 100 kB maximum content size
+
+// Decode a mime encoded http message body with multipart/form-data
+// Content-Type. Stores all extracted data associated with its parameter name
+// in the params table within the given message object. Multiple parameter
+// values are stored as tables, ordinary ones as strings.
+// If an optional file callback function is given then it is fed with the
+// file contents chunk by chunk and only the extracted file name is stored
+// within the params table. The callback function will be called subsequently
+// with three arguments:
+// o Table containing decoded (name, file) and raw (headers) mime header data
+// o String value containing a chunk of the file data
+// o Boolean which indicates whether the current chunk is the last one (eof)
+export function mimedecode_message_body(src, msg, file_cb) {
+ let len = 0, maxlen = +msg.env.CONTENT_LENGTH;
+ let header, field, parser;
+
+ parser = multipart_parser(msg.env.CONTENT_TYPE, function(what, buffer, length) {
+ if (what == parser.PART_INIT) {
+ field = {};
+ }
+ else if (what == parser.HEADER_NAME) {
+ header = lc(buffer);
+ }
+ else if (what == parser.HEADER_VALUE && header) {
+ if (lc(header) == 'content-disposition' &&
+ header_attribute(buffer, null) == 'form-data') {
+ field.name = header_attribute(buffer, 'name');
+ field.file = header_attribute(buffer, 'filename');
+ field[1] = field.file;
+ }
+
+ field.headers = field.headers || {};
+ field.headers[header] = buffer;
+ }
+ else if (what == parser.PART_BEGIN) {
+ return !field.file;
+ }
+ else if (what == parser.PART_DATA && field.name && length > 0) {
+ if (field.file) {
+ if (file_cb) {
+ file_cb(field, buffer, false);
+
+ msg.params[field.name] = msg.params[field.name] || field;
+ }
+ else {
+ if (!field.fd)
+ field.fd = mkstemp(field.name);
+
+ if (field.fd) {
+ field.fd.write(buffer);
+ msg.params[field.name] = msg.params[field.name] || field;
+ }
+ }
+ }
+ else {
+ field.value = buffer;
+ }
+ }
+ else if (what == parser.PART_END && field.name) {
+ if (field.file && msg.params[field.name]) {
+ if (file_cb)
+ file_cb(field, '', true);
+ else if (field.fd)
+ field.fd.seek(0);
+ }
+ else {
+ let val = msg.params[field.name];
+
+ if (type(val) == 'array')
+ push(val, field.value || '');
+ else if (val != null)
+ msg.params[field.name] = [ val, field.value || '' ];
+ else
+ msg.params[field.name] = field.value || '';
+ }
+
+ field = null;
+ }
+ else if (what == parser.ERROR) {
+ err = buffer;
+ }
+
+ return true;
+ }, HTTP_MAX_CONTENT);
+
+ while (true) {
+ let chunk = src();
+
+ len += length(chunk);
+
+ if (maxlen && len > maxlen + 2)
+ die('Message body size exceeds Content-Length');
+
+ if (!parser.parse(chunk))
+ die(err);
+
+ if (chunk == null)
+ break;
+ }
+};
+
+// Decode an urlencoded http message body with application/x-www-urlencoded
+// Content-Type. Stores all extracted data associated with its parameter name
+// in the params table within the given message object. Multiple parameter
+// values are stored as tables, ordinary ones as strings.
+export function urldecode_message_body(src, msg) {
+ let len = 0, maxlen = +msg.env.CONTENT_LENGTH;
+ let err, name, value, parser;
+
+ parser = urlencoded_parser(function (what, buffer, length) {
+ if (what == parser.TUPLE) {
+ name = null;
+ value = null;
+ }
+ else if (what == parser.NAME) {
+ name = _urldecode(buffer, DECODE_PLUS);
+ }
+ else if (what == parser.VALUE && name) {
+ let val = msg.params[name];
+
+ if (type(val) == 'array')
+ push(val, _urldecode(buffer, DECODE_PLUS) || '');
+ else if (val != null)
+ msg.params[name] = [ val, _urldecode(buffer, DECODE_PLUS) || '' ];
+ else
+ msg.params[name] = _urldecode(buffer, DECODE_PLUS) || '';
+ }
+ else if (what == parser.ERROR) {
+ err = buffer;
+ }
+
+ return true;
+ }, HTTP_MAX_CONTENT);
+
+ while (true) {
+ let chunk = src();
+
+ len += length(chunk);
+
+ if (maxlen && len > maxlen + 2)
+ die('Message body size exceeds Content-Length');
+
+ if (!parser.parse(chunk))
+ die(err);
+
+ if (chunk == null)
+ break;
+ }
+};
+
+// This function will examine the Content-Type within the given message object
+// to select the appropriate content decoder.
+// Currently the application/x-www-urlencoded and application/form-data
+// mime types are supported. If the encountered content encoding can't be
+// handled then the whole message body will be stored unaltered as 'content'
+// property within the given message object.
+export function parse_message_body(src, msg, filecb) {
+ if (msg.env.CONTENT_LENGTH || msg.env.REQUEST_METHOD == 'POST') {
+ let ctype = header_attribute(msg.env.CONTENT_TYPE, null);
+
+ // Is it multipart/mime ?
+ if (ctype == 'multipart/form-data')
+ return mimedecode_message_body(src, msg, filecb);
+
+ // Is it application/x-www-form-urlencoded ?
+ else if (ctype == 'application/x-www-form-urlencoded')
+ return urldecode_message_body(src, msg);
+
+ // Unhandled encoding
+ // If a file callback is given then feed it chunk by chunk, else
+ // store whole buffer in message.content
+ let sink;
+
+ // If we have a file callback then feed it
+ if (type(filecb) == 'function') {
+ let meta = {
+ name: 'raw',
+ encoding: msg.env.CONTENT_TYPE
+ };
+
+ sink = (chunk) => {
+ if (chunk != null)
+ return filecb(meta, chunk, false);
+ else
+ return filecb(meta, null, true);
+ };
+ }
+
+ // ... else append to .content
+ else {
+ let chunks = [], len = 0;
+
+ sink = (chunk) => {
+ len += length(chunk);
+
+ if (len > HTTP_MAX_CONTENT)
+ die('POST data exceeds maximum allowed length');
+
+ if (chunk != null) {
+ push(chunks, chunk);
+ }
+ else {
+ msg.content = join('', chunks);
+ msg.content_length = len;
+ }
+ };
+ }
+
+ // Pump data...
+ while (true) {
+ let chunk = src();
+
+ sink(chunk);
+
+ if (chunk == null)
+ break;
+ }
+
+ return true;
+ }
+
+ return false;
+};
+
+export function build_querystring(q) {
+ let s = [];
+
+ for (let k, v in q) {
+ push(s,
+ length(s) ? '&' : '?',
+ _urlencode(k, ENCODE_IF_NEEDED | ENCODE_FULL) || k,
+ '=',
+ _urlencode(v, ENCODE_IF_NEEDED | ENCODE_FULL) || v
+ );
+ }
+
+ return join('', s);
+};
+
+export function urlencode(value) {
+ if (value == null)
+ return null;
+
+ value = '' + value;
+
+ return _urlencode(value, ENCODE_IF_NEEDED | ENCODE_FULL) || value;
+};
+
+export function urldecode(value, decode_plus) {
+ if (value == null)
+ return null;
+
+ value = '' + value;
+
+ return _urldecode(value, DECODE_IF_NEEDED | (decode_plus ? DECODE_PLUS : 0)) || value;
+};
+
+// Extract and split urlencoded data pairs, separated bei either "&" or ";"
+// from given url or string. Returns a table with urldecoded values.
+// Simple parameters are stored as string values associated with the parameter
+// name within the table. Parameters with multiple values are stored as array
+// containing the corresponding values.
+export function urldecode_params(url, tbl) {
+ let parser, name, value;
+ let params = tbl || {};
+
+ parser = urlencoded_parser(function(what, buffer, length) {
+ if (what == parser.TUPLE) {
+ name = null;
+ value = null;
+ }
+ else if (what == parser.NAME) {
+ name = _urldecode(buffer);
+ }
+ else if (what == parser.VALUE && name) {
+ params[name] = _urldecode(buffer) || '';
+ }
+
+ return true;
+ });
+
+ if (parser) {
+ let m = match(('' + (url || '')), /[^?]*$/);
+
+ parser.parse(m ? m[0] : '');
+ parser.parse(null);
+ }
+
+ return params;
+};
+
+// Encode each key-value-pair in given table to x-www-urlencoded format,
+// separated by '&'. Tables are encoded as parameters with multiple values by
+// repeating the parameter name with each value.
+export function urlencode_params(tbl) {
+ let enc = [];
+
+ for (let k, v in tbl) {
+ if (type(v) == 'array') {
+ for (let v2 in v) {
+ if (length(enc))
+ push(enc, '&');
+
+ push(enc,
+ _urlencode(k),
+ '=',
+ _urlencode('' + v2));
+ }
+ }
+ else {
+ if (length(enc))
+ push(enc, '&');
+
+ push(enc,
+ _urlencode(k),
+ '=',
+ _urlencode('' + v));
+ }
+ }
+
+ return join(enc, '');
+};
+
+
+// Default IO routines suitable for CGI invocation
+let avail_len = +getenv('CONTENT_LENGTH');
+
+const default_source = () => {
+ let rlen = min(avail_len, 4096);
+
+ if (rlen == 0) {
+ stdin.close();
+
+ return null;
+ }
+
+ let chunk = stdin.read(rlen);
+
+ if (chunk == null)
+ die(`Input read error: ${fserror()}`);
+
+ avail_len -= length(chunk);
+
+ return chunk;
+};
+
+const default_sink = (...chunks) => {
+ for (let chunk in chunks)
+ stdout.write(chunk);
+
+ stdout.flush();
+};
+
+const Class = {
+ formvalue: function(name, noparse) {
+ if (!noparse && !this.parsed_input)
+ this._parse_input();
+
+ if (name != null)
+ return this.message.params[name];
+ else
+ return this.message.params;
+ },
+
+ formvaluetable: function(prefix) {
+ let vals = {};
+
+ prefix = (prefix || '') + '.';
+
+ if (!this.parsed_input)
+ this._parse_input();
+
+ for (let k, v in this.message.params)
+ if (index(k, prefix) == 0)
+ vals[substr(k, length(prefix))] = '' + v;
+
+ return vals;
+ },
+
+ content: function() {
+ if (!this.parsed_input)
+ this._parse_input();
+
+ return this.message.content;
+ },
+
+ getcookie: function(name) {
+ return header_attribute(`cookie; ${this.getenv('HTTP_COOKIE') ?? ''}`, name);
+ },
+
+ getenv: function(name) {
+ if (name != null)
+ return this.message.env[name];
+ else
+ return this.message.env;
+ },
+
+ setfilehandler: function(callback) {
+ if (type(callback) == 'resource' && type(callback.call) == 'function')
+ this.filehandler = (...args) => callback.call(...args);
+ else if (type(callback) == 'function')
+ this.filehandler = callback;
+ else
+ die('Invalid callback argument for setfilehandler()');
+
+ if (!this.parsed_input)
+ return;
+
+ // If input has already been parsed then uploads are stored as unlinked
+ // temporary files pointed to by open file handles in the parameter
+ // value table. Loop all params, and invoke the file callback for any
+ // param with an open file handle.
+ for (let name, value in this.message.params) {
+ while (value?.fd) {
+ let data = value.fd.read(1024);
+ let eof = (data == null || data == '');
+
+ callback(value, data, eof);
+
+ if (eof) {
+ value.fd.close();
+ value.fd = null;
+ }
+ }
+ }
+ },
+
+ _parse_input: function() {
+ parse_message_body(
+ this.input,
+ this.message,
+ this.filehandler
+ );
+
+ this.parsed_input = true;
+ },
+
+ close: function() {
+ this.write_headers();
+ this.closed = true;
+ },
+
+ header: function(key, value) {
+ this.headers ??= {};
+ this.headers[lc(key)] = value;
+ },
+
+ prepare_content: function(mime) {
+ if (!this.headers?.['content-type']) {
+ if (mime == 'application/xhtml+xml') {
+ if (index(this.getenv('HTTP_ACCEPT'), mime) == -1) {
+ mime = 'text/html; charset=UTF-8';
+ this.header('Vary', 'Accept');
+ }
+ }
+
+ this.header('Content-Type', mime);
+ }
+ },
+
+ status: function(code, message) {
+ this.status_code = code ?? 200;
+ this.status_message = message ?? 'OK';
+ },
+
+ write_headers: function() {
+ if (this.eoh)
+ return;
+
+ if (!this.status_code)
+ this.status();
+
+ if (!this.headers?.['content-type'])
+ this.header('Content-Type', 'text/html; charset=UTF-8');
+
+ if (!this.headers?.['cache-control']) {
+ this.header('Cache-Control', 'no-cache');
+ this.header('Expires', '0');
+ }
+
+ if (!this.headers?.['x-frame-options'])
+ this.header('X-Frame-Options', 'SAMEORIGIN');
+
+ if (!this.headers?.['x-xss-protection'])
+ this.header('X-XSS-Protection', '1; mode=block');
+
+ if (!this.headers?.['x-content-type-options'])
+ this.header('X-Content-Type-Options', 'nosniff');
+
+ this.output('Status: ');
+ this.output(this.status_code);
+ this.output(' ');
+ this.output(this.status_message);
+ this.output('\r\n');
+
+ for (let k, v in this.headers) {
+ this.output(k);
+ this.output(': ');
+ this.output(v);
+ this.output('\r\n');
+ }
+
+ this.output('\r\n');
+
+ this.eoh = true;
+ },
+
+ // If the content chunk is nil this function will automatically invoke close.
+ write: function(content) {
+ if (content != null) {
+ this.write_headers();
+ this.output(content);
+
+ return true;
+ }
+ else {
+ this.close();
+ }
+ },
+
+ redirect: function(url) {
+ this.status(302, 'Found');
+ this.header('Location', url ?? '/');
+ this.close();
+ },
+
+ write_json: function(value) {
+ this.write(sprintf('%.J', value));
+ },
+
+ urlencode,
+ urlencode_params,
+
+ urldecode,
+ urldecode_params,
+
+ build_querystring
+};
+
+export default function(env, sourcein, sinkout) {
+ return proto({
+ input: sourcein ?? default_source,
+ output: sinkout ?? default_sink,
+
+ // File handler nil by default to let .content() work
+ file: null,
+
+ // HTTP-Message table
+ message: {
+ env,
+ headers: {},
+ params: urldecode_params(env?.QUERY_STRING ?? '')
+ },
+
+ parsed_input: false
+ }, Class);
+};
--- /dev/null
+// Copyright 2022 Jo-Philipp Wich <jo@mein.io>
+// Licensed to the public under the Apache License 2.0.
+
+import { access, basename } from 'fs';
+import { cursor } from 'uci';
+
+const template_directory = '/usr/share/ucode/luci/template';
+
+function cut_message(msg) {
+ return trim(replace(msg, /\n--\n.*$/, ''));
+}
+
+function format_nested_exception(ex) {
+ let msg = replace(cut_message(ex.message), /(\n+( \|[^\n]*(\n|$))+)/, (m, m1) => {
+ m1 = replace(m1, /(^|\n) \| ?/g, '$1');
+ m = match(m1, /^(.+?)\n(In.*line \d+, byte \d+:.+)$/);
+
+ return `
+ <div class="exception">
+ <div class="message">${cut_message(m ? m[1] : m1)}</div>
+ ${m ? `<pre class="context">${trim(m[2])}</pre>` : ''}
+ </div>
+ `;
+ });
+
+ return `
+ <div class="exception">
+ <div class="message">${cut_message(msg)}</div>
+ <pre class="context">${trim(ex.stacktrace[0].context)}</pre>
+ </div>
+ `;
+}
+
+function format_lua_exception(ex) {
+ let m = match(ex.message, /^(.+)\nstack traceback:\n(.+)$/);
+
+ return `
+ <div class="exception">
+ <div class="message">${cut_message(m ? m[1] : ex.message)}</div>
+ <pre class="context">${m ? trim(replace(m[2], /(^|\n)\t/g, '$1')) : ex.stacktrace[0].context}</pre>
+ </div>
+ `;
+}
+
+const Class = {
+ init_lua: function() {
+ if (!this.L) {
+ this.L = this.env.dispatcher.load_luabridge().create();
+ this.L.set('L', proto({ write: print }, this.env));
+ this.L.invoke('require', 'luci.ucodebridge');
+
+ this.env.lua_active = true;
+ }
+
+ return this.L;
+ },
+
+ render_ucode: function(path, scope) {
+ let tmplfunc = loadfile(path, { raw_mode: false });
+ call(tmplfunc, null, scope ?? {});
+ },
+
+ render_lua: function(path, scope) {
+ let vm = this.init_lua();
+ let render = vm.get('_G', 'luci', 'ucodebridge', 'render');
+
+ render.call(path, scope ?? {});
+ },
+
+ trycompile: function(path) {
+ let ucode_path = `${template_directory}/${path}.ut`;
+
+ if (access(ucode_path)) {
+ try {
+ loadfile(ucode_path, { raw_mode: false });
+ }
+ catch (ucode_err) {
+ return `Unable to compile '${path}' as ucode template: ${format_nested_exception(ucode_err)}`;
+ }
+ }
+ else {
+ try {
+ let vm = this.init_lua();
+ let compile = vm.get('_G', 'luci', 'ucodebridge', 'compile');
+
+ compile.call(path);
+ }
+ catch (lua_err) {
+ return `Unable to compile '${path}' as Lua template: ${format_lua_exception(lua_err)}`;
+ }
+ }
+
+ return true;
+ },
+
+ render_any: function(path, scope) {
+ let ucode_path = `${template_directory}/${path}.ut`;
+
+ scope = proto(scope ?? {}, this.scopes[-1]);
+
+ push(this.scopes, scope);
+
+ try {
+ if (access(ucode_path))
+ this.render_ucode(ucode_path, scope);
+ else
+ this.render_lua(path, scope);
+ }
+ catch (ex) {
+ pop(this.scopes);
+ die(ex);
+ }
+
+ pop(this.scopes);
+ },
+
+ render: function(path, scope) {
+ let self = this;
+ this.env.http.write(render(() => self.render_any(path, scope)));
+ },
+
+ call: function(modname, method, ...args) {
+ let vm = this.init_lua();
+ let lcall = vm.get('_G', 'luci', 'ucodebridge', 'call');
+
+ return lcall.call(modname, method, ...args);
+ }
+};
+
+export default function(env) {
+ const self = proto({ env: env ??= {}, scopes: [ proto(env, global) ], global }, Class);
+ const uci = cursor();
+
+ // determine theme
+ let media = uci.get('luci', 'main', 'mediaurlbase');
+ let status = self.trycompile(`themes/${basename(media)}/header`);
+
+ if (status !== true) {
+ media = null;
+
+ for (let k, v in uci.get_all('luci', 'themes')) {
+ if (substr(k, 0, 1) != '.') {
+ status = self.trycompile(`themes/${basename(v)}/header`);
+
+ if (status === true) {
+ media = v;
+ break;
+ }
+ }
+ }
+
+ if (!media)
+ error500(`Unable to render any theme header template, last error was:\n${status}`);
+ }
+
+ self.env.media = media;
+ self.env.theme = basename(media);
+ self.env.resource = uci.get('luci', 'main', 'resourcebase');
+ self.env.include = (...args) => self.render_any(...args);
+
+ return self;
+};
--- /dev/null
+// Copyright 2022 Jo-Philipp Wich <jo@mein.io>
+// Licensed to the public under the Apache License 2.0.
+
+import { basename, readlink, readfile, open, popen, stat, glob } from 'fs';
+
+export function process_list() {
+ const top = popen('/bin/busybox top -bn1');
+ let line, list = [];
+
+ for (let line = top.read('line'); length(line); line = top.read('line')) {
+ let m = match(trim(line), /^([0-9]+) +([0-9]+) +(.+) +([RSDZTWI][<NW ][<N ]) +([0-9]+m?) +([0-9]+%) +([0-9]+%) +(.+)$/);
+
+ if (m && m[8] != '/bin/busybox top -bn1') {
+ push(list, {
+ PID: m[1],
+ PPID: m[2],
+ USER: trim(m[3]),
+ STAT: m[4],
+ VSZ: m[5],
+ '%MEM': m[6],
+ '%CPU': m[7],
+ COMMAND: m[8]
+ });
+ }
+ }
+
+ top.close();
+
+ return list;
+};
+
+export function conntrack_list(callback) {
+ const etcpr = open('/etc/protocols');
+ const protos = {};
+
+ if (etcpr) {
+ for (let line = etcpr.read('line'); length(line); line = etcpr.read('line')) {
+ const m = match(line, /^([^# \t\n]+)\s+([0-9]+)\s+/);
+
+ if (m)
+ protos[m[2]] = m[1];
+ }
+
+ etcpr.close();
+ }
+
+ const nfct = open('/proc/net/nf_conntrack', 'r');
+ let connt;
+
+ if (nfct) {
+ for (let line = nfct.read('line'); length(line); line = nfct.read('line')) {
+ let m = match(line, /^(ipv[46]) +([0-9]+) +\S+ +([0-9]+)( +.+)\n$/);
+
+ if (!m)
+ continue;
+
+ let fam = m[1];
+ let l3 = m[2];
+ let l4 = m[3];
+ let tuples = m[4];
+ let timeout = null;
+
+ m = match(tuples, /^ +([0-9]+)( .+)$/);
+
+ if (m) {
+ timeout = m[1];
+ tuples = m[2];
+ }
+
+ if (index(tuples, 'TIME_WAIT') !== -1)
+ continue;
+
+ let e = {
+ bytes: 0,
+ packets: 0,
+ layer3: fam,
+ layer4: protos[l4] ?? 'unknown',
+ timeout: +timeout
+ };
+
+ for (let kv in match(tuples, / (\w+)=(\S+)/g)) {
+ switch (kv[1]) {
+ case 'bytes':
+ case 'packets':
+ e[kv[1]] += +kv[2];
+ break;
+
+ case 'src':
+ case 'dst':
+ e[kv[1]] ??= arrtoip(iptoarr(kv[2]));
+ break;
+
+ case 'sport':
+ case 'dport':
+ e[kv[1]] ??= +kv[2];
+ break;
+
+ default:
+ e[kv[1]] = kv[2];
+ }
+ }
+
+ if (callback)
+ callback(e);
+ else
+ push(connt ??= [], e);
+ }
+
+ nfct.close();
+ }
+
+ return callback ? true : (connt ?? []);
+};
+
+export function init_list() {
+ return map(filter(glob('/etc/init.d/*'), path => {
+ const s = stat(path);
+
+ return s?.type == 'file' && s?.perm?.user_exec;
+ }), basename);
+};
+
+export function init_index(name) {
+ const src = readfile(`/etc/init.d/${basename(name)}`, 2048);
+ const idx = [];
+
+ for (let m in match(src, /^[[:space:]]*(START|STOP)=('[0-9][0-9]'|"[0-9][0-9]"|[0-9][0-9])[[:space:]]*$/gs)) {
+ switch (m[1]) {
+ case 'START': idx[0] = +trim(m[2], '"\''); break;
+ case 'STOP': idx[1] = +trim(m[2], '"\''); break;
+ }
+ }
+
+ return length(idx) ? idx : null;
+};
+
+export function init_enabled(name) {
+ for (let path in glob(`/etc/rc.d/[SK][0-9][0-9]${basename(name)}`)) {
+ const ln = readlink(path);
+ const s1 = stat(index(ln, '/') == 0 ? ln : `/etc/rc.d/${ln}`);
+ const s2 = stat(`/etc/init.d/${basename(name)}`);
+
+ if (s1?.inode == s2?.inode && s1?.type == 'file' && s1?.perm?.user_exec)
+ return true;
+ }
+
+ return false;
+};
+
+export function init_action(name, action) {
+ const s = stat(`/etc/init.d/${basename(name)}`);
+
+ if (s?.type != 'file' || s?.user_exec == false)
+ return false;
+
+ return system(`env -i /etc/init.d/${basename(name)} ${action} >/dev/null`);
+};
--- /dev/null
+{#
+ Copyright 2015-2022 Jo-Philipp Wich <jo@mein.io>
+ Licensed to the public under the Apache License 2.0.
+-#}
+
+{% include('header') %}
+
+<h2 name="content">{{ _('Form token mismatch') }}</h2>
+<br />
+
+<p class="alert-message">{{ _('The submitted security token is invalid or already expired!') }}</p>
+
+<p>{{ _(`
+ In order to prevent unauthorized access to the system, your request has
+ been blocked. Click "Continue »" below to return to the previous page.
+`) }}</p>
+
+<hr />
+
+<p class="right">
+ <strong><a href="#" onclick="window.history.back();">Continue »</a></strong>
+</p>
+
+{% include('footer') %}
--- /dev/null
+{#
+ Copyright 2008 Steven Barth <steven@midlink.org>
+ Copyright 2008-2022 Jo-Philipp Wich <jo@mein.io>
+ Licensed to the public under the Apache License 2.0.
+-#}
+
+{% include('header') %}
+
+<h2 name="content">404 {{ _('Not Found') }}</h2>
+<p>{{ _('Sorry, the object you requested was not found.') }}</p>
+<p>{{ message }}</p>
+<tt>{{ _('Unable to dispatch') }}: {{ dispatcher.build_url(...ctx.request_path) }}</tt>
+
+{% include('footer') %}
--- /dev/null
+{#
+ Copyright 2022 Jo-Philipp Wich <jo@mein.io>
+ Licensed to the public under the Apache License 2.0.
+-#}
+
+<!--]]>--><!--'>--><!--">-->
+<style type="text/css">
+ body {
+ line-height: 1.5;
+ font-size: 14px;
+ font-family: sans-serif;
+ }
+
+ .error500 * {
+ margin: 0;
+ padding: 0;
+ color: inherit;
+ }
+
+ .error500 {
+ box-sizing: border-box;
+ position: fixed;
+ z-index: 999999;
+ top: 0;
+ left: 0;
+ width: 100vw;
+ height: 100vh;
+ overflow: auto;
+ background: #ffe;
+ color: #f00 !important;
+ padding: 1em;
+ }
+
+ .error500 h1 {
+ margin-bottom: .5em;
+ }
+
+ .error500 .exception {
+ font-weight: normal;
+ white-space: normal;
+ margin: .25em;
+ padding: .5em;
+ border: 1px solid #f00;
+ background: rgba(204, 204, 204, .2);
+ }
+
+ .error500 .message {
+ font-weight: bold;
+ white-space: pre-line;
+ }
+
+ .error500 .context {
+ margin-top: 2em;
+ }
+</style>
+
+<div class="error500">
+ <h1>{{ title }}</h1>
+ <div class="message">{{ message }}</div>
+
+ {% if (exception): %}
+ <div class="exception">
+ <div class="message">{{ exception.message }}</div>
+ <pre class="context">{{ exception.stacktrace[0].context }}</pre>
+ </div>
+ {% endif %}
+</div>
--- /dev/null
+{#
+ Copyright 2022 Jo-Philipp Wich <jo@mein.io>
+ Licensed to the public under the Apache License 2.0.
+-#}
+
+{% const rollback = dispatcher.rollback_pending() %}
+{% if (rollback || trigger_apply || trigger_revert): %}
+ <script type="text/javascript">
+ document.addEventListener("luci-loaded", function() {
+ {% if (trigger_apply): %}
+ L.ui.changes.apply(true);
+ {% elif (trigger_revert): %}
+ L.ui.changes.revert();
+ {% else %}
+ L.ui.changes.confirm(true, Date.now() + {{rollback.remaining * 1000}}, {{sprintf('%J', rollback.token)}});
+ {% endif %}
+ });
+ </script>
+{% endif %}
+
+{% include(`themes/${theme}/footer`) %}
+
+<!-- Lua compatibility mode active: {{ lua_active ? 'yes' : 'no' }} -->
--- /dev/null
+{#
+ Copyright 2022 Jo-Philipp Wich <jo@mein.io>
+ Licensed to the public under the Apache License 2.0.
+-#}
+
+{%
+ include(`themes/${theme}/header`);
+-%}
+
+<script type="text/javascript" src="{{ resource }}/promis.min.js"></script>
+<script type="text/javascript" src="{{ resource }}/luci.js"></script>
+<script type="text/javascript">
+ L = new LuCI({{ {
+ media : media,
+ resource : resource,
+ scriptname : http.getenv("SCRIPT_NAME"),
+ pathinfo : http.getenv("PATH_INFO"),
+ documentroot : http.getenv("DOCUMENT_ROOT"),
+ requestpath : ctx.request_path,
+ dispatchpath : ctx.path,
+ pollinterval : +config.main.pollinterval || 5,
+ ubuspath : config.main.ubuspath || '/ubus/',
+ sessionid : ctx.authsession,
+ token : ctx.authtoken,
+ nodespec : node,
+ apply_rollback : max(+config.apply.rollback || 90, 90),
+ apply_holdoff : max(+config.apply.holdoff || 4, 1),
+ apply_timeout : max(+config.apply.timeout || 5, 1),
+ apply_display : max(+config.apply.display || 1.5, 1),
+ rollback_token : rollback_token
+ } }});
+</script>
--- /dev/null
+{#
+ Copyright 2008 Steven Barth <steven@midlink.org>
+ Copyright 2008-2012 Jo-Philipp Wich <jow@openwrt.org>
+ Licensed to the public under the Apache License 2.0.
+-#}
+
+{% include('header') %}
+
+<form method="post">
+ {% if (fuser): %}
+ <div class="alert-message warning">
+ <p>{{ _('Invalid username and/or password! Please try again.') }}</p>
+ </div>
+ {% endif %}
+
+ <div class="cbi-map">
+ <h2 name="content">{{ _('Authorization Required') }}</h2>
+ <div class="cbi-map-descr">
+ {{ _('Please enter your username and password.') }}
+ </div>
+ <div class="cbi-section"><div class="cbi-section-node">
+ <div class="cbi-value">
+ <label class="cbi-value-title">{{ _('Username') }}</label>
+ <div class="cbi-value-field">
+ <input class="cbi-input-text" type="text" name="luci_username" value="{{ entityencode(duser, true) }}" />
+ </div>
+ </div>
+ <div class="cbi-value cbi-value-last">
+ <label class="cbi-value-title">{{ _('Password') }}</label>
+ <div class="cbi-value-field">
+ <input class="cbi-input-text" type="password" name="luci_password" />
+ </div>
+ </div>
+ </div></div>
+ </div>
+
+ <div class="cbi-page-actions">
+ <input type="submit" value="{{ _('Login') }}" class="btn cbi-button cbi-button-apply" />
+ <input type="reset" value="{{ _('Reset') }}" class="btn cbi-button cbi-button-reset" />
+ </div>
+</form>
+
+{%
+ let https_ports = uci.get('uhttpd', 'main', 'listen_https') ?? [];
+
+ https_ports = uniq(filter(
+ map(
+ (type(https_ports) == 'string') ? split(https_port, /\s+/) : https_ports,
+ e => +match(e, /\d+$/)?.[0]
+ ),
+ p => (p >= 0 && p <= 65535)
+ ));
+%}
+
+<script type="text/javascript">//<![CDATA[
+ var input = document.getElementsByName('luci_password')[0];
+
+ if (input)
+ input.focus();
+
+ if (document.location.protocol != 'https:') {
+ {{ https_ports }}.forEach(function(port) {
+ var url = 'https://' + window.location.hostname + ':' + port + window.location.pathname;
+ var img = new Image();
+
+ img.onload = function() { window.location = url };
+ img.src = 'https://' + window.location.hostname + ':' + port + '{{ resource }}/icons/loading.gif?' + Math.random();
+
+ setTimeout(function() { img.src = '' }, 5000);
+ });
+ }
+//]]></script>
+
+{% include('footer') %}
--- /dev/null
+{% include('header') %}
+
+<div id="view">
+ <div class="spinning">{{ _('Loading view…') }}</div>
+ <script type="text/javascript">
+ L.require('ui').then(function(ui) {
+ ui.instantiateView('{{ view }}');
+ });
+ </script>
+</div>
+
+{% include('footer') %}
--- /dev/null
+{%
+
+import dispatch from 'luci.dispatcher';
+import request from 'luci.http';
+
+global.handle_request = function(env) {
+ let req = request(env, uhttpd.recv, uhttpd.send);
+
+ dispatch(req);
+
+ req.close();
+};
--- /dev/null
+// Autogenerated by zoneinfo2ucode.pl
+
+export default {
+ 'Africa/Abidjan': 'GMT0',
+ 'Africa/Accra': 'GMT0',
+ 'Africa/Addis Ababa': 'EAT-3',
+ 'Africa/Algiers': 'CET-1',
+ 'Africa/Asmara': 'EAT-3',
+ 'Africa/Bamako': 'GMT0',
+ 'Africa/Bangui': 'WAT-1',
+ 'Africa/Banjul': 'GMT0',
+ 'Africa/Bissau': 'GMT0',
+ 'Africa/Blantyre': 'CAT-2',
+ 'Africa/Brazzaville': 'WAT-1',
+ 'Africa/Bujumbura': 'CAT-2',
+ 'Africa/Cairo': 'EET-2',
+ 'Africa/Casablanca': '<+01>-1',
+ 'Africa/Ceuta': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Africa/Conakry': 'GMT0',
+ 'Africa/Dakar': 'GMT0',
+ 'Africa/Dar es Salaam': 'EAT-3',
+ 'Africa/Djibouti': 'EAT-3',
+ 'Africa/Douala': 'WAT-1',
+ 'Africa/El Aaiun': '<+01>-1',
+ 'Africa/Freetown': 'GMT0',
+ 'Africa/Gaborone': 'CAT-2',
+ 'Africa/Harare': 'CAT-2',
+ 'Africa/Johannesburg': 'SAST-2',
+ 'Africa/Juba': 'CAT-2',
+ 'Africa/Kampala': 'EAT-3',
+ 'Africa/Khartoum': 'CAT-2',
+ 'Africa/Kigali': 'CAT-2',
+ 'Africa/Kinshasa': 'WAT-1',
+ 'Africa/Lagos': 'WAT-1',
+ 'Africa/Libreville': 'WAT-1',
+ 'Africa/Lome': 'GMT0',
+ 'Africa/Luanda': 'WAT-1',
+ 'Africa/Lubumbashi': 'CAT-2',
+ 'Africa/Lusaka': 'CAT-2',
+ 'Africa/Malabo': 'WAT-1',
+ 'Africa/Maputo': 'CAT-2',
+ 'Africa/Maseru': 'SAST-2',
+ 'Africa/Mbabane': 'SAST-2',
+ 'Africa/Mogadishu': 'EAT-3',
+ 'Africa/Monrovia': 'GMT0',
+ 'Africa/Nairobi': 'EAT-3',
+ 'Africa/Ndjamena': 'WAT-1',
+ 'Africa/Niamey': 'WAT-1',
+ 'Africa/Nouakchott': 'GMT0',
+ 'Africa/Ouagadougou': 'GMT0',
+ 'Africa/Porto-Novo': 'WAT-1',
+ 'Africa/Sao Tome': 'GMT0',
+ 'Africa/Tripoli': 'EET-2',
+ 'Africa/Tunis': 'CET-1',
+ 'Africa/Windhoek': 'CAT-2',
+ 'America/Adak': 'HST10HDT,M3.2.0,M11.1.0',
+ 'America/Anchorage': 'AKST9AKDT,M3.2.0,M11.1.0',
+ 'America/Anguilla': 'AST4',
+ 'America/Antigua': 'AST4',
+ 'America/Araguaina': '<-03>3',
+ 'America/Argentina/Buenos Aires': '<-03>3',
+ 'America/Argentina/Catamarca': '<-03>3',
+ 'America/Argentina/Cordoba': '<-03>3',
+ 'America/Argentina/Jujuy': '<-03>3',
+ 'America/Argentina/La Rioja': '<-03>3',
+ 'America/Argentina/Mendoza': '<-03>3',
+ 'America/Argentina/Rio Gallegos': '<-03>3',
+ 'America/Argentina/Salta': '<-03>3',
+ 'America/Argentina/San Juan': '<-03>3',
+ 'America/Argentina/San Luis': '<-03>3',
+ 'America/Argentina/Tucuman': '<-03>3',
+ 'America/Argentina/Ushuaia': '<-03>3',
+ 'America/Aruba': 'AST4',
+ 'America/Asuncion': '<-04>4<-03>,M10.1.0/0,M3.4.0/0',
+ 'America/Atikokan': 'EST5',
+ 'America/Bahia': '<-03>3',
+ 'America/Bahia Banderas': 'CST6CDT,M4.1.0,M10.5.0',
+ 'America/Barbados': 'AST4',
+ 'America/Belem': '<-03>3',
+ 'America/Belize': 'CST6',
+ 'America/Blanc-Sablon': 'AST4',
+ 'America/Boa Vista': '<-04>4',
+ 'America/Bogota': '<-05>5',
+ 'America/Boise': 'MST7MDT,M3.2.0,M11.1.0',
+ 'America/Cambridge Bay': 'MST7MDT,M3.2.0,M11.1.0',
+ 'America/Campo Grande': '<-04>4',
+ 'America/Cancun': 'EST5',
+ 'America/Caracas': '<-04>4',
+ 'America/Cayenne': '<-03>3',
+ 'America/Cayman': 'EST5',
+ 'America/Chicago': 'CST6CDT,M3.2.0,M11.1.0',
+ 'America/Chihuahua': 'MST7MDT,M4.1.0,M10.5.0',
+ 'America/Costa Rica': 'CST6',
+ 'America/Creston': 'MST7',
+ 'America/Cuiaba': '<-04>4',
+ 'America/Curacao': 'AST4',
+ 'America/Danmarkshavn': 'GMT0',
+ 'America/Dawson': 'MST7',
+ 'America/Dawson Creek': 'MST7',
+ 'America/Denver': 'MST7MDT,M3.2.0,M11.1.0',
+ 'America/Detroit': 'EST5EDT,M3.2.0,M11.1.0',
+ 'America/Dominica': 'AST4',
+ 'America/Edmonton': 'MST7MDT,M3.2.0,M11.1.0',
+ 'America/Eirunepe': '<-05>5',
+ 'America/El Salvador': 'CST6',
+ 'America/Fort Nelson': 'MST7',
+ 'America/Fortaleza': '<-03>3',
+ 'America/Glace Bay': 'AST4ADT,M3.2.0,M11.1.0',
+ 'America/Goose Bay': 'AST4ADT,M3.2.0,M11.1.0',
+ 'America/Grand Turk': 'EST5EDT,M3.2.0,M11.1.0',
+ 'America/Grenada': 'AST4',
+ 'America/Guadeloupe': 'AST4',
+ 'America/Guatemala': 'CST6',
+ 'America/Guayaquil': '<-05>5',
+ 'America/Guyana': '<-04>4',
+ 'America/Halifax': 'AST4ADT,M3.2.0,M11.1.0',
+ 'America/Havana': 'CST5CDT,M3.2.0/0,M11.1.0/1',
+ 'America/Hermosillo': 'MST7',
+ 'America/Indiana/Indianapolis': 'EST5EDT,M3.2.0,M11.1.0',
+ 'America/Indiana/Knox': 'CST6CDT,M3.2.0,M11.1.0',
+ 'America/Indiana/Marengo': 'EST5EDT,M3.2.0,M11.1.0',
+ 'America/Indiana/Petersburg': 'EST5EDT,M3.2.0,M11.1.0',
+ 'America/Indiana/Tell City': 'CST6CDT,M3.2.0,M11.1.0',
+ 'America/Indiana/Vevay': 'EST5EDT,M3.2.0,M11.1.0',
+ 'America/Indiana/Vincennes': 'EST5EDT,M3.2.0,M11.1.0',
+ 'America/Indiana/Winamac': 'EST5EDT,M3.2.0,M11.1.0',
+ 'America/Inuvik': 'MST7MDT,M3.2.0,M11.1.0',
+ 'America/Iqaluit': 'EST5EDT,M3.2.0,M11.1.0',
+ 'America/Jamaica': 'EST5',
+ 'America/Juneau': 'AKST9AKDT,M3.2.0,M11.1.0',
+ 'America/Kentucky/Louisville': 'EST5EDT,M3.2.0,M11.1.0',
+ 'America/Kentucky/Monticello': 'EST5EDT,M3.2.0,M11.1.0',
+ 'America/Kralendijk': 'AST4',
+ 'America/La Paz': '<-04>4',
+ 'America/Lima': '<-05>5',
+ 'America/Los Angeles': 'PST8PDT,M3.2.0,M11.1.0',
+ 'America/Lower Princes': 'AST4',
+ 'America/Maceio': '<-03>3',
+ 'America/Managua': 'CST6',
+ 'America/Manaus': '<-04>4',
+ 'America/Marigot': 'AST4',
+ 'America/Martinique': 'AST4',
+ 'America/Matamoros': 'CST6CDT,M3.2.0,M11.1.0',
+ 'America/Mazatlan': 'MST7MDT,M4.1.0,M10.5.0',
+ 'America/Menominee': 'CST6CDT,M3.2.0,M11.1.0',
+ 'America/Merida': 'CST6CDT,M4.1.0,M10.5.0',
+ 'America/Metlakatla': 'AKST9AKDT,M3.2.0,M11.1.0',
+ 'America/Mexico City': 'CST6CDT,M4.1.0,M10.5.0',
+ 'America/Miquelon': '<-03>3<-02>,M3.2.0,M11.1.0',
+ 'America/Moncton': 'AST4ADT,M3.2.0,M11.1.0',
+ 'America/Monterrey': 'CST6CDT,M4.1.0,M10.5.0',
+ 'America/Montevideo': '<-03>3',
+ 'America/Montserrat': 'AST4',
+ 'America/Nassau': 'EST5EDT,M3.2.0,M11.1.0',
+ 'America/New York': 'EST5EDT,M3.2.0,M11.1.0',
+ 'America/Nipigon': 'EST5EDT,M3.2.0,M11.1.0',
+ 'America/Nome': 'AKST9AKDT,M3.2.0,M11.1.0',
+ 'America/Noronha': '<-02>2',
+ 'America/North Dakota/Beulah': 'CST6CDT,M3.2.0,M11.1.0',
+ 'America/North Dakota/Center': 'CST6CDT,M3.2.0,M11.1.0',
+ 'America/North Dakota/New Salem': 'CST6CDT,M3.2.0,M11.1.0',
+ 'America/Nuuk': '<-03>3<-02>,M3.5.0/-2,M10.5.0/-1',
+ 'America/Ojinaga': 'MST7MDT,M3.2.0,M11.1.0',
+ 'America/Panama': 'EST5',
+ 'America/Pangnirtung': 'EST5EDT,M3.2.0,M11.1.0',
+ 'America/Paramaribo': '<-03>3',
+ 'America/Phoenix': 'MST7',
+ 'America/Port of Spain': 'AST4',
+ 'America/Port-au-Prince': 'EST5EDT,M3.2.0,M11.1.0',
+ 'America/Porto Velho': '<-04>4',
+ 'America/Puerto Rico': 'AST4',
+ 'America/Punta Arenas': '<-03>3',
+ 'America/Rainy River': 'CST6CDT,M3.2.0,M11.1.0',
+ 'America/Rankin Inlet': 'CST6CDT,M3.2.0,M11.1.0',
+ 'America/Recife': '<-03>3',
+ 'America/Regina': 'CST6',
+ 'America/Resolute': 'CST6CDT,M3.2.0,M11.1.0',
+ 'America/Rio Branco': '<-05>5',
+ 'America/Santarem': '<-03>3',
+ 'America/Santiago': '<-04>4<-03>,M9.1.6/24,M4.1.6/24',
+ 'America/Santo Domingo': 'AST4',
+ 'America/Sao Paulo': '<-03>3',
+ 'America/Scoresbysund': '<-01>1<+00>,M3.5.0/0,M10.5.0/1',
+ 'America/Sitka': 'AKST9AKDT,M3.2.0,M11.1.0',
+ 'America/St Barthelemy': 'AST4',
+ 'America/St Johns': 'NST3:30NDT,M3.2.0,M11.1.0',
+ 'America/St Kitts': 'AST4',
+ 'America/St Lucia': 'AST4',
+ 'America/St Thomas': 'AST4',
+ 'America/St Vincent': 'AST4',
+ 'America/Swift Current': 'CST6',
+ 'America/Tegucigalpa': 'CST6',
+ 'America/Thule': 'AST4ADT,M3.2.0,M11.1.0',
+ 'America/Thunder Bay': 'EST5EDT,M3.2.0,M11.1.0',
+ 'America/Tijuana': 'PST8PDT,M3.2.0,M11.1.0',
+ 'America/Toronto': 'EST5EDT,M3.2.0,M11.1.0',
+ 'America/Tortola': 'AST4',
+ 'America/Vancouver': 'PST8PDT,M3.2.0,M11.1.0',
+ 'America/Whitehorse': 'MST7',
+ 'America/Winnipeg': 'CST6CDT,M3.2.0,M11.1.0',
+ 'America/Yakutat': 'AKST9AKDT,M3.2.0,M11.1.0',
+ 'America/Yellowknife': 'MST7MDT,M3.2.0,M11.1.0',
+ 'Antarctica/Casey': '<+11>-11',
+ 'Antarctica/Davis': '<+07>-7',
+ 'Antarctica/DumontDUrville': '<+10>-10',
+ 'Antarctica/Macquarie': 'AEST-10AEDT,M10.1.0,M4.1.0/3',
+ 'Antarctica/Mawson': '<+05>-5',
+ 'Antarctica/McMurdo': 'NZST-12NZDT,M9.5.0,M4.1.0/3',
+ 'Antarctica/Palmer': '<-03>3',
+ 'Antarctica/Rothera': '<-03>3',
+ 'Antarctica/Syowa': '<+03>-3',
+ 'Antarctica/Troll': '<+00>0<+02>-2,M3.5.0/1,M10.5.0/3',
+ 'Antarctica/Vostok': '<+06>-6',
+ 'Arctic/Longyearbyen': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Asia/Aden': '<+03>-3',
+ 'Asia/Almaty': '<+06>-6',
+ 'Asia/Amman': '<+03>-3',
+ 'Asia/Anadyr': '<+12>-12',
+ 'Asia/Aqtau': '<+05>-5',
+ 'Asia/Aqtobe': '<+05>-5',
+ 'Asia/Ashgabat': '<+05>-5',
+ 'Asia/Atyrau': '<+05>-5',
+ 'Asia/Baghdad': '<+03>-3',
+ 'Asia/Bahrain': '<+03>-3',
+ 'Asia/Baku': '<+04>-4',
+ 'Asia/Bangkok': '<+07>-7',
+ 'Asia/Barnaul': '<+07>-7',
+ 'Asia/Beirut': 'EET-2EEST,M3.5.0/0,M10.5.0/0',
+ 'Asia/Bishkek': '<+06>-6',
+ 'Asia/Brunei': '<+08>-8',
+ 'Asia/Chita': '<+09>-9',
+ 'Asia/Choibalsan': '<+08>-8',
+ 'Asia/Colombo': '<+0530>-5:30',
+ 'Asia/Damascus': '<+03>-3',
+ 'Asia/Dhaka': '<+06>-6',
+ 'Asia/Dili': '<+09>-9',
+ 'Asia/Dubai': '<+04>-4',
+ 'Asia/Dushanbe': '<+05>-5',
+ 'Asia/Famagusta': 'EET-2EEST,M3.5.0/3,M10.5.0/4',
+ 'Asia/Gaza': 'EET-2EEST,M3.4.4/50,M10.4.4/50',
+ 'Asia/Hebron': 'EET-2EEST,M3.4.4/50,M10.4.4/50',
+ 'Asia/Ho Chi Minh': '<+07>-7',
+ 'Asia/Hong Kong': 'HKT-8',
+ 'Asia/Hovd': '<+07>-7',
+ 'Asia/Irkutsk': '<+08>-8',
+ 'Asia/Jakarta': 'WIB-7',
+ 'Asia/Jayapura': 'WIT-9',
+ 'Asia/Jerusalem': 'IST-2IDT,M3.4.4/26,M10.5.0',
+ 'Asia/Kabul': '<+0430>-4:30',
+ 'Asia/Kamchatka': '<+12>-12',
+ 'Asia/Karachi': 'PKT-5',
+ 'Asia/Kathmandu': '<+0545>-5:45',
+ 'Asia/Khandyga': '<+09>-9',
+ 'Asia/Kolkata': 'IST-5:30',
+ 'Asia/Krasnoyarsk': '<+07>-7',
+ 'Asia/Kuala Lumpur': '<+08>-8',
+ 'Asia/Kuching': '<+08>-8',
+ 'Asia/Kuwait': '<+03>-3',
+ 'Asia/Macau': 'CST-8',
+ 'Asia/Magadan': '<+11>-11',
+ 'Asia/Makassar': 'WITA-8',
+ 'Asia/Manila': 'PST-8',
+ 'Asia/Muscat': '<+04>-4',
+ 'Asia/Nicosia': 'EET-2EEST,M3.5.0/3,M10.5.0/4',
+ 'Asia/Novokuznetsk': '<+07>-7',
+ 'Asia/Novosibirsk': '<+07>-7',
+ 'Asia/Omsk': '<+06>-6',
+ 'Asia/Oral': '<+05>-5',
+ 'Asia/Phnom Penh': '<+07>-7',
+ 'Asia/Pontianak': 'WIB-7',
+ 'Asia/Pyongyang': 'KST-9',
+ 'Asia/Qatar': '<+03>-3',
+ 'Asia/Qostanay': '<+06>-6',
+ 'Asia/Qyzylorda': '<+05>-5',
+ 'Asia/Riyadh': '<+03>-3',
+ 'Asia/Sakhalin': '<+11>-11',
+ 'Asia/Samarkand': '<+05>-5',
+ 'Asia/Seoul': 'KST-9',
+ 'Asia/Shanghai': 'CST-8',
+ 'Asia/Singapore': '<+08>-8',
+ 'Asia/Srednekolymsk': '<+11>-11',
+ 'Asia/Taipei': 'CST-8',
+ 'Asia/Tashkent': '<+05>-5',
+ 'Asia/Tbilisi': '<+04>-4',
+ 'Asia/Tehran': '<+0330>-3:30',
+ 'Asia/Thimphu': '<+06>-6',
+ 'Asia/Tokyo': 'JST-9',
+ 'Asia/Tomsk': '<+07>-7',
+ 'Asia/Ulaanbaatar': '<+08>-8',
+ 'Asia/Urumqi': '<+06>-6',
+ 'Asia/Ust-Nera': '<+10>-10',
+ 'Asia/Vientiane': '<+07>-7',
+ 'Asia/Vladivostok': '<+10>-10',
+ 'Asia/Yakutsk': '<+09>-9',
+ 'Asia/Yangon': '<+0630>-6:30',
+ 'Asia/Yekaterinburg': '<+05>-5',
+ 'Asia/Yerevan': '<+04>-4',
+ 'Atlantic/Azores': '<-01>1<+00>,M3.5.0/0,M10.5.0/1',
+ 'Atlantic/Bermuda': 'AST4ADT,M3.2.0,M11.1.0',
+ 'Atlantic/Canary': 'WET0WEST,M3.5.0/1,M10.5.0',
+ 'Atlantic/Cape Verde': '<-01>1',
+ 'Atlantic/Faroe': 'WET0WEST,M3.5.0/1,M10.5.0',
+ 'Atlantic/Madeira': 'WET0WEST,M3.5.0/1,M10.5.0',
+ 'Atlantic/Reykjavik': 'GMT0',
+ 'Atlantic/South Georgia': '<-02>2',
+ 'Atlantic/St Helena': 'GMT0',
+ 'Atlantic/Stanley': '<-03>3',
+ 'Australia/Adelaide': 'ACST-9:30ACDT,M10.1.0,M4.1.0/3',
+ 'Australia/Brisbane': 'AEST-10',
+ 'Australia/Broken Hill': 'ACST-9:30ACDT,M10.1.0,M4.1.0/3',
+ 'Australia/Darwin': 'ACST-9:30',
+ 'Australia/Eucla': '<+0845>-8:45',
+ 'Australia/Hobart': 'AEST-10AEDT,M10.1.0,M4.1.0/3',
+ 'Australia/Lindeman': 'AEST-10',
+ 'Australia/Lord Howe': '<+1030>-10:30<+11>-11,M10.1.0,M4.1.0',
+ 'Australia/Melbourne': 'AEST-10AEDT,M10.1.0,M4.1.0/3',
+ 'Australia/Perth': 'AWST-8',
+ 'Australia/Sydney': 'AEST-10AEDT,M10.1.0,M4.1.0/3',
+ 'Etc/GMT': 'GMT0',
+ 'Etc/GMT+1': '<-01>1',
+ 'Etc/GMT+10': '<-10>10',
+ 'Etc/GMT+11': '<-11>11',
+ 'Etc/GMT+12': '<-12>12',
+ 'Etc/GMT+2': '<-02>2',
+ 'Etc/GMT+3': '<-03>3',
+ 'Etc/GMT+4': '<-04>4',
+ 'Etc/GMT+5': '<-05>5',
+ 'Etc/GMT+6': '<-06>6',
+ 'Etc/GMT+7': '<-07>7',
+ 'Etc/GMT+8': '<-08>8',
+ 'Etc/GMT+9': '<-09>9',
+ 'Etc/GMT-1': '<+01>-1',
+ 'Etc/GMT-10': '<+10>-10',
+ 'Etc/GMT-11': '<+11>-11',
+ 'Etc/GMT-12': '<+12>-12',
+ 'Etc/GMT-13': '<+13>-13',
+ 'Etc/GMT-14': '<+14>-14',
+ 'Etc/GMT-2': '<+02>-2',
+ 'Etc/GMT-3': '<+03>-3',
+ 'Etc/GMT-4': '<+04>-4',
+ 'Etc/GMT-5': '<+05>-5',
+ 'Etc/GMT-6': '<+06>-6',
+ 'Etc/GMT-7': '<+07>-7',
+ 'Etc/GMT-8': '<+08>-8',
+ 'Etc/GMT-9': '<+09>-9',
+ 'Europe/Amsterdam': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Andorra': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Astrakhan': '<+04>-4',
+ 'Europe/Athens': 'EET-2EEST,M3.5.0/3,M10.5.0/4',
+ 'Europe/Belgrade': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Berlin': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Bratislava': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Brussels': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Bucharest': 'EET-2EEST,M3.5.0/3,M10.5.0/4',
+ 'Europe/Budapest': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Busingen': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Chisinau': 'EET-2EEST,M3.5.0,M10.5.0/3',
+ 'Europe/Copenhagen': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Dublin': 'IST-1GMT0,M10.5.0,M3.5.0/1',
+ 'Europe/Gibraltar': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Guernsey': 'GMT0BST,M3.5.0/1,M10.5.0',
+ 'Europe/Helsinki': 'EET-2EEST,M3.5.0/3,M10.5.0/4',
+ 'Europe/Isle of Man': 'GMT0BST,M3.5.0/1,M10.5.0',
+ 'Europe/Istanbul': '<+03>-3',
+ 'Europe/Jersey': 'GMT0BST,M3.5.0/1,M10.5.0',
+ 'Europe/Kaliningrad': 'EET-2',
+ 'Europe/Kirov': '<+03>-3',
+ 'Europe/Kyiv': 'EET-2EEST,M3.5.0/3,M10.5.0/4',
+ 'Europe/Lisbon': 'WET0WEST,M3.5.0/1,M10.5.0',
+ 'Europe/Ljubljana': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/London': 'GMT0BST,M3.5.0/1,M10.5.0',
+ 'Europe/Luxembourg': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Madrid': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Malta': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Mariehamn': 'EET-2EEST,M3.5.0/3,M10.5.0/4',
+ 'Europe/Minsk': '<+03>-3',
+ 'Europe/Monaco': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Moscow': 'MSK-3',
+ 'Europe/Oslo': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Paris': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Podgorica': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Prague': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Riga': 'EET-2EEST,M3.5.0/3,M10.5.0/4',
+ 'Europe/Rome': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Samara': '<+04>-4',
+ 'Europe/San Marino': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Sarajevo': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Saratov': '<+04>-4',
+ 'Europe/Simferopol': 'MSK-3',
+ 'Europe/Skopje': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Sofia': 'EET-2EEST,M3.5.0/3,M10.5.0/4',
+ 'Europe/Stockholm': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Tallinn': 'EET-2EEST,M3.5.0/3,M10.5.0/4',
+ 'Europe/Tirane': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Ulyanovsk': '<+04>-4',
+ 'Europe/Vaduz': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Vatican': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Vienna': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Vilnius': 'EET-2EEST,M3.5.0/3,M10.5.0/4',
+ 'Europe/Volgograd': '<+03>-3',
+ 'Europe/Warsaw': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Zagreb': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Europe/Zurich': 'CET-1CEST,M3.5.0,M10.5.0/3',
+ 'Indian/Antananarivo': 'EAT-3',
+ 'Indian/Chagos': '<+06>-6',
+ 'Indian/Christmas': '<+07>-7',
+ 'Indian/Cocos': '<+0630>-6:30',
+ 'Indian/Comoro': 'EAT-3',
+ 'Indian/Kerguelen': '<+05>-5',
+ 'Indian/Mahe': '<+04>-4',
+ 'Indian/Maldives': '<+05>-5',
+ 'Indian/Mauritius': '<+04>-4',
+ 'Indian/Mayotte': 'EAT-3',
+ 'Indian/Reunion': '<+04>-4',
+ 'Pacific/Apia': '<+13>-13',
+ 'Pacific/Auckland': 'NZST-12NZDT,M9.5.0,M4.1.0/3',
+ 'Pacific/Bougainville': '<+11>-11',
+ 'Pacific/Chatham': '<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45',
+ 'Pacific/Chuuk': '<+10>-10',
+ 'Pacific/Easter': '<-06>6<-05>,M9.1.6/22,M4.1.6/22',
+ 'Pacific/Efate': '<+11>-11',
+ 'Pacific/Fakaofo': '<+13>-13',
+ 'Pacific/Fiji': '<+12>-12<+13>,M11.2.0,M1.2.3/99',
+ 'Pacific/Funafuti': '<+12>-12',
+ 'Pacific/Galapagos': '<-06>6',
+ 'Pacific/Gambier': '<-09>9',
+ 'Pacific/Guadalcanal': '<+11>-11',
+ 'Pacific/Guam': 'ChST-10',
+ 'Pacific/Honolulu': 'HST10',
+ 'Pacific/Kanton': '<+13>-13',
+ 'Pacific/Kiritimati': '<+14>-14',
+ 'Pacific/Kosrae': '<+11>-11',
+ 'Pacific/Kwajalein': '<+12>-12',
+ 'Pacific/Majuro': '<+12>-12',
+ 'Pacific/Marquesas': '<-0930>9:30',
+ 'Pacific/Midway': 'SST11',
+ 'Pacific/Nauru': '<+12>-12',
+ 'Pacific/Niue': '<-11>11',
+ 'Pacific/Norfolk': '<+11>-11<+12>,M10.1.0,M4.1.0/3',
+ 'Pacific/Noumea': '<+11>-11',
+ 'Pacific/Pago Pago': 'SST11',
+ 'Pacific/Palau': '<+09>-9',
+ 'Pacific/Pitcairn': '<-08>8',
+ 'Pacific/Pohnpei': '<+11>-11',
+ 'Pacific/Port Moresby': '<+10>-10',
+ 'Pacific/Rarotonga': '<-10>10',
+ 'Pacific/Saipan': 'ChST-10',
+ 'Pacific/Tahiti': '<-10>10',
+ 'Pacific/Tarawa': '<+12>-12',
+ 'Pacific/Tongatapu': '<+13>-13',
+ 'Pacific/Wake': '<+12>-12',
+ 'Pacific/Wallis': '<+12>-12',
+};
LUCI_BASENAME:=compat
LUCI_TITLE:=LuCI compatibility libraries
-LUCI_DEPENDS:=+luci-base
+LUCI_DEPENDS:=+luci-lua-runtime
include ../../luci.mk
--- /dev/null
+#
+# Copyright (C) 2022 Jo-Philipp Wich <jo@mein.io>
+#
+# This is free software, licensed under the Apache License, Version 2.0 .
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=luci-lua-runtime
+
+LUCI_TYPE:=mod
+LUCI_BASENAME:=lua-runtime
+
+LUCI_TITLE:=LuCI Lua runtime libraries
+LUCI_DEPENDS:= \
+ +luci-base \
+ +lua \
+ +luci-lib-base \
+ +luci-lib-nixio \
+ +luci-lib-ip \
+ +luci-lib-jsonc \
+ +libubus-lua \
+ +liblucihttp-lua \
+ +ucode-mod-lua
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
--- /dev/null
+-- Copyright 2008 Steven Barth <steven@midlink.org>
+-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+-- Licensed to the public under the Apache License 2.0.
+
+local config = require "luci.config"
+local ccache = require "luci.ccache"
+
+module "luci.cacheloader"
+
+if config.ccache and config.ccache.enable == "1" then
+ ccache.cache_ondemand()
+end
--- /dev/null
+-- Copyright 2008 Steven Barth <steven@midlink.org>
+-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+-- Licensed to the public under the Apache License 2.0.
+
+local io = require "io"
+local fs = require "nixio.fs"
+local util = require "luci.util"
+local nixio = require "nixio"
+local debug = require "debug"
+local string = require "string"
+local package = require "package"
+
+local type, loadfile = type, loadfile
+
+
+module "luci.ccache"
+
+function cache_ondemand(...)
+ if debug.getinfo(1, 'S').source ~= "=?" then
+ cache_enable(...)
+ end
+end
+
+function cache_enable(cachepath, mode)
+ cachepath = cachepath or "/tmp/luci-modulecache"
+ mode = mode or "r--r--r--"
+
+ local loader = package.loaders[2]
+ local uid = nixio.getuid()
+
+ if not fs.stat(cachepath) then
+ fs.mkdir(cachepath)
+ end
+
+ local function _encode_filename(name)
+ local encoded = ""
+ for i=1, #name do
+ encoded = encoded .. ("%2X" % string.byte(name, i))
+ end
+ return encoded
+ end
+
+ local function _load_sane(file)
+ local stat = fs.stat(file)
+ if stat and stat.uid == uid and stat.modestr == mode then
+ return loadfile(file)
+ end
+ end
+
+ local function _write_sane(file, func)
+ if nixio.getuid() == uid then
+ local fp = io.open(file, "w")
+ if fp then
+ fp:write(util.get_bytecode(func))
+ fp:close()
+ fs.chmod(file, mode)
+ end
+ end
+ end
+
+ package.loaders[2] = function(mod)
+ local encoded = cachepath .. "/" .. _encode_filename(mod)
+ local modcons = _load_sane(encoded)
+
+ if modcons then
+ return modcons
+ end
+
+ -- No cachefile
+ modcons = loader(mod)
+ if type(modcons) == "function" then
+ _write_sane(encoded, modcons)
+ end
+ return modcons
+ end
+end
--- /dev/null
+-- Copyright 2008 Steven Barth <steven@midlink.org>
+-- Licensed to the public under the Apache License 2.0.
+
+local util = require "luci.util"
+module("luci.config",
+ function(m)
+ if pcall(require, "luci.model.uci") then
+ local config = util.threadlocal()
+ setmetatable(m, {
+ __index = function(tbl, key)
+ if not config[key] then
+ config[key] = luci.model.uci.cursor():get_all("luci", key)
+ end
+ return config[key]
+ end
+ })
+ end
+ end)
--- /dev/null
+-- Copyright 2008 Steven Barth <steven@midlink.org>
+-- Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
+-- Licensed to the public under the Apache License 2.0.
+
+module("luci.dispatcher", package.seeall)
+
+local http = _G.L.http
+
+context = setmetatable({
+ request = _G.L.ctx.request_path;
+ requested = _G.L.node;
+ dispatched = _G.L.node;
+}, {
+ __index = function(t, k)
+ if k == "requestpath" then
+ return _G.L.ctx.request_path
+ elseif k == "requestargs" then
+ return _G.L.ctx.request_args
+ else
+ return _G.L.ctx[k]
+ end
+ end
+})
+
+uci = require "luci.model.uci"
+uci:set_session_id(_G.L.ctx.authsession)
+
+i18n = require "luci.i18n"
+i18n.setlanguage(_G.L.dispatcher.lang)
+
+build_url = _G.L.dispatcher.build_url
+menu_json = _G.L.dispatcher.menu_json
+error404 = _G.L.dispatcher.error404
+error500 = _G.L.dispatcher.error500
+
+function is_authenticated(auth)
+ local session = _G.L.dispatcher.is_authenticated(auth)
+ if session then
+ return session.sid, session.data, session.acls
+ end
+end
+
+function assign(path, clone, title, order)
+ local obj = node(unpack(path))
+
+ obj.title = title
+ obj.order = order
+
+ setmetatable(obj, {__index = node(unpack(clone))})
+
+ return obj
+end
+
+function entry(path, target, title, order)
+ local c = node(unpack(path))
+
+ c.title = title
+ c.order = order
+ c.action = target
+
+ return c
+end
+
+-- enabling the node.
+function get(...)
+ return node(...)
+end
+
+function node(...)
+ local p = table.concat({ ... }, "/")
+
+ if not __entries[p] then
+ __entries[p] = {}
+ end
+
+ return __entries[p]
+end
+
+function lookup(...)
+ local i, path = nil, {}
+ for i = 1, select('#', ...) do
+ local name, arg = nil, tostring(select(i, ...))
+ for name in arg:gmatch("[^/]+") do
+ path[#path+1] = name
+ end
+ end
+
+ local node = menu_json()
+ for i = 1, #path do
+ node = node.children[path[i]]
+
+ if not node then
+ return nil
+ elseif node.leaf then
+ break
+ end
+ end
+
+ return node, build_url(unpack(path))
+end
+
+
+function process_lua_controller(path)
+ local base = "/usr/lib/lua/luci/controller/"
+ local modname = "luci.controller." .. path:sub(#base+1, #path-4):gsub("/", ".")
+ local mod = require(modname)
+ assert(mod ~= true,
+ "Invalid controller file found\n" ..
+ "The file '" .. path .. "' contains an invalid module line.\n" ..
+ "Please verify whether the module name is set to '" .. modname ..
+ "' - It must correspond to the file path!")
+
+ local idx = mod.index
+ if type(idx) ~= "function" then
+ return nil
+ end
+
+ local entries = {}
+
+ __entries = entries
+ __controller = modname
+
+ setfenv(idx, setmetatable({}, { __index = luci.dispatcher }))()
+
+ __entries = nil
+ __controller = nil
+
+ -- fixup gathered node specs
+ for path, entry in pairs(entries) do
+ if entry.leaf then
+ entry.wildcard = true
+ end
+
+ if type(entry.file_depends) == "table" then
+ for _, v in ipairs(entry.file_depends) do
+ entry.depends = entry.depends or {}
+ entry.depends.fs = entry.depends.fs or {}
+
+ local ft = fs.stat(v, "type")
+ if ft == "dir" then
+ entry.depends.fs[v] = "directory"
+ elseif v:match("/s?bin/") then
+ entry.depends.fs[v] = "executable"
+ else
+ entry.depends.fs[v] = "file"
+ end
+ end
+ end
+
+ if type(entry.uci_depends) == "table" then
+ for k, v in pairs(entry.uci_depends) do
+ entry.depends = entry.depends or {}
+ entry.depends.uci = entry.depends.uci or {}
+ entry.depends.uci[k] = v
+ end
+ end
+
+ if type(entry.acl_depends) == "table" then
+ for _, acl in ipairs(entry.acl_depends) do
+ entry.depends = entry.depends or {}
+ entry.depends.acl = entry.depends.acl or {}
+ entry.depends.acl[#entry.depends.acl + 1] = acl
+ end
+ end
+
+ if (entry.sysauth_authenticator ~= nil) or
+ (entry.sysauth ~= nil and entry.sysauth ~= false)
+ then
+ if entry.sysauth_authenticator == "htmlauth" then
+ entry.auth = {
+ login = true,
+ methods = { "cookie:sysauth_https", "cookie:sysauth_http" }
+ }
+ elseif subname == "rpc" and entry.module == "luci.controller.rpc" then
+ entry.auth = {
+ login = false,
+ methods = { "query:auth", "cookie:sysauth_https", "cookie:sysauth_http" }
+ }
+ elseif entry.module == "luci.controller.admin.uci" then
+ entry.auth = {
+ login = false,
+ methods = { "param:sid" }
+ }
+ end
+ elseif entry.sysauth == false then
+ entry.auth = {}
+ end
+
+ entry.leaf = nil
+
+ entry.file_depends = nil
+ entry.uci_depends = nil
+ entry.acl_depends = nil
+
+ entry.sysauth = nil
+ entry.sysauth_authenticator = nil
+ end
+
+ return entries
+end
+
+function invoke_cbi_action(model, config, ...)
+ local cbi = require "luci.cbi"
+ local tpl = require "luci.template"
+ local util = require "luci.util"
+
+ if not config then
+ config = {}
+ end
+
+ local maps = cbi.load(model, ...)
+
+ local state = nil
+
+ local function has_uci_access(config, level)
+ local rv = util.ubus("session", "access", {
+ ubus_rpc_session = context.authsession,
+ scope = "uci", object = config,
+ ["function"] = level
+ })
+
+ return (type(rv) == "table" and rv.access == true) or false
+ end
+
+ local i, res
+ for i, res in ipairs(maps) do
+ if util.instanceof(res, cbi.SimpleForm) then
+ io.stderr:write("Model %s returns SimpleForm but is dispatched via cbi(),\n"
+ % model)
+
+ io.stderr:write("please change %s to use the form() action instead.\n"
+ % table.concat(context.request, "/"))
+ end
+
+ res.flow = config
+ local cstate = res:parse()
+ if cstate and (not state or cstate < state) then
+ state = cstate
+ end
+ end
+
+ local function _resolve_path(path)
+ return type(path) == "table" and build_url(unpack(path)) or path
+ end
+
+ if config.on_valid_to and state and state > 0 and state < 2 then
+ http:redirect(_resolve_path(config.on_valid_to))
+ return
+ end
+
+ if config.on_changed_to and state and state > 1 then
+ http:redirect(_resolve_path(config.on_changed_to))
+ return
+ end
+
+ if config.on_success_to and state and state > 0 then
+ http:redirect(_resolve_path(config.on_success_to))
+ return
+ end
+
+ if config.state_handler then
+ if not config.state_handler(state, maps) then
+ return
+ end
+ end
+
+ http:header("X-CBI-State", state or 0)
+
+ if not config.noheader then
+ tpl.render("cbi/header", {state = state})
+ end
+
+ local redirect
+ local messages
+ local applymap = false
+ local pageaction = true
+ local parsechain = { }
+ local writable = false
+
+ for i, res in ipairs(maps) do
+ if res.apply_needed and res.parsechain then
+ local c
+ for _, c in ipairs(res.parsechain) do
+ parsechain[#parsechain+1] = c
+ end
+ applymap = true
+ end
+
+ if res.redirect then
+ redirect = redirect or res.redirect
+ end
+
+ if res.pageaction == false then
+ pageaction = false
+ end
+
+ if res.message then
+ messages = messages or { }
+ messages[#messages+1] = res.message
+ end
+ end
+
+ for i, res in ipairs(maps) do
+ local is_readable_map = has_uci_access(res.config, "read")
+ local is_writable_map = has_uci_access(res.config, "write")
+
+ writable = writable or is_writable_map
+
+ res:render({
+ firstmap = (i == 1),
+ redirect = redirect,
+ messages = messages,
+ pageaction = pageaction,
+ parsechain = parsechain,
+ readable = is_readable_map,
+ writable = is_writable_map
+ })
+ end
+
+ if not config.nofooter then
+ tpl.render("cbi/footer", {
+ flow = config,
+ pageaction = pageaction,
+ redirect = redirect,
+ state = state,
+ autoapply = config.autoapply,
+ trigger_apply = applymap,
+ writable = writable
+ })
+ end
+end
+
+function invoke_form_action(model, ...)
+ local cbi = require "luci.cbi"
+ local tpl = require "luci.template"
+
+ local maps = luci.cbi.load(model, ...)
+ local state = nil
+
+ local i, res
+ for i, res in ipairs(maps) do
+ local cstate = res:parse()
+ if cstate and (not state or cstate < state) then
+ state = cstate
+ end
+ end
+
+ http:header("X-CBI-State", state or 0)
+ tpl.render("header")
+ for i, res in ipairs(maps) do
+ res:render()
+ end
+ tpl.render("footer")
+end
+
+
+function call(name, ...)
+ return {
+ ["type"] = "call",
+ ["module"] = __controller,
+ ["function"] = name,
+ ["parameters"] = select('#', ...) > 0 and {...} or nil
+ }
+end
+
+function post(name, ...)
+ return {
+ ["type"] = "call",
+ ["module"] = __controller,
+ ["function"] = name,
+ ["parameters"] = select('#', ...) > 0 and {...} or nil,
+ ["post"] = true
+ }
+end
+
+function view(name)
+ return {
+ ["type"] = "view",
+ ["path"] = name
+ }
+end
+
+function template(name)
+ return {
+ ["type"] = "template",
+ ["path"] = name
+ }
+end
+
+function cbi(model, config)
+ return {
+ ["type"] = "call",
+ ["module"] = "luci.dispatcher",
+ ["function"] = "invoke_cbi_action",
+ ["parameters"] = { model, config },
+ ["post"] = {
+ ["cbi.submit"] = true
+ }
+ }
+end
+
+function form(model)
+ return {
+ ["type"] = "call",
+ ["module"] = "luci.dispatcher",
+ ["function"] = "invoke_form_action",
+ ["parameters"] = { model },
+ ["post"] = {
+ ["cbi.submit"] = true
+ }
+ }
+end
+
+function firstchild()
+ return {
+ ["type"] = "firstchild"
+ }
+end
+
+function firstnode()
+ return {
+ ["type"] = "firstchild",
+ ["recurse"] = true
+ }
+end
+
+function arcombine(trg1, trg2)
+ return {
+ ["type"] = "arcombine",
+ ["targets"] = { trg1, trg2 } --,
+ --env = getfenv(),
+ }
+end
+
+function alias(...)
+ return {
+ ["type"] = "alias",
+ ["path"] = table.concat({ ... }, "/")
+ }
+end
+
+function rewrite(n, ...)
+ return {
+ ["type"] = "rewrite",
+ ["path"] = table.concat({ ... }, "/"),
+ ["remove"] = n
+ }
+end
+
+
+translate = i18n.translate
+
+-- This function does not actually translate the given argument but
+-- is used by build/i18n-scan.pl to find translatable entries.
+function _(text)
+ return text
+end
--- /dev/null
+-- Copyright 2008 Steven Barth <steven@midlink.org>
+-- Licensed to the public under the Apache License 2.0.
+
+local tparser = require "luci.template.parser"
+local util = require "luci.util"
+local tostring = tostring
+
+module "luci.i18n"
+
+i18ndir = util.libpath() .. "/i18n/"
+context = util.threadlocal()
+default = "en"
+
+
+function setlanguage(lang)
+ local code, subcode = lang:match("^([A-Za-z][A-Za-z])[%-_]([A-Za-z][A-Za-z])$")
+ if not (code and subcode) then
+ subcode = lang:match("^([A-Za-z][A-Za-z])$")
+ if not subcode then
+ return nil
+ end
+ end
+
+ context.parent = code and code:lower()
+ context.lang = context.parent and context.parent.."-"..subcode:lower() or subcode:lower()
+
+ if tparser.load_catalog(context.lang, i18ndir) and
+ tparser.change_catalog(context.lang)
+ then
+ return context.lang
+
+ elseif context.parent then
+ if tparser.load_catalog(context.parent, i18ndir) and
+ tparser.change_catalog(context.parent)
+ then
+ return context.parent
+ end
+ end
+
+ return nil
+end
+
+function translate(key)
+ return tparser.translate(key) or key
+end
+
+function translatef(key, ...)
+ return tostring(translate(key)):format(...)
+end
+
+function dump()
+ local rv = {}
+ tparser.get_translations(function(k, v) rv[k] = v end)
+ return rv
+end
--- /dev/null
+---[[
+LuCI translation library.
+]]
+module "luci.i18n"
+
+---[[
+Set the context default translation language.
+
+@class function
+@name setlanguage
+@param lang An IETF/BCP 47 language tag or ISO3166 country code, e.g. "en-US" or "de"
+@return The effective loaded language, e.g. "en" for "en-US" - or nil on failure
+]]
+
+---[[
+Return the translated value for a specific translation key.
+
+@class function
+@name translate
+@param key Default translation text
+@return Translated string
+]]
+
+---[[
+Return the translated value for a specific translation key and use it as sprintf pattern.
+
+@class function
+@name translatef
+@param key Default translation text
+@param ... Format parameters
+@return Translated and formatted string
+]]
+
+---[[
+Return all currently loaded translation strings as a key-value table. The key is the
+hexadecimal representation of the translation key while the value is the translated
+text content.
+
+@class function
+@name dump
+@return Key-value translation string table.
+]]
--- /dev/null
+-- Copyright 2008 Steven Barth <steven@midlink.org>
+-- Licensed to the public under the Apache License 2.0.
+
+local os = require "os"
+local util = require "luci.util"
+local table = require "table"
+
+
+local setmetatable, rawget, rawset = setmetatable, rawget, rawset
+local require, getmetatable, assert = require, getmetatable, assert
+local error, pairs, ipairs, select = error, pairs, ipairs, select
+local type, tostring, tonumber, unpack = type, tostring, tonumber, unpack
+
+-- The typical workflow for UCI is: Get a cursor instance from the
+-- cursor factory, modify data (via Cursor.add, Cursor.delete, etc.),
+-- save the changes to the staging area via Cursor.save and finally
+-- Cursor.commit the data to the actual config files.
+-- LuCI then needs to Cursor.apply the changes so daemons etc. are
+-- reloaded.
+module "luci.model.uci"
+
+local ERRSTR = {
+ "Invalid command",
+ "Invalid argument",
+ "Method not found",
+ "Entry not found",
+ "No data",
+ "Permission denied",
+ "Timeout",
+ "Not supported",
+ "Unknown error",
+ "Connection failed"
+}
+
+local session_id = nil
+
+local function call(cmd, args)
+ if type(args) == "table" and session_id then
+ args.ubus_rpc_session = session_id
+ end
+ return util.ubus("uci", cmd, args)
+end
+
+
+function cursor()
+ return _M
+end
+
+function cursor_state()
+ return _M
+end
+
+function substate(self)
+ return self
+end
+
+
+function get_confdir(self)
+ return "/etc/config"
+end
+
+function get_savedir(self)
+ return "/tmp/.uci"
+end
+
+function get_session_id(self)
+ return session_id
+end
+
+function set_confdir(self, directory)
+ return false
+end
+
+function set_savedir(self, directory)
+ return false
+end
+
+function set_session_id(self, id)
+ session_id = id
+ return true
+end
+
+
+function load(self, config)
+ return true
+end
+
+function save(self, config)
+ return true
+end
+
+function unload(self, config)
+ return true
+end
+
+
+function changes(self, config)
+ local rv, err = call("changes", { config = config })
+
+ if type(rv) == "table" and type(rv.changes) == "table" then
+ return rv.changes
+ elseif err then
+ return nil, ERRSTR[err]
+ else
+ return { }
+ end
+end
+
+
+function revert(self, config)
+ local _, err = call("revert", { config = config })
+ return (err == nil), ERRSTR[err]
+end
+
+function commit(self, config)
+ local _, err = call("commit", { config = config })
+ return (err == nil), ERRSTR[err]
+end
+
+function apply(self, rollback)
+ local _, err
+
+ if rollback then
+ local sys = require "luci.sys"
+ local conf = require "luci.config"
+ local timeout = tonumber(conf and conf.apply and conf.apply.rollback or 90) or 0
+
+ _, err = call("apply", {
+ timeout = (timeout > 90) and timeout or 90,
+ rollback = true
+ })
+
+ if not err then
+ local now = os.time()
+ local token = sys.uniqueid(16)
+
+ util.ubus("session", "set", {
+ ubus_rpc_session = "00000000000000000000000000000000",
+ values = {
+ rollback = {
+ token = token,
+ session = session_id,
+ timeout = now + timeout
+ }
+ }
+ })
+
+ return token
+ end
+ else
+ _, err = call("changes", {})
+
+ if not err then
+ if type(_) == "table" and type(_.changes) == "table" then
+ local k, v
+ for k, v in pairs(_.changes) do
+ _, err = call("commit", { config = k })
+ if err then
+ break
+ end
+ end
+ end
+ end
+
+ if not err then
+ _, err = call("apply", { rollback = false })
+ end
+ end
+
+ return (err == nil), ERRSTR[err]
+end
+
+function confirm(self, token)
+ local is_pending, time_remaining, rollback_sid, rollback_token = self:rollback_pending()
+
+ if is_pending then
+ if token ~= rollback_token then
+ return false, "Permission denied"
+ end
+
+ local _, err = util.ubus("uci", "confirm", {
+ ubus_rpc_session = rollback_sid
+ })
+
+ if not err then
+ util.ubus("session", "set", {
+ ubus_rpc_session = "00000000000000000000000000000000",
+ values = { rollback = {} }
+ })
+ end
+
+ return (err == nil), ERRSTR[err]
+ end
+
+ return false, "No data"
+end
+
+function rollback(self)
+ local is_pending, time_remaining, rollback_sid = self:rollback_pending()
+
+ if is_pending then
+ local _, err = util.ubus("uci", "rollback", {
+ ubus_rpc_session = rollback_sid
+ })
+
+ if not err then
+ util.ubus("session", "set", {
+ ubus_rpc_session = "00000000000000000000000000000000",
+ values = { rollback = {} }
+ })
+ end
+
+ return (err == nil), ERRSTR[err]
+ end
+
+ return false, "No data"
+end
+
+function rollback_pending(self)
+ local rv, err = util.ubus("session", "get", {
+ ubus_rpc_session = "00000000000000000000000000000000",
+ keys = { "rollback" }
+ })
+
+ local now = os.time()
+
+ if type(rv) == "table" and
+ type(rv.values) == "table" and
+ type(rv.values.rollback) == "table" and
+ type(rv.values.rollback.token) == "string" and
+ type(rv.values.rollback.session) == "string" and
+ type(rv.values.rollback.timeout) == "number" and
+ rv.values.rollback.timeout > now
+ then
+ return true,
+ rv.values.rollback.timeout - now,
+ rv.values.rollback.session,
+ rv.values.rollback.token
+ end
+
+ return false, ERRSTR[err]
+end
+
+
+function foreach(self, config, stype, callback)
+ if type(callback) == "function" then
+ local rv, err = call("get", {
+ config = config,
+ type = stype
+ })
+
+ if type(rv) == "table" and type(rv.values) == "table" then
+ local sections = { }
+ local res = false
+ local index = 1
+
+ local _, section
+ for _, section in pairs(rv.values) do
+ section[".index"] = section[".index"] or index
+ sections[index] = section
+ index = index + 1
+ end
+
+ table.sort(sections, function(a, b)
+ return a[".index"] < b[".index"]
+ end)
+
+ for _, section in ipairs(sections) do
+ local continue = callback(section)
+ res = true
+ if continue == false then
+ break
+ end
+ end
+ return res
+ else
+ return false, ERRSTR[err] or "No data"
+ end
+ else
+ return false, "Invalid argument"
+ end
+end
+
+local function _get(self, operation, config, section, option)
+ if section == nil then
+ return nil
+ elseif type(option) == "string" and option:byte(1) ~= 46 then
+ local rv, err = call(operation, {
+ config = config,
+ section = section,
+ option = option
+ })
+
+ if type(rv) == "table" then
+ return rv.value or nil
+ elseif err then
+ return false, ERRSTR[err]
+ else
+ return nil
+ end
+ elseif option == nil then
+ local values = self:get_all(config, section)
+ if values then
+ return values[".type"], values[".name"]
+ else
+ return nil
+ end
+ else
+ return false, "Invalid argument"
+ end
+end
+
+function get(self, ...)
+ return _get(self, "get", ...)
+end
+
+function get_state(self, ...)
+ return _get(self, "state", ...)
+end
+
+function get_all(self, config, section)
+ local rv, err = call("get", {
+ config = config,
+ section = section
+ })
+
+ if type(rv) == "table" and type(rv.values) == "table" then
+ return rv.values
+ elseif err then
+ return false, ERRSTR[err]
+ else
+ return nil
+ end
+end
+
+function get_bool(self, ...)
+ local val = self:get(...)
+ return (val == "1" or val == "true" or val == "yes" or val == "on")
+end
+
+function get_first(self, config, stype, option, default)
+ local rv = default
+
+ self:foreach(config, stype, function(s)
+ local val = not option and s[".name"] or s[option]
+
+ if type(default) == "number" then
+ val = tonumber(val)
+ elseif type(default) == "boolean" then
+ val = (val == "1" or val == "true" or
+ val == "yes" or val == "on")
+ end
+
+ if val ~= nil then
+ rv = val
+ return false
+ end
+ end)
+
+ return rv
+end
+
+function get_list(self, config, section, option)
+ if config and section and option then
+ local val = self:get(config, section, option)
+ return (type(val) == "table" and val or { val })
+ end
+ return { }
+end
+
+
+function section(self, config, stype, name, values)
+ local rv, err = call("add", {
+ config = config,
+ type = stype,
+ name = name,
+ values = values
+ })
+
+ if type(rv) == "table" then
+ return rv.section
+ elseif err then
+ return false, ERRSTR[err]
+ else
+ return nil
+ end
+end
+
+
+function add(self, config, stype)
+ return self:section(config, stype)
+end
+
+function set(self, config, section, option, ...)
+ if select('#', ...) == 0 then
+ local sname, err = self:section(config, option, section)
+ return (not not sname), err
+ else
+ local _, err = call("set", {
+ config = config,
+ section = section,
+ values = { [option] = select(1, ...) }
+ })
+ return (err == nil), ERRSTR[err]
+ end
+end
+
+function set_list(self, config, section, option, value)
+ if section == nil or option == nil then
+ return false
+ elseif value == nil or (type(value) == "table" and #value == 0) then
+ return self:delete(config, section, option)
+ elseif type(value) == "table" then
+ return self:set(config, section, option, value)
+ else
+ return self:set(config, section, option, { value })
+ end
+end
+
+function tset(self, config, section, values)
+ local _, err = call("set", {
+ config = config,
+ section = section,
+ values = values
+ })
+ return (err == nil), ERRSTR[err]
+end
+
+function reorder(self, config, section, index)
+ local sections
+
+ if type(section) == "string" and type(index) == "number" then
+ local pos = 0
+
+ sections = { }
+
+ self:foreach(config, nil, function(s)
+ if pos == index then
+ pos = pos + 1
+ end
+
+ if s[".name"] ~= section then
+ pos = pos + 1
+ sections[pos] = s[".name"]
+ else
+ sections[index + 1] = section
+ end
+ end)
+ elseif type(section) == "table" then
+ sections = section
+ else
+ return false, "Invalid argument"
+ end
+
+ local _, err = call("order", {
+ config = config,
+ sections = sections
+ })
+
+ return (err == nil), ERRSTR[err]
+end
+
+
+function delete(self, config, section, option)
+ local _, err = call("delete", {
+ config = config,
+ section = section,
+ option = option
+ })
+ return (err == nil), ERRSTR[err]
+end
+
+function delete_all(self, config, stype, comparator)
+ local _, err
+ if type(comparator) == "table" then
+ _, err = call("delete", {
+ config = config,
+ type = stype,
+ match = comparator
+ })
+ elseif type(comparator) == "function" then
+ local rv = call("get", {
+ config = config,
+ type = stype
+ })
+
+ if type(rv) == "table" and type(rv.values) == "table" then
+ local sname, section
+ for sname, section in pairs(rv.values) do
+ if comparator(section) then
+ _, err = call("delete", {
+ config = config,
+ section = sname
+ })
+ end
+ end
+ end
+ elseif comparator == nil then
+ _, err = call("delete", {
+ config = config,
+ type = stype
+ })
+ else
+ return false, "Invalid argument"
+ end
+
+ return (err == nil), ERRSTR[err]
+end
--- /dev/null
+---[[
+LuCI UCI model library.
+
+The typical workflow for UCI is: Get a cursor instance from the
+cursor factory, modify data (via Cursor.add, Cursor.delete, etc.),
+save the changes to the staging area via Cursor.save and finally
+Cursor.commit the data to the actual config files.
+LuCI then needs to Cursor.apply the changes so daemons etc. are
+reloaded.
+@cstyle instance
+]]
+module "luci.model.uci"
+
+---[[
+Create a new UCI-Cursor.
+
+@class function
+@name cursor
+@return UCI-Cursor
+]]
+
+---[[
+Create a new Cursor initialized to the state directory.
+
+@class function
+@name cursor_state
+@return UCI cursor
+]]
+
+---[[
+Applies UCI configuration changes.
+
+If the rollback parameter is set to true, the apply function will invoke the
+rollback mechanism which causes the configuration to be automatically reverted
+if no confirm() call occurs within a certain timeout.
+
+The current default timeout is 30s and can be increased using the
+"luci.apply.timeout" uci configuration key.
+
+@class function
+@name Cursor.apply
+@param rollback Enable rollback mechanism
+@return Boolean whether operation succeeded
+]]
+
+---[[
+Confirms UCI apply process.
+
+If a previous UCI apply with rollback has been invoked using apply(true),
+this function confirms the process and cancels the pending rollback timer.
+
+If no apply with rollback session is active, the function has no effect and
+returns with a "No data" error.
+
+@class function
+@name Cursor.confirm
+@return Boolean whether operation succeeded
+]]
+
+---[[
+Cancels UCI apply process.
+
+If a previous UCI apply with rollback has been invoked using apply(true),
+this function cancels the process and rolls back the configuration to the
+pre-apply state.
+
+If no apply with rollback session is active, the function has no effect and
+returns with a "No data" error.
+
+@class function
+@name Cursor.rollback
+@return Boolean whether operation succeeded
+]]
+
+---[[
+Checks whether a pending rollback is scheduled.
+
+If a previous UCI apply with rollback has been invoked using apply(true),
+and has not been confirmed or rolled back yet, this function returns true
+and the remaining time until rollback in seconds. If no rollback is pending,
+the function returns false. On error, the function returns false and an
+additional string describing the error.
+
+@class function
+@name Cursor.rollback_pending
+@return Boolean whether rollback is pending
+@return Remaining time in seconds
+]]
+
+---[[
+Delete all sections of a given type that match certain criteria.
+
+@class function
+@name Cursor.delete_all
+@param config UCI config
+@param type UCI section type
+@param comparator Function that will be called for each section and returns
+ a boolean whether to delete the current section (optional)
+]]
+
+---[[
+Create a new section and initialize it with data.
+
+@class function
+@name Cursor.section
+@param config UCI config
+@param type UCI section type
+@param name UCI section name (optional)
+@param values Table of key - value pairs to initialize the section with
+@return Name of created section
+]]
+
+---[[
+Updated the data of a section using data from a table.
+
+@class function
+@name Cursor.tset
+@param config UCI config
+@param section UCI section name (optional)
+@param values Table of key - value pairs to update the section with
+]]
+
+---[[
+Get a boolean option and return it's value as true or false.
+
+@class function
+@name Cursor.get_bool
+@param config UCI config
+@param section UCI section name
+@param option UCI option
+@return Boolean
+]]
+
+---[[
+Get an option or list and return values as table.
+
+@class function
+@name Cursor.get_list
+@param config UCI config
+@param section UCI section name
+@param option UCI option
+@return table. If the option was not found, you will simply get an empty
+ table.
+]]
+
+---[[
+Get the given option from the first section with the given type.
+
+@class function
+@name Cursor.get_first
+@param config UCI config
+@param type UCI section type
+@param option UCI option (optional)
+@param default Default value (optional)
+@return UCI value
+]]
+
+---[[
+Set given values as list. Setting a list option to an empty list
+has the same effect as deleting the option.
+
+@class function
+@name Cursor.set_list
+@param config UCI config
+@param section UCI section name
+@param option UCI option
+@param value Value or table. Non-table values will be set as single
+ item UCI list.
+@return Boolean whether operation succeeded
+]]
+
+---[[
+Create a sub-state of this cursor.
+
+The sub-state is tied to the parent cursor, means it the parent unloads or
+loads configs, the sub state will do so as well.
+
+@class function
+@name Cursor.substate
+@return UCI state cursor tied to the parent cursor
+]]
+
+---[[
+Add an anonymous section.
+
+@class function
+@name Cursor.add
+@param config UCI config
+@param type UCI section type
+@return Name of created section
+]]
+
+---[[
+Get a table of saved but uncommitted changes.
+
+@class function
+@name Cursor.changes
+@param config UCI config
+@return Table of changes
+@see Cursor.save
+]]
+
+---[[
+Commit saved changes.
+
+@class function
+@name Cursor.commit
+@param config UCI config
+@return Boolean whether operation succeeded
+@see Cursor.revert
+@see Cursor.save
+]]
+
+---[[
+Deletes a section or an option.
+
+@class function
+@name Cursor.delete
+@param config UCI config
+@param section UCI section name
+@param option UCI option (optional)
+@return Boolean whether operation succeeded
+]]
+
+---[[
+Call a function for every section of a certain type.
+
+@class function
+@name Cursor.foreach
+@param config UCI config
+@param type UCI section type
+@param callback Function to be called
+@return Boolean whether operation succeeded
+]]
+
+---[[
+Get a section type or an option
+
+@class function
+@name Cursor.get
+@param config UCI config
+@param section UCI section name
+@param option UCI option (optional)
+@return UCI value
+]]
+
+---[[
+Get all sections of a config or all values of a section.
+
+@class function
+@name Cursor.get_all
+@param config UCI config
+@param section UCI section name (optional)
+@return Table of UCI sections or table of UCI values
+]]
+
+---[[
+Manually load a config.
+
+@class function
+@name Cursor.load
+@param config UCI config
+@return Boolean whether operation succeeded
+@see Cursor.save
+@see Cursor.unload
+]]
+
+---[[
+Revert saved but uncommitted changes.
+
+@class function
+@name Cursor.revert
+@param config UCI config
+@return Boolean whether operation succeeded
+@see Cursor.commit
+@see Cursor.save
+]]
+
+---[[
+Saves changes made to a config to make them committable.
+
+@class function
+@name Cursor.save
+@param config UCI config
+@return Boolean whether operation succeeded
+@see Cursor.load
+@see Cursor.unload
+]]
+
+---[[
+Set a value or create a named section.
+
+When invoked with three arguments `config`, `sectionname`, `sectiontype`,
+then a named section of the given type is created.
+
+When invoked with four arguments `config`, `sectionname`, `optionname` and
+`optionvalue` then the value of the specified option is set to the given value.
+
+@class function
+@name Cursor.set
+@param config UCI config
+@param section UCI section name
+@param option UCI option or UCI section type
+@param value UCI value or nothing if you want to create a section
+@return Boolean whether operation succeeded
+]]
+
+---[[
+Get the configuration directory.
+
+@class function
+@name Cursor.get_confdir
+@return Configuration directory
+]]
+
+---[[
+Get the directory for uncomitted changes.
+
+@class function
+@name Cursor.get_savedir
+@return Save directory
+]]
+
+---[[
+Get the effective session ID.
+
+@class function
+@name Cursor.get_session_id
+@return String containing the session ID
+]]
+
+---[[
+Set the configuration directory.
+
+@class function
+@name Cursor.set_confdir
+@param directory UCI configuration directory
+@return Boolean whether operation succeeded
+]]
+
+---[[
+Set the directory for uncommitted changes.
+
+@class function
+@name Cursor.set_savedir
+@param directory UCI changes directory
+@return Boolean whether operation succeeded
+]]
+
+---[[
+Set the effective session ID.
+
+@class function
+@name Cursor.set_session_id
+@param id String containing the session ID to set
+@return Boolean whether operation succeeded
+]]
+
+---[[
+Discard changes made to a config.
+
+@class function
+@name Cursor.unload
+@param config UCI config
+@return Boolean whether operation succeeded
+@see Cursor.load
+@see Cursor.save
+]]
+
--- /dev/null
+-- Copyright 2009 Steven Barth <steven@midlink.org>
+-- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
+-- Licensed to the public under the Apache License 2.0.
+
+local util = require "luci.util"
+module("luci.store", util.threadlocal)
--- /dev/null
+-- Copyright 2008 Steven Barth <steven@midlink.org>
+-- Licensed to the public under the Apache License 2.0.
+
+local io = require "io"
+local os = require "os"
+local table = require "table"
+local nixio = require "nixio"
+local fs = require "nixio.fs"
+local uci = require "luci.model.uci"
+
+local luci = {}
+luci.util = require "luci.util"
+luci.ip = require "luci.ip"
+
+local tonumber, ipairs, pairs, pcall, type, next, setmetatable, require, select, unpack =
+ tonumber, ipairs, pairs, pcall, type, next, setmetatable, require, select, unpack
+
+
+module "luci.sys"
+
+function call(...)
+ return os.execute(...) / 256
+end
+
+exec = luci.util.exec
+
+-- containing the whole environment is returned otherwise this function returns
+-- the corresponding string value for the given name or nil if no such variable
+-- exists.
+getenv = nixio.getenv
+
+function hostname(newname)
+ if type(newname) == "string" and #newname > 0 then
+ fs.writefile( "/proc/sys/kernel/hostname", newname )
+ return newname
+ else
+ return nixio.uname().nodename
+ end
+end
+
+function httpget(url, stream, target)
+ if not target then
+ local source = stream and io.popen or luci.util.exec
+ return source("wget -qO- %s" % luci.util.shellquote(url))
+ else
+ return os.execute("wget -qO %s %s" %
+ {luci.util.shellquote(target), luci.util.shellquote(url)})
+ end
+end
+
+function reboot()
+ return os.execute("reboot >/dev/null 2>&1")
+end
+
+function syslog()
+ return luci.util.exec("logread")
+end
+
+function dmesg()
+ return luci.util.exec("dmesg")
+end
+
+function uniqueid(bytes)
+ local rand = fs.readfile("/dev/urandom", bytes)
+ return rand and nixio.bin.hexlify(rand)
+end
+
+function uptime()
+ return nixio.sysinfo().uptime
+end
+
+
+net = {}
+
+local function _nethints(what, callback)
+ local _, k, e, mac, ip, name, duid, iaid
+ local cur = uci.cursor()
+ local ifn = { }
+ local hosts = { }
+ local lookup = { }
+
+ local function _add(i, ...)
+ local k = select(i, ...)
+ if k then
+ if not hosts[k] then hosts[k] = { } end
+ hosts[k][1] = select(1, ...) or hosts[k][1]
+ hosts[k][2] = select(2, ...) or hosts[k][2]
+ hosts[k][3] = select(3, ...) or hosts[k][3]
+ hosts[k][4] = select(4, ...) or hosts[k][4]
+ end
+ end
+
+ luci.ip.neighbors(nil, function(neigh)
+ if neigh.mac and neigh.family == 4 then
+ _add(what, neigh.mac:string(), neigh.dest:string(), nil, nil)
+ elseif neigh.mac and neigh.family == 6 then
+ _add(what, neigh.mac:string(), nil, neigh.dest:string(), nil)
+ end
+ end)
+
+ if fs.access("/etc/ethers") then
+ for e in io.lines("/etc/ethers") do
+ mac, name = e:match("^([a-fA-F0-9:-]+)%s+(%S+)")
+ mac = luci.ip.checkmac(mac)
+ if mac and name then
+ if luci.ip.checkip4(name) then
+ _add(what, mac, name, nil, nil)
+ else
+ _add(what, mac, nil, nil, name)
+ end
+ end
+ end
+ end
+
+ cur:foreach("dhcp", "dnsmasq",
+ function(s)
+ if s.leasefile and fs.access(s.leasefile) then
+ for e in io.lines(s.leasefile) do
+ mac, ip, name = e:match("^%d+ (%S+) (%S+) (%S+)")
+ mac = luci.ip.checkmac(mac)
+ if mac and ip then
+ _add(what, mac, ip, nil, name ~= "*" and name)
+ end
+ end
+ end
+ end
+ )
+
+ cur:foreach("dhcp", "odhcpd",
+ function(s)
+ if type(s.leasefile) == "string" and fs.access(s.leasefile) then
+ for e in io.lines(s.leasefile) do
+ duid, iaid, name, _, ip = e:match("^# %S+ (%S+) (%S+) (%S+) (-?%d+) %S+ %S+ ([0-9a-f:.]+)/[0-9]+")
+ mac = net.duid_to_mac(duid)
+ if mac then
+ if ip and iaid == "ipv4" then
+ _add(what, mac, ip, nil, name ~= "*" and name)
+ elseif ip then
+ _add(what, mac, nil, ip, name ~= "*" and name)
+ end
+ end
+ end
+ end
+ end
+ )
+
+ cur:foreach("dhcp", "host",
+ function(s)
+ for mac in luci.util.imatch(s.mac) do
+ mac = luci.ip.checkmac(mac)
+ if mac then
+ _add(what, mac, s.ip, nil, s.name)
+ end
+ end
+ end)
+
+ for _, e in ipairs(nixio.getifaddrs()) do
+ if e.name ~= "lo" then
+ ifn[e.name] = ifn[e.name] or { }
+ if e.family == "packet" and e.addr and #e.addr == 17 then
+ ifn[e.name][1] = e.addr:upper()
+ elseif e.family == "inet" then
+ ifn[e.name][2] = e.addr
+ elseif e.family == "inet6" then
+ ifn[e.name][3] = e.addr
+ end
+ end
+ end
+
+ for _, e in pairs(ifn) do
+ if e[what] and (e[2] or e[3]) then
+ _add(what, e[1], e[2], e[3], e[4])
+ end
+ end
+
+ for _, e in pairs(hosts) do
+ lookup[#lookup+1] = (what > 1) and e[what] or (e[2] or e[3])
+ end
+
+ if #lookup > 0 then
+ lookup = luci.util.ubus("network.rrdns", "lookup", {
+ addrs = lookup,
+ timeout = 250,
+ limit = 1000
+ }) or { }
+ end
+
+ for _, e in luci.util.kspairs(hosts) do
+ callback(e[1], e[2], e[3], lookup[e[2]] or lookup[e[3]] or e[4])
+ end
+end
+
+-- Each entry contains the values in the following order:
+-- [ "mac", "name" ]
+function net.mac_hints(callback)
+ if callback then
+ _nethints(1, function(mac, v4, v6, name)
+ name = name or v4
+ if name and name ~= mac then
+ callback(mac, name or v4)
+ end
+ end)
+ else
+ local rv = { }
+ _nethints(1, function(mac, v4, v6, name)
+ name = name or v4
+ if name and name ~= mac then
+ rv[#rv+1] = { mac, name or v4 }
+ end
+ end)
+ return rv
+ end
+end
+
+-- Each entry contains the values in the following order:
+-- [ "ip", "name" ]
+function net.ipv4_hints(callback)
+ if callback then
+ _nethints(2, function(mac, v4, v6, name)
+ name = name or mac
+ if name and name ~= v4 then
+ callback(v4, name)
+ end
+ end)
+ else
+ local rv = { }
+ _nethints(2, function(mac, v4, v6, name)
+ name = name or mac
+ if name and name ~= v4 then
+ rv[#rv+1] = { v4, name }
+ end
+ end)
+ return rv
+ end
+end
+
+-- Each entry contains the values in the following order:
+-- [ "ip", "name" ]
+function net.ipv6_hints(callback)
+ if callback then
+ _nethints(3, function(mac, v4, v6, name)
+ name = name or mac
+ if name and name ~= v6 then
+ callback(v6, name)
+ end
+ end)
+ else
+ local rv = { }
+ _nethints(3, function(mac, v4, v6, name)
+ name = name or mac
+ if name and name ~= v6 then
+ rv[#rv+1] = { v6, name }
+ end
+ end)
+ return rv
+ end
+end
+
+function net.host_hints(callback)
+ if callback then
+ _nethints(1, function(mac, v4, v6, name)
+ if mac and mac ~= "00:00:00:00:00:00" and (v4 or v6 or name) then
+ callback(mac, v4, v6, name)
+ end
+ end)
+ else
+ local rv = { }
+ _nethints(1, function(mac, v4, v6, name)
+ if mac and mac ~= "00:00:00:00:00:00" and (v4 or v6 or name) then
+ local e = { }
+ if v4 then e.ipv4 = v4 end
+ if v6 then e.ipv6 = v6 end
+ if name then e.name = name end
+ rv[mac] = e
+ end
+ end)
+ return rv
+ end
+end
+
+function net.conntrack(callback)
+ local ok, nfct = pcall(io.lines, "/proc/net/nf_conntrack")
+ if not ok or not nfct then
+ return nil
+ end
+
+ local line, connt = nil, (not callback) and { }
+ for line in nfct do
+ local fam, l3, l4, rest =
+ line:match("^(ipv[46]) +(%d+) +%S+ +(%d+) +(.+)$")
+
+ local timeout, tuples = rest:match("^(%d+) +(.+)$")
+
+ if not tuples then
+ tuples = rest
+ end
+
+ if fam and l3 and l4 and not tuples:match("^TIME_WAIT ") then
+ l4 = nixio.getprotobynumber(l4)
+
+ local entry = {
+ bytes = 0,
+ packets = 0,
+ layer3 = fam,
+ layer4 = l4 and l4.name or "unknown",
+ timeout = tonumber(timeout, 10)
+ }
+
+ local key, val
+ for key, val in tuples:gmatch("(%w+)=(%S+)") do
+ if key == "bytes" or key == "packets" then
+ entry[key] = entry[key] + tonumber(val, 10)
+ elseif key == "src" or key == "dst" then
+ if entry[key] == nil then
+ entry[key] = luci.ip.new(val):string()
+ end
+ elseif key == "sport" or key == "dport" then
+ if entry[key] == nil then
+ entry[key] = val
+ end
+ elseif val then
+ entry[key] = val
+ end
+ end
+
+ if callback then
+ callback(entry)
+ else
+ connt[#connt+1] = entry
+ end
+ end
+ end
+
+ return callback and true or connt
+end
+
+function net.devices()
+ local devs = {}
+ local seen = {}
+ for k, v in ipairs(nixio.getifaddrs()) do
+ if v.name and not seen[v.name] then
+ seen[v.name] = true
+ devs[#devs+1] = v.name
+ end
+ end
+ return devs
+end
+
+function net.duid_to_mac(duid)
+ local b1, b2, b3, b4, b5, b6
+
+ if type(duid) == "string" then
+ -- DUID-LLT / Ethernet
+ if #duid == 28 then
+ b1, b2, b3, b4, b5, b6 = duid:match("^00010001(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)%x%x%x%x%x%x%x%x$")
+
+ -- DUID-LL / Ethernet
+ elseif #duid == 20 then
+ b1, b2, b3, b4, b5, b6 = duid:match("^00030001(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)$")
+
+ -- DUID-LL / Ethernet (Without Header)
+ elseif #duid == 12 then
+ b1, b2, b3, b4, b5, b6 = duid:match("^(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)$")
+ end
+ end
+
+ return b1 and luci.ip.checkmac(table.concat({ b1, b2, b3, b4, b5, b6 }, ":"))
+end
+
+process = {}
+
+function process.info(key)
+ local s = {uid = nixio.getuid(), gid = nixio.getgid()}
+ return not key and s or s[key]
+end
+
+function process.list()
+ local data = {}
+ local k
+ local ps = luci.util.execi("/bin/busybox top -bn1")
+
+ if not ps then
+ return
+ end
+
+ for line in ps do
+ local pid, ppid, user, stat, vsz, mem, cpu, cmd = line:match(
+ "^ *(%d+) +(%d+) +(%S.-%S) +([RSDZTW][<NW ][<N ]) +(%d+m?) +(%d+%%) +(%d+%%) +(.+)"
+ )
+
+ local idx = tonumber(pid)
+ if idx and not cmd:match("top %-bn1") then
+ data[idx] = {
+ ['PID'] = pid,
+ ['PPID'] = ppid,
+ ['USER'] = user,
+ ['STAT'] = stat,
+ ['VSZ'] = vsz,
+ ['%MEM'] = mem,
+ ['%CPU'] = cpu,
+ ['COMMAND'] = cmd
+ }
+ end
+ end
+
+ return data
+end
+
+function process.setgroup(gid)
+ return nixio.setgid(gid)
+end
+
+function process.setuser(uid)
+ return nixio.setuid(uid)
+end
+
+process.signal = nixio.kill
+
+local function xclose(fd)
+ if fd and fd:fileno() > 2 then
+ fd:close()
+ end
+end
+
+function process.exec(command, stdout, stderr, nowait)
+ local out_r, out_w, err_r, err_w
+ if stdout then out_r, out_w = nixio.pipe() end
+ if stderr then err_r, err_w = nixio.pipe() end
+
+ local pid = nixio.fork()
+ if pid == 0 then
+ nixio.chdir("/")
+
+ local null = nixio.open("/dev/null", "w+")
+ if null then
+ nixio.dup(out_w or null, nixio.stdout)
+ nixio.dup(err_w or null, nixio.stderr)
+ nixio.dup(null, nixio.stdin)
+ xclose(out_w)
+ xclose(out_r)
+ xclose(err_w)
+ xclose(err_r)
+ xclose(null)
+ end
+
+ nixio.exec(unpack(command))
+ os.exit(-1)
+ end
+
+ local _, pfds, rv = nil, {}, { code = -1, pid = pid }
+
+ xclose(out_w)
+ xclose(err_w)
+
+ if out_r then
+ pfds[#pfds+1] = {
+ fd = out_r,
+ cb = type(stdout) == "function" and stdout,
+ name = "stdout",
+ events = nixio.poll_flags("in", "err", "hup")
+ }
+ end
+
+ if err_r then
+ pfds[#pfds+1] = {
+ fd = err_r,
+ cb = type(stderr) == "function" and stderr,
+ name = "stderr",
+ events = nixio.poll_flags("in", "err", "hup")
+ }
+ end
+
+ while #pfds > 0 do
+ local nfds, err = nixio.poll(pfds, -1)
+ if not nfds and err ~= nixio.const.EINTR then
+ break
+ end
+
+ local i
+ for i = #pfds, 1, -1 do
+ local rfd = pfds[i]
+ if rfd.revents > 0 then
+ local chunk, err = rfd.fd:read(4096)
+ if chunk and #chunk > 0 then
+ if rfd.cb then
+ rfd.cb(chunk)
+ else
+ rfd.buf = rfd.buf or {}
+ rfd.buf[#rfd.buf + 1] = chunk
+ end
+ else
+ table.remove(pfds, i)
+ if rfd.buf then
+ rv[rfd.name] = table.concat(rfd.buf, "")
+ end
+ rfd.fd:close()
+ end
+ end
+ end
+ end
+
+ if not nowait then
+ _, _, rv.code = nixio.waitpid(pid)
+ end
+
+ return rv
+end
+
+
+user = {}
+
+-- { "uid", "gid", "name", "passwd", "dir", "shell", "gecos" }
+user.getuser = nixio.getpw
+
+function user.getpasswd(username)
+ local pwe = nixio.getsp and nixio.getsp(username) or nixio.getpw(username)
+ local pwh = pwe and (pwe.pwdp or pwe.passwd)
+ if not pwh or #pwh < 1 then
+ return nil, pwe
+ else
+ return pwh, pwe
+ end
+end
+
+function user.checkpasswd(username, pass)
+ local pwh, pwe = user.getpasswd(username)
+ if pwe then
+ return (pwh == nil or nixio.crypt(pass, pwh) == pwh)
+ end
+ return false
+end
+
+function user.setpasswd(username, password)
+ return os.execute("(echo %s; sleep 1; echo %s) | passwd %s >/dev/null 2>&1" %{
+ luci.util.shellquote(password),
+ luci.util.shellquote(password),
+ luci.util.shellquote(username)
+ })
+end
+
+
+wifi = {}
+
+function wifi.getiwinfo(ifname)
+ local ntm = require "luci.model.network"
+
+ ntm.init()
+
+ local wnet = ntm:get_wifinet(ifname)
+ if wnet and wnet.iwinfo then
+ return wnet.iwinfo
+ end
+
+ local wdev = ntm:get_wifidev(ifname)
+ if wdev and wdev.iwinfo then
+ return wdev.iwinfo
+ end
+
+ return { ifname = ifname }
+end
+
+
+init = {}
+init.dir = "/etc/init.d/"
+
+function init.names()
+ local names = { }
+ for name in fs.glob(init.dir.."*") do
+ names[#names+1] = fs.basename(name)
+ end
+ return names
+end
+
+function init.index(name)
+ name = fs.basename(name)
+ if fs.access(init.dir..name) then
+ return call("env -i sh -c 'source %s%s enabled; exit ${START:-255}' >/dev/null"
+ %{ init.dir, name })
+ end
+end
+
+local function init_action(action, name)
+ name = fs.basename(name)
+ if fs.access(init.dir..name) then
+ return call("env -i %s%s %s >/dev/null" %{ init.dir, name, action })
+ end
+end
+
+function init.enabled(name)
+ return (init_action("enabled", name) == 0)
+end
+
+function init.enable(name)
+ return (init_action("enable", name) == 0)
+end
+
+function init.disable(name)
+ return (init_action("disable", name) == 0)
+end
+
+function init.start(name)
+ return (init_action("start", name) == 0)
+end
+
+function init.stop(name)
+ return (init_action("stop", name) == 0)
+end
+
+function init.restart(name)
+ return (init_action("restart", name) == 0)
+end
+
+function init.reload(name)
+ return (init_action("reload", name) == 0)
+end
--- /dev/null
+---[[
+LuCI Linux and POSIX system utilities.
+]]
+module "luci.sys"
+
+---[[
+Execute a given shell command and return the error code
+
+@class function
+@name call
+@param ... Command to call
+@return Error code of the command
+]]
+
+---[[
+Execute a given shell command and capture its standard output
+
+@class function
+@name exec
+@param command Command to call
+@return String containing the return the output of the command
+]]
+
+---[[
+Retrieve information about currently mounted file systems.
+
+@class function
+@name mounts
+@return Table containing mount information
+]]
+
+---[[
+Retrieve environment variables. If no variable is given then a table
+
+containing the whole environment is returned otherwise this function returns
+the corresponding string value for the given name or nil if no such variable
+exists.
+@class function
+@name getenv
+@param var Name of the environment variable to retrieve (optional)
+@return String containing the value of the specified variable
+@return Table containing all variables if no variable name is given
+]]
+
+---[[
+Get or set the current hostname.
+
+@class function
+@name hostname
+@param String containing a new hostname to set (optional)
+@return String containing the system hostname
+]]
+
+---[[
+Returns the contents of a documented referred by an URL.
+
+@class function
+@name httpget
+@param url The URL to retrieve
+@param stream Return a stream instead of a buffer
+@param target Directly write to target file name
+@return String containing the contents of given the URL
+]]
+
+---[[
+Initiate a system reboot.
+
+@class function
+@name reboot
+@return Return value of os.execute()
+]]
+
+---[[
+Retrieves the output of the "logread" command.
+
+@class function
+@name syslog
+@return String containing the current log buffer
+]]
+
+---[[
+Retrieves the output of the "dmesg" command.
+
+@class function
+@name dmesg
+@return String containing the current log buffer
+]]
+
+---[[
+Generates a random id with specified length.
+
+@class function
+@name uniqueid
+@param bytes Number of bytes for the unique id
+@return String containing hex encoded id
+]]
+
+---[[
+Returns the current system uptime stats.
+
+@class function
+@name uptime
+@return String containing total uptime in seconds
+]]
+
+---[[
+LuCI system utilities / network related functions.
+
+@class module
+@name luci.sys.net
+]]
+
+---[[
+Returns a two-dimensional table of mac address hints.
+
+@class function
+@name net.mac_hints
+@return Table of table containing known hosts from various sources.
+ Each entry contains the values in the following order:
+ [ "mac", "name" ]
+]]
+
+---[[
+Returns a two-dimensional table of IPv4 address hints.
+
+@class function
+@name net.ipv4_hints
+@return Table of table containing known hosts from various sources.
+ Each entry contains the values in the following order:
+ [ "ip", "name" ]
+]]
+
+---[[
+Returns a two-dimensional table of IPv6 address hints.
+
+@class function
+@name net.ipv6_hints
+@return Table of table containing known hosts from various sources.
+ Each entry contains the values in the following order:
+ [ "ip", "name" ]
+]]
+
+---[[
+Returns a two-dimensional table of host hints.
+
+@class function
+@name net.host_hints
+@return Table of table containing known hosts from various sources,
+ indexed by mac address. Each subtable contains at least one
+ of the fields "name", "ipv4" or "ipv6".
+]]
+
+---[[
+Returns conntrack information
+
+@class function
+@name net.conntrack
+@return Table with the currently tracked IP connections
+]]
+
+---[[
+Determine the names of available network interfaces.
+
+@class function
+@name net.devices
+@return Table containing all current interface names
+]]
+
+---[[
+LuCI system utilities / process related functions.
+
+@class module
+@name luci.sys.process
+]]
+
+---[[
+Get the current process id.
+
+@class function
+@name process.info
+@return Number containing the current pid
+]]
+
+---[[
+Retrieve information about currently running processes.
+
+@class function
+@name process.list
+@return Table containing process information
+]]
+
+---[[
+Set the gid of a process identified by given pid.
+
+@class function
+@name process.setgroup
+@param gid Number containing the Unix group id
+@return Boolean indicating successful operation
+@return String containing the error message if failed
+@return Number containing the error code if failed
+]]
+
+---[[
+Set the uid of a process identified by given pid.
+
+@class function
+@name process.setuser
+@param uid Number containing the Unix user id
+@return Boolean indicating successful operation
+@return String containing the error message if failed
+@return Number containing the error code if failed
+]]
+
+---[[
+Send a signal to a process identified by given pid.
+
+@class function
+@name process.signal
+@param pid Number containing the process id
+@param sig Signal to send (default: 15 [SIGTERM])
+@return Boolean indicating successful operation
+@return Number containing the error code if failed
+]]
+
+---[[
+Execute a process, optionally capturing stdio.
+
+Executes the process specified by the given argv vector, e.g.
+`{ "/bin/sh", "-c", "echo 1" }` and waits for it to terminate unless a true
+value has been passed for the "nowait" parameter.
+
+When a function value is passed for the stdout or stderr arguments, the passed
+function is repeatedly called for each chunk read from the corresponding stdio
+stream. The read data is passed as string containing at most 4096 bytes at a
+time.
+
+When a true, non-function value is passed for the stdout or stderr arguments,
+the data of the corresponding stdio stream is read into an internal string
+buffer and returned as "stdout" or "stderr" field respectively in the result
+table.
+
+When a true value is passed to the nowait parameter, the function does not
+await process termination but returns as soon as all captured stdio streams
+have been closed or - if no streams are captured - immediately after launching
+the process.
+
+@class function
+@name process.exec
+@param commend Table containing the argv vector to execute
+@param stdout Callback function or boolean to indicate capturing (optional)
+@param stderr Callback function or boolean to indicate capturing (optional)
+@param nowait Don't wait for process termination when true (optional)
+@return Table containing at least the fields "code" which holds the exit
+ status of the invoked process or "-1" on error and "pid", which
+ contains the process id assigned to the spawned process. When
+ stdout and/or stderr capturing has been requested, it additionally
+ contains "stdout" and "stderr" fields respectively, holding the
+ captured stdio data as string.
+]]
+
+---[[
+LuCI system utilities / user related functions.
+
+@class module
+@name luci.sys.user
+]]
+
+---[[
+Retrieve user information for given uid.
+
+@class function
+@name getuser
+@param uid Number containing the Unix user id
+@return Table containing the following fields:
+-- { "uid", "gid", "name", "passwd", "dir", "shell", "gecos" }
+]]
+
+---[[
+Retrieve the current user password hash.
+
+@class function
+@name user.getpasswd
+@param username String containing the username to retrieve the password for
+@return String containing the hash or nil if no password is set.
+@return Password database entry
+]]
+
+---[[
+Test whether given string matches the password of a given system user.
+
+@class function
+@name user.checkpasswd
+@param username String containing the Unix user name
+@param pass String containing the password to compare
+@return Boolean indicating whether the passwords are equal
+]]
+
+---[[
+Change the password of given user.
+
+@class function
+@name user.setpasswd
+@param username String containing the Unix user name
+@param password String containing the password to compare
+@return Number containing 0 on success and >= 1 on error
+]]
+
+---[[
+LuCI system utilities / wifi related functions.
+
+@class module
+@name luci.sys.wifi
+]]
+
+---[[
+Get wireless information for given interface.
+
+@class function
+@name wifi.getiwinfo
+@param ifname String containing the interface name
+@return A wrapped iwinfo object instance
+]]
+
+---[[
+LuCI system utilities / init related functions.
+
+@class module
+@name luci.sys.init
+]]
+
+---[[
+Get the names of all installed init scripts
+
+@class function
+@name init.names
+@return Table containing the names of all inistalled init scripts
+]]
+
+---[[
+Get the index of he given init script
+
+@class function
+@name init.index
+@param name Name of the init script
+@return Numeric index value
+]]
+
+---[[
+Test whether the given init script is enabled
+
+@class function
+@name init.enabled
+@param name Name of the init script
+@return Boolean indicating whether init is enabled
+]]
+
+---[[
+Enable the given init script
+
+@class function
+@name init.enable
+@param name Name of the init script
+@return Boolean indicating success
+]]
+
+---[[
+Disable the given init script
+
+@class function
+@name init.disable
+@param name Name of the init script
+@return Boolean indicating success
+]]
+
+---[[
+Start the given init script
+
+@class function
+@name init.start
+@param name Name of the init script
+@return Boolean indicating success
+]]
+
+---[[
+Stop the given init script
+
+@class function
+@name init.stop
+@param name Name of the init script
+@return Boolean indicating success
+]]
+
--- /dev/null
+-- Licensed to the public under the Apache License 2.0.
+
+local setmetatable, require, rawget, rawset = setmetatable, require, rawget, rawset
+
+module "luci.sys.zoneinfo"
+
+setmetatable(_M, {
+ __index = function(t, k)
+ if k == "TZ" and not rawget(t, k) then
+ local m = require "luci.sys.zoneinfo.tzdata"
+ rawset(t, k, rawget(m, k))
+ elseif k == "OFFSET" and not rawget(t, k) then
+ local m = require "luci.sys.zoneinfo.tzoffset"
+ rawset(t, k, rawget(m, k))
+ end
+
+ return rawget(t, k)
+ end
+})
--- /dev/null
+-- Licensed to the public under the Apache License 2.0.
+
+module "luci.sys.zoneinfo.tzdata"
+
+TZ = {
+ { 'Africa/Abidjan', 'GMT0' },
+ { 'Africa/Accra', 'GMT0' },
+ { 'Africa/Addis Ababa', 'EAT-3' },
+ { 'Africa/Algiers', 'CET-1' },
+ { 'Africa/Asmara', 'EAT-3' },
+ { 'Africa/Bamako', 'GMT0' },
+ { 'Africa/Bangui', 'WAT-1' },
+ { 'Africa/Banjul', 'GMT0' },
+ { 'Africa/Bissau', 'GMT0' },
+ { 'Africa/Blantyre', 'CAT-2' },
+ { 'Africa/Brazzaville', 'WAT-1' },
+ { 'Africa/Bujumbura', 'CAT-2' },
+ { 'Africa/Cairo', 'EET-2' },
+ { 'Africa/Casablanca', '<+01>-1' },
+ { 'Africa/Ceuta', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Africa/Conakry', 'GMT0' },
+ { 'Africa/Dakar', 'GMT0' },
+ { 'Africa/Dar es Salaam', 'EAT-3' },
+ { 'Africa/Djibouti', 'EAT-3' },
+ { 'Africa/Douala', 'WAT-1' },
+ { 'Africa/El Aaiun', '<+01>-1' },
+ { 'Africa/Freetown', 'GMT0' },
+ { 'Africa/Gaborone', 'CAT-2' },
+ { 'Africa/Harare', 'CAT-2' },
+ { 'Africa/Johannesburg', 'SAST-2' },
+ { 'Africa/Juba', 'CAT-2' },
+ { 'Africa/Kampala', 'EAT-3' },
+ { 'Africa/Khartoum', 'CAT-2' },
+ { 'Africa/Kigali', 'CAT-2' },
+ { 'Africa/Kinshasa', 'WAT-1' },
+ { 'Africa/Lagos', 'WAT-1' },
+ { 'Africa/Libreville', 'WAT-1' },
+ { 'Africa/Lome', 'GMT0' },
+ { 'Africa/Luanda', 'WAT-1' },
+ { 'Africa/Lubumbashi', 'CAT-2' },
+ { 'Africa/Lusaka', 'CAT-2' },
+ { 'Africa/Malabo', 'WAT-1' },
+ { 'Africa/Maputo', 'CAT-2' },
+ { 'Africa/Maseru', 'SAST-2' },
+ { 'Africa/Mbabane', 'SAST-2' },
+ { 'Africa/Mogadishu', 'EAT-3' },
+ { 'Africa/Monrovia', 'GMT0' },
+ { 'Africa/Nairobi', 'EAT-3' },
+ { 'Africa/Ndjamena', 'WAT-1' },
+ { 'Africa/Niamey', 'WAT-1' },
+ { 'Africa/Nouakchott', 'GMT0' },
+ { 'Africa/Ouagadougou', 'GMT0' },
+ { 'Africa/Porto-Novo', 'WAT-1' },
+ { 'Africa/Sao Tome', 'GMT0' },
+ { 'Africa/Tripoli', 'EET-2' },
+ { 'Africa/Tunis', 'CET-1' },
+ { 'Africa/Windhoek', 'CAT-2' },
+ { 'America/Adak', 'HST10HDT,M3.2.0,M11.1.0' },
+ { 'America/Anchorage', 'AKST9AKDT,M3.2.0,M11.1.0' },
+ { 'America/Anguilla', 'AST4' },
+ { 'America/Antigua', 'AST4' },
+ { 'America/Araguaina', '<-03>3' },
+ { 'America/Argentina/Buenos Aires', '<-03>3' },
+ { 'America/Argentina/Catamarca', '<-03>3' },
+ { 'America/Argentina/Cordoba', '<-03>3' },
+ { 'America/Argentina/Jujuy', '<-03>3' },
+ { 'America/Argentina/La Rioja', '<-03>3' },
+ { 'America/Argentina/Mendoza', '<-03>3' },
+ { 'America/Argentina/Rio Gallegos', '<-03>3' },
+ { 'America/Argentina/Salta', '<-03>3' },
+ { 'America/Argentina/San Juan', '<-03>3' },
+ { 'America/Argentina/San Luis', '<-03>3' },
+ { 'America/Argentina/Tucuman', '<-03>3' },
+ { 'America/Argentina/Ushuaia', '<-03>3' },
+ { 'America/Aruba', 'AST4' },
+ { 'America/Asuncion', '<-04>4<-03>,M10.1.0/0,M3.4.0/0' },
+ { 'America/Atikokan', 'EST5' },
+ { 'America/Bahia', '<-03>3' },
+ { 'America/Bahia Banderas', 'CST6CDT,M4.1.0,M10.5.0' },
+ { 'America/Barbados', 'AST4' },
+ { 'America/Belem', '<-03>3' },
+ { 'America/Belize', 'CST6' },
+ { 'America/Blanc-Sablon', 'AST4' },
+ { 'America/Boa Vista', '<-04>4' },
+ { 'America/Bogota', '<-05>5' },
+ { 'America/Boise', 'MST7MDT,M3.2.0,M11.1.0' },
+ { 'America/Cambridge Bay', 'MST7MDT,M3.2.0,M11.1.0' },
+ { 'America/Campo Grande', '<-04>4' },
+ { 'America/Cancun', 'EST5' },
+ { 'America/Caracas', '<-04>4' },
+ { 'America/Cayenne', '<-03>3' },
+ { 'America/Cayman', 'EST5' },
+ { 'America/Chicago', 'CST6CDT,M3.2.0,M11.1.0' },
+ { 'America/Chihuahua', 'MST7MDT,M4.1.0,M10.5.0' },
+ { 'America/Costa Rica', 'CST6' },
+ { 'America/Creston', 'MST7' },
+ { 'America/Cuiaba', '<-04>4' },
+ { 'America/Curacao', 'AST4' },
+ { 'America/Danmarkshavn', 'GMT0' },
+ { 'America/Dawson', 'MST7' },
+ { 'America/Dawson Creek', 'MST7' },
+ { 'America/Denver', 'MST7MDT,M3.2.0,M11.1.0' },
+ { 'America/Detroit', 'EST5EDT,M3.2.0,M11.1.0' },
+ { 'America/Dominica', 'AST4' },
+ { 'America/Edmonton', 'MST7MDT,M3.2.0,M11.1.0' },
+ { 'America/Eirunepe', '<-05>5' },
+ { 'America/El Salvador', 'CST6' },
+ { 'America/Fort Nelson', 'MST7' },
+ { 'America/Fortaleza', '<-03>3' },
+ { 'America/Glace Bay', 'AST4ADT,M3.2.0,M11.1.0' },
+ { 'America/Goose Bay', 'AST4ADT,M3.2.0,M11.1.0' },
+ { 'America/Grand Turk', 'EST5EDT,M3.2.0,M11.1.0' },
+ { 'America/Grenada', 'AST4' },
+ { 'America/Guadeloupe', 'AST4' },
+ { 'America/Guatemala', 'CST6' },
+ { 'America/Guayaquil', '<-05>5' },
+ { 'America/Guyana', '<-04>4' },
+ { 'America/Halifax', 'AST4ADT,M3.2.0,M11.1.0' },
+ { 'America/Havana', 'CST5CDT,M3.2.0/0,M11.1.0/1' },
+ { 'America/Hermosillo', 'MST7' },
+ { 'America/Indiana/Indianapolis', 'EST5EDT,M3.2.0,M11.1.0' },
+ { 'America/Indiana/Knox', 'CST6CDT,M3.2.0,M11.1.0' },
+ { 'America/Indiana/Marengo', 'EST5EDT,M3.2.0,M11.1.0' },
+ { 'America/Indiana/Petersburg', 'EST5EDT,M3.2.0,M11.1.0' },
+ { 'America/Indiana/Tell City', 'CST6CDT,M3.2.0,M11.1.0' },
+ { 'America/Indiana/Vevay', 'EST5EDT,M3.2.0,M11.1.0' },
+ { 'America/Indiana/Vincennes', 'EST5EDT,M3.2.0,M11.1.0' },
+ { 'America/Indiana/Winamac', 'EST5EDT,M3.2.0,M11.1.0' },
+ { 'America/Inuvik', 'MST7MDT,M3.2.0,M11.1.0' },
+ { 'America/Iqaluit', 'EST5EDT,M3.2.0,M11.1.0' },
+ { 'America/Jamaica', 'EST5' },
+ { 'America/Juneau', 'AKST9AKDT,M3.2.0,M11.1.0' },
+ { 'America/Kentucky/Louisville', 'EST5EDT,M3.2.0,M11.1.0' },
+ { 'America/Kentucky/Monticello', 'EST5EDT,M3.2.0,M11.1.0' },
+ { 'America/Kralendijk', 'AST4' },
+ { 'America/La Paz', '<-04>4' },
+ { 'America/Lima', '<-05>5' },
+ { 'America/Los Angeles', 'PST8PDT,M3.2.0,M11.1.0' },
+ { 'America/Lower Princes', 'AST4' },
+ { 'America/Maceio', '<-03>3' },
+ { 'America/Managua', 'CST6' },
+ { 'America/Manaus', '<-04>4' },
+ { 'America/Marigot', 'AST4' },
+ { 'America/Martinique', 'AST4' },
+ { 'America/Matamoros', 'CST6CDT,M3.2.0,M11.1.0' },
+ { 'America/Mazatlan', 'MST7MDT,M4.1.0,M10.5.0' },
+ { 'America/Menominee', 'CST6CDT,M3.2.0,M11.1.0' },
+ { 'America/Merida', 'CST6CDT,M4.1.0,M10.5.0' },
+ { 'America/Metlakatla', 'AKST9AKDT,M3.2.0,M11.1.0' },
+ { 'America/Mexico City', 'CST6CDT,M4.1.0,M10.5.0' },
+ { 'America/Miquelon', '<-03>3<-02>,M3.2.0,M11.1.0' },
+ { 'America/Moncton', 'AST4ADT,M3.2.0,M11.1.0' },
+ { 'America/Monterrey', 'CST6CDT,M4.1.0,M10.5.0' },
+ { 'America/Montevideo', '<-03>3' },
+ { 'America/Montserrat', 'AST4' },
+ { 'America/Nassau', 'EST5EDT,M3.2.0,M11.1.0' },
+ { 'America/New York', 'EST5EDT,M3.2.0,M11.1.0' },
+ { 'America/Nipigon', 'EST5EDT,M3.2.0,M11.1.0' },
+ { 'America/Nome', 'AKST9AKDT,M3.2.0,M11.1.0' },
+ { 'America/Noronha', '<-02>2' },
+ { 'America/North Dakota/Beulah', 'CST6CDT,M3.2.0,M11.1.0' },
+ { 'America/North Dakota/Center', 'CST6CDT,M3.2.0,M11.1.0' },
+ { 'America/North Dakota/New Salem', 'CST6CDT,M3.2.0,M11.1.0' },
+ { 'America/Nuuk', '<-03>3<-02>,M3.5.0/-2,M10.5.0/-1' },
+ { 'America/Ojinaga', 'MST7MDT,M3.2.0,M11.1.0' },
+ { 'America/Panama', 'EST5' },
+ { 'America/Pangnirtung', 'EST5EDT,M3.2.0,M11.1.0' },
+ { 'America/Paramaribo', '<-03>3' },
+ { 'America/Phoenix', 'MST7' },
+ { 'America/Port of Spain', 'AST4' },
+ { 'America/Port-au-Prince', 'EST5EDT,M3.2.0,M11.1.0' },
+ { 'America/Porto Velho', '<-04>4' },
+ { 'America/Puerto Rico', 'AST4' },
+ { 'America/Punta Arenas', '<-03>3' },
+ { 'America/Rainy River', 'CST6CDT,M3.2.0,M11.1.0' },
+ { 'America/Rankin Inlet', 'CST6CDT,M3.2.0,M11.1.0' },
+ { 'America/Recife', '<-03>3' },
+ { 'America/Regina', 'CST6' },
+ { 'America/Resolute', 'CST6CDT,M3.2.0,M11.1.0' },
+ { 'America/Rio Branco', '<-05>5' },
+ { 'America/Santarem', '<-03>3' },
+ { 'America/Santiago', '<-04>4<-03>,M9.1.6/24,M4.1.6/24' },
+ { 'America/Santo Domingo', 'AST4' },
+ { 'America/Sao Paulo', '<-03>3' },
+ { 'America/Scoresbysund', '<-01>1<+00>,M3.5.0/0,M10.5.0/1' },
+ { 'America/Sitka', 'AKST9AKDT,M3.2.0,M11.1.0' },
+ { 'America/St Barthelemy', 'AST4' },
+ { 'America/St Johns', 'NST3:30NDT,M3.2.0,M11.1.0' },
+ { 'America/St Kitts', 'AST4' },
+ { 'America/St Lucia', 'AST4' },
+ { 'America/St Thomas', 'AST4' },
+ { 'America/St Vincent', 'AST4' },
+ { 'America/Swift Current', 'CST6' },
+ { 'America/Tegucigalpa', 'CST6' },
+ { 'America/Thule', 'AST4ADT,M3.2.0,M11.1.0' },
+ { 'America/Thunder Bay', 'EST5EDT,M3.2.0,M11.1.0' },
+ { 'America/Tijuana', 'PST8PDT,M3.2.0,M11.1.0' },
+ { 'America/Toronto', 'EST5EDT,M3.2.0,M11.1.0' },
+ { 'America/Tortola', 'AST4' },
+ { 'America/Vancouver', 'PST8PDT,M3.2.0,M11.1.0' },
+ { 'America/Whitehorse', 'MST7' },
+ { 'America/Winnipeg', 'CST6CDT,M3.2.0,M11.1.0' },
+ { 'America/Yakutat', 'AKST9AKDT,M3.2.0,M11.1.0' },
+ { 'America/Yellowknife', 'MST7MDT,M3.2.0,M11.1.0' },
+ { 'Antarctica/Casey', '<+11>-11' },
+ { 'Antarctica/Davis', '<+07>-7' },
+ { 'Antarctica/DumontDUrville', '<+10>-10' },
+ { 'Antarctica/Macquarie', 'AEST-10AEDT,M10.1.0,M4.1.0/3' },
+ { 'Antarctica/Mawson', '<+05>-5' },
+ { 'Antarctica/McMurdo', 'NZST-12NZDT,M9.5.0,M4.1.0/3' },
+ { 'Antarctica/Palmer', '<-03>3' },
+ { 'Antarctica/Rothera', '<-03>3' },
+ { 'Antarctica/Syowa', '<+03>-3' },
+ { 'Antarctica/Troll', '<+00>0<+02>-2,M3.5.0/1,M10.5.0/3' },
+ { 'Antarctica/Vostok', '<+06>-6' },
+ { 'Arctic/Longyearbyen', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Asia/Aden', '<+03>-3' },
+ { 'Asia/Almaty', '<+06>-6' },
+ { 'Asia/Amman', '<+03>-3' },
+ { 'Asia/Anadyr', '<+12>-12' },
+ { 'Asia/Aqtau', '<+05>-5' },
+ { 'Asia/Aqtobe', '<+05>-5' },
+ { 'Asia/Ashgabat', '<+05>-5' },
+ { 'Asia/Atyrau', '<+05>-5' },
+ { 'Asia/Baghdad', '<+03>-3' },
+ { 'Asia/Bahrain', '<+03>-3' },
+ { 'Asia/Baku', '<+04>-4' },
+ { 'Asia/Bangkok', '<+07>-7' },
+ { 'Asia/Barnaul', '<+07>-7' },
+ { 'Asia/Beirut', 'EET-2EEST,M3.5.0/0,M10.5.0/0' },
+ { 'Asia/Bishkek', '<+06>-6' },
+ { 'Asia/Brunei', '<+08>-8' },
+ { 'Asia/Chita', '<+09>-9' },
+ { 'Asia/Choibalsan', '<+08>-8' },
+ { 'Asia/Colombo', '<+0530>-5:30' },
+ { 'Asia/Damascus', '<+03>-3' },
+ { 'Asia/Dhaka', '<+06>-6' },
+ { 'Asia/Dili', '<+09>-9' },
+ { 'Asia/Dubai', '<+04>-4' },
+ { 'Asia/Dushanbe', '<+05>-5' },
+ { 'Asia/Famagusta', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
+ { 'Asia/Gaza', 'EET-2EEST,M3.4.4/50,M10.4.4/50' },
+ { 'Asia/Hebron', 'EET-2EEST,M3.4.4/50,M10.4.4/50' },
+ { 'Asia/Ho Chi Minh', '<+07>-7' },
+ { 'Asia/Hong Kong', 'HKT-8' },
+ { 'Asia/Hovd', '<+07>-7' },
+ { 'Asia/Irkutsk', '<+08>-8' },
+ { 'Asia/Jakarta', 'WIB-7' },
+ { 'Asia/Jayapura', 'WIT-9' },
+ { 'Asia/Jerusalem', 'IST-2IDT,M3.4.4/26,M10.5.0' },
+ { 'Asia/Kabul', '<+0430>-4:30' },
+ { 'Asia/Kamchatka', '<+12>-12' },
+ { 'Asia/Karachi', 'PKT-5' },
+ { 'Asia/Kathmandu', '<+0545>-5:45' },
+ { 'Asia/Khandyga', '<+09>-9' },
+ { 'Asia/Kolkata', 'IST-5:30' },
+ { 'Asia/Krasnoyarsk', '<+07>-7' },
+ { 'Asia/Kuala Lumpur', '<+08>-8' },
+ { 'Asia/Kuching', '<+08>-8' },
+ { 'Asia/Kuwait', '<+03>-3' },
+ { 'Asia/Macau', 'CST-8' },
+ { 'Asia/Magadan', '<+11>-11' },
+ { 'Asia/Makassar', 'WITA-8' },
+ { 'Asia/Manila', 'PST-8' },
+ { 'Asia/Muscat', '<+04>-4' },
+ { 'Asia/Nicosia', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
+ { 'Asia/Novokuznetsk', '<+07>-7' },
+ { 'Asia/Novosibirsk', '<+07>-7' },
+ { 'Asia/Omsk', '<+06>-6' },
+ { 'Asia/Oral', '<+05>-5' },
+ { 'Asia/Phnom Penh', '<+07>-7' },
+ { 'Asia/Pontianak', 'WIB-7' },
+ { 'Asia/Pyongyang', 'KST-9' },
+ { 'Asia/Qatar', '<+03>-3' },
+ { 'Asia/Qostanay', '<+06>-6' },
+ { 'Asia/Qyzylorda', '<+05>-5' },
+ { 'Asia/Riyadh', '<+03>-3' },
+ { 'Asia/Sakhalin', '<+11>-11' },
+ { 'Asia/Samarkand', '<+05>-5' },
+ { 'Asia/Seoul', 'KST-9' },
+ { 'Asia/Shanghai', 'CST-8' },
+ { 'Asia/Singapore', '<+08>-8' },
+ { 'Asia/Srednekolymsk', '<+11>-11' },
+ { 'Asia/Taipei', 'CST-8' },
+ { 'Asia/Tashkent', '<+05>-5' },
+ { 'Asia/Tbilisi', '<+04>-4' },
+ { 'Asia/Tehran', '<+0330>-3:30' },
+ { 'Asia/Thimphu', '<+06>-6' },
+ { 'Asia/Tokyo', 'JST-9' },
+ { 'Asia/Tomsk', '<+07>-7' },
+ { 'Asia/Ulaanbaatar', '<+08>-8' },
+ { 'Asia/Urumqi', '<+06>-6' },
+ { 'Asia/Ust-Nera', '<+10>-10' },
+ { 'Asia/Vientiane', '<+07>-7' },
+ { 'Asia/Vladivostok', '<+10>-10' },
+ { 'Asia/Yakutsk', '<+09>-9' },
+ { 'Asia/Yangon', '<+0630>-6:30' },
+ { 'Asia/Yekaterinburg', '<+05>-5' },
+ { 'Asia/Yerevan', '<+04>-4' },
+ { 'Atlantic/Azores', '<-01>1<+00>,M3.5.0/0,M10.5.0/1' },
+ { 'Atlantic/Bermuda', 'AST4ADT,M3.2.0,M11.1.0' },
+ { 'Atlantic/Canary', 'WET0WEST,M3.5.0/1,M10.5.0' },
+ { 'Atlantic/Cape Verde', '<-01>1' },
+ { 'Atlantic/Faroe', 'WET0WEST,M3.5.0/1,M10.5.0' },
+ { 'Atlantic/Madeira', 'WET0WEST,M3.5.0/1,M10.5.0' },
+ { 'Atlantic/Reykjavik', 'GMT0' },
+ { 'Atlantic/South Georgia', '<-02>2' },
+ { 'Atlantic/St Helena', 'GMT0' },
+ { 'Atlantic/Stanley', '<-03>3' },
+ { 'Australia/Adelaide', 'ACST-9:30ACDT,M10.1.0,M4.1.0/3' },
+ { 'Australia/Brisbane', 'AEST-10' },
+ { 'Australia/Broken Hill', 'ACST-9:30ACDT,M10.1.0,M4.1.0/3' },
+ { 'Australia/Darwin', 'ACST-9:30' },
+ { 'Australia/Eucla', '<+0845>-8:45' },
+ { 'Australia/Hobart', 'AEST-10AEDT,M10.1.0,M4.1.0/3' },
+ { 'Australia/Lindeman', 'AEST-10' },
+ { 'Australia/Lord Howe', '<+1030>-10:30<+11>-11,M10.1.0,M4.1.0' },
+ { 'Australia/Melbourne', 'AEST-10AEDT,M10.1.0,M4.1.0/3' },
+ { 'Australia/Perth', 'AWST-8' },
+ { 'Australia/Sydney', 'AEST-10AEDT,M10.1.0,M4.1.0/3' },
+ { 'Etc/GMT', 'GMT0' },
+ { 'Etc/GMT+1', '<-01>1' },
+ { 'Etc/GMT+10', '<-10>10' },
+ { 'Etc/GMT+11', '<-11>11' },
+ { 'Etc/GMT+12', '<-12>12' },
+ { 'Etc/GMT+2', '<-02>2' },
+ { 'Etc/GMT+3', '<-03>3' },
+ { 'Etc/GMT+4', '<-04>4' },
+ { 'Etc/GMT+5', '<-05>5' },
+ { 'Etc/GMT+6', '<-06>6' },
+ { 'Etc/GMT+7', '<-07>7' },
+ { 'Etc/GMT+8', '<-08>8' },
+ { 'Etc/GMT+9', '<-09>9' },
+ { 'Etc/GMT-1', '<+01>-1' },
+ { 'Etc/GMT-10', '<+10>-10' },
+ { 'Etc/GMT-11', '<+11>-11' },
+ { 'Etc/GMT-12', '<+12>-12' },
+ { 'Etc/GMT-13', '<+13>-13' },
+ { 'Etc/GMT-14', '<+14>-14' },
+ { 'Etc/GMT-2', '<+02>-2' },
+ { 'Etc/GMT-3', '<+03>-3' },
+ { 'Etc/GMT-4', '<+04>-4' },
+ { 'Etc/GMT-5', '<+05>-5' },
+ { 'Etc/GMT-6', '<+06>-6' },
+ { 'Etc/GMT-7', '<+07>-7' },
+ { 'Etc/GMT-8', '<+08>-8' },
+ { 'Etc/GMT-9', '<+09>-9' },
+ { 'Europe/Amsterdam', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Andorra', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Astrakhan', '<+04>-4' },
+ { 'Europe/Athens', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
+ { 'Europe/Belgrade', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Berlin', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Bratislava', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Brussels', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Bucharest', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
+ { 'Europe/Budapest', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Busingen', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Chisinau', 'EET-2EEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Copenhagen', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Dublin', 'IST-1GMT0,M10.5.0,M3.5.0/1' },
+ { 'Europe/Gibraltar', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Guernsey', 'GMT0BST,M3.5.0/1,M10.5.0' },
+ { 'Europe/Helsinki', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
+ { 'Europe/Isle of Man', 'GMT0BST,M3.5.0/1,M10.5.0' },
+ { 'Europe/Istanbul', '<+03>-3' },
+ { 'Europe/Jersey', 'GMT0BST,M3.5.0/1,M10.5.0' },
+ { 'Europe/Kaliningrad', 'EET-2' },
+ { 'Europe/Kirov', '<+03>-3' },
+ { 'Europe/Kyiv', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
+ { 'Europe/Lisbon', 'WET0WEST,M3.5.0/1,M10.5.0' },
+ { 'Europe/Ljubljana', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/London', 'GMT0BST,M3.5.0/1,M10.5.0' },
+ { 'Europe/Luxembourg', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Madrid', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Malta', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Mariehamn', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
+ { 'Europe/Minsk', '<+03>-3' },
+ { 'Europe/Monaco', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Moscow', 'MSK-3' },
+ { 'Europe/Oslo', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Paris', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Podgorica', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Prague', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Riga', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
+ { 'Europe/Rome', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Samara', '<+04>-4' },
+ { 'Europe/San Marino', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Sarajevo', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Saratov', '<+04>-4' },
+ { 'Europe/Simferopol', 'MSK-3' },
+ { 'Europe/Skopje', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Sofia', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
+ { 'Europe/Stockholm', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Tallinn', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
+ { 'Europe/Tirane', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Ulyanovsk', '<+04>-4' },
+ { 'Europe/Vaduz', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Vatican', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Vienna', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Vilnius', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
+ { 'Europe/Volgograd', '<+03>-3' },
+ { 'Europe/Warsaw', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Zagreb', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Europe/Zurich', 'CET-1CEST,M3.5.0,M10.5.0/3' },
+ { 'Indian/Antananarivo', 'EAT-3' },
+ { 'Indian/Chagos', '<+06>-6' },
+ { 'Indian/Christmas', '<+07>-7' },
+ { 'Indian/Cocos', '<+0630>-6:30' },
+ { 'Indian/Comoro', 'EAT-3' },
+ { 'Indian/Kerguelen', '<+05>-5' },
+ { 'Indian/Mahe', '<+04>-4' },
+ { 'Indian/Maldives', '<+05>-5' },
+ { 'Indian/Mauritius', '<+04>-4' },
+ { 'Indian/Mayotte', 'EAT-3' },
+ { 'Indian/Reunion', '<+04>-4' },
+ { 'Pacific/Apia', '<+13>-13' },
+ { 'Pacific/Auckland', 'NZST-12NZDT,M9.5.0,M4.1.0/3' },
+ { 'Pacific/Bougainville', '<+11>-11' },
+ { 'Pacific/Chatham', '<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45' },
+ { 'Pacific/Chuuk', '<+10>-10' },
+ { 'Pacific/Easter', '<-06>6<-05>,M9.1.6/22,M4.1.6/22' },
+ { 'Pacific/Efate', '<+11>-11' },
+ { 'Pacific/Fakaofo', '<+13>-13' },
+ { 'Pacific/Fiji', '<+12>-12<+13>,M11.2.0,M1.2.3/99' },
+ { 'Pacific/Funafuti', '<+12>-12' },
+ { 'Pacific/Galapagos', '<-06>6' },
+ { 'Pacific/Gambier', '<-09>9' },
+ { 'Pacific/Guadalcanal', '<+11>-11' },
+ { 'Pacific/Guam', 'ChST-10' },
+ { 'Pacific/Honolulu', 'HST10' },
+ { 'Pacific/Kanton', '<+13>-13' },
+ { 'Pacific/Kiritimati', '<+14>-14' },
+ { 'Pacific/Kosrae', '<+11>-11' },
+ { 'Pacific/Kwajalein', '<+12>-12' },
+ { 'Pacific/Majuro', '<+12>-12' },
+ { 'Pacific/Marquesas', '<-0930>9:30' },
+ { 'Pacific/Midway', 'SST11' },
+ { 'Pacific/Nauru', '<+12>-12' },
+ { 'Pacific/Niue', '<-11>11' },
+ { 'Pacific/Norfolk', '<+11>-11<+12>,M10.1.0,M4.1.0/3' },
+ { 'Pacific/Noumea', '<+11>-11' },
+ { 'Pacific/Pago Pago', 'SST11' },
+ { 'Pacific/Palau', '<+09>-9' },
+ { 'Pacific/Pitcairn', '<-08>8' },
+ { 'Pacific/Pohnpei', '<+11>-11' },
+ { 'Pacific/Port Moresby', '<+10>-10' },
+ { 'Pacific/Rarotonga', '<-10>10' },
+ { 'Pacific/Saipan', 'ChST-10' },
+ { 'Pacific/Tahiti', '<-10>10' },
+ { 'Pacific/Tarawa', '<+12>-12' },
+ { 'Pacific/Tongatapu', '<+13>-13' },
+ { 'Pacific/Wake', '<+12>-12' },
+ { 'Pacific/Wallis', '<+12>-12' },
+}
--- /dev/null
+-- Licensed to the public under the Apache License 2.0.
+
+module "luci.sys.zoneinfo.tzoffset"
+
+OFFSET = {
+ gmt = 0, -- GMT
+ eat = 10800, -- EAT
+ cet = 3600, -- CET
+ wat = 3600, -- WAT
+ cat = 7200, -- CAT
+ eet = 7200, -- EET
+ sast = 7200, -- SAST
+ hst = -36000, -- HST
+ hdt = -32400, -- HDT
+ akst = -32400, -- AKST
+ akdt = -28800, -- AKDT
+ ast = -14400, -- AST
+ est = -18000, -- EST
+ cst = -21600, -- CST
+ cdt = -18000, -- CDT
+ mst = -25200, -- MST
+ mdt = -21600, -- MDT
+ pst = -28800, -- PST
+ pdt = -25200, -- PDT
+ nst = -12600, -- NST
+ ndt = -9000, -- NDT
+ aest = 36000, -- AEST
+ aedt = 39600, -- AEDT
+ nzst = 43200, -- NZST
+ nzdt = 46800, -- NZDT
+ hkt = 28800, -- HKT
+ wib = 25200, -- WIB
+ wit = 32400, -- WIT
+ ist = 7200, -- IST
+ idt = 10800, -- IDT
+ pkt = 18000, -- PKT
+ wita = 28800, -- WITA
+ kst = 32400, -- KST
+ jst = 32400, -- JST
+ wet = 0, -- WET
+ acst = 34200, -- ACST
+ acdt = 37800, -- ACDT
+ awst = 28800, -- AWST
+ msk = 10800, -- MSK
+ sst = -39600, -- SST
+}
--- /dev/null
+-- Copyright 2008 Steven Barth <steven@midlink.org>
+-- Licensed to the public under the Apache License 2.0.
+
+local util = require "luci.util"
+local config = require "luci.config"
+local tparser = require "luci.template.parser"
+
+local tostring, pairs, loadstring = tostring, pairs, loadstring
+local setmetatable, loadfile = setmetatable, loadfile
+local getfenv, setfenv, rawget = getfenv, setfenv, rawget
+local assert, type, error = assert, type, error
+local table, string, unpack = table, string, unpack
+
+
+---
+--- bootstrap
+---
+local _G = _G
+local L = _G.L
+
+local http = _G.L.http
+
+local disp = require "luci.dispatcher"
+local i18n = require "luci.i18n"
+local xml = require "luci.xml"
+local fs = require "nixio.fs"
+
+
+--- LuCI template library.
+module "luci.template"
+
+config.template = config.template or {}
+viewdir = config.template.viewdir or util.libpath() .. "/view"
+
+
+-- Define the namespace for template modules
+context = {} --util.threadlocal()
+
+--- Render a certain template.
+-- @param name Template name
+-- @param scope Scope to assign to template (optional)
+function render(name, scope)
+ return Template(name):render(scope or getfenv(2))
+end
+
+--- Render a template from a string.
+-- @param template Template string
+-- @param scope Scope to assign to template (optional)
+function render_string(template, scope)
+ return Template(nil, template):render(scope or getfenv(2))
+end
+
+
+-- Template class
+Template = util.class()
+
+-- Shared template cache to store templates in to avoid unnecessary reloading
+Template.cache = setmetatable({}, {__mode = "v"})
+
+
+
+local function _ifattr(cond, key, val, noescape)
+ if cond then
+ local env = getfenv(3)
+ local scope = (type(env.self) == "table") and env.self
+ if type(val) == "table" then
+ if not next(val) then
+ return ''
+ else
+ val = util.serialize_json(val)
+ end
+ end
+
+ val = tostring(val or
+ (type(env[key]) ~= "function" and env[key]) or
+ (scope and type(scope[key]) ~= "function" and scope[key]) or "")
+
+ if noescape ~= true then
+ val = xml.pcdata(val)
+ end
+
+ return string.format(' %s="%s"', tostring(key), val)
+ else
+ return ''
+ end
+end
+
+context.viewns = setmetatable({
+ include = function(name)
+ if fs.access(viewdir .. "/" .. name .. ".htm") then
+ Template(name):render(getfenv(2))
+ else
+ L.include(name, getfenv(2))
+ end
+ end;
+ translate = i18n.translate;
+ translatef = i18n.translatef;
+ export = function(k, v) if tpl.context.viewns[k] == nil then tpl.context.viewns[k] = v end end;
+ striptags = xml.striptags;
+ pcdata = xml.pcdata;
+ ifattr = function(...) return _ifattr(...) end;
+ attr = function(...) return _ifattr(true, ...) end;
+ url = disp.build_url;
+}, {__index=function(tbl, key)
+ if key == "controller" then
+ return disp.build_url()
+ elseif key == "REQUEST_URI" then
+ return disp.build_url(unpack(disp.context.requestpath))
+ elseif key == "FULL_REQUEST_URI" then
+ local url = { http:getenv("SCRIPT_NAME") or "", http:getenv("PATH_INFO") }
+ local query = http:getenv("QUERY_STRING")
+ if query and #query > 0 then
+ url[#url+1] = "?"
+ url[#url+1] = query
+ end
+ return table.concat(url, "")
+ elseif key == "token" then
+ return disp.context.authtoken
+ elseif key == "theme" then
+ return L.media and fs.basename(L.media) or tostring(L)
+ elseif key == "resource" then
+ return L.config.main.resourcebase
+ else
+ return rawget(tbl, key) or _G[key] or L[key]
+ end
+end})
+
+
+-- Constructor - Reads and compiles the template on-demand
+function Template.__init__(self, name, template)
+ if name then
+ self.template = self.cache[name]
+ self.name = name
+ else
+ self.name = "[string]"
+ end
+
+ -- Create a new namespace for this template
+ self.viewns = context.viewns
+
+ -- If we have a cached template, skip compiling and loading
+ if not self.template then
+
+ -- Compile template
+ local err
+ local sourcefile
+
+ if name then
+ sourcefile = viewdir .. "/" .. name .. ".htm"
+ self.template, _, err = tparser.parse(sourcefile)
+ else
+ sourcefile = "[string]"
+ self.template, _, err = tparser.parse_string(template)
+ end
+
+ -- If we have no valid template throw error, otherwise cache the template
+ if not self.template then
+ error("Failed to load template '" .. self.name .. "'.\n" ..
+ "Error while parsing template '" .. sourcefile .. "':\n" ..
+ (err or "Unknown syntax error"))
+ elseif name then
+ self.cache[name] = self.template
+ end
+ end
+end
+
+
+-- Renders a template
+function Template.render(self, scope)
+ scope = scope or getfenv(2)
+
+ -- Put our predefined objects in the scope of the template
+ setfenv(self.template, setmetatable({}, {__index =
+ function(tbl, key)
+ return rawget(tbl, key) or self.viewns[key] or scope[key]
+ end}))
+
+ -- Now finally render the thing
+ local stat, err = util.copcall(self.template)
+ if not stat then
+ error("Failed to execute template '" .. self.name .. "'.\n" ..
+ "A runtime error occurred: " .. tostring(err or "(nil)"))
+ end
+end
--- /dev/null
+-- Copyright 2022 Jo-Philipp Wich <jo@mein.io>
+-- Licensed to the public under the Apache License 2.0.
+
+local coroutine, assert, error, type, require = coroutine, assert, error, type, require
+local tmpl = require "luci.template"
+local util = require "luci.util"
+local http = require "luci.http"
+local sys = require "luci.sys"
+
+
+--- LuCI ucode bridge library.
+module "luci.ucodebridge"
+
+local function run(fn, ...)
+ local co = coroutine.create(fn)
+ local ok, ret
+
+ while coroutine.status(co) ~= "dead" do
+ ok, ret = coroutine.resume(co, ...)
+
+ if not ok then
+ error(ret)
+ end
+ end
+
+ return ret
+end
+
+function compile(path)
+ run(function(path)
+ return tmpl.Template(path)
+ end, path)
+end
+
+function render(path, scope)
+ run(tmpl.render, path, scope)
+end
+
+function call(modname, method, ...)
+ return run(function(module, method, ...)
+ local mod = require(modname)
+ local func = mod[method]
+
+ assert(func ~= nil,
+ 'Cannot resolve function "' .. method .. '". Is it misspelled or local?')
+
+ assert(type(func) == "function",
+ 'The symbol "' .. method .. '" does not refer to a function but data ' ..
+ 'of type "' .. type(func) .. '".')
+
+ return func(...)
+ end, modname, method, ...)
+end
--- /dev/null
+-- Licensed to the public under the Apache License 2.0.
+
+module "luci.version"
+
+distname = "Host System"
+distversion = "SDK"
+
+luciname = "LuCI"
+luciversion = "SVN"
--- /dev/null
+<%-
+ local util = require "luci.util"
+ local fs = require "nixio.fs"
+
+ local incdir = util.libpath() .. "/view/admin_status/index/"
+ if fs.access(incdir) then
+ local _, inc
+ local includes = {}
+ for inc in fs.dir(incdir) do
+ if inc:match("%.htm$") then
+ includes[#includes + 1] = inc:gsub("%.htm$", "")
+ end
+ end
+ for _, inc in luci.util.vspairs(includes) do
+ include("admin_status/index/" .. inc)
+ end
+ end
+-%>
--- /dev/null
+<%#
+ Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2018 Daniel F. Dickinson <cshored@thecshore.com>
+ Licensed to the public under the Apache License 2.0.
+-%>
+
+<%+header%>
+
+<p>Component not present.</p>
+
+<%+footer%>
--- /dev/null
+<%#
+ Copyright 2008 Steven Barth <steven@midlink.org>
+ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+ Licensed to the public under the Apache License 2.0.
+-%>
+
+<% include("themes/" .. theme .. "/indexer") %>
\ No newline at end of file
--- /dev/null
+-- Copyright 2008 Steven Barth <steven@midlink.org>
+-- Licensed to the public under the Apache License 2.0.
+
+local tparser = require "luci.template.parser"
+local string = require "string"
+
+local tostring = tostring
+
+module "luci.xml"
+
+--
+-- String and data manipulation routines
+--
+
+function pcdata(value)
+ return value and tparser.pcdata(tostring(value))
+end
+
+function striptags(value)
+ return value and tparser.striptags(tostring(value))
+end
+
+
+-- also register functions above in the central string class for convenience
+string.pcdata = pcdata
+string.striptags = striptags
--- /dev/null
+---[[
+LuCI utility functions.
+]]
+module "luci.xml"
+
+---[[
+Create valid XML PCDATA from given string.
+
+@class function
+@name pcdata
+@param value String value containing the data to escape
+@return String value containing the escaped data
+]]
+
+---[[
+Strip HTML tags from given string.
+
+@class function
+@name striptags
+@param value String containing the HTML text
+@return String with HTML tags stripped of
+]]
+
--- /dev/null
+%.o: %.c
+ $(CC) $(CPPFLAGS) $(CFLAGS) $(FPIC) -DNDEBUG -c -o $@ $<
+
+contrib/lemon: contrib/lemon.c contrib/lempar.c
+ cc -o contrib/lemon $<
+
+plural_formula.c: plural_formula.y contrib/lemon
+ ./contrib/lemon -q $<
+
+template_lmo.c: plural_formula.c
+
+clean:
+ rm -f contrib/lemon parser.so plural_formula.c plural_formula.h *.o
+
+parser.so: template_parser.o template_utils.o template_lmo.o template_lualib.o plural_formula.o
+ $(CC) $(LDFLAGS) -shared -o $@ $^
+
+version.lua:
+ ./mkversion.sh $@ $(LUCI_VERSION) "$(LUCI_GITBRANCH)"
+
+compile: parser.so version.lua
+
+install: compile
+ mkdir -p $(DESTDIR)/usr/lib/lua/luci/template
+ cp parser.so $(DESTDIR)/usr/lib/lua/luci/template/parser.so
+ cp version.lua $(DESTDIR)/usr/lib/lua/luci/version.lua
--- /dev/null
+/*
+** This file contains all sources (including headers) to the LEMON
+** LALR(1) parser generator. The sources have been combined into a
+** single file to make it easy to include LEMON in the source tree
+** and Makefile of another program.
+**
+** The author of this program disclaims copyright.
+*/
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#ifndef __WIN32__
+# if defined(_WIN32) || defined(WIN32)
+# define __WIN32__
+# endif
+#endif
+
+#ifdef __WIN32__
+#ifdef __cplusplus
+extern "C" {
+#endif
+extern int access(const char *path, int mode);
+#ifdef __cplusplus
+}
+#endif
+#else
+#include <unistd.h>
+#endif
+
+/* #define PRIVATE static */
+#define PRIVATE
+
+#ifdef TEST
+#define MAXRHS 5 /* Set low to exercise exception code */
+#else
+#define MAXRHS 1000
+#endif
+
+static int showPrecedenceConflict = 0;
+static char *msort(char*,char**,int(*)(const char*,const char*));
+
+/*
+** Compilers are getting increasingly pedantic about type conversions
+** as C evolves ever closer to Ada.... To work around the latest problems
+** we have to define the following variant of strlen().
+*/
+#define lemonStrlen(X) ((int)strlen(X))
+
+/*
+** Compilers are starting to complain about the use of sprintf() and strcpy(),
+** saying they are unsafe. So we define our own versions of those routines too.
+**
+** There are three routines here: lemon_sprintf(), lemon_vsprintf(), and
+** lemon_addtext(). The first two are replacements for sprintf() and vsprintf().
+** The third is a helper routine for vsnprintf() that adds texts to the end of a
+** buffer, making sure the buffer is always zero-terminated.
+**
+** The string formatter is a minimal subset of stdlib sprintf() supporting only
+** a few simply conversions:
+**
+** %d
+** %s
+** %.*s
+**
+*/
+static void lemon_addtext(
+ char *zBuf, /* The buffer to which text is added */
+ int *pnUsed, /* Slots of the buffer used so far */
+ const char *zIn, /* Text to add */
+ int nIn, /* Bytes of text to add. -1 to use strlen() */
+ int iWidth /* Field width. Negative to left justify */
+){
+ if( nIn<0 ) for(nIn=0; zIn[nIn]; nIn++){}
+ while( iWidth>nIn ){ zBuf[(*pnUsed)++] = ' '; iWidth--; }
+ if( nIn==0 ) return;
+ memcpy(&zBuf[*pnUsed], zIn, nIn);
+ *pnUsed += nIn;
+ while( (-iWidth)>nIn ){ zBuf[(*pnUsed)++] = ' '; iWidth++; }
+ zBuf[*pnUsed] = 0;
+}
+static int lemon_vsprintf(char *str, const char *zFormat, va_list ap){
+ int i, j, k, c;
+ int nUsed = 0;
+ const char *z;
+ char zTemp[50];
+ str[0] = 0;
+ for(i=j=0; (c = zFormat[i])!=0; i++){
+ if( c=='%' ){
+ int iWidth = 0;
+ lemon_addtext(str, &nUsed, &zFormat[j], i-j, 0);
+ c = zFormat[++i];
+ if( isdigit(c) || (c=='-' && isdigit(zFormat[i+1])) ){
+ if( c=='-' ) i++;
+ while( isdigit(zFormat[i]) ) iWidth = iWidth*10 + zFormat[i++] - '0';
+ if( c=='-' ) iWidth = -iWidth;
+ c = zFormat[i];
+ }
+ if( c=='d' ){
+ int v = va_arg(ap, int);
+ if( v<0 ){
+ lemon_addtext(str, &nUsed, "-", 1, iWidth);
+ v = -v;
+ }else if( v==0 ){
+ lemon_addtext(str, &nUsed, "0", 1, iWidth);
+ }
+ k = 0;
+ while( v>0 ){
+ k++;
+ zTemp[sizeof(zTemp)-k] = (v%10) + '0';
+ v /= 10;
+ }
+ lemon_addtext(str, &nUsed, &zTemp[sizeof(zTemp)-k], k, iWidth);
+ }else if( c=='s' ){
+ z = va_arg(ap, const char*);
+ lemon_addtext(str, &nUsed, z, -1, iWidth);
+ }else if( c=='.' && memcmp(&zFormat[i], ".*s", 3)==0 ){
+ i += 2;
+ k = va_arg(ap, int);
+ z = va_arg(ap, const char*);
+ lemon_addtext(str, &nUsed, z, k, iWidth);
+ }else if( c=='%' ){
+ lemon_addtext(str, &nUsed, "%", 1, 0);
+ }else{
+ fprintf(stderr, "illegal format\n");
+ exit(1);
+ }
+ j = i+1;
+ }
+ }
+ lemon_addtext(str, &nUsed, &zFormat[j], i-j, 0);
+ return nUsed;
+}
+static int lemon_sprintf(char *str, const char *format, ...){
+ va_list ap;
+ int rc;
+ va_start(ap, format);
+ rc = lemon_vsprintf(str, format, ap);
+ va_end(ap);
+ return rc;
+}
+static void lemon_strcpy(char *dest, const char *src){
+ while( (*(dest++) = *(src++))!=0 ){}
+}
+static void lemon_strcat(char *dest, const char *src){
+ while( *dest ) dest++;
+ lemon_strcpy(dest, src);
+}
+
+
+/* a few forward declarations... */
+struct rule;
+struct lemon;
+struct action;
+
+static struct action *Action_new(void);
+static struct action *Action_sort(struct action *);
+
+/********** From the file "build.h" ************************************/
+void FindRulePrecedences();
+void FindFirstSets();
+void FindStates();
+void FindLinks();
+void FindFollowSets();
+void FindActions();
+
+/********* From the file "configlist.h" *********************************/
+void Configlist_init(void);
+struct config *Configlist_add(struct rule *, int);
+struct config *Configlist_addbasis(struct rule *, int);
+void Configlist_closure(struct lemon *);
+void Configlist_sort(void);
+void Configlist_sortbasis(void);
+struct config *Configlist_return(void);
+struct config *Configlist_basis(void);
+void Configlist_eat(struct config *);
+void Configlist_reset(void);
+
+/********* From the file "error.h" ***************************************/
+void ErrorMsg(const char *, int,const char *, ...);
+
+/****** From the file "option.h" ******************************************/
+enum option_type { OPT_FLAG=1, OPT_INT, OPT_DBL, OPT_STR,
+ OPT_FFLAG, OPT_FINT, OPT_FDBL, OPT_FSTR};
+struct s_options {
+ enum option_type type;
+ const char *label;
+ char *arg;
+ const char *message;
+};
+int OptInit(char**,struct s_options*,FILE*);
+int OptNArgs(void);
+char *OptArg(int);
+void OptErr(int);
+void OptPrint(void);
+
+/******** From the file "parse.h" *****************************************/
+void Parse(struct lemon *lemp);
+
+/********* From the file "plink.h" ***************************************/
+struct plink *Plink_new(void);
+void Plink_add(struct plink **, struct config *);
+void Plink_copy(struct plink **, struct plink *);
+void Plink_delete(struct plink *);
+
+/********** From the file "report.h" *************************************/
+void Reprint(struct lemon *);
+void ReportOutput(struct lemon *);
+void ReportTable(struct lemon *, int);
+void ReportHeader(struct lemon *);
+void CompressTables(struct lemon *);
+void ResortStates(struct lemon *);
+
+/********** From the file "set.h" ****************************************/
+void SetSize(int); /* All sets will be of size N */
+char *SetNew(void); /* A new set for element 0..N */
+void SetFree(char*); /* Deallocate a set */
+int SetAdd(char*,int); /* Add element to a set */
+int SetUnion(char *,char *); /* A <- A U B, thru element N */
+#define SetFind(X,Y) (X[Y]) /* True if Y is in set X */
+
+/********** From the file "struct.h" *************************************/
+/*
+** Principal data structures for the LEMON parser generator.
+*/
+
+typedef enum {LEMON_FALSE=0, LEMON_TRUE} Boolean;
+
+/* Symbols (terminals and nonterminals) of the grammar are stored
+** in the following: */
+enum symbol_type {
+ TERMINAL,
+ NONTERMINAL,
+ MULTITERMINAL
+};
+enum e_assoc {
+ LEFT,
+ RIGHT,
+ NONE,
+ UNK
+};
+struct symbol {
+ const char *name; /* Name of the symbol */
+ int index; /* Index number for this symbol */
+ enum symbol_type type; /* Symbols are all either TERMINALS or NTs */
+ struct rule *rule; /* Linked list of rules of this (if an NT) */
+ struct symbol *fallback; /* fallback token in case this token doesn't parse */
+ int prec; /* Precedence if defined (-1 otherwise) */
+ enum e_assoc assoc; /* Associativity if precedence is defined */
+ char *firstset; /* First-set for all rules of this symbol */
+ Boolean lambda; /* True if NT and can generate an empty string */
+ int useCnt; /* Number of times used */
+ char *destructor; /* Code which executes whenever this symbol is
+ ** popped from the stack during error processing */
+ int destLineno; /* Line number for start of destructor */
+ char *datatype; /* The data type of information held by this
+ ** object. Only used if type==NONTERMINAL */
+ int dtnum; /* The data type number. In the parser, the value
+ ** stack is a union. The .yy%d element of this
+ ** union is the correct data type for this object */
+ /* The following fields are used by MULTITERMINALs only */
+ int nsubsym; /* Number of constituent symbols in the MULTI */
+ struct symbol **subsym; /* Array of constituent symbols */
+};
+
+/* Each production rule in the grammar is stored in the following
+** structure. */
+struct rule {
+ struct symbol *lhs; /* Left-hand side of the rule */
+ const char *lhsalias; /* Alias for the LHS (NULL if none) */
+ int lhsStart; /* True if left-hand side is the start symbol */
+ int ruleline; /* Line number for the rule */
+ int nrhs; /* Number of RHS symbols */
+ struct symbol **rhs; /* The RHS symbols */
+ const char **rhsalias; /* An alias for each RHS symbol (NULL if none) */
+ int line; /* Line number at which code begins */
+ const char *code; /* The code executed when this rule is reduced */
+ struct symbol *precsym; /* Precedence symbol for this rule */
+ int index; /* An index number for this rule */
+ Boolean canReduce; /* True if this rule is ever reduced */
+ struct rule *nextlhs; /* Next rule with the same LHS */
+ struct rule *next; /* Next rule in the global list */
+};
+
+/* A configuration is a production rule of the grammar together with
+** a mark (dot) showing how much of that rule has been processed so far.
+** Configurations also contain a follow-set which is a list of terminal
+** symbols which are allowed to immediately follow the end of the rule.
+** Every configuration is recorded as an instance of the following: */
+enum cfgstatus {
+ COMPLETE,
+ INCOMPLETE
+};
+struct config {
+ struct rule *rp; /* The rule upon which the configuration is based */
+ int dot; /* The parse point */
+ char *fws; /* Follow-set for this configuration only */
+ struct plink *fplp; /* Follow-set forward propagation links */
+ struct plink *bplp; /* Follow-set backwards propagation links */
+ struct state *stp; /* Pointer to state which contains this */
+ enum cfgstatus status; /* used during followset and shift computations */
+ struct config *next; /* Next configuration in the state */
+ struct config *bp; /* The next basis configuration */
+};
+
+enum e_action {
+ SHIFT,
+ ACCEPT,
+ REDUCE,
+ ERROR,
+ SSCONFLICT, /* A shift/shift conflict */
+ SRCONFLICT, /* Was a reduce, but part of a conflict */
+ RRCONFLICT, /* Was a reduce, but part of a conflict */
+ SH_RESOLVED, /* Was a shift. Precedence resolved conflict */
+ RD_RESOLVED, /* Was reduce. Precedence resolved conflict */
+ NOT_USED /* Deleted by compression */
+};
+
+/* Every shift or reduce operation is stored as one of the following */
+struct action {
+ struct symbol *sp; /* The look-ahead symbol */
+ enum e_action type;
+ union {
+ struct state *stp; /* The new state, if a shift */
+ struct rule *rp; /* The rule, if a reduce */
+ } x;
+ struct action *next; /* Next action for this state */
+ struct action *collide; /* Next action with the same hash */
+};
+
+/* Each state of the generated parser's finite state machine
+** is encoded as an instance of the following structure. */
+struct state {
+ struct config *bp; /* The basis configurations for this state */
+ struct config *cfp; /* All configurations in this set */
+ int statenum; /* Sequential number for this state */
+ struct action *ap; /* Array of actions for this state */
+ int nTknAct, nNtAct; /* Number of actions on terminals and nonterminals */
+ int iTknOfst, iNtOfst; /* yy_action[] offset for terminals and nonterms */
+ int iDflt; /* Default action */
+};
+#define NO_OFFSET (-2147483647)
+
+/* A followset propagation link indicates that the contents of one
+** configuration followset should be propagated to another whenever
+** the first changes. */
+struct plink {
+ struct config *cfp; /* The configuration to which linked */
+ struct plink *next; /* The next propagate link */
+};
+
+/* The state vector for the entire parser generator is recorded as
+** follows. (LEMON uses no global variables and makes little use of
+** static variables. Fields in the following structure can be thought
+** of as begin global variables in the program.) */
+struct lemon {
+ struct state **sorted; /* Table of states sorted by state number */
+ struct rule *rule; /* List of all rules */
+ int nstate; /* Number of states */
+ int nrule; /* Number of rules */
+ int nsymbol; /* Number of terminal and nonterminal symbols */
+ int nterminal; /* Number of terminal symbols */
+ struct symbol **symbols; /* Sorted array of pointers to symbols */
+ int errorcnt; /* Number of errors */
+ struct symbol *errsym; /* The error symbol */
+ struct symbol *wildcard; /* Token that matches anything */
+ char *name; /* Name of the generated parser */
+ char *arg; /* Declaration of the 3th argument to parser */
+ char *tokentype; /* Type of terminal symbols in the parser stack */
+ char *vartype; /* The default type of non-terminal symbols */
+ char *start; /* Name of the start symbol for the grammar */
+ char *stacksize; /* Size of the parser stack */
+ char *include; /* Code to put at the start of the C file */
+ char *error; /* Code to execute when an error is seen */
+ char *overflow; /* Code to execute on a stack overflow */
+ char *failure; /* Code to execute on parser failure */
+ char *accept; /* Code to execute when the parser excepts */
+ char *extracode; /* Code appended to the generated file */
+ char *tokendest; /* Code to execute to destroy token data */
+ char *vardest; /* Code for the default non-terminal destructor */
+ char *filename; /* Name of the input file */
+ char *outname; /* Name of the current output file */
+ char *tokenprefix; /* A prefix added to token names in the .h file */
+ int nconflict; /* Number of parsing conflicts */
+ int tablesize; /* Size of the parse tables */
+ int basisflag; /* Print only basis configurations */
+ int has_fallback; /* True if any %fallback is seen in the grammar */
+ int nolinenosflag; /* True if #line statements should not be printed */
+ char *argv0; /* Name of the program */
+};
+
+#define MemoryCheck(X) if((X)==0){ \
+ extern void memory_error(); \
+ memory_error(); \
+}
+
+/**************** From the file "table.h" *********************************/
+/*
+** All code in this file has been automatically generated
+** from a specification in the file
+** "table.q"
+** by the associative array code building program "aagen".
+** Do not edit this file! Instead, edit the specification
+** file, then rerun aagen.
+*/
+/*
+** Code for processing tables in the LEMON parser generator.
+*/
+/* Routines for handling a strings */
+
+const char *Strsafe(const char *);
+
+void Strsafe_init(void);
+int Strsafe_insert(const char *);
+const char *Strsafe_find(const char *);
+
+/* Routines for handling symbols of the grammar */
+
+struct symbol *Symbol_new(const char *);
+int Symbolcmpp(const void *, const void *);
+void Symbol_init(void);
+int Symbol_insert(struct symbol *, const char *);
+struct symbol *Symbol_find(const char *);
+struct symbol *Symbol_Nth(int);
+int Symbol_count(void);
+struct symbol **Symbol_arrayof(void);
+
+/* Routines to manage the state table */
+
+int Configcmp(const char *, const char *);
+struct state *State_new(void);
+void State_init(void);
+int State_insert(struct state *, struct config *);
+struct state *State_find(struct config *);
+struct state **State_arrayof(/* */);
+
+/* Routines used for efficiency in Configlist_add */
+
+void Configtable_init(void);
+int Configtable_insert(struct config *);
+struct config *Configtable_find(struct config *);
+void Configtable_clear(int(*)(struct config *));
+
+/****************** From the file "action.c" *******************************/
+/*
+** Routines processing parser actions in the LEMON parser generator.
+*/
+
+/* Allocate a new parser action */
+static struct action *Action_new(void){
+ static struct action *freelist = 0;
+ struct action *newaction;
+
+ if( freelist==0 ){
+ int i;
+ int amt = 100;
+ freelist = (struct action *)calloc(amt, sizeof(struct action));
+ if( freelist==0 ){
+ fprintf(stderr,"Unable to allocate memory for a new parser action.");
+ exit(1);
+ }
+ for(i=0; i<amt-1; i++) freelist[i].next = &freelist[i+1];
+ freelist[amt-1].next = 0;
+ }
+ newaction = freelist;
+ freelist = freelist->next;
+ return newaction;
+}
+
+/* Compare two actions for sorting purposes. Return negative, zero, or
+** positive if the first action is less than, equal to, or greater than
+** the first
+*/
+static int actioncmp(
+ struct action *ap1,
+ struct action *ap2
+){
+ int rc;
+ rc = ap1->sp->index - ap2->sp->index;
+ if( rc==0 ){
+ rc = (int)ap1->type - (int)ap2->type;
+ }
+ if( rc==0 && ap1->type==REDUCE ){
+ rc = ap1->x.rp->index - ap2->x.rp->index;
+ }
+ if( rc==0 ){
+ rc = (int) (ap2 - ap1);
+ }
+ return rc;
+}
+
+/* Sort parser actions */
+static struct action *Action_sort(
+ struct action *ap
+){
+ ap = (struct action *)msort((char *)ap,(char **)&ap->next,
+ (int(*)(const char*,const char*))actioncmp);
+ return ap;
+}
+
+void Action_add(
+ struct action **app,
+ enum e_action type,
+ struct symbol *sp,
+ char *arg
+){
+ struct action *newaction;
+ newaction = Action_new();
+ newaction->next = *app;
+ *app = newaction;
+ newaction->type = type;
+ newaction->sp = sp;
+ if( type==SHIFT ){
+ newaction->x.stp = (struct state *)arg;
+ }else{
+ newaction->x.rp = (struct rule *)arg;
+ }
+}
+/********************** New code to implement the "acttab" module ***********/
+/*
+** This module implements routines use to construct the yy_action[] table.
+*/
+
+/*
+** The state of the yy_action table under construction is an instance of
+** the following structure.
+**
+** The yy_action table maps the pair (state_number, lookahead) into an
+** action_number. The table is an array of integers pairs. The state_number
+** determines an initial offset into the yy_action array. The lookahead
+** value is then added to this initial offset to get an index X into the
+** yy_action array. If the aAction[X].lookahead equals the value of the
+** of the lookahead input, then the value of the action_number output is
+** aAction[X].action. If the lookaheads do not match then the
+** default action for the state_number is returned.
+**
+** All actions associated with a single state_number are first entered
+** into aLookahead[] using multiple calls to acttab_action(). Then the
+** actions for that single state_number are placed into the aAction[]
+** array with a single call to acttab_insert(). The acttab_insert() call
+** also resets the aLookahead[] array in preparation for the next
+** state number.
+*/
+struct lookahead_action {
+ int lookahead; /* Value of the lookahead token */
+ int action; /* Action to take on the given lookahead */
+};
+typedef struct acttab acttab;
+struct acttab {
+ int nAction; /* Number of used slots in aAction[] */
+ int nActionAlloc; /* Slots allocated for aAction[] */
+ struct lookahead_action
+ *aAction, /* The yy_action[] table under construction */
+ *aLookahead; /* A single new transaction set */
+ int mnLookahead; /* Minimum aLookahead[].lookahead */
+ int mnAction; /* Action associated with mnLookahead */
+ int mxLookahead; /* Maximum aLookahead[].lookahead */
+ int nLookahead; /* Used slots in aLookahead[] */
+ int nLookaheadAlloc; /* Slots allocated in aLookahead[] */
+};
+
+/* Return the number of entries in the yy_action table */
+#define acttab_size(X) ((X)->nAction)
+
+/* The value for the N-th entry in yy_action */
+#define acttab_yyaction(X,N) ((X)->aAction[N].action)
+
+/* The value for the N-th entry in yy_lookahead */
+#define acttab_yylookahead(X,N) ((X)->aAction[N].lookahead)
+
+/* Free all memory associated with the given acttab */
+void acttab_free(acttab *p){
+ free( p->aAction );
+ free( p->aLookahead );
+ free( p );
+}
+
+/* Allocate a new acttab structure */
+acttab *acttab_alloc(void){
+ acttab *p = (acttab *) calloc( 1, sizeof(*p) );
+ if( p==0 ){
+ fprintf(stderr,"Unable to allocate memory for a new acttab.");
+ exit(1);
+ }
+ memset(p, 0, sizeof(*p));
+ return p;
+}
+
+/* Add a new action to the current transaction set.
+**
+** This routine is called once for each lookahead for a particular
+** state.
+*/
+void acttab_action(acttab *p, int lookahead, int action){
+ if( p->nLookahead>=p->nLookaheadAlloc ){
+ p->nLookaheadAlloc += 25;
+ p->aLookahead = (struct lookahead_action *) realloc( p->aLookahead,
+ sizeof(p->aLookahead[0])*p->nLookaheadAlloc );
+ if( p->aLookahead==0 ){
+ fprintf(stderr,"malloc failed\n");
+ exit(1);
+ }
+ }
+ if( p->nLookahead==0 ){
+ p->mxLookahead = lookahead;
+ p->mnLookahead = lookahead;
+ p->mnAction = action;
+ }else{
+ if( p->mxLookahead<lookahead ) p->mxLookahead = lookahead;
+ if( p->mnLookahead>lookahead ){
+ p->mnLookahead = lookahead;
+ p->mnAction = action;
+ }
+ }
+ p->aLookahead[p->nLookahead].lookahead = lookahead;
+ p->aLookahead[p->nLookahead].action = action;
+ p->nLookahead++;
+}
+
+/*
+** Add the transaction set built up with prior calls to acttab_action()
+** into the current action table. Then reset the transaction set back
+** to an empty set in preparation for a new round of acttab_action() calls.
+**
+** Return the offset into the action table of the new transaction.
+*/
+int acttab_insert(acttab *p){
+ int i, j, k, n;
+ assert( p->nLookahead>0 );
+
+ /* Make sure we have enough space to hold the expanded action table
+ ** in the worst case. The worst case occurs if the transaction set
+ ** must be appended to the current action table
+ */
+ n = p->mxLookahead + 1;
+ if( p->nAction + n >= p->nActionAlloc ){
+ int oldAlloc = p->nActionAlloc;
+ p->nActionAlloc = p->nAction + n + p->nActionAlloc + 20;
+ p->aAction = (struct lookahead_action *) realloc( p->aAction,
+ sizeof(p->aAction[0])*p->nActionAlloc);
+ if( p->aAction==0 ){
+ fprintf(stderr,"malloc failed\n");
+ exit(1);
+ }
+ for(i=oldAlloc; i<p->nActionAlloc; i++){
+ p->aAction[i].lookahead = -1;
+ p->aAction[i].action = -1;
+ }
+ }
+
+ /* Scan the existing action table looking for an offset that is a
+ ** duplicate of the current transaction set. Fall out of the loop
+ ** if and when the duplicate is found.
+ **
+ ** i is the index in p->aAction[] where p->mnLookahead is inserted.
+ */
+ for(i=p->nAction-1; i>=0; i--){
+ if( p->aAction[i].lookahead==p->mnLookahead ){
+ /* All lookaheads and actions in the aLookahead[] transaction
+ ** must match against the candidate aAction[i] entry. */
+ if( p->aAction[i].action!=p->mnAction ) continue;
+ for(j=0; j<p->nLookahead; j++){
+ k = p->aLookahead[j].lookahead - p->mnLookahead + i;
+ if( k<0 || k>=p->nAction ) break;
+ if( p->aLookahead[j].lookahead!=p->aAction[k].lookahead ) break;
+ if( p->aLookahead[j].action!=p->aAction[k].action ) break;
+ }
+ if( j<p->nLookahead ) continue;
+
+ /* No possible lookahead value that is not in the aLookahead[]
+ ** transaction is allowed to match aAction[i] */
+ n = 0;
+ for(j=0; j<p->nAction; j++){
+ if( p->aAction[j].lookahead<0 ) continue;
+ if( p->aAction[j].lookahead==j+p->mnLookahead-i ) n++;
+ }
+ if( n==p->nLookahead ){
+ break; /* An exact match is found at offset i */
+ }
+ }
+ }
+
+ /* If no existing offsets exactly match the current transaction, find an
+ ** an empty offset in the aAction[] table in which we can add the
+ ** aLookahead[] transaction.
+ */
+ if( i<0 ){
+ /* Look for holes in the aAction[] table that fit the current
+ ** aLookahead[] transaction. Leave i set to the offset of the hole.
+ ** If no holes are found, i is left at p->nAction, which means the
+ ** transaction will be appended. */
+ for(i=0; i<p->nActionAlloc - p->mxLookahead; i++){
+ if( p->aAction[i].lookahead<0 ){
+ for(j=0; j<p->nLookahead; j++){
+ k = p->aLookahead[j].lookahead - p->mnLookahead + i;
+ if( k<0 ) break;
+ if( p->aAction[k].lookahead>=0 ) break;
+ }
+ if( j<p->nLookahead ) continue;
+ for(j=0; j<p->nAction; j++){
+ if( p->aAction[j].lookahead==j+p->mnLookahead-i ) break;
+ }
+ if( j==p->nAction ){
+ break; /* Fits in empty slots */
+ }
+ }
+ }
+ }
+ /* Insert transaction set at index i. */
+ for(j=0; j<p->nLookahead; j++){
+ k = p->aLookahead[j].lookahead - p->mnLookahead + i;
+ p->aAction[k] = p->aLookahead[j];
+ if( k>=p->nAction ) p->nAction = k+1;
+ }
+ p->nLookahead = 0;
+
+ /* Return the offset that is added to the lookahead in order to get the
+ ** index into yy_action of the action */
+ return i - p->mnLookahead;
+}
+
+/********************** From the file "build.c" *****************************/
+/*
+** Routines to construction the finite state machine for the LEMON
+** parser generator.
+*/
+
+/* Find a precedence symbol of every rule in the grammar.
+**
+** Those rules which have a precedence symbol coded in the input
+** grammar using the "[symbol]" construct will already have the
+** rp->precsym field filled. Other rules take as their precedence
+** symbol the first RHS symbol with a defined precedence. If there
+** are not RHS symbols with a defined precedence, the precedence
+** symbol field is left blank.
+*/
+void FindRulePrecedences(struct lemon *xp)
+{
+ struct rule *rp;
+ for(rp=xp->rule; rp; rp=rp->next){
+ if( rp->precsym==0 ){
+ int i, j;
+ for(i=0; i<rp->nrhs && rp->precsym==0; i++){
+ struct symbol *sp = rp->rhs[i];
+ if( sp->type==MULTITERMINAL ){
+ for(j=0; j<sp->nsubsym; j++){
+ if( sp->subsym[j]->prec>=0 ){
+ rp->precsym = sp->subsym[j];
+ break;
+ }
+ }
+ }else if( sp->prec>=0 ){
+ rp->precsym = rp->rhs[i];
+ }
+ }
+ }
+ }
+ return;
+}
+
+/* Find all nonterminals which will generate the empty string.
+** Then go back and compute the first sets of every nonterminal.
+** The first set is the set of all terminal symbols which can begin
+** a string generated by that nonterminal.
+*/
+void FindFirstSets(struct lemon *lemp)
+{
+ int i, j;
+ struct rule *rp;
+ int progress;
+
+ for(i=0; i<lemp->nsymbol; i++){
+ lemp->symbols[i]->lambda = LEMON_FALSE;
+ }
+ for(i=lemp->nterminal; i<lemp->nsymbol; i++){
+ lemp->symbols[i]->firstset = SetNew();
+ }
+
+ /* First compute all lambdas */
+ do{
+ progress = 0;
+ for(rp=lemp->rule; rp; rp=rp->next){
+ if( rp->lhs->lambda ) continue;
+ for(i=0; i<rp->nrhs; i++){
+ struct symbol *sp = rp->rhs[i];
+ assert( sp->type==NONTERMINAL || sp->lambda==LEMON_FALSE );
+ if( sp->lambda==LEMON_FALSE ) break;
+ }
+ if( i==rp->nrhs ){
+ rp->lhs->lambda = LEMON_TRUE;
+ progress = 1;
+ }
+ }
+ }while( progress );
+
+ /* Now compute all first sets */
+ do{
+ struct symbol *s1, *s2;
+ progress = 0;
+ for(rp=lemp->rule; rp; rp=rp->next){
+ s1 = rp->lhs;
+ for(i=0; i<rp->nrhs; i++){
+ s2 = rp->rhs[i];
+ if( s2->type==TERMINAL ){
+ progress += SetAdd(s1->firstset,s2->index);
+ break;
+ }else if( s2->type==MULTITERMINAL ){
+ for(j=0; j<s2->nsubsym; j++){
+ progress += SetAdd(s1->firstset,s2->subsym[j]->index);
+ }
+ break;
+ }else if( s1==s2 ){
+ if( s1->lambda==LEMON_FALSE ) break;
+ }else{
+ progress += SetUnion(s1->firstset,s2->firstset);
+ if( s2->lambda==LEMON_FALSE ) break;
+ }
+ }
+ }
+ }while( progress );
+ return;
+}
+
+/* Compute all LR(0) states for the grammar. Links
+** are added to between some states so that the LR(1) follow sets
+** can be computed later.
+*/
+PRIVATE struct state *getstate(struct lemon *); /* forward reference */
+void FindStates(struct lemon *lemp)
+{
+ struct symbol *sp;
+ struct rule *rp;
+
+ Configlist_init();
+
+ /* Find the start symbol */
+ if( lemp->start ){
+ sp = Symbol_find(lemp->start);
+ if( sp==0 ){
+ ErrorMsg(lemp->filename,0,
+"The specified start symbol \"%s\" is not \
+in a nonterminal of the grammar. \"%s\" will be used as the start \
+symbol instead.",lemp->start,lemp->rule->lhs->name);
+ lemp->errorcnt++;
+ sp = lemp->rule->lhs;
+ }
+ }else{
+ sp = lemp->rule->lhs;
+ }
+
+ /* Make sure the start symbol doesn't occur on the right-hand side of
+ ** any rule. Report an error if it does. (YACC would generate a new
+ ** start symbol in this case.) */
+ for(rp=lemp->rule; rp; rp=rp->next){
+ int i;
+ for(i=0; i<rp->nrhs; i++){
+ if( rp->rhs[i]==sp ){ /* FIX ME: Deal with multiterminals */
+ ErrorMsg(lemp->filename,0,
+"The start symbol \"%s\" occurs on the \
+right-hand side of a rule. This will result in a parser which \
+does not work properly.",sp->name);
+ lemp->errorcnt++;
+ }
+ }
+ }
+
+ /* The basis configuration set for the first state
+ ** is all rules which have the start symbol as their
+ ** left-hand side */
+ for(rp=sp->rule; rp; rp=rp->nextlhs){
+ struct config *newcfp;
+ rp->lhsStart = 1;
+ newcfp = Configlist_addbasis(rp,0);
+ SetAdd(newcfp->fws,0);
+ }
+
+ /* Compute the first state. All other states will be
+ ** computed automatically during the computation of the first one.
+ ** The returned pointer to the first state is not used. */
+ (void)getstate(lemp);
+ return;
+}
+
+/* Return a pointer to a state which is described by the configuration
+** list which has been built from calls to Configlist_add.
+*/
+PRIVATE void buildshifts(struct lemon *, struct state *); /* Forwd ref */
+PRIVATE struct state *getstate(struct lemon *lemp)
+{
+ struct config *cfp, *bp;
+ struct state *stp;
+
+ /* Extract the sorted basis of the new state. The basis was constructed
+ ** by prior calls to "Configlist_addbasis()". */
+ Configlist_sortbasis();
+ bp = Configlist_basis();
+
+ /* Get a state with the same basis */
+ stp = State_find(bp);
+ if( stp ){
+ /* A state with the same basis already exists! Copy all the follow-set
+ ** propagation links from the state under construction into the
+ ** preexisting state, then return a pointer to the preexisting state */
+ struct config *x, *y;
+ for(x=bp, y=stp->bp; x && y; x=x->bp, y=y->bp){
+ Plink_copy(&y->bplp,x->bplp);
+ Plink_delete(x->fplp);
+ x->fplp = x->bplp = 0;
+ }
+ cfp = Configlist_return();
+ Configlist_eat(cfp);
+ }else{
+ /* This really is a new state. Construct all the details */
+ Configlist_closure(lemp); /* Compute the configuration closure */
+ Configlist_sort(); /* Sort the configuration closure */
+ cfp = Configlist_return(); /* Get a pointer to the config list */
+ stp = State_new(); /* A new state structure */
+ MemoryCheck(stp);
+ stp->bp = bp; /* Remember the configuration basis */
+ stp->cfp = cfp; /* Remember the configuration closure */
+ stp->statenum = lemp->nstate++; /* Every state gets a sequence number */
+ stp->ap = 0; /* No actions, yet. */
+ State_insert(stp,stp->bp); /* Add to the state table */
+ buildshifts(lemp,stp); /* Recursively compute successor states */
+ }
+ return stp;
+}
+
+/*
+** Return true if two symbols are the same.
+*/
+int same_symbol(struct symbol *a, struct symbol *b)
+{
+ int i;
+ if( a==b ) return 1;
+ if( a->type!=MULTITERMINAL ) return 0;
+ if( b->type!=MULTITERMINAL ) return 0;
+ if( a->nsubsym!=b->nsubsym ) return 0;
+ for(i=0; i<a->nsubsym; i++){
+ if( a->subsym[i]!=b->subsym[i] ) return 0;
+ }
+ return 1;
+}
+
+/* Construct all successor states to the given state. A "successor"
+** state is any state which can be reached by a shift action.
+*/
+PRIVATE void buildshifts(struct lemon *lemp, struct state *stp)
+{
+ struct config *cfp; /* For looping thru the config closure of "stp" */
+ struct config *bcfp; /* For the inner loop on config closure of "stp" */
+ struct config *newcfg; /* */
+ struct symbol *sp; /* Symbol following the dot in configuration "cfp" */
+ struct symbol *bsp; /* Symbol following the dot in configuration "bcfp" */
+ struct state *newstp; /* A pointer to a successor state */
+
+ /* Each configuration becomes complete after it contibutes to a successor
+ ** state. Initially, all configurations are incomplete */
+ for(cfp=stp->cfp; cfp; cfp=cfp->next) cfp->status = INCOMPLETE;
+
+ /* Loop through all configurations of the state "stp" */
+ for(cfp=stp->cfp; cfp; cfp=cfp->next){
+ if( cfp->status==COMPLETE ) continue; /* Already used by inner loop */
+ if( cfp->dot>=cfp->rp->nrhs ) continue; /* Can't shift this config */
+ Configlist_reset(); /* Reset the new config set */
+ sp = cfp->rp->rhs[cfp->dot]; /* Symbol after the dot */
+
+ /* For every configuration in the state "stp" which has the symbol "sp"
+ ** following its dot, add the same configuration to the basis set under
+ ** construction but with the dot shifted one symbol to the right. */
+ for(bcfp=cfp; bcfp; bcfp=bcfp->next){
+ if( bcfp->status==COMPLETE ) continue; /* Already used */
+ if( bcfp->dot>=bcfp->rp->nrhs ) continue; /* Can't shift this one */
+ bsp = bcfp->rp->rhs[bcfp->dot]; /* Get symbol after dot */
+ if( !same_symbol(bsp,sp) ) continue; /* Must be same as for "cfp" */
+ bcfp->status = COMPLETE; /* Mark this config as used */
+ newcfg = Configlist_addbasis(bcfp->rp,bcfp->dot+1);
+ Plink_add(&newcfg->bplp,bcfp);
+ }
+
+ /* Get a pointer to the state described by the basis configuration set
+ ** constructed in the preceding loop */
+ newstp = getstate(lemp);
+
+ /* The state "newstp" is reached from the state "stp" by a shift action
+ ** on the symbol "sp" */
+ if( sp->type==MULTITERMINAL ){
+ int i;
+ for(i=0; i<sp->nsubsym; i++){
+ Action_add(&stp->ap,SHIFT,sp->subsym[i],(char*)newstp);
+ }
+ }else{
+ Action_add(&stp->ap,SHIFT,sp,(char *)newstp);
+ }
+ }
+}
+
+/*
+** Construct the propagation links
+*/
+void FindLinks(struct lemon *lemp)
+{
+ int i;
+ struct config *cfp, *other;
+ struct state *stp;
+ struct plink *plp;
+
+ /* Housekeeping detail:
+ ** Add to every propagate link a pointer back to the state to
+ ** which the link is attached. */
+ for(i=0; i<lemp->nstate; i++){
+ stp = lemp->sorted[i];
+ for(cfp=stp->cfp; cfp; cfp=cfp->next){
+ cfp->stp = stp;
+ }
+ }
+
+ /* Convert all backlinks into forward links. Only the forward
+ ** links are used in the follow-set computation. */
+ for(i=0; i<lemp->nstate; i++){
+ stp = lemp->sorted[i];
+ for(cfp=stp->cfp; cfp; cfp=cfp->next){
+ for(plp=cfp->bplp; plp; plp=plp->next){
+ other = plp->cfp;
+ Plink_add(&other->fplp,cfp);
+ }
+ }
+ }
+}
+
+/* Compute all followsets.
+**
+** A followset is the set of all symbols which can come immediately
+** after a configuration.
+*/
+void FindFollowSets(struct lemon *lemp)
+{
+ int i;
+ struct config *cfp;
+ struct plink *plp;
+ int progress;
+ int change;
+
+ for(i=0; i<lemp->nstate; i++){
+ for(cfp=lemp->sorted[i]->cfp; cfp; cfp=cfp->next){
+ cfp->status = INCOMPLETE;
+ }
+ }
+
+ do{
+ progress = 0;
+ for(i=0; i<lemp->nstate; i++){
+ for(cfp=lemp->sorted[i]->cfp; cfp; cfp=cfp->next){
+ if( cfp->status==COMPLETE ) continue;
+ for(plp=cfp->fplp; plp; plp=plp->next){
+ change = SetUnion(plp->cfp->fws,cfp->fws);
+ if( change ){
+ plp->cfp->status = INCOMPLETE;
+ progress = 1;
+ }
+ }
+ cfp->status = COMPLETE;
+ }
+ }
+ }while( progress );
+}
+
+static int resolve_conflict(struct action *,struct action *);
+
+/* Compute the reduce actions, and resolve conflicts.
+*/
+void FindActions(struct lemon *lemp)
+{
+ int i,j;
+ struct config *cfp;
+ struct state *stp;
+ struct symbol *sp;
+ struct rule *rp;
+
+ /* Add all of the reduce actions
+ ** A reduce action is added for each element of the followset of
+ ** a configuration which has its dot at the extreme right.
+ */
+ for(i=0; i<lemp->nstate; i++){ /* Loop over all states */
+ stp = lemp->sorted[i];
+ for(cfp=stp->cfp; cfp; cfp=cfp->next){ /* Loop over all configurations */
+ if( cfp->rp->nrhs==cfp->dot ){ /* Is dot at extreme right? */
+ for(j=0; j<lemp->nterminal; j++){
+ if( SetFind(cfp->fws,j) ){
+ /* Add a reduce action to the state "stp" which will reduce by the
+ ** rule "cfp->rp" if the lookahead symbol is "lemp->symbols[j]" */
+ Action_add(&stp->ap,REDUCE,lemp->symbols[j],(char *)cfp->rp);
+ }
+ }
+ }
+ }
+ }
+
+ /* Add the accepting token */
+ if( lemp->start ){
+ sp = Symbol_find(lemp->start);
+ if( sp==0 ) sp = lemp->rule->lhs;
+ }else{
+ sp = lemp->rule->lhs;
+ }
+ /* Add to the first state (which is always the starting state of the
+ ** finite state machine) an action to ACCEPT if the lookahead is the
+ ** start nonterminal. */
+ Action_add(&lemp->sorted[0]->ap,ACCEPT,sp,0);
+
+ /* Resolve conflicts */
+ for(i=0; i<lemp->nstate; i++){
+ struct action *ap, *nap;
+ struct state *stp;
+ stp = lemp->sorted[i];
+ /* assert( stp->ap ); */
+ stp->ap = Action_sort(stp->ap);
+ for(ap=stp->ap; ap && ap->next; ap=ap->next){
+ for(nap=ap->next; nap && nap->sp==ap->sp; nap=nap->next){
+ /* The two actions "ap" and "nap" have the same lookahead.
+ ** Figure out which one should be used */
+ lemp->nconflict += resolve_conflict(ap,nap);
+ }
+ }
+ }
+
+ /* Report an error for each rule that can never be reduced. */
+ for(rp=lemp->rule; rp; rp=rp->next) rp->canReduce = LEMON_FALSE;
+ for(i=0; i<lemp->nstate; i++){
+ struct action *ap;
+ for(ap=lemp->sorted[i]->ap; ap; ap=ap->next){
+ if( ap->type==REDUCE ) ap->x.rp->canReduce = LEMON_TRUE;
+ }
+ }
+ for(rp=lemp->rule; rp; rp=rp->next){
+ if( rp->canReduce ) continue;
+ ErrorMsg(lemp->filename,rp->ruleline,"This rule can not be reduced.\n");
+ lemp->errorcnt++;
+ }
+}
+
+/* Resolve a conflict between the two given actions. If the
+** conflict can't be resolved, return non-zero.
+**
+** NO LONGER TRUE:
+** To resolve a conflict, first look to see if either action
+** is on an error rule. In that case, take the action which
+** is not associated with the error rule. If neither or both
+** actions are associated with an error rule, then try to
+** use precedence to resolve the conflict.
+**
+** If either action is a SHIFT, then it must be apx. This
+** function won't work if apx->type==REDUCE and apy->type==SHIFT.
+*/
+static int resolve_conflict(
+ struct action *apx,
+ struct action *apy
+){
+ struct symbol *spx, *spy;
+ int errcnt = 0;
+ assert( apx->sp==apy->sp ); /* Otherwise there would be no conflict */
+ if( apx->type==SHIFT && apy->type==SHIFT ){
+ apy->type = SSCONFLICT;
+ errcnt++;
+ }
+ if( apx->type==SHIFT && apy->type==REDUCE ){
+ spx = apx->sp;
+ spy = apy->x.rp->precsym;
+ if( spy==0 || spx->prec<0 || spy->prec<0 ){
+ /* Not enough precedence information. */
+ apy->type = SRCONFLICT;
+ errcnt++;
+ }else if( spx->prec>spy->prec ){ /* higher precedence wins */
+ apy->type = RD_RESOLVED;
+ }else if( spx->prec<spy->prec ){
+ apx->type = SH_RESOLVED;
+ }else if( spx->prec==spy->prec && spx->assoc==RIGHT ){ /* Use operator */
+ apy->type = RD_RESOLVED; /* associativity */
+ }else if( spx->prec==spy->prec && spx->assoc==LEFT ){ /* to break tie */
+ apx->type = SH_RESOLVED;
+ }else{
+ assert( spx->prec==spy->prec && spx->assoc==NONE );
+ apx->type = ERROR;
+ }
+ }else if( apx->type==REDUCE && apy->type==REDUCE ){
+ spx = apx->x.rp->precsym;
+ spy = apy->x.rp->precsym;
+ if( spx==0 || spy==0 || spx->prec<0 ||
+ spy->prec<0 || spx->prec==spy->prec ){
+ apy->type = RRCONFLICT;
+ errcnt++;
+ }else if( spx->prec>spy->prec ){
+ apy->type = RD_RESOLVED;
+ }else if( spx->prec<spy->prec ){
+ apx->type = RD_RESOLVED;
+ }
+ }else{
+ assert(
+ apx->type==SH_RESOLVED ||
+ apx->type==RD_RESOLVED ||
+ apx->type==SSCONFLICT ||
+ apx->type==SRCONFLICT ||
+ apx->type==RRCONFLICT ||
+ apy->type==SH_RESOLVED ||
+ apy->type==RD_RESOLVED ||
+ apy->type==SSCONFLICT ||
+ apy->type==SRCONFLICT ||
+ apy->type==RRCONFLICT
+ );
+ /* The REDUCE/SHIFT case cannot happen because SHIFTs come before
+ ** REDUCEs on the list. If we reach this point it must be because
+ ** the parser conflict had already been resolved. */
+ }
+ return errcnt;
+}
+/********************* From the file "configlist.c" *************************/
+/*
+** Routines to processing a configuration list and building a state
+** in the LEMON parser generator.
+*/
+
+static struct config *freelist = 0; /* List of free configurations */
+static struct config *current = 0; /* Top of list of configurations */
+static struct config **currentend = 0; /* Last on list of configs */
+static struct config *basis = 0; /* Top of list of basis configs */
+static struct config **basisend = 0; /* End of list of basis configs */
+
+/* Return a pointer to a new configuration */
+PRIVATE struct config *newconfig(){
+ struct config *newcfg;
+ if( freelist==0 ){
+ int i;
+ int amt = 3;
+ freelist = (struct config *)calloc( amt, sizeof(struct config) );
+ if( freelist==0 ){
+ fprintf(stderr,"Unable to allocate memory for a new configuration.");
+ exit(1);
+ }
+ for(i=0; i<amt-1; i++) freelist[i].next = &freelist[i+1];
+ freelist[amt-1].next = 0;
+ }
+ newcfg = freelist;
+ freelist = freelist->next;
+ return newcfg;
+}
+
+/* The configuration "old" is no longer used */
+PRIVATE void deleteconfig(struct config *old)
+{
+ old->next = freelist;
+ freelist = old;
+}
+
+/* Initialized the configuration list builder */
+void Configlist_init(){
+ current = 0;
+ currentend = ¤t;
+ basis = 0;
+ basisend = &basis;
+ Configtable_init();
+ return;
+}
+
+/* Initialized the configuration list builder */
+void Configlist_reset(){
+ current = 0;
+ currentend = ¤t;
+ basis = 0;
+ basisend = &basis;
+ Configtable_clear(0);
+ return;
+}
+
+/* Add another configuration to the configuration list */
+struct config *Configlist_add(
+ struct rule *rp, /* The rule */
+ int dot /* Index into the RHS of the rule where the dot goes */
+){
+ struct config *cfp, model;
+
+ assert( currentend!=0 );
+ model.rp = rp;
+ model.dot = dot;
+ cfp = Configtable_find(&model);
+ if( cfp==0 ){
+ cfp = newconfig();
+ cfp->rp = rp;
+ cfp->dot = dot;
+ cfp->fws = SetNew();
+ cfp->stp = 0;
+ cfp->fplp = cfp->bplp = 0;
+ cfp->next = 0;
+ cfp->bp = 0;
+ *currentend = cfp;
+ currentend = &cfp->next;
+ Configtable_insert(cfp);
+ }
+ return cfp;
+}
+
+/* Add a basis configuration to the configuration list */
+struct config *Configlist_addbasis(struct rule *rp, int dot)
+{
+ struct config *cfp, model;
+
+ assert( basisend!=0 );
+ assert( currentend!=0 );
+ model.rp = rp;
+ model.dot = dot;
+ cfp = Configtable_find(&model);
+ if( cfp==0 ){
+ cfp = newconfig();
+ cfp->rp = rp;
+ cfp->dot = dot;
+ cfp->fws = SetNew();
+ cfp->stp = 0;
+ cfp->fplp = cfp->bplp = 0;
+ cfp->next = 0;
+ cfp->bp = 0;
+ *currentend = cfp;
+ currentend = &cfp->next;
+ *basisend = cfp;
+ basisend = &cfp->bp;
+ Configtable_insert(cfp);
+ }
+ return cfp;
+}
+
+/* Compute the closure of the configuration list */
+void Configlist_closure(struct lemon *lemp)
+{
+ struct config *cfp, *newcfp;
+ struct rule *rp, *newrp;
+ struct symbol *sp, *xsp;
+ int i, dot;
+
+ assert( currentend!=0 );
+ for(cfp=current; cfp; cfp=cfp->next){
+ rp = cfp->rp;
+ dot = cfp->dot;
+ if( dot>=rp->nrhs ) continue;
+ sp = rp->rhs[dot];
+ if( sp->type==NONTERMINAL ){
+ if( sp->rule==0 && sp!=lemp->errsym ){
+ ErrorMsg(lemp->filename,rp->line,"Nonterminal \"%s\" has no rules.",
+ sp->name);
+ lemp->errorcnt++;
+ }
+ for(newrp=sp->rule; newrp; newrp=newrp->nextlhs){
+ newcfp = Configlist_add(newrp,0);
+ for(i=dot+1; i<rp->nrhs; i++){
+ xsp = rp->rhs[i];
+ if( xsp->type==TERMINAL ){
+ SetAdd(newcfp->fws,xsp->index);
+ break;
+ }else if( xsp->type==MULTITERMINAL ){
+ int k;
+ for(k=0; k<xsp->nsubsym; k++){
+ SetAdd(newcfp->fws, xsp->subsym[k]->index);
+ }
+ break;
+ }else{
+ SetUnion(newcfp->fws,xsp->firstset);
+ if( xsp->lambda==LEMON_FALSE ) break;
+ }
+ }
+ if( i==rp->nrhs ) Plink_add(&cfp->fplp,newcfp);
+ }
+ }
+ }
+ return;
+}
+
+/* Sort the configuration list */
+void Configlist_sort(){
+ current = (struct config *)msort((char *)current,(char **)&(current->next),Configcmp);
+ currentend = 0;
+ return;
+}
+
+/* Sort the basis configuration list */
+void Configlist_sortbasis(){
+ basis = (struct config *)msort((char *)current,(char **)&(current->bp),Configcmp);
+ basisend = 0;
+ return;
+}
+
+/* Return a pointer to the head of the configuration list and
+** reset the list */
+struct config *Configlist_return(){
+ struct config *old;
+ old = current;
+ current = 0;
+ currentend = 0;
+ return old;
+}
+
+/* Return a pointer to the head of the configuration list and
+** reset the list */
+struct config *Configlist_basis(){
+ struct config *old;
+ old = basis;
+ basis = 0;
+ basisend = 0;
+ return old;
+}
+
+/* Free all elements of the given configuration list */
+void Configlist_eat(struct config *cfp)
+{
+ struct config *nextcfp;
+ for(; cfp; cfp=nextcfp){
+ nextcfp = cfp->next;
+ assert( cfp->fplp==0 );
+ assert( cfp->bplp==0 );
+ if( cfp->fws ) SetFree(cfp->fws);
+ deleteconfig(cfp);
+ }
+ return;
+}
+/***************** From the file "error.c" *********************************/
+/*
+** Code for printing error message.
+*/
+
+void ErrorMsg(const char *filename, int lineno, const char *format, ...){
+ va_list ap;
+ fprintf(stderr, "%s:%d: ", filename, lineno);
+ va_start(ap, format);
+ vfprintf(stderr,format,ap);
+ va_end(ap);
+ fprintf(stderr, "\n");
+}
+/**************** From the file "main.c" ************************************/
+/*
+** Main program file for the LEMON parser generator.
+*/
+
+/* Report an out-of-memory condition and abort. This function
+** is used mostly by the "MemoryCheck" macro in struct.h
+*/
+void memory_error(){
+ fprintf(stderr,"Out of memory. Aborting...\n");
+ exit(1);
+}
+
+static int nDefine = 0; /* Number of -D options on the command line */
+static char **azDefine = 0; /* Name of the -D macros */
+
+/* This routine is called with the argument to each -D command-line option.
+** Add the macro defined to the azDefine array.
+*/
+static void handle_D_option(char *z){
+ char **paz;
+ nDefine++;
+ azDefine = (char **) realloc(azDefine, sizeof(azDefine[0])*nDefine);
+ if( azDefine==0 ){
+ fprintf(stderr,"out of memory\n");
+ exit(1);
+ }
+ paz = &azDefine[nDefine-1];
+ *paz = (char *) malloc( lemonStrlen(z)+1 );
+ if( *paz==0 ){
+ fprintf(stderr,"out of memory\n");
+ exit(1);
+ }
+ lemon_strcpy(*paz, z);
+ for(z=*paz; *z && *z!='='; z++){}
+ *z = 0;
+}
+
+static char *user_templatename = NULL;
+static void handle_T_option(char *z){
+ user_templatename = (char *) malloc( lemonStrlen(z)+1 );
+ if( user_templatename==0 ){
+ memory_error();
+ }
+ lemon_strcpy(user_templatename, z);
+}
+
+/* The main program. Parse the command line and do it... */
+int main(int argc, char **argv)
+{
+ static int version = 0;
+ static int rpflag = 0;
+ static int basisflag = 0;
+ static int compress = 0;
+ static int quiet = 0;
+ static int statistics = 0;
+ static int mhflag = 0;
+ static int nolinenosflag = 0;
+ static int noResort = 0;
+ static struct s_options options[] = {
+ {OPT_FLAG, "b", (char*)&basisflag, "Print only the basis in report."},
+ {OPT_FLAG, "c", (char*)&compress, "Don't compress the action table."},
+ {OPT_FSTR, "D", (char*)handle_D_option, "Define an %ifdef macro."},
+ {OPT_FSTR, "T", (char*)handle_T_option, "Specify a template file."},
+ {OPT_FLAG, "g", (char*)&rpflag, "Print grammar without actions."},
+ {OPT_FLAG, "m", (char*)&mhflag, "Output a makeheaders compatible file."},
+ {OPT_FLAG, "l", (char*)&nolinenosflag, "Do not print #line statements."},
+ {OPT_FLAG, "p", (char*)&showPrecedenceConflict,
+ "Show conflicts resolved by precedence rules"},
+ {OPT_FLAG, "q", (char*)&quiet, "(Quiet) Don't print the report file."},
+ {OPT_FLAG, "r", (char*)&noResort, "Do not sort or renumber states"},
+ {OPT_FLAG, "s", (char*)&statistics,
+ "Print parser stats to standard output."},
+ {OPT_FLAG, "x", (char*)&version, "Print the version number."},
+ {OPT_FLAG,0,0,0}
+ };
+ int i;
+ int exitcode;
+ struct lemon lem;
+
+ OptInit(argv,options,stderr);
+ if( version ){
+ printf("Lemon version 1.0\n");
+ exit(0);
+ }
+ if( OptNArgs()!=1 ){
+ fprintf(stderr,"Exactly one filename argument is required.\n");
+ exit(1);
+ }
+ memset(&lem, 0, sizeof(lem));
+ lem.errorcnt = 0;
+
+ /* Initialize the machine */
+ Strsafe_init();
+ Symbol_init();
+ State_init();
+ lem.argv0 = argv[0];
+ lem.filename = OptArg(0);
+ lem.basisflag = basisflag;
+ lem.nolinenosflag = nolinenosflag;
+ Symbol_new("$");
+ lem.errsym = Symbol_new("error");
+ lem.errsym->useCnt = 0;
+
+ /* Parse the input file */
+ Parse(&lem);
+ if( lem.errorcnt ) exit(lem.errorcnt);
+ if( lem.nrule==0 ){
+ fprintf(stderr,"Empty grammar.\n");
+ exit(1);
+ }
+
+ /* Count and index the symbols of the grammar */
+ Symbol_new("{default}");
+ lem.nsymbol = Symbol_count();
+ lem.symbols = Symbol_arrayof();
+ for(i=0; i<lem.nsymbol; i++) lem.symbols[i]->index = i;
+ qsort(lem.symbols,lem.nsymbol,sizeof(struct symbol*), Symbolcmpp);
+ for(i=0; i<lem.nsymbol; i++) lem.symbols[i]->index = i;
+ while( lem.symbols[i-1]->type==MULTITERMINAL ){ i--; }
+ assert( strcmp(lem.symbols[i-1]->name,"{default}")==0 );
+ lem.nsymbol = i - 1;
+ for(i=1; isupper(lem.symbols[i]->name[0]); i++);
+ lem.nterminal = i;
+
+ /* Generate a reprint of the grammar, if requested on the command line */
+ if( rpflag ){
+ Reprint(&lem);
+ }else{
+ /* Initialize the size for all follow and first sets */
+ SetSize(lem.nterminal+1);
+
+ /* Find the precedence for every production rule (that has one) */
+ FindRulePrecedences(&lem);
+
+ /* Compute the lambda-nonterminals and the first-sets for every
+ ** nonterminal */
+ FindFirstSets(&lem);
+
+ /* Compute all LR(0) states. Also record follow-set propagation
+ ** links so that the follow-set can be computed later */
+ lem.nstate = 0;
+ FindStates(&lem);
+ lem.sorted = State_arrayof();
+
+ /* Tie up loose ends on the propagation links */
+ FindLinks(&lem);
+
+ /* Compute the follow set of every reducible configuration */
+ FindFollowSets(&lem);
+
+ /* Compute the action tables */
+ FindActions(&lem);
+
+ /* Compress the action tables */
+ if( compress==0 ) CompressTables(&lem);
+
+ /* Reorder and renumber the states so that states with fewer choices
+ ** occur at the end. This is an optimization that helps make the
+ ** generated parser tables smaller. */
+ if( noResort==0 ) ResortStates(&lem);
+
+ /* Generate a report of the parser generated. (the "y.output" file) */
+ if( !quiet ) ReportOutput(&lem);
+
+ /* Generate the source code for the parser */
+ ReportTable(&lem, mhflag);
+
+ /* Produce a header file for use by the scanner. (This step is
+ ** omitted if the "-m" option is used because makeheaders will
+ ** generate the file for us.) */
+ if( !mhflag ) ReportHeader(&lem);
+ }
+ if( statistics ){
+ printf("Parser statistics: %d terminals, %d nonterminals, %d rules\n",
+ lem.nterminal, lem.nsymbol - lem.nterminal, lem.nrule);
+ printf(" %d states, %d parser table entries, %d conflicts\n",
+ lem.nstate, lem.tablesize, lem.nconflict);
+ }
+ if( lem.nconflict > 0 ){
+ fprintf(stderr,"%d parsing conflicts.\n",lem.nconflict);
+ }
+
+ /* return 0 on success, 1 on failure. */
+ exitcode = ((lem.errorcnt > 0) || (lem.nconflict > 0)) ? 1 : 0;
+ exit(exitcode);
+ return (exitcode);
+}
+/******************** From the file "msort.c" *******************************/
+/*
+** A generic merge-sort program.
+**
+** USAGE:
+** Let "ptr" be a pointer to some structure which is at the head of
+** a null-terminated list. Then to sort the list call:
+**
+** ptr = msort(ptr,&(ptr->next),cmpfnc);
+**
+** In the above, "cmpfnc" is a pointer to a function which compares
+** two instances of the structure and returns an integer, as in
+** strcmp. The second argument is a pointer to the pointer to the
+** second element of the linked list. This address is used to compute
+** the offset to the "next" field within the structure. The offset to
+** the "next" field must be constant for all structures in the list.
+**
+** The function returns a new pointer which is the head of the list
+** after sorting.
+**
+** ALGORITHM:
+** Merge-sort.
+*/
+
+/*
+** Return a pointer to the next structure in the linked list.
+*/
+#define NEXT(A) (*(char**)(((char*)A)+offset))
+
+/*
+** Inputs:
+** a: A sorted, null-terminated linked list. (May be null).
+** b: A sorted, null-terminated linked list. (May be null).
+** cmp: A pointer to the comparison function.
+** offset: Offset in the structure to the "next" field.
+**
+** Return Value:
+** A pointer to the head of a sorted list containing the elements
+** of both a and b.
+**
+** Side effects:
+** The "next" pointers for elements in the lists a and b are
+** changed.
+*/
+static char *merge(
+ char *a,
+ char *b,
+ int (*cmp)(const char*,const char*),
+ int offset
+){
+ char *ptr, *head;
+
+ if( a==0 ){
+ head = b;
+ }else if( b==0 ){
+ head = a;
+ }else{
+ if( (*cmp)(a,b)<=0 ){
+ ptr = a;
+ a = NEXT(a);
+ }else{
+ ptr = b;
+ b = NEXT(b);
+ }
+ head = ptr;
+ while( a && b ){
+ if( (*cmp)(a,b)<=0 ){
+ NEXT(ptr) = a;
+ ptr = a;
+ a = NEXT(a);
+ }else{
+ NEXT(ptr) = b;
+ ptr = b;
+ b = NEXT(b);
+ }
+ }
+ if( a ) NEXT(ptr) = a;
+ else NEXT(ptr) = b;
+ }
+ return head;
+}
+
+/*
+** Inputs:
+** list: Pointer to a singly-linked list of structures.
+** next: Pointer to pointer to the second element of the list.
+** cmp: A comparison function.
+**
+** Return Value:
+** A pointer to the head of a sorted list containing the elements
+** orginally in list.
+**
+** Side effects:
+** The "next" pointers for elements in list are changed.
+*/
+#define LISTSIZE 30
+static char *msort(
+ char *list,
+ char **next,
+ int (*cmp)(const char*,const char*)
+){
+ unsigned long offset;
+ char *ep;
+ char *set[LISTSIZE];
+ int i;
+ offset = (unsigned long)next - (unsigned long)list;
+ for(i=0; i<LISTSIZE; i++) set[i] = 0;
+ while( list ){
+ ep = list;
+ list = NEXT(list);
+ NEXT(ep) = 0;
+ for(i=0; i<LISTSIZE-1 && set[i]!=0; i++){
+ ep = merge(ep,set[i],cmp,offset);
+ set[i] = 0;
+ }
+ set[i] = ep;
+ }
+ ep = 0;
+ for(i=0; i<LISTSIZE; i++) if( set[i] ) ep = merge(set[i],ep,cmp,offset);
+ return ep;
+}
+/************************ From the file "option.c" **************************/
+static char **argv;
+static struct s_options *op;
+static FILE *errstream;
+
+#define ISOPT(X) ((X)[0]=='-'||(X)[0]=='+'||strchr((X),'=')!=0)
+
+/*
+** Print the command line with a carrot pointing to the k-th character
+** of the n-th field.
+*/
+static void errline(int n, int k, FILE *err)
+{
+ int spcnt, i;
+ if( argv[0] ) fprintf(err,"%s",argv[0]);
+ spcnt = lemonStrlen(argv[0]) + 1;
+ for(i=1; i<n && argv[i]; i++){
+ fprintf(err," %s",argv[i]);
+ spcnt += lemonStrlen(argv[i])+1;
+ }
+ spcnt += k;
+ for(; argv[i]; i++) fprintf(err," %s",argv[i]);
+ if( spcnt<20 ){
+ fprintf(err,"\n%*s^-- here\n",spcnt,"");
+ }else{
+ fprintf(err,"\n%*shere --^\n",spcnt-7,"");
+ }
+}
+
+/*
+** Return the index of the N-th non-switch argument. Return -1
+** if N is out of range.
+*/
+static int argindex(int n)
+{
+ int i;
+ int dashdash = 0;
+ if( argv!=0 && *argv!=0 ){
+ for(i=1; argv[i]; i++){
+ if( dashdash || !ISOPT(argv[i]) ){
+ if( n==0 ) return i;
+ n--;
+ }
+ if( strcmp(argv[i],"--")==0 ) dashdash = 1;
+ }
+ }
+ return -1;
+}
+
+static char emsg[] = "Command line syntax error: ";
+
+/*
+** Process a flag command line argument.
+*/
+static int handleflags(int i, FILE *err)
+{
+ int v;
+ int errcnt = 0;
+ int j;
+ for(j=0; op[j].label; j++){
+ if( strncmp(&argv[i][1],op[j].label,lemonStrlen(op[j].label))==0 ) break;
+ }
+ v = argv[i][0]=='-' ? 1 : 0;
+ if( op[j].label==0 ){
+ if( err ){
+ fprintf(err,"%sundefined option.\n",emsg);
+ errline(i,1,err);
+ }
+ errcnt++;
+ }else if( op[j].type==OPT_FLAG ){
+ *((int*)op[j].arg) = v;
+ }else if( op[j].type==OPT_FFLAG ){
+ (*(void(*)(int))(op[j].arg))(v);
+ }else if( op[j].type==OPT_FSTR ){
+ (*(void(*)(char *))(op[j].arg))(&argv[i][2]);
+ }else{
+ if( err ){
+ fprintf(err,"%smissing argument on switch.\n",emsg);
+ errline(i,1,err);
+ }
+ errcnt++;
+ }
+ return errcnt;
+}
+
+/*
+** Process a command line switch which has an argument.
+*/
+static int handleswitch(int i, FILE *err)
+{
+ int lv = 0;
+ double dv = 0.0;
+ char *sv = 0, *end;
+ char *cp;
+ int j;
+ int errcnt = 0;
+ cp = strchr(argv[i],'=');
+ assert( cp!=0 );
+ *cp = 0;
+ for(j=0; op[j].label; j++){
+ if( strcmp(argv[i],op[j].label)==0 ) break;
+ }
+ *cp = '=';
+ if( op[j].label==0 ){
+ if( err ){
+ fprintf(err,"%sundefined option.\n",emsg);
+ errline(i,0,err);
+ }
+ errcnt++;
+ }else{
+ cp++;
+ switch( op[j].type ){
+ case OPT_FLAG:
+ case OPT_FFLAG:
+ if( err ){
+ fprintf(err,"%soption requires an argument.\n",emsg);
+ errline(i,0,err);
+ }
+ errcnt++;
+ break;
+ case OPT_DBL:
+ case OPT_FDBL:
+ dv = strtod(cp,&end);
+ if( *end ){
+ if( err ){
+ fprintf(err,"%sillegal character in floating-point argument.\n",emsg);
+ errline(i,((unsigned long)end)-(unsigned long)argv[i],err);
+ }
+ errcnt++;
+ }
+ break;
+ case OPT_INT:
+ case OPT_FINT:
+ lv = strtol(cp,&end,0);
+ if( *end ){
+ if( err ){
+ fprintf(err,"%sillegal character in integer argument.\n",emsg);
+ errline(i,((unsigned long)end)-(unsigned long)argv[i],err);
+ }
+ errcnt++;
+ }
+ break;
+ case OPT_STR:
+ case OPT_FSTR:
+ sv = cp;
+ break;
+ }
+ switch( op[j].type ){
+ case OPT_FLAG:
+ case OPT_FFLAG:
+ break;
+ case OPT_DBL:
+ *(double*)(op[j].arg) = dv;
+ break;
+ case OPT_FDBL:
+ (*(void(*)(double))(op[j].arg))(dv);
+ break;
+ case OPT_INT:
+ *(int*)(op[j].arg) = lv;
+ break;
+ case OPT_FINT:
+ (*(void(*)(int))(op[j].arg))((int)lv);
+ break;
+ case OPT_STR:
+ *(char**)(op[j].arg) = sv;
+ break;
+ case OPT_FSTR:
+ (*(void(*)(char *))(op[j].arg))(sv);
+ break;
+ }
+ }
+ return errcnt;
+}
+
+int OptInit(char **a, struct s_options *o, FILE *err)
+{
+ int errcnt = 0;
+ argv = a;
+ op = o;
+ errstream = err;
+ if( argv && *argv && op ){
+ int i;
+ for(i=1; argv[i]; i++){
+ if( argv[i][0]=='+' || argv[i][0]=='-' ){
+ errcnt += handleflags(i,err);
+ }else if( strchr(argv[i],'=') ){
+ errcnt += handleswitch(i,err);
+ }
+ }
+ }
+ if( errcnt>0 ){
+ fprintf(err,"Valid command line options for \"%s\" are:\n",*a);
+ OptPrint();
+ exit(1);
+ }
+ return 0;
+}
+
+int OptNArgs(){
+ int cnt = 0;
+ int dashdash = 0;
+ int i;
+ if( argv!=0 && argv[0]!=0 ){
+ for(i=1; argv[i]; i++){
+ if( dashdash || !ISOPT(argv[i]) ) cnt++;
+ if( strcmp(argv[i],"--")==0 ) dashdash = 1;
+ }
+ }
+ return cnt;
+}
+
+char *OptArg(int n)
+{
+ int i;
+ i = argindex(n);
+ return i>=0 ? argv[i] : 0;
+}
+
+void OptErr(int n)
+{
+ int i;
+ i = argindex(n);
+ if( i>=0 ) errline(i,0,errstream);
+}
+
+void OptPrint(){
+ int i;
+ int max, len;
+ max = 0;
+ for(i=0; op[i].label; i++){
+ len = lemonStrlen(op[i].label) + 1;
+ switch( op[i].type ){
+ case OPT_FLAG:
+ case OPT_FFLAG:
+ break;
+ case OPT_INT:
+ case OPT_FINT:
+ len += 9; /* length of "<integer>" */
+ break;
+ case OPT_DBL:
+ case OPT_FDBL:
+ len += 6; /* length of "<real>" */
+ break;
+ case OPT_STR:
+ case OPT_FSTR:
+ len += 8; /* length of "<string>" */
+ break;
+ }
+ if( len>max ) max = len;
+ }
+ for(i=0; op[i].label; i++){
+ switch( op[i].type ){
+ case OPT_FLAG:
+ case OPT_FFLAG:
+ fprintf(errstream," -%-*s %s\n",max,op[i].label,op[i].message);
+ break;
+ case OPT_INT:
+ case OPT_FINT:
+ fprintf(errstream," %s=<integer>%*s %s\n",op[i].label,
+ (int)(max-lemonStrlen(op[i].label)-9),"",op[i].message);
+ break;
+ case OPT_DBL:
+ case OPT_FDBL:
+ fprintf(errstream," %s=<real>%*s %s\n",op[i].label,
+ (int)(max-lemonStrlen(op[i].label)-6),"",op[i].message);
+ break;
+ case OPT_STR:
+ case OPT_FSTR:
+ fprintf(errstream," %s=<string>%*s %s\n",op[i].label,
+ (int)(max-lemonStrlen(op[i].label)-8),"",op[i].message);
+ break;
+ }
+ }
+}
+/*********************** From the file "parse.c" ****************************/
+/*
+** Input file parser for the LEMON parser generator.
+*/
+
+/* The state of the parser */
+enum e_state {
+ INITIALIZE,
+ WAITING_FOR_DECL_OR_RULE,
+ WAITING_FOR_DECL_KEYWORD,
+ WAITING_FOR_DECL_ARG,
+ WAITING_FOR_PRECEDENCE_SYMBOL,
+ WAITING_FOR_ARROW,
+ IN_RHS,
+ LHS_ALIAS_1,
+ LHS_ALIAS_2,
+ LHS_ALIAS_3,
+ RHS_ALIAS_1,
+ RHS_ALIAS_2,
+ PRECEDENCE_MARK_1,
+ PRECEDENCE_MARK_2,
+ RESYNC_AFTER_RULE_ERROR,
+ RESYNC_AFTER_DECL_ERROR,
+ WAITING_FOR_DESTRUCTOR_SYMBOL,
+ WAITING_FOR_DATATYPE_SYMBOL,
+ WAITING_FOR_FALLBACK_ID,
+ WAITING_FOR_WILDCARD_ID,
+ WAITING_FOR_CLASS_ID,
+ WAITING_FOR_CLASS_TOKEN
+};
+struct pstate {
+ char *filename; /* Name of the input file */
+ int tokenlineno; /* Linenumber at which current token starts */
+ int errorcnt; /* Number of errors so far */
+ char *tokenstart; /* Text of current token */
+ struct lemon *gp; /* Global state vector */
+ enum e_state state; /* The state of the parser */
+ struct symbol *fallback; /* The fallback token */
+ struct symbol *tkclass; /* Token class symbol */
+ struct symbol *lhs; /* Left-hand side of current rule */
+ const char *lhsalias; /* Alias for the LHS */
+ int nrhs; /* Number of right-hand side symbols seen */
+ struct symbol *rhs[MAXRHS]; /* RHS symbols */
+ const char *alias[MAXRHS]; /* Aliases for each RHS symbol (or NULL) */
+ struct rule *prevrule; /* Previous rule parsed */
+ const char *declkeyword; /* Keyword of a declaration */
+ char **declargslot; /* Where the declaration argument should be put */
+ int insertLineMacro; /* Add #line before declaration insert */
+ int *decllinenoslot; /* Where to write declaration line number */
+ enum e_assoc declassoc; /* Assign this association to decl arguments */
+ int preccounter; /* Assign this precedence to decl arguments */
+ struct rule *firstrule; /* Pointer to first rule in the grammar */
+ struct rule *lastrule; /* Pointer to the most recently parsed rule */
+};
+
+/* Parse a single token */
+static void parseonetoken(struct pstate *psp)
+{
+ const char *x;
+ x = Strsafe(psp->tokenstart); /* Save the token permanently */
+#if 0
+ printf("%s:%d: Token=[%s] state=%d\n",psp->filename,psp->tokenlineno,
+ x,psp->state);
+#endif
+ switch( psp->state ){
+ case INITIALIZE:
+ psp->prevrule = 0;
+ psp->preccounter = 0;
+ psp->firstrule = psp->lastrule = 0;
+ psp->gp->nrule = 0;
+ /* Fall thru to next case */
+ case WAITING_FOR_DECL_OR_RULE:
+ if( x[0]=='%' ){
+ psp->state = WAITING_FOR_DECL_KEYWORD;
+ }else if( islower(x[0]) ){
+ psp->lhs = Symbol_new(x);
+ psp->nrhs = 0;
+ psp->lhsalias = 0;
+ psp->state = WAITING_FOR_ARROW;
+ }else if( x[0]=='{' ){
+ if( psp->prevrule==0 ){
+ ErrorMsg(psp->filename,psp->tokenlineno,
+"There is no prior rule upon which to attach the code \
+fragment which begins on this line.");
+ psp->errorcnt++;
+ }else if( psp->prevrule->code!=0 ){
+ ErrorMsg(psp->filename,psp->tokenlineno,
+"Code fragment beginning on this line is not the first \
+to follow the previous rule.");
+ psp->errorcnt++;
+ }else{
+ psp->prevrule->line = psp->tokenlineno;
+ psp->prevrule->code = &x[1];
+ }
+ }else if( x[0]=='[' ){
+ psp->state = PRECEDENCE_MARK_1;
+ }else{
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "Token \"%s\" should be either \"%%\" or a nonterminal name.",
+ x);
+ psp->errorcnt++;
+ }
+ break;
+ case PRECEDENCE_MARK_1:
+ if( !isupper(x[0]) ){
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "The precedence symbol must be a terminal.");
+ psp->errorcnt++;
+ }else if( psp->prevrule==0 ){
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "There is no prior rule to assign precedence \"[%s]\".",x);
+ psp->errorcnt++;
+ }else if( psp->prevrule->precsym!=0 ){
+ ErrorMsg(psp->filename,psp->tokenlineno,
+"Precedence mark on this line is not the first \
+to follow the previous rule.");
+ psp->errorcnt++;
+ }else{
+ psp->prevrule->precsym = Symbol_new(x);
+ }
+ psp->state = PRECEDENCE_MARK_2;
+ break;
+ case PRECEDENCE_MARK_2:
+ if( x[0]!=']' ){
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "Missing \"]\" on precedence mark.");
+ psp->errorcnt++;
+ }
+ psp->state = WAITING_FOR_DECL_OR_RULE;
+ break;
+ case WAITING_FOR_ARROW:
+ if( x[0]==':' && x[1]==':' && x[2]=='=' ){
+ psp->state = IN_RHS;
+ }else if( x[0]=='(' ){
+ psp->state = LHS_ALIAS_1;
+ }else{
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "Expected to see a \":\" following the LHS symbol \"%s\".",
+ psp->lhs->name);
+ psp->errorcnt++;
+ psp->state = RESYNC_AFTER_RULE_ERROR;
+ }
+ break;
+ case LHS_ALIAS_1:
+ if( isalpha(x[0]) ){
+ psp->lhsalias = x;
+ psp->state = LHS_ALIAS_2;
+ }else{
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "\"%s\" is not a valid alias for the LHS \"%s\"\n",
+ x,psp->lhs->name);
+ psp->errorcnt++;
+ psp->state = RESYNC_AFTER_RULE_ERROR;
+ }
+ break;
+ case LHS_ALIAS_2:
+ if( x[0]==')' ){
+ psp->state = LHS_ALIAS_3;
+ }else{
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "Missing \")\" following LHS alias name \"%s\".",psp->lhsalias);
+ psp->errorcnt++;
+ psp->state = RESYNC_AFTER_RULE_ERROR;
+ }
+ break;
+ case LHS_ALIAS_3:
+ if( x[0]==':' && x[1]==':' && x[2]=='=' ){
+ psp->state = IN_RHS;
+ }else{
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "Missing \"->\" following: \"%s(%s)\".",
+ psp->lhs->name,psp->lhsalias);
+ psp->errorcnt++;
+ psp->state = RESYNC_AFTER_RULE_ERROR;
+ }
+ break;
+ case IN_RHS:
+ if( x[0]=='.' ){
+ struct rule *rp;
+ rp = (struct rule *)calloc( sizeof(struct rule) +
+ sizeof(struct symbol*)*psp->nrhs + sizeof(char*)*psp->nrhs, 1);
+ if( rp==0 ){
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "Can't allocate enough memory for this rule.");
+ psp->errorcnt++;
+ psp->prevrule = 0;
+ }else{
+ int i;
+ rp->ruleline = psp->tokenlineno;
+ rp->rhs = (struct symbol**)&rp[1];
+ rp->rhsalias = (const char**)&(rp->rhs[psp->nrhs]);
+ for(i=0; i<psp->nrhs; i++){
+ rp->rhs[i] = psp->rhs[i];
+ rp->rhsalias[i] = psp->alias[i];
+ }
+ rp->lhs = psp->lhs;
+ rp->lhsalias = psp->lhsalias;
+ rp->nrhs = psp->nrhs;
+ rp->code = 0;
+ rp->precsym = 0;
+ rp->index = psp->gp->nrule++;
+ rp->nextlhs = rp->lhs->rule;
+ rp->lhs->rule = rp;
+ rp->next = 0;
+ if( psp->firstrule==0 ){
+ psp->firstrule = psp->lastrule = rp;
+ }else{
+ psp->lastrule->next = rp;
+ psp->lastrule = rp;
+ }
+ psp->prevrule = rp;
+ }
+ psp->state = WAITING_FOR_DECL_OR_RULE;
+ }else if( isalpha(x[0]) ){
+ if( psp->nrhs>=MAXRHS ){
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "Too many symbols on RHS of rule beginning at \"%s\".",
+ x);
+ psp->errorcnt++;
+ psp->state = RESYNC_AFTER_RULE_ERROR;
+ }else{
+ psp->rhs[psp->nrhs] = Symbol_new(x);
+ psp->alias[psp->nrhs] = 0;
+ psp->nrhs++;
+ }
+ }else if( (x[0]=='|' || x[0]=='/') && psp->nrhs>0 ){
+ struct symbol *msp = psp->rhs[psp->nrhs-1];
+ if( msp->type!=MULTITERMINAL ){
+ struct symbol *origsp = msp;
+ msp = (struct symbol *) calloc(1,sizeof(*msp));
+ memset(msp, 0, sizeof(*msp));
+ msp->type = MULTITERMINAL;
+ msp->nsubsym = 1;
+ msp->subsym = (struct symbol **) calloc(1,sizeof(struct symbol*));
+ msp->subsym[0] = origsp;
+ msp->name = origsp->name;
+ psp->rhs[psp->nrhs-1] = msp;
+ }
+ msp->nsubsym++;
+ msp->subsym = (struct symbol **) realloc(msp->subsym,
+ sizeof(struct symbol*)*msp->nsubsym);
+ msp->subsym[msp->nsubsym-1] = Symbol_new(&x[1]);
+ if( islower(x[1]) || islower(msp->subsym[0]->name[0]) ){
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "Cannot form a compound containing a non-terminal");
+ psp->errorcnt++;
+ }
+ }else if( x[0]=='(' && psp->nrhs>0 ){
+ psp->state = RHS_ALIAS_1;
+ }else{
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "Illegal character on RHS of rule: \"%s\".",x);
+ psp->errorcnt++;
+ psp->state = RESYNC_AFTER_RULE_ERROR;
+ }
+ break;
+ case RHS_ALIAS_1:
+ if( isalpha(x[0]) ){
+ psp->alias[psp->nrhs-1] = x;
+ psp->state = RHS_ALIAS_2;
+ }else{
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "\"%s\" is not a valid alias for the RHS symbol \"%s\"\n",
+ x,psp->rhs[psp->nrhs-1]->name);
+ psp->errorcnt++;
+ psp->state = RESYNC_AFTER_RULE_ERROR;
+ }
+ break;
+ case RHS_ALIAS_2:
+ if( x[0]==')' ){
+ psp->state = IN_RHS;
+ }else{
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "Missing \")\" following LHS alias name \"%s\".",psp->lhsalias);
+ psp->errorcnt++;
+ psp->state = RESYNC_AFTER_RULE_ERROR;
+ }
+ break;
+ case WAITING_FOR_DECL_KEYWORD:
+ if( isalpha(x[0]) ){
+ psp->declkeyword = x;
+ psp->declargslot = 0;
+ psp->decllinenoslot = 0;
+ psp->insertLineMacro = 1;
+ psp->state = WAITING_FOR_DECL_ARG;
+ if( strcmp(x,"name")==0 ){
+ psp->declargslot = &(psp->gp->name);
+ psp->insertLineMacro = 0;
+ }else if( strcmp(x,"include")==0 ){
+ psp->declargslot = &(psp->gp->include);
+ }else if( strcmp(x,"code")==0 ){
+ psp->declargslot = &(psp->gp->extracode);
+ }else if( strcmp(x,"token_destructor")==0 ){
+ psp->declargslot = &psp->gp->tokendest;
+ }else if( strcmp(x,"default_destructor")==0 ){
+ psp->declargslot = &psp->gp->vardest;
+ }else if( strcmp(x,"token_prefix")==0 ){
+ psp->declargslot = &psp->gp->tokenprefix;
+ psp->insertLineMacro = 0;
+ }else if( strcmp(x,"syntax_error")==0 ){
+ psp->declargslot = &(psp->gp->error);
+ }else if( strcmp(x,"parse_accept")==0 ){
+ psp->declargslot = &(psp->gp->accept);
+ }else if( strcmp(x,"parse_failure")==0 ){
+ psp->declargslot = &(psp->gp->failure);
+ }else if( strcmp(x,"stack_overflow")==0 ){
+ psp->declargslot = &(psp->gp->overflow);
+ }else if( strcmp(x,"extra_argument")==0 ){
+ psp->declargslot = &(psp->gp->arg);
+ psp->insertLineMacro = 0;
+ }else if( strcmp(x,"token_type")==0 ){
+ psp->declargslot = &(psp->gp->tokentype);
+ psp->insertLineMacro = 0;
+ }else if( strcmp(x,"default_type")==0 ){
+ psp->declargslot = &(psp->gp->vartype);
+ psp->insertLineMacro = 0;
+ }else if( strcmp(x,"stack_size")==0 ){
+ psp->declargslot = &(psp->gp->stacksize);
+ psp->insertLineMacro = 0;
+ }else if( strcmp(x,"start_symbol")==0 ){
+ psp->declargslot = &(psp->gp->start);
+ psp->insertLineMacro = 0;
+ }else if( strcmp(x,"left")==0 ){
+ psp->preccounter++;
+ psp->declassoc = LEFT;
+ psp->state = WAITING_FOR_PRECEDENCE_SYMBOL;
+ }else if( strcmp(x,"right")==0 ){
+ psp->preccounter++;
+ psp->declassoc = RIGHT;
+ psp->state = WAITING_FOR_PRECEDENCE_SYMBOL;
+ }else if( strcmp(x,"nonassoc")==0 ){
+ psp->preccounter++;
+ psp->declassoc = NONE;
+ psp->state = WAITING_FOR_PRECEDENCE_SYMBOL;
+ }else if( strcmp(x,"destructor")==0 ){
+ psp->state = WAITING_FOR_DESTRUCTOR_SYMBOL;
+ }else if( strcmp(x,"type")==0 ){
+ psp->state = WAITING_FOR_DATATYPE_SYMBOL;
+ }else if( strcmp(x,"fallback")==0 ){
+ psp->fallback = 0;
+ psp->state = WAITING_FOR_FALLBACK_ID;
+ }else if( strcmp(x,"wildcard")==0 ){
+ psp->state = WAITING_FOR_WILDCARD_ID;
+ }else if( strcmp(x,"token_class")==0 ){
+ psp->state = WAITING_FOR_CLASS_ID;
+ }else{
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "Unknown declaration keyword: \"%%%s\".",x);
+ psp->errorcnt++;
+ psp->state = RESYNC_AFTER_DECL_ERROR;
+ }
+ }else{
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "Illegal declaration keyword: \"%s\".",x);
+ psp->errorcnt++;
+ psp->state = RESYNC_AFTER_DECL_ERROR;
+ }
+ break;
+ case WAITING_FOR_DESTRUCTOR_SYMBOL:
+ if( !isalpha(x[0]) ){
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "Symbol name missing after %%destructor keyword");
+ psp->errorcnt++;
+ psp->state = RESYNC_AFTER_DECL_ERROR;
+ }else{
+ struct symbol *sp = Symbol_new(x);
+ psp->declargslot = &sp->destructor;
+ psp->decllinenoslot = &sp->destLineno;
+ psp->insertLineMacro = 1;
+ psp->state = WAITING_FOR_DECL_ARG;
+ }
+ break;
+ case WAITING_FOR_DATATYPE_SYMBOL:
+ if( !isalpha(x[0]) ){
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "Symbol name missing after %%type keyword");
+ psp->errorcnt++;
+ psp->state = RESYNC_AFTER_DECL_ERROR;
+ }else{
+ struct symbol *sp = Symbol_find(x);
+ if((sp) && (sp->datatype)){
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "Symbol %%type \"%s\" already defined", x);
+ psp->errorcnt++;
+ psp->state = RESYNC_AFTER_DECL_ERROR;
+ }else{
+ if (!sp){
+ sp = Symbol_new(x);
+ }
+ psp->declargslot = &sp->datatype;
+ psp->insertLineMacro = 0;
+ psp->state = WAITING_FOR_DECL_ARG;
+ }
+ }
+ break;
+ case WAITING_FOR_PRECEDENCE_SYMBOL:
+ if( x[0]=='.' ){
+ psp->state = WAITING_FOR_DECL_OR_RULE;
+ }else if( isupper(x[0]) ){
+ struct symbol *sp;
+ sp = Symbol_new(x);
+ if( sp->prec>=0 ){
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "Symbol \"%s\" has already be given a precedence.",x);
+ psp->errorcnt++;
+ }else{
+ sp->prec = psp->preccounter;
+ sp->assoc = psp->declassoc;
+ }
+ }else{
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "Can't assign a precedence to \"%s\".",x);
+ psp->errorcnt++;
+ }
+ break;
+ case WAITING_FOR_DECL_ARG:
+ if( x[0]=='{' || x[0]=='\"' || isalnum(x[0]) ){
+ const char *zOld, *zNew;
+ char *zBuf, *z;
+ int nOld, n, nLine, nNew, nBack;
+ int addLineMacro;
+ char zLine[50];
+ zNew = x;
+ if( zNew[0]=='"' || zNew[0]=='{' ) zNew++;
+ nNew = lemonStrlen(zNew);
+ if( *psp->declargslot ){
+ zOld = *psp->declargslot;
+ }else{
+ zOld = "";
+ }
+ nOld = lemonStrlen(zOld);
+ n = nOld + nNew + 20;
+ addLineMacro = !psp->gp->nolinenosflag && psp->insertLineMacro &&
+ (psp->decllinenoslot==0 || psp->decllinenoslot[0]!=0);
+ if( addLineMacro ){
+ for(z=psp->filename, nBack=0; *z; z++){
+ if( *z=='\\' ) nBack++;
+ }
+ lemon_sprintf(zLine, "#line %d ", psp->tokenlineno);
+ nLine = lemonStrlen(zLine);
+ n += nLine + lemonStrlen(psp->filename) + nBack;
+ }
+ *psp->declargslot = (char *) realloc(*psp->declargslot, n);
+ zBuf = *psp->declargslot + nOld;
+ if( addLineMacro ){
+ if( nOld && zBuf[-1]!='\n' ){
+ *(zBuf++) = '\n';
+ }
+ memcpy(zBuf, zLine, nLine);
+ zBuf += nLine;
+ *(zBuf++) = '"';
+ for(z=psp->filename; *z; z++){
+ if( *z=='\\' ){
+ *(zBuf++) = '\\';
+ }
+ *(zBuf++) = *z;
+ }
+ *(zBuf++) = '"';
+ *(zBuf++) = '\n';
+ }
+ if( psp->decllinenoslot && psp->decllinenoslot[0]==0 ){
+ psp->decllinenoslot[0] = psp->tokenlineno;
+ }
+ memcpy(zBuf, zNew, nNew);
+ zBuf += nNew;
+ *zBuf = 0;
+ psp->state = WAITING_FOR_DECL_OR_RULE;
+ }else{
+ ErrorMsg(psp->filename,psp->tokenlineno,
+ "Illegal argument to %%%s: %s",psp->declkeyword,x);
+ psp->errorcnt++;
+ psp->state = RESYNC_AFTER_DECL_ERROR;
+ }
+ break;
+ case WAITING_FOR_FALLBACK_ID:
+ if( x[0]=='.' ){
+ psp->state = WAITING_FOR_DECL_OR_RULE;
+ }else if( !isupper(x[0]) ){
+ ErrorMsg(psp->filename, psp->tokenlineno,
+ "%%fallback argument \"%s\" should be a token", x);
+ psp->errorcnt++;
+ }else{
+ struct symbol *sp = Symbol_new(x);
+ if( psp->fallback==0 ){
+ psp->fallback = sp;
+ }else if( sp->fallback ){
+ ErrorMsg(psp->filename, psp->tokenlineno,
+ "More than one fallback assigned to token %s", x);
+ psp->errorcnt++;
+ }else{
+ sp->fallback = psp->fallback;
+ psp->gp->has_fallback = 1;
+ }
+ }
+ break;
+ case WAITING_FOR_WILDCARD_ID:
+ if( x[0]=='.' ){
+ psp->state = WAITING_FOR_DECL_OR_RULE;
+ }else if( !isupper(x[0]) ){
+ ErrorMsg(psp->filename, psp->tokenlineno,
+ "%%wildcard argument \"%s\" should be a token", x);
+ psp->errorcnt++;
+ }else{
+ struct symbol *sp = Symbol_new(x);
+ if( psp->gp->wildcard==0 ){
+ psp->gp->wildcard = sp;
+ }else{
+ ErrorMsg(psp->filename, psp->tokenlineno,
+ "Extra wildcard to token: %s", x);
+ psp->errorcnt++;
+ }
+ }
+ break;
+ case WAITING_FOR_CLASS_ID:
+ if( !islower(x[0]) ){
+ ErrorMsg(psp->filename, psp->tokenlineno,
+ "%%token_class must be followed by an identifier: ", x);
+ psp->errorcnt++;
+ psp->state = RESYNC_AFTER_DECL_ERROR;
+ }else if( Symbol_find(x) ){
+ ErrorMsg(psp->filename, psp->tokenlineno,
+ "Symbol \"%s\" already used", x);
+ psp->errorcnt++;
+ psp->state = RESYNC_AFTER_DECL_ERROR;
+ }else{
+ psp->tkclass = Symbol_new(x);
+ psp->tkclass->type = MULTITERMINAL;
+ psp->state = WAITING_FOR_CLASS_TOKEN;
+ }
+ break;
+ case WAITING_FOR_CLASS_TOKEN:
+ if( x[0]=='.' ){
+ psp->state = WAITING_FOR_DECL_OR_RULE;
+ }else if( isupper(x[0]) || ((x[0]=='|' || x[0]=='/') && isupper(x[1])) ){
+ struct symbol *msp = psp->tkclass;
+ msp->nsubsym++;
+ msp->subsym = (struct symbol **) realloc(msp->subsym,
+ sizeof(struct symbol*)*msp->nsubsym);
+ if( !isupper(x[0]) ) x++;
+ msp->subsym[msp->nsubsym-1] = Symbol_new(x);
+ }else{
+ ErrorMsg(psp->filename, psp->tokenlineno,
+ "%%token_class argument \"%s\" should be a token", x);
+ psp->errorcnt++;
+ psp->state = RESYNC_AFTER_DECL_ERROR;
+ }
+ break;
+ case RESYNC_AFTER_RULE_ERROR:
+/* if( x[0]=='.' ) psp->state = WAITING_FOR_DECL_OR_RULE;
+** break; */
+ case RESYNC_AFTER_DECL_ERROR:
+ if( x[0]=='.' ) psp->state = WAITING_FOR_DECL_OR_RULE;
+ if( x[0]=='%' ) psp->state = WAITING_FOR_DECL_KEYWORD;
+ break;
+ }
+}
+
+/* Run the preprocessor over the input file text. The global variables
+** azDefine[0] through azDefine[nDefine-1] contains the names of all defined
+** macros. This routine looks for "%ifdef" and "%ifndef" and "%endif" and
+** comments them out. Text in between is also commented out as appropriate.
+*/
+static void preprocess_input(char *z){
+ int i, j, k, n;
+ int exclude = 0;
+ int start = 0;
+ int lineno = 1;
+ int start_lineno = 1;
+ for(i=0; z[i]; i++){
+ if( z[i]=='\n' ) lineno++;
+ if( z[i]!='%' || (i>0 && z[i-1]!='\n') ) continue;
+ if( strncmp(&z[i],"%endif",6)==0 && isspace(z[i+6]) ){
+ if( exclude ){
+ exclude--;
+ if( exclude==0 ){
+ for(j=start; j<i; j++) if( z[j]!='\n' ) z[j] = ' ';
+ }
+ }
+ for(j=i; z[j] && z[j]!='\n'; j++) z[j] = ' ';
+ }else if( (strncmp(&z[i],"%ifdef",6)==0 && isspace(z[i+6]))
+ || (strncmp(&z[i],"%ifndef",7)==0 && isspace(z[i+7])) ){
+ if( exclude ){
+ exclude++;
+ }else{
+ for(j=i+7; isspace(z[j]); j++){}
+ for(n=0; z[j+n] && !isspace(z[j+n]); n++){}
+ exclude = 1;
+ for(k=0; k<nDefine; k++){
+ if( strncmp(azDefine[k],&z[j],n)==0 && lemonStrlen(azDefine[k])==n ){
+ exclude = 0;
+ break;
+ }
+ }
+ if( z[i+3]=='n' ) exclude = !exclude;
+ if( exclude ){
+ start = i;
+ start_lineno = lineno;
+ }
+ }
+ for(j=i; z[j] && z[j]!='\n'; j++) z[j] = ' ';
+ }
+ }
+ if( exclude ){
+ fprintf(stderr,"unterminated %%ifdef starting on line %d\n", start_lineno);
+ exit(1);
+ }
+}
+
+/* In spite of its name, this function is really a scanner. It read
+** in the entire input file (all at once) then tokenizes it. Each
+** token is passed to the function "parseonetoken" which builds all
+** the appropriate data structures in the global state vector "gp".
+*/
+void Parse(struct lemon *gp)
+{
+ struct pstate ps;
+ FILE *fp;
+ char *filebuf;
+ int filesize;
+ int lineno;
+ int c;
+ char *cp, *nextcp;
+ int startline = 0;
+
+ memset(&ps, '\0', sizeof(ps));
+ ps.gp = gp;
+ ps.filename = gp->filename;
+ ps.errorcnt = 0;
+ ps.state = INITIALIZE;
+
+ /* Begin by reading the input file */
+ fp = fopen(ps.filename,"rb");
+ if( fp==0 ){
+ ErrorMsg(ps.filename,0,"Can't open this file for reading.");
+ gp->errorcnt++;
+ return;
+ }
+ fseek(fp,0,2);
+ filesize = ftell(fp);
+ rewind(fp);
+ filebuf = (char *)malloc( filesize+1 );
+ if( filesize>100000000 || filebuf==0 ){
+ ErrorMsg(ps.filename,0,"Input file too large.");
+ gp->errorcnt++;
+ fclose(fp);
+ return;
+ }
+ if( fread(filebuf,1,filesize,fp)!=filesize ){
+ ErrorMsg(ps.filename,0,"Can't read in all %d bytes of this file.",
+ filesize);
+ free(filebuf);
+ gp->errorcnt++;
+ fclose(fp);
+ return;
+ }
+ fclose(fp);
+ filebuf[filesize] = 0;
+
+ /* Make an initial pass through the file to handle %ifdef and %ifndef */
+ preprocess_input(filebuf);
+
+ /* Now scan the text of the input file */
+ lineno = 1;
+ for(cp=filebuf; (c= *cp)!=0; ){
+ if( c=='\n' ) lineno++; /* Keep track of the line number */
+ if( isspace(c) ){ cp++; continue; } /* Skip all white space */
+ if( c=='/' && cp[1]=='/' ){ /* Skip C++ style comments */
+ cp+=2;
+ while( (c= *cp)!=0 && c!='\n' ) cp++;
+ continue;
+ }
+ if( c=='/' && cp[1]=='*' ){ /* Skip C style comments */
+ cp+=2;
+ while( (c= *cp)!=0 && (c!='/' || cp[-1]!='*') ){
+ if( c=='\n' ) lineno++;
+ cp++;
+ }
+ if( c ) cp++;
+ continue;
+ }
+ ps.tokenstart = cp; /* Mark the beginning of the token */
+ ps.tokenlineno = lineno; /* Linenumber on which token begins */
+ if( c=='\"' ){ /* String literals */
+ cp++;
+ while( (c= *cp)!=0 && c!='\"' ){
+ if( c=='\n' ) lineno++;
+ cp++;
+ }
+ if( c==0 ){
+ ErrorMsg(ps.filename,startline,
+"String starting on this line is not terminated before the end of the file.");
+ ps.errorcnt++;
+ nextcp = cp;
+ }else{
+ nextcp = cp+1;
+ }
+ }else if( c=='{' ){ /* A block of C code */
+ int level;
+ cp++;
+ for(level=1; (c= *cp)!=0 && (level>1 || c!='}'); cp++){
+ if( c=='\n' ) lineno++;
+ else if( c=='{' ) level++;
+ else if( c=='}' ) level--;
+ else if( c=='/' && cp[1]=='*' ){ /* Skip comments */
+ int prevc;
+ cp = &cp[2];
+ prevc = 0;
+ while( (c= *cp)!=0 && (c!='/' || prevc!='*') ){
+ if( c=='\n' ) lineno++;
+ prevc = c;
+ cp++;
+ }
+ }else if( c=='/' && cp[1]=='/' ){ /* Skip C++ style comments too */
+ cp = &cp[2];
+ while( (c= *cp)!=0 && c!='\n' ) cp++;
+ if( c ) lineno++;
+ }else if( c=='\'' || c=='\"' ){ /* String a character literals */
+ int startchar, prevc;
+ startchar = c;
+ prevc = 0;
+ for(cp++; (c= *cp)!=0 && (c!=startchar || prevc=='\\'); cp++){
+ if( c=='\n' ) lineno++;
+ if( prevc=='\\' ) prevc = 0;
+ else prevc = c;
+ }
+ }
+ }
+ if( c==0 ){
+ ErrorMsg(ps.filename,ps.tokenlineno,
+"C code starting on this line is not terminated before the end of the file.");
+ ps.errorcnt++;
+ nextcp = cp;
+ }else{
+ nextcp = cp+1;
+ }
+ }else if( isalnum(c) ){ /* Identifiers */
+ while( (c= *cp)!=0 && (isalnum(c) || c=='_') ) cp++;
+ nextcp = cp;
+ }else if( c==':' && cp[1]==':' && cp[2]=='=' ){ /* The operator "::=" */
+ cp += 3;
+ nextcp = cp;
+ }else if( (c=='/' || c=='|') && isalpha(cp[1]) ){
+ cp += 2;
+ while( (c = *cp)!=0 && (isalnum(c) || c=='_') ) cp++;
+ nextcp = cp;
+ }else{ /* All other (one character) operators */
+ cp++;
+ nextcp = cp;
+ }
+ c = *cp;
+ *cp = 0; /* Null terminate the token */
+ parseonetoken(&ps); /* Parse the token */
+ *cp = c; /* Restore the buffer */
+ cp = nextcp;
+ }
+ free(filebuf); /* Release the buffer after parsing */
+ gp->rule = ps.firstrule;
+ gp->errorcnt = ps.errorcnt;
+}
+/*************************** From the file "plink.c" *********************/
+/*
+** Routines processing configuration follow-set propagation links
+** in the LEMON parser generator.
+*/
+static struct plink *plink_freelist = 0;
+
+/* Allocate a new plink */
+struct plink *Plink_new(){
+ struct plink *newlink;
+
+ if( plink_freelist==0 ){
+ int i;
+ int amt = 100;
+ plink_freelist = (struct plink *)calloc( amt, sizeof(struct plink) );
+ if( plink_freelist==0 ){
+ fprintf(stderr,
+ "Unable to allocate memory for a new follow-set propagation link.\n");
+ exit(1);
+ }
+ for(i=0; i<amt-1; i++) plink_freelist[i].next = &plink_freelist[i+1];
+ plink_freelist[amt-1].next = 0;
+ }
+ newlink = plink_freelist;
+ plink_freelist = plink_freelist->next;
+ return newlink;
+}
+
+/* Add a plink to a plink list */
+void Plink_add(struct plink **plpp, struct config *cfp)
+{
+ struct plink *newlink;
+ newlink = Plink_new();
+ newlink->next = *plpp;
+ *plpp = newlink;
+ newlink->cfp = cfp;
+}
+
+/* Transfer every plink on the list "from" to the list "to" */
+void Plink_copy(struct plink **to, struct plink *from)
+{
+ struct plink *nextpl;
+ while( from ){
+ nextpl = from->next;
+ from->next = *to;
+ *to = from;
+ from = nextpl;
+ }
+}
+
+/* Delete every plink on the list */
+void Plink_delete(struct plink *plp)
+{
+ struct plink *nextpl;
+
+ while( plp ){
+ nextpl = plp->next;
+ plp->next = plink_freelist;
+ plink_freelist = plp;
+ plp = nextpl;
+ }
+}
+/*********************** From the file "report.c" **************************/
+/*
+** Procedures for generating reports and tables in the LEMON parser generator.
+*/
+
+/* Generate a filename with the given suffix. Space to hold the
+** name comes from malloc() and must be freed by the calling
+** function.
+*/
+PRIVATE char *file_makename(struct lemon *lemp, const char *suffix)
+{
+ char *name;
+ char *cp;
+
+ name = (char*)malloc( lemonStrlen(lemp->filename) + lemonStrlen(suffix) + 5 );
+ if( name==0 ){
+ fprintf(stderr,"Can't allocate space for a filename.\n");
+ exit(1);
+ }
+ lemon_strcpy(name,lemp->filename);
+ cp = strrchr(name,'.');
+ if( cp ) *cp = 0;
+ lemon_strcat(name,suffix);
+ return name;
+}
+
+/* Open a file with a name based on the name of the input file,
+** but with a different (specified) suffix, and return a pointer
+** to the stream */
+PRIVATE FILE *file_open(
+ struct lemon *lemp,
+ const char *suffix,
+ const char *mode
+){
+ FILE *fp;
+
+ if( lemp->outname ) free(lemp->outname);
+ lemp->outname = file_makename(lemp, suffix);
+ fp = fopen(lemp->outname,mode);
+ if( fp==0 && *mode=='w' ){
+ fprintf(stderr,"Can't open file \"%s\".\n",lemp->outname);
+ lemp->errorcnt++;
+ return 0;
+ }
+ return fp;
+}
+
+/* Duplicate the input file without comments and without actions
+** on rules */
+void Reprint(struct lemon *lemp)
+{
+ struct rule *rp;
+ struct symbol *sp;
+ int i, j, maxlen, len, ncolumns, skip;
+ printf("// Reprint of input file \"%s\".\n// Symbols:\n",lemp->filename);
+ maxlen = 10;
+ for(i=0; i<lemp->nsymbol; i++){
+ sp = lemp->symbols[i];
+ len = lemonStrlen(sp->name);
+ if( len>maxlen ) maxlen = len;
+ }
+ ncolumns = 76/(maxlen+5);
+ if( ncolumns<1 ) ncolumns = 1;
+ skip = (lemp->nsymbol + ncolumns - 1)/ncolumns;
+ for(i=0; i<skip; i++){
+ printf("//");
+ for(j=i; j<lemp->nsymbol; j+=skip){
+ sp = lemp->symbols[j];
+ assert( sp->index==j );
+ printf(" %3d %-*.*s",j,maxlen,maxlen,sp->name);
+ }
+ printf("\n");
+ }
+ for(rp=lemp->rule; rp; rp=rp->next){
+ printf("%s",rp->lhs->name);
+ /* if( rp->lhsalias ) printf("(%s)",rp->lhsalias); */
+ printf(" ::=");
+ for(i=0; i<rp->nrhs; i++){
+ sp = rp->rhs[i];
+ if( sp->type==MULTITERMINAL ){
+ printf(" %s", sp->subsym[0]->name);
+ for(j=1; j<sp->nsubsym; j++){
+ printf("|%s", sp->subsym[j]->name);
+ }
+ }else{
+ printf(" %s", sp->name);
+ }
+ /* if( rp->rhsalias[i] ) printf("(%s)",rp->rhsalias[i]); */
+ }
+ printf(".");
+ if( rp->precsym ) printf(" [%s]",rp->precsym->name);
+ /* if( rp->code ) printf("\n %s",rp->code); */
+ printf("\n");
+ }
+}
+
+void ConfigPrint(FILE *fp, struct config *cfp)
+{
+ struct rule *rp;
+ struct symbol *sp;
+ int i, j;
+ rp = cfp->rp;
+ fprintf(fp,"%s ::=",rp->lhs->name);
+ for(i=0; i<=rp->nrhs; i++){
+ if( i==cfp->dot ) fprintf(fp," *");
+ if( i==rp->nrhs ) break;
+ sp = rp->rhs[i];
+ if( sp->type==MULTITERMINAL ){
+ fprintf(fp," %s", sp->subsym[0]->name);
+ for(j=1; j<sp->nsubsym; j++){
+ fprintf(fp,"|%s",sp->subsym[j]->name);
+ }
+ }else{
+ fprintf(fp," %s", sp->name);
+ }
+ }
+}
+
+/* #define TEST */
+#if 0
+/* Print a set */
+PRIVATE void SetPrint(out,set,lemp)
+FILE *out;
+char *set;
+struct lemon *lemp;
+{
+ int i;
+ char *spacer;
+ spacer = "";
+ fprintf(out,"%12s[","");
+ for(i=0; i<lemp->nterminal; i++){
+ if( SetFind(set,i) ){
+ fprintf(out,"%s%s",spacer,lemp->symbols[i]->name);
+ spacer = " ";
+ }
+ }
+ fprintf(out,"]\n");
+}
+
+/* Print a plink chain */
+PRIVATE void PlinkPrint(out,plp,tag)
+FILE *out;
+struct plink *plp;
+char *tag;
+{
+ while( plp ){
+ fprintf(out,"%12s%s (state %2d) ","",tag,plp->cfp->stp->statenum);
+ ConfigPrint(out,plp->cfp);
+ fprintf(out,"\n");
+ plp = plp->next;
+ }
+}
+#endif
+
+/* Print an action to the given file descriptor. Return FALSE if
+** nothing was actually printed.
+*/
+int PrintAction(struct action *ap, FILE *fp, int indent){
+ int result = 1;
+ switch( ap->type ){
+ case SHIFT:
+ fprintf(fp,"%*s shift %d",indent,ap->sp->name,ap->x.stp->statenum);
+ break;
+ case REDUCE:
+ fprintf(fp,"%*s reduce %d",indent,ap->sp->name,ap->x.rp->index);
+ break;
+ case ACCEPT:
+ fprintf(fp,"%*s accept",indent,ap->sp->name);
+ break;
+ case ERROR:
+ fprintf(fp,"%*s error",indent,ap->sp->name);
+ break;
+ case SRCONFLICT:
+ case RRCONFLICT:
+ fprintf(fp,"%*s reduce %-3d ** Parsing conflict **",
+ indent,ap->sp->name,ap->x.rp->index);
+ break;
+ case SSCONFLICT:
+ fprintf(fp,"%*s shift %-3d ** Parsing conflict **",
+ indent,ap->sp->name,ap->x.stp->statenum);
+ break;
+ case SH_RESOLVED:
+ if( showPrecedenceConflict ){
+ fprintf(fp,"%*s shift %-3d -- dropped by precedence",
+ indent,ap->sp->name,ap->x.stp->statenum);
+ }else{
+ result = 0;
+ }
+ break;
+ case RD_RESOLVED:
+ if( showPrecedenceConflict ){
+ fprintf(fp,"%*s reduce %-3d -- dropped by precedence",
+ indent,ap->sp->name,ap->x.rp->index);
+ }else{
+ result = 0;
+ }
+ break;
+ case NOT_USED:
+ result = 0;
+ break;
+ }
+ return result;
+}
+
+/* Generate the "y.output" log file */
+void ReportOutput(struct lemon *lemp)
+{
+ int i;
+ struct state *stp;
+ struct config *cfp;
+ struct action *ap;
+ FILE *fp;
+
+ fp = file_open(lemp,".out","wb");
+ if( fp==0 ) return;
+ for(i=0; i<lemp->nstate; i++){
+ stp = lemp->sorted[i];
+ fprintf(fp,"State %d:\n",stp->statenum);
+ if( lemp->basisflag ) cfp=stp->bp;
+ else cfp=stp->cfp;
+ while( cfp ){
+ char buf[20];
+ if( cfp->dot==cfp->rp->nrhs ){
+ lemon_sprintf(buf,"(%d)",cfp->rp->index);
+ fprintf(fp," %5s ",buf);
+ }else{
+ fprintf(fp," ");
+ }
+ ConfigPrint(fp,cfp);
+ fprintf(fp,"\n");
+#if 0
+ SetPrint(fp,cfp->fws,lemp);
+ PlinkPrint(fp,cfp->fplp,"To ");
+ PlinkPrint(fp,cfp->bplp,"From");
+#endif
+ if( lemp->basisflag ) cfp=cfp->bp;
+ else cfp=cfp->next;
+ }
+ fprintf(fp,"\n");
+ for(ap=stp->ap; ap; ap=ap->next){
+ if( PrintAction(ap,fp,30) ) fprintf(fp,"\n");
+ }
+ fprintf(fp,"\n");
+ }
+ fprintf(fp, "----------------------------------------------------\n");
+ fprintf(fp, "Symbols:\n");
+ for(i=0; i<lemp->nsymbol; i++){
+ int j;
+ struct symbol *sp;
+
+ sp = lemp->symbols[i];
+ fprintf(fp, " %3d: %s", i, sp->name);
+ if( sp->type==NONTERMINAL ){
+ fprintf(fp, ":");
+ if( sp->lambda ){
+ fprintf(fp, " <lambda>");
+ }
+ for(j=0; j<lemp->nterminal; j++){
+ if( sp->firstset && SetFind(sp->firstset, j) ){
+ fprintf(fp, " %s", lemp->symbols[j]->name);
+ }
+ }
+ }
+ fprintf(fp, "\n");
+ }
+ fclose(fp);
+ return;
+}
+
+/* Search for the file "name" which is in the same directory as
+** the exacutable */
+PRIVATE char *pathsearch(char *argv0, char *name, int modemask)
+{
+ const char *pathlist;
+ char *pathbufptr;
+ char *pathbuf;
+ char *path,*cp;
+ char c;
+
+#ifdef __WIN32__
+ cp = strrchr(argv0,'\\');
+#else
+ cp = strrchr(argv0,'/');
+#endif
+ if( cp ){
+ c = *cp;
+ *cp = 0;
+ path = (char *)malloc( lemonStrlen(argv0) + lemonStrlen(name) + 2 );
+ if( path ) lemon_sprintf(path,"%s/%s",argv0,name);
+ *cp = c;
+ }else{
+ pathlist = getenv("PATH");
+ if( pathlist==0 ) pathlist = ".:/bin:/usr/bin";
+ pathbuf = (char *) malloc( lemonStrlen(pathlist) + 1 );
+ path = (char *)malloc( lemonStrlen(pathlist)+lemonStrlen(name)+2 );
+ if( (pathbuf != 0) && (path!=0) ){
+ pathbufptr = pathbuf;
+ lemon_strcpy(pathbuf, pathlist);
+ while( *pathbuf ){
+ cp = strchr(pathbuf,':');
+ if( cp==0 ) cp = &pathbuf[lemonStrlen(pathbuf)];
+ c = *cp;
+ *cp = 0;
+ lemon_sprintf(path,"%s/%s",pathbuf,name);
+ *cp = c;
+ if( c==0 ) pathbuf[0] = 0;
+ else pathbuf = &cp[1];
+ if( access(path,modemask)==0 ) break;
+ }
+ free(pathbufptr);
+ }
+ }
+ return path;
+}
+
+/* Given an action, compute the integer value for that action
+** which is to be put in the action table of the generated machine.
+** Return negative if no action should be generated.
+*/
+PRIVATE int compute_action(struct lemon *lemp, struct action *ap)
+{
+ int act;
+ switch( ap->type ){
+ case SHIFT: act = ap->x.stp->statenum; break;
+ case REDUCE: act = ap->x.rp->index + lemp->nstate; break;
+ case ERROR: act = lemp->nstate + lemp->nrule; break;
+ case ACCEPT: act = lemp->nstate + lemp->nrule + 1; break;
+ default: act = -1; break;
+ }
+ return act;
+}
+
+#define LINESIZE 1000
+/* The next cluster of routines are for reading the template file
+** and writing the results to the generated parser */
+/* The first function transfers data from "in" to "out" until
+** a line is seen which begins with "%%". The line number is
+** tracked.
+**
+** if name!=0, then any word that begin with "Parse" is changed to
+** begin with *name instead.
+*/
+PRIVATE void tplt_xfer(char *name, FILE *in, FILE *out, int *lineno)
+{
+ int i, iStart;
+ char line[LINESIZE];
+ while( fgets(line,LINESIZE,in) && (line[0]!='%' || line[1]!='%') ){
+ (*lineno)++;
+ iStart = 0;
+ if( name ){
+ for(i=0; line[i]; i++){
+ if( line[i]=='P' && strncmp(&line[i],"Parse",5)==0
+ && (i==0 || !isalpha(line[i-1]))
+ ){
+ if( i>iStart ) fprintf(out,"%.*s",i-iStart,&line[iStart]);
+ fprintf(out,"%s",name);
+ i += 4;
+ iStart = i+1;
+ }
+ }
+ }
+ fprintf(out,"%s",&line[iStart]);
+ }
+}
+
+/* The next function finds the template file and opens it, returning
+** a pointer to the opened file. */
+PRIVATE FILE *tplt_open(struct lemon *lemp)
+{
+ static char templatename[] = "lempar.c";
+ char buf[1000];
+ FILE *in;
+ char *tpltname;
+ char *cp;
+
+ /* first, see if user specified a template filename on the command line. */
+ if (user_templatename != 0) {
+ if( access(user_templatename,004)==-1 ){
+ fprintf(stderr,"Can't find the parser driver template file \"%s\".\n",
+ user_templatename);
+ lemp->errorcnt++;
+ return 0;
+ }
+ in = fopen(user_templatename,"rb");
+ if( in==0 ){
+ fprintf(stderr,"Can't open the template file \"%s\".\n",user_templatename);
+ lemp->errorcnt++;
+ return 0;
+ }
+ return in;
+ }
+
+ cp = strrchr(lemp->filename,'.');
+ if( cp ){
+ lemon_sprintf(buf,"%.*s.lt",(int)(cp-lemp->filename),lemp->filename);
+ }else{
+ lemon_sprintf(buf,"%s.lt",lemp->filename);
+ }
+ if( access(buf,004)==0 ){
+ tpltname = buf;
+ }else if( access(templatename,004)==0 ){
+ tpltname = templatename;
+ }else{
+ tpltname = pathsearch(lemp->argv0,templatename,0);
+ }
+ if( tpltname==0 ){
+ fprintf(stderr,"Can't find the parser driver template file \"%s\".\n",
+ templatename);
+ lemp->errorcnt++;
+ return 0;
+ }
+ in = fopen(tpltname,"rb");
+ if( in==0 ){
+ fprintf(stderr,"Can't open the template file \"%s\".\n",templatename);
+ lemp->errorcnt++;
+ return 0;
+ }
+ return in;
+}
+
+/* Print a #line directive line to the output file. */
+PRIVATE void tplt_linedir(FILE *out, int lineno, char *filename)
+{
+ fprintf(out,"#line %d \"",lineno);
+ while( *filename ){
+ if( *filename == '\\' ) putc('\\',out);
+ putc(*filename,out);
+ filename++;
+ }
+ fprintf(out,"\"\n");
+}
+
+/* Print a string to the file and keep the linenumber up to date */
+PRIVATE void tplt_print(FILE *out, struct lemon *lemp, char *str, int *lineno)
+{
+ if( str==0 ) return;
+ while( *str ){
+ putc(*str,out);
+ if( *str=='\n' ) (*lineno)++;
+ str++;
+ }
+ if( str[-1]!='\n' ){
+ putc('\n',out);
+ (*lineno)++;
+ }
+ if (!lemp->nolinenosflag) {
+ (*lineno)++; tplt_linedir(out,*lineno,lemp->outname);
+ }
+ return;
+}
+
+/*
+** The following routine emits code for the destructor for the
+** symbol sp
+*/
+void emit_destructor_code(
+ FILE *out,
+ struct symbol *sp,
+ struct lemon *lemp,
+ int *lineno
+){
+ char *cp = 0;
+
+ if( sp->type==TERMINAL ){
+ cp = lemp->tokendest;
+ if( cp==0 ) return;
+ fprintf(out,"{\n"); (*lineno)++;
+ }else if( sp->destructor ){
+ cp = sp->destructor;
+ fprintf(out,"{\n"); (*lineno)++;
+ if (!lemp->nolinenosflag) { (*lineno)++; tplt_linedir(out,sp->destLineno,lemp->filename); }
+ }else if( lemp->vardest ){
+ cp = lemp->vardest;
+ if( cp==0 ) return;
+ fprintf(out,"{\n"); (*lineno)++;
+ }else{
+ assert( 0 ); /* Cannot happen */
+ }
+ for(; *cp; cp++){
+ if( *cp=='$' && cp[1]=='$' ){
+ fprintf(out,"(yypminor->yy%d)",sp->dtnum);
+ cp++;
+ continue;
+ }
+ if( *cp=='\n' ) (*lineno)++;
+ fputc(*cp,out);
+ }
+ fprintf(out,"\n"); (*lineno)++;
+ if (!lemp->nolinenosflag) {
+ (*lineno)++; tplt_linedir(out,*lineno,lemp->outname);
+ }
+ fprintf(out,"}\n"); (*lineno)++;
+ return;
+}
+
+/*
+** Return TRUE (non-zero) if the given symbol has a destructor.
+*/
+int has_destructor(struct symbol *sp, struct lemon *lemp)
+{
+ int ret;
+ if( sp->type==TERMINAL ){
+ ret = lemp->tokendest!=0;
+ }else{
+ ret = lemp->vardest!=0 || sp->destructor!=0;
+ }
+ return ret;
+}
+
+/*
+** Append text to a dynamically allocated string. If zText is 0 then
+** reset the string to be empty again. Always return the complete text
+** of the string (which is overwritten with each call).
+**
+** n bytes of zText are stored. If n==0 then all of zText up to the first
+** \000 terminator is stored. zText can contain up to two instances of
+** %d. The values of p1 and p2 are written into the first and second
+** %d.
+**
+** If n==-1, then the previous character is overwritten.
+*/
+PRIVATE char *append_str(const char *zText, int n, int p1, int p2){
+ static char empty[1] = { 0 };
+ static char *z = 0;
+ static int alloced = 0;
+ static int used = 0;
+ int c;
+ char zInt[40];
+ if( zText==0 ){
+ used = 0;
+ return z;
+ }
+ if( n<=0 ){
+ if( n<0 ){
+ used += n;
+ assert( used>=0 );
+ }
+ n = lemonStrlen(zText);
+ }
+ if( (int) (n+sizeof(zInt)*2+used) >= alloced ){
+ alloced = n + sizeof(zInt)*2 + used + 200;
+ z = (char *) realloc(z, alloced);
+ }
+ if( z==0 ) return empty;
+ while( n-- > 0 ){
+ c = *(zText++);
+ if( c=='%' && n>0 && zText[0]=='d' ){
+ lemon_sprintf(zInt, "%d", p1);
+ p1 = p2;
+ lemon_strcpy(&z[used], zInt);
+ used += lemonStrlen(&z[used]);
+ zText++;
+ n--;
+ }else{
+ z[used++] = c;
+ }
+ }
+ z[used] = 0;
+ return z;
+}
+
+/*
+** zCode is a string that is the action associated with a rule. Expand
+** the symbols in this string so that the refer to elements of the parser
+** stack.
+*/
+PRIVATE void translate_code(struct lemon *lemp, struct rule *rp){
+ char *cp, *xp;
+ int i;
+ char lhsused = 0; /* True if the LHS element has been used */
+ char used[MAXRHS]; /* True for each RHS element which is used */
+
+ for(i=0; i<rp->nrhs; i++) used[i] = 0;
+ lhsused = 0;
+
+ if( rp->code==0 ){
+ static char newlinestr[2] = { '\n', '\0' };
+ rp->code = newlinestr;
+ rp->line = rp->ruleline;
+ }
+
+ append_str(0,0,0,0);
+
+ /* This const cast is wrong but harmless, if we're careful. */
+ for(cp=(char *)rp->code; *cp; cp++){
+ if( isalpha(*cp) && (cp==rp->code || (!isalnum(cp[-1]) && cp[-1]!='_')) ){
+ char saved;
+ for(xp= &cp[1]; isalnum(*xp) || *xp=='_'; xp++);
+ saved = *xp;
+ *xp = 0;
+ if( rp->lhsalias && strcmp(cp,rp->lhsalias)==0 ){
+ append_str("yygotominor.yy%d",0,rp->lhs->dtnum,0);
+ cp = xp;
+ lhsused = 1;
+ }else{
+ for(i=0; i<rp->nrhs; i++){
+ if( rp->rhsalias[i] && strcmp(cp,rp->rhsalias[i])==0 ){
+ if( cp!=rp->code && cp[-1]=='@' ){
+ /* If the argument is of the form @X then substituted
+ ** the token number of X, not the value of X */
+ append_str("yymsp[%d].major",-1,i-rp->nrhs+1,0);
+ }else{
+ struct symbol *sp = rp->rhs[i];
+ int dtnum;
+ if( sp->type==MULTITERMINAL ){
+ dtnum = sp->subsym[0]->dtnum;
+ }else{
+ dtnum = sp->dtnum;
+ }
+ append_str("yymsp[%d].minor.yy%d",0,i-rp->nrhs+1, dtnum);
+ }
+ cp = xp;
+ used[i] = 1;
+ break;
+ }
+ }
+ }
+ *xp = saved;
+ }
+ append_str(cp, 1, 0, 0);
+ } /* End loop */
+
+ /* Check to make sure the LHS has been used */
+ if( rp->lhsalias && !lhsused ){
+ ErrorMsg(lemp->filename,rp->ruleline,
+ "Label \"%s\" for \"%s(%s)\" is never used.",
+ rp->lhsalias,rp->lhs->name,rp->lhsalias);
+ lemp->errorcnt++;
+ }
+
+ /* Generate destructor code for RHS symbols which are not used in the
+ ** reduce code */
+ for(i=0; i<rp->nrhs; i++){
+ if( rp->rhsalias[i] && !used[i] ){
+ ErrorMsg(lemp->filename,rp->ruleline,
+ "Label %s for \"%s(%s)\" is never used.",
+ rp->rhsalias[i],rp->rhs[i]->name,rp->rhsalias[i]);
+ lemp->errorcnt++;
+ }else if( rp->rhsalias[i]==0 ){
+ if( has_destructor(rp->rhs[i],lemp) ){
+ append_str(" yy_destructor(yypParser,%d,&yymsp[%d].minor);\n", 0,
+ rp->rhs[i]->index,i-rp->nrhs+1);
+ }else{
+ /* No destructor defined for this term */
+ }
+ }
+ }
+ if( rp->code ){
+ cp = append_str(0,0,0,0);
+ rp->code = Strsafe(cp?cp:"");
+ }
+}
+
+/*
+** Generate code which executes when the rule "rp" is reduced. Write
+** the code to "out". Make sure lineno stays up-to-date.
+*/
+PRIVATE void emit_code(
+ FILE *out,
+ struct rule *rp,
+ struct lemon *lemp,
+ int *lineno
+){
+ const char *cp;
+
+ /* Generate code to do the reduce action */
+ if( rp->code ){
+ if (!lemp->nolinenosflag) { (*lineno)++; tplt_linedir(out,rp->line,lemp->filename); }
+ fprintf(out,"{%s",rp->code);
+ for(cp=rp->code; *cp; cp++){
+ if( *cp=='\n' ) (*lineno)++;
+ } /* End loop */
+ fprintf(out,"}\n"); (*lineno)++;
+ if (!lemp->nolinenosflag) { (*lineno)++; tplt_linedir(out,*lineno,lemp->outname); }
+ } /* End if( rp->code ) */
+
+ return;
+}
+
+/*
+** Print the definition of the union used for the parser's data stack.
+** This union contains fields for every possible data type for tokens
+** and nonterminals. In the process of computing and printing this
+** union, also set the ".dtnum" field of every terminal and nonterminal
+** symbol.
+*/
+void print_stack_union(
+ FILE *out, /* The output stream */
+ struct lemon *lemp, /* The main info structure for this parser */
+ int *plineno, /* Pointer to the line number */
+ int mhflag /* True if generating makeheaders output */
+){
+ int lineno = *plineno; /* The line number of the output */
+ char **types; /* A hash table of datatypes */
+ int arraysize; /* Size of the "types" array */
+ int maxdtlength; /* Maximum length of any ".datatype" field. */
+ char *stddt; /* Standardized name for a datatype */
+ int i,j; /* Loop counters */
+ unsigned hash; /* For hashing the name of a type */
+ const char *name; /* Name of the parser */
+
+ /* Allocate and initialize types[] and allocate stddt[] */
+ arraysize = lemp->nsymbol * 2;
+ types = (char**)calloc( arraysize, sizeof(char*) );
+ if( types==0 ){
+ fprintf(stderr,"Out of memory.\n");
+ exit(1);
+ }
+ for(i=0; i<arraysize; i++) types[i] = 0;
+ maxdtlength = 0;
+ if( lemp->vartype ){
+ maxdtlength = lemonStrlen(lemp->vartype);
+ }
+ for(i=0; i<lemp->nsymbol; i++){
+ int len;
+ struct symbol *sp = lemp->symbols[i];
+ if( sp->datatype==0 ) continue;
+ len = lemonStrlen(sp->datatype);
+ if( len>maxdtlength ) maxdtlength = len;
+ }
+ stddt = (char*)malloc( maxdtlength*2 + 1 );
+ if( stddt==0 ){
+ fprintf(stderr,"Out of memory.\n");
+ exit(1);
+ }
+
+ /* Build a hash table of datatypes. The ".dtnum" field of each symbol
+ ** is filled in with the hash index plus 1. A ".dtnum" value of 0 is
+ ** used for terminal symbols. If there is no %default_type defined then
+ ** 0 is also used as the .dtnum value for nonterminals which do not specify
+ ** a datatype using the %type directive.
+ */
+ for(i=0; i<lemp->nsymbol; i++){
+ struct symbol *sp = lemp->symbols[i];
+ char *cp;
+ if( sp==lemp->errsym ){
+ sp->dtnum = arraysize+1;
+ continue;
+ }
+ if( sp->type!=NONTERMINAL || (sp->datatype==0 && lemp->vartype==0) ){
+ sp->dtnum = 0;
+ continue;
+ }
+ cp = sp->datatype;
+ if( cp==0 ) cp = lemp->vartype;
+ j = 0;
+ while( isspace(*cp) ) cp++;
+ while( *cp ) stddt[j++] = *cp++;
+ while( j>0 && isspace(stddt[j-1]) ) j--;
+ stddt[j] = 0;
+ if( lemp->tokentype && strcmp(stddt, lemp->tokentype)==0 ){
+ sp->dtnum = 0;
+ continue;
+ }
+ hash = 0;
+ for(j=0; stddt[j]; j++){
+ hash = hash*53 + stddt[j];
+ }
+ hash = (hash & 0x7fffffff)%arraysize;
+ while( types[hash] ){
+ if( strcmp(types[hash],stddt)==0 ){
+ sp->dtnum = hash + 1;
+ break;
+ }
+ hash++;
+ if( hash>=(unsigned)arraysize ) hash = 0;
+ }
+ if( types[hash]==0 ){
+ sp->dtnum = hash + 1;
+ types[hash] = (char*)malloc( lemonStrlen(stddt)+1 );
+ if( types[hash]==0 ){
+ fprintf(stderr,"Out of memory.\n");
+ exit(1);
+ }
+ lemon_strcpy(types[hash],stddt);
+ }
+ }
+
+ /* Print out the definition of YYTOKENTYPE and YYMINORTYPE */
+ name = lemp->name ? lemp->name : "Parse";
+ lineno = *plineno;
+ if( mhflag ){ fprintf(out,"#if INTERFACE\n"); lineno++; }
+ fprintf(out,"#define %sTOKENTYPE %s\n",name,
+ lemp->tokentype?lemp->tokentype:"void*"); lineno++;
+ if( mhflag ){ fprintf(out,"#endif\n"); lineno++; }
+ fprintf(out,"typedef union {\n"); lineno++;
+ fprintf(out," int yyinit;\n"); lineno++;
+ fprintf(out," %sTOKENTYPE yy0;\n",name); lineno++;
+ for(i=0; i<arraysize; i++){
+ if( types[i]==0 ) continue;
+ fprintf(out," %s yy%d;\n",types[i],i+1); lineno++;
+ free(types[i]);
+ }
+ if( lemp->errsym->useCnt ){
+ fprintf(out," int yy%d;\n",lemp->errsym->dtnum); lineno++;
+ }
+ free(stddt);
+ free(types);
+ fprintf(out,"} YYMINORTYPE;\n"); lineno++;
+ *plineno = lineno;
+}
+
+/*
+** Return the name of a C datatype able to represent values between
+** lwr and upr, inclusive.
+*/
+static const char *minimum_size_type(int lwr, int upr){
+ if( lwr>=0 ){
+ if( upr<=255 ){
+ return "unsigned char";
+ }else if( upr<65535 ){
+ return "unsigned short int";
+ }else{
+ return "unsigned int";
+ }
+ }else if( lwr>=-127 && upr<=127 ){
+ return "signed char";
+ }else if( lwr>=-32767 && upr<32767 ){
+ return "short";
+ }else{
+ return "int";
+ }
+}
+
+/*
+** Each state contains a set of token transaction and a set of
+** nonterminal transactions. Each of these sets makes an instance
+** of the following structure. An array of these structures is used
+** to order the creation of entries in the yy_action[] table.
+*/
+struct axset {
+ struct state *stp; /* A pointer to a state */
+ int isTkn; /* True to use tokens. False for non-terminals */
+ int nAction; /* Number of actions */
+ int iOrder; /* Original order of action sets */
+};
+
+/*
+** Compare to axset structures for sorting purposes
+*/
+static int axset_compare(const void *a, const void *b){
+ struct axset *p1 = (struct axset*)a;
+ struct axset *p2 = (struct axset*)b;
+ int c;
+ c = p2->nAction - p1->nAction;
+ if( c==0 ){
+ c = p2->iOrder - p1->iOrder;
+ }
+ assert( c!=0 || p1==p2 );
+ return c;
+}
+
+/*
+** Write text on "out" that describes the rule "rp".
+*/
+static void writeRuleText(FILE *out, struct rule *rp){
+ int j;
+ fprintf(out,"%s ::=", rp->lhs->name);
+ for(j=0; j<rp->nrhs; j++){
+ struct symbol *sp = rp->rhs[j];
+ if( sp->type!=MULTITERMINAL ){
+ fprintf(out," %s", sp->name);
+ }else{
+ int k;
+ fprintf(out," %s", sp->subsym[0]->name);
+ for(k=1; k<sp->nsubsym; k++){
+ fprintf(out,"|%s",sp->subsym[k]->name);
+ }
+ }
+ }
+}
+
+
+/* Generate C source code for the parser */
+void ReportTable(
+ struct lemon *lemp,
+ int mhflag /* Output in makeheaders format if true */
+){
+ FILE *out, *in;
+ char line[LINESIZE];
+ int lineno;
+ struct state *stp;
+ struct action *ap;
+ struct rule *rp;
+ struct acttab *pActtab;
+ int i, j, n;
+ const char *name;
+ int mnTknOfst, mxTknOfst;
+ int mnNtOfst, mxNtOfst;
+ struct axset *ax;
+
+ in = tplt_open(lemp);
+ if( in==0 ) return;
+ out = file_open(lemp,".c","wb");
+ if( out==0 ){
+ fclose(in);
+ return;
+ }
+ lineno = 1;
+ tplt_xfer(lemp->name,in,out,&lineno);
+
+ /* Generate the include code, if any */
+ tplt_print(out,lemp,lemp->include,&lineno);
+ if( mhflag ){
+ char *name = file_makename(lemp, ".h");
+ fprintf(out,"#include \"%s\"\n", name); lineno++;
+ free(name);
+ }
+ tplt_xfer(lemp->name,in,out,&lineno);
+
+ /* Generate #defines for all tokens */
+ if( mhflag ){
+ const char *prefix;
+ fprintf(out,"#if INTERFACE\n"); lineno++;
+ if( lemp->tokenprefix ) prefix = lemp->tokenprefix;
+ else prefix = "";
+ for(i=1; i<lemp->nterminal; i++){
+ fprintf(out,"#define %s%-30s %2d\n",prefix,lemp->symbols[i]->name,i);
+ lineno++;
+ }
+ fprintf(out,"#endif\n"); lineno++;
+ }
+ tplt_xfer(lemp->name,in,out,&lineno);
+
+ /* Generate the defines */
+ fprintf(out,"#define YYCODETYPE %s\n",
+ minimum_size_type(0, lemp->nsymbol+1)); lineno++;
+ fprintf(out,"#define YYNOCODE %d\n",lemp->nsymbol+1); lineno++;
+ fprintf(out,"#define YYACTIONTYPE %s\n",
+ minimum_size_type(0, lemp->nstate+lemp->nrule+5)); lineno++;
+ if( lemp->wildcard ){
+ fprintf(out,"#define YYWILDCARD %d\n",
+ lemp->wildcard->index); lineno++;
+ }
+ print_stack_union(out,lemp,&lineno,mhflag);
+ fprintf(out, "#ifndef YYSTACKDEPTH\n"); lineno++;
+ if( lemp->stacksize ){
+ fprintf(out,"#define YYSTACKDEPTH %s\n",lemp->stacksize); lineno++;
+ }else{
+ fprintf(out,"#define YYSTACKDEPTH 100\n"); lineno++;
+ }
+ fprintf(out, "#endif\n"); lineno++;
+ if( mhflag ){
+ fprintf(out,"#if INTERFACE\n"); lineno++;
+ }
+ name = lemp->name ? lemp->name : "Parse";
+ if( lemp->arg && lemp->arg[0] ){
+ int i;
+ i = lemonStrlen(lemp->arg);
+ while( i>=1 && isspace(lemp->arg[i-1]) ) i--;
+ while( i>=1 && (isalnum(lemp->arg[i-1]) || lemp->arg[i-1]=='_') ) i--;
+ fprintf(out,"#define %sARG_SDECL %s;\n",name,lemp->arg); lineno++;
+ fprintf(out,"#define %sARG_PDECL ,%s\n",name,lemp->arg); lineno++;
+ fprintf(out,"#define %sARG_FETCH %s = yypParser->%s\n",
+ name,lemp->arg,&lemp->arg[i]); lineno++;
+ fprintf(out,"#define %sARG_STORE yypParser->%s = %s\n",
+ name,&lemp->arg[i],&lemp->arg[i]); lineno++;
+ }else{
+ fprintf(out,"#define %sARG_SDECL\n",name); lineno++;
+ fprintf(out,"#define %sARG_PDECL\n",name); lineno++;
+ fprintf(out,"#define %sARG_FETCH\n",name); lineno++;
+ fprintf(out,"#define %sARG_STORE\n",name); lineno++;
+ }
+ if( mhflag ){
+ fprintf(out,"#endif\n"); lineno++;
+ }
+ fprintf(out,"#define YYNSTATE %d\n",lemp->nstate); lineno++;
+ fprintf(out,"#define YYNRULE %d\n",lemp->nrule); lineno++;
+ if( lemp->errsym->useCnt ){
+ fprintf(out,"#define YYERRORSYMBOL %d\n",lemp->errsym->index); lineno++;
+ fprintf(out,"#define YYERRSYMDT yy%d\n",lemp->errsym->dtnum); lineno++;
+ }
+ if( lemp->has_fallback ){
+ fprintf(out,"#define YYFALLBACK 1\n"); lineno++;
+ }
+ tplt_xfer(lemp->name,in,out,&lineno);
+
+ /* Generate the action table and its associates:
+ **
+ ** yy_action[] A single table containing all actions.
+ ** yy_lookahead[] A table containing the lookahead for each entry in
+ ** yy_action. Used to detect hash collisions.
+ ** yy_shift_ofst[] For each state, the offset into yy_action for
+ ** shifting terminals.
+ ** yy_reduce_ofst[] For each state, the offset into yy_action for
+ ** shifting non-terminals after a reduce.
+ ** yy_default[] Default action for each state.
+ */
+
+ /* Compute the actions on all states and count them up */
+ ax = (struct axset *) calloc(lemp->nstate*2, sizeof(ax[0]));
+ if( ax==0 ){
+ fprintf(stderr,"malloc failed\n");
+ exit(1);
+ }
+ for(i=0; i<lemp->nstate; i++){
+ stp = lemp->sorted[i];
+ ax[i*2].stp = stp;
+ ax[i*2].isTkn = 1;
+ ax[i*2].nAction = stp->nTknAct;
+ ax[i*2+1].stp = stp;
+ ax[i*2+1].isTkn = 0;
+ ax[i*2+1].nAction = stp->nNtAct;
+ }
+ mxTknOfst = mnTknOfst = 0;
+ mxNtOfst = mnNtOfst = 0;
+
+ /* Compute the action table. In order to try to keep the size of the
+ ** action table to a minimum, the heuristic of placing the largest action
+ ** sets first is used.
+ */
+ for(i=0; i<lemp->nstate*2; i++) ax[i].iOrder = i;
+ qsort(ax, lemp->nstate*2, sizeof(ax[0]), axset_compare);
+ pActtab = acttab_alloc();
+ for(i=0; i<lemp->nstate*2 && ax[i].nAction>0; i++){
+ stp = ax[i].stp;
+ if( ax[i].isTkn ){
+ for(ap=stp->ap; ap; ap=ap->next){
+ int action;
+ if( ap->sp->index>=lemp->nterminal ) continue;
+ action = compute_action(lemp, ap);
+ if( action<0 ) continue;
+ acttab_action(pActtab, ap->sp->index, action);
+ }
+ stp->iTknOfst = acttab_insert(pActtab);
+ if( stp->iTknOfst<mnTknOfst ) mnTknOfst = stp->iTknOfst;
+ if( stp->iTknOfst>mxTknOfst ) mxTknOfst = stp->iTknOfst;
+ }else{
+ for(ap=stp->ap; ap; ap=ap->next){
+ int action;
+ if( ap->sp->index<lemp->nterminal ) continue;
+ if( ap->sp->index==lemp->nsymbol ) continue;
+ action = compute_action(lemp, ap);
+ if( action<0 ) continue;
+ acttab_action(pActtab, ap->sp->index, action);
+ }
+ stp->iNtOfst = acttab_insert(pActtab);
+ if( stp->iNtOfst<mnNtOfst ) mnNtOfst = stp->iNtOfst;
+ if( stp->iNtOfst>mxNtOfst ) mxNtOfst = stp->iNtOfst;
+ }
+ }
+ free(ax);
+
+ /* Output the yy_action table */
+ n = acttab_size(pActtab);
+ fprintf(out,"#define YY_ACTTAB_COUNT (%d)\n", n); lineno++;
+ fprintf(out,"static const YYACTIONTYPE yy_action[] = {\n"); lineno++;
+ for(i=j=0; i<n; i++){
+ int action = acttab_yyaction(pActtab, i);
+ if( action<0 ) action = lemp->nstate + lemp->nrule + 2;
+ if( j==0 ) fprintf(out," /* %5d */ ", i);
+ fprintf(out, " %4d,", action);
+ if( j==9 || i==n-1 ){
+ fprintf(out, "\n"); lineno++;
+ j = 0;
+ }else{
+ j++;
+ }
+ }
+ fprintf(out, "};\n"); lineno++;
+
+ /* Output the yy_lookahead table */
+ fprintf(out,"static const YYCODETYPE yy_lookahead[] = {\n"); lineno++;
+ for(i=j=0; i<n; i++){
+ int la = acttab_yylookahead(pActtab, i);
+ if( la<0 ) la = lemp->nsymbol;
+ if( j==0 ) fprintf(out," /* %5d */ ", i);
+ fprintf(out, " %4d,", la);
+ if( j==9 || i==n-1 ){
+ fprintf(out, "\n"); lineno++;
+ j = 0;
+ }else{
+ j++;
+ }
+ }
+ fprintf(out, "};\n"); lineno++;
+
+ /* Output the yy_shift_ofst[] table */
+ fprintf(out, "#define YY_SHIFT_USE_DFLT (%d)\n", mnTknOfst-1); lineno++;
+ n = lemp->nstate;
+ while( n>0 && lemp->sorted[n-1]->iTknOfst==NO_OFFSET ) n--;
+ fprintf(out, "#define YY_SHIFT_COUNT (%d)\n", n-1); lineno++;
+ fprintf(out, "#define YY_SHIFT_MIN (%d)\n", mnTknOfst); lineno++;
+ fprintf(out, "#define YY_SHIFT_MAX (%d)\n", mxTknOfst); lineno++;
+ fprintf(out, "static const %s yy_shift_ofst[] = {\n",
+ minimum_size_type(mnTknOfst-1, mxTknOfst)); lineno++;
+ for(i=j=0; i<n; i++){
+ int ofst;
+ stp = lemp->sorted[i];
+ ofst = stp->iTknOfst;
+ if( ofst==NO_OFFSET ) ofst = mnTknOfst - 1;
+ if( j==0 ) fprintf(out," /* %5d */ ", i);
+ fprintf(out, " %4d,", ofst);
+ if( j==9 || i==n-1 ){
+ fprintf(out, "\n"); lineno++;
+ j = 0;
+ }else{
+ j++;
+ }
+ }
+ fprintf(out, "};\n"); lineno++;
+
+ /* Output the yy_reduce_ofst[] table */
+ fprintf(out, "#define YY_REDUCE_USE_DFLT (%d)\n", mnNtOfst-1); lineno++;
+ n = lemp->nstate;
+ while( n>0 && lemp->sorted[n-1]->iNtOfst==NO_OFFSET ) n--;
+ fprintf(out, "#define YY_REDUCE_COUNT (%d)\n", n-1); lineno++;
+ fprintf(out, "#define YY_REDUCE_MIN (%d)\n", mnNtOfst); lineno++;
+ fprintf(out, "#define YY_REDUCE_MAX (%d)\n", mxNtOfst); lineno++;
+ fprintf(out, "static const %s yy_reduce_ofst[] = {\n",
+ minimum_size_type(mnNtOfst-1, mxNtOfst)); lineno++;
+ for(i=j=0; i<n; i++){
+ int ofst;
+ stp = lemp->sorted[i];
+ ofst = stp->iNtOfst;
+ if( ofst==NO_OFFSET ) ofst = mnNtOfst - 1;
+ if( j==0 ) fprintf(out," /* %5d */ ", i);
+ fprintf(out, " %4d,", ofst);
+ if( j==9 || i==n-1 ){
+ fprintf(out, "\n"); lineno++;
+ j = 0;
+ }else{
+ j++;
+ }
+ }
+ fprintf(out, "};\n"); lineno++;
+
+ /* Output the default action table */
+ fprintf(out, "static const YYACTIONTYPE yy_default[] = {\n"); lineno++;
+ n = lemp->nstate;
+ for(i=j=0; i<n; i++){
+ stp = lemp->sorted[i];
+ if( j==0 ) fprintf(out," /* %5d */ ", i);
+ fprintf(out, " %4d,", stp->iDflt);
+ if( j==9 || i==n-1 ){
+ fprintf(out, "\n"); lineno++;
+ j = 0;
+ }else{
+ j++;
+ }
+ }
+ fprintf(out, "};\n"); lineno++;
+ tplt_xfer(lemp->name,in,out,&lineno);
+
+ /* Generate the table of fallback tokens.
+ */
+ if( lemp->has_fallback ){
+ int mx = lemp->nterminal - 1;
+ while( mx>0 && lemp->symbols[mx]->fallback==0 ){ mx--; }
+ for(i=0; i<=mx; i++){
+ struct symbol *p = lemp->symbols[i];
+ if( p->fallback==0 ){
+ fprintf(out, " 0, /* %10s => nothing */\n", p->name);
+ }else{
+ fprintf(out, " %3d, /* %10s => %s */\n", p->fallback->index,
+ p->name, p->fallback->name);
+ }
+ lineno++;
+ }
+ }
+ tplt_xfer(lemp->name, in, out, &lineno);
+
+ /* Generate a table containing the symbolic name of every symbol
+ */
+ for(i=0; i<lemp->nsymbol; i++){
+ lemon_sprintf(line,"\"%s\",",lemp->symbols[i]->name);
+ fprintf(out," %-15s",line);
+ if( (i&3)==3 ){ fprintf(out,"\n"); lineno++; }
+ }
+ if( (i&3)!=0 ){ fprintf(out,"\n"); lineno++; }
+ tplt_xfer(lemp->name,in,out,&lineno);
+
+ /* Generate a table containing a text string that describes every
+ ** rule in the rule set of the grammar. This information is used
+ ** when tracing REDUCE actions.
+ */
+ for(i=0, rp=lemp->rule; rp; rp=rp->next, i++){
+ assert( rp->index==i );
+ fprintf(out," /* %3d */ \"", i);
+ writeRuleText(out, rp);
+ fprintf(out,"\",\n"); lineno++;
+ }
+ tplt_xfer(lemp->name,in,out,&lineno);
+
+ /* Generate code which executes every time a symbol is popped from
+ ** the stack while processing errors or while destroying the parser.
+ ** (In other words, generate the %destructor actions)
+ */
+ if( lemp->tokendest ){
+ int once = 1;
+ for(i=0; i<lemp->nsymbol; i++){
+ struct symbol *sp = lemp->symbols[i];
+ if( sp==0 || sp->type!=TERMINAL ) continue;
+ if( once ){
+ fprintf(out, " /* TERMINAL Destructor */\n"); lineno++;
+ once = 0;
+ }
+ fprintf(out," case %d: /* %s */\n", sp->index, sp->name); lineno++;
+ }
+ for(i=0; i<lemp->nsymbol && lemp->symbols[i]->type!=TERMINAL; i++);
+ if( i<lemp->nsymbol ){
+ emit_destructor_code(out,lemp->symbols[i],lemp,&lineno);
+ fprintf(out," break;\n"); lineno++;
+ }
+ }
+ if( lemp->vardest ){
+ struct symbol *dflt_sp = 0;
+ int once = 1;
+ for(i=0; i<lemp->nsymbol; i++){
+ struct symbol *sp = lemp->symbols[i];
+ if( sp==0 || sp->type==TERMINAL ||
+ sp->index<=0 || sp->destructor!=0 ) continue;
+ if( once ){
+ fprintf(out, " /* Default NON-TERMINAL Destructor */\n"); lineno++;
+ once = 0;
+ }
+ fprintf(out," case %d: /* %s */\n", sp->index, sp->name); lineno++;
+ dflt_sp = sp;
+ }
+ if( dflt_sp!=0 ){
+ emit_destructor_code(out,dflt_sp,lemp,&lineno);
+ }
+ fprintf(out," break;\n"); lineno++;
+ }
+ for(i=0; i<lemp->nsymbol; i++){
+ struct symbol *sp = lemp->symbols[i];
+ if( sp==0 || sp->type==TERMINAL || sp->destructor==0 ) continue;
+ fprintf(out," case %d: /* %s */\n", sp->index, sp->name); lineno++;
+
+ /* Combine duplicate destructors into a single case */
+ for(j=i+1; j<lemp->nsymbol; j++){
+ struct symbol *sp2 = lemp->symbols[j];
+ if( sp2 && sp2->type!=TERMINAL && sp2->destructor
+ && sp2->dtnum==sp->dtnum
+ && strcmp(sp->destructor,sp2->destructor)==0 ){
+ fprintf(out," case %d: /* %s */\n",
+ sp2->index, sp2->name); lineno++;
+ sp2->destructor = 0;
+ }
+ }
+
+ emit_destructor_code(out,lemp->symbols[i],lemp,&lineno);
+ fprintf(out," break;\n"); lineno++;
+ }
+ tplt_xfer(lemp->name,in,out,&lineno);
+
+ /* Generate code which executes whenever the parser stack overflows */
+ tplt_print(out,lemp,lemp->overflow,&lineno);
+ tplt_xfer(lemp->name,in,out,&lineno);
+
+ /* Generate the table of rule information
+ **
+ ** Note: This code depends on the fact that rules are number
+ ** sequentually beginning with 0.
+ */
+ for(rp=lemp->rule; rp; rp=rp->next){
+ fprintf(out," { %d, %d },\n",rp->lhs->index,rp->nrhs); lineno++;
+ }
+ tplt_xfer(lemp->name,in,out,&lineno);
+
+ /* Generate code which execution during each REDUCE action */
+ for(rp=lemp->rule; rp; rp=rp->next){
+ translate_code(lemp, rp);
+ }
+ /* First output rules other than the default: rule */
+ for(rp=lemp->rule; rp; rp=rp->next){
+ struct rule *rp2; /* Other rules with the same action */
+ if( rp->code==0 ) continue;
+ if( rp->code[0]=='\n' && rp->code[1]==0 ) continue; /* Will be default: */
+ fprintf(out," case %d: /* ", rp->index);
+ writeRuleText(out, rp);
+ fprintf(out, " */\n"); lineno++;
+ for(rp2=rp->next; rp2; rp2=rp2->next){
+ if( rp2->code==rp->code ){
+ fprintf(out," case %d: /* ", rp2->index);
+ writeRuleText(out, rp2);
+ fprintf(out," */ yytestcase(yyruleno==%d);\n", rp2->index); lineno++;
+ rp2->code = 0;
+ }
+ }
+ emit_code(out,rp,lemp,&lineno);
+ fprintf(out," break;\n"); lineno++;
+ rp->code = 0;
+ }
+ /* Finally, output the default: rule. We choose as the default: all
+ ** empty actions. */
+ fprintf(out," default:\n"); lineno++;
+ for(rp=lemp->rule; rp; rp=rp->next){
+ if( rp->code==0 ) continue;
+ assert( rp->code[0]=='\n' && rp->code[1]==0 );
+ fprintf(out," /* (%d) ", rp->index);
+ writeRuleText(out, rp);
+ fprintf(out, " */ yytestcase(yyruleno==%d);\n", rp->index); lineno++;
+ }
+ fprintf(out," break;\n"); lineno++;
+ tplt_xfer(lemp->name,in,out,&lineno);
+
+ /* Generate code which executes if a parse fails */
+ tplt_print(out,lemp,lemp->failure,&lineno);
+ tplt_xfer(lemp->name,in,out,&lineno);
+
+ /* Generate code which executes when a syntax error occurs */
+ tplt_print(out,lemp,lemp->error,&lineno);
+ tplt_xfer(lemp->name,in,out,&lineno);
+
+ /* Generate code which executes when the parser accepts its input */
+ tplt_print(out,lemp,lemp->accept,&lineno);
+ tplt_xfer(lemp->name,in,out,&lineno);
+
+ /* Append any addition code the user desires */
+ tplt_print(out,lemp,lemp->extracode,&lineno);
+
+ fclose(in);
+ fclose(out);
+ return;
+}
+
+/* Generate a header file for the parser */
+void ReportHeader(struct lemon *lemp)
+{
+ FILE *out, *in;
+ const char *prefix;
+ char line[LINESIZE];
+ char pattern[LINESIZE];
+ int i;
+
+ if( lemp->tokenprefix ) prefix = lemp->tokenprefix;
+ else prefix = "";
+ in = file_open(lemp,".h","rb");
+ if( in ){
+ int nextChar;
+ for(i=1; i<lemp->nterminal && fgets(line,LINESIZE,in); i++){
+ lemon_sprintf(pattern,"#define %s%-30s %3d\n",
+ prefix,lemp->symbols[i]->name,i);
+ if( strcmp(line,pattern) ) break;
+ }
+ nextChar = fgetc(in);
+ fclose(in);
+ if( i==lemp->nterminal && nextChar==EOF ){
+ /* No change in the file. Don't rewrite it. */
+ return;
+ }
+ }
+ out = file_open(lemp,".h","wb");
+ if( out ){
+ for(i=1; i<lemp->nterminal; i++){
+ fprintf(out,"#define %s%-30s %3d\n",prefix,lemp->symbols[i]->name,i);
+ }
+ fclose(out);
+ }
+ return;
+}
+
+/* Reduce the size of the action tables, if possible, by making use
+** of defaults.
+**
+** In this version, we take the most frequent REDUCE action and make
+** it the default. Except, there is no default if the wildcard token
+** is a possible look-ahead.
+*/
+void CompressTables(struct lemon *lemp)
+{
+ struct state *stp;
+ struct action *ap, *ap2;
+ struct rule *rp, *rp2, *rbest;
+ int nbest, n;
+ int i;
+ int usesWildcard;
+
+ for(i=0; i<lemp->nstate; i++){
+ stp = lemp->sorted[i];
+ nbest = 0;
+ rbest = 0;
+ usesWildcard = 0;
+
+ for(ap=stp->ap; ap; ap=ap->next){
+ if( ap->type==SHIFT && ap->sp==lemp->wildcard ){
+ usesWildcard = 1;
+ }
+ if( ap->type!=REDUCE ) continue;
+ rp = ap->x.rp;
+ if( rp->lhsStart ) continue;
+ if( rp==rbest ) continue;
+ n = 1;
+ for(ap2=ap->next; ap2; ap2=ap2->next){
+ if( ap2->type!=REDUCE ) continue;
+ rp2 = ap2->x.rp;
+ if( rp2==rbest ) continue;
+ if( rp2==rp ) n++;
+ }
+ if( n>nbest ){
+ nbest = n;
+ rbest = rp;
+ }
+ }
+
+ /* Do not make a default if the number of rules to default
+ ** is not at least 1 or if the wildcard token is a possible
+ ** lookahead.
+ */
+ if( nbest<1 || usesWildcard ) continue;
+
+
+ /* Combine matching REDUCE actions into a single default */
+ for(ap=stp->ap; ap; ap=ap->next){
+ if( ap->type==REDUCE && ap->x.rp==rbest ) break;
+ }
+ assert( ap );
+ ap->sp = Symbol_new("{default}");
+ for(ap=ap->next; ap; ap=ap->next){
+ if( ap->type==REDUCE && ap->x.rp==rbest ) ap->type = NOT_USED;
+ }
+ stp->ap = Action_sort(stp->ap);
+ }
+}
+
+
+/*
+** Compare two states for sorting purposes. The smaller state is the
+** one with the most non-terminal actions. If they have the same number
+** of non-terminal actions, then the smaller is the one with the most
+** token actions.
+*/
+static int stateResortCompare(const void *a, const void *b){
+ const struct state *pA = *(const struct state**)a;
+ const struct state *pB = *(const struct state**)b;
+ int n;
+
+ n = pB->nNtAct - pA->nNtAct;
+ if( n==0 ){
+ n = pB->nTknAct - pA->nTknAct;
+ if( n==0 ){
+ n = pB->statenum - pA->statenum;
+ }
+ }
+ assert( n!=0 );
+ return n;
+}
+
+
+/*
+** Renumber and resort states so that states with fewer choices
+** occur at the end. Except, keep state 0 as the first state.
+*/
+void ResortStates(struct lemon *lemp)
+{
+ int i;
+ struct state *stp;
+ struct action *ap;
+
+ for(i=0; i<lemp->nstate; i++){
+ stp = lemp->sorted[i];
+ stp->nTknAct = stp->nNtAct = 0;
+ stp->iDflt = lemp->nstate + lemp->nrule;
+ stp->iTknOfst = NO_OFFSET;
+ stp->iNtOfst = NO_OFFSET;
+ for(ap=stp->ap; ap; ap=ap->next){
+ if( compute_action(lemp,ap)>=0 ){
+ if( ap->sp->index<lemp->nterminal ){
+ stp->nTknAct++;
+ }else if( ap->sp->index<lemp->nsymbol ){
+ stp->nNtAct++;
+ }else{
+ stp->iDflt = compute_action(lemp, ap);
+ }
+ }
+ }
+ }
+ qsort(&lemp->sorted[1], lemp->nstate-1, sizeof(lemp->sorted[0]),
+ stateResortCompare);
+ for(i=0; i<lemp->nstate; i++){
+ lemp->sorted[i]->statenum = i;
+ }
+}
+
+
+/***************** From the file "set.c" ************************************/
+/*
+** Set manipulation routines for the LEMON parser generator.
+*/
+
+static int size = 0;
+
+/* Set the set size */
+void SetSize(int n)
+{
+ size = n+1;
+}
+
+/* Allocate a new set */
+char *SetNew(){
+ char *s;
+ s = (char*)calloc( size, 1);
+ if( s==0 ){
+ extern void memory_error();
+ memory_error();
+ }
+ return s;
+}
+
+/* Deallocate a set */
+void SetFree(char *s)
+{
+ free(s);
+}
+
+/* Add a new element to the set. Return TRUE if the element was added
+** and FALSE if it was already there. */
+int SetAdd(char *s, int e)
+{
+ int rv;
+ assert( e>=0 && e<size );
+ rv = s[e];
+ s[e] = 1;
+ return !rv;
+}
+
+/* Add every element of s2 to s1. Return TRUE if s1 changes. */
+int SetUnion(char *s1, char *s2)
+{
+ int i, progress;
+ progress = 0;
+ for(i=0; i<size; i++){
+ if( s2[i]==0 ) continue;
+ if( s1[i]==0 ){
+ progress = 1;
+ s1[i] = 1;
+ }
+ }
+ return progress;
+}
+/********************** From the file "table.c" ****************************/
+/*
+** All code in this file has been automatically generated
+** from a specification in the file
+** "table.q"
+** by the associative array code building program "aagen".
+** Do not edit this file! Instead, edit the specification
+** file, then rerun aagen.
+*/
+/*
+** Code for processing tables in the LEMON parser generator.
+*/
+
+PRIVATE unsigned strhash(const char *x)
+{
+ unsigned h = 0;
+ while( *x ) h = h*13 + *(x++);
+ return h;
+}
+
+/* Works like strdup, sort of. Save a string in malloced memory, but
+** keep strings in a table so that the same string is not in more
+** than one place.
+*/
+const char *Strsafe(const char *y)
+{
+ const char *z;
+ char *cpy;
+
+ if( y==0 ) return 0;
+ z = Strsafe_find(y);
+ if( z==0 && (cpy=(char *)malloc( lemonStrlen(y)+1 ))!=0 ){
+ lemon_strcpy(cpy,y);
+ z = cpy;
+ Strsafe_insert(z);
+ }
+ MemoryCheck(z);
+ return z;
+}
+
+/* There is one instance of the following structure for each
+** associative array of type "x1".
+*/
+struct s_x1 {
+ int size; /* The number of available slots. */
+ /* Must be a power of 2 greater than or */
+ /* equal to 1 */
+ int count; /* Number of currently slots filled */
+ struct s_x1node *tbl; /* The data stored here */
+ struct s_x1node **ht; /* Hash table for lookups */
+};
+
+/* There is one instance of this structure for every data element
+** in an associative array of type "x1".
+*/
+typedef struct s_x1node {
+ const char *data; /* The data */
+ struct s_x1node *next; /* Next entry with the same hash */
+ struct s_x1node **from; /* Previous link */
+} x1node;
+
+/* There is only one instance of the array, which is the following */
+static struct s_x1 *x1a;
+
+/* Allocate a new associative array */
+void Strsafe_init(){
+ if( x1a ) return;
+ x1a = (struct s_x1*)malloc( sizeof(struct s_x1) );
+ if( x1a ){
+ x1a->size = 1024;
+ x1a->count = 0;
+ x1a->tbl = (x1node*)calloc(1024, sizeof(x1node) + sizeof(x1node*));
+ if( x1a->tbl==0 ){
+ free(x1a);
+ x1a = 0;
+ }else{
+ int i;
+ x1a->ht = (x1node**)&(x1a->tbl[1024]);
+ for(i=0; i<1024; i++) x1a->ht[i] = 0;
+ }
+ }
+}
+/* Insert a new record into the array. Return TRUE if successful.
+** Prior data with the same key is NOT overwritten */
+int Strsafe_insert(const char *data)
+{
+ x1node *np;
+ unsigned h;
+ unsigned ph;
+
+ if( x1a==0 ) return 0;
+ ph = strhash(data);
+ h = ph & (x1a->size-1);
+ np = x1a->ht[h];
+ while( np ){
+ if( strcmp(np->data,data)==0 ){
+ /* An existing entry with the same key is found. */
+ /* Fail because overwrite is not allows. */
+ return 0;
+ }
+ np = np->next;
+ }
+ if( x1a->count>=x1a->size ){
+ /* Need to make the hash table bigger */
+ int i,size;
+ struct s_x1 array;
+ array.size = size = x1a->size*2;
+ array.count = x1a->count;
+ array.tbl = (x1node*)calloc(size, sizeof(x1node) + sizeof(x1node*));
+ if( array.tbl==0 ) return 0; /* Fail due to malloc failure */
+ array.ht = (x1node**)&(array.tbl[size]);
+ for(i=0; i<size; i++) array.ht[i] = 0;
+ for(i=0; i<x1a->count; i++){
+ x1node *oldnp, *newnp;
+ oldnp = &(x1a->tbl[i]);
+ h = strhash(oldnp->data) & (size-1);
+ newnp = &(array.tbl[i]);
+ if( array.ht[h] ) array.ht[h]->from = &(newnp->next);
+ newnp->next = array.ht[h];
+ newnp->data = oldnp->data;
+ newnp->from = &(array.ht[h]);
+ array.ht[h] = newnp;
+ }
+ free(x1a->tbl);
+ *x1a = array;
+ }
+ /* Insert the new data */
+ h = ph & (x1a->size-1);
+ np = &(x1a->tbl[x1a->count++]);
+ np->data = data;
+ if( x1a->ht[h] ) x1a->ht[h]->from = &(np->next);
+ np->next = x1a->ht[h];
+ x1a->ht[h] = np;
+ np->from = &(x1a->ht[h]);
+ return 1;
+}
+
+/* Return a pointer to data assigned to the given key. Return NULL
+** if no such key. */
+const char *Strsafe_find(const char *key)
+{
+ unsigned h;
+ x1node *np;
+
+ if( x1a==0 ) return 0;
+ h = strhash(key) & (x1a->size-1);
+ np = x1a->ht[h];
+ while( np ){
+ if( strcmp(np->data,key)==0 ) break;
+ np = np->next;
+ }
+ return np ? np->data : 0;
+}
+
+/* Return a pointer to the (terminal or nonterminal) symbol "x".
+** Create a new symbol if this is the first time "x" has been seen.
+*/
+struct symbol *Symbol_new(const char *x)
+{
+ struct symbol *sp;
+
+ sp = Symbol_find(x);
+ if( sp==0 ){
+ sp = (struct symbol *)calloc(1, sizeof(struct symbol) );
+ MemoryCheck(sp);
+ sp->name = Strsafe(x);
+ sp->type = isupper(*x) ? TERMINAL : NONTERMINAL;
+ sp->rule = 0;
+ sp->fallback = 0;
+ sp->prec = -1;
+ sp->assoc = UNK;
+ sp->firstset = 0;
+ sp->lambda = LEMON_FALSE;
+ sp->destructor = 0;
+ sp->destLineno = 0;
+ sp->datatype = 0;
+ sp->useCnt = 0;
+ Symbol_insert(sp,sp->name);
+ }
+ sp->useCnt++;
+ return sp;
+}
+
+/* Compare two symbols for sorting purposes. Return negative,
+** zero, or positive if a is less then, equal to, or greater
+** than b.
+**
+** Symbols that begin with upper case letters (terminals or tokens)
+** must sort before symbols that begin with lower case letters
+** (non-terminals). And MULTITERMINAL symbols (created using the
+** %token_class directive) must sort at the very end. Other than
+** that, the order does not matter.
+**
+** We find experimentally that leaving the symbols in their original
+** order (the order they appeared in the grammar file) gives the
+** smallest parser tables in SQLite.
+*/
+int Symbolcmpp(const void *_a, const void *_b)
+{
+ const struct symbol *a = *(const struct symbol **) _a;
+ const struct symbol *b = *(const struct symbol **) _b;
+ int i1 = a->type==MULTITERMINAL ? 3 : a->name[0]>'Z' ? 2 : 1;
+ int i2 = b->type==MULTITERMINAL ? 3 : b->name[0]>'Z' ? 2 : 1;
+ return i1==i2 ? a->index - b->index : i1 - i2;
+}
+
+/* There is one instance of the following structure for each
+** associative array of type "x2".
+*/
+struct s_x2 {
+ int size; /* The number of available slots. */
+ /* Must be a power of 2 greater than or */
+ /* equal to 1 */
+ int count; /* Number of currently slots filled */
+ struct s_x2node *tbl; /* The data stored here */
+ struct s_x2node **ht; /* Hash table for lookups */
+};
+
+/* There is one instance of this structure for every data element
+** in an associative array of type "x2".
+*/
+typedef struct s_x2node {
+ struct symbol *data; /* The data */
+ const char *key; /* The key */
+ struct s_x2node *next; /* Next entry with the same hash */
+ struct s_x2node **from; /* Previous link */
+} x2node;
+
+/* There is only one instance of the array, which is the following */
+static struct s_x2 *x2a;
+
+/* Allocate a new associative array */
+void Symbol_init(){
+ if( x2a ) return;
+ x2a = (struct s_x2*)malloc( sizeof(struct s_x2) );
+ if( x2a ){
+ x2a->size = 128;
+ x2a->count = 0;
+ x2a->tbl = (x2node*)calloc(128, sizeof(x2node) + sizeof(x2node*));
+ if( x2a->tbl==0 ){
+ free(x2a);
+ x2a = 0;
+ }else{
+ int i;
+ x2a->ht = (x2node**)&(x2a->tbl[128]);
+ for(i=0; i<128; i++) x2a->ht[i] = 0;
+ }
+ }
+}
+/* Insert a new record into the array. Return TRUE if successful.
+** Prior data with the same key is NOT overwritten */
+int Symbol_insert(struct symbol *data, const char *key)
+{
+ x2node *np;
+ unsigned h;
+ unsigned ph;
+
+ if( x2a==0 ) return 0;
+ ph = strhash(key);
+ h = ph & (x2a->size-1);
+ np = x2a->ht[h];
+ while( np ){
+ if( strcmp(np->key,key)==0 ){
+ /* An existing entry with the same key is found. */
+ /* Fail because overwrite is not allows. */
+ return 0;
+ }
+ np = np->next;
+ }
+ if( x2a->count>=x2a->size ){
+ /* Need to make the hash table bigger */
+ int i,size;
+ struct s_x2 array;
+ array.size = size = x2a->size*2;
+ array.count = x2a->count;
+ array.tbl = (x2node*)calloc(size, sizeof(x2node) + sizeof(x2node*));
+ if( array.tbl==0 ) return 0; /* Fail due to malloc failure */
+ array.ht = (x2node**)&(array.tbl[size]);
+ for(i=0; i<size; i++) array.ht[i] = 0;
+ for(i=0; i<x2a->count; i++){
+ x2node *oldnp, *newnp;
+ oldnp = &(x2a->tbl[i]);
+ h = strhash(oldnp->key) & (size-1);
+ newnp = &(array.tbl[i]);
+ if( array.ht[h] ) array.ht[h]->from = &(newnp->next);
+ newnp->next = array.ht[h];
+ newnp->key = oldnp->key;
+ newnp->data = oldnp->data;
+ newnp->from = &(array.ht[h]);
+ array.ht[h] = newnp;
+ }
+ free(x2a->tbl);
+ *x2a = array;
+ }
+ /* Insert the new data */
+ h = ph & (x2a->size-1);
+ np = &(x2a->tbl[x2a->count++]);
+ np->key = key;
+ np->data = data;
+ if( x2a->ht[h] ) x2a->ht[h]->from = &(np->next);
+ np->next = x2a->ht[h];
+ x2a->ht[h] = np;
+ np->from = &(x2a->ht[h]);
+ return 1;
+}
+
+/* Return a pointer to data assigned to the given key. Return NULL
+** if no such key. */
+struct symbol *Symbol_find(const char *key)
+{
+ unsigned h;
+ x2node *np;
+
+ if( x2a==0 ) return 0;
+ h = strhash(key) & (x2a->size-1);
+ np = x2a->ht[h];
+ while( np ){
+ if( strcmp(np->key,key)==0 ) break;
+ np = np->next;
+ }
+ return np ? np->data : 0;
+}
+
+/* Return the n-th data. Return NULL if n is out of range. */
+struct symbol *Symbol_Nth(int n)
+{
+ struct symbol *data;
+ if( x2a && n>0 && n<=x2a->count ){
+ data = x2a->tbl[n-1].data;
+ }else{
+ data = 0;
+ }
+ return data;
+}
+
+/* Return the size of the array */
+int Symbol_count()
+{
+ return x2a ? x2a->count : 0;
+}
+
+/* Return an array of pointers to all data in the table.
+** The array is obtained from malloc. Return NULL if memory allocation
+** problems, or if the array is empty. */
+struct symbol **Symbol_arrayof()
+{
+ struct symbol **array;
+ int i,size;
+ if( x2a==0 ) return 0;
+ size = x2a->count;
+ array = (struct symbol **)calloc(size, sizeof(struct symbol *));
+ if( array ){
+ for(i=0; i<size; i++) array[i] = x2a->tbl[i].data;
+ }
+ return array;
+}
+
+/* Compare two configurations */
+int Configcmp(const char *_a,const char *_b)
+{
+ const struct config *a = (struct config *) _a;
+ const struct config *b = (struct config *) _b;
+ int x;
+ x = a->rp->index - b->rp->index;
+ if( x==0 ) x = a->dot - b->dot;
+ return x;
+}
+
+/* Compare two states */
+PRIVATE int statecmp(struct config *a, struct config *b)
+{
+ int rc;
+ for(rc=0; rc==0 && a && b; a=a->bp, b=b->bp){
+ rc = a->rp->index - b->rp->index;
+ if( rc==0 ) rc = a->dot - b->dot;
+ }
+ if( rc==0 ){
+ if( a ) rc = 1;
+ if( b ) rc = -1;
+ }
+ return rc;
+}
+
+/* Hash a state */
+PRIVATE unsigned statehash(struct config *a)
+{
+ unsigned h=0;
+ while( a ){
+ h = h*571 + a->rp->index*37 + a->dot;
+ a = a->bp;
+ }
+ return h;
+}
+
+/* Allocate a new state structure */
+struct state *State_new()
+{
+ struct state *newstate;
+ newstate = (struct state *)calloc(1, sizeof(struct state) );
+ MemoryCheck(newstate);
+ return newstate;
+}
+
+/* There is one instance of the following structure for each
+** associative array of type "x3".
+*/
+struct s_x3 {
+ int size; /* The number of available slots. */
+ /* Must be a power of 2 greater than or */
+ /* equal to 1 */
+ int count; /* Number of currently slots filled */
+ struct s_x3node *tbl; /* The data stored here */
+ struct s_x3node **ht; /* Hash table for lookups */
+};
+
+/* There is one instance of this structure for every data element
+** in an associative array of type "x3".
+*/
+typedef struct s_x3node {
+ struct state *data; /* The data */
+ struct config *key; /* The key */
+ struct s_x3node *next; /* Next entry with the same hash */
+ struct s_x3node **from; /* Previous link */
+} x3node;
+
+/* There is only one instance of the array, which is the following */
+static struct s_x3 *x3a;
+
+/* Allocate a new associative array */
+void State_init(){
+ if( x3a ) return;
+ x3a = (struct s_x3*)malloc( sizeof(struct s_x3) );
+ if( x3a ){
+ x3a->size = 128;
+ x3a->count = 0;
+ x3a->tbl = (x3node*)calloc(128, sizeof(x3node) + sizeof(x3node*));
+ if( x3a->tbl==0 ){
+ free(x3a);
+ x3a = 0;
+ }else{
+ int i;
+ x3a->ht = (x3node**)&(x3a->tbl[128]);
+ for(i=0; i<128; i++) x3a->ht[i] = 0;
+ }
+ }
+}
+/* Insert a new record into the array. Return TRUE if successful.
+** Prior data with the same key is NOT overwritten */
+int State_insert(struct state *data, struct config *key)
+{
+ x3node *np;
+ unsigned h;
+ unsigned ph;
+
+ if( x3a==0 ) return 0;
+ ph = statehash(key);
+ h = ph & (x3a->size-1);
+ np = x3a->ht[h];
+ while( np ){
+ if( statecmp(np->key,key)==0 ){
+ /* An existing entry with the same key is found. */
+ /* Fail because overwrite is not allows. */
+ return 0;
+ }
+ np = np->next;
+ }
+ if( x3a->count>=x3a->size ){
+ /* Need to make the hash table bigger */
+ int i,size;
+ struct s_x3 array;
+ array.size = size = x3a->size*2;
+ array.count = x3a->count;
+ array.tbl = (x3node*)calloc(size, sizeof(x3node) + sizeof(x3node*));
+ if( array.tbl==0 ) return 0; /* Fail due to malloc failure */
+ array.ht = (x3node**)&(array.tbl[size]);
+ for(i=0; i<size; i++) array.ht[i] = 0;
+ for(i=0; i<x3a->count; i++){
+ x3node *oldnp, *newnp;
+ oldnp = &(x3a->tbl[i]);
+ h = statehash(oldnp->key) & (size-1);
+ newnp = &(array.tbl[i]);
+ if( array.ht[h] ) array.ht[h]->from = &(newnp->next);
+ newnp->next = array.ht[h];
+ newnp->key = oldnp->key;
+ newnp->data = oldnp->data;
+ newnp->from = &(array.ht[h]);
+ array.ht[h] = newnp;
+ }
+ free(x3a->tbl);
+ *x3a = array;
+ }
+ /* Insert the new data */
+ h = ph & (x3a->size-1);
+ np = &(x3a->tbl[x3a->count++]);
+ np->key = key;
+ np->data = data;
+ if( x3a->ht[h] ) x3a->ht[h]->from = &(np->next);
+ np->next = x3a->ht[h];
+ x3a->ht[h] = np;
+ np->from = &(x3a->ht[h]);
+ return 1;
+}
+
+/* Return a pointer to data assigned to the given key. Return NULL
+** if no such key. */
+struct state *State_find(struct config *key)
+{
+ unsigned h;
+ x3node *np;
+
+ if( x3a==0 ) return 0;
+ h = statehash(key) & (x3a->size-1);
+ np = x3a->ht[h];
+ while( np ){
+ if( statecmp(np->key,key)==0 ) break;
+ np = np->next;
+ }
+ return np ? np->data : 0;
+}
+
+/* Return an array of pointers to all data in the table.
+** The array is obtained from malloc. Return NULL if memory allocation
+** problems, or if the array is empty. */
+struct state **State_arrayof()
+{
+ struct state **array;
+ int i,size;
+ if( x3a==0 ) return 0;
+ size = x3a->count;
+ array = (struct state **)calloc(size, sizeof(struct state *));
+ if( array ){
+ for(i=0; i<size; i++) array[i] = x3a->tbl[i].data;
+ }
+ return array;
+}
+
+/* Hash a configuration */
+PRIVATE unsigned confighash(struct config *a)
+{
+ unsigned h=0;
+ h = h*571 + a->rp->index*37 + a->dot;
+ return h;
+}
+
+/* There is one instance of the following structure for each
+** associative array of type "x4".
+*/
+struct s_x4 {
+ int size; /* The number of available slots. */
+ /* Must be a power of 2 greater than or */
+ /* equal to 1 */
+ int count; /* Number of currently slots filled */
+ struct s_x4node *tbl; /* The data stored here */
+ struct s_x4node **ht; /* Hash table for lookups */
+};
+
+/* There is one instance of this structure for every data element
+** in an associative array of type "x4".
+*/
+typedef struct s_x4node {
+ struct config *data; /* The data */
+ struct s_x4node *next; /* Next entry with the same hash */
+ struct s_x4node **from; /* Previous link */
+} x4node;
+
+/* There is only one instance of the array, which is the following */
+static struct s_x4 *x4a;
+
+/* Allocate a new associative array */
+void Configtable_init(){
+ if( x4a ) return;
+ x4a = (struct s_x4*)malloc( sizeof(struct s_x4) );
+ if( x4a ){
+ x4a->size = 64;
+ x4a->count = 0;
+ x4a->tbl = (x4node*)calloc(64, sizeof(x4node) + sizeof(x4node*));
+ if( x4a->tbl==0 ){
+ free(x4a);
+ x4a = 0;
+ }else{
+ int i;
+ x4a->ht = (x4node**)&(x4a->tbl[64]);
+ for(i=0; i<64; i++) x4a->ht[i] = 0;
+ }
+ }
+}
+/* Insert a new record into the array. Return TRUE if successful.
+** Prior data with the same key is NOT overwritten */
+int Configtable_insert(struct config *data)
+{
+ x4node *np;
+ unsigned h;
+ unsigned ph;
+
+ if( x4a==0 ) return 0;
+ ph = confighash(data);
+ h = ph & (x4a->size-1);
+ np = x4a->ht[h];
+ while( np ){
+ if( Configcmp((const char *) np->data,(const char *) data)==0 ){
+ /* An existing entry with the same key is found. */
+ /* Fail because overwrite is not allows. */
+ return 0;
+ }
+ np = np->next;
+ }
+ if( x4a->count>=x4a->size ){
+ /* Need to make the hash table bigger */
+ int i,size;
+ struct s_x4 array;
+ array.size = size = x4a->size*2;
+ array.count = x4a->count;
+ array.tbl = (x4node*)calloc(size, sizeof(x4node) + sizeof(x4node*));
+ if( array.tbl==0 ) return 0; /* Fail due to malloc failure */
+ array.ht = (x4node**)&(array.tbl[size]);
+ for(i=0; i<size; i++) array.ht[i] = 0;
+ for(i=0; i<x4a->count; i++){
+ x4node *oldnp, *newnp;
+ oldnp = &(x4a->tbl[i]);
+ h = confighash(oldnp->data) & (size-1);
+ newnp = &(array.tbl[i]);
+ if( array.ht[h] ) array.ht[h]->from = &(newnp->next);
+ newnp->next = array.ht[h];
+ newnp->data = oldnp->data;
+ newnp->from = &(array.ht[h]);
+ array.ht[h] = newnp;
+ }
+ free(x4a->tbl);
+ *x4a = array;
+ }
+ /* Insert the new data */
+ h = ph & (x4a->size-1);
+ np = &(x4a->tbl[x4a->count++]);
+ np->data = data;
+ if( x4a->ht[h] ) x4a->ht[h]->from = &(np->next);
+ np->next = x4a->ht[h];
+ x4a->ht[h] = np;
+ np->from = &(x4a->ht[h]);
+ return 1;
+}
+
+/* Return a pointer to data assigned to the given key. Return NULL
+** if no such key. */
+struct config *Configtable_find(struct config *key)
+{
+ int h;
+ x4node *np;
+
+ if( x4a==0 ) return 0;
+ h = confighash(key) & (x4a->size-1);
+ np = x4a->ht[h];
+ while( np ){
+ if( Configcmp((const char *) np->data,(const char *) key)==0 ) break;
+ np = np->next;
+ }
+ return np ? np->data : 0;
+}
+
+/* Remove all data from the table. Pass each data to the function "f"
+** as it is removed. ("f" may be null to avoid this step.) */
+void Configtable_clear(int(*f)(struct config *))
+{
+ int i;
+ if( x4a==0 || x4a->count==0 ) return;
+ if( f ) for(i=0; i<x4a->count; i++) (*f)(x4a->tbl[i].data);
+ for(i=0; i<x4a->size; i++) x4a->ht[i] = 0;
+ x4a->count = 0;
+ return;
+}
--- /dev/null
+/* Driver template for the LEMON parser generator.
+** The author disclaims copyright to this source code.
+*/
+/* First off, code is included that follows the "include" declaration
+** in the input grammar file. */
+#include <stdio.h>
+%%
+/* Next is all token values, in a form suitable for use by makeheaders.
+** This section will be null unless lemon is run with the -m switch.
+*/
+/*
+** These constants (all generated automatically by the parser generator)
+** specify the various kinds of tokens (terminals) that the parser
+** understands.
+**
+** Each symbol here is a terminal symbol in the grammar.
+*/
+%%
+/* Make sure the INTERFACE macro is defined.
+*/
+#ifndef INTERFACE
+# define INTERFACE 1
+#endif
+/* The next thing included is series of defines which control
+** various aspects of the generated parser.
+** YYCODETYPE is the data type used for storing terminal
+** and nonterminal numbers. "unsigned char" is
+** used if there are fewer than 250 terminals
+** and nonterminals. "int" is used otherwise.
+** YYNOCODE is a number of type YYCODETYPE which corresponds
+** to no legal terminal or nonterminal number. This
+** number is used to fill in empty slots of the hash
+** table.
+** YYFALLBACK If defined, this indicates that one or more tokens
+** have fall-back values which should be used if the
+** original value of the token will not parse.
+** YYACTIONTYPE is the data type used for storing terminal
+** and nonterminal numbers. "unsigned char" is
+** used if there are fewer than 250 rules and
+** states combined. "int" is used otherwise.
+** ParseTOKENTYPE is the data type used for minor tokens given
+** directly to the parser from the tokenizer.
+** YYMINORTYPE is the data type used for all minor tokens.
+** This is typically a union of many types, one of
+** which is ParseTOKENTYPE. The entry in the union
+** for base tokens is called "yy0".
+** YYSTACKDEPTH is the maximum depth of the parser's stack. If
+** zero the stack is dynamically sized using realloc()
+** ParseARG_SDECL A static variable declaration for the %extra_argument
+** ParseARG_PDECL A parameter declaration for the %extra_argument
+** ParseARG_STORE Code to store %extra_argument into yypParser
+** ParseARG_FETCH Code to extract %extra_argument from yypParser
+** YYNSTATE the combined number of states.
+** YYNRULE the number of rules in the grammar
+** YYERRORSYMBOL is the code number of the error symbol. If not
+** defined, then do no error processing.
+*/
+%%
+#define YY_NO_ACTION (YYNSTATE+YYNRULE+2)
+#define YY_ACCEPT_ACTION (YYNSTATE+YYNRULE+1)
+#define YY_ERROR_ACTION (YYNSTATE+YYNRULE)
+
+/* The yyzerominor constant is used to initialize instances of
+** YYMINORTYPE objects to zero. */
+static const YYMINORTYPE yyzerominor = { 0 };
+
+/* Define the yytestcase() macro to be a no-op if is not already defined
+** otherwise.
+**
+** Applications can choose to define yytestcase() in the %include section
+** to a macro that can assist in verifying code coverage. For production
+** code the yytestcase() macro should be turned off. But it is useful
+** for testing.
+*/
+#ifndef yytestcase
+# define yytestcase(X)
+#endif
+
+
+/* Next are the tables used to determine what action to take based on the
+** current state and lookahead token. These tables are used to implement
+** functions that take a state number and lookahead value and return an
+** action integer.
+**
+** Suppose the action integer is N. Then the action is determined as
+** follows
+**
+** 0 <= N < YYNSTATE Shift N. That is, push the lookahead
+** token onto the stack and goto state N.
+**
+** YYNSTATE <= N < YYNSTATE+YYNRULE Reduce by rule N-YYNSTATE.
+**
+** N == YYNSTATE+YYNRULE A syntax error has occurred.
+**
+** N == YYNSTATE+YYNRULE+1 The parser accepts its input.
+**
+** N == YYNSTATE+YYNRULE+2 No such action. Denotes unused
+** slots in the yy_action[] table.
+**
+** The action table is constructed as a single large table named yy_action[].
+** Given state S and lookahead X, the action is computed as
+**
+** yy_action[ yy_shift_ofst[S] + X ]
+**
+** If the index value yy_shift_ofst[S]+X is out of range or if the value
+** yy_lookahead[yy_shift_ofst[S]+X] is not equal to X or if yy_shift_ofst[S]
+** is equal to YY_SHIFT_USE_DFLT, it means that the action is not in the table
+** and that yy_default[S] should be used instead.
+**
+** The formula above is for computing the action when the lookahead is
+** a terminal symbol. If the lookahead is a non-terminal (as occurs after
+** a reduce action) then the yy_reduce_ofst[] array is used in place of
+** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of
+** YY_SHIFT_USE_DFLT.
+**
+** The following are the tables generated in this section:
+**
+** yy_action[] A single table containing all actions.
+** yy_lookahead[] A table containing the lookahead for each entry in
+** yy_action. Used to detect hash collisions.
+** yy_shift_ofst[] For each state, the offset into yy_action for
+** shifting terminals.
+** yy_reduce_ofst[] For each state, the offset into yy_action for
+** shifting non-terminals after a reduce.
+** yy_default[] Default action for each state.
+*/
+%%
+
+/* The next table maps tokens into fallback tokens. If a construct
+** like the following:
+**
+** %fallback ID X Y Z.
+**
+** appears in the grammar, then ID becomes a fallback token for X, Y,
+** and Z. Whenever one of the tokens X, Y, or Z is input to the parser
+** but it does not parse, the type of the token is changed to ID and
+** the parse is retried before an error is thrown.
+*/
+#ifdef YYFALLBACK
+static const YYCODETYPE yyFallback[] = {
+%%
+};
+#endif /* YYFALLBACK */
+
+/* The following structure represents a single element of the
+** parser's stack. Information stored includes:
+**
+** + The state number for the parser at this level of the stack.
+**
+** + The value of the token stored at this level of the stack.
+** (In other words, the "major" token.)
+**
+** + The semantic value stored at this level of the stack. This is
+** the information used by the action routines in the grammar.
+** It is sometimes called the "minor" token.
+*/
+struct yyStackEntry {
+ YYACTIONTYPE stateno; /* The state-number */
+ YYCODETYPE major; /* The major token value. This is the code
+ ** number for the token at this stack level */
+ YYMINORTYPE minor; /* The user-supplied minor token value. This
+ ** is the value of the token */
+};
+typedef struct yyStackEntry yyStackEntry;
+
+/* The state of the parser is completely contained in an instance of
+** the following structure */
+struct yyParser {
+ int yyidx; /* Index of top element in stack */
+#ifdef YYTRACKMAXSTACKDEPTH
+ int yyidxMax; /* Maximum value of yyidx */
+#endif
+ int yyerrcnt; /* Shifts left before out of the error */
+ ParseARG_SDECL /* A place to hold %extra_argument */
+#if YYSTACKDEPTH<=0
+ int yystksz; /* Current side of the stack */
+ yyStackEntry *yystack; /* The parser's stack */
+#else
+ yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */
+#endif
+};
+typedef struct yyParser yyParser;
+
+#ifndef NDEBUG
+#include <stdio.h>
+static FILE *yyTraceFILE = 0;
+static char *yyTracePrompt = 0;
+#endif /* NDEBUG */
+
+#ifndef NDEBUG
+/*
+** Turn parser tracing on by giving a stream to which to write the trace
+** and a prompt to preface each trace message. Tracing is turned off
+** by making either argument NULL
+**
+** Inputs:
+** <ul>
+** <li> A FILE* to which trace output should be written.
+** If NULL, then tracing is turned off.
+** <li> A prefix string written at the beginning of every
+** line of trace output. If NULL, then tracing is
+** turned off.
+** </ul>
+**
+** Outputs:
+** None.
+*/
+void ParseTrace(FILE *TraceFILE, char *zTracePrompt);
+void ParseTrace(FILE *TraceFILE, char *zTracePrompt){
+ yyTraceFILE = TraceFILE;
+ yyTracePrompt = zTracePrompt;
+ if( yyTraceFILE==0 ) yyTracePrompt = 0;
+ else if( yyTracePrompt==0 ) yyTraceFILE = 0;
+}
+#endif /* NDEBUG */
+
+#ifndef NDEBUG
+/* For tracing shifts, the names of all terminals and nonterminals
+** are required. The following table supplies these names */
+static const char *const yyTokenName[] = {
+%%
+};
+#endif /* NDEBUG */
+
+#ifndef NDEBUG
+/* For tracing reduce actions, the names of all rules are required.
+*/
+static const char *const yyRuleName[] = {
+%%
+};
+#endif /* NDEBUG */
+
+
+#if YYSTACKDEPTH<=0
+/*
+** Try to increase the size of the parser stack.
+*/
+static void yyGrowStack(yyParser *p){
+ int newSize;
+ yyStackEntry *pNew;
+
+ newSize = p->yystksz*2 + 100;
+ pNew = realloc(p->yystack, newSize*sizeof(pNew[0]));
+ if( pNew ){
+ p->yystack = pNew;
+ p->yystksz = newSize;
+#ifndef NDEBUG
+ if( yyTraceFILE ){
+ fprintf(yyTraceFILE,"%sStack grows to %d entries!\n",
+ yyTracePrompt, p->yystksz);
+ }
+#endif
+ }
+}
+#endif
+
+/*
+** This function allocates a new parser.
+** The only argument is a pointer to a function which works like
+** malloc.
+**
+** Inputs:
+** A pointer to the function used to allocate memory.
+**
+** Outputs:
+** A pointer to a parser. This pointer is used in subsequent calls
+** to Parse and ParseFree.
+*/
+void *ParseAlloc(void *(*mallocProc)(size_t)){
+ yyParser *pParser;
+ pParser = (yyParser*)(*mallocProc)( (size_t)sizeof(yyParser) );
+ if( pParser ){
+ pParser->yyidx = -1;
+#ifdef YYTRACKMAXSTACKDEPTH
+ pParser->yyidxMax = 0;
+#endif
+#if YYSTACKDEPTH<=0
+ pParser->yystack = NULL;
+ pParser->yystksz = 0;
+ yyGrowStack(pParser);
+#endif
+ }
+ return pParser;
+}
+
+/* The following function deletes the value associated with a
+** symbol. The symbol can be either a terminal or nonterminal.
+** "yymajor" is the symbol code, and "yypminor" is a pointer to
+** the value.
+*/
+static void yy_destructor(
+ yyParser *yypParser, /* The parser */
+ YYCODETYPE yymajor, /* Type code for object to destroy */
+ YYMINORTYPE *yypminor /* The object to be destroyed */
+){
+ ParseARG_FETCH;
+ switch( yymajor ){
+ /* Here is inserted the actions which take place when a
+ ** terminal or non-terminal is destroyed. This can happen
+ ** when the symbol is popped from the stack during a
+ ** reduce or during error processing or when a parser is
+ ** being destroyed before it is finished parsing.
+ **
+ ** Note: during a reduce, the only symbols destroyed are those
+ ** which appear on the RHS of the rule, but which are not used
+ ** inside the C code.
+ */
+%%
+ default: break; /* If no destructor action specified: do nothing */
+ }
+}
+
+/*
+** Pop the parser's stack once.
+**
+** If there is a destructor routine associated with the token which
+** is popped from the stack, then call it.
+**
+** Return the major token number for the symbol popped.
+*/
+static int yy_pop_parser_stack(yyParser *pParser){
+ YYCODETYPE yymajor;
+ yyStackEntry *yytos = &pParser->yystack[pParser->yyidx];
+
+ if( pParser->yyidx<0 ) return 0;
+#ifndef NDEBUG
+ if( yyTraceFILE && pParser->yyidx>=0 ){
+ fprintf(yyTraceFILE,"%sPopping %s\n",
+ yyTracePrompt,
+ yyTokenName[yytos->major]);
+ }
+#endif
+ yymajor = yytos->major;
+ yy_destructor(pParser, yymajor, &yytos->minor);
+ pParser->yyidx--;
+ return yymajor;
+}
+
+/*
+** Deallocate and destroy a parser. Destructors are all called for
+** all stack elements before shutting the parser down.
+**
+** Inputs:
+** <ul>
+** <li> A pointer to the parser. This should be a pointer
+** obtained from ParseAlloc.
+** <li> A pointer to a function used to reclaim memory obtained
+** from malloc.
+** </ul>
+*/
+void ParseFree(
+ void *p, /* The parser to be deleted */
+ void (*freeProc)(void*) /* Function used to reclaim memory */
+){
+ yyParser *pParser = (yyParser*)p;
+ if( pParser==0 ) return;
+ while( pParser->yyidx>=0 ) yy_pop_parser_stack(pParser);
+#if YYSTACKDEPTH<=0
+ free(pParser->yystack);
+#endif
+ (*freeProc)((void*)pParser);
+}
+
+/*
+** Return the peak depth of the stack for a parser.
+*/
+#ifdef YYTRACKMAXSTACKDEPTH
+int ParseStackPeak(void *p){
+ yyParser *pParser = (yyParser*)p;
+ return pParser->yyidxMax;
+}
+#endif
+
+/*
+** Find the appropriate action for a parser given the terminal
+** look-ahead token iLookAhead.
+**
+** If the look-ahead token is YYNOCODE, then check to see if the action is
+** independent of the look-ahead. If it is, return the action, otherwise
+** return YY_NO_ACTION.
+*/
+static int yy_find_shift_action(
+ yyParser *pParser, /* The parser */
+ YYCODETYPE iLookAhead /* The look-ahead token */
+){
+ int i;
+ int stateno = pParser->yystack[pParser->yyidx].stateno;
+
+ if( stateno>YY_SHIFT_COUNT
+ || (i = yy_shift_ofst[stateno])==YY_SHIFT_USE_DFLT ){
+ return yy_default[stateno];
+ }
+ assert( iLookAhead!=YYNOCODE );
+ i += iLookAhead;
+ if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){
+ if( iLookAhead>0 ){
+#ifdef YYFALLBACK
+ YYCODETYPE iFallback; /* Fallback token */
+ if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0])
+ && (iFallback = yyFallback[iLookAhead])!=0 ){
+#ifndef NDEBUG
+ if( yyTraceFILE ){
+ fprintf(yyTraceFILE, "%sFALLBACK %s => %s\n",
+ yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]);
+ }
+#endif
+ return yy_find_shift_action(pParser, iFallback);
+ }
+#endif
+#ifdef YYWILDCARD
+ {
+ int j = i - iLookAhead + YYWILDCARD;
+ if(
+#if YY_SHIFT_MIN+YYWILDCARD<0
+ j>=0 &&
+#endif
+#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT
+ j<YY_ACTTAB_COUNT &&
+#endif
+ yy_lookahead[j]==YYWILDCARD
+ ){
+#ifndef NDEBUG
+ if( yyTraceFILE ){
+ fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n",
+ yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[YYWILDCARD]);
+ }
+#endif /* NDEBUG */
+ return yy_action[j];
+ }
+ }
+#endif /* YYWILDCARD */
+ }
+ return yy_default[stateno];
+ }else{
+ return yy_action[i];
+ }
+}
+
+/*
+** Find the appropriate action for a parser given the non-terminal
+** look-ahead token iLookAhead.
+**
+** If the look-ahead token is YYNOCODE, then check to see if the action is
+** independent of the look-ahead. If it is, return the action, otherwise
+** return YY_NO_ACTION.
+*/
+static int yy_find_reduce_action(
+ int stateno, /* Current state number */
+ YYCODETYPE iLookAhead /* The look-ahead token */
+){
+ int i;
+#ifdef YYERRORSYMBOL
+ if( stateno>YY_REDUCE_COUNT ){
+ return yy_default[stateno];
+ }
+#else
+ assert( stateno<=YY_REDUCE_COUNT );
+#endif
+ i = yy_reduce_ofst[stateno];
+ assert( i!=YY_REDUCE_USE_DFLT );
+ assert( iLookAhead!=YYNOCODE );
+ i += iLookAhead;
+#ifdef YYERRORSYMBOL
+ if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){
+ return yy_default[stateno];
+ }
+#else
+ assert( i>=0 && i<YY_ACTTAB_COUNT );
+ assert( yy_lookahead[i]==iLookAhead );
+#endif
+ return yy_action[i];
+}
+
+/*
+** The following routine is called if the stack overflows.
+*/
+static void yyStackOverflow(yyParser *yypParser, YYMINORTYPE *yypMinor){
+ ParseARG_FETCH;
+ yypParser->yyidx--;
+#ifndef NDEBUG
+ if( yyTraceFILE ){
+ fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt);
+ }
+#endif
+ while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);
+ /* Here code is inserted which will execute if the parser
+ ** stack every overflows */
+%%
+ ParseARG_STORE; /* Suppress warning about unused %extra_argument var */
+}
+
+/*
+** Perform a shift action.
+*/
+static void yy_shift(
+ yyParser *yypParser, /* The parser to be shifted */
+ int yyNewState, /* The new state to shift in */
+ int yyMajor, /* The major token to shift in */
+ YYMINORTYPE *yypMinor /* Pointer to the minor token to shift in */
+){
+ yyStackEntry *yytos;
+ yypParser->yyidx++;
+#ifdef YYTRACKMAXSTACKDEPTH
+ if( yypParser->yyidx>yypParser->yyidxMax ){
+ yypParser->yyidxMax = yypParser->yyidx;
+ }
+#endif
+#if YYSTACKDEPTH>0
+ if( yypParser->yyidx>=YYSTACKDEPTH ){
+ yyStackOverflow(yypParser, yypMinor);
+ return;
+ }
+#else
+ if( yypParser->yyidx>=yypParser->yystksz ){
+ yyGrowStack(yypParser);
+ if( yypParser->yyidx>=yypParser->yystksz ){
+ yyStackOverflow(yypParser, yypMinor);
+ return;
+ }
+ }
+#endif
+ yytos = &yypParser->yystack[yypParser->yyidx];
+ yytos->stateno = (YYACTIONTYPE)yyNewState;
+ yytos->major = (YYCODETYPE)yyMajor;
+ yytos->minor = *yypMinor;
+#ifndef NDEBUG
+ if( yyTraceFILE && yypParser->yyidx>0 ){
+ int i;
+ fprintf(yyTraceFILE,"%sShift %d\n",yyTracePrompt,yyNewState);
+ fprintf(yyTraceFILE,"%sStack:",yyTracePrompt);
+ for(i=1; i<=yypParser->yyidx; i++)
+ fprintf(yyTraceFILE," %s",yyTokenName[yypParser->yystack[i].major]);
+ fprintf(yyTraceFILE,"\n");
+ }
+#endif
+}
+
+/* The following table contains information about every rule that
+** is used during the reduce.
+*/
+static const struct {
+ YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */
+ unsigned char nrhs; /* Number of right-hand side symbols in the rule */
+} yyRuleInfo[] = {
+%%
+};
+
+static void yy_accept(yyParser*); /* Forward Declaration */
+
+/*
+** Perform a reduce action and the shift that must immediately
+** follow the reduce.
+*/
+static void yy_reduce(
+ yyParser *yypParser, /* The parser */
+ int yyruleno /* Number of the rule by which to reduce */
+){
+ int yygoto; /* The next state */
+ int yyact; /* The next action */
+ YYMINORTYPE yygotominor; /* The LHS of the rule reduced */
+ yyStackEntry *yymsp; /* The top of the parser's stack */
+ int yysize; /* Amount to pop the stack */
+ ParseARG_FETCH;
+ yymsp = &yypParser->yystack[yypParser->yyidx];
+#ifndef NDEBUG
+ if( yyTraceFILE && yyruleno>=0
+ && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){
+ fprintf(yyTraceFILE, "%sReduce [%s].\n", yyTracePrompt,
+ yyRuleName[yyruleno]);
+ }
+#endif /* NDEBUG */
+
+ /* Silence complaints from purify about yygotominor being uninitialized
+ ** in some cases when it is copied into the stack after the following
+ ** switch. yygotominor is uninitialized when a rule reduces that does
+ ** not set the value of its left-hand side nonterminal. Leaving the
+ ** value of the nonterminal uninitialized is utterly harmless as long
+ ** as the value is never used. So really the only thing this code
+ ** accomplishes is to quieten purify.
+ **
+ ** 2007-01-16: The wireshark project (www.wireshark.org) reports that
+ ** without this code, their parser segfaults. I'm not sure what there
+ ** parser is doing to make this happen. This is the second bug report
+ ** from wireshark this week. Clearly they are stressing Lemon in ways
+ ** that it has not been previously stressed... (SQLite ticket #2172)
+ */
+ /*memset(&yygotominor, 0, sizeof(yygotominor));*/
+ yygotominor = yyzerominor;
+
+
+ switch( yyruleno ){
+ /* Beginning here are the reduction cases. A typical example
+ ** follows:
+ ** case 0:
+ ** #line <lineno> <grammarfile>
+ ** { ... } // User supplied code
+ ** #line <lineno> <thisfile>
+ ** break;
+ */
+%%
+ };
+ yygoto = yyRuleInfo[yyruleno].lhs;
+ yysize = yyRuleInfo[yyruleno].nrhs;
+ yypParser->yyidx -= yysize;
+ yyact = yy_find_reduce_action(yymsp[-yysize].stateno,(YYCODETYPE)yygoto);
+ if( yyact < YYNSTATE ){
+#ifdef NDEBUG
+ /* If we are not debugging and the reduce action popped at least
+ ** one element off the stack, then we can push the new element back
+ ** onto the stack here, and skip the stack overflow test in yy_shift().
+ ** That gives a significant speed improvement. */
+ if( yysize ){
+ yypParser->yyidx++;
+ yymsp -= yysize-1;
+ yymsp->stateno = (YYACTIONTYPE)yyact;
+ yymsp->major = (YYCODETYPE)yygoto;
+ yymsp->minor = yygotominor;
+ }else
+#endif
+ {
+ yy_shift(yypParser,yyact,yygoto,&yygotominor);
+ }
+ }else{
+ assert( yyact == YYNSTATE + YYNRULE + 1 );
+ yy_accept(yypParser);
+ }
+}
+
+/*
+** The following code executes when the parse fails
+*/
+#ifndef YYNOERRORRECOVERY
+static void yy_parse_failed(
+ yyParser *yypParser /* The parser */
+){
+ ParseARG_FETCH;
+#ifndef NDEBUG
+ if( yyTraceFILE ){
+ fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt);
+ }
+#endif
+ while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);
+ /* Here code is inserted which will be executed whenever the
+ ** parser fails */
+%%
+ ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
+}
+#endif /* YYNOERRORRECOVERY */
+
+/*
+** The following code executes when a syntax error first occurs.
+*/
+static void yy_syntax_error(
+ yyParser *yypParser, /* The parser */
+ int yymajor, /* The major type of the error token */
+ YYMINORTYPE yyminor /* The minor type of the error token */
+){
+ ParseARG_FETCH;
+#define TOKEN (yyminor.yy0)
+%%
+ ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
+}
+
+/*
+** The following is executed when the parser accepts
+*/
+static void yy_accept(
+ yyParser *yypParser /* The parser */
+){
+ ParseARG_FETCH;
+#ifndef NDEBUG
+ if( yyTraceFILE ){
+ fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt);
+ }
+#endif
+ while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);
+ /* Here code is inserted which will be executed whenever the
+ ** parser accepts */
+%%
+ ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
+}
+
+/* The main parser program.
+** The first argument is a pointer to a structure obtained from
+** "ParseAlloc" which describes the current state of the parser.
+** The second argument is the major token number. The third is
+** the minor token. The fourth optional argument is whatever the
+** user wants (and specified in the grammar) and is available for
+** use by the action routines.
+**
+** Inputs:
+** <ul>
+** <li> A pointer to the parser (an opaque structure.)
+** <li> The major token number.
+** <li> The minor token number.
+** <li> An option argument of a grammar-specified type.
+** </ul>
+**
+** Outputs:
+** None.
+*/
+void Parse(
+ void *yyp, /* The parser */
+ int yymajor, /* The major token code number */
+ ParseTOKENTYPE yyminor /* The value for the token */
+ ParseARG_PDECL /* Optional %extra_argument parameter */
+){
+ YYMINORTYPE yyminorunion;
+ int yyact; /* The parser action. */
+ int yyendofinput; /* True if we are at the end of input */
+#ifdef YYERRORSYMBOL
+ int yyerrorhit = 0; /* True if yymajor has invoked an error */
+#endif
+ yyParser *yypParser; /* The parser */
+
+ /* (re)initialize the parser, if necessary */
+ yypParser = (yyParser*)yyp;
+ if( yypParser->yyidx<0 ){
+#if YYSTACKDEPTH<=0
+ if( yypParser->yystksz <=0 ){
+ /*memset(&yyminorunion, 0, sizeof(yyminorunion));*/
+ yyminorunion = yyzerominor;
+ yyStackOverflow(yypParser, &yyminorunion);
+ return;
+ }
+#endif
+ yypParser->yyidx = 0;
+ yypParser->yyerrcnt = -1;
+ yypParser->yystack[0].stateno = 0;
+ yypParser->yystack[0].major = 0;
+ }
+ yyminorunion.yy0 = yyminor;
+ yyendofinput = (yymajor==0);
+ ParseARG_STORE;
+
+#ifndef NDEBUG
+ if( yyTraceFILE ){
+ fprintf(yyTraceFILE,"%sInput %s\n",yyTracePrompt,yyTokenName[yymajor]);
+ }
+#endif
+
+ do{
+ yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor);
+ if( yyact<YYNSTATE ){
+ assert( !yyendofinput ); /* Impossible to shift the $ token */
+ yy_shift(yypParser,yyact,yymajor,&yyminorunion);
+ yypParser->yyerrcnt--;
+ yymajor = YYNOCODE;
+ }else if( yyact < YYNSTATE + YYNRULE ){
+ yy_reduce(yypParser,yyact-YYNSTATE);
+ }else{
+ assert( yyact == YY_ERROR_ACTION );
+#ifdef YYERRORSYMBOL
+ int yymx;
+#endif
+#ifndef NDEBUG
+ if( yyTraceFILE ){
+ fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt);
+ }
+#endif
+#ifdef YYERRORSYMBOL
+ /* A syntax error has occurred.
+ ** The response to an error depends upon whether or not the
+ ** grammar defines an error token "ERROR".
+ **
+ ** This is what we do if the grammar does define ERROR:
+ **
+ ** * Call the %syntax_error function.
+ **
+ ** * Begin popping the stack until we enter a state where
+ ** it is legal to shift the error symbol, then shift
+ ** the error symbol.
+ **
+ ** * Set the error count to three.
+ **
+ ** * Begin accepting and shifting new tokens. No new error
+ ** processing will occur until three tokens have been
+ ** shifted successfully.
+ **
+ */
+ if( yypParser->yyerrcnt<0 ){
+ yy_syntax_error(yypParser,yymajor,yyminorunion);
+ }
+ yymx = yypParser->yystack[yypParser->yyidx].major;
+ if( yymx==YYERRORSYMBOL || yyerrorhit ){
+#ifndef NDEBUG
+ if( yyTraceFILE ){
+ fprintf(yyTraceFILE,"%sDiscard input token %s\n",
+ yyTracePrompt,yyTokenName[yymajor]);
+ }
+#endif
+ yy_destructor(yypParser, (YYCODETYPE)yymajor,&yyminorunion);
+ yymajor = YYNOCODE;
+ }else{
+ while(
+ yypParser->yyidx >= 0 &&
+ yymx != YYERRORSYMBOL &&
+ (yyact = yy_find_reduce_action(
+ yypParser->yystack[yypParser->yyidx].stateno,
+ YYERRORSYMBOL)) >= YYNSTATE
+ ){
+ yy_pop_parser_stack(yypParser);
+ }
+ if( yypParser->yyidx < 0 || yymajor==0 ){
+ yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
+ yy_parse_failed(yypParser);
+ yymajor = YYNOCODE;
+ }else if( yymx!=YYERRORSYMBOL ){
+ YYMINORTYPE u2;
+ u2.YYERRSYMDT = 0;
+ yy_shift(yypParser,yyact,YYERRORSYMBOL,&u2);
+ }
+ }
+ yypParser->yyerrcnt = 3;
+ yyerrorhit = 1;
+#elif defined(YYNOERRORRECOVERY)
+ /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to
+ ** do any kind of error recovery. Instead, simply invoke the syntax
+ ** error routine and continue going as if nothing had happened.
+ **
+ ** Applications can set this macro (for example inside %include) if
+ ** they intend to abandon the parse upon the first syntax error seen.
+ */
+ yy_syntax_error(yypParser,yymajor,yyminorunion);
+ yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
+ yymajor = YYNOCODE;
+
+#else /* YYERRORSYMBOL is not defined */
+ /* This is what we do if the grammar does not define ERROR:
+ **
+ ** * Report an error message, and throw away the input token.
+ **
+ ** * If the input token is $, then fail the parse.
+ **
+ ** As before, subsequent error messages are suppressed until
+ ** three input tokens have been successfully shifted.
+ */
+ if( yypParser->yyerrcnt<=0 ){
+ yy_syntax_error(yypParser,yymajor,yyminorunion);
+ }
+ yypParser->yyerrcnt = 3;
+ yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
+ if( yyendofinput ){
+ yy_parse_failed(yypParser);
+ }
+ yymajor = YYNOCODE;
+#endif
+ }
+ }while( yymajor!=YYNOCODE && yypParser->yyidx>=0 );
+ return;
+}
--- /dev/null
+#!/bin/sh
+
+cat <<EOF > $1
+local pcall, dofile, _G = pcall, dofile, _G
+
+module "luci.version"
+
+if pcall(dofile, "/etc/openwrt_release") and _G.DISTRIB_DESCRIPTION then
+ distname = ""
+ distversion = _G.DISTRIB_DESCRIPTION
+ if _G.DISTRIB_REVISION then
+ distrevision = _G.DISTRIB_REVISION
+ if not distversion:find(distrevision,1,true) then
+ distversion = distversion .. " " .. distrevision
+ end
+ end
+else
+ distname = "OpenWrt"
+ distversion = "Development Snapshot"
+end
+
+luciname = "${3:-LuCI}"
+luciversion = "${2:-Git}"
+EOF
--- /dev/null
+%name pluralParse
+%token_type {int}
+%extra_argument {struct parse_state *s}
+
+%right T_QMARK.
+%left T_OR.
+%left T_AND.
+%left T_EQ T_NE.
+%left T_LT T_LE T_GT T_GE.
+%left T_ADD T_SUB.
+%left T_MUL T_DIV T_MOD.
+%right T_NOT.
+%nonassoc T_COLON T_N T_LPAREN T_RPAREN.
+
+%include {
+#include <assert.h>
+
+struct parse_state {
+ int num;
+ int res;
+};
+}
+
+input ::= expr(A). { s->res = A; }
+
+expr(A) ::= expr(B) T_QMARK expr(C) T_COLON expr(D). { A = B ? C : D; }
+expr(A) ::= expr(B) T_OR expr(C). { A = B || C; }
+expr(A) ::= expr(B) T_AND expr(C). { A = B && C; }
+expr(A) ::= expr(B) T_EQ expr(C). { A = B == C; }
+expr(A) ::= expr(B) T_NE expr(C). { A = B != C; }
+expr(A) ::= expr(B) T_LT expr(C). { A = B < C; }
+expr(A) ::= expr(B) T_LE expr(C). { A = B <= C; }
+expr(A) ::= expr(B) T_GT expr(C). { A = B > C; }
+expr(A) ::= expr(B) T_GE expr(C). { A = B >= C; }
+expr(A) ::= expr(B) T_ADD expr(C). { A = B + C; }
+expr(A) ::= expr(B) T_SUB expr(C). { A = B - C; }
+expr(A) ::= expr(B) T_MUL expr(C). { A = B * C; }
+expr(A) ::= expr(B) T_DIV expr(C). { A = B / C; }
+expr(A) ::= expr(B) T_MOD expr(C). { A = B % C; }
+expr(A) ::= T_NOT expr(B). { A = !B; }
+expr(A) ::= T_N. { A = s->num; }
+expr(A) ::= T_NUM(B). { A = B; }
+expr(A) ::= T_LPAREN expr(B) T_RPAREN. { A = B; }
--- /dev/null
+/*
+ * lmo - Lua Machine Objects - Base functions
+ *
+ * Copyright (C) 2009-2010 Jo-Philipp Wich <jow@openwrt.org>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "template_lmo.h"
+#include "plural_formula.h"
+
+/*
+ * Hash function from http://www.azillionmonkeys.com/qed/hash.html
+ * Copyright (C) 2004-2008 by Paul Hsieh
+ */
+
+uint32_t sfh_hash(const char *data, int len)
+{
+ uint32_t hash = len, tmp;
+ int rem;
+
+ if (len <= 0 || data == NULL) return 0;
+
+ rem = len & 3;
+ len >>= 2;
+
+ /* Main loop */
+ for (;len > 0; len--) {
+ hash += sfh_get16(data);
+ tmp = (sfh_get16(data+2) << 11) ^ hash;
+ hash = (hash << 16) ^ tmp;
+ data += 2*sizeof(uint16_t);
+ hash += hash >> 11;
+ }
+
+ /* Handle end cases */
+ switch (rem) {
+ case 3: hash += sfh_get16(data);
+ hash ^= hash << 16;
+ hash ^= (signed char)data[sizeof(uint16_t)] << 18;
+ hash += hash >> 11;
+ break;
+ case 2: hash += sfh_get16(data);
+ hash ^= hash << 11;
+ hash += hash >> 17;
+ break;
+ case 1: hash += (signed char)*data;
+ hash ^= hash << 10;
+ hash += hash >> 1;
+ }
+
+ /* Force "avalanching" of final 127 bits */
+ hash ^= hash << 3;
+ hash += hash >> 5;
+ hash ^= hash << 4;
+ hash += hash >> 17;
+ hash ^= hash << 25;
+ hash += hash >> 6;
+
+ return hash;
+}
+
+uint32_t lmo_canon_hash(const char *str, int len,
+ const char *ctx, int ctxlen, int plural)
+{
+ char res[4096];
+ char *ptr, *end, prev;
+ int off;
+
+ if (!str)
+ return 0;
+
+ ptr = res;
+ end = res + sizeof(res);
+
+ if (ctx)
+ {
+ for (prev = ' ', off = 0; off < ctxlen; prev = *ctx, off++, ctx++)
+ {
+ if (ptr >= end)
+ return 0;
+
+ if (isspace(*ctx))
+ {
+ if (!isspace(prev))
+ *ptr++ = ' ';
+ }
+ else
+ {
+ *ptr++ = *ctx;
+ }
+ }
+
+ if ((ptr > res) && isspace(*(ptr-1)))
+ ptr--;
+
+ if (ptr >= end)
+ return 0;
+
+ *ptr++ = '\1';
+ }
+
+ for (prev = ' ', off = 0; off < len; prev = *str, off++, str++)
+ {
+ if (ptr >= end)
+ return 0;
+
+ if (isspace(*str))
+ {
+ if (!isspace(prev))
+ *ptr++ = ' ';
+ }
+ else
+ {
+ *ptr++ = *str;
+ }
+ }
+
+ if ((ptr > res) && isspace(*(ptr-1)))
+ ptr--;
+
+ if (plural > -1)
+ {
+ if (plural >= 100 || ptr + 3 >= end)
+ return 0;
+
+ ptr += snprintf(ptr, 3, "\2%d", plural);
+ }
+
+ return sfh_hash(res, ptr - res);
+}
+
+lmo_archive_t * lmo_open(const char *file)
+{
+ int in = -1;
+ uint32_t idx_offset = 0;
+ struct stat s;
+
+ lmo_archive_t *ar = NULL;
+
+ if (stat(file, &s) == -1)
+ goto err;
+
+ if ((in = open(file, O_RDONLY)) == -1)
+ goto err;
+
+ if ((ar = (lmo_archive_t *)malloc(sizeof(*ar))) != NULL)
+ {
+ memset(ar, 0, sizeof(*ar));
+
+ ar->fd = in;
+ ar->size = s.st_size;
+
+ fcntl(ar->fd, F_SETFD, fcntl(ar->fd, F_GETFD) | FD_CLOEXEC);
+
+ if ((ar->mmap = mmap(NULL, ar->size, PROT_READ, MAP_SHARED, ar->fd, 0)) == MAP_FAILED)
+ goto err;
+
+ idx_offset = ntohl(*((const uint32_t *)
+ (ar->mmap + ar->size - sizeof(uint32_t))));
+
+ if (idx_offset >= ar->size)
+ goto err;
+
+ ar->index = (lmo_entry_t *)(ar->mmap + idx_offset);
+ ar->length = (ar->size - idx_offset - sizeof(uint32_t)) / sizeof(lmo_entry_t);
+ ar->end = ar->mmap + ar->size;
+
+ return ar;
+ }
+
+err:
+ if (in > -1)
+ close(in);
+
+ if (ar != NULL)
+ {
+ if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED))
+ munmap(ar->mmap, ar->size);
+
+ free(ar);
+ }
+
+ return NULL;
+}
+
+void lmo_close(lmo_archive_t *ar)
+{
+ if (ar != NULL)
+ {
+ if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED))
+ munmap(ar->mmap, ar->size);
+
+ close(ar->fd);
+ free(ar);
+
+ ar = NULL;
+ }
+}
+
+
+lmo_catalog_t *_lmo_catalogs = NULL;
+lmo_catalog_t *_lmo_active_catalog = NULL;
+
+int lmo_load_catalog(const char *lang, const char *dir)
+{
+ DIR *dh = NULL;
+ char pattern[16];
+ char path[PATH_MAX];
+ struct dirent *de = NULL;
+
+ lmo_archive_t *ar = NULL;
+ lmo_catalog_t *cat = NULL;
+
+ if (!lmo_change_catalog(lang))
+ return 0;
+
+ if (!dir || !(dh = opendir(dir)))
+ goto err;
+
+ if (!(cat = malloc(sizeof(*cat))))
+ goto err;
+
+ memset(cat, 0, sizeof(*cat));
+
+ snprintf(cat->lang, sizeof(cat->lang), "%s", lang);
+ snprintf(pattern, sizeof(pattern), "*.%s.lmo", lang);
+
+ while ((de = readdir(dh)) != NULL)
+ {
+ if (!fnmatch(pattern, de->d_name, 0))
+ {
+ snprintf(path, sizeof(path), "%s/%s", dir, de->d_name);
+ ar = lmo_open(path);
+
+ if (ar)
+ {
+ ar->next = cat->archives;
+ cat->archives = ar;
+ }
+ }
+ }
+
+ closedir(dh);
+
+ cat->next = _lmo_catalogs;
+ _lmo_catalogs = cat;
+
+ if (!_lmo_active_catalog)
+ _lmo_active_catalog = cat;
+
+ return cat->archives ? 0 : -1;
+
+err:
+ if (dh) closedir(dh);
+ if (cat) free(cat);
+
+ return -1;
+}
+
+int lmo_change_catalog(const char *lang)
+{
+ lmo_catalog_t *cat;
+
+ for (cat = _lmo_catalogs; cat; cat = cat->next)
+ {
+ if (!strncmp(cat->lang, lang, sizeof(cat->lang)))
+ {
+ _lmo_active_catalog = cat;
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+static lmo_entry_t * lmo_find_entry(lmo_archive_t *ar, uint32_t hash)
+{
+ unsigned int m, l, r;
+ uint32_t k;
+
+ l = 0;
+ r = ar->length - 1;
+
+ while (1)
+ {
+ m = l + ((r - l) / 2);
+
+ if (r < l)
+ break;
+
+ k = ntohl(ar->index[m].key_id);
+
+ if (k == hash)
+ return &ar->index[m];
+
+ if (k > hash)
+ {
+ if (!m)
+ break;
+
+ r = m - 1;
+ }
+ else
+ {
+ l = m + 1;
+ }
+ }
+
+ return NULL;
+}
+
+void *pluralParseAlloc(void *(*)(size_t));
+void pluralParse(void *, int, int, void *);
+void pluralParseFree(void *, void (*)(void *));
+
+static int lmo_eval_plural(const char *expr, int len, int val)
+{
+ struct { int num; int res; } s = { .num = val, .res = -1 };
+ const char *p = NULL;
+ void *pParser = NULL;
+ int t, n;
+ char c;
+
+ while (len > 7) {
+ if (*expr == 'p') {
+ if (!strncmp(expr, "plural=", 7)) {
+ p = expr + 7;
+ len -= 7;
+ break;
+ }
+ }
+
+ expr++;
+ len--;
+ }
+
+ if (!p)
+ goto out;
+
+ pParser = pluralParseAlloc(malloc);
+
+ if (!pParser)
+ goto out;
+
+ while (len-- > 0) {
+ c = *p++;
+ t = -1;
+ n = 0;
+
+ switch (c) {
+ case ' ':
+ case '\t':
+ continue;
+
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ t = T_NUM;
+ n = c - '0';
+
+ while (*p >= '0' && *p <= '9') {
+ n *= 10;
+ n += *p - '0';
+ p++;
+ }
+
+ break;
+
+ case '=':
+ if (*p == '=') {
+ t = T_EQ;
+ p++;
+ }
+
+ break;
+
+ case '!':
+ if (*p == '=') {
+ t = T_NE;
+ p++;
+ }
+ else {
+ t = T_NOT;
+ }
+
+ break;
+
+ case '&':
+ if (*p == '&') {
+ t = T_AND;
+ p++;
+ }
+
+ break;
+
+ case '|':
+ if (*p == '|') {
+ t = T_OR;
+ p++;
+ }
+
+ break;
+
+ case '<':
+ if (*p == '=') {
+ t = T_LE;
+ p++;
+ }
+ else {
+ t = T_LT;
+ }
+
+ break;
+
+ case '>':
+ if (*p == '=') {
+ t = T_GE;
+ p++;
+ }
+ else {
+ t = T_GT;
+ }
+
+ break;
+
+ case '*':
+ t = T_MUL;
+ break;
+
+ case '/':
+ t = T_DIV;
+ break;
+
+ case '%':
+ t = T_MOD;
+ break;
+
+ case '+':
+ t = T_ADD;
+ break;
+
+ case '-':
+ t = T_SUB;
+ break;
+
+ case 'n':
+ t = T_N;
+ break;
+
+ case '?':
+ t = T_QMARK;
+ break;
+
+ case ':':
+ t = T_COLON;
+ break;
+
+ case '(':
+ t = T_LPAREN;
+ break;
+
+ case ')':
+ t = T_RPAREN;
+ break;
+
+ case ';':
+ case '\n':
+ case '\0':
+ t = 0;
+ break;
+ }
+
+ /* syntax error */
+ if (t < 0)
+ goto out;
+
+ pluralParse(pParser, t, n, &s);
+
+ /* eof */
+ if (t == 0)
+ break;
+ }
+
+ pluralParse(pParser, 0, 0, &s);
+
+out:
+ pluralParseFree(pParser, free);
+
+ return s.res;
+}
+
+int lmo_translate(const char *key, int keylen, char **out, int *outlen)
+{
+ return lmo_translate_ctxt(key, keylen, NULL, 0, out, outlen);
+}
+
+int lmo_translate_ctxt(const char *key, int keylen,
+ const char *ctx, int ctxlen,
+ char **out, int *outlen)
+{
+ uint32_t hash;
+ lmo_entry_t *e;
+ lmo_archive_t *ar;
+
+ if (!key || !_lmo_active_catalog)
+ return -2;
+
+ hash = lmo_canon_hash(key, keylen, ctx, ctxlen, -1);
+
+ if (hash > 0)
+ {
+ for (ar = _lmo_active_catalog->archives; ar; ar = ar->next)
+ {
+ if ((e = lmo_find_entry(ar, hash)) != NULL)
+ {
+ *out = ar->mmap + ntohl(e->offset);
+ *outlen = ntohl(e->length);
+ return 0;
+ }
+ }
+ }
+
+ return -1;
+}
+
+int lmo_translate_plural(int n, const char *skey, int skeylen,
+ const char *pkey, int pkeylen,
+ char **out, int *outlen)
+{
+ return lmo_translate_plural_ctxt(n, skey, skeylen, pkey, pkeylen,
+ NULL, 0, out, outlen);
+}
+
+int lmo_translate_plural_ctxt(int n, const char *skey, int skeylen,
+ const char *pkey, int pkeylen,
+ const char *ctx, int ctxlen,
+ char **out, int *outlen)
+{
+ int pid = -1;
+ uint32_t hash;
+ lmo_entry_t *e;
+ lmo_archive_t *ar;
+ const char *plural_formula;
+
+ if (!skey || !pkey || !_lmo_active_catalog)
+ return -2;
+
+ for (ar = _lmo_active_catalog->archives; ar; ar = ar->next) {
+ e = lmo_find_entry(ar, 0);
+
+ if (e != NULL) {
+ pid = lmo_eval_plural(ar->mmap + ntohl(e->offset), ntohl(e->length), n);
+ break;
+ }
+ }
+
+ if (pid == -1)
+ pid = (n != 1);
+
+ hash = lmo_canon_hash(skey, skeylen, ctx, ctxlen, pid);
+
+ if (hash == 0)
+ return -1;
+
+ for (ar = _lmo_active_catalog->archives; ar; ar = ar->next)
+ {
+ if ((e = lmo_find_entry(ar, hash)) != NULL)
+ {
+ *out = ar->mmap + ntohl(e->offset);
+ *outlen = ntohl(e->length);
+ return 0;
+ }
+ }
+
+ if (n != 1)
+ {
+ *out = (char *)pkey;
+ *outlen = pkeylen;
+ }
+ else
+ {
+ *out = (char *)skey;
+ *outlen = skeylen;
+ }
+
+ return 0;
+}
+
+void lmo_iterate(lmo_iterate_cb_t cb, void *priv)
+{
+ unsigned int i;
+ lmo_entry_t *e;
+ lmo_archive_t *ar;
+
+ if (!_lmo_active_catalog)
+ return;
+
+ for (ar = _lmo_active_catalog->archives; ar; ar = ar->next)
+ for (i = 0, e = &ar->index[0]; i < ar->length; e = &ar->index[++i])
+ cb(ntohl(e->key_id), ar->mmap + ntohl(e->offset), ntohl(e->length), priv);
+}
+
+void lmo_close_catalog(const char *lang)
+{
+ lmo_archive_t *ar, *next;
+ lmo_catalog_t *cat, *prev;
+
+ for (prev = NULL, cat = _lmo_catalogs; cat; prev = cat, cat = cat->next)
+ {
+ if (!strncmp(cat->lang, lang, sizeof(cat->lang)))
+ {
+ if (prev)
+ prev->next = cat->next;
+ else
+ _lmo_catalogs = cat->next;
+
+ for (ar = cat->archives; ar; ar = next)
+ {
+ next = ar->next;
+ lmo_close(ar);
+ }
+
+ free(cat);
+ break;
+ }
+ }
+}
--- /dev/null
+/*
+ * lmo - Lua Machine Objects - General header
+ *
+ * Copyright (C) 2009-2012 Jo-Philipp Wich <jow@openwrt.org>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _TEMPLATE_LMO_H_
+#define _TEMPLATE_LMO_H_
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fnmatch.h>
+#include <dirent.h>
+#include <ctype.h>
+#include <limits.h>
+
+#if (defined(__GNUC__) && defined(__i386__))
+#define sfh_get16(d) (*((const uint16_t *) (d)))
+#else
+#define sfh_get16(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
+ +(uint32_t)(((const uint8_t *)(d))[0]) )
+#endif
+
+
+struct lmo_entry {
+ uint32_t key_id;
+ uint32_t val_id;
+ uint32_t offset;
+ uint32_t length;
+} __attribute__((packed));
+
+typedef struct lmo_entry lmo_entry_t;
+
+
+struct lmo_archive {
+ int fd;
+ int length;
+ uint32_t size;
+ lmo_entry_t *index;
+ char *mmap;
+ char *end;
+ struct lmo_archive *next;
+};
+
+typedef struct lmo_archive lmo_archive_t;
+
+
+struct lmo_catalog {
+ char lang[6];
+ struct lmo_archive *archives;
+ struct lmo_catalog *next;
+};
+
+typedef struct lmo_catalog lmo_catalog_t;
+
+typedef void (*lmo_iterate_cb_t)(uint32_t, const char *, int, void *);
+
+uint32_t sfh_hash(const char *data, int len);
+uint32_t lmo_canon_hash(const char *data, int len,
+ const char *ctx, int ctxlen, int plural);
+
+lmo_archive_t * lmo_open(const char *file);
+void lmo_close(lmo_archive_t *ar);
+
+
+extern lmo_catalog_t *_lmo_catalogs;
+extern lmo_catalog_t *_lmo_active_catalog;
+
+int lmo_load_catalog(const char *lang, const char *dir);
+int lmo_change_catalog(const char *lang);
+int lmo_translate(const char *key, int keylen, char **out, int *outlen);
+int lmo_translate_ctxt(const char *key, int keylen,
+ const char *ctx, int ctxlen, char **out, int *outlen);
+int lmo_translate_plural(int n, const char *skey, int skeylen,
+ const char *pkey, int pkeylen,
+ char **out, int *outlen);
+int lmo_translate_plural_ctxt(int n, const char *skey, int skeylen,
+ const char *pkey, int pkeylen,
+ const char *ctx, int ctxlen,
+ char **out, int *outlen);
+void lmo_iterate(lmo_iterate_cb_t cb, void *priv);
+void lmo_close_catalog(const char *lang);
+
+#endif
--- /dev/null
+/*
+ * LuCI Template - Lua binding
+ *
+ * Copyright (C) 2009 Jo-Philipp Wich <jow@openwrt.org>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "template_lualib.h"
+
+static int template_L_do_parse(lua_State *L, struct template_parser *parser, const char *chunkname)
+{
+ int lua_status, rv;
+
+ if (!parser)
+ {
+ lua_pushnil(L);
+ lua_pushinteger(L, errno);
+ lua_pushstring(L, strerror(errno));
+ return 3;
+ }
+
+ lua_status = lua_load(L, template_reader, parser, chunkname);
+
+ if (lua_status == 0)
+ rv = 1;
+ else
+ rv = template_error(L, parser);
+
+ template_close(parser);
+
+ return rv;
+}
+
+int template_L_parse(lua_State *L)
+{
+ const char *file = luaL_checkstring(L, 1);
+ struct template_parser *parser = template_open(file);
+
+ return template_L_do_parse(L, parser, file);
+}
+
+int template_L_parse_string(lua_State *L)
+{
+ size_t len;
+ const char *str = luaL_checklstring(L, 1, &len);
+ struct template_parser *parser = template_string(str, len);
+
+ return template_L_do_parse(L, parser, "[string]");
+}
+
+int template_L_utf8(lua_State *L)
+{
+ size_t len = 0;
+ const char *str = luaL_checklstring(L, 1, &len);
+ char *res = utf8(str, len);
+
+ if (res != NULL)
+ {
+ lua_pushstring(L, res);
+ free(res);
+
+ return 1;
+ }
+
+ return 0;
+}
+
+int template_L_pcdata(lua_State *L)
+{
+ size_t len = 0;
+ const char *str = luaL_checklstring(L, 1, &len);
+ char *res = pcdata(str, len);
+
+ if (res != NULL)
+ {
+ lua_pushstring(L, res);
+ free(res);
+
+ return 1;
+ }
+
+ return 0;
+}
+
+int template_L_striptags(lua_State *L)
+{
+ size_t len = 0;
+ const char *str = luaL_checklstring(L, 1, &len);
+ char *res = striptags(str, len);
+
+ if (res != NULL)
+ {
+ lua_pushstring(L, res);
+ free(res);
+
+ return 1;
+ }
+
+ return 0;
+}
+
+static int template_L_load_catalog(lua_State *L) {
+ const char *lang = luaL_optstring(L, 1, "en");
+ const char *dir = luaL_optstring(L, 2, NULL);
+ lua_pushboolean(L, !lmo_load_catalog(lang, dir));
+ return 1;
+}
+
+static int template_L_close_catalog(lua_State *L) {
+ const char *lang = luaL_optstring(L, 1, "en");
+ lmo_close_catalog(lang);
+ return 0;
+}
+
+static int template_L_change_catalog(lua_State *L) {
+ const char *lang = luaL_optstring(L, 1, "en");
+ lua_pushboolean(L, !lmo_change_catalog(lang));
+ return 1;
+}
+
+static void template_L_get_translations_cb(uint32_t key, const char *val, int len, void *priv) {
+ lua_State *L = priv;
+ char hex[9];
+
+ luaL_checktype(L, 1, LUA_TFUNCTION);
+ snprintf(hex, sizeof(hex), "%08x", key);
+
+ lua_pushvalue(L, 1);
+ lua_pushstring(L, hex);
+ lua_pushlstring(L, val, len);
+ lua_call(L, 2, 0);
+}
+
+static int template_L_get_translations(lua_State *L) {
+ lmo_iterate(template_L_get_translations_cb, L);
+ return 0;
+}
+
+static int template_L_translate(lua_State *L) {
+ size_t len, ctxlen = 0;
+ char *tr;
+ int trlen;
+ const char *key = luaL_checklstring(L, 1, &len);
+ const char *ctx = luaL_optlstring(L, 2, NULL, &ctxlen);
+
+ switch (lmo_translate_ctxt(key, len, ctx, ctxlen, &tr, &trlen))
+ {
+ case 0:
+ lua_pushlstring(L, tr, trlen);
+ return 1;
+
+ case -1:
+ return 0;
+ }
+
+ lua_pushnil(L);
+ lua_pushstring(L, "no catalog loaded");
+ return 2;
+}
+
+static int template_L_ntranslate(lua_State *L) {
+ size_t slen, plen, ctxlen = 0;
+ char *tr;
+ int trlen;
+ int n = luaL_checkinteger(L, 1);
+ const char *skey = luaL_checklstring(L, 2, &slen);
+ const char *pkey = luaL_checklstring(L, 3, &plen);
+ const char *ctx = luaL_optlstring(L, 4, NULL, &ctxlen);
+
+ switch (lmo_translate_plural_ctxt(n, skey, slen, pkey, plen, ctx, ctxlen, &tr, &trlen))
+ {
+ case 0:
+ lua_pushlstring(L, tr, trlen);
+ return 1;
+
+ case -1:
+ return 0;
+ }
+
+ lua_pushnil(L);
+ lua_pushstring(L, "no catalog loaded");
+ return 2;
+}
+
+static int template_L_hash(lua_State *L) {
+ size_t len;
+ const char *key = luaL_checklstring(L, 1, &len);
+ lua_pushinteger(L, sfh_hash(key, len));
+ return 1;
+}
+
+
+/* module table */
+static const luaL_reg R[] = {
+ { "parse", template_L_parse },
+ { "parse_string", template_L_parse_string },
+ { "utf8", template_L_utf8 },
+ { "pcdata", template_L_pcdata },
+ { "striptags", template_L_striptags },
+ { "load_catalog", template_L_load_catalog },
+ { "close_catalog", template_L_close_catalog },
+ { "change_catalog", template_L_change_catalog },
+ { "get_translations", template_L_get_translations },
+ { "translate", template_L_translate },
+ { "ntranslate", template_L_ntranslate },
+ { "hash", template_L_hash },
+ { NULL, NULL }
+};
+
+LUALIB_API int luaopen_luci_template_parser(lua_State *L) {
+ luaL_register(L, TEMPLATE_LUALIB_META, R);
+ return 1;
+}
--- /dev/null
+/*
+ * LuCI Template - Lua library header
+ *
+ * Copyright (C) 2009 Jo-Philipp Wich <jow@openwrt.org>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _TEMPLATE_LUALIB_H_
+#define _TEMPLATE_LUALIB_H_
+
+#include "template_parser.h"
+#include "template_utils.h"
+#include "template_lmo.h"
+
+#define TEMPLATE_LUALIB_META "template.parser"
+
+LUALIB_API int luaopen_luci_template_parser(lua_State *L);
+
+#endif
--- /dev/null
+/*
+ * LuCI Template - Parser implementation
+ *
+ * Copyright (C) 2009-2012 Jo-Philipp Wich <jow@openwrt.org>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "template_parser.h"
+#include "template_utils.h"
+#include "template_lmo.h"
+
+
+/* leading and trailing code for different types */
+const char *gen_code[9][2] = {
+ { NULL, NULL },
+ { "write(\"", "\")" },
+ { NULL, NULL },
+ { "write(tostring(", " or \"\"))" },
+ { "include(\"", "\")" },
+ { "write(\"", "\")" },
+ { "write(\"", "\")" },
+ { NULL, " " },
+ { NULL, NULL },
+};
+
+/* Simple strstr() like function that takes len arguments for both haystack and needle. */
+static char *strfind(char *haystack, int hslen, const char *needle, int ndlen)
+{
+ int match = 0;
+ int i, j;
+
+ for( i = 0; i < hslen; i++ )
+ {
+ if( haystack[i] == needle[0] )
+ {
+ match = ((ndlen == 1) || ((i + ndlen) <= hslen));
+
+ for( j = 1; (j < ndlen) && ((i + j) < hslen); j++ )
+ {
+ if( haystack[i+j] != needle[j] )
+ {
+ match = 0;
+ break;
+ }
+ }
+
+ if( match )
+ return &haystack[i];
+ }
+ }
+
+ return NULL;
+}
+
+struct template_parser * template_open(const char *file)
+{
+ struct stat s;
+ struct template_parser *parser;
+
+ if (!(parser = malloc(sizeof(*parser))))
+ goto err;
+
+ memset(parser, 0, sizeof(*parser));
+ parser->fd = -1;
+ parser->file = file;
+
+ if (stat(file, &s))
+ goto err;
+
+ if ((parser->fd = open(file, O_RDONLY)) < 0)
+ goto err;
+
+ parser->size = s.st_size;
+ parser->data = mmap(NULL, parser->size, PROT_READ, MAP_PRIVATE,
+ parser->fd, 0);
+
+ if (parser->data != MAP_FAILED)
+ {
+ parser->off = parser->data;
+ parser->cur_chunk.type = T_TYPE_INIT;
+ parser->cur_chunk.s = parser->data;
+ parser->cur_chunk.e = parser->data;
+
+ return parser;
+ }
+
+err:
+ template_close(parser);
+ return NULL;
+}
+
+struct template_parser * template_string(const char *str, uint32_t len)
+{
+ struct template_parser *parser;
+
+ if (!str) {
+ errno = EINVAL;
+ goto err;
+ }
+
+ if (!(parser = malloc(sizeof(*parser))))
+ goto err;
+
+ memset(parser, 0, sizeof(*parser));
+ parser->fd = -1;
+
+ parser->size = len;
+ parser->data = (char*)str;
+
+ parser->off = parser->data;
+ parser->cur_chunk.type = T_TYPE_INIT;
+ parser->cur_chunk.s = parser->data;
+ parser->cur_chunk.e = parser->data;
+
+ return parser;
+
+err:
+ template_close(parser);
+ return NULL;
+}
+
+void template_close(struct template_parser *parser)
+{
+ if (!parser)
+ return;
+
+ if (parser->gc != NULL)
+ free(parser->gc);
+
+ /* if file is not set, we were parsing a string */
+ if (parser->file) {
+ if ((parser->data != NULL) && (parser->data != MAP_FAILED))
+ munmap(parser->data, parser->size);
+
+ if (parser->fd >= 0)
+ close(parser->fd);
+ }
+
+ free(parser);
+}
+
+void template_text(struct template_parser *parser, const char *e)
+{
+ const char *s = parser->off;
+
+ if (s < (parser->data + parser->size))
+ {
+ if (parser->strip_after)
+ {
+ while ((s <= e) && isspace(*s))
+ s++;
+ }
+
+ parser->cur_chunk.type = T_TYPE_TEXT;
+ }
+ else
+ {
+ parser->cur_chunk.type = T_TYPE_EOF;
+ }
+
+ parser->cur_chunk.line = parser->line;
+ parser->cur_chunk.s = s;
+ parser->cur_chunk.e = e;
+}
+
+void template_code(struct template_parser *parser, const char *e)
+{
+ const char *s = parser->off;
+
+ parser->strip_before = 0;
+ parser->strip_after = 0;
+
+ if (*s == '-')
+ {
+ parser->strip_before = 1;
+ for (s++; (s <= e) && (*s == ' ' || *s == '\t'); s++);
+ }
+
+ if (*(e-1) == '-')
+ {
+ parser->strip_after = 1;
+ for (e--; (e >= s) && (*e == ' ' || *e == '\t'); e--);
+ }
+
+ switch (*s)
+ {
+ /* comment */
+ case '#':
+ s++;
+ parser->cur_chunk.type = T_TYPE_COMMENT;
+ break;
+
+ /* include */
+ case '+':
+ s++;
+ parser->cur_chunk.type = T_TYPE_INCLUDE;
+ break;
+
+ /* translate */
+ case ':':
+ s++;
+ parser->cur_chunk.type = T_TYPE_I18N;
+ break;
+
+ /* translate raw */
+ case '_':
+ s++;
+ parser->cur_chunk.type = T_TYPE_I18N_RAW;
+ break;
+
+ /* expr */
+ case '=':
+ s++;
+ parser->cur_chunk.type = T_TYPE_EXPR;
+ break;
+
+ /* code */
+ default:
+ parser->cur_chunk.type = T_TYPE_CODE;
+ break;
+ }
+
+ parser->cur_chunk.line = parser->line;
+ parser->cur_chunk.s = s;
+ parser->cur_chunk.e = e;
+}
+
+static const char *
+template_format_chunk(struct template_parser *parser, size_t *sz)
+{
+ const char *s, *p;
+ const char *head, *tail;
+ struct template_chunk *c = &parser->prv_chunk;
+ struct template_buffer *buf;
+
+ *sz = 0;
+ s = parser->gc = NULL;
+
+ if (parser->strip_before && c->type == T_TYPE_TEXT)
+ {
+ while ((c->e > c->s) && isspace(*(c->e - 1)))
+ c->e--;
+ }
+
+ /* empty chunk */
+ if (c->s == c->e)
+ {
+ if (c->type == T_TYPE_EOF)
+ {
+ *sz = 0;
+ s = NULL;
+ }
+ else
+ {
+ *sz = 1;
+ s = " ";
+ }
+ }
+
+ /* format chunk */
+ else if ((buf = buf_init(c->e - c->s)) != NULL)
+ {
+ if ((head = gen_code[c->type][0]) != NULL)
+ buf_append(buf, head, strlen(head));
+
+ switch (c->type)
+ {
+ case T_TYPE_TEXT:
+ luastr_escape(buf, c->s, c->e - c->s, 0);
+ break;
+
+ case T_TYPE_EXPR:
+ buf_append(buf, c->s, c->e - c->s);
+ for (p = c->s; p < c->e; p++)
+ parser->line += (*p == '\n');
+ break;
+
+ case T_TYPE_INCLUDE:
+ luastr_escape(buf, c->s, c->e - c->s, 0);
+ break;
+
+ case T_TYPE_I18N:
+ luastr_translate(buf, c->s, c->e - c->s, 1);
+ break;
+
+ case T_TYPE_I18N_RAW:
+ luastr_translate(buf, c->s, c->e - c->s, 0);
+ break;
+
+ case T_TYPE_CODE:
+ buf_append(buf, c->s, c->e - c->s);
+ for (p = c->s; p < c->e; p++)
+ parser->line += (*p == '\n');
+ break;
+ }
+
+ if ((tail = gen_code[c->type][1]) != NULL)
+ buf_append(buf, tail, strlen(tail));
+
+ *sz = buf_length(buf);
+ s = parser->gc = buf_destroy(buf);
+
+ if (!*sz)
+ {
+ *sz = 1;
+ s = " ";
+ }
+ }
+
+ return s;
+}
+
+const char *template_reader(lua_State *L, void *ud, size_t *sz)
+{
+ struct template_parser *parser = ud;
+ int rem = parser->size - (parser->off - parser->data);
+ char *tag;
+
+ parser->prv_chunk = parser->cur_chunk;
+
+ /* free previous string */
+ if (parser->gc)
+ {
+ free(parser->gc);
+ parser->gc = NULL;
+ }
+
+ /* before tag */
+ if (!parser->in_expr)
+ {
+ if ((tag = strfind(parser->off, rem, "<%", 2)) != NULL)
+ {
+ template_text(parser, tag);
+ parser->off = tag + 2;
+ parser->in_expr = 1;
+ }
+ else
+ {
+ template_text(parser, parser->data + parser->size);
+ parser->off = parser->data + parser->size;
+ }
+ }
+
+ /* inside tag */
+ else
+ {
+ if ((tag = strfind(parser->off, rem, "%>", 2)) != NULL)
+ {
+ template_code(parser, tag);
+ parser->off = tag + 2;
+ parser->in_expr = 0;
+ }
+ else
+ {
+ /* unexpected EOF */
+ template_code(parser, parser->data + parser->size);
+
+ *sz = 1;
+ return "\033";
+ }
+ }
+
+ return template_format_chunk(parser, sz);
+}
+
+int template_error(lua_State *L, struct template_parser *parser)
+{
+ const char *err = luaL_checkstring(L, -1);
+ const char *off = parser->prv_chunk.s;
+ const char *ptr;
+ char msg[1024];
+ int line = 0;
+ int chunkline = 0;
+
+ if ((ptr = strfind((char *)err, strlen(err), "]:", 2)) != NULL)
+ {
+ chunkline = atoi(ptr + 2) - parser->prv_chunk.line;
+
+ while (*ptr)
+ {
+ if (*ptr++ == ' ')
+ {
+ err = ptr;
+ break;
+ }
+ }
+ }
+
+ if (strfind((char *)err, strlen(err), "'char(27)'", 10) != NULL)
+ {
+ off = parser->data + parser->size;
+ err = "'%>' expected before end of file";
+ chunkline = 0;
+ }
+
+ for (ptr = parser->data; ptr < off; ptr++)
+ if (*ptr == '\n')
+ line++;
+
+ snprintf(msg, sizeof(msg), "Syntax error in %s:%d: %s",
+ parser->file ? parser->file : "[string]", line + chunkline, err ? err : "(unknown error)");
+
+ lua_pushnil(L);
+ lua_pushinteger(L, line + chunkline);
+ lua_pushstring(L, msg);
+
+ return 3;
+}
--- /dev/null
+/*
+ * LuCI Template - Parser header
+ *
+ * Copyright (C) 2009 Jo-Philipp Wich <jow@openwrt.org>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _TEMPLATE_PARSER_H_
+#define _TEMPLATE_PARSER_H_
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+
+#include <lua.h>
+#include <lualib.h>
+#include <lauxlib.h>
+
+
+/* code types */
+#define T_TYPE_INIT 0
+#define T_TYPE_TEXT 1
+#define T_TYPE_COMMENT 2
+#define T_TYPE_EXPR 3
+#define T_TYPE_INCLUDE 4
+#define T_TYPE_I18N 5
+#define T_TYPE_I18N_RAW 6
+#define T_TYPE_CODE 7
+#define T_TYPE_EOF 8
+
+
+struct template_chunk {
+ const char *s;
+ const char *e;
+ int type;
+ int line;
+};
+
+/* parser state */
+struct template_parser {
+ int fd;
+ uint32_t size;
+ char *data;
+ char *off;
+ char *gc;
+ int line;
+ int in_expr;
+ int strip_before;
+ int strip_after;
+ struct template_chunk prv_chunk;
+ struct template_chunk cur_chunk;
+ const char *file;
+};
+
+struct template_parser * template_open(const char *file);
+struct template_parser * template_string(const char *str, uint32_t len);
+void template_close(struct template_parser *parser);
+
+const char *template_reader(lua_State *L, void *ud, size_t *sz);
+int template_error(lua_State *L, struct template_parser *parser);
+
+#endif
--- /dev/null
+/*
+ * LuCI Template - Utility functions
+ *
+ * Copyright (C) 2010 Jo-Philipp Wich <jow@openwrt.org>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "template_utils.h"
+#include "template_lmo.h"
+
+/* initialize a buffer object */
+struct template_buffer * buf_init(int size)
+{
+ struct template_buffer *buf;
+
+ if (size <= 0)
+ size = 1024;
+
+ buf = (struct template_buffer *)malloc(sizeof(struct template_buffer));
+
+ if (buf != NULL)
+ {
+ buf->fill = 0;
+ buf->size = size;
+ buf->data = malloc(buf->size);
+
+ if (buf->data != NULL)
+ {
+ buf->dptr = buf->data;
+ buf->data[0] = 0;
+
+ return buf;
+ }
+
+ free(buf);
+ }
+
+ return NULL;
+}
+
+/* grow buffer */
+int buf_grow(struct template_buffer *buf, int size)
+{
+ unsigned int off = (buf->dptr - buf->data);
+ char *data;
+
+ if (size <= 0)
+ size = 1024;
+
+ data = realloc(buf->data, buf->size + size);
+
+ if (data != NULL)
+ {
+ buf->data = data;
+ buf->dptr = data + off;
+ buf->size += size;
+
+ return buf->size;
+ }
+
+ return 0;
+}
+
+/* put one char into buffer object */
+int buf_putchar(struct template_buffer *buf, char c)
+{
+ if( ((buf->fill + 1) >= buf->size) && !buf_grow(buf, 0) )
+ return 0;
+
+ *(buf->dptr++) = c;
+ *(buf->dptr) = 0;
+
+ buf->fill++;
+ return 1;
+}
+
+/* append data to buffer */
+int buf_append(struct template_buffer *buf, const char *s, int len)
+{
+ if ((buf->fill + len + 1) >= buf->size)
+ {
+ if (!buf_grow(buf, len + 1))
+ return 0;
+ }
+
+ memcpy(buf->dptr, s, len);
+ buf->fill += len;
+ buf->dptr += len;
+
+ *(buf->dptr) = 0;
+
+ return len;
+}
+
+/* read buffer length */
+int buf_length(struct template_buffer *buf)
+{
+ return buf->fill;
+}
+
+/* destroy buffer object and return pointer to data */
+char * buf_destroy(struct template_buffer *buf)
+{
+ char *data = buf->data;
+
+ free(buf);
+ return data;
+}
+
+
+/* calculate the number of expected continuation chars */
+static inline int mb_num_chars(unsigned char c)
+{
+ if ((c & 0xE0) == 0xC0)
+ return 2;
+ else if ((c & 0xF0) == 0xE0)
+ return 3;
+ else if ((c & 0xF8) == 0xF0)
+ return 4;
+ else if ((c & 0xFC) == 0xF8)
+ return 5;
+ else if ((c & 0xFE) == 0xFC)
+ return 6;
+
+ return 1;
+}
+
+/* test whether the given byte is a valid continuation char */
+static inline int mb_is_cont(unsigned char c)
+{
+ return ((c >= 0x80) && (c <= 0xBF));
+}
+
+/* test whether the byte sequence at the given pointer with the given
+ * length is the shortest possible representation of the code point */
+static inline int mb_is_shortest(unsigned char *s, int n)
+{
+ switch (n)
+ {
+ case 2:
+ /* 1100000x (10xxxxxx) */
+ return !(((*s >> 1) == 0x60) &&
+ ((*(s+1) >> 6) == 0x02));
+
+ case 3:
+ /* 11100000 100xxxxx (10xxxxxx) */
+ return !((*s == 0xE0) &&
+ ((*(s+1) >> 5) == 0x04) &&
+ ((*(s+2) >> 6) == 0x02));
+
+ case 4:
+ /* 11110000 1000xxxx (10xxxxxx 10xxxxxx) */
+ return !((*s == 0xF0) &&
+ ((*(s+1) >> 4) == 0x08) &&
+ ((*(s+2) >> 6) == 0x02) &&
+ ((*(s+3) >> 6) == 0x02));
+
+ case 5:
+ /* 11111000 10000xxx (10xxxxxx 10xxxxxx 10xxxxxx) */
+ return !((*s == 0xF8) &&
+ ((*(s+1) >> 3) == 0x10) &&
+ ((*(s+2) >> 6) == 0x02) &&
+ ((*(s+3) >> 6) == 0x02) &&
+ ((*(s+4) >> 6) == 0x02));
+
+ case 6:
+ /* 11111100 100000xx (10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx) */
+ return !((*s == 0xF8) &&
+ ((*(s+1) >> 2) == 0x20) &&
+ ((*(s+2) >> 6) == 0x02) &&
+ ((*(s+3) >> 6) == 0x02) &&
+ ((*(s+4) >> 6) == 0x02) &&
+ ((*(s+5) >> 6) == 0x02));
+ }
+
+ return 1;
+}
+
+/* test whether the byte sequence at the given pointer with the given
+ * length is an UTF-16 surrogate */
+static inline int mb_is_surrogate(unsigned char *s, int n)
+{
+ return ((n == 3) && (*s == 0xED) && (*(s+1) >= 0xA0) && (*(s+1) <= 0xBF));
+}
+
+/* test whether the byte sequence at the given pointer with the given
+ * length is an illegal UTF-8 code point */
+static inline int mb_is_illegal(unsigned char *s, int n)
+{
+ return ((n == 3) && (*s == 0xEF) && (*(s+1) == 0xBF) &&
+ (*(s+2) >= 0xBE) && (*(s+2) <= 0xBF));
+}
+
+
+/* scan given source string, validate UTF-8 sequence and store result
+ * in given buffer object */
+static int _validate_utf8(unsigned char **s, int l, struct template_buffer *buf)
+{
+ unsigned char *ptr = *s;
+ unsigned int o = 0, v, n;
+
+ /* ascii byte without null */
+ if ((*(ptr+0) >= 0x01) && (*(ptr+0) <= 0x7F))
+ {
+ if (!buf_putchar(buf, *ptr++))
+ return 0;
+
+ o = 1;
+ }
+
+ /* multi byte sequence */
+ else if ((n = mb_num_chars(*ptr)) > 1)
+ {
+ /* count valid chars */
+ for (v = 1; (v <= n) && ((o+v) < l) && mb_is_cont(*(ptr+v)); v++);
+
+ switch (n)
+ {
+ case 6:
+ case 5:
+ /* five and six byte sequences are always invalid */
+ if (!buf_putchar(buf, '?'))
+ return 0;
+
+ break;
+
+ default:
+ /* if the number of valid continuation bytes matches the
+ * expected number and if the sequence is legal, copy
+ * the bytes to the destination buffer */
+ if ((v == n) && mb_is_shortest(ptr, n) &&
+ !mb_is_surrogate(ptr, n) && !mb_is_illegal(ptr, n))
+ {
+ /* copy sequence */
+ if (!buf_append(buf, (char *)ptr, n))
+ return 0;
+ }
+
+ /* the found sequence is illegal, skip it */
+ else
+ {
+ /* invalid sequence */
+ if (!buf_putchar(buf, '?'))
+ return 0;
+ }
+
+ break;
+ }
+
+ /* advance beyond the last found valid continuation char */
+ o = v;
+ ptr += v;
+ }
+
+ /* invalid byte (0x00) */
+ else
+ {
+ if (!buf_putchar(buf, '?')) /* or 0xEF, 0xBF, 0xBD */
+ return 0;
+
+ o = 1;
+ ptr++;
+ }
+
+ *s = ptr;
+ return o;
+}
+
+/* sanitize given string and replace all invalid UTF-8 sequences with "?" */
+char * utf8(const char *s, unsigned int l)
+{
+ struct template_buffer *buf = buf_init(l);
+ unsigned char *ptr = (unsigned char *)s;
+ unsigned int v, o;
+
+ if (!buf)
+ return NULL;
+
+ for (o = 0; o < l; o++)
+ {
+ /* ascii char */
+ if ((*ptr >= 0x01) && (*ptr <= 0x7F))
+ {
+ if (!buf_putchar(buf, (char)*ptr++))
+ break;
+ }
+
+ /* invalid byte or multi byte sequence */
+ else
+ {
+ if (!(v = _validate_utf8(&ptr, l - o, buf)))
+ break;
+
+ o += (v - 1);
+ }
+ }
+
+ return buf_destroy(buf);
+}
+
+/* Sanitize given string and strip all invalid XML bytes
+ * Validate UTF-8 sequences
+ * Escape XML control chars */
+char * pcdata(const char *s, unsigned int l)
+{
+ struct template_buffer *buf = buf_init(l);
+ unsigned char *ptr = (unsigned char *)s;
+ unsigned int o, v;
+ char esq[8];
+ int esl;
+
+ if (!buf)
+ return NULL;
+
+ for (o = 0; o < l; o++)
+ {
+ /* Invalid XML bytes */
+ if (((*ptr >= 0x00) && (*ptr <= 0x08)) ||
+ ((*ptr >= 0x0B) && (*ptr <= 0x0C)) ||
+ ((*ptr >= 0x0E) && (*ptr <= 0x1F)) ||
+ (*ptr == 0x7F))
+ {
+ ptr++;
+ }
+
+ /* Escapes */
+ else if ((*ptr == 0x26) ||
+ (*ptr == 0x27) ||
+ (*ptr == 0x22) ||
+ (*ptr == 0x3C) ||
+ (*ptr == 0x3E))
+ {
+ esl = snprintf(esq, sizeof(esq), "&#%i;", *ptr);
+
+ if (!buf_append(buf, esq, esl))
+ break;
+
+ ptr++;
+ }
+
+ /* ascii char */
+ else if (*ptr <= 0x7F)
+ {
+ buf_putchar(buf, (char)*ptr++);
+ }
+
+ /* multi byte sequence */
+ else
+ {
+ if (!(v = _validate_utf8(&ptr, l - o, buf)))
+ break;
+
+ o += (v - 1);
+ }
+ }
+
+ return buf_destroy(buf);
+}
+
+char * striptags(const char *s, unsigned int l)
+{
+ struct template_buffer *buf = buf_init(l);
+ unsigned char *ptr = (unsigned char *)s;
+ unsigned char *end = ptr + l;
+ unsigned char *tag;
+ unsigned char prev;
+ char esq[8];
+ int esl;
+
+ for (prev = ' '; ptr < end; ptr++)
+ {
+ if ((*ptr == '<') && ((ptr + 2) < end) &&
+ ((*(ptr + 1) == '/') || isalpha(*(ptr + 1))))
+ {
+ for (tag = ptr; tag < end; tag++)
+ {
+ if (*tag == '>')
+ {
+ if (!isspace(prev))
+ buf_putchar(buf, ' ');
+
+ ptr = tag;
+ prev = ' ';
+ break;
+ }
+ }
+ }
+ else if (isspace(*ptr))
+ {
+ if (!isspace(prev))
+ buf_putchar(buf, *ptr);
+
+ prev = *ptr;
+ }
+ else
+ {
+ switch(*ptr)
+ {
+ case '"':
+ case '\'':
+ case '<':
+ case '>':
+ case '&':
+ esl = snprintf(esq, sizeof(esq), "&#%i;", *ptr);
+ buf_append(buf, esq, esl);
+ break;
+
+ default:
+ buf_putchar(buf, *ptr);
+ break;
+ }
+
+ prev = *ptr;
+ }
+ }
+
+ return buf_destroy(buf);
+}
+
+void luastr_escape(struct template_buffer *out, const char *s, unsigned int l,
+ int escape_xml)
+{
+ int esl;
+ char esq[8];
+ char *ptr;
+
+ for (ptr = (char *)s; ptr < (s + l); ptr++)
+ {
+ switch (*ptr)
+ {
+ case '\\':
+ buf_append(out, "\\\\", 2);
+ break;
+
+ case '"':
+ if (escape_xml)
+ buf_append(out, """, 5);
+ else
+ buf_append(out, "\\\"", 2);
+ break;
+
+ case '\n':
+ buf_append(out, "\\n", 2);
+ break;
+
+ case '\'':
+ case '&':
+ case '<':
+ case '>':
+ if (escape_xml)
+ {
+ esl = snprintf(esq, sizeof(esq), "&#%i;", *ptr);
+ buf_append(out, esq, esl);
+ break;
+ }
+
+ default:
+ buf_putchar(out, *ptr);
+ }
+ }
+}
+
+void luastr_translate(struct template_buffer *out, const char *s, unsigned int l,
+ int escape_xml)
+{
+ int trlen, idlen = l, ctxtlen = 0, esc = 0;
+ const char *p, *msgid = s, *msgctxt = NULL;
+ char *tr;
+
+ for (p = s; p < s + l; p++) {
+ if (esc) {
+ esc = 0;
+ }
+ else if (*p == '\\') {
+ esc = 1;
+ }
+ else if (*p == '|') {
+ idlen = p - s;
+ msgctxt = p + 1;
+ ctxtlen = s + l - msgctxt;
+ break;
+ }
+ }
+
+ if (!lmo_translate_ctxt(msgid, idlen, msgctxt, ctxtlen, &tr, &trlen))
+ luastr_escape(out, tr, trlen, escape_xml);
+ else
+ luastr_escape(out, s, l, escape_xml);
+}
--- /dev/null
+/*
+ * LuCI Template - Utility header
+ *
+ * Copyright (C) 2010-2012 Jo-Philipp Wich <jow@openwrt.org>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _TEMPLATE_UTILS_H_
+#define _TEMPLATE_UTILS_H_
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+
+/* buffer object */
+struct template_buffer {
+ char *data;
+ char *dptr;
+ unsigned int size;
+ unsigned int fill;
+};
+
+struct template_buffer * buf_init(int size);
+int buf_grow(struct template_buffer *buf, int size);
+int buf_putchar(struct template_buffer *buf, char c);
+int buf_append(struct template_buffer *buf, const char *s, int len);
+int buf_length(struct template_buffer *buf);
+char * buf_destroy(struct template_buffer *buf);
+
+char * utf8(const char *s, unsigned int l);
+char * pcdata(const char *s, unsigned int l);
+char * striptags(const char *s, unsigned int l);
+
+void luastr_escape(struct template_buffer *out, const char *s, unsigned int l, int escape_xml);
+void luastr_translate(struct template_buffer *out, const char *s, unsigned int l, int escape_xml);
+
+#endif
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI Network Administration
-LUCI_DEPENDS:=+luci-base +libiwinfo-lua +rpcd-mod-iwinfo
+LUCI_DEPENDS:=+luci-base +rpcd-mod-iwinfo
PKG_LICENSE:=Apache-2.0
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI Status Pages
-LUCI_DEPENDS:=+luci-base +libiwinfo +libiwinfo-lua
+LUCI_DEPENDS:=+luci-base +libiwinfo +rpcd-mod-iwinfo
PKG_BUILD_DEPENDS:=iwinfo
PKG_LICENSE:=Apache-2.0
+++ /dev/null
-<%#
- Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008-2018 Jo-Philipp Wich <jo@mein.io>
- Licensed to the public under the Apache License 2.0.
--%>
-
-<%+header%>
-
-<h2 name="content"><%:Status%></h2>
-
-<div id="view">
- <div class="spinning"><%:Loading view…%></div>
-</div>
-
-<script type="text/javascript">//<![CDATA[
-function progressbar(query, value, max, byte)
-{
- var pg = document.querySelector(query),
- vn = parseInt(value) || 0,
- mn = parseInt(max) || 100,
- fv = byte ? String.format('%1024.2mB', value) : value,
- fm = byte ? String.format('%1024.2mB', max) : max,
- pc = Math.floor((100 / mn) * vn);
-
- if (pg) {
- pg.firstElementChild.style.width = pc + '%';
- pg.setAttribute('title', '%s / %s (%d%%)'.format(fv, fm, pc));
- }
-}
-
-function renderBox(title, active, childs) {
- childs = childs || [];
- childs.unshift(L.itemlist(E('span'), [].slice.call(arguments, 3)));
-
- return E('div', { class: 'ifacebox' }, [
- E('div', { class: 'ifacebox-head center ' + (active ? 'active' : '') },
- E('strong', title)),
- E('div', { class: 'ifacebox-body left' }, childs)
- ]);
-}
-
-function renderBadge(icon, title) {
- return E('span', { class: 'ifacebadge' }, [
- E('img', { src: icon, title: title || '' }),
- L.itemlist(E('span'), [].slice.call(arguments, 2))
- ]);
-}
-
-//]]></script>
-
-<div class="includes" style="display:none">
-<%-
- local util = require "luci.util"
- local fs = require "nixio.fs"
-
- local incdir = util.libpath() .. "/view/admin_status/index/"
- if fs.access(incdir) then
- local _, inc
- local includes = {}
- for inc in fs.dir(incdir) do
- if inc:match("%.htm$") then
- includes[#includes + 1] = inc:gsub("%.htm$", "")
- end
- end
- for _, inc in luci.util.vspairs(includes) do
- include("admin_status/index/" .. inc)
- end
- end
--%>
-</div>
-
-<script type="text/javascript">
- L.require('ui').then(function(ui) {
- ui.instantiateView('status/index');
- });
-</script>
-
-<%+footer%>
--- /dev/null
+{#
+ Copyright 2008 Steven Barth <steven@midlink.org>
+ Copyright 2008-2022 Jo-Philipp Wich <jo@mein.io>
+ Licensed to the public under the Apache License 2.0.
+-#}
+
+{% include('header') %}
+
+<h2 name="content">{{ _('Status') }}</h2>
+
+<div id="view">
+ <div class="spinning">{{ _('Loading view…') }}</div>
+</div>
+
+<script type="text/javascript">//<![CDATA[
+function progressbar(query, value, max, byte)
+{
+ var pg = document.querySelector(query),
+ vn = parseInt(value) || 0,
+ mn = parseInt(max) || 100,
+ fv = byte ? String.format('%1024.2mB', value) : value,
+ fm = byte ? String.format('%1024.2mB', max) : max,
+ pc = Math.floor((100 / mn) * vn);
+
+ if (pg) {
+ pg.firstElementChild.style.width = pc + '%';
+ pg.setAttribute('title', '%s / %s (%d%%)'.format(fv, fm, pc));
+ }
+}
+
+function renderBox(title, active, childs) {
+ childs = childs || [];
+ childs.unshift(L.itemlist(E('span'), [].slice.call(arguments, 3)));
+
+ return E('div', { class: 'ifacebox' }, [
+ E('div', { class: 'ifacebox-head center ' + (active ? 'active' : '') },
+ E('strong', title)),
+ E('div', { class: 'ifacebox-body left' }, childs)
+ ]);
+}
+
+function renderBadge(icon, title) {
+ return E('span', { class: 'ifacebadge' }, [
+ E('img', { src: icon, title: title || '' }),
+ L.itemlist(E('span'), [].slice.call(arguments, 2))
+ ]);
+}
+
+//]]></script>
+
+<div class="includes" style="display:none">
+{%
+ let lua_available = true;
+
+ try { require('lua'); }
+ catch(err) { lua_available = false; }
+
+ if (lua_available)
+ include('admin_status/luaindex');
+%}
+</div>
+
+<script type="text/javascript">
+ L.require('ui').then(function(ui) {
+ ui.instantiateView('status/index');
+ });
+</script>
+
+{% include('footer') %}
+++ /dev/null
--- Copyright 2008 Steven Barth <steven@midlink.org>
--- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
--- Licensed to the public under the Apache License 2.0.
-
-if luci.http.formvalue("cbid.luci.1._list") then
- luci.http.redirect(luci.dispatcher.build_url("admin/system/flashops/backupfiles") .. "?display=list")
-elseif luci.http.formvalue("cbid.luci.1._edit") then
- luci.http.redirect(luci.dispatcher.build_url("admin/system/flashops/backupfiles") .. "?display=edit")
- return
-end
-
-m = SimpleForm("luci", translate("Backup file list"))
-m:append(Template("admin_system/backupfiles"))
-
-if luci.http.formvalue("display") ~= "list" then
- f = m:section(SimpleSection, nil, translate("This is a list of shell glob patterns for matching files and directories to include during sysupgrade. Modified files in /etc/config/ and certain other configurations are automatically preserved."))
-
- l = f:option(Button, "_list", translate("Show current backup file list"))
- l.inputtitle = translate("Open list...")
- l.inputstyle = "apply"
-
- c = f:option(TextValue, "_custom")
- c.forcewrite = true
- c.rmempty = true
- c.cols = 70
- c.rows = 30
-
- c.cfgvalue = function(self, section)
- return nixio.fs.readfile("/etc/sysupgrade.conf")
- end
-
- m.handle = function(self, state, data)
- if state == FORM_VALID then
- if data._custom then
- nixio.fs.writefile("/etc/sysupgrade.conf", data._custom:gsub("\r\n", "\n"))
- else
- nixio.fs.writefile("/etc/sysupgrade.conf", "")
- end
- end
- return true
- end
-else
- m.submit = false
- m.reset = false
-
- f = m:section(SimpleSection, nil, translate("Below is the determined list of files to backup. It consists of changed configuration files marked by opkg, essential base files and the user defined backup patterns."))
-
- l = f:option(Button, "_edit", translate("Back to configuration"))
- l.inputtitle = translate("Close list...")
- l.inputstyle = "link"
-
-
- d = f:option(DummyValue, "_detected")
- d.rawhtml = true
- d.cfgvalue = function(s)
- local list = io.popen(
- "( find $(sed -ne '/^[[:space:]]*$/d; /^#/d; p' /etc/sysupgrade.conf " ..
- "/lib/upgrade/keep.d/* 2>/dev/null) -type f 2>/dev/null; " ..
- "opkg list-changed-conffiles ) | sort -u"
- )
-
- if list then
- local files = { "<ul>" }
-
- while true do
- local ln = list:read("*l")
- if not ln then
- break
- else
- files[#files+1] = "<li>"
- files[#files+1] = luci.xml.pcdata(ln)
- files[#files+1] = "</li>"
- end
- end
-
- list:close()
- files[#files+1] = "</ul>"
-
- return table.concat(files, "")
- end
-
- return "<em>" .. translate("No files found") .. "</em>"
- end
-
-end
-
-return m
include $(TOPDIR)/rules.mk
LUCI_TITLE:=Support for OpenConnect VPN
-LUCI_DEPENDS:=+openconnect
+LUCI_DEPENDS:=+openconnect +luci-lua-runtime
include ../../luci.mk
include $(TOPDIR)/rules.mk
LUCI_TITLE:=Support for OpenFortivpn
-LUCI_DEPENDS:=+openfortivpn
+LUCI_DEPENDS:=+openfortivpn +luci-lua-runtime
include ../../luci.mk
include $(TOPDIR)/rules.mk
LUCI_TITLE:=Support for WireGuard VPN
-LUCI_DEPENDS:=+wireguard-tools +libuci-lua
+LUCI_DEPENDS:=+wireguard-tools +ucode
LUCI_PKGARCH:=all
include ../../luci.mk
+++ /dev/null
-#!/usr/bin/env lua
-
-local json = require "luci.jsonc"
-local util = require "luci.util"
-local sys = require "luci.sys"
-local io = require "io"
-local uci = require "uci"
-local fs = require "nixio.fs"
-
-local methods = {
- generatePsk = {
- call = function()
- local psk = sys.exec("wg genpsk"):sub(1, -2)
-
- return {psk = psk}
- end
- },
- generateKeyPair = {
- call = function()
- local prv = sys.exec("wg genkey 2>/dev/null"):sub(1, -2)
- local pub = sys.exec("echo %s | wg pubkey 2>/dev/null" % util.shellquote(prv)):sub(1, -2)
-
- return {keys = {priv = prv, pub = pub}}
- end
- },
- getPublicAndPrivateKeyFromPrivate = {
- args = {privkey = "privkey"},
- call = function(args)
- local pubkey = sys.exec("echo %s | wg pubkey 2>/dev/null" % util.shellquote(args.privkey)):sub(1, -2)
-
- return {keys = {priv = args.privkey, pub = pubkey}}
- end
- },
- getWgInstances = {
- call = function()
- local data = {}
- local last_device = ""
- local qr_pubkey = {}
-
- local wg_dump = io.popen("wg show all dump 2>/dev/null")
- if wg_dump then
- local line
- for line in wg_dump:lines() do
- local line = string.split(line, "\t")
- if not (last_device == line[1]) then
- last_device = line[1]
- data[line[1]] = {
- name = line[1],
- public_key = line[3],
- listen_port = line[4],
- fwmark = line[5],
- peers = {}
- }
- if not line[3] or line[3] == "" or line[3] == "(none)" then
- qr_pubkey[line[1]] = ""
- else
- qr_pubkey[line[1]] = "PublicKey = " .. line[3]
- end
- else
- local peer_name
- local cur = uci.cursor()
-
- cur:foreach(
- "network",
- "wireguard_" .. line[1],
- function(s)
- if s.public_key == line[2] then
- peer_name = s.description
- end
- end
- )
-
- local peer = {
- name = peer_name,
- public_key = line[2],
- endpoint = line[4],
- allowed_ips = {},
- latest_handshake = line[6],
- transfer_rx = line[7],
- transfer_tx = line[8],
- persistent_keepalive = line[9]
- }
-
- if not (line[4] == "(none)") then
- local ipkey, ipvalue
- for ipkey, ipvalue in pairs(string.split(line[5], ",")) do
- if #ipvalue > 0 then
- table.insert(peer["allowed_ips"], ipvalue)
- end
- end
- end
-
- table.insert(data[line[1]].peers, peer)
- end
- end
- end
-
- return data
- end
- }
-}
-
-local function parseInput()
- local parse = json.new()
- local done, err
-
- while true do
- local chunk = io.read(4096)
- if not chunk then
- break
- elseif not done and not err then
- done, err = parse:parse(chunk)
- end
- end
-
- if not done then
- print(json.stringify({error = err or "Incomplete input"}))
- os.exit(1)
- end
-
- return parse:get()
-end
-
-local function validateArgs(func, uargs)
- local method = methods[func]
- if not method then
- print(json.stringify({error = "Method not found"}))
- os.exit(1)
- end
-
- if type(uargs) ~= "table" then
- print(json.stringify({error = "Invalid arguments"}))
- os.exit(1)
- end
-
- uargs.ubus_rpc_session = nil
-
- local k, v
- local margs = method.args or {}
- for k, v in pairs(uargs) do
- if margs[k] == nil or (v ~= nil and type(v) ~= type(margs[k])) then
- print(json.stringify({error = "Invalid arguments"}))
- os.exit(1)
- end
- end
-
- return method
-end
-
-if arg[1] == "list" then
- local _, method, rv = nil, nil, {}
- for _, method in pairs(methods) do
- rv[_] = method.args or {}
- end
- print((json.stringify(rv):gsub(":%[%]", ":{}")))
-elseif arg[1] == "call" then
- local args = parseInput()
- local method = validateArgs(arg[2], args)
- local result, code = method.call(args)
- print((json.stringify(result):gsub("^%[%]$", "{}")))
- os.exit(code or 0)
-end
--- /dev/null
+// Copyright 2022 Jo-Philipp Wich <jo@mein.io>
+// Licensed to the public under the Apache License 2.0.
+
+'use strict';
+
+import { cursor } from 'uci';
+import { popen } from 'fs';
+
+
+function shellquote(s) {
+ return `'${replace(s ?? '', "'", "'\\''")}'`;
+}
+
+function command(cmd) {
+ return trim(popen(cmd)?.read?.('all'));
+}
+
+
+const methods = {
+ generatePsk: {
+ call: function() {
+ return { psk: command('wg genpsk 2>/dev/null') };
+ }
+ },
+
+ generateKeyPair: {
+ call: function() {
+ const priv = command('wg genkey 2>/dev/null');
+ const pub = command(`echo ${shellquote(priv)} | wg pubkey 2>/dev/null`);
+
+ return { keys: { priv, pub } };
+ }
+ },
+
+ getPublicAndPrivateKeyFromPrivate: {
+ args: { privkey: "privkey" },
+ call: function(req) {
+ const priv = req.args?.privkey;
+ const pub = command(`echo ${shellquote(priv)} | wg pubkey 2>/dev/null`);
+
+ return { keys: { priv, pub } };
+ }
+ },
+
+ getWgInstances: {
+ call: function() {
+ const data = {};
+ let last_device;
+ let qr_pubkey = {};
+
+ const uci = cursor();
+ const wg_dump = popen("wg show all dump 2>/dev/null");
+
+ if (wg_dump) {
+ for (let line = wg_dump.read('line'); length(line); line = wg_dump.read('line')) {
+ const record = split(rtrim(line, '\n'), '\t');
+
+ if (last_device != record[0]) {
+ last_device = record[0];
+ data[last_device] = {
+ name: last_device,
+ public_key: record[2],
+ listen_port: record[3],
+ fwmark: record[4],
+ peers: []
+ };
+
+ if (!length(record[2]) || record[2] == '(none)')
+ qr_pubkey[last_device] = '';
+ else
+ qr_pubkey[last_device] = `PublicKey = ${record[2]}`;
+ }
+ else {
+ let peer_name;
+
+ uci.foreach('network', `wireguard_${last_device}`, (s) => {
+ if (s.public_key == record[1])
+ peer_name = s.description;
+ });
+
+ const peer = {
+ name: peer_name,
+ public_key: record[1],
+ endpoint: record[3],
+ allowed_ips: [],
+ latest_handshake: record[5],
+ transfer_rx: record[6],
+ transfer_tx: record[7],
+ persistent_keepalive: record[8]
+ };
+
+ if (record[3] != '(none)' && length(record[4]))
+ push(peer.allowed_ips, ...split(record[4], ','));
+
+ push(data[last_device].peers, peer);
+ }
+ }
+ }
+
+ return data;
+ }
+ }
+};
+
+return { 'luci.wireguard': methods };
+++ /dev/null
-bootstrap
\ No newline at end of file
+++ /dev/null
-bootstrap
\ No newline at end of file
+++ /dev/null
-<%#
- Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
- Copyright 2012 David Menting <david@nut-bolt.nl>
- Licensed to the public under the Apache License 2.0.
--%>
-
- <% if not blank_page then %>
- <% local ver = require "luci.version" %>
- </div>
- <footer>
- <span>
- <a href="https://github.com/openwrt/luci">Powered by <%= ver.luciname %> (<%= ver.luciversion %>)</a> / <%= ver.distversion %>
- </span>
- <ul class="breadcrumb pull-right" id="modemenu" style="display:none"></ul>
- </footer>
- <script type="text/javascript">L.require('menu-bootstrap')</script>
- <% end %>
- </body>
-</html>
-
+++ /dev/null
-<%#
- Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008-2016 Jo-Philipp Wich <jow@openwrt.org>
- Copyright 2012 David Menting <david@nut-bolt.nl>
- Licensed to the public under the Apache License 2.0.
--%>
-
-<%
- local sys = require "luci.sys"
- local util = require "luci.util"
- local http = require "luci.http"
- local disp = require "luci.dispatcher"
-
- local boardinfo = util.ubus("system", "board")
-
- local node = disp.context.dispatched
-
- local darkpref
-
- if theme == "bootstrap-dark" then
- darkpref = "true"
- elseif theme == "bootstrap-light" then
- darkpref = "false"
- end
-
- -- send as HTML5
- http.prepare_content("text/html")
--%>
-<!DOCTYPE html>
-<html lang="<%=luci.i18n.context.lang%>"<%= ifattr(darkpref ~= nil, "data-darkmode", darkpref) %>>
- <head>
- <meta charset="utf-8">
- <title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
- <% if darkpref == nil then %>
- <script type="text/javascript">
- var mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'),
- rootElement = document.querySelector(':root'),
- setDarkMode = function(match) { rootElement.setAttribute('data-darkmode', match.matches) };
-
- mediaQuery.addEventListener('change', setDarkMode);
- setDarkMode(mediaQuery);
- </script>
- <% end %>
- <meta name="viewport" content="initial-scale=1.0">
- <link rel="stylesheet" href="<%=media%>/cascade.css">
- <link rel="stylesheet" media="only screen and (max-device-width: 854px)" href="<%=media%>/mobile.css" type="text/css" />
- <link rel="shortcut icon" href="<%=media%>/favicon.png">
- <% if node and node.css then %>
- <link rel="stylesheet" href="<%=resource%>/<%=node.css%>">
- <% end -%>
- <% if css then %>
- <style title="text/css"><%= css %></style>
- <% end -%>
- <script src="<%=url('admin/translations', luci.i18n.context.lang)%><%# ?v=PKG_VERSION %>"></script>
- <script src="<%=resource%>/cbi.js"></script>
- </head>
-
- <body class="lang_<%=luci.i18n.context.lang%> <% if node then %><%= striptags( node.title ) %><%- end %>" data-page="<%= pcdata(table.concat(disp.context.requestpath, "-")) %>">
- <% if not blank_page then %>
- <header>
- <a class="brand" href="/"><%=striptags(boardinfo.hostname or "?")%></a>
- <ul class="nav" id="topmenu" style="display:none"></ul>
- <div id="indicators" class="pull-right"></div>
- </header>
-
- <div id="maincontent" class="container">
- <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
- <div class="alert-message warning">
- <h4><%:No password set!%></h4>
- <p><%:There is no password set on this router. Please configure a root password to protect the web interface.%></p>
- <% if disp.lookup("admin/system/admin") then %>
- <div class="right"><a class="btn" href="<%=url("admin/system/admin")%>"><%:Go to password configuration...%></a></div>
- <% end %>
- </div>
- <%- end -%>
-
- <%- if boardinfo.rootfs_type == "initramfs" then -%>
- <div class="alert-message warning">
- <h4><%:System running in recovery (initramfs) mode.%></h4>
- <p><%:No changes to settings will be stored and are lost after rebooting. This mode should only be used to install a firmware upgrade%></p>
- <% if disp.lookup("admin/system/flash") then %>
- <div class="right"><a class="btn" href="<%=url("admin/system/flash")%>"><%:Go to firmware upgrade...%></a></div>
- <% end %>
- </div>
- <%- end -%>
-
- <noscript>
- <div class="alert-message warning">
- <h4><%:JavaScript required!%></h4>
- <p><%:You must enable JavaScript in your browser or LuCI will not work properly.%></p>
- </div>
- </noscript>
-
- <div id="tabmenu" style="display:none"></div>
- <% end %>
+++ /dev/null
-<%#
- Copyright 2021 Jo-Philipp Wich <jo@mein.io>
- Licensed to the public under the Apache License 2.0.
--%>
-
-<%
- -- tell bootstrap's templates to not render header and footer
- blank_page = true
-%>
-
-<%+header%>
-
-<section hidden>
- <form method="post" class="cbi-map">
- <div class="cbi-section">
- <div class="cbi-section-node">
- <div class="cbi-value">
- <label class="cbi-value-title" for="luci_username"><%:Username%></label>
- <div class="cbi-value-field">
- <input name="luci_username" id="luci_username" type="text" autocomplete="username" <%=attr("value", duser)%>>
- </div>
- </div>
- <div class="cbi-value">
- <label class="cbi-value-title" for="luci_password"><%:Password%></label>
- <div class="cbi-value-field">
- <input name="luci_password" id="luci_password" type="password" autocomplete="current-password">
- </div>
- </div>
- </div>
- </div>
- </form>
-
- <hr>
-
- <% if fuser then %>
- <div class="alert-message error">
- <%:Invalid username and/or password! Please try again.%>
- </div>
- <% end %>
-
- <button class="btn cbi-button-positive important"><%:Login%></button>
-</section>
-
-<div id="view">
- <div class="spinning"><%:Loading view…%></div>
- <script type="text/javascript">
- L.require('ui').then(function(ui) {
- ui.instantiateView('bootstrap.sysauth');
- });
- </script>
-</div>
-
-<%+footer%>
--- /dev/null
+bootstrap
\ No newline at end of file
--- /dev/null
+bootstrap
\ No newline at end of file
--- /dev/null
+ {% if (!blank_page): %}
+ </div>
+ <footer>
+ <span>
+ Powered by
+ <a href="https://github.com/openwrt/luci">
+ {{ version.luciname }} ({{ version.luciversion }})</a>
+ /
+ <a href="{{ entityencode(version.disturl ?? '#', true) }}">
+ {{ version.distname }} {{ version.distversion }} ({{ version.distrevision }})</a>
+ {% if (lua_active): %}
+ / {{ _('Lua compatibility mode active') }}
+ {% endif %}
+ </span>
+ <ul class="breadcrumb pull-right" id="modemenu" style="display:none"></ul>
+ </footer>
+ <script type="text/javascript">L.require('menu-bootstrap')</script>
+ {% endif %}
+ </body>
+</html>
--- /dev/null
+{#
+ Copyright 2008 Steven Barth <steven@midlink.org>
+ Copyright 2012 David Menting <david@nut-bolt.nl>
+ Copyright 2008-2022 Jo-Philipp Wich <jo@mein.io>
+ Licensed to the public under the Apache License 2.0.
+-#}
+
+{%
+ import { getuid, getspnam } from 'luci.core';
+
+ const boardinfo = ubus.call('system', 'board');
+ const darkpref = (theme == 'bootstrap-dark' ? 'true' : (theme == 'bootstrap-light' ? 'false' : null));
+
+ http.prepare_content('text/html; charset=UTF-8');
+-%}
+
+<!DOCTYPE html>
+<html lang="{{ dispatcher.lang }}" {{ darkpref ? `data-darkmode="${darkpref}"` : '' }}>
+ <head>
+ <meta charset="utf-8">
+ <title>{{ striptags(`${boardinfo.hostname ?? '?'}${node ? ` - ${node.title}` : ''}`) }} - LuCI</title>
+ {% if (!darkpref): %}
+ <script type="text/javascript">
+ var mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'),
+ rootElement = document.querySelector(':root'),
+ setDarkMode = function(match) { rootElement.setAttribute('data-darkmode', match.matches) };
+
+ mediaQuery.addEventListener('change', setDarkMode);
+ setDarkMode(mediaQuery);
+ </script>
+ {% endif %}
+ <meta name="viewport" content="initial-scale=1.0">
+ <link rel="stylesheet" href="{{ media }}/cascade.css">
+ <link rel="stylesheet" media="only screen and (max-device-width: 854px)" href="{{ media }}/mobile.css" type="text/css" />
+ <link rel="shortcut icon" href="{{ media }}/favicon.png">
+ {% if (node?.css): %}
+ <link rel="stylesheet" href="{{ resource }}/{{ node.css }}">
+ {% endif %}
+ {% if (css): %}
+ <style title="text/css">{{ css }}</style>
+ {% endif %}
+ <script src="{{ dispatcher.build_url('admin/translations', dispatcher.lang) }}"></script>
+ <script src="{{ resource }}/cbi.js"></script>
+ </head>
+
+ <body class="lang_{{ dispatcher.lang }} {{ entityencode(striptags(node?.title ?? ''), true) }}" data-page="{{ entityencode(join('-', ctx.request_path), true) }}">
+ {% if (!blank_page): %}
+ <header>
+ <a class="brand" href="/">{{ striptags(boardinfo.hostname ?? '?') }}</a>
+ <ul class="nav" id="topmenu" style="display:none"></ul>
+ <div id="indicators" class="pull-right"></div>
+ </header>
+
+ <div id="maincontent" class="container">
+ {% if (getuid() == 0 && getspnam('root')?.pwdp === ''): %}
+ <div class="alert-message warning">
+ <h4>{{ _('No password set!') }}</h4>
+ <p>{{ _('There is no password set on this router. Please configure a root password to protect the web interface.') }}</p>
+ {% if (dispatcher.lookup("admin/system/admin")): %}
+ <div class="right"><a class="btn" href="{{ dispatcher.build_url("admin/system/admin") }}">{{ _('Go to password configuration...') }}</a></div>
+ {% endif %}
+ </div>
+ {% endif %}
+
+ {% if (boardinfo.rootfs_type == "initramfs"): %}
+ <div class="alert-message warning">
+ <h4>{{ _('System running in recovery (initramfs) mode.') }}</h4>
+ <p>{{ _('No changes to settings will be stored and are lost after rebooting. This mode should only be used to install a firmware upgrade') }}</p>
+ {% if (dispatcher.lookup("admin/system/flash")): %}
+ <div class="right"><a class="btn" href="{{ dispatcher.build_url("admin/system/flash") }}">{{ _('Go to firmware upgrade...') }}</a></div>
+ {% endif %}
+ </div>
+ {% endif %}
+
+ <noscript>
+ <div class="alert-message warning">
+ <h4>{{ _('JavaScript required!') }}</h4>
+ <p>{{ _('You must enable JavaScript in your browser or LuCI will not work properly.') }}</p>
+ </div>
+ </noscript>
+
+ <div id="tabmenu" style="display:none"></div>
+ {% endif %}
--- /dev/null
+{#
+ Copyright 2022 Jo-Philipp Wich <jo@mein.io>
+ Licensed to the public under the Apache License 2.0.
+-#}
+
+{% include('header', { blank_page: true }) %}
+
+<section hidden>
+ <form method="post" class="cbi-map">
+ <div class="cbi-section">
+ <div class="cbi-section-node">
+ <div class="cbi-value">
+ <label class="cbi-value-title" for="luci_username">{{ _('Username') }}</label>
+ <div class="cbi-value-field">
+ <input name="luci_username" id="luci_username" type="text" autocomplete="username" value="{{ entityencode(duser, true) }}">
+ </div>
+ </div>
+ <div class="cbi-value">
+ <label class="cbi-value-title" for="luci_password">{{ _('Password') }}</label>
+ <div class="cbi-value-field">
+ <input name="luci_password" id="luci_password" type="password" autocomplete="current-password">
+ </div>
+ </div>
+ </div>
+ </div>
+ </form>
+
+ <hr>
+
+ {% if (fuser): %}
+ <div class="alert-message error">
+ {{ _('Invalid username and/or password! Please try again.') }}
+ </div>
+ {% endif %}
+
+ <button class="btn cbi-button-positive important">{{ _('Login') }}</button>
+</section>
+
+<div id="view">
+ <div class="spinning">{{ _('Loading view…') }}</div>
+ <script type="text/javascript">
+ L.require('ui').then(function(ui) {
+ ui.instantiateView('bootstrap.sysauth');
+ });
+ </script>
+</div>
+
+{% include('footer', { blank_page: true }) %}
+++ /dev/null
-<%#
- Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI
-
- luci-theme-material
- Copyright 2015 Lutty Yang <lutty@wcan.in>
-
- Have a bug? Please create an issue here on GitHub!
- https://github.com/LuttyYang/luci-theme-material/issues
-
- luci-theme-bootstrap:
- Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
- Copyright 2012 David Menting <david@nut-bolt.nl>
-
- MUI:
- https://github.com/muicss/mui
-
- Licensed to the public under the Apache License 2.0
--%>
-
-<% local ver = require "luci.version" %>
- </div>
- <footer class="mobile-hide">
- <a href="https://github.com/openwrt/luci">Powered by <%= ver.luciname %> (<%= ver.luciversion %>)</a> / <%= ver.distversion %>
- </footer>
- </div>
-</div>
-
-<script type="text/javascript">L.require('menu-material')</script>
-
-</body>
-</html>
+++ /dev/null
-<%#
- Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI
-
- luci-theme-material
- Copyright 2015-2017 Lutty Yang <lutty@wcan.in>
-
- Have a bug? Please create an issue here on GitHub!
- https://github.com/LuttyYang/luci-theme-material/issues
-
- luci-theme-bootstrap:
- Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008-2016 Jo-Philipp Wich <jow@openwrt.org>
- Copyright 2012 David Menting <david@nut-bolt.nl>
-
- MUI:
- https://github.com/muicss/mui
-
- Licensed to the public under the Apache License 2.0
--%>
-
-<%
- local sys = require "luci.sys"
- local util = require "luci.util"
- local http = require "luci.http"
- local disp = require "luci.dispatcher"
- local ver = require "luci.version"
-
- local boardinfo = util.ubus("system", "board") or { }
-
- local node = disp.context.dispatched
- local path = table.concat(disp.context.path, "-")
-
- http.prepare_content("text/html; charset=UTF-8")
--%>
-<!DOCTYPE html>
-<html lang="<%=luci.i18n.context.lang%>">
-<head>
-<meta charset="utf-8">
-<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"/>
-<meta name="apple-mobile-web-app-capable" content="yes">
-<meta name="mobile-web-app-capable" content="yes">
-<meta name="theme-color" content="#09c">
-<meta name="msapplication-tap-highlight" content="no">
-<meta name="msapplication-TileColor" content="#09c">
-<meta name="application-name" content="<%=striptags( (boardinfo.hostname or "?") ) %> - LuCI">
-<meta name="apple-mobile-web-app-title" content="<%=striptags( (boardinfo.hostname or "?") ) %> - LuCI">
-<link rel="stylesheet" href="<%=media%>/cascade.css">
-<link rel="shortcut icon" href="<%=media%>/favicon.ico">
-<% if node and node.css then %>
-<link rel="stylesheet" href="<%=resource%>/<%=node.css%>">
-<% end -%>
-<script src="<%=url('admin/translations', luci.i18n.context.lang)%><%# ?v=PKG_VERSION %>"></script>
-<script src="<%=resource%>/cbi.js"></script>
-<title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
-<% if css then %><style title="text/css">
-<%= css %>
-</style>
-<% end -%>
-</head>
-<body class="lang_<%=luci.i18n.context.lang%> <% if luci.dispatcher.context.authsession then %>logged-in<% end %> <% if not (path == "") then %>node-<%= path %><% else %>node-main-login<% end %>" data-page="<%= pcdata(path) %>">
-<header>
- <div class="fill">
- <div class="container">
- <span class="showSide"></span>
- <a id="logo" href="<% if luci.dispatcher.context.authsession then %><%=url('admin/status/overview')%><% else %>#<% end %>"><img src="<%=media%>/brand.png" alt="OpenWrt"></a>
- <a class="brand" href="#"><%=striptags(boardinfo.hostname or "?")%></a>
- <span class="status" id="indicators"></span>
- </div>
- </div>
-</header>
-<div class="main">
- <div style="" class="loading"><span><div class="loading-img"></div><%:Collecting data...%></span></div>
- <div class="main-left" id="mainmenu" style="display:none"></div>
- <div class="main-right">
- <div class="modemenu-buttons" style="display:none">
- <ul id="modemenu"></ul>
- </div>
- <div class="darkMask"></div>
- <div id="maincontent">
- <div class="container">
- <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") and path ~= "admin-system-admin-password" then -%>
- <%- end -%>
-
- <%- if boardinfo.rootfs_type == "initramfs" then -%>
- <div class="alert-message warning">
- <h4><%:System running in recovery (initramfs) mode.%></h4>
- <p><%:No changes to settings will be stored and are lost after rebooting. This mode should only be used to install a firmware upgrade%></p>
- <% if disp.lookup("admin/system/flash") then %>
- <div class="right"><a class="btn" href="<%=url("admin/system/flash")%>"><%:Go to firmware upgrade...%></a></div>
- <% end %>
- </div>
- <%- end -%>
-
- <noscript>
- <div class="alert-message warning">
- <h4><%:JavaScript required!%></h4>
- <p><%:You must enable JavaScript in your browser or LuCI will not work properly.%></p>
- </div>
- </noscript>
-
- <div id="tabmenu" style="display:none"></div>
--- /dev/null
+{#
+ Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI
+
+ luci-theme-material
+ Copyright 2015 Lutty Yang <lutty@wcan.in>
+
+ Have a bug? Please create an issue here on GitHub!
+ https://github.com/LuttyYang/luci-theme-material/issues
+
+ luci-theme-bootstrap:
+ Copyright 2008 Steven Barth <steven@midlink.org>
+ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2012 David Menting <david@nut-bolt.nl>
+
+ MUI:
+ https://github.com/muicss/mui
+
+ Licensed to the public under the Apache License 2.0
+-#}
+
+ </div>
+ <footer class="mobile-hide">
+ <a href="https://github.com/openwrt/luci">Powered by {{ version.luciname }} ({{ version.luciversion }})</a> /
+ {{ version.distname }} {{ version.distversion }} ({{ version.distrevision }})
+ </footer>
+ </div>
+ </div>
+
+ <script type="text/javascript">L.require('menu-material')</script>
+
+</body>
+</html>
--- /dev/null
+{#
+ Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI
+
+ luci-theme-material
+ Copyright 2015-2017 Lutty Yang <lutty@wcan.in>
+
+ Have a bug? Please create an issue here on GitHub!
+ https://github.com/LuttyYang/luci-theme-material/issues
+
+ luci-theme-bootstrap:
+ Copyright 2008 Steven Barth <steven@midlink.org>
+ Copyright 2008-2016 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2012 David Menting <david@nut-bolt.nl>
+
+ MUI:
+ https://github.com/muicss/mui
+
+ Licensed to the public under the Apache License 2.0
+-#}
+
+{%
+ import { getuid, getspnam } from 'luci.core';
+
+ const boardinfo = ubus.call('system', 'board');
+ const hostname = striptags(boardinfo?.hostname ?? '?');
+
+ http.prepare_content('text/html; charset=UTF-8');
+-%}
+
+<!DOCTYPE html>
+<html lang="{{ dispatcher.lang }}">
+<head>
+<meta charset="utf-8">
+<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"/>
+<meta name="apple-mobile-web-app-capable" content="yes">
+<meta name="mobile-web-app-capable" content="yes">
+<meta name="theme-color" content="#09c">
+<meta name="msapplication-tap-highlight" content="no">
+<meta name="msapplication-TileColor" content="#09c">
+<meta name="application-name" content="{{ hostname }} - LuCI">
+<meta name="apple-mobile-web-app-title" content="{{ hostname }} - LuCI">
+<link rel="stylesheet" href="{{ media }}/cascade.css">
+<link rel="shortcut icon" href="{{ media }}/favicon.ico">
+{% if (node?.css): %}
+<link rel="stylesheet" href="{{ resource }}/{{ node.css }}">
+{% endif %}
+<script src="{{ dispatcher.build_url('admin/translations', dispatcher.lang) }}"></script>
+<script src="{{ resource }}/cbi.js"></script>
+<title>{{ hostname }}{{ node?.title ? ` - ${striptags(node.title)}` : '' }} - LuCI</title>
+{% if (css): %}
+<style title="text/css">{{ css }}</style>
+{% endif %}
+</head>
+<body class="lang_{{ dispatcher.lang }} {{ ctx.authsession ? 'logged-in' : '' }} {{ length(ctx.path) ? `node-${join('-', ctx.path)}` : 'node-main-login' }}" data-page="{{ entityencode(join('-', ctx.path), true) }}">
+<header>
+ <div class="fill">
+ <div class="container">
+ <span class="showSide"></span>
+ <a id="logo" href="{{ ctx.authsession ? dispatcher.build_url('admin/status/overview') : '#' }}"><img src="{{ media }}/brand.png" alt="OpenWrt"></a>
+ <a class="brand" href="#">{{ hostname }}</a>
+ <span class="status" id="indicators"></span>
+ </div>
+ </div>
+</header>
+<div class="main">
+ <div style="" class="loading"><span><div class="loading-img"></div>{{ _('Collecting data...') }}</span></div>
+ <div class="main-left" id="mainmenu" style="display:none"></div>
+ <div class="main-right">
+ <div class="modemenu-buttons" style="display:none">
+ <ul id="modemenu"></ul>
+ </div>
+ <div class="darkMask"></div>
+ <div id="maincontent">
+ <div class="container">
+ {% if (getuid() == 0 && getspnam('root')?.pwdp === ''): %}
+ <!-- no password set -->
+ {% endif %}
+
+ {% if (boardinfo?.rootfs_type == "initramfs"): %}
+ <div class="alert-message warning">
+ <h4>{{ _('System running in recovery (initramfs) mode.') }}</h4>
+ <p>{{ _('No changes to settings will be stored and are lost after rebooting. This mode should only be used to install a firmware upgrade') }}</p>
+ {% if (dispatcher.lookup("admin/system/flash")): %}
+ <div class="right"><a class="btn" href="{{ dispatcher.build_url("admin/system/flash") }}">{{ _('Go to firmware upgrade...') }}</a></div>
+ {% endif %}
+ </div>
+ {% endif %}
+
+ <noscript>
+ <div class="alert-message warning">
+ <h4>{{ _('JavaScript required!') }}</h4>
+ <p>{{ _('You must enable JavaScript in your browser or LuCI will not work properly.') }}</p>
+ </div>
+ </noscript>
+
+ <div id="tabmenu" style="display:none"></div>