sip.js
Version:
A SIP library for JavaScript
1,085 lines (1,084 loc) • 71.9 kB
JavaScript
import { NameAddrHeader } from "../../name-addr-header.js";
import { URI } from "../../uri.js";
function peg$padEnd(str, targetLength, padString) {
padString = padString || ' ';
if (str.length > targetLength) {
return str;
}
targetLength -= str.length;
padString += padString.repeat(targetLength);
return str + padString.slice(0, targetLength);
}
export class SyntaxError extends Error {
constructor(message, expected, found, location) {
super();
this.message = message;
this.expected = expected;
this.found = found;
this.location = location;
this.name = "SyntaxError";
if (typeof Object.setPrototypeOf === "function") {
Object.setPrototypeOf(this, SyntaxError.prototype);
}
else {
this.__proto__ = SyntaxError.prototype;
}
if (typeof Error.captureStackTrace === "function") {
Error.captureStackTrace(this, SyntaxError);
}
}
static buildMessage(expected, found) {
function hex(ch) {
return ch.charCodeAt(0).toString(16).toUpperCase();
}
function literalEscape(s) {
return s
.replace(/\\/g, "\\\\")
.replace(/"/g, "\\\"")
.replace(/\0/g, "\\0")
.replace(/\t/g, "\\t")
.replace(/\n/g, "\\n")
.replace(/\r/g, "\\r")
.replace(/[\x00-\x0F]/g, (ch) => "\\x0" + hex(ch))
.replace(/[\x10-\x1F\x7F-\x9F]/g, (ch) => "\\x" + hex(ch));
}
function classEscape(s) {
return s
.replace(/\\/g, "\\\\")
.replace(/\]/g, "\\]")
.replace(/\^/g, "\\^")
.replace(/-/g, "\\-")
.replace(/\0/g, "\\0")
.replace(/\t/g, "\\t")
.replace(/\n/g, "\\n")
.replace(/\r/g, "\\r")
.replace(/[\x00-\x0F]/g, (ch) => "\\x0" + hex(ch))
.replace(/[\x10-\x1F\x7F-\x9F]/g, (ch) => "\\x" + hex(ch));
}
function describeExpectation(expectation) {
switch (expectation.type) {
case "literal":
return "\"" + literalEscape(expectation.text) + "\"";
case "class":
const escapedParts = expectation.parts.map((part) => {
return Array.isArray(part)
? classEscape(part[0]) + "-" + classEscape(part[1])
: classEscape(part);
});
return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]";
case "any":
return "any character";
case "end":
return "end of input";
case "other":
return expectation.description;
}
}
function describeExpected(expected1) {
const descriptions = expected1.map(describeExpectation);
let i;
let j;
descriptions.sort();
if (descriptions.length > 0) {
for (i = 1, j = 1; i < descriptions.length; i++) {
if (descriptions[i - 1] !== descriptions[i]) {
descriptions[j] = descriptions[i];
j++;
}
}
descriptions.length = j;
}
switch (descriptions.length) {
case 1:
return descriptions[0];
case 2:
return descriptions[0] + " or " + descriptions[1];
default:
return descriptions.slice(0, -1).join(", ")
+ ", or "
+ descriptions[descriptions.length - 1];
}
}
function describeFound(found1) {
return found1 ? "\"" + literalEscape(found1) + "\"" : "end of input";
}
return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
}
format(sources) {
let str = 'Error: ' + this.message;
if (this.location) {
let src = null;
let k;
for (k = 0; k < sources.length; k++) {
if (sources[k].source === this.location.source) {
src = sources[k].text.split(/\r\n|\n|\r/g);
break;
}
}
let s = this.location.start;
let loc = this.location.source + ':' + s.line + ':' + s.column;
if (src) {
let e = this.location.end;
let filler = peg$padEnd('', s.line.toString().length, ' ');
let line = src[s.line - 1];
let last = s.line === e.line ? e.column : line.length + 1;
str += '\n --> ' + loc + '\n' + filler + ' |\n' + s.line + ' | ' + line + '\n' + filler + ' | ' +
peg$padEnd('', s.column - 1, ' ') +
peg$padEnd('', last - s.column, '^');
}
else {
str += '\n at ' + loc;
}
}
return str;
}
}
function peg$parse(input, options) {
options = options !== undefined ? options : {};
const peg$FAILED = {};
const peg$source = options.grammarSource;
const peg$startRuleIndices = { Contact: 119, Name_Addr_Header: 156, Record_Route: 176, Request_Response: 81, SIP_URI: 45, Subscription_State: 186, Supported: 191, Require: 182, Via: 194, absoluteURI: 84, Call_ID: 118, Content_Disposition: 130, Content_Length: 135, Content_Type: 136, CSeq: 146, displayName: 122, Event: 149, From: 151, host: 52, Max_Forwards: 154, Min_SE: 213, Proxy_Authenticate: 157, quoted_string: 40, Refer_To: 178, Replaces: 179, Session_Expires: 210, stun_URI: 217, To: 192, turn_URI: 223, uuid: 226, WWW_Authenticate: 209, challenge: 158, sipfrag: 230, Referred_By: 231 };
let peg$startRuleIndex = 119;
const peg$consts = [
"\r\n",
peg$literalExpectation("\r\n", false),
/^[0-9]/,
peg$classExpectation([["0", "9"]], false, false),
/^[a-zA-Z]/,
peg$classExpectation([["a", "z"], ["A", "Z"]], false, false),
/^[0-9a-fA-F]/,
peg$classExpectation([["0", "9"], ["a", "f"], ["A", "F"]], false, false),
/^[\0-\xFF]/,
peg$classExpectation([["\0", "\xFF"]], false, false),
/^["]/,
peg$classExpectation(["\""], false, false),
" ",
peg$literalExpectation(" ", false),
"\t",
peg$literalExpectation("\t", false),
/^[a-zA-Z0-9]/,
peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false),
";",
peg$literalExpectation(";", false),
"/",
peg$literalExpectation("/", false),
"?",
peg$literalExpectation("?", false),
":",
peg$literalExpectation(":", false),
"@",
peg$literalExpectation("@", false),
"&",
peg$literalExpectation("&", false),
"=",
peg$literalExpectation("=", false),
"+",
peg$literalExpectation("+", false),
"$",
peg$literalExpectation("$", false),
",",
peg$literalExpectation(",", false),
"-",
peg$literalExpectation("-", false),
"_",
peg$literalExpectation("_", false),
".",
peg$literalExpectation(".", false),
"!",
peg$literalExpectation("!", false),
"~",
peg$literalExpectation("~", false),
"*",
peg$literalExpectation("*", false),
"'",
peg$literalExpectation("'", false),
"(",
peg$literalExpectation("(", false),
")",
peg$literalExpectation(")", false),
"%",
peg$literalExpectation("%", false),
function () { return " "; },
function () { return ':'; },
/^[!-~]/,
peg$classExpectation([["!", "~"]], false, false),
/^[\x80-\uFFFF]/,
peg$classExpectation([["\x80", "\uFFFF"]], false, false),
/^[\x80-\xBF]/,
peg$classExpectation([["\x80", "\xBF"]], false, false),
/^[a-f]/,
peg$classExpectation([["a", "f"]], false, false),
"`",
peg$literalExpectation("`", false),
"<",
peg$literalExpectation("<", false),
">",
peg$literalExpectation(">", false),
"\\",
peg$literalExpectation("\\", false),
"[",
peg$literalExpectation("[", false),
"]",
peg$literalExpectation("]", false),
"{",
peg$literalExpectation("{", false),
"}",
peg$literalExpectation("}", false),
function () { return "*"; },
function () { return "/"; },
function () { return "="; },
function () { return "("; },
function () { return ")"; },
function () { return ">"; },
function () { return "<"; },
function () { return ","; },
function () { return ";"; },
function () { return ":"; },
function () { return "\""; },
/^[!-']/,
peg$classExpectation([["!", "'"]], false, false),
/^[*-[]/,
peg$classExpectation([["*", "["]], false, false),
/^[\]-~]/,
peg$classExpectation([["]", "~"]], false, false),
function (contents) {
return contents;
},
/^[#-[]/,
peg$classExpectation([["#", "["]], false, false),
/^[\0-\t]/,
peg$classExpectation([["\0", "\t"]], false, false),
/^[\v-\f]/,
peg$classExpectation([["\v", "\f"]], false, false),
/^[\x0E-\x7F]/,
peg$classExpectation([["\x0E", "\x7F"]], false, false),
function () {
options = options || { data: {} };
options.data.uri = new URI(options.data.scheme, options.data.user, options.data.host, options.data.port);
delete options.data.scheme;
delete options.data.user;
delete options.data.host;
delete options.data.host_type;
delete options.data.port;
},
function () {
options = options || { data: {} };
options.data.uri = new URI(options.data.scheme, options.data.user, options.data.host, options.data.port, options.data.uri_params, options.data.uri_headers);
delete options.data.scheme;
delete options.data.user;
delete options.data.host;
delete options.data.host_type;
delete options.data.port;
delete options.data.uri_params;
if (options.startRule === 'SIP_URI') {
options.data = options.data.uri;
}
},
"sips",
peg$literalExpectation("sips", true),
"sip",
peg$literalExpectation("sip", true),
function (uri_scheme) {
options = options || { data: {} };
options.data.scheme = uri_scheme;
},
function () {
options = options || { data: {} };
options.data.user = decodeURIComponent(text().slice(0, -1));
},
function () {
options = options || { data: {} };
options.data.password = text();
},
function () {
options = options || { data: {} };
options.data.host = text();
return options.data.host;
},
function () {
options = options || { data: {} };
options.data.host_type = 'domain';
return text();
},
/^[a-zA-Z0-9_\-]/,
peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"], "_", "-"], false, false),
/^[a-zA-Z0-9\-]/,
peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"], "-"], false, false),
function () {
options = options || { data: {} };
options.data.host_type = 'IPv6';
return text();
},
"::",
peg$literalExpectation("::", false),
function () {
options = options || { data: {} };
options.data.host_type = 'IPv6';
return text();
},
function () {
options = options || { data: {} };
options.data.host_type = 'IPv4';
return text();
},
"25",
peg$literalExpectation("25", false),
/^[0-5]/,
peg$classExpectation([["0", "5"]], false, false),
"2",
peg$literalExpectation("2", false),
/^[0-4]/,
peg$classExpectation([["0", "4"]], false, false),
"1",
peg$literalExpectation("1", false),
/^[1-9]/,
peg$classExpectation([["1", "9"]], false, false),
function (port) {
options = options || { data: {} };
port = parseInt(port.join(''));
options.data.port = port;
return port;
},
"transport=",
peg$literalExpectation("transport=", true),
"udp",
peg$literalExpectation("udp", true),
"tcp",
peg$literalExpectation("tcp", true),
"sctp",
peg$literalExpectation("sctp", true),
"tls",
peg$literalExpectation("tls", true),
function (transport) {
options = options || { data: {} };
if (!options.data.uri_params)
options.data.uri_params = {};
options.data.uri_params['transport'] = transport.toLowerCase();
},
"user=",
peg$literalExpectation("user=", true),
"phone",
peg$literalExpectation("phone", true),
"ip",
peg$literalExpectation("ip", true),
function (user) {
options = options || { data: {} };
if (!options.data.uri_params)
options.data.uri_params = {};
options.data.uri_params['user'] = user.toLowerCase();
},
"method=",
peg$literalExpectation("method=", true),
function (method) {
options = options || { data: {} };
if (!options.data.uri_params)
options.data.uri_params = {};
options.data.uri_params['method'] = method;
},
"ttl=",
peg$literalExpectation("ttl=", true),
function (ttl) {
options = options || { data: {} };
if (!options.data.params)
options.data.params = {};
options.data.params['ttl'] = ttl;
},
"maddr=",
peg$literalExpectation("maddr=", true),
function (maddr) {
options = options || { data: {} };
if (!options.data.uri_params)
options.data.uri_params = {};
options.data.uri_params['maddr'] = maddr;
},
"lr",
peg$literalExpectation("lr", true),
function () {
options = options || { data: {} };
if (!options.data.uri_params)
options.data.uri_params = {};
options.data.uri_params['lr'] = undefined;
},
function (param, value) {
options = options || { data: {} };
if (!options.data.uri_params)
options.data.uri_params = {};
if (value === null) {
value = undefined;
}
else {
value = value[1];
}
options.data.uri_params[param.toLowerCase()] = value;
},
function (hname, hvalue) {
hname = hname.join('').toLowerCase();
hvalue = hvalue.join('');
options = options || { data: {} };
if (!options.data.uri_headers)
options.data.uri_headers = {};
if (!options.data.uri_headers[hname]) {
options.data.uri_headers[hname] = [hvalue];
}
else {
options.data.uri_headers[hname].push(hvalue);
}
},
function () {
options = options || { data: {} };
// lots of tests fail if this isn't guarded...
if (options.startRule === 'Refer_To') {
options.data.uri = new URI(options.data.scheme, options.data.user, options.data.host, options.data.port, options.data.uri_params, options.data.uri_headers);
delete options.data.scheme;
delete options.data.user;
delete options.data.host;
delete options.data.host_type;
delete options.data.port;
delete options.data.uri_params;
}
},
"//",
peg$literalExpectation("//", false),
function () {
options = options || { data: {} };
options.data.scheme = text();
},
peg$literalExpectation("SIP", true),
function () {
options = options || { data: {} };
options.data.sip_version = text();
},
"INVITE",
peg$literalExpectation("INVITE", false),
"ACK",
peg$literalExpectation("ACK", false),
"VXACH",
peg$literalExpectation("VXACH", false),
"OPTIONS",
peg$literalExpectation("OPTIONS", false),
"BYE",
peg$literalExpectation("BYE", false),
"CANCEL",
peg$literalExpectation("CANCEL", false),
"REGISTER",
peg$literalExpectation("REGISTER", false),
"SUBSCRIBE",
peg$literalExpectation("SUBSCRIBE", false),
"NOTIFY",
peg$literalExpectation("NOTIFY", false),
"REFER",
peg$literalExpectation("REFER", false),
"PUBLISH",
peg$literalExpectation("PUBLISH", false),
function () {
options = options || { data: {} };
options.data.method = text();
return options.data.method;
},
function (status_code) {
options = options || { data: {} };
options.data.status_code = parseInt(status_code.join(''));
},
function () {
options = options || { data: {} };
options.data.reason_phrase = text();
},
function () {
options = options || { data: {} };
options.data = text();
},
function () {
var idx, length;
options = options || { data: {} };
length = options.data.multi_header.length;
for (idx = 0; idx < length; idx++) {
if (options.data.multi_header[idx].parsed === null) {
options.data = null;
break;
}
}
if (options.data !== null) {
options.data = options.data.multi_header;
}
else {
options.data = -1;
}
},
function () {
var header;
options = options || { data: {} };
if (!options.data.multi_header)
options.data.multi_header = [];
try {
header = new NameAddrHeader(options.data.uri, options.data.displayName, options.data.params);
delete options.data.uri;
delete options.data.displayName;
delete options.data.params;
}
catch (e) {
header = null;
}
options.data.multi_header.push({ 'position': peg$currPos,
'offset': location().start.offset,
'parsed': header
});
},
function (displayName) {
displayName = text().trim();
if (displayName[0] === '\"') {
displayName = displayName.substring(1, displayName.length - 1);
}
options = options || { data: {} };
options.data.displayName = displayName;
},
"q",
peg$literalExpectation("q", true),
function (q) {
options = options || { data: {} };
if (!options.data.params)
options.data.params = {};
options.data.params['q'] = q;
},
"expires",
peg$literalExpectation("expires", true),
function (expires) {
options = options || { data: {} };
if (!options.data.params)
options.data.params = {};
options.data.params['expires'] = expires;
},
function (delta_seconds) {
return parseInt(delta_seconds.join(''));
},
"0",
peg$literalExpectation("0", false),
function () {
return parseFloat(text());
},
function (param, value) {
options = options || { data: {} };
if (!options.data.params)
options.data.params = {};
if (value === null) {
value = undefined;
}
else {
value = value[1];
}
options.data.params[param.toLowerCase()] = value;
},
"render",
peg$literalExpectation("render", true),
"session",
peg$literalExpectation("session", true),
"icon",
peg$literalExpectation("icon", true),
"alert",
peg$literalExpectation("alert", true),
function () {
options = options || { data: {} };
if (options.startRule === 'Content_Disposition') {
options.data.type = text().toLowerCase();
}
},
"handling",
peg$literalExpectation("handling", true),
"optional",
peg$literalExpectation("optional", true),
"required",
peg$literalExpectation("required", true),
function (length) {
options = options || { data: {} };
options.data = parseInt(length.join(''));
},
function () {
options = options || { data: {} };
options.data = text();
},
"text",
peg$literalExpectation("text", true),
"image",
peg$literalExpectation("image", true),
"audio",
peg$literalExpectation("audio", true),
"video",
peg$literalExpectation("video", true),
"application",
peg$literalExpectation("application", true),
"message",
peg$literalExpectation("message", true),
"multipart",
peg$literalExpectation("multipart", true),
"x-",
peg$literalExpectation("x-", true),
function (cseq_value) {
options = options || { data: {} };
options.data.value = parseInt(cseq_value.join(''));
},
function (expires) { options = options || { data: {} }; options.data = expires; },
function (event_type) {
options = options || { data: {} };
options.data.event = event_type.toLowerCase();
},
function () {
options = options || { data: {} };
var tag = options.data.tag;
options.data = new NameAddrHeader(options.data.uri, options.data.displayName, options.data.params);
if (tag) {
options.data.setParam('tag', tag);
}
},
"tag",
peg$literalExpectation("tag", true),
function (tag) { options = options || { data: {} }; options.data.tag = tag; },
function (forwards) {
options = options || { data: {} };
options.data = parseInt(forwards.join(''));
},
function (min_expires) { options = options || { data: {} }; options.data = min_expires; },
function () {
options = options || { data: {} };
options.data = new NameAddrHeader(options.data.uri, options.data.displayName, options.data.params);
},
"digest",
peg$literalExpectation("Digest", true),
"realm",
peg$literalExpectation("realm", true),
function (realm) { options = options || { data: {} }; options.data.realm = realm; },
"domain",
peg$literalExpectation("domain", true),
"nonce",
peg$literalExpectation("nonce", true),
function (nonce) { options = options || { data: {} }; options.data.nonce = nonce; },
"opaque",
peg$literalExpectation("opaque", true),
function (opaque) { options = options || { data: {} }; options.data.opaque = opaque; },
"stale",
peg$literalExpectation("stale", true),
"true",
peg$literalExpectation("true", true),
function () { options = options || { data: {} }; options.data.stale = true; },
"false",
peg$literalExpectation("false", true),
function () { options = options || { data: {} }; options.data.stale = false; },
"algorithm",
peg$literalExpectation("algorithm", true),
"md5",
peg$literalExpectation("MD5", true),
"md5-sess",
peg$literalExpectation("MD5-sess", true),
function (algorithm) {
options = options || { data: {} };
options.data.algorithm = algorithm.toUpperCase();
},
"qop",
peg$literalExpectation("qop", true),
"auth-int",
peg$literalExpectation("auth-int", true),
"auth",
peg$literalExpectation("auth", true),
function (qop_value) {
options = options || { data: {} };
options.data.qop || (options.data.qop = []);
options.data.qop.push(qop_value.toLowerCase());
},
function (rack_value) {
options = options || { data: {} };
options.data.value = parseInt(rack_value.join(''));
},
function () {
var idx, length;
options = options || { data: {} };
length = options.data.multi_header.length;
for (idx = 0; idx < length; idx++) {
if (options.data.multi_header[idx].parsed === null) {
options.data = null;
break;
}
}
if (options.data !== null) {
options.data = options.data.multi_header;
}
else {
options.data = -1;
}
},
function () {
var header;
options = options || { data: {} };
if (!options.data.multi_header)
options.data.multi_header = [];
try {
header = new NameAddrHeader(options.data.uri, options.data.displayName, options.data.params);
delete options.data.uri;
delete options.data.displayName;
delete options.data.params;
}
catch (e) {
header = null;
}
options.data.multi_header.push({ 'position': peg$currPos,
'offset': location().start.offset,
'parsed': header
});
},
function () {
options = options || { data: {} };
options.data = new NameAddrHeader(options.data.uri, options.data.displayName, options.data.params);
},
function () {
options = options || { data: {} };
if (!(options.data.replaces_from_tag && options.data.replaces_to_tag)) {
options.data = -1;
}
},
function () {
options = options || { data: {} };
options.data = {
call_id: options.data
};
},
"from-tag",
peg$literalExpectation("from-tag", true),
function (from_tag) {
options = options || { data: {} };
options.data.replaces_from_tag = from_tag;
},
"to-tag",
peg$literalExpectation("to-tag", true),
function (to_tag) {
options = options || { data: {} };
options.data.replaces_to_tag = to_tag;
},
"early-only",
peg$literalExpectation("early-only", true),
function () {
options = options || { data: {} };
options.data.early_only = true;
},
function (head, r) { return r; },
function (head, tail) { return list(head, tail); },
function (value) {
options = options || { data: {} };
if (options.startRule === 'Require') {
options.data = value || [];
}
},
function (rseq_value) {
options = options || { data: {} };
options.data.value = parseInt(rseq_value.join(''));
},
"active",
peg$literalExpectation("active", true),
"pending",
peg$literalExpectation("pending", true),
"terminated",
peg$literalExpectation("terminated", true),
function () {
options = options || { data: {} };
options.data.state = text();
},
"reason",
peg$literalExpectation("reason", true),
function (reason) {
options = options || { data: {} };
if (typeof reason !== 'undefined')
options.data.reason = reason;
},
function (expires) {
options = options || { data: {} };
if (typeof expires !== 'undefined')
options.data.expires = expires;
},
"retry_after",
peg$literalExpectation("retry_after", true),
function (retry_after) {
options = options || { data: {} };
if (typeof retry_after !== 'undefined')
options.data.retry_after = retry_after;
},
"deactivated",
peg$literalExpectation("deactivated", true),
"probation",
peg$literalExpectation("probation", true),
"rejected",
peg$literalExpectation("rejected", true),
"timeout",
peg$literalExpectation("timeout", true),
"giveup",
peg$literalExpectation("giveup", true),
"noresource",
peg$literalExpectation("noresource", true),
"invariant",
peg$literalExpectation("invariant", true),
function (value) {
options = options || { data: {} };
if (options.startRule === 'Supported') {
options.data = value || [];
}
},
function () {
options = options || { data: {} };
var tag = options.data.tag;
options.data = new NameAddrHeader(options.data.uri, options.data.displayName, options.data.params);
if (tag) {
options.data.setParam('tag', tag);
}
},
"ttl",
peg$literalExpectation("ttl", true),
function (via_ttl_value) {
options = options || { data: {} };
options.data.ttl = via_ttl_value;
},
"maddr",
peg$literalExpectation("maddr", true),
function (via_maddr) {
options = options || { data: {} };
options.data.maddr = via_maddr;
},
"received",
peg$literalExpectation("received", true),
function (via_received) {
options = options || { data: {} };
options.data.received = via_received;
},
"branch",
peg$literalExpectation("branch", true),
function (via_branch) {
options = options || { data: {} };
options.data.branch = via_branch;
},
"rport",
peg$literalExpectation("rport", true),
function (response_port) {
options = options || { data: {} };
if (typeof response_port !== 'undefined')
options.data.rport = response_port.join('');
},
function (via_protocol) {
options = options || { data: {} };
options.data.protocol = via_protocol;
},
peg$literalExpectation("UDP", true),
peg$literalExpectation("TCP", true),
peg$literalExpectation("TLS", true),
peg$literalExpectation("SCTP", true),
function (via_transport) {
options = options || { data: {} };
options.data.transport = via_transport;
},
function () {
options = options || { data: {} };
options.data.host = text();
},
function (via_sent_by_port) {
options = options || { data: {} };
options.data.port = parseInt(via_sent_by_port.join(''));
},
function (ttl) {
return parseInt(ttl.join(''));
},
function (deltaSeconds) {
options = options || { data: {} };
if (options.startRule === 'Session_Expires') {
options.data.deltaSeconds = deltaSeconds;
}
},
"refresher",
peg$literalExpectation("refresher", false),
"uas",
peg$literalExpectation("uas", false),
"uac",
peg$literalExpectation("uac", false),
function (endpoint) {
options = options || { data: {} };
if (options.startRule === 'Session_Expires') {
options.data.refresher = endpoint;
}
},
function (deltaSeconds) {
options = options || { data: {} };
if (options.startRule === 'Min_SE') {
options.data = deltaSeconds;
}
},
"stuns",
peg$literalExpectation("stuns", true),
"stun",
peg$literalExpectation("stun", true),
function (scheme) {
options = options || { data: {} };
options.data.scheme = scheme;
},
function (host) {
options = options || { data: {} };
options.data.host = host;
},
"?transport=",
peg$literalExpectation("?transport=", false),
"turns",
peg$literalExpectation("turns", true),
"turn",
peg$literalExpectation("turn", true),
function (transport) {
options = options || { data: {} };
options.data.transport = transport;
},
function () {
options = options || { data: {} };
options.data = text();
},
"Referred-By",
peg$literalExpectation("Referred-By", false),
"b",
peg$literalExpectation("b", false),
"cid",
peg$literalExpectation("cid", false)
];
const peg$bytecode = [
peg$decode("2 \"\"6 7!"),
peg$decode("4\"\"\"5!7#"),
peg$decode("4$\"\"5!7%"),
peg$decode("4&\"\"5!7'"),
peg$decode(";'.# &;("),
peg$decode("4(\"\"5!7)"),
peg$decode("4*\"\"5!7+"),
peg$decode("2,\"\"6,7-"),
peg$decode("2.\"\"6.7/"),
peg$decode("40\"\"5!71"),
peg$decode("22\"\"6273.\x89 &24\"\"6475.} &26\"\"6677.q &28\"\"6879.e &2:\"\"6:7;.Y &2<\"\"6<7=.M &2>\"\"6>7?.A &2@\"\"6@7A.5 &2B\"\"6B7C.) &2D\"\"6D7E"),
peg$decode(";).# &;,"),
peg$decode("2F\"\"6F7G.} &2H\"\"6H7I.q &2J\"\"6J7K.e &2L\"\"6L7M.Y &2N\"\"6N7O.M &2P\"\"6P7Q.A &2R\"\"6R7S.5 &2T\"\"6T7U.) &2V\"\"6V7W"),
peg$decode("%%2X\"\"6X7Y/5#;#/,$;#/#$+#)(#'#(\"'#&'#/\"!&,)"),
peg$decode("%%$;$0#*;$&/,#; /#$+\")(\"'#&'#.\" &\"/=#$;$/�#*;$&&&#/'$8\":Z\" )(\"'#&'#"),
peg$decode(";..\" &\""),
peg$decode("%$;'.# &;(0)*;'.# &;(&/?#28\"\"6879/0$;//'$8#:[# )(#'#(\"'#&'#"),
peg$decode("%%$;2/�#*;2&&&#/g#$%$;.0#*;.&/,#;2/#$+\")(\"'#&'#0=*%$;.0#*;.&/,#;2/#$+\")(\"'#&'#&/#$+\")(\"'#&'#/\"!&,)"),
peg$decode("4\\\"\"5!7].# &;3"),
peg$decode("4^\"\"5!7_"),
peg$decode("4`\"\"5!7a"),
peg$decode(";!.) &4b\"\"5!7c"),
peg$decode("%$;).\x95 &2F\"\"6F7G.\x89 &2J\"\"6J7K.} &2L\"\"6L7M.q &2X\"\"6X7Y.e &2P\"\"6P7Q.Y &2H\"\"6H7I.M &2@\"\"6@7A.A &2d\"\"6d7e.5 &2R\"\"6R7S.) &2N\"\"6N7O/\x9E#0\x9B*;).\x95 &2F\"\"6F7G.\x89 &2J\"\"6J7K.} &2L\"\"6L7M.q &2X\"\"6X7Y.e &2P\"\"6P7Q.Y &2H\"\"6H7I.M &2@\"\"6@7A.A &2d\"\"6d7e.5 &2R\"\"6R7S.) &2N\"\"6N7O&&&#/\"!&,)"),
peg$decode("%$;).\x89 &2F\"\"6F7G.} &2L\"\"6L7M.q &2X\"\"6X7Y.e &2P\"\"6P7Q.Y &2H\"\"6H7I.M &2@\"\"6@7A.A &2d\"\"6d7e.5 &2R\"\"6R7S.) &2N\"\"6N7O/\x92#0\x8F*;).\x89 &2F\"\"6F7G.} &2L\"\"6L7M.q &2X\"\"6X7Y.e &2P\"\"6P7Q.Y &2H\"\"6H7I.M &2@\"\"6@7A.A &2d\"\"6d7e.5 &2R\"\"6R7S.) &2N\"\"6N7O&&&#/\"!&,)"),
peg$decode("2T\"\"6T7U.\xE3 &2V\"\"6V7W.\xD7 &2f\"\"6f7g.\xCB &2h\"\"6h7i.\xBF &2:\"\"6:7;.\xB3 &2D\"\"6D7E.\xA7 &22\"\"6273.\x9B &28\"\"6879.\x8F &2j\"\"6j7k.\x83 &;&.} &24\"\"6475.q &2l\"\"6l7m.e &2n\"\"6n7o.Y &26\"\"6677.M &2>\"\"6>7?.A &2p\"\"6p7q.5 &2r\"\"6r7s.) &;'.# &;("),
peg$decode("%$;).\u012B &2F\"\"6F7G.\u011F &2J\"\"6J7K.\u0113 &2L\"\"6L7M.\u0107 &2X\"\"6X7Y.\xFB &2P\"\"6P7Q.\xEF &2H\"\"6H7I.\xE3 &2@\"\"6@7A.\xD7 &2d\"\"6d7e.\xCB &2R\"\"6R7S.\xBF &2N\"\"6N7O.\xB3 &2T\"\"6T7U.\xA7 &2V\"\"6V7W.\x9B &2f\"\"6f7g.\x8F &2h\"\"6h7i.\x83 &28\"\"6879.w &2j\"\"6j7k.k &;&.e &24\"\"6475.Y &2l\"\"6l7m.M &2n\"\"6n7o.A &26\"\"6677.5 &2p\"\"6p7q.) &2r\"\"6r7s/\u0134#0\u0131*;).\u012B &2F\"\"6F7G.\u011F &2J\"\"6J7K.\u0113 &2L\"\"6L7M.\u0107 &2X\"\"6X7Y.\xFB &2P\"\"6P7Q.\xEF &2H\"\"6H7I.\xE3 &2@\"\"6@7A.\xD7 &2d\"\"6d7e.\xCB &2R\"\"6R7S.\xBF &2N\"\"6N7O.\xB3 &2T\"\"6T7U.\xA7 &2V\"\"6V7W.\x9B &2f\"\"6f7g.\x8F &2h\"\"6h7i.\x83 &28\"\"6879.w &2j\"\"6j7k.k &;&.e &24\"\"6475.Y &2l\"\"6l7m.M &2n\"\"6n7o.A &26\"\"6677.5 &2p\"\"6p7q.) &2r\"\"6r7s&&&#/\"!&,)"),
peg$decode("%;//?#2P\"\"6P7Q/0$;//'$8#:t# )(#'#(\"'#&'#"),
peg$decode("%;//?#24\"\"6475/0$;//'$8#:u# )(#'#(\"'#&'#"),
peg$decode("%;//?#2>\"\"6>7?/0$;//'$8#:v# )(#'#(\"'#&'#"),
peg$decode("%;//?#2T\"\"6T7U/0$;//'$8#:w# )(#'#(\"'#&'#"),
peg$decode("%;//?#2V\"\"6V7W/0$;//'$8#:x# )(#'#(\"'#&'#"),
peg$decode("%2h\"\"6h7i/0#;//'$8\":y\" )(\"'#&'#"),
peg$decode("%;//6#2f\"\"6f7g/'$8\":z\" )(\"'#&'#"),
peg$decode("%;//?#2D\"\"6D7E/0$;//'$8#:{# )(#'#(\"'#&'#"),
peg$decode("%;//?#22\"\"6273/0$;//'$8#:|# )(#'#(\"'#&'#"),
peg$decode("%;//?#28\"\"6879/0$;//'$8#:}# )(#'#(\"'#&'#"),
peg$decode("%;//0#;&/'$8\":~\" )(\"'#&'#"),
peg$decode("%;&/0#;//'$8\":~\" )(\"'#&'#"),
peg$decode("%;=/T#$;G.) &;K.# &;F0/*;G.) &;K.# &;F&/,$;>/#$+#)(#'#(\"'#&'#"),
peg$decode("4\x7F\"\"5!7\x80.A &4\x81\"\"5!7\x82.5 &4\x83\"\"5!7\x84.) &;3.# &;."),
peg$decode("%%;//Q#;&/H$$;J.# &;K0)*;J.# &;K&/,$;&/#$+$)($'#(#'#(\"'#&'#/\"!&,)"),
peg$decode("%;//]#;&/T$%$;J.# &;K0)*;J.# &;K&/\"!&,)/1$;&/($8$:\x85$!!)($'#(#'#(\"'#&'#"),
peg$decode(";..G &2L\"\"6L7M.; &4\x86\"\"5!7\x87./ &4\x83\"\"5!7\x84.# &;3"),
peg$decode("%2j\"\"6j7k/J#4\x88\"\"5!7\x89.5 &4\x8A\"\"5!7\x8B.) &4\x8C\"\"5!7\x8D/#$+\")(\"'#&'#"),
peg$decode("%;N/M#28\"\"6879/>$;O.\" &\"/0$;S/'$8$:\x8E$ )($'#(#'#(\"'#&'#"),
peg$decode("%;N/d#28\"\"6879/U$;O.\" &\"/G$;S/>$;_/5$;l.\" &\"/'$8&:\x8F& )(&'#(%'#($'#(#'#(\"'#&'#"),
peg$decode("%3\x90\"\"5$7\x91.) &3\x92\"\"5#7\x93/' 8!:\x94!! )"),
peg$decode("%;P/]#%28\"\"6879/,#;R/#$+\")(\"'#&'#.\" &\"/6$2:\"\"6:7;/'$8#:\x95# )(#'#(\"'#&'#"),
peg$decode("$;+.) &;-.# &;Q/2#0/*;+.) &;-.# &;Q&&&#"),
peg$decode("2<\"\"6<7=.q &2>\"\"6>7?.e &2@\"\"6@7A.Y &2B\"\"6B7C.M &2D\"\"6D7E.A &22\"\"6273.5 &26\"\"6677.) &24\"\"6475"),
peg$decode("%$;+._ &;-.Y &2<\"\"6<7=.M &2>\"\"6>7?.A &2@\"\"6@7A.5 &2B\"\"6B7C.) &2D\"\"6D7E0e*;+._ &;-.Y &2<\"\"6<7=.M &2>\"\"6>7?.A &2@\"\"6@7A.5 &2B\"\"6B7C.) &2D\"\"6D7E&/& 8!:\x96! )"),
peg$decode("%;T/J#%28\"\"6879/,#;^/#$+\")(\"'#&'#.\" &\"/#$+\")(\"'#&'#"),
peg$decode("%;U.) &;\\.# &;X/& 8!:\x97! )"),
peg$decode("%$%;V/2#2J\"\"6J7K/#$+\")(\"'#&'#0<*%;V/2#2J\"\"6J7K/#$+\")(\"'#&'#&/D#;W/;$2J\"\"6J7K.\" &\"/'$8#:\x98# )(#'#(\"'#&'#"),
peg$decode("$4\x99\"\"5!7\x9A/,#0)*4\x99\"\"5!7\x9A&&&#"),
peg$decode("%4$\"\"5!7%/?#$4\x9B\"\"5!7\x9C0)*4\x9B\"\"5!7\x9C&/#$+\")(\"'#&'#"),
peg$decode("%2l\"\"6l7m/?#;Y/6$2n\"\"6n7o/'$8#:\x9D# )(#'#(\"'#&'#"),
peg$decode("%%;Z/\xB3#28\"\"6879/\xA4$;Z/\x9B$28\"\"6879/\x8C$;Z/\x83$28\"\"6879/t$;Z/k$28\"\"6879/\\$;Z/S$28\"\"6879/D$;Z/;$28\"\"6879/,$;[/#$+-)(-'#(,'#(+'#(*'#()'#(('#(''#(&'#(%'#($'#(#'#(\"'#&'#.\u0790 &%2\x9E\"\"6\x9E7\x9F/\xA4#;Z/\x9B$28\"\"6879/\x8C$;Z/\x83$28\"\"6879/t$;Z/k$28\"\"6879/\\$;Z/S$28\"\"6879/D$;Z/;$28\"\"6879/,$;[/#$+,)(,'#(+'#(*'#()'#(('#(''#(&'#(%'#($'#(#'#(\"'#&'#.\u06F9 &%2\x9E\"\"6\x9E7\x9F/\x8C#;Z/\x83$28\"\"6879/t$;Z/k$28\"\"6879/\\$;Z/S$28\"\"6879/D$;Z/;$28\"\"6879/,$;[/#$+*)(*'#()'#(('#(''#(&'#(%'#($'#(#'#(\"'#&'#.\u067A &%2\x9E\"\"6\x9E7\x9F/t#;Z/k$28\"\"6879/\\$;Z/S$28\"\"6879/D$;Z/;$28\"\"6879/,$;[/#$+()(('#(''#(&'#(%'#($'#(#'#(\"'#&'#.\u0613 &%2\x9E\"\"6\x9E7\x9F/\\#;Z/S$28\"\"6879/D$;Z/;$28\"\"6879/,$;[/#$+&)(&'#(%'#($'#(#'#(\"'#&'#.\u05C4 &%2\x9E\"\"6\x9E7\x9F/D#;Z/;$28\"\"6879/,$;[/#$+$)($'#(#'#(\"'#&'#.\u058D &%2\x9E\"\"6\x9E7\x9F/,#;[/#$+\")(\"'#&'#.\u056E &%2\x9E\"\"6\x9E7\x9F/,#;Z/#$+\")(\"'#&'#.\u054F &%;Z/\x9B#2\x9E\"\"6\x9E7\x9F/\x8C$;Z/\x83$28\"\"6879/t$;Z/k$28\"\"6879/\\$;Z/S$28\"\"6879/D$;Z/;$28\"\"6879/,$;[/#$++)(+'#(*'#()'#(('#(''#(&'#(%'#($'#(#'#(\"'#&'#.\u04C7 &%;Z/\xAA#%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\x83$2\x9E\"\"6\x9E7\x9F/t$;Z/k$28\"\"6879/\\$;Z/S$28\"\"6879/D$;Z/;$28\"\"6879/,$;[/#$+*)(*'#()'#(('#(''#(&'#(%'#($'#(#'#(\"'#&'#.\u0430 &%;Z/\xB9#%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\x92$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/k$2\x9E\"\"6\x9E7\x9F/\\$;Z/S$28\"\"6879/D$;Z/;$28\"\"6879/,$;[/#$+))()'#(('#(''#(&'#(%'#($'#(#'#(\"'#&'#.\u038A &%;Z/\xC8#%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\xA1$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/z$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/S$2\x9E\"\"6\x9E7\x9F/D$;Z/;$28\"\"6879/,$;[/#$+()(('#(''#(&'#(%'#($'#(#'#(\"'#&'#.\u02D5 &%;Z/\xD7#%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\xB0$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\x89$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/b$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/;$2\x9E\"\"6\x9E7\x9F/,$;[/#$+')(''#(&'#(%'#($'#(#'#(\"'#&'#.\u0211 &%;Z/\xFE#%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\xD7$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\xB0$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\x89$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/b$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/;$2\x9E\"\"6\x9E7\x9F/,$;Z/#$+()(('#(''#(&'#(%'#($'#(#'#(\"'#&'#.\u0126 &%;Z/\u011C#%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\xF5$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\xCE$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\xA7$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\x80$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/Y$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/2$2\x9E\"\"6\x9E7\x9F/#$+()(('#(''#(&'#(%'#($'#(#'#(\"'#&'#/& 8!:\xA0! )"),
peg$decode("%;#/M#;#.\" &\"/?$;#.\" &\"/1$;#.\" &\"/#$+$)($'#(#'#(\"'#&'#"),
peg$decode("%;Z/;#28\"\"6879/,$;Z/#$+#)(#'#(\"'#&'#.# &;\\"),
peg$decode("%;]/o#2J\"\"6J7K/`$;]/W$2J\"\"6J7K/H$;]/?$2J\"\"6J7K/0$;]/'$8':\xA1' )(''#(&'#(%'#($'#(#'#(\"'#&'#"),
peg$decode("%2\xA2\"\"6\xA27\xA3/2#4\xA4\"\"5!7\xA5/#$+\")(\"'#&'#.\x98 &%2\xA6\"\"6\xA67\xA7/;#4\xA8\"\"5!7\xA9/,$;!/#$+#)(#'#(\"'#&'#.j &%2\xAA\"\"6\xAA7\xAB/5#;!/,$;!/#$+#)(#'#(\"'#&'#.B &%4\xAC\"\"5!7\xAD/,#;!/#$+\")(\"'#&'#.# &;!"),
peg$decode("%%;!.\" &\"/[#;!.\" &\"/M$;!.\" &\"/?$;!.\" &\"/1$;!.\" &\"/#$+%)(%'#($'#(#'#(\"'#&'#/' 8!:\xAE!! )"),
peg$decode("$%22\"\"6273/,#;`/#$+\")(\"'#&'#0<*%22\"\"6273/,#;`/#$+\")(\"'#&'#&"),
peg$decode(";a.A &;b.; &;c.5 &;d./ &;e.) &;f.# &;g"),
peg$decode("%3\xAF\"\"5*7\xB0/a#3\xB1\"\"5#7\xB2.G &3\xB3\"\"5#7\xB4.; &3\xB5\"\"5$7\xB6./ &3\xB7\"\"5#7\xB8.# &;6/($8\":\xB9\"! )(\"'#&'#"),
peg$decode("%3\xBA\"\"5%7\xBB/I#3\xBC\"\"5%7\xBD./ &3\xBE\"\"5\"7\xBF.# &;6/($8\":\xC0\"! )(\"'#&'#"),
peg$decode("%3\xC1\"\"5'7\xC2/1#;\x90/($8\":\xC3\"! )(\"'#&'#"),
peg$decode("%3\xC4\"\"5$7\xC5/1#;\xF0/($8\":\xC6\"! )(\"'#&'#"),
peg$decode("%3\xC7\"\"5&7\xC8/1#;T/($8\":\xC9\"! )(\"'#&'#"),
peg$decode("%3\xCA\"\"5\"7\xCB/N#%2>\"\"6>7?/,#;6/#$+\")(\"'#&'#.\" &\"/'$8\":\xCC\" )(\"'#&'#"),
peg$decode("%;h/P#%2>\"\"6>7?/,#;i/#$+\")(\"'#&'#.\" &\"/)$8\":\xCD\"\"! )(\"'#&'#"),
peg$decode("%$;j/�#*;j&&&#/\"!&,)"),
peg$decode("%$;j/�#*;j&&&#/\"!&,)"),
peg$decode(";k.) &;+.# &;-"),
peg$decode("2l\"\"6l7m.e &2n\"\"6n7o.Y &24\"\"6475.M &28\"\"6879.A &2<\"\"6<7=.5 &2@\"\"6@7A.) &2B\"\"6B7C"),
peg$decode("%26\"\"6677/n#;m/e$$%2<\"\"6<7=/,#;m/#$+\")(\"'#&'#0<*%2<\"\"6<7=/,#;m/#$+\")(\"'#&'#&/#$+#)(#'#(\"'#&'#"),
peg$decode("%;n/A#2>\"\"6>7?/2$;o/)$8#:\xCE#\"\" )(#'#(\"'#&'#"),
peg$decode("$;p.) &;+.# &;-/2#0/*;p.) &;+.# &;-&&&#"),
peg$decode("$;p.) &;+.# &;-0/*;p.) &;+.# &;-&"),
peg$decode("2l\"\"6l7m.e &2n\"\"6n7o.Y &24\"\"6475.M &26\"\"6677.A &28\"\"6879.5 &2@\"\"6@7A.) &2B\"\"6B7C"),
peg$decode(";\x91.# &;r"),
peg$decode("%;\x90/G#;'/>$;s/5$;'/,$;\x84/#$+%)(%'#($'#(#'#(\"'#&'#"),
peg$decode(";M.# &;t"),
peg$decode("%;\x7F/E#28\"\"6879/6$;u.# &;x/'$8#:\xCF# )(#'#(\"'#&'#"),
peg$decode("%;v.# &;w/J#%26\"\"6677/,#;\x83/#$+\")(\"'#&'#.\" &\"/#$+\")(\"'#&'#"),
peg$decode("%2\xD0\"\"6\xD07\xD1/:#;\x80/1$;w.\" &\"/#$+#)(#'#(\"'#&'#"),
peg$decode("%24\"\"6475/,#;{/#$+\")(\"'#&'#"),
peg$decode("%;z/3#$;y0#*;y&/#$+\")(\"'#&'#"),
peg$decode(";*.) &;+.# &;-"),
peg$decode(";+.\x8F &;-.\x89 &22\"\"6273.} &26\"\"6677.q &28\"\"6879.e &2:\"\"6:7;.Y &2<\"\"6<7=.M &2>\"\"6>7?.A &2@\"\"6@7A.5 &2B\"\"6B7C.) &2D\"\"6D7E"),
peg$decode("%;|/e#$%24\"\"6475/,#;|/#$+\")(\"'#&'#0<*%24\"\"6475/,#;|/#$+\")(\"'#&'#&/#$+\")(\"'#&'#"),
peg$decode("%$;~0#*;~&/e#$%22\"\"6273/,#;}/#$+\")(\"'#&'#0<*%22\"\"6273/,#;}/#$+\")(\"'#&'#&/#$+\")(\"'#&'#"),
peg$decode("$;~0#*;~&"),
peg$decode(";+.w &;-.q &28\"\"6879.e &2:\"\"6:7;.Y &2<\"\"6<7=.M &2>\"\"6>7?.A &2@\"\"6@7A.5 &2B\"\"6B7C.) &2D\"\"6D7E"),
peg$decode("%%;\"/\x87#$;\".G &;!.A &2@\"\"6@7A.5 &2F\"\"6F7G.) &2J\"\"6J7K0M*;\".G &;!.A &2@\"\"6@7A.5 &2F\"\"6F7G.) &2J\"\"6J7K&/#$+\")(\"'#&'#/& 8!:\xD2! )"),
peg$decode(";\x81.# &;\x82"),
peg$decode("%%;O/2#2:\"\"6:7;/#$+\")(\"'#&'#.\" &\"/,#;S/#$+\")(\"'#&'#.\" &\""),
peg$decode("$;+.\x83 &;-.} &2B\"\"6B7C.q &2D\"\"6D7E.e &22\"\"6273.Y &28\"\"6879.M &2:\"\"6:7;.A &2<\"\"6<7=.5 &2>\"\"6>7?.) &2@\"\"6@7A/\x8C#0\x89*;+.\x83 &;-.} &2B\"\"6B7C.q &2D\"\"6D7E.e &22\"\"6273.Y &28\"\"6879.M &2:\"\"6:7;.A &2<\"\"6<7=.5 &2>\"\"6>7?.) &2@\"\"6@7A&&&#"),
peg$decode("$;y0#*;y&"),
peg$decode("%3\x92\"\"5#7\xD3/q#24\"\"6475/b$$;!/�#*;!&&&#/L$2J\"\"6J7K/=$$;!/�#*;!&&&#/'$8%:\xD4% )(%'#($'#(#'#(\"'#&'#"),
peg$decode("2\xD5\"\"6\xD57\xD6"),
peg$decode("2\xD7\"\"6\xD77\xD8"),
peg$decode("2\xD9\"\"6\xD97\xDA"),
peg$decode("2\xDB\"\"6\xDB7\xDC"),
peg$decode("2\xDD\"\"6\xDD7\xDE"),
peg$decode("2\xDF\"\"6\xDF7\xE0"),
peg$decode("2\xE1\"\"6\xE17\xE2"),
peg$decode("2\xE3\"\"6\xE37\xE4"),
peg$decode("2\xE5\"\"6\xE57\xE6"),
peg$decode("2\xE7\"\"6\xE77\xE8"),
peg$decode("2\xE9\"\"6\xE97\xEA"),
peg$decode("%;\x85.Y &;\x86.S &;\x88.M &;\x89.G &;\x8A.A &;\x8B.; &;\x8C.5 &;\x8F./ &;\x8D.) &;\x8E.# &;6/& 8!:\xEB! )"),
peg$decode("%;\x84/G#;'/>$;\x92/5$;'/,$;\x94/#$+%)(%'#($'#(#'#(\"'#&'#"),
peg$decode("%;\x93/' 8!:\xEC!! )"),
peg$decode("%;!/5#;!/,$;!/#$+#)(#'#(\"'#&'#"),
peg$decode("%$;*.A &;+.; &;-.5 &;3./ &;4.) &;'.# &;(0G*;*.A &;+.; &;-.5 &;3./ &;4.) &;'.# &;(&/& 8!:\xED! )"),
peg$decode("%;\xB6/Y#$%;A/,#;\xB6/#$+\")(\"'#&'#06*%;A/,#;\xB6/#$+\")(\"'#&'#&/#$+\")(\"'#&'#"),
peg$decode("%;9/N#%2:\"\"6:7;/,#;9/#$+\")(\"'#&'#.\" &\"/'$8\":\xEE\" )(\"'#&'#"),
peg$decode("%;:.c &%;\x98/Y#$%;A/,#;\x98/#$+\")(\"'#&'#06*%;A/,#;\x98/#$+\")(\"'#&'#&/#$+\")(\"'#&'#/& 8!:\xEF! )"),
peg$decode("%;L.# &;\x99/]#$%;B/,#;\x9B/#$+\")(\"'#&'#06*%;B/,#;\x9B/#$+\")(\"'#&'#&/'$8\":\xF0\" )(\"'#&'#"),
peg$decode("%;\x9A.\" &\"/>#;@/5$;M/,$;?/#$+$)($'#(#'#(\"'#&'#"),
peg$decode("%%;6/Y#$%;./,#;6/#$+\")(\"'#&'#06*%;./,#;6/#$+\")(\"'#&'#&/#$+\")(\"'#&'#.# &;H/' 8!:\xF1!! )"),
peg$decode(";\x9C.) &;\x9D.# &;\xA0"),
peg$decode("%3\xF2\"\"5!7\xF3/:#;</1$;\x9F/($8#:\xF4#! )(#'#(\"'#&'#"),
peg$decode("%3\xF5\"\"5'7\xF6/:#;</1$;\x9E/($8#:\xF7#! )(#'#(\"'#&'#"),
peg$decode("%$;!/�#*;!&&&#/' 8!:\xF8!! )"),
peg$decode("%2\xF9\"\"6\xF97\xFA/o#%2J\"\"6J7K/M#;!.\" &\"/?$;!.\" &\"/1$;!.\" &\"/#$+$)($'#(#'#(\"'#&'#.\" &\"/'$8\":\xFB\" )(\"'#&'#"),
peg$decode("%;6/J#%;</,#;\xA1/#$+\")(\"'#&'#.\" &\"/)$8\":\xFC\"\"! )(\"'#&'#"),
peg$decode(";6.) &;T.# &;H"),
peg$decode("%;\xA3/Y#$%;B/,#;\xA4/#$+\")(\"'#&'#06*%;B/,#;\xA4/#$+\")(\"'#&'#&/#$+\")(\"'#&'#"),
peg$decode("%3\xFD\"\"5&7\xFE.G &3\xFF\"\"5'7\u0100.; &3\u0101\"\"5$7\u0102./ &3\u0103\"\"5%7\u0104.# &;6/& 8!:\u0105! )"),
peg$decode(";\xA5.# &;\xA0"),
peg$decode("%3\u0106\"\"5(7\u0107/M#;</D$3\u0108\"\"5(7\u0109./ &3\u010A\"\"5(7\u010B.# &;6/#$+#)(#'#(\"'#&'#"),
peg$decode("%;6/Y#$%;A/,#;6/#$+\")(\"'#&'#06*%;A/,#;6/#$+\")(\"'#&'#&/#$+\")(\"'#&'#"),
peg$decode("%$;!/�#*;!&&&#/' 8!:\u010C!! )"),
peg$decode("%;\xA9/& 8!:\u010D! )"),
peg$decode("%;\xAA/k#;;/b$;\xAF/Y$$%;B/,#;\xB0/#$+\")(\"'#&'#06*%;B/,#;\xB0/#$+\")(\"'#&'#&/#$+$)($'#(#'#(\"'#&'#"),
peg$decode(";\xAB.# &;\xAC"),
peg$decode("3\u010E\"\"5$7\u010F.S &3\u0110\"\"5%7\u0111.G &3\u0112\"\"5%7\u0113.; &3\u0114\"\"5%7\u0115./ &3\u0116\"\"5+7\u0117.# &;\xAD"),
peg$decode("3\u0118\"\"5'7\u0119./ &3\u011A\"\"5)7\u011B.# &;\xAD"),
peg$decode(";6.# &;\xAE"),
peg$decode("%3\u011C\"\"5\"7\u011D/,#;6/#$+\")(\"'#&'#"),
peg$decode(";\xAD.# &;6"),
peg$decode("%;6/5#;</,$;\xB1/#$+#)(#'#(\"'#&'#"),