Multi-day accumulated fixes: tag dispatch, session/pooling correctness, SPA rollout, jetc compiler
JetCore engine (Tag.cpp/.h, Global.cpp/.h, __*.cpp tag classes): - Numerous __mysql.cpp connection-pooling correctness fixes (stale result sets, double-indirection sessionid bugs, field caching, pool keying) and a session-registration-before-connection-confirmed ordering fix (dangling pointer on a failed connect) - Tag.cpp: large body of fixes to the tag-dispatch/container-scanning logic (bare-name fallback, database aliasing, single-quote handling, @-prefix session variable resolution, TAGDEF caching, nested split-tag scanning for if/while/until/ifrow so an inner one doesn't corrupt an outer one's own boundary scan) plus the process-first rendering order fix (a <process> now runs before <checksession>/page resolution, fixing a real "blank page after successful login" bug) - Global.h/.cpp: added imapSessions (parallel to the existing __mysql* session map) for the new <imap> tag family - __whiledir.cpp/__include.cpp: caching and directory-name-aliasing fixes - __call.cpp/.h: fixed a dangling-pointer bug - __write.cpp: fixed an O_WRONLY-only open that couldn't create a new file - __ifrow.cpp/__sql.cpp: fixed the same sessionid double-indirection bug __mysql.cpp had (resolveKeyword's result was being used as a map key lookup instead of the resolved value itself) jetc compiler (jetc/JetParser.cpp/.h, JetCodegen.cpp/.h, JetAST.h, jetc.cpp, build-shared.sh, build-compiled.sh): - Parser fixes: inline <include>, nested-quote handling, void-tag recognition - Codegen fixes and expanded AST support - build-shared.sh: atomic rename into place for a freshly-built .jtc (a live server dlopen()ing the same path mid-rebuild was corrupting its own already-mapped view of the old file) and a staleness check so a cached JetCore .o doesn't silently keep serving yesterday's fixes forever - Added -lssl to both build scripts' link lines (needed once the new <imap> tag's client-side TLS code existed - previously nothing in this codebase used OpenSSL's SSL/TLS client API, only libcrypto) Site content (jetc/barant-site/): SPA (fetch-and-swap navigation) rollout across essentially every .page/.jet/.section/.tag/.proc/.method file - dynamic-content fixes, fragment-mode stripping, native $[@name] session variables replacing older mechanisms, and this session's own checkout.page redesign, login start-param redirect fix, and per-page side-menu (menu.bar/$[PAGE].menu) refresh support. Completed the earlier main.css/control.css move from assets/ to assets/images/ (git still showed the old paths as tracked-but-deleted until now). Deliberately left out of this commit: dozens of .pre-<description>- <date> manual backup files (this session's and earlier ones' own before/after snapshots, not meant for permanent history), compiled .jtc build outputs, ad hoc test binaries and scripts under jetc/ (login_asan, wcwc_test, optest2_bin, etc.), and jetc/__pycache__/ - none of these are meant to be tracked; a .gitignore covering them would be worth adding separately.
No files matched your search
@@ -1,8 +1,10 @@
|
||||
#include "Global.h"
|
||||
#include "Exception.h"
|
||||
#include "__mysql.h"
|
||||
#include "__imap.h"
|
||||
#include <iostream>
|
||||
#include <stdlib.h>
|
||||
#include <cstdio>
|
||||
|
||||
namespace jet {
|
||||
|
||||
@@ -44,6 +46,26 @@ namespace jet {
|
||||
return sessions[sessionId];
|
||||
}
|
||||
|
||||
bool Global::imapSessionExists(coreutils::MString sessionId) {
|
||||
return imapSessions.find(sessionId) != imapSessions.end();
|
||||
}
|
||||
|
||||
void Global::addImapSession(coreutils::MString sessionId, __imap *imap) {
|
||||
if(imapSessionExists(sessionId))
|
||||
throw coreutils::Exception("imap sessionid already exists.");
|
||||
imapSessions[sessionId] = imap;
|
||||
}
|
||||
|
||||
void Global::removeImapSession(coreutils::MString sessionId) {
|
||||
imapSessions.erase(sessionId);
|
||||
}
|
||||
|
||||
__imap * Global::getImapSession(coreutils::MString sessionId) {
|
||||
if(imapSessions.find(sessionId) == imapSessions.end())
|
||||
throw coreutils::Exception("requested imap session is not available.");
|
||||
return imapSessions[sessionId];
|
||||
}
|
||||
|
||||
coreutils::ZString Global::getSessionVariable(coreutils::MString &splitName) {
|
||||
if(sessions.find(splitName[0]) == sessions.end())
|
||||
throw coreutils::Exception("requested session is not available in variable.");
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
namespace jet {
|
||||
|
||||
class __mysql;
|
||||
class __imap;
|
||||
class Tag;
|
||||
|
||||
class Global {
|
||||
|
||||
@@ -23,6 +25,10 @@ namespace jet {
|
||||
void addSession(coreutils::MString sessionId, __mysql *mysql);
|
||||
void removeSession(coreutils::MString sessionId);
|
||||
__mysql * getSession(coreutils::MString sessionId);
|
||||
bool imapSessionExists(coreutils::MString sessionId);
|
||||
void addImapSession(coreutils::MString sessionId, __imap *imap);
|
||||
void removeImapSession(coreutils::MString sessionId);
|
||||
__imap * getImapSession(coreutils::MString sessionId);
|
||||
coreutils::ZString getSessionVariable(coreutils::MString &splitName);
|
||||
void outputHeaders();
|
||||
void setupFormData(coreutils::ZString &formdata);
|
||||
@@ -55,11 +61,33 @@ namespace jet {
|
||||
std::map<coreutils::MString, __mysql *> sessions;
|
||||
std::map<coreutils::MString, coreutils::MString> headers;
|
||||
std::map<coreutils::MString, coreutils::MString> tags;
|
||||
|
||||
// Populated once per compiled .jtc module's own entry function (see
|
||||
// jetc's TAGDEF codegen) - a top-level <tag name="X"> definition
|
||||
// that jetc could compile directly registers its own render
|
||||
// function here under its lowercase name, same key convention as
|
||||
// `tags` above. __dotag checks this first before falling back to
|
||||
// the text-based findTagDefinition()/processContainer() path (see
|
||||
// __dotag.cpp), avoiding a full re-parse of the definition's body
|
||||
// on every invocation. A miss here (a locally-scoped/nested tag
|
||||
// definition, or content that was never compiled at all) is always
|
||||
// safe - it just means the existing interpreted path runs exactly
|
||||
// as it always has; this is a pure additive fast path, never a
|
||||
// replacement for `tags`, which every TAGDEF still populates too.
|
||||
std::map<coreutils::MString, void(*)(Tag&, coreutils::MString&)> compiledTags;
|
||||
|
||||
char **envp;
|
||||
bool cgi = false;
|
||||
bool session = false;
|
||||
coreutils::MString sessionId;
|
||||
|
||||
// Deliberately the LAST member declared in Global - appended
|
||||
// here, after every pre-existing field, rather than inserted
|
||||
// earlier among them, so this addition does not shift the
|
||||
// memory offset of any field that existed before it. See
|
||||
// __imap.h for what registers here.
|
||||
std::map<coreutils::MString, __imap *> imapSessions;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
#include <time.h>
|
||||
#include <chrono>
|
||||
#include <cmath>
|
||||
#include <vector>
|
||||
#include <random>
|
||||
|
||||
namespace jet {
|
||||
|
||||
@@ -27,8 +29,73 @@ namespace jet {
|
||||
string = op.string;
|
||||
doubleValue = op.doubleValue;
|
||||
isNumber = op.isNumber;
|
||||
// A parenthesized sub-expression's own comparison result was never
|
||||
// propagated to the wrapping Operand - only string/doubleValue/
|
||||
// isNumber were copied, leaving this Operand's own `boolean`
|
||||
// genuinely uninitialized (Operand.h declares it with no default
|
||||
// value). Confirmed via debug tracing: printed as garbage stack
|
||||
// bytes, which "and"/"or" then combined instead of the real
|
||||
// true/false result.
|
||||
boolean = op.boolean;
|
||||
if(!in.ifNext(")"))
|
||||
throw coreutils::Exception("expected ) in expression.");
|
||||
} else if(in.ifNextIgnoreCase("SUBSTRING_INDEX")) {
|
||||
// MySQL SUBSTRING_INDEX(str, delim, count): with a positive count,
|
||||
// returns everything before the count-th occurrence of delim
|
||||
// (counting from the left); with a negative count, everything
|
||||
// after the |count|-th occurrence (counting from the right). If
|
||||
// delim doesn't occur that many times, the whole string is
|
||||
// returned unchanged. Genuinely missing (like LOCATE was) - real
|
||||
// content (index2.cgi's own URI-parsing logic, ported as part of
|
||||
// the /var/www/barant jet-2.0 conversion) relies on it to peel a
|
||||
// path apart one segment at a time:
|
||||
// substring_index(substring_index('$[REQUEST_URI]','?',1),'/',2).
|
||||
if(!in.ifNext("("))
|
||||
throw coreutils::Exception("Expecting ( for SUBSTRING_INDEX parameters.");
|
||||
Operand parm1(in, tag);
|
||||
if(!in.ifNext(","))
|
||||
throw coreutils::Exception("Expecting , in SUBSTRING_INDEX expression.");
|
||||
Operand parm2(in, tag);
|
||||
if(!in.ifNext(","))
|
||||
throw coreutils::Exception("Expecting , in SUBSTRING_INDEX expression.");
|
||||
Operand parm3(in, tag);
|
||||
if(in.ifNext(")")) {
|
||||
coreutils::MString haystack = parm1.string;
|
||||
haystack.reset();
|
||||
coreutils::MString delim = parm2.string;
|
||||
delim.reset();
|
||||
int count = parm3.string.asInteger();
|
||||
int delimLen = (int)delim.getLength();
|
||||
std::vector<int> positions;
|
||||
if(delimLen > 0) {
|
||||
int base = 0;
|
||||
while(true) {
|
||||
coreutils::MString scan = haystack.substring(base);
|
||||
scan.reset();
|
||||
int pos = scan.find(delim);
|
||||
if(pos == -1) break;
|
||||
positions.push_back(base + pos);
|
||||
base += pos + delimLen;
|
||||
}
|
||||
}
|
||||
if(count >= 0) {
|
||||
size_t n = (size_t)count;
|
||||
if(n == 0 || positions.size() < n) {
|
||||
string = haystack.substring(0);
|
||||
} else {
|
||||
string = haystack.substring(0, positions[n - 1]);
|
||||
}
|
||||
} else {
|
||||
size_t n = (size_t)(-count);
|
||||
if(positions.size() < n) {
|
||||
string = haystack.substring(0);
|
||||
} else {
|
||||
int idx = positions[positions.size() - n];
|
||||
string = haystack.substring(idx + delimLen);
|
||||
}
|
||||
}
|
||||
} else
|
||||
throw coreutils::Exception("Expecting ) at end of SUBSTRING_INDEX expression.");
|
||||
} else if(in.ifNextIgnoreCase("SUBSTRING")) {
|
||||
if(!in.ifNext("("))
|
||||
throw coreutils::Exception("Expecting ( for SUBSTRING parameters.");
|
||||
@@ -58,6 +125,58 @@ namespace jet {
|
||||
} else
|
||||
throw coreutils::Exception("Expecting ) at end of substring expression.");
|
||||
}
|
||||
} else if(in.ifNextIgnoreCase("LOCATE")) {
|
||||
// MySQL-style LOCATE(needle, haystack): 1-based position of the
|
||||
// first occurrence of needle within haystack, or 0 if not found -
|
||||
// a genuinely missing function (like <eval> was a genuinely
|
||||
// missing tag). Real 1.4 content depends on it for exactly this
|
||||
// "is #[name] present in the space-padded $[errfield] list"
|
||||
// pattern (barant.tag's own <field> definition:
|
||||
// locate(' #[name] ','$[errfield]') != 0), used throughout for
|
||||
// marking a field's input as erroring after a failed validation.
|
||||
if(!in.ifNext("("))
|
||||
throw coreutils::Exception("Expecting ( for LOCATE parameters.");
|
||||
Operand parm1(in, tag);
|
||||
if(!in.ifNext(","))
|
||||
throw coreutils::Exception("Expecting , in LOCATE expression.");
|
||||
Operand parm2(in, tag);
|
||||
if(in.ifNext(")")) {
|
||||
coreutils::MString haystack = parm2.string;
|
||||
haystack.reset();
|
||||
int pos = haystack.find(parm1.string);
|
||||
doubleValue = (pos == -1) ? 0 : (pos + 1);
|
||||
isNumber = true;
|
||||
string = std::format("{:.12f}", doubleValue);
|
||||
string.removeTrailingZeros();
|
||||
} else {
|
||||
// Optional 3rd start_pos argument (MySQL LOCATE(substr, str,
|
||||
// pos)): search begins at the given 1-based position instead of
|
||||
// the start of the string. Needed by index2.cgi's own real
|
||||
// URI-parsing logic (walking a path one '/' at a time), ported
|
||||
// as part of the /var/www/barant jet-2.0 conversion.
|
||||
if(!in.ifNext(","))
|
||||
throw coreutils::Exception("Expecting , in LOCATE expression.");
|
||||
Operand parm3(in, tag);
|
||||
if(in.ifNext(")")) {
|
||||
coreutils::MString haystack = parm2.string;
|
||||
haystack.reset();
|
||||
int totalLen = (int)haystack.getLength();
|
||||
int startPos = parm3.string.asInteger() - 1;
|
||||
if(startPos < 0) startPos = 0;
|
||||
if(startPos >= totalLen) {
|
||||
doubleValue = 0;
|
||||
} else {
|
||||
coreutils::MString sub = haystack.substring(startPos);
|
||||
sub.reset();
|
||||
int pos = sub.find(parm1.string);
|
||||
doubleValue = (pos == -1) ? 0 : (startPos + pos + 1);
|
||||
}
|
||||
isNumber = true;
|
||||
string = std::format("{:.12f}", doubleValue);
|
||||
string.removeTrailingZeros();
|
||||
} else
|
||||
throw coreutils::Exception("Expecting ) at end of LOCATE expression.");
|
||||
}
|
||||
} else if(in.ifNextIgnoreCase("LEFT")) {
|
||||
if(!in.ifNext("("))
|
||||
throw coreutils::Exception("Expecting ( for LEFT parameters.");
|
||||
@@ -384,7 +503,10 @@ namespace jet {
|
||||
string.removeTrailingZeros();
|
||||
} else
|
||||
throw coreutils::Exception("Expecting ) at end of FLOOR expression.");
|
||||
} else if(in.ifNextIgnoreCase("UNIXTIME")) {
|
||||
} else if(in.ifNextIgnoreCase("UNIXTIME") || in.ifNextIgnoreCase("UNIX_TIMESTAMP")) {
|
||||
// Real content (cart.page's own <set expr="unix_timestamp()">)
|
||||
// calls MySQL's real function name, not this codebase's own
|
||||
// "UNIXTIME" - same value, just accept both spellings.
|
||||
if(!in.ifNext("("))
|
||||
throw coreutils::Exception("Expecting ( for UNIXTIME.");
|
||||
if(in.ifNext(")")) {
|
||||
@@ -396,6 +518,59 @@ namespace jet {
|
||||
} else
|
||||
throw coreutils::Exception("Expecting ) at end of UNIXTIME.");
|
||||
}
|
||||
else if(in.ifNextIgnoreCase("NOW")) {
|
||||
// MySQL's now() - real content (SESSIONCTL.tag's own
|
||||
// createsession definition: <set name="_timestamp" expr="now()">,
|
||||
// embedded directly into a DATETIME column via a raw SQL literal:
|
||||
// timestamp='$[_timestamp]') expects a MySQL DATETIME-formatted
|
||||
// string ("YYYY-MM-DD HH:MM:SS"), not a Unix timestamp (that's
|
||||
// UNIX_TIMESTAMP, just above).
|
||||
if(!in.ifNext("("))
|
||||
throw coreutils::Exception("Expecting ( for NOW.");
|
||||
if(in.ifNext(")")) {
|
||||
std::time_t t = std::time(nullptr);
|
||||
std::tm tmVal;
|
||||
gmtime_r(&t, &tmVal);
|
||||
char buf[32];
|
||||
std::strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tmVal);
|
||||
string = buf;
|
||||
isNumber = false;
|
||||
} else
|
||||
throw coreutils::Exception("Expecting ) at end of NOW.");
|
||||
}
|
||||
else if(in.ifNextIgnoreCase("UUID")) {
|
||||
// MySQL's uuid() - real content (SESSIONCTL.tag's own
|
||||
// createsession definition: <set name="_uuid" expr="uuid()">)
|
||||
// uses this to mint a new session id, stored as sessions.uuid and
|
||||
// handed back to the browser as the _session_id cookie. A real
|
||||
// random (v4) UUID, not MySQL's actual v1 (time+MAC-derived)
|
||||
// algorithm - the schema only ever treats this as an opaque
|
||||
// unique string, nothing depends on v1's specific bit layout.
|
||||
// Seeded from std::random_device (real entropy), not RANDOM's
|
||||
// existing clock()-seeded rand_r() above - this value doubles as
|
||||
// a session token, so it needs to be unguessable, not just unique.
|
||||
if(!in.ifNext("("))
|
||||
throw coreutils::Exception("Expecting ( for UUID.");
|
||||
if(in.ifNext(")")) {
|
||||
static thread_local std::mt19937_64 rng(std::random_device{}());
|
||||
std::uniform_int_distribution<int> hexDigit(0, 15);
|
||||
const char *hex = "0123456789abcdef";
|
||||
char buf[37];
|
||||
int p = 0;
|
||||
for(int i = 0; i < 36; i++) {
|
||||
if(i == 8 || i == 13 || i == 18 || i == 23) { buf[p++] = '-'; continue; }
|
||||
int v;
|
||||
if(i == 14) v = 4; // version 4
|
||||
else if(i == 19) v = 8 + hexDigit(rng) % 4; // variant 10xx
|
||||
else v = hexDigit(rng);
|
||||
buf[p++] = hex[v];
|
||||
}
|
||||
buf[p] = '\0';
|
||||
string = buf;
|
||||
isNumber = false;
|
||||
} else
|
||||
throw coreutils::Exception("Expecting ) at end of UUID.");
|
||||
}
|
||||
else if(in.ifNextIgnoreCase("DATEDIFF")) {
|
||||
if(!in.ifNext("("))
|
||||
throw coreutils::Exception("Expecting ( for DATEDIFF.");
|
||||
@@ -437,8 +612,19 @@ namespace jet {
|
||||
string = std::format("{:.12f}", doubleValue);
|
||||
isNumber = true;
|
||||
} else if(in.ifNext("'")) {
|
||||
string = in.getTokenExclude("'");
|
||||
coreutils::MString raw = in.getTokenExclude("'");
|
||||
in.ifNext("'");
|
||||
coreutils::MString resolved;
|
||||
raw.reset();
|
||||
while(!raw.eod()) {
|
||||
if(raw.startsWith("$[") || raw.startsWith("#["))
|
||||
resolved.write(tag.getVariable(raw));
|
||||
else {
|
||||
resolved.write(raw.charAt(0));
|
||||
raw.nextChar();
|
||||
}
|
||||
}
|
||||
string = resolved;
|
||||
isNumber = false;
|
||||
} else
|
||||
throw coreutils::Exception("operand is not valid.");
|
||||
@@ -646,6 +832,18 @@ namespace jet {
|
||||
} else
|
||||
throw coreutils::Exception("operand is not a number.");
|
||||
}
|
||||
in.skipWhitespace();
|
||||
if(in.ifNextIgnoreCase("and")) {
|
||||
Operand op(in, tag);
|
||||
boolean = boolean && op.boolean;
|
||||
isNumber = false;
|
||||
string = boolean ? "true" : "false";
|
||||
} else if(in.ifNextIgnoreCase("or")) {
|
||||
Operand op(in, tag);
|
||||
boolean = boolean || op.boolean;
|
||||
isNumber = false;
|
||||
string = boolean ? "true" : "false";
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,20 @@
|
||||
#include "Tag.h"
|
||||
#include <set>
|
||||
#include <utility>
|
||||
#include <unordered_map>
|
||||
#include "Exception.h"
|
||||
#include "Global.h"
|
||||
#include "__mysql.h"
|
||||
#include "__sql.h"
|
||||
#include "__imap.h"
|
||||
#include "__imaplist.h"
|
||||
#include "__imapmessage.h"
|
||||
#include "__imapflag.h"
|
||||
#include "__imapdelete.h"
|
||||
#include "__whilerow.h"
|
||||
#include "__comment.h"
|
||||
#include "__eval.h"
|
||||
#include <cstdio>
|
||||
#include "__exclude.h"
|
||||
#include "__for.h"
|
||||
#include "__if.h"
|
||||
@@ -50,7 +60,66 @@ namespace jet {
|
||||
while(!finished) {
|
||||
in.skipWhitespace();
|
||||
if(in.ifNext(">")) {
|
||||
hasContainer = true;
|
||||
// jet-1.4's real parser knew which built-ins never take
|
||||
// a body (its own "void element" list) - real 1.4
|
||||
// content (SESSIONCTL.tag, config.cfg, index.cgi) is
|
||||
// written with a bare closing '>' and no explicit
|
||||
// </tag> for these, which a plain "bare '>' always means
|
||||
// scan for a body" rule can't tell apart from a real
|
||||
// container tag that happens to be immediately followed
|
||||
// by more content. Kept in sync with jetc's own
|
||||
// JetParser.cpp::isVoidTag - same list, same reasoning,
|
||||
// this is the runtime-interpreted-fallback-path
|
||||
// equivalent of that compile-time fix.
|
||||
coreutils::MString nameLower = coreutils::MString(name).toLower();
|
||||
// exclude was wrongly listed here - __exclude.cpp's own
|
||||
// constructor explicitly throws "exclude must have a
|
||||
// container" if hasContainer is false, so it always
|
||||
// needs a real body (e.g. mainpagetemplate.temp's own
|
||||
// <exclude><title></exclude>) - it was never actually
|
||||
// void, this was a miscategorization.
|
||||
bool isVoid = (nameLower == "set") || (nameLower == "include") ||
|
||||
(nameLower == "cookie") || (nameLower == "header") ||
|
||||
(nameLower == "read") || (nameLower == "write") ||
|
||||
(nameLower == "call") || (nameLower == "system") ||
|
||||
(nameLower == "dump");
|
||||
// A CUSTOM tag (not one of jet's own built-ins above)
|
||||
// written bare, with no explicit close, is genuinely
|
||||
// ambiguous: is a real body coming (scan for
|
||||
// </thisname>), or is this self-closing and whatever
|
||||
// follows is unrelated sibling content? Real 1.4
|
||||
// content writes multiple bare invocations of the SAME
|
||||
// custom tag back-to-back with no close at all
|
||||
// (login.page's own two <field .../> entries, no
|
||||
// </field> anywhere) - scanning for a body in that case
|
||||
// doesn't just fail to find one, it finds the NEXT
|
||||
// sibling invocation of the same tag name via ifNested
|
||||
// (which recognizes it as "another <field>", recurses
|
||||
// into IT looking for ITS OWN close, and so on) and
|
||||
// silently swallows everything through EOF as this
|
||||
// tag's own unused body - since a tag whose own
|
||||
// definition never references <container> never reads
|
||||
// that captured text anyway, the result is silent,
|
||||
// undetectable content loss, confirmed live: the second
|
||||
// <field>, <buttonbay>, and the login button all
|
||||
// vanished from real rendered output with zero errors.
|
||||
// Resolve the ambiguity the same way the built-in list
|
||||
// above already does: if this tag's own DEFINITION
|
||||
// never references a bare <container> (so it could
|
||||
// never use captured body text even if it had one),
|
||||
// treat it as void too - genuinely no way to lose
|
||||
// content that would never have been read regardless.
|
||||
if(!isVoid) {
|
||||
coreutils::ZString customDef;
|
||||
if(findTagDefinition(name, customDef)) {
|
||||
coreutils::MString defLower(customDef);
|
||||
defLower.reset();
|
||||
defLower = defLower.toLower();
|
||||
defLower.reset();
|
||||
isVoid = (defLower.find(coreutils::MString("<container")) == -1);
|
||||
}
|
||||
}
|
||||
hasContainer = !isVoid;
|
||||
hasContainer2 = false;
|
||||
finished = true;
|
||||
break;
|
||||
@@ -61,14 +130,52 @@ namespace jet {
|
||||
break;
|
||||
}
|
||||
if(!finished) {
|
||||
coreutils::ZString keywordName = in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
|
||||
if(in.ifNext("=\"")) {
|
||||
if(keywords.count(keywordName) == 0)
|
||||
keywords[keywordName] = in.getTokenExclude("\"");
|
||||
else
|
||||
throw coreutils::Exception("keyword name must be unique for tag.");
|
||||
}
|
||||
if(!in.ifNext("\"")) {}
|
||||
// Every keyword lookup site in this codebase (keywordDefined("name"),
|
||||
// resolveKeyword("host"), etc.) uses a lowercase literal - real
|
||||
// 1.4 content writes attribute NAMES in any case too (e.g.
|
||||
// SESSIONCTL.tag's <TAG NAME="ABUTTON" ...>), so the key has to
|
||||
// be normalized to lowercase here, at the point of storage, or
|
||||
// every lookup against it silently misses (keywordDefined("name")
|
||||
// doesn't find "NAME") rather than erroring clearly.
|
||||
coreutils::MString keywordName = coreutils::MString(in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_")).toLower();
|
||||
// Real 1.4 content quotes attribute values with either " or '
|
||||
// (SESSIONCTL.tag's own <tag name='sessionctl' keywords="page
|
||||
// stylesheet"> uses both in the same tag) - accept either,
|
||||
// closing with whichever character opened it.
|
||||
bool dq = in.ifNext("=\"");
|
||||
bool sq = !dq && in.ifNext("='");
|
||||
if(dq || sq) {
|
||||
if(keywords.count(keywordName) == 0)
|
||||
keywords[keywordName] = in.getTokenExclude(dq ? "\"" : "'");
|
||||
else
|
||||
throw coreutils::Exception("keyword name must be unique for tag.");
|
||||
in.ifNext(dq ? "\"" : "'");
|
||||
} else if(keywordName.getLength() > 0) {
|
||||
// Unquoted attribute value (e.g. TYPE=NE, SCOPE=LOCAL - real
|
||||
// 1.4 content throughout). Neither quote style matched, but
|
||||
// getTokenInclude() above already consumed the attribute NAME
|
||||
// and left the cursor sitting exactly on '=' - without also
|
||||
// consuming '=' and the unquoted value here, the next
|
||||
// iteration's getTokenInclude() call returns empty (cursor is
|
||||
// still at '=', not a name character) and this loops forever
|
||||
// with zero forward progress. Same bug class already found and
|
||||
// fixed in ifNested()'s own copy of this logic - this is
|
||||
// Tag::Tag's main constructor's separate, parallel copy.
|
||||
if(in.ifNext("=")) {
|
||||
coreutils::MString value;
|
||||
while(!in.eod()) {
|
||||
char c = in.charAt(0);
|
||||
if(c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '>' || c == '/')
|
||||
break;
|
||||
value.write(c);
|
||||
in.nextChar();
|
||||
}
|
||||
if(keywords.count(keywordName) == 0)
|
||||
keywords[keywordName] = value;
|
||||
else
|
||||
throw coreutils::Exception("keyword name must be unique for tag.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(keywordDefined("filterblanklines")) {
|
||||
@@ -105,7 +212,7 @@ namespace jet {
|
||||
// from splitTagName itself so it works for any split tag.
|
||||
coreutils::MString splitOpenTag;
|
||||
splitOpenTag << "<" << splitTagName << ">";
|
||||
in.ifNext(splitOpenTag);
|
||||
in.ifNextIgnoreCase(splitOpenTag);
|
||||
start = in.getCursor();
|
||||
} else if(ifNested(in)) {
|
||||
} else
|
||||
@@ -134,7 +241,53 @@ namespace jet {
|
||||
copyContainer(container, parentOut);
|
||||
}
|
||||
|
||||
// Tracks (scope, keyword-name) pairs whose resolution is currently
|
||||
// in progress, shared between resolveKeyword (populates it around its
|
||||
// own body) and getVariable's #[...] parent-chain walk (consults it).
|
||||
// Real content passes a keyword straight through under the SAME name
|
||||
// to a nested invocation that also declares a keyword by that name -
|
||||
// e.g. barant.tag's own <linkbutton page="#[page]" ...> (linkbutton
|
||||
// itself declares "page" as one of its own keywords too, coincidentally
|
||||
// the same name as the enclosing tag's own "page" being forwarded).
|
||||
// #[page] here means "my CALLER's page value", but by the time it's
|
||||
// lazily resolved (raw text is stored unresolved at attribute-parse
|
||||
// time, only interpreted later when actually read), there's no record
|
||||
// of which scope originally wrote it - a naive parent-chain walk
|
||||
// restarts from `local` every time and immediately re-finds THIS SAME
|
||||
// tag's own "page" keyword (the one currently being resolved) instead
|
||||
// of continuing outward to the real caller, recursing forever. Once a
|
||||
// (scope, name) pair is already being resolved, the walk below skips
|
||||
// that scope for that name and continues to scope->parent instead of
|
||||
// recursing back into it.
|
||||
static thread_local std::set<std::pair<Tag*, coreutils::MString>> resolvingKeywords;
|
||||
|
||||
coreutils::MString Tag::resolveKeyword(coreutils::ZString keyword) {
|
||||
// Defensive recursion guard, kept as a backstop for any OTHER
|
||||
// self-referential chain the (scope, keyword) tracking above
|
||||
// doesn't happen to cover (e.g. a longer, indirect cycle through
|
||||
// several different keyword names) - crashing the whole process
|
||||
// via stack overflow is never acceptable, even for a case not
|
||||
// specifically identified yet.
|
||||
static thread_local int resolveDepth = 0;
|
||||
if(resolveDepth > 100)
|
||||
throw coreutils::Exception("keyword resolution recursion limit exceeded - likely a self-referential #[name]/$[name] value.");
|
||||
struct DepthGuard {
|
||||
int &d;
|
||||
DepthGuard(int &d) : d(d) { ++d; }
|
||||
~DepthGuard() { --d; }
|
||||
} depthGuard(resolveDepth);
|
||||
coreutils::MString keywordNameCopy(keyword);
|
||||
std::pair<Tag*, coreutils::MString> resolvingKey(this, keywordNameCopy);
|
||||
bool alreadyTracked = resolvingKeywords.count(resolvingKey) > 0;
|
||||
if(!alreadyTracked)
|
||||
resolvingKeywords.insert(resolvingKey);
|
||||
struct ResolvingGuard {
|
||||
std::set<std::pair<Tag*, coreutils::MString>> &s;
|
||||
std::pair<Tag*, coreutils::MString> k;
|
||||
bool owns;
|
||||
ResolvingGuard(std::set<std::pair<Tag*, coreutils::MString>> &s, std::pair<Tag*, coreutils::MString> k, bool owns) : s(s), k(k), owns(owns) {}
|
||||
~ResolvingGuard() { if(owns) s.erase(k); }
|
||||
} resolvingGuard(resolvingKeywords, resolvingKey, !alreadyTracked);
|
||||
coreutils::MString resolved;
|
||||
keywords[keyword].reset();
|
||||
while(!keywords[keyword].eod()) {
|
||||
@@ -154,8 +307,123 @@ namespace jet {
|
||||
parseContainer(container, out, container2, topLevel);
|
||||
}
|
||||
|
||||
// Extracted, unchanged, from parseContainer's own "container" dispatch
|
||||
// branch below - see that branch's original comment (preserved there)
|
||||
// and Tag.h's own doc comment for the full explanation of the
|
||||
// scope-walk/recursion-guard behavior this preserves exactly. The
|
||||
// hasContainer/evaluate gate matches processContainer's own gate
|
||||
// (both call sites this replaced went through processContainer,
|
||||
// which silently no-ops unless both are true) - collapsed to one
|
||||
// check here since it's the same guard either branch below would
|
||||
// have applied individually.
|
||||
void Tag::renderContainer(coreutils::MString &out, coreutils::ZString container2) {
|
||||
if(!(hasContainer && evaluate))
|
||||
return;
|
||||
static thread_local std::set<Tag*> resolvingContainerScopes;
|
||||
Tag *containerScope = local;
|
||||
while(containerScope &&
|
||||
(!containerScope->isCustomTagBoundary ||
|
||||
resolvingContainerScopes.count(containerScope) > 0))
|
||||
containerScope = containerScope->parent;
|
||||
if(containerScope != NULL) {
|
||||
resolvingContainerScopes.insert(containerScope);
|
||||
try {
|
||||
// ZString tracks its own read cursor (see ZString.h's own
|
||||
// reset() doc comment) - containerScope->container is a
|
||||
// persistent member reused across EVERY <container> reference
|
||||
// within the same custom tag invocation, not a fresh value per
|
||||
// call. Without resetting it first, a SECOND <container>
|
||||
// reference in one invocation (e.g. SESSIONCTL.tag's own
|
||||
// setenv definition: <eval name="_envvalue" scope="local">
|
||||
// <container></eval> followed later by
|
||||
// <eval name="#[name]"><container></eval>) parses an
|
||||
// already-exhausted cursor and silently renders empty, even
|
||||
// though the first reference worked correctly - confirmed via
|
||||
// a real repro: setenv's own second <container> use wrote ""
|
||||
// instead of the caller's actual value, so every
|
||||
// $[_login_id]-style read after a successful login stayed
|
||||
// empty. resolveKeyword() already resets its own equivalent
|
||||
// cursor (keywords[keyword]) both before and after for the
|
||||
// same reason - this mirrors that.
|
||||
containerScope->container.reset();
|
||||
parseContainer(containerScope->container, out, NULL, false);
|
||||
} catch(...) {
|
||||
resolvingContainerScopes.erase(containerScope);
|
||||
throw;
|
||||
}
|
||||
resolvingContainerScopes.erase(containerScope);
|
||||
} else {
|
||||
container2.reset();
|
||||
parseContainer(container2, out, NULL, false);
|
||||
}
|
||||
}
|
||||
|
||||
namespace {
|
||||
struct CachedTagDef {
|
||||
coreutils::MString name;
|
||||
coreutils::MString body;
|
||||
};
|
||||
// Recognizes the exact pattern jetc's own codegen emits for every
|
||||
// top-level <tag name="X">...</tag> definition it doesn't itself
|
||||
// specially compile (everything except set/if/for/while - see
|
||||
// JetCodegen.cpp): one interpretSpan(span, out) call per
|
||||
// definition, re-run from scratch on every single request even
|
||||
// though the definition text (SESSIONCTL.tag/barant.tag/
|
||||
// project.tag, spliced in at compile time via <include>) never
|
||||
// changes between requests once compiled - confirmed live, a real
|
||||
// page's compiled main.compiled.cpp calls this 15+ times per
|
||||
// request, one of them (the whole <tag name='sessionctl'> block,
|
||||
// every nested tag definition inside it included) close to 5000
|
||||
// characters, all fully re-scanned through the generic runtime Tag
|
||||
// dispatch every time. Keyed by the span's own raw data pointer,
|
||||
// not its content - safe because jetc emits these spans as C
|
||||
// string literals (static storage duration, the same address for
|
||||
// the whole life of the process), so pointer identity alone means
|
||||
// "the exact same compiled span, already seen once on this
|
||||
// thread" with no need to hash or compare bytes.
|
||||
thread_local std::unordered_map<const char*, CachedTagDef> tagDefCache;
|
||||
}
|
||||
|
||||
void Tag::interpretSpan(coreutils::ZString span, coreutils::MString &out) {
|
||||
const char *key = span.getData();
|
||||
auto cached = tagDefCache.find(key);
|
||||
if(cached != tagDefCache.end()) {
|
||||
global.tags[cached->second.name] = cached->second.body;
|
||||
return;
|
||||
}
|
||||
|
||||
// Only the fast path above is new behavior - everything below
|
||||
// this point, for a cache MISS, is the exact same real interpreter
|
||||
// call as before. The snapshot/diff afterward is purely for
|
||||
// deciding whether THIS span is safe to cache for next time - it
|
||||
// never changes what actually happens on this (first, per-thread)
|
||||
// call.
|
||||
std::set<coreutils::MString> tagKeysBefore;
|
||||
for(auto &entry : global.tags)
|
||||
tagKeysBefore.insert(entry.first);
|
||||
size_t outLenBefore = out.getLength();
|
||||
|
||||
parseContainer(span, out);
|
||||
|
||||
// Only cache spans whose entire observable effect was registering
|
||||
// EXACTLY one new top-level tag definition, with nothing written
|
||||
// to `out` - the precise signature of a bare <tag name="X">...
|
||||
// </tag> definition block (evaluate=false/output=false in
|
||||
// __tag.cpp - see its own doc comment). Real page content,
|
||||
// multiple registrations in one span, or a registration that
|
||||
// landed in some scope's own localTags instead of global.tags
|
||||
// (nested inside another custom tag, not the top-level case this
|
||||
// targets) are all left running the real interpreter every time -
|
||||
// the safe default, never caching something that isn't provably
|
||||
// pure and static.
|
||||
if(out.getLength() == outLenBefore && global.tags.size() == tagKeysBefore.size() + 1) {
|
||||
for(auto &entry : global.tags) {
|
||||
if(tagKeysBefore.find(entry.first) == tagKeysBefore.end()) {
|
||||
tagDefCache[key] = CachedTagDef{entry.first, entry.second};
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Tag::parseContainer(coreutils::ZString &in, coreutils::MString &out, coreutils::ZString container2, bool topLevel) {
|
||||
@@ -175,7 +443,12 @@ namespace jet {
|
||||
out.write("<|");
|
||||
continue;
|
||||
} else if(in.startsWith("<")) {
|
||||
if(ifTagName(in, "mysql")) {
|
||||
if(ifTagName(in, "mysql") || ifTagName(in, "database")) {
|
||||
// <database> is jet-1.4's name for this same tag (real 1.4
|
||||
// content - SESSIONCTL.tag's own <sessionctl> definition,
|
||||
// index.cgi itself - uses <database name="..."> throughout,
|
||||
// never <mysql>) - recognized as a real alias rather than
|
||||
// requiring that content to be rewritten.
|
||||
__mysql _mysql(in, out, global, this, local);
|
||||
continue;
|
||||
} else if(ifTagName(in, "comment")) {
|
||||
@@ -184,6 +457,21 @@ namespace jet {
|
||||
} else if(ifTagName(in, "sql")) {
|
||||
__sql _sql(in, out, global, this, local);
|
||||
continue;
|
||||
} else if(ifTagName(in, "imap")) {
|
||||
__imap _imap(in, out, global, this, local);
|
||||
continue;
|
||||
} else if(ifTagName(in, "imaplist")) {
|
||||
__imaplist _imaplist(in, out, global, this, local);
|
||||
continue;
|
||||
} else if(ifTagName(in, "imapmessage")) {
|
||||
__imapmessage _imapmessage(in, out, global, this, local);
|
||||
continue;
|
||||
} else if(ifTagName(in, "imapflag")) {
|
||||
__imapflag _imapflag(in, out, global, this, local);
|
||||
continue;
|
||||
} else if(ifTagName(in, "imapdelete")) {
|
||||
__imapdelete _imapdelete(in, out, global, this, local);
|
||||
continue;
|
||||
} else if(ifTagName(in, "whilerow")) {
|
||||
__whilerow _whilerow(in, out, global, this, local);
|
||||
continue;
|
||||
@@ -214,6 +502,9 @@ namespace jet {
|
||||
} else if(ifTagName(in, "set")) {
|
||||
__set _set(in, out, global, this, local);
|
||||
continue;
|
||||
} else if(ifTagName(in, "eval")) {
|
||||
__eval _eval(in, out, global, this, local);
|
||||
continue;
|
||||
} else if(ifTagName(in, "call")) {
|
||||
__call _call(in, out, global, this, local);
|
||||
continue;
|
||||
@@ -251,10 +542,46 @@ namespace jet {
|
||||
__dotag _dotag(in, out, global, this, local);
|
||||
continue;
|
||||
} else if(ifTagName(in, "container")) {
|
||||
processContainer(container2);
|
||||
in.ifNext("<container");
|
||||
in.skipWhitespace();
|
||||
in.ifNext("/>");
|
||||
// Rendering logic lives in renderContainer (see Tag.h/below) -
|
||||
// extracted, unchanged, so generated code for a compiled
|
||||
// <tag name="X"> definition body (see jetc's TAGDEF handling)
|
||||
// can call it directly too, without re-deriving the same
|
||||
// scope-walking/recursion-guard logic.
|
||||
renderContainer(out, container2);
|
||||
// The old consumption here - in.ifNext("<container");
|
||||
// in.skipWhitespace(); in.ifNext("/>"); - only ever handled
|
||||
// a bare, lowercase, attribute-free "<container/>". Real
|
||||
// 1.4 content writes this several other ways: uppercase
|
||||
// (SESSIONCTL.tag's own <CONTAINER EVAL="NO">), with
|
||||
// attributes, and closed with a bare ">" rather than "/>" -
|
||||
// ifTagName(in, "container") above already matches all of
|
||||
// these case-insensitively for DISPATCH, but the hardcoded
|
||||
// lowercase "<container" literal consumption step then
|
||||
// failed outright on any of them, consuming nothing at
|
||||
// all and leaving the cursor exactly where it started -
|
||||
// the dispatch loop re-entered this same branch forever,
|
||||
// re-running processContainer(container2) with zero
|
||||
// forward progress. Confirmed live via a loop-iteration
|
||||
// guard showing "preview=[<CONTAINER EVAL=\"NO\">]"
|
||||
// unchanged across tens of thousands of iterations.
|
||||
// Consume properly instead: skip '<', the tag name itself
|
||||
// (whatever case it was written in), then scan to the
|
||||
// closing '>' - respecting quoted attribute values so a
|
||||
// '>' inside one doesn't end the tag early - regardless of
|
||||
// whether it was self-closed with '/>' or left as a bare
|
||||
// '>' (a self-closing '/' is just consumed as an ordinary
|
||||
// character by the scan below either way).
|
||||
in.ifNext("<");
|
||||
in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
|
||||
while(!in.eod() && !in.ifNext(">")) {
|
||||
if(in.ifNext("\"")) {
|
||||
while(!in.eod() && !in.ifNext("\"")) in.nextChar();
|
||||
} else if(in.ifNext("'")) {
|
||||
while(!in.eod() && !in.ifNext("'")) in.nextChar();
|
||||
} else {
|
||||
in.nextChar();
|
||||
}
|
||||
}
|
||||
continue;
|
||||
} else {
|
||||
out.write(in.nextChar());
|
||||
@@ -279,46 +606,61 @@ namespace jet {
|
||||
}
|
||||
|
||||
bool Tag::ifTagName(coreutils::ZString &in, const char *tag) {
|
||||
// Case-insensitive - real 1.4 content invokes built-ins in every
|
||||
// case (<MYSQL>, <Sql>, <DATABASE>, ...), and this is the dispatch
|
||||
// that decides which __xxx class handles a tag at all, so a
|
||||
// case-sensitive miss here doesn't throw, it just silently treats
|
||||
// the tag as unrecognized fallback content instead.
|
||||
in.push();
|
||||
if(in.ifNext("<"))
|
||||
if(in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_").equals(tag)) {
|
||||
if(in.ifNext(" ")) {
|
||||
in.pop();
|
||||
return true;
|
||||
} else if(in.ifNext("/>")) {
|
||||
in.pop();
|
||||
return true;
|
||||
} else if(in.ifNext(">")) {
|
||||
in.pop();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if(in.ifNext("<")) {
|
||||
coreutils::MString token = in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
|
||||
if(token.toLower() == coreutils::MString(tag).toLower()) {
|
||||
if(in.ifNext(" ")) {
|
||||
in.pop();
|
||||
return true;
|
||||
} else if(in.ifNext("/>")) {
|
||||
in.pop();
|
||||
return true;
|
||||
} else if(in.ifNext(">")) {
|
||||
in.pop();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
in.pop();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Tag::ifTagName(coreutils::ZString &in) {
|
||||
// Case-insensitive - same reasoning as ifEndTagName above.
|
||||
in.push();
|
||||
if(in.ifNext("<"))
|
||||
if(in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_").equals(name)) {
|
||||
in.push();
|
||||
if(in.ifNext(" ")) {
|
||||
in.pop();
|
||||
return true;
|
||||
} else if(in.ifNext("/>")) {
|
||||
in.pop();
|
||||
return true;
|
||||
} else if(in.ifNext(">")) {
|
||||
in.pop();
|
||||
return true;
|
||||
}
|
||||
in.pop();
|
||||
}
|
||||
if(in.ifNext("<")) {
|
||||
coreutils::MString token = in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
|
||||
if(token.toLower() == coreutils::MString(name).toLower()) {
|
||||
in.push();
|
||||
if(in.ifNext(" ")) {
|
||||
in.pop();
|
||||
return true;
|
||||
} else if(in.ifNext("/>")) {
|
||||
in.pop();
|
||||
return true;
|
||||
} else if(in.ifNext(">")) {
|
||||
in.pop();
|
||||
return true;
|
||||
}
|
||||
in.pop();
|
||||
}
|
||||
}
|
||||
in.pop();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Tag::findTagDefinition(coreutils::MString name, coreutils::ZString &result) {
|
||||
// Case-insensitive, matching __tag.cpp's own registration fix -
|
||||
// real 1.4 content declares and invokes a custom tag in different
|
||||
// case at different sites (SESSIONCTL.tag's <TAG NAME='TEMPLATE'>
|
||||
// vs mainpagetemplate.temp's <template>...</template>).
|
||||
name = name.toLower();
|
||||
Tag *scope = this;
|
||||
while(scope) {
|
||||
if(scope->isCustomTagBoundary && scope->localTags.count(name)) {
|
||||
@@ -358,12 +700,17 @@ namespace jet {
|
||||
}
|
||||
|
||||
bool Tag::ifEndTagName(coreutils::ZString &in) {
|
||||
// Case-insensitive, matching jetc's own compile-time matchTagClose
|
||||
// fix - real 1.4 content closes tags in whatever case it opened
|
||||
// them with (e.g. SESSIONCTL.tag's <tag name="linkbutton"> ... </TAG>).
|
||||
in.push();
|
||||
if(in.ifNext("</"))
|
||||
if(in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_").equals(name)) {
|
||||
if(in.ifNext(">"))
|
||||
return true;
|
||||
}
|
||||
if(in.ifNext("</")) {
|
||||
coreutils::MString token = in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
|
||||
if(token.toLower() == coreutils::MString(name).toLower()) {
|
||||
if(in.ifNext(">"))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
in.pop();
|
||||
return false;
|
||||
}
|
||||
@@ -371,7 +718,7 @@ namespace jet {
|
||||
bool Tag::ifSplitTagName(coreutils::ZString &in) {
|
||||
in.push();
|
||||
if(in.ifNext("<"))
|
||||
if(in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_").equals(splitTagName)) {
|
||||
if(coreutils::MString(in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_")).toLower() == coreutils::MString(splitTagName).toLower()) {
|
||||
if(in.ifNext(">"))
|
||||
in.pop();
|
||||
return true;
|
||||
@@ -412,6 +759,17 @@ namespace jet {
|
||||
return keywords.find(keyword) != keywords.end();
|
||||
}
|
||||
|
||||
namespace {
|
||||
// Every built-in tag that uses splitTagName "else" - shared by
|
||||
// ifNested(in)'s own cross-name fallback below and the new
|
||||
// ifNested(in,tagName)/scanContainerNamed overloads. <try>'s own
|
||||
// splitTagName is "catch", a different marker - deliberately not
|
||||
// folded into this fix (no repro of the same bug shape there, and
|
||||
// guessing its exact semantics without one risks getting it wrong).
|
||||
const char *elseSplitTagNames[] = { "if", "while", "until", "ifrow" };
|
||||
const int elseSplitTagNameCount = 4;
|
||||
}
|
||||
|
||||
bool Tag::ifNested(coreutils::ZString &in) {
|
||||
bool hasContainer = false;
|
||||
if(ifTagName(in)) {
|
||||
@@ -424,22 +782,152 @@ namespace jet {
|
||||
hasContainer = false;
|
||||
return true;
|
||||
} else if(in.getTokenExclude("=").getLength() != 0) {
|
||||
if(in.ifNext("=\"")) {
|
||||
// Real 1.4 content quotes attribute values with either " or
|
||||
// ' (e.g. <TAG NAME='TEMPLATE' SCOPE=LOCAL> nested inside
|
||||
// SESSIONCTL.tag's own <sessionctl> definition) - accept
|
||||
// either, closing with whichever character opened it.
|
||||
bool dq = in.ifNext("=\"");
|
||||
bool sq = !dq && in.ifNext("='");
|
||||
if(dq || sq) {
|
||||
while(1) {
|
||||
if(in.ifNext("\"")) {
|
||||
if(in.ifNext(dq ? "\"" : "'")) {
|
||||
break;
|
||||
}
|
||||
in.nextChar();
|
||||
}
|
||||
} else {
|
||||
// Unquoted attribute value (e.g. TYPE=NE, SCOPE=LOCAL -
|
||||
// real 1.4 content throughout, including SESSIONCTL.tag's
|
||||
// own <TAG NAME='TEMPLATE' SCOPE=LOCAL>). Neither quote
|
||||
// style matched, but the getTokenExclude("=") above
|
||||
// already consumed the attribute NAME and left the cursor
|
||||
// sitting exactly on '=' - without also consuming '=' and
|
||||
// the unquoted value here, the next iteration's
|
||||
// getTokenExclude("=") returns empty (cursor is already
|
||||
// AT '=') and this loops forever with zero forward
|
||||
// progress. Confirmed live via gdb: three snapshots over
|
||||
// 15s showed IDENTICAL stack depth and cursor position,
|
||||
// not a slow-but-progressing recursion.
|
||||
in.nextChar(); // consume '='
|
||||
while(!in.eod()) {
|
||||
char c = in.charAt(0);
|
||||
if(c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '>' || c == '/')
|
||||
break;
|
||||
in.nextChar();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(hasContainer)
|
||||
scanContainer(in);
|
||||
return false;
|
||||
}
|
||||
// Same-name match failed - if THIS tag itself is one of the
|
||||
// splitTagName="else" conditionals (if/while/until/ifrow), a
|
||||
// DIFFERENTLY-named one of that same set nested here (e.g. an
|
||||
// <if> nested directly inside an <ifrow>'s own body) needs to be
|
||||
// recognized and skipped too, exactly like a same-name nested
|
||||
// occurrence already is above - otherwise the inner tag's own
|
||||
// <else>/</...> markers get read as if they belonged to THIS
|
||||
// (outer) tag's own boundary scan. Confirmed via a real, minimal
|
||||
// repro: <ifrow>...<if expr="..."><else>...</if>...<else>...
|
||||
// </ifrow> - the outer <ifrow> incorrectly split on the INNER
|
||||
// <if>'s own <else>, and the inner <if>'s real closing </if> then
|
||||
// leaked into the rendered output as literal text (found while
|
||||
// investigating a real "successful login silently doesn't
|
||||
// proceed" report - login.method's own <ifrow><if expr=...>...
|
||||
// </if></ifrow> structure hits this exactly).
|
||||
if(splitTagName == "else") {
|
||||
for(int i = 0; i < elseSplitTagNameCount; i++) {
|
||||
if(ifNested(in, elseSplitTagNames[i]))
|
||||
break;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// See Tag.h's own doc comment on this overload set. Mirrors
|
||||
// ifNested(in) above exactly, but checks an explicit tagName (via
|
||||
// ifTagName(in,tagName)) instead of this->name, and skips the
|
||||
// nested tag's own body (if any) via scanContainerNamed(in,tagName)
|
||||
// instead of scanContainer(in) - so it correctly stops at THAT
|
||||
// tag's own close, not this outer tag's.
|
||||
bool Tag::ifNested(coreutils::ZString &in, const char *tagName) {
|
||||
bool hasContainer = false;
|
||||
if(ifTagName(in, tagName)) {
|
||||
while(!in.eod()) {
|
||||
in.skipWhitespace();
|
||||
if(in.ifNext(">")) {
|
||||
hasContainer = true;
|
||||
break;
|
||||
} else if(in.ifNext("/>")) {
|
||||
hasContainer = false;
|
||||
return true;
|
||||
} else if(in.getTokenExclude("=").getLength() != 0) {
|
||||
bool dq = in.ifNext("=\"");
|
||||
bool sq = !dq && in.ifNext("='");
|
||||
if(dq || sq) {
|
||||
while(1) {
|
||||
if(in.ifNext(dq ? "\"" : "'")) {
|
||||
break;
|
||||
}
|
||||
in.nextChar();
|
||||
}
|
||||
} else {
|
||||
in.nextChar(); // consume '=' - see ifNested(in)'s own comment on why
|
||||
while(!in.eod()) {
|
||||
char c = in.charAt(0);
|
||||
if(c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '>' || c == '/')
|
||||
break;
|
||||
in.nextChar();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(hasContainer)
|
||||
scanContainerNamed(in, tagName);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Tag::ifEndTagName(coreutils::ZString &in, const char *tagName) {
|
||||
in.push();
|
||||
if(in.ifNext("</")) {
|
||||
coreutils::MString token = in.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
|
||||
if(token.toLower() == coreutils::MString(tagName).toLower()) {
|
||||
if(in.ifNext(">"))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
in.pop();
|
||||
return false;
|
||||
}
|
||||
|
||||
// Like scanContainer(in) above, but scans for tagName's own close
|
||||
// rather than this->name's - and, since whatever's nested INSIDE
|
||||
// tagName's own body could itself contain any mix of the four
|
||||
// splitTagName="else" conditionals (not just tagName repeated), tries
|
||||
// all four at each position rather than only tagName itself. This is
|
||||
// what actually skips PAST an inner conditional's entire span
|
||||
// (attributes, body, close tag) when ifNested(in)'s own cross-name
|
||||
// fallback recognizes one nested in a DIFFERENTLY-named outer tag.
|
||||
void Tag::scanContainerNamed(coreutils::ZString &in, const char *tagName) {
|
||||
while(!in.eod()) {
|
||||
if(ifEndTagName(in, tagName))
|
||||
return;
|
||||
bool matchedNested = false;
|
||||
for(int i = 0; i < elseSplitTagNameCount; i++) {
|
||||
if(ifNested(in, elseSplitTagNames[i])) {
|
||||
matchedNested = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!matchedNested)
|
||||
in.nextChar();
|
||||
}
|
||||
}
|
||||
|
||||
coreutils::MString Tag::getVariable(coreutils::ZString &variable, bool inContainer) {
|
||||
if(variable.ifNext("$[")) {
|
||||
coreutils::MString name;
|
||||
@@ -485,11 +973,60 @@ namespace jet {
|
||||
renderVariableName(variable, name, modifier);
|
||||
name.split(".");
|
||||
if(name.getList().size() == 1) {
|
||||
if(global.variables.find(name[0]) == global.variables.end())
|
||||
throw coreutils::Exception("global variable is not initialized.");
|
||||
if(global.variables.find(name[0]) == global.variables.end()) {
|
||||
// jet-1.4 fallback: a bare $[name] that isn't a real global
|
||||
// also checks the current default query (sessionid="")
|
||||
// before failing - real 1.4 source depends on this, e.g.
|
||||
// <sql>select ...</sql> immediately followed by a bare
|
||||
// $[description] with no explicit $[.description] dot.
|
||||
// 2.0 originally required the dot; this restores 1.4's
|
||||
// more forgiving behavior without requiring the real
|
||||
// source to be rewritten.
|
||||
coreutils::MString defaultSession("");
|
||||
if(global.sessionExists(defaultSession)) {
|
||||
try {
|
||||
coreutils::MString columnValue = global.getSession(defaultSession)->getColumnValue(name[0]);
|
||||
return processModifier(columnValue, modifier);
|
||||
} catch(coreutils::Exception &) {
|
||||
// No such column in whatever's currently in the default
|
||||
// session (or no query has run on it yet) - fall through
|
||||
// to the empty-string default below rather than propagate.
|
||||
}
|
||||
}
|
||||
// jet-1.4 fallback #2: a genuinely never-initialized bare $[name]
|
||||
// (no global, no session/row match either) reads as an empty
|
||||
// string, not a hard error - real 1.4 source depends on this too
|
||||
// (e.g. SESSIONCTL.tag's own
|
||||
// <if value1="$[_session_id]" value2="" type="ne"> for a fresh,
|
||||
// no-cookie visitor - $[_session_id] was never set by anything
|
||||
// at that point). 2.0 originally threw "global variable is not
|
||||
// initialized" for this - matches ordinary template-language
|
||||
// semantics (undefined reads as empty) far better than erroring
|
||||
// on every fresh page hit.
|
||||
coreutils::MString empty("");
|
||||
return processModifier(empty, modifier);
|
||||
}
|
||||
return processModifier(global.variables[name[0]], modifier);
|
||||
}
|
||||
return global.getSessionVariable(name);
|
||||
// Same jet-1.4 fallback as the bare (undotted) case just above,
|
||||
// extended to the explicit $[session.column] form: real content
|
||||
// (invoice.method's own $[.amount]/$[.invnumber]/etc., read
|
||||
// right after a <sql>...where i.id=$[_invoice_id]</sql> that
|
||||
// legitimately has no matching row when no invoice id was ever
|
||||
// passed in - e.g. thankyou.page's unconditional <include
|
||||
// file="invoice.method">) depends on a missing column/session
|
||||
// reading as empty, not a hard error. This call previously threw
|
||||
// straight through with no catch at all here - confirmed live,
|
||||
// this exact page ("column does not exist in session result.")
|
||||
// was an uncaught propagation from here, not the already-guarded
|
||||
// 1-part path above.
|
||||
try {
|
||||
coreutils::MString sessionValue = global.getSessionVariable(name);
|
||||
return processModifier(sessionValue, modifier);
|
||||
} catch(coreutils::Exception &) {
|
||||
coreutils::MString empty("");
|
||||
return processModifier(empty, modifier);
|
||||
}
|
||||
}
|
||||
throw coreutils::Exception("expected variable name or type designator.");
|
||||
} else if(variable.ifNext("#[")) {
|
||||
@@ -507,9 +1044,63 @@ namespace jet {
|
||||
// tag invocation with no enclosing local-scope-owning tag.
|
||||
if(local == NULL)
|
||||
throw coreutils::Exception("local variable requested but no local scope is active.");
|
||||
if(local->variables.find(name) == local->variables.end())
|
||||
throw coreutils::Exception("local variable is not initialized.");
|
||||
return local->variables[name];
|
||||
// #[name] most commonly refers to some ENCLOSING custom tag's own
|
||||
// declared/passed attribute value - e.g. setpage's own body reads
|
||||
// #[NAME]/#[DIR] (its own keywords, found at the first scope
|
||||
// checked below), but sessionctl's body invokes
|
||||
// <setpage name="#[PAGE]">, where "#[PAGE]" must resolve against
|
||||
// SESSIONCTL's own "page" keyword, not setpage's (setpage never
|
||||
// declares "page" - only "NAME DIR"). Since __dotag binds each
|
||||
// custom tag invocation's own local=this (so a tag's body sees
|
||||
// its OWN attributes first), reaching an ancestor's attributes
|
||||
// requires walking the lexical containment chain via `parent`
|
||||
// (the same chain findTagDefinition() already walks for tag
|
||||
// DEFINITION lookups) rather than checking a single scope.
|
||||
// local->variables (explicit <set scope="local"> only) is checked
|
||||
// at each level too, ahead of that level's keywords, so a local
|
||||
// <set> can shadow an attribute of the same name at that scope.
|
||||
for(Tag *scope = local; scope; scope = scope->parent) {
|
||||
if(scope->variables.find(name) != scope->variables.end())
|
||||
return scope->variables[name];
|
||||
// Only consult a scope's own keywords when it's a real custom
|
||||
// tag invocation (isCustomTagBoundary - see __tag.cpp/Tag.h),
|
||||
// not a control-flow construct like <if>/<while>/<until> that
|
||||
// also binds local=this for ITS OWN internal value1/value2/
|
||||
// type comparison keywords. Those are never meant to be
|
||||
// visible to #[...] reads from nested content - they collide
|
||||
// with real, unrelated attribute names on the ENCLOSING custom
|
||||
// tag constantly (barant.tag's own <field> declares its own
|
||||
// "type" keyword - the input's type="text" - and its
|
||||
// definition immediately nests
|
||||
// <if value1="#[type]" value2="multiline" type="ne">, whose
|
||||
// OWN "type" keyword is the comparison operator "ne" - #[type]
|
||||
// read from further inside that <if> must reach field's "type"
|
||||
// two scopes up, not the <if>'s own "ne" one scope up).
|
||||
// Confirmed via real rendered output: without this,
|
||||
// <input type="#[type]"> rendered type="eq" (the nearest <if>'s
|
||||
// own comparison type) instead of type="text" (the field's).
|
||||
if(scope->isCustomTagBoundary) {
|
||||
// Attribute names are stored lowercase (see the main
|
||||
// constructor's attribute-parsing loop); the #[name]
|
||||
// designator itself stays case-sensitive as written, only
|
||||
// the keywords-map lookup key is lowered to match that
|
||||
// storage.
|
||||
coreutils::MString lname = coreutils::MString(name).toLower();
|
||||
if((scope->keywords.find(lname) != scope->keywords.end()) &&
|
||||
(resolvingKeywords.count(std::pair<Tag*, coreutils::MString>(scope, lname)) == 0))
|
||||
return scope->resolveKeyword(lname);
|
||||
}
|
||||
}
|
||||
// jet-1.4 fallback: a bare #[name] that was never passed as an
|
||||
// attribute anywhere in the enclosing scope chain and never
|
||||
// locally <set> reads as an empty string, not a hard error - real
|
||||
// 1.4 content depends on this throughout (e.g. SESSIONCTL.tag's
|
||||
// <page> definition checks #[secure]/#[admin]/#[loggedin]
|
||||
// unconditionally, but most real .page files - including
|
||||
// login.page's own <page template="mainpagetemplate">, no other
|
||||
// attributes - never pass them at all).
|
||||
coreutils::MString empty("");
|
||||
return processModifier(empty, modifier);
|
||||
}
|
||||
throw coreutils::Exception("Expecting a variable initializer ('$[' or '#[').");
|
||||
}
|
||||
@@ -549,8 +1140,30 @@ namespace jet {
|
||||
|
||||
void Tag::assignVariable(coreutils::ZString variable, coreutils::MString value, coreutils::ZString scope) {
|
||||
if(variable.startsWith("@")) {
|
||||
coreutils::ZString sessionName = variable;
|
||||
sessionName.ifNext("@");
|
||||
// NOT sessionName.ifNext("@") - that only advances sessionName's
|
||||
// own read cursor past the "@", it doesn't produce a string whose
|
||||
// OWN logical start is there. JString::locate() (used internally
|
||||
// by JFile's operator[] to find an EXISTING key to replace, not
|
||||
// just append a new one) resets whatever ZString it's given back
|
||||
// to ITS OWN position 0 partway through searching - for a
|
||||
// cursor-advanced view over the ORIGINAL "@name" buffer, position
|
||||
// 0 is still '@', so the search silently looks for "@name" instead
|
||||
// of "name". That only matters once the session file already has
|
||||
// real content loaded from a PRIOR request to search through - a
|
||||
// brand new/empty file has nothing to find either way, so this
|
||||
// looked fine on a first write and only broke on session vars that
|
||||
// outlive one request (login state read back on a later page,
|
||||
// exactly what this mechanism exists for). Confirmed via a real
|
||||
// corrupted session file: <clearenv>'s own <set name="@#[name]"
|
||||
// value=""> calls (see SESSIONCTL.tag) never found the existing
|
||||
// "_login_id" key that a PRIOR request's <setenv> had written, so
|
||||
// each one appended a brand new "_login_id":"" pair instead of
|
||||
// replacing it - duplicate keys, with whichever occurrence a given
|
||||
// JSON reader picks (first or last) an unreliable coin flip, not a
|
||||
// deliberate "cleared" state. substring(1) - not ifNext(), not
|
||||
// reset() - is what actually produces an independent copy starting
|
||||
// AT that position, immune to being reset back past it.
|
||||
coreutils::MString sessionName = variable.substring(1);
|
||||
if(global.sessionFile == NULL)
|
||||
throw coreutils::Exception("session variable assignment requested but no session is active (missing sessiondir keyword, or cgi mode is off).");
|
||||
(*global.sessionFile)[sessionName] = value;
|
||||
@@ -561,11 +1174,48 @@ namespace jet {
|
||||
else if(scope == "local") {
|
||||
if(local == NULL)
|
||||
throw coreutils::Exception("scope=\"local\" requested but no local scope is active.");
|
||||
local->variables[variable] = value;
|
||||
// Same reasoning as scope="parent" just below, one scope closer:
|
||||
// `local` itself isn't necessarily a real custom tag invocation -
|
||||
// <if>/<while>/<until> also bind local=this. A <set scope="local">
|
||||
// written inside one of THEIR branches (barant.tag's own <field>
|
||||
// definition: <if expr="..."><set name="class" value="..."
|
||||
// scope="local"><else>...</if>) stores onto that transient <if>
|
||||
// instance, which is destructed the moment </if> closes - so by
|
||||
// the time <field>'s own #[class] read runs later in the SAME
|
||||
// definition (outside the <if>), the value is already gone,
|
||||
// falling to the empty-string fallback. Confirmed via real
|
||||
// rendered output: class="" instead of class="fieldinput". Walk
|
||||
// up to the nearest real scope boundary first, same as
|
||||
// scope="parent"/__tag.cpp/the bare <container> fix.
|
||||
Tag *localScope = local;
|
||||
while(localScope->parent && !localScope->isCustomTagBoundary)
|
||||
localScope = localScope->parent;
|
||||
localScope->variables[variable] = value;
|
||||
} else if(scope == "parent") {
|
||||
if((local == NULL) || (local->parent == NULL))
|
||||
throw coreutils::Exception("scope=\"parent\" requested but no local scope (or its parent) is active.");
|
||||
local->parent->variables[variable] = value;
|
||||
// Walk up from local->parent to the nearest real scope boundary
|
||||
// (isCustomTagBoundary), the same way __tag.cpp's own tag-
|
||||
// DEFINITION registration already does - a bare parent hop lands
|
||||
// on whatever C++ object happens to be the immediate caller in
|
||||
// the dispatch chain, which for content reached through
|
||||
// transparent wrapper constructs (<eval>, <include>) is that
|
||||
// wrapper itself, not the custom tag it's lexically nested
|
||||
// inside. SESSIONCTL.tag's own <TAG NAME='TEMPLATE'> definition
|
||||
// depends on this: its
|
||||
// <EVAL NAME=TEMPLATEDATA SCOPE=PARENT><CONTAINER EVAL="NO"></EVAL>
|
||||
// is reached via <page>'s own
|
||||
// <EVAL><INCLUDE FILE="...#[TEMPLATE].temp"></EVAL> - without
|
||||
// this walk, TEMPLATEDATA landed on the transient __include
|
||||
// instance's own scope (one hop from TEMPLATE) rather than
|
||||
// <page>'s (two hops away, past the wrapper), so <page>'s own
|
||||
// later #[TEMPLATEDATA] read - itself walking the real scope-
|
||||
// boundary chain via getVariable's own parent-chain fix - never
|
||||
// found it.
|
||||
Tag *scope2 = local->parent;
|
||||
while(scope2->parent && !scope2->isCustomTagBoundary)
|
||||
scope2 = scope2->parent;
|
||||
scope2->variables[variable] = value;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -575,35 +1225,35 @@ namespace jet {
|
||||
|
||||
void Tag::storeVariable(coreutils::ZString variable) {
|
||||
if(keywordDefined("expr")) {
|
||||
if(!keywordDefined("scope") || (resolveKeyword("scope") == "global"))
|
||||
if(!keywordDefined("scope") || (resolveKeyword("scope").toLower() == "global"))
|
||||
assignVariable(variable, Operand(keywords["expr"], *this).string, "global");
|
||||
else if(resolveKeyword("scope") == "local")
|
||||
else if(resolveKeyword("scope").toLower() == "local")
|
||||
assignVariable(variable, Operand(keywords["expr"], *this).string, "local");
|
||||
else if(resolveKeyword("scope") == "parent")
|
||||
else if(resolveKeyword("scope").toLower() == "parent")
|
||||
assignVariable(variable, Operand(keywords["expr"], *this).string, "parent");
|
||||
} else if(hasContainer) {
|
||||
processContainer(container);
|
||||
if(evaluate) {
|
||||
if(!keywordDefined("scope") || (resolveKeyword("scope") == "global"))
|
||||
if(!keywordDefined("scope") || (resolveKeyword("scope").toLower() == "global"))
|
||||
assignVariable(variable, out, "global");
|
||||
else if(resolveKeyword("scope") == "local")
|
||||
else if(resolveKeyword("scope").toLower() == "local")
|
||||
assignVariable(variable, out, "local");
|
||||
else if(resolveKeyword("scope") == "parent")
|
||||
else if(resolveKeyword("scope").toLower() == "parent")
|
||||
assignVariable(variable, out, "parent");
|
||||
} else {
|
||||
if(!keywordDefined("scope") || (resolveKeyword("scope") == "global"))
|
||||
if(!keywordDefined("scope") || (resolveKeyword("scope").toLower() == "global"))
|
||||
assignVariable(variable, container, "global");
|
||||
else if(resolveKeyword("scope") == "local")
|
||||
else if(resolveKeyword("scope").toLower() == "local")
|
||||
assignVariable(variable, container, "local");
|
||||
else if(resolveKeyword("scope") == "parent")
|
||||
else if(resolveKeyword("scope").toLower() == "parent")
|
||||
assignVariable(variable, container, "parent");
|
||||
}
|
||||
} else {
|
||||
if(!keywordDefined("scope") || (resolveKeyword("scope") == "global"))
|
||||
if(!keywordDefined("scope") || (resolveKeyword("scope").toLower() == "global"))
|
||||
assignVariable(variable, resolveKeyword("value"), "global");
|
||||
else if(resolveKeyword("scope") == "local")
|
||||
else if(resolveKeyword("scope").toLower() == "local")
|
||||
assignVariable(variable, resolveKeyword("value"), "local");
|
||||
else if(resolveKeyword("scope") == "parent")
|
||||
else if(resolveKeyword("scope").toLower() == "parent")
|
||||
assignVariable(variable, resolveKeyword("value"), "parent");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,6 +72,20 @@ namespace jet {
|
||||
// actual definition to expand).
|
||||
bool findTagDefinition(coreutils::MString name, coreutils::ZString &result);
|
||||
|
||||
// Renders the enclosing custom tag invocation's own nested content -
|
||||
// the <container> marker inside a <tag name="X"> definition body -
|
||||
// into `out`. Extracted, unchanged, from parseContainer's own
|
||||
// "container" dispatch branch (see Tag.cpp) so generated code for a
|
||||
// compiled tag-definition body (see jetc's TAGDEF handling) can call
|
||||
// this exact logic directly instead of going through the raw-text
|
||||
// scan to reach it - walks up from `local` to the nearest
|
||||
// isCustomTagBoundary ancestor not already being resolved (guards
|
||||
// the pass-through self-reference case, e.g. linkbutton's own
|
||||
// <EVAL><CONTAINER></EVAL>) and renders THAT scope's own ->container;
|
||||
// falls back to rendering container2 if no such ancestor exists,
|
||||
// exactly matching parseContainer's own fallback for the same case.
|
||||
void renderContainer(coreutils::MString &out, coreutils::ZString container2 = NULL);
|
||||
|
||||
protected:
|
||||
bool hasContainer = false;
|
||||
bool hasContainer2 = false;
|
||||
@@ -107,6 +121,23 @@ namespace jet {
|
||||
bool ifEndTagName(coreutils::ZString &in);
|
||||
bool ifSplitTagName(coreutils::ZString &in);
|
||||
|
||||
// ifNested(in)'s own same-name-only check misses a DIFFERENTLY
|
||||
// named nested split-tag construct - e.g. an <if> nested inside an
|
||||
// <ifrow>'s own body (both use splitTagName "else"): ifNested(in)
|
||||
// only recognizes another nested <ifrow>, so an inner <if>'s own
|
||||
// <else>/</if> markers were being read as if they belonged to the
|
||||
// OUTER <ifrow>'s own boundary scan, corrupting both. This overload
|
||||
// set (ifNested/ifEndTagName parameterized by an explicit tag name,
|
||||
// plus scanContainerNamed) generalizes the exact same logic to any
|
||||
// of the built-in splitTagName="else" conditionals - if/while/
|
||||
// until/ifrow - so the outer tag's boundary scan correctly skips
|
||||
// PAST an inner one of any of these, regardless of name, before
|
||||
// resuming its own search. See Tag.cpp's own doc comment on the
|
||||
// shared splitTagNames list for the real story/repro.
|
||||
bool ifNested(coreutils::ZString &in, const char *tagName);
|
||||
bool ifEndTagName(coreutils::ZString &in, const char *tagName);
|
||||
void scanContainerNamed(coreutils::ZString &in, const char *tagName);
|
||||
|
||||
coreutils::MString processModifier(coreutils::MString &value, coreutils::MString &modifier);
|
||||
};
|
||||
|
||||
|
||||
@@ -16,14 +16,22 @@ namespace jet {
|
||||
throw coreutils::Exception("call tag cannot have both input keyword and have a container.");
|
||||
if(!keywordDefined("pgm"))
|
||||
throw coreutils::Exception("pgm keyword must be specified.");
|
||||
for(ix = 0; ix <= 50; ++ix)
|
||||
for(ix = 0; ix < 50; ++ix)
|
||||
argv[ix] = NULL;
|
||||
argv[0] = resolveKeyword("pgm").c_str(); // TODO: Need to peel off the program name only and pass as argv[0].
|
||||
for(ix = 1; ix <= 50; ++ix) {
|
||||
// Reserve up front - argStrings must never reallocate once a
|
||||
// c_str() pointer from one of its elements has been stored into
|
||||
// argv[] below, or that pointer dangles exactly like the bug this
|
||||
// replaces (see the .h's own comment). 50 arg slots + argv[0]'s
|
||||
// own program name.
|
||||
argStrings.reserve(51);
|
||||
argStrings.push_back(resolveKeyword("pgm")); // TODO: Need to peel off the program name only and pass as argv[0].
|
||||
argv[0] = argStrings.back().c_str();
|
||||
for(ix = 1; ix < 50; ++ix) {
|
||||
coreutils::MString arg("arg");
|
||||
arg << ix;
|
||||
if(keywordDefined(arg)) {
|
||||
argv[ix] = resolveKeyword(arg).c_str();
|
||||
argStrings.push_back(resolveKeyword(arg));
|
||||
argv[ix] = argStrings.back().c_str();
|
||||
} else
|
||||
break;
|
||||
}
|
||||
@@ -54,7 +62,7 @@ namespace jet {
|
||||
close(fdi[1]);
|
||||
dup2(fdi[0], 0);
|
||||
}
|
||||
rc = execvpe(resolveKeyword("pgm").c_str(), argv, global.envp);
|
||||
rc = execvpe(argv[0], argv, global.envp);
|
||||
close(fdo[1]);
|
||||
exit(errno);
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#define ____call_h__
|
||||
|
||||
#include "Tag.h"
|
||||
#include <vector>
|
||||
|
||||
namespace jet {
|
||||
|
||||
@@ -19,6 +20,21 @@ namespace jet {
|
||||
int rc;
|
||||
char *argv[50];
|
||||
|
||||
// Owns the actual character storage argv[] points into. Resolved
|
||||
// MStrings used to be created as unnamed temporaries with only
|
||||
// their .c_str() pointer kept (argv[ix] = resolveKeyword(arg)
|
||||
// .c_str()) - the temporary is destroyed at the end of that same
|
||||
// statement, so argv[ix] was a dangling pointer from that point
|
||||
// on, read only much later by execvpe() in the forked child.
|
||||
// Undefined behavior - confirmed via a real repro: two sequential
|
||||
// <call> tags (date, then cp using date's own captured output)
|
||||
// corrupted each other's arguments, producing a "cp" invocation
|
||||
// that actually ran /bin/date with garbage arguments instead.
|
||||
// Reserved to its final size up front (see the constructor) so no
|
||||
// push_back can reallocate and invalidate a c_str() pointer
|
||||
// already stored in argv[] earlier in the same construction.
|
||||
std::vector<coreutils::MString> argStrings;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -3,12 +3,22 @@
|
||||
|
||||
namespace jet {
|
||||
|
||||
__dotag::__dotag(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, local) {
|
||||
__dotag::__dotag(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, this) {
|
||||
// Every invocation of a custom tag is itself a new scope boundary -
|
||||
// a <tag name="..."> encountered while expanding this invocation's
|
||||
// own template (below) registers into THIS instance's localTags,
|
||||
// not the global map, so it's only visible for the rest of this
|
||||
// expansion. See Tag.h's isCustomTagBoundary/localTags doc comment.
|
||||
//
|
||||
// local=this (bound above, in the base Tag constructor call rather
|
||||
// than forwarding the caller's own local) is what makes a custom
|
||||
// tag's own body see ITS OWN declared/passed attributes via
|
||||
// #[name] - matches the pattern __if/__while/__until already use
|
||||
// for the same reason. Without this, #[name] reads inside e.g.
|
||||
// SESSIONCTL.tag's <sessionctl>/<setpage>/<retain> bodies resolved
|
||||
// against whatever local scope happened to be active in the
|
||||
// caller instead of this invocation's own attributes, and always
|
||||
// fell through to the empty-string fallback.
|
||||
isCustomTagBoundary = true;
|
||||
|
||||
// The base Tag constructor already set hasContainer from whether
|
||||
@@ -28,10 +38,29 @@ namespace jet {
|
||||
// this invocation was written.
|
||||
hasContainer = true;
|
||||
|
||||
coreutils::ZString container3;
|
||||
if(!findTagDefinition(name, container3))
|
||||
throw coreutils::Exception("tag definition not found.");
|
||||
processContainer(container3, container);
|
||||
// Fast path: if jetc compiled this tag's definition directly (a
|
||||
// top-level <tag name="X"> - see JetCodegen's TAGDEF handling), a
|
||||
// render function was registered under its lowercase name (matching
|
||||
// __tag.cpp's own registration key convention) instead of - or
|
||||
// alongside - the raw text findTagDefinition()/processContainer()
|
||||
// below would otherwise have to re-parse on every single invocation.
|
||||
// A miss here (locally-scoped/nested definitions, or a tag that was
|
||||
// never part of a compiled module) falls straight through to that
|
||||
// exact same interpreted path, unchanged - see Global.h's own doc
|
||||
// comment on compiledTags.
|
||||
coreutils::MString nameLower = coreutils::MString(name).toLower();
|
||||
auto compiledIt = global.compiledTags.find(nameLower);
|
||||
if(compiledIt != global.compiledTags.end()) {
|
||||
// Same gate processContainer() below applies on the interpreted
|
||||
// path - keeps both paths behaviorally identical rather than
|
||||
// having the compiled fast path unconditionally render.
|
||||
if(hasContainer && evaluate)
|
||||
compiledIt->second(*this, out);
|
||||
} else {
|
||||
coreutils::ZString container3;
|
||||
if(!findTagDefinition(name, container3))
|
||||
throw coreutils::Exception("tag definition not found.");
|
||||
processContainer(container3, container);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,18 +15,40 @@ namespace jet {
|
||||
throw coreutils::Exception("for tag requires end keyword.");
|
||||
if(!keywordDefined("step"))
|
||||
throw coreutils::Exception("for tag requires step keyword.");
|
||||
|
||||
// Where to write the loop counter (which variables map, and under
|
||||
// what name) is a static property of this <for>'s own invocation -
|
||||
// "scope"/"name" have no sensible reason to change mid-loop, so
|
||||
// resolve and branch on them once instead of re-resolving both
|
||||
// (and re-checking scope with up to 3 comparisons) on every single
|
||||
// iteration. Loop bounds (end/step) are deliberately left
|
||||
// re-resolved per iteration exactly as before - real content could
|
||||
// plausibly rely on a bound that changes as a side effect of the
|
||||
// loop body itself, and there's no clear evidence either way, so
|
||||
// that part stays conservative/unchanged.
|
||||
coreutils::MString counterVarName;
|
||||
enum { SCOPE_GLOBAL, SCOPE_LOCAL, SCOPE_PARENT } counterScope = SCOPE_GLOBAL;
|
||||
if(nameDefined) {
|
||||
counterVarName = resolveKeyword("name");
|
||||
if(keywordDefined("scope")) {
|
||||
coreutils::MString scopeVal = resolveKeyword("scope");
|
||||
if(scopeVal == "global") counterScope = SCOPE_GLOBAL;
|
||||
else if(scopeVal == "local") counterScope = SCOPE_LOCAL;
|
||||
else if(scopeVal == "parent") counterScope = SCOPE_PARENT;
|
||||
else throw coreutils::Exception("scope value is not valid.");
|
||||
}
|
||||
}
|
||||
|
||||
for(double ix = counter; ix <= resolveKeyword("end").asDouble(); ix += resolveKeyword("step").asDouble()) {
|
||||
resolveKeyword("end").reset();
|
||||
resolveKeyword("step").reset();
|
||||
if(nameDefined) {
|
||||
if(!keywordDefined("scope") || (resolveKeyword("scope") == "global"))
|
||||
global.variables[resolveKeyword("name")] = ix;
|
||||
else if(resolveKeyword("scope") == "local")
|
||||
this->local->variables[resolveKeyword("name")] = ix;
|
||||
else if(resolveKeyword("scope") == "parent")
|
||||
parent->local->variables[resolveKeyword("name")] = ix;
|
||||
if(counterScope == SCOPE_GLOBAL)
|
||||
global.variables[counterVarName] = ix;
|
||||
else if(counterScope == SCOPE_LOCAL)
|
||||
this->local->variables[counterVarName] = ix;
|
||||
else
|
||||
throw coreutils::Exception("scope value is not valid.");
|
||||
parent->local->variables[counterVarName] = ix;
|
||||
}
|
||||
processContainer(container);
|
||||
container.reset();
|
||||
|
||||
@@ -16,7 +16,7 @@ namespace jet {
|
||||
throw coreutils::Exception("type expected if value1 and value2 specified.");
|
||||
} else
|
||||
throw coreutils::Exception("value2 required if value1 specified.");
|
||||
coreutils::MString type = resolveKeyword("type");
|
||||
coreutils::MString type = resolveKeyword("type").toLower();
|
||||
if((type != "eq") &&
|
||||
(type != "ne") &&
|
||||
(type != "lt") &&
|
||||
|
||||
@@ -8,12 +8,32 @@
|
||||
namespace jet {
|
||||
|
||||
__ifrow::__ifrow(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, this, "else") {
|
||||
output = false;
|
||||
// NOT setting output=false here (an earlier version of this file
|
||||
// did) - that flag gates Tag::~Tag()'s own copyContainer(out,
|
||||
// parentOut) call, the mechanism that propagates whatever
|
||||
// processContainer() below actually wrote up to this tag's own
|
||||
// caller. <ifrow>'s entire purpose is to conditionally DISPLAY one
|
||||
// of its two branches (exactly like <if>/<while>/<until>, none of
|
||||
// which ever touch `output`) - unlike the tags that legitimately
|
||||
// do set it (<set>/<sql>/<cookie>/<header>/<write>/<tag>/
|
||||
// <comment>/<stream>, none of which have any visible content of
|
||||
// their own to emit), so setting it here silently discarded
|
||||
// EVERY <ifrow>'s rendered content, true branch or false, on every
|
||||
// single use. Confirmed live via gdb-style tracing: hasRow(),
|
||||
// the resolved session pointer, and container's own text were all
|
||||
// exactly correct at the point processContainer(container) ran -
|
||||
// the content just never reached parentOut because the destructor
|
||||
// skipped the copy. Never caught before because no real content
|
||||
// this session exercised an <ifrow> with real row data AND had
|
||||
// its rendered output actually inspected (account.page's own
|
||||
// <ifrow sessionid="projman"> usage always redirected before
|
||||
// reaching it, for lack of a login session).
|
||||
if(!hasContainer)
|
||||
throw coreutils::Exception("ifrow tag must have a container.");
|
||||
if(!global.sessionExists(keywords[resolveKeyword("sessionid")]))
|
||||
coreutils::MString sessionId = resolveKeyword("sessionid");
|
||||
if(!global.sessionExists(sessionId))
|
||||
throw coreutils::Exception("sessionid does not exist.");
|
||||
if(global.getSession(keywords[resolveKeyword("sessionid")])->hasRow())
|
||||
if(global.getSession(sessionId)->hasRow())
|
||||
processContainer(container);
|
||||
else
|
||||
processContainer(container2);
|
||||
|
||||
@@ -1,33 +1,102 @@
|
||||
#include "__include.h"
|
||||
#include "Exception.h"
|
||||
#include "File.h"
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <sys/stat.h>
|
||||
|
||||
namespace jet {
|
||||
|
||||
namespace {
|
||||
struct CachedInclude {
|
||||
std::string content;
|
||||
time_t mtime;
|
||||
};
|
||||
// Persistent, per-worker-thread cache of <include> file contents,
|
||||
// keyed by resolved filename. Real content depends on this
|
||||
// constantly through custom tag bodies that jetc's own compile-
|
||||
// time <include>-inlining doesn't reach (only the top-level .jet
|
||||
// source's own includes get compiled in) - mainpagetemplate.temp
|
||||
// alone pulls in login.menu/menu.bar/opensource.menu/cart.menu/
|
||||
// sessionvar.menu, all previously re-read from disk on every
|
||||
// single request even though the files are 100% static between
|
||||
// edits. Invalidated via mtime comparison (a stat() call, cheap
|
||||
// relative to a full read()) so a live edit still takes effect on
|
||||
// the very next request - matching the workflow already relied on
|
||||
// all session of editing .tag/.temp/.menu content directly and
|
||||
// seeing it live without a rebuild.
|
||||
thread_local std::unordered_map<std::string, CachedInclude> includeCache;
|
||||
}
|
||||
|
||||
__include::__include(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, local) {
|
||||
if(!keywordDefined("file"))
|
||||
throw coreutils::Exception("file keyword must be specified.");
|
||||
if(hasContainer)
|
||||
throw coreutils::Exception("include tag should not have a container.");
|
||||
hasContainer = true;
|
||||
coreutils::File file(resolveKeyword("file"));
|
||||
file.read();
|
||||
container = file.asZString();
|
||||
coreutils::MString includeFileName = resolveKeyword("file");
|
||||
std::string fileNameKey = includeFileName.str();
|
||||
|
||||
struct stat st;
|
||||
bool haveStat = (stat(fileNameKey.c_str(), &st) == 0);
|
||||
|
||||
auto cached = includeCache.find(fileNameKey);
|
||||
if(cached != includeCache.end() && haveStat && cached->second.mtime == st.st_mtime) {
|
||||
container = coreutils::ZString(cached->second.content.data(), cached->second.content.length());
|
||||
} else {
|
||||
coreutils::File file(includeFileName);
|
||||
file.read();
|
||||
if(haveStat) {
|
||||
CachedInclude &entry = includeCache[fileNameKey];
|
||||
entry.content = file.asString();
|
||||
entry.mtime = st.st_mtime;
|
||||
container = coreutils::ZString(entry.content.data(), entry.content.length());
|
||||
} else {
|
||||
// Couldn't stat the file (unusual - e.g. a race with deletion) -
|
||||
// don't cache something we can't validate the freshness of,
|
||||
// just render this one read directly, matching the pre-cache
|
||||
// behavior exactly for this edge case.
|
||||
container = file.asZString();
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
processContainer(container);
|
||||
}
|
||||
catch(coreutils::Exception e) {
|
||||
container.setCursor(global.errorCursor);
|
||||
container.moveBackToLineStart();
|
||||
std::cout << "-----------------------------" << std::endl;
|
||||
std::cout << "Error in included script '" << variables["file"] << "' at line " << container.getLineNumberAtCursor() << std::endl;
|
||||
std::cout << "Error text: " << e.text << std::endl;
|
||||
std::cout << "-----------------------------" << std::endl;
|
||||
std::cout << container.parsed() << std::endl;
|
||||
std::cout << "******** Error caught: " << e.text << std::endl;
|
||||
std::cout << container.unparsed() << std::endl;
|
||||
// global.errorCursor is whatever cursor was active in whichever
|
||||
// ZString buffer was being parsed at the moment the ORIGINAL
|
||||
// exception was thrown - not necessarily this include's own
|
||||
// `container` buffer at all (e.g. a keyword-resolution error
|
||||
// happening while interpreting a completely different .temp
|
||||
// file's own text). setCursor() on a pointer outside container's
|
||||
// own [data, data+length] range throws "Cursor out of range on
|
||||
// setCursor." - and since that happens INSIDE this diagnostic-
|
||||
// only "show a nice line number" block, it was replacing the
|
||||
// real error (e.text) with that unrelated cursor-range message
|
||||
// before it ever reached the caller, making every real error
|
||||
// from inside an <include> impossible to see. This is purely
|
||||
// diagnostic output - if it can't compute a line number, fall
|
||||
// back to printing the real error text without one rather than
|
||||
// losing it entirely.
|
||||
try {
|
||||
container.setCursor(global.errorCursor);
|
||||
container.moveBackToLineStart();
|
||||
std::cout << "-----------------------------" << std::endl;
|
||||
std::cout << "Error in included script '" << variables["file"] << "' at line " << container.getLineNumberAtCursor() << std::endl;
|
||||
std::cout << "Error text: " << e.text << std::endl;
|
||||
std::cout << "-----------------------------" << std::endl;
|
||||
std::cout << container.parsed() << std::endl;
|
||||
std::cout << "******** Error caught: " << e.text << std::endl;
|
||||
std::cout << container.unparsed() << std::endl;
|
||||
} catch(coreutils::Exception &) {
|
||||
std::cout << "-----------------------------" << std::endl;
|
||||
std::cout << "Error in included script '" << variables["file"] << "' (line number unavailable - error originated outside this include's own content)" << std::endl;
|
||||
std::cout << "Error text: " << e.text << std::endl;
|
||||
std::cout << "-----------------------------" << std::endl;
|
||||
}
|
||||
global.errorCursor = in.getCursor();
|
||||
throw coreutils::Exception("error in included file.");
|
||||
throw coreutils::Exception(e.text);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,34 +1,146 @@
|
||||
#include "__mysql.h"
|
||||
#include "Exception.h"
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
|
||||
namespace jet {
|
||||
|
||||
namespace {
|
||||
struct PooledConnection {
|
||||
MYSQL *handle;
|
||||
std::string host, user, database;
|
||||
};
|
||||
// Persistent, per-worker-thread connection cache - reused across
|
||||
// requests instead of a fresh mysql_real_connect() every time.
|
||||
// Safe with no locking: the apiserver's EPoll worker pool is a
|
||||
// fixed set of OS threads for the process's whole life (see
|
||||
// MysqlThreadScope's own doc comment - mysql_thread_init() runs
|
||||
// once per worker thread at thread start), so a thread_local
|
||||
// instance here means a given MYSQL* handle is only ever touched
|
||||
// by the one thread that created it, never concurrently accessed.
|
||||
// Keyed by sessionid, which is how this codebase's own <database>/
|
||||
// <sql>/<ifrow> tags already address a specific connection
|
||||
// (Global::sessions is keyed the same way) - the cached host/user/
|
||||
// database are kept alongside purely as a defensive check that a
|
||||
// reused entry really matches what THIS invocation asked for,
|
||||
// not a real expectation that sessionid is ever reused across
|
||||
// genuinely different backing databases in practice.
|
||||
thread_local std::unordered_map<std::string, PooledConnection> connectionPool;
|
||||
}
|
||||
|
||||
__mysql::__mysql(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, this) {
|
||||
|
||||
if(!keywordDefined("host"))
|
||||
throw coreutils::Exception("host must be specified for mysql tag.");
|
||||
if(!keywordDefined("database"))
|
||||
// jet-1.4's <database> spells the same attribute "name" instead of
|
||||
// "database" (e.g. SESSIONCTL.tag's own <sessionctl> definition) -
|
||||
// accept either rather than requiring that real content to change.
|
||||
coreutils::ZString databaseKeyword = keywordDefined("database") ? "database" : "name";
|
||||
if(!keywordDefined(databaseKeyword))
|
||||
throw coreutils::Exception("database must be specified for mysql tag.");
|
||||
if(!keywordDefined("user"))
|
||||
throw coreutils::Exception("user must be specified for mysql tag.");
|
||||
if(!keywordDefined("password"))
|
||||
throw coreutils::Exception("password must be specified for mysql tag.");
|
||||
|
||||
sessionId = keywords[resolveKeyword("sessionid")];
|
||||
// Same double-indirection bug as the host/user/password/database
|
||||
// fix above - resolveKeyword("sessionid") already returns the
|
||||
// resolved VALUE (e.g. "_SESSIONCTL"), so wrapping it in keywords[...]
|
||||
// used that value as a map KEY instead, auto-vivifying an empty
|
||||
// string (no attribute is ever literally named "_SESSIONCTL").
|
||||
// sessionId was therefore always empty regardless of what
|
||||
// sessionid= actually specified - confirmed live via gdb: two
|
||||
// real <mysql>/<database> tags with genuinely different sessionid
|
||||
// values ("" and "_SESSIONCTL") both registered under "", the
|
||||
// second colliding with "sessionid already exists.".
|
||||
sessionId = resolveKeyword("sessionid");
|
||||
|
||||
// mysql_real_connect() returns NULL on failure but does NOT itself
|
||||
// free the handle mysql_init() allocated - the caller is still
|
||||
// expected to mysql_close() that original handle to avoid leaking
|
||||
// it (MySQL C API docs). The previous code overwrote `mysql` with
|
||||
// the connect() return value directly, so on failure the only
|
||||
// pointer to the real handle was lost before ever being freed - a
|
||||
// real leak on every failed connection attempt (this member's
|
||||
// eventual value, NULL, is what a normal ~__mysql() would try to
|
||||
// mysql_close() anyway, which is a safe no-op, but that never even
|
||||
// runs here since the constructor throws below - see the
|
||||
// addSession() comment for why that matters more).
|
||||
// resolveKeyword() already returns the fully-resolved VALUE - the
|
||||
// previous keywords[resolveKeyword("host")] wrapped that resolved
|
||||
// VALUE ("localhost") back into a keywords[] lookup, i.e. used it
|
||||
// as a MAP KEY instead of the value itself. Since no attribute is
|
||||
// ever literally named "localhost"/the real username/etc.,
|
||||
// std::map::operator[] silently auto-vivified an empty MString for
|
||||
// every one of the four parameters - mysql_real_connect() was
|
||||
// therefore always called with host/user/password/database all
|
||||
// empty, regardless of what the tag actually specified. Confirmed
|
||||
// live: MySQL's own error ("Access denied for user 'barant'@'localhost'
|
||||
// (using password: NO)") showed the password was genuinely empty,
|
||||
// not merely wrong.
|
||||
coreutils::MString hostVal = resolveKeyword("host");
|
||||
coreutils::MString userVal = resolveKeyword("user");
|
||||
coreutils::MString passwordVal = resolveKeyword("password");
|
||||
coreutils::MString databaseVal = resolveKeyword(databaseKeyword);
|
||||
|
||||
// Reuse a live connection this same worker thread already holds
|
||||
// for this sessionid, rather than paying mysql_real_connect()'s
|
||||
// full handshake cost on every single request. mysql_ping() is
|
||||
// what makes this safe - it's a genuine round trip to the server,
|
||||
// so a connection MySQL itself already dropped (its own
|
||||
// wait_timeout, or an admin-initiated restart like this project
|
||||
// already lived through once) is detected and discarded here
|
||||
// rather than handed to processContainer() to fail on later.
|
||||
std::string poolKey = sessionId.str();
|
||||
auto pooled = connectionPool.find(poolKey);
|
||||
if(pooled != connectionPool.end() &&
|
||||
pooled->second.host == hostVal.str() &&
|
||||
pooled->second.user == userVal.str() &&
|
||||
pooled->second.database == databaseVal.str()) {
|
||||
if(mysql_ping(pooled->second.handle) == 0) {
|
||||
mysql = pooled->second.handle;
|
||||
} else {
|
||||
mysql_close(pooled->second.handle);
|
||||
connectionPool.erase(pooled);
|
||||
}
|
||||
}
|
||||
|
||||
if(!mysql) {
|
||||
MYSQL *handle = mysql_init(NULL);
|
||||
mysql = mysql_real_connect(handle,
|
||||
hostVal.c_str(),
|
||||
userVal.c_str(),
|
||||
passwordVal.c_str(),
|
||||
databaseVal.c_str(), 0, NULL, 0);
|
||||
|
||||
if(!mysql) {
|
||||
std::string err = mysql_error(handle);
|
||||
mysql_close(handle);
|
||||
throw coreutils::Exception("database connection failed: " + err);
|
||||
}
|
||||
|
||||
connectionPool[poolKey] = PooledConnection{mysql, hostVal.str(), userVal.str(), databaseVal.str()};
|
||||
}
|
||||
|
||||
// Registered only once the connection is confirmed live - a real,
|
||||
// reproducible crash (heap corruption - "free(): invalid pointer"
|
||||
// seen live, then two independent server-hang repros) traced back
|
||||
// to this: addSession() used to run BEFORE the connect attempt, so
|
||||
// a FAILED connection (which throws, right above) left a dangling
|
||||
// `this` pointer registered under sessionId in Global's session
|
||||
// map forever - ~__mysql() (which would normally call
|
||||
// removeSession()) never runs for a constructor that itself threw,
|
||||
// per ordinary C++ rules (only already-completed base-class
|
||||
// subobjects get destroyed during exception unwinding, not the
|
||||
// derived object whose constructor is still executing). The very
|
||||
// next <mysql> tag construction using the same sessionId (e.g. two
|
||||
// product pages with an empty sessionid="" back to back, both
|
||||
// failing the same way) then collided with that stale entry.
|
||||
// Confirmed via a real, deterministic two-request repro before this
|
||||
// fix, and confirmed gone after it.
|
||||
global.addSession(sessionId, this);
|
||||
|
||||
mysql = mysql_init(NULL);
|
||||
mysql = mysql_real_connect(mysql,
|
||||
keywords[resolveKeyword("host")].c_str(),
|
||||
keywords[resolveKeyword("user")].c_str(),
|
||||
keywords[resolveKeyword("password")].c_str(),
|
||||
keywords[resolveKeyword("database")].c_str(), 0, NULL, 0);
|
||||
|
||||
if(!mysql)
|
||||
throw coreutils::Exception("database and host parameters are not valid.");
|
||||
|
||||
processContainer(container);
|
||||
|
||||
}
|
||||
@@ -36,7 +148,11 @@ namespace jet {
|
||||
__mysql::~__mysql() {
|
||||
global.removeSession(sessionId);
|
||||
mysql_free_result(result);
|
||||
mysql_close(mysql);
|
||||
// mysql itself is deliberately NOT closed here anymore - see the
|
||||
// connectionPool doc comment above the constructor. It's owned by
|
||||
// this worker thread's persistent pool now and gets reused by
|
||||
// whatever request this thread handles next, instead of being
|
||||
// torn down and fully reconnected from scratch every time.
|
||||
}
|
||||
|
||||
void __mysql::query(coreutils::MString query) {
|
||||
@@ -46,6 +162,36 @@ namespace jet {
|
||||
row = mysql_fetch_row(result);
|
||||
fieldLength = mysql_fetch_lengths(result);
|
||||
qFields = mysql_num_fields(result);
|
||||
// Built once per query, not once per column LOOKUP - see the
|
||||
// matching comment on getColumnValue() and on fieldIndex's own
|
||||
// declaration in __mysql.h. mysql_fetch_fields() returns the
|
||||
// whole field array in one call (mysql_fetch_field_direct()
|
||||
// looping ix=0..qFields-1, as getColumnValue() used to do on
|
||||
// every single named access, does the exact same work over and
|
||||
// over for a result set whose schema never changes after this
|
||||
// point).
|
||||
fieldIndex.clear();
|
||||
MYSQL_FIELD *fields = mysql_fetch_fields(result);
|
||||
for(unsigned int ix = 0; ix < qFields; ++ix)
|
||||
fieldIndex[std::string(fields[ix].name)] = (int)ix;
|
||||
} else {
|
||||
// A failed/errored query (real content builds one from an unset
|
||||
// $[...] parameter, e.g. "where tasks.id=" with no value - genuine
|
||||
// MySQL syntax error) previously left row/qFields holding whatever
|
||||
// a PRIOR successful query on this same session object had set,
|
||||
// since only the success branch above ever touched them. A later
|
||||
// getColumnValue() call then looped 0..qFields (stale, nonzero)
|
||||
// calling mysql_fetch_field_direct() against this NULL `result` -
|
||||
// segfaulting (confirmed via gdb: SIGSEGV in
|
||||
// mysql_fetch_field_direct, called from getColumnValue) instead of
|
||||
// reaching the "column does not exist in session result." the
|
||||
// caller already throws/catches for a genuinely missing column.
|
||||
// Resetting both here makes a failed query present as "no row, no
|
||||
// columns" - clean and consistent regardless of what ran before it
|
||||
// on this session.
|
||||
row = NULL;
|
||||
qFields = 0;
|
||||
fieldIndex.clear();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,25 +209,51 @@ namespace jet {
|
||||
if(column == "?#") {
|
||||
nbrOfColumns = (int)qFields;
|
||||
return nbrOfColumns;
|
||||
} else if(column.ifNext("#")) {
|
||||
} else if(column.ifNext("#") || column.ifNext("?")) {
|
||||
// "#N"/"?N" (column name at 1-based position N) are the same
|
||||
// jet-1.4 syntax under two different prefixes - real, unmodified
|
||||
// 1.4 content uses both (barant.tag's own <showtable> definition
|
||||
// writes $[?$[index]], never $[#$[index]]) - confirmed via a real
|
||||
// repro: admin.page's own Users/Products tables rendered every
|
||||
// column header and cell completely blank, since "?N" fell all
|
||||
// the way through to the ordinary column-VALUE lookup below
|
||||
// (nothing named "?3" exists in the row) and read as empty rather
|
||||
// than as "the name of column 3", per the jet-1.4-fallback #2
|
||||
// empty-string-on-missing-column behavior elsewhere in this
|
||||
// codebase (see Tag.cpp).
|
||||
if(column.eod()) {
|
||||
nbrOfRows = (int)mysql_num_rows(result);
|
||||
return nbrOfRows;
|
||||
} else {
|
||||
std::cout << "[" << column.unparsed() << "]" << std::endl;
|
||||
int index = column.asInteger();
|
||||
std::cout << "integer: " << index << std::endl;
|
||||
field = mysql_fetch_field_direct(result, index - 1);
|
||||
return coreutils::ZString(field->name);
|
||||
}
|
||||
}
|
||||
|
||||
for(int ix = 0; ix < qFields; ++ix) {
|
||||
field = mysql_fetch_field_direct(result, ix);
|
||||
if(column.equals((char *)field->name)) {
|
||||
return coreutils::ZString(row[ix], fieldLength[ix]);
|
||||
}
|
||||
}
|
||||
// A query that ran successfully but matched zero rows (a real,
|
||||
// valid query - e.g. cart.page's own aggregate/JOIN query against
|
||||
// an empty cart session - not a failed one, see query()'s own
|
||||
// row=NULL/qFields=0 reset above for that separate case) leaves
|
||||
// qFields correctly reflecting the real schema but `row` NULL.
|
||||
// The loop below finds a genuine matching column name and then
|
||||
// dereferences row[ix] - segfaulting (confirmed via gdb: SIGSEGV
|
||||
// right here) instead of reaching a catchable error. Reusing the
|
||||
// same "column does not exist" exception the loop's own fallthrough
|
||||
// already throws - no current row means no column value is
|
||||
// obtainable either way, and callers already expect and catch
|
||||
// this exact exception.
|
||||
if(!row)
|
||||
throw coreutils::Exception("column does not exist in session result.");
|
||||
|
||||
// O(1) against the map query() already built for this result set,
|
||||
// instead of re-deriving field metadata (mysql_fetch_field_direct,
|
||||
// a real MySQL C API call) and string-comparing column names one
|
||||
// by one on every single named access - see fieldIndex's own doc
|
||||
// comment in __mysql.h for the full story.
|
||||
auto it = fieldIndex.find(column.str());
|
||||
if(it != fieldIndex.end())
|
||||
return coreutils::ZString(row[it->second], fieldLength[it->second]);
|
||||
throw coreutils::Exception("column does not exist in session result.");
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
#include "ZString.h"
|
||||
#include "MString.h"
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <mysql/mysql.h>
|
||||
|
||||
namespace jet {
|
||||
@@ -21,13 +23,29 @@ namespace jet {
|
||||
coreutils::ZString getColumnValue(coreutils::ZString column);
|
||||
|
||||
private:
|
||||
MYSQL *mysql;
|
||||
MYSQL_RES *result;
|
||||
MYSQL_ROW row;
|
||||
unsigned long *fieldLength;
|
||||
unsigned int qFields;
|
||||
// Explicitly initialized - result/row/fieldLength were otherwise
|
||||
// left as garbage stack values until query() first ran. A
|
||||
// <mysql>...</mysql> block that connects successfully but never
|
||||
// runs a <sql> query inside it (e.g. just a connectivity check)
|
||||
// would previously reach ~__mysql()'s mysql_free_result(result)
|
||||
// with an uninitialized pointer - real undefined behavior, found
|
||||
// while root-causing a live crash in a related part of this same
|
||||
// class's constructor.
|
||||
MYSQL *mysql = NULL;
|
||||
MYSQL_RES *result = NULL;
|
||||
MYSQL_ROW row = NULL;
|
||||
unsigned long *fieldLength = NULL;
|
||||
unsigned int qFields = 0;
|
||||
coreutils::MString sessionId;
|
||||
|
||||
// Column-name -> row[] index, built once per query() call (see its
|
||||
// own comment) instead of getColumnValue() re-deriving it via a
|
||||
// fresh mysql_fetch_field_direct() linear scan on every single
|
||||
// named lookup - a template reading N columns off one row used to
|
||||
// pay that scan N times over, even though the schema is fixed for
|
||||
// the lifetime of one result set.
|
||||
std::unordered_map<std::string, int> fieldIndex;
|
||||
|
||||
coreutils::MString nbrOfRows = "0";
|
||||
coreutils::MString nbrOfColumns = "0";
|
||||
|
||||
|
||||
@@ -13,10 +13,20 @@ namespace jet {
|
||||
output = false;
|
||||
if(!hasContainer)
|
||||
throw coreutils::Exception("sql tag must have a container.");
|
||||
if(!global.sessionExists(keywords["sessionid"]))
|
||||
// resolveKeyword("sessionid") already returns the resolved VALUE
|
||||
// (e.g. "projman") - the query call below used to wrap that value
|
||||
// back into keywords[...] as if it were a MAP KEY, auto-vivifying
|
||||
// an empty string and silently running every <sql sessionid="X">
|
||||
// query (X != "") against the DEFAULT session instead of the one
|
||||
// actually named - same double-indirection bug already fixed in
|
||||
// __mysql.cpp's own constructor (see its own comment on this).
|
||||
// Resolved once into a local so both the existence check and the
|
||||
// query call agree on the real, resolved session id.
|
||||
coreutils::MString sessionId = resolveKeyword("sessionid");
|
||||
if(!global.sessionExists(sessionId))
|
||||
throw coreutils::Exception("sessionid does not exist.");
|
||||
processContainer(container);
|
||||
global.getSession(keywords[resolveKeyword("sessionid")])->query(out);
|
||||
global.getSession(sessionId)->query(out);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -29,10 +29,19 @@ namespace jet {
|
||||
Tag *scope = parent;
|
||||
while(scope && !scope->isCustomTagBoundary)
|
||||
scope = scope->parent;
|
||||
// Custom tag NAMES are matched case-insensitively at invocation
|
||||
// (findTagDefinition normalizes its own lookup key the same way),
|
||||
// matching the precedent already set for built-in tag names
|
||||
// (ifTagName) and attribute names - real 1.4 content declares and
|
||||
// invokes a custom tag in different case at different sites (e.g.
|
||||
// SESSIONCTL.tag's own <TAG NAME='TEMPLATE'> definition vs
|
||||
// mainpagetemplate.temp's <template>...</template> invocation of
|
||||
// it). Registering under the lowercase key here is what makes that
|
||||
// match.
|
||||
coreutils::MString tagName = coreutils::MString(keywords["name"]).toLower();
|
||||
if(scope)
|
||||
scope->localTags[keywords["name"]] = container;
|
||||
scope->localTags[tagName] = container;
|
||||
else
|
||||
global.tags[keywords["name"]] = container;
|
||||
global.tags[tagName] = container;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace jet {
|
||||
if(!keywordDefined("type"))
|
||||
throw coreutils::Exception("type expected if value1 and value2 specified.");
|
||||
|
||||
int rc = keywords[resolveKeyword("value1")].compare(keywords[resolveKeyword("value2")]);
|
||||
int rc = resolveKeyword("value1").compare(resolveKeyword("value2"));
|
||||
if(((keywords[resolveKeyword("type")] == "eq") && (rc == 0)) ||
|
||||
((keywords[resolveKeyword("type")] == "ne") && (rc != 0)) ||
|
||||
((keywords[resolveKeyword("type")] == "lt") && (rc == -1)) ||
|
||||
@@ -50,7 +50,7 @@ namespace jet {
|
||||
booleanResult = Operand(keywords["expr"], *this).boolean;
|
||||
} else {
|
||||
booleanResult = false;
|
||||
int rc = keywords[resolveKeyword("value1")].compare(keywords[resolveKeyword("value2")]);
|
||||
int rc = resolveKeyword("value1").compare(resolveKeyword("value2"));
|
||||
if(((keywords[resolveKeyword("type")] == "eq") && (rc == 0)) ||
|
||||
((keywords[resolveKeyword("type")] == "ne") && (rc != 0)) ||
|
||||
((keywords[resolveKeyword("type")] == "lt") && (rc == -1)) ||
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace jet {
|
||||
if(!keywordDefined("type"))
|
||||
throw coreutils::Exception("type expected if value1 and value2 specified.");
|
||||
|
||||
int rc = keywords[resolveKeyword("value1")].compare(keywords[resolveKeyword("value2")]);
|
||||
int rc = resolveKeyword("value1").compare(resolveKeyword("value2"));
|
||||
if(((keywords[resolveKeyword("type")] == "eq") && (rc == 0)) ||
|
||||
((keywords[resolveKeyword("type")] == "ne") && (rc != 0)) ||
|
||||
((keywords[resolveKeyword("type")] == "lt") && (rc == -1)) ||
|
||||
@@ -50,7 +50,7 @@ namespace jet {
|
||||
booleanResult = Operand(keywords["expr"], *this).boolean;
|
||||
} else {
|
||||
booleanResult = false;
|
||||
int rc = keywords[resolveKeyword("value1")].compare(keywords[resolveKeyword("value2")]);
|
||||
int rc = resolveKeyword("value1").compare(resolveKeyword("value2"));
|
||||
if(((keywords[resolveKeyword("type")] == "eq") && (rc == 0)) ||
|
||||
((keywords[resolveKeyword("type")] == "ne") && (rc != 0)) ||
|
||||
((keywords[resolveKeyword("type")] == "lt") && (rc == -1)) ||
|
||||
|
||||
@@ -9,34 +9,99 @@
|
||||
namespace jet {
|
||||
|
||||
__whiledir::__whiledir(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, this) {
|
||||
if(!keywordDefined("path"))
|
||||
// Real 1.4 content (barantmusic.page/davidarant.page's own
|
||||
// bae1996.section) writes <whiledir dir="..." name="filename">,
|
||||
// not <whiledir path="..." filename="...">. Accept "dir" as an
|
||||
// alias for "path" and "name" as an alias for "filename" so that
|
||||
// content runs unmodified, matching the same "accept either"
|
||||
// precedent already used for <database name=>/<mysql database=>.
|
||||
// Resolved once into real local VALUES (not a dynamically-chosen
|
||||
// keyword NAME threaded through repeated keywordDefined()/
|
||||
// resolveKeyword() calls) - an earlier version of this fix passed
|
||||
// a ZString holding just the chosen attribute name around and hit
|
||||
// real, unexplained corruption (a whiledir on a real, correctly
|
||||
// specified directory resolved to a garbage nonsense path instead).
|
||||
// This form fixed it in isolation (a standalone whiledir_test.jet
|
||||
// against this exact directory/attributes works perfectly) but the
|
||||
// SAME garbage path still recurs when this exact content
|
||||
// (bae1996.section) is reached through real content's actual deep
|
||||
// <eval>/<dotag>/<include> nesting (40+ stack frames by that
|
||||
// point) - genuinely not yet root-caused; flagged in project
|
||||
// memory as still open. The try/catch below at least converts
|
||||
// whatever throws there into the same graceful, catchable error
|
||||
// page every other tag failure already gets, instead of a raw
|
||||
// std::exception unwinding past everything and dropping the
|
||||
// connection with no HTTP response at all.
|
||||
coreutils::MString dirPath;
|
||||
if(keywordDefined("path"))
|
||||
dirPath = resolveKeyword("path");
|
||||
else if(keywordDefined("dir"))
|
||||
dirPath = resolveKeyword("dir");
|
||||
else
|
||||
throw coreutils::Exception("whiledir tag must specify a path.");
|
||||
if(keywordDefined("sort") && (resolveKeyword("sort") == "true")) {
|
||||
std::vector<std::filesystem::directory_entry> entries;
|
||||
for(auto const &entry : std::filesystem::directory_iterator(resolveKeyword("path").str()))
|
||||
entries.push_back(entry);
|
||||
std::sort(entries.begin(), entries.end(), [](const auto &a, const auto &b) { return a.path() < b.path(); });
|
||||
for(const auto &entry : entries) {
|
||||
if(keywordDefined("fullpath"))
|
||||
global.variables[resolveKeyword("fullpath")] = entry.path();
|
||||
if(keywordDefined("filename"))
|
||||
global.variables[resolveKeyword("filename")] = entry.path().filename();
|
||||
if(keywordDefined("filenamenoextension"))
|
||||
global.variables[resolveKeyword("filenamenoextension")] = entry.path().stem();
|
||||
processContainer(container);
|
||||
container.reset();
|
||||
}
|
||||
} else {
|
||||
for(auto const &entry : std::filesystem::directory_iterator(variables[resolveKeyword("path")].str())) {
|
||||
if(keywordDefined("fullpath"))
|
||||
global.variables[resolveKeyword("fullpath")] = entry.path();
|
||||
if(keywordDefined("filename"))
|
||||
global.variables[resolveKeyword("filename")] = entry.path().filename();
|
||||
if(keywordDefined("filenamenoextension"))
|
||||
global.variables[resolveKeyword("filenamenoextension")] = entry.path().stem();
|
||||
processContainer(container);
|
||||
container.reset();
|
||||
|
||||
// Every one of these attributes - which output variable name to
|
||||
// assign into for a given field, and whether that field was even
|
||||
// requested - is a static property of this <whiledir> invocation,
|
||||
// fixed at construction, never changing across its own loop. The
|
||||
// per-iteration body used to call keywordDefined()+resolveKeyword()
|
||||
// (2 map lookups each) for fullpath/filename/filenamenoextension
|
||||
// on every single directory entry - resolved once here instead,
|
||||
// same reasoning as __whilerow.cpp's session-pointer hoist.
|
||||
coreutils::MString filenameVarName;
|
||||
bool haveFilenameVar = false;
|
||||
if(keywordDefined("filename")) {
|
||||
filenameVarName = resolveKeyword("filename");
|
||||
haveFilenameVar = true;
|
||||
} else if(keywordDefined("name")) {
|
||||
filenameVarName = resolveKeyword("name");
|
||||
haveFilenameVar = true;
|
||||
}
|
||||
|
||||
coreutils::MString fullpathVarName;
|
||||
bool haveFullpathVar = keywordDefined("fullpath");
|
||||
if(haveFullpathVar)
|
||||
fullpathVarName = resolveKeyword("fullpath");
|
||||
|
||||
coreutils::MString noExtVarName;
|
||||
bool haveNoExtVar = keywordDefined("filenamenoextension");
|
||||
if(haveNoExtVar)
|
||||
noExtVarName = resolveKeyword("filenamenoextension");
|
||||
|
||||
bool sorted = keywordDefined("sort") && (resolveKeyword("sort") == "true");
|
||||
|
||||
try {
|
||||
if(sorted) {
|
||||
std::vector<std::filesystem::directory_entry> entries;
|
||||
for(auto const &entry : std::filesystem::directory_iterator(dirPath.str()))
|
||||
entries.push_back(entry);
|
||||
std::sort(entries.begin(), entries.end(), [](const auto &a, const auto &b) { return a.path() < b.path(); });
|
||||
for(const auto &entry : entries) {
|
||||
if(haveFullpathVar)
|
||||
global.variables[fullpathVarName] = entry.path();
|
||||
if(haveFilenameVar)
|
||||
global.variables[filenameVarName] = entry.path().filename();
|
||||
if(haveNoExtVar)
|
||||
global.variables[noExtVarName] = entry.path().stem();
|
||||
processContainer(container);
|
||||
container.reset();
|
||||
}
|
||||
} else {
|
||||
for(auto const &entry : std::filesystem::directory_iterator(dirPath.str())) {
|
||||
if(haveFullpathVar)
|
||||
global.variables[fullpathVarName] = entry.path();
|
||||
if(haveFilenameVar)
|
||||
global.variables[filenameVarName] = entry.path().filename();
|
||||
if(haveNoExtVar)
|
||||
global.variables[noExtVarName] = entry.path().stem();
|
||||
processContainer(container);
|
||||
container.reset();
|
||||
}
|
||||
}
|
||||
} catch(std::exception &e) {
|
||||
coreutils::MString msg("whiledir failed: ");
|
||||
msg << e.what();
|
||||
throw coreutils::Exception(msg.str());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -7,12 +7,31 @@ namespace jet {
|
||||
|
||||
__whilerow::__whilerow(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, local) {
|
||||
|
||||
int count = keywords["count"].asInteger();
|
||||
// A bare <whilerow> (no count= attribute at all - the overwhelming
|
||||
// majority of real usage: modular1_patches.page, account.page,
|
||||
// task.page, project.page, editinvoice.page, musicianhome.page,
|
||||
// invoice.method, modular1_1_preset_admin.page) used to default
|
||||
// count to 0 - keywords["count"] auto-vivifies an empty string for
|
||||
// a missing attribute, and "".asInteger() is 0 - which made the
|
||||
// loop's own (count != 0) condition false on the very first check,
|
||||
// before hasRow() was ever even consulted. Every one of those
|
||||
// pages' row-based content silently rendered nothing, for every
|
||||
// request, this entire session - never caught because nothing
|
||||
// that exercised a bare <whilerow> with real row data also had its
|
||||
// actual rendered output inspected until now. count= is meant as
|
||||
// an OPTIONAL cap ("show at most N rows"); absent, it must mean
|
||||
// unlimited, not zero - -1 as a sentinel keeps working with the
|
||||
// existing (count != 0) loop test forever (decrementing through
|
||||
// negative numbers never hits 0), letting hasRow() alone decide
|
||||
// when the loop ends, exactly as bare usage always intended.
|
||||
int count = keywordDefined("count") ? keywords["count"].asInteger() : -1;
|
||||
|
||||
while ((count != 0) && global.getSession(keywords["sessionid"])->hasRow()) {
|
||||
__mysql *session = global.getSession(resolveKeyword("sessionid"));
|
||||
|
||||
while((count != 0) && session->hasRow()) {
|
||||
processContainer(container);
|
||||
container.reset();
|
||||
global.getSession(keywords["sessionid"])->nextRow();
|
||||
session->nextRow();
|
||||
--count;
|
||||
}
|
||||
|
||||
|
||||
@@ -24,19 +24,49 @@ namespace jet {
|
||||
throw coreutils::Exception("write tag must have a value, expr or a container.");
|
||||
if(!keywordDefined("mode"))
|
||||
throw coreutils::Exception("write tag must have a mode keyword.");
|
||||
if(keywords[resolveKeyword("mode")] == "append")
|
||||
// resolveKeyword("mode") already returns the resolved VALUE (e.g.
|
||||
// "overwrite") - re-indexing keywords[...] with that value treats
|
||||
// it as if it were a MAP KEY instead (auto-vivifying an empty
|
||||
// string, since no keyword is literally named "overwrite"/
|
||||
// "append"), so this comparison was false for every real input
|
||||
// and <write> threw "mode keyword must be..." unconditionally.
|
||||
// Same double-indirection bug already fixed elsewhere in this
|
||||
// codebase (__mysql.cpp's own constructor, __sql.cpp's sessionid
|
||||
// handling) - confirmed via a real repro building the jet-2.0
|
||||
// htmleditor port's file-based storage.
|
||||
coreutils::MString modeValue = resolveKeyword("mode");
|
||||
if(modeValue == "append")
|
||||
mode = O_APPEND;
|
||||
else if(keywords[resolveKeyword("mode")] == "overwrite")
|
||||
else if(modeValue == "overwrite")
|
||||
mode = O_TRUNC;
|
||||
else
|
||||
throw coreutils::Exception("mode keyword must be 'overwrite' or 'append'.");
|
||||
int fd = open(keywords[resolveKeyword("file")].c_str(), mode, 0644); // TODO: Need to add O_CREAT and AUTH flags.
|
||||
// mode alone (O_APPEND or O_TRUNC) has no access-mode bits at
|
||||
// all - open()'s access mode defaults to O_RDONLY (0) unless
|
||||
// O_WRONLY/O_RDWR is explicitly OR'd in, so the write() call below
|
||||
// was failing on every real invocation (EBADF - can't write a
|
||||
// read-only fd), and without O_CREAT this could never create a
|
||||
// NEW file either, only (theoretically) write an existing one.
|
||||
// Confirmed via a real repro: <write file="..." mode="overwrite">
|
||||
// silently produced a 0-byte or missing file every time.
|
||||
// Same double-indirection bug as "mode" above.
|
||||
int fd = open(resolveKeyword("file").c_str(), mode | O_WRONLY | O_CREAT, 0644); // TODO: Need to add AUTH flags.
|
||||
if(hasContainer && !evaluate)
|
||||
len = write(fd, container.getData(), container.getLength());
|
||||
else if(hasContainer && evaluate)
|
||||
len = write(fd, out.getData(), out.getLength());
|
||||
else if(!hasContainer && keywordDefined("value"))
|
||||
len = write(fd, variables[resolveKeyword("value")].getData(), keywords[resolveKeyword("value")].getLength());
|
||||
else if(!hasContainer && keywordDefined("value")) {
|
||||
// Same double-indirection bug as "mode"/"file" above:
|
||||
// variables[resolveKeyword("value")] used the resolved VALUE
|
||||
// itself as a lookup key into global.variables (a DIFFERENT map
|
||||
// entirely), not the literal value to write - looking up a
|
||||
// variable literally named e.g. "hello world" auto-vivifies an
|
||||
// empty entry, so this wrote 0 bytes for every real invocation.
|
||||
// Confirmed via a real repro: <write value="hello world"
|
||||
// mode="overwrite"> produced a genuinely empty file.
|
||||
coreutils::MString writeValue = resolveKeyword("value");
|
||||
len = write(fd, writeValue.getData(), writeValue.getLength());
|
||||
}
|
||||
else if(!hasContainer && keywordDefined("expr"))
|
||||
len = write(fd, keywords["expr"].getData(), keywords["expr"].getLength());
|
||||
close(fd);
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
namespace jetc {
|
||||
|
||||
enum class NodeKind {
|
||||
TEXT, VAR, SET, IF, FOR, WHILE, FALLBACK
|
||||
TEXT, VAR, SET, IF, FOR, WHILE, FALLBACK, TAGDEF, CONTAINER_SLOT
|
||||
};
|
||||
|
||||
enum class CondMode { VALUES, EXPR };
|
||||
@@ -55,6 +55,24 @@ namespace jetc {
|
||||
std::string forScope;
|
||||
std::vector<NodePtr> body; // also used by WHILE
|
||||
|
||||
// TAGDEF - a top-level <tag name="X">...</tag> custom-tag definition
|
||||
// (only recognized at the file's true top level - see Parser::topLevel;
|
||||
// one nested inside another tag's own definition body stays FALLBACK,
|
||||
// unchanged). tagDefName is already lowercased, matching __tag.cpp's
|
||||
// own registration key. tagDefBody is the compiled definition body
|
||||
// (may itself contain CONTAINER_SLOT nodes for <container> markers,
|
||||
// and FALLBACK leaves for anything still unsupported). rawSpan
|
||||
// (shared with FALLBACK, below) still holds the exact original source
|
||||
// text - codegen still emits the same raw interpretSpan-based
|
||||
// registration into global.tags alongside the new compiled fast path,
|
||||
// so anything that reaches this tag some other way keeps working
|
||||
// exactly as it does today.
|
||||
std::string tagDefName;
|
||||
std::vector<NodePtr> tagDefBody;
|
||||
|
||||
// CONTAINER_SLOT - a <container> marker (see Tag::renderContainer) -
|
||||
// a pure leaf, no extra fields.
|
||||
|
||||
// FALLBACK - exact original source text of one unsupported tag
|
||||
std::string rawSpan;
|
||||
};
|
||||
|
||||
@@ -49,124 +49,181 @@ namespace jetc {
|
||||
return expr.c_str();
|
||||
}
|
||||
|
||||
void Codegen::emitBody(const std::vector<NodePtr> &nodes, int indent) {
|
||||
for (auto &n : nodes) emitNode(n, indent);
|
||||
void Codegen::emitBody(const std::vector<NodePtr> &nodes, int indent, std::ostringstream &target) {
|
||||
for (auto &n : nodes) emitNode(n, indent, target);
|
||||
}
|
||||
|
||||
void Codegen::emitNode(const NodePtr &n, int indent) {
|
||||
void Codegen::emitNode(const NodePtr &n, int indent, std::ostringstream &target) {
|
||||
std::string I = ind(indent);
|
||||
switch (n->kind) {
|
||||
|
||||
case NodeKind::TEXT: {
|
||||
if (n->text.empty()) break;
|
||||
out << I << "out << " << cstr(n->text) << ";\n";
|
||||
target << I << "out << " << cstr(n->text) << ";\n";
|
||||
break;
|
||||
}
|
||||
|
||||
case NodeKind::VAR: {
|
||||
out << I << "{ coreutils::ZString v(" << cstr(n->varText) << "); out << scope.getVariable(v, true); }\n";
|
||||
target << I << "{ coreutils::ZString v(" << cstr(n->varText) << "); out << scope.getVariable(v, true); }\n";
|
||||
break;
|
||||
}
|
||||
|
||||
case NodeKind::SET: {
|
||||
std::string k = id("set_");
|
||||
out << I << "{\n";
|
||||
out << I << " scope.keywords[\"" << k << "name\"] = " << cstr(n->setName) << ";\n";
|
||||
out << I << " scope.keywords[\"" << k << "scope\"] = " << cstr(n->setScope) << ";\n";
|
||||
out << I << " coreutils::MString val;\n";
|
||||
target << I << "{\n";
|
||||
target << I << " scope.keywords[\"" << k << "name\"] = " << cstr(n->setName) << ";\n";
|
||||
target << I << " scope.keywords[\"" << k << "scope\"] = " << cstr(n->setScope) << ";\n";
|
||||
target << I << " coreutils::MString val;\n";
|
||||
if (n->setHasExpr) {
|
||||
out << I << " scope.keywords[\"" << k << "expr\"] = " << cstr(n->setExpr) << ";\n";
|
||||
out << I << " val = jet::Operand(scope.keywords[\"" << k << "expr\"], scope).string;\n";
|
||||
target << I << " scope.keywords[\"" << k << "expr\"] = " << cstr(n->setExpr) << ";\n";
|
||||
target << I << " val = jet::Operand(scope.keywords[\"" << k << "expr\"], scope).string;\n";
|
||||
} else {
|
||||
out << I << " scope.keywords[\"" << k << "value\"] = " << cstr(n->setHasValue ? n->setValue : std::string()) << ";\n";
|
||||
out << I << " val = scope.resolveKeyword(\"" << k << "value\");\n";
|
||||
target << I << " scope.keywords[\"" << k << "value\"] = " << cstr(n->setHasValue ? n->setValue : std::string()) << ";\n";
|
||||
target << I << " val = scope.resolveKeyword(\"" << k << "value\");\n";
|
||||
}
|
||||
out << I << " scope.assignVariable(scope.resolveKeyword(\"" << k << "name\"), val, scope.resolveKeyword(\"" << k << "scope\"));\n";
|
||||
out << I << "}\n";
|
||||
target << I << " scope.assignVariable(scope.resolveKeyword(\"" << k << "name\"), val, scope.resolveKeyword(\"" << k << "scope\"));\n";
|
||||
target << I << "}\n";
|
||||
break;
|
||||
}
|
||||
|
||||
case NodeKind::IF: {
|
||||
std::string k = id("if_");
|
||||
out << I << "{\n";
|
||||
out << I << " bool cond;\n";
|
||||
target << I << "{\n";
|
||||
target << I << " bool cond;\n";
|
||||
if (n->cond.mode == CondMode::EXPR) {
|
||||
out << I << " scope.keywords[\"" << k << "expr\"] = " << cstr(n->cond.expr) << ";\n";
|
||||
out << I << " cond = jet::Operand(scope.keywords[\"" << k << "expr\"], scope).boolean;\n";
|
||||
target << I << " scope.keywords[\"" << k << "expr\"] = " << cstr(n->cond.expr) << ";\n";
|
||||
target << I << " cond = jet::Operand(scope.keywords[\"" << k << "expr\"], scope).boolean;\n";
|
||||
} else {
|
||||
out << I << " scope.keywords[\"" << k << "value1\"] = " << cstr(n->cond.value1) << ";\n";
|
||||
out << I << " scope.keywords[\"" << k << "value2\"] = " << cstr(n->cond.value2) << ";\n";
|
||||
out << I << " int rc = scope.resolveKeyword(\"" << k << "value1\").compare(scope.resolveKeyword(\"" << k << "value2\"));\n";
|
||||
out << I << " cond = (" << staticTypeOp(n->cond.type, "rc") << ");\n";
|
||||
target << I << " scope.keywords[\"" << k << "value1\"] = " << cstr(n->cond.value1) << ";\n";
|
||||
target << I << " scope.keywords[\"" << k << "value2\"] = " << cstr(n->cond.value2) << ";\n";
|
||||
target << I << " int rc = scope.resolveKeyword(\"" << k << "value1\").compare(scope.resolveKeyword(\"" << k << "value2\"));\n";
|
||||
target << I << " cond = (" << staticTypeOp(n->cond.type, "rc") << ");\n";
|
||||
}
|
||||
out << I << " if (cond) {\n";
|
||||
emitBody(n->thenBody, indent + 2);
|
||||
target << I << " if (cond) {\n";
|
||||
emitBody(n->thenBody, indent + 2, target);
|
||||
if (n->hasElse) {
|
||||
out << I << " } else {\n";
|
||||
emitBody(n->elseBody, indent + 2);
|
||||
target << I << " } else {\n";
|
||||
emitBody(n->elseBody, indent + 2, target);
|
||||
}
|
||||
out << I << " }\n";
|
||||
out << I << "}\n";
|
||||
target << I << " }\n";
|
||||
target << I << "}\n";
|
||||
break;
|
||||
}
|
||||
|
||||
case NodeKind::FOR: {
|
||||
std::string k = id("for_");
|
||||
out << I << "{\n";
|
||||
out << I << " scope.keywords[\"" << k << "start\"] = " << cstr(n->forHasStart ? n->forStart : std::string("0")) << ";\n";
|
||||
out << I << " scope.keywords[\"" << k << "end\"] = " << cstr(n->forEnd) << ";\n";
|
||||
out << I << " scope.keywords[\"" << k << "step\"] = " << cstr(n->forStep) << ";\n";
|
||||
out << I << " double ix = scope.resolveKeyword(\"" << k << "start\").asDouble();\n";
|
||||
target << I << "{\n";
|
||||
target << I << " scope.keywords[\"" << k << "start\"] = " << cstr(n->forHasStart ? n->forStart : std::string("0")) << ";\n";
|
||||
target << I << " scope.keywords[\"" << k << "end\"] = " << cstr(n->forEnd) << ";\n";
|
||||
target << I << " scope.keywords[\"" << k << "step\"] = " << cstr(n->forStep) << ";\n";
|
||||
target << I << " double ix = scope.resolveKeyword(\"" << k << "start\").asDouble();\n";
|
||||
if (n->forHasName) {
|
||||
out << I << " scope.keywords[\"" << k << "name\"] = " << cstr(n->forName) << ";\n";
|
||||
out << I << " scope.keywords[\"" << k << "scope\"] = " << cstr(n->forScope) << ";\n";
|
||||
target << I << " scope.keywords[\"" << k << "name\"] = " << cstr(n->forName) << ";\n";
|
||||
target << I << " scope.keywords[\"" << k << "scope\"] = " << cstr(n->forScope) << ";\n";
|
||||
}
|
||||
out << I << " for (; ix <= scope.resolveKeyword(\"" << k << "end\").asDouble(); ix += scope.resolveKeyword(\"" << k << "step\").asDouble()) {\n";
|
||||
target << I << " for (; ix <= scope.resolveKeyword(\"" << k << "end\").asDouble(); ix += scope.resolveKeyword(\"" << k << "step\").asDouble()) {\n";
|
||||
if (n->forHasName) {
|
||||
out << I << " coreutils::MString nameSel = scope.resolveKeyword(\"" << k << "name\");\n";
|
||||
out << I << " coreutils::MString scopeSel = scope.resolveKeyword(\"" << k << "scope\");\n";
|
||||
out << I << " if ((scopeSel == \"\") || (scopeSel == \"global\")) global.variables[nameSel] = ix;\n";
|
||||
out << I << " else if (scopeSel == \"local\") scope.local->variables[nameSel] = ix;\n";
|
||||
out << I << " else if (scopeSel == \"parent\") scope.parent->local->variables[nameSel] = ix;\n";
|
||||
out << I << " else throw coreutils::Exception(\"scope value is not valid.\");\n";
|
||||
target << I << " coreutils::MString nameSel = scope.resolveKeyword(\"" << k << "name\");\n";
|
||||
target << I << " coreutils::MString scopeSel = scope.resolveKeyword(\"" << k << "scope\");\n";
|
||||
target << I << " if ((scopeSel == \"\") || (scopeSel == \"global\")) global.variables[nameSel] = ix;\n";
|
||||
target << I << " else if (scopeSel == \"local\") scope.local->variables[nameSel] = ix;\n";
|
||||
target << I << " else if (scopeSel == \"parent\") scope.parent->local->variables[nameSel] = ix;\n";
|
||||
target << I << " else throw coreutils::Exception(\"scope value is not valid.\");\n";
|
||||
}
|
||||
emitBody(n->body, indent + 2);
|
||||
out << I << " }\n";
|
||||
out << I << "}\n";
|
||||
emitBody(n->body, indent + 2, target);
|
||||
target << I << " }\n";
|
||||
target << I << "}\n";
|
||||
break;
|
||||
}
|
||||
|
||||
case NodeKind::WHILE: {
|
||||
std::string k = id("while_");
|
||||
out << I << "{\n";
|
||||
out << I << " bool cond;\n";
|
||||
target << I << "{\n";
|
||||
target << I << " bool cond;\n";
|
||||
if (n->cond.mode == CondMode::EXPR) {
|
||||
out << I << " scope.keywords[\"" << k << "expr\"] = " << cstr(n->cond.expr) << ";\n";
|
||||
out << I << " coreutils::MString exprSaved = scope.keywords[\"" << k << "expr\"];\n";
|
||||
out << I << " cond = jet::Operand(scope.keywords[\"" << k << "expr\"], scope).boolean;\n";
|
||||
out << I << " while (cond) {\n";
|
||||
emitBody(n->body, indent + 2);
|
||||
out << I << " scope.keywords[\"" << k << "expr\"].reset();\n";
|
||||
out << I << " scope.keywords[\"" << k << "expr\"] = exprSaved;\n";
|
||||
out << I << " cond = jet::Operand(scope.keywords[\"" << k << "expr\"], scope).boolean;\n";
|
||||
out << I << " }\n";
|
||||
target << I << " scope.keywords[\"" << k << "expr\"] = " << cstr(n->cond.expr) << ";\n";
|
||||
target << I << " coreutils::MString exprSaved = scope.keywords[\"" << k << "expr\"];\n";
|
||||
target << I << " cond = jet::Operand(scope.keywords[\"" << k << "expr\"], scope).boolean;\n";
|
||||
target << I << " while (cond) {\n";
|
||||
emitBody(n->body, indent + 2, target);
|
||||
target << I << " scope.keywords[\"" << k << "expr\"].reset();\n";
|
||||
target << I << " scope.keywords[\"" << k << "expr\"] = exprSaved;\n";
|
||||
target << I << " cond = jet::Operand(scope.keywords[\"" << k << "expr\"], scope).boolean;\n";
|
||||
target << I << " }\n";
|
||||
} else {
|
||||
out << I << " scope.keywords[\"" << k << "value1\"] = " << cstr(n->cond.value1) << ";\n";
|
||||
out << I << " scope.keywords[\"" << k << "value2\"] = " << cstr(n->cond.value2) << ";\n";
|
||||
out << I << " int rc = scope.resolveKeyword(\"" << k << "value1\").compare(scope.resolveKeyword(\"" << k << "value2\"));\n";
|
||||
out << I << " cond = (" << staticTypeOp(n->cond.type, "rc") << ");\n";
|
||||
out << I << " while (cond) {\n";
|
||||
emitBody(n->body, indent + 2);
|
||||
out << I << " int rc2 = scope.resolveKeyword(\"" << k << "value1\").compare(scope.resolveKeyword(\"" << k << "value2\"));\n";
|
||||
out << I << " cond = (" << staticTypeOp(n->cond.type, "rc2") << ");\n";
|
||||
out << I << " }\n";
|
||||
target << I << " scope.keywords[\"" << k << "value1\"] = " << cstr(n->cond.value1) << ";\n";
|
||||
target << I << " scope.keywords[\"" << k << "value2\"] = " << cstr(n->cond.value2) << ";\n";
|
||||
target << I << " int rc = scope.resolveKeyword(\"" << k << "value1\").compare(scope.resolveKeyword(\"" << k << "value2\"));\n";
|
||||
target << I << " cond = (" << staticTypeOp(n->cond.type, "rc") << ");\n";
|
||||
target << I << " while (cond) {\n";
|
||||
emitBody(n->body, indent + 2, target);
|
||||
target << I << " int rc2 = scope.resolveKeyword(\"" << k << "value1\").compare(scope.resolveKeyword(\"" << k << "value2\"));\n";
|
||||
target << I << " cond = (" << staticTypeOp(n->cond.type, "rc2") << ");\n";
|
||||
target << I << " }\n";
|
||||
}
|
||||
out << I << "}\n";
|
||||
target << I << "}\n";
|
||||
break;
|
||||
}
|
||||
|
||||
case NodeKind::FALLBACK: {
|
||||
out << I << "{ coreutils::ZString span(" << cstr(n->rawSpan) << "); scope.interpretSpan(span, out); }\n";
|
||||
target << I << "{ coreutils::ZString span(" << cstr(n->rawSpan) << "); scope.interpretSpan(span, out); }\n";
|
||||
break;
|
||||
}
|
||||
|
||||
case NodeKind::CONTAINER_SLOT: {
|
||||
// Reuses the interpreter's own <container> scope-walking logic
|
||||
// verbatim (see Tag::renderContainer) rather than re-deriving
|
||||
// it - this is exactly what the runtime's own <container>
|
||||
// dispatch does when it's reached via interpretSpan, just
|
||||
// without the text-scanning step to get there.
|
||||
target << I << "scope.renderContainer(out);\n";
|
||||
break;
|
||||
}
|
||||
|
||||
case NodeKind::TAGDEF: {
|
||||
// Codegen can still fail for a node that parsed successfully -
|
||||
// e.g. an <if>/<while> whose type= isn't one of eq/ne/lt/le/gt/ge
|
||||
// (staticTypeOp's own check - real legacy content occasionally
|
||||
// has one of these sitting in a branch that's never actually
|
||||
// reached at runtime either, so there's nothing to "correctly"
|
||||
// compile). Parsing this definition's body already succeeded
|
||||
// (see parseTagDef's own try/catch for that stage) or this node
|
||||
// wouldn't exist as TAGDEF at all - so mirror that same
|
||||
// graceful-degradation approach here for the emit stage: try
|
||||
// building the compiled function into a throwaway stream first,
|
||||
// and only splice it into tagDefFuncs (and register the
|
||||
// compiledTags fast path) if that fully succeeds. A failure
|
||||
// here just means this one definition stays interpreted,
|
||||
// unchanged - zero risk to the rest of the file.
|
||||
std::string funcName = "jetc_tagdef_" + id("");
|
||||
std::ostringstream trial;
|
||||
bool compiledOk = true;
|
||||
try {
|
||||
trial << "static void " << funcName << "(jet::Tag &scope, coreutils::MString &out) {\n";
|
||||
emitBody(n->tagDefBody, 1, trial);
|
||||
trial << "}\n\n";
|
||||
} catch (const std::exception &) {
|
||||
compiledOk = false;
|
||||
}
|
||||
|
||||
// Emitted in place, at this TAGDEF's original position in
|
||||
// program flow - matches exactly what FALLBACK would have
|
||||
// emitted for this same <tag name="X">...</tag> span, so
|
||||
// global.tags["x"] still gets populated as before (needed as a
|
||||
// correctness fallback: any invocation this compiler doesn't
|
||||
// itself recognize - e.g. reached through content this pass
|
||||
// never compiled - still resolves it exactly as it always has).
|
||||
target << I << "{ coreutils::ZString span(" << cstr(n->rawSpan) << "); scope.interpretSpan(span, out); }\n";
|
||||
if (compiledOk) {
|
||||
// The registration into compiledTags right after is the only
|
||||
// new behavior beyond the raw registration above - a pure
|
||||
// additive fast path __dotag checks first (see __dotag.cpp);
|
||||
// a miss there falls through to the now-unchanged interpreted
|
||||
// path, which is exactly what happens when compiledOk is
|
||||
// false here too.
|
||||
tagDefFuncs << trial.str();
|
||||
target << I << "global.compiledTags[coreutils::MString(" << cstr(n->tagDefName) << ")] = &" << funcName << ";\n";
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -177,6 +234,9 @@ namespace jetc {
|
||||
const std::vector<ApiRoute> &apiRoutes, const std::string &apiSymbol) {
|
||||
out.str("");
|
||||
out.clear();
|
||||
tagDefFuncs.str("");
|
||||
tagDefFuncs.clear();
|
||||
|
||||
out << "// " << sourceFileComment << "\n";
|
||||
out << "// Generated by jetc - DO NOT EDIT BY HAND.\n";
|
||||
out << "#include \"Global.h\"\n";
|
||||
@@ -187,51 +247,61 @@ namespace jetc {
|
||||
out << "#include \"Exception.h\"\n";
|
||||
out << "#include <iostream>\n\n";
|
||||
|
||||
// The entry function's own text is built into a separate stream so
|
||||
// tagDefFuncs - populated as a SIDE EFFECT of the emitBody() call
|
||||
// below, since TAGDEF nodes append to it as they're encountered -
|
||||
// can be spliced in ahead of it. A compiled tag-definition function
|
||||
// never needs to be forward-declared for anything defined before it
|
||||
// in program order (nothing upstream calls it directly - see
|
||||
// __dotag.cpp's runtime lookup instead), so this ordering is purely
|
||||
// for readability, not a correctness requirement.
|
||||
std::ostringstream body;
|
||||
|
||||
if (sharedMode) {
|
||||
if (!apiRoutes.empty()) {
|
||||
// A plain C struct, not any CoreUtils/JetCore type - this is the
|
||||
// one piece of the plugin ABI a host loader needs to know about
|
||||
// independent of the rest of this same-ABI C++ boundary.
|
||||
out << "struct JetApiRoute { const char *method; const char *path; };\n";
|
||||
out << "extern \"C\" const JetApiRoute *" << apiSymbol << "(int *count) {\n";
|
||||
out << " static const JetApiRoute routes[] = {\n";
|
||||
body << "struct JetApiRoute { const char *method; const char *path; };\n";
|
||||
body << "extern \"C\" const JetApiRoute *" << apiSymbol << "(int *count) {\n";
|
||||
body << " static const JetApiRoute routes[] = {\n";
|
||||
for (auto &r : apiRoutes)
|
||||
out << " { " << cstr(r.method) << ", " << cstr(r.path) << " },\n";
|
||||
out << " };\n";
|
||||
out << " *count = " << apiRoutes.size() << ";\n";
|
||||
out << " return routes;\n";
|
||||
out << "}\n\n";
|
||||
body << " { " << cstr(r.method) << ", " << cstr(r.path) << " },\n";
|
||||
body << " };\n";
|
||||
body << " *count = " << apiRoutes.size() << ";\n";
|
||||
body << " return routes;\n";
|
||||
body << "}\n\n";
|
||||
}
|
||||
out << "extern \"C\" void " << entrySymbol << "(jet::Global &global, coreutils::MString &out) {\n";
|
||||
out << " coreutils::ZString jetc_empty(\"\");\n";
|
||||
out << " coreutils::MString jetc_scopeOut;\n";
|
||||
out << " jet::Tag scope(jetc_empty, jetc_scopeOut, global, NULL, NULL);\n";
|
||||
emitBody(top, 1);
|
||||
out << "}\n";
|
||||
return out.str();
|
||||
body << "extern \"C\" void " << entrySymbol << "(jet::Global &global, coreutils::MString &out) {\n";
|
||||
body << " coreutils::ZString jetc_empty(\"\");\n";
|
||||
body << " coreutils::MString jetc_scopeOut;\n";
|
||||
body << " jet::Tag scope(jetc_empty, jetc_scopeOut, global, NULL, NULL);\n";
|
||||
emitBody(top, 1, body);
|
||||
body << "}\n";
|
||||
return out.str() + tagDefFuncs.str() + body.str();
|
||||
}
|
||||
|
||||
out << "static void jetc_render(jet::Global &global, coreutils::MString &out) {\n";
|
||||
out << " coreutils::ZString jetc_empty(\"\");\n";
|
||||
out << " coreutils::MString jetc_scopeOut;\n";
|
||||
out << " jet::Tag scope(jetc_empty, jetc_scopeOut, global, NULL, NULL);\n";
|
||||
emitBody(top, 1);
|
||||
out << "}\n\n";
|
||||
out << "int main(int argc, char **argv, char **envp) {\n";
|
||||
out << " jet::Global global(envp);\n";
|
||||
out << " coreutils::MString out;\n";
|
||||
out << " try {\n";
|
||||
out << " jetc_render(global, out);\n";
|
||||
out << " global.outputHeaders();\n";
|
||||
out << " std::cout << out;\n";
|
||||
out << " } catch(coreutils::Exception e) {\n";
|
||||
out << " std::cout << out;\n";
|
||||
out << " std::cout << \"\\n----- Error: \" << e.text << std::endl;\n";
|
||||
out << " return 1;\n";
|
||||
out << " }\n";
|
||||
out << " return 0;\n";
|
||||
out << "}\n";
|
||||
return out.str();
|
||||
body << "static void jetc_render(jet::Global &global, coreutils::MString &out) {\n";
|
||||
body << " coreutils::ZString jetc_empty(\"\");\n";
|
||||
body << " coreutils::MString jetc_scopeOut;\n";
|
||||
body << " jet::Tag scope(jetc_empty, jetc_scopeOut, global, NULL, NULL);\n";
|
||||
emitBody(top, 1, body);
|
||||
body << "}\n\n";
|
||||
body << "int main(int argc, char **argv, char **envp) {\n";
|
||||
body << " jet::Global global(envp);\n";
|
||||
body << " coreutils::MString out;\n";
|
||||
body << " try {\n";
|
||||
body << " jetc_render(global, out);\n";
|
||||
body << " global.outputHeaders();\n";
|
||||
body << " std::cout << out;\n";
|
||||
body << " } catch(coreutils::Exception e) {\n";
|
||||
body << " std::cout << out;\n";
|
||||
body << " std::cout << \"\\n----- Error: \" << e.text << std::endl;\n";
|
||||
body << " return 1;\n";
|
||||
body << " }\n";
|
||||
body << " return 0;\n";
|
||||
body << "}\n";
|
||||
return out.str() + tagDefFuncs.str() + body.str();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -62,11 +62,28 @@ namespace jetc {
|
||||
|
||||
private:
|
||||
std::ostringstream out;
|
||||
|
||||
// Free functions generated for compiled <tag name="X"> definitions
|
||||
// (see the TAGDEF case in emitNode) accumulate here, in the order
|
||||
// encountered, and are spliced into the final output ahead of the
|
||||
// entry function (see generate()) - C++ doesn't care about
|
||||
// definition order within one translation unit as long as nothing
|
||||
// outside of it needs a forward declaration, but keeping them
|
||||
// grouped together ahead of the entry point makes the generated
|
||||
// file easier to read/debug than interleaving them positionally.
|
||||
std::ostringstream tagDefFuncs;
|
||||
|
||||
size_t nextId = 0;
|
||||
std::string id(const std::string &prefix) { return prefix + std::to_string(nextId++) + "_"; }
|
||||
|
||||
void emitBody(const std::vector<NodePtr> &nodes, int indent);
|
||||
void emitNode(const NodePtr &n, int indent);
|
||||
// target is the stream this node's statements are written to - `out`
|
||||
// for everything at the top level or nested inside ordinary control
|
||||
// flow (IF/FOR/WHILE bodies stay in the same stream as their
|
||||
// enclosing scope), but a TAGDEF's own body is rendered into a
|
||||
// fresh stream to become a separate generated function (see
|
||||
// emitNode's TAGDEF case) rather than being inlined in place.
|
||||
void emitBody(const std::vector<NodePtr> &nodes, int indent, std::ostringstream &target);
|
||||
void emitNode(const NodePtr &n, int indent, std::ostringstream &target);
|
||||
static std::string ind(int indent);
|
||||
static std::string cstr(const std::string &raw); // C++ string-literal escape
|
||||
static const char *staticTypeOp(const std::string &type, const char *rcVar);
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
#include "JetParser.h"
|
||||
#include <cctype>
|
||||
#include <stdexcept>
|
||||
#include <set>
|
||||
#include <cstdio>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <cstdio>
|
||||
|
||||
namespace jetc {
|
||||
|
||||
@@ -29,37 +34,148 @@ namespace jetc {
|
||||
return s.substr(start, p - start);
|
||||
}
|
||||
|
||||
namespace {
|
||||
// jet-1.4 (the language this parser also has to accept, alongside
|
||||
// real 2.0 source) was fully case-insensitive on tag names - the
|
||||
// production source mixes case freely, even within one tag's own
|
||||
// body (e.g. <SET ...> and <set ...> side by side). Tag names are
|
||||
// matched case-insensitively throughout this parser for that
|
||||
// reason; nothing else (attribute values, text content) is
|
||||
// affected by this helper.
|
||||
bool ciEquals(const char *a, size_t alen, const std::string &b) {
|
||||
if (alen != b.size()) return false;
|
||||
for (size_t i = 0; i < alen; i++)
|
||||
if (std::tolower((unsigned char)a[i]) != std::tolower((unsigned char)b[i]))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool Parser::matchTagOpen(const std::string &name, size_t at) const {
|
||||
if (s.compare(at, 1, "<") != 0) return false;
|
||||
size_t p = at + 1;
|
||||
size_t nstart = p;
|
||||
while (p < s.size() && isNameChar(s[p])) p++;
|
||||
if (s.compare(nstart, p - nstart, name) != 0) return false;
|
||||
if (!ciEquals(s.data() + nstart, p - nstart, name)) return false;
|
||||
if (p >= s.size()) return false;
|
||||
char c = s[p];
|
||||
return c == ' ' || c == '>' || c == '/';
|
||||
}
|
||||
|
||||
bool Parser::matchTagClose(const std::string &name, size_t at) const {
|
||||
std::string closer = "</" + name + ">";
|
||||
return s.compare(at, closer.size(), closer) == 0;
|
||||
if (s.compare(at, 2, "</") != 0) return false;
|
||||
size_t p = at + 2;
|
||||
size_t nstart = p;
|
||||
while (p < s.size() && isNameChar(s[p])) p++;
|
||||
if (!ciEquals(s.data() + nstart, p - nstart, name)) return false;
|
||||
return p < s.size() && s[p] == '>';
|
||||
}
|
||||
|
||||
bool Parser::skipOpenTag(size_t &p) const {
|
||||
namespace {
|
||||
// jet-1.4's real parser knew which tags never take a body (its own
|
||||
// "void element" list) - kept here, ahead of skipOpenTag/
|
||||
// skipEmbeddedTag/parseFallback, since all of them need it.
|
||||
bool isVoidTag(const std::string &name) {
|
||||
static const std::set<std::string> voidTags = {
|
||||
// jet's own built-ins that never take a body. exclude is
|
||||
// NOT here - __exclude.cpp's own constructor requires a
|
||||
// real body (throws "exclude must have a container"
|
||||
// otherwise), it was previously miscategorized as void.
|
||||
"set", "include", "cookie", "header", "read", "write",
|
||||
"call", "system", "dump",
|
||||
// <container> (see parseContainerSlot/Tag::renderContainer) -
|
||||
// real content always writes it as a bare marker with no
|
||||
// separate closing tag, even when it carries its own
|
||||
// attributes (e.g. SESSIONCTL.tag's own
|
||||
// <CONTAINER EVAL="NO">) - without this it was previously only
|
||||
// reachable via the generic FALLBACK path (scanBody would
|
||||
// incorrectly scan forward for a "</container>" that never
|
||||
// exists, consuming unrelated following content).
|
||||
"container",
|
||||
// standard HTML5 void elements - real 1.4-era content (e.g.
|
||||
// SESSIONCTL.tag) writes these the classic HTML way too,
|
||||
// bare '>' and never a closing tag.
|
||||
"br", "img", "input", "hr", "meta", "link", "area", "base",
|
||||
"col", "embed", "source", "track", "wbr",
|
||||
// <else> is a marker inside an <if>/<while>/<until> body
|
||||
// (scanBody's own lookForElse handles it at the top level) -
|
||||
// it never has its own close tag, so when it shows up
|
||||
// embedded (inside a quoted attribute or another tag's
|
||||
// attribute region, same as <if> does in <linkbutton>) it
|
||||
// needs the same void treatment.
|
||||
"else"
|
||||
};
|
||||
std::string lower = name;
|
||||
for (char &c : lower) c = (char)std::tolower((unsigned char)c);
|
||||
return voidTags.count(lower) != 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Real 1.4 content nests real jet tags in two places a plain
|
||||
// quote/angle-bracket scanner can't handle on its own:
|
||||
// 1. Inside a quoted attribute value - SESSIONCTL.tag's <linkbutton>
|
||||
// has HREF="javascript: <IF VALUE1="..." VALUE2="" TYPE=NE> ...
|
||||
// </IF> ... " - the outer string and the embedded tag's own
|
||||
// attributes reuse the same quote character with no escaping.
|
||||
// 2. Inside another tag's OWN opening-tag attribute region, before
|
||||
// its closing '>' - linkbutton's <A ...> has a conditional
|
||||
// <if value1="#[CLASS]" value2="" type="ne">CLASS="#[CLASS]"</if>
|
||||
// sitting between its other attributes and its own '>' - the
|
||||
// literal '>' that ends the embedded <if ...>'s OWN opening tag
|
||||
// would otherwise be mistaken for <A>'s closing '>'.
|
||||
// skipEmbeddedTag() skips one such nested tag as a whole unit -
|
||||
// its own attributes (recursing through skipOpenTag, so an embedded
|
||||
// tag's embedded tag works too) and, if it isn't a void tag and wasn't
|
||||
// self-closed, its real body up through its own matching close tag
|
||||
// (via the same matchTagOpen/matchTagClose depth-tracking scanBody
|
||||
// uses at the top level). skipOpenTag's own attribute scan and
|
||||
// skipQuotedValue both call this for anything that looks like a
|
||||
// nested tag, instead of treating it as ordinary content.
|
||||
void Parser::skipEmbeddedTag(size_t &p) {
|
||||
size_t nameStart = p + 1;
|
||||
size_t nameEnd = nameStart;
|
||||
while (nameEnd < s.size() && isNameChar(s[nameEnd])) nameEnd++;
|
||||
std::string tagName = s.substr(nameStart, nameEnd - nameStart);
|
||||
bool selfClosing = skipOpenTag(p);
|
||||
if (!selfClosing && !isVoidTag(tagName)) {
|
||||
auto span = scanBody(p, tagName, false);
|
||||
p = span.first + 3 + tagName.size();
|
||||
}
|
||||
}
|
||||
|
||||
void Parser::skipQuotedValue(size_t &p) {
|
||||
p++; // opening '"'
|
||||
while (p < s.size()) {
|
||||
if (s[p] == '"') { p++; return; }
|
||||
if (s[p] == '\\' && p + 1 < s.size()) { p += 2; continue; }
|
||||
if (s[p] == '<' && p + 1 < s.size() && isNameChar(s[p + 1])) {
|
||||
skipEmbeddedTag(p);
|
||||
continue;
|
||||
}
|
||||
if (s[p] == '<' && s.compare(p, 2, "</") == 0) {
|
||||
p += 2;
|
||||
while (p < s.size() && isNameChar(s[p])) p++;
|
||||
if (p < s.size() && s[p] == '>') p++;
|
||||
continue;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
}
|
||||
|
||||
bool Parser::skipOpenTag(size_t &p) {
|
||||
p++; // '<'
|
||||
while (p < s.size() && isNameChar(s[p])) p++;
|
||||
while (p < s.size()) {
|
||||
if (s[p] == '"') {
|
||||
p++;
|
||||
while (p < s.size() && s[p] != '"') {
|
||||
if (s[p] == '\\' && p + 1 < s.size()) p++;
|
||||
p++;
|
||||
}
|
||||
if (p < s.size()) p++;
|
||||
skipQuotedValue(p);
|
||||
continue;
|
||||
}
|
||||
if (s.compare(p, 2, "/>") == 0) { p += 2; return true; }
|
||||
if (s[p] == '>') { p += 1; return false; }
|
||||
if (s[p] == '<' && p + 1 < s.size() && isNameChar(s[p + 1])) {
|
||||
skipEmbeddedTag(p);
|
||||
continue;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
throw std::runtime_error("jetc: unterminated tag near end of input");
|
||||
@@ -74,14 +190,40 @@ namespace jetc {
|
||||
if (starts(">")) { pos += 1; hasContainer = true; break; }
|
||||
std::string aname = readName();
|
||||
if (aname.empty()) throw std::runtime_error("jetc: malformed attribute near offset " + std::to_string(pos));
|
||||
if (starts("=\"")) {
|
||||
pos += 2;
|
||||
if (starts("=")) {
|
||||
pos += 1;
|
||||
std::string val;
|
||||
while (!eof() && s[pos] != '"') {
|
||||
if (s[pos] == '\\' && pos + 1 < s.size()) { val += s[pos]; val += s[pos + 1]; pos += 2; continue; }
|
||||
val += s[pos++];
|
||||
if (!eof() && s[pos] == '"') {
|
||||
pos++;
|
||||
while (!eof() && s[pos] != '"') {
|
||||
if (s[pos] == '\\' && pos + 1 < s.size()) { val += s[pos]; val += s[pos + 1]; pos += 2; continue; }
|
||||
val += s[pos++];
|
||||
}
|
||||
if (!eof()) pos++; // closing quote
|
||||
} else if (!eof() && s[pos] == '\'') {
|
||||
// Single-quoted value - real 1.4 content writes both
|
||||
// (SESSIONCTL.tag's own name='tmp_#[name]' alongside
|
||||
// ordinary name="..." elsewhere in the same file).
|
||||
pos++;
|
||||
while (!eof() && s[pos] != '\'') {
|
||||
if (s[pos] == '\\' && pos + 1 < s.size()) { val += s[pos]; val += s[pos + 1]; pos += 2; continue; }
|
||||
val += s[pos++];
|
||||
}
|
||||
if (!eof()) pos++; // closing quote
|
||||
} else {
|
||||
// Unquoted bareword value - real 1.4 content writes this
|
||||
// too (type=eq, format=tobrowser, TYPE=NE throughout
|
||||
// SESSIONCTL.tag) - the runtime interpreter's own
|
||||
// attribute scanning already tolerates it; jetc's own
|
||||
// parser previously didn't, since nothing had ever
|
||||
// recursively parsed a tag definition's own body deeply
|
||||
// enough to reach one before (see parseTagDef). Runs to
|
||||
// the next whitespace or the tag's own closing '>'/'/>' .
|
||||
while (!eof() && !std::isspace((unsigned char)s[pos]) && s[pos] != '>' &&
|
||||
!(s[pos] == '/' && pos + 1 < s.size() && s[pos + 1] == '>')) {
|
||||
val += s[pos++];
|
||||
}
|
||||
}
|
||||
if (!eof()) pos++; // closing quote
|
||||
attrs[aname] = val;
|
||||
}
|
||||
}
|
||||
@@ -126,7 +268,40 @@ namespace jetc {
|
||||
}
|
||||
|
||||
std::vector<NodePtr> Parser::parseSub(size_t start, size_t end) {
|
||||
Parser sub(s.substr(start, end - start));
|
||||
// Always topLevel=false - an <if>/<for>/<while> body is never the
|
||||
// file's true top level, regardless of what topLevel this Parser
|
||||
// itself was constructed with (see parseTagDef/isVoidTag's doc
|
||||
// comments - a <tag name="X"> found here stays FALLBACK, unchanged).
|
||||
Parser sub(s.substr(start, end - start), baseDir, includeDepth, false);
|
||||
return sub.parseNodes();
|
||||
}
|
||||
|
||||
std::vector<NodePtr> Parser::parseInclude() {
|
||||
pos += 8; // "<include"
|
||||
bool hasContainer;
|
||||
// <include> is always void, the same way <set> is (see parseSet) -
|
||||
// real content writes it bare (<include file="X">, no explicit
|
||||
// '/>'), which parseAttrs reports as hasContainer=true since it
|
||||
// can't tell that apart from a real container tag on syntax alone.
|
||||
auto attrs = parseAttrs(hasContainer);
|
||||
(void)hasContainer;
|
||||
auto it = attrs.find("file");
|
||||
if (it == attrs.end())
|
||||
throw std::runtime_error("jetc: <include> must have a file attribute.");
|
||||
if (includeDepth > 32)
|
||||
throw std::runtime_error("jetc: <include> depth exceeded (possible include cycle) resolving " + it->second);
|
||||
std::string fullPath = baseDir.empty() ? it->second : baseDir + "/" + it->second;
|
||||
std::ifstream in(fullPath);
|
||||
if (!in)
|
||||
throw std::runtime_error("jetc: <include> cannot open " + fullPath);
|
||||
std::ostringstream ss;
|
||||
ss << in.rdbuf();
|
||||
// Inherits the includer's own topLevel - an <include> spliced in at
|
||||
// the file's true top level reads as if its content were written
|
||||
// inline there (see this method's own doc comment), so a <tag
|
||||
// name="X"> defined in the included file is just as eligible for
|
||||
// compilation as one written directly in the includer.
|
||||
Parser sub(ss.str(), baseDir, includeDepth + 1, topLevel);
|
||||
return sub.parseNodes();
|
||||
}
|
||||
|
||||
@@ -146,21 +321,19 @@ namespace jetc {
|
||||
}
|
||||
|
||||
NodePtr Parser::parseSet() {
|
||||
size_t origStart = pos;
|
||||
pos += 4; // "<set"
|
||||
bool hasContainer;
|
||||
auto attrs = parseAttrs(hasContainer);
|
||||
if (hasContainer) {
|
||||
// Container-form <set> (value comes from rendering nested content)
|
||||
// isn't modeled by this prototype - fall back to full interpretation
|
||||
// of the whole tag instead of failing to compile.
|
||||
auto span = scanBody(pos, "set", false);
|
||||
pos = span.first + 3 + 3; // "</set>"
|
||||
auto n = std::make_shared<Node>();
|
||||
n->kind = NodeKind::FALLBACK;
|
||||
n->rawSpan = s.substr(origStart, pos - origStart);
|
||||
return n;
|
||||
}
|
||||
// jet-1.4's <set name=... value=... expr=...> is always a plain
|
||||
// attribute-based assignment - it never had a container/body form.
|
||||
// Real 1.4 content (config.cfg, SESSIONCTL.tag, throughout) writes
|
||||
// it with a bare closing '>' and no explicit </set>, which is
|
||||
// syntactically indistinguishable from a (speculative, and per the
|
||||
// comment this replaced, never actually implemented) 2.0
|
||||
// container-form <set>...</set>. Since the container form was never
|
||||
// real to begin with, <set> is always treated as self-closing here,
|
||||
// matching 1.4's actual, exclusive behavior rather than guessing.
|
||||
(void)hasContainer;
|
||||
auto n = std::make_shared<Node>();
|
||||
n->kind = NodeKind::SET;
|
||||
n->setName = attrs.count("name") ? attrs["name"] : "";
|
||||
@@ -246,7 +419,7 @@ namespace jetc {
|
||||
std::string tagName = peekTagName(pos);
|
||||
size_t p = pos;
|
||||
bool selfClosing = skipOpenTag(p);
|
||||
if (!selfClosing) {
|
||||
if (!selfClosing && !isVoidTag(tagName)) {
|
||||
auto span = scanBody(p, tagName, false);
|
||||
p = span.first + 3 + tagName.size();
|
||||
}
|
||||
@@ -257,6 +430,94 @@ namespace jetc {
|
||||
return n;
|
||||
}
|
||||
|
||||
NodePtr Parser::parseTagDef() {
|
||||
size_t origStart = pos;
|
||||
pos += 4; // "<tag"
|
||||
bool hasContainer;
|
||||
auto attrs = parseAttrs(hasContainer);
|
||||
std::string name = attrs.count("name") ? attrs["name"] : "";
|
||||
// A dynamic name ($[...]/#[...]) or a body-less definition can't be
|
||||
// (and, per __tag.cpp, isn't even valid as) a compiled definition -
|
||||
// fall back to the exact same FALLBACK behavior as before rather
|
||||
// than failing to compile. Real content always uses a literal name.
|
||||
bool dynamicName = name.find("$[") != std::string::npos || name.find("#[") != std::string::npos;
|
||||
if (!hasContainer || name.empty() || dynamicName) {
|
||||
if (hasContainer) {
|
||||
auto span = scanBody(pos, "tag", false);
|
||||
pos = span.first + 3 + 3; // "</tag>"
|
||||
}
|
||||
auto n = std::make_shared<Node>();
|
||||
n->kind = NodeKind::FALLBACK;
|
||||
n->rawSpan = s.substr(origStart, pos - origStart);
|
||||
return n;
|
||||
}
|
||||
std::string lowerName = name;
|
||||
for (char &c : lowerName) c = (char)std::tolower((unsigned char)c);
|
||||
|
||||
auto span = scanBody(pos, "tag", false);
|
||||
size_t closePos = span.first;
|
||||
size_t afterClose = closePos + 3 + 3; // "</tag>"
|
||||
|
||||
// Best-effort: this compiler's own modeled grammar is a real subset
|
||||
// of what the runtime interpreter tolerates (jet-1.4 content is
|
||||
// lenient in ways this parser doesn't fully cover yet - e.g. a
|
||||
// completely unrecognized bare tag like SESSIONCTL.tag's own
|
||||
// <setcookie ...>, which the interpreter just echoes as literal
|
||||
// text rather than treating as a real tag needing a close - see
|
||||
// Tag.cpp's own final dispatch fallback). Rather than teach every
|
||||
// such case to this parser up front, fall all the way back to the
|
||||
// exact same FALLBACK behavior a pre-TAGDEF compiler would have
|
||||
// produced for this whole span whenever the body can't be parsed -
|
||||
// this tag definition simply isn't compiled (stays fully
|
||||
// interpreted, unchanged), with zero risk to anything else in the
|
||||
// file. pos is never mutated by the failed parseSub call itself
|
||||
// (it operates on its own copied substring), so no explicit
|
||||
// rewind is needed before falling through.
|
||||
std::vector<NodePtr> body;
|
||||
bool bodyOk = true;
|
||||
try {
|
||||
body = parseSub(pos, closePos);
|
||||
} catch (const std::exception &) {
|
||||
bodyOk = false;
|
||||
}
|
||||
if (!bodyOk) {
|
||||
pos = afterClose;
|
||||
auto n = std::make_shared<Node>();
|
||||
n->kind = NodeKind::FALLBACK;
|
||||
n->rawSpan = s.substr(origStart, pos - origStart);
|
||||
return n;
|
||||
}
|
||||
pos = afterClose;
|
||||
|
||||
auto n = std::make_shared<Node>();
|
||||
n->kind = NodeKind::TAGDEF;
|
||||
n->tagDefName = lowerName;
|
||||
n->tagDefBody = body;
|
||||
// Exact original source text - codegen still emits the same
|
||||
// interpretSpan-based raw registration into global.tags alongside
|
||||
// the new compiled fast path (see JetCodegen's TAGDEF case), so
|
||||
// anything that reaches this tag some other way (a nested/locally-
|
||||
// scoped definition shadowing it, or interpreted content elsewhere)
|
||||
// keeps working exactly as it does today.
|
||||
n->rawSpan = s.substr(origStart, pos - origStart);
|
||||
return n;
|
||||
}
|
||||
|
||||
NodePtr Parser::parseContainerSlot() {
|
||||
pos += 10; // "<container"
|
||||
bool hasContainer;
|
||||
auto attrs = parseAttrs(hasContainer);
|
||||
// Attributes on <container> (eval=/name=/scope=, as real content
|
||||
// sometimes writes) are not consulted by the interpreter's own
|
||||
// <container> dispatch branch either (see Tag::renderContainer) -
|
||||
// matching that exactly rather than inventing new behavior here.
|
||||
(void)attrs;
|
||||
(void)hasContainer;
|
||||
auto n = std::make_shared<Node>();
|
||||
n->kind = NodeKind::CONTAINER_SLOT;
|
||||
return n;
|
||||
}
|
||||
|
||||
std::vector<NodePtr> Parser::parseNodes() {
|
||||
std::vector<NodePtr> nodes;
|
||||
std::string textBuf;
|
||||
@@ -287,6 +548,14 @@ namespace jetc {
|
||||
if (matchTagOpen("if", pos)) { flush(); nodes.push_back(parseIf()); continue; }
|
||||
if (matchTagOpen("for", pos)) { flush(); nodes.push_back(parseFor()); continue; }
|
||||
if (matchTagOpen("while", pos)) { flush(); nodes.push_back(parseWhile()); continue; }
|
||||
if (matchTagOpen("include", pos)) {
|
||||
flush();
|
||||
auto included = parseInclude();
|
||||
nodes.insert(nodes.end(), included.begin(), included.end());
|
||||
continue;
|
||||
}
|
||||
if (matchTagOpen("container", pos)) { flush(); nodes.push_back(parseContainerSlot()); continue; }
|
||||
if (topLevel && matchTagOpen("tag", pos)) { flush(); nodes.push_back(parseTagDef()); continue; }
|
||||
flush();
|
||||
nodes.push_back(parseFallback());
|
||||
continue;
|
||||
|
||||
@@ -21,7 +21,19 @@ namespace jetc {
|
||||
// gracefully instead of failing to compile.
|
||||
class Parser {
|
||||
public:
|
||||
explicit Parser(const std::string &src) : s(src), pos(0) {}
|
||||
// topLevel is false for any nested sub-parse (an <if>/<for>/<while>
|
||||
// body, via parseSub) and true for the file's own top-level flow and
|
||||
// for anything spliced in from an <include> (which inherits the
|
||||
// includer's own topLevel, since it's meant to read as if written
|
||||
// inline at that point - see parseInclude). Only used to decide
|
||||
// whether a <tag name="X"> definition is eligible for compilation
|
||||
// (see parseTagDef) - one found at topLevel==false (nested inside
|
||||
// another construct) stays FALLBACK, unchanged, matching __tag.cpp's
|
||||
// own locally-scoped-registration semantics that only a true
|
||||
// top-level definition is guaranteed to always be registered by the
|
||||
// time any invocation could reach it.
|
||||
explicit Parser(const std::string &src, std::string baseDir = "", int includeDepth = 0, bool topLevel = true)
|
||||
: s(src), pos(0), baseDir(baseDir), includeDepth(includeDepth), topLevel(topLevel) {}
|
||||
|
||||
std::vector<NodePtr> parseNodes();
|
||||
|
||||
@@ -29,6 +41,9 @@ namespace jetc {
|
||||
std::string s;
|
||||
size_t pos;
|
||||
size_t nextId = 0;
|
||||
std::string baseDir;
|
||||
int includeDepth;
|
||||
bool topLevel;
|
||||
|
||||
bool eof() const { return pos >= s.size(); }
|
||||
bool starts(const std::string &lit) const;
|
||||
@@ -42,7 +57,9 @@ namespace jetc {
|
||||
|
||||
// p points at '<' of some tag's opening; advances p past its '>' or
|
||||
// "/>", skipping quoted attribute values. Returns true if self-closing.
|
||||
bool skipOpenTag(size_t &p) const;
|
||||
bool skipOpenTag(size_t &p);
|
||||
void skipQuotedValue(size_t &p);
|
||||
void skipEmbeddedTag(size_t &p);
|
||||
|
||||
std::map<std::string, std::string> parseAttrs(bool &hasContainer);
|
||||
|
||||
@@ -54,6 +71,15 @@ namespace jetc {
|
||||
|
||||
std::vector<NodePtr> parseSub(size_t start, size_t end);
|
||||
|
||||
// <include file="..."> is spliced in at compile time - read the
|
||||
// referenced file (resolved relative to baseDir) and parse ITS
|
||||
// content as if it had been written inline here, so everything in
|
||||
// it (custom <tag> definitions included) goes through this real
|
||||
// compiler, not the separate runtime interpreter (which has its own,
|
||||
// independently-buggy nested-tag handling). Returns the parsed nodes
|
||||
// to be spliced into the caller's own node list.
|
||||
std::vector<NodePtr> parseInclude();
|
||||
|
||||
NodePtr parseVar();
|
||||
NodePtr parseSet();
|
||||
NodePtr parseIf();
|
||||
@@ -61,6 +87,21 @@ namespace jetc {
|
||||
NodePtr parseWhile();
|
||||
NodePtr parseFallback();
|
||||
|
||||
// <tag name="X">...</tag> at true top level (see topLevel above) -
|
||||
// compiles the definition body with a nested (topLevel=false) parse
|
||||
// instead of falling back to raw text, so jetc can generate a real
|
||||
// render function for it (see JetCodegen). Falls back to an ordinary
|
||||
// FALLBACK node (same as today) if the definition has no container
|
||||
// or no literal name= - degrades gracefully rather than failing to
|
||||
// compile.
|
||||
NodePtr parseTagDef();
|
||||
|
||||
// <container> (any case/attributes/closing style, always void - see
|
||||
// isVoidTag) - a leaf node; the actual rendering logic lives in
|
||||
// Tag::renderContainer, called from generated code exactly as the
|
||||
// interpreter's own <container> dispatch calls it today.
|
||||
NodePtr parseContainerSlot();
|
||||
|
||||
std::string newId(const std::string &prefix) { return prefix + std::to_string(nextId++) + "_"; }
|
||||
};
|
||||
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
|
||||
.controlframe {background: #888;
|
||||
padding: 5px 5px 15px 10px;
|
||||
}
|
||||
|
||||
.vm {position: relative;
|
||||
height: 55px;
|
||||
}
|
||||
|
||||
.vmname {position: absolute;
|
||||
left: 0px; top: 0px;
|
||||
height: 55px;
|
||||
}
|
||||
|
||||
.vmcover {position: absolute;
|
||||
left: 15px;
|
||||
top: 30px;
|
||||
font: 12px 'Dot Matrix';
|
||||
background: #bbb;
|
||||
color: white;
|
||||
border: 1pt solid white;
|
||||
border-radius: 5px;
|
||||
padding: 2px 10px 2px 10px;
|
||||
}
|
||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 1.3 MiB |
@@ -0,0 +1,26 @@
|
||||
|
||||
.controlframe {background: #16161c;
|
||||
border: 1px solid rgba(197, 164, 90, 0.28);
|
||||
border-radius: 3px;
|
||||
padding: 5px 5px 15px 10px;
|
||||
}
|
||||
|
||||
.vm {position: relative;
|
||||
height: 55px;
|
||||
}
|
||||
|
||||
.vmname {position: absolute;
|
||||
left: 0px; top: 0px;
|
||||
height: 55px;
|
||||
}
|
||||
|
||||
.vmcover {position: absolute;
|
||||
left: 15px;
|
||||
top: 30px;
|
||||
font: 12px 'Dot Matrix';
|
||||
background: #101014;
|
||||
color: #e3c47e;
|
||||
border: 1px solid rgba(197, 164, 90, 0.4);
|
||||
border-radius: 5px;
|
||||
padding: 2px 10px 2px 10px;
|
||||
}
|
||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 1.4 KiB |
@@ -0,0 +1,690 @@
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
}
|
||||
|
||||
@keyframes rotation {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: avenir;
|
||||
src: url('https://barant.com/fonts/AvenirLTStd-Light.ttf');
|
||||
}
|
||||
@font-face {
|
||||
font-family: source;
|
||||
src: url('https://barant.com/fonts/jackinput.TTF');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: exo2;
|
||||
src: url('https://barant.com/fonts/Exo2-RegularCondensed.otf');
|
||||
}
|
||||
|
||||
:root {
|
||||
--bond-bg: #0a0a0d;
|
||||
--bond-bg-2: #131318;
|
||||
--bond-panel: #16161c;
|
||||
--bond-panel-2: #1c1c24;
|
||||
--bond-line: rgba(197, 164, 90, 0.28);
|
||||
--bond-line-soft: rgba(255, 255, 255, 0.07);
|
||||
--bond-gold: #c5a45a;
|
||||
--bond-gold-bright: #e3c47e;
|
||||
--bond-ice: #6fb8c9;
|
||||
--bond-text: #e7e4dc;
|
||||
--bond-text-dim: #8d8c92;
|
||||
--bond-red: #a13a3a;
|
||||
}
|
||||
|
||||
* { box-sizing: border-box; }
|
||||
|
||||
body {
|
||||
background: radial-gradient(ellipse at top, #1a1a20 0%, #0a0a0d 60%, #060607 100%);
|
||||
background-attachment: fixed;
|
||||
font-family: exo2;
|
||||
color: var(--bond-text);
|
||||
margin: 10px 10px 10px 10px;
|
||||
width: 98%;
|
||||
}
|
||||
|
||||
a:link, a:visited { text-decoration: none; color: var(--bond-gold); }
|
||||
a:hover { text-decoration: none; color: var(--bond-gold-bright); }
|
||||
|
||||
h1 {
|
||||
font: 20pt exo2;
|
||||
letter-spacing: 0.12em;
|
||||
text-transform: uppercase;
|
||||
color: var(--bond-text);
|
||||
text-shadow: 0 0 0.6em rgba(197, 164, 90, 0.25);
|
||||
opacity: 0.95;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font: 14pt exo2;
|
||||
letter-spacing: 0.06em;
|
||||
color: var(--bond-gold-bright);
|
||||
}
|
||||
|
||||
h3 {
|
||||
font: 12pt exo2;
|
||||
letter-spacing: 0.05em;
|
||||
color: var(--bond-text);
|
||||
}
|
||||
|
||||
p { font-family: 8pt exo2; color: var(--bond-text); }
|
||||
|
||||
ul { font-family: 8pt exo2; }
|
||||
|
||||
li { font-family: 8pt exo2; color: var(--bond-text); }
|
||||
|
||||
.project_header {
|
||||
background: linear-gradient(180deg, #1c1c24, #101014);
|
||||
color: var(--bond-gold-bright);
|
||||
padding: 5px;
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
border-bottom: 1px solid var(--bond-line);
|
||||
}
|
||||
|
||||
.pageclass {
|
||||
background: var(--bond-bg-2);
|
||||
border-radius: 6px;
|
||||
border: 1px solid var(--bond-line);
|
||||
box-shadow: 0 0 0 1px rgba(0,0,0,0.6), 0 20px 60px rgba(0,0,0,0.65);
|
||||
border-spacing: 0px;
|
||||
padding: 0px;
|
||||
max-width: 1050px;
|
||||
min-width: 1050px;
|
||||
margin: auto;
|
||||
font-family: exo2;
|
||||
font-size: 10pt;
|
||||
color: var(--bond-text);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
input {
|
||||
background: #101014;
|
||||
color: var(--bond-text);
|
||||
border: 1px solid var(--bond-line-soft);
|
||||
font-family: exo2;
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
padding: 2px 6px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
input:focus {
|
||||
border-color: var(--bond-gold);
|
||||
box-shadow: 0 0 0 1px rgba(197, 164, 90, 0.35);
|
||||
}
|
||||
|
||||
select {
|
||||
background: #101014;
|
||||
color: var(--bond-text);
|
||||
font-family: exo2;
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
border: 1px solid var(--bond-line-soft);
|
||||
padding: 1px 2px 1px 2px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
textarea.fieldinput {
|
||||
background: #101014;
|
||||
color: var(--bond-text);
|
||||
resize: none;
|
||||
font-family: exo2;
|
||||
border: 1px solid var(--bond-line-soft);
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
padding: 2px 2px 2px 5px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
textarea.fieldinputerror {
|
||||
background: #241213;
|
||||
color: var(--bond-text);
|
||||
resize: none;
|
||||
font-family: exo2;
|
||||
border: 1px solid var(--bond-red);
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
padding: 2px 2px 2px 5px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.sectionframe {
|
||||
position: relative;
|
||||
font-family: exo2;
|
||||
border: 1px solid var(--bond-line-soft);
|
||||
font-size: 10pt;
|
||||
margin: 3px;
|
||||
background: var(--bond-panel);
|
||||
padding: 0px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.sectionframe:after{
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 1px;
|
||||
left: 1px;
|
||||
width: calc(100% - 2px);
|
||||
height: 1px;
|
||||
background: var(--bond-line);
|
||||
}
|
||||
|
||||
.sectionframecontents {
|
||||
padding: 10px;
|
||||
text-align: justify;
|
||||
color: var(--bond-text);
|
||||
border-top: 1px solid var(--bond-line-soft);
|
||||
background-color: var(--bond-panel);
|
||||
}
|
||||
.sectionframeheading {
|
||||
background: linear-gradient(180deg, #1c1c24, #131318);
|
||||
color: var(--bond-gold-bright);
|
||||
border-bottom: 1px solid var(--bond-line);
|
||||
vertical-align: middle;
|
||||
padding: 6px 10px;
|
||||
margin: 0px;
|
||||
font-family: 12pt avenir;
|
||||
letter-spacing: 0.08em;
|
||||
text-transform: uppercase;
|
||||
font-size: 10pt;
|
||||
border-radius: 3px 3px 0px 0px;
|
||||
}
|
||||
|
||||
.sectionframeheading2 {
|
||||
background: var(--bond-panel-2);
|
||||
color: var(--bond-gold-bright);
|
||||
font-family: exo2;
|
||||
font-size: 20pt;
|
||||
letter-spacing: 0.06em;
|
||||
padding: 3px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.heading {
|
||||
background: linear-gradient(180deg, #131318, #0d0d10);
|
||||
border-radius: 5px 5px 0px 0px;
|
||||
border-bottom: 1px solid var(--bond-line);
|
||||
max-height: 80px;
|
||||
}
|
||||
.entryform {
|
||||
background: #232330;
|
||||
padding: 6px;
|
||||
margin: 0px;
|
||||
border: 1px solid rgba(197, 164, 90, 0.5);
|
||||
border-radius: 3px;
|
||||
}
|
||||
.entryform table {
|
||||
font: 12px exo2;
|
||||
background: transparent;
|
||||
border: 0pt solid black;
|
||||
color: var(--bond-text);
|
||||
}
|
||||
|
||||
.footer {
|
||||
background: linear-gradient(180deg, #0a0a0d, #000);
|
||||
border-top: 1px solid var(--bond-line);
|
||||
font: 8pt verdana;
|
||||
letter-spacing: 0.05em;
|
||||
color: var(--bond-gold);
|
||||
text-align: center;
|
||||
padding: 6px 0;
|
||||
border-radius: 0px 0px 5px 5px;
|
||||
}
|
||||
|
||||
.menubar {
|
||||
background: #0a0a0d;
|
||||
border-bottom: 1px solid var(--bond-line);
|
||||
padding: 0px 0px 0px 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
.baritem {
|
||||
background: transparent;
|
||||
color: var(--bond-text-dim);
|
||||
position: relative;
|
||||
font-family: exo2;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.06em;
|
||||
font-size: 8pt;
|
||||
padding: 6px 10px;
|
||||
margin: 6px 0px 0px 0px;
|
||||
border: none;
|
||||
border-bottom: 2px solid transparent;
|
||||
border-radius: 0px;
|
||||
transition: color 0.25s ease, border-color 0.25s ease;
|
||||
}
|
||||
|
||||
.baritem:after{
|
||||
content: none;
|
||||
}
|
||||
|
||||
.baritemselected {
|
||||
/* Deliberately styled to read as the same surface as the content
|
||||
panel it opens into (matching background, gold border wrapping
|
||||
only the top/sides) - the open bottom edge is the same color as
|
||||
its own background rather than a hard line, so it visually reads
|
||||
as "raised up out of the black bar, connected to the page below"
|
||||
rather than just another highlighted nav item. */
|
||||
background: var(--bond-panel);
|
||||
color: var(--bond-gold-bright);
|
||||
font-family: exo2;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.06em;
|
||||
font-size: 8pt;
|
||||
padding: 7px 10px 8px 10px;
|
||||
margin: 4px 0px 0px 0px;
|
||||
border: 1px solid var(--bond-gold);
|
||||
border-bottom: 1px solid var(--bond-panel);
|
||||
border-radius: 5px 5px 0px 0px;
|
||||
box-shadow: 0 -2px 8px rgba(197, 164, 90, 0.18);
|
||||
text-shadow: 0 0 0.5em rgba(197, 164, 90, 0.35);
|
||||
}
|
||||
|
||||
.baritem:hover {
|
||||
color: var(--bond-gold-bright);
|
||||
border-bottom: 2px solid var(--bond-line);
|
||||
transition: color 0.2s ease, border-color 0.2s ease;
|
||||
}
|
||||
|
||||
.panel {
|
||||
background: var(--bond-panel);
|
||||
margin: 10px;
|
||||
padding: 3px;
|
||||
border: 1px solid var(--bond-line-soft);
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.panel table {
|
||||
font: 12px exo2;
|
||||
padding: 5px;
|
||||
background: var(--bond-panel-2);
|
||||
border: 1px solid var(--bond-line-soft);
|
||||
border-radius: 6px;
|
||||
color: var(--bond-text);
|
||||
}
|
||||
.panel table th {
|
||||
background: #101014;
|
||||
color: var(--bond-gold-bright);
|
||||
padding: 2px 3px 3px 3px;
|
||||
border: 0pt;
|
||||
letter-spacing: 0.04em;
|
||||
}
|
||||
.panel table td {
|
||||
background: transparent;
|
||||
color: var(--bond-text);
|
||||
padding: 2px 3px 3px 3px;
|
||||
border: 0pt;
|
||||
}
|
||||
|
||||
.left {
|
||||
text-align: right;
|
||||
padding-left: 20px;
|
||||
border-radius: 6px 0px 0px 6px;
|
||||
}
|
||||
|
||||
.right {
|
||||
border-radius: 0px 6px 6px 0px;
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
.featured { background: var(--bond-panel); }
|
||||
|
||||
.buttonbay {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
.fieldinput {
|
||||
font-family: exo2;
|
||||
border-radius: 3px;
|
||||
padding: 2px 2px 2px 5px;
|
||||
border: 1px solid var(--bond-line-soft);
|
||||
background: #101014;
|
||||
color: var(--bond-text);
|
||||
}
|
||||
.fieldinputerror {
|
||||
font-family: exo2;
|
||||
border-radius: 3px;
|
||||
padding: 2px 2px 2px 5px;
|
||||
background: #241213;
|
||||
border: 1px solid var(--bond-red);
|
||||
color: var(--bond-text);
|
||||
}
|
||||
.fieldprompt {
|
||||
font-size: 10pt;
|
||||
text-align: right;
|
||||
color: var(--bond-gold-bright);
|
||||
background: transparent;
|
||||
}
|
||||
.message { font: bold 10pt verdana; color: #d97a7a; }
|
||||
.collection_heading { font: bold 12pt verdana; color: var(--bond-gold-bright); }
|
||||
.collection_text { font: 10pt verdana; color: var(--bond-text); }
|
||||
.collection_tracks_background { font: 8pt bold verdana; color: var(--bond-text); background: #101014; }
|
||||
.warning { font: 10pt verdana; background: #3a1414; color: #e0a0a0; text-align: justify; border: 1px solid var(--bond-red); }
|
||||
|
||||
.button {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
font-size: 10pt;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.04em;
|
||||
color: var(--bond-gold-bright);
|
||||
border: 1px solid var(--bond-gold);
|
||||
background: linear-gradient(180deg, #1c1c24, #131318);
|
||||
padding: 2px 10px 3px 10px;
|
||||
margin: 0px;
|
||||
border-radius: 3px;
|
||||
transition: box-shadow 0.2s ease, background 0.2s ease;
|
||||
}
|
||||
|
||||
.button:hover {
|
||||
box-shadow: 0 0 0.6em rgba(197, 164, 90, 0.35);
|
||||
background: linear-gradient(180deg, #24242e, #1a1a20);
|
||||
}
|
||||
|
||||
.button:after{
|
||||
content: none;
|
||||
}
|
||||
|
||||
.code {
|
||||
font-family: source;
|
||||
font-weight: 400;
|
||||
font-size: 10pt;
|
||||
border: 1px solid var(--bond-line-soft);
|
||||
background: #101014;
|
||||
color: var(--bond-gold-bright);
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
/* SPA content-swap fade transition */
|
||||
#content {
|
||||
transition: opacity 0.18s ease;
|
||||
}
|
||||
#content.spa-fading {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
/* Shopping cart */
|
||||
.cart-notice {
|
||||
background: var(--bond-panel-2);
|
||||
border: 1px solid var(--bond-line);
|
||||
border-left: 3px solid var(--bond-gold);
|
||||
color: var(--bond-text);
|
||||
padding: 8px 12px;
|
||||
margin: 0 0 10px 0;
|
||||
border-radius: 3px;
|
||||
font-size: 9pt;
|
||||
}
|
||||
|
||||
.cart-wrap {
|
||||
border: 1px solid var(--bond-line);
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
background: var(--bond-panel);
|
||||
}
|
||||
|
||||
.cart-header {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 90px 90px 100px 70px;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
padding: 8px 14px;
|
||||
background: linear-gradient(180deg, #1c1c24, #131318);
|
||||
border-bottom: 1px solid var(--bond-line);
|
||||
color: var(--bond-gold-bright);
|
||||
font-size: 8pt;
|
||||
letter-spacing: 0.08em;
|
||||
text-transform: uppercase;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.cart-header .cart-col-price,
|
||||
.cart-header .cart-col-qty,
|
||||
.cart-header .cart-col-total {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.cart-items {
|
||||
max-height: 420px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.cart-row {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 90px 90px 100px 70px;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
padding: 10px 14px;
|
||||
border-bottom: 1px solid var(--bond-line-soft);
|
||||
color: var(--bond-text);
|
||||
font-size: 9pt;
|
||||
transition: background 0.15s ease;
|
||||
}
|
||||
|
||||
.cart-row:last-child { border-bottom: none; }
|
||||
|
||||
.cart-row:hover {
|
||||
background: rgba(197, 164, 90, 0.06);
|
||||
}
|
||||
|
||||
.cart-row .cart-col-desc {
|
||||
font-weight: 500;
|
||||
color: var(--bond-text);
|
||||
}
|
||||
|
||||
.cart-row .cart-col-price,
|
||||
.cart-row .cart-col-total {
|
||||
text-align: right;
|
||||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
|
||||
.cart-row .cart-col-total {
|
||||
color: var(--bond-gold-bright);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.cart-row .cart-col-qty {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.cart-qty-input {
|
||||
width: 60px !important;
|
||||
text-align: center;
|
||||
margin: 0 !important;
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
.cart-col-remove {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.cart-remove-link {
|
||||
color: var(--bond-text-dim) !important;
|
||||
font-size: 8pt;
|
||||
letter-spacing: 0.04em;
|
||||
text-transform: uppercase;
|
||||
border: 1px solid var(--bond-line-soft);
|
||||
border-radius: 3px;
|
||||
padding: 3px 8px;
|
||||
transition: color 0.15s ease, border-color 0.15s ease, background 0.15s ease;
|
||||
}
|
||||
|
||||
.cart-remove-link:hover {
|
||||
color: #d97a7a !important;
|
||||
border-color: var(--bond-red);
|
||||
background: rgba(161, 58, 58, 0.12);
|
||||
}
|
||||
|
||||
.cart-summary {
|
||||
padding: 12px 14px;
|
||||
background: linear-gradient(180deg, #131318, #0d0d10);
|
||||
border-top: 1px solid var(--bond-line);
|
||||
}
|
||||
|
||||
.cart-summary-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: baseline;
|
||||
color: var(--bond-text);
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
.cart-summary-total {
|
||||
color: var(--bond-gold-bright);
|
||||
font-size: 14pt;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.02em;
|
||||
}
|
||||
|
||||
.cart-empty {
|
||||
text-align: center;
|
||||
padding: 50px 20px;
|
||||
color: var(--bond-text-dim);
|
||||
}
|
||||
|
||||
.cart-empty-icon {
|
||||
font-size: 40pt;
|
||||
opacity: 0.5;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.cart-empty-title {
|
||||
font-size: 13pt;
|
||||
color: var(--bond-text);
|
||||
letter-spacing: 0.04em;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.cart-empty-text {
|
||||
font-size: 9pt;
|
||||
color: var(--bond-text-dim);
|
||||
}
|
||||
|
||||
/* Checkout */
|
||||
.checkout-header {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 90px 70px 100px;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
padding: 8px 14px;
|
||||
background: linear-gradient(180deg, #1c1c24, #131318);
|
||||
border-bottom: 1px solid var(--bond-line);
|
||||
color: var(--bond-gold-bright);
|
||||
font-size: 8pt;
|
||||
letter-spacing: 0.08em;
|
||||
text-transform: uppercase;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.checkout-header .checkout-col-qty {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.checkout-row {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 90px 70px 100px;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
padding: 10px 14px;
|
||||
border-bottom: 1px solid var(--bond-line-soft);
|
||||
color: var(--bond-text);
|
||||
font-size: 9pt;
|
||||
}
|
||||
|
||||
.checkout-row:last-child { border-bottom: none; }
|
||||
|
||||
.checkout-row .checkout-col-qty {
|
||||
text-align: right;
|
||||
color: var(--bond-text-dim);
|
||||
}
|
||||
|
||||
.checkout-pay-wrap {
|
||||
max-width: 380px;
|
||||
margin: 0 auto;
|
||||
padding: 6px 0 4px 0;
|
||||
}
|
||||
|
||||
.checkout-pay-label {
|
||||
font-size: 8pt;
|
||||
letter-spacing: 0.08em;
|
||||
text-transform: uppercase;
|
||||
color: var(--bond-text-dim);
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
.checkout-card-input {
|
||||
background: var(--bond-panel-2);
|
||||
border: 1px solid var(--bond-line);
|
||||
border-radius: 4px;
|
||||
padding: 10px;
|
||||
min-height: 40px;
|
||||
margin-bottom: 14px;
|
||||
}
|
||||
|
||||
.checkout-pay-btn {
|
||||
display: block;
|
||||
width: 100%;
|
||||
font-size: 11pt;
|
||||
padding: 9px 10px 10px 10px;
|
||||
text-align: center;
|
||||
color: #0a0a0d;
|
||||
background: linear-gradient(180deg, var(--bond-gold-bright), var(--bond-gold));
|
||||
border: 1px solid var(--bond-gold);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.checkout-pay-btn:hover {
|
||||
background: linear-gradient(180deg, #f0d89a, var(--bond-gold-bright));
|
||||
box-shadow: 0 0 0.6em rgba(197, 164, 90, 0.45);
|
||||
}
|
||||
|
||||
.checkout-pay-btn:disabled {
|
||||
cursor: default;
|
||||
opacity: 0.55;
|
||||
background: linear-gradient(180deg, #1c1c24, #131318);
|
||||
color: var(--bond-text-dim);
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.checkout-processing {
|
||||
visibility: hidden;
|
||||
background: var(--bond-panel-2);
|
||||
border: 1px solid var(--bond-line);
|
||||
border-left: 3px solid var(--bond-gold);
|
||||
color: var(--bond-text);
|
||||
padding: 8px 12px;
|
||||
margin-top: 12px;
|
||||
border-radius: 3px;
|
||||
font-size: 9pt;
|
||||
}
|
||||
|
||||
.checkout-error {
|
||||
color: #d97a7a;
|
||||
font-size: 9pt;
|
||||
margin-top: 12px;
|
||||
min-height: 1.2em;
|
||||
}
|
||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 811 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 1.7 KiB |
@@ -1,385 +0,0 @@
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
}
|
||||
|
||||
@keyframes rotation {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: avenir;
|
||||
src: url('https://barant.com/fonts/AvenirLTStd-Light.ttf');
|
||||
}
|
||||
@font-face {
|
||||
font-family: source;
|
||||
src: url('https://barant.com/fonts/jackinput.TTF');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: exo2;
|
||||
src: url('https://barant.com/fonts/Exo2-RegularCondensed.otf');
|
||||
}
|
||||
|
||||
|
||||
body {background: linear-gradient(to bottom, #ccc, #444);
|
||||
font-family: exo2;
|
||||
margin: 10px 10px 10px 10px;
|
||||
width: 98%;
|
||||
}
|
||||
|
||||
a:link {text-decoration: none}
|
||||
a:visited {text-decoration:none}
|
||||
a:hover {text-decoration:none}
|
||||
|
||||
h1 {font: 20pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
color: #808080;
|
||||
opacity: 0.9;}
|
||||
|
||||
h2 {font: 14pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
}
|
||||
|
||||
h3 {font: 12pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
}
|
||||
|
||||
p {font-family: 8pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
}
|
||||
|
||||
ul {font-family: 8pt exo2;}
|
||||
|
||||
li {font-family: 8pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
}
|
||||
|
||||
.project_header {background: #88c;
|
||||
color: #fff;
|
||||
padding: 5px;
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.pageclass {background: #fff;
|
||||
border-radius: 10px;
|
||||
border: 2pt outset;
|
||||
border-spacing: 0px;
|
||||
padding: 0px;
|
||||
max-width: 1050px;
|
||||
min-width: 1050px
|
||||
margin: auto;
|
||||
text-shadow: 0 0 0.1em #CCC, 0 0 0.1em #87F;
|
||||
font-family: exo2;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
input {background: #fff;
|
||||
border: 1px inset;
|
||||
font-family: exo2;
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
|
||||
-webkit-border-radius: 2px;
|
||||
-moz-border-radius: 2px;
|
||||
-o-border-radius: 2px;
|
||||
-ms-border-radius: 2px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
select {background: #fff;
|
||||
font-family: exo2;
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
border: 1px solid #444;
|
||||
padding: 1px 2px 1px 2px;
|
||||
-webkit-border-radius: 7px;
|
||||
-moz-border-radius: 7px;
|
||||
-o-border-radius: 7px;
|
||||
-ms-border-radius: 7px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
textarea.fieldinput {background: #fff;
|
||||
resize: none;
|
||||
font-family: exo2;
|
||||
border: 1px solid #444;
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
padding: 2px 2px 2px 5px;
|
||||
-webkit-border-radius: 0px;
|
||||
-moz-border-radius: 0px;
|
||||
-o-border-radius: 0px;
|
||||
-ms-border-radius: 0px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
textarea.fieldinputerror {background: #fcc;
|
||||
resize: none;
|
||||
font-family: exo2;
|
||||
border: 1px solid #f00;
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
padding: 2px 2px 2px 5px;
|
||||
-webkit-border-radius: 7px;
|
||||
-moz-border-radius: 7px;
|
||||
-o-border-radius: 7px;
|
||||
-ms-border-radius: 7px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
.sectionframe {
|
||||
position: relative;
|
||||
font-family: exo2;
|
||||
border: 0px outset;
|
||||
font-size: 10pt;
|
||||
margin: 3px;
|
||||
background: #808080;
|
||||
padding: 0px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
.sectionframe:after{
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 1px;
|
||||
left: 1px;
|
||||
width: calc(100% - 2px);
|
||||
height: 12px;
|
||||
background: linear-gradient(rgba(255,255,255,0.5), rgba(255,255,255,0.2));
|
||||
}
|
||||
|
||||
.sectionframecontents {
|
||||
padding: 10px;
|
||||
text-align: justify;
|
||||
color: #000000;
|
||||
border: 1pt inset;
|
||||
background-color: #F8F8FF;
|
||||
}
|
||||
.sectionframeheading {
|
||||
# background: linear-gradient(to bottom, #fff, #88f);
|
||||
background: #2099f0;
|
||||
color: #fff;
|
||||
border: 1pt outset;
|
||||
vertical-align: middle;
|
||||
padding: 5px;
|
||||
margin: 0px;
|
||||
font-family: 12pt avenir;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
border-radius: 0px 0px 0px 0px;
|
||||
}
|
||||
|
||||
.sectionframeheading2 {
|
||||
background: #C0C0C0;
|
||||
font-family: exo2;
|
||||
font-size: 20pt;
|
||||
padding: 3px
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.heading {background: #fff;
|
||||
border-radius: 7px 7px 0px 0px;
|
||||
max-height: 80px;
|
||||
}
|
||||
.entryform {
|
||||
background: #2099f0;
|
||||
padding: 3px 3px 3px 3px;
|
||||
margin: 0px;
|
||||
border: 0px solid black;
|
||||
border-radius: 0px;
|
||||
}
|
||||
.entryform table {
|
||||
font: 12px exo2;
|
||||
background: #c5e1f4;
|
||||
border: 0pt solid black;
|
||||
}
|
||||
|
||||
.footer {
|
||||
background: linear-gradient(to bottom, #000, #888);
|
||||
font: 8pt verdana;
|
||||
color: #FFFFFF;
|
||||
text-align: center;
|
||||
border-radius: 0px 0px 6px 6px;}
|
||||
|
||||
.menubar {
|
||||
# background: linear-gradient(to bottom, #fff, #2099f0);
|
||||
padding: 0px 0px 0px 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
.baritem {
|
||||
background-image: linear-gradient(#2099f0, #c3ddef);
|
||||
color: #fff;
|
||||
position: relative;
|
||||
font-family: exo2;
|
||||
font-weight: 1000;
|
||||
font-size: 8pt;
|
||||
padding: 2px 10px;
|
||||
margin: 10px 0px 0px 0px;
|
||||
border: solid;
|
||||
border-width: 0px 0px 1px 0px;
|
||||
border-color: #fff;
|
||||
border-radius: 5px 5px 0px 0px;
|
||||
border-style: outset;
|
||||
transition: background 2s;
|
||||
}
|
||||
|
||||
.baritem:after{
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 1px;
|
||||
left: 1px;
|
||||
width: calc(100% - 2px);
|
||||
height: 50%;
|
||||
z-index: 5;
|
||||
pointer-events: none;
|
||||
border-radius: 4px 4px 0px 0px;
|
||||
background: linear-gradient(rgba(255,255,255,0.8), rgba(255,255,255,0.2));
|
||||
}
|
||||
|
||||
.baritemselected {
|
||||
background: #ccc;
|
||||
color: #000;
|
||||
font-family: exo2;
|
||||
font-weight: 1000;
|
||||
font-size: 8pt;
|
||||
padding: 2px 10px;
|
||||
margin: 5px 10px 0px 0px;
|
||||
border: solid;
|
||||
border-width: 1px 1px 0px 1px;
|
||||
border-color: #fff;
|
||||
border-radius: 5px 5px 0px 0px;
|
||||
border-style: outset;
|
||||
transition: background 2s;
|
||||
|
||||
}
|
||||
|
||||
.baritem:hover {
|
||||
background: #c3ddef;
|
||||
color: #fff;
|
||||
transition: background 5s;
|
||||
}
|
||||
|
||||
.panel {background: #ccc;
|
||||
margin: 10px;
|
||||
padding: 3px;
|
||||
border: 0pt inset;}
|
||||
|
||||
.panel table {
|
||||
font: 12px exo2;
|
||||
padding: 5px;
|
||||
background: #c5e1f4;
|
||||
border: 1pt solid black;
|
||||
border-radius: 9px;
|
||||
}
|
||||
.panel table th {
|
||||
background: #2099f0;
|
||||
color: #fff;
|
||||
padding: 2px 3px 3px 3px;
|
||||
border: 0pt;
|
||||
}
|
||||
.panel table td {
|
||||
background: #c5e1f4;
|
||||
color: #000;
|
||||
padding: 2px 3px 3px 3px;
|
||||
border: 0pt;
|
||||
}
|
||||
|
||||
.left {
|
||||
text-align: right;
|
||||
padding-left: 20px;
|
||||
border-radius: 9px 0px 0px 9px;
|
||||
}
|
||||
|
||||
.right {
|
||||
border-radius: 0px 9px 9px 0px;
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
.featured {background: #fff}
|
||||
|
||||
.buttonbay {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
.fieldinput {
|
||||
font-family: exo2;
|
||||
border-radius: 7px;
|
||||
padding: 2px 2px 2px 5px;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
.fieldinputerror {
|
||||
font-family: exo2;
|
||||
border-radius: 7px;
|
||||
padding: 2px 2px 2px 5px;
|
||||
background: #fcc;
|
||||
border: 1px solid red;
|
||||
}
|
||||
.fieldprompt {
|
||||
font-size: 10pt;
|
||||
text-align: right;
|
||||
background: #00f;
|
||||
}
|
||||
.message {font: bold 10pt verdana; color: #FF0000}
|
||||
.collection_heading {font: bold 12pt verdana; color: #FFFFFF}
|
||||
.collection_text {font: 10pt verdana; color: #FFFFFF}
|
||||
.collection_tracks_background {font: 8pt bold verdana; color: #FFFFFF; background: #10003F}
|
||||
.warning {font: 10pt verdana; background: #FF0000; color: #FFFFFF; text-align: justify}
|
||||
|
||||
.button {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
font-size: 10pt;
|
||||
font-weight: 400;
|
||||
color: #fff;
|
||||
border: 2px outset;
|
||||
background: #2099f0;
|
||||
padding: 2px 10px 3px 10px;
|
||||
margin: 0px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.button:after{
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
width: calc(100% - 0px);
|
||||
height: 10px;
|
||||
z-index: 5;
|
||||
border-radius: 3px;
|
||||
background: linear-gradient(rgba(255,255,255,0.8), rgba(255,255,255,0.2));
|
||||
}
|
||||
|
||||
.code {
|
||||
font-family: source;
|
||||
font-weight: 400;
|
||||
font-size: 10pt;
|
||||
border: 1pt solid black;
|
||||
background: #ff8;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
|
||||
@@ -12,28 +12,27 @@ IMG_CACHE = ROOT + "/assets/images"
|
||||
os.makedirs(OUT, exist_ok=True)
|
||||
os.makedirs(IMG_CACHE, exist_ok=True)
|
||||
|
||||
IMG_MIME = {
|
||||
".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg",
|
||||
".gif": "image/gif", ".svg": "image/svg+xml", ".webp": "image/webp",
|
||||
".ico": "image/x-icon",
|
||||
}
|
||||
|
||||
|
||||
def resolve_images(html):
|
||||
"""Find any remaining /images/<file> reference (src="..." or url('...'))
|
||||
and inline it as a data: URI, fetching+caching from barant.com on first
|
||||
use - APIServer has no static-file serving, same reason the chrome logo
|
||||
and page CSS/fonts needed inlining earlier this session."""
|
||||
"""Find any /images/<file> or images/<file> reference (src="...",
|
||||
href="...", or CSS url('...')) and repoint it at the live APIServer
|
||||
GET /assets/{filename} route instead of inlining it as a data: URI -
|
||||
fetching+caching from barant.com into the same assets/images/ cache
|
||||
directory on first use (unchanged), just no longer embedding the raw
|
||||
bytes into every page's own HTML (undoes the earlier base64-inlining
|
||||
approach now that a real static-asset module exists to serve these).
|
||||
Matches both the absolute form (/images/x.png) and the relative form
|
||||
(images/x.png, no leading slash) - the previous version of this
|
||||
function only matched the absolute form, silently leaving several
|
||||
real <img src="images/.."> references un-rewritten and pointing
|
||||
nowhere (APIServer has no /images/ route at all)."""
|
||||
def repl(m):
|
||||
path = m.group(1) # e.g. images/grid.png
|
||||
fname = path.split("/")[-1]
|
||||
ext = os.path.splitext(fname)[1].lower()
|
||||
mime = IMG_MIME.get(ext, "application/octet-stream")
|
||||
local_path = IMG_CACHE + "/" + fname
|
||||
if not os.path.exists(local_path):
|
||||
subprocess.run(["curl", "-s", "-o", local_path, "https://barant.com/" + path], check=True)
|
||||
return data_uri(local_path, mime)
|
||||
html = re.sub(r'/images/([A-Za-z0-9_.-]+)(?=["\'])', repl, html)
|
||||
return "/assets/" + fname
|
||||
html = re.sub(r'/?images/([A-Za-z0-9_.-]+)(?=["\'])', repl, html)
|
||||
return html
|
||||
|
||||
|
||||
@@ -199,6 +198,72 @@ opensource_menu = flatten_linkbuttons(opensource_menu)
|
||||
|
||||
SIDEBAR_HTML = opensource_menu
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# SPA bootstrap script: present once, in the chrome, on every FULL page load
|
||||
# (never in a fragment-only response, which has no <head>/<script> of its
|
||||
# own). Intercepts clicks on internal <a href="/..."> links and swaps just
|
||||
# #jetc-content via fetch('/name?fragment=1') instead of a full navigation;
|
||||
# also drives the browser back/forward buttons via popstate. See the
|
||||
# FULL_PAGE_TMPL / FRAGMENT_TMPL split in convert_page() for how a single
|
||||
# route serves both the full page and the fragment-only response, decided
|
||||
# by the ?fragment=1 query flag.
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
# Pages excluded from client-side fragment fetching entirely - a click on
|
||||
# one of these falls through to an ORDINARY browser navigation (hitting
|
||||
# the full-page route, confirmed safe) instead of being intercepted.
|
||||
# Real, deterministic finding: <name>?fragment=1 for a MYSQL_PAGES page
|
||||
# crashes the whole apiserver process on the very FIRST such request
|
||||
# (reproduced repeatedly - not state-dependent, not "two failures in a
|
||||
# row"), while the exact same page's full-page route (no ?fragment=1)
|
||||
# fails cleanly with the expected "database and host parameters are not
|
||||
# valid." and the server survives. Root cause not isolated (a <mysql>
|
||||
# connection failure unwinding through the smaller <tag name="_frag_X">
|
||||
# definition specifically, vs surviving fine through the larger
|
||||
# <tag name="_full_X"> one, for reasons not chased down further given
|
||||
# scope) - this is a mitigation, not a fix, and only matters while these
|
||||
# pages fail (no real DB password configured); worth re-testing once a
|
||||
# real DB is wired in, since a successful <mysql> connection takes a
|
||||
# completely different code path that may not hit this at all.
|
||||
FRAGMENT_EXCLUDED_PAGES = sorted(MYSQL_PAGES)
|
||||
|
||||
SPA_SCRIPT = """<script>
|
||||
(function() {
|
||||
var FRAGMENT_EXCLUDED = %s;
|
||||
function pageNameFromPath(path) {
|
||||
var name = path.replace(/^\\//, '').replace(/\\.page$/, '');
|
||||
return name || 'main';
|
||||
}
|
||||
function loadPage(name, push) {
|
||||
fetch('/' + name + '?fragment=1').then(function(resp) {
|
||||
if (!resp.ok) throw new Error('HTTP ' + resp.status);
|
||||
return resp.text();
|
||||
}).then(function(html) {
|
||||
var el = document.getElementById('jetc-content');
|
||||
if (el) el.innerHTML = html;
|
||||
if (push) history.pushState({page: name}, '', '/' + name);
|
||||
}).catch(function(err) {
|
||||
console.error('jetc-spa: failed to load page', name, err);
|
||||
});
|
||||
}
|
||||
document.addEventListener('click', function(ev) {
|
||||
if (ev.defaultPrevented || ev.button !== 0 || ev.metaKey || ev.ctrlKey || ev.shiftKey || ev.altKey) return;
|
||||
var target = ev.target.nodeType === 1 ? ev.target : ev.target.parentElement;
|
||||
var a = target ? target.closest('a') : null;
|
||||
if (!a) return;
|
||||
if (a.target === '_blank' || a.hasAttribute('download')) return;
|
||||
var href = a.getAttribute('href') || '';
|
||||
if (href.indexOf(':') !== -1 || href.indexOf('//') === 0 || href.indexOf('/') !== 0) return;
|
||||
if (FRAGMENT_EXCLUDED.indexOf(pageNameFromPath(href)) !== -1) return;
|
||||
ev.preventDefault();
|
||||
loadPage(pageNameFromPath(href), true);
|
||||
});
|
||||
window.addEventListener('popstate', function() {
|
||||
loadPage(pageNameFromPath(location.pathname), false);
|
||||
});
|
||||
})();
|
||||
</script>""" % (repr(FRAGMENT_EXCLUDED_PAGES).replace("'", '"'))
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Build the page chrome from mainpagetemplate.temp: the part of <template>
|
||||
# before <contents> and the part after.
|
||||
@@ -208,6 +273,39 @@ temp_raw = read(SRC + "/mainpagetemplate.temp")
|
||||
m = re.search(r'<template>(.*)</template>', temp_raw, re.DOTALL)
|
||||
template_body = m.group(1)
|
||||
|
||||
# mainpagetemplate.temp's own <tag name="title">...</tag> helper is dead
|
||||
# code in this conversion - title substitution happens via a plain Python
|
||||
# string-replace on <exclude>$[_title]</exclude> below, never by actually
|
||||
# invoking this helper. Stripped as genuinely dead code (not a bug fix -
|
||||
# see below for the real one).
|
||||
template_body = drop_tag_block(template_body, "title")
|
||||
|
||||
# Real bug found and isolated via a minimal standalone repro (bisecting
|
||||
# down from "the whole chrome throws 'comment must have a container'"):
|
||||
# a <comment>...</comment> block, when it ends up nested inside one of
|
||||
# this script's own <tag name="_full_NAME">/<tag name="_frag_NAME">
|
||||
# definitions (see convert_page() below) - needed so the fragment/full
|
||||
# <if> branches can hold real HTML content without jetc's compile-time
|
||||
# <if> body parser choking on it - fails at RUNTIME with "comment must
|
||||
# have a container", even though the exact same <comment> block renders
|
||||
# fine as ordinary top-level content. Reproduced with a 4-line synthetic
|
||||
# case (<tag name="x">text<comment>plain text, no nested tags</comment>
|
||||
# text</tag>) - so this is a genuine jetc/JetCore bug in how a custom tag
|
||||
# DEFINITION'S stored text gets re-processed at <dotag> invocation time,
|
||||
# not something specific to this page's content. Flagged for the project,
|
||||
# not fixed here (root cause not isolated further - the base Tag class's
|
||||
# container-boundary bookkeeping is shared by many tags and risky to
|
||||
# change without full regression coverage).
|
||||
#
|
||||
# Worked around instead: this specific <comment> block wraps content
|
||||
# gated on $[_login_id] (show a logged-in session var menu) - the EXACT
|
||||
# same "session-gated, always empty for an anonymous visitor" category
|
||||
# already established as this conversion's design for cart.menu/login.menu/
|
||||
# the ACCOUNT+ADMIN nav tabs (see below) - so stripping it entirely is
|
||||
# consistent with the rest of this file, not a new compromise.
|
||||
template_body = re.sub(r'<comment>\s*<if value1="\$\[_login_id\]".*?</if>\s*</comment>',
|
||||
'', template_body, flags=re.DOTALL)
|
||||
|
||||
# Substitute the chrome-level includes/placeholders that are now fixed for
|
||||
# every page in this conversion (no per-page menubar/menu overrides exist -
|
||||
# confirmed by grepping every source .page file for _menubar/_menu overrides
|
||||
@@ -221,7 +319,13 @@ template_body = re.sub(r'<if value1="\$\[_menu\]" value2="" type="eq">\s*<includ
|
||||
CONTENTS_MARKER = "<contents>"
|
||||
idx = template_body.index(CONTENTS_MARKER)
|
||||
CHROME_BEFORE = resolve_images(template_body[:idx])
|
||||
CHROME_AFTER = resolve_images(template_body[idx + len(CONTENTS_MARKER):])
|
||||
CHROME_AFTER = resolve_images(template_body[idx + len(CONTENTS_MARKER):]) + SPA_SCRIPT
|
||||
|
||||
FULL_PAGE_TMPL = (
|
||||
'<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]'
|
||||
'<html lang="en"><head><title>%s</title>%s</head><body>'
|
||||
'%s<div id="jetc-content">%s</div>%s</body></html>'
|
||||
)
|
||||
|
||||
|
||||
def convert_page(name):
|
||||
@@ -262,11 +366,60 @@ def convert_page(name):
|
||||
|
||||
chrome_before = CHROME_BEFORE.replace('<exclude>$[_title]</exclude>', page_title)
|
||||
|
||||
full_page = FULL_PAGE_TMPL % (page_title, STYLE_BLOCK, chrome_before, contents, CHROME_AFTER)
|
||||
|
||||
if name in MYSQL_PAGES:
|
||||
# Real, reproducible server crash (heap corruption - "free():
|
||||
# invalid pointer" seen live) when a <mysql> connection failure
|
||||
# unwinds through the smaller fragment-mode <tag name="_frag_X">
|
||||
# definition specifically - the exact same failure through the
|
||||
# larger _full_X definition is fine (clean caught exception, 500).
|
||||
# The client-side click handler already skips fetching these pages
|
||||
# as fragments (FRAGMENT_EXCLUDED, above), but that only protects
|
||||
# normal clicking - a stale already-open tab (running JS from
|
||||
# before that fix shipped) or anyone hitting the URL directly
|
||||
# would still trigger it. This is the real, server-side fix: the
|
||||
# fragment response for these pages never attempts the <mysql>
|
||||
# connection at all, so the crash is unreachable regardless of
|
||||
# how the request arrives. Re-test once a real DB password makes
|
||||
# these pages actually work - a successful connection takes a
|
||||
# different code path that may not need this at all.
|
||||
fragment_page = ('<div id="jetc-content"><p>This page requires a full load - '
|
||||
'<a href="/%s">view it directly</a>.</p></div>') % name
|
||||
else:
|
||||
fragment_page = '<div id="jetc-content">%s</div>' % contents
|
||||
|
||||
# A direct/full-page load and an SPA-driven fragment fetch both hit this
|
||||
# SAME route (/name) - distinguished by ?fragment=1 in the query string,
|
||||
# per the user's explicit choice over a separate /name.page route. A
|
||||
# normal load has no query string at all, so $[fragment] is simply
|
||||
# unset - referencing an unset global variable throws ("global variable
|
||||
# is not initialized.").
|
||||
#
|
||||
# Two real jetc bugs found and worked around while building this (both
|
||||
# confirmed via direct minimal reproduction, not guessed):
|
||||
# 1. <try> safely captures the possibly-unset $[fragment] into
|
||||
# fragflag (always "1" or "" afterward) - but <try> must wrap ONLY
|
||||
# the <set>, never an <if>. Nesting <if>/<else> INSIDE <try> silently
|
||||
# drops the <else> branch's output specifically when compiled
|
||||
# through jetc (works fine in jet-2.0's own interpreter; the bug is
|
||||
# jetc-compiled-only). The branching <if> lives entirely OUTSIDE/
|
||||
# AFTER <try> instead.
|
||||
# 2. A large/complex body (real inlined HTML+CSS+JS, hundreds of KB)
|
||||
# placed directly as an <if>'s branch content fails to COMPILE at
|
||||
# all ("unterminated <html> - no matching close tag found") - jetc's
|
||||
# own compile-time <if>/<else> body scanner isn't robust against
|
||||
# real-world markup at this scale. Worked around by keeping the
|
||||
# <if>'s own branches tiny (self-closing custom-tag invocations)
|
||||
# and moving the real content into <tag name="..."> DEFINITIONS
|
||||
# (which jetc never compile-time-parses at all - stored as opaque
|
||||
# raw text, exactly like a <try> body, and only actually rendered
|
||||
# via <dotag> at runtime).
|
||||
body = (
|
||||
'<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]'
|
||||
'<html lang="en"><head><title>%s</title>%s</head><body>'
|
||||
'%s%s%s</body></html>'
|
||||
) % (page_title, STYLE_BLOCK, chrome_before, contents, CHROME_AFTER)
|
||||
'<try name="_fragerr"><set name="fragflag" expr="$[fragment]" /><catch><set name="fragflag" value="" /></try>'
|
||||
'<tag name="_frag_%s">%s</tag><tag name="_full_%s">%s</tag>'
|
||||
'<if value1="$[fragflag]" value2="1" type="eq"><_frag_%s /><else><_full_%s /></if>'
|
||||
) % (name, fragment_page, name, full_page, name, name)
|
||||
|
||||
jet_text = "#api GET /%s\n%s\n" % (name, body)
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#api GET /applications
|
||||
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>APPLICATIONS</title><style>
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<div class="pageclass">
|
||||
<div class="heading">
|
||||
<div style="display: inline-block; width: 500px;">
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
|
||||
<div style="padding-top: 15px;">
|
||||
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
|
||||
<div style="left: 80px; color: #2099f0;">APPLICATIONS</div>
|
||||
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
|
||||
<div style="display: table-row; width: 100%;">
|
||||
<div style="display: table-cell; border:
|
||||
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
|
||||
background-image: url('/assets/grid.png') repeat-x repeat-y;">
|
||||
<div class="panel" style="width: 200px; display: table-cell; ">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
|
||||
<a href="/barantmail">BARANTMAIL</a><br>
|
||||
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
|
||||
</div></div>
|
||||
|
||||
<comment>
|
||||
<if value1="$[_login_id]" value2="1" type="eq">
|
||||
<include file="sessionvar.menu">
|
||||
</if>
|
||||
</comment>
|
||||
|
||||
</div>
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>Project Manager</b></div><div class="sectionframecontents">
|
||||
|
||||
<p>A comprehensive project manager that extends an agile like
|
||||
@@ -485,7 +480,7 @@ against transaction flow placed in a calendar.</p>
|
||||
|
||||
</div></div>
|
||||
|
||||
</div>
|
||||
</div></div>
|
||||
<div style="clear: both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#api GET /asm1802
|
||||
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>RCA1802 Micro-Controller Assembler/Emulator</title><style>
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<div class="pageclass">
|
||||
<div class="heading">
|
||||
<div style="display: inline-block; width: 500px;">
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
|
||||
<div style="padding-top: 15px;">
|
||||
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
|
||||
<div style="left: 80px; color: #2099f0;">RCA1802 Micro-Controller Assembler/Emulator</div>
|
||||
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
|
||||
<div style="display: table-row; width: 100%;">
|
||||
<div style="display: table-cell; border:
|
||||
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
|
||||
background-image: url('/assets/grid.png') repeat-x repeat-y;">
|
||||
<div class="panel" style="width: 200px; display: table-cell; ">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
|
||||
<a href="/barantmail">BARANTMAIL</a><br>
|
||||
@@ -464,16 +463,12 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
|
||||
</div></div>
|
||||
|
||||
<comment>
|
||||
<if value1="$[_login_id]" value2="1" type="eq">
|
||||
<include file="sessionvar.menu">
|
||||
</if>
|
||||
</comment>
|
||||
|
||||
</div>
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>RCA1802</b></div><div class="sectionframecontents">
|
||||
<h1>The RCA1802 Micro-Controller</h1>
|
||||
<img src="images/rca1802chip.jpeg" align="right">
|
||||
<img src="/assets/rca1802chip.jpeg" align="right">
|
||||
<p>Back in the 1970's RCA released a chip that was widely used in
|
||||
satellites and other spacecraft to this day. It is a very simple
|
||||
8-bit micro-controller with 16-bit addressibility enabling memory
|
||||
@@ -496,7 +491,7 @@ device.</p>
|
||||
|
||||
</div></div>
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>RCA1802 Emulator</b></div><div class="sectionframecontents">
|
||||
<img src="images/emu1802a.png" align="right" width="500">
|
||||
<img src="/assets/emu1802a.png" align="right" width="500">
|
||||
<p>The 1802 emulator provides a fully functional RCA1802
|
||||
micro-controller device complete with interupt handling and DMA
|
||||
controls for memory access. Experiment with code structures and build
|
||||
@@ -518,7 +513,7 @@ change environment going for the Kicad project as well as the source
|
||||
code for the assembler and emulator components.
|
||||
</div></div>
|
||||
|
||||
</div>
|
||||
</div></div>
|
||||
<div style="clear: both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#api GET /barantmail
|
||||
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>BARANTMAIL OPEN SOURCE PROJECT</title><style>
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<div class="pageclass">
|
||||
<div class="heading">
|
||||
<div style="display: inline-block; width: 500px;">
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
|
||||
<div style="padding-top: 15px;">
|
||||
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
|
||||
<div style="left: 80px; color: #2099f0;">BARANTMAIL OPEN SOURCE PROJECT</div>
|
||||
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
|
||||
<div style="display: table-row; width: 100%;">
|
||||
<div style="display: table-cell; border:
|
||||
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
|
||||
background-image: url('/assets/grid.png') repeat-x repeat-y;">
|
||||
<div class="panel" style="width: 200px; display: table-cell; ">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
|
||||
<a href="/barantmail">BARANTMAIL</a><br>
|
||||
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
|
||||
</div></div>
|
||||
|
||||
<comment>
|
||||
<if value1="$[_login_id]" value2="1" type="eq">
|
||||
<include file="sessionvar.menu">
|
||||
</if>
|
||||
</comment>
|
||||
|
||||
</div>
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>BARANTMAIL OPEN SOURCE PROJECT</b></div><div class="sectionframecontents">
|
||||
<p>In the year 2000 I was extremely frustrated with the state of e-amil
|
||||
systems available to Linux. Sendmail and q-mail were pretty much the two
|
||||
@@ -489,7 +484,7 @@ I also wanted a scalable multi-server capability.</p>
|
||||
</ul>
|
||||
<p></p>
|
||||
</div></div>
|
||||
</div>
|
||||
</div></div>
|
||||
<div style="clear: both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,503 +1,16 @@
|
||||
#api GET /contact
|
||||
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>Support E-Mail</title><style>
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
}
|
||||
|
||||
@keyframes rotation {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: avenir;
|
||||
src: url('data:font/ttf;base64,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 truncated
|
||||
}
|
||||
@font-face {
|
||||
font-family: source;
|
||||
src: url('data:font/ttf;base64,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 truncated
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: exo2;
|
||||
src: url('data:font/otf;base64,T1RUTwALAIAAAwAwQ0ZGIF65aMUAAA4EAACDv0dQT1NyBlyKAACeSAAAYTJHU1VCWwJIAAAAmQgAAAU+T1MvMmqogawAAAEgAAAAYGNtYXC4LHjGAAAGoAAAB0JoZWFkA3NjtwAAALwAAAA2aGhlYQc+BIEAAAD0AAAAJGhtdHg+CUgTAACRxAAAB0RtYXhwAdFQAAAAARgAAAAGbmFtZVDBsvwAAAGAAAAFHnBvc3T/uAAyAAAN5AAAACAAAQAAAAEAQYT55LNfDzz1AAMD6AAAAADQhBABAAAAANCEEAH/c/7tA+EDpwAAAAMAAgAAAAAAAAABAAAD5/83AAAEBf9z/3MD4QABAAAAAAAAAAAAAAAAAAAB0QAAUAAB0QAAAAMByAGQAAMACAKKAlgAAABLAooCWAAAAV4AMgEkAAAAAAUGAAAAAAAAAAACBwAAAAAAAAAAAAAAAFVLV04AQAAg+wICvP83ASsD5wDJIAAAlwAAAAAB5wKyAAAAIAADAAAAFgEOAAEAAAAAAAAATwAAAAEAAAAAAAEABQBPAAEAAAAAAAIAEQBUAAEAAAAAAAMAIABlAAEAAAAAAAQAFwCFAAEAAAAAAAUAPACcAAEAAAAAAAYAFQDYAAEAAAAAAAkADQDtAAEAAAAAAAwAEwD6AAEAAAAAAA4APwENAAMAAQQJAAAAngFMAAMAAQQJAAEAHgHqAAMAAQQJAAIADgIIAAMAAQQJAAMAQAIWAAMAAQQJAAQALgJWAAMAAQQJAAUAeAKEAAMAAQQJAAYAKgL8AAMAAQQJAAkAGgMmAAMAAQQJAAwAJgNAAAMAAQQJAA4AfgNmAAMAAQQJABAACgPkAAMAAQQJABEAIgPuQ29weXJpZ2h0IKkgMjAxNCwgTmF0YW5hZWwgR2FtYSAod3d3Lm5kaXNjb3ZlcmVkLmNvbSAuIGluZm8oYXQpbmRpc2NvdmVyZWQuY29tKUV4byAyUmVndWxhciBDb25kZW5zZWQxLjAwMTtVS1dOO0V4bzItUmVndWxhckNvbmRlbnNlZEV4byAyIFJlZ3VsYXIgQ29uZGVuc2VkVmVyc2lvbiAxLjAwMTtQUyAwMDEuMDAxO2hvdGNvbnYgMS4wLjcwO21ha2VvdGYubGliMi41LjU4MzI5RXhvMi1SZWd1bGFyQ29uZGVuc2VkTmF0YW5hZWwgR2FtYXd3dy5uZGlzY292ZXJlZC5jb21odHRwOi8vc2NyaXB0cy5zaWwub3JnL2Ntcy9zY3JpcHRzL3BhZ2UucGhwP3NpdGVfaWQ9bnJzaSZpZD1PRkwAQwBvAHAAeQByAGkAZwBoAHQAIACpACAAMgAwADEANAAsACAATgBhAHQAYQBuAGEAZQBsACAARwBhAG0AYQAgACgAdwB3AHcALgBuAGQAaQBzAGMAbwB2AGUAcgBlAGQALgBjAG8AbQAgAC4AIABpAG4AZgBvACgAYQB0ACkAbgBkAGkAcwBjAG8AdgBlAHIAZQBkAC4AYwBvAG0AKQBFAHgAbwAgADIAIABDAG8AbgBkAGUAbgBzAGUAZABSAGUAZwB1AGwAYQByADEALgAwADAAMQA7AFUASwBXAE4AOwBFAHgAbwAyAC0AUgBlAGcAdQBsAGEAcgBDAG8AbgBkAGUAbgBzAGUAZABFAHgAbwAgADIAIABSAGUAZwB1AGwAYQByACAAQwBvAG4AZABlAG4AcwBlAGQAVgBlAHIAcwBpAG8AbgAgADEALgAwADAAMQA7AFAAUwAgADAAMAAxAC4AMAAwADEAOwBoAG8AdABjAG8AbgB2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADgAMwAyADkARQB4AG8AMgAtAFIAZQBnAHUAbABhAHIAQwBvAG4AZABlAG4AcwBlAGQATgBhAHQAYQBuAGEAZQBsACAARwBhAG0AYQB3AHcAdwAuAG4AZABpAHMAYwBvAHYAZQByAGUAZAAuAGMAbwBtAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBjAG0AcwAvAHMAYwByAGkAcAB0AHMALwBwAGEAZwBlAC4AcABoAHAAPwBzAGkAdABlAF8AaQBkAD0AbgByAHMAaQAmAGkAZAA9AE8ARgBMAEUAeABvACAAMgBSAGUAZwB1AGwAYQByACAAQwBvAG4AZABlAG4AcwBlAGQAAAAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AZUAAAAAAAABlQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVAXUBfAF3AZoBrgG2AX0BhQGG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 truncated
|
||||
}
|
||||
|
||||
|
||||
body {background: linear-gradient(to bottom, #ccc, #444);
|
||||
font-family: exo2;
|
||||
margin: 10px 10px 10px 10px;
|
||||
width: 98%;
|
||||
}
|
||||
|
||||
a:link {text-decoration: none}
|
||||
a:visited {text-decoration:none}
|
||||
a:hover {text-decoration:none}
|
||||
|
||||
h1 {font: 20pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
color: #808080;
|
||||
opacity: 0.9;}
|
||||
|
||||
h2 {font: 14pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
}
|
||||
|
||||
h3 {font: 12pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
}
|
||||
|
||||
p {font-family: 8pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
}
|
||||
|
||||
ul {font-family: 8pt exo2;}
|
||||
|
||||
li {font-family: 8pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
}
|
||||
|
||||
.project_header {background: #88c;
|
||||
color: #fff;
|
||||
padding: 5px;
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.pageclass {background: #fff;
|
||||
border-radius: 10px;
|
||||
border: 2pt outset;
|
||||
border-spacing: 0px;
|
||||
padding: 0px;
|
||||
max-width: 1050px;
|
||||
min-width: 1050px
|
||||
margin: auto;
|
||||
text-shadow: 0 0 0.1em #CCC, 0 0 0.1em #87F;
|
||||
font-family: exo2;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
input {background: #fff;
|
||||
border: 1px inset;
|
||||
font-family: exo2;
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
|
||||
-webkit-border-radius: 2px;
|
||||
-moz-border-radius: 2px;
|
||||
-o-border-radius: 2px;
|
||||
-ms-border-radius: 2px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
select {background: #fff;
|
||||
font-family: exo2;
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
border: 1px solid #444;
|
||||
padding: 1px 2px 1px 2px;
|
||||
-webkit-border-radius: 7px;
|
||||
-moz-border-radius: 7px;
|
||||
-o-border-radius: 7px;
|
||||
-ms-border-radius: 7px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
textarea.fieldinput {background: #fff;
|
||||
resize: none;
|
||||
font-family: exo2;
|
||||
border: 1px solid #444;
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
padding: 2px 2px 2px 5px;
|
||||
-webkit-border-radius: 0px;
|
||||
-moz-border-radius: 0px;
|
||||
-o-border-radius: 0px;
|
||||
-ms-border-radius: 0px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
textarea.fieldinputerror {background: #fcc;
|
||||
resize: none;
|
||||
font-family: exo2;
|
||||
border: 1px solid #f00;
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
padding: 2px 2px 2px 5px;
|
||||
-webkit-border-radius: 7px;
|
||||
-moz-border-radius: 7px;
|
||||
-o-border-radius: 7px;
|
||||
-ms-border-radius: 7px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
.sectionframe {
|
||||
position: relative;
|
||||
font-family: exo2;
|
||||
border: 0px outset;
|
||||
font-size: 10pt;
|
||||
margin: 3px;
|
||||
background: #808080;
|
||||
padding: 0px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
.sectionframe:after{
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 1px;
|
||||
left: 1px;
|
||||
width: calc(100% - 2px);
|
||||
height: 12px;
|
||||
background: linear-gradient(rgba(255,255,255,0.5), rgba(255,255,255,0.2));
|
||||
}
|
||||
|
||||
.sectionframecontents {
|
||||
padding: 10px;
|
||||
text-align: justify;
|
||||
color: #000000;
|
||||
border: 1pt inset;
|
||||
background-color: #F8F8FF;
|
||||
}
|
||||
.sectionframeheading {
|
||||
# background: linear-gradient(to bottom, #fff, #88f);
|
||||
background: #2099f0;
|
||||
color: #fff;
|
||||
border: 1pt outset;
|
||||
vertical-align: middle;
|
||||
padding: 5px;
|
||||
margin: 0px;
|
||||
font-family: 12pt avenir;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
border-radius: 0px 0px 0px 0px;
|
||||
}
|
||||
|
||||
.sectionframeheading2 {
|
||||
background: #C0C0C0;
|
||||
font-family: exo2;
|
||||
font-size: 20pt;
|
||||
padding: 3px
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.heading {background: #fff;
|
||||
border-radius: 7px 7px 0px 0px;
|
||||
max-height: 80px;
|
||||
}
|
||||
.entryform {
|
||||
background: #2099f0;
|
||||
padding: 3px 3px 3px 3px;
|
||||
margin: 0px;
|
||||
border: 0px solid black;
|
||||
border-radius: 0px;
|
||||
}
|
||||
.entryform table {
|
||||
font: 12px exo2;
|
||||
background: #c5e1f4;
|
||||
border: 0pt solid black;
|
||||
}
|
||||
|
||||
.footer {
|
||||
background: linear-gradient(to bottom, #000, #888);
|
||||
font: 8pt verdana;
|
||||
color: #FFFFFF;
|
||||
text-align: center;
|
||||
border-radius: 0px 0px 6px 6px;}
|
||||
|
||||
.menubar {
|
||||
# background: linear-gradient(to bottom, #fff, #2099f0);
|
||||
padding: 0px 0px 0px 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
.baritem {
|
||||
background-image: linear-gradient(#2099f0, #c3ddef);
|
||||
color: #fff;
|
||||
position: relative;
|
||||
font-family: exo2;
|
||||
font-weight: 1000;
|
||||
font-size: 8pt;
|
||||
padding: 2px 10px;
|
||||
margin: 10px 0px 0px 0px;
|
||||
border: solid;
|
||||
border-width: 0px 0px 1px 0px;
|
||||
border-color: #fff;
|
||||
border-radius: 5px 5px 0px 0px;
|
||||
border-style: outset;
|
||||
transition: background 2s;
|
||||
}
|
||||
|
||||
.baritem:after{
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 1px;
|
||||
left: 1px;
|
||||
width: calc(100% - 2px);
|
||||
height: 50%;
|
||||
z-index: 5;
|
||||
pointer-events: none;
|
||||
border-radius: 4px 4px 0px 0px;
|
||||
background: linear-gradient(rgba(255,255,255,0.8), rgba(255,255,255,0.2));
|
||||
}
|
||||
|
||||
.baritemselected {
|
||||
background: #ccc;
|
||||
color: #000;
|
||||
font-family: exo2;
|
||||
font-weight: 1000;
|
||||
font-size: 8pt;
|
||||
padding: 2px 10px;
|
||||
margin: 5px 10px 0px 0px;
|
||||
border: solid;
|
||||
border-width: 1px 1px 0px 1px;
|
||||
border-color: #fff;
|
||||
border-radius: 5px 5px 0px 0px;
|
||||
border-style: outset;
|
||||
transition: background 2s;
|
||||
|
||||
}
|
||||
|
||||
.baritem:hover {
|
||||
background: #c3ddef;
|
||||
color: #fff;
|
||||
transition: background 5s;
|
||||
}
|
||||
|
||||
.panel {background: #ccc;
|
||||
margin: 10px;
|
||||
padding: 3px;
|
||||
border: 0pt inset;}
|
||||
|
||||
.panel table {
|
||||
font: 12px exo2;
|
||||
padding: 5px;
|
||||
background: #c5e1f4;
|
||||
border: 1pt solid black;
|
||||
border-radius: 9px;
|
||||
}
|
||||
.panel table th {
|
||||
background: #2099f0;
|
||||
color: #fff;
|
||||
padding: 2px 3px 3px 3px;
|
||||
border: 0pt;
|
||||
}
|
||||
.panel table td {
|
||||
background: #c5e1f4;
|
||||
color: #000;
|
||||
padding: 2px 3px 3px 3px;
|
||||
border: 0pt;
|
||||
}
|
||||
|
||||
.left {
|
||||
text-align: right;
|
||||
padding-left: 20px;
|
||||
border-radius: 9px 0px 0px 9px;
|
||||
}
|
||||
|
||||
.right {
|
||||
border-radius: 0px 9px 9px 0px;
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
.featured {background: #fff}
|
||||
|
||||
.buttonbay {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
.fieldinput {
|
||||
font-family: exo2;
|
||||
border-radius: 7px;
|
||||
padding: 2px 2px 2px 5px;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
.fieldinputerror {
|
||||
font-family: exo2;
|
||||
border-radius: 7px;
|
||||
padding: 2px 2px 2px 5px;
|
||||
background: #fcc;
|
||||
border: 1px solid red;
|
||||
}
|
||||
.fieldprompt {
|
||||
font-size: 10pt;
|
||||
text-align: right;
|
||||
background: #00f;
|
||||
}
|
||||
.message {font: bold 10pt verdana; color: #FF0000}
|
||||
.collection_heading {font: bold 12pt verdana; color: #FFFFFF}
|
||||
.collection_text {font: 10pt verdana; color: #FFFFFF}
|
||||
.collection_tracks_background {font: 8pt bold verdana; color: #FFFFFF; background: #10003F}
|
||||
.warning {font: 10pt verdana; background: #FF0000; color: #FFFFFF; text-align: justify}
|
||||
|
||||
.button {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
font-size: 10pt;
|
||||
font-weight: 400;
|
||||
color: #fff;
|
||||
border: 2px outset;
|
||||
background: #2099f0;
|
||||
padding: 2px 10px 3px 10px;
|
||||
margin: 0px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.button:after{
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
width: calc(100% - 0px);
|
||||
height: 10px;
|
||||
z-index: 5;
|
||||
border-radius: 3px;
|
||||
background: linear-gradient(rgba(255,255,255,0.8), rgba(255,255,255,0.2));
|
||||
}
|
||||
|
||||
.code {
|
||||
font-family: source;
|
||||
font-weight: 400;
|
||||
font-size: 10pt;
|
||||
border: 1pt solid black;
|
||||
background: #ff8;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
.controlframe {background: #888;
|
||||
padding: 5px 5px 15px 10px;
|
||||
}
|
||||
|
||||
.vm {position: relative;
|
||||
height: 55px;
|
||||
}
|
||||
|
||||
.vmname {position: absolute;
|
||||
left: 0px; top: 0px;
|
||||
height: 55px;
|
||||
}
|
||||
|
||||
.vmcover {position: absolute;
|
||||
left: 15px;
|
||||
top: 30px;
|
||||
font: 12px 'Dot Matrix';
|
||||
background: #bbb;
|
||||
color: white;
|
||||
border: 1pt solid white;
|
||||
border-radius: 5px;
|
||||
padding: 2px 10px 2px 10px;
|
||||
}
|
||||
|
||||
</style></head><body>
|
||||
<div class="pageclass">
|
||||
<div class="heading">
|
||||
<div style="display: inline-block; width: 500px;">
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
|
||||
<div style="padding-top: 15px;">
|
||||
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
|
||||
<div style="left: 80px; color: #2099f0;">Support E-Mail</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="float: right; text-align: right; margin-right: 10px; margin-top: 5px;"></div>
|
||||
</div>
|
||||
<div class="menubar">
|
||||
|
||||
|
||||
<table class="menubar" cellspacing="0" cellpadding="0" width="100%">
|
||||
<tr>
|
||||
<td style="border-bottom: 1pt solid #bbb; width: 20px;"> </td>
|
||||
<td class="baritem"><a href="/main">HOME</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/services">SERVICES</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/hosting">HOSTING</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/documents">DOCUMENT MGMT</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/siptrunk">SIP TRUNKING</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/vst">VST</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/modular1">MODULAR1</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/modular1_patches">MODULAR1 PATCHES</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/synthedit">SYNTHEDIT</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/wordpress">WORDPRESS</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/opensource">OPEN SOURCE</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/contact">CONTACT</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
|
||||
</ifrow>
|
||||
</if>
|
||||
<td class="baritem"><a href="/login">LOGIN</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
|
||||
<td style="border-bottom: 1pt solid #bbb; width: 10px;"> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
<div style="display: table-row; width: 100%;">
|
||||
<div style="display: table-cell; border:
|
||||
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
|
||||
<div class="panel" style="width: 200px; display: table-cell; ">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
|
||||
<a href="/barantmail">BARANTMAIL</a><br>
|
||||
<a href="/jet">JET</a><br>
|
||||
<a href="/synthmax">SYNTHMAX</a><br>
|
||||
<a href="/serverframework">SERVER CORE FRAMEWORK</a>
|
||||
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
|
||||
</div></div>
|
||||
|
||||
<comment>
|
||||
<if value1="$[_login_id]" value2="1" type="eq">
|
||||
<include file="sessionvar.menu">
|
||||
</if>
|
||||
</comment>
|
||||
</div>
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>Contact</b></div><div class="sectionframecontents">
|
||||
<p>Please contact us by phone at <b>(702) 232-0050</b>.</p>
|
||||
<p>To e-mail us, just enter text below and press the buttons:</p>
|
||||
|
||||
<entryform>
|
||||
<field prompt="Name" type="text" name="name" size="50" maxlength="50">
|
||||
<field prompt="E-Mail" type="text" name="email" size="50" maxlength="50">
|
||||
<field prompt="Message" type="multiline" name="message" rows="5" cols="60">
|
||||
|
||||
<captcha>
|
||||
|
||||
<buttonbay>
|
||||
<div class="button">Send Message</div>
|
||||
</buttonbay>
|
||||
</entryform>
|
||||
|
||||
<messages>
|
||||
|
||||
<script src='https://www.google.com/recaptcha/api.js'></script>
|
||||
|
||||
</div></div>
|
||||
</div>
|
||||
<div style="clear: both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="footer" style="clear: both;">© 1999-2026 BARANT Systems, All Rights Reserved</div>
|
||||
</div>
|
||||
|
||||
</body></html>
|
||||
<include file="../src/SESSIONCTL.tag">
|
||||
<include file="../src/barant.tag">
|
||||
<include file="../src/project.tag">
|
||||
<set name="host" value="localhost">
|
||||
<set name="database" value="barant">
|
||||
<set name="user" value="barant">
|
||||
<set name="password" value="uversa1960">
|
||||
<database name="$[database]" host="$[host]" user="$[user]" password="$[password]" sessionid="">
|
||||
<sessionctl page="contact">
|
||||
<defaultnav>
|
||||
<setpage name="contact">
|
||||
</defaultnav>
|
||||
<link rel="stylesheet" href="/assets/main.css">
|
||||
<link rel="stylesheet" href="/assets/control.css">
|
||||
</sessionctl>
|
||||
</database>
|
||||
@@ -1,4 +1,3 @@
|
||||
#api GET /crystal
|
||||
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>CRYSTAL</title><style>
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<div class="pageclass">
|
||||
<div class="heading">
|
||||
<div style="display: inline-block; width: 500px;">
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
|
||||
<div style="padding-top: 15px;">
|
||||
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
|
||||
<div style="left: 80px; color: #2099f0;">CRYSTAL</div>
|
||||
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
|
||||
<div style="display: table-row; width: 100%;">
|
||||
<div style="display: table-cell; border:
|
||||
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
|
||||
background-image: url('/assets/grid.png') repeat-x repeat-y;">
|
||||
<div class="panel" style="width: 200px; display: table-cell; ">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
|
||||
<a href="/barantmail">BARANTMAIL</a><br>
|
||||
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
|
||||
</div></div>
|
||||
|
||||
<comment>
|
||||
<if value1="$[_login_id]" value2="1" type="eq">
|
||||
<include file="sessionvar.menu">
|
||||
</if>
|
||||
</comment>
|
||||
|
||||
</div>
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
|
||||
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>Crystal - High Security Communications</b></div><div class="sectionframecontents">
|
||||
|
||||
@@ -478,7 +473,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
Android.</p>
|
||||
|
||||
</div></div>
|
||||
</div>
|
||||
</div></div>
|
||||
<div style="clear: both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#api GET /davidarant
|
||||
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>barant.com - David Eugene Arant</title><style>
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<div class="pageclass">
|
||||
<div class="heading">
|
||||
<div style="display: inline-block; width: 500px;">
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
|
||||
<div style="padding-top: 15px;">
|
||||
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
|
||||
<div style="left: 80px; color: #2099f0;">barant.com - David Eugene Arant</div>
|
||||
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
|
||||
<div style="display: table-row; width: 100%;">
|
||||
<div style="display: table-cell; border:
|
||||
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
|
||||
background-image: url('/assets/grid.png') repeat-x repeat-y;">
|
||||
<div class="panel" style="width: 200px; display: table-cell; ">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
|
||||
<a href="/barantmail">BARANTMAIL</a><br>
|
||||
@@ -464,14 +463,10 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
|
||||
</div></div>
|
||||
|
||||
<comment>
|
||||
<if value1="$[_login_id]" value2="1" type="eq">
|
||||
<include file="sessionvar.menu">
|
||||
</if>
|
||||
</comment>
|
||||
|
||||
</div>
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
|
||||
<img src="images/arant2.jpg" align="left">
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
|
||||
<img src="/assets/arant2.jpg" align="left">
|
||||
<h1>David Eugene Arant</h1>
|
||||
<p>David Eugene Arant was born in South Gate California on April 17th, 1935
|
||||
to parents May L. Arant and Francis M. Arant.</p>
|
||||
@@ -491,7 +486,7 @@ on these pages.</p>
|
||||
</whiledir>
|
||||
|
||||
|
||||
</div>
|
||||
</div></div>
|
||||
<div style="clear: both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#api GET /documents
|
||||
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>Document Management</title><style>
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<div class="pageclass">
|
||||
<div class="heading">
|
||||
<div style="display: inline-block; width: 500px;">
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
|
||||
<div style="padding-top: 15px;">
|
||||
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
|
||||
<div style="left: 80px; color: #2099f0;">Document Management</div>
|
||||
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
|
||||
<div style="display: table-row; width: 100%;">
|
||||
<div style="display: table-cell; border:
|
||||
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
|
||||
background-image: url('/assets/grid.png') repeat-x repeat-y;">
|
||||
<div class="panel" style="width: 200px; display: table-cell; ">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
|
||||
<a href="/barantmail">BARANTMAIL</a><br>
|
||||
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
|
||||
</div></div>
|
||||
|
||||
<comment>
|
||||
<if value1="$[_login_id]" value2="1" type="eq">
|
||||
<include file="sessionvar.menu">
|
||||
</if>
|
||||
</comment>
|
||||
|
||||
</div>
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>Document Management</b></div><div class="sectionframecontents">
|
||||
<h1>Online Document Management</h1>
|
||||
<p>BARANT Technology Group now offers document management storage and
|
||||
@@ -481,7 +476,7 @@ upon department for internal documents use. Or if you are a service
|
||||
group you can establish accounts and store correspondence and
|
||||
documents for any activity with that account.</p>
|
||||
</div></div>
|
||||
</div>
|
||||
</div></div>
|
||||
<div style="clear: both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,503 +1,16 @@
|
||||
#api GET /help
|
||||
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>Support E-Mail</title><style>
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
}
|
||||
|
||||
@keyframes rotation {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: avenir;
|
||||
src: url('data:font/ttf;base64,AAEAAAAQAQAABAAAQkFTRYsllDEAAGo4AAAAUEZGVE1Xn89+AABqHAAAABxHREVGBT8F8QAAYYgAAABOR1BPU8yRwuEAAGPYAAAGREdTVULybtNsAABh2AAAAf5PUy8yWLpvKAAAAYgAAABgY21hcGu/0oYAAAYAAAACimdhc3D//wADAABhgAAAAAhnbHlmDlZkhgAACpwAAE1EaGVhZAfHj+4AAAEMAAAANmhoZWEHAANTAAABRAAAACRobXR4ESwuGgAAAegAAAQYbG9jYYMHlpAAAAiMAAACEG1heHABUABFAAABaAAAACBuYW1lnUqtLgAAV+AAAAbGcG9zdB3l48UAAF6oAAAC2AABAAAAAgj1LRvsCl8PPPUACwPoAAAAANKzIbUAAAAA0rMhtf9Z/wYD6AOkAAAACAACAAAAAAAAAAEAAAL0/wwAyAPo/1n/WQPoAAEAAAAAAAAAAAAAAAAAAAEFAAEAAAEHAEIABwAAAAAAAgAAAAEAAQAAAEAAAAAAAAAAAwILASwABQAEAooCWAAAAEsCigJYAAABXgAyARgAAAILBAICAgMCAgQAAAADAAAAAAAAAAAAAAAAQURCRQAAACD7AgL0/wwAyAOkAPogAAABAAAAAAHUAsQAAAAgAAQB9AAAAAAAAAFNAAABBAAAAXIAiQIIAKECCAANAggAIQMvACYCwAA7AQQAZAEEADoBBAAMAbwAJgKaAE4BBAAyAU0AKwEEAFIBcgAJAggAGgIIAF8CCAApAggAKQIIABcCCAApAggAHAIIACkCCAApAggAHAEEAFIBBAAyApoAUgKaAE4CmgBSAc8ALwMgACwCrQAFAnYAYQLAADMC5QBYAlEAYQIsAGEDCgAzAtIAYQEEAGEB4gAHAmMAYQH0AGEDeQBaAwoAYQNCADMCPgBhA0IAMwJRAGECLAA1Aj4ADAKsAFQCUf/9A7AABQJjAAECPv/6AiwAFwEEAEoBcgAFAQQAJAKaAFIB9AAAAPD/+gIHADsCYwBDAeEANgJjADYCLAA2ASgAEgJjADwCLABQAPAASwDw/+IB4QBQAPAAWgNUAEsCLABLAlIANgJjAEMCYwA2AU0ASwGqABwBTQAOAiwASwHPAA8CwAAPAeEABgHPAA8BqgAbAU0AQgDeAFcBTQA7ApoAZwEEAAABcgCJAggANAIIADoCCAALAggAAADeAFcCCABAAPD/6QMgABwBUQAiAeEAPwKaAE4BTQArAyAAHADw//QBkAA4ApoATgFSABcBUgAbAPAAPgIsAEsCWAA8AQQAUgDwACEBUgBDAYIAIgHhAEcDCgAkAwoAHAMKABQBzwAlAq0ABQKtAAUCrQAFAq0ABQKtAAUCrQAFA57/+wLAADMCUQBhAlEAYQJRAGECUQBhAQQABAEEAEgBBP/zAQT/8wLlAAoDCgBhA0IAMwNCADMDQgAzA0IAMwNCADMCmgBkA0IAMwKsAFQCrABUAqwAVAKsAFQCPv/6Aj4AYQJRAFACBwA7AgcAOwIHADsCBwA7AgcAOwIHADsDVAA2AeEANgIsADYCLAA2AiwANgIsADYA8P/6APAAPgDw/+kA8P/pAlIANgIsAEsCUgA2AlIANgJSADYCUgA2AlIANgKaAE4CUgAnAiwASwIsAEsCLABLAiwASwHPAA8CYwBDAc8ADwDwAFoB9AAZAPAABgOwADsDiwAsAiwANQGqABwCPv/6AiwAFwGqABsCCP/wAPD/6QDw/+YA8P/0APD/6ADwAEsA8AAbAPAACgDw/9wA8P/1AqQAMQIsAEsCEgALAU0AKwH0AAAD6AAAAQQAPgEEAD4BBAA+AggAaQIIAGkCCABpAggAJgIIACYB9ABJA+gAdwPVABoBOwA/ATsARwCo/1kCCAAQAcQAHgPeAFQCpAAxA3MAIgH9ACoCXQAfAowAGgIJABYCmgBOAKj/WQEEAFICGwAhAusAMQFPAA0CGQAsAhkAMQIZADECGQAyAhsANQIHABICBwASAgcAEgIHABIBUQAiAYIAIgFSAEMAFwAbAAAAAwAAAAMAAAAcAAEAAAAAAYQAAwABAAAAHAAEAWgAAABWAEAABQAWAH4A/wExAUIBUwFhAXgBfgGSAscCyQLdA6kDvAPAIBAgFCAaIB4gIiAmIDAgOiBEIKwhEyEiISYhLiICIgYiDyISIhUiGiIeIisiSCJgImUlyvsC//8AAAAgAKABMQFBAVIBYAF4AX0BkgLGAskC2AOpA7wDwCAQIBMgGCAcICAgJiAwIDkgRCCsIRMhIiEmIS4iAiIGIg8iESIVIhkiHiIrIkgiYCJkJcr7Af///+P/wv+R/4L/c/9n/1H/Tf86/gf+Bv34/S39G/0Y4Mngx+DE4MPgwuC/4LbgruCl4D7f2N/K38ffwN7t3ure4t7h3t/e3N7Z3s3esd6a3pfbMwX9AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQYAAAEAAAAAAAAAAQIAAAACAAAAAAAAAAAAAAAAAAAAAQAAAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGEAhoeJi5OYnqOipKalp6mrqqytr66wsbO1tLa4t7y7vb7icmRlaeR4oXBr7HZq+oia93P7/Gd37/Lx2PhsfNaouoFjbvbM+fBtfeVigoWXxcba29/g3N25/cHJ6ern6P7/43ne4eaEjIONio+QkY6VlgCUnJ2bws3UcdDR0nrV084AAAAAACYAJgAmACYAQABSAIIA0AEOAWYBcgGMAaYBxAHYAeYB8gIEAhQCTgJgAowCxALgAwwDOgNOA5ADvAPaA/IEBgQaBCwEYAS6BNYFEgU4BWAFeAWMBbQFzAXYBfYGEgYiBkAGWAZ6BpwGyAbwByQHNgdgB3QHlAewB8YH3AfuB/4IEAgkCDAIPgh2CKIIxAjwCSAJQAl4CZYJrgnUCeoJ9gouClIKcAqcCsgK6AsYCzoLXgtwC5ALqAvKC+AMEgwgDFAMcgxyDIoMvAzkDRwNQg1UDaQNwg4EDjoOVA5kDnAOsg7ADuAO/A8mD1wPag+SD6wPvg/mD/gQGhA2EGYQpBD2ESwRThFwEZYRzhIAEjYSXBKkEsIS4BMCEzATRBNYE3ATlBPGE/oUIhRKFHYUshTqFQQVPhVuFZ4V0hYSFjAWVBaOFs4XDhdSF6YX9hhKGKIY5hkeGVYZkhnYGewaABoYGjwadBqyGtYa+hsiG1objhu0G+4cGhxGHHYcshzaHQYdPh1KHWQdfB2wHfYeNh5yHqAewh7kHxIfJB82H0QfXh9wH5Ifrh/OH+IgEiA6IGIgbiB6IIYglCCiILAgxCDYIOwhAiEgITIhWiGuIb4h0CHgIiAiWCKAIrAi6iMkI0QjXCN6I4gjmCOqI8okIiRUJKIkwiTeJPolJCVYJX4lsiXYJg4mMCZCJmwmogAFAAAAAAH0ArwAAwAGAAkADAAPAAAxESERAxMhExcRASELARETAfT6qv6syKr+jgFUqsiqArz9RAGLAP/+1P8B/v3VAP8BLP4CAP8AAgCJ//oA6QLEAAMACwAAExEjEQI0NjIWFAYi1zwSHCgcHCgCxP32Agr9UigcHCgcAAAAAAIAoQHgAWcCxAADAAcAABM1MxUzNTMVoTxOPAHg5OTk5AAAAAIADQAAAfsCxAAbAB8AADM3IzUzNyM1MzczBzM3MwczFSMHMxUjByM3IwcTNyMHWx5scxZscx40H4sfNB9scxVscx40HosesBWKFeUwnDDj4+PjMJww5eXlARWcnAAAAAMAIf+xAd8DEwAGAA4AMQAAARE+ATU0LwERDgEVFBYXEzUiJic3HgEXEScuATU0Njc1MxUyFwcuASMRFx4BFRQGBxUBGTlLWVsyRjQzEThuIjkYTCtHQTJySDB6PzcXRiVGNUt1UQE6/vACUTxQIWYBCglJNjE5Ev4bQzcyJygwAgEiGhhhL09sB0NDWSgjKP7mGBNYSFJqBUMAAAUAJv/eAwkC5gAHAA8AFwAfACMAABI0NjIWFAYiJhQWMjY0JiIANDYyFhQGIiYUFjI2NCYiCQEXASZljmVlji9FYkVFYgEQZY5lZY4vRWJFRWL+cgHILv43Ad2OZWWOZd5kRERkRP2/jmVljmXeZEREZET+5ALsHP0UAAADADv/7gKyAtYAIAAvADsAAAEXNzMHFyMnDgEjIiY1ND4CNy4CNTQ2MzIWFRQOAgMiBhUUHgEXPgM1NCYTJw4EFRQWMzIBO6xmRIChWWouaEZcfBg4KSkbHR5oSkFfGDYoLy0+HRkWHSAvFjhoxBkbKxYRXERhAYS2uOKpcj5BclwnPzUdGSEmQx5KV1RCJDovGQEAOCwXOR8aDxMlLBsqNf39zA8SIh4sGEJSAAAAAAEAZAHgAKACxAADAAATNTMVZDwB4OTkAAEAOv9kAPgC3AAMAAATFw4BFRQXBy4BNTQ2xTM/Q4IvRUpJAtwgT+Bt0M4eX+pzd+kAAAABAAz/ZADKAtwADAAAFyc+ATU0JzceARUUBj8zP0OCL0VKSZwgT+Bt0M4eX+pzd+kAAAAAAQAmAWYBlgLEAA4AABMVNxcHFwcnByc3JzcXNfeQD5BbJV5ZKFuSDpMCxJgwMC96HX19HXoyLTCYAAAAAQBOADACTAIuAAsAABM1MzUzFTMVIxUjNU7nMOfnMAEXMOfnMOfnAAEAMv92ALoAWgADAAAXNzMHMkJGTYrk5AAAAAABACsA0gEiAQgAAwAANzUzFSv30jY2AAABAFL/+gCyAFoALine truncated
|
||||
}
|
||||
@font-face {
|
||||
font-family: source;
|
||||
src: url('data:font/ttf;base64,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 truncated
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: exo2;
|
||||
src: url('data:font/otf;base64,T1RUTwALAIAAAwAwQ0ZGIF65aMUAAA4EAACDv0dQT1NyBlyKAACeSAAAYTJHU1VCWwJIAAAAmQgAAAU+T1MvMmqogawAAAEgAAAAYGNtYXC4LHjGAAAGoAAAB0JoZWFkA3NjtwAAALwAAAA2aGhlYQc+BIEAAAD0AAAAJGhtdHg+CUgTAACRxAAAB0RtYXhwAdFQAAAAARgAAAAGbmFtZVDBsvwAAAGAAAAFHnBvc3T/uAAyAAAN5AAAACAAAQAAAAEAQYT55LNfDzz1AAMD6AAAAADQhBABAAAAANCEEAH/c/7tA+EDpwAAAAMAAgAAAAAAAAABAAAD5/83AAAEBf9z/3MD4QABAAAAAAAAAAAAAAAAAAAB0QAAUAAB0QAAAAMByAGQAAMACAKKAlgAAABLAooCWAAAAV4AMgEkAAAAAAUGAAAAAAAAAAACBwAAAAAAAAAAAAAAAFVLV04AQAAg+wICvP83ASsD5wDJIAAAlwAAAAAB5wKyAAAAIAADAAAAFgEOAAEAAAAAAAAATwAAAAEAAAAAAAEABQBPAAEAAAAAAAIAEQBUAAEAAAAAAAMAIABlAAEAAAAAAAQAFwCFAAEAAAAAAAUAPACcAAEAAAAAAAYAFQDYAAEAAAAAAAkADQDtAAEAAAAAAAwAEwD6AAEAAAAAAA4APwENAAMAAQQJAAAAngFMAAMAAQQJAAEAHgHqAAMAAQQJAAIADgIIAAMAAQQJAAMAQAIWAAMAAQQJAAQALgJWAAMAAQQJAAUAeAKEAAMAAQQJAAYAKgL8AAMAAQQJAAkAGgMmAAMAAQQJAAwAJgNAAAMAAQQJAA4AfgNmAAMAAQQJABAACgPkAAMAAQQJABEAIgPuQ29weXJpZ2h0IKkgMjAxNCwgTmF0YW5hZWwgR2FtYSAod3d3Lm5kaXNjb3ZlcmVkLmNvbSAuIGluZm8oYXQpbmRpc2NvdmVyZWQuY29tKUV4byAyUmVndWxhciBDb25kZW5zZWQxLjAwMTtVS1dOO0V4bzItUmVndWxhckNvbmRlbnNlZEV4byAyIFJlZ3VsYXIgQ29uZGVuc2VkVmVyc2lvbiAxLjAwMTtQUyAwMDEuMDAxO2hvdGNvbnYgMS4wLjcwO21ha2VvdGYubGliMi41LjU4MzI5RXhvMi1SZWd1bGFyQ29uZGVuc2VkTmF0YW5hZWwgR2FtYXd3dy5uZGlzY292ZXJlZC5jb21odHRwOi8vc2NyaXB0cy5zaWwub3JnL2Ntcy9zY3JpcHRzL3BhZ2UucGhwP3NpdGVfaWQ9bnJzaSZpZD1PRkwAQwBvAHAAeQByAGkAZwBoAHQAIACpACAAMgAwADEANAAsACAATgBhAHQAYQBuAGEAZQBsACAARwBhAG0AYQAgACgAdwB3AHcALgBuAGQAaQBzAGMAbwB2AGUAcgBlAGQALgBjAG8AbQAgAC4AIABpAG4AZgBvACgAYQB0ACkAbgBkAGkAcwBjAG8AdgBlAHIAZQBkAC4AYwBvAG0AKQBFAHgAbwAgADIAIABDAG8AbgBkAGUAbgBzAGUAZABSAGUAZwB1AGwAYQByADEALgAwADAAMQA7AFUASwBXAE4AOwBFAHgAbwAyAC0AUgBlAGcAdQBsAGEAcgBDAG8AbgBkAGUAbgBzAGUAZABFAHgAbwAgADIAIABSAGUAZwB1AGwAYQByACAAQwBvAG4AZABlAG4AcwBlAGQAVgBlAHIAcwBpAG8AbgAgADEALgAwADAAMQA7AFAAUwAgADAAMAAxAC4AMAAwADEAOwBoAG8AdABjAG8AbgB2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADgAMwAyADkARQB4AG8AMgAtAFIAZQBnAHUAbABhAHIAQwBvAG4AZABlAG4AcwBlAGQATgBhAHQAYQBuAGEAZQBsACAARwBhAG0AYQB3AHcAdwAuAG4AZABpAHMAYwBvAHYAZQByAGUAZAAuAGMAbwBtAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBjAG0AcwAvAHMAYwByAGkAcAB0AHMALwBwAGEAZwBlAC4AcABoAHAAPwBzAGkAdABlAF8AaQBkAD0AbgByAHMAaQAmAGkAZAA9AE8ARgBMAEUAeABvACAAMgBSAGUAZwB1AGwAYQByACAAQwBvAG4AZABlAG4AcwBlAGQAAAAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AZUAAAAAAAABlQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVAXUBfAF3AZoBrgG2AX0BhQGG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 truncated
|
||||
}
|
||||
|
||||
|
||||
body {background: linear-gradient(to bottom, #ccc, #444);
|
||||
font-family: exo2;
|
||||
margin: 10px 10px 10px 10px;
|
||||
width: 98%;
|
||||
}
|
||||
|
||||
a:link {text-decoration: none}
|
||||
a:visited {text-decoration:none}
|
||||
a:hover {text-decoration:none}
|
||||
|
||||
h1 {font: 20pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
color: #808080;
|
||||
opacity: 0.9;}
|
||||
|
||||
h2 {font: 14pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
}
|
||||
|
||||
h3 {font: 12pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
}
|
||||
|
||||
p {font-family: 8pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
}
|
||||
|
||||
ul {font-family: 8pt exo2;}
|
||||
|
||||
li {font-family: 8pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
}
|
||||
|
||||
.project_header {background: #88c;
|
||||
color: #fff;
|
||||
padding: 5px;
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.pageclass {background: #fff;
|
||||
border-radius: 10px;
|
||||
border: 2pt outset;
|
||||
border-spacing: 0px;
|
||||
padding: 0px;
|
||||
max-width: 1050px;
|
||||
min-width: 1050px
|
||||
margin: auto;
|
||||
text-shadow: 0 0 0.1em #CCC, 0 0 0.1em #87F;
|
||||
font-family: exo2;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
input {background: #fff;
|
||||
border: 1px inset;
|
||||
font-family: exo2;
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
|
||||
-webkit-border-radius: 2px;
|
||||
-moz-border-radius: 2px;
|
||||
-o-border-radius: 2px;
|
||||
-ms-border-radius: 2px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
select {background: #fff;
|
||||
font-family: exo2;
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
border: 1px solid #444;
|
||||
padding: 1px 2px 1px 2px;
|
||||
-webkit-border-radius: 7px;
|
||||
-moz-border-radius: 7px;
|
||||
-o-border-radius: 7px;
|
||||
-ms-border-radius: 7px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
textarea.fieldinput {background: #fff;
|
||||
resize: none;
|
||||
font-family: exo2;
|
||||
border: 1px solid #444;
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
padding: 2px 2px 2px 5px;
|
||||
-webkit-border-radius: 0px;
|
||||
-moz-border-radius: 0px;
|
||||
-o-border-radius: 0px;
|
||||
-ms-border-radius: 0px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
textarea.fieldinputerror {background: #fcc;
|
||||
resize: none;
|
||||
font-family: exo2;
|
||||
border: 1px solid #f00;
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
padding: 2px 2px 2px 5px;
|
||||
-webkit-border-radius: 7px;
|
||||
-moz-border-radius: 7px;
|
||||
-o-border-radius: 7px;
|
||||
-ms-border-radius: 7px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
.sectionframe {
|
||||
position: relative;
|
||||
font-family: exo2;
|
||||
border: 0px outset;
|
||||
font-size: 10pt;
|
||||
margin: 3px;
|
||||
background: #808080;
|
||||
padding: 0px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
.sectionframe:after{
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 1px;
|
||||
left: 1px;
|
||||
width: calc(100% - 2px);
|
||||
height: 12px;
|
||||
background: linear-gradient(rgba(255,255,255,0.5), rgba(255,255,255,0.2));
|
||||
}
|
||||
|
||||
.sectionframecontents {
|
||||
padding: 10px;
|
||||
text-align: justify;
|
||||
color: #000000;
|
||||
border: 1pt inset;
|
||||
background-color: #F8F8FF;
|
||||
}
|
||||
.sectionframeheading {
|
||||
# background: linear-gradient(to bottom, #fff, #88f);
|
||||
background: #2099f0;
|
||||
color: #fff;
|
||||
border: 1pt outset;
|
||||
vertical-align: middle;
|
||||
padding: 5px;
|
||||
margin: 0px;
|
||||
font-family: 12pt avenir;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
border-radius: 0px 0px 0px 0px;
|
||||
}
|
||||
|
||||
.sectionframeheading2 {
|
||||
background: #C0C0C0;
|
||||
font-family: exo2;
|
||||
font-size: 20pt;
|
||||
padding: 3px
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.heading {background: #fff;
|
||||
border-radius: 7px 7px 0px 0px;
|
||||
max-height: 80px;
|
||||
}
|
||||
.entryform {
|
||||
background: #2099f0;
|
||||
padding: 3px 3px 3px 3px;
|
||||
margin: 0px;
|
||||
border: 0px solid black;
|
||||
border-radius: 0px;
|
||||
}
|
||||
.entryform table {
|
||||
font: 12px exo2;
|
||||
background: #c5e1f4;
|
||||
border: 0pt solid black;
|
||||
}
|
||||
|
||||
.footer {
|
||||
background: linear-gradient(to bottom, #000, #888);
|
||||
font: 8pt verdana;
|
||||
color: #FFFFFF;
|
||||
text-align: center;
|
||||
border-radius: 0px 0px 6px 6px;}
|
||||
|
||||
.menubar {
|
||||
# background: linear-gradient(to bottom, #fff, #2099f0);
|
||||
padding: 0px 0px 0px 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
.baritem {
|
||||
background-image: linear-gradient(#2099f0, #c3ddef);
|
||||
color: #fff;
|
||||
position: relative;
|
||||
font-family: exo2;
|
||||
font-weight: 1000;
|
||||
font-size: 8pt;
|
||||
padding: 2px 10px;
|
||||
margin: 10px 0px 0px 0px;
|
||||
border: solid;
|
||||
border-width: 0px 0px 1px 0px;
|
||||
border-color: #fff;
|
||||
border-radius: 5px 5px 0px 0px;
|
||||
border-style: outset;
|
||||
transition: background 2s;
|
||||
}
|
||||
|
||||
.baritem:after{
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 1px;
|
||||
left: 1px;
|
||||
width: calc(100% - 2px);
|
||||
height: 50%;
|
||||
z-index: 5;
|
||||
pointer-events: none;
|
||||
border-radius: 4px 4px 0px 0px;
|
||||
background: linear-gradient(rgba(255,255,255,0.8), rgba(255,255,255,0.2));
|
||||
}
|
||||
|
||||
.baritemselected {
|
||||
background: #ccc;
|
||||
color: #000;
|
||||
font-family: exo2;
|
||||
font-weight: 1000;
|
||||
font-size: 8pt;
|
||||
padding: 2px 10px;
|
||||
margin: 5px 10px 0px 0px;
|
||||
border: solid;
|
||||
border-width: 1px 1px 0px 1px;
|
||||
border-color: #fff;
|
||||
border-radius: 5px 5px 0px 0px;
|
||||
border-style: outset;
|
||||
transition: background 2s;
|
||||
|
||||
}
|
||||
|
||||
.baritem:hover {
|
||||
background: #c3ddef;
|
||||
color: #fff;
|
||||
transition: background 5s;
|
||||
}
|
||||
|
||||
.panel {background: #ccc;
|
||||
margin: 10px;
|
||||
padding: 3px;
|
||||
border: 0pt inset;}
|
||||
|
||||
.panel table {
|
||||
font: 12px exo2;
|
||||
padding: 5px;
|
||||
background: #c5e1f4;
|
||||
border: 1pt solid black;
|
||||
border-radius: 9px;
|
||||
}
|
||||
.panel table th {
|
||||
background: #2099f0;
|
||||
color: #fff;
|
||||
padding: 2px 3px 3px 3px;
|
||||
border: 0pt;
|
||||
}
|
||||
.panel table td {
|
||||
background: #c5e1f4;
|
||||
color: #000;
|
||||
padding: 2px 3px 3px 3px;
|
||||
border: 0pt;
|
||||
}
|
||||
|
||||
.left {
|
||||
text-align: right;
|
||||
padding-left: 20px;
|
||||
border-radius: 9px 0px 0px 9px;
|
||||
}
|
||||
|
||||
.right {
|
||||
border-radius: 0px 9px 9px 0px;
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
.featured {background: #fff}
|
||||
|
||||
.buttonbay {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
.fieldinput {
|
||||
font-family: exo2;
|
||||
border-radius: 7px;
|
||||
padding: 2px 2px 2px 5px;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
.fieldinputerror {
|
||||
font-family: exo2;
|
||||
border-radius: 7px;
|
||||
padding: 2px 2px 2px 5px;
|
||||
background: #fcc;
|
||||
border: 1px solid red;
|
||||
}
|
||||
.fieldprompt {
|
||||
font-size: 10pt;
|
||||
text-align: right;
|
||||
background: #00f;
|
||||
}
|
||||
.message {font: bold 10pt verdana; color: #FF0000}
|
||||
.collection_heading {font: bold 12pt verdana; color: #FFFFFF}
|
||||
.collection_text {font: 10pt verdana; color: #FFFFFF}
|
||||
.collection_tracks_background {font: 8pt bold verdana; color: #FFFFFF; background: #10003F}
|
||||
.warning {font: 10pt verdana; background: #FF0000; color: #FFFFFF; text-align: justify}
|
||||
|
||||
.button {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
font-size: 10pt;
|
||||
font-weight: 400;
|
||||
color: #fff;
|
||||
border: 2px outset;
|
||||
background: #2099f0;
|
||||
padding: 2px 10px 3px 10px;
|
||||
margin: 0px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.button:after{
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
width: calc(100% - 0px);
|
||||
height: 10px;
|
||||
z-index: 5;
|
||||
border-radius: 3px;
|
||||
background: linear-gradient(rgba(255,255,255,0.8), rgba(255,255,255,0.2));
|
||||
}
|
||||
|
||||
.code {
|
||||
font-family: source;
|
||||
font-weight: 400;
|
||||
font-size: 10pt;
|
||||
border: 1pt solid black;
|
||||
background: #ff8;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
.controlframe {background: #888;
|
||||
padding: 5px 5px 15px 10px;
|
||||
}
|
||||
|
||||
.vm {position: relative;
|
||||
height: 55px;
|
||||
}
|
||||
|
||||
.vmname {position: absolute;
|
||||
left: 0px; top: 0px;
|
||||
height: 55px;
|
||||
}
|
||||
|
||||
.vmcover {position: absolute;
|
||||
left: 15px;
|
||||
top: 30px;
|
||||
font: 12px 'Dot Matrix';
|
||||
background: #bbb;
|
||||
color: white;
|
||||
border: 1pt solid white;
|
||||
border-radius: 5px;
|
||||
padding: 2px 10px 2px 10px;
|
||||
}
|
||||
|
||||
</style></head><body>
|
||||
<div class="pageclass">
|
||||
<div class="heading">
|
||||
<div style="display: inline-block; width: 500px;">
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
|
||||
<div style="padding-top: 15px;">
|
||||
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
|
||||
<div style="left: 80px; color: #2099f0;">Support E-Mail</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="float: right; text-align: right; margin-right: 10px; margin-top: 5px;"></div>
|
||||
</div>
|
||||
<div class="menubar">
|
||||
|
||||
|
||||
<table class="menubar" cellspacing="0" cellpadding="0" width="100%">
|
||||
<tr>
|
||||
<td style="border-bottom: 1pt solid #bbb; width: 20px;"> </td>
|
||||
<td class="baritem"><a href="/main">HOME</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/services">SERVICES</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/hosting">HOSTING</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/documents">DOCUMENT MGMT</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/siptrunk">SIP TRUNKING</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/vst">VST</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/modular1">MODULAR1</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/modular1_patches">MODULAR1 PATCHES</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/synthedit">SYNTHEDIT</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/wordpress">WORDPRESS</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/opensource">OPEN SOURCE</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/contact">CONTACT</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
|
||||
</ifrow>
|
||||
</if>
|
||||
<td class="baritem"><a href="/login">LOGIN</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
|
||||
<td style="border-bottom: 1pt solid #bbb; width: 10px;"> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
<div style="display: table-row; width: 100%;">
|
||||
<div style="display: table-cell; border:
|
||||
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
|
||||
<div class="panel" style="width: 200px; display: table-cell; ">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
|
||||
<a href="/barantmail">BARANTMAIL</a><br>
|
||||
<a href="/jet">JET</a><br>
|
||||
<a href="/synthmax">SYNTHMAX</a><br>
|
||||
<a href="/serverframework">SERVER CORE FRAMEWORK</a>
|
||||
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
|
||||
</div></div>
|
||||
|
||||
<comment>
|
||||
<if value1="$[_login_id]" value2="1" type="eq">
|
||||
<include file="sessionvar.menu">
|
||||
</if>
|
||||
</comment>
|
||||
</div>
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>Contact</b></div><div class="sectionframecontents">
|
||||
<p>Please contact us by phone at <b>(702) 755-8235</b>.</p>
|
||||
<p>To e-mail us, just enter text below and press the buttons:</p>
|
||||
|
||||
<entryform>
|
||||
<field prompt="Name" type="text" name="name" size="50" maxlength="50">
|
||||
<field prompt="E-Mail" type="text" name="email" size="50" maxlength="50">
|
||||
<field prompt="Message" type="multiline" name="message" rows="5" cols="60">
|
||||
|
||||
<captcha>
|
||||
|
||||
<buttonbay>
|
||||
Send Message
|
||||
</buttonbay>
|
||||
</entryform>
|
||||
|
||||
<messages>
|
||||
|
||||
<script src='https://www.google.com/recaptcha/api.js'></script>
|
||||
|
||||
</div></div>
|
||||
</div>
|
||||
<div style="clear: both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="footer" style="clear: both;">© 1999-2026 BARANT Systems, All Rights Reserved</div>
|
||||
</div>
|
||||
|
||||
</body></html>
|
||||
<include file="../src/SESSIONCTL.tag">
|
||||
<include file="../src/barant.tag">
|
||||
<include file="../src/project.tag">
|
||||
<set name="host" value="localhost">
|
||||
<set name="database" value="barant">
|
||||
<set name="user" value="barant">
|
||||
<set name="password" value="uversa1960">
|
||||
<database name="$[database]" host="$[host]" user="$[user]" password="$[password]" sessionid="">
|
||||
<sessionctl page="help">
|
||||
<defaultnav>
|
||||
<setpage name="help">
|
||||
</defaultnav>
|
||||
<link rel="stylesheet" href="/assets/main.css">
|
||||
<link rel="stylesheet" href="/assets/control.css">
|
||||
</sessionctl>
|
||||
</database>
|
||||
@@ -1,4 +1,3 @@
|
||||
#api GET /hosting
|
||||
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>HOSTING</title><style>
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<div class="pageclass">
|
||||
<div class="heading">
|
||||
<div style="display: inline-block; width: 500px;">
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
|
||||
<div style="padding-top: 15px;">
|
||||
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
|
||||
<div style="left: 80px; color: #2099f0;">HOSTING</div>
|
||||
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
|
||||
<div style="display: table-row; width: 100%;">
|
||||
<div style="display: table-cell; border:
|
||||
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
|
||||
background-image: url('/assets/grid.png') repeat-x repeat-y;">
|
||||
<div class="panel" style="width: 200px; display: table-cell; ">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
|
||||
<a href="/barantmail">BARANTMAIL</a><br>
|
||||
@@ -464,14 +463,10 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
|
||||
</div></div>
|
||||
|
||||
<comment>
|
||||
<if value1="$[_login_id]" value2="1" type="eq">
|
||||
<include file="sessionvar.menu">
|
||||
</if>
|
||||
</comment>
|
||||
|
||||
</div>
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
|
||||
<retain name="sku">
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
|
||||
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>Virtual Machine Hosting</b></div><div class="sectionframecontents">
|
||||
|
||||
<p>We offer several virtual machine hosting options. Everything to run your business.</p>
|
||||
@@ -531,7 +526,7 @@ telephony solution.</p>
|
||||
<hr>
|
||||
</div></div>
|
||||
<set name="pagemenu" value="davidarant" />
|
||||
</div>
|
||||
</div></div>
|
||||
<div style="clear: both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#api GET /jet
|
||||
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>barant.com - JET Extension Tags</title><style>
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<div class="pageclass">
|
||||
<div class="heading">
|
||||
<div style="display: inline-block; width: 500px;">
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
|
||||
<div style="padding-top: 15px;">
|
||||
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
|
||||
<div style="left: 80px; color: #2099f0;">barant.com - JET Extension Tags</div>
|
||||
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
|
||||
<div style="display: table-row; width: 100%;">
|
||||
<div style="display: table-cell; border:
|
||||
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
|
||||
background-image: url('/assets/grid.png') repeat-x repeat-y;">
|
||||
<div class="panel" style="width: 200px; display: table-cell; ">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
|
||||
<a href="/barantmail">BARANTMAIL</a><br>
|
||||
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
|
||||
</div></div>
|
||||
|
||||
<comment>
|
||||
<if value1="$[_login_id]" value2="1" type="eq">
|
||||
<include file="sessionvar.menu">
|
||||
</if>
|
||||
</comment>
|
||||
|
||||
</div>
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div class="sectionframe"><div class="sectionframeheading"><b>JET Extension Tags</b></div><div class="sectionframecontents">
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content"><div class="sectionframe"><div class="sectionframeheading"><b>JET Extension Tags</b></div><div class="sectionframecontents">
|
||||
|
||||
<p>Complete reference documentation go <a href="/jet/contents">here</a>.</p>
|
||||
|
||||
@@ -523,7 +518,7 @@ identifier.</li>
|
||||
<li>Pretty URLS with clean navigation.</li>
|
||||
</ul>
|
||||
</div></div>
|
||||
</div>
|
||||
</div></div>
|
||||
<div style="clear: both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,506 +0,0 @@
|
||||
#api GET /main
|
||||
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>BARANT Technology Group</title><style>
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
}
|
||||
|
||||
@keyframes rotation {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: avenir;
|
||||
src: url('data:font/ttf;base64,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 truncated
|
||||
}
|
||||
@font-face {
|
||||
font-family: source;
|
||||
src: url('data:font/ttf;base64,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 truncated
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: exo2;
|
||||
src: url('data:font/otf;base64,T1RUTwALAIAAAwAwQ0ZGIF65aMUAAA4EAACDv0dQT1NyBlyKAACeSAAAYTJHU1VCWwJIAAAAmQgAAAU+T1MvMmqogawAAAEgAAAAYGNtYXC4LHjGAAAGoAAAB0JoZWFkA3NjtwAAALwAAAA2aGhlYQc+BIEAAAD0AAAAJGhtdHg+CUgTAACRxAAAB0RtYXhwAdFQAAAAARgAAAAGbmFtZVDBsvwAAAGAAAAFHnBvc3T/uAAyAAAN5AAAACAAAQAAAAEAQYT55LNfDzz1AAMD6AAAAADQhBABAAAAANCEEAH/c/7tA+EDpwAAAAMAAgAAAAAAAAABAAAD5/83AAAEBf9z/3MD4QABAAAAAAAAAAAAAAAAAAAB0QAAUAAB0QAAAAMByAGQAAMACAKKAlgAAABLAooCWAAAAV4AMgEkAAAAAAUGAAAAAAAAAAACBwAAAAAAAAAAAAAAAFVLV04AQAAg+wICvP83ASsD5wDJIAAAlwAAAAAB5wKyAAAAIAADAAAAFgEOAAEAAAAAAAAATwAAAAEAAAAAAAEABQBPAAEAAAAAAAIAEQBUAAEAAAAAAAMAIABlAAEAAAAAAAQAFwCFAAEAAAAAAAUAPACcAAEAAAAAAAYAFQDYAAEAAAAAAAkADQDtAAEAAAAAAAwAEwD6AAEAAAAAAA4APwENAAMAAQQJAAAAngFMAAMAAQQJAAEAHgHqAAMAAQQJAAIADgIIAAMAAQQJAAMAQAIWAAMAAQQJAAQALgJWAAMAAQQJAAUAeAKEAAMAAQQJAAYAKgL8AAMAAQQJAAkAGgMmAAMAAQQJAAwAJgNAAAMAAQQJAA4AfgNmAAMAAQQJABAACgPkAAMAAQQJABEAIgPuQ29weXJpZ2h0IKkgMjAxNCwgTmF0YW5hZWwgR2FtYSAod3d3Lm5kaXNjb3ZlcmVkLmNvbSAuIGluZm8oYXQpbmRpc2NvdmVyZWQuY29tKUV4byAyUmVndWxhciBDb25kZW5zZWQxLjAwMTtVS1dOO0V4bzItUmVndWxhckNvbmRlbnNlZEV4byAyIFJlZ3VsYXIgQ29uZGVuc2VkVmVyc2lvbiAxLjAwMTtQUyAwMDEuMDAxO2hvdGNvbnYgMS4wLjcwO21ha2VvdGYubGliMi41LjU4MzI5RXhvMi1SZWd1bGFyQ29uZGVuc2VkTmF0YW5hZWwgR2FtYXd3dy5uZGlzY292ZXJlZC5jb21odHRwOi8vc2NyaXB0cy5zaWwub3JnL2Ntcy9zY3JpcHRzL3BhZ2UucGhwP3NpdGVfaWQ9bnJzaSZpZD1PRkwAQwBvAHAAeQByAGkAZwBoAHQAIACpACAAMgAwADEANAAsACAATgBhAHQAYQBuAGEAZQBsACAARwBhAG0AYQAgACgAdwB3AHcALgBuAGQAaQBzAGMAbwB2AGUAcgBlAGQALgBjAG8AbQAgAC4AIABpAG4AZgBvACgAYQB0ACkAbgBkAGkAcwBjAG8AdgBlAHIAZQBkAC4AYwBvAG0AKQBFAHgAbwAgADIAIABDAG8AbgBkAGUAbgBzAGUAZABSAGUAZwB1AGwAYQByADEALgAwADAAMQA7AFUASwBXAE4AOwBFAHgAbwAyAC0AUgBlAGcAdQBsAGEAcgBDAG8AbgBkAGUAbgBzAGUAZABFAHgAbwAgADIAIABSAGUAZwB1AGwAYQByACAAQwBvAG4AZABlAG4AcwBlAGQAVgBlAHIAcwBpAG8AbgAgADEALgAwADAAMQA7AFAAUwAgADAAMAAxAC4AMAAwADEAOwBoAG8AdABjAG8AbgB2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADgAMwAyADkARQB4AG8AMgAtAFIAZQBnAHUAbABhAHIAQwBvAG4AZABlAG4AcwBlAGQATgBhAHQAYQBuAGEAZQBsACAARwBhAG0AYQB3AHcAdwAuAG4AZABpAHMAYwBvAHYAZQByAGUAZAAuAGMAbwBtAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBjAG0AcwAvAHMAYwByAGkAcAB0AHMALwBwAGEAZwBlAC4AcABoAHAAPwBzAGkAdABlAF8AaQBkAD0AbgByAHMAaQAmAGkAZAA9AE8ARgBMAEUAeABvACAAMgBSAGUAZwB1AGwAYQByACAAQwBvAG4AZABlAG4AcwBlAGQAAAAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AZUAAAAAAAABlQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVAXUBfAF3AZoBrgG2AX0BhQGG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 truncated
|
||||
}
|
||||
|
||||
|
||||
body {background: linear-gradient(to bottom, #ccc, #444);
|
||||
font-family: exo2;
|
||||
margin: 10px 10px 10px 10px;
|
||||
width: 98%;
|
||||
}
|
||||
|
||||
a:link {text-decoration: none}
|
||||
a:visited {text-decoration:none}
|
||||
a:hover {text-decoration:none}
|
||||
|
||||
h1 {font: 20pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
color: #808080;
|
||||
opacity: 0.9;}
|
||||
|
||||
h2 {font: 14pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
}
|
||||
|
||||
h3 {font: 12pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
}
|
||||
|
||||
p {font-family: 8pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
}
|
||||
|
||||
ul {font-family: 8pt exo2;}
|
||||
|
||||
li {font-family: 8pt exo2;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
}
|
||||
|
||||
.project_header {background: #88c;
|
||||
color: #fff;
|
||||
padding: 5px;
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.pageclass {background: #fff;
|
||||
border-radius: 10px;
|
||||
border: 2pt outset;
|
||||
border-spacing: 0px;
|
||||
padding: 0px;
|
||||
max-width: 1050px;
|
||||
min-width: 1050px
|
||||
margin: auto;
|
||||
text-shadow: 0 0 0.1em #CCC, 0 0 0.1em #87F;
|
||||
font-family: exo2;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
input {background: #fff;
|
||||
border: 1px inset;
|
||||
font-family: exo2;
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
|
||||
-webkit-border-radius: 2px;
|
||||
-moz-border-radius: 2px;
|
||||
-o-border-radius: 2px;
|
||||
-ms-border-radius: 2px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
select {background: #fff;
|
||||
font-family: exo2;
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
border: 1px solid #444;
|
||||
padding: 1px 2px 1px 2px;
|
||||
-webkit-border-radius: 7px;
|
||||
-moz-border-radius: 7px;
|
||||
-o-border-radius: 7px;
|
||||
-ms-border-radius: 7px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
textarea.fieldinput {background: #fff;
|
||||
resize: none;
|
||||
font-family: exo2;
|
||||
border: 1px solid #444;
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
padding: 2px 2px 2px 5px;
|
||||
-webkit-border-radius: 0px;
|
||||
-moz-border-radius: 0px;
|
||||
-o-border-radius: 0px;
|
||||
-ms-border-radius: 0px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
textarea.fieldinputerror {background: #fcc;
|
||||
resize: none;
|
||||
font-family: exo2;
|
||||
border: 1px solid #f00;
|
||||
font-size: 14px;
|
||||
min-height: 18px;
|
||||
display: block;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 0px;
|
||||
outline: none;
|
||||
padding: 2px 2px 2px 5px;
|
||||
-webkit-border-radius: 7px;
|
||||
-moz-border-radius: 7px;
|
||||
-o-border-radius: 7px;
|
||||
-ms-border-radius: 7px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
.sectionframe {
|
||||
position: relative;
|
||||
font-family: exo2;
|
||||
border: 0px outset;
|
||||
font-size: 10pt;
|
||||
margin: 3px;
|
||||
background: #808080;
|
||||
padding: 0px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
.sectionframe:after{
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 1px;
|
||||
left: 1px;
|
||||
width: calc(100% - 2px);
|
||||
height: 12px;
|
||||
background: linear-gradient(rgba(255,255,255,0.5), rgba(255,255,255,0.2));
|
||||
}
|
||||
|
||||
.sectionframecontents {
|
||||
padding: 10px;
|
||||
text-align: justify;
|
||||
color: #000000;
|
||||
border: 1pt inset;
|
||||
background-color: #F8F8FF;
|
||||
}
|
||||
.sectionframeheading {
|
||||
# background: linear-gradient(to bottom, #fff, #88f);
|
||||
background: #2099f0;
|
||||
color: #fff;
|
||||
border: 1pt outset;
|
||||
vertical-align: middle;
|
||||
padding: 5px;
|
||||
margin: 0px;
|
||||
font-family: 12pt avenir;
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
border-radius: 0px 0px 0px 0px;
|
||||
}
|
||||
|
||||
.sectionframeheading2 {
|
||||
background: #C0C0C0;
|
||||
font-family: exo2;
|
||||
font-size: 20pt;
|
||||
padding: 3px
|
||||
text-shadow: 0 0 0.2em #CCC, 0 0 0.2em #87F;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.heading {background: #fff;
|
||||
border-radius: 7px 7px 0px 0px;
|
||||
max-height: 80px;
|
||||
}
|
||||
.entryform {
|
||||
background: #2099f0;
|
||||
padding: 3px 3px 3px 3px;
|
||||
margin: 0px;
|
||||
border: 0px solid black;
|
||||
border-radius: 0px;
|
||||
}
|
||||
.entryform table {
|
||||
font: 12px exo2;
|
||||
background: #c5e1f4;
|
||||
border: 0pt solid black;
|
||||
}
|
||||
|
||||
.footer {
|
||||
background: linear-gradient(to bottom, #000, #888);
|
||||
font: 8pt verdana;
|
||||
color: #FFFFFF;
|
||||
text-align: center;
|
||||
border-radius: 0px 0px 6px 6px;}
|
||||
|
||||
.menubar {
|
||||
# background: linear-gradient(to bottom, #fff, #2099f0);
|
||||
padding: 0px 0px 0px 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
.baritem {
|
||||
background-image: linear-gradient(#2099f0, #c3ddef);
|
||||
color: #fff;
|
||||
position: relative;
|
||||
font-family: exo2;
|
||||
font-weight: 1000;
|
||||
font-size: 8pt;
|
||||
padding: 2px 10px;
|
||||
margin: 10px 0px 0px 0px;
|
||||
border: solid;
|
||||
border-width: 0px 0px 1px 0px;
|
||||
border-color: #fff;
|
||||
border-radius: 5px 5px 0px 0px;
|
||||
border-style: outset;
|
||||
transition: background 2s;
|
||||
}
|
||||
|
||||
.baritem:after{
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 1px;
|
||||
left: 1px;
|
||||
width: calc(100% - 2px);
|
||||
height: 50%;
|
||||
z-index: 5;
|
||||
pointer-events: none;
|
||||
border-radius: 4px 4px 0px 0px;
|
||||
background: linear-gradient(rgba(255,255,255,0.8), rgba(255,255,255,0.2));
|
||||
}
|
||||
|
||||
.baritemselected {
|
||||
background: #ccc;
|
||||
color: #000;
|
||||
font-family: exo2;
|
||||
font-weight: 1000;
|
||||
font-size: 8pt;
|
||||
padding: 2px 10px;
|
||||
margin: 5px 10px 0px 0px;
|
||||
border: solid;
|
||||
border-width: 1px 1px 0px 1px;
|
||||
border-color: #fff;
|
||||
border-radius: 5px 5px 0px 0px;
|
||||
border-style: outset;
|
||||
transition: background 2s;
|
||||
|
||||
}
|
||||
|
||||
.baritem:hover {
|
||||
background: #c3ddef;
|
||||
color: #fff;
|
||||
transition: background 5s;
|
||||
}
|
||||
|
||||
.panel {background: #ccc;
|
||||
margin: 10px;
|
||||
padding: 3px;
|
||||
border: 0pt inset;}
|
||||
|
||||
.panel table {
|
||||
font: 12px exo2;
|
||||
padding: 5px;
|
||||
background: #c5e1f4;
|
||||
border: 1pt solid black;
|
||||
border-radius: 9px;
|
||||
}
|
||||
.panel table th {
|
||||
background: #2099f0;
|
||||
color: #fff;
|
||||
padding: 2px 3px 3px 3px;
|
||||
border: 0pt;
|
||||
}
|
||||
.panel table td {
|
||||
background: #c5e1f4;
|
||||
color: #000;
|
||||
padding: 2px 3px 3px 3px;
|
||||
border: 0pt;
|
||||
}
|
||||
|
||||
.left {
|
||||
text-align: right;
|
||||
padding-left: 20px;
|
||||
border-radius: 9px 0px 0px 9px;
|
||||
}
|
||||
|
||||
.right {
|
||||
border-radius: 0px 9px 9px 0px;
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
.featured {background: #fff}
|
||||
|
||||
.buttonbay {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
.fieldinput {
|
||||
font-family: exo2;
|
||||
border-radius: 7px;
|
||||
padding: 2px 2px 2px 5px;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
.fieldinputerror {
|
||||
font-family: exo2;
|
||||
border-radius: 7px;
|
||||
padding: 2px 2px 2px 5px;
|
||||
background: #fcc;
|
||||
border: 1px solid red;
|
||||
}
|
||||
.fieldprompt {
|
||||
font-size: 10pt;
|
||||
text-align: right;
|
||||
background: #00f;
|
||||
}
|
||||
.message {font: bold 10pt verdana; color: #FF0000}
|
||||
.collection_heading {font: bold 12pt verdana; color: #FFFFFF}
|
||||
.collection_text {font: 10pt verdana; color: #FFFFFF}
|
||||
.collection_tracks_background {font: 8pt bold verdana; color: #FFFFFF; background: #10003F}
|
||||
.warning {font: 10pt verdana; background: #FF0000; color: #FFFFFF; text-align: justify}
|
||||
|
||||
.button {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
font-size: 10pt;
|
||||
font-weight: 400;
|
||||
color: #fff;
|
||||
border: 2px outset;
|
||||
background: #2099f0;
|
||||
padding: 2px 10px 3px 10px;
|
||||
margin: 0px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.button:after{
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
width: calc(100% - 0px);
|
||||
height: 10px;
|
||||
z-index: 5;
|
||||
border-radius: 3px;
|
||||
background: linear-gradient(rgba(255,255,255,0.8), rgba(255,255,255,0.2));
|
||||
}
|
||||
|
||||
.code {
|
||||
font-family: source;
|
||||
font-weight: 400;
|
||||
font-size: 10pt;
|
||||
border: 1pt solid black;
|
||||
background: #ff8;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
.controlframe {background: #888;
|
||||
padding: 5px 5px 15px 10px;
|
||||
}
|
||||
|
||||
.vm {position: relative;
|
||||
height: 55px;
|
||||
}
|
||||
|
||||
.vmname {position: absolute;
|
||||
left: 0px; top: 0px;
|
||||
height: 55px;
|
||||
}
|
||||
|
||||
.vmcover {position: absolute;
|
||||
left: 15px;
|
||||
top: 30px;
|
||||
font: 12px 'Dot Matrix';
|
||||
background: #bbb;
|
||||
color: white;
|
||||
border: 1pt solid white;
|
||||
border-radius: 5px;
|
||||
padding: 2px 10px 2px 10px;
|
||||
}
|
||||
|
||||
</style></head><body>
|
||||
<div class="pageclass">
|
||||
<div class="heading">
|
||||
<div style="display: inline-block; width: 500px;">
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
|
||||
<div style="padding-top: 15px;">
|
||||
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
|
||||
<div style="left: 80px; color: #2099f0;">BARANT Technology Group</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="float: right; text-align: right; margin-right: 10px; margin-top: 5px;"></div>
|
||||
</div>
|
||||
<div class="menubar">
|
||||
|
||||
|
||||
<table class="menubar" cellspacing="0" cellpadding="0" width="100%">
|
||||
<tr>
|
||||
<td style="border-bottom: 1pt solid #bbb; width: 20px;"> </td>
|
||||
<td class="baritem"><a href="/main">HOME</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/services">SERVICES</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/hosting">HOSTING</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/documents">DOCUMENT MGMT</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/siptrunk">SIP TRUNKING</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/vst">VST</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/modular1">MODULAR1</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/modular1_patches">MODULAR1 PATCHES</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/synthedit">SYNTHEDIT</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/wordpress">WORDPRESS</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/opensource">OPEN SOURCE</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
<td class="baritem"><a href="/contact">CONTACT</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
|
||||
</ifrow>
|
||||
</if>
|
||||
<td class="baritem"><a href="/login">LOGIN</a></td><td style="border-bottom: 1pt solid #bbb;"> </td>
|
||||
|
||||
<td style="border-bottom: 1pt solid #bbb; width: 10px;"> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
<div style="display: table-row; width: 100%;">
|
||||
<div style="display: table-cell; border:
|
||||
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
|
||||
<div class="panel" style="width: 200px; display: table-cell; ">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
|
||||
<a href="/barantmail">BARANTMAIL</a><br>
|
||||
<a href="/jet">JET</a><br>
|
||||
<a href="/synthmax">SYNTHMAX</a><br>
|
||||
<a href="/serverframework">SERVER CORE FRAMEWORK</a>
|
||||
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
|
||||
</div></div>
|
||||
|
||||
<comment>
|
||||
<if value1="$[_login_id]" value2="1" type="eq">
|
||||
<include file="sessionvar.menu">
|
||||
</if>
|
||||
</comment>
|
||||
</div>
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
|
||||
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>Welcome to BARANT Systems</b></div><div class="sectionframecontents">
|
||||
|
||||
<div style="width: 48%;">
|
||||
<p>We are BARANT Technology Group. Contact us for information on how we can
|
||||
help you with your technical objectives.</p>
|
||||
|
||||
<h1>Modular1 VST Synthesizer</h1>
|
||||
<p>Check out our <a href="/vst">Modular1 VST3
|
||||
Synthesizer</a> If you appreciate the art of modular analog
|
||||
synthesizers then you will really enjoy the Modular1 with all the
|
||||
features of an analog modular synthesizer put into a single VST3
|
||||
instrument. With the added features of polyphony and patches that
|
||||
change instantaneously this synthesizer is truly a powerhouse in the
|
||||
audio toolbox.</p>
|
||||
<a href="/vst"><img src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvbW9kdWxhcjEucG5nJyk7PC9zY3JpcHQ+ICAgICAgICAgICAgICA8IURPQ1RZUEUgaHRtbD4gICAgICA8IS0tW2lmIGx0IElFIDcgXT48aHRtbCBjbGFzcz0iaWUgaWU2IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTciIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA4IF0+PGh0bWwgY2xhc3M9ImllIGllOCIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIChndGUgSUUgOSl8IShJRSldPjwhLS0+PGh0bWwgbGFuZz0iZW4iPiA8IS0tPCFbZW5kaWZdLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoZWFkPgogPHRpdGxlPlBhZ2UgTm90IEZvdW5kPC90aXRsZT4KICAgICAgIDxNRVRBIE5BTUU9QVVUSE9SIENPTlRFTlQ9IiI+ICAgICAgIDxNRVRBIE5BTUU9REVTQ1JJUFRJT04gQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1LRVlXT1JEUyBDT05URU5UPSIiPiAgICAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9tYWluLmNzcyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii9jc3MvY29udHJvbC5jc3MiPgogPGxpbmsgcmVsPSJpY29uIiB0eXBlPSJpbWFnZS9wbmciIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbS9pbWFnZXMvZmF2aWNvbi5wbmciPgogPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL2NrZWRpdG9yL2NrZWRpdG9yLmpzIj48L3NjcmlwdD4KIDwhLS0gR2xvYmFsIHNpdGUgdGFnIChndGFnLmpzKSAtIEdvb2dsZSBBbmFseXRpY3MgLS0+CiA8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD1HLVQyV1lSUDBDMEgiPjwvc2NyaXB0PgogPHNjcmlwdD4KICB3aW5kb3cuZGF0YUxheWVyID0gd2luZG93LmRhdGFMYXllciB8fCBbXTsKICBmdW5jdGlvbiBndGFnKCl7ZGF0YUxheWVyLnB1c2goYXJndW1lbnRzKTt9CiAgZ3RhZygnanMnLCBuZXcgRGF0ZSgpKTsKICBndGFnKCdjb25maWcnLCAnRy1UMldZUlAwQzBIJyk7CiA8L3NjcmlwdD4KICAgICAgICAgICAgIDwvaGVhZD4gICAgICA8Ym9keSAgICAgICAgICAgICA+ICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJfTEFTVFBBR0UiIFZBTFVFPSJtb2R1bGFyMS5wbmciID4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBST0NFU1MiIFZBTFVFPSIiID4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IkVYSVRQUk9DRVNTIiBWQUxVRT0iIiA+CTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkRJUiIgdmFsdWU9IiI+CTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Il9DVExESVIiIHZhbHVlPSIiPgk8SU5QVVQgVFlQRT1ISURERU4gTkFNRT0iUEFHRSIgVkFMVUU9Im1vZHVsYXIxLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdtb2R1bGFyMS5wbmcnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5zdWJtaXQoKTsgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZm9ybXNbMF0udGFyZ2V0PScnOyIgICAgICAgICAgICAgICAgICAgICAgCQkgICAgICA+PGEgaHJlZj0iL21haW4iPkhPTUU8L2E+PC9BPjwvdGQ+Cjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbTogMXB0IHNvbGlkICNiYmI7Ij4mbmJzcDs8L3RkPgo8dGQgY2xhc3M9ImJhcml0ZW0iPgo8QSBIUkVGPSJqYXZhc2NyaXB0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZm9ybXNbMF0uUFJPQ0VTUy52YWx1ZT0nJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZm9ybXNbMF0uUEFHRS52YWx1ZT0nbW9kdWxhcjEucG5nJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZm9ybXNbMF0uc3VibWl0KCk7ICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnRhcmdldD0nJzsiICAgICAgICAgICAgICAgICAgICAgIAkJICAgICAgPjxhIGhyZWY9Ii9zZXJ2aWNlcyI+U0VSVklDRVM8L2E+PC9BPjwvdGQ+Cjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbTogMXB0IHNvbGlkICNiYmI7Ij4mbmJzcDs8L3RkPgo8dGQgY2xhc3M9ImJhcml0ZW0iPgo8QSBIUkVGPSJqYXZhc2NyaXB0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZm9ybXNbMF0uUFJPQ0VTUy52YWx1ZT0nJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZm9ybXNbMF0uUEFHRS52YWx1ZT0nLine truncated
|
||||
<p>Excellent quality and technical performance provide a performance level
|
||||
instrument for musicians or students who wish to learn sound wave
|
||||
synthesis techniques or for musicians to enable that old analog sound
|
||||
in their DAW recording system..</p>
|
||||
<p>Checkout the product page for more information on the capabilities
|
||||
of the Modular1 synthesizer.</p>
|
||||
</div>
|
||||
</div></div>
|
||||
</div>
|
||||
<div style="clear: both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="footer" style="clear: both;">© 1999-2026 BARANT Systems, All Rights Reserved</div>
|
||||
</div>
|
||||
|
||||
</body></html>
|
||||
@@ -1,4 +1,3 @@
|
||||
#api GET /notfound
|
||||
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>Page Not Found</title><style>
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<div class="pageclass">
|
||||
<div class="heading">
|
||||
<div style="display: inline-block; width: 500px;">
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
|
||||
<div style="padding-top: 15px;">
|
||||
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
|
||||
<div style="left: 80px; color: #2099f0;">Page Not Found</div>
|
||||
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
|
||||
<div style="display: table-row; width: 100%;">
|
||||
<div style="display: table-cell; border:
|
||||
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
|
||||
background-image: url('/assets/grid.png') repeat-x repeat-y;">
|
||||
<div class="panel" style="width: 200px; display: table-cell; ">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
|
||||
<a href="/barantmail">BARANTMAIL</a><br>
|
||||
@@ -464,15 +463,11 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
|
||||
</div></div>
|
||||
|
||||
<comment>
|
||||
<if value1="$[_login_id]" value2="1" type="eq">
|
||||
<include file="sessionvar.menu">
|
||||
</if>
|
||||
</comment>
|
||||
|
||||
</div>
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
|
||||
<p>Requested page is not found.</p>
|
||||
</div>
|
||||
</div></div>
|
||||
<div style="clear: both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#api GET /opensource
|
||||
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>OPEN SOURCE</title><style>
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<div class="pageclass">
|
||||
<div class="heading">
|
||||
<div style="display: inline-block; width: 500px;">
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
|
||||
<div style="padding-top: 15px;">
|
||||
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
|
||||
<div style="left: 80px; color: #2099f0;">OPEN SOURCE</div>
|
||||
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
|
||||
<div style="display: table-row; width: 100%;">
|
||||
<div style="display: table-cell; border:
|
||||
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
|
||||
background-image: url('/assets/grid.png') repeat-x repeat-y;">
|
||||
<div class="panel" style="width: 200px; display: table-cell; ">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
|
||||
<a href="/barantmail">BARANTMAIL</a><br>
|
||||
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
|
||||
</div></div>
|
||||
|
||||
<comment>
|
||||
<if value1="$[_login_id]" value2="1" type="eq">
|
||||
<include file="sessionvar.menu">
|
||||
</if>
|
||||
</comment>
|
||||
|
||||
</div>
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>Open Source Projects</b></div><div class="sectionframecontents">
|
||||
<h1>Open Source Projects</h1>
|
||||
<p>We have several open source projects that we have created.</p>
|
||||
@@ -520,7 +515,7 @@ firmware code utilizing the RCA1802 micro-controller chip.</li>
|
||||
Check out our git server at <a href="https://git.barant.com">git.barant.com</a>.
|
||||
|
||||
</div></div>
|
||||
</div>
|
||||
</div></div>
|
||||
<div style="clear: both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#api GET /serverframework
|
||||
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>Server Core Framework</title><style>
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<div class="pageclass">
|
||||
<div class="heading">
|
||||
<div style="display: inline-block; width: 500px;">
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
|
||||
<div style="padding-top: 15px;">
|
||||
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
|
||||
<div style="left: 80px; color: #2099f0;">Server Core Framework</div>
|
||||
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
|
||||
<div style="display: table-row; width: 100%;">
|
||||
<div style="display: table-cell; border:
|
||||
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
|
||||
background-image: url('/assets/grid.png') repeat-x repeat-y;">
|
||||
<div class="panel" style="width: 200px; display: table-cell; ">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
|
||||
<a href="/barantmail">BARANTMAIL</a><br>
|
||||
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
|
||||
</div></div>
|
||||
|
||||
<comment>
|
||||
<if value1="$[_login_id]" value2="1" type="eq">
|
||||
<include file="sessionvar.menu">
|
||||
</if>
|
||||
</comment>
|
||||
|
||||
</div>
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>Server Core Framework</b></div><div class="sectionframecontents">
|
||||
<p>It is finally here! The Server Core Framework is now available. The
|
||||
framework offers support for just about any server you can devise.</p>
|
||||
@@ -503,14 +498,14 @@ Unty 3D and for the Unreal Engine 4 with drop in and play options that
|
||||
can be heavily modified to support unique game features. Offers
|
||||
support for mySQL backends.</p>
|
||||
|
||||
<img src="images/ServerCoreMap.png" width="80%">
|
||||
<img src="/assets/ServerCoreMap.png" width="80%">
|
||||
<br>
|
||||
<code>
|
||||
git clone https://barant.com/git@ServerCore.git
|
||||
</code>
|
||||
|
||||
</div></div>
|
||||
</div>
|
||||
</div></div>
|
||||
<div style="clear: both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#api GET /services
|
||||
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>BARANT Technology Group</title><style>
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<div class="pageclass">
|
||||
<div class="heading">
|
||||
<div style="display: inline-block; width: 500px;">
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
|
||||
<div style="padding-top: 15px;">
|
||||
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
|
||||
<div style="left: 80px; color: #2099f0;">BARANT Technology Group</div>
|
||||
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
|
||||
<div style="display: table-row; width: 100%;">
|
||||
<div style="display: table-cell; border:
|
||||
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
|
||||
background-image: url('/assets/grid.png') repeat-x repeat-y;">
|
||||
<div class="panel" style="width: 200px; display: table-cell; ">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
|
||||
<a href="/barantmail">BARANTMAIL</a><br>
|
||||
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
|
||||
</div></div>
|
||||
|
||||
<comment>
|
||||
<if value1="$[_login_id]" value2="1" type="eq">
|
||||
<include file="sessionvar.menu">
|
||||
</if>
|
||||
</comment>
|
||||
|
||||
</div>
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
|
||||
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>Welcome to BARANT Systems</b></div><div class="sectionframecontents">
|
||||
|
||||
@@ -517,7 +512,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
|
||||
</div>
|
||||
</div></div>
|
||||
</div>
|
||||
</div></div>
|
||||
<div style="clear: both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#api GET /siptrunk
|
||||
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>SIP Trunking</title><style>
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<div class="pageclass">
|
||||
<div class="heading">
|
||||
<div style="display: inline-block; width: 500px;">
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
|
||||
<div style="padding-top: 15px;">
|
||||
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
|
||||
<div style="left: 80px; color: #2099f0;">SIP Trunking</div>
|
||||
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
|
||||
<div style="display: table-row; width: 100%;">
|
||||
<div style="display: table-cell; border:
|
||||
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
|
||||
background-image: url('/assets/grid.png') repeat-x repeat-y;">
|
||||
<div class="panel" style="width: 200px; display: table-cell; ">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
|
||||
<a href="/barantmail">BARANTMAIL</a><br>
|
||||
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
|
||||
</div></div>
|
||||
|
||||
<comment>
|
||||
<if value1="$[_login_id]" value2="1" type="eq">
|
||||
<include file="sessionvar.menu">
|
||||
</if>
|
||||
</comment>
|
||||
|
||||
</div>
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>SIP Trunking</b></div><div class="sectionframecontents">
|
||||
<h1>For PBX Systems</h1>
|
||||
<p>Some of the best prices around for adding trunks to your PBX. We
|
||||
@@ -504,7 +499,7 @@ We can also host a PBX for you as well. Complete functionality
|
||||
utilizing FreePBX can be provided on the internet so you do not need
|
||||
to worry about the hardware. We manage and maintain everything for you.
|
||||
</div></div>
|
||||
</div>
|
||||
</div></div>
|
||||
<div style="clear: both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#api GET /synthedit
|
||||
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>SYNTHEDIT</title><style>
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<div class="pageclass">
|
||||
<div class="heading">
|
||||
<div style="display: inline-block; width: 500px;">
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
|
||||
<div style="padding-top: 15px;">
|
||||
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
|
||||
<div style="left: 80px; color: #2099f0;">SYNTHEDIT</div>
|
||||
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
|
||||
<div style="display: table-row; width: 100%;">
|
||||
<div style="display: table-cell; border:
|
||||
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
|
||||
background-image: url('/assets/grid.png') repeat-x repeat-y;">
|
||||
<div class="panel" style="width: 200px; display: table-cell; ">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
|
||||
<a href="/barantmail">BARANTMAIL</a><br>
|
||||
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
|
||||
</div></div>
|
||||
|
||||
<comment>
|
||||
<if value1="$[_login_id]" value2="1" type="eq">
|
||||
<include file="sessionvar.menu">
|
||||
</if>
|
||||
</comment>
|
||||
|
||||
</div>
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>SYNTHEDIT</b></div><div class="sectionframecontents">
|
||||
<h1>Modules</h1>
|
||||
<p>Several modules are under development for Synthedit 1.4.</p>
|
||||
@@ -492,9 +487,9 @@ synthesizers. Using a superfast algorithm to generate with precision
|
||||
the harmonics up to the nyquist limit. Precise control over the amplitude and phase
|
||||
of each harmonic allows traditional waveforms to be generated without
|
||||
aliasing problems. </p>
|
||||
<img src="images/sawtooth.png" width="120px">
|
||||
<img src="images/square.png" width="120px">
|
||||
<img src="images/triangle.png" width="120px">
|
||||
<img src="/assets/sawtooth.png" width="120px">
|
||||
<img src="/assets/square.png" width="120px">
|
||||
<img src="/assets/triangle.png" width="120px">
|
||||
<br>
|
||||
<p>Individual control over each and every harmonic affords the
|
||||
generation of many waveforms that require a harmonic purity.</p>
|
||||
@@ -502,7 +497,7 @@ generation of many waveforms that require a harmonic purity.</p>
|
||||
</div>
|
||||
|
||||
</div></div>
|
||||
</div>
|
||||
</div></div>
|
||||
<div style="clear: both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#api GET /wordpress
|
||||
<set name="jetc_doctype" value="<!DOCTYPE html>" />$[jetc_doctype]<html lang="en"><head><title>Wordpress Plugins</title><style>
|
||||
.rotate {
|
||||
animation: rotation 1s infinite linear;
|
||||
@@ -415,7 +414,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<div class="pageclass">
|
||||
<div class="heading">
|
||||
<div style="display: inline-block; width: 500px;">
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvYnRnbG9nby5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImJ0Z2xvZ28ucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJidGdsb2dvLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdidGdsb2dvLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLine truncated
|
||||
<a href="https://barant.com"><img style="width: 60px; height: 60px; margin: 10px;" align="left" src="/assets/btglogo.png"></a>
|
||||
<div style="padding-top: 15px;">
|
||||
<div style="left: 80px; color: #2099f0; font-size: 20pt;">BARANT TECHNOLOGY GROUP</div>
|
||||
<div style="left: 80px; color: #2099f0;">Wordpress Plugins</div>
|
||||
@@ -454,7 +453,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
|
||||
<div style="display: table-row; width: 100%;">
|
||||
<div style="display: table-cell; border:
|
||||
background-image: url('data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvZ3JpZC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9ImdyaWQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJncmlkLnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdncmlkLnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBBR0UudmFsdWU9J2dyaWQucG5nJzsLine truncated
|
||||
background-image: url('/assets/grid.png') repeat-x repeat-y;">
|
||||
<div class="panel" style="width: 200px; display: table-cell; ">
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>OPEN SOURCE PROJECTS</b></div><div class="sectionframecontents">
|
||||
<a href="/barantmail">BARANTMAIL</a><br>
|
||||
@@ -464,13 +463,9 @@ textarea.fieldinputerror {background: #fcc;
|
||||
<a href="/asm1802">ASM/MCH 1802 SIMULATOR</a><br>
|
||||
</div></div>
|
||||
|
||||
<comment>
|
||||
<if value1="$[_login_id]" value2="1" type="eq">
|
||||
<include file="sessionvar.menu">
|
||||
</if>
|
||||
</comment>
|
||||
|
||||
</div>
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;">
|
||||
<div class="panel" style="display: table-cell; width: 960px; max-width: 960px;"><div id="jetc-content">
|
||||
|
||||
|
||||
<div class="sectionframe"><div class="sectionframeheading"><b>BARANT Shopping Cart for WordPress</b></div><div class="sectionframecontents">
|
||||
@@ -491,7 +486,7 @@ textarea.fieldinputerror {background: #fcc;
|
||||
Square, with no WooCommerce required.</p>
|
||||
</div>
|
||||
<div style="display: table-cell; vertical-align: top; width: 90px; text-align: center;">
|
||||
<img src="data:image/png;base64,ICAgICAgICAgICAgICAgIDxzY3JpcHQ+d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCcnLCcvc2hvcHBpbmdfY2FydC5wbmcnKTs8L3NjcmlwdD4gICAgICAgICAgICAgIDwhRE9DVFlQRSBodG1sPiAgICAgIDwhLS1baWYgbHQgSUUgNyBdPjxodG1sIGNsYXNzPSJpZSBpZTYiIGxhbmc9ImVuIj4gPCFbZW5kaWZdLS0+ICAgICAgPCEtLVtpZiBJRSA3IF0+PGh0bWwgY2xhc3M9ImllIGllNyIgbGFuZz0iZW4iPiA8IVtlbmRpZl0tLT4gICAgICA8IS0tW2lmIElFIDggXT48aHRtbCBjbGFzcz0iaWUgaWU4IiBsYW5nPSJlbiI+IDwhW2VuZGlmXS0tPiAgICAgIDwhLS1baWYgKGd0ZSBJRSA5KXwhKElFKV0+PCEtLT48aHRtbCBsYW5nPSJlbiI+IDwhLS08IVtlbmRpZl0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CiA8dGl0bGU+UGFnZSBOb3QgRm91bmQ8L3RpdGxlPgogICAgICAgPE1FVEEgTkFNRT1BVVRIT1IgQ09OVEVOVD0iIj4gICAgICAgPE1FVEEgTkFNRT1ERVNDUklQVElPTiBDT05URU5UPSIiPiAgICAgICA8TUVUQSBOQU1FPUtFWVdPUkRTIENPTlRFTlQ9IiI+ICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL21haW4uY3NzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Nzcy9jb250cm9sLmNzcyI+CiA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaHR0cHM6Ly9iYXJhbnQuY29tL2ltYWdlcy9mYXZpY29uLnBuZyI+CiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvY2tlZGl0b3IvY2tlZGl0b3IuanMiPjwvc2NyaXB0PgogPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctVDJXWVJQMEMwSCI+PC9zY3JpcHQ+CiA8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwogIGd0YWcoJ2NvbmZpZycsICdHLVQyV1lSUDBDMEgnKTsKIDwvc2NyaXB0PgogICAgICAgICAgICAgPC9oZWFkPiAgICAgIDxib2R5ICAgICAgICAgICAgID4gICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9MQVNUUEFHRSIgVkFMVUU9InNob3BwaW5nX2NhcnQucG5nIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJQUk9DRVNTIiBWQUxVRT0iIiA+CTxJTlBVVCBUWVBFPUhJRERFTiBOQU1FPSJFWElUUFJPQ0VTUyIgVkFMVUU9IiIgPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJESVIiIHZhbHVlPSIiPgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfQ1RMRElSIiB2YWx1ZT0iIj4JPElOUFVUIFRZUEU9SElEREVOIE5BTUU9IlBBR0UiIFZBTFVFPSJzaG9wcGluZ19jYXJ0LnBuZyIgPiAgICAgICAgPElOUFVUIFRZUEU9SElEREVOIE5BTUU9Il9USU1FU1RBTVAiIFZBTFVFPSIiID4gICAgICAgICAgICAgICAgIAkJCgkgICA8ZGl2IGNsYXNzPSJwYWdlY2xhc3MiPgogIDxkaXYgY2xhc3M9ImhlYWRpbmciPiAgICAKICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KICAgIDxhIGhyZWY9Imh0dHBzOi8vYmFyYW50LmNvbSI+PGltZyBzdHlsZT0id2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgbWFyZ2luOiAxMHB4OyIgYWxpZ249ImxlZnQiIHNyYz0iL2ltYWdlcy9idGdsb2dvLnBuZyI+PC9hPgogICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6IDE1cHg7Ij4KICAgICA8ZGl2IHN0eWxlPSJsZWZ0OiA4MHB4OyBjb2xvcjogIzIwOTlmMDsgZm9udC1zaXplOiAyMHB0OyI+QkFSQU5UIFRFQ0hOT0xPR1kgR1JPVVA8L2Rpdj4gIAogICAgIDxkaXYgc3R5bGU9ImxlZnQ6IDgwcHg7IGNvbG9yOiAjMjA5OWYwOyI+UGFnZSBOb3QgRm91bmQ8L2Rpdj4gICAgCiAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogMTBweDsgbWFyZ2luLXRvcDogNXB4OyI+PC9kaXY+IAogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1lbnViYXIiPgo8dGFibGUgY2xhc3M9Im1lbnViYXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg6IDEwMCUiPgo8dHI+CiA8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyB3aWR0aDogMjBweDsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdzaG9wcGluZ19jYXJ0LnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvbWFpbiI+SE9NRTwvYT48L0E+PC90ZD4KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHQgc29saWQgI2JiYjsiPiZuYnNwOzwvdGQ+Cjx0ZCBjbGFzcz0iYmFyaXRlbSI+CjxBIEhSRUY9ImphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QUk9DRVNTLnZhbHVlPScnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5QQUdFLnZhbHVlPSdzaG9wcGluZ19jYXJ0LnBuZyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS50YXJnZXQ9Jyc7IiAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgID48YSBocmVmPSIvc2VydmljZXMiPlNFUlZJQ0VTPC9hPjwvQT48L3RkPgo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDFwdCBzb2xpZCAjYmJiOyI+Jm5ic3A7PC90ZD4KPHRkIGNsYXNzPSJiYXJpdGVtIj4KPEEgSFJFRj0iamF2YXNjcmlwdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLlBST0NFU1MudmFsdWU9Jyc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWLine truncated
|
||||
<img src="/assets/shopping_cart.png" width="64">
|
||||
</div>
|
||||
</div>
|
||||
</div></div>
|
||||
@@ -534,7 +529,7 @@ touch</a> - BARANT Technology Group can also handle hosting and setup for
|
||||
you directly.</p>
|
||||
</div></div>
|
||||
|
||||
</div>
|
||||
</div></div>
|
||||
<div style="clear: both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
# --------------------------------------------------------------
|
||||
# SESSIONCTL lib
|
||||
#
|
||||
# Session Control Function Library
|
||||
#
|
||||
#
|
||||
# --------------------------------------------------------------
|
||||
|
||||
<tag name="ifadmin">
|
||||
<if value1="$[__admin__]" value2="1" type="eq">
|
||||
@@ -18,9 +11,6 @@
|
||||
</if>
|
||||
</tag>
|
||||
|
||||
#==============================================================================
|
||||
# RETAIN tag definition.
|
||||
#==============================================================================
|
||||
|
||||
<tag name="retain" keywords="name value empty">
|
||||
<if value1="#[empty]" value2="" type=eq>
|
||||
@@ -36,17 +26,8 @@
|
||||
</if>
|
||||
</tag>
|
||||
|
||||
#==============================================================================
|
||||
# IFNOTSESSION tag definition.
|
||||
#==============================================================================
|
||||
|
||||
<tag name="ifnotsession">
|
||||
<if value1="$[_SESSIONID]" value2="" type="eq"><container></if>
|
||||
</tag>
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# LINKBUTTON tag definition.
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
<tag name="linkbutton" keywords="pagedir page process name name2 value value2 target class multipart">
|
||||
|
||||
@@ -93,8 +74,8 @@
|
||||
document.forms[0].N_LEVEL.value='$[X_LEVEL]';
|
||||
</IF>
|
||||
|
||||
document.forms[0].submit();
|
||||
document.forms[0].target='';"
|
||||
document.forms[0].target='';
|
||||
document.forms[0].requestSubmit();"
|
||||
<if value1="#[CLASS]" value2="" type="ne">
|
||||
CLASS="#[CLASS]"
|
||||
</if>
|
||||
@@ -102,9 +83,6 @@
|
||||
|
||||
</TAG>
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# ABUTTON tag definition.
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
<TAG NAME="ABUTTON" KEYWORDS="PAGE PROCESS NAME VALUE MULTIPART">
|
||||
<BUTTON ONCLICK="javascript:
|
||||
@@ -126,81 +104,20 @@
|
||||
document.forms[0].encoding='multipart/form-data';
|
||||
</IF>
|
||||
|
||||
document.forms[0].submit();"> <CONTAINER> </BUTTON>
|
||||
document.forms[0].requestSubmit();"> <CONTAINER> </BUTTON>
|
||||
</TAG>
|
||||
|
||||
# ----------------------------------------------
|
||||
# CREATESESSION
|
||||
# ----------------------------------------------
|
||||
<tag name="createsession" keywords="page timeout">
|
||||
<if value1="$[_session_id]" value2="" type="ne">
|
||||
<sql>
|
||||
delete from sessions
|
||||
where uuid='$[_session_id]'
|
||||
</sql>
|
||||
</if>
|
||||
<set name="_uuid" expr="uuid()">
|
||||
<set name="_timestamp" expr="now()">
|
||||
<if value1="#[timeout]" value2="" type="eq">
|
||||
<set name="timeout" value="0" scope="local">
|
||||
</if>
|
||||
<sql>
|
||||
insert into sessions
|
||||
set uuid='$[_uuid]',
|
||||
timestamp='$[_timestamp]',
|
||||
timeout_page='#[page]',
|
||||
timeout=#[timeout]
|
||||
</sql>
|
||||
<if value1="#[timeout]" value2="" type="eq">
|
||||
<setcookie name="_session_id" value="$[_uuid]">
|
||||
<else>
|
||||
<setcookie name="_session_id" value="$[_uuid]" timeout="#[timeout]">
|
||||
</if>
|
||||
</tag>
|
||||
|
||||
# ----------------------------------------------
|
||||
# ENDSESSION
|
||||
# ----------------------------------------------
|
||||
<tag name="endsession">
|
||||
<if value1="$[_session_id]" value2="" type="ne">
|
||||
<sql>
|
||||
delete from sessions
|
||||
where uuid='$[_session_id]'
|
||||
</sql>
|
||||
<setcookie name="_session_id" value="">
|
||||
</if>
|
||||
</tag>
|
||||
|
||||
#--------------------------------------------------
|
||||
#SETENV
|
||||
#--------------------------------------------------
|
||||
<tag name="setenv" keywords="name">
|
||||
<if value1="$[_session_id]" value2="" type="ne">
|
||||
<eval name="_envvalue" scope="local"><container></eval>
|
||||
<set name="_envvalue" value="#[_envvalue]" format="binary" scope="local">
|
||||
<sql>
|
||||
replace into sessionenv
|
||||
set session_uuid='$[_session_id]',
|
||||
name='#[name]',
|
||||
value='#[_envvalue]'
|
||||
</sql>$[sqlerror]
|
||||
<eval name="#[name]"><container></eval>
|
||||
</if>
|
||||
<eval name="_envvalue" scope="local"><container></eval>
|
||||
<set name="#[name]" value="#[_envvalue]">
|
||||
<set name="@#[name]" value="#[_envvalue]">
|
||||
</tag>
|
||||
|
||||
#--------------------------------------------------
|
||||
#CLEARENV
|
||||
#--------------------------------------------------
|
||||
<tag name="clearenv" keywords="name">
|
||||
<sql>
|
||||
DELETE FROM sessionenv WHERE session_uuid='$[_session_id]' AND name='#[name]'
|
||||
</sql>$[sqlerror]
|
||||
<SET NAME='#[name]' VALUE="">
|
||||
</tag>
|
||||
<tag name="clearenv" keywords="name">
|
||||
<set name="#[name]" value="">
|
||||
<set name="@#[name]" value="">
|
||||
</tag>
|
||||
|
||||
#--------------------------------------------------
|
||||
#SETPAGE
|
||||
#--------------------------------------------------
|
||||
<tag name="setpage" keywords="NAME DIR">
|
||||
<SET NAME=PAGE VALUE='#[NAME]'>
|
||||
<IF VALUE1="#[DIR]" VALUE2="" TYPE="NE">
|
||||
@@ -209,79 +126,21 @@
|
||||
</IF>
|
||||
</TAG>
|
||||
|
||||
#--------------------------------------------------
|
||||
#SETPROCESS
|
||||
#--------------------------------------------------
|
||||
|
||||
<TAG NAME='SETPROCESS' KEYWORDS='VALUE'>
|
||||
<SET NAME=PROCESS VALUE='#[VALUE]'>
|
||||
</TAG>
|
||||
|
||||
#--------------------------------------------------
|
||||
#CHECKSESSION
|
||||
#--------------------------------------------------
|
||||
|
||||
<tag name="checksession">
|
||||
|
||||
<sql>
|
||||
select *,
|
||||
if((timeout > 0) && (unix_timestamp(now()) - unix_timestamp(timestamp) > (timeout * 60)),'0','1') as session_valid
|
||||
from sessions
|
||||
where uuid="$[_session_id]"
|
||||
</sql>$[sqlerror]
|
||||
|
||||
<ifrow>
|
||||
<if value1="$[.session_valid]" value2="1" type="eq">
|
||||
<set name="session_timestamp" value="$[.timestamp]">
|
||||
<set name="_timestamp" expr="now()">
|
||||
<sql>
|
||||
update sessions
|
||||
set timestamp='$[_timestamp]'
|
||||
where uuid="$[_session_id]"
|
||||
</sql>
|
||||
|
||||
<sql>
|
||||
select * from sessionenv where session_uuid="$[_session_id]"
|
||||
</sql>$[sqlerror]
|
||||
<whilerow>
|
||||
<eval name="$[.name]">$[.value]</eval>
|
||||
</whilerow>
|
||||
|
||||
<else>
|
||||
<setpage name="$[.timeout_page]">
|
||||
<set name="_session_id" value="">
|
||||
</if>
|
||||
|
||||
<else>
|
||||
<setpage name="">
|
||||
<set name="_session_id" value="">
|
||||
</ifrow>
|
||||
|
||||
<set name="_login_id" value="$[@_login_id]">
|
||||
<set name="_login_name" value="$[@_login_name]">
|
||||
<set name="_login_email" value="$[@_login_email]">
|
||||
<set name="_login_type" value="$[@_login_type]">
|
||||
<set name="_login_uuid" value="$[@_login_uuid]">
|
||||
</tag>
|
||||
|
||||
#--------------------------------------------------
|
||||
#FIRST RUN - See FETCHPROC in SESSIONCTL tag
|
||||
#--------------------------------------------------
|
||||
|
||||
<TAG NAME='FIRSTRUN'>
|
||||
<IF VALUE1='$[_PROCESSRAN]' VALUE2='FALSE' TYPE=EQ>
|
||||
<EVAL NAME='_FIRSTRUN'>$[_FIRSTRUN] <CONTAINER></EVAL>
|
||||
</IF>
|
||||
</TAG>
|
||||
|
||||
#--------------------------------------------------
|
||||
#RUNERROR - See FETCHPROC in SESSIONCTL tag
|
||||
#--------------------------------------------------
|
||||
|
||||
<TAG NAME='RUNERROR'>
|
||||
<IF VALUE1='$[_PROCESSRAN]' VALUE2='TRUE' TYPE=EQ>
|
||||
<EVAL NAME="_RUNERROR">$[_RUNERROR] <CONTAINER></EVAL>
|
||||
</IF>
|
||||
</TAG>
|
||||
|
||||
#--------------------------------------------------
|
||||
#SESSIONCTL
|
||||
#--------------------------------------------------
|
||||
<tag name='sessionctl' keywords="page stylesheet">
|
||||
<tag name="defaultnav"><if expr="('$[PAGE]' = '') and ('$[PROCESS]' = '')"><eval><container></eval></if></tag>
|
||||
<database name="$[database]" host="$[host]" user="$[user]" password="$[password]" sessionid="_SESSIONCTL">
|
||||
@@ -292,10 +151,10 @@
|
||||
<fetchpage>
|
||||
</tag>
|
||||
<tag name="page" keywords="template class onload secure loggedin admin" scope="local">
|
||||
<tag name="author" scope="local"><eval name="author" scope="parent"><container></eval></tag>
|
||||
<tag name="author" scope="local"><eval name="AUTHOR" scope="parent"><container></eval></tag>
|
||||
<tag name="description" scope="local"><container name="description" eval="no" scope="parent"></tag>
|
||||
<tag name="keywords" scope="local"><container name="keywords" eval="no" scope="parent"></tag>
|
||||
<tag name="contents" scope="local"><eval name="_body"><container></eval></tag>
|
||||
<tag name="contents" scope="local"><eval name="_BODY"><container></eval></tag>
|
||||
<TAG NAME='TEMPLATE' SCOPE=LOCAL>
|
||||
<tag name="contents" scope="local">
|
||||
$[_BODY]
|
||||
@@ -331,7 +190,7 @@ $[_BODY]
|
||||
</head>
|
||||
<body <if value1="#[CLASS]" value2="" type="ne">class="#[CLASS]"</if>
|
||||
<if value1="#[onload]" value2="" type="ne">onload="#[onload]"</if>>
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
<form method="post" enctype="multipart/form-data" action="$[REQUEST_URI]">
|
||||
<INPUT TYPE=HIDDEN NAME="_LASTPAGE" VALUE="$[PAGE]" >
|
||||
<INPUT TYPE=HIDDEN NAME="PROCESS" VALUE="" >
|
||||
<INPUT TYPE=HIDDEN NAME="EXITPROCESS" VALUE="$[EXITPROCESS]" >
|
||||
@@ -361,14 +220,7 @@ $[_BODY]
|
||||
</TAG>
|
||||
<tag name="fetchproc">
|
||||
<tag name="process">
|
||||
<if value1="$[_TIMESTAMP:0]" value2="$[session_timestamp]" type="eq">
|
||||
<set name="_PROCESSRAN" value="FALSE">
|
||||
<else>
|
||||
<set name="_PROCESSRAN" value="TRUE">
|
||||
</if>
|
||||
<eval><container></eval>
|
||||
<eval>$[_FIRSTRUN]</eval>
|
||||
<eval>$[_RUNERROR]</eval>
|
||||
</tag>
|
||||
<EVAL><INCLUDE FILE="./$[DIR]/$[PROCESS].proc"></EVAL>
|
||||
</TAG>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<heading>
|
||||
<title>Barant Systems - West Coast Wing Chun Open House 2014</title>
|
||||
</heading>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate" secure="yes" loggedin="yes">
|
||||
<page secure="yes" loggedin="yes">
|
||||
<title>ACCOUNT</title>
|
||||
<contents>
|
||||
<retain name="download_file">
|
||||
@@ -46,7 +46,7 @@
|
||||
<br><span style="font-size: 9pt;"><b>barant.com</b></span>
|
||||
<br><span style="font-size: 7pt;">IP:</span> <span style="font-size: 9pt; font-family: monospace;">74.80.233.78</span></div>
|
||||
|
||||
<div style="float: right; padding: 5px;"><img src="images/power_on.png" width="32"></div>
|
||||
<div style="float: right; padding: 5px;"><img src="/assets/power_on.png" width="32"></div>
|
||||
<div style="float: right; width: 90px; height: 48px; background: #444;"></div>
|
||||
<div style="float: right; margin-right: 25px;">3 days 2:10:33<br><br>34% of 40.2GB</div>
|
||||
<div style="clear: both;"></div>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<title>BARANT Systems</title>
|
||||
<contents>
|
||||
<sectionframe title="E-Mail Confirmation">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<heading>
|
||||
<title>The Digital Gods - The MP3 Music Store</title>
|
||||
</heading>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<menu>
|
||||
<include file="projects.menu">
|
||||
<include file="sessionvar.menu">
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
<if value1="$[_session_id]" value2="" type="eq">
|
||||
<createsession>
|
||||
</if>
|
||||
$[_session_id]-$[sku]
|
||||
<sql>select * from cart_item where session_uuid='$[_session_id]' and sku='$[sku]'</sql>
|
||||
$[sqlerror]
|
||||
<ifrow><set name="qty" value="$[.quantity]"></ifrow>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate" secure="yes" loggedin="yes" admin="true">
|
||||
<page secure="yes" loggedin="yes" admin="true">
|
||||
<title>ADMINISTRATION</title>
|
||||
<contents>
|
||||
<eval name="_menu">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate" secure="yes" admin="true" loggedin="yes">
|
||||
<page secure="yes" admin="true" loggedin="yes">
|
||||
<title>INVOICE</title>
|
||||
<contents>
|
||||
<eval name="_menu">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate" secure="yes" loggedin="yes" admin="true">
|
||||
<page secure="yes" loggedin="yes" admin="true">
|
||||
<title>ADMIN INVOICES</title>
|
||||
<contents>
|
||||
<eval name="_menu">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<title>APPLICATIONS</title>
|
||||
<contents>
|
||||
<sectionframe title="Project Manager">
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<title>RCA1802 Micro-Controller Assembler/Emulator</title>
|
||||
<contents>
|
||||
<sectionframe title="RCA1802">
|
||||
<h1>The RCA1802 Micro-Controller</h1>
|
||||
<img src="images/rca1802chip.jpeg" align="right">
|
||||
<img src="/assets/rca1802chip.jpeg" align="right">
|
||||
<p>Back in the 1970's RCA released a chip that was widely used in
|
||||
satellites and other spacecraft to this day. It is a very simple
|
||||
8-bit micro-controller with 16-bit addressibility enabling memory
|
||||
@@ -26,7 +26,7 @@ device.</p>
|
||||
|
||||
</sectionframe>
|
||||
<sectionframe title="RCA1802 Emulator">
|
||||
<img src="images/emu1802a.png" align="right" width="500">
|
||||
<img src="/assets/emu1802a.png" align="right" width="500">
|
||||
<p>The 1802 emulator provides a fully functional RCA1802
|
||||
micro-controller device complete with interupt handling and DMA
|
||||
controls for memory access. Experiment with code structures and build
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<table width="100% cellpadding="5" cellspacing="0">
|
||||
<tr>
|
||||
<td class="featured">
|
||||
<p><img src="images/organ1.png" align="right"></p>
|
||||
<p><img src="/assets/organ1.png" align="right"></p>
|
||||
<p>
|
||||
<whiledir dir="/var/www/barant/musiclink" name="filename">
|
||||
<if expr="substring('$[filename]',1,1) != '.'">
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
</if>
|
||||
<div class="sectionframe"><if value1="#[title]" value2="" type="ne">
|
||||
<div class="$[sectionframeheading]"><b>#[title]</b>
|
||||
<if value1="#[edit]" value2="true" type="eq"><img src="images/edit.png" width="16"></if></div></if>
|
||||
<if value1="#[edit]" value2="true" type="eq"><img src="/assets/edit.png" width="16"></if></div></if>
|
||||
<div class="sectionframecontents"><container></div></div>
|
||||
</tag>
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<title>BARANTMAIL OPEN SOURCE PROJECT</title>
|
||||
<contents>
|
||||
<sectionframe title="BARANTMAIL OPEN SOURCE PROJECT">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<heading>
|
||||
<title>BARANT Systems</title>
|
||||
</heading>
|
||||
|
||||
@@ -1,79 +1,121 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<title>SHOPPING CART</title>
|
||||
<contents>
|
||||
<retain name="sku">
|
||||
<set name="tranonce" expr="unix_timestamp()">
|
||||
<setenv name="tranonce">$[tranonce]</setenv>
|
||||
<sectionframe title="SHOPPING CART">
|
||||
<input type="hidden" name="sku" value="">
|
||||
<input type="hidden" name="qty" value="">
|
||||
<script>
|
||||
function update(input) {
|
||||
PROCESS.value="updatecartqty";
|
||||
submit();
|
||||
function cartQtyChange(sku, qty) {
|
||||
if (qty === '' || isNaN(qty)) return;
|
||||
document.forms[0].PROCESS.value = 'updatecartqty';
|
||||
document.forms[0].PAGE.value = 'cart';
|
||||
document.forms[0].sku.value = sku;
|
||||
document.forms[0].qty.value = qty;
|
||||
document.forms[0].requestSubmit();
|
||||
}
|
||||
</script>
|
||||
|
||||
<set name="hasrecurring" value="false">
|
||||
<set name="hasfiles" value="false">
|
||||
|
||||
<showtable>
|
||||
select product_list.sku as SKU,
|
||||
description as Description,
|
||||
quantity as Qty,
|
||||
price as Price
|
||||
from product_list
|
||||
join cart_item on product_list.sku=cart_item.sku
|
||||
where cart_item.session_uuid='$[_session_id]'
|
||||
</showtable>
|
||||
<br>
|
||||
|
||||
<comment>//these need to be incorporated into a query.
|
||||
<if value1="$[.type]" value2="subscription" type="eq">
|
||||
<set name="hasrecurring" value="true">
|
||||
</if>
|
||||
<if value1="$[.type]" value2="file" type="eq">
|
||||
<set name="hasfiles" value="true">
|
||||
</if>
|
||||
</comment>
|
||||
|
||||
<showtable>
|
||||
<sql>
|
||||
select count(*) as number_of_items,
|
||||
sum(price * quantity) as total
|
||||
from product_list
|
||||
join cart_item on product_list.sku=cart_item.sku
|
||||
where cart_item.session_uuid='$[_session_id]'
|
||||
</showtable>
|
||||
</sql>
|
||||
$[sqlerror]
|
||||
<ifrow>
|
||||
<set name="cart_count" value="$[.number_of_items]">
|
||||
<set name="cart_total" value="$[.total]">
|
||||
</ifrow>
|
||||
|
||||
<sectionframe title="Shopping Cart">
|
||||
|
||||
<if expr="$[cart_count] > 0">
|
||||
|
||||
<sql>
|
||||
select if(find_in_set('physical', group_concat(distinct type)),'true','false') as physical,
|
||||
if(find_in_set('file', group_concat(distinct type)),'true','false') as file,
|
||||
if(find_in_set('subscription', group_concat(distinct type)),'true','false') as subscription
|
||||
select if(find_in_set('SUBSCRIPTION', group_concat(distinct type)),'true','false') as subscription,
|
||||
if(find_in_set('FILE', group_concat(distinct type)),'true','false') as file
|
||||
from product_list
|
||||
join cart_item on product_list.sku=cart_item.sku
|
||||
where cart_item.session_uuid='$[_session_id]'
|
||||
</sql>
|
||||
$[sqlerror]
|
||||
<ifrow>
|
||||
<set name="cart_has_subscription" value="$[.subscription]">
|
||||
<set name="cart_has_file" value="$[.file]">
|
||||
</ifrow>
|
||||
|
||||
<if value1="$[.subscription]" value2="true" type="eq">
|
||||
<div style="border: 1pt solid black; width: 400px; padding: 5px;">Please note that you have recurring charge items. On the terms of
|
||||
the recurrence (monthly or annually) you will not be charged
|
||||
automatically but you will be notified via e-mail that your service is
|
||||
about to expire. It is your responsibility to renew the services.</div>
|
||||
<if value1="$[cart_has_subscription]" value2="true" type="eq">
|
||||
<div class="cart-notice">Some items in your cart are recurring subscriptions. You will not be
|
||||
charged automatically - you'll be notified by e-mail before each renewal, and it's your
|
||||
responsibility to renew.</div>
|
||||
</if>
|
||||
|
||||
<if value1="$[.file]" value2="true" type="eq">
|
||||
<div style="margin-top: 3px; width: 400px; border: 1pt solid black; padding: 5px;">Please note that
|
||||
you have purchased items that must be downloaded from your account
|
||||
page after you checkout.</div>
|
||||
<if value1="$[cart_has_file]" value2="true" type="eq">
|
||||
<div class="cart-notice">Some items in your cart are downloadable files - available from your
|
||||
account page after checkout.</div>
|
||||
</if>
|
||||
|
||||
<div class="cart-wrap">
|
||||
<div class="cart-header">
|
||||
<div class="cart-col-desc">Item</div>
|
||||
<div class="cart-col-price">Price</div>
|
||||
<div class="cart-col-qty">Qty</div>
|
||||
<div class="cart-col-total">Total</div>
|
||||
<div class="cart-col-remove"></div>
|
||||
</div>
|
||||
<div class="cart-items">
|
||||
<sql>select product_list.sku as SKU,
|
||||
description as Description,
|
||||
quantity as Qty,
|
||||
price as Price
|
||||
from product_list
|
||||
join cart_item on product_list.sku=cart_item.sku
|
||||
where cart_item.session_uuid='$[_session_id]'
|
||||
order by description</sql>
|
||||
$[sqlerror]
|
||||
<whilerow>
|
||||
<set name="linetotal" expr="$[.Price] * $[.Qty]">
|
||||
<div class="cart-row">
|
||||
<div class="cart-col-desc">$[.Description]</div>
|
||||
<div class="cart-col-price">$$[.Price]</div>
|
||||
<div class="cart-col-qty">
|
||||
<input type="number" class="cart-qty-input" min="0" value="$[.Qty]"
|
||||
onchange="cartQtyChange('$[.SKU]', this.value); return true;">
|
||||
</div>
|
||||
<div class="cart-col-total">$$[linetotal]</div>
|
||||
<div class="cart-col-remove">
|
||||
<a href="#" class="cart-remove-link" onclick="
|
||||
document.forms[0].PROCESS.value='removecartitem';
|
||||
document.forms[0].PAGE.value='cart';
|
||||
document.forms[0].sku.value='$[.SKU]';
|
||||
document.forms[0].requestSubmit();
|
||||
return false;">Remove</a>
|
||||
</div>
|
||||
</div>
|
||||
</whilerow>
|
||||
</div>
|
||||
<div class="cart-summary">
|
||||
<div class="cart-summary-row">
|
||||
<span>$[cart_count] item<if expr="$[cart_count] != 1">s</if></span>
|
||||
<span class="cart-summary-total">$$[cart_total]</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="text-align: center; width: 100%; margin-top: 10px;">
|
||||
<linkbutton page="checkout" class="button">Check Out</linkbutton>
|
||||
</div>
|
||||
|
||||
<else>
|
||||
<div class="cart-empty">
|
||||
<div class="cart-empty-icon">🛒</div>
|
||||
<div class="cart-empty-title">Your cart is empty</div>
|
||||
<div class="cart-empty-text">Items you add will show up here.</div>
|
||||
</div>
|
||||
</if>
|
||||
|
||||
<br>
|
||||
<div style="text-align: center; width: 100%">
|
||||
<linkbutton page="checkout" class="button">Check
|
||||
Out</linkbutton></div>
|
||||
<div style="clear:both;"></div>
|
||||
|
||||
<br>
|
||||
|
||||
</sectionframe>
|
||||
|
||||
</contents>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<contents>
|
||||
|
||||
<sectionframe title="Change Project Icon">
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<page template="mainpagetemplate" loggedin="yes">
|
||||
<page loggedin="yes">
|
||||
<title>SHOPPING CART - CHECKOUT</title>
|
||||
<script src="https://web.squarecdn.com/v1/square.js"></script>
|
||||
<contents>
|
||||
<script src="https://web.squarecdn.com/v1/square.js"></script>
|
||||
<script>
|
||||
function processCardForm(token) {
|
||||
xhr = new XMLHttpRequest();
|
||||
@@ -11,9 +11,13 @@
|
||||
console.log(">" + this.responseText + "<");
|
||||
if(this.responseText == "OK\n") {
|
||||
document.forms[0].PAGE.value = 'thankyou';
|
||||
document.forms[0].submit();
|
||||
document.forms[0].requestSubmit();
|
||||
} else {
|
||||
message.innerText = this.responseText;
|
||||
var payBtn = document.getElementById('pay');
|
||||
payBtn.disabled = false;
|
||||
var processbanner = document.getElementById('process');
|
||||
processbanner.style.visibility = 'hidden';
|
||||
message.innerText = this.responseText;
|
||||
}
|
||||
};
|
||||
let data = 'id=$[_session_id]&token=' + token + '&tranonce=$[tranonce]';
|
||||
@@ -24,37 +28,94 @@
|
||||
let payments = Square.payments('sq0idp-V4R4vEferpF9kr7d5x5abQ','LV0MRENX5ED3Z');
|
||||
const card = await payments.card({
|
||||
style: {
|
||||
'.input-container.is-focus': { borderColor: '#006AFF' },
|
||||
'.message-text.is-error': { color: '#BF0020' }
|
||||
input: {
|
||||
backgroundColor: '#1c1c24',
|
||||
color: '#e7e4dc',
|
||||
fontSize: '14px'
|
||||
},
|
||||
'input::placeholder': { color: '#8d8c92' },
|
||||
'.input-container': { borderColor: 'rgba(197, 164, 90, 0.28)' },
|
||||
'.input-container.is-focus': { borderColor: '#c5a45a' },
|
||||
'.input-container.is-error': { borderColor: '#a13a3a' },
|
||||
'.message-text': { color: '#8d8c92' },
|
||||
'.message-text.is-error': { color: '#a13a3a' }
|
||||
}
|
||||
});
|
||||
await card.attach('#card');
|
||||
let button = document.getElementById('pay');
|
||||
button.addEventListener('click', async () => {
|
||||
message.innerText = '';
|
||||
let result = await card.tokenize();
|
||||
if (result.status === 'OK') {
|
||||
button.disabled = true;
|
||||
let processbanner = document.getElementById('process');
|
||||
processbanner.style.visibility = 'visible';
|
||||
processCardForm(result.token);
|
||||
} else {
|
||||
let errorMessage = 'Please check your card details and try again.';
|
||||
if (result.errors && result.errors.length && result.errors[0].message)
|
||||
errorMessage = result.errors[0].message;
|
||||
message.innerText = errorMessage;
|
||||
}
|
||||
});
|
||||
}
|
||||
buildForm();
|
||||
</script>
|
||||
<sql>select count(*) as number_of_items,
|
||||
sum(price * quantity) as total
|
||||
from product_list
|
||||
join cart_item on product_list.sku=cart_item.sku
|
||||
where cart_item.session_uuid='$[_session_id]'
|
||||
</sql>
|
||||
<sectionframe title="Pay with Credit Card">
|
||||
<div>Please enter your payment information:</div>
|
||||
<div style="font-size: 20px;">$[total]</div>
|
||||
<div id="card" style="background-color: #ddd;width: 300px; padding: 5px;"></div>
|
||||
<div style="padding: 5px;"><button id= "pay" type="button">Pay</button></div>
|
||||
<div id="process" style="background-color: #0f0; border: 2px solid #000; padding:
|
||||
5px; display: block-inline; margin: 10px; visibility: hidden;"> Processing Payment - Please wait... </div>
|
||||
<div id="message" style="color: #f00; margin-top: 20px;"></div>
|
||||
|
||||
<sql>select sum(price * quantity) as total
|
||||
from product_list
|
||||
join cart_item on product_list.sku=cart_item.sku
|
||||
where cart_item.session_uuid='$[_session_id]'</sql>
|
||||
$[sqlerror]
|
||||
<ifrow>
|
||||
<set name="checkout_total" value="$[.total]">
|
||||
</ifrow>
|
||||
|
||||
<sectionframe title="Order Summary">
|
||||
<sql>select product_list.sku as SKU,
|
||||
description as Description,
|
||||
quantity as Qty,
|
||||
price as Price
|
||||
from product_list
|
||||
join cart_item on product_list.sku=cart_item.sku
|
||||
where cart_item.session_uuid='$[_session_id]'
|
||||
order by description</sql>
|
||||
$[sqlerror]
|
||||
<div class="cart-wrap">
|
||||
<div class="checkout-header">
|
||||
<div class="cart-col-desc">Item</div>
|
||||
<div class="cart-col-price">Price</div>
|
||||
<div class="checkout-col-qty">Qty</div>
|
||||
<div class="cart-col-total">Total</div>
|
||||
</div>
|
||||
<div class="cart-items">
|
||||
<whilerow>
|
||||
<set name="linetotal" expr="$[.Price] * $[.Qty]">
|
||||
<div class="checkout-row">
|
||||
<div class="cart-col-desc">$[.Description]</div>
|
||||
<div class="cart-col-price">$$[.Price]</div>
|
||||
<div class="checkout-col-qty">$[.Qty]</div>
|
||||
<div class="cart-col-total">$$[linetotal]</div>
|
||||
</div>
|
||||
</whilerow>
|
||||
</div>
|
||||
<div class="cart-summary">
|
||||
<div class="cart-summary-row">
|
||||
<span>Total Due</span>
|
||||
<span class="cart-summary-total">$$[checkout_total]</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</sectionframe>
|
||||
|
||||
<sectionframe title="Payment">
|
||||
<div class="checkout-pay-wrap">
|
||||
<div class="checkout-pay-label">Card Details</div>
|
||||
<div id="card" class="checkout-card-input"></div>
|
||||
<button id="pay" type="button" class="button checkout-pay-btn">Pay $$[checkout_total]</button>
|
||||
<div id="process" class="checkout-processing">Processing Payment — Please wait…</div>
|
||||
<div id="message" class="checkout-error"></div>
|
||||
</div>
|
||||
</sectionframe>
|
||||
</contents>
|
||||
</page>
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<title>Support E-Mail</title>
|
||||
<contents>
|
||||
<sectionframe title="Contact">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<contents>
|
||||
|
||||
<sectionframe title="Create Project">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<contents>
|
||||
|
||||
<sectionframe title="Create Release Target">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<contents>
|
||||
<projectheader />
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<contents>
|
||||
|
||||
<sectionframe title="Create Task">
|
||||
|
||||
@@ -17,6 +17,6 @@ alt="Buy now with PayPal" /></td>
|
||||
<messages>
|
||||
|
||||
<div id="processing" style="position: absolute; background: white; visibility: hidden; top:280px; left: 400px; display: inline-block; padding: 0px 10px 0px 10px; border: 1pt solid black; border-radius: 5px;">
|
||||
<img class="rotate" src="/images/spinning.png" width="50" align="center">
|
||||
<img class="rotate" src="/assets/spinning.png" width="50" align="center">
|
||||
<span style="padding: 0px 0px 0px 10px; font-size: 16px"> PROCESSING...</span>
|
||||
</div>
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<title>CRYSTAL</title>
|
||||
<contents>
|
||||
<setenv name="_menubar"></setenv>
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<heading>
|
||||
<title>barant.com - David Eugene Arant</title>
|
||||
</heading>
|
||||
<contents>
|
||||
<img src="images/arant2.jpg" align="left">
|
||||
<img src="/assets/arant2.jpg" align="left">
|
||||
<h1>David Eugene Arant</h1>
|
||||
<p>David Eugene Arant was born in South Gate California on April 17th, 1935
|
||||
to parents May L. Arant and Francis M. Arant.</p>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<title>Document Management</title>
|
||||
<style>
|
||||
.price {display: table-cell;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate" secure="yes" loggedin="yes" admin="true">
|
||||
<page secure="yes" loggedin="yes" admin="true">
|
||||
<title>ADMIN INVOICES</title>
|
||||
<contents>
|
||||
<database host="$[host]" name="$[database]" user="$[user]" password="$[password]" sessionid="1">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<contents>
|
||||
|
||||
$[_project_header]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<menu>
|
||||
<include file="projects.menu">
|
||||
<include file="sessionvar.menu">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<title>Support E-Mail</title>
|
||||
<contents>
|
||||
<sectionframe title="Contact">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<title>HOSTING</title>
|
||||
<contents>
|
||||
<retain name="sku">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<title>Barant Systems</title>
|
||||
<contents>
|
||||
<include file="barantstream.section">
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
where i.id=$[_invoice_id]</sql>
|
||||
<set name="amount" value="$[.amount]">
|
||||
<div style="width: 500px; border: 1pt solid #000; padding: 3px; background: #fff;">
|
||||
<div><div style="display: inline-block;"><img style="width: 300px;" src="images/invoice_logo.png"></div>
|
||||
<div><div style="display: inline-block;"><img style="width: 300px;" src="/assets/invoice_logo.png"></div>
|
||||
<div style="display: flex; float: right; align-items: center;">
|
||||
Invoice: $[.invnumber] $[.status]
|
||||
</div>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
where i.id=30</sql>
|
||||
<set name="amount" value="$[.amount]">
|
||||
<div style="width: 500px; border: 1pt solid #000; padding: 3px;">
|
||||
<div><div style="display: inline-block;"><img style="width: 50px;" src="images/btglogo.png"></div>
|
||||
<div><div style="display: inline-block;"><img style="width: 50px;" src="/assets/btglogo.png"></div>
|
||||
<div style="display: inline-block;">
|
||||
<div>BARANT TECHNLOGY GROUP</div>
|
||||
<div>INVOICE</div>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<page template="mainpagetemplate">
|
||||
<page>
|
||||
<title>barant.com - JET Extension Tags</title>
|
||||
<contents>
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<sectionframe title="JET Command Reference">
|
||||
|
||||
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> CALL</h2>
|
||||
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> CALL</h2>
|
||||
<hr>
|
||||
<p>Use the CALL tag to transfer control to an executable file on the
|
||||
host system. Use a fully qualified name for the executable file.</p>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<sectionframe title="JET Command Reference">
|
||||
|
||||
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> COMMENT</h2>
|
||||
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> COMMENT</h2>
|
||||
<hr>
|
||||
<p>Use the COMMENT tag to prevent JET from recognizing and forwarding
|
||||
the contents to the output. This is not the same as an HTML command
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<sectionframe title="JET Command Reference">
|
||||
|
||||
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> CONTAINER</h2>
|
||||
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> CONTAINER</h2>
|
||||
<hr>
|
||||
<p>Use the CONTAINER tag inside a TAG set to insert the contents of
|
||||
the define macro tag into the output stream. </p>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<sectionframe title="JET Command Reference">
|
||||
|
||||
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> DATABASE</h2>
|
||||
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> DATABASE</h2>
|
||||
<hr>
|
||||
<p>Use the DATABASE tag to gain access to the mySQL database specified in the tag arguments.
|
||||
Access to the database is only available inside the container of this tag.</p>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<sectionframe title="JET Command Reference">
|
||||
|
||||
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> CALL</h2>
|
||||
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> CALL</h2>
|
||||
<hr>
|
||||
<p>Use the CALL tag to transfer control to an executable file on the
|
||||
host system. Use a fully qualified name for the executable file.</p>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<sectionframe title="JET Command Reference">
|
||||
|
||||
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> CALL</h2>
|
||||
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> CALL</h2>
|
||||
<hr>
|
||||
<p>Use the CALL tag to transfer control to an executable file on the
|
||||
host system. Use a fully qualified name for the executable file.</p>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<sectionframe title="JET Command Reference">
|
||||
|
||||
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> CALL</h2>
|
||||
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> CALL</h2>
|
||||
<hr>
|
||||
<p>Use the CALL tag to transfer control to an executable file on the
|
||||
host system. Use a fully qualified name for the executable file.</p>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<sectionframe title="JET Command Reference">
|
||||
|
||||
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> CALL</h2>
|
||||
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> CALL</h2>
|
||||
<hr>
|
||||
<p>Use the CALL tag to transfer control to an executable file on the
|
||||
host system. Use a fully qualified name for the executable file.</p>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<sectionframe title="JET Command Reference">
|
||||
|
||||
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> CALL</h2>
|
||||
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> CALL</h2>
|
||||
<hr>
|
||||
<p>Use the CALL tag to transfer control to an executable file on the
|
||||
host system. Use a fully qualified name for the executable file.</p>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<sectionframe title="JET Command Reference">
|
||||
|
||||
<h2><a href="/jet/contents"><img src="/images/back.png" width="15"></a> CALL</h2>
|
||||
<h2><a href="/jet/contents"><img src="/assets/back.png" width="15"></a> CALL</h2>
|
||||
<hr>
|
||||
<p>Use the CALL tag to transfer control to an executable file on the
|
||||
host system. Use a fully qualified name for the executable file.</p>
|
||||
|
||||