- orchestration.sx: add nil guard for verb/url before calling do-fetch (prevents "Expected string, got nil" when verb info dict lacks method) - sx_browser.ml: restore JIT error logging (Eval_error only, not all exceptions) so real failures are visible, silence routine fallbacks - Rebuild WASM bundle with fixes Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
39241 lines
3.3 MiB
39241 lines
3.3 MiB
// Generated by js_of_ocaml
|
|
//# buildInfo:effects=disabled, kind=unknown, use-js-string=true, version=6.3.2
|
|
//# 7 ".sx_browser.eobjs/jsoo/sx_browser.bc.runtime.js"
|
|
(function
|
|
(Object){
|
|
typeof globalThis !== "object"
|
|
&&
|
|
(this
|
|
? get()
|
|
: (Object.defineProperty
|
|
(Object.prototype, "_T_", {configurable: true, get: get}),
|
|
_T_));
|
|
function get(){
|
|
var global = this || self;
|
|
global.globalThis = global;
|
|
delete Object.prototype._T_;
|
|
}
|
|
}
|
|
(Object));
|
|
(function(globalThis){
|
|
"use strict";
|
|
function caml_string_of_jsbytes(x){return x;}
|
|
class JsStringReader{
|
|
constructor(s, i){this.s = s; this.i = i;}
|
|
read8u(){return this.s.charCodeAt(this.i++);}
|
|
read8s(){return this.s.charCodeAt(this.i++) << 24 >> 24;}
|
|
read16u(){
|
|
var s = this.s, i = this.i;
|
|
this.i = i + 2;
|
|
return s.charCodeAt(i) << 8 | s.charCodeAt(i + 1);
|
|
}
|
|
read16s(){
|
|
var s = this.s, i = this.i;
|
|
this.i = i + 2;
|
|
return s.charCodeAt(i) << 24 >> 16 | s.charCodeAt(i + 1);
|
|
}
|
|
read32u(){
|
|
var s = this.s, i = this.i;
|
|
this.i = i + 4;
|
|
return (s.charCodeAt(i) << 24 | s.charCodeAt(i + 1) << 16
|
|
| s.charCodeAt(i + 2) << 8
|
|
| s.charCodeAt(i + 3))
|
|
>>> 0;
|
|
}
|
|
read32s(){
|
|
var s = this.s, i = this.i;
|
|
this.i = i + 4;
|
|
return s.charCodeAt(i) << 24 | s.charCodeAt(i + 1) << 16
|
|
| s.charCodeAt(i + 2) << 8
|
|
| s.charCodeAt(i + 3);
|
|
}
|
|
readstr(len){
|
|
var i = this.i;
|
|
this.i = i + len;
|
|
return caml_string_of_jsbytes(this.s.slice(i, i + len));
|
|
}
|
|
readuint8array(len){
|
|
var b = new Uint8Array(len), s = this.s, i = this.i;
|
|
for(var j = 0; j < len; j++) b[j] = s.charCodeAt(i + j);
|
|
this.i = i + len;
|
|
return b;
|
|
}
|
|
}
|
|
var jsoo_text_decoder = new TextDecoder();
|
|
function caml_convert_bytes_to_array(s){
|
|
var a = new Uint8Array(s.l), b = s.c, l = b.length, i = 0;
|
|
for(; i < l; i++) a[i] = b.charCodeAt(i);
|
|
for(l = s.l; i < l; i++) a[i] = 0;
|
|
s.c = a;
|
|
s.t = 4;
|
|
return a;
|
|
}
|
|
function caml_uint8_array_of_bytes(s){
|
|
if(s.t !== 4) caml_convert_bytes_to_array(s);
|
|
return s.c;
|
|
}
|
|
function caml_str_repeat(n, s){return s.repeat(n);}
|
|
function caml_sub_uint8_array_to_jsbytes(a, i, len){
|
|
var f = String.fromCharCode;
|
|
if(i === 0 && len <= 4096 && len === a.length) return f.apply(null, a);
|
|
var s = "";
|
|
for(; 0 < len; i += 1024, len -= 1024)
|
|
s += f.apply(null, a.subarray(i, i + Math.min(len, 1024)));
|
|
return s;
|
|
}
|
|
function caml_convert_string_to_bytes(s){
|
|
if(s.t === 2)
|
|
s.c += caml_str_repeat(s.l - s.c.length, "\0");
|
|
else
|
|
s.c = caml_sub_uint8_array_to_jsbytes(s.c, 0, s.c.length);
|
|
s.t = 0;
|
|
}
|
|
function jsoo_is_ascii(s){
|
|
if(s.length < 24){
|
|
for(var i = 0; i < s.length; i++) if(s.charCodeAt(i) > 127) return false;
|
|
return true;
|
|
}
|
|
else
|
|
return ! /[^\x00-\x7f]/.test(s);
|
|
}
|
|
class MlBytes{
|
|
constructor(tag, contents, length){
|
|
this.t = tag;
|
|
this.c = contents;
|
|
this.l = length;
|
|
}
|
|
toString(){
|
|
switch(this.t){
|
|
case 9:
|
|
case 8:
|
|
return this.c;
|
|
case 4:
|
|
case 2:
|
|
caml_convert_string_to_bytes(this);
|
|
case 0:
|
|
if(jsoo_is_ascii(this.c)) this.t = 9; else this.t = 8; return this.c;
|
|
}
|
|
}
|
|
toUtf16(){
|
|
if(this.t === 9) return this.c;
|
|
var a = caml_uint8_array_of_bytes(this);
|
|
return jsoo_text_decoder.decode(a);
|
|
}
|
|
slice(){
|
|
var content = this.t === 4 ? this.c.slice() : this.c;
|
|
return new MlBytes(this.t, content, this.l);
|
|
}
|
|
}
|
|
function MlChanid(id){this.id = id;}
|
|
var jsoo_static_env = {};
|
|
function jsoo_sys_getenv(n){
|
|
if(jsoo_static_env[n]) return jsoo_static_env[n];
|
|
var process = globalThis.process;
|
|
if(process && process.env && process.env[n] !== undefined)
|
|
return process.env[n];
|
|
if(globalThis.jsoo_env && typeof globalThis.jsoo_env[n] === "string")
|
|
return globalThis.jsoo_env[n];
|
|
}
|
|
var caml_record_backtrace_env_flag = 0;
|
|
(function(){
|
|
var r = jsoo_sys_getenv("OCAMLRUNPARAM");
|
|
if(r !== undefined){
|
|
var l = r.split(",");
|
|
for(var i = 0; i < l.length; i++)
|
|
if(l[i] === "b"){
|
|
caml_record_backtrace_env_flag = 1;
|
|
break;
|
|
}
|
|
else if(l[i].startsWith("b="))
|
|
caml_record_backtrace_env_flag = + l[i].slice(2);
|
|
else
|
|
continue;
|
|
}
|
|
}
|
|
());
|
|
var
|
|
caml_record_backtrace_runtime_flag = caml_record_backtrace_env_flag,
|
|
caml_global_data = [0];
|
|
function caml_exn_with_js_backtrace(exn, force){
|
|
if(! exn.js_error || force || exn[0] === 248)
|
|
exn.js_error = new globalThis.Error("Js exception containing backtrace");
|
|
return exn;
|
|
}
|
|
function caml_maybe_attach_backtrace(exn, force){
|
|
return caml_record_backtrace_env_flag
|
|
&& caml_record_backtrace_runtime_flag
|
|
? caml_exn_with_js_backtrace(exn, force)
|
|
: exn;
|
|
}
|
|
function caml_raise_with_arg(tag, arg){
|
|
throw caml_maybe_attach_backtrace([0, tag, arg]);
|
|
}
|
|
var jsoo_text_encoder = new TextEncoder();
|
|
function caml_subarray_to_jsbytes(a, i, len){
|
|
var f = String.fromCharCode;
|
|
if(i === 0 && len <= 4096 && len === a.length) return f.apply(null, a);
|
|
var s = "";
|
|
for(; 0 < len; i += 1024, len -= 1024)
|
|
s += f.apply(null, a.slice(i, i + Math.min(len, 1024)));
|
|
return s;
|
|
}
|
|
function caml_string_of_array(a){
|
|
return caml_string_of_jsbytes(caml_subarray_to_jsbytes(a, 0, a.length));
|
|
}
|
|
function caml_string_of_jsstring(s){
|
|
if(jsoo_is_ascii(s)) return caml_string_of_jsbytes(s);
|
|
var a = jsoo_text_encoder.encode(s);
|
|
return caml_string_of_array(a);
|
|
}
|
|
function caml_raise_sys_error(msg){
|
|
caml_raise_with_arg
|
|
(caml_global_data.Sys_error, caml_string_of_jsstring(msg));
|
|
}
|
|
function caml_raise_with_args(tag, args){
|
|
throw caml_maybe_attach_backtrace([0, tag].concat(args));
|
|
}
|
|
var
|
|
unix_error =
|
|
["E2BIG",
|
|
"EACCES",
|
|
"EAGAIN",
|
|
"EBADF",
|
|
"EBUSY",
|
|
"ECHILD",
|
|
"EDEADLK",
|
|
"EDOM",
|
|
"EEXIST",
|
|
"EFAULT",
|
|
"EFBIG",
|
|
"EINTR",
|
|
"EINVAL",
|
|
"EIO",
|
|
"EISDIR",
|
|
"EMFILE",
|
|
"EMLINK",
|
|
"ENAMETOOLONG",
|
|
"ENFILE",
|
|
"ENODEV",
|
|
"ENOENT",
|
|
"ENOEXEC",
|
|
"ENOLCK",
|
|
"ENOMEM",
|
|
"ENOSPC",
|
|
"ENOSYS",
|
|
"ENOTDIR",
|
|
"ENOTEMPTY",
|
|
"ENOTTY",
|
|
"ENXIO",
|
|
"EPERM",
|
|
"EPIPE",
|
|
"ERANGE",
|
|
"EROFS",
|
|
"ESPIPE",
|
|
"ESRCH",
|
|
"EXDEV",
|
|
"EWOULDBLOCK",
|
|
"EINPROGRESS",
|
|
"EALREADY",
|
|
"ENOTSOCK",
|
|
"EDESTADDRREQ",
|
|
"EMSGSIZE",
|
|
"EPROTOTYPE",
|
|
"ENOPROTOOPT",
|
|
"EPROTONOSUPPORT",
|
|
"ESOCKTNOSUPPORT",
|
|
"EOPNOTSUPP",
|
|
"EPFNOSUPPORT",
|
|
"EAFNOSUPPORT",
|
|
"EADDRINUSE",
|
|
"EADDRNOTAVAIL",
|
|
"ENETDOWN",
|
|
"ENETUNREACH",
|
|
"ENETRESET",
|
|
"ECONNABORTED",
|
|
"ECONNRESET",
|
|
"ENOBUFS",
|
|
"EISCONN",
|
|
"ENOTCONN",
|
|
"ESHUTDOWN",
|
|
"ETOOMANYREFS",
|
|
"ETIMEDOUT",
|
|
"ECONNREFUSED",
|
|
"EHOSTDOWN",
|
|
"EHOSTUNREACH",
|
|
"ELOOP",
|
|
"EOVERFLOW"];
|
|
function make_unix_err_args(code, syscall, path, errno){
|
|
var variant = unix_error.indexOf(code);
|
|
if(variant < 0){if(errno == null) errno = - 9999; variant = [0, - errno];}
|
|
var
|
|
args =
|
|
[variant,
|
|
caml_string_of_jsstring(syscall || ""),
|
|
caml_string_of_jsstring(path || "")];
|
|
return args;
|
|
}
|
|
var caml_named_values = {};
|
|
function caml_named_value(nm){return caml_named_values[nm];}
|
|
function caml_raise_system_error(raise_unix, code, cmd, msg, path){
|
|
var unix_error = caml_named_value("Unix.Unix_error");
|
|
if(raise_unix && unix_error)
|
|
caml_raise_with_args(unix_error, make_unix_err_args(code, cmd, path));
|
|
else{
|
|
var msg = code + ": " + msg + ", " + cmd;
|
|
if(path !== undefined) msg += " '" + path + "'";
|
|
caml_raise_sys_error(msg);
|
|
}
|
|
}
|
|
function caml_is_ml_bytes(s){return s instanceof MlBytes;}
|
|
function caml_is_ml_string(s){
|
|
return typeof s === "string" && ! /[^\x00-\xff]/.test(s);
|
|
}
|
|
function caml_bytes_of_array(a){
|
|
if(! (a instanceof Uint8Array)) a = new Uint8Array(a);
|
|
return new MlBytes(4, a, a.length);
|
|
}
|
|
function caml_bytes_of_jsbytes(s){return new MlBytes(0, s, s.length);}
|
|
function caml_jsbytes_of_string(x){return x;}
|
|
function caml_bytes_of_string(s){
|
|
return caml_bytes_of_jsbytes(caml_jsbytes_of_string(s));
|
|
}
|
|
function caml_raise_no_such_file(name, raise_unix){
|
|
caml_raise_system_error
|
|
(raise_unix, "ENOENT", "no such file or directory", name);
|
|
}
|
|
function caml_bytes_of_uint8_array(a){return new MlBytes(4, a, a.length);}
|
|
function caml_raise_with_string(tag, msg){
|
|
caml_raise_with_arg(tag, caml_string_of_jsbytes(msg));
|
|
}
|
|
function caml_invalid_argument(msg){
|
|
caml_raise_with_string(caml_global_data.Invalid_argument, msg);
|
|
}
|
|
function caml_create_bytes(len){
|
|
if(len < 0) caml_invalid_argument("Bytes.create");
|
|
return new MlBytes(len ? 2 : 9, "", len);
|
|
}
|
|
function caml_ml_bytes_length(s){return s.l;}
|
|
function caml_blit_bytes(s1, i1, s2, i2, len){
|
|
if(len === 0) return 0;
|
|
if(i2 === 0 && (len >= s2.l || s2.t === 2 && len >= s2.c.length)){
|
|
s2.c =
|
|
s1.t === 4
|
|
? caml_sub_uint8_array_to_jsbytes(s1.c, i1, len)
|
|
: i1 === 0 && s1.c.length === len ? s1.c : s1.c.slice(i1, i1 + len);
|
|
s2.t = s2.c.length === s2.l ? 0 : 2;
|
|
}
|
|
else if(s2.t === 2 && i2 === s2.c.length){
|
|
s2.c +=
|
|
s1.t === 4
|
|
? caml_sub_uint8_array_to_jsbytes(s1.c, i1, len)
|
|
: i1 === 0 && s1.c.length === len ? s1.c : s1.c.slice(i1, i1 + len);
|
|
s2.t = s2.c.length === s2.l ? 0 : 2;
|
|
}
|
|
else{
|
|
if(s2.t !== 4) caml_convert_bytes_to_array(s2);
|
|
var c1 = s1.c, c2 = s2.c;
|
|
if(s1.t === 4)
|
|
if(i2 <= i1)
|
|
for(var i = 0; i < len; i++) c2[i2 + i] = c1[i1 + i];
|
|
else
|
|
for(var i = len - 1; i >= 0; i--) c2[i2 + i] = c1[i1 + i];
|
|
else{
|
|
var l = Math.min(len, c1.length - i1);
|
|
for(var i = 0; i < l; i++) c2[i2 + i] = c1.charCodeAt(i1 + i);
|
|
for(; i < len; i++) c2[i2 + i] = 0;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function MlFile(){}
|
|
class MlFakeFile extends MlFile {
|
|
constructor(content){super(); this.data = content;}
|
|
truncate(len){
|
|
var old = this.data, old_len = caml_ml_bytes_length(old);
|
|
this.data = caml_create_bytes(len | 0);
|
|
caml_blit_bytes(old, 0, this.data, 0, Math.min(len, old_len));
|
|
}
|
|
length(){return caml_ml_bytes_length(this.data);}
|
|
write(offset, buf, pos, len){
|
|
var clen = this.length();
|
|
if(offset + len >= clen){
|
|
var new_str = caml_create_bytes(offset + len), old_data = this.data;
|
|
this.data = new_str;
|
|
caml_blit_bytes(old_data, 0, this.data, 0, clen);
|
|
}
|
|
caml_blit_bytes
|
|
(caml_bytes_of_uint8_array(buf), pos, this.data, offset, len);
|
|
return len;
|
|
}
|
|
read(offset, buf, pos, len){
|
|
var clen = this.length();
|
|
if(offset + len >= clen) len = clen - offset;
|
|
if(len > 0){
|
|
var data = caml_create_bytes(len | 0);
|
|
caml_blit_bytes(this.data, offset, data, 0, len);
|
|
buf.set(caml_uint8_array_of_bytes(data), pos);
|
|
return len;
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
class MlFakeFd{
|
|
constructor(name, file, flags){
|
|
this.file = file;
|
|
this.name = name;
|
|
this.flags = flags;
|
|
this.offset = 0;
|
|
this.seeked = false;
|
|
}
|
|
err_closed(cmd, raise_unix){
|
|
caml_raise_system_error(raise_unix, "EBADF", cmd, "bad file descriptor");
|
|
}
|
|
length(){
|
|
if(this.file) return this.file.length();
|
|
this.err_closed("length");
|
|
}
|
|
truncate(len, raise_unix){
|
|
if(this.file){
|
|
if(! (this.flags.wronly || this.flags.rdwr))
|
|
caml_raise_system_error
|
|
(raise_unix, "EINVAL", "truncate", "invalid argument");
|
|
return this.file.truncate(len);
|
|
}
|
|
this.err_closed("truncate", raise_unix);
|
|
}
|
|
write(buf, pos, len, raise_unix){
|
|
if(this.file && (this.flags.wronly || this.flags.rdwr)){
|
|
var offset = this.offset;
|
|
len = this.file.write(offset, buf, pos, len);
|
|
this.offset += len;
|
|
return len;
|
|
}
|
|
this.err_closed("write", raise_unix);
|
|
}
|
|
read(buf, pos, len, raise_unix){
|
|
if(this.file && ! this.flags.wronly){
|
|
var offset = this.offset;
|
|
len = this.file.read(offset, buf, pos, len);
|
|
this.offset += len;
|
|
return len;
|
|
}
|
|
this.err_closed("read", raise_unix);
|
|
}
|
|
seek(offset, whence, raise_unix){
|
|
switch(whence){
|
|
case 0: break;
|
|
case 1:
|
|
offset += this.offset; break;
|
|
case 2:
|
|
offset += this.length(); break;
|
|
}
|
|
if(offset < 0)
|
|
caml_raise_system_error
|
|
(raise_unix, "EINVAL", "lseek", "invalid argument");
|
|
this.offset = offset;
|
|
this.seeked = true;
|
|
return offset;
|
|
}
|
|
pos(){return this.offset;}
|
|
close(){if(! this.file) this.err_closed("close"); this.file = undefined;}
|
|
check_stream_semantics(cmd){
|
|
if(! this.file) return this.err_closed(cmd, 1);
|
|
}
|
|
}
|
|
class MlFakeDevice{
|
|
constructor(root, f){
|
|
this.content = {};
|
|
this.root = root;
|
|
this.lookupFun = f;
|
|
}
|
|
nm(name){return this.root + name;}
|
|
create_dir_if_needed(name){
|
|
var comp = name.split("/"), res = "";
|
|
for(var i = 0; i < comp.length - 1; i++){
|
|
res += comp[i] + "/";
|
|
if(this.content[res]) continue;
|
|
this.content[res] = Symbol("directory");
|
|
}
|
|
}
|
|
slash(name){return /\/$/.test(name) ? name : name + "/";}
|
|
lookup(name){
|
|
if(! this.content[name] && this.lookupFun){
|
|
var
|
|
res =
|
|
this.lookupFun
|
|
(caml_string_of_jsstring(this.root), caml_string_of_jsstring(name));
|
|
if(res !== 0){
|
|
this.create_dir_if_needed(name);
|
|
this.content[name] = new MlFakeFile(caml_bytes_of_string(res[1]));
|
|
}
|
|
}
|
|
}
|
|
exists(name, do_not_lookup){
|
|
if(name === "") return 1;
|
|
var name_slash = this.slash(name);
|
|
if(this.content[name_slash]) return 1;
|
|
if(! do_not_lookup) this.lookup(name);
|
|
return this.content[name] ? 1 : 0;
|
|
}
|
|
isFile(name){return this.exists(name) && ! this.is_dir(name) ? 1 : 0;}
|
|
rename_dir(oldname, newname){
|
|
if(this.exists(newname)){
|
|
if(! this.is_dir(newname))
|
|
caml_raise_sys_error
|
|
(this.nm(newname) + " : file already exists and is not a directory");
|
|
if(this.readdir(newname).length > 0)
|
|
caml_raise_sys_error(this.nm(newname) + " : directory not empty");
|
|
}
|
|
var old_slash = this.slash(oldname), new_slash = this.slash(newname);
|
|
this.create_dir_if_needed(new_slash);
|
|
for(const f of this.readdir(oldname))
|
|
this.rename(old_slash + f, new_slash + f);
|
|
delete this.content[old_slash];
|
|
}
|
|
rename(oldname, newname){
|
|
if(! this.exists(oldname))
|
|
caml_raise_sys_error(this.nm(oldname) + " : no such file or directory");
|
|
if(this.is_dir(oldname))
|
|
this.rename_dir(oldname, newname);
|
|
else{
|
|
if(this.exists(newname) && this.is_dir(newname))
|
|
caml_raise_sys_error
|
|
(this.nm(newname) + " : file already exists and is a directory");
|
|
this.content[newname] = this.content[oldname];
|
|
delete this.content[oldname];
|
|
}
|
|
}
|
|
mkdir(name, _mode, raise_unix){
|
|
if(this.exists(name))
|
|
caml_raise_system_error
|
|
(raise_unix, "EEXIST", "mkdir", "file already exists", this.nm(name));
|
|
var parent = /^(.*)\/[^/]+/.exec(name);
|
|
parent = parent?.[1] || "";
|
|
if(! this.exists(parent))
|
|
caml_raise_system_error
|
|
(raise_unix,
|
|
"ENOENT",
|
|
"mkdir",
|
|
"no such file or directory",
|
|
this.nm(name));
|
|
if(! this.is_dir(parent))
|
|
caml_raise_system_error
|
|
(raise_unix, "ENOTDIR", "mkdir", "not a directory", this.nm(name));
|
|
this.create_dir_if_needed(this.slash(name));
|
|
}
|
|
rmdir(name, raise_unix){
|
|
var name_slash = name === "" ? "" : this.slash(name);
|
|
if(! this.exists(name))
|
|
caml_raise_system_error
|
|
(raise_unix,
|
|
"ENOENT",
|
|
"rmdir",
|
|
"no such file or directory",
|
|
this.nm(name));
|
|
if(! this.is_dir(name))
|
|
caml_raise_system_error
|
|
(raise_unix, "ENOTDIR", "rmdir", "not a directory", this.nm(name));
|
|
for(var n in this.content)
|
|
if(n.startsWith(name_slash) && n !== name_slash)
|
|
caml_raise_system_error
|
|
(raise_unix,
|
|
"ENOTEMPTY",
|
|
"rmdir",
|
|
"directory not empty",
|
|
this.nm(name));
|
|
delete this.content[name_slash];
|
|
}
|
|
readdir(name){
|
|
var name_slash = name === "" ? "" : this.slash(name);
|
|
if(! this.exists(name))
|
|
caml_raise_sys_error(name + ": No such file or directory");
|
|
if(! this.is_dir(name))
|
|
caml_raise_sys_error(name + ": Not a directory");
|
|
var seen = {}, a = [];
|
|
for(var n in this.content)
|
|
if(n.startsWith(name_slash) && n !== name_slash){
|
|
var last = n.indexOf("/", name_slash.length);
|
|
if(last < 0) last = undefined;
|
|
var m = n.slice(name_slash.length, last);
|
|
if(m && ! seen[m]){seen[m] = true; a.push(m);}
|
|
}
|
|
return a;
|
|
}
|
|
opendir(name, raise_unix){
|
|
var a = this.readdir(name), c = false, i = 0;
|
|
return {readSync:
|
|
function(){
|
|
if(c)
|
|
caml_raise_system_error
|
|
(raise_unix, "EBADF", "readdir", "bad file descriptor");
|
|
if(i === a.length) return null;
|
|
var entry = a[i];
|
|
i++;
|
|
return {name: entry};
|
|
},
|
|
closeSync:
|
|
function(){
|
|
if(c)
|
|
caml_raise_system_error
|
|
(raise_unix, "EBADF", "readdir", "bad file descriptor");
|
|
c = true;
|
|
a = [];
|
|
}};
|
|
}
|
|
is_dir(name){
|
|
if(name === "") return true;
|
|
var name_slash = this.slash(name);
|
|
return this.content[name_slash] ? 1 : 0;
|
|
}
|
|
unlink(name, raise_unix){
|
|
if(! this.exists(name, true))
|
|
caml_raise_system_error
|
|
(raise_unix, "ENOENT", "unlink", "no such file or directory", name);
|
|
delete this.content[name];
|
|
return 0;
|
|
}
|
|
access(name, _flags, raise_unix){
|
|
this.lookup(name);
|
|
if(this.content[name]){
|
|
if(this.is_dir(name))
|
|
caml_raise_system_error
|
|
(raise_unix,
|
|
"EACCESS",
|
|
"access",
|
|
"permission denied,",
|
|
this.nm(name));
|
|
}
|
|
else
|
|
caml_raise_no_such_file(this.nm(name), raise_unix);
|
|
return 0;
|
|
}
|
|
open(name, f, _perms, raise_unix){
|
|
var file;
|
|
this.lookup(name);
|
|
if(this.content[name]){
|
|
if(this.is_dir(name))
|
|
caml_raise_system_error
|
|
(raise_unix,
|
|
"EISDIR",
|
|
"open",
|
|
"illegal operation on a directory",
|
|
this.nm(name));
|
|
if(f.create && f.excl)
|
|
caml_raise_system_error
|
|
(raise_unix, "EEXIST", "open", "file already exists", this.nm(name));
|
|
file = this.content[name];
|
|
if(f.truncate) file.truncate(0);
|
|
}
|
|
else if(f.create){
|
|
this.create_dir_if_needed(name);
|
|
this.content[name] = new MlFakeFile(caml_create_bytes(0));
|
|
file = this.content[name];
|
|
}
|
|
else
|
|
caml_raise_no_such_file(this.nm(name), raise_unix);
|
|
return new MlFakeFd(this.nm(name), file, f);
|
|
}
|
|
truncate(name, len, raise_unix){
|
|
var file;
|
|
this.lookup(name);
|
|
if(this.content[name]){
|
|
if(this.is_dir(name))
|
|
caml_raise_system_error
|
|
(raise_unix,
|
|
"EISDIR",
|
|
"open",
|
|
"illegal operation on a directory",
|
|
this.nm(name));
|
|
file = this.content[name];
|
|
file.truncate(len);
|
|
}
|
|
else
|
|
caml_raise_no_such_file(this.nm(name), raise_unix);
|
|
}
|
|
register(name, content){
|
|
var file;
|
|
if(this.content[name])
|
|
caml_raise_sys_error(this.nm(name) + " : file already exists");
|
|
if(caml_is_ml_bytes(content)) file = new MlFakeFile(content);
|
|
if(caml_is_ml_string(content))
|
|
file = new MlFakeFile(caml_bytes_of_string(content));
|
|
else if(Array.isArray(content))
|
|
file = new MlFakeFile(caml_bytes_of_array(content));
|
|
else if(typeof content === "string")
|
|
file = new MlFakeFile(caml_bytes_of_jsbytes(content));
|
|
else if(content.toString){
|
|
var
|
|
bytes =
|
|
caml_bytes_of_string(caml_string_of_jsstring(content.toString()));
|
|
file = new MlFakeFile(bytes);
|
|
}
|
|
if(file){
|
|
this.create_dir_if_needed(name);
|
|
this.content[name] = file;
|
|
}
|
|
else
|
|
caml_raise_sys_error
|
|
(this.nm(name) + " : registering file with invalid content type");
|
|
}
|
|
}
|
|
class MlFakeFd_out extends MlFakeFile {
|
|
constructor(fd, flags){
|
|
super(caml_create_bytes(0));
|
|
this.log = function(_s){return 0;};
|
|
if(fd === 1 && typeof console.log === "function")
|
|
this.log = console.log;
|
|
else if(fd === 2 && typeof console.error === "function")
|
|
this.log = console.error;
|
|
else if(typeof console.log === "function") this.log = console.log;
|
|
this.flags = flags;
|
|
}
|
|
length(){return 0;}
|
|
truncate(_len, raise_unix){
|
|
caml_raise_system_error
|
|
(raise_unix, "EINVAL", "ftruncate", "invalid argument");
|
|
}
|
|
write(buf, pos, len, raise_unix){
|
|
var written = len;
|
|
if(this.log){
|
|
if
|
|
(len > 0 && pos >= 0 && pos + len <= buf.length
|
|
&& buf[pos + len - 1] === 10)
|
|
len--;
|
|
var src = caml_create_bytes(len);
|
|
caml_blit_bytes(caml_bytes_of_uint8_array(buf), pos, src, 0, len);
|
|
this.log(src.toUtf16());
|
|
return written;
|
|
}
|
|
caml_raise_system_error
|
|
(raise_unix, "EBADF", "write", "bad file descriptor");
|
|
}
|
|
read(_buf, _pos, _len, raise_unix){
|
|
caml_raise_system_error
|
|
(raise_unix, "EBADF", "read", "bad file descriptor");
|
|
}
|
|
seek(_len, _whence, raise_unix){
|
|
caml_raise_system_error(raise_unix, "ESPIPE", "lseek", "illegal seek");
|
|
}
|
|
pos(){return - 1;}
|
|
close(){this.log = undefined;}
|
|
check_stream_semantics(_cmd){}
|
|
}
|
|
var caml_int64_offset = Math.pow(2, - 24);
|
|
function caml_raise_constant(tag){throw tag;}
|
|
function caml_raise_zero_divide(){
|
|
caml_raise_constant(caml_global_data.Division_by_zero);
|
|
}
|
|
class MlInt64{
|
|
constructor(lo, mi, hi){
|
|
this.lo = lo & 0xffffff;
|
|
this.mi = mi & 0xffffff;
|
|
this.hi = hi & 0xffff;
|
|
this.caml_custom = "_j";
|
|
}
|
|
static UNSIGNED_MAX = new MlInt64(0xffffff, 0xffffff, 0xffff);
|
|
static SIGNED_MAX = new MlInt64(0xffffff, 0xffffff, 0x7fff);
|
|
static SIGNED_MIN = new MlInt64(0x000000, 0x000000, 0x8000);
|
|
slice(){return new MlInt64(this.lo, this.mi, this.hi);}
|
|
ucompare(x){
|
|
if(this.hi > x.hi) return 1;
|
|
if(this.hi < x.hi) return - 1;
|
|
if(this.mi > x.mi) return 1;
|
|
if(this.mi < x.mi) return - 1;
|
|
if(this.lo > x.lo) return 1;
|
|
if(this.lo < x.lo) return - 1;
|
|
return 0;
|
|
}
|
|
compare(x){
|
|
var hi = this.hi << 16, xhi = x.hi << 16;
|
|
if(hi > xhi) return 1;
|
|
if(hi < xhi) return - 1;
|
|
if(this.mi > x.mi) return 1;
|
|
if(this.mi < x.mi) return - 1;
|
|
if(this.lo > x.lo) return 1;
|
|
if(this.lo < x.lo) return - 1;
|
|
return 0;
|
|
}
|
|
neg(){
|
|
var
|
|
lo = - this.lo,
|
|
mi = - this.mi + (lo >> 24),
|
|
hi = - this.hi + (mi >> 24);
|
|
return new MlInt64(lo, mi, hi);
|
|
}
|
|
add(x){
|
|
var
|
|
lo = this.lo + x.lo,
|
|
mi = this.mi + x.mi + (lo >> 24),
|
|
hi = this.hi + x.hi + (mi >> 24);
|
|
return new MlInt64(lo, mi, hi);
|
|
}
|
|
sub(x){
|
|
var
|
|
lo = this.lo - x.lo,
|
|
mi = this.mi - x.mi + (lo >> 24),
|
|
hi = this.hi - x.hi + (mi >> 24);
|
|
return new MlInt64(lo, mi, hi);
|
|
}
|
|
mul(x){
|
|
var
|
|
lo = this.lo * x.lo,
|
|
mi = (lo * caml_int64_offset | 0) + this.mi * x.lo + this.lo * x.mi,
|
|
hi =
|
|
(mi * caml_int64_offset | 0) + this.hi * x.lo + this.mi * x.mi
|
|
+ this.lo * x.hi;
|
|
return new MlInt64(lo, mi, hi);
|
|
}
|
|
isZero(){return (this.lo | this.mi | this.hi) === 0;}
|
|
isNeg(){return this.hi << 16 < 0;}
|
|
and(x){
|
|
return new MlInt64(this.lo & x.lo, this.mi & x.mi, this.hi & x.hi);
|
|
}
|
|
or(x){
|
|
return new MlInt64(this.lo | x.lo, this.mi | x.mi, this.hi | x.hi);
|
|
}
|
|
xor(x){
|
|
return new MlInt64(this.lo ^ x.lo, this.mi ^ x.mi, this.hi ^ x.hi);
|
|
}
|
|
shift_left(s){
|
|
s = s & 63;
|
|
if(s === 0) return this;
|
|
if(s < 24)
|
|
return new
|
|
MlInt64
|
|
(this.lo << s,
|
|
this.mi << s | this.lo >> 24 - s,
|
|
this.hi << s | this.mi >> 24 - s);
|
|
if(s < 48)
|
|
return new
|
|
MlInt64
|
|
(0, this.lo << s - 24, this.mi << s - 24 | this.lo >> 48 - s);
|
|
return new MlInt64(0, 0, this.lo << s - 48);
|
|
}
|
|
shift_right_unsigned(s){
|
|
s = s & 63;
|
|
if(s === 0) return this;
|
|
if(s < 24)
|
|
return new
|
|
MlInt64
|
|
(this.lo >> s | this.mi << 24 - s,
|
|
this.mi >> s | this.hi << 24 - s,
|
|
this.hi >> s);
|
|
if(s < 48)
|
|
return new
|
|
MlInt64
|
|
(this.mi >> s - 24 | this.hi << 48 - s, this.hi >> s - 24, 0);
|
|
return new MlInt64(this.hi >> s - 48, 0, 0);
|
|
}
|
|
shift_right(s){
|
|
s = s & 63;
|
|
if(s === 0) return this;
|
|
var h = this.hi << 16 >> 16;
|
|
if(s < 24)
|
|
return new
|
|
MlInt64
|
|
(this.lo >> s | this.mi << 24 - s,
|
|
this.mi >> s | h << 24 - s,
|
|
this.hi << 16 >> s >>> 16);
|
|
var sign = this.hi << 16 >> 31;
|
|
if(s < 48)
|
|
return new
|
|
MlInt64
|
|
(this.mi >> s - 24 | this.hi << 48 - s,
|
|
this.hi << 16 >> s - 24 >> 16,
|
|
sign & 0xffff);
|
|
return new MlInt64(this.hi << 16 >> s - 32, sign, sign);
|
|
}
|
|
lsl1(){
|
|
this.hi = this.hi << 1 | this.mi >> 23;
|
|
this.mi = (this.mi << 1 | this.lo >> 23) & 0xffffff;
|
|
this.lo = this.lo << 1 & 0xffffff;
|
|
}
|
|
lsr1(){
|
|
this.lo = (this.lo >>> 1 | this.mi << 23) & 0xffffff;
|
|
this.mi = (this.mi >>> 1 | this.hi << 23) & 0xffffff;
|
|
this.hi = this.hi >>> 1;
|
|
}
|
|
udivmod(x){
|
|
var
|
|
offset = 0,
|
|
modulus = this.slice(),
|
|
divisor = x.slice(),
|
|
quotient = new MlInt64(0, 0, 0);
|
|
while(modulus.ucompare(divisor) > 0){offset++; divisor.lsl1();}
|
|
while(offset >= 0){
|
|
offset--;
|
|
quotient.lsl1();
|
|
if(modulus.ucompare(divisor) >= 0){
|
|
quotient.lo++;
|
|
modulus = modulus.sub(divisor);
|
|
}
|
|
divisor.lsr1();
|
|
}
|
|
return {quotient: quotient, modulus: modulus};
|
|
}
|
|
div(y){
|
|
var x = this;
|
|
if(y.isZero()) caml_raise_zero_divide();
|
|
var sign = x.hi ^ y.hi;
|
|
if(x.hi & 0x8000) x = x.neg();
|
|
if(y.hi & 0x8000) y = y.neg();
|
|
var q = x.udivmod(y).quotient;
|
|
if(sign & 0x8000) q = q.neg();
|
|
return q;
|
|
}
|
|
mod(y){
|
|
var x = this;
|
|
if(y.isZero()) caml_raise_zero_divide();
|
|
var sign = x.hi;
|
|
if(x.hi & 0x8000) x = x.neg();
|
|
if(y.hi & 0x8000) y = y.neg();
|
|
var r = x.udivmod(y).modulus;
|
|
if(sign & 0x8000) r = r.neg();
|
|
return r;
|
|
}
|
|
toInt(){return this.lo | this.mi << 24;}
|
|
toFloat(){
|
|
return (this.hi << 16) * Math.pow(2, 32) + this.mi * Math.pow(2, 24)
|
|
+ this.lo;
|
|
}
|
|
toArray(){
|
|
return [this.hi >> 8,
|
|
this.hi & 0xff,
|
|
this.mi >> 16,
|
|
this.mi >> 8 & 0xff,
|
|
this.mi & 0xff,
|
|
this.lo >> 16,
|
|
this.lo >> 8 & 0xff,
|
|
this.lo & 0xff];
|
|
}
|
|
lo32(){return this.lo | (this.mi & 0xff) << 24;}
|
|
hi32(){return this.mi >>> 8 & 0xffff | this.hi << 16;}
|
|
}
|
|
class MlMutex{constructor(){this.locked = false;}}
|
|
class MlNat{
|
|
constructor(x){
|
|
this.data = new Int32Array(x);
|
|
this.length = this.data.length + 2;
|
|
this.caml_custom = "_nat";
|
|
}
|
|
}
|
|
var
|
|
jsoo_is_win32 =
|
|
globalThis.Deno?.build?.os === "windows"
|
|
|| globalThis.process?.platform === "win32";
|
|
function caml_raise_nodejs_error(err, raise_unix, cmd){
|
|
var unix_error = caml_named_value("Unix.Unix_error");
|
|
if(raise_unix && unix_error){
|
|
var
|
|
args =
|
|
make_unix_err_args(err.code, cmd || err.syscall, err.path, err.errno);
|
|
caml_raise_with_args(unix_error, args);
|
|
}
|
|
else
|
|
caml_raise_sys_error(err.toString());
|
|
}
|
|
function caml_int64_of_float(x){
|
|
if(x < 0) x = Math.ceil(x);
|
|
return new
|
|
MlInt64
|
|
(x & 0xffffff,
|
|
Math.floor(x * caml_int64_offset) & 0xffffff,
|
|
Math.floor(x * caml_int64_offset * caml_int64_offset) & 0xffff);
|
|
}
|
|
function ocaml_stats_from_node_stats(js_stats, large){
|
|
var file_kind;
|
|
if(js_stats.isFile())
|
|
file_kind = 0;
|
|
else if(js_stats.isDirectory())
|
|
file_kind = 1;
|
|
else if(js_stats.isCharacterDevice())
|
|
file_kind = 2;
|
|
else if(js_stats.isBlockDevice())
|
|
file_kind = 3;
|
|
else if(js_stats.isSymbolicLink())
|
|
file_kind = 4;
|
|
else if(js_stats.isFIFO())
|
|
file_kind = 5;
|
|
else if(js_stats.isSocket()) file_kind = 6;
|
|
return [0,
|
|
js_stats.dev,
|
|
js_stats.ino | 0,
|
|
file_kind,
|
|
js_stats.mode,
|
|
js_stats.nlink,
|
|
js_stats.uid,
|
|
js_stats.gid,
|
|
js_stats.rdev,
|
|
large ? caml_int64_of_float(js_stats.size) : js_stats.size | 0,
|
|
js_stats.atimeMs / 1000,
|
|
js_stats.mtimeMs / 1000,
|
|
js_stats.ctimeMs / 1000];
|
|
}
|
|
function caml_ml_string_length(s){return s.length;}
|
|
function caml_string_unsafe_get(s, i){return s.charCodeAt(i);}
|
|
function caml_uint8_array_of_string(s){
|
|
var l = caml_ml_string_length(s), a = new Uint8Array(l), i = 0;
|
|
for(; i < l; i++) a[i] = caml_string_unsafe_get(s, i);
|
|
return a;
|
|
}
|
|
function caml_bytes_bound_error(){
|
|
caml_invalid_argument("index out of bounds");
|
|
}
|
|
function caml_bytes_unsafe_set(s, i, c){
|
|
c &= 0xff;
|
|
if(s.t !== 4){
|
|
if(i === s.c.length){
|
|
s.c += String.fromCharCode(c);
|
|
if(i + 1 === s.l) s.t = 0;
|
|
return 0;
|
|
}
|
|
caml_convert_bytes_to_array(s);
|
|
}
|
|
s.c[i] = c;
|
|
return 0;
|
|
}
|
|
function caml_bytes_set(s, i, c){
|
|
if(i >>> 0 >= s.l) caml_bytes_bound_error();
|
|
return caml_bytes_unsafe_set(s, i, c);
|
|
}
|
|
class MlNodeFd extends MlFile {
|
|
constructor(fd, flags){
|
|
super();
|
|
this.fs = require("node:fs");
|
|
this.fd = fd;
|
|
this.flags = flags;
|
|
try{
|
|
var stats = this.fs.fstatSync(fd);
|
|
flags.noSeek =
|
|
stats.isCharacterDevice() || stats.isFIFO() || stats.isSocket();
|
|
this.offset = this.flags.append ? stats.size : 0;
|
|
}
|
|
catch(err){flags.noSeek = true; this.offset = 0;}
|
|
this.seeked = false;
|
|
}
|
|
truncate(len, raise_unix){
|
|
try{
|
|
this.fs.ftruncateSync(this.fd, len | 0);
|
|
if(this.offset > len) this.offset = len;
|
|
}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
}
|
|
isatty(){
|
|
var tty = require("node:tty");
|
|
return tty.isatty(this.fd) ? 1 : 0;
|
|
}
|
|
length(){
|
|
try{return this.fs.fstatSync(this.fd).size;}
|
|
catch(err){caml_raise_sys_error(err.toString());}
|
|
}
|
|
write(buf, buf_offset, len, raise_unix){
|
|
try{
|
|
if(this.flags.noSeek || ! this.seeked)
|
|
var written = this.fs.writeSync(this.fd, buf, buf_offset, len);
|
|
else
|
|
var
|
|
written =
|
|
this.fs.writeSync(this.fd, buf, buf_offset, len, this.offset);
|
|
this.offset += written;
|
|
}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
return written;
|
|
}
|
|
read(a, buf_offset, len, raise_unix){
|
|
try{
|
|
if(this.flags.noSeek || ! this.seeked)
|
|
var read = this.fs.readSync(this.fd, a, buf_offset, len);
|
|
else
|
|
var read = this.fs.readSync(this.fd, a, buf_offset, len, this.offset);
|
|
this.offset += read;
|
|
return read;
|
|
}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
}
|
|
seek(offset, whence, raise_unix){
|
|
if(this.flags.noSeek)
|
|
caml_raise_system_error(raise_unix, "ESPIPE", "lseek", "illegal seek");
|
|
switch(whence){
|
|
case 0: break;
|
|
case 1:
|
|
offset += this.offset; break;
|
|
case 2:
|
|
offset += this.length(); break;
|
|
}
|
|
if(offset < 0)
|
|
caml_raise_system_error
|
|
(raise_unix, "EINVAL", "lseek", "invalid argument");
|
|
this.offset = offset;
|
|
this.seeked = true;
|
|
return this.offset;
|
|
}
|
|
pos(){return this.offset;}
|
|
stat(large){
|
|
try{
|
|
var js_stats = this.fs.fstatSync(this.fd);
|
|
return ocaml_stats_from_node_stats(js_stats, large);
|
|
}
|
|
catch(err){caml_raise_nodejs_error(err, 1);}
|
|
}
|
|
chmod(perms){
|
|
try{this.fs.fchmodSync(this.fd, perms); return 0;}
|
|
catch(err){caml_raise_nodejs_error(err, 1);}
|
|
}
|
|
sync(){
|
|
try{this.fs.fsyncSync(this.fd); return 0;}
|
|
catch(err){caml_raise_nodejs_error(err, 1);}
|
|
}
|
|
close(raise_unix){
|
|
try{this.fs.closeSync(this.fd); return 0;}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
}
|
|
check_stream_semantics(cmd){
|
|
try{var js_stats = this.fs.fstatSync(this.fd);}
|
|
catch(err){caml_raise_nodejs_error(err, 1, cmd);}
|
|
if
|
|
(!
|
|
(js_stats.isFile() || js_stats.isCharacterDevice()
|
|
|| js_stats.isFIFO()
|
|
|| js_stats.isSocket()))
|
|
caml_raise_system_error(1, "EINVAL", cmd, "invalid argument");
|
|
}
|
|
}
|
|
class MlNodeDevice{
|
|
constructor(root){this.fs = require("node:fs"); this.root = root;}
|
|
nm(name){return this.root + name;}
|
|
exists(name){
|
|
try{return this.fs.existsSync(this.nm(name)) ? 1 : 0;}
|
|
catch(err){return 0;}
|
|
}
|
|
isFile(name){
|
|
try{return this.fs.statSync(this.nm(name)).isFile() ? 1 : 0;}
|
|
catch(err){caml_raise_sys_error(err.toString());}
|
|
}
|
|
mkdir(name, mode, raise_unix){
|
|
try{this.fs.mkdirSync(this.nm(name), {mode: mode}); return 0;}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
}
|
|
rmdir(name, raise_unix){
|
|
try{this.fs.rmdirSync(this.nm(name)); return 0;}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
}
|
|
readdir(name, raise_unix){
|
|
try{return this.fs.readdirSync(this.nm(name));}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
}
|
|
is_dir(name){
|
|
try{return this.fs.statSync(this.nm(name)).isDirectory() ? 1 : 0;}
|
|
catch(err){caml_raise_sys_error(err.toString());}
|
|
}
|
|
unlink(name, raise_unix){
|
|
try{this.fs.unlinkSync(this.nm(name)); return 0;}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
}
|
|
utimes(name, atime, mtime, raise_unix){
|
|
try{
|
|
if(atime === 0 && mtime === 0){
|
|
atime = new Date().getTime() / 1000;
|
|
mtime = atime;
|
|
}
|
|
this.fs.utimesSync(this.nm(name), atime, mtime);
|
|
return 0;
|
|
}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
}
|
|
truncate(name, len, raise_unix){
|
|
try{this.fs.truncateSync(this.nm(name), len | 0); return 0;}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
}
|
|
access(name, f, raise_unix){
|
|
var consts = this.fs.constants, res = 0;
|
|
for(var key in f)
|
|
switch(key){
|
|
case "r":
|
|
res |= consts.R_OK; break;
|
|
case "w":
|
|
res |= consts.W_OK; break;
|
|
case "x":
|
|
res |= jsoo_is_win32 ? consts.R_OK : consts.X_OK; break;
|
|
case "f":
|
|
res |= consts.F_OK; break;
|
|
}
|
|
try{this.fs.accessSync(this.nm(name), res); return 0;}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
}
|
|
open(name, f, perms, raise_unix){
|
|
var consts = this.fs.constants, res = 0;
|
|
for(var key in f)
|
|
switch(key){
|
|
case "rdonly":
|
|
res |= consts.O_RDONLY; break;
|
|
case "wronly":
|
|
res |= consts.O_WRONLY; break;
|
|
case "rdwr":
|
|
res |= consts.O_RDWR; break;
|
|
case "append":
|
|
res |= consts.O_APPEND; break;
|
|
case "create":
|
|
res |= consts.O_CREAT; break;
|
|
case "truncate":
|
|
res |= consts.O_TRUNC; break;
|
|
case "excl":
|
|
res |= consts.O_EXCL; break;
|
|
case "binary":
|
|
res |= consts.O_BINARY; break;
|
|
case "text":
|
|
res |= consts.O_TEXT; break;
|
|
case "nonblock":
|
|
res |= consts.O_NONBLOCK; break;
|
|
case "noctty":
|
|
res |= consts.O_NOCTTY; break;
|
|
case "dsync":
|
|
res |= consts.O_DSYNC; break;
|
|
case "sync":
|
|
res |= consts.O_SYNC; break;
|
|
}
|
|
try{
|
|
var fd = this.fs.openSync(this.nm(name), res, perms);
|
|
return new MlNodeFd(fd, f);
|
|
}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
}
|
|
slash(name){return /\/$/.test(name) ? name : name + "/";}
|
|
rename(o, n, raise_unix){
|
|
if(jsoo_is_win32)
|
|
try{
|
|
var
|
|
target = this.nm(n),
|
|
source = this.nm(o),
|
|
target_stats,
|
|
source_stats;
|
|
if
|
|
((target_stats = this.fs.statSync(target, {throwIfNoEntry: false}))
|
|
&&
|
|
(source_stats = this.fs.statSync(source, {throwIfNoEntry: false}))
|
|
&& source_stats.isDirectory())
|
|
if(target_stats.isDirectory()){
|
|
if(! this.slash(target).startsWith(this.slash(source)))
|
|
try{this.fs.rmdirSync(target);}catch{}
|
|
}
|
|
else{
|
|
var
|
|
err =
|
|
new
|
|
Error
|
|
(`ENOTDIR: not a directory, rename '${source}' -> '${target}'`);
|
|
throw Object.assign
|
|
(err,
|
|
{errno: - 20,
|
|
code: "ENOTDIR",
|
|
syscall: "rename",
|
|
path: target});
|
|
}
|
|
this.fs.renameSync(this.nm(o), this.nm(n));
|
|
}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
else
|
|
try{this.fs.renameSync(this.nm(o), this.nm(n));}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
}
|
|
stat(name, large, raise_unix){
|
|
try{
|
|
var js_stats = this.fs.statSync(this.nm(name));
|
|
return ocaml_stats_from_node_stats(js_stats, large);
|
|
}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
}
|
|
lstat(name, large, raise_unix){
|
|
try{
|
|
var js_stats = this.fs.lstatSync(this.nm(name));
|
|
return ocaml_stats_from_node_stats(js_stats, large);
|
|
}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
}
|
|
chmod(name, perms, raise_unix){
|
|
try{this.fs.chmodSync(this.nm(name), perms); return 0;}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
}
|
|
link(target, path, raise_unix){
|
|
try{this.fs.linkSync(this.nm(target), this.nm(path)); return 0;}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
}
|
|
symlink(to_dir, target, path, raise_unix){
|
|
try{
|
|
this.fs.symlinkSync
|
|
(target,
|
|
this.nm(path),
|
|
to_dir === 0 ? null : to_dir[1] ? "dir" : "file");
|
|
return 0;
|
|
}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
}
|
|
readlink(name, raise_unix){
|
|
try{
|
|
var link = this.fs.readlinkSync(this.nm(name), "utf8");
|
|
return caml_string_of_jsstring(link);
|
|
}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
}
|
|
opendir(name, raise_unix){
|
|
try{return this.fs.opendirSync(this.nm(name));}
|
|
catch(err){caml_raise_nodejs_error(err, raise_unix);}
|
|
}
|
|
}
|
|
class MlObjectTable{
|
|
constructor(){this.objs = []; this.lookup = new globalThis.Map();}
|
|
store(v){this.lookup.set(v, this.objs.length); this.objs.push(v);}
|
|
recall(v){
|
|
var i = this.lookup.get(v);
|
|
return i === undefined ? undefined : this.objs.length - i;
|
|
}
|
|
}
|
|
var
|
|
caml_packFloat16 =
|
|
function(){
|
|
const INVERSE_OF_EPSILON = 1 / Number.EPSILON;
|
|
function roundTiesToEven(num){
|
|
return num + INVERSE_OF_EPSILON - INVERSE_OF_EPSILON;
|
|
}
|
|
const
|
|
FLOAT16_MIN_VALUE = 6.103515625e-5,
|
|
FLOAT16_MAX_VALUE = 65504,
|
|
FLOAT16_EPSILON = 0.0009765625,
|
|
FLOAT16_EPSILON_MULTIPLIED_BY_FLOAT16_MIN_VALUE = FLOAT16_EPSILON * FLOAT16_MIN_VALUE,
|
|
FLOAT16_EPSILON_DEVIDED_BY_EPSILON =
|
|
FLOAT16_EPSILON * INVERSE_OF_EPSILON;
|
|
function roundToFloat16(num){
|
|
const number = + num;
|
|
if(! Number.isFinite(number) || number === 0) return number;
|
|
const sign = number > 0 ? 1 : - 1, absolute = Math.abs(number);
|
|
if(absolute < FLOAT16_MIN_VALUE)
|
|
return sign
|
|
*
|
|
roundTiesToEven
|
|
(absolute / FLOAT16_EPSILON_MULTIPLIED_BY_FLOAT16_MIN_VALUE)
|
|
* FLOAT16_EPSILON_MULTIPLIED_BY_FLOAT16_MIN_VALUE;
|
|
const
|
|
temp = (1 + FLOAT16_EPSILON_DEVIDED_BY_EPSILON) * absolute,
|
|
result = temp - (temp - absolute);
|
|
if(result > FLOAT16_MAX_VALUE || Number.isNaN(result))
|
|
return sign * Number.POSITIVE_INFINITY;
|
|
return sign * result;
|
|
}
|
|
const
|
|
baseTable = new Uint16Array(512),
|
|
shiftTable = new Uint8Array(512);
|
|
for(let i = 0; i < 256; ++i){
|
|
const e = i - 127;
|
|
if(e < - 24){
|
|
baseTable[i] = 0x0000;
|
|
baseTable[i | 0x100] = 0x8000;
|
|
shiftTable[i] = 24;
|
|
shiftTable[i | 0x100] = 24;
|
|
}
|
|
else if(e < - 14){
|
|
baseTable[i] = 0x0400 >> - e - 14;
|
|
baseTable[i | 0x100] = 0x0400 >> - e - 14 | 0x8000;
|
|
shiftTable[i] = - e - 1;
|
|
shiftTable[i | 0x100] = - e - 1;
|
|
}
|
|
else if(e <= 15){
|
|
baseTable[i] = e + 15 << 10;
|
|
baseTable[i | 0x100] = e + 15 << 10 | 0x8000;
|
|
shiftTable[i] = 13;
|
|
shiftTable[i | 0x100] = 13;
|
|
}
|
|
else if(e < 128){
|
|
baseTable[i] = 0x7c00;
|
|
baseTable[i | 0x100] = 0xfc00;
|
|
shiftTable[i] = 24;
|
|
shiftTable[i | 0x100] = 24;
|
|
}
|
|
else{
|
|
baseTable[i] = 0x7c00;
|
|
baseTable[i | 0x100] = 0xfc00;
|
|
shiftTable[i] = 13;
|
|
shiftTable[i | 0x100] = 13;
|
|
}
|
|
}
|
|
const
|
|
buffer = new ArrayBuffer(4),
|
|
floatView = new Float32Array(buffer),
|
|
uint32View = new Uint32Array(buffer);
|
|
return function(num){
|
|
floatView[0] = roundToFloat16(num);
|
|
const f = uint32View[0], e = f >> 23 & 0x1ff;
|
|
return baseTable[e] + ((f & 0x007fffff) >> shiftTable[e]);};
|
|
}
|
|
(),
|
|
caml_unpackFloat16 =
|
|
function(){
|
|
var
|
|
pow = Math.pow,
|
|
EXP_MASK16 = 31,
|
|
SIGNIFICAND_MASK16 = 1023,
|
|
MIN_SUBNORMAL16 = pow(2, - 24),
|
|
SIGNIFICAND_DENOM16 = 0.0009765625;
|
|
return function(bytes){
|
|
var
|
|
sign = bytes >>> 15,
|
|
exponent = bytes >>> 10 & EXP_MASK16,
|
|
significand = bytes & SIGNIFICAND_MASK16;
|
|
if(exponent === EXP_MASK16)
|
|
return significand === 0
|
|
? sign
|
|
=== 0
|
|
? Number.POSITIVE_INFINITY
|
|
: Number.NEGATIVE_INFINITY
|
|
: Number.NaN;
|
|
if(exponent === 0)
|
|
return significand
|
|
* (sign === 0 ? MIN_SUBNORMAL16 : - MIN_SUBNORMAL16);
|
|
var
|
|
r =
|
|
pow(2, exponent - 15)
|
|
*
|
|
(sign === 0
|
|
? 1 + significand * SIGNIFICAND_DENOM16
|
|
: - 1 - significand * SIGNIFICAND_DENOM16);
|
|
return r;};
|
|
}
|
|
();
|
|
function caml_int64_create_lo_hi(lo, hi){
|
|
return new
|
|
MlInt64
|
|
(lo & 0xffffff,
|
|
lo >>> 24 & 0xff | (hi & 0xffff) << 8,
|
|
hi >>> 16 & 0xffff);
|
|
}
|
|
function caml_int64_hi32(v){return v.hi32();}
|
|
function caml_int64_lo32(v){return v.lo32();}
|
|
function caml_array_bound_error(){
|
|
caml_invalid_argument("index out of bounds");
|
|
}
|
|
var caml_ba_custom_name = "_bigarr02";
|
|
class Ml_Bigarray{
|
|
constructor(kind, layout, dims, buffer){
|
|
this.kind = kind;
|
|
this.layout = layout;
|
|
this.dims = dims;
|
|
this.data = buffer;
|
|
this.caml_custom = caml_ba_custom_name;
|
|
}
|
|
offset(arg){
|
|
var ofs = 0;
|
|
if(typeof arg === "number") arg = [arg];
|
|
if(! Array.isArray(arg))
|
|
caml_invalid_argument("bigarray.js: invalid offset");
|
|
if(this.dims.length !== arg.length)
|
|
caml_invalid_argument("Bigarray.get/set: bad number of dimensions");
|
|
if(this.layout === 0)
|
|
for(var i = 0; i < this.dims.length; i++){
|
|
if(arg[i] < 0 || arg[i] >= this.dims[i]) caml_array_bound_error();
|
|
ofs = ofs * this.dims[i] + arg[i];
|
|
}
|
|
else
|
|
for(var i = this.dims.length - 1; i >= 0; i--){
|
|
if(arg[i] < 1 || arg[i] > this.dims[i]) caml_array_bound_error();
|
|
ofs = ofs * this.dims[i] + (arg[i] - 1);
|
|
}
|
|
return ofs;
|
|
}
|
|
get(ofs){
|
|
switch(this.kind){
|
|
case 7:
|
|
var l = this.data[ofs * 2 + 0], h = this.data[ofs * 2 + 1];
|
|
return caml_int64_create_lo_hi(l, h);
|
|
case 10:
|
|
case 11:
|
|
var r = this.data[ofs * 2 + 0], i = this.data[ofs * 2 + 1];
|
|
return [254, r, i];
|
|
case 13:
|
|
return caml_unpackFloat16(this.data[ofs]);
|
|
default: return this.data[ofs];
|
|
}
|
|
}
|
|
set(ofs, v){
|
|
switch(this.kind){
|
|
case 7:
|
|
this.data[ofs * 2 + 0] = caml_int64_lo32(v);
|
|
this.data[ofs * 2 + 1] = caml_int64_hi32(v);
|
|
break;
|
|
case 10:
|
|
case 11:
|
|
this.data[ofs * 2 + 0] = v[1]; this.data[ofs * 2 + 1] = v[2]; break;
|
|
case 13:
|
|
this.data[ofs] = caml_packFloat16(v); break;
|
|
default: this.data[ofs] = v; break;
|
|
}
|
|
return 0;
|
|
}
|
|
fill(v){
|
|
switch(this.kind){
|
|
case 7:
|
|
var a = caml_int64_lo32(v), b = caml_int64_hi32(v);
|
|
if(a === b)
|
|
this.data.fill(a);
|
|
else
|
|
for(var i = 0; i < this.data.length; i++)
|
|
this.data[i] = i % 2 === 0 ? a : b;
|
|
break;
|
|
case 10:
|
|
case 11:
|
|
var im = v[1], re = v[2];
|
|
if(im === re)
|
|
this.data.fill(im);
|
|
else
|
|
for(var i = 0; i < this.data.length; i++)
|
|
this.data[i] = i % 2 === 0 ? im : re;
|
|
break;
|
|
case 13:
|
|
this.data.fill(caml_packFloat16(v)); break;
|
|
default: this.data.fill(v); break;
|
|
}
|
|
}
|
|
compare(b, total){
|
|
if(this.layout !== b.layout || this.kind !== b.kind){
|
|
var k1 = this.kind | this.layout << 8, k2 = b.kind | b.layout << 8;
|
|
return k2 - k1;
|
|
}
|
|
if(this.dims.length !== b.dims.length)
|
|
return b.dims.length - this.dims.length;
|
|
for(var i = 0; i < this.dims.length; i++)
|
|
if(this.dims[i] !== b.dims[i])
|
|
return this.dims[i] < b.dims[i] ? - 1 : 1;
|
|
switch(this.kind){
|
|
case 0:
|
|
case 1:
|
|
case 10:
|
|
case 11:
|
|
var x, y;
|
|
for(var i = 0; i < this.data.length; i++){
|
|
x = this.data[i];
|
|
y = b.data[i];
|
|
if(x < y) return - 1;
|
|
if(x > y) return 1;
|
|
if(x !== y){
|
|
if(! total) return Number.NaN;
|
|
if(! Number.isNaN(x)) return 1;
|
|
if(! Number.isNaN(y)) return - 1;
|
|
}
|
|
}
|
|
break;
|
|
case 7:
|
|
for(var i = 0; i < this.data.length; i += 2){
|
|
if(this.data[i + 1] < b.data[i + 1]) return - 1;
|
|
if(this.data[i + 1] > b.data[i + 1]) return 1;
|
|
if(this.data[i] >>> 0 < b.data[i] >>> 0) return - 1;
|
|
if(this.data[i] >>> 0 > b.data[i] >>> 0) return 1;
|
|
}
|
|
break;
|
|
case 13:
|
|
for(var i = 0; i < this.data.length; i++){
|
|
var
|
|
aa = caml_unpackFloat16(this.data[i]),
|
|
bb = caml_unpackFloat16(b.data[i]);
|
|
if(aa < bb) return - 1;
|
|
if(aa > bb) return 1;
|
|
}
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
case 8:
|
|
case 9:
|
|
case 12:
|
|
for(var i = 0; i < this.data.length; i++){
|
|
if(this.data[i] < b.data[i]) return - 1;
|
|
if(this.data[i] > b.data[i]) return 1;
|
|
}
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
class Ml_Bigarray_c_1_1 extends Ml_Bigarray {
|
|
offset(arg){
|
|
if(typeof arg !== "number")
|
|
if(Array.isArray(arg) && arg.length === 1)
|
|
arg = arg[0];
|
|
else
|
|
caml_invalid_argument("Ml_Bigarray_c_1_1.offset");
|
|
if(arg < 0 || arg >= this.dims[0]) caml_array_bound_error();
|
|
return arg;
|
|
}
|
|
get(ofs){return this.data[ofs];}
|
|
set(ofs, v){this.data[ofs] = v; return 0;}
|
|
fill(v){this.data.fill(v); return 0;}
|
|
}
|
|
function caml_string_of_uint8_array(a){
|
|
return caml_sub_uint8_array_to_jsbytes(a, 0, a.length);
|
|
}
|
|
class UInt8ArrayReader{
|
|
constructor(s, i){this.s = s; this.i = i;}
|
|
read8u(){return this.s[this.i++];}
|
|
read8s(){return this.s[this.i++] << 24 >> 24;}
|
|
read16u(){
|
|
var s = this.s, i = this.i;
|
|
this.i = i + 2;
|
|
return s[i] << 8 | s[i + 1];
|
|
}
|
|
read16s(){
|
|
var s = this.s, i = this.i;
|
|
this.i = i + 2;
|
|
return s[i] << 24 >> 16 | s[i + 1];
|
|
}
|
|
read32u(){
|
|
var s = this.s, i = this.i;
|
|
this.i = i + 4;
|
|
return (s[i] << 24 | s[i + 1] << 16 | s[i + 2] << 8 | s[i + 3]) >>> 0;
|
|
}
|
|
read32s(){
|
|
var s = this.s, i = this.i;
|
|
this.i = i + 4;
|
|
return s[i] << 24 | s[i + 1] << 16 | s[i + 2] << 8 | s[i + 3];
|
|
}
|
|
readstr(len){
|
|
var i = this.i;
|
|
this.i = i + len;
|
|
return caml_string_of_uint8_array(this.s.subarray(i, i + len));
|
|
}
|
|
readuint8array(len){
|
|
var i = this.i;
|
|
this.i = i + len;
|
|
return this.s.subarray(i, i + len);
|
|
}
|
|
}
|
|
function incr_nat(nat, ofs, len, carry_in){
|
|
var carry = carry_in;
|
|
for(var i = 0; i < len; i++){
|
|
var x = (nat.data[ofs + i] >>> 0) + carry;
|
|
nat.data[ofs + i] = x | 0;
|
|
if(x === x >>> 0){carry = 0; break;} else carry = 1;
|
|
}
|
|
return carry;
|
|
}
|
|
function add_nat(nat1, ofs1, len1, nat2, ofs2, len2, carry_in){
|
|
var carry = carry_in;
|
|
for(var i = 0; i < len2; i++){
|
|
var
|
|
x = (nat1.data[ofs1 + i] >>> 0) + (nat2.data[ofs2 + i] >>> 0) + carry;
|
|
nat1.data[ofs1 + i] = x;
|
|
if(x === x >>> 0) carry = 0; else carry = 1;
|
|
}
|
|
return incr_nat(nat1, ofs1 + len2, len1 - len2, carry);
|
|
}
|
|
function caml_ba_get_size(dims){
|
|
var n_dims = dims.length, size = 1;
|
|
for(var i = 0; i < n_dims; i++){
|
|
if(dims[i] < 0)
|
|
caml_invalid_argument("Bigarray.create: negative dimension");
|
|
size = size * dims[i];
|
|
}
|
|
return size;
|
|
}
|
|
function caml_ba_get_size_per_element(kind){
|
|
switch(kind){case 7:case 10:case 11: return 2;default: return 1;
|
|
}
|
|
}
|
|
function caml_ba_create_unsafe(kind, layout, dims, data){
|
|
var size_per_element = caml_ba_get_size_per_element(kind);
|
|
if(caml_ba_get_size(dims) * size_per_element !== data.length)
|
|
caml_invalid_argument("length doesn't match dims");
|
|
if
|
|
(layout === 0 && dims.length === 1 && size_per_element === 1
|
|
&& kind !== 13)
|
|
return new Ml_Bigarray_c_1_1(kind, layout, dims, data);
|
|
return new Ml_Bigarray(kind, layout, dims, data);
|
|
}
|
|
function bigstring_of_array_buffer(ab){
|
|
var ta = new Uint8Array(ab);
|
|
return caml_ba_create_unsafe(12, 0, [ta.length], ta);
|
|
}
|
|
function bigstring_of_typed_array(ba){
|
|
var
|
|
ta =
|
|
new
|
|
Uint8Array
|
|
(ba.buffer, ba.byteOffset, ba.length * ba.BYTES_PER_ELEMENT);
|
|
return caml_ba_create_unsafe(12, 0, [ta.length], ta);
|
|
}
|
|
function bigstring_to_array_buffer(bs){return bs.data.buffer;}
|
|
function bigstring_to_typed_array(bs){return bs.data;}
|
|
var
|
|
blake2b =
|
|
function(){
|
|
function ADD64AA(v, a, b){
|
|
const o0 = v[a] + v[b];
|
|
let o1 = v[a + 1] + v[b + 1];
|
|
if(o0 >= 0x100000000) o1++;
|
|
v[a] = o0;
|
|
v[a + 1] = o1;
|
|
}
|
|
function ADD64AC(v, a, b0, b1){
|
|
let o0 = v[a] + b0;
|
|
if(b0 < 0) o0 += 0x100000000;
|
|
let o1 = v[a + 1] + b1;
|
|
if(o0 >= 0x100000000) o1++;
|
|
v[a] = o0;
|
|
v[a + 1] = o1;
|
|
}
|
|
function B2B_GET32(arr, i){
|
|
return arr[i] ^ arr[i + 1] << 8 ^ arr[i + 2] << 16 ^ arr[i + 3] << 24;
|
|
}
|
|
function B2B_G(a, b, c, d, ix, iy){
|
|
const x0 = m[ix], x1 = m[ix + 1], y0 = m[iy], y1 = m[iy + 1];
|
|
ADD64AA(v, a, b);
|
|
ADD64AC(v, a, x0, x1);
|
|
let xor0 = v[d] ^ v[a], xor1 = v[d + 1] ^ v[a + 1];
|
|
v[d] = xor1;
|
|
v[d + 1] = xor0;
|
|
ADD64AA(v, c, d);
|
|
xor0 = v[b] ^ v[c];
|
|
xor1 = v[b + 1] ^ v[c + 1];
|
|
v[b] = xor0 >>> 24 ^ xor1 << 8;
|
|
v[b + 1] = xor1 >>> 24 ^ xor0 << 8;
|
|
ADD64AA(v, a, b);
|
|
ADD64AC(v, a, y0, y1);
|
|
xor0 = v[d] ^ v[a];
|
|
xor1 = v[d + 1] ^ v[a + 1];
|
|
v[d] = xor0 >>> 16 ^ xor1 << 16;
|
|
v[d + 1] = xor1 >>> 16 ^ xor0 << 16;
|
|
ADD64AA(v, c, d);
|
|
xor0 = v[b] ^ v[c];
|
|
xor1 = v[b + 1] ^ v[c + 1];
|
|
v[b] = xor1 >>> 31 ^ xor0 << 1;
|
|
v[b + 1] = xor0 >>> 31 ^ xor1 << 1;
|
|
}
|
|
const
|
|
BLAKE2B_IV32 =
|
|
new
|
|
Uint32Array
|
|
([0xf3bcc908,
|
|
0x6a09e667,
|
|
0x84caa73b,
|
|
0xbb67ae85,
|
|
0xfe94f82b,
|
|
0x3c6ef372,
|
|
0x5f1d36f1,
|
|
0xa54ff53a,
|
|
0xade682d1,
|
|
0x510e527f,
|
|
0x2b3e6c1f,
|
|
0x9b05688c,
|
|
0xfb41bd6b,
|
|
0x1f83d9ab,
|
|
0x137e2179,
|
|
0x5be0cd19]),
|
|
SIGMA8 =
|
|
[0,
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7,
|
|
8,
|
|
9,
|
|
10,
|
|
11,
|
|
12,
|
|
13,
|
|
14,
|
|
15,
|
|
14,
|
|
10,
|
|
4,
|
|
8,
|
|
9,
|
|
15,
|
|
13,
|
|
6,
|
|
1,
|
|
12,
|
|
0,
|
|
2,
|
|
11,
|
|
7,
|
|
5,
|
|
3,
|
|
11,
|
|
8,
|
|
12,
|
|
0,
|
|
5,
|
|
2,
|
|
15,
|
|
13,
|
|
10,
|
|
14,
|
|
3,
|
|
6,
|
|
7,
|
|
1,
|
|
9,
|
|
4,
|
|
7,
|
|
9,
|
|
3,
|
|
1,
|
|
13,
|
|
12,
|
|
11,
|
|
14,
|
|
2,
|
|
6,
|
|
5,
|
|
10,
|
|
4,
|
|
0,
|
|
15,
|
|
8,
|
|
9,
|
|
0,
|
|
5,
|
|
7,
|
|
2,
|
|
4,
|
|
10,
|
|
15,
|
|
14,
|
|
1,
|
|
11,
|
|
12,
|
|
6,
|
|
8,
|
|
3,
|
|
13,
|
|
2,
|
|
12,
|
|
6,
|
|
10,
|
|
0,
|
|
11,
|
|
8,
|
|
3,
|
|
4,
|
|
13,
|
|
7,
|
|
5,
|
|
15,
|
|
14,
|
|
1,
|
|
9,
|
|
12,
|
|
5,
|
|
1,
|
|
15,
|
|
14,
|
|
13,
|
|
4,
|
|
10,
|
|
0,
|
|
7,
|
|
6,
|
|
3,
|
|
9,
|
|
2,
|
|
8,
|
|
11,
|
|
13,
|
|
11,
|
|
7,
|
|
14,
|
|
12,
|
|
1,
|
|
3,
|
|
9,
|
|
5,
|
|
0,
|
|
15,
|
|
4,
|
|
8,
|
|
6,
|
|
2,
|
|
10,
|
|
6,
|
|
15,
|
|
14,
|
|
9,
|
|
11,
|
|
3,
|
|
0,
|
|
8,
|
|
12,
|
|
2,
|
|
13,
|
|
7,
|
|
1,
|
|
4,
|
|
10,
|
|
5,
|
|
10,
|
|
2,
|
|
8,
|
|
4,
|
|
7,
|
|
6,
|
|
1,
|
|
5,
|
|
15,
|
|
11,
|
|
9,
|
|
14,
|
|
3,
|
|
12,
|
|
13,
|
|
0,
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7,
|
|
8,
|
|
9,
|
|
10,
|
|
11,
|
|
12,
|
|
13,
|
|
14,
|
|
15,
|
|
14,
|
|
10,
|
|
4,
|
|
8,
|
|
9,
|
|
15,
|
|
13,
|
|
6,
|
|
1,
|
|
12,
|
|
0,
|
|
2,
|
|
11,
|
|
7,
|
|
5,
|
|
3],
|
|
SIGMA82 = new Uint8Array(SIGMA8.map(function(x){return x * 2;})),
|
|
v = new Uint32Array(32),
|
|
m = new Uint32Array(32);
|
|
function blake2bCompress(ctx, last){
|
|
let i = 0;
|
|
for(i = 0; i < 16; i++){
|
|
v[i] = ctx.h[i];
|
|
v[i + 16] = BLAKE2B_IV32[i];
|
|
}
|
|
v[24] = v[24] ^ ctx.t;
|
|
v[25] = v[25] ^ ctx.t / 0x100000000;
|
|
if(last){v[28] = ~ v[28]; v[29] = ~ v[29];}
|
|
for(i = 0; i < 32; i++) m[i] = B2B_GET32(ctx.b, 4 * i);
|
|
for(i = 0; i < 12; i++){
|
|
B2B_G(0, 8, 16, 24, SIGMA82[i * 16 + 0], SIGMA82[i * 16 + 1]);
|
|
B2B_G(2, 10, 18, 26, SIGMA82[i * 16 + 2], SIGMA82[i * 16 + 3]);
|
|
B2B_G(4, 12, 20, 28, SIGMA82[i * 16 + 4], SIGMA82[i * 16 + 5]);
|
|
B2B_G(6, 14, 22, 30, SIGMA82[i * 16 + 6], SIGMA82[i * 16 + 7]);
|
|
B2B_G(0, 10, 20, 30, SIGMA82[i * 16 + 8], SIGMA82[i * 16 + 9]);
|
|
B2B_G(2, 12, 22, 24, SIGMA82[i * 16 + 10], SIGMA82[i * 16 + 11]);
|
|
B2B_G(4, 14, 16, 26, SIGMA82[i * 16 + 12], SIGMA82[i * 16 + 13]);
|
|
B2B_G(6, 8, 18, 28, SIGMA82[i * 16 + 14], SIGMA82[i * 16 + 15]);
|
|
}
|
|
for(i = 0; i < 16; i++) ctx.h[i] = ctx.h[i] ^ v[i] ^ v[i + 16];
|
|
}
|
|
const
|
|
parameterBlock =
|
|
new
|
|
Uint8Array
|
|
([0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0]);
|
|
function blake2bInit(outlen, key){
|
|
if(outlen === 0 || outlen > 64)
|
|
throw new Error("Illegal output length, expected 0 < length <= 64");
|
|
if(key.length > 64)
|
|
throw new
|
|
Error
|
|
("Illegal key, expected Uint8Array with 0 < length <= 64");
|
|
const
|
|
ctx =
|
|
{b: new Uint8Array(128),
|
|
h: new Uint32Array(16),
|
|
t: 0,
|
|
c: 0,
|
|
outlen: outlen};
|
|
parameterBlock.fill(0);
|
|
parameterBlock[0] = outlen;
|
|
parameterBlock[1] = key.length;
|
|
parameterBlock[2] = 1;
|
|
parameterBlock[3] = 1;
|
|
for(let i = 0; i < 16; i++)
|
|
ctx.h[i] = BLAKE2B_IV32[i] ^ B2B_GET32(parameterBlock, i * 4);
|
|
if(key.length > 0){blake2bUpdate(ctx, key); ctx.c = 128;}
|
|
return ctx;
|
|
}
|
|
function blake2bUpdate(ctx, input){
|
|
for(let i = 0; i < input.length; i++){
|
|
if(ctx.c === 128){
|
|
ctx.t += ctx.c;
|
|
blake2bCompress(ctx, false);
|
|
ctx.c = 0;
|
|
}
|
|
ctx.b[ctx.c++] = input[i];
|
|
}
|
|
}
|
|
function blake2bFinal(ctx){
|
|
ctx.t += ctx.c;
|
|
while(ctx.c < 128) ctx.b[ctx.c++] = 0;
|
|
blake2bCompress(ctx, true);
|
|
const out = new Uint8Array(ctx.outlen);
|
|
for(let i = 0; i < ctx.outlen; i++)
|
|
out[i] = ctx.h[i >> 2] >> 8 * (i & 3);
|
|
return out;
|
|
}
|
|
return {Init: blake2bInit, Update: blake2bUpdate, Final: blake2bFinal};
|
|
}
|
|
();
|
|
function blit_nat(nat1, ofs1, nat2, ofs2, len){
|
|
for(var i = 0; i < len; i++) nat1.data[ofs1 + i] = nat2.data[ofs2 + i];
|
|
return 0;
|
|
}
|
|
var
|
|
caml_MD5Transform =
|
|
function(){
|
|
function add(x, y){return x + y | 0;}
|
|
function xx(q, a, b, x, s, t){
|
|
a = add(add(a, q), add(x, t));
|
|
return add(a << s | a >>> 32 - s, b);
|
|
}
|
|
function ff(a, b, c, d, x, s, t){
|
|
return xx(b & c | ~ b & d, a, b, x, s, t);
|
|
}
|
|
function gg(a, b, c, d, x, s, t){
|
|
return xx(b & d | c & ~ d, a, b, x, s, t);
|
|
}
|
|
function hh(a, b, c, d, x, s, t){return xx(b ^ c ^ d, a, b, x, s, t);}
|
|
function ii(a, b, c, d, x, s, t){
|
|
return xx(c ^ (b | ~ d), a, b, x, s, t);
|
|
}
|
|
return function(w, buffer){
|
|
var a = w[0], b = w[1], c = w[2], d = w[3];
|
|
a = ff(a, b, c, d, buffer[0], 7, 0xd76aa478);
|
|
d = ff(d, a, b, c, buffer[1], 12, 0xe8c7b756);
|
|
c = ff(c, d, a, b, buffer[2], 17, 0x242070db);
|
|
b = ff(b, c, d, a, buffer[3], 22, 0xc1bdceee);
|
|
a = ff(a, b, c, d, buffer[4], 7, 0xf57c0faf);
|
|
d = ff(d, a, b, c, buffer[5], 12, 0x4787c62a);
|
|
c = ff(c, d, a, b, buffer[6], 17, 0xa8304613);
|
|
b = ff(b, c, d, a, buffer[7], 22, 0xfd469501);
|
|
a = ff(a, b, c, d, buffer[8], 7, 0x698098d8);
|
|
d = ff(d, a, b, c, buffer[9], 12, 0x8b44f7af);
|
|
c = ff(c, d, a, b, buffer[10], 17, 0xffff5bb1);
|
|
b = ff(b, c, d, a, buffer[11], 22, 0x895cd7be);
|
|
a = ff(a, b, c, d, buffer[12], 7, 0x6b901122);
|
|
d = ff(d, a, b, c, buffer[13], 12, 0xfd987193);
|
|
c = ff(c, d, a, b, buffer[14], 17, 0xa679438e);
|
|
b = ff(b, c, d, a, buffer[15], 22, 0x49b40821);
|
|
a = gg(a, b, c, d, buffer[1], 5, 0xf61e2562);
|
|
d = gg(d, a, b, c, buffer[6], 9, 0xc040b340);
|
|
c = gg(c, d, a, b, buffer[11], 14, 0x265e5a51);
|
|
b = gg(b, c, d, a, buffer[0], 20, 0xe9b6c7aa);
|
|
a = gg(a, b, c, d, buffer[5], 5, 0xd62f105d);
|
|
d = gg(d, a, b, c, buffer[10], 9, 0x02441453);
|
|
c = gg(c, d, a, b, buffer[15], 14, 0xd8a1e681);
|
|
b = gg(b, c, d, a, buffer[4], 20, 0xe7d3fbc8);
|
|
a = gg(a, b, c, d, buffer[9], 5, 0x21e1cde6);
|
|
d = gg(d, a, b, c, buffer[14], 9, 0xc33707d6);
|
|
c = gg(c, d, a, b, buffer[3], 14, 0xf4d50d87);
|
|
b = gg(b, c, d, a, buffer[8], 20, 0x455a14ed);
|
|
a = gg(a, b, c, d, buffer[13], 5, 0xa9e3e905);
|
|
d = gg(d, a, b, c, buffer[2], 9, 0xfcefa3f8);
|
|
c = gg(c, d, a, b, buffer[7], 14, 0x676f02d9);
|
|
b = gg(b, c, d, a, buffer[12], 20, 0x8d2a4c8a);
|
|
a = hh(a, b, c, d, buffer[5], 4, 0xfffa3942);
|
|
d = hh(d, a, b, c, buffer[8], 11, 0x8771f681);
|
|
c = hh(c, d, a, b, buffer[11], 16, 0x6d9d6122);
|
|
b = hh(b, c, d, a, buffer[14], 23, 0xfde5380c);
|
|
a = hh(a, b, c, d, buffer[1], 4, 0xa4beea44);
|
|
d = hh(d, a, b, c, buffer[4], 11, 0x4bdecfa9);
|
|
c = hh(c, d, a, b, buffer[7], 16, 0xf6bb4b60);
|
|
b = hh(b, c, d, a, buffer[10], 23, 0xbebfbc70);
|
|
a = hh(a, b, c, d, buffer[13], 4, 0x289b7ec6);
|
|
d = hh(d, a, b, c, buffer[0], 11, 0xeaa127fa);
|
|
c = hh(c, d, a, b, buffer[3], 16, 0xd4ef3085);
|
|
b = hh(b, c, d, a, buffer[6], 23, 0x04881d05);
|
|
a = hh(a, b, c, d, buffer[9], 4, 0xd9d4d039);
|
|
d = hh(d, a, b, c, buffer[12], 11, 0xe6db99e5);
|
|
c = hh(c, d, a, b, buffer[15], 16, 0x1fa27cf8);
|
|
b = hh(b, c, d, a, buffer[2], 23, 0xc4ac5665);
|
|
a = ii(a, b, c, d, buffer[0], 6, 0xf4292244);
|
|
d = ii(d, a, b, c, buffer[7], 10, 0x432aff97);
|
|
c = ii(c, d, a, b, buffer[14], 15, 0xab9423a7);
|
|
b = ii(b, c, d, a, buffer[5], 21, 0xfc93a039);
|
|
a = ii(a, b, c, d, buffer[12], 6, 0x655b59c3);
|
|
d = ii(d, a, b, c, buffer[3], 10, 0x8f0ccc92);
|
|
c = ii(c, d, a, b, buffer[10], 15, 0xffeff47d);
|
|
b = ii(b, c, d, a, buffer[1], 21, 0x85845dd1);
|
|
a = ii(a, b, c, d, buffer[8], 6, 0x6fa87e4f);
|
|
d = ii(d, a, b, c, buffer[15], 10, 0xfe2ce6e0);
|
|
c = ii(c, d, a, b, buffer[6], 15, 0xa3014314);
|
|
b = ii(b, c, d, a, buffer[13], 21, 0x4e0811a1);
|
|
a = ii(a, b, c, d, buffer[4], 6, 0xf7537e82);
|
|
d = ii(d, a, b, c, buffer[11], 10, 0xbd3af235);
|
|
c = ii(c, d, a, b, buffer[2], 15, 0x2ad7d2bb);
|
|
b = ii(b, c, d, a, buffer[9], 21, 0xeb86d391);
|
|
w[0] = add(a, w[0]);
|
|
w[1] = add(b, w[1]);
|
|
w[2] = add(c, w[2]);
|
|
w[3] = add(d, w[3]);};
|
|
}
|
|
();
|
|
function caml_MD5Final(ctx){
|
|
var in_buf = ctx.len & 0x3f;
|
|
ctx.b8[in_buf] = 0x80;
|
|
in_buf++;
|
|
if(in_buf > 56){
|
|
for(var j = in_buf; j < 64; j++) ctx.b8[j] = 0;
|
|
caml_MD5Transform(ctx.w, ctx.b32);
|
|
for(var j = 0; j < 56; j++) ctx.b8[j] = 0;
|
|
}
|
|
else
|
|
for(var j = in_buf; j < 56; j++) ctx.b8[j] = 0;
|
|
ctx.b32[14] = ctx.len << 3;
|
|
ctx.b32[15] = ctx.len >> 29 & 0x1fffffff;
|
|
caml_MD5Transform(ctx.w, ctx.b32);
|
|
var t = new Uint8Array(16);
|
|
for(var i = 0; i < 4; i++)
|
|
for(var j = 0; j < 4; j++) t[i * 4 + j] = ctx.w[i] >> 8 * j & 0xff;
|
|
return t;
|
|
}
|
|
function caml_MD5Init(){
|
|
var
|
|
buffer = new ArrayBuffer(64),
|
|
b32 = new Uint32Array(buffer),
|
|
b8 = new Uint8Array(buffer);
|
|
return {len: 0,
|
|
w:
|
|
new Uint32Array([0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476]),
|
|
b32: b32,
|
|
b8: b8};
|
|
}
|
|
function caml_MD5Update(ctx, input, input_len){
|
|
var in_buf = ctx.len & 0x3f, input_pos = 0;
|
|
ctx.len += input_len;
|
|
if(in_buf){
|
|
var missing = 64 - in_buf;
|
|
if(input_len < missing){
|
|
ctx.b8.set(input.subarray(0, input_len), in_buf);
|
|
return;
|
|
}
|
|
ctx.b8.set(input.subarray(0, missing), in_buf);
|
|
caml_MD5Transform(ctx.w, ctx.b32);
|
|
input_len -= missing;
|
|
input_pos += missing;
|
|
}
|
|
while(input_len >= 64){
|
|
ctx.b8.set(input.subarray(input_pos, input_pos + 64), 0);
|
|
caml_MD5Transform(ctx.w, ctx.b32);
|
|
input_len -= 64;
|
|
input_pos += 64;
|
|
}
|
|
if(input_len)
|
|
ctx.b8.set(input.subarray(input_pos, input_pos + input_len), 0);
|
|
}
|
|
function caml_acosh_float(x){return Math.acosh(x);}
|
|
function caml_call_gen(f, args){
|
|
var
|
|
n = f.l >= 0 ? f.l : f.l = f.length,
|
|
argsLen = args.length,
|
|
d = n - argsLen;
|
|
if(d === 0)
|
|
return f(...args);
|
|
else if(d < 0){
|
|
var g = f(...args.slice(0, n));
|
|
if(typeof g !== "function") return g;
|
|
return caml_call_gen(g, args.slice(n));
|
|
}
|
|
else{
|
|
switch(d){
|
|
case 1:
|
|
{
|
|
var
|
|
g =
|
|
function(x){
|
|
var nargs = new Array(argsLen + 1);
|
|
for(var i = 0; i < argsLen; i++) nargs[i] = args[i];
|
|
nargs[argsLen] = x;
|
|
return f(...nargs);
|
|
};
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
var
|
|
g =
|
|
function(x, y){
|
|
var nargs = new Array(argsLen + 2);
|
|
for(var i = 0; i < argsLen; i++) nargs[i] = args[i];
|
|
nargs[argsLen] = x;
|
|
nargs[argsLen + 1] = y;
|
|
return f(...nargs);
|
|
};
|
|
break;
|
|
}
|
|
default:
|
|
var
|
|
g =
|
|
function(...extra_args){
|
|
if(extra_args.length === 0) extra_args = [undefined];
|
|
return caml_call_gen(f, args.concat(extra_args));
|
|
};
|
|
}
|
|
g.l = d;
|
|
return g;
|
|
}
|
|
}
|
|
function caml_alloc_dummy_infix(){
|
|
return function f(x){return caml_call_gen(f.fun, [x]);};
|
|
}
|
|
function caml_alloc_stack(_hv, _hx, _hf){return 0;}
|
|
var
|
|
caml_argv =
|
|
function(){
|
|
var process = globalThis.process, main = "a.out", args = [];
|
|
if(process?.argv?.length > 1){
|
|
var argv = process.argv;
|
|
main = argv[1];
|
|
args = argv.slice(2);
|
|
}
|
|
var p = caml_string_of_jsstring(main), args2 = [0, p];
|
|
for(var i = 0; i < args.length; i++)
|
|
args2.push(caml_string_of_jsstring(args[i]));
|
|
return args2;
|
|
}
|
|
();
|
|
function caml_array_append(a1, a2){
|
|
var l1 = a1.length, l2 = a2.length, l = l1 + l2 - 1, a = new Array(l);
|
|
a[0] = 0;
|
|
var i = 1, j = 1;
|
|
for(; i < l1; i++) a[i] = a1[i];
|
|
for(; i < l; i++, j++) a[i] = a2[j];
|
|
return a;
|
|
}
|
|
function caml_array_blit(a1, i1, a2, i2, len){
|
|
if(i2 <= i1)
|
|
for(var j = 1; j <= len; j++) a2[i2 + j] = a1[i1 + j];
|
|
else
|
|
for(var j = len; j >= 1; j--) a2[i2 + j] = a1[i1 + j];
|
|
return 0;
|
|
}
|
|
function caml_array_concat(l){
|
|
var a = [0];
|
|
while(l !== 0){
|
|
var b = l[1];
|
|
for(var i = 1; i < b.length; i++) a.push(b[i]);
|
|
l = l[2];
|
|
}
|
|
return a;
|
|
}
|
|
function caml_array_fill(array, ofs, len, v){
|
|
for(var i = 0; i < len; i++) array[ofs + i + 1] = v;
|
|
return 0;
|
|
}
|
|
function caml_array_get(array, index){
|
|
if(index < 0 || index >= array.length - 1) caml_array_bound_error();
|
|
return array[index + 1];
|
|
}
|
|
function caml_array_make(len, init){
|
|
if(len >>> 0 >= (0x7fffffff / 4 | 0)) caml_array_bound_error();
|
|
var len = len + 1 | 0, b = new Array(len);
|
|
b[0] = 0;
|
|
for(var i = 1; i < len; i++) b[i] = init;
|
|
return b;
|
|
}
|
|
function caml_array_of_bytes(x){return caml_uint8_array_of_bytes(x);}
|
|
function caml_array_of_string(x){return caml_uint8_array_of_string(x);}
|
|
function caml_array_set(array, index, newval){
|
|
if(index < 0 || index >= array.length - 1) caml_array_bound_error();
|
|
array[index + 1] = newval;
|
|
return 0;
|
|
}
|
|
function caml_array_sub(a, i, len){
|
|
var a2 = new Array(len + 1);
|
|
a2[0] = 0;
|
|
for(var i2 = 1, i1 = i + 1; i2 <= len; i2++, i1++) a2[i2] = a[i1];
|
|
return a2;
|
|
}
|
|
function caml_asinh_float(x){return Math.asinh(x);}
|
|
function caml_atanh_float(x){return Math.atanh(x);}
|
|
function caml_atomic_cas(ref, o, n){
|
|
if(ref[1] === o){ref[1] = n; return 1;}
|
|
return 0;
|
|
}
|
|
function caml_atomic_exchange(ref, v){
|
|
var r = ref[1];
|
|
ref[1] = v;
|
|
return r;
|
|
}
|
|
function caml_atomic_fetch_add(ref, i){
|
|
var old = ref[1];
|
|
ref[1] += i;
|
|
return old;
|
|
}
|
|
function caml_atomic_load(ref){return ref[1];}
|
|
function caml_atomic_make_contended(a){return [0, a];}
|
|
function caml_ba_blit(src, dst){
|
|
if(dst.dims.length !== src.dims.length)
|
|
caml_invalid_argument("Bigarray.blit: dimension mismatch");
|
|
for(var i = 0; i < dst.dims.length; i++)
|
|
if(dst.dims[i] !== src.dims[i])
|
|
caml_invalid_argument("Bigarray.blit: dimension mismatch");
|
|
dst.data.set(src.data);
|
|
return 0;
|
|
}
|
|
function caml_ba_change_layout(ba, layout){
|
|
if(ba.layout === layout) return ba;
|
|
var new_dims = [];
|
|
for(var i = 0; i < ba.dims.length; i++)
|
|
new_dims[i] = ba.dims[ba.dims.length - i - 1];
|
|
return caml_ba_create_unsafe(ba.kind, layout, new_dims, ba.data);
|
|
}
|
|
function caml_ba_compare(a, b, total){return a.compare(b, total);}
|
|
function caml_ba_create_buffer(kind, size){
|
|
var view;
|
|
switch(kind){
|
|
case 0:
|
|
view = Float32Array; break;
|
|
case 1:
|
|
view = Float64Array; break;
|
|
case 2:
|
|
view = Int8Array; break;
|
|
case 3:
|
|
view = Uint8Array; break;
|
|
case 4:
|
|
view = Int16Array; break;
|
|
case 5:
|
|
view = Uint16Array; break;
|
|
case 6:
|
|
view = Int32Array; break;
|
|
case 7:
|
|
view = Int32Array; break;
|
|
case 8:
|
|
view = Int32Array; break;
|
|
case 9:
|
|
view = Int32Array; break;
|
|
case 10:
|
|
view = Float32Array; break;
|
|
case 11:
|
|
view = Float64Array; break;
|
|
case 12:
|
|
view = Uint8Array; break;
|
|
case 13:
|
|
view = Uint16Array; break;
|
|
}
|
|
if(! view) caml_invalid_argument("Bigarray.create: unsupported kind");
|
|
var data = new view(size * caml_ba_get_size_per_element(kind));
|
|
return data;
|
|
}
|
|
function caml_js_from_array(a){return a.slice(1);}
|
|
function caml_ba_create(kind, layout, dims_ml){
|
|
var
|
|
dims = caml_js_from_array(dims_ml),
|
|
data = caml_ba_create_buffer(kind, caml_ba_get_size(dims));
|
|
return caml_ba_create_unsafe(kind, layout, dims, data);
|
|
}
|
|
function caml_ba_create_from(data1, data2, _jstyp, kind, layout, dims){
|
|
if(data2 || caml_ba_get_size_per_element(kind) === 2)
|
|
caml_invalid_argument
|
|
("caml_ba_create_from: use return caml_ba_create_unsafe");
|
|
return caml_ba_create_unsafe(kind, layout, dims, data1);
|
|
}
|
|
var jsoo_dataview = new DataView(new ArrayBuffer(8));
|
|
function caml_int32_float_of_bits(x){
|
|
jsoo_dataview.setUint32(0, x, true);
|
|
return jsoo_dataview.getFloat32(0, true);
|
|
}
|
|
function caml_int64_of_bytes(a){
|
|
return new
|
|
MlInt64
|
|
(a[7] << 0 | a[6] << 8 | a[5] << 16,
|
|
a[4] << 0 | a[3] << 8 | a[2] << 16,
|
|
a[1] << 0 | a[0] << 8);
|
|
}
|
|
function caml_int64_float_of_bits(x){
|
|
var lo = x.lo, mi = x.mi, hi = x.hi;
|
|
if((hi & 0x7ff8) === 0x7ff0 && (mi | lo | hi & 0xf) !== 0) hi |= 8;
|
|
jsoo_dataview.setUint32(0, lo | mi << 24, true);
|
|
jsoo_dataview.setUint32(4, mi >>> 8 | hi << 16, true);
|
|
return jsoo_dataview.getFloat64(0, true);
|
|
}
|
|
function caml_failwith(msg){
|
|
if(! caml_global_data.Failure)
|
|
caml_global_data.Failure = [248, caml_string_of_jsbytes("Failure"), - 3];
|
|
caml_raise_with_string(caml_global_data.Failure, msg);
|
|
}
|
|
function caml_ba_deserialize(reader, sz, name){
|
|
var num_dims = reader.read32s();
|
|
if(num_dims < 0 || num_dims > 16)
|
|
caml_failwith("input_value: wrong number of bigarray dimensions");
|
|
var
|
|
tag = reader.read32s(),
|
|
kind = tag & 0xff,
|
|
layout = tag >> 8 & 1,
|
|
dims = [];
|
|
if(name === "_bigarr02")
|
|
for(var i = 0; i < num_dims; i++){
|
|
var size_dim = reader.read16u();
|
|
if(size_dim === 0xffff){
|
|
var size_dim_hi = reader.read32u(), size_dim_lo = reader.read32u();
|
|
if(size_dim_hi !== 0)
|
|
caml_failwith("input_value: bigarray dimension overflow in 32bit");
|
|
size_dim = size_dim_lo;
|
|
}
|
|
dims.push(size_dim);
|
|
}
|
|
else
|
|
for(var i = 0; i < num_dims; i++) dims.push(reader.read32u());
|
|
var
|
|
size = caml_ba_get_size(dims),
|
|
data = caml_ba_create_buffer(kind, size),
|
|
ba = caml_ba_create_unsafe(kind, layout, dims, data);
|
|
switch(kind){
|
|
case 2:
|
|
for(var i = 0; i < size; i++) data[i] = reader.read8s(); break;
|
|
case 3:
|
|
case 12:
|
|
for(var i = 0; i < size; i++) data[i] = reader.read8u(); break;
|
|
case 4:
|
|
for(var i = 0; i < size; i++) data[i] = reader.read16s(); break;
|
|
case 5:
|
|
for(var i = 0; i < size; i++) data[i] = reader.read16u(); break;
|
|
case 6:
|
|
for(var i = 0; i < size; i++) data[i] = reader.read32s(); break;
|
|
case 8:
|
|
case 9:
|
|
var sixty = reader.read8u();
|
|
if(sixty)
|
|
caml_failwith
|
|
("input_value: cannot read bigarray with 64-bit OCaml ints");
|
|
for(var i = 0; i < size; i++) data[i] = reader.read32s();
|
|
break;
|
|
case 7:
|
|
var t = new Array(8);
|
|
for(var i = 0; i < size; i++){
|
|
for(var j = 0; j < 8; j++) t[j] = reader.read8u();
|
|
var int64 = caml_int64_of_bytes(t);
|
|
ba.set(i, int64);
|
|
}
|
|
break;
|
|
case 1:
|
|
var t = new Array(8);
|
|
for(var i = 0; i < size; i++){
|
|
for(var j = 0; j < 8; j++) t[j] = reader.read8u();
|
|
var f = caml_int64_float_of_bits(caml_int64_of_bytes(t));
|
|
ba.set(i, f);
|
|
}
|
|
break;
|
|
case 13:
|
|
for(var i = 0; i < size; i++) data[i] = reader.read16u(); break;
|
|
case 0:
|
|
for(var i = 0; i < size; i++){
|
|
var f = caml_int32_float_of_bits(reader.read32s());
|
|
ba.set(i, f);
|
|
}
|
|
break;
|
|
case 10:
|
|
for(var i = 0; i < size; i++){
|
|
var
|
|
re = caml_int32_float_of_bits(reader.read32s()),
|
|
im = caml_int32_float_of_bits(reader.read32s());
|
|
ba.set(i, [254, re, im]);
|
|
}
|
|
break;
|
|
case 11:
|
|
var t = new Array(8);
|
|
for(var i = 0; i < size; i++){
|
|
for(var j = 0; j < 8; j++) t[j] = reader.read8u();
|
|
var re = caml_int64_float_of_bits(caml_int64_of_bytes(t));
|
|
for(var j = 0; j < 8; j++) t[j] = reader.read8u();
|
|
var im = caml_int64_float_of_bits(caml_int64_of_bytes(t));
|
|
ba.set(i, [254, re, im]);
|
|
}
|
|
break;
|
|
}
|
|
sz[0] = (4 + num_dims) * 4;
|
|
return caml_ba_create_unsafe(kind, layout, dims, data);
|
|
}
|
|
function caml_ba_dim(ba, i){
|
|
if(i < 0 || i >= ba.dims.length) caml_invalid_argument("Bigarray.dim");
|
|
return ba.dims[i];
|
|
}
|
|
function caml_ba_dim_1(ba){return caml_ba_dim(ba, 0);}
|
|
function caml_ba_dim_2(ba){return caml_ba_dim(ba, 1);}
|
|
function caml_ba_dim_3(ba){return caml_ba_dim(ba, 2);}
|
|
function caml_ba_fill(ba, v){ba.fill(v); return 0;}
|
|
function caml_ba_kind_of_typed_array(ta){
|
|
var kind;
|
|
if(ta instanceof Float32Array)
|
|
kind = 0;
|
|
else if(ta instanceof Float64Array)
|
|
kind = 1;
|
|
else if(ta instanceof Int8Array)
|
|
kind = 2;
|
|
else if(ta instanceof Uint8Array)
|
|
kind = 3;
|
|
else if(ta instanceof Uint8ClampedArray)
|
|
kind = 3;
|
|
else if(ta instanceof Int16Array)
|
|
kind = 4;
|
|
else if(ta instanceof Uint16Array)
|
|
kind = 5;
|
|
else if(ta instanceof Int32Array)
|
|
kind = 6;
|
|
else if(ta instanceof Uint32Array)
|
|
kind = 6;
|
|
else
|
|
caml_invalid_argument("caml_ba_kind_of_typed_array: unsupported kind");
|
|
return kind;
|
|
}
|
|
function caml_ba_from_typed_array(ta){
|
|
var
|
|
kind = caml_ba_kind_of_typed_array(ta),
|
|
ta =
|
|
ta instanceof Uint32Array
|
|
? new Int32Array(ta.buffer, ta.byteOffset, ta.length)
|
|
: ta;
|
|
return caml_ba_create_unsafe(kind, 0, [ta.length], ta);
|
|
}
|
|
function caml_ba_get_1(ba, i0){return ba.get(ba.offset(i0));}
|
|
function caml_ba_get_2(ba, i0, i1){return ba.get(ba.offset([i0, i1]));}
|
|
function caml_ba_get_3(ba, i0, i1, i2){
|
|
return ba.get(ba.offset([i0, i1, i2]));
|
|
}
|
|
function caml_ba_get_generic(ba, i){
|
|
var ofs = ba.offset(caml_js_from_array(i));
|
|
return ba.get(ofs);
|
|
}
|
|
function caml_mul(a, b){return Math.imul(a, b);}
|
|
function caml_hash_mix_int(h, d){
|
|
d = caml_mul(d, 0xcc9e2d51 | 0);
|
|
d = d << 15 | d >>> 32 - 15;
|
|
d = caml_mul(d, 0x1b873593);
|
|
h ^= d;
|
|
h = h << 13 | h >>> 32 - 13;
|
|
return (h + (h << 2) | 0) + (0xe6546b64 | 0) | 0;
|
|
}
|
|
function caml_hash_mix_float16(hash, d){
|
|
if((d & 0x7c00) === 0x7c00 && (d & 0x03ff) !== 0)
|
|
d = 0x7c01;
|
|
else if(d === 0x8000) d = 0;
|
|
return caml_hash_mix_int(hash, d);
|
|
}
|
|
function caml_int32_bits_of_float(x){
|
|
jsoo_dataview.setFloat32(0, x, true);
|
|
return jsoo_dataview.getUint32(0, true) | 0;
|
|
}
|
|
function caml_hash_mix_float32(hash, v){
|
|
var i = caml_int32_bits_of_float(v);
|
|
if((i & 0x7f800000) === 0x7f800000 && (i & 0x7fffff) !== 0)
|
|
i = 0x7f800001;
|
|
else if(i === (0x80000000 | 0)) i = 0;
|
|
hash = caml_hash_mix_int(hash, i);
|
|
return hash;
|
|
}
|
|
function caml_int64_create_lo_mi_hi(lo, mi, hi){return new MlInt64(lo, mi, hi);
|
|
}
|
|
function caml_int64_bits_of_float(x){
|
|
jsoo_dataview.setFloat64(0, x, true);
|
|
var
|
|
lo32 = jsoo_dataview.getUint32(0, true),
|
|
hi32 = jsoo_dataview.getUint32(4, true),
|
|
lo = lo32 & 0xffffff,
|
|
mi = lo32 >>> 24 | hi32 << 8 & 0xffffff,
|
|
hi = hi32 >>> 16 & 0xffff;
|
|
if((hi & 0x7ff8) === 0x7ff0 && (mi | lo | hi & 0xf) !== 0) hi |= 8;
|
|
return caml_int64_create_lo_mi_hi(lo, mi, hi);
|
|
}
|
|
function caml_hash_mix_float(hash, v0){
|
|
var
|
|
i64 = caml_int64_bits_of_float(v0),
|
|
l = caml_int64_lo32(i64),
|
|
h = caml_int64_hi32(i64);
|
|
if((h & 0x7ff00000) === 0x7ff00000 && (l | h & 0xfffff) !== 0){h = 0x7ff00000; l = 0x00000001;}
|
|
else if(h === (0x80000000 | 0) && l === 0) h = 0;
|
|
hash = caml_hash_mix_int(hash, l);
|
|
hash = caml_hash_mix_int(hash, h);
|
|
return hash;
|
|
}
|
|
function caml_ba_hash(ba){
|
|
var num_elts = caml_ba_get_size(ba.dims), h = 0;
|
|
switch(ba.kind){
|
|
case 2:
|
|
case 3:
|
|
case 12:
|
|
if(num_elts > 256) num_elts = 256;
|
|
var w = 0, i = 0;
|
|
for(i = 0; i + 4 <= num_elts; i += 4){
|
|
w =
|
|
ba.data[i + 0] & 0xff | (ba.data[i + 1] & 0xff) << 8
|
|
| (ba.data[i + 2] & 0xff) << 16
|
|
| ba.data[i + 3] << 24;
|
|
h = caml_hash_mix_int(h, w);
|
|
}
|
|
w = 0;
|
|
switch(num_elts & 3){
|
|
case 3:
|
|
w = ba.data[i + 2] << 16;
|
|
case 2:
|
|
w |= ba.data[i + 1] << 8;
|
|
case 1:
|
|
w |= ba.data[i + 0]; h = caml_hash_mix_int(h, w);
|
|
}
|
|
break;
|
|
case 4:
|
|
case 5:
|
|
if(num_elts > 128) num_elts = 128;
|
|
var w = 0, i = 0;
|
|
for(i = 0; i + 2 <= num_elts; i += 2){
|
|
w = ba.data[i + 0] & 0xffff | ba.data[i + 1] << 16;
|
|
h = caml_hash_mix_int(h, w);
|
|
}
|
|
if((num_elts & 1) !== 0) h = caml_hash_mix_int(h, ba.data[i]);
|
|
break;
|
|
case 6:
|
|
if(num_elts > 64) num_elts = 64;
|
|
for(var i = 0; i < num_elts; i++) h = caml_hash_mix_int(h, ba.data[i]);
|
|
break;
|
|
case 8:
|
|
case 9:
|
|
if(num_elts > 64) num_elts = 64;
|
|
for(var i = 0; i < num_elts; i++) h = caml_hash_mix_int(h, ba.data[i]);
|
|
break;
|
|
case 7:
|
|
if(num_elts > 32) num_elts = 32;
|
|
num_elts *= 2;
|
|
for(var i = 0; i < num_elts; i++) h = caml_hash_mix_int(h, ba.data[i]);
|
|
break;
|
|
case 10:
|
|
num_elts *= 2;
|
|
case 0:
|
|
if(num_elts > 64) num_elts = 64;
|
|
for(var i = 0; i < num_elts; i++)
|
|
h = caml_hash_mix_float32(h, ba.data[i]);
|
|
break;
|
|
case 11:
|
|
num_elts *= 2;
|
|
case 1:
|
|
if(num_elts > 32) num_elts = 32;
|
|
for(var i = 0; i < num_elts; i++)
|
|
h = caml_hash_mix_float(h, ba.data[i]);
|
|
break;
|
|
case 13:
|
|
if(num_elts > 128) num_elts = 128;
|
|
for(var i = 0; i < num_elts; i++)
|
|
h = caml_hash_mix_float16(h, ba.data[i]);
|
|
break;
|
|
}
|
|
return h;
|
|
}
|
|
function caml_ba_init(){return 0;}
|
|
function caml_ba_kind(ba){return ba.kind;}
|
|
function caml_ba_layout(ba){return ba.layout;}
|
|
function caml_ba_map_file(_vfd, _kind, _layout, _shared, _dims, _pos){caml_failwith("caml_ba_map_file not implemented");
|
|
}
|
|
function caml_ba_map_file_bytecode(argv, _argn){
|
|
return caml_ba_map_file
|
|
(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]);
|
|
}
|
|
function caml_ba_num_dims(ba){return ba.dims.length;}
|
|
function caml_ba_reshape(ba, vind){
|
|
vind = caml_js_from_array(vind);
|
|
var new_dim = [], num_dims = vind.length;
|
|
if(num_dims < 0 || num_dims > 16)
|
|
caml_invalid_argument("Bigarray.reshape: bad number of dimensions");
|
|
var num_elts = 1;
|
|
for(var i = 0; i < num_dims; i++){
|
|
new_dim[i] = vind[i];
|
|
if(new_dim[i] < 0)
|
|
caml_invalid_argument("Bigarray.reshape: negative dimension");
|
|
num_elts = num_elts * new_dim[i];
|
|
}
|
|
var size = caml_ba_get_size(ba.dims);
|
|
if(num_elts !== size)
|
|
caml_invalid_argument("Bigarray.reshape: size mismatch");
|
|
return caml_ba_create_unsafe(ba.kind, ba.layout, new_dim, ba.data);
|
|
}
|
|
function caml_int64_to_bytes(x){return x.toArray();}
|
|
function caml_ba_serialize(writer, ba, sz){
|
|
writer.write(32, ba.dims.length);
|
|
writer.write(32, ba.kind | ba.layout << 8);
|
|
if(ba.caml_custom === "_bigarr02")
|
|
for(var i = 0; i < ba.dims.length; i++)
|
|
if(ba.dims[i] < 0xffff)
|
|
writer.write(16, ba.dims[i]);
|
|
else{
|
|
writer.write(16, 0xffff);
|
|
writer.write(32, 0);
|
|
writer.write(32, ba.dims[i]);
|
|
}
|
|
else
|
|
for(var i = 0; i < ba.dims.length; i++) writer.write(32, ba.dims[i]);
|
|
switch(ba.kind){
|
|
case 2:
|
|
case 3:
|
|
case 12:
|
|
for(var i = 0; i < ba.data.length; i++) writer.write(8, ba.data[i]);
|
|
break;
|
|
case 4:
|
|
case 5:
|
|
for(var i = 0; i < ba.data.length; i++) writer.write(16, ba.data[i]);
|
|
break;
|
|
case 6:
|
|
for(var i = 0; i < ba.data.length; i++) writer.write(32, ba.data[i]);
|
|
break;
|
|
case 8:
|
|
case 9:
|
|
writer.write(8, 0);
|
|
for(var i = 0; i < ba.data.length; i++) writer.write(32, ba.data[i]);
|
|
break;
|
|
case 7:
|
|
for(var i = 0; i < ba.data.length / 2; i++){
|
|
var b = caml_int64_to_bytes(ba.get(i));
|
|
for(var j = 0; j < 8; j++) writer.write(8, b[j]);
|
|
}
|
|
break;
|
|
case 1:
|
|
for(var i = 0; i < ba.data.length; i++){
|
|
var b = caml_int64_to_bytes(caml_int64_bits_of_float(ba.get(i)));
|
|
for(var j = 0; j < 8; j++) writer.write(8, b[j]);
|
|
}
|
|
break;
|
|
case 13:
|
|
for(var i = 0; i < ba.data.length; i++) writer.write(16, ba.data[i]);
|
|
break;
|
|
case 0:
|
|
for(var i = 0; i < ba.data.length; i++){
|
|
var b = caml_int32_bits_of_float(ba.get(i));
|
|
writer.write(32, b);
|
|
}
|
|
break;
|
|
case 10:
|
|
for(var i = 0; i < ba.data.length / 2; i++){
|
|
var j = ba.get(i);
|
|
writer.write(32, caml_int32_bits_of_float(j[1]));
|
|
writer.write(32, caml_int32_bits_of_float(j[2]));
|
|
}
|
|
break;
|
|
case 11:
|
|
for(var i = 0; i < ba.data.length / 2; i++){
|
|
var
|
|
complex = ba.get(i),
|
|
b = caml_int64_to_bytes(caml_int64_bits_of_float(complex[1]));
|
|
for(var j = 0; j < 8; j++) writer.write(8, b[j]);
|
|
var b = caml_int64_to_bytes(caml_int64_bits_of_float(complex[2]));
|
|
for(var j = 0; j < 8; j++) writer.write(8, b[j]);
|
|
}
|
|
break;
|
|
}
|
|
sz[0] = (4 + ba.dims.length) * 4;
|
|
sz[1] = (4 + ba.dims.length) * 8;
|
|
}
|
|
function caml_ba_set_1(ba, i0, v){ba.set(ba.offset(i0), v); return 0;}
|
|
function caml_ba_set_2(ba, i0, i1, v){
|
|
ba.set(ba.offset([i0, i1]), v);
|
|
return 0;
|
|
}
|
|
function caml_ba_set_3(ba, i0, i1, i2, v){
|
|
ba.set(ba.offset([i0, i1, i2]), v);
|
|
return 0;
|
|
}
|
|
function caml_ba_set_generic(ba, i, v){
|
|
ba.set(ba.offset(caml_js_from_array(i)), v);
|
|
return 0;
|
|
}
|
|
function caml_ba_slice(ba, vind){
|
|
vind = caml_js_from_array(vind);
|
|
var num_inds = vind.length, index = [], sub_dims = [], ofs;
|
|
if(num_inds > ba.dims.length)
|
|
caml_invalid_argument("Bigarray.slice: too many indices");
|
|
if(ba.layout === 0){
|
|
for(var i = 0; i < num_inds; i++) index[i] = vind[i];
|
|
for(; i < ba.dims.length; i++) index[i] = 0;
|
|
sub_dims = ba.dims.slice(num_inds);
|
|
}
|
|
else{
|
|
for(var i = 0; i < num_inds; i++)
|
|
index[ba.dims.length - num_inds + i] = vind[i];
|
|
for(var i = 0; i < ba.dims.length - num_inds; i++) index[i] = 1;
|
|
sub_dims = ba.dims.slice(0, ba.dims.length - num_inds);
|
|
}
|
|
ofs = ba.offset(index);
|
|
var
|
|
size = caml_ba_get_size(sub_dims),
|
|
size_per_element = caml_ba_get_size_per_element(ba.kind),
|
|
new_data =
|
|
ba.data.subarray
|
|
(ofs * size_per_element, (ofs + size) * size_per_element);
|
|
return caml_ba_create_unsafe(ba.kind, ba.layout, sub_dims, new_data);
|
|
}
|
|
function caml_ba_sub(ba, ofs, len){
|
|
var changed_dim, mul = 1;
|
|
if(ba.layout === 0){
|
|
for(var i = 1; i < ba.dims.length; i++) mul = mul * ba.dims[i];
|
|
changed_dim = 0;
|
|
}
|
|
else{
|
|
for(var i = 0; i < ba.dims.length - 1; i++) mul = mul * ba.dims[i];
|
|
changed_dim = ba.dims.length - 1;
|
|
ofs = ofs - 1;
|
|
}
|
|
if(ofs < 0 || len < 0 || ofs + len > ba.dims[changed_dim])
|
|
caml_invalid_argument("Bigarray.sub: bad sub-array");
|
|
var new_dims = [];
|
|
for(var i = 0; i < ba.dims.length; i++) new_dims[i] = ba.dims[i];
|
|
new_dims[changed_dim] = len;
|
|
mul *= caml_ba_get_size_per_element(ba.kind);
|
|
var new_data = ba.data.subarray(ofs * mul, (ofs + len) * mul);
|
|
return caml_ba_create_unsafe(ba.kind, ba.layout, new_dims, new_data);
|
|
}
|
|
function caml_ba_to_typed_array(ba){return ba.data;}
|
|
function caml_ba_uint8_get16(ba, i0){
|
|
var ofs = ba.offset(i0);
|
|
if(ofs + 1 >= ba.data.length) caml_array_bound_error();
|
|
var b1 = ba.get(ofs), b2 = ba.get(ofs + 1);
|
|
return b1 | b2 << 8;
|
|
}
|
|
function caml_ba_uint8_get32(ba, i0){
|
|
var ofs = ba.offset(i0);
|
|
if(ofs + 3 >= ba.data.length) caml_array_bound_error();
|
|
var
|
|
b1 = ba.get(ofs + 0),
|
|
b2 = ba.get(ofs + 1),
|
|
b3 = ba.get(ofs + 2),
|
|
b4 = ba.get(ofs + 3);
|
|
return b1 << 0 | b2 << 8 | b3 << 16 | b4 << 24;
|
|
}
|
|
function caml_ba_uint8_get64(ba, i0){
|
|
var ofs = ba.offset(i0);
|
|
if(ofs + 7 >= ba.data.length) caml_array_bound_error();
|
|
var
|
|
b1 = ba.get(ofs + 0),
|
|
b2 = ba.get(ofs + 1),
|
|
b3 = ba.get(ofs + 2),
|
|
b4 = ba.get(ofs + 3),
|
|
b5 = ba.get(ofs + 4),
|
|
b6 = ba.get(ofs + 5),
|
|
b7 = ba.get(ofs + 6),
|
|
b8 = ba.get(ofs + 7);
|
|
return caml_int64_of_bytes([b8, b7, b6, b5, b4, b3, b2, b1]);
|
|
}
|
|
function caml_ba_uint8_set16(ba, i0, v){
|
|
var ofs = ba.offset(i0);
|
|
if(ofs + 1 >= ba.data.length) caml_array_bound_error();
|
|
ba.set(ofs + 0, v & 0xff);
|
|
ba.set(ofs + 1, v >>> 8 & 0xff);
|
|
return 0;
|
|
}
|
|
function caml_ba_uint8_set32(ba, i0, v){
|
|
var ofs = ba.offset(i0);
|
|
if(ofs + 3 >= ba.data.length) caml_array_bound_error();
|
|
ba.set(ofs + 0, v & 0xff);
|
|
ba.set(ofs + 1, v >>> 8 & 0xff);
|
|
ba.set(ofs + 2, v >>> 16 & 0xff);
|
|
ba.set(ofs + 3, v >>> 24 & 0xff);
|
|
return 0;
|
|
}
|
|
function caml_ba_uint8_set64(ba, i0, v){
|
|
var ofs = ba.offset(i0);
|
|
if(ofs + 7 >= ba.data.length) caml_array_bound_error();
|
|
var v = caml_int64_to_bytes(v);
|
|
for(var i = 0; i < 8; i++) ba.set(ofs + i, v[7 - i]);
|
|
return 0;
|
|
}
|
|
function caml_backtrace_status(_unit){
|
|
return caml_record_backtrace_runtime_flag ? 1 : 0;
|
|
}
|
|
function caml_bigstring_blit_ba_to_ba(ba1, pos1, ba2, pos2, len){
|
|
if(12 !== ba1.kind)
|
|
caml_invalid_argument("caml_bigstring_blit_ba_to_ba: kind mismatch");
|
|
if(12 !== ba2.kind)
|
|
caml_invalid_argument("caml_bigstring_blit_ba_to_ba: kind mismatch");
|
|
if(len === 0) return 0;
|
|
var ofs1 = ba1.offset(pos1), ofs2 = ba2.offset(pos2);
|
|
if(ofs1 + len > ba1.data.length) caml_array_bound_error();
|
|
if(ofs2 + len > ba2.data.length) caml_array_bound_error();
|
|
var slice = ba1.data.subarray(ofs1, ofs1 + len);
|
|
ba2.data.set(slice, pos2);
|
|
return 0;
|
|
}
|
|
function caml_bigstring_blit_ba_to_bytes(ba1, pos1, bytes2, pos2, len){
|
|
if(12 !== ba1.kind)
|
|
caml_invalid_argument("caml_bigstring_blit_string_to_ba: kind mismatch");
|
|
if(len === 0) return 0;
|
|
var ofs1 = ba1.offset(pos1);
|
|
if(ofs1 + len > ba1.data.length) caml_array_bound_error();
|
|
if(pos2 + len > caml_ml_bytes_length(bytes2)) caml_array_bound_error();
|
|
var slice = ba1.data.subarray(ofs1, ofs1 + len);
|
|
caml_blit_bytes(caml_bytes_of_uint8_array(slice), 0, bytes2, pos2, len);
|
|
return 0;
|
|
}
|
|
function caml_bigstring_blit_bytes_to_ba(str1, pos1, ba2, pos2, len){
|
|
if(12 !== ba2.kind)
|
|
caml_invalid_argument("caml_bigstring_blit_string_to_ba: kind mismatch");
|
|
if(len === 0) return 0;
|
|
var ofs2 = ba2.offset(pos2);
|
|
if(pos1 + len > caml_ml_bytes_length(str1)) caml_array_bound_error();
|
|
if(ofs2 + len > ba2.data.length) caml_array_bound_error();
|
|
var slice = caml_uint8_array_of_bytes(str1).subarray(pos1, pos1 + len);
|
|
ba2.data.set(slice, ofs2);
|
|
return 0;
|
|
}
|
|
function caml_bigstring_blit_string_to_ba(str1, pos1, ba2, pos2, len){
|
|
if(12 !== ba2.kind)
|
|
caml_invalid_argument("caml_bigstring_blit_string_to_ba: kind mismatch");
|
|
if(len === 0) return 0;
|
|
var ofs2 = ba2.offset(pos2);
|
|
if(pos1 + len > caml_ml_string_length(str1)) caml_array_bound_error();
|
|
if(ofs2 + len > ba2.data.length) caml_array_bound_error();
|
|
var slice = caml_uint8_array_of_string(str1).subarray(pos1, pos1 + len);
|
|
ba2.data.set(slice, ofs2);
|
|
return 0;
|
|
}
|
|
function caml_bigstring_memcmp(s1, pos1, s2, pos2, len){
|
|
for(var i = 0; i < len; i++){
|
|
var a = caml_ba_get_1(s1, pos1 + i), b = caml_ba_get_1(s2, pos2 + i);
|
|
if(a < b) return - 1;
|
|
if(a > b) return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
function caml_blake2_create(hashlen, key){
|
|
key = caml_uint8_array_of_string(key);
|
|
if(key.length > 64) key.subarray(0, 64);
|
|
return blake2b.Init(hashlen, key);
|
|
}
|
|
function caml_blake2_final(ctx, _hashlen){
|
|
var r = blake2b.Final(ctx);
|
|
return caml_string_of_uint8_array(r);
|
|
}
|
|
function caml_blake2_update(ctx, buf, ofs, len){
|
|
var input = caml_uint8_array_of_string(buf);
|
|
input = input.subarray(ofs, ofs + len);
|
|
blake2b.Update(ctx, input);
|
|
return 0;
|
|
}
|
|
function caml_blake2_string(hashlen, key, buf, ofs, len){
|
|
var ctx = caml_blake2_create(hashlen, key);
|
|
caml_blake2_update(ctx, buf, ofs, len);
|
|
return caml_blake2_final(ctx, hashlen);
|
|
}
|
|
function caml_blit_string(a, b, c, d, e){
|
|
caml_blit_bytes(caml_bytes_of_string(a), b, c, d, e);
|
|
return 0;
|
|
}
|
|
function caml_bswap16(x){return (x & 0x00ff) << 8 | (x & 0xff00) >> 8;}
|
|
var jsoo_text_decoder_buff = new ArrayBuffer(1024);
|
|
function caml_jsstring_of_string(s){
|
|
if(jsoo_is_ascii(s)) return s;
|
|
var
|
|
a =
|
|
s.length <= jsoo_text_decoder_buff.length
|
|
? new Uint8Array(jsoo_text_decoder_buff, 0, s.length)
|
|
: new Uint8Array(s.length);
|
|
for(var i = 0; i < s.length; i++) a[i] = s.charCodeAt(i);
|
|
return jsoo_text_decoder.decode(a);
|
|
}
|
|
function caml_build_symbols(symb){
|
|
var r = {}, max = - 1;
|
|
if(symb)
|
|
for(var i = 1; i < symb.length; i++){
|
|
var idx = symb[i][2];
|
|
max = Math.max(max, idx);
|
|
r[caml_jsstring_of_string(symb[i][1])] = idx;
|
|
}
|
|
r.next_idx = max + 1;
|
|
return r;
|
|
}
|
|
function caml_bytes_compare(s1, s2){
|
|
s1.t & 6 && caml_convert_string_to_bytes(s1);
|
|
s2.t & 6 && caml_convert_string_to_bytes(s2);
|
|
return s1.c < s2.c ? - 1 : s1.c > s2.c ? 1 : 0;
|
|
}
|
|
function caml_bytes_equal(s1, s2){
|
|
if(s1 === s2) return 1;
|
|
s1.t & 6 && caml_convert_string_to_bytes(s1);
|
|
s2.t & 6 && caml_convert_string_to_bytes(s2);
|
|
return s1.c === s2.c ? 1 : 0;
|
|
}
|
|
function caml_bytes_unsafe_get(s, i){
|
|
switch(s.t & 6){
|
|
case 0:
|
|
return s.c.charCodeAt(i);
|
|
case 2:
|
|
if(i >= s.c.length) return 0; return s.c.charCodeAt(i);
|
|
case 4:
|
|
return s.c[i];
|
|
}
|
|
}
|
|
function caml_bytes_get(s, i){
|
|
if(i >>> 0 >= s.l) caml_bytes_bound_error();
|
|
return caml_bytes_unsafe_get(s, i);
|
|
}
|
|
function caml_bytes_get16(s, i){
|
|
if(i >>> 0 >= s.l - 1) caml_bytes_bound_error();
|
|
var
|
|
b1 = caml_bytes_unsafe_get(s, i),
|
|
b2 = caml_bytes_unsafe_get(s, i + 1);
|
|
return b2 << 8 | b1;
|
|
}
|
|
function caml_bytes_get32(s, i){
|
|
if(i >>> 0 >= s.l - 3) caml_bytes_bound_error();
|
|
var
|
|
b1 = caml_bytes_unsafe_get(s, i),
|
|
b2 = caml_bytes_unsafe_get(s, i + 1),
|
|
b3 = caml_bytes_unsafe_get(s, i + 2),
|
|
b4 = caml_bytes_unsafe_get(s, i + 3);
|
|
return b4 << 24 | b3 << 16 | b2 << 8 | b1;
|
|
}
|
|
function caml_bytes_get64(s, i){
|
|
if(i >>> 0 >= s.l - 7) caml_bytes_bound_error();
|
|
var a = new Array(8);
|
|
for(var j = 0; j < 8; j++) a[7 - j] = caml_bytes_unsafe_get(s, i + j);
|
|
return caml_int64_of_bytes(a);
|
|
}
|
|
function caml_bytes_lessequal(s1, s2){
|
|
s1.t & 6 && caml_convert_string_to_bytes(s1);
|
|
s2.t & 6 && caml_convert_string_to_bytes(s2);
|
|
return s1.c <= s2.c ? 1 : 0;
|
|
}
|
|
function caml_bytes_greaterequal(s1, s2){return caml_bytes_lessequal(s2, s1);
|
|
}
|
|
function caml_bytes_lessthan(s1, s2){
|
|
s1.t & 6 && caml_convert_string_to_bytes(s1);
|
|
s2.t & 6 && caml_convert_string_to_bytes(s2);
|
|
return s1.c < s2.c ? 1 : 0;
|
|
}
|
|
function caml_bytes_greaterthan(s1, s2){return caml_bytes_lessthan(s2, s1);
|
|
}
|
|
function caml_bytes_notequal(s1, s2){return 1 - caml_bytes_equal(s1, s2);}
|
|
function caml_bytes_of_utf16_jsstring(s){
|
|
if(jsoo_is_ascii(s))
|
|
return new MlBytes(9, s, s.length);
|
|
else{
|
|
var a = jsoo_text_encoder.encode(s);
|
|
return new MlBytes(4, a, a.length);
|
|
}
|
|
}
|
|
function caml_bytes_set16(s, i, i16){
|
|
if(i >>> 0 >= s.l - 1) caml_bytes_bound_error();
|
|
var b2 = 0xff & i16 >> 8, b1 = 0xff & i16;
|
|
caml_bytes_unsafe_set(s, i + 0, b1);
|
|
caml_bytes_unsafe_set(s, i + 1, b2);
|
|
return 0;
|
|
}
|
|
function caml_bytes_set32(s, i, i32){
|
|
if(i >>> 0 >= s.l - 3) caml_bytes_bound_error();
|
|
var
|
|
b4 = 0xff & i32 >> 24,
|
|
b3 = 0xff & i32 >> 16,
|
|
b2 = 0xff & i32 >> 8,
|
|
b1 = 0xff & i32;
|
|
caml_bytes_unsafe_set(s, i + 0, b1);
|
|
caml_bytes_unsafe_set(s, i + 1, b2);
|
|
caml_bytes_unsafe_set(s, i + 2, b3);
|
|
caml_bytes_unsafe_set(s, i + 3, b4);
|
|
return 0;
|
|
}
|
|
function caml_bytes_set64(s, i, i64){
|
|
if(i >>> 0 >= s.l - 7) caml_bytes_bound_error();
|
|
var a = caml_int64_to_bytes(i64);
|
|
for(var j = 0; j < 8; j++) caml_bytes_unsafe_set(s, i + 7 - j, a[j]);
|
|
return 0;
|
|
}
|
|
var caml_callback = caml_call_gen;
|
|
function caml_cbrt_float(x){return Math.cbrt(x);}
|
|
class caml_ml_channels_state{
|
|
constructor(){
|
|
this.map = new globalThis.WeakMap();
|
|
this.opened = new globalThis.Set();
|
|
}
|
|
close(chanid){this.opened.delete(chanid);}
|
|
get(chanid){return this.map.get(chanid);}
|
|
set(chanid, val){
|
|
if(val.opened) this.opened.add(chanid);
|
|
return this.map.set(chanid, val);
|
|
}
|
|
all(){return this.opened.values();}
|
|
}
|
|
var caml_ml_channels = new caml_ml_channels_state();
|
|
function caml_ml_channel_get(id){return caml_ml_channels.get(id);}
|
|
function caml_channel_descriptor(chanid){
|
|
var chan = caml_ml_channel_get(chanid);
|
|
return chan.fd;
|
|
}
|
|
function caml_check_bound(array, index){
|
|
if(index >>> 0 >= array.length - 1) caml_array_bound_error();
|
|
return array;
|
|
}
|
|
function caml_classify_float(x){
|
|
if(Number.isFinite(x)){
|
|
if(Math.abs(x) >= 2.2250738585072014e-308) return 0;
|
|
if(x !== 0) return 1;
|
|
return 2;
|
|
}
|
|
return Number.isNaN(x) ? 4 : 3;
|
|
}
|
|
function caml_is_continuation_tag(t){return t === 245 ? 1 : 0;}
|
|
function caml_int32_unmarshal(reader, size){size[0] = 4; return reader.read32s();
|
|
}
|
|
function caml_nativeint_unmarshal(reader, size){
|
|
switch(reader.read8u()){
|
|
case 1:
|
|
size[0] = 4; return reader.read32s();
|
|
case 2:
|
|
caml_failwith("input_value: native integer value too large"); break;
|
|
default: caml_failwith("input_value: ill-formed native integer");
|
|
}
|
|
}
|
|
function caml_int64_unmarshal(reader, size){
|
|
var t = new Array(8);
|
|
for(var j = 0; j < 8; j++) t[j] = reader.read8u();
|
|
size[0] = 8;
|
|
return caml_int64_of_bytes(t);
|
|
}
|
|
function caml_int64_marshal(writer, v, sizes){
|
|
var b = caml_int64_to_bytes(v);
|
|
for(var i = 0; i < 8; i++) writer.write(8, b[i]);
|
|
sizes[0] = 8;
|
|
sizes[1] = 8;
|
|
}
|
|
function caml_int64_compare(x, y, _total){return x.compare(y);}
|
|
function caml_int64_hash(v){return v.lo32() ^ v.hi32();}
|
|
var
|
|
caml_custom_ops =
|
|
{_j:
|
|
{deserialize: caml_int64_unmarshal,
|
|
serialize: caml_int64_marshal,
|
|
fixed_length: 8,
|
|
compare: caml_int64_compare,
|
|
hash: caml_int64_hash},
|
|
_i: {deserialize: caml_int32_unmarshal, fixed_length: 4},
|
|
_n: {deserialize: caml_nativeint_unmarshal, fixed_length: 4},
|
|
_bigarray:
|
|
{deserialize:
|
|
function(reader, sz){
|
|
return caml_ba_deserialize(reader, sz, "_bigarray");
|
|
},
|
|
serialize: caml_ba_serialize,
|
|
compare: caml_ba_compare,
|
|
hash: caml_ba_hash},
|
|
_bigarr02:
|
|
{deserialize:
|
|
function(reader, sz){
|
|
return caml_ba_deserialize(reader, sz, "_bigarr02");
|
|
},
|
|
serialize: caml_ba_serialize,
|
|
compare: caml_ba_compare,
|
|
hash: caml_ba_hash}};
|
|
function caml_compare_val_get_custom(a){
|
|
return caml_custom_ops[a.caml_custom]
|
|
&& caml_custom_ops[a.caml_custom].compare;
|
|
}
|
|
function caml_compare_val_number_custom(num, custom, swap, total){
|
|
var comp = caml_compare_val_get_custom(custom);
|
|
if(comp){
|
|
var x = swap > 0 ? comp(custom, num, total) : comp(num, custom, total);
|
|
if(total && Number.isNaN(x)) return swap;
|
|
if(Number.isNaN(+ x)) return + x;
|
|
if((x | 0) !== 0) return x | 0;
|
|
}
|
|
return swap;
|
|
}
|
|
function caml_compare_val_tag(a){
|
|
if(typeof a === "number")
|
|
return 1000;
|
|
else if(caml_is_ml_bytes(a))
|
|
return 252;
|
|
else if(caml_is_ml_string(a))
|
|
return 1252;
|
|
else if(Array.isArray(a) && a[0] === a[0] >>> 0 && a[0] <= 255){var tag = a[0] | 0; return tag === 254 ? 0 : tag;}
|
|
else if(a instanceof String)
|
|
return 12520;
|
|
else if(typeof a === "string")
|
|
return 12520;
|
|
else if(a instanceof Number)
|
|
return 1000;
|
|
else if(a?.caml_custom)
|
|
return 1255;
|
|
else if(a?.compare)
|
|
return 1256;
|
|
else if(typeof a === "function")
|
|
return 1247;
|
|
else if(typeof a === "symbol") return 1251;
|
|
return 1001;
|
|
}
|
|
function caml_int_compare(a, b){
|
|
if(a < b) return - 1;
|
|
if(a === b) return 0;
|
|
return 1;
|
|
}
|
|
function caml_string_compare(s1, s2){
|
|
return s1 < s2 ? - 1 : s1 > s2 ? 1 : 0;
|
|
}
|
|
function caml_compare_val(a, b, total){
|
|
var stack = [];
|
|
for(;;){
|
|
if(! (total && a === b)){
|
|
var tag_a = caml_compare_val_tag(a);
|
|
if(tag_a === 250){a = a[1]; continue;}
|
|
var tag_b = caml_compare_val_tag(b);
|
|
if(tag_b === 250){b = b[1]; continue;}
|
|
if(tag_a !== tag_b){
|
|
if(tag_a === 1000){
|
|
if(tag_b === 1255)
|
|
return caml_compare_val_number_custom(a, b, - 1, total);
|
|
return - 1;
|
|
}
|
|
if(tag_b === 1000){
|
|
if(tag_a === 1255)
|
|
return caml_compare_val_number_custom(b, a, 1, total);
|
|
return 1;
|
|
}
|
|
return tag_a < tag_b ? - 1 : 1;
|
|
}
|
|
switch(tag_a){
|
|
case 247:
|
|
caml_invalid_argument("compare: functional value"); break;
|
|
case 248:
|
|
var x = caml_int_compare(a[2], b[2]) | 0;
|
|
if(x !== 0) return x;
|
|
break;
|
|
case 249:
|
|
caml_invalid_argument("compare: functional value"); break;
|
|
case 250:
|
|
caml_invalid_argument("equal: got Forward_tag, should not happen");
|
|
break;
|
|
case 251:
|
|
caml_invalid_argument("equal: abstract value"); break;
|
|
case 252:
|
|
if(a !== b){
|
|
var x = caml_bytes_compare(a, b) | 0;
|
|
if(x !== 0) return x;
|
|
}
|
|
break;
|
|
case 253:
|
|
caml_invalid_argument("equal: got Double_tag, should not happen");
|
|
break;
|
|
case 254:
|
|
caml_invalid_argument
|
|
("equal: got Double_array_tag, should not happen");
|
|
break;
|
|
case 255:
|
|
caml_invalid_argument("equal: got Custom_tag, should not happen");
|
|
break;
|
|
case 1247:
|
|
caml_invalid_argument("compare: functional value"); break;
|
|
case 1255:
|
|
var comp = caml_compare_val_get_custom(a);
|
|
if(comp !== caml_compare_val_get_custom(b))
|
|
return a.caml_custom < b.caml_custom ? - 1 : 1;
|
|
if(! comp) caml_invalid_argument("compare: abstract value");
|
|
var x = comp(a, b, total);
|
|
if(Number.isNaN(x)) return total ? - 1 : x;
|
|
if(x !== (x | 0)) return - 1;
|
|
if(x !== 0) return x | 0;
|
|
break;
|
|
case 1256:
|
|
var x = a.compare(b, total);
|
|
if(Number.isNaN(x)) return total ? - 1 : x;
|
|
if(x !== (x | 0)) return - 1;
|
|
if(x !== 0) return x | 0;
|
|
break;
|
|
case 1000:
|
|
a = + a;
|
|
b = + b;
|
|
if(a < b) return - 1;
|
|
if(a > b) return 1;
|
|
if(a !== b){
|
|
if(! total) return Number.NaN;
|
|
if(! Number.isNaN(a)) return 1;
|
|
if(! Number.isNaN(b)) return - 1;
|
|
}
|
|
break;
|
|
case 1001:
|
|
if(a < b) return - 1;
|
|
if(a > b) return 1;
|
|
if(a !== b) return total ? 1 : Number.NaN;
|
|
break;
|
|
case 1251:
|
|
if(a !== b) return total ? 1 : Number.NaN; break;
|
|
case 1252:
|
|
var a = caml_jsbytes_of_string(a), b = caml_jsbytes_of_string(b);
|
|
if(a !== b){if(a < b) return - 1; if(a > b) return 1;}
|
|
break;
|
|
case 12520:
|
|
var a = a.toString(), b = b.toString();
|
|
if(a !== b){if(a < b) return - 1; if(a > b) return 1;}
|
|
break;
|
|
default:
|
|
if(caml_is_continuation_tag(tag_a)){
|
|
caml_invalid_argument("compare: continuation value");
|
|
break;
|
|
}
|
|
if(a.length !== b.length) return a.length < b.length ? - 1 : 1;
|
|
if(a.length > 1) stack.push(a, b, 1);
|
|
break;
|
|
}
|
|
}
|
|
if(stack.length === 0) return 0;
|
|
var i = stack.pop();
|
|
b = stack.pop();
|
|
a = stack.pop();
|
|
if(i + 1 < a.length) stack.push(a, b, i + 1);
|
|
a = a[i];
|
|
b = b[i];
|
|
}
|
|
}
|
|
function caml_compare(a, b){return caml_compare_val(a, b, true);}
|
|
function caml_continuation_use_noexc(cont){
|
|
var stack = cont[1];
|
|
cont[1] = 0;
|
|
return stack;
|
|
}
|
|
function caml_continuation_use_and_update_handler_noexc
|
|
(cont, hval, hexn, heff){
|
|
var stack = caml_continuation_use_noexc(cont);
|
|
if(stack === 0) return stack;
|
|
var last = cont[2];
|
|
last.h[1] = hval;
|
|
last.h[2] = hexn;
|
|
last.h[3] = heff;
|
|
return stack;
|
|
}
|
|
function caml_convert_raw_backtrace(){return [0];}
|
|
function caml_convert_raw_backtrace_slot(_rbt){
|
|
caml_failwith("caml_convert_raw_backtrace_slot");
|
|
}
|
|
function caml_copysign_float(x, y){
|
|
if(y === 0) y = 1 / y;
|
|
x = Math.abs(x);
|
|
return y < 0 ? - x : x;
|
|
}
|
|
function caml_cosh_float(x){return Math.cosh(x);}
|
|
function fs_node_supported(){
|
|
return globalThis.process?.versions?.node !== undefined;
|
|
}
|
|
function make_path_is_absolute(){
|
|
function posix(path){
|
|
if(path.charAt(0) === "/") return ["", path.slice(1)];
|
|
return;
|
|
}
|
|
function win32(path){
|
|
var
|
|
splitDeviceRe =
|
|
/^([a-zA-Z]:|[\\/]{2}[^\\/]+[\\/]+[^\\/]+)?([\\/])?([\s\S]*?)$/,
|
|
result = splitDeviceRe.exec(path),
|
|
device = result[1] || "",
|
|
isUnc = device.length > 0 && device.charAt(1) !== ":";
|
|
if(result[2] || isUnc){
|
|
var root = result[1] || "", sep = result[2] || "";
|
|
return [root, path.slice(root.length + sep.length)];
|
|
}
|
|
return;
|
|
}
|
|
return jsoo_is_win32 ? win32 : posix;
|
|
}
|
|
var path_is_absolute = make_path_is_absolute();
|
|
function caml_trailing_slash(name){
|
|
return name.slice(- 1) !== "/" ? name + "/" : name;
|
|
}
|
|
if(fs_node_supported() && globalThis.process && globalThis.process.cwd)
|
|
var caml_current_dir = globalThis.process.cwd().replace(/\\/g, "/");
|
|
else
|
|
var caml_current_dir = "/static";
|
|
caml_current_dir = caml_trailing_slash(caml_current_dir);
|
|
function caml_make_path(name){
|
|
name = caml_jsstring_of_string(name);
|
|
if(! path_is_absolute(name)) name = caml_current_dir + name;
|
|
var
|
|
comp0 = path_is_absolute(name),
|
|
comp = comp0[1].split(/[/\\]/),
|
|
ncomp = [];
|
|
for(var i = 0; i < comp.length; i++)
|
|
switch(comp[i]){
|
|
case "..":
|
|
ncomp.pop(); break;
|
|
case ".": break;
|
|
case "": break;
|
|
default: ncomp.push(comp[i]); break;
|
|
}
|
|
ncomp.unshift(comp0[0]);
|
|
ncomp.orig = name;
|
|
return ncomp;
|
|
}
|
|
function caml_get_root(path){
|
|
var x = path_is_absolute(path);
|
|
if(! x) return;
|
|
return x[0] + "/";
|
|
}
|
|
var
|
|
caml_root =
|
|
caml_get_root(caml_current_dir)
|
|
|| caml_failwith("unable to compute caml_root"),
|
|
jsoo_mount_point = [];
|
|
if(fs_node_supported())
|
|
jsoo_mount_point.push
|
|
({path: caml_root, device: new MlNodeDevice(caml_root)});
|
|
else
|
|
jsoo_mount_point.push
|
|
({path: caml_root, device: new MlFakeDevice(caml_root)});
|
|
jsoo_mount_point.push
|
|
({path: "/static/", device: new MlFakeDevice("/static/")});
|
|
function resolve_fs_device(name){
|
|
var
|
|
path = caml_make_path(name),
|
|
name = path.join("/"),
|
|
name_slash = caml_trailing_slash(name),
|
|
res;
|
|
for(var i = 0; i < jsoo_mount_point.length; i++){
|
|
var m = jsoo_mount_point[i];
|
|
if
|
|
(name_slash.search(m.path) === 0
|
|
&& (! res || res.path.length < m.path.length))
|
|
res =
|
|
{path: m.path,
|
|
device: m.device,
|
|
rest: name.slice(m.path.length, name.length)};
|
|
}
|
|
if(! res && fs_node_supported()){
|
|
var root = caml_get_root(name);
|
|
if(root?.match(/^[a-zA-Z]:\/$/)){
|
|
var m = {path: root, device: new MlNodeDevice(root)};
|
|
jsoo_mount_point.push(m);
|
|
res =
|
|
{path: m.path,
|
|
device: m.device,
|
|
rest: name.slice(m.path.length, name.length)};
|
|
}
|
|
}
|
|
if(res) return res;
|
|
caml_raise_sys_error("no device found for " + name_slash);
|
|
}
|
|
function caml_create_file(name, content){
|
|
var root = resolve_fs_device(name);
|
|
if(! root.device.register) caml_failwith("cannot register file");
|
|
root.device.register(root.rest, content);
|
|
return 0;
|
|
}
|
|
function caml_create_string(_len){caml_invalid_argument("String.create");}
|
|
var caml_custom_event_index = 0;
|
|
function caml_custom_identifier(o){
|
|
return caml_string_of_jsstring(o.caml_custom || "");
|
|
}
|
|
var
|
|
zstd_decompress =
|
|
function(){
|
|
var
|
|
ab = ArrayBuffer,
|
|
u8 = Uint8Array,
|
|
u16 = Uint16Array,
|
|
i16 = Int16Array,
|
|
i32 = Int32Array;
|
|
function slc(v, s, e){
|
|
if(u8.prototype.slice) return u8.prototype.slice.call(v, s, e);
|
|
if(s == null || s < 0) s = 0;
|
|
if(e == null || e > v.length) e = v.length;
|
|
var n = new u8(e - s);
|
|
n.set(v.subarray(s, e));
|
|
return n;
|
|
}
|
|
function fill(v, n, s, e){
|
|
if(u8.prototype.fill) return u8.prototype.fill.call(v, n, s, e);
|
|
if(s == null || s < 0) s = 0;
|
|
if(e == null || e > v.length) e = v.length;
|
|
for(; s < e; ++s) v[s] = n;
|
|
return v;
|
|
}
|
|
function cpw(v, t, s, e){
|
|
if(u8.prototype.copyWithin)
|
|
return u8.prototype.copyWithin.call(v, t, s, e);
|
|
if(s == null || s < 0) s = 0;
|
|
if(e == null || e > v.length) e = v.length;
|
|
while(s < e) v[t++] = v[s++];
|
|
}
|
|
var
|
|
ec =
|
|
["invalid zstd data",
|
|
"window size too large (>2046MB)",
|
|
"invalid block type",
|
|
"FSE accuracy too high",
|
|
"match distance too far back",
|
|
"unexpected EOF"];
|
|
function err(ind, msg, nt){
|
|
var e = new Error(msg || ec[ind]);
|
|
e.code = ind;
|
|
if(! nt) throw e;
|
|
return e;
|
|
}
|
|
function rb(d, b, n){
|
|
var i = 0, o = 0;
|
|
for(; i < n; ++i) o |= d[b++] << (i << 3);
|
|
return o;
|
|
}
|
|
function b4(d, b){
|
|
return (d[b] | d[b + 1] << 8 | d[b + 2] << 16 | d[b + 3] << 24) >>> 0;
|
|
}
|
|
function rzfh(dat, w){
|
|
var n3 = dat[0] | dat[1] << 8 | dat[2] << 16;
|
|
if(n3 === 0x2fb528 && dat[3] === 253){
|
|
var
|
|
flg = dat[4],
|
|
ss = flg >> 5 & 1,
|
|
cc = flg >> 2 & 1,
|
|
df = flg & 3,
|
|
fcf = flg >> 6;
|
|
if(flg & 8) err(0);
|
|
var bt = 6 - ss, db = df === 3 ? 4 : df, di = rb(dat, bt, db);
|
|
bt += db;
|
|
var
|
|
fsb = fcf ? 1 << fcf : ss,
|
|
fss = rb(dat, bt, fsb) + (fcf === 1 && 256),
|
|
ws = fss;
|
|
if(! ss){
|
|
var wb = 1 << 10 + (dat[5] >> 3);
|
|
ws = wb + (wb >> 3) * (dat[5] & 7);
|
|
}
|
|
if(ws > 2145386496) err(1);
|
|
var buf = new u8((w === 1 ? fss || ws : w ? 0 : ws) + 12);
|
|
buf[0] = 1, buf[4] = 4, buf[8] = 8;
|
|
return {b: bt + fsb,
|
|
y: 0,
|
|
l: 0,
|
|
d: di,
|
|
w: w && w !== 1 ? w : buf.subarray(12),
|
|
e: ws,
|
|
o: new i32(buf.buffer, 0, 3),
|
|
u: fss,
|
|
c: cc,
|
|
m: Math.min(131072, ws)};
|
|
}
|
|
else if((n3 >> 4 | dat[3] << 20) === 0x184d2a5)
|
|
return b4(dat, 4) + 8;
|
|
err(0);
|
|
}
|
|
function msb(val){
|
|
var bits = 0;
|
|
for(; 1 << bits <= val; ++bits) ;
|
|
return bits - 1;
|
|
}
|
|
function rfse(dat, bt, mal){
|
|
var tpos = (bt << 3) + 4, al = (dat[bt] & 15) + 5;
|
|
if(al > mal) err(3);
|
|
var
|
|
sz = 1 << al,
|
|
probs = sz,
|
|
sym = - 1,
|
|
re = - 1,
|
|
i = - 1,
|
|
ht = sz,
|
|
buf = new ab(512 + (sz << 2)),
|
|
freq = new i16(buf, 0, 256),
|
|
dstate = new u16(buf, 0, 256),
|
|
nstate = new u16(buf, 512, sz),
|
|
bb1 = 512 + (sz << 1),
|
|
syms = new u8(buf, bb1, sz),
|
|
nbits = new u8(buf, bb1 + sz);
|
|
while(sym < 255 && probs > 0){
|
|
var
|
|
bits = msb(probs + 1),
|
|
cbt = tpos >> 3,
|
|
msk = (1 << bits + 1) - 1,
|
|
val =
|
|
(dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) >> (tpos & 7)
|
|
& msk,
|
|
msk1fb = (1 << bits) - 1,
|
|
msv = msk - probs - 1,
|
|
sval = val & msk1fb;
|
|
if(sval < msv)
|
|
tpos += bits, val = sval;
|
|
else{tpos += bits + 1; if(val > msk1fb) val -= msv;}
|
|
freq[++sym] = --val;
|
|
if(val === - 1){probs += val; syms[--ht] = sym;} else probs -= val;
|
|
if(! val)
|
|
do{
|
|
var rbt = tpos >> 3;
|
|
re = (dat[rbt] | dat[rbt + 1] << 8) >> (tpos & 7) & 3;
|
|
tpos += 2;
|
|
sym += re;
|
|
}
|
|
while
|
|
(re === 3);
|
|
}
|
|
if(sym > 255 || probs) err(0);
|
|
var sympos = 0, sstep = (sz >> 1) + (sz >> 3) + 3, smask = sz - 1;
|
|
for(var s = 0; s <= sym; ++s){
|
|
var sf = freq[s];
|
|
if(sf < 1){dstate[s] = - sf; continue;}
|
|
for(i = 0; i < sf; ++i){
|
|
syms[sympos] = s;
|
|
do sympos = sympos + sstep & smask;while(sympos >= ht);
|
|
}
|
|
}
|
|
if(sympos) err(0);
|
|
for(i = 0; i < sz; ++i){
|
|
var ns = dstate[syms[i]]++, nb = nbits[i] = al - msb(ns);
|
|
nstate[i] = (ns << nb) - sz;
|
|
}
|
|
return [tpos + 7 >> 3, {b: al, s: syms, n: nbits, t: nstate}];
|
|
}
|
|
function rhu(dat, bt){
|
|
var
|
|
i = 0,
|
|
wc = - 1,
|
|
buf = new u8(292),
|
|
hb = dat[bt],
|
|
hw = buf.subarray(0, 256),
|
|
rc = buf.subarray(256, 268),
|
|
ri = new u16(buf.buffer, 268);
|
|
if(hb < 128){
|
|
var _a = rfse(dat, bt + 1, 6), ebt = _a[0], fdt = _a[1];
|
|
bt += hb;
|
|
var epos = ebt << 3, lb = dat[bt];
|
|
if(! lb) err(0);
|
|
var
|
|
st1 = 0,
|
|
st2 = 0,
|
|
btr1 = fdt.b,
|
|
btr2 = btr1,
|
|
fpos = (++bt << 3) - 8 + msb(lb);
|
|
for(;;){
|
|
fpos -= btr1;
|
|
if(fpos < epos) break;
|
|
var cbt = fpos >> 3;
|
|
st1 +=
|
|
(dat[cbt] | dat[cbt + 1] << 8) >> (fpos & 7) & (1 << btr1) - 1;
|
|
hw[++wc] = fdt.s[st1];
|
|
fpos -= btr2;
|
|
if(fpos < epos) break;
|
|
cbt = fpos >> 3;
|
|
st2 +=
|
|
(dat[cbt] | dat[cbt + 1] << 8) >> (fpos & 7) & (1 << btr2) - 1;
|
|
hw[++wc] = fdt.s[st2];
|
|
btr1 = fdt.n[st1];
|
|
st1 = fdt.t[st1];
|
|
btr2 = fdt.n[st2];
|
|
st2 = fdt.t[st2];
|
|
}
|
|
if(++wc > 255) err(0);
|
|
}
|
|
else{
|
|
wc = hb - 127;
|
|
for(; i < wc; i += 2){
|
|
var byte = dat[++bt];
|
|
hw[i] = byte >> 4;
|
|
hw[i + 1] = byte & 15;
|
|
}
|
|
++bt;
|
|
}
|
|
var wes = 0;
|
|
for(i = 0; i < wc; ++i){
|
|
var wt = hw[i];
|
|
if(wt > 11) err(0);
|
|
wes += wt && 1 << wt - 1;
|
|
}
|
|
var mb = msb(wes) + 1, ts = 1 << mb, rem = ts - wes;
|
|
if(rem & rem - 1) err(0);
|
|
hw[wc++] = msb(rem) + 1;
|
|
for(i = 0; i < wc; ++i){
|
|
var wt = hw[i];
|
|
++rc[hw[i] = wt && mb + 1 - wt];
|
|
}
|
|
var
|
|
hbuf = new u8(ts << 1),
|
|
syms = hbuf.subarray(0, ts),
|
|
nb = hbuf.subarray(ts);
|
|
ri[mb] = 0;
|
|
for(i = mb; i > 0; --i){
|
|
var pv = ri[i];
|
|
fill(nb, i, pv, ri[i - 1] = pv + rc[i] * (1 << mb - i));
|
|
}
|
|
if(ri[0] !== ts) err(0);
|
|
for(i = 0; i < wc; ++i){
|
|
var bits = hw[i];
|
|
if(bits){
|
|
var code = ri[bits];
|
|
fill(syms, i, code, ri[bits] = code + (1 << mb - bits));
|
|
}
|
|
}
|
|
return [bt, {n: nb, b: mb, s: syms}];
|
|
}
|
|
var
|
|
dllt =
|
|
rfse
|
|
(new
|
|
u8
|
|
([81,
|
|
16,
|
|
99,
|
|
140,
|
|
49,
|
|
198,
|
|
24,
|
|
99,
|
|
12,
|
|
33,
|
|
196,
|
|
24,
|
|
99,
|
|
102,
|
|
102,
|
|
134,
|
|
70,
|
|
146,
|
|
4]),
|
|
0,
|
|
6)
|
|
[1],
|
|
dmlt =
|
|
rfse
|
|
(new
|
|
u8
|
|
([33,
|
|
20,
|
|
196,
|
|
24,
|
|
99,
|
|
140,
|
|
33,
|
|
132,
|
|
16,
|
|
66,
|
|
8,
|
|
33,
|
|
132,
|
|
16,
|
|
66,
|
|
8,
|
|
33,
|
|
68,
|
|
68,
|
|
68,
|
|
68,
|
|
68,
|
|
68,
|
|
68,
|
|
68,
|
|
36,
|
|
9]),
|
|
0,
|
|
6)
|
|
[1],
|
|
doct =
|
|
rfse
|
|
(new u8([32, 132, 16, 66, 102, 70, 68, 68, 68, 68, 36, 73, 2]),
|
|
0,
|
|
5)
|
|
[1];
|
|
function b2bl(b, s){
|
|
var len = b.length, bl = new i32(len);
|
|
for(var i = 0; i < len; ++i){bl[i] = s; s += 1 << b[i];}
|
|
return bl;
|
|
}
|
|
var
|
|
llb =
|
|
new
|
|
u8
|
|
(new
|
|
i32
|
|
([0,
|
|
0,
|
|
0,
|
|
0,
|
|
16843009,
|
|
50528770,
|
|
134678020,
|
|
202050057,
|
|
269422093]).buffer,
|
|
0,
|
|
36),
|
|
llbl = b2bl(llb, 0),
|
|
mlb =
|
|
new
|
|
u8
|
|
(new
|
|
i32
|
|
([0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
16843009,
|
|
50528770,
|
|
117769220,
|
|
185207048,
|
|
252579084,
|
|
16]).buffer,
|
|
0,
|
|
53),
|
|
mlbl = b2bl(mlb, 3);
|
|
function dhu(dat, out, hu){
|
|
var
|
|
len = dat.length,
|
|
ss = out.length,
|
|
lb = dat[len - 1],
|
|
msk = (1 << hu.b) - 1,
|
|
eb = - hu.b;
|
|
if(! lb) err(0);
|
|
var
|
|
st = 0,
|
|
btr = hu.b,
|
|
pos = (len << 3) - 8 + msb(lb) - btr,
|
|
i = - 1;
|
|
while(pos > eb && i < ss){
|
|
var
|
|
cbt = pos >> 3,
|
|
val =
|
|
(dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) >> (pos & 7);
|
|
st = (st << btr | val) & msk;
|
|
out[++i] = hu.s[st];
|
|
pos -= btr = hu.n[st];
|
|
}
|
|
if(pos !== eb || i + 1 !== ss) err(0);
|
|
}
|
|
function dhu4(dat, out, hu){
|
|
var
|
|
bt = 6,
|
|
ss = out.length,
|
|
sz1 = ss + 3 >> 2,
|
|
sz2 = sz1 << 1,
|
|
sz3 = sz1 + sz2;
|
|
dhu
|
|
(dat.subarray(bt, bt += dat[0] | dat[1] << 8),
|
|
out.subarray(0, sz1),
|
|
hu);
|
|
dhu
|
|
(dat.subarray(bt, bt += dat[2] | dat[3] << 8),
|
|
out.subarray(sz1, sz2),
|
|
hu);
|
|
dhu
|
|
(dat.subarray(bt, bt += dat[4] | dat[5] << 8),
|
|
out.subarray(sz2, sz3),
|
|
hu);
|
|
dhu(dat.subarray(bt), out.subarray(sz3), hu);
|
|
}
|
|
function rzb(dat, st, out){
|
|
var _a, bt = st.b, b0 = dat[bt], btype = b0 >> 1 & 3;
|
|
st.l = b0 & 1;
|
|
var
|
|
sz = b0 >> 3 | dat[bt + 1] << 5 | dat[bt + 2] << 13,
|
|
ebt = (bt += 3) + sz;
|
|
if(btype === 1){
|
|
if(bt >= dat.length) return;
|
|
st.b = bt + 1;
|
|
if(out){fill(out, dat[bt], st.y, st.y += sz); return out;}
|
|
return fill(new u8(sz), dat[bt]);
|
|
}
|
|
if(ebt > dat.length) return;
|
|
if(btype === 0){
|
|
st.b = ebt;
|
|
if(out){
|
|
out.set(dat.subarray(bt, ebt), st.y);
|
|
st.y += sz;
|
|
return out;
|
|
}
|
|
return slc(dat, bt, ebt);
|
|
}
|
|
if(btype === 2){
|
|
var
|
|
b3 = dat[bt],
|
|
lbt = b3 & 3,
|
|
sf = b3 >> 2 & 3,
|
|
lss = b3 >> 4,
|
|
lcs = 0,
|
|
s4 = 0;
|
|
if(lbt < 2)
|
|
if(sf & 1)
|
|
lss |= dat[++bt] << 4 | (sf & 2 && dat[++bt] << 12);
|
|
else
|
|
lss = b3 >> 3;
|
|
else{
|
|
s4 = sf;
|
|
if(sf < 2)
|
|
lss |= (dat[++bt] & 63) << 4, lcs = dat[bt] >> 6 | dat[++bt] << 2;
|
|
else if(sf === 2)
|
|
lss |= dat[++bt] << 4 | (dat[++bt] & 3) << 12,
|
|
lcs = dat[bt] >> 2 | dat[++bt] << 6;
|
|
else
|
|
lss |= dat[++bt] << 4 | (dat[++bt] & 63) << 12,
|
|
lcs = dat[bt] >> 6 | dat[++bt] << 2 | dat[++bt] << 10;
|
|
}
|
|
++bt;
|
|
var
|
|
buf = out ? out.subarray(st.y, st.y + st.m) : new u8(st.m),
|
|
spl = buf.length - lss;
|
|
if(lbt === 0)
|
|
buf.set(dat.subarray(bt, bt += lss), spl);
|
|
else if(lbt === 1)
|
|
fill(buf, dat[bt++], spl);
|
|
else{
|
|
var hu = st.h;
|
|
if(lbt === 2){
|
|
var hud = rhu(dat, bt);
|
|
lcs += bt - (bt = hud[0]);
|
|
st.h = hu = hud[1];
|
|
}
|
|
else if(! hu) err(0);
|
|
(s4 ? dhu4 : dhu)
|
|
(dat.subarray(bt, bt += lcs), buf.subarray(spl), hu);
|
|
}
|
|
var ns = dat[bt++];
|
|
if(ns){
|
|
if(ns === 255)
|
|
ns = (dat[bt++] | dat[bt++] << 8) + 0x7f00;
|
|
else if(ns > 127) ns = ns - 128 << 8 | dat[bt++];
|
|
var scm = dat[bt++];
|
|
if(scm & 3) err(0);
|
|
var dts = [dmlt, doct, dllt];
|
|
for(var i = 2; i > - 1; --i){
|
|
var md = scm >> (i << 1) + 2 & 3;
|
|
if(md === 1){
|
|
var rbuf = new u8([0, 0, dat[bt++]]);
|
|
dts[i] =
|
|
{s: rbuf.subarray(2, 3),
|
|
n: rbuf.subarray(0, 1),
|
|
t: new u16(rbuf.buffer, 0, 1),
|
|
b: 0};
|
|
}
|
|
else if(md === 2)
|
|
_a = rfse(dat, bt, 9 - (i & 1)), bt = _a[0], dts[i] = _a[1];
|
|
else if(md === 3){if(! st.t) err(0); dts[i] = st.t[i];}
|
|
}
|
|
var
|
|
_b = st.t = dts,
|
|
mlt = _b[0],
|
|
oct = _b[1],
|
|
llt = _b[2],
|
|
lb = dat[ebt - 1];
|
|
if(! lb) err(0);
|
|
var
|
|
spos = (ebt << 3) - 8 + msb(lb) - llt.b,
|
|
cbt = spos >> 3,
|
|
oubt = 0,
|
|
lst =
|
|
(dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << llt.b) - 1;
|
|
cbt = (spos -= oct.b) >> 3;
|
|
var
|
|
ost =
|
|
(dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << oct.b) - 1;
|
|
cbt = (spos -= mlt.b) >> 3;
|
|
var
|
|
mst =
|
|
(dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << mlt.b) - 1;
|
|
for(++ns; --ns;){
|
|
var
|
|
llc = llt.s[lst],
|
|
lbtr = llt.n[lst],
|
|
mlc = mlt.s[mst],
|
|
mbtr = mlt.n[mst],
|
|
ofc = oct.s[ost],
|
|
obtr = oct.n[ost];
|
|
cbt = (spos -= ofc) >> 3;
|
|
var
|
|
ofp = 1 << ofc,
|
|
off =
|
|
ofp
|
|
+
|
|
((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16
|
|
| dat[cbt + 3] << 24)
|
|
>>> (spos & 7)
|
|
& ofp - 1);
|
|
cbt = (spos -= mlb[mlc]) >> 3;
|
|
var
|
|
ml =
|
|
mlbl[mlc]
|
|
+
|
|
((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16)
|
|
>> (spos & 7)
|
|
& (1 << mlb[mlc]) - 1);
|
|
cbt = (spos -= llb[llc]) >> 3;
|
|
var
|
|
ll =
|
|
llbl[llc]
|
|
+
|
|
((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16)
|
|
>> (spos & 7)
|
|
& (1 << llb[llc]) - 1);
|
|
cbt = (spos -= lbtr) >> 3;
|
|
lst =
|
|
llt.t[lst]
|
|
+
|
|
((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << lbtr) - 1);
|
|
cbt = (spos -= mbtr) >> 3;
|
|
mst =
|
|
mlt.t[mst]
|
|
+
|
|
((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << mbtr) - 1);
|
|
cbt = (spos -= obtr) >> 3;
|
|
ost =
|
|
oct.t[ost]
|
|
+
|
|
((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << obtr) - 1);
|
|
if(off > 3){
|
|
st.o[2] = st.o[1];
|
|
st.o[1] = st.o[0];
|
|
st.o[0] = off -= 3;
|
|
}
|
|
else{
|
|
var idx = off - (ll !== 0);
|
|
if(idx){
|
|
off = idx === 3 ? st.o[0] - 1 : st.o[idx];
|
|
if(idx > 1) st.o[2] = st.o[1];
|
|
st.o[1] = st.o[0];
|
|
st.o[0] = off;
|
|
}
|
|
else
|
|
off = st.o[0];
|
|
}
|
|
for(var i = 0; i < ll; ++i) buf[oubt + i] = buf[spl + i];
|
|
oubt += ll, spl += ll;
|
|
var stin = oubt - off;
|
|
if(stin < 0){
|
|
var len = - stin, bs = st.e + stin;
|
|
if(len > ml) len = ml;
|
|
for(var i = 0; i < len; ++i) buf[oubt + i] = st.w[bs + i];
|
|
oubt += len, ml -= len, stin = 0;
|
|
}
|
|
for(var i = 0; i < ml; ++i) buf[oubt + i] = buf[stin + i];
|
|
oubt += ml;
|
|
}
|
|
if(oubt !== spl)
|
|
while(spl < buf.length) buf[oubt++] = buf[spl++];
|
|
else
|
|
oubt = buf.length;
|
|
if(out) st.y += oubt; else buf = slc(buf, 0, oubt);
|
|
}
|
|
else if(out){
|
|
st.y += lss;
|
|
if(spl) for(var i = 0; i < lss; ++i) buf[i] = buf[spl + i];
|
|
}
|
|
else if(spl) buf = slc(buf, spl);
|
|
st.b = ebt;
|
|
return buf;
|
|
}
|
|
err(2);
|
|
}
|
|
function cct(bufs, ol){
|
|
if(bufs.length === 1) return bufs[0];
|
|
var buf = new u8(ol);
|
|
for(var i = 0, b = 0; i < bufs.length; ++i){
|
|
var chk = bufs[i];
|
|
buf.set(chk, b);
|
|
b += chk.length;
|
|
}
|
|
return buf;
|
|
}
|
|
return function(dat, buf){
|
|
var bt = 0, bufs = [], nb = + ! buf, ol = 0;
|
|
while(dat.length){
|
|
var st = rzfh(dat, nb || buf);
|
|
if(typeof st === "object"){
|
|
if(nb){
|
|
buf = null;
|
|
if(st.w.length === st.u){bufs.push(buf = st.w); ol += st.u;}
|
|
}
|
|
else{bufs.push(buf); st.e = 0;}
|
|
while(! st.l){
|
|
var blk = rzb(dat, st, buf);
|
|
if(! blk) err(5);
|
|
if(buf)
|
|
st.e = st.y;
|
|
else{
|
|
bufs.push(blk);
|
|
ol += blk.length;
|
|
cpw(st.w, 0, blk.length);
|
|
st.w.set(blk, st.w.length - blk.length);
|
|
}
|
|
}
|
|
bt = st.b + st.c * 4;
|
|
}
|
|
else
|
|
bt = st;
|
|
dat = dat.subarray(bt);
|
|
}
|
|
return cct(bufs, ol);};
|
|
}
|
|
(),
|
|
caml_decompress_input = zstd_decompress;
|
|
function caml_div(x, y){
|
|
if(y === 0) caml_raise_zero_divide();
|
|
return x / y | 0;
|
|
}
|
|
var caml_domain_dls = [0];
|
|
function caml_domain_dls_compare_and_set(old, n){
|
|
if(caml_domain_dls !== old) return 0;
|
|
caml_domain_dls = n;
|
|
return 1;
|
|
}
|
|
function caml_domain_dls_get(_unit){return caml_domain_dls;}
|
|
function caml_domain_dls_set(a){caml_domain_dls = a;}
|
|
var caml_domain_id = 0;
|
|
function caml_ml_mutex_unlock(t){t.locked = false; return 0;}
|
|
var caml_domain_latest_idx = 1;
|
|
function caml_domain_spawn(f, term_sync){
|
|
var id = caml_domain_latest_idx++, old = caml_domain_id;
|
|
caml_domain_id = id;
|
|
var res = caml_callback(f, [0]);
|
|
caml_domain_id = old;
|
|
caml_ml_mutex_unlock(term_sync[2]);
|
|
term_sync[1] = [0, [0, res]];
|
|
return id;
|
|
}
|
|
var
|
|
caml_ephe_none = {caml_ephe_none: 0},
|
|
caml_ephe_data_offset = 2,
|
|
caml_ephe_key_offset = 3;
|
|
function caml_ephe_get_data(x){
|
|
var data = x[caml_ephe_data_offset];
|
|
if(data === caml_ephe_none) return 0;
|
|
for(var i = caml_ephe_key_offset; i < x.length; i++){
|
|
var k = x[i];
|
|
if(globalThis.WeakRef && k instanceof globalThis.WeakRef){
|
|
var d = k.deref();
|
|
if(d === undefined){
|
|
x[i] = caml_ephe_none;
|
|
x[caml_ephe_data_offset] = caml_ephe_none;
|
|
return 0;
|
|
}
|
|
if(globalThis.WeakMap){
|
|
data = data.get(k);
|
|
if(data === undefined){
|
|
x[caml_ephe_data_offset] = caml_ephe_none;
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return [0, data];
|
|
}
|
|
function caml_ephe_unset_data(x){
|
|
x[caml_ephe_data_offset] = caml_ephe_none;
|
|
return 0;
|
|
}
|
|
function caml_ephe_set_data(x, data){
|
|
for(var i = x.length - 1; i >= caml_ephe_key_offset; i--){
|
|
var k = x[i];
|
|
if(globalThis.WeakRef && k instanceof globalThis.WeakRef){
|
|
var d = k.deref();
|
|
if(d === undefined){x[i] = caml_ephe_none; continue;}
|
|
if(globalThis.WeakMap) data = new globalThis.WeakMap().set(k, data);
|
|
}
|
|
}
|
|
x[caml_ephe_data_offset] = data;
|
|
return 0;
|
|
}
|
|
function caml_ephe_set_data_opt(x, data_opt){
|
|
if(data_opt === 0)
|
|
caml_ephe_unset_data(x);
|
|
else
|
|
caml_ephe_set_data(x, data_opt[1]);
|
|
return 0;
|
|
}
|
|
function caml_ephe_blit_data(src, dst){
|
|
var old = caml_ephe_get_data(src);
|
|
caml_ephe_set_data_opt(dst, old);
|
|
return 0;
|
|
}
|
|
function caml_ephe_blit_key(a1, i1, a2, i2, len){
|
|
var old = caml_ephe_get_data(a1);
|
|
caml_array_blit
|
|
(a1,
|
|
caml_ephe_key_offset + i1 - 1,
|
|
a2,
|
|
caml_ephe_key_offset + i2 - 1,
|
|
len);
|
|
caml_ephe_set_data_opt(a2, old);
|
|
return 0;
|
|
}
|
|
function caml_ephe_check_data(x){
|
|
var data = caml_ephe_get_data(x);
|
|
return data === 0 ? 0 : 1;
|
|
}
|
|
function caml_ephe_check_key(x, i){
|
|
var weak = x[caml_ephe_key_offset + i];
|
|
if(weak === caml_ephe_none) return 0;
|
|
if(globalThis.WeakRef && weak instanceof globalThis.WeakRef){
|
|
weak = weak.deref();
|
|
if(weak === undefined){
|
|
x[caml_ephe_key_offset + i] = caml_ephe_none;
|
|
x[caml_ephe_data_offset] = caml_ephe_none;
|
|
return 0;
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
function caml_weak_create(n){
|
|
var alen = caml_ephe_key_offset + n, x = new Array(alen);
|
|
x[0] = 251;
|
|
x[1] = "caml_ephe_list_head";
|
|
for(var i = 2; i < alen; i++) x[i] = caml_ephe_none;
|
|
return x;
|
|
}
|
|
function caml_ephe_create(n){return caml_weak_create(n);}
|
|
function caml_obj_dup(x){return typeof x === "number" ? x : x.slice();}
|
|
function caml_ephe_get_data_copy(x){
|
|
var r = caml_ephe_get_data(x);
|
|
if(r === 0) return 0;
|
|
var z = r[1];
|
|
if(Array.isArray(z)) return [0, caml_obj_dup(z)];
|
|
return r;
|
|
}
|
|
function caml_ephe_get_key(x, i){
|
|
var weak = x[caml_ephe_key_offset + i];
|
|
if(weak === caml_ephe_none) return 0;
|
|
if(globalThis.WeakRef && weak instanceof globalThis.WeakRef){
|
|
weak = weak.deref();
|
|
if(weak === undefined){
|
|
x[caml_ephe_key_offset + i] = caml_ephe_none;
|
|
x[caml_ephe_data_offset] = caml_ephe_none;
|
|
return 0;
|
|
}
|
|
}
|
|
return [0, weak];
|
|
}
|
|
function caml_ephe_get_key_copy(x, i){
|
|
var y = caml_ephe_get_key(x, i);
|
|
if(y === 0) return y;
|
|
var z = y[1];
|
|
if(Array.isArray(z)) return [0, caml_obj_dup(z)];
|
|
return y;
|
|
}
|
|
function caml_ephe_set_key(x, i, v){
|
|
var old = caml_ephe_get_data(x);
|
|
if(globalThis.WeakRef && v instanceof Object)
|
|
v = new globalThis.WeakRef(v);
|
|
x[caml_ephe_key_offset + i] = v;
|
|
caml_ephe_set_data_opt(x, old);
|
|
return 0;
|
|
}
|
|
function caml_ephe_unset_key(x, i){
|
|
var old = caml_ephe_get_data(x);
|
|
x[caml_ephe_key_offset + i] = caml_ephe_none;
|
|
caml_ephe_set_data_opt(x, old);
|
|
return 0;
|
|
}
|
|
function caml_equal(x, y){return + (caml_compare_val(x, y, false) === 0);}
|
|
function caml_erf_float(x){
|
|
var
|
|
a1 = 0.254829592,
|
|
a2 = - 0.284496736,
|
|
a3 = 1.421413741,
|
|
a4 = - 1.453152027,
|
|
a5 = 1.061405429,
|
|
p = 0.3275911,
|
|
sign = 1;
|
|
if(x < 0) sign = - 1;
|
|
x = Math.abs(x);
|
|
var
|
|
t = 1.0 / (1.0 + p * x),
|
|
y =
|
|
1.0
|
|
-
|
|
((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t * Math.exp(- x * x);
|
|
return sign * y;
|
|
}
|
|
function caml_erfc_float(x){return 1 - caml_erf_float(x);}
|
|
var caml_executable_name = caml_argv[1];
|
|
function caml_exp2_float(x){return Math.pow(2, x);}
|
|
function caml_expm1_float(x){return Math.expm1(x);}
|
|
function caml_is_special_exception(exn){
|
|
switch(exn[2]){case - 8:case - 11:case - 12: return 1;default: return 0;
|
|
}
|
|
}
|
|
function caml_format_exception(exn){
|
|
var r = "";
|
|
if(exn[0] === 0){
|
|
r += exn[1][1];
|
|
if
|
|
(exn.length === 3 && exn[2][0] === 0
|
|
&& caml_is_special_exception(exn[1]))
|
|
var bucket = exn[2], start = 1;
|
|
else
|
|
var start = 2, bucket = exn;
|
|
r += "(";
|
|
for(var i = start; i < bucket.length; i++){
|
|
if(i > start) r += ", ";
|
|
var v = bucket[i];
|
|
if(typeof v === "number")
|
|
r += v.toString();
|
|
else if(v instanceof MlBytes)
|
|
r += '"' + v.toString() + '"';
|
|
else if(typeof v === "string")
|
|
r += '"' + v.toString() + '"';
|
|
else
|
|
r += "_";
|
|
}
|
|
r += ")";
|
|
}
|
|
else if(exn[0] === 248) r += exn[1];
|
|
return r;
|
|
}
|
|
function caml_fatal_uncaught_exception(err){
|
|
if(Array.isArray(err) && (err[0] === 0 || err[0] === 248)){
|
|
var handler = caml_named_value("Printexc.handle_uncaught_exception");
|
|
if(handler)
|
|
caml_callback(handler, [err, false]);
|
|
else{
|
|
var
|
|
msg = caml_format_exception(err),
|
|
at_exit = caml_named_value("Pervasives.do_at_exit");
|
|
if(at_exit) caml_callback(at_exit, [0]);
|
|
console.error("Fatal error: exception " + msg);
|
|
if(err.js_error) throw err.js_error;
|
|
}
|
|
}
|
|
else
|
|
throw err;
|
|
}
|
|
function caml_fill_bytes(s, i, l, c){
|
|
if(l > 0)
|
|
if(i === 0 && (l >= s.l || s.t === 2 && l >= s.c.length))
|
|
if(c === 0){
|
|
s.c = "";
|
|
s.t = 2;
|
|
}
|
|
else{
|
|
s.c = caml_str_repeat(l, String.fromCharCode(c));
|
|
s.t = l === s.l ? 0 : 2;
|
|
}
|
|
else{
|
|
if(s.t !== 4) caml_convert_bytes_to_array(s);
|
|
for(l += i; i < l; i++) s.c[i] = c;
|
|
}
|
|
return 0;
|
|
}
|
|
function caml_final_register(_f, _x){return 0;}
|
|
var all_finalizers = new globalThis.Set();
|
|
function caml_final_register_called_without_value(cb, a){
|
|
if(globalThis.FinalizationRegistry && a instanceof Object){
|
|
var
|
|
x =
|
|
new
|
|
globalThis.FinalizationRegistry
|
|
(function(x){all_finalizers.delete(x); cb(0); return;});
|
|
x.register(a, x);
|
|
all_finalizers.add(x);
|
|
}
|
|
return 0;
|
|
}
|
|
function caml_final_release(_unit){return 0;}
|
|
function caml_finish_formatting(f, rawbuffer){
|
|
if(f.uppercase) rawbuffer = rawbuffer.toUpperCase();
|
|
var len = rawbuffer.length;
|
|
if(f.signedconv && (f.sign < 0 || f.signstyle !== "-")) len++;
|
|
if(f.alternate){if(f.base === 8) len += 1; if(f.base === 16) len += 2;}
|
|
var buffer = "";
|
|
if(f.justify === "+" && f.filler === " ")
|
|
for(var i = len; i < f.width; i++) buffer += " ";
|
|
if(f.signedconv)
|
|
if(f.sign < 0)
|
|
buffer += "-";
|
|
else if(f.signstyle !== "-") buffer += f.signstyle;
|
|
if(f.alternate && f.base === 8) buffer += "0";
|
|
if(f.alternate && f.base === 16) buffer += f.uppercase ? "0X" : "0x";
|
|
if(f.justify === "+" && f.filler === "0")
|
|
for(var i = len; i < f.width; i++) buffer += "0";
|
|
buffer += rawbuffer;
|
|
if(f.justify === "-") for(var i = len; i < f.width; i++) buffer += " ";
|
|
return caml_string_of_jsbytes(buffer);
|
|
}
|
|
function caml_float_compare(x, y){
|
|
if(x === y) return 0;
|
|
if(x < y) return - 1;
|
|
if(x > y) return 1;
|
|
if(! Number.isNaN(x)) return 1;
|
|
if(! Number.isNaN(y)) return - 1;
|
|
return 0;
|
|
}
|
|
function caml_float_of_bytes(a){
|
|
return caml_int64_float_of_bits(caml_int64_of_bytes(a));
|
|
}
|
|
function caml_float_of_string(s){
|
|
var res, r_float = /^ *[-+]?(?:\d*\.?\d+|\d+\.?\d*)(?:[eE][-+]?\d+)?$/;
|
|
s = caml_jsbytes_of_string(s);
|
|
res = + s;
|
|
if(! Number.isNaN(res) && r_float.test(s)) return res;
|
|
s = s.replace(/_/g, "");
|
|
res = + s;
|
|
if(! Number.isNaN(res) && r_float.test(s) || /^[+-]?nan$/i.test(s))
|
|
return res;
|
|
var
|
|
m = /^ *([+-]?)0x([0-9a-f]+)\.?([0-9a-f]*)(p([+-]?[0-9]+))?$/i.exec(s);
|
|
if(m){
|
|
var
|
|
m3 = m[3].replace(/0+$/, ""),
|
|
mantissa = Number.parseInt(m[1] + m[2] + m3, 16),
|
|
exponent = (+ m[5] || 0) - 4 * m3.length;
|
|
res = mantissa * Math.pow(2, exponent);
|
|
return res;
|
|
}
|
|
if(/^\+?inf(inity)?$/i.test(s)) return Number.POSITIVE_INFINITY;
|
|
if(/^-inf(inity)?$/i.test(s)) return Number.NEGATIVE_INFINITY;
|
|
caml_failwith("float_of_string");
|
|
}
|
|
function caml_floatarray_blit(a1, i1, a2, i2, len){return caml_array_blit(a1, i1, a2, i2, len);
|
|
}
|
|
function caml_floatarray_create(len){
|
|
if(len >>> 0 >= (0x7fffffff / 8 | 0)) caml_array_bound_error();
|
|
var len = len + 1 | 0, b = new Array(len);
|
|
b[0] = 254;
|
|
for(var i = 1; i < len; i++) b[i] = 0;
|
|
return b;
|
|
}
|
|
function caml_fma_float(x, y, z){
|
|
var
|
|
SPLIT = Math.pow(2, 27) + 1,
|
|
MIN_VALUE = Math.pow(2, - 1022),
|
|
EPSILON = Math.pow(2, - 52),
|
|
C = 416,
|
|
A = Math.pow(2, + C),
|
|
B = Math.pow(2, - C);
|
|
function multiply(a, b){
|
|
var
|
|
at = SPLIT * a,
|
|
ahi = at - (at - a),
|
|
alo = a - ahi,
|
|
bt = SPLIT * b,
|
|
bhi = bt - (bt - b),
|
|
blo = b - bhi,
|
|
p = a * b,
|
|
e = ahi * bhi - p + ahi * blo + alo * bhi + alo * blo;
|
|
return {p: p, e: e};
|
|
}
|
|
function add(a, b){
|
|
var s = a + b, v = s - a, e = a - (s - v) + (b - v);
|
|
return {s: s, e: e};
|
|
}
|
|
function adjust(x, y){
|
|
return x !== 0 && y !== 0 && SPLIT * x - (SPLIT * x - x) === x
|
|
? x * (1 + (x < 0 ? - 1 : + 1) * (y < 0 ? - 1 : + 1) * EPSILON)
|
|
: x;
|
|
}
|
|
if(x === 0 || y === 0 || ! Number.isFinite(x) || ! Number.isFinite(y))
|
|
return x * y + z;
|
|
if(z === 0) return x * y;
|
|
if(! Number.isFinite(z)) return z;
|
|
var scale = 1;
|
|
while(Math.abs(x) > A){scale *= A; x *= B;}
|
|
while(Math.abs(y) > A){scale *= A; y *= B;}
|
|
if(scale === 1 / 0) return x * y * scale;
|
|
while(Math.abs(x) < B){scale *= B; x *= A;}
|
|
while(Math.abs(y) < B){scale *= B; y *= A;}
|
|
if(scale === 0) return z;
|
|
var xs = x, ys = y, zs = z / scale;
|
|
if(Math.abs(zs) > Math.abs(xs * ys) * 4 / EPSILON) return z;
|
|
if(Math.abs(zs) < Math.abs(xs * ys) * EPSILON / 4 * EPSILON / 4)
|
|
zs = (z < 0 ? - 1 : + 1) * MIN_VALUE;
|
|
var
|
|
xy = multiply(xs, ys),
|
|
s = add(xy.p, zs),
|
|
u = add(xy.e, s.e),
|
|
i = add(s.s, u.s),
|
|
f = i.s + adjust(i.e, u.e);
|
|
if(f === 0) return f;
|
|
var fs = f * scale;
|
|
if(Math.abs(fs) > MIN_VALUE) return fs;
|
|
return fs + adjust(f - fs / scale, i.e) * scale;
|
|
}
|
|
function caml_parse_format(fmt){
|
|
fmt = caml_jsbytes_of_string(fmt);
|
|
var len = fmt.length;
|
|
if(len > 31) caml_invalid_argument("format_int: format too long");
|
|
var
|
|
f =
|
|
{justify: "+",
|
|
signstyle: "-",
|
|
filler: " ",
|
|
alternate: false,
|
|
base: 0,
|
|
signedconv: false,
|
|
width: 0,
|
|
uppercase: false,
|
|
sign: 1,
|
|
prec: - 1,
|
|
conv: "f"};
|
|
for(var i = 0; i < len; i++){
|
|
var c = fmt.charAt(i);
|
|
switch(c){
|
|
case "-":
|
|
f.justify = "-"; break;
|
|
case "+":
|
|
case " ":
|
|
f.signstyle = c; break;
|
|
case "0":
|
|
f.filler = "0"; break;
|
|
case "#":
|
|
f.alternate = true; break;
|
|
case "1":
|
|
case "2":
|
|
case "3":
|
|
case "4":
|
|
case "5":
|
|
case "6":
|
|
case "7":
|
|
case "8":
|
|
case "9":
|
|
f.width = 0;
|
|
while(c = fmt.charCodeAt(i) - 48, c >= 0 && c <= 9){f.width = f.width * 10 + c; i++;}
|
|
i--;
|
|
break;
|
|
case ".":
|
|
f.prec = 0;
|
|
i++;
|
|
while(c = fmt.charCodeAt(i) - 48, c >= 0 && c <= 9){f.prec = f.prec * 10 + c; i++;}
|
|
i--;
|
|
break;
|
|
case "d":
|
|
case "i":
|
|
f.signedconv = true; f.base = 10; break;
|
|
case "u":
|
|
f.base = 10; break;
|
|
case "x":
|
|
f.base = 16; break;
|
|
case "X":
|
|
f.base = 16; f.uppercase = true; break;
|
|
case "o":
|
|
f.base = 8; break;
|
|
case "e":
|
|
case "f":
|
|
case "g":
|
|
f.signedconv = true; f.conv = c; break;
|
|
case "E":
|
|
case "F":
|
|
case "G":
|
|
f.signedconv = true;
|
|
f.uppercase = true;
|
|
f.conv = c.toLowerCase();
|
|
break;
|
|
}
|
|
}
|
|
return f;
|
|
}
|
|
function caml_format_float(fmt, x){
|
|
function toFixed(x, dp){
|
|
if(Math.abs(x) < 1.0)
|
|
return x.toFixed(dp);
|
|
else{
|
|
var e = Number.parseInt(x.toString().split("+")[1]);
|
|
if(e > 20){
|
|
e -= 20;
|
|
x /= Math.pow(10, e);
|
|
x += caml_str_repeat(e, "0");
|
|
if(dp > 0) x = x + "." + caml_str_repeat(dp, "0");
|
|
return x;
|
|
}
|
|
else
|
|
return x.toFixed(dp);
|
|
}
|
|
}
|
|
var s, f = caml_parse_format(fmt), prec = f.prec < 0 ? 6 : f.prec;
|
|
if(x < 0 || x === 0 && 1 / x === Number.NEGATIVE_INFINITY){f.sign = - 1; x = - x;}
|
|
if(Number.isNaN(x)){
|
|
s = "nan";
|
|
f.filler = " ";
|
|
}
|
|
else if(! Number.isFinite(x)){s = "inf"; f.filler = " ";}
|
|
else
|
|
switch(f.conv){
|
|
case "e":
|
|
var s = x.toExponential(prec), i = s.length;
|
|
if(s.charAt(i - 3) === "e")
|
|
s = s.slice(0, i - 1) + "0" + s.slice(i - 1);
|
|
break;
|
|
case "f":
|
|
s = toFixed(x, prec); break;
|
|
case "g":
|
|
prec = prec ? prec : 1;
|
|
s = x.toExponential(prec - 1);
|
|
var j = s.indexOf("e"), exp = + s.slice(j + 1);
|
|
if(exp < - 4 || x >= 1e21 || x.toFixed(0).length > prec){
|
|
var i = j - 1;
|
|
while(s.charAt(i) === "0") i--;
|
|
if(s.charAt(i) === ".") i--;
|
|
s = s.slice(0, i + 1) + s.slice(j);
|
|
i = s.length;
|
|
if(s.charAt(i - 3) === "e")
|
|
s = s.slice(0, i - 1) + "0" + s.slice(i - 1);
|
|
break;
|
|
}
|
|
else{
|
|
var p = prec;
|
|
if(exp < 0){
|
|
p -= exp + 1;
|
|
s = x.toFixed(p);
|
|
}
|
|
else
|
|
while(s = x.toFixed(p), s.length > prec + 1) p--;
|
|
if(p){
|
|
var i = s.length - 1;
|
|
while(s.charAt(i) === "0") i--;
|
|
if(s.charAt(i) === ".") i--;
|
|
s = s.slice(0, i + 1);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
return caml_finish_formatting(f, s);
|
|
}
|
|
function caml_format_int(fmt, i){
|
|
if(caml_jsbytes_of_string(fmt) === "%d")
|
|
return caml_string_of_jsbytes("" + i);
|
|
var f = caml_parse_format(fmt);
|
|
if(i < 0) if(f.signedconv){f.sign = - 1; i = - i;} else i >>>= 0;
|
|
var s = i.toString(f.base);
|
|
if(f.prec >= 0){
|
|
f.filler = " ";
|
|
var n = f.prec - s.length;
|
|
if(n > 0) s = caml_str_repeat(n, "0") + s;
|
|
}
|
|
return caml_finish_formatting(f, s);
|
|
}
|
|
var caml_oo_last_id = 0;
|
|
function caml_fresh_oo_id(){return caml_oo_last_id++;}
|
|
function caml_frexp_float(x){
|
|
if(x === 0 || ! Number.isFinite(x)) return [0, x, 0];
|
|
var neg = x < 0;
|
|
if(neg) x = - x;
|
|
var exp = Math.max(- 1023, Math.floor(Math.log2(x)) + 1);
|
|
x *= Math.pow(2, - exp);
|
|
while(x < 0.5){x *= 2; exp--;}
|
|
while(x >= 1){x *= 0.5; exp++;}
|
|
if(neg) x = - x;
|
|
return [0, x, exp];
|
|
}
|
|
function jsoo_create_file(name, content){
|
|
var
|
|
name = caml_string_of_jsstring(name),
|
|
content = caml_string_of_jsbytes(content);
|
|
return caml_create_file(name, content);
|
|
}
|
|
function caml_fs_init(){
|
|
var tmp = globalThis.jsoo_fs_tmp;
|
|
if(tmp)
|
|
for(var i = 0; i < tmp.length; i++)
|
|
jsoo_create_file(tmp[i].name, tmp[i].content);
|
|
globalThis.jsoo_create_file = jsoo_create_file;
|
|
globalThis.jsoo_fs_tmp = [];
|
|
return 0;
|
|
}
|
|
function caml_gc_compaction(_unit){return 0;}
|
|
function caml_gc_counters(_unit){return [254, 0, 0, 0];}
|
|
function caml_gc_full_major(_unit){
|
|
if(typeof globalThis.gc === "function") globalThis.gc();
|
|
return 0;
|
|
}
|
|
function caml_gc_get(_unit){return [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];}
|
|
function caml_gc_major(_unit){
|
|
if(typeof globalThis.gc === "function") globalThis.gc();
|
|
return 0;
|
|
}
|
|
function caml_gc_major_slice(_work){return 0;}
|
|
function caml_gc_minor(_unit){
|
|
if(typeof globalThis.gc === "function") globalThis.gc(true);
|
|
return 0;
|
|
}
|
|
function caml_gc_minor_words(_unit){return 0;}
|
|
function caml_gc_quick_stat(_unit){
|
|
return [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
|
}
|
|
function caml_gc_set(_control){return 0;}
|
|
function caml_gc_stat(unit){return caml_gc_quick_stat(unit);}
|
|
var caml_method_cache = [];
|
|
function caml_get_cached_method(obj, tag, cacheid){
|
|
var meths = obj[1], ofs = caml_method_cache[cacheid];
|
|
if(meths[ofs + 4] === tag) return meths[ofs + 3];
|
|
var li = 3, hi = meths[1] * 2 + 1, mi;
|
|
while(li < hi){
|
|
mi = li + hi >> 1 | 1;
|
|
if(tag < meths[mi + 1]) hi = mi - 2; else li = mi;
|
|
}
|
|
caml_method_cache[cacheid] = li - 3;
|
|
return meths[li];
|
|
}
|
|
function caml_get_continuation_callstack(){return [0];}
|
|
function caml_get_current_callstack(){return [0];}
|
|
function caml_get_exception_backtrace(){return 0;}
|
|
function caml_get_exception_raw_backtrace(_unit){return [0];}
|
|
function caml_get_global_data(_unit){return caml_global_data;}
|
|
function caml_get_minor_free(_unit){return 0;}
|
|
function caml_get_public_method(obj, tag){
|
|
var meths = obj[1], li = 3, hi = meths[1] * 2 + 1, mi;
|
|
while(li < hi){
|
|
mi = li + hi >> 1 | 1;
|
|
if(tag < meths[mi + 1]) hi = mi - 2; else li = mi;
|
|
}
|
|
return tag === meths[li + 1] ? meths[li] : 0;
|
|
}
|
|
function caml_gr_arc_aux(ctx, cx, cy, ry, rx, a1, a2){
|
|
while(a1 > a2) a2 += 360;
|
|
a1 /= 180;
|
|
a2 /= 180;
|
|
var
|
|
rot = 0,
|
|
xPos,
|
|
yPos,
|
|
xPos_prev,
|
|
yPos_prev,
|
|
space = 2,
|
|
num = (a2 - a1) * Math.PI * ((rx + ry) / 2) / space | 0,
|
|
delta = (a2 - a1) * Math.PI / num,
|
|
i = a1 * Math.PI;
|
|
for(var j = 0; j <= num; j++){
|
|
xPos =
|
|
cx - rx * Math.sin(i) * Math.sin(rot * Math.PI)
|
|
+ ry * Math.cos(i) * Math.cos(rot * Math.PI);
|
|
xPos = xPos.toFixed(2);
|
|
yPos =
|
|
cy + ry * Math.cos(i) * Math.sin(rot * Math.PI)
|
|
+ rx * Math.sin(i) * Math.cos(rot * Math.PI);
|
|
yPos = yPos.toFixed(2);
|
|
if(j === 0)
|
|
ctx.moveTo(xPos, yPos);
|
|
else if(xPos_prev !== xPos || yPos_prev !== yPos) ctx.lineTo(xPos, yPos);
|
|
xPos_prev = xPos;
|
|
yPos_prev = yPos;
|
|
i -= delta;
|
|
}
|
|
return 0;
|
|
}
|
|
var caml_gr_state;
|
|
function caml_gr_state_get(){
|
|
if(caml_gr_state) return caml_gr_state;
|
|
throw caml_maybe_attach_backtrace
|
|
([0,
|
|
caml_named_value("Graphics.Graphic_failure"),
|
|
caml_string_of_jsbytes("Not initialized")]);
|
|
}
|
|
function caml_gr_blit_image(im, x, y){
|
|
var
|
|
s = caml_gr_state_get(),
|
|
im2 =
|
|
s.context.getImageData
|
|
(x, s.height - im.height - y, im.width, im.height);
|
|
for(var i = 0; i < im2.data.length; i += 4){
|
|
im.data[i] = im2.data[i];
|
|
im.data[i + 1] = im2.data[i + 1];
|
|
im.data[i + 2] = im2.data[i + 2];
|
|
im.data[i + 3] = im2.data[i + 3];
|
|
}
|
|
return 0;
|
|
}
|
|
function caml_gr_clear_graph(){
|
|
var s = caml_gr_state_get();
|
|
s.context.clearRect(0, 0, s.canvas.width, s.canvas.height);
|
|
return 0;
|
|
}
|
|
function caml_gr_close_graph(){
|
|
var s = caml_gr_state_get();
|
|
s.canvas.width = 0;
|
|
s.canvas.height = 0;
|
|
return 0;
|
|
}
|
|
function caml_gr_close_subwindow(_a){
|
|
caml_failwith("caml_gr_close_subwindow not Implemented");
|
|
}
|
|
function caml_gr_create_image(x, y){
|
|
var s = caml_gr_state_get();
|
|
return s.context.createImageData(x, y);
|
|
}
|
|
function caml_gr_current_x(){var s = caml_gr_state_get(); return s.x;}
|
|
function caml_gr_current_y(){var s = caml_gr_state_get(); return s.y;}
|
|
function caml_gr_display_mode(){
|
|
caml_failwith("caml_gr_display_mode not Implemented");
|
|
}
|
|
function caml_gr_doc_of_state(state){
|
|
if(state.canvas.ownerDocument) return state.canvas.ownerDocument;
|
|
}
|
|
function caml_gr_draw_arc(x, y, rx, ry, a1, a2){
|
|
var s = caml_gr_state_get();
|
|
s.context.beginPath();
|
|
caml_gr_arc_aux(s.context, x, s.height - y, rx, ry, a1, a2);
|
|
s.context.stroke();
|
|
return 0;
|
|
}
|
|
function caml_gr_draw_str(str){
|
|
var s = caml_gr_state_get(), m = s.context.measureText(str), dx = m.width;
|
|
s.context.fillText(str, s.x, s.height - s.y);
|
|
s.x += dx | 0;
|
|
return 0;
|
|
}
|
|
function caml_gr_draw_char(c){
|
|
caml_gr_draw_str(String.fromCharCode(c));
|
|
return 0;
|
|
}
|
|
function caml_gr_draw_image(im, x, y){
|
|
var s = caml_gr_state_get();
|
|
if(! im.image){
|
|
var canvas = document.createElement("canvas");
|
|
canvas.width = s.width;
|
|
canvas.height = s.height;
|
|
canvas.getContext("2d").putImageData(im, 0, 0);
|
|
var image = new globalThis.Image();
|
|
image.onload =
|
|
function(){
|
|
s.context.drawImage(image, x, s.height - im.height - y);
|
|
im.image = image;
|
|
};
|
|
image.src = canvas.toDataURL("image/png");
|
|
}
|
|
else
|
|
s.context.drawImage(im.image, x, s.height - im.height - y);
|
|
return 0;
|
|
}
|
|
function caml_gr_draw_rect(x, y, w, h){
|
|
var s = caml_gr_state_get();
|
|
s.context.strokeRect(x, s.height - y, w, - h);
|
|
return 0;
|
|
}
|
|
function caml_gr_draw_string(str){
|
|
caml_gr_draw_str(caml_jsstring_of_string(str));
|
|
return 0;
|
|
}
|
|
function caml_gr_dump_image(im){
|
|
var data = [0];
|
|
for(var i = 0; i < im.height; i++){
|
|
data[i + 1] = [0];
|
|
for(var j = 0; j < im.width; j++){
|
|
var
|
|
o = i * (im.width * 4) + j * 4,
|
|
r = im.data[o + 0],
|
|
g = im.data[o + 1],
|
|
b = im.data[o + 2];
|
|
data[i + 1][j + 1] = (r << 16) + (g << 8) + b;
|
|
}
|
|
}
|
|
return data;
|
|
}
|
|
function caml_gr_fill_arc(x, y, rx, ry, a1, a2){
|
|
var s = caml_gr_state_get();
|
|
s.context.beginPath();
|
|
caml_gr_arc_aux(s.context, x, s.height - y, rx, ry, a1, a2);
|
|
s.context.fill();
|
|
return 0;
|
|
}
|
|
function caml_gr_fill_poly(ar){
|
|
var s = caml_gr_state_get();
|
|
s.context.beginPath();
|
|
s.context.moveTo(ar[1][1], s.height - ar[1][2]);
|
|
for(var i = 2; i < ar.length; i++)
|
|
s.context.lineTo(ar[i][1], s.height - ar[i][2]);
|
|
s.context.lineTo(ar[1][1], s.height - ar[1][2]);
|
|
s.context.fill();
|
|
return 0;
|
|
}
|
|
function caml_gr_fill_rect(x, y, w, h){
|
|
var s = caml_gr_state_get();
|
|
s.context.fillRect(x, s.height - y, w, - h);
|
|
return 0;
|
|
}
|
|
function caml_gr_lineto(x, y){
|
|
var s = caml_gr_state_get();
|
|
s.context.beginPath();
|
|
s.context.moveTo(s.x, s.height - s.y);
|
|
s.context.lineTo(x, s.height - y);
|
|
s.context.stroke();
|
|
s.x = x;
|
|
s.y = y;
|
|
return 0;
|
|
}
|
|
function caml_gr_make_image(arr){
|
|
var
|
|
s = caml_gr_state_get(),
|
|
h = arr.length - 1,
|
|
w = arr[1].length - 1,
|
|
im = s.context.createImageData(w, h);
|
|
for(var i = 0; i < h; i++)
|
|
for(var j = 0; j < w; j++){
|
|
var c = arr[i + 1][j + 1], o = i * (w * 4) + j * 4;
|
|
if(c === - 1){
|
|
im.data[o + 0] = 0;
|
|
im.data[o + 1] = 0;
|
|
im.data[o + 2] = 0;
|
|
im.data[o + 3] = 0;
|
|
}
|
|
else{
|
|
im.data[o + 0] = c >> 16 & 0xff;
|
|
im.data[o + 1] = c >> 8 & 0xff;
|
|
im.data[o + 2] = c >> 0 & 0xff;
|
|
im.data[o + 3] = 0xff;
|
|
}
|
|
}
|
|
return im;
|
|
}
|
|
function caml_gr_moveto(x, y){
|
|
var s = caml_gr_state_get();
|
|
s.x = x;
|
|
s.y = y;
|
|
return 0;
|
|
}
|
|
function caml_gr_set_window_title(name){
|
|
var s = caml_gr_state_get();
|
|
s.title = name;
|
|
var jsname = caml_jsstring_of_string(name);
|
|
if(s.set_title) s.set_title(jsname);
|
|
return 0;
|
|
}
|
|
function caml_gr_set_line_width(w){
|
|
var s = caml_gr_state_get();
|
|
s.line_width = w;
|
|
s.context.lineWidth = w;
|
|
return 0;
|
|
}
|
|
function caml_gr_set_text_size(size){
|
|
var s = caml_gr_state_get();
|
|
s.text_size = size;
|
|
s.context.font = s.text_size + "px " + caml_jsstring_of_string(s.font);
|
|
return 0;
|
|
}
|
|
function caml_gr_set_font(f){
|
|
var s = caml_gr_state_get();
|
|
s.font = f;
|
|
s.context.font = s.text_size + "px " + caml_jsstring_of_string(s.font);
|
|
return 0;
|
|
}
|
|
function caml_gr_set_color(color){
|
|
var s = caml_gr_state_get();
|
|
function convert(number){
|
|
var str = "" + number.toString(16);
|
|
while(str.length < 2) str = "0" + str;
|
|
return str;
|
|
}
|
|
var r = color >> 16 & 0xff, g = color >> 8 & 0xff, b = color >> 0 & 0xff;
|
|
s.color = color;
|
|
var c_str = "#" + convert(r) + convert(g) + convert(b);
|
|
s.context.fillStyle = c_str;
|
|
s.context.strokeStyle = c_str;
|
|
return 0;
|
|
}
|
|
function caml_gr_resize_window(w, h){
|
|
var s = caml_gr_state_get();
|
|
s.width = w;
|
|
s.height = h;
|
|
if(w !== s.canvas.width) s.canvas.width = w;
|
|
if(h !== s.canvas.height) s.canvas.height = h;
|
|
return 0;
|
|
}
|
|
function caml_gr_state_init(){
|
|
caml_gr_moveto(caml_gr_state.x, caml_gr_state.y);
|
|
caml_gr_resize_window(caml_gr_state.width, caml_gr_state.height);
|
|
caml_gr_set_line_width(caml_gr_state.line_width);
|
|
caml_gr_set_text_size(caml_gr_state.text_size);
|
|
caml_gr_set_font(caml_gr_state.font);
|
|
caml_gr_set_color(caml_gr_state.color);
|
|
caml_gr_set_window_title(caml_gr_state.title);
|
|
caml_gr_state.context.textBaseline = "bottom";
|
|
}
|
|
function caml_gr_state_set(ctx){
|
|
caml_gr_state = ctx;
|
|
caml_gr_state_init();
|
|
return 0;
|
|
}
|
|
function caml_gr_state_create(canvas, w, h){
|
|
var context = canvas.getContext("2d");
|
|
return {context: context,
|
|
canvas: canvas,
|
|
x: 0,
|
|
y: 0,
|
|
width: w,
|
|
height: h,
|
|
line_width: 1,
|
|
font: caml_string_of_jsbytes("fixed"),
|
|
text_size: 26,
|
|
color: 0x000000,
|
|
title: caml_string_of_jsbytes("")};
|
|
}
|
|
function caml_gr_open_graph(info){
|
|
var info = caml_jsstring_of_string(info);
|
|
function get(name){
|
|
var res = info.match("(^|,) *" + name + " *= *([a-zA-Z0-9_]+) *(,|$)");
|
|
if(res) return res[2];
|
|
}
|
|
var specs = [];
|
|
if(! (info === "")) specs.push(info);
|
|
var target = get("target");
|
|
if(! target) target = "";
|
|
var status = get("status");
|
|
if(! status) specs.push("status=1");
|
|
var w = get("width");
|
|
w = w ? Number.parseInt(w) : 200;
|
|
specs.push("width=" + w);
|
|
var h = get("height");
|
|
h = h ? Number.parseInt(h) : 200;
|
|
specs.push("height=" + h);
|
|
var win = globalThis.open("about:blank", target, specs.join(","));
|
|
if(! win) caml_failwith("Graphics.open_graph: cannot open the window");
|
|
var doc = win.document, canvas = doc.createElement("canvas");
|
|
canvas.width = w;
|
|
canvas.height = h;
|
|
var ctx = caml_gr_state_create(canvas, w, h);
|
|
ctx.set_title = function(title){doc.title = title;};
|
|
caml_gr_state_set(ctx);
|
|
var body = doc.body;
|
|
body.style.margin = "0px";
|
|
body.appendChild(canvas);
|
|
return 0;
|
|
}
|
|
function caml_gr_open_subwindow(_a, _b, _c, _d){
|
|
caml_failwith("caml_gr_open_subwindow not Implemented");
|
|
}
|
|
function caml_gr_plot(x, y){
|
|
var
|
|
s = caml_gr_state_get(),
|
|
im = s.context.createImageData(1, 1),
|
|
d = im.data,
|
|
color = s.color;
|
|
d[0] = color >> 16 & 0xff;
|
|
d[1] = color >> 8 & 0xff, d[2] = color >> 0 & 0xff;
|
|
d[3] = 0xff;
|
|
s.x = x;
|
|
s.y = y;
|
|
s.context.putImageData(im, x, s.height - y);
|
|
return 0;
|
|
}
|
|
function caml_gr_point_color(x, y){
|
|
var
|
|
s = caml_gr_state_get(),
|
|
im = s.context.getImageData(x, s.height - y, 1, 1),
|
|
d = im.data;
|
|
return (d[0] << 16) + (d[1] << 8) + d[2];
|
|
}
|
|
function caml_gr_remember_mode(){
|
|
caml_failwith("caml_gr_remember_mode not Implemented");
|
|
}
|
|
function caml_gr_sigio_handler(){return 0;}
|
|
function caml_gr_sigio_signal(){return 0;}
|
|
function caml_gr_size_x(){var s = caml_gr_state_get(); return s.width;}
|
|
function caml_gr_size_y(){var s = caml_gr_state_get(); return s.height;}
|
|
function caml_gr_synchronize(){
|
|
caml_failwith("caml_gr_synchronize not Implemented");
|
|
}
|
|
function caml_gr_text_size(txt){
|
|
var
|
|
s = caml_gr_state_get(),
|
|
w = s.context.measureText(caml_jsstring_of_string(txt)).width;
|
|
return [0, w, s.text_size];
|
|
}
|
|
function caml_gr_wait_event(_evl){
|
|
caml_failwith
|
|
("caml_gr_wait_event not Implemented: use Graphics_js instead");
|
|
}
|
|
function caml_gr_window_id(_a){
|
|
caml_failwith("caml_gr_window_id not Implemented");
|
|
}
|
|
function caml_greaterequal(x, y){
|
|
return + (caml_compare_val(x, y, false) >= 0);
|
|
}
|
|
function caml_greaterthan(x, y){
|
|
return + (caml_compare_val(x, y, false) > 0);
|
|
}
|
|
function caml_hash_mix_jsbytes(h, s){
|
|
var len = s.length, i, w;
|
|
for(i = 0; i + 4 <= len; i += 4){
|
|
w =
|
|
s.charCodeAt(i) | s.charCodeAt(i + 1) << 8 | s.charCodeAt(i + 2) << 16
|
|
| s.charCodeAt(i + 3) << 24;
|
|
h = caml_hash_mix_int(h, w);
|
|
}
|
|
w = 0;
|
|
switch(len & 3){
|
|
case 3:
|
|
w = s.charCodeAt(i + 2) << 16;
|
|
case 2:
|
|
w |= s.charCodeAt(i + 1) << 8;
|
|
case 1:
|
|
w |= s.charCodeAt(i); h = caml_hash_mix_int(h, w);
|
|
}
|
|
h ^= len;
|
|
return h;
|
|
}
|
|
function caml_hash_mix_string(h, v){
|
|
return caml_hash_mix_jsbytes(h, caml_jsbytes_of_string(v));
|
|
}
|
|
function caml_hash_mix_bytes_arr(h, s){
|
|
var len = s.length, i, w;
|
|
for(i = 0; i + 4 <= len; i += 4){
|
|
w = s[i] | s[i + 1] << 8 | s[i + 2] << 16 | s[i + 3] << 24;
|
|
h = caml_hash_mix_int(h, w);
|
|
}
|
|
w = 0;
|
|
switch(len & 3){
|
|
case 3:
|
|
w = s[i + 2] << 16;
|
|
case 2:
|
|
w |= s[i + 1] << 8;
|
|
case 1:
|
|
w |= s[i]; h = caml_hash_mix_int(h, w);
|
|
}
|
|
h ^= len;
|
|
return h;
|
|
}
|
|
function caml_ml_bytes_content(s){
|
|
switch(s.t & 6){
|
|
case 2:
|
|
caml_convert_string_to_bytes(s); return s.c;
|
|
default: return s.c;
|
|
}
|
|
}
|
|
function caml_hash_mix_bytes(h, v){
|
|
var content = caml_ml_bytes_content(v);
|
|
return typeof content === "string"
|
|
? caml_hash_mix_jsbytes(h, content)
|
|
: caml_hash_mix_bytes_arr(h, content);
|
|
}
|
|
function caml_hash_mix_final(h){
|
|
h ^= h >>> 16;
|
|
h = caml_mul(h, 0x85ebca6b | 0);
|
|
h ^= h >>> 13;
|
|
h = caml_mul(h, 0xc2b2ae35 | 0);
|
|
h ^= h >>> 16;
|
|
return h;
|
|
}
|
|
function caml_hash(count, limit, seed, obj){
|
|
var queue, rd, wr, sz, num, h, v, i, len;
|
|
sz = limit;
|
|
if(sz < 0 || sz > 256) sz = 256;
|
|
num = count;
|
|
h = seed;
|
|
queue = [obj];
|
|
rd = 0;
|
|
wr = 1;
|
|
while(rd < wr && num > 0){
|
|
v = queue[rd++];
|
|
if(v?.caml_custom){
|
|
if
|
|
(caml_custom_ops[v.caml_custom] && caml_custom_ops[v.caml_custom].hash){
|
|
var hh = caml_custom_ops[v.caml_custom].hash(v);
|
|
h = caml_hash_mix_int(h, hh);
|
|
num--;
|
|
}
|
|
}
|
|
else if(Array.isArray(v) && v[0] === (v[0] | 0))
|
|
switch(v[0]){
|
|
case 248:
|
|
h = caml_hash_mix_int(h, v[2]); num--; break;
|
|
case 250:
|
|
queue[--rd] = v[1]; break;
|
|
default:
|
|
if(caml_is_continuation_tag(v[0])) break;
|
|
var tag = v.length - 1 << 10 | v[0];
|
|
h = caml_hash_mix_int(h, tag);
|
|
for(i = 1, len = v.length; i < len; i++){if(wr >= sz) break; queue[wr++] = v[i];
|
|
}
|
|
break;
|
|
}
|
|
else if(caml_is_ml_bytes(v)){
|
|
h = caml_hash_mix_bytes(h, v);
|
|
num--;
|
|
}
|
|
else if(caml_is_ml_string(v)){
|
|
h = caml_hash_mix_string(h, v);
|
|
num--;
|
|
}
|
|
else if(typeof v === "string"){
|
|
h = caml_hash_mix_jsbytes(h, v);
|
|
num--;
|
|
}
|
|
else if(v === (v | 0)){
|
|
h = caml_hash_mix_int(h, v + v + 1);
|
|
num--;
|
|
}
|
|
else if(typeof v === "number"){h = caml_hash_mix_float(h, v); num--;}
|
|
}
|
|
h = caml_hash_mix_final(h);
|
|
return h & 0x3fffffff;
|
|
}
|
|
function caml_hash_mix_bigstring(h, bs){
|
|
return caml_hash_mix_bytes_arr(h, bs.data);
|
|
}
|
|
function caml_hash_mix_int64(h, v){
|
|
h = caml_hash_mix_int(h, caml_int64_lo32(v));
|
|
h = caml_hash_mix_int(h, caml_int64_hi32(v));
|
|
return h;
|
|
}
|
|
function num_digits_nat(nat, ofs, len){
|
|
for(var i = len - 1; i >= 0; i--)
|
|
if(nat.data[ofs + i] !== 0) return i + 1;
|
|
return 1;
|
|
}
|
|
function caml_hash_nat(x){
|
|
var len = num_digits_nat(x, 0, x.data.length), h = 0;
|
|
for(var i = 0; i < len; i++) h = caml_hash_mix_int(h, x.data[i]);
|
|
return h;
|
|
}
|
|
function caml_hexstring_of_float(x, prec, style){
|
|
if(! Number.isFinite(x)){
|
|
if(Number.isNaN(x)) return caml_string_of_jsstring("nan");
|
|
return caml_string_of_jsstring(x > 0 ? "infinity" : "-infinity");
|
|
}
|
|
var
|
|
sign = x === 0 && 1 / x === Number.NEGATIVE_INFINITY ? 1 : x >= 0 ? 0 : 1;
|
|
if(sign) x = - x;
|
|
var exp = 0;
|
|
if(x === 0)
|
|
;
|
|
else if(x < 1)
|
|
while(x < 1 && exp > - 1022){x *= 2; exp--;}
|
|
else
|
|
while(x >= 2){x /= 2; exp++;}
|
|
var exp_sign = exp < 0 ? "" : "+", sign_str = "";
|
|
if(sign)
|
|
sign_str = "-";
|
|
else
|
|
switch(style){
|
|
case 43:
|
|
sign_str = "+"; break;
|
|
case 32:
|
|
sign_str = " "; break;
|
|
default: break;
|
|
}
|
|
if(prec >= 0 && prec < 13){
|
|
var cst = Math.pow(2, prec * 4);
|
|
x = Math.round(x * cst) / cst;
|
|
}
|
|
var x_str = x.toString(16);
|
|
if(prec >= 0){
|
|
var idx = x_str.indexOf(".");
|
|
if(idx < 0)
|
|
x_str += "." + caml_str_repeat(prec, "0");
|
|
else{
|
|
var size = idx + 1 + prec;
|
|
if(x_str.length < size)
|
|
x_str += caml_str_repeat(size - x_str.length, "0");
|
|
else
|
|
x_str = x_str.slice(0, size);
|
|
}
|
|
}
|
|
return caml_string_of_jsstring
|
|
(sign_str + "0x" + x_str + "p" + exp_sign + exp.toString(10));
|
|
}
|
|
function caml_hypot_float(x, y){return Math.hypot(x, y);}
|
|
var caml_marshal_header_size = 16;
|
|
function caml_refill(chan){
|
|
if(chan.refill != null){
|
|
var str = chan.refill(), str_a = caml_uint8_array_of_string(str);
|
|
if(str_a.length === 0)
|
|
chan.refill = null;
|
|
else{
|
|
if(chan.buffer.length < chan.buffer_max + str_a.length){
|
|
var b = new Uint8Array(chan.buffer_max + str_a.length);
|
|
b.set(chan.buffer);
|
|
chan.buffer = b;
|
|
}
|
|
chan.buffer.set(str_a, chan.buffer_max);
|
|
chan.offset += str_a.length;
|
|
chan.buffer_max += str_a.length;
|
|
}
|
|
}
|
|
else{
|
|
if(chan.fd === - 1) caml_raise_sys_error("Bad file descriptor");
|
|
var
|
|
nread =
|
|
chan.file.read
|
|
(chan.buffer,
|
|
chan.buffer_max,
|
|
chan.buffer.length - chan.buffer_max,
|
|
false);
|
|
chan.offset += nread;
|
|
chan.buffer_max += nread;
|
|
}
|
|
}
|
|
function caml_raise_end_of_file(){
|
|
caml_raise_constant(caml_global_data.End_of_file);
|
|
}
|
|
function caml_marshal_data_size(s, ofs){
|
|
var r = new UInt8ArrayReader(caml_uint8_array_of_bytes(s), ofs);
|
|
function readvlq(overflow){
|
|
var c = r.read8u(), n = c & 0x7f;
|
|
while((c & 0x80) !== 0){
|
|
c = r.read8u();
|
|
var n7 = n << 7;
|
|
if(n !== n7 >> 7) overflow[0] = true;
|
|
n = n7 | c & 0x7f;
|
|
}
|
|
return n;
|
|
}
|
|
switch(r.read32u()){
|
|
case 0x8495a6be:
|
|
var header_len = 20, data_len = r.read32u(); break;
|
|
case 0x8495a6bd:
|
|
var
|
|
header_len = r.read8u() & 0x3f,
|
|
overflow = [false],
|
|
data_len = readvlq(overflow);
|
|
if(overflow[0])
|
|
caml_failwith
|
|
("Marshal.data_size: object too large to be read back on this platform");
|
|
break;
|
|
case 0x8495a6bf:
|
|
caml_failwith
|
|
("Marshal.data_size: object too large to be read back on a 32-bit platform");
|
|
break;
|
|
default: caml_failwith("Marshal.data_size: bad object"); break;
|
|
}
|
|
return header_len - caml_marshal_header_size + data_len;
|
|
}
|
|
function caml_set_oo_id(b){b[2] = caml_oo_last_id++; return b;}
|
|
function caml_input_value_from_reader(reader){
|
|
function readvlq(overflow){
|
|
var c = reader.read8u(), n = c & 0x7f;
|
|
while((c & 0x80) !== 0){
|
|
c = reader.read8u();
|
|
var n7 = n << 7;
|
|
if(n !== n7 >> 7) overflow[0] = true;
|
|
n = n7 | c & 0x7f;
|
|
}
|
|
return n;
|
|
}
|
|
var old_pos = reader.i, magic = reader.read32u();
|
|
switch(magic){
|
|
case 0x8495a6be:
|
|
var
|
|
header_len = 20,
|
|
compressed = 0,
|
|
data_len = reader.read32u(),
|
|
uncompressed_data_len = data_len,
|
|
num_objects = reader.read32u(),
|
|
_size_32 = reader.read32u(),
|
|
_size_64 = reader.read32u();
|
|
break;
|
|
case 0x8495a6bd:
|
|
var
|
|
header_len = reader.read8u() & 0x3f,
|
|
compressed = 1,
|
|
overflow = [false],
|
|
data_len = readvlq(overflow),
|
|
uncompressed_data_len = readvlq(overflow),
|
|
num_objects = readvlq(overflow),
|
|
_size_32 = readvlq(overflow),
|
|
_size_64 = readvlq(overflow);
|
|
if(overflow[0])
|
|
caml_failwith
|
|
("caml_input_value_from_reader: object too large to be read back on this platform");
|
|
break;
|
|
case 0x8495a6bf:
|
|
caml_failwith
|
|
("caml_input_value_from_reader: object too large to be read back on a 32-bit platform");
|
|
break;
|
|
default:
|
|
caml_failwith("caml_input_value_from_reader: bad object"); break;
|
|
}
|
|
if(header_len !== reader.i - old_pos)
|
|
caml_failwith("caml_input_value_from_reader: invalid header");
|
|
var
|
|
stack = [],
|
|
objects = [],
|
|
intern_obj_table = num_objects > 0 ? [] : null,
|
|
obj_counter = 0;
|
|
function intern_rec(reader){
|
|
var code = reader.read8u();
|
|
if(code >= 0x40)
|
|
if(code >= 0x80){
|
|
var tag = code & 0xf, size = code >> 4 & 0x7, v = [tag];
|
|
if(size === 0) return v;
|
|
if(intern_obj_table) intern_obj_table[obj_counter++] = v;
|
|
if(tag === 248) objects.push(v);
|
|
stack.push(v, size);
|
|
return v;
|
|
}
|
|
else
|
|
return code & 0x3f;
|
|
else if(code >= 0x20){
|
|
var len = code & 0x1f, v = reader.readstr(len);
|
|
if(intern_obj_table) intern_obj_table[obj_counter++] = v;
|
|
return v;
|
|
}
|
|
else
|
|
switch(code){
|
|
case 0x00:
|
|
return reader.read8s();
|
|
case 0x01:
|
|
return reader.read16s();
|
|
case 0x02:
|
|
return reader.read32s();
|
|
case 0x03:
|
|
caml_failwith("input_value: integer too large"); break;
|
|
case 0x04:
|
|
var offset = reader.read8u();
|
|
if(compressed === 0) offset = obj_counter - offset;
|
|
return intern_obj_table[offset];
|
|
case 0x05:
|
|
var offset = reader.read16u();
|
|
if(compressed === 0) offset = obj_counter - offset;
|
|
return intern_obj_table[offset];
|
|
case 0x06:
|
|
var offset = reader.read32u();
|
|
if(compressed === 0) offset = obj_counter - offset;
|
|
return intern_obj_table[offset];
|
|
case 0x08:
|
|
var
|
|
header = reader.read32u(),
|
|
tag = header & 0xff,
|
|
size = header >> 10,
|
|
v = [tag];
|
|
if(size === 0) return v;
|
|
if(intern_obj_table) intern_obj_table[obj_counter++] = v;
|
|
if(tag === 248) objects.push(v);
|
|
stack.push(v, size);
|
|
return v;
|
|
case 0x13:
|
|
caml_failwith("input_value: data block too large"); break;
|
|
case 0x09:
|
|
var len = reader.read8u(), v = reader.readstr(len);
|
|
if(intern_obj_table) intern_obj_table[obj_counter++] = v;
|
|
return v;
|
|
case 0x0a:
|
|
var len = reader.read32u(), v = reader.readstr(len);
|
|
if(intern_obj_table) intern_obj_table[obj_counter++] = v;
|
|
return v;
|
|
case 0x0c:
|
|
var t = new Array(8);
|
|
for(var i = 0; i < 8; i++) t[7 - i] = reader.read8u();
|
|
var v = caml_float_of_bytes(t);
|
|
if(intern_obj_table) intern_obj_table[obj_counter++] = v;
|
|
return v;
|
|
case 0x0b:
|
|
var t = new Array(8);
|
|
for(var i = 0; i < 8; i++) t[i] = reader.read8u();
|
|
var v = caml_float_of_bytes(t);
|
|
if(intern_obj_table) intern_obj_table[obj_counter++] = v;
|
|
return v;
|
|
case 0x0e:
|
|
var len = reader.read8u(), v = new Array(len + 1);
|
|
v[0] = 254;
|
|
var t = new Array(8);
|
|
if(intern_obj_table) intern_obj_table[obj_counter++] = v;
|
|
for(var i = 1; i <= len; i++){
|
|
for(var j = 0; j < 8; j++) t[7 - j] = reader.read8u();
|
|
v[i] = caml_float_of_bytes(t);
|
|
}
|
|
return v;
|
|
case 0x0d:
|
|
var len = reader.read8u(), v = new Array(len + 1);
|
|
v[0] = 254;
|
|
var t = new Array(8);
|
|
if(intern_obj_table) intern_obj_table[obj_counter++] = v;
|
|
for(var i = 1; i <= len; i++){
|
|
for(var j = 0; j < 8; j++) t[j] = reader.read8u();
|
|
v[i] = caml_float_of_bytes(t);
|
|
}
|
|
return v;
|
|
case 0x07:
|
|
var len = reader.read32u(), v = new Array(len + 1);
|
|
v[0] = 254;
|
|
if(intern_obj_table) intern_obj_table[obj_counter++] = v;
|
|
var t = new Array(8);
|
|
for(var i = 1; i <= len; i++){
|
|
for(var j = 0; j < 8; j++) t[7 - j] = reader.read8u();
|
|
v[i] = caml_float_of_bytes(t);
|
|
}
|
|
return v;
|
|
case 0x0f:
|
|
var len = reader.read32u(), v = new Array(len + 1);
|
|
v[0] = 254;
|
|
var t = new Array(8);
|
|
for(var i = 1; i <= len; i++){
|
|
for(var j = 0; j < 8; j++) t[j] = reader.read8u();
|
|
v[i] = caml_float_of_bytes(t);
|
|
}
|
|
return v;
|
|
case 0x10:
|
|
case 0x11:
|
|
caml_failwith("input_value: code pointer"); break;
|
|
case 0x12:
|
|
case 0x18:
|
|
case 0x19:
|
|
var c, s = "";
|
|
while((c = reader.read8u()) !== 0) s += String.fromCharCode(c);
|
|
var ops = caml_custom_ops[s], expected_size;
|
|
if(! ops)
|
|
caml_failwith("input_value: unknown custom block identifier");
|
|
switch(code){
|
|
case 0x12: break;
|
|
case 0x19:
|
|
if(! ops.fixed_length)
|
|
caml_failwith("input_value: expected a fixed-size custom block");
|
|
expected_size = ops.fixed_length;
|
|
break;
|
|
case 0x18:
|
|
expected_size = reader.read32u();
|
|
reader.read32s();
|
|
reader.read32s();
|
|
break;
|
|
}
|
|
var size = [0], v = ops.deserialize(reader, size);
|
|
if(expected_size !== undefined)
|
|
if(expected_size !== size[0])
|
|
caml_failwith
|
|
("input_value: incorrect length of serialized custom block");
|
|
if(intern_obj_table) intern_obj_table[obj_counter++] = v;
|
|
return v;
|
|
default: caml_failwith("input_value: ill-formed message");
|
|
}
|
|
}
|
|
if(compressed)
|
|
if(caml_decompress_input)
|
|
var
|
|
data = reader.readuint8array(data_len),
|
|
res = new Uint8Array(uncompressed_data_len),
|
|
res = caml_decompress_input(data, res),
|
|
reader = new UInt8ArrayReader(res, 0);
|
|
else
|
|
caml_failwith("input_value: compressed object, cannot decompress");
|
|
var res = intern_rec(reader);
|
|
while(stack.length > 0){
|
|
var size = stack.pop(), v = stack.pop(), d = v.length;
|
|
if(d < size) stack.push(v, size);
|
|
v[d] = intern_rec(reader);
|
|
}
|
|
while(objects.length > 0){
|
|
var x = objects.pop();
|
|
if(x[2] >= 0) caml_set_oo_id(x);
|
|
}
|
|
return res;
|
|
}
|
|
function caml_input_value_from_bytes(s, ofs){
|
|
var
|
|
c = caml_ml_bytes_content(s),
|
|
ofs = typeof ofs === "number" ? ofs : ofs[0],
|
|
reader =
|
|
c instanceof Uint8Array
|
|
? new UInt8ArrayReader(c, ofs)
|
|
: new JsStringReader(c, ofs);
|
|
return caml_input_value_from_reader(reader);
|
|
}
|
|
function caml_input_value(chanid){
|
|
var
|
|
chan = caml_ml_channel_get(chanid),
|
|
header = new Uint8Array(caml_marshal_header_size);
|
|
function block(buffer, offset, n){
|
|
var r = 0;
|
|
while(r < n){
|
|
if(chan.buffer_curr >= chan.buffer_max){
|
|
chan.buffer_curr = 0;
|
|
chan.buffer_max = 0;
|
|
caml_refill(chan);
|
|
}
|
|
if(chan.buffer_curr >= chan.buffer_max) break;
|
|
buffer[offset + r] = chan.buffer[chan.buffer_curr];
|
|
chan.buffer_curr++;
|
|
r++;
|
|
}
|
|
return r;
|
|
}
|
|
var r = block(header, 0, caml_marshal_header_size);
|
|
if(r === 0)
|
|
caml_raise_end_of_file();
|
|
else if(r < caml_marshal_header_size)
|
|
caml_failwith("input_value: truncated object");
|
|
var
|
|
len = caml_marshal_data_size(caml_bytes_of_uint8_array(header), 0),
|
|
buf = new Uint8Array(len + caml_marshal_header_size);
|
|
buf.set(header, 0);
|
|
var r = block(buf, caml_marshal_header_size, len);
|
|
if(r < len)
|
|
caml_failwith("input_value: truncated object " + r + " " + len);
|
|
var res = caml_input_value_from_bytes(caml_bytes_of_uint8_array(buf), 0);
|
|
return res;
|
|
}
|
|
function caml_input_value_to_outside_heap(c){return caml_input_value(c);}
|
|
function caml_install_signal_handler(){return 0;}
|
|
function caml_int32_bswap(x){
|
|
return (x & 0x000000ff) << 24 | (x & 0x0000ff00) << 8
|
|
| (x & 0x00ff0000) >>> 8
|
|
| (x & 0xff000000) >>> 24;
|
|
}
|
|
function caml_int64_add(x, y){return x.add(y);}
|
|
function caml_int64_and(x, y){return x.and(y);}
|
|
function caml_int64_bswap(x){
|
|
var y = caml_int64_to_bytes(x);
|
|
return caml_int64_of_bytes
|
|
([y[7], y[6], y[5], y[4], y[3], y[2], y[1], y[0]]);
|
|
}
|
|
function caml_int64_div(x, y){return x.div(y);}
|
|
function caml_int64_is_zero(x){return + x.isZero();}
|
|
function caml_int64_of_int32(x){
|
|
return new MlInt64(x & 0xffffff, x >> 24 & 0xffffff, x >> 31 & 0xffff);
|
|
}
|
|
function caml_int64_to_int32(x){return x.toInt();}
|
|
function caml_int64_is_negative(x){return + x.isNeg();}
|
|
function caml_int64_neg(x){return x.neg();}
|
|
function caml_int64_format(fmt, x){
|
|
var f = caml_parse_format(fmt);
|
|
if(f.signedconv && caml_int64_is_negative(x)){f.sign = - 1; x = caml_int64_neg(x);}
|
|
var
|
|
buffer = "",
|
|
wbase = caml_int64_of_int32(f.base),
|
|
cvtbl = "0123456789abcdef";
|
|
do{
|
|
var p = x.udivmod(wbase);
|
|
x = p.quotient;
|
|
buffer = cvtbl.charAt(caml_int64_to_int32(p.modulus)) + buffer;
|
|
}
|
|
while
|
|
(! caml_int64_is_zero(x));
|
|
if(f.prec >= 0){
|
|
f.filler = " ";
|
|
var n = f.prec - buffer.length;
|
|
if(n > 0) buffer = caml_str_repeat(n, "0") + buffer;
|
|
}
|
|
return caml_finish_formatting(f, buffer);
|
|
}
|
|
function caml_int64_mod(x, y){return x.mod(y);}
|
|
function caml_int64_mul(x, y){return x.mul(y);}
|
|
function caml_int64_ult(x, y){return x.ucompare(y) < 0;}
|
|
function caml_parse_sign_and_base(s){
|
|
var
|
|
i = 0,
|
|
len = caml_ml_string_length(s),
|
|
base = 10,
|
|
sign = 1,
|
|
signedness = 1;
|
|
if(len > 0)
|
|
switch(caml_string_unsafe_get(s, i)){
|
|
case 45:
|
|
i++; sign = - 1; break;
|
|
case 43:
|
|
i++; sign = 1; break;
|
|
}
|
|
if(i + 1 < len && caml_string_unsafe_get(s, i) === 48)
|
|
switch(caml_string_unsafe_get(s, i + 1)){
|
|
case 120:
|
|
case 88:
|
|
signedness = 0; base = 16; i += 2; break;
|
|
case 111:
|
|
case 79:
|
|
signedness = 0; base = 8; i += 2; break;
|
|
case 98:
|
|
case 66:
|
|
signedness = 0; base = 2; i += 2; break;
|
|
case 117:
|
|
case 85:
|
|
signedness = 0; i += 2; break;
|
|
}
|
|
return [i, sign, base, signedness];
|
|
}
|
|
function caml_parse_digit(c){
|
|
if(c >= 48 && c <= 57) return c - 48;
|
|
if(c >= 65 && c <= 90) return c - 55;
|
|
if(c >= 97 && c <= 122) return c - 87;
|
|
return - 1;
|
|
}
|
|
function caml_int64_of_string(s){
|
|
var
|
|
r = caml_parse_sign_and_base(s),
|
|
i = r[0],
|
|
sign = r[1],
|
|
base = r[2],
|
|
signedness = r[3],
|
|
base64 = caml_int64_of_int32(base),
|
|
threshold = MlInt64.UNSIGNED_MAX.udivmod(base64).quotient,
|
|
c = caml_string_unsafe_get(s, i),
|
|
d = caml_parse_digit(c);
|
|
if(d < 0 || d >= base) caml_failwith("Int64.of_string");
|
|
var res = caml_int64_of_int32(d);
|
|
for(;;){
|
|
i++;
|
|
c = caml_string_unsafe_get(s, i);
|
|
if(c === 95) continue;
|
|
d = caml_parse_digit(c);
|
|
if(d < 0 || d >= base) break;
|
|
if(caml_int64_ult(threshold, res)) caml_failwith("Int64.of_string");
|
|
d = caml_int64_of_int32(d);
|
|
res = caml_int64_add(caml_int64_mul(base64, res), d);
|
|
if(caml_int64_ult(res, d)) caml_failwith("Int64.of_string");
|
|
}
|
|
if(i !== caml_ml_string_length(s)) caml_failwith("Int64.of_string");
|
|
if
|
|
(signedness
|
|
&&
|
|
caml_int64_ult(sign < 0 ? MlInt64.SIGNED_MIN : MlInt64.SIGNED_MAX, res))
|
|
caml_failwith("Int64.of_string");
|
|
if(sign < 0) res = caml_int64_neg(res);
|
|
return res;
|
|
}
|
|
function caml_int64_or(x, y){return x.or(y);}
|
|
function caml_int64_shift_left(x, s){return x.shift_left(s);}
|
|
function caml_int64_shift_right(x, s){return x.shift_right(s);}
|
|
function caml_int64_shift_right_unsigned(x, s){return x.shift_right_unsigned(s);
|
|
}
|
|
function caml_int64_sub(x, y){return x.sub(y);}
|
|
function caml_int64_to_float(x){return x.toFloat();}
|
|
function caml_int64_xor(x, y){return x.xor(y);}
|
|
function caml_int_of_string(s){
|
|
var
|
|
r = caml_parse_sign_and_base(s),
|
|
i = r[0],
|
|
sign = r[1],
|
|
base = r[2],
|
|
signedness = r[3],
|
|
len = caml_ml_string_length(s),
|
|
threshold = - 1 >>> 0,
|
|
c = i < len ? caml_string_unsafe_get(s, i) : 0,
|
|
d = caml_parse_digit(c);
|
|
if(d < 0 || d >= base) caml_failwith("int_of_string");
|
|
var res = d;
|
|
for(i++; i < len; i++){
|
|
c = caml_string_unsafe_get(s, i);
|
|
if(c === 95) continue;
|
|
d = caml_parse_digit(c);
|
|
if(d < 0 || d >= base) break;
|
|
res = base * res + d;
|
|
if(res > threshold) caml_failwith("int_of_string");
|
|
}
|
|
if(i !== len) caml_failwith("int_of_string");
|
|
res = sign * res;
|
|
if(signedness && (res | 0) !== res) caml_failwith("int_of_string");
|
|
return res | 0;
|
|
}
|
|
var caml_io_buffer_size = 65536;
|
|
function caml_is_js(){return 1;}
|
|
function caml_is_printable(c){return + (c > 31 && c < 127);}
|
|
function caml_js_call(f, o, args){
|
|
return f.apply(o, caml_js_from_array(args));
|
|
}
|
|
function caml_js_delete(o, f){delete o[f]; return 0;}
|
|
function caml_js_equals(x, y){return + (x == y);}
|
|
function caml_js_error_of_exception(exn){
|
|
if(exn.js_error) return exn.js_error;
|
|
return null;
|
|
}
|
|
function caml_js_error_option_of_exception(exn){
|
|
if(exn.js_error) return [0, exn.js_error];
|
|
return 0;
|
|
}
|
|
function caml_js_eval_string(s){
|
|
return eval?.('"use strict";' + caml_jsstring_of_string(s));
|
|
}
|
|
function caml_js_expr(s){
|
|
console.error("caml_js_expr: fallback to runtime evaluation\n");
|
|
return eval?.('"use strict";(' + caml_jsstring_of_string(s) + ")");
|
|
}
|
|
function caml_js_from_bool(x){return ! ! x;}
|
|
function caml_js_from_float(x){return x;}
|
|
function caml_js_from_string(s){return caml_jsstring_of_string(s);}
|
|
function caml_js_fun_call(f, a){
|
|
switch(a.length){
|
|
case 1:
|
|
return f();
|
|
case 2:
|
|
return f(a[1]);
|
|
case 3:
|
|
return f(a[1], a[2]);
|
|
case 4:
|
|
return f(a[1], a[2], a[3]);
|
|
case 5:
|
|
return f(a[1], a[2], a[3], a[4]);
|
|
case 6:
|
|
return f(a[1], a[2], a[3], a[4], a[5]);
|
|
case 7:
|
|
return f(a[1], a[2], a[3], a[4], a[5], a[6]);
|
|
case 8:
|
|
return f(a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
|
|
}
|
|
return f.apply(null, caml_js_from_array(a));
|
|
}
|
|
function caml_js_function_arity(f){return f.l >= 0 ? f.l : f.l = f.length;}
|
|
function caml_js_get(o, f){return o[f];}
|
|
function caml_js_get_console(){
|
|
var
|
|
c = console,
|
|
m =
|
|
["log",
|
|
"debug",
|
|
"info",
|
|
"warn",
|
|
"error",
|
|
"assert",
|
|
"dir",
|
|
"dirxml",
|
|
"trace",
|
|
"group",
|
|
"groupCollapsed",
|
|
"groupEnd",
|
|
"time",
|
|
"timeEnd"];
|
|
function f(){}
|
|
for(var i = 0; i < m.length; i++) if(! c[m[i]]) c[m[i]] = f;
|
|
return c;
|
|
}
|
|
function caml_js_html_entities(s){
|
|
var entity = /^&#?[0-9a-zA-Z]+;$/;
|
|
if(s.match(entity)){
|
|
var str, temp = document.createElement("p");
|
|
temp.innerHTML = s;
|
|
str = temp.textContent || temp.innerText;
|
|
temp = null;
|
|
return str;
|
|
}
|
|
else
|
|
return null;
|
|
}
|
|
var caml_js_regexps = {amp: /&/g, lt: /</g, quot: /"/g, all: /[&<"]/};
|
|
function caml_js_html_escape(s){
|
|
if(! caml_js_regexps.all.test(s)) return s;
|
|
return s.replace(caml_js_regexps.amp, "&").replace
|
|
(caml_js_regexps.lt, "<").replace
|
|
(caml_js_regexps.quot, """);
|
|
}
|
|
function caml_js_instanceof(o, c){return o instanceof c ? 1 : 0;}
|
|
function caml_js_meth_call(o, f, args){
|
|
return o[caml_jsstring_of_string(f)].apply(o, caml_js_from_array(args));
|
|
}
|
|
function caml_js_new(c, a){
|
|
switch(a.length){
|
|
case 1:
|
|
return new c();
|
|
case 2:
|
|
return new c(a[1]);
|
|
case 3:
|
|
return new c(a[1], a[2]);
|
|
case 4:
|
|
return new c(a[1], a[2], a[3]);
|
|
case 5:
|
|
return new c(a[1], a[2], a[3], a[4]);
|
|
case 6:
|
|
return new c(a[1], a[2], a[3], a[4], a[5]);
|
|
case 7:
|
|
return new c(a[1], a[2], a[3], a[4], a[5], a[6]);
|
|
case 8:
|
|
return new c(a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
|
|
}
|
|
function F(){return c.apply(this, caml_js_from_array(a));}
|
|
F.prototype = c.prototype;
|
|
return new F();
|
|
}
|
|
function caml_js_object(a){
|
|
var o = {};
|
|
for(var i = 1; i < a.length; i++){
|
|
var p = a[i];
|
|
o[caml_jsstring_of_string(p[1])] = p[2];
|
|
}
|
|
return o;
|
|
}
|
|
function caml_js_pure_expr(f){return caml_callback(f, [0]);}
|
|
function caml_js_set(o, f, v){o[f] = v; return 0;}
|
|
function caml_js_strict_equals(x, y){return + (x === y);}
|
|
function caml_js_to_array(a){
|
|
var len = a.length, b = new Array(len + 1);
|
|
b[0] = 0;
|
|
for(var i = 0; i < len; i++) b[i + 1] = a[i];
|
|
return b;
|
|
}
|
|
function caml_js_to_bool(x){return + x;}
|
|
function caml_js_to_byte_string(s){return caml_string_of_jsbytes(s);}
|
|
function caml_js_to_float(x){return x;}
|
|
function caml_js_to_int32(x){return x | 0;}
|
|
function caml_js_to_string(s){return caml_string_of_jsstring(s);}
|
|
function caml_js_typeof(o){return typeof o;}
|
|
function caml_js_var(x){
|
|
var x = caml_jsstring_of_string(x);
|
|
if(! x.match(/^[a-zA-Z_$][a-zA-Z_$0-9]*(\.[a-zA-Z_$][a-zA-Z_$0-9]*)*$/))
|
|
console.error
|
|
('caml_js_var: "' + x
|
|
+ '" is not a valid JavaScript variable. continuing ..');
|
|
return eval?.(x);
|
|
}
|
|
function caml_js_wrap_callback(f){
|
|
return function(...args){
|
|
if(args.length === 0) args = [undefined];
|
|
var res = caml_callback(f, args);
|
|
return res instanceof Function ? caml_js_wrap_callback(res) : res;};
|
|
}
|
|
function caml_js_wrap_callback_arguments(f){
|
|
return function(...args){return caml_callback(f, [args]);};
|
|
}
|
|
function caml_js_wrap_callback_strict(arity, f){
|
|
return function(...args){
|
|
args.length = arity;
|
|
return caml_callback(f, args);};
|
|
}
|
|
function caml_js_wrap_callback_unsafe(f){
|
|
return function(...args){
|
|
var len = caml_js_function_arity(f);
|
|
args.length = len;
|
|
return caml_callback(f, args);};
|
|
}
|
|
function caml_js_wrap_meth_callback(f){
|
|
return function(...args){
|
|
args.unshift(this);
|
|
var res = caml_callback(f, args);
|
|
return res instanceof Function ? caml_js_wrap_callback(res) : res;};
|
|
}
|
|
function caml_js_wrap_meth_callback_arguments(f){
|
|
return function(...args){return caml_callback(f, [this, args]);};
|
|
}
|
|
function caml_js_wrap_meth_callback_strict(arity, f){
|
|
return function(...args){
|
|
args.length = arity;
|
|
args.unshift(this);
|
|
return caml_callback(f, args);};
|
|
}
|
|
function caml_js_wrap_meth_callback_unsafe(f){
|
|
return function(...args){
|
|
var len = caml_js_function_arity(f);
|
|
args.unshift(this);
|
|
args.length = len;
|
|
return caml_callback(f, args);};
|
|
}
|
|
function caml_jsoo_flags_effects(_unit){
|
|
return caml_string_of_jsstring("disabled");
|
|
}
|
|
function caml_jsoo_flags_use_js_string(_unit){return 1;}
|
|
function caml_lazy_make_forward(v){return [250, v];}
|
|
function caml_obj_tag(x){
|
|
if(Array.isArray(x) && x[0] === x[0] >>> 0)
|
|
return x[0];
|
|
else if(caml_is_ml_bytes(x))
|
|
return 252;
|
|
else if(caml_is_ml_string(x))
|
|
return 252;
|
|
else if(x instanceof Function || typeof x === "function")
|
|
return 247;
|
|
else if(x?.caml_custom) return 255; else return 1000;
|
|
}
|
|
function caml_lazy_read_result(o){
|
|
return caml_obj_tag(o) === 250 ? o[1] : o;
|
|
}
|
|
function caml_obj_update_tag(b, o, n){
|
|
if(b[0] === o){b[0] = n; return 1;}
|
|
return 0;
|
|
}
|
|
function caml_lazy_reset_to_lazy(o){
|
|
caml_obj_update_tag(o, 244, 246);
|
|
return 0;
|
|
}
|
|
function caml_lazy_update_to_forcing(o){
|
|
return Array.isArray(o) && o[0] === o[0] >>> 0
|
|
&& caml_obj_update_tag(o, 246, 244)
|
|
? 0
|
|
: 1;
|
|
}
|
|
function caml_lazy_update_to_forward(o){
|
|
caml_obj_update_tag(o, 244, 250);
|
|
return 0;
|
|
}
|
|
function caml_ldexp_float(x, exp){
|
|
exp |= 0;
|
|
if(exp > 1023){
|
|
exp -= 1023;
|
|
x *= Math.pow(2, 1023);
|
|
if(exp > 1023){exp -= 1023; x *= Math.pow(2, 1023);}
|
|
}
|
|
if(exp < - 1023){exp += 1023; x *= Math.pow(2, - 1023);}
|
|
x *= Math.pow(2, exp);
|
|
return x;
|
|
}
|
|
function caml_lessequal(x, y){
|
|
return + (caml_compare_val(x, y, false) <= 0);
|
|
}
|
|
function caml_lessthan(x, y){return + (caml_compare_val(x, y, false) < 0);}
|
|
function caml_lex_array(s){
|
|
s = caml_jsbytes_of_string(s);
|
|
var l = s.length / 2, a = new Array(l);
|
|
for(var i = 0; i < l; i++)
|
|
a[i] = (s.charCodeAt(2 * i) | s.charCodeAt(2 * i + 1) << 8) << 16 >> 16;
|
|
return a;
|
|
}
|
|
function caml_lex_engine(tbl, start_state, lexbuf){
|
|
var
|
|
lex_buffer = 2,
|
|
lex_buffer_len = 3,
|
|
lex_start_pos = 5,
|
|
lex_curr_pos = 6,
|
|
lex_last_pos = 7,
|
|
lex_last_action = 8,
|
|
lex_eof_reached = 9,
|
|
lex_base = 1,
|
|
lex_backtrk = 2,
|
|
lex_default = 3,
|
|
lex_trans = 4,
|
|
lex_check = 5;
|
|
if(! tbl.lex_default){
|
|
tbl.lex_base = caml_lex_array(tbl[lex_base]);
|
|
tbl.lex_backtrk = caml_lex_array(tbl[lex_backtrk]);
|
|
tbl.lex_check = caml_lex_array(tbl[lex_check]);
|
|
tbl.lex_trans = caml_lex_array(tbl[lex_trans]);
|
|
tbl.lex_default = caml_lex_array(tbl[lex_default]);
|
|
}
|
|
var c, state = start_state, buffer = lexbuf[lex_buffer];
|
|
if(state >= 0){
|
|
lexbuf[lex_last_pos] = lexbuf[lex_start_pos] = lexbuf[lex_curr_pos];
|
|
lexbuf[lex_last_action] = - 1;
|
|
}
|
|
else
|
|
state = - state - 1;
|
|
for(;;){
|
|
var base = tbl.lex_base[state];
|
|
if(base < 0) return - base - 1;
|
|
var backtrk = tbl.lex_backtrk[state];
|
|
if(backtrk >= 0){
|
|
lexbuf[lex_last_pos] = lexbuf[lex_curr_pos];
|
|
lexbuf[lex_last_action] = backtrk;
|
|
}
|
|
if(lexbuf[lex_curr_pos] >= lexbuf[lex_buffer_len])
|
|
if(lexbuf[lex_eof_reached] === 0) return - state - 1; else c = 256;
|
|
else{
|
|
c = caml_bytes_unsafe_get(buffer, lexbuf[lex_curr_pos]);
|
|
lexbuf[lex_curr_pos]++;
|
|
}
|
|
if(tbl.lex_check[base + c] === state)
|
|
state = tbl.lex_trans[base + c];
|
|
else
|
|
state = tbl.lex_default[state];
|
|
if(state < 0){
|
|
lexbuf[lex_curr_pos] = lexbuf[lex_last_pos];
|
|
if(lexbuf[lex_last_action] === - 1)
|
|
caml_failwith("lexing: empty token");
|
|
else
|
|
return lexbuf[lex_last_action];
|
|
}
|
|
else if(c === 256) lexbuf[lex_eof_reached] = 0;
|
|
}
|
|
}
|
|
function caml_list_mount_point(){
|
|
var prev = 0;
|
|
for(var i = 0; i < jsoo_mount_point.length; i++){
|
|
var old = prev;
|
|
prev = [0, caml_string_of_jsstring(jsoo_mount_point[i].path), old];
|
|
}
|
|
return prev;
|
|
}
|
|
function caml_list_of_js_array(a){
|
|
var l = 0;
|
|
for(var i = a.length - 1; i >= 0; i--){var e = a[i]; l = [0, e, l];}
|
|
return l;
|
|
}
|
|
function caml_list_to_js_array(l){
|
|
var a = [];
|
|
for(; l !== 0; l = l[2]) a.push(l[1]);
|
|
return a;
|
|
}
|
|
function caml_log10_float(x){return Math.log10(x);}
|
|
function caml_log1p_float(x){return Math.log1p(x);}
|
|
function caml_log2_float(x){return Math.log2(x);}
|
|
var
|
|
caml_lxm_M =
|
|
caml_int64_of_string(caml_string_of_jsstring("0xd1342543de82ef95")),
|
|
caml_lxm_daba =
|
|
caml_int64_of_string(caml_string_of_jsstring("0xdaba0b6eb09322e3"));
|
|
function caml_lxm_next(v){
|
|
function shift_l(x, k){return caml_int64_shift_left(x, k);}
|
|
function shift_r(x, k){return caml_int64_shift_right_unsigned(x, k);}
|
|
function or(a, b){return caml_int64_or(a, b);}
|
|
function xor(a, b){return caml_int64_xor(a, b);}
|
|
function add(a, b){return caml_int64_add(a, b);}
|
|
function mul(a, b){return caml_int64_mul(a, b);}
|
|
function rotl(x, k){return or(shift_l(x, k), shift_r(x, 64 - k));}
|
|
function get(a, i){return caml_ba_get_1(a, i);}
|
|
function set(a, i, x){return caml_ba_set_1(a, i, x);}
|
|
var
|
|
M = caml_lxm_M,
|
|
daba = caml_lxm_daba,
|
|
z,
|
|
q0,
|
|
q1,
|
|
st = v,
|
|
a = get(st, 0),
|
|
s = get(st, 1),
|
|
x0 = get(st, 2),
|
|
x1 = get(st, 3);
|
|
z = add(s, x0);
|
|
z = mul(xor(z, shift_r(z, 32)), daba);
|
|
z = mul(xor(z, shift_r(z, 32)), daba);
|
|
z = xor(z, shift_r(z, 32));
|
|
set(st, 1, add(mul(s, M), a));
|
|
var q0 = x0, q1 = x1;
|
|
q1 = xor(q1, q0);
|
|
q0 = rotl(q0, 24);
|
|
q0 = xor(xor(q0, q1), shift_l(q1, 16));
|
|
q1 = rotl(q1, 37);
|
|
set(st, 2, q0);
|
|
set(st, 3, q1);
|
|
return z;
|
|
}
|
|
function caml_make_float_vect(len){
|
|
if(len >>> 0 >= (0x7fffffff / 8 | 0)) caml_array_bound_error();
|
|
var len = len + 1 | 0, b = new Array(len);
|
|
b[0] = 254;
|
|
for(var i = 1; i < len; i++) b[i] = 0;
|
|
return b;
|
|
}
|
|
function caml_make_vect(len, init){return caml_array_make(len, init);}
|
|
var
|
|
caml_marshal_constants =
|
|
{PREFIX_SMALL_BLOCK: 0x80,
|
|
PREFIX_SMALL_INT: 0x40,
|
|
PREFIX_SMALL_STRING: 0x20,
|
|
CODE_INT8: 0x00,
|
|
CODE_INT16: 0x01,
|
|
CODE_INT32: 0x02,
|
|
CODE_INT64: 0x03,
|
|
CODE_SHARED8: 0x04,
|
|
CODE_SHARED16: 0x05,
|
|
CODE_SHARED32: 0x06,
|
|
CODE_BLOCK32: 0x08,
|
|
CODE_BLOCK64: 0x13,
|
|
CODE_STRING8: 0x09,
|
|
CODE_STRING32: 0x0a,
|
|
CODE_DOUBLE_BIG: 0x0b,
|
|
CODE_DOUBLE_LITTLE: 0x0c,
|
|
CODE_DOUBLE_ARRAY8_BIG: 0x0d,
|
|
CODE_DOUBLE_ARRAY8_LITTLE: 0x0e,
|
|
CODE_DOUBLE_ARRAY32_BIG: 0x0f,
|
|
CODE_DOUBLE_ARRAY32_LITTLE: 0x07,
|
|
CODE_CODEPOINTER: 0x10,
|
|
CODE_INFIXPOINTER: 0x11,
|
|
CODE_CUSTOM: 0x12,
|
|
CODE_CUSTOM_LEN: 0x18,
|
|
CODE_CUSTOM_FIXED: 0x19};
|
|
function caml_maybe_print_stats(_unit){return 0;}
|
|
function caml_md5_bytes(s, ofs, len){
|
|
var ctx = caml_MD5Init(), a = caml_uint8_array_of_bytes(s);
|
|
caml_MD5Update(ctx, a.subarray(ofs, ofs + len), len);
|
|
return caml_string_of_uint8_array(caml_MD5Final(ctx));
|
|
}
|
|
function caml_ml_input_block(chanid, ba, i, l){
|
|
var
|
|
chan = caml_ml_channel_get(chanid),
|
|
n = l,
|
|
avail = chan.buffer_max - chan.buffer_curr;
|
|
if(l <= avail){
|
|
ba.set(chan.buffer.subarray(chan.buffer_curr, chan.buffer_curr + l), i);
|
|
chan.buffer_curr += l;
|
|
}
|
|
else if(avail > 0){
|
|
ba.set
|
|
(chan.buffer.subarray(chan.buffer_curr, chan.buffer_curr + avail), i);
|
|
chan.buffer_curr += avail;
|
|
n = avail;
|
|
}
|
|
else{
|
|
chan.buffer_curr = 0;
|
|
chan.buffer_max = 0;
|
|
caml_refill(chan);
|
|
var avail = chan.buffer_max - chan.buffer_curr;
|
|
if(n > avail) n = avail;
|
|
ba.set(chan.buffer.subarray(chan.buffer_curr, chan.buffer_curr + n), i);
|
|
chan.buffer_curr += n;
|
|
}
|
|
return n | 0;
|
|
}
|
|
function caml_md5_chan(chanid, toread){
|
|
var ctx = caml_MD5Init(), buffer = new Uint8Array(4096);
|
|
if(toread < 0)
|
|
while(true){
|
|
var read = caml_ml_input_block(chanid, buffer, 0, buffer.length);
|
|
if(read === 0) break;
|
|
caml_MD5Update(ctx, buffer.subarray(0, read), read);
|
|
}
|
|
else
|
|
while(toread > 0){
|
|
var
|
|
read =
|
|
caml_ml_input_block
|
|
(chanid, buffer, 0, toread > buffer.length ? buffer.length : toread);
|
|
if(read === 0) caml_raise_end_of_file();
|
|
caml_MD5Update(ctx, buffer.subarray(0, read), read);
|
|
toread -= read;
|
|
}
|
|
return caml_string_of_uint8_array(caml_MD5Final(ctx));
|
|
}
|
|
function caml_md5_string(s, ofs, len){
|
|
return caml_md5_bytes(caml_bytes_of_string(s), ofs, len);
|
|
}
|
|
function caml_memprof_discard(_t){return 0;}
|
|
function caml_memprof_start(_rate, _stack_size, _tracker){return 0;}
|
|
function caml_memprof_stop(_unit){return 0;}
|
|
function caml_ml_channel_redirect(captured, into){
|
|
var
|
|
to_restore = caml_ml_channel_get(captured),
|
|
new_ = caml_ml_channel_get(into);
|
|
caml_ml_channels.set(captured, new_);
|
|
return to_restore;
|
|
}
|
|
function caml_ml_channel_restore(captured, to_restore){caml_ml_channels.set(captured, to_restore); return 0;
|
|
}
|
|
function caml_ml_channel_size(chanid){
|
|
var chan = caml_ml_channel_get(chanid);
|
|
return chan.file.length() | 0;
|
|
}
|
|
function caml_ml_channel_size_64(chanid){
|
|
var chan = caml_ml_channel_get(chanid);
|
|
return caml_int64_of_float(chan.file.length());
|
|
}
|
|
var caml_sys_fds = new Array(3);
|
|
function caml_sys_close(fd){
|
|
var x = caml_sys_fds[fd];
|
|
if(x){x.file.close(false); delete caml_sys_fds[fd];}
|
|
return 0;
|
|
}
|
|
function caml_ml_flush(chanid){
|
|
var chan = caml_ml_channel_get(chanid);
|
|
if(! chan.opened) caml_raise_sys_error("Cannot flush a closed channel");
|
|
if(! chan.buffer || chan.buffer_curr === 0) return 0;
|
|
if(chan.output)
|
|
chan.output
|
|
(caml_sub_uint8_array_to_jsbytes(chan.buffer, 0, chan.buffer_curr));
|
|
else
|
|
for(var pos = 0; pos < chan.buffer_curr;)
|
|
pos += chan.file.write(chan.buffer, pos, chan.buffer_curr - pos, false);
|
|
chan.offset += chan.buffer_curr;
|
|
chan.buffer_curr = 0;
|
|
return 0;
|
|
}
|
|
function caml_ml_close_channel(chanid){
|
|
var chan = caml_ml_channel_get(chanid);
|
|
if(chan.opened){
|
|
chan.opened = false;
|
|
caml_ml_channels.close(chanid);
|
|
caml_sys_close(chan.fd);
|
|
chan.fd = - 1;
|
|
chan.buffer = new Uint8Array(0);
|
|
chan.buffer_curr = 0;
|
|
chan.buffer_max = 0;
|
|
}
|
|
return 0;
|
|
}
|
|
function caml_ml_condition_broadcast(_t){return 0;}
|
|
function caml_ml_condition_new(_unit){return {condition: 1};}
|
|
function caml_ml_condition_signal(_t){return 0;}
|
|
function caml_ml_condition_wait(_t, _mutext){return 0;}
|
|
function caml_ml_debug_info_status(){return 0;}
|
|
function caml_ml_domain_cpu_relax(_unit){return 0;}
|
|
function caml_ml_domain_id(_unit){return caml_domain_id;}
|
|
var caml_runtime_warnings = 0;
|
|
function caml_ml_enable_runtime_warnings(bool){caml_runtime_warnings = bool; return 0;
|
|
}
|
|
function caml_ml_input(chanid, b, i, l){
|
|
var ba = caml_uint8_array_of_bytes(b);
|
|
return caml_ml_input_block(chanid, ba, i, l);
|
|
}
|
|
function caml_ml_input_bigarray(chanid, b, i, l){
|
|
var ba = caml_ba_to_typed_array(b);
|
|
return caml_ml_input_block(chanid, ba, i, l);
|
|
}
|
|
function caml_ml_input_char(chanid){
|
|
var chan = caml_ml_channel_get(chanid);
|
|
if(chan.buffer_curr >= chan.buffer_max){
|
|
chan.buffer_curr = 0;
|
|
chan.buffer_max = 0;
|
|
caml_refill(chan);
|
|
}
|
|
if(chan.buffer_curr >= chan.buffer_max) caml_raise_end_of_file();
|
|
var res = chan.buffer[chan.buffer_curr];
|
|
chan.buffer_curr++;
|
|
return res;
|
|
}
|
|
function caml_ml_input_int(chanid){
|
|
var res = 0;
|
|
for(var i = 0; i < 4; i++)
|
|
res = (res << 8) + caml_ml_input_char(chanid) | 0;
|
|
return res | 0;
|
|
}
|
|
function caml_ml_input_scan_line(chanid){
|
|
var chan = caml_ml_channel_get(chanid), p = chan.buffer_curr;
|
|
do
|
|
if(p >= chan.buffer_max){
|
|
if(chan.buffer_curr > 0){
|
|
chan.buffer.set(chan.buffer.subarray(chan.buffer_curr), 0);
|
|
p -= chan.buffer_curr;
|
|
chan.buffer_max -= chan.buffer_curr;
|
|
chan.buffer_curr = 0;
|
|
}
|
|
if(chan.buffer_max >= chan.buffer.length) return - chan.buffer_max | 0;
|
|
var prev_max = chan.buffer_max;
|
|
caml_refill(chan);
|
|
if(prev_max === chan.buffer_max) return - chan.buffer_max | 0;
|
|
}
|
|
while
|
|
(chan.buffer[p++] !== 10);
|
|
return p - chan.buffer_curr | 0;
|
|
}
|
|
function caml_ml_is_binary_mode(chanid){
|
|
var chan = caml_ml_channel_get(chanid);
|
|
return chan.file.flags.binary;
|
|
}
|
|
function caml_ml_is_buffered(chanid){
|
|
return caml_ml_channel_get(chanid).buffered ? 1 : 0;
|
|
}
|
|
function caml_ml_mutex_lock(t){
|
|
if(t.locked)
|
|
caml_failwith("Mutex.lock: mutex already locked. Cannot wait.");
|
|
else
|
|
t.locked = true;
|
|
return 0;
|
|
}
|
|
function caml_ml_mutex_new(_unit){return new MlMutex();}
|
|
function caml_ml_mutex_try_lock(t){
|
|
if(! t.locked){t.locked = true; return 1;}
|
|
return 0;
|
|
}
|
|
function caml_sys_open_for_node(fd, flags){
|
|
if(flags.altname)
|
|
try{
|
|
var fs = require("node:fs"), fd2 = fs.openSync(flags.altname, "rs");
|
|
return new MlNodeFd(fd2, flags);
|
|
}
|
|
catch(e){}
|
|
return new MlNodeFd(fd, flags);
|
|
}
|
|
function caml_sys_open_internal(file, idx){
|
|
var chanid;
|
|
if(idx === undefined){
|
|
idx = caml_sys_fds.length;
|
|
chanid = new MlChanid(idx);
|
|
}
|
|
else if(caml_sys_fds[idx])
|
|
chanid = caml_sys_fds[idx].chanid;
|
|
else
|
|
chanid = new MlChanid(idx);
|
|
caml_sys_fds[idx] = {file: file, chanid: chanid};
|
|
return idx | 0;
|
|
}
|
|
function caml_sys_open(name, flags, perms){
|
|
var f = {};
|
|
while(flags){
|
|
switch(flags[1]){
|
|
case 0:
|
|
f.rdonly = 1; break;
|
|
case 1:
|
|
f.wronly = 1; break;
|
|
case 2:
|
|
f.append = 1; f.writeonly = 1; break;
|
|
case 3:
|
|
f.create = 1; break;
|
|
case 4:
|
|
f.truncate = 1; break;
|
|
case 5:
|
|
f.excl = 1; break;
|
|
case 6:
|
|
f.binary = 1; break;
|
|
case 7:
|
|
f.text = 1; break;
|
|
case 8:
|
|
f.nonblock = 1; break;
|
|
}
|
|
flags = flags[2];
|
|
}
|
|
var
|
|
root = resolve_fs_device(name),
|
|
file = root.device.open(root.rest, f, perms);
|
|
return caml_sys_open_internal(file, undefined);
|
|
}
|
|
(function(){
|
|
var is_node = fs_node_supported();
|
|
function file(fd, flags){
|
|
return is_node
|
|
? caml_sys_open_for_node(fd, flags)
|
|
: new MlFakeFd_out(fd, flags);
|
|
}
|
|
caml_sys_open_internal
|
|
(file(0, {rdonly: 1, altname: "/dev/stdin", isCharacterDevice: true}),
|
|
0);
|
|
caml_sys_open_internal
|
|
(file
|
|
(1, {buffered: is_node ? 1 : 2, wronly: 1, isCharacterDevice: true}),
|
|
1);
|
|
caml_sys_open_internal
|
|
(file
|
|
(2, {buffered: is_node ? 1 : 2, wronly: 1, isCharacterDevice: true}),
|
|
2);
|
|
}
|
|
());
|
|
function caml_ml_open_descriptor_in(fd){
|
|
var fd_desc = caml_sys_fds[fd];
|
|
if(fd_desc === undefined)
|
|
caml_raise_sys_error("fd " + fd + " doesn't exist");
|
|
var
|
|
file = fd_desc.file,
|
|
chanid = fd_desc.chanid,
|
|
refill = null,
|
|
channel =
|
|
{file: file,
|
|
offset: file.pos(),
|
|
fd: fd,
|
|
opened: true,
|
|
out: false,
|
|
buffer_curr: 0,
|
|
buffer_max: 0,
|
|
buffer: new Uint8Array(caml_io_buffer_size),
|
|
refill: refill};
|
|
caml_ml_channels.set(chanid, channel);
|
|
return chanid;
|
|
}
|
|
function caml_ml_open_descriptor_in_with_flags(fd, _flags){return caml_ml_open_descriptor_in(fd);
|
|
}
|
|
function caml_ml_open_descriptor_out(fd){
|
|
var fd_desc = caml_sys_fds[fd];
|
|
if(fd_desc === undefined)
|
|
caml_raise_sys_error("fd " + fd + " doesn't exist");
|
|
var
|
|
file = fd_desc.file,
|
|
chanid = fd_desc.chanid,
|
|
buffered = file.flags.buffered !== undefined ? file.flags.buffered : 1,
|
|
channel =
|
|
{file: file,
|
|
offset: file.pos(),
|
|
fd: fd,
|
|
opened: true,
|
|
out: true,
|
|
buffer_curr: 0,
|
|
buffer: new Uint8Array(caml_io_buffer_size),
|
|
buffered: buffered};
|
|
caml_ml_channels.set(chanid, channel);
|
|
return chanid;
|
|
}
|
|
function caml_ml_open_descriptor_out_with_flags(fd, _flags){return caml_ml_open_descriptor_out(fd);
|
|
}
|
|
function caml_ml_out_channels_list(){
|
|
var l = 0, keys = caml_ml_channels.all();
|
|
for(var k of keys){
|
|
var chan = caml_ml_channel_get(k);
|
|
if(chan.opened && chan.out) l = [0, k, l];
|
|
}
|
|
return l;
|
|
}
|
|
function caml_ml_output_ta(chanid, buffer, offset, len){
|
|
var chan = caml_ml_channel_get(chanid);
|
|
if(! chan.opened)
|
|
caml_raise_sys_error("Cannot output to a closed channel");
|
|
buffer = buffer.subarray(offset, offset + len);
|
|
if(chan.buffer_curr + buffer.length > chan.buffer.length){
|
|
var b = new Uint8Array(chan.buffer_curr + buffer.length);
|
|
b.set(chan.buffer);
|
|
chan.buffer = b;
|
|
}
|
|
switch(chan.buffered){
|
|
case 0:
|
|
chan.buffer.set(buffer, chan.buffer_curr);
|
|
chan.buffer_curr += buffer.length;
|
|
caml_ml_flush(chanid);
|
|
break;
|
|
case 1:
|
|
chan.buffer.set(buffer, chan.buffer_curr);
|
|
chan.buffer_curr += buffer.length;
|
|
if(chan.buffer_curr >= chan.buffer.length) caml_ml_flush(chanid);
|
|
break;
|
|
case 2:
|
|
var id = buffer.lastIndexOf(10);
|
|
if(id < 0){
|
|
chan.buffer.set(buffer, chan.buffer_curr);
|
|
chan.buffer_curr += buffer.length;
|
|
if(chan.buffer_curr >= chan.buffer.length) caml_ml_flush(chanid);
|
|
}
|
|
else{
|
|
chan.buffer.set(buffer.subarray(0, id + 1), chan.buffer_curr);
|
|
chan.buffer_curr += id + 1;
|
|
caml_ml_flush(chanid);
|
|
chan.buffer.set(buffer.subarray(id + 1), chan.buffer_curr);
|
|
chan.buffer_curr += buffer.length - id - 1;
|
|
}
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
function caml_ml_output_bytes(chanid, buffer, offset, len){
|
|
var buffer = caml_uint8_array_of_bytes(buffer);
|
|
return caml_ml_output_ta(chanid, buffer, offset, len);
|
|
}
|
|
function caml_ml_output(chanid, buffer, offset, len){
|
|
return caml_ml_output_bytes
|
|
(chanid, caml_bytes_of_string(buffer), offset, len);
|
|
}
|
|
function caml_ml_output_bigarray(chanid, buffer, offset, len){
|
|
var buffer = caml_ba_to_typed_array(buffer);
|
|
return caml_ml_output_ta(chanid, buffer, offset, len);
|
|
}
|
|
function caml_ml_output_char(chanid, c){
|
|
var s = caml_string_of_jsbytes(String.fromCharCode(c));
|
|
caml_ml_output(chanid, s, 0, 1);
|
|
return 0;
|
|
}
|
|
function caml_ml_output_int(chanid, i){
|
|
var arr = [i >> 24 & 0xff, i >> 16 & 0xff, i >> 8 & 0xff, i & 0xff];
|
|
caml_ml_output_ta(chanid, new Uint8Array(arr), 0, 4);
|
|
return 0;
|
|
}
|
|
function caml_pos_in(chanid){
|
|
var chan = caml_ml_channel_get(chanid);
|
|
return chan.offset - (chan.buffer_max - chan.buffer_curr);
|
|
}
|
|
function caml_ml_pos_in(chanid){return caml_pos_in(chanid) | 0;}
|
|
function caml_ml_pos_in_64(chanid){
|
|
return caml_int64_of_float(caml_pos_in(chanid));
|
|
}
|
|
function caml_pos_out(chanid){
|
|
var chan = caml_ml_channel_get(chanid);
|
|
return chan.offset + chan.buffer_curr;
|
|
}
|
|
function caml_ml_pos_out(chanid){return caml_pos_out(chanid) | 0;}
|
|
function caml_ml_pos_out_64(chanid){
|
|
return caml_int64_of_float(caml_pos_out(chanid));
|
|
}
|
|
function caml_ml_runtime_events_are_active(){return 0;}
|
|
function caml_ml_runtime_events_pause(){return 0;}
|
|
function caml_ml_runtime_events_resume(){return 0;}
|
|
function caml_ml_runtime_events_start(){return 0;}
|
|
function caml_ml_runtime_warnings_enabled(_unit){return caml_runtime_warnings;
|
|
}
|
|
function caml_seek_in(chanid, pos){
|
|
var chan = caml_ml_channel_get(chanid);
|
|
if(chan.refill != null) caml_raise_sys_error("Illegal seek");
|
|
if
|
|
(pos >= chan.offset - chan.buffer_max && pos <= chan.offset
|
|
&& chan.file.flags.binary)
|
|
chan.buffer_curr = chan.buffer_max - (chan.offset - pos);
|
|
else{
|
|
chan.file.seek(pos, 0);
|
|
chan.offset = pos;
|
|
chan.buffer_curr = 0;
|
|
chan.buffer_max = 0;
|
|
}
|
|
return 0;
|
|
}
|
|
function caml_ml_seek_in(chanid, pos){return caml_seek_in(chanid, pos);}
|
|
function caml_ml_seek_in_64(chanid, pos){
|
|
var pos = caml_int64_to_float(pos);
|
|
return caml_seek_in(chanid, pos);
|
|
}
|
|
function caml_seek_out(chanid, pos){
|
|
caml_ml_flush(chanid);
|
|
var chan = caml_ml_channel_get(chanid);
|
|
chan.file.seek(pos, 0);
|
|
chan.offset = pos;
|
|
return 0;
|
|
}
|
|
function caml_ml_seek_out(chanid, pos){return caml_seek_out(chanid, pos);}
|
|
function caml_ml_seek_out_64(chanid, pos){
|
|
var pos = caml_int64_to_float(pos);
|
|
return caml_seek_out(chanid, pos);
|
|
}
|
|
function caml_ml_set_binary_mode(chanid, mode){
|
|
var chan = caml_ml_channel_get(chanid);
|
|
chan.file.flags.text = ! mode;
|
|
chan.file.flags.binary = mode;
|
|
return 0;
|
|
}
|
|
function caml_ml_set_buffered(chanid, v){
|
|
caml_ml_channel_get(chanid).buffered = v;
|
|
if(! v) caml_ml_flush(chanid);
|
|
return 0;
|
|
}
|
|
function caml_ml_set_channel_name(chanid, name){
|
|
var chan = caml_ml_channel_get(chanid);
|
|
chan.name = name;
|
|
return 0;
|
|
}
|
|
function caml_ml_set_channel_output(chanid, f){
|
|
var chan = caml_ml_channel_get(chanid);
|
|
chan.output = function(s){f(s);};
|
|
return 0;
|
|
}
|
|
function caml_ml_set_channel_refill(chanid, f){
|
|
caml_ml_channel_get(chanid).refill = f;
|
|
return 0;
|
|
}
|
|
function caml_mod(x, y){
|
|
if(y === 0) caml_raise_zero_divide();
|
|
return x % y;
|
|
}
|
|
function caml_modf_float(x){
|
|
if(Number.isFinite(x)){
|
|
var neg = 1 / x < 0;
|
|
x = Math.abs(x);
|
|
var i = Math.floor(x), f = x - i;
|
|
if(neg){i = - i; f = - f;}
|
|
return [0, f, i];
|
|
}
|
|
if(Number.isNaN(x)) return [0, Number.NaN, Number.NaN];
|
|
return [0, 1 / x, x];
|
|
}
|
|
function caml_mount_autoload(name, f){
|
|
var
|
|
path = caml_make_path(name),
|
|
name = caml_trailing_slash(path.join("/"));
|
|
jsoo_mount_point.push({path: name, device: new MlFakeDevice(name, f)});
|
|
return 0;
|
|
}
|
|
function caml_lex_run_mem(s, i, mem, curr_pos){
|
|
for(;;){
|
|
var dst = s.charCodeAt(i);
|
|
i++;
|
|
if(dst === 0xff) return;
|
|
var src = s.charCodeAt(i);
|
|
i++;
|
|
if(src === 0xff)
|
|
mem[dst + 1] = curr_pos;
|
|
else
|
|
mem[dst + 1] = mem[src + 1];
|
|
}
|
|
}
|
|
function caml_lex_run_tag(s, i, mem){
|
|
for(;;){
|
|
var dst = s.charCodeAt(i);
|
|
i++;
|
|
if(dst === 0xff) return;
|
|
var src = s.charCodeAt(i);
|
|
i++;
|
|
if(src === 0xff) mem[dst + 1] = - 1; else mem[dst + 1] = mem[src + 1];
|
|
}
|
|
}
|
|
function caml_new_lex_engine(tbl, start_state, lexbuf){
|
|
var
|
|
lex_buffer = 2,
|
|
lex_buffer_len = 3,
|
|
lex_start_pos = 5,
|
|
lex_curr_pos = 6,
|
|
lex_last_pos = 7,
|
|
lex_last_action = 8,
|
|
lex_eof_reached = 9,
|
|
lex_mem = 10,
|
|
lex_base = 1,
|
|
lex_backtrk = 2,
|
|
lex_default = 3,
|
|
lex_trans = 4,
|
|
lex_check = 5,
|
|
lex_base_code = 6,
|
|
lex_backtrk_code = 7,
|
|
lex_default_code = 8,
|
|
lex_trans_code = 9,
|
|
lex_check_code = 10,
|
|
lex_code = 11;
|
|
if(! tbl.lex_default){
|
|
tbl.lex_base = caml_lex_array(tbl[lex_base]);
|
|
tbl.lex_backtrk = caml_lex_array(tbl[lex_backtrk]);
|
|
tbl.lex_check = caml_lex_array(tbl[lex_check]);
|
|
tbl.lex_trans = caml_lex_array(tbl[lex_trans]);
|
|
tbl.lex_default = caml_lex_array(tbl[lex_default]);
|
|
}
|
|
if(! tbl.lex_default_code){
|
|
tbl.lex_base_code = caml_lex_array(tbl[lex_base_code]);
|
|
tbl.lex_backtrk_code = caml_lex_array(tbl[lex_backtrk_code]);
|
|
tbl.lex_check_code = caml_lex_array(tbl[lex_check_code]);
|
|
tbl.lex_trans_code = caml_lex_array(tbl[lex_trans_code]);
|
|
tbl.lex_default_code = caml_lex_array(tbl[lex_default_code]);
|
|
}
|
|
if(tbl.lex_code == null)
|
|
tbl.lex_code = caml_jsbytes_of_string(tbl[lex_code]);
|
|
var c, state = start_state, buffer = lexbuf[lex_buffer];
|
|
if(state >= 0){
|
|
lexbuf[lex_last_pos] = lexbuf[lex_start_pos] = lexbuf[lex_curr_pos];
|
|
lexbuf[lex_last_action] = - 1;
|
|
}
|
|
else
|
|
state = - state - 1;
|
|
for(;;){
|
|
var base = tbl.lex_base[state];
|
|
if(base < 0){
|
|
var pc_off = tbl.lex_base_code[state];
|
|
caml_lex_run_tag(tbl.lex_code, pc_off, lexbuf[lex_mem]);
|
|
return - base - 1;
|
|
}
|
|
var backtrk = tbl.lex_backtrk[state];
|
|
if(backtrk >= 0){
|
|
var pc_off = tbl.lex_backtrk_code[state];
|
|
caml_lex_run_tag(tbl.lex_code, pc_off, lexbuf[lex_mem]);
|
|
lexbuf[lex_last_pos] = lexbuf[lex_curr_pos];
|
|
lexbuf[lex_last_action] = backtrk;
|
|
}
|
|
if(lexbuf[lex_curr_pos] >= lexbuf[lex_buffer_len])
|
|
if(lexbuf[lex_eof_reached] === 0) return - state - 1; else c = 256;
|
|
else{
|
|
c = caml_bytes_unsafe_get(buffer, lexbuf[lex_curr_pos]);
|
|
lexbuf[lex_curr_pos]++;
|
|
}
|
|
var pstate = state;
|
|
if(tbl.lex_check[base + c] === state)
|
|
state = tbl.lex_trans[base + c];
|
|
else
|
|
state = tbl.lex_default[state];
|
|
if(state < 0){
|
|
lexbuf[lex_curr_pos] = lexbuf[lex_last_pos];
|
|
if(lexbuf[lex_last_action] === - 1)
|
|
caml_failwith("lexing: empty token");
|
|
else
|
|
return lexbuf[lex_last_action];
|
|
}
|
|
else{
|
|
var base_code = tbl.lex_base_code[pstate], pc_off;
|
|
if(tbl.lex_check_code[base_code + c] === pstate)
|
|
pc_off = tbl.lex_trans_code[base_code + c];
|
|
else
|
|
pc_off = tbl.lex_default_code[pstate];
|
|
if(pc_off > 0)
|
|
caml_lex_run_mem
|
|
(tbl.lex_code, pc_off, lexbuf[lex_mem], lexbuf[lex_curr_pos]);
|
|
if(c === 256) lexbuf[lex_eof_reached] = 0;
|
|
}
|
|
}
|
|
}
|
|
function caml_new_string(s){return caml_string_of_jsbytes(s);}
|
|
function caml_nextafter_float(x, y){
|
|
if(Number.isNaN(x) || Number.isNaN(y)) return Number.NaN;
|
|
if(x === y) return y;
|
|
if(x === 0) return y < 0 ? - Math.pow(2, - 1074) : Math.pow(2, - 1074);
|
|
var bits = caml_int64_bits_of_float(x), one = caml_int64_of_int32(1);
|
|
if(x < y === x > 0)
|
|
bits = caml_int64_add(bits, one);
|
|
else
|
|
bits = caml_int64_sub(bits, one);
|
|
return caml_int64_float_of_bits(bits);
|
|
}
|
|
function caml_notequal(x, y){
|
|
return + (caml_compare_val(x, y, false) !== 0);
|
|
}
|
|
function caml_obj_add_offset(_v, _offset){
|
|
caml_failwith("Obj.add_offset is not supported");
|
|
}
|
|
function caml_obj_block(tag, size){
|
|
var o = new Array(size + 1);
|
|
o[0] = tag;
|
|
for(var i = 1; i <= size; i++) o[i] = 0;
|
|
return o;
|
|
}
|
|
function caml_obj_compare_and_swap(x, i, old, n){
|
|
if(x[i + 1] === old){x[i + 1] = n; return 1;}
|
|
return 0;
|
|
}
|
|
function caml_obj_is_shared(_x){return 1;}
|
|
function caml_obj_raw_field(o, i){return o[i + 1];}
|
|
function caml_obj_reachable_words(_o){return 0;}
|
|
function caml_obj_set_raw_field(o, i, v){return o[i + 1] = v;}
|
|
function caml_obj_with_tag(tag, x){
|
|
var l = x.length, a = new Array(l);
|
|
a[0] = tag;
|
|
for(var i = 1; i < l; i++) a[i] = x[i];
|
|
return a;
|
|
}
|
|
function caml_ojs_new_arr(c, a){
|
|
switch(a.length){
|
|
case 0:
|
|
return new c();
|
|
case 1:
|
|
return new c(a[0]);
|
|
case 2:
|
|
return new c(a[0], a[1]);
|
|
case 3:
|
|
return new c(a[0], a[1], a[2]);
|
|
case 4:
|
|
return new c(a[0], a[1], a[2], a[3]);
|
|
case 5:
|
|
return new c(a[0], a[1], a[2], a[3], a[4]);
|
|
case 6:
|
|
return new c(a[0], a[1], a[2], a[3], a[4], a[5]);
|
|
case 7:
|
|
return new c(a[0], a[1], a[2], a[3], a[4], a[5], a[6]);
|
|
}
|
|
function F(){return c.apply(this, a);}
|
|
F.prototype = c.prototype;
|
|
return new F();
|
|
}
|
|
function caml_oo_cache_id(){
|
|
var cacheid = caml_method_cache.length;
|
|
caml_method_cache[cacheid] = 0;
|
|
}
|
|
var
|
|
caml_output_val =
|
|
function(){
|
|
class Writer{
|
|
constructor(){
|
|
this.chunk = [];
|
|
this.chunk_idx = 20;
|
|
this.block_len = 0;
|
|
this.obj_counter = 0;
|
|
this.size_32 = 0;
|
|
this.size_64 = 0;
|
|
}
|
|
write(size, value){
|
|
for(var i = size - 8; i >= 0; i -= 8)
|
|
this.chunk[this.chunk_idx++] = value >> i & 0xff;
|
|
}
|
|
write_at(pos, size, value){
|
|
var pos = pos;
|
|
for(var i = size - 8; i >= 0; i -= 8)
|
|
this.chunk[pos++] = value >> i & 0xff;
|
|
}
|
|
write_code(size, code, value){
|
|
this.chunk[this.chunk_idx++] = code;
|
|
for(var i = size - 8; i >= 0; i -= 8)
|
|
this.chunk[this.chunk_idx++] = value >> i & 0xff;
|
|
}
|
|
write_shared(offset){
|
|
if(offset < 1 << 8)
|
|
this.write_code(8, 0x04, offset);
|
|
else if(offset < 1 << 16)
|
|
this.write_code(16, 0x05, offset);
|
|
else
|
|
this.write_code(32, 0x06, offset);
|
|
}
|
|
pos(){return this.chunk_idx;}
|
|
finalize(){
|
|
this.block_len = this.chunk_idx - 20;
|
|
this.chunk_idx = 0;
|
|
this.write(32, 0x8495a6be);
|
|
this.write(32, this.block_len);
|
|
this.write(32, this.obj_counter);
|
|
this.write(32, this.size_32);
|
|
this.write(32, this.size_64);
|
|
return this.chunk;
|
|
}
|
|
}
|
|
return function(v, flags){
|
|
flags = caml_list_to_js_array(flags);
|
|
var
|
|
no_sharing = flags.indexOf(0) !== - 1,
|
|
closures = flags.indexOf(1) !== - 1;
|
|
if(closures)
|
|
console.warn
|
|
("in caml_output_val: flag Marshal.Closures is not supported.");
|
|
var
|
|
writer = new Writer(),
|
|
stack = [],
|
|
intern_obj_table = no_sharing ? null : new MlObjectTable();
|
|
function memo(v){
|
|
if(no_sharing) return false;
|
|
var existing_offset = intern_obj_table.recall(v);
|
|
if(existing_offset){
|
|
writer.write_shared(existing_offset);
|
|
return true;
|
|
}
|
|
else{intern_obj_table.store(v); return false;}
|
|
}
|
|
function extern_rec(v){
|
|
if(v.caml_custom){
|
|
if(memo(v)) return;
|
|
var
|
|
name = v.caml_custom,
|
|
ops = caml_custom_ops[name],
|
|
sz_32_64 = [0, 0];
|
|
if(! ops.serialize)
|
|
caml_invalid_argument("output_value: abstract value (Custom)");
|
|
if(ops.fixed_length === undefined){
|
|
writer.write(8, 0x18);
|
|
for(var i = 0; i < name.length; i++)
|
|
writer.write(8, name.charCodeAt(i));
|
|
writer.write(8, 0);
|
|
var header_pos = writer.pos();
|
|
for(var i = 0; i < 12; i++) writer.write(8, 0);
|
|
ops.serialize(writer, v, sz_32_64);
|
|
writer.write_at(header_pos, 32, sz_32_64[0]);
|
|
writer.write_at(header_pos + 4, 32, 0);
|
|
writer.write_at(header_pos + 8, 32, sz_32_64[1]);
|
|
}
|
|
else{
|
|
writer.write(8, 0x19);
|
|
for(var i = 0; i < name.length; i++)
|
|
writer.write(8, name.charCodeAt(i));
|
|
writer.write(8, 0);
|
|
ops.serialize(writer, v, sz_32_64);
|
|
if(ops.fixed_length !== sz_32_64[0])
|
|
caml_failwith
|
|
("output_value: incorrect fixed sizes specified by " + name);
|
|
}
|
|
writer.size_32 += 2 + (sz_32_64[0] + 3 >> 2);
|
|
writer.size_64 += 2 + (sz_32_64[1] + 7 >> 3);
|
|
}
|
|
else if(Array.isArray(v) && v[0] === (v[0] | 0)){
|
|
if(v[0] === 251)
|
|
caml_failwith("output_value: abstract value (Abstract)");
|
|
if(caml_is_continuation_tag(v[0]))
|
|
caml_invalid_argument("output_value: continuation value");
|
|
if(v.length > 1 && memo(v)) return;
|
|
if(v[0] < 16 && v.length - 1 < 8)
|
|
writer.write(8, 0x80 + v[0] + (v.length - 1 << 4));
|
|
else
|
|
writer.write_code(32, 0x08, v.length - 1 << 10 | v[0]);
|
|
writer.size_32 += v.length;
|
|
writer.size_64 += v.length;
|
|
if(v.length > 1) stack.push(v, 1);
|
|
}
|
|
else if(caml_is_ml_bytes(v)){
|
|
if(! caml_is_ml_bytes(caml_string_of_jsbytes("")))
|
|
caml_failwith
|
|
("output_value: [Bytes.t] cannot safely be marshaled with [--enable use-js-string]");
|
|
if(memo(v)) return;
|
|
var len = caml_ml_bytes_length(v);
|
|
if(len < 0x20)
|
|
writer.write(8, 0x20 + len);
|
|
else if(len < 0x100)
|
|
writer.write_code(8, 0x09, len);
|
|
else
|
|
writer.write_code(32, 0x0a, len);
|
|
for(var i = 0; i < len; i++)
|
|
writer.write(8, caml_bytes_unsafe_get(v, i));
|
|
writer.size_32 += 1 + ((len + 4) / 4 | 0);
|
|
writer.size_64 += 1 + ((len + 8) / 8 | 0);
|
|
}
|
|
else if(caml_is_ml_string(v)){
|
|
if(memo(v)) return;
|
|
var len = caml_ml_string_length(v);
|
|
if(len < 0x20)
|
|
writer.write(8, 0x20 + len);
|
|
else if(len < 0x100)
|
|
writer.write_code(8, 0x09, len);
|
|
else
|
|
writer.write_code(32, 0x0a, len);
|
|
for(var i = 0; i < len; i++)
|
|
writer.write(8, caml_string_unsafe_get(v, i));
|
|
writer.size_32 += 1 + ((len + 4) / 4 | 0);
|
|
writer.size_64 += 1 + ((len + 8) / 8 | 0);
|
|
}
|
|
else if(v !== (v | 0)){
|
|
var type_of_v = typeof v;
|
|
if(type_of_v !== "number")
|
|
caml_failwith("output_value: abstract value (" + type_of_v + ")");
|
|
if(memo(v)) return;
|
|
var t = caml_int64_to_bytes(caml_int64_bits_of_float(v));
|
|
writer.write(8, 0x0c);
|
|
for(var i = 0; i < 8; i++) writer.write(8, t[7 - i]);
|
|
writer.size_32 += 3;
|
|
writer.size_64 += 2;
|
|
}
|
|
else if(v >= 0 && v < 0x40)
|
|
writer.write(8, 0x40 + v);
|
|
else if(v >= - (1 << 7) && v < 1 << 7)
|
|
writer.write_code(8, 0x00, v);
|
|
else if(v >= - (1 << 15) && v < 1 << 15)
|
|
writer.write_code(16, 0x01, v);
|
|
else
|
|
writer.write_code(32, 0x02, v);
|
|
}
|
|
extern_rec(v);
|
|
while(stack.length > 0){
|
|
var i = stack.pop(), v = stack.pop();
|
|
if(i + 1 < v.length) stack.push(v, i + 1);
|
|
extern_rec(v[i]);
|
|
}
|
|
if(intern_obj_table)
|
|
writer.obj_counter = intern_obj_table.objs.length;
|
|
writer.finalize();
|
|
return new Uint8Array(writer.chunk);};
|
|
}
|
|
();
|
|
function caml_output_value_to_string(v, flags){
|
|
return caml_string_of_uint8_array(caml_output_val(v, flags));
|
|
}
|
|
function caml_output_value(chanid, v, flags){
|
|
var s = caml_output_value_to_string(v, flags);
|
|
caml_ml_output(chanid, s, 0, caml_ml_string_length(s));
|
|
return 0;
|
|
}
|
|
function caml_output_value_to_buffer(s, ofs, len, v, flags){
|
|
var t = caml_output_val(v, flags);
|
|
if(t.length > len) caml_failwith("Marshal.to_buffer: buffer overflow");
|
|
caml_blit_bytes(caml_bytes_of_uint8_array(t), 0, s, ofs, t.length);
|
|
return 0;
|
|
}
|
|
function caml_output_value_to_bytes(v, flags){
|
|
return caml_bytes_of_uint8_array(caml_output_val(v, flags));
|
|
}
|
|
var caml_parser_trace = 0;
|
|
function caml_parse_engine(tables, env, cmd, arg){
|
|
var
|
|
ERRCODE = 256,
|
|
loop = 6,
|
|
testshift = 7,
|
|
shift = 8,
|
|
shift_recover = 9,
|
|
reduce = 10,
|
|
READ_TOKEN = 0,
|
|
RAISE_PARSE_ERROR = 1,
|
|
GROW_STACKS_1 = 2,
|
|
GROW_STACKS_2 = 3,
|
|
COMPUTE_SEMANTIC_ACTION = 4,
|
|
CALL_ERROR_FUNCTION = 5,
|
|
env_s_stack = 1,
|
|
env_v_stack = 2,
|
|
env_symb_start_stack = 3,
|
|
env_symb_end_stack = 4,
|
|
env_stacksize = 5,
|
|
env_stackbase = 6,
|
|
env_curr_char = 7,
|
|
env_lval = 8,
|
|
env_symb_start = 9,
|
|
env_symb_end = 10,
|
|
env_asp = 11,
|
|
env_rule_len = 12,
|
|
env_rule_number = 13,
|
|
env_sp = 14,
|
|
env_state = 15,
|
|
env_errflag = 16,
|
|
tbl_transl_const = 2,
|
|
tbl_transl_block = 3,
|
|
tbl_lhs = 4,
|
|
tbl_len = 5,
|
|
tbl_defred = 6,
|
|
tbl_dgoto = 7,
|
|
tbl_sindex = 8,
|
|
tbl_rindex = 9,
|
|
tbl_gindex = 10,
|
|
tbl_tablesize = 11,
|
|
tbl_table = 12,
|
|
tbl_check = 13,
|
|
tbl_names_const = 15,
|
|
tbl_names_block = 16;
|
|
function log(x){
|
|
var s = caml_string_of_jsbytes(x + "\n");
|
|
caml_ml_output(caml_sys_fds[2].chanid, s, 0, caml_ml_string_length(s));
|
|
}
|
|
function token_name(names, number){
|
|
var str = caml_jsstring_of_string(names);
|
|
if(str[0] === "\x00") return "<unknown token>";
|
|
return str.split("\x00")[number];
|
|
}
|
|
function print_token(state, tok){
|
|
var token, kind;
|
|
if(Array.isArray(tok)){
|
|
token = token_name(tables[tbl_names_block], tok[0]);
|
|
if(typeof tok[1] === "number")
|
|
kind = "" + tok[1];
|
|
else if(typeof tok[1] === "string")
|
|
kind = tok[1];
|
|
else if(tok[1] instanceof MlBytes)
|
|
kind = caml_jsbytes_of_string(tok[1]);
|
|
else
|
|
kind = "_";
|
|
log("State " + state + ": read token " + token + "(" + kind + ")");
|
|
}
|
|
else{
|
|
token = token_name(tables[tbl_names_const], tok);
|
|
log("State " + state + ": read token " + token);
|
|
}
|
|
}
|
|
if(! tables.dgoto){
|
|
tables.defred = caml_lex_array(tables[tbl_defred]);
|
|
tables.sindex = caml_lex_array(tables[tbl_sindex]);
|
|
tables.check = caml_lex_array(tables[tbl_check]);
|
|
tables.rindex = caml_lex_array(tables[tbl_rindex]);
|
|
tables.table = caml_lex_array(tables[tbl_table]);
|
|
tables.len = caml_lex_array(tables[tbl_len]);
|
|
tables.lhs = caml_lex_array(tables[tbl_lhs]);
|
|
tables.gindex = caml_lex_array(tables[tbl_gindex]);
|
|
tables.dgoto = caml_lex_array(tables[tbl_dgoto]);
|
|
}
|
|
var
|
|
res = 0,
|
|
n,
|
|
n1,
|
|
n2,
|
|
state1,
|
|
sp = env[env_sp],
|
|
state = env[env_state],
|
|
errflag = env[env_errflag];
|
|
the_loop:
|
|
for(;;)
|
|
switch(cmd){
|
|
case 0:
|
|
state = 0; errflag = 0;
|
|
case 6:
|
|
n = tables.defred[state];
|
|
if(n !== 0){cmd = reduce; continue the_loop;}
|
|
if(env[env_curr_char] >= 0){cmd = testshift; continue the_loop;}
|
|
res = READ_TOKEN;
|
|
break the_loop;
|
|
case 1:
|
|
if(Array.isArray(arg)){
|
|
env[env_curr_char] = tables[tbl_transl_block][arg[0] + 1];
|
|
env[env_lval] = arg[1];
|
|
}
|
|
else{
|
|
env[env_curr_char] = tables[tbl_transl_const][arg + 1];
|
|
env[env_lval] = 0;
|
|
}
|
|
if(caml_parser_trace) print_token(state, arg);
|
|
case 7:
|
|
n1 = tables.sindex[state];
|
|
n2 = n1 + env[env_curr_char];
|
|
if
|
|
(n1 !== 0 && n2 >= 0 && n2 <= tables[tbl_tablesize]
|
|
&& tables.check[n2] === env[env_curr_char]){cmd = shift; continue the_loop;}
|
|
n1 = tables.rindex[state];
|
|
n2 = n1 + env[env_curr_char];
|
|
if
|
|
(n1 !== 0 && n2 >= 0 && n2 <= tables[tbl_tablesize]
|
|
&& tables.check[n2] === env[env_curr_char]){
|
|
n = tables.table[n2];
|
|
cmd = reduce;
|
|
continue the_loop;
|
|
}
|
|
if(errflag <= 0){res = CALL_ERROR_FUNCTION; break the_loop;}
|
|
case 5:
|
|
if(errflag < 3){
|
|
errflag = 3;
|
|
for(;;){
|
|
state1 = env[env_s_stack][sp + 1];
|
|
n1 = tables.sindex[state1];
|
|
n2 = n1 + ERRCODE;
|
|
if
|
|
(n1 !== 0 && n2 >= 0 && n2 <= tables[tbl_tablesize]
|
|
&& tables.check[n2] === ERRCODE){
|
|
if(caml_parser_trace) log("Recovering in state " + state1);
|
|
cmd = shift_recover;
|
|
continue the_loop;
|
|
}
|
|
else{
|
|
if(caml_parser_trace) log("Discarding state " + state1);
|
|
if(sp <= env[env_stackbase]){
|
|
if(caml_parser_trace) log("No more states to discard");
|
|
return RAISE_PARSE_ERROR;
|
|
}
|
|
sp--;
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
if(env[env_curr_char] === 0) return RAISE_PARSE_ERROR;
|
|
if(caml_parser_trace) log("Discarding last token read");
|
|
env[env_curr_char] = - 1;
|
|
cmd = loop;
|
|
continue the_loop;
|
|
}
|
|
case 8:
|
|
env[env_curr_char] = - 1; if(errflag > 0) errflag--;
|
|
case 9:
|
|
if(caml_parser_trace)
|
|
log("State " + state + ": shift to state " + tables.table[n2]);
|
|
state = tables.table[n2];
|
|
sp++;
|
|
if(sp >= env[env_stacksize]){res = GROW_STACKS_1; break the_loop;}
|
|
case 2:
|
|
env[env_s_stack][sp + 1] = state;
|
|
env[env_v_stack][sp + 1] = env[env_lval];
|
|
env[env_symb_start_stack][sp + 1] = env[env_symb_start];
|
|
env[env_symb_end_stack][sp + 1] = env[env_symb_end];
|
|
cmd = loop;
|
|
continue the_loop;
|
|
case 10:
|
|
if(caml_parser_trace) log("State " + state + ": reduce by rule " + n);
|
|
var m = tables.len[n];
|
|
env[env_asp] = sp;
|
|
env[env_rule_number] = n;
|
|
env[env_rule_len] = m;
|
|
sp = sp - m + 1;
|
|
m = tables.lhs[n];
|
|
state1 = env[env_s_stack][sp];
|
|
n1 = tables.gindex[m];
|
|
n2 = n1 + state1;
|
|
if
|
|
(n1 !== 0 && n2 >= 0 && n2 <= tables[tbl_tablesize]
|
|
&& tables.check[n2] === state1)
|
|
state = tables.table[n2];
|
|
else
|
|
state = tables.dgoto[m];
|
|
if(sp >= env[env_stacksize]){res = GROW_STACKS_2; break the_loop;}
|
|
case 3:
|
|
res = COMPUTE_SEMANTIC_ACTION; break the_loop;
|
|
case 4:
|
|
env[env_s_stack][sp + 1] = state;
|
|
env[env_v_stack][sp + 1] = arg;
|
|
var asp = env[env_asp];
|
|
env[env_symb_end_stack][sp + 1] = env[env_symb_end_stack][asp + 1];
|
|
if(sp > asp)
|
|
env[env_symb_start_stack][sp + 1] = env[env_symb_end_stack][asp + 1];
|
|
cmd = loop;
|
|
continue the_loop;
|
|
default: return RAISE_PARSE_ERROR;
|
|
}
|
|
env[env_sp] = sp;
|
|
env[env_state] = state;
|
|
env[env_errflag] = errflag;
|
|
return res;
|
|
}
|
|
function caml_pure_js_expr(s){
|
|
console.error("caml_pure_js_expr: fallback to runtime evaluation\n");
|
|
return eval?.('"use strict";(' + caml_jsstring_of_string(s) + ")");
|
|
}
|
|
function caml_raise_not_found(){
|
|
caml_raise_constant(caml_global_data.Not_found);
|
|
}
|
|
function caml_raw_backtrace_length(){return 0;}
|
|
function caml_raw_backtrace_next_slot(_slot){return 0;}
|
|
function caml_raw_backtrace_slot(_bt, _idx){
|
|
caml_invalid_argument
|
|
("Printexc.get_raw_backtrace_slot: index out of bounds");
|
|
}
|
|
function caml_read_file_content(name){
|
|
var
|
|
name = typeof name === "string" ? caml_string_of_jsstring(name) : name,
|
|
root = resolve_fs_device(name);
|
|
if(root.device.exists(root.rest)){
|
|
var
|
|
file = root.device.open(root.rest, {rdonly: 1}),
|
|
len = file.length(),
|
|
buf = new Uint8Array(len);
|
|
file.read(buf, 0, len, false);
|
|
return caml_string_of_uint8_array(buf);
|
|
}
|
|
caml_raise_no_such_file(caml_jsstring_of_string(name));
|
|
}
|
|
function caml_recommended_domain_count(_unit){return 1;}
|
|
function caml_record_backtrace(b){
|
|
caml_record_backtrace_runtime_flag = b;
|
|
return 0;
|
|
}
|
|
var jsoo_toplevel_reloc = undefined;
|
|
function caml_register_global(n, v, name_opt){
|
|
if(name_opt){
|
|
var name = name_opt;
|
|
if(jsoo_toplevel_reloc)
|
|
n = caml_callback(jsoo_toplevel_reloc, [name]);
|
|
else if(caml_global_data.symbols){
|
|
if(! caml_global_data.symidx)
|
|
caml_global_data.symidx = caml_build_symbols(caml_global_data.symbols);
|
|
var nid = caml_global_data.symidx[name];
|
|
if(nid >= 0)
|
|
n = nid;
|
|
else{
|
|
var n = caml_global_data.symidx.next_idx++;
|
|
caml_global_data.symidx[name] = n;
|
|
}
|
|
}
|
|
}
|
|
caml_global_data[n + 1] = v;
|
|
if(name_opt) caml_global_data[name_opt] = v;
|
|
}
|
|
function caml_register_named_value(nm, v){
|
|
caml_named_values[caml_jsbytes_of_string(nm)] = v;
|
|
return 0;
|
|
}
|
|
function caml_restore_raw_backtrace(_exn, _bt){return 0;}
|
|
function caml_round_float(x){
|
|
if(x >= 0){
|
|
var y = Math.floor(x);
|
|
return x - y >= 0.5 ? y + 1 : y;
|
|
}
|
|
else{var y = Math.ceil(x); return y - x >= 0.5 ? y - 1 : y;}
|
|
}
|
|
function caml_runtime_events_create_cursor(_target){return {};}
|
|
function caml_runtime_events_free_cursor(_cursor){return 0;}
|
|
function caml_runtime_events_read_poll(_cursor, _callbacks, _num){return 0;
|
|
}
|
|
function caml_runtime_events_user_register
|
|
(event_name, event_tag, event_type){
|
|
caml_custom_event_index += 1;
|
|
return [0, caml_custom_event_index, event_name, event_type, event_tag];
|
|
}
|
|
function caml_runtime_events_user_resolve(){return 0;}
|
|
function caml_runtime_events_user_write(_event, _event_content){return 0;}
|
|
function caml_runtime_parameters(_unit){return caml_string_of_jsbytes("");}
|
|
function caml_runtime_variant(_unit){return caml_string_of_jsbytes("");}
|
|
function caml_set_parser_trace(bool){
|
|
var oldflag = caml_parser_trace;
|
|
caml_parser_trace = bool;
|
|
return oldflag;
|
|
}
|
|
function caml_set_static_env(k, v){jsoo_static_env[k] = v; return 0;}
|
|
function caml_signbit_float(x){
|
|
if(x === 0) x = 1 / x;
|
|
return x < 0 ? 1 : 0;
|
|
}
|
|
function caml_sinh_float(x){return Math.sinh(x);}
|
|
function caml_strerror(errno){
|
|
const util = require("node:util");
|
|
if(errno >= 0){
|
|
const code = unix_error[errno];
|
|
return util.getSystemErrorMap().entries().find(x=>x[1][0] === code)[1][1];
|
|
}
|
|
else
|
|
return util.getSystemErrorMessage(errno);
|
|
}
|
|
function caml_string_bound_error(){
|
|
caml_invalid_argument("index out of bounds");
|
|
}
|
|
function caml_string_concat(a, b){return a + b;}
|
|
function caml_string_equal(s1, s2){if(s1 === s2) return 1; return 0;}
|
|
function caml_string_get(s, i){
|
|
if(i >>> 0 >= caml_ml_string_length(s)) caml_string_bound_error();
|
|
return caml_string_unsafe_get(s, i);
|
|
}
|
|
function caml_string_get16(s, i){
|
|
if(i >>> 0 >= caml_ml_string_length(s) - 1) caml_string_bound_error();
|
|
var
|
|
b1 = caml_string_unsafe_get(s, i),
|
|
b2 = caml_string_unsafe_get(s, i + 1);
|
|
return b2 << 8 | b1;
|
|
}
|
|
function caml_string_get32(s, i){
|
|
if(i >>> 0 >= caml_ml_string_length(s) - 3) caml_string_bound_error();
|
|
var
|
|
b1 = caml_string_unsafe_get(s, i),
|
|
b2 = caml_string_unsafe_get(s, i + 1),
|
|
b3 = caml_string_unsafe_get(s, i + 2),
|
|
b4 = caml_string_unsafe_get(s, i + 3);
|
|
return b4 << 24 | b3 << 16 | b2 << 8 | b1;
|
|
}
|
|
function caml_string_get64(s, i){
|
|
if(i >>> 0 >= caml_ml_string_length(s) - 7) caml_string_bound_error();
|
|
var a = new Array(8);
|
|
for(var j = 0; j < 8; j++) a[7 - j] = caml_string_unsafe_get(s, i + j);
|
|
return caml_int64_of_bytes(a);
|
|
}
|
|
function caml_string_lessequal(s1, s2){return s1 <= s2 ? 1 : 0;}
|
|
function caml_string_greaterequal(s1, s2){return caml_string_lessequal(s2, s1);
|
|
}
|
|
function caml_string_lessthan(s1, s2){return s1 < s2 ? 1 : 0;}
|
|
function caml_string_greaterthan(s1, s2){return caml_string_lessthan(s2, s1);
|
|
}
|
|
function caml_string_hash(h, v){
|
|
var h = caml_hash_mix_string(h, v), h = caml_hash_mix_final(h);
|
|
return h & 0x3fffffff;
|
|
}
|
|
function caml_string_notequal(s1, s2){
|
|
return 1 - caml_string_equal(s1, s2);
|
|
}
|
|
function caml_string_of_bytes(s){
|
|
s.t & 6 && caml_convert_string_to_bytes(s);
|
|
return caml_string_of_jsbytes(s.c);
|
|
}
|
|
function caml_string_set(_s, _i, _c){caml_failwith("caml_string_set");}
|
|
function caml_sys_argv(_unit){return caml_argv;}
|
|
function caml_sys_chdir(dir, raise_unix){
|
|
var root = resolve_fs_device(dir);
|
|
if(root.device.is_dir(root.rest)){
|
|
if(root.rest)
|
|
caml_current_dir = caml_trailing_slash(root.path + root.rest);
|
|
else
|
|
caml_current_dir = root.path;
|
|
return 0;
|
|
}
|
|
else if(root.device.exists(root.rest))
|
|
caml_raise_system_error
|
|
(raise_unix,
|
|
"ENOTDIR",
|
|
"chdir",
|
|
"not a directory",
|
|
caml_jsstring_of_string(dir));
|
|
else
|
|
caml_raise_no_such_file(caml_jsstring_of_string(dir), raise_unix);
|
|
}
|
|
function caml_sys_const_backend_type(){
|
|
return [0, caml_string_of_jsbytes("js_of_ocaml")];
|
|
}
|
|
function caml_sys_const_big_endian(){return 0;}
|
|
function caml_sys_const_int_size(){return 32;}
|
|
function caml_sys_const_max_wosize(){return 0x7fffffff / 4 | 0;}
|
|
function caml_sys_const_naked_pointers_checked(_unit){return 0;}
|
|
var os_type = jsoo_is_win32 ? "Win32" : "Unix";
|
|
function caml_sys_const_ostype_cygwin(){return os_type === "Cygwin" ? 1 : 0;
|
|
}
|
|
function caml_sys_const_ostype_unix(){return os_type === "Unix" ? 1 : 0;}
|
|
function caml_sys_const_ostype_win32(){return os_type === "Win32" ? 1 : 0;}
|
|
function caml_sys_const_word_size(){return 32;}
|
|
function caml_sys_executable_name(_unit){return caml_executable_name;}
|
|
function caml_sys_exit(code){
|
|
if(globalThis.quit) globalThis.quit(code);
|
|
if(globalThis.process?.exit) globalThis.process.exit(code);
|
|
caml_invalid_argument("Function 'exit' not implemented");
|
|
}
|
|
function caml_sys_file_exists(name){
|
|
var root = resolve_fs_device(name);
|
|
return root.device.exists(root.rest);
|
|
}
|
|
function caml_sys_get_argv(_unit){return [0, caml_argv[1], caml_argv];}
|
|
function caml_sys_get_config(){
|
|
return [0, caml_string_of_jsbytes(os_type), 32, 0];
|
|
}
|
|
function caml_sys_getcwd(){
|
|
return caml_string_of_jsstring(caml_current_dir);
|
|
}
|
|
function caml_sys_getenv(name){
|
|
var r = jsoo_sys_getenv(caml_jsstring_of_string(name));
|
|
if(r === undefined) caml_raise_not_found();
|
|
return caml_string_of_jsstring(r);
|
|
}
|
|
function caml_sys_is_directory(name){
|
|
var root = resolve_fs_device(name), a = root.device.is_dir(root.rest);
|
|
return a ? 1 : 0;
|
|
}
|
|
function caml_sys_is_regular_file(name){
|
|
var root = resolve_fs_device(name);
|
|
return root.device.isFile(root.rest);
|
|
}
|
|
function caml_sys_isatty(_chan){return 0;}
|
|
function caml_sys_mkdir(name, perm){
|
|
var root = resolve_fs_device(name);
|
|
root.device.mkdir(root.rest, perm);
|
|
return 0;
|
|
}
|
|
function caml_sys_modify_argv(arg){caml_argv = arg; return 0;}
|
|
function caml_sys_random_seed(){
|
|
if(globalThis.crypto)
|
|
if(globalThis.crypto.getRandomValues){
|
|
var a = globalThis.crypto.getRandomValues(new Int32Array(4));
|
|
return [0, a[0], a[1], a[2], a[3]];
|
|
}
|
|
else if(globalThis.crypto.randomBytes){
|
|
var a = new Int32Array(globalThis.crypto.randomBytes(16).buffer);
|
|
return [0, a[0], a[1], a[2], a[3]];
|
|
}
|
|
var now = new Date().getTime(), x = now ^ 0xffffffff * Math.random();
|
|
return [0, x];
|
|
}
|
|
function caml_sys_read_directory(name){
|
|
var
|
|
root = resolve_fs_device(name),
|
|
a = root.device.readdir(root.rest),
|
|
l = new Array(a.length + 1);
|
|
l[0] = 0;
|
|
for(var i = 0; i < a.length; i++)
|
|
l[i + 1] = caml_string_of_jsstring(a[i]);
|
|
return l;
|
|
}
|
|
function caml_sys_remove(name){
|
|
var root = resolve_fs_device(name);
|
|
return root.device.unlink(root.rest);
|
|
}
|
|
function caml_sys_rename(o, n){
|
|
var o_root = resolve_fs_device(o), n_root = resolve_fs_device(n);
|
|
if(o_root.device !== n_root.device)
|
|
caml_failwith("caml_sys_rename: cannot move file between two filesystem");
|
|
if(! o_root.device.rename)
|
|
caml_failwith("caml_sys_rename: not implemented");
|
|
o_root.device.rename(o_root.rest, n_root.rest);
|
|
}
|
|
function caml_sys_rmdir(name){
|
|
var root = resolve_fs_device(name);
|
|
root.device.rmdir(root.rest);
|
|
return 0;
|
|
}
|
|
function caml_sys_system_command(cmd){
|
|
var cmd = caml_jsstring_of_string(cmd);
|
|
if(typeof require !== "undefined"){
|
|
var child_process = require("node:child_process");
|
|
if(child_process?.execSync)
|
|
try{child_process.execSync(cmd, {stdio: "inherit"}); return 0;}
|
|
catch(e){return 1;}
|
|
}
|
|
else
|
|
return 127;
|
|
}
|
|
var caml_initial_time = new Date().getTime() * 0.001;
|
|
function caml_sys_time(){
|
|
var now = new Date().getTime();
|
|
return now * 0.001 - caml_initial_time;
|
|
}
|
|
function caml_sys_time_include_children(_b){return caml_sys_time();}
|
|
function caml_sys_unsafe_getenv(name){return caml_sys_getenv(name);}
|
|
function caml_tanh_float(x){return Math.tanh(x);}
|
|
function caml_throw_js_exception(exn){throw exn;}
|
|
function caml_to_js_string(s){return caml_jsstring_of_string(s);}
|
|
function caml_trampoline(res){
|
|
var c = 1;
|
|
while(res?.joo_tramp){res = res.joo_tramp.apply(null, res.joo_args); c++;}
|
|
return res;
|
|
}
|
|
function caml_trampoline_return(f, args, direct){
|
|
return {joo_tramp: f, joo_args: args, joo_direct: direct};
|
|
}
|
|
function caml_trunc_float(x){return Math.trunc(x);}
|
|
function caml_unix_access(name, flags){
|
|
var f = {};
|
|
while(flags){
|
|
switch(flags[1]){
|
|
case 0:
|
|
f.r = 1; break;
|
|
case 1:
|
|
f.w = 1; break;
|
|
case 2:
|
|
f.x = 1; break;
|
|
case 3:
|
|
f.f = 1; break;
|
|
}
|
|
flags = flags[2];
|
|
}
|
|
var root = resolve_fs_device(name);
|
|
if(! root.device.access)
|
|
caml_failwith("caml_unix_access: not implemented");
|
|
root.device.access(root.rest, f, true);
|
|
return 0;
|
|
}
|
|
function caml_unix_chdir(dir){return caml_sys_chdir(dir, true);}
|
|
function caml_unix_chmod(name, perms){
|
|
var root = resolve_fs_device(name);
|
|
if(! root.device.chmod) caml_failwith("caml_unix_chmod: not implemented");
|
|
return root.device.chmod(root.rest, perms);
|
|
}
|
|
function caml_unix_cleanup(){}
|
|
function caml_unix_lookup_file(fd, cmd){
|
|
var fd_desc = caml_sys_fds[fd];
|
|
if(fd_desc === undefined) caml_raise_system_error(1, "EBADF", cmd);
|
|
return fd_desc.file;
|
|
}
|
|
function caml_unix_close(fd){
|
|
var file = caml_unix_lookup_file(fd, "close");
|
|
file.close(1);
|
|
return 0;
|
|
}
|
|
function caml_unix_closedir(dir_handle){
|
|
try{dir_handle.pointer.closeSync();}
|
|
catch(e){caml_raise_system_error(1, "EBADF", "closedir");}
|
|
}
|
|
function caml_unix_fchmod(fd, perms){
|
|
var file = caml_unix_lookup_file(fd, "fchmod");
|
|
if(! file.chmod) caml_failwith("caml_unix_fchmod: not implemented");
|
|
return file.chmod(perms);
|
|
}
|
|
function caml_unix_filedescr_of_fd(x){return x;}
|
|
function caml_unix_findclose(dir_handle){return caml_unix_closedir(dir_handle);
|
|
}
|
|
function caml_unix_opendir(path){
|
|
var root = resolve_fs_device(path);
|
|
if(! root.device.opendir)
|
|
caml_failwith("caml_unix_opendir: not implemented");
|
|
var dir_handle = root.device.opendir(root.rest, true);
|
|
return {pointer: dir_handle, path: path};
|
|
}
|
|
function caml_unix_readdir(dir_handle){
|
|
var entry;
|
|
try{entry = dir_handle.pointer.readSync();}
|
|
catch(e){caml_raise_system_error(1, "EBADF", "readdir");}
|
|
if(entry === null)
|
|
caml_raise_end_of_file();
|
|
else
|
|
return caml_string_of_jsstring(entry.name);
|
|
}
|
|
function caml_unix_findfirst(path){
|
|
var path_js = caml_jsstring_of_string(path);
|
|
path_js = path_js.replace(/(^|[\\/])\*\.\*$/, "");
|
|
path = caml_string_of_jsstring(path_js);
|
|
var
|
|
dir_handle = caml_unix_opendir(path),
|
|
first_entry = caml_unix_readdir(dir_handle);
|
|
return [0, first_entry, dir_handle];
|
|
}
|
|
function caml_unix_findnext(dir_handle){return caml_unix_readdir(dir_handle);
|
|
}
|
|
function caml_unix_fstat(fd){
|
|
var file = caml_unix_lookup_file(fd, "fstat");
|
|
if(! file.stat) caml_failwith("caml_unix_fstat: not implemented");
|
|
return file.stat(false);
|
|
}
|
|
function caml_unix_fstat_64(fd){
|
|
var file = caml_unix_lookup_file(fd, "fstat");
|
|
if(! file.stat) caml_failwith("caml_unix_fstat64: not implemented");
|
|
return file.stat(true);
|
|
}
|
|
function caml_unix_fsync(fd){
|
|
var file = caml_unix_lookup_file(fd, "fsync");
|
|
if(! file.sync) caml_failwith("caml_unix_fsync: not implemented");
|
|
return file.sync();
|
|
}
|
|
function caml_unix_ftruncate(fd, len){
|
|
var file = caml_unix_lookup_file(fd, "ftruncate");
|
|
if(! file.truncate) caml_failwith("caml_unix_ftruncate: not implemented");
|
|
file.truncate(len, 1);
|
|
return 0;
|
|
}
|
|
function caml_unix_ftruncate_64(fd, len){
|
|
var file = caml_unix_lookup_file(fd, "ftruncate");
|
|
if(! file.truncate)
|
|
caml_failwith("caml_unix_ftruncate_64: not implemented");
|
|
file.truncate(caml_int64_to_float(len), 1);
|
|
return 0;
|
|
}
|
|
function caml_unix_getegid(_unit){
|
|
if(globalThis.process?.getegid) return globalThis.process.getegid();
|
|
return 1;
|
|
}
|
|
function caml_unix_geteuid(_unit){
|
|
if(globalThis.process?.geteuid) return globalThis.process.geteuid();
|
|
return 1;
|
|
}
|
|
function caml_unix_getgid(_unit){
|
|
if(globalThis.process?.getgid) return globalThis.process.getgid();
|
|
return 1;
|
|
}
|
|
function caml_unix_getpwnam(_unit){caml_raise_not_found();}
|
|
function caml_unix_gettimeofday(){return new Date().getTime() / 1000;}
|
|
function caml_unix_getuid(_unit){
|
|
if(globalThis.process?.getuid) return globalThis.process.getuid();
|
|
return 1;
|
|
}
|
|
function caml_unix_gmtime(t){
|
|
var
|
|
d = new Date(t * 1000),
|
|
d_num = d.getTime(),
|
|
januaryfirst = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)).getTime(),
|
|
doy = Math.floor((d_num - januaryfirst) / 86400000);
|
|
return [0,
|
|
d.getUTCSeconds(),
|
|
d.getUTCMinutes(),
|
|
d.getUTCHours(),
|
|
d.getUTCDate(),
|
|
d.getUTCMonth(),
|
|
d.getUTCFullYear() - 1900,
|
|
d.getUTCDay(),
|
|
doy,
|
|
false | 0];
|
|
}
|
|
function caml_unix_has_symlink(_unit){return fs_node_supported() ? 1 : 0;}
|
|
function caml_unix_inchannel_of_filedescr(fd){
|
|
var file = caml_unix_lookup_file(fd, "in_channel_of_descr");
|
|
file.check_stream_semantics("in_channel_of_descr");
|
|
return caml_ml_open_descriptor_in(fd);
|
|
}
|
|
function caml_unix_inet_addr_of_string(){return 0;}
|
|
function caml_unix_isatty(fd){
|
|
var file = caml_unix_lookup_file(fd);
|
|
if(! file.isatty) return 0;
|
|
return file.isatty();
|
|
}
|
|
function caml_unix_link(follow, src, dst){
|
|
var src_root = resolve_fs_device(src), dst_root = resolve_fs_device(dst);
|
|
if(! src_root.device.link)
|
|
caml_failwith("caml_unix_link: not implemented");
|
|
if(typeof follow !== "number")
|
|
caml_raise_system_error(1, "ENOSYS", "link");
|
|
if(src_root.device !== dst_root.device)
|
|
caml_raise_system_error(1, "EXDEV", "link");
|
|
return src_root.device.link(src_root.rest, dst_root.rest, true);
|
|
}
|
|
function caml_unix_localtime(t){
|
|
var
|
|
d = new Date(t * 1000),
|
|
d_num = d.getTime(),
|
|
januaryfirst = new Date(d.getFullYear(), 0, 1).getTime(),
|
|
doy = Math.floor((d_num - januaryfirst) / 86400000),
|
|
jan = new Date(d.getFullYear(), 0, 1),
|
|
jul = new Date(d.getFullYear(), 6, 1),
|
|
stdTimezoneOffset =
|
|
Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
|
|
return [0,
|
|
d.getSeconds(),
|
|
d.getMinutes(),
|
|
d.getHours(),
|
|
d.getDate(),
|
|
d.getMonth(),
|
|
d.getFullYear() - 1900,
|
|
d.getDay(),
|
|
doy,
|
|
d.getTimezoneOffset() < stdTimezoneOffset | 0];
|
|
}
|
|
function caml_unix_lseek(fd, len, whence){
|
|
var file = caml_unix_lookup_file(fd, "lseek");
|
|
return file.seek(len, whence, 1);
|
|
}
|
|
function caml_unix_lseek_64(fd, len, whence){
|
|
var file = caml_unix_lookup_file(fd, "lseek");
|
|
return file.seek(caml_int64_to_float(len), whence, 1);
|
|
}
|
|
function caml_unix_lstat(name){
|
|
var root = resolve_fs_device(name);
|
|
if(! root.device.lstat) caml_failwith("caml_unix_lstat: not implemented");
|
|
return root.device.lstat(root.rest, false, true);
|
|
}
|
|
function caml_unix_lstat_64(name){
|
|
var root = resolve_fs_device(name);
|
|
if(! root.device.lstat)
|
|
caml_failwith("caml_unix_lstat_64: not implemented");
|
|
return root.device.lstat(root.rest, true, true);
|
|
}
|
|
function caml_unix_mkdir(name, perm){
|
|
var root = resolve_fs_device(name);
|
|
if(! root.device.mkdir) caml_failwith("caml_unix_mkdir: not implemented");
|
|
return root.device.mkdir(root.rest, perm, true);
|
|
}
|
|
function caml_unix_mktime(tm){
|
|
var
|
|
d = new Date(tm[6] + 1900, tm[5], tm[4], tm[3], tm[2], tm[1]).getTime(),
|
|
t = Math.floor(d / 1000),
|
|
tm2 = caml_unix_localtime(t);
|
|
return [0, t, tm2];
|
|
}
|
|
function caml_unix_open(name, flags, perms){
|
|
var f = {};
|
|
while(flags){
|
|
switch(flags[1]){
|
|
case 0:
|
|
f.rdonly = 1; break;
|
|
case 1:
|
|
f.wronly = 1; break;
|
|
case 2:
|
|
f.rdwr = 1; break;
|
|
case 3:
|
|
f.nonblock = 1; break;
|
|
case 4:
|
|
f.append = 1; break;
|
|
case 5:
|
|
f.create = 1; break;
|
|
case 6:
|
|
f.truncate = 1; break;
|
|
case 7:
|
|
f.excl = 1; break;
|
|
case 8:
|
|
f.noctty = 1; break;
|
|
case 9:
|
|
f.dsync = 1; break;
|
|
case 10:
|
|
f.sync = 1; break;
|
|
}
|
|
flags = flags[2];
|
|
}
|
|
var
|
|
root = resolve_fs_device(name),
|
|
file = root.device.open(root.rest, f, perms, true),
|
|
idx = caml_sys_fds.length,
|
|
chanid = new MlChanid(idx);
|
|
caml_sys_fds[idx] = {file: file, chanid: chanid};
|
|
return idx | 0;
|
|
}
|
|
function caml_unix_outchannel_of_filedescr(fd){
|
|
var file = caml_unix_lookup_file(fd, "out_channel_of_descr");
|
|
file.check_stream_semantics("out_channel_of_descr");
|
|
return caml_ml_open_descriptor_out(fd);
|
|
}
|
|
function caml_unix_read(fd, buf, pos, len){
|
|
var file = caml_unix_lookup_file(fd, "read");
|
|
return file.read(caml_uint8_array_of_bytes(buf), pos, len, 1);
|
|
}
|
|
function caml_unix_read_bigarray(fd, buf, pos, len){
|
|
var
|
|
a = caml_ba_to_typed_array(buf),
|
|
file = caml_unix_lookup_file(fd, "read");
|
|
return file.read(a, pos, len, 1);
|
|
}
|
|
function caml_unix_readlink(name){
|
|
var root = resolve_fs_device(name);
|
|
if(! root.device.readlink)
|
|
caml_failwith("caml_unix_readlink: not implemented");
|
|
return root.device.readlink(root.rest, true);
|
|
}
|
|
function caml_unix_rename(o, n){
|
|
var o_root = resolve_fs_device(o), n_root = resolve_fs_device(n);
|
|
if(o_root.device !== n_root.device)
|
|
caml_raise_system_error(1, "EXDEV", "rename");
|
|
if(! o_root.device.rename)
|
|
caml_failwith("caml_sys_rename: not implemented");
|
|
o_root.device.rename(o_root.rest, n_root.rest, true);
|
|
}
|
|
function caml_unix_rewinddir(dir_handle){
|
|
caml_unix_closedir(dir_handle);
|
|
var new_dir_handle = caml_unix_opendir(dir_handle.path);
|
|
dir_handle.pointer = new_dir_handle.pointer;
|
|
return 0;
|
|
}
|
|
function caml_unix_rmdir(name){
|
|
var root = resolve_fs_device(name);
|
|
if(! root.device.rmdir) caml_failwith("caml_unix_rmdir: not implemented");
|
|
return root.device.rmdir(root.rest, true);
|
|
}
|
|
function caml_unix_single_write(fd, buf, pos, len){
|
|
var file = caml_unix_lookup_file(fd, "write");
|
|
if(len === 0) return 0;
|
|
return file.write(caml_uint8_array_of_bytes(buf), pos, len, 1);
|
|
}
|
|
function caml_unix_startup(){}
|
|
function caml_unix_stat(name){
|
|
var root = resolve_fs_device(name);
|
|
if(! root.device.stat) caml_failwith("caml_unix_stat: not implemented");
|
|
return root.device.stat(root.rest, false, true);
|
|
}
|
|
function caml_unix_stat_64(name){
|
|
var root = resolve_fs_device(name);
|
|
if(! root.device.stat)
|
|
caml_failwith("caml_unix_stat_64: not implemented");
|
|
return root.device.stat(root.rest, true, true);
|
|
}
|
|
function caml_unix_symlink(to_dir, src, dst){
|
|
var dst_root = resolve_fs_device(dst);
|
|
if(! dst_root.device.symlink)
|
|
caml_failwith("caml_unix_symlink: not implemented");
|
|
return dst_root.device.symlink
|
|
(to_dir, caml_jsstring_of_string(src), dst_root.rest, true);
|
|
}
|
|
function caml_unix_time(){return Math.floor(caml_unix_gettimeofday());}
|
|
function caml_unix_times(){
|
|
if(globalThis.process?.cpuUsage){
|
|
var t = globalThis.process.cpuUsage();
|
|
return [0, t.user / 1e6, t.system / 1e6, 0, 0];
|
|
}
|
|
else if(globalThis.performance?.now)
|
|
return [0, globalThis.performance.now() / 1000, 0, 0, 0];
|
|
else
|
|
caml_failwith("caml_unix_times: not implemented");
|
|
}
|
|
function caml_unix_truncate(name, len){
|
|
var root = resolve_fs_device(name);
|
|
if(! root.device.truncate)
|
|
caml_failwith("caml_unix_truncate: not implemented");
|
|
root.device.truncate(root.rest, len, true);
|
|
return 0;
|
|
}
|
|
function caml_unix_truncate_64(name, len){
|
|
var root = resolve_fs_device(name);
|
|
if(! root.device.truncate)
|
|
caml_failwith("caml_unix_truncate_64: not implemented");
|
|
root.device.truncate(root.rest, caml_int64_to_float(len), true);
|
|
return 0;
|
|
}
|
|
function caml_unix_unlink(name){
|
|
var root = resolve_fs_device(name);
|
|
if(! root.device.unlink)
|
|
caml_failwith("caml_unix_unlink: not implemented");
|
|
root.device.unlink(root.rest, true);
|
|
return 0;
|
|
}
|
|
function caml_unix_utimes(name, atime, mtime){
|
|
var root = resolve_fs_device(name);
|
|
if(! root.device.utimes)
|
|
caml_failwith("caml_unix_utimes: not implemented");
|
|
root.device.utimes(root.rest, atime, mtime, true);
|
|
return 0;
|
|
}
|
|
function caml_unix_write(fd, buf, pos, len){
|
|
var
|
|
file = caml_unix_lookup_file(fd, "write"),
|
|
a = caml_uint8_array_of_bytes(buf),
|
|
written = 0;
|
|
while(len > 0){
|
|
var n = file.write(a, pos, len, 1);
|
|
written += n;
|
|
pos += n;
|
|
len -= n;
|
|
}
|
|
return written;
|
|
}
|
|
function caml_unix_write_bigarray(fd, buf, pos, len){
|
|
var
|
|
a = caml_ba_to_typed_array(buf),
|
|
file = caml_unix_lookup_file(fd, "write"),
|
|
written = 0;
|
|
while(len > 0){
|
|
var n = file.write(a, pos, len, 1);
|
|
written += n;
|
|
pos += n;
|
|
len -= n;
|
|
}
|
|
return written;
|
|
}
|
|
function caml_unmount(name){
|
|
var
|
|
path = caml_make_path(name),
|
|
name = caml_trailing_slash(path.join("/")),
|
|
idx = - 1;
|
|
for(var i = 0; i < jsoo_mount_point.length; i++)
|
|
if(jsoo_mount_point[i].path === name) idx = i;
|
|
if(idx > - 1) jsoo_mount_point.splice(idx, 1);
|
|
return 0;
|
|
}
|
|
function caml_update_dummy(x, y){
|
|
if(y.fun){x.fun = y.fun; return 0;}
|
|
if(typeof y === "function"){x.fun = y; return 0;}
|
|
var i = y.length;
|
|
while(i--) x[i] = y[i];
|
|
return 0;
|
|
}
|
|
function caml_weak_set(x, i, v){
|
|
if(v === 0) caml_ephe_unset_key(x, i); else caml_ephe_set_key(x, i, v[1]);
|
|
return 0;
|
|
}
|
|
function caml_wrap_exception(e){
|
|
{
|
|
if(Array.isArray(e)) return e;
|
|
var exn;
|
|
if
|
|
(globalThis.RangeError && e instanceof globalThis.RangeError
|
|
&& e.message
|
|
&& e.message.match(/maximum call stack/i))
|
|
exn = caml_global_data.Stack_overflow;
|
|
else if
|
|
(globalThis.InternalError && e instanceof globalThis.InternalError
|
|
&& e.message
|
|
&& e.message.match(/too much recursion/i))
|
|
exn = caml_global_data.Stack_overflow;
|
|
else if(e instanceof globalThis.Error && caml_named_value("jsError"))
|
|
exn = [0, caml_named_value("jsError"), e];
|
|
else
|
|
exn = [0, caml_global_data.Failure, caml_string_of_jsstring(String(e))];
|
|
if(e instanceof globalThis.Error) exn.js_error = e;
|
|
return exn;
|
|
}
|
|
}
|
|
function caml_xdg_defaults(_unit){return 0;}
|
|
function caml_xmlhttprequest_create(_unit){
|
|
if(typeof XMLHttpRequest === "undefined")
|
|
caml_failwith("XMLHttpRequest is not available");
|
|
try{return new XMLHttpRequest();}
|
|
catch{caml_failwith("Failed to create XMLHttpRequest");}
|
|
}
|
|
function caml_zstd_initialize(_unit){
|
|
caml_decompress_input = zstd_decompress;
|
|
return 1;
|
|
}
|
|
function compare_digits_nat(nat1, ofs1, nat2, ofs2){
|
|
if(nat1.data[ofs1] > nat2.data[ofs2]) return 1;
|
|
if(nat1.data[ofs1] < nat2.data[ofs2]) return - 1;
|
|
return 0;
|
|
}
|
|
function compare_nat(nat1, ofs1, len1, nat2, ofs2, len2){
|
|
var
|
|
a = num_digits_nat(nat1, ofs1, len1),
|
|
b = num_digits_nat(nat2, ofs2, len2);
|
|
if(a > b) return 1;
|
|
if(a < b) return - 1;
|
|
for(var i = len1 - 1; i >= 0; i--){
|
|
if(nat1.data[ofs1 + i] >>> 0 > nat2.data[ofs2 + i] >>> 0) return 1;
|
|
if(nat1.data[ofs1 + i] >>> 0 < nat2.data[ofs2 + i] >>> 0) return - 1;
|
|
}
|
|
return 0;
|
|
}
|
|
function complement_nat(nat, ofs, len){
|
|
for(var i = 0; i < len; i++)
|
|
nat.data[ofs + i] = (- 1 >>> 0) - (nat.data[ofs + i] >>> 0);
|
|
}
|
|
function create_nat(size){
|
|
var arr = new MlNat(size);
|
|
for(var i = 0; i < size; i++) arr.data[i] = - 1;
|
|
return arr;
|
|
}
|
|
function decr_nat(nat, ofs, len, carry_in){
|
|
var borrow = carry_in === 1 ? 0 : 1;
|
|
for(var i = 0; i < len; i++){
|
|
var x = (nat.data[ofs + i] >>> 0) - borrow;
|
|
nat.data[ofs + i] = x;
|
|
if(x >= 0){borrow = 0; break;} else borrow = 1;
|
|
}
|
|
return borrow === 1 ? 0 : 1;
|
|
}
|
|
function deserialize_nat(reader, sz){
|
|
var len = reader.read32s(), nat = new MlNat(len);
|
|
for(var i = 0; i < len; i++) nat.data[i] = reader.read32s();
|
|
sz[0] = len * 4;
|
|
return nat;
|
|
}
|
|
function div_helper(a, b, c){
|
|
var
|
|
x = a * 65536 + (b >>> 16),
|
|
y = Math.floor(x / c) * 65536,
|
|
z = x % c * 65536,
|
|
w = z + (b & 0x0000ffff);
|
|
return [y + Math.floor(w / c), w % c];
|
|
}
|
|
function div_digit_nat(natq, ofsq, natr, ofsr, nat1, ofs1, len, nat2, ofs2){
|
|
var rem = nat1.data[ofs1 + len - 1] >>> 0;
|
|
for(var i = len - 2; i >= 0; i--){
|
|
var
|
|
x = div_helper(rem, nat1.data[ofs1 + i] >>> 0, nat2.data[ofs2] >>> 0);
|
|
natq.data[ofsq + i] = x[0];
|
|
rem = x[1];
|
|
}
|
|
natr.data[ofsr] = rem;
|
|
return 0;
|
|
}
|
|
function num_leading_zero_bits_in_digit(nat, ofs){
|
|
var a = nat.data[ofs], b = 0;
|
|
if(a & 0xffff0000){b += 16; a >>>= 16;}
|
|
if(a & 0xff00){b += 8; a >>>= 8;}
|
|
if(a & 0xf0){b += 4; a >>>= 4;}
|
|
if(a & 12){b += 2; a >>>= 2;}
|
|
if(a & 2){b += 1; a >>>= 1;}
|
|
if(a & 1) b += 1;
|
|
return 32 - b;
|
|
}
|
|
function shift_left_nat(nat1, ofs1, len1, nat2, ofs2, nbits){
|
|
if(nbits === 0){nat2.data[ofs2] = 0; return 0;}
|
|
var wrap = 0;
|
|
for(var i = 0; i < len1; i++){
|
|
var a = nat1.data[ofs1 + i] >>> 0;
|
|
nat1.data[ofs1 + i] = a << nbits | wrap;
|
|
wrap = a >>> 32 - nbits;
|
|
}
|
|
nat2.data[ofs2] = wrap;
|
|
return 0;
|
|
}
|
|
function shift_right_nat(nat1, ofs1, len1, nat2, ofs2, nbits){
|
|
if(nbits === 0){nat2.data[ofs2] = 0; return 0;}
|
|
var wrap = 0;
|
|
for(var i = len1 - 1; i >= 0; i--){
|
|
var a = nat1.data[ofs1 + i] >>> 0;
|
|
nat1.data[ofs1 + i] = a >>> nbits | wrap;
|
|
wrap = a << 32 - nbits;
|
|
}
|
|
nat2.data[ofs2] = wrap;
|
|
return 0;
|
|
}
|
|
function set_to_zero_nat(nat, ofs, len){
|
|
for(var i = 0; i < len; i++) nat.data[ofs + i] = 0;
|
|
return 0;
|
|
}
|
|
function nat_of_array(l){return new MlNat(l);}
|
|
function mult_digit_nat(nat1, ofs1, len1, nat2, ofs2, len2, nat3, ofs3){
|
|
var carry = 0, a = nat3.data[ofs3] >>> 0;
|
|
for(var i = 0; i < len2; i++){
|
|
var
|
|
x1 =
|
|
(nat1.data[ofs1 + i] >>> 0)
|
|
+ (nat2.data[ofs2 + i] >>> 0) * (a & 0x0000ffff)
|
|
+ carry,
|
|
x2 = (nat2.data[ofs2 + i] >>> 0) * (a >>> 16);
|
|
carry = Math.floor(x2 / 65536);
|
|
var x3 = x1 + x2 % 65536 * 65536;
|
|
nat1.data[ofs1 + i] = x3;
|
|
carry += Math.floor(x3 / 4294967296);
|
|
}
|
|
return len2 < len1 && carry
|
|
? add_nat
|
|
(nat1, ofs1 + len2, len1 - len2, nat_of_array([carry]), 0, 1, 0)
|
|
: carry;
|
|
}
|
|
function sub_nat(nat1, ofs1, len1, nat2, ofs2, len2, carry_in){
|
|
var borrow = carry_in === 1 ? 0 : 1;
|
|
for(var i = 0; i < len2; i++){
|
|
var
|
|
x = (nat1.data[ofs1 + i] >>> 0) - (nat2.data[ofs2 + i] >>> 0) - borrow;
|
|
nat1.data[ofs1 + i] = x;
|
|
if(x >= 0) borrow = 0; else borrow = 1;
|
|
}
|
|
return decr_nat(nat1, ofs1 + len2, len1 - len2, borrow === 1 ? 0 : 1);
|
|
}
|
|
function div_nat(nat1, ofs1, len1, nat2, ofs2, len2){
|
|
if(len2 === 1){
|
|
div_digit_nat(nat1, ofs1 + 1, nat1, ofs1, nat1, ofs1, len1, nat2, ofs2);
|
|
return 0;
|
|
}
|
|
var s = num_leading_zero_bits_in_digit(nat2, ofs2 + len2 - 1);
|
|
shift_left_nat(nat2, ofs2, len2, nat_of_array([0]), 0, s);
|
|
shift_left_nat(nat1, ofs1, len1, nat_of_array([0]), 0, s);
|
|
var d = (nat2.data[ofs2 + len2 - 1] >>> 0) + 1, a = create_nat(len2 + 1);
|
|
for(var i = len1 - 1; i >= len2; i--){
|
|
var
|
|
quo =
|
|
d === 4294967296
|
|
? nat1.data[ofs1 + i] >>> 0
|
|
: div_helper
|
|
(nat1.data[ofs1 + i] >>> 0, nat1.data[ofs1 + i - 1] >>> 0, d)
|
|
[0];
|
|
set_to_zero_nat(a, 0, len2 + 1);
|
|
mult_digit_nat(a, 0, len2 + 1, nat2, ofs2, len2, nat_of_array([quo]), 0);
|
|
sub_nat(nat1, ofs1 + i - len2, len2 + 1, a, 0, len2 + 1, 1);
|
|
while
|
|
(nat1.data[ofs1 + i] !== 0
|
|
|| compare_nat(nat1, ofs1 + i - len2, len2, nat2, ofs2, len2) >= 0){
|
|
quo = quo + 1;
|
|
sub_nat(nat1, ofs1 + i - len2, len2 + 1, nat2, ofs2, len2, 1);
|
|
}
|
|
nat1.data[ofs1 + i] = quo;
|
|
}
|
|
shift_right_nat(nat1, ofs1, len2, nat_of_array([0]), 0, s);
|
|
shift_right_nat(nat2, ofs2, len2, nat_of_array([0]), 0, s);
|
|
return 0;
|
|
}
|
|
function serialize_nat(writer, nat, sz){
|
|
var len = nat.data.length;
|
|
writer.write(32, len);
|
|
for(var i = 0; i < len; i++) writer.write(32, nat.data[i]);
|
|
sz[0] = len * 4;
|
|
sz[1] = len * 8;
|
|
}
|
|
function initialize_nat(){
|
|
caml_custom_ops._nat =
|
|
{deserialize: deserialize_nat,
|
|
serialize: serialize_nat,
|
|
hash: caml_hash_nat};
|
|
}
|
|
function is_digit_int(nat, ofs){if(nat.data[ofs] >= 0) return 1; return 0;}
|
|
function is_digit_normalized(_nat, _ofs){return 1;}
|
|
function is_digit_odd(nat, ofs){if(nat.data[ofs] & 1) return 1; return 0;}
|
|
function is_digit_zero(nat, ofs){
|
|
if(nat.data[ofs] === 0) return 1;
|
|
return 0;
|
|
}
|
|
function jsoo_create_file_extern(name, content){
|
|
if(globalThis.jsoo_create_file)
|
|
globalThis.jsoo_create_file(name, content);
|
|
else{
|
|
if(! globalThis.jsoo_fs_tmp) globalThis.jsoo_fs_tmp = [];
|
|
globalThis.jsoo_fs_tmp.push({name: name, content: content});
|
|
}
|
|
return 0;
|
|
}
|
|
function jsoo_effect_not_supported(){
|
|
caml_failwith("Effect handlers are not supported");
|
|
}
|
|
function land_digit_nat(nat1, ofs1, nat2, ofs2){nat1.data[ofs1] &= nat2.data[ofs2]; return 0;
|
|
}
|
|
function length_nat(x){return x.data.length;}
|
|
function lor_digit_nat(nat1, ofs1, nat2, ofs2){nat1.data[ofs1] |= nat2.data[ofs2]; return 0;
|
|
}
|
|
function lxor_digit_nat(nat1, ofs1, nat2, ofs2){nat1.data[ofs1] ^= nat2.data[ofs2]; return 0;
|
|
}
|
|
function mult_nat(nat1, ofs1, len1, nat2, ofs2, len2, nat3, ofs3, len3){
|
|
var carry = 0;
|
|
for(var i = 0; i < len3; i++)
|
|
carry +=
|
|
mult_digit_nat
|
|
(nat1, ofs1 + i, len1 - i, nat2, ofs2, len2, nat3, ofs3 + i);
|
|
return carry;
|
|
}
|
|
function nth_digit_nat(nat, ofs){return nat.data[ofs];}
|
|
function nth_digit_nat_native(nat, ofs){return nat.data[ofs];}
|
|
var
|
|
re_match =
|
|
function(){
|
|
var
|
|
re_word_letters =
|
|
[0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0xff,
|
|
0x03,
|
|
0xfe,
|
|
0xff,
|
|
0xff,
|
|
0x87,
|
|
0xfe,
|
|
0xff,
|
|
0xff,
|
|
0x07,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0xff,
|
|
0xff,
|
|
0x7f,
|
|
0xff,
|
|
0xff,
|
|
0xff,
|
|
0x7f,
|
|
0xff],
|
|
opcodes =
|
|
{CHAR: 0,
|
|
CHARNORM: 1,
|
|
STRING: 2,
|
|
STRINGNORM: 3,
|
|
CHARCLASS: 4,
|
|
BOL: 5,
|
|
EOL: 6,
|
|
WORDBOUNDARY: 7,
|
|
BEGGROUP: 8,
|
|
ENDGROUP: 9,
|
|
REFGROUP: 10,
|
|
ACCEPT: 11,
|
|
SIMPLEOPT: 12,
|
|
SIMPLESTAR: 13,
|
|
SIMPLEPLUS: 14,
|
|
GOTO: 15,
|
|
PUSHBACK: 16,
|
|
SETMARK: 17,
|
|
CHECKPROGRESS: 18};
|
|
function is_word_letter(c){
|
|
return re_word_letters[c >> 3] >> (c & 7) & 1;
|
|
}
|
|
function in_bitset(s, i){
|
|
return caml_string_get(s, i >> 3) >> (i & 7) & 1;
|
|
}
|
|
function re_match_impl(re, s, pos, partial){
|
|
var
|
|
prog = caml_js_from_array(re[1]),
|
|
cpool = caml_js_from_array(re[2]),
|
|
normtable = caml_jsbytes_of_string(re[3]),
|
|
numgroups = re[4] | 0,
|
|
numregisters = re[5] | 0,
|
|
s = caml_uint8_array_of_string(s),
|
|
pc = 0,
|
|
quit = false,
|
|
stack = [],
|
|
groups = new Array(numgroups),
|
|
re_register = new Array(numregisters);
|
|
for(var i = 0; i < groups.length; i++)
|
|
groups[i] = {start: - 1, end: - 1};
|
|
groups[0].start = pos;
|
|
function backtrack(){
|
|
while(stack.length){
|
|
var item = stack.pop();
|
|
if(item.undo)
|
|
item.undo.obj[item.undo.prop] = item.undo.value;
|
|
else if(item.pos){pc = item.pos.pc; pos = item.pos.txt; return;}
|
|
}
|
|
quit = true;
|
|
}
|
|
function push(item){stack.push(item);}
|
|
function accept(){
|
|
groups[0].end = pos;
|
|
var result = new Array(1 + groups.length * 2);
|
|
result[0] = 0;
|
|
for(var i = 0; i < groups.length; i++){
|
|
var g = groups[i];
|
|
if(g.start < 0 || g.end < 0) g.start = g.end = - 1;
|
|
result[2 * i + 1] = g.start;
|
|
result[2 * i + 1 + 1] = g.end;
|
|
}
|
|
return result;
|
|
}
|
|
function prefix_match(){
|
|
if(partial) return accept(); else backtrack();
|
|
}
|
|
while(! quit){
|
|
var
|
|
op = prog[pc] & 0xff,
|
|
sarg = prog[pc] >> 8,
|
|
uarg = sarg & 0xff,
|
|
c = s[pos],
|
|
group;
|
|
pc++;
|
|
switch(op){
|
|
case opcodes.CHAR:
|
|
if(pos === s.length){prefix_match(); break;}
|
|
if(c === uarg) pos++; else backtrack();
|
|
break;
|
|
case opcodes.CHARNORM:
|
|
if(pos === s.length){prefix_match(); break;}
|
|
if(normtable.charCodeAt(c) === uarg) pos++; else backtrack();
|
|
break;
|
|
case opcodes.STRING:
|
|
for
|
|
(var arg = caml_jsbytes_of_string(cpool[uarg]), i = 0;
|
|
i < arg.length;
|
|
i++){
|
|
if(pos === s.length){prefix_match(); break;}
|
|
if(c === arg.charCodeAt(i))
|
|
c = s[++pos];
|
|
else{backtrack(); break;}
|
|
}
|
|
break;
|
|
case opcodes.STRINGNORM:
|
|
for
|
|
(var arg = caml_jsbytes_of_string(cpool[uarg]), i = 0;
|
|
i < arg.length;
|
|
i++){
|
|
if(pos === s.length){prefix_match(); break;}
|
|
if(normtable.charCodeAt(c) === arg.charCodeAt(i))
|
|
c = s[++pos];
|
|
else{backtrack(); break;}
|
|
}
|
|
break;
|
|
case opcodes.CHARCLASS:
|
|
if(pos === s.length){prefix_match(); break;}
|
|
if(in_bitset(cpool[uarg], c)) pos++; else backtrack();
|
|
break;
|
|
case opcodes.BOL:
|
|
if(pos > 0 && s[pos - 1] !== 10) backtrack(); break;
|
|
case opcodes.EOL:
|
|
if(pos < s.length && s[pos] !== 10) backtrack(); break;
|
|
case opcodes.WORDBOUNDARY:
|
|
if(pos === 0){
|
|
if(pos === s.length){prefix_match(); break;}
|
|
if(is_word_letter(s[0])) break;
|
|
backtrack();
|
|
}
|
|
else if(pos === s.length){
|
|
if(is_word_letter(s[pos - 1])) break;
|
|
backtrack();
|
|
}
|
|
else{
|
|
if(is_word_letter(s[pos - 1]) !== is_word_letter(s[pos])) break;
|
|
backtrack();
|
|
}
|
|
break;
|
|
case opcodes.BEGGROUP:
|
|
group = groups[uarg];
|
|
push({undo: {obj: group, prop: "start", value: group.start}});
|
|
group.start = pos;
|
|
break;
|
|
case opcodes.ENDGROUP:
|
|
group = groups[uarg];
|
|
push({undo: {obj: group, prop: "end", value: group.end}});
|
|
group.end = pos;
|
|
break;
|
|
case opcodes.REFGROUP:
|
|
group = groups[uarg];
|
|
if(group.start < 0 || group.end < 0){backtrack(); break;}
|
|
for(var i = group.start; i < group.end; i++){
|
|
if(pos === s.length){prefix_match(); break;}
|
|
if(s[i] !== s[pos]){backtrack(); break;}
|
|
pos++;
|
|
}
|
|
break;
|
|
case opcodes.SIMPLEOPT:
|
|
if(in_bitset(cpool[uarg], c)) pos++; break;
|
|
case opcodes.SIMPLESTAR:
|
|
while(in_bitset(cpool[uarg], c)) c = s[++pos]; break;
|
|
case opcodes.SIMPLEPLUS:
|
|
if(pos === s.length){prefix_match(); break;}
|
|
if(in_bitset(cpool[uarg], c))
|
|
do c = s[++pos];while(in_bitset(cpool[uarg], c));
|
|
else
|
|
backtrack();
|
|
break;
|
|
case opcodes.ACCEPT: return accept();
|
|
case opcodes.GOTO:
|
|
pc = pc + sarg; break;
|
|
case opcodes.PUSHBACK:
|
|
push({pos: {pc: pc + sarg, txt: pos}}); break;
|
|
case opcodes.SETMARK:
|
|
push
|
|
({undo: {obj: re_register, prop: uarg, value: re_register[uarg]}});
|
|
re_register[uarg] = pos;
|
|
break;
|
|
case opcodes.CHECKPROGRESS:
|
|
if(re_register[uarg] === pos) backtrack(); break;
|
|
default: throw new Error("Invalid bytecode");
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
return re_match_impl;
|
|
}
|
|
();
|
|
function re_partial_match(re, s, pos){
|
|
if(pos < 0 || pos > caml_ml_string_length(s))
|
|
caml_invalid_argument("Str.partial_match");
|
|
var res = re_match(re, s, pos, 1);
|
|
return res ? res : [0];
|
|
}
|
|
function re_replacement_text(repl, groups, orig){
|
|
var
|
|
repl = caml_jsbytes_of_string(repl),
|
|
len = repl.length,
|
|
orig = caml_jsbytes_of_string(orig),
|
|
res = "",
|
|
n = 0,
|
|
cur,
|
|
start,
|
|
end,
|
|
c;
|
|
while(n < len){
|
|
cur = repl.charAt(n++);
|
|
if(cur !== "\\")
|
|
res += cur;
|
|
else{
|
|
if(n === len) caml_failwith("Str.replace: illegal backslash sequence");
|
|
cur = repl.charAt(n++);
|
|
switch(cur){
|
|
case "\\":
|
|
res += cur; break;
|
|
case "0":
|
|
case "1":
|
|
case "2":
|
|
case "3":
|
|
case "4":
|
|
case "5":
|
|
case "6":
|
|
case "7":
|
|
case "8":
|
|
case "9":
|
|
c = + cur;
|
|
if(c * 2 >= groups.length - 1)
|
|
caml_failwith("Str.replace: reference to unmatched group");
|
|
start = caml_array_get(groups, c * 2);
|
|
end = caml_array_get(groups, c * 2 + 1);
|
|
if(start === - 1)
|
|
caml_failwith("Str.replace: reference to unmatched group");
|
|
res += orig.slice(start, end);
|
|
break;
|
|
default: res += "\\" + cur;
|
|
}
|
|
}
|
|
}
|
|
return caml_string_of_jsbytes(res);
|
|
}
|
|
function re_search_backward(re, s, pos){
|
|
if(pos < 0 || pos > caml_ml_string_length(s))
|
|
caml_invalid_argument("Str.search_backward");
|
|
var startchars = re[6] | 0;
|
|
if(startchars >= 0){
|
|
startchars = re[2][startchars + 1];
|
|
var len = caml_ml_string_length(s);
|
|
do{
|
|
while
|
|
(pos > 0 && pos < len
|
|
&& caml_string_get(startchars, caml_string_get(s, pos)) === 0)
|
|
pos--;
|
|
var res = re_match(re, s, pos, 0);
|
|
if(res) return res;
|
|
pos--;
|
|
}
|
|
while
|
|
(pos >= 0);
|
|
}
|
|
else
|
|
do{var res = re_match(re, s, pos, 0); if(res) return res; pos--;}
|
|
while
|
|
(pos >= 0);
|
|
return [0];
|
|
}
|
|
function re_search_forward(re, s, pos){
|
|
if(pos < 0 || pos > caml_ml_string_length(s))
|
|
caml_invalid_argument("Str.search_forward");
|
|
var startchars = re[6] | 0, len = caml_ml_string_length(s);
|
|
if(startchars >= 0){
|
|
startchars = re[2][startchars + 1];
|
|
do{
|
|
while
|
|
(pos < len && caml_string_get(startchars, caml_string_get(s, pos)) === 0)
|
|
pos++;
|
|
var res = re_match(re, s, pos, 0);
|
|
if(res) return res;
|
|
pos++;
|
|
}
|
|
while
|
|
(pos <= len);
|
|
}
|
|
else
|
|
do{var res = re_match(re, s, pos, 0); if(res) return res; pos++;}
|
|
while
|
|
(pos <= len);
|
|
return [0];
|
|
}
|
|
function re_string_match(re, s, pos){
|
|
if(pos < 0 || pos > caml_ml_string_length(s))
|
|
caml_invalid_argument("Str.string_match");
|
|
var res = re_match(re, s, pos, 0);
|
|
return res ? res : [0];
|
|
}
|
|
function set_digit_nat(nat, ofs, digit){nat.data[ofs] = digit; return 0;}
|
|
function set_digit_nat_native(nat, ofs, digit){nat.data[ofs] = digit; return 0;
|
|
}
|
|
function square_nat(nat1, ofs1, len1, nat2, ofs2, len2){
|
|
var carry = 0;
|
|
carry += add_nat(nat1, ofs1, len1, nat1, ofs1, len1, 0);
|
|
carry += mult_nat(nat1, ofs1, len1, nat2, ofs2, len2, nat2, ofs2, len2);
|
|
return carry;
|
|
}
|
|
function unix_error_message(err){
|
|
const errno = typeof err === "number" ? err : - err[1];
|
|
return caml_string_of_jsstring(caml_strerror(errno));
|
|
}
|
|
function caml_setup_uncaught_exception_handler(){
|
|
var process = globalThis.process;
|
|
if(process?.on)
|
|
process.on
|
|
("uncaughtException",
|
|
function(err, origin){
|
|
caml_fatal_uncaught_exception(err);
|
|
process.exit(2);
|
|
});
|
|
else if(globalThis.addEventListener)
|
|
globalThis.addEventListener
|
|
("error",
|
|
function(event){
|
|
if(event.error) caml_fatal_uncaught_exception(event.error);
|
|
});
|
|
}
|
|
caml_setup_uncaught_exception_handler();
|
|
globalThis.jsoo_runtime =
|
|
{caml_blake2_string: caml_blake2_string,
|
|
caml_blake2_update: caml_blake2_update,
|
|
caml_blake2_final: caml_blake2_final,
|
|
caml_blake2_create: caml_blake2_create,
|
|
blake2b: blake2b,
|
|
caml_runtime_events_read_poll: caml_runtime_events_read_poll,
|
|
caml_runtime_events_free_cursor: caml_runtime_events_free_cursor,
|
|
caml_runtime_events_create_cursor: caml_runtime_events_create_cursor,
|
|
caml_ml_runtime_events_resume: caml_ml_runtime_events_resume,
|
|
caml_ml_runtime_events_are_active: caml_ml_runtime_events_are_active,
|
|
caml_ml_runtime_events_pause: caml_ml_runtime_events_pause,
|
|
caml_ml_runtime_events_start: caml_ml_runtime_events_start,
|
|
caml_runtime_events_user_resolve: caml_runtime_events_user_resolve,
|
|
caml_runtime_events_user_write: caml_runtime_events_user_write,
|
|
caml_runtime_events_user_register: caml_runtime_events_user_register,
|
|
caml_custom_event_index: caml_custom_event_index,
|
|
caml_zstd_initialize: caml_zstd_initialize,
|
|
caml_decompress_input: caml_decompress_input,
|
|
zstd_decompress: zstd_decompress,
|
|
jsoo_effect_not_supported: jsoo_effect_not_supported,
|
|
caml_ml_condition_signal: caml_ml_condition_signal,
|
|
caml_ml_condition_broadcast: caml_ml_condition_broadcast,
|
|
caml_ml_condition_wait: caml_ml_condition_wait,
|
|
caml_ml_condition_new: caml_ml_condition_new,
|
|
caml_get_continuation_callstack: caml_get_continuation_callstack,
|
|
caml_continuation_use_and_update_handler_noexc:
|
|
caml_continuation_use_and_update_handler_noexc,
|
|
caml_continuation_use_noexc: caml_continuation_use_noexc,
|
|
caml_alloc_stack: caml_alloc_stack,
|
|
caml_ml_mutex_unlock: caml_ml_mutex_unlock,
|
|
caml_ml_mutex_try_lock: caml_ml_mutex_try_lock,
|
|
caml_ml_mutex_lock: caml_ml_mutex_lock,
|
|
caml_ml_mutex_new: caml_ml_mutex_new,
|
|
MlMutex: MlMutex,
|
|
caml_lxm_next: caml_lxm_next,
|
|
caml_lxm_daba: caml_lxm_daba,
|
|
caml_lxm_M: caml_lxm_M,
|
|
caml_ml_domain_cpu_relax: caml_ml_domain_cpu_relax,
|
|
caml_ml_domain_id: caml_ml_domain_id,
|
|
caml_domain_spawn: caml_domain_spawn,
|
|
caml_domain_id: caml_domain_id,
|
|
caml_recommended_domain_count: caml_recommended_domain_count,
|
|
caml_atomic_make_contended: caml_atomic_make_contended,
|
|
caml_atomic_exchange: caml_atomic_exchange,
|
|
caml_atomic_fetch_add: caml_atomic_fetch_add,
|
|
caml_atomic_cas: caml_atomic_cas,
|
|
caml_atomic_load: caml_atomic_load,
|
|
caml_domain_dls_get: caml_domain_dls_get,
|
|
caml_domain_dls_compare_and_set: caml_domain_dls_compare_and_set,
|
|
caml_domain_dls_set: caml_domain_dls_set,
|
|
caml_domain_dls: caml_domain_dls,
|
|
caml_ephe_check_data: caml_ephe_check_data,
|
|
caml_ephe_unset_data: caml_ephe_unset_data,
|
|
caml_ephe_set_data_opt: caml_ephe_set_data_opt,
|
|
caml_ephe_set_data: caml_ephe_set_data,
|
|
caml_ephe_get_data_copy: caml_ephe_get_data_copy,
|
|
caml_ephe_get_data: caml_ephe_get_data,
|
|
caml_ephe_blit_data: caml_ephe_blit_data,
|
|
caml_ephe_blit_key: caml_ephe_blit_key,
|
|
caml_ephe_check_key: caml_ephe_check_key,
|
|
caml_ephe_get_key_copy: caml_ephe_get_key_copy,
|
|
caml_ephe_get_key: caml_ephe_get_key,
|
|
caml_weak_set: caml_weak_set,
|
|
caml_weak_create: caml_weak_create,
|
|
caml_ephe_create: caml_ephe_create,
|
|
caml_ephe_unset_key: caml_ephe_unset_key,
|
|
caml_ephe_set_key: caml_ephe_set_key,
|
|
caml_ephe_none: caml_ephe_none,
|
|
caml_ephe_data_offset: caml_ephe_data_offset,
|
|
caml_ephe_key_offset: caml_ephe_key_offset,
|
|
caml_raise_system_error: caml_raise_system_error,
|
|
caml_unix_inet_addr_of_string: caml_unix_inet_addr_of_string,
|
|
caml_unix_findclose: caml_unix_findclose,
|
|
caml_unix_findnext: caml_unix_findnext,
|
|
caml_unix_findfirst: caml_unix_findfirst,
|
|
caml_unix_rewinddir: caml_unix_rewinddir,
|
|
caml_unix_closedir: caml_unix_closedir,
|
|
caml_unix_readdir: caml_unix_readdir,
|
|
caml_unix_opendir: caml_unix_opendir,
|
|
caml_unix_has_symlink: caml_unix_has_symlink,
|
|
caml_unix_getpwnam: caml_unix_getpwnam,
|
|
caml_unix_getegid: caml_unix_getegid,
|
|
caml_unix_getgid: caml_unix_getgid,
|
|
caml_unix_geteuid: caml_unix_geteuid,
|
|
caml_unix_getuid: caml_unix_getuid,
|
|
caml_unix_outchannel_of_filedescr: caml_unix_outchannel_of_filedescr,
|
|
caml_unix_inchannel_of_filedescr: caml_unix_inchannel_of_filedescr,
|
|
caml_unix_close: caml_unix_close,
|
|
caml_unix_ftruncate_64: caml_unix_ftruncate_64,
|
|
caml_unix_ftruncate: caml_unix_ftruncate,
|
|
caml_unix_lseek_64: caml_unix_lseek_64,
|
|
caml_unix_lseek: caml_unix_lseek,
|
|
caml_unix_read_bigarray: caml_unix_read_bigarray,
|
|
caml_unix_read: caml_unix_read,
|
|
caml_unix_write_bigarray: caml_unix_write_bigarray,
|
|
caml_unix_single_write: caml_unix_single_write,
|
|
caml_unix_write: caml_unix_write,
|
|
caml_unix_fsync: caml_unix_fsync,
|
|
caml_unix_fchmod: caml_unix_fchmod,
|
|
caml_unix_fstat_64: caml_unix_fstat_64,
|
|
caml_unix_fstat: caml_unix_fstat,
|
|
caml_unix_lookup_file: caml_unix_lookup_file,
|
|
caml_unix_open: caml_unix_open,
|
|
caml_unix_access: caml_unix_access,
|
|
caml_unix_truncate_64: caml_unix_truncate_64,
|
|
caml_unix_truncate: caml_unix_truncate,
|
|
caml_unix_utimes: caml_unix_utimes,
|
|
caml_unix_unlink: caml_unix_unlink,
|
|
caml_unix_readlink: caml_unix_readlink,
|
|
caml_unix_symlink: caml_unix_symlink,
|
|
caml_unix_link: caml_unix_link,
|
|
caml_unix_rmdir: caml_unix_rmdir,
|
|
caml_unix_mkdir: caml_unix_mkdir,
|
|
caml_unix_rename: caml_unix_rename,
|
|
caml_unix_chmod: caml_unix_chmod,
|
|
caml_unix_lstat_64: caml_unix_lstat_64,
|
|
caml_unix_lstat: caml_unix_lstat,
|
|
caml_unix_stat_64: caml_unix_stat_64,
|
|
caml_unix_stat: caml_unix_stat,
|
|
caml_unix_chdir: caml_unix_chdir,
|
|
unix_error_message: unix_error_message,
|
|
caml_strerror: caml_strerror,
|
|
make_unix_err_args: make_unix_err_args,
|
|
unix_error: unix_error,
|
|
caml_unix_isatty: caml_unix_isatty,
|
|
caml_unix_filedescr_of_fd: caml_unix_filedescr_of_fd,
|
|
caml_unix_cleanup: caml_unix_cleanup,
|
|
caml_unix_startup: caml_unix_startup,
|
|
caml_unix_mktime: caml_unix_mktime,
|
|
caml_unix_localtime: caml_unix_localtime,
|
|
caml_unix_gmtime: caml_unix_gmtime,
|
|
caml_unix_times: caml_unix_times,
|
|
caml_unix_time: caml_unix_time,
|
|
caml_unix_gettimeofday: caml_unix_gettimeofday,
|
|
re_replacement_text: re_replacement_text,
|
|
re_partial_match: re_partial_match,
|
|
re_string_match: re_string_match,
|
|
re_search_backward: re_search_backward,
|
|
re_search_forward: re_search_forward,
|
|
re_match: re_match,
|
|
caml_io_buffer_size: caml_io_buffer_size,
|
|
caml_sys_is_regular_file: caml_sys_is_regular_file,
|
|
caml_xdg_defaults: caml_xdg_defaults,
|
|
caml_sys_const_naked_pointers_checked:
|
|
caml_sys_const_naked_pointers_checked,
|
|
caml_ml_runtime_warnings_enabled: caml_ml_runtime_warnings_enabled,
|
|
caml_ml_enable_runtime_warnings: caml_ml_enable_runtime_warnings,
|
|
caml_runtime_warnings: caml_runtime_warnings,
|
|
caml_install_signal_handler: caml_install_signal_handler,
|
|
caml_runtime_parameters: caml_runtime_parameters,
|
|
caml_runtime_variant: caml_runtime_variant,
|
|
caml_sys_isatty: caml_sys_isatty,
|
|
caml_sys_get_config: caml_sys_get_config,
|
|
os_type: os_type,
|
|
caml_sys_const_backend_type: caml_sys_const_backend_type,
|
|
caml_sys_const_ostype_cygwin: caml_sys_const_ostype_cygwin,
|
|
caml_sys_const_ostype_win32: caml_sys_const_ostype_win32,
|
|
caml_sys_const_ostype_unix: caml_sys_const_ostype_unix,
|
|
caml_sys_const_max_wosize: caml_sys_const_max_wosize,
|
|
caml_sys_const_int_size: caml_sys_const_int_size,
|
|
caml_sys_const_word_size: caml_sys_const_word_size,
|
|
caml_sys_const_big_endian: caml_sys_const_big_endian,
|
|
caml_sys_random_seed: caml_sys_random_seed,
|
|
caml_sys_time_include_children: caml_sys_time_include_children,
|
|
caml_sys_time: caml_sys_time,
|
|
caml_sys_system_command: caml_sys_system_command,
|
|
caml_sys_executable_name: caml_sys_executable_name,
|
|
caml_sys_modify_argv: caml_sys_modify_argv,
|
|
caml_sys_argv: caml_sys_argv,
|
|
caml_sys_get_argv: caml_sys_get_argv,
|
|
caml_executable_name: caml_executable_name,
|
|
caml_argv: caml_argv,
|
|
caml_sys_unsafe_getenv: caml_sys_unsafe_getenv,
|
|
caml_sys_getenv: caml_sys_getenv,
|
|
jsoo_sys_getenv: jsoo_sys_getenv,
|
|
caml_set_static_env: caml_set_static_env,
|
|
jsoo_static_env: jsoo_static_env,
|
|
caml_fatal_uncaught_exception: caml_fatal_uncaught_exception,
|
|
caml_format_exception: caml_format_exception,
|
|
caml_is_special_exception: caml_is_special_exception,
|
|
caml_sys_exit: caml_sys_exit,
|
|
caml_raise_sys_error: caml_raise_sys_error,
|
|
caml_maybe_print_stats: caml_maybe_print_stats,
|
|
caml_is_printable: caml_is_printable,
|
|
caml_get_global_data: caml_get_global_data,
|
|
caml_register_global: caml_register_global,
|
|
jsoo_toplevel_reloc: jsoo_toplevel_reloc,
|
|
caml_build_symbols: caml_build_symbols,
|
|
caml_global_data: caml_global_data,
|
|
caml_named_value: caml_named_value,
|
|
caml_register_named_value: caml_register_named_value,
|
|
caml_named_values: caml_named_values,
|
|
caml_call_gen: caml_call_gen,
|
|
caml_set_parser_trace: caml_set_parser_trace,
|
|
caml_parse_engine: caml_parse_engine,
|
|
caml_parser_trace: caml_parser_trace,
|
|
caml_custom_identifier: caml_custom_identifier,
|
|
caml_is_continuation_tag: caml_is_continuation_tag,
|
|
caml_lazy_read_result: caml_lazy_read_result,
|
|
caml_lazy_reset_to_lazy: caml_lazy_reset_to_lazy,
|
|
caml_lazy_update_to_forward: caml_lazy_update_to_forward,
|
|
caml_lazy_update_to_forcing: caml_lazy_update_to_forcing,
|
|
caml_obj_update_tag: caml_obj_update_tag,
|
|
caml_obj_add_offset: caml_obj_add_offset,
|
|
caml_obj_reachable_words: caml_obj_reachable_words,
|
|
caml_obj_set_raw_field: caml_obj_set_raw_field,
|
|
caml_obj_raw_field: caml_obj_raw_field,
|
|
caml_fresh_oo_id: caml_fresh_oo_id,
|
|
caml_set_oo_id: caml_set_oo_id,
|
|
caml_oo_last_id: caml_oo_last_id,
|
|
caml_get_public_method: caml_get_public_method,
|
|
caml_get_cached_method: caml_get_cached_method,
|
|
caml_oo_cache_id: caml_oo_cache_id,
|
|
caml_method_cache: caml_method_cache,
|
|
caml_lazy_make_forward: caml_lazy_make_forward,
|
|
caml_obj_is_shared: caml_obj_is_shared,
|
|
caml_obj_compare_and_swap: caml_obj_compare_and_swap,
|
|
caml_obj_dup: caml_obj_dup,
|
|
caml_obj_with_tag: caml_obj_with_tag,
|
|
caml_obj_block: caml_obj_block,
|
|
caml_obj_tag: caml_obj_tag,
|
|
caml_alloc_dummy_infix: caml_alloc_dummy_infix,
|
|
caml_update_dummy: caml_update_dummy,
|
|
deserialize_nat: deserialize_nat,
|
|
serialize_nat: serialize_nat,
|
|
lxor_digit_nat: lxor_digit_nat,
|
|
lor_digit_nat: lor_digit_nat,
|
|
land_digit_nat: land_digit_nat,
|
|
compare_nat: compare_nat,
|
|
compare_digits_nat: compare_digits_nat,
|
|
shift_right_nat: shift_right_nat,
|
|
div_nat: div_nat,
|
|
div_digit_nat: div_digit_nat,
|
|
div_helper: div_helper,
|
|
shift_left_nat: shift_left_nat,
|
|
square_nat: square_nat,
|
|
mult_nat: mult_nat,
|
|
mult_digit_nat: mult_digit_nat,
|
|
sub_nat: sub_nat,
|
|
decr_nat: decr_nat,
|
|
complement_nat: complement_nat,
|
|
add_nat: add_nat,
|
|
incr_nat: incr_nat,
|
|
is_digit_odd: is_digit_odd,
|
|
is_digit_normalized: is_digit_normalized,
|
|
is_digit_zero: is_digit_zero,
|
|
is_digit_int: is_digit_int,
|
|
num_leading_zero_bits_in_digit: num_leading_zero_bits_in_digit,
|
|
num_digits_nat: num_digits_nat,
|
|
nth_digit_nat_native: nth_digit_nat_native,
|
|
set_digit_nat_native: set_digit_nat_native,
|
|
nth_digit_nat: nth_digit_nat,
|
|
set_digit_nat: set_digit_nat,
|
|
blit_nat: blit_nat,
|
|
set_to_zero_nat: set_to_zero_nat,
|
|
create_nat: create_nat,
|
|
nat_of_array: nat_of_array,
|
|
length_nat: length_nat,
|
|
caml_hash_nat: caml_hash_nat,
|
|
MlNat: MlNat,
|
|
initialize_nat: initialize_nat,
|
|
caml_new_string: caml_new_string,
|
|
caml_array_of_bytes: caml_array_of_bytes,
|
|
caml_array_of_string: caml_array_of_string,
|
|
caml_js_to_string: caml_js_to_string,
|
|
caml_to_js_string: caml_to_js_string,
|
|
caml_js_from_string: caml_js_from_string,
|
|
caml_js_to_byte_string: caml_js_to_byte_string,
|
|
caml_is_ml_string: caml_is_ml_string,
|
|
caml_ml_bytes_content: caml_ml_bytes_content,
|
|
caml_is_ml_bytes: caml_is_ml_bytes,
|
|
caml_bytes_of_jsbytes: caml_bytes_of_jsbytes,
|
|
caml_string_of_jsstring: caml_string_of_jsstring,
|
|
caml_jsstring_of_string: caml_jsstring_of_string,
|
|
jsoo_text_decoder_buff: jsoo_text_decoder_buff,
|
|
caml_jsbytes_of_string: caml_jsbytes_of_string,
|
|
caml_string_of_jsbytes: caml_string_of_jsbytes,
|
|
caml_bytes_of_string: caml_bytes_of_string,
|
|
caml_string_of_bytes: caml_string_of_bytes,
|
|
caml_string_lessthan: caml_string_lessthan,
|
|
caml_string_lessequal: caml_string_lessequal,
|
|
caml_string_equal: caml_string_equal,
|
|
caml_string_compare: caml_string_compare,
|
|
caml_ml_string_length: caml_ml_string_length,
|
|
caml_string_unsafe_get: caml_string_unsafe_get,
|
|
caml_string_concat: caml_string_concat,
|
|
caml_ml_bytes_length: caml_ml_bytes_length,
|
|
caml_blit_string: caml_blit_string,
|
|
caml_blit_bytes: caml_blit_bytes,
|
|
caml_fill_bytes: caml_fill_bytes,
|
|
caml_bytes_greaterthan: caml_bytes_greaterthan,
|
|
caml_string_greaterthan: caml_string_greaterthan,
|
|
caml_bytes_greaterequal: caml_bytes_greaterequal,
|
|
caml_string_greaterequal: caml_string_greaterequal,
|
|
caml_bytes_lessthan: caml_bytes_lessthan,
|
|
caml_bytes_lessequal: caml_bytes_lessequal,
|
|
caml_bytes_notequal: caml_bytes_notequal,
|
|
caml_string_notequal: caml_string_notequal,
|
|
caml_bytes_equal: caml_bytes_equal,
|
|
caml_bytes_compare: caml_bytes_compare,
|
|
caml_bytes_of_uint8_array: caml_bytes_of_uint8_array,
|
|
caml_bytes_of_array: caml_bytes_of_array,
|
|
caml_string_of_uint8_array: caml_string_of_uint8_array,
|
|
caml_string_of_array: caml_string_of_array,
|
|
caml_create_bytes: caml_create_bytes,
|
|
caml_create_string: caml_create_string,
|
|
caml_uint8_array_of_string: caml_uint8_array_of_string,
|
|
caml_uint8_array_of_bytes: caml_uint8_array_of_bytes,
|
|
caml_convert_bytes_to_array: caml_convert_bytes_to_array,
|
|
caml_convert_string_to_bytes: caml_convert_string_to_bytes,
|
|
MlBytes: MlBytes,
|
|
caml_bytes_of_utf16_jsstring: caml_bytes_of_utf16_jsstring,
|
|
jsoo_text_decoder: jsoo_text_decoder,
|
|
jsoo_text_encoder: jsoo_text_encoder,
|
|
caml_bytes_set: caml_bytes_set,
|
|
caml_bytes_set64: caml_bytes_set64,
|
|
caml_bytes_set32: caml_bytes_set32,
|
|
caml_bytes_set16: caml_bytes_set16,
|
|
caml_string_set: caml_string_set,
|
|
caml_bytes_get: caml_bytes_get,
|
|
caml_bytes_get64: caml_bytes_get64,
|
|
caml_string_get64: caml_string_get64,
|
|
caml_bytes_get32: caml_bytes_get32,
|
|
caml_string_get32: caml_string_get32,
|
|
caml_bytes_get16: caml_bytes_get16,
|
|
caml_string_get16: caml_string_get16,
|
|
caml_string_get: caml_string_get,
|
|
caml_bytes_bound_error: caml_bytes_bound_error,
|
|
caml_string_bound_error: caml_string_bound_error,
|
|
caml_bytes_unsafe_set: caml_bytes_unsafe_set,
|
|
caml_bytes_unsafe_get: caml_bytes_unsafe_get,
|
|
jsoo_is_ascii: jsoo_is_ascii,
|
|
caml_sub_uint8_array_to_jsbytes: caml_sub_uint8_array_to_jsbytes,
|
|
caml_subarray_to_jsbytes: caml_subarray_to_jsbytes,
|
|
caml_str_repeat: caml_str_repeat,
|
|
caml_md5_bytes: caml_md5_bytes,
|
|
caml_MD5Final: caml_MD5Final,
|
|
caml_MD5Update: caml_MD5Update,
|
|
caml_MD5Init: caml_MD5Init,
|
|
caml_MD5Transform: caml_MD5Transform,
|
|
caml_md5_string: caml_md5_string,
|
|
caml_md5_chan: caml_md5_chan,
|
|
caml_output_value_to_buffer: caml_output_value_to_buffer,
|
|
caml_output_value_to_bytes: caml_output_value_to_bytes,
|
|
caml_output_value_to_string: caml_output_value_to_string,
|
|
caml_output_val: caml_output_val,
|
|
MlObjectTable: MlObjectTable,
|
|
caml_marshal_data_size: caml_marshal_data_size,
|
|
caml_marshal_header_size: caml_marshal_header_size,
|
|
caml_input_value_from_reader: caml_input_value_from_reader,
|
|
caml_custom_ops: caml_custom_ops,
|
|
caml_nativeint_unmarshal: caml_nativeint_unmarshal,
|
|
caml_int32_unmarshal: caml_int32_unmarshal,
|
|
caml_int64_marshal: caml_int64_marshal,
|
|
caml_int64_unmarshal: caml_int64_unmarshal,
|
|
caml_input_value_from_bytes: caml_input_value_from_bytes,
|
|
caml_float_of_bytes: caml_float_of_bytes,
|
|
JsStringReader: JsStringReader,
|
|
UInt8ArrayReader: UInt8ArrayReader,
|
|
caml_marshal_constants: caml_marshal_constants,
|
|
caml_new_lex_engine: caml_new_lex_engine,
|
|
caml_lex_engine: caml_lex_engine,
|
|
caml_lex_array: caml_lex_array,
|
|
caml_js_error_of_exception: caml_js_error_of_exception,
|
|
caml_xmlhttprequest_create: caml_xmlhttprequest_create,
|
|
caml_js_get_console: caml_js_get_console,
|
|
caml_js_html_entities: caml_js_html_entities,
|
|
caml_js_html_escape: caml_js_html_escape,
|
|
caml_js_object: caml_js_object,
|
|
caml_pure_js_expr: caml_pure_js_expr,
|
|
caml_js_expr: caml_js_expr,
|
|
caml_js_eval_string: caml_js_eval_string,
|
|
caml_js_strict_equals: caml_js_strict_equals,
|
|
caml_js_equals: caml_js_equals,
|
|
caml_js_function_arity: caml_js_function_arity,
|
|
caml_js_wrap_meth_callback_unsafe: caml_js_wrap_meth_callback_unsafe,
|
|
caml_js_wrap_meth_callback_strict: caml_js_wrap_meth_callback_strict,
|
|
caml_js_wrap_meth_callback_arguments:
|
|
caml_js_wrap_meth_callback_arguments,
|
|
caml_js_wrap_meth_callback: caml_js_wrap_meth_callback,
|
|
caml_js_wrap_callback_unsafe: caml_js_wrap_callback_unsafe,
|
|
caml_js_wrap_callback_strict: caml_js_wrap_callback_strict,
|
|
caml_js_wrap_callback_arguments: caml_js_wrap_callback_arguments,
|
|
caml_js_wrap_callback: caml_js_wrap_callback,
|
|
caml_ojs_new_arr: caml_ojs_new_arr,
|
|
caml_js_new: caml_js_new,
|
|
caml_js_meth_call: caml_js_meth_call,
|
|
caml_js_fun_call: caml_js_fun_call,
|
|
caml_js_call: caml_js_call,
|
|
caml_js_var: caml_js_var,
|
|
caml_list_to_js_array: caml_list_to_js_array,
|
|
caml_list_of_js_array: caml_list_of_js_array,
|
|
caml_js_to_array: caml_js_to_array,
|
|
caml_js_from_array: caml_js_from_array,
|
|
caml_js_to_int32: caml_js_to_int32,
|
|
caml_js_to_float: caml_js_to_float,
|
|
caml_js_from_float: caml_js_from_float,
|
|
caml_js_to_bool: caml_js_to_bool,
|
|
caml_js_from_bool: caml_js_from_bool,
|
|
caml_throw_js_exception: caml_throw_js_exception,
|
|
caml_js_error_option_of_exception: caml_js_error_option_of_exception,
|
|
caml_exn_with_js_backtrace: caml_exn_with_js_backtrace,
|
|
caml_maybe_attach_backtrace: caml_maybe_attach_backtrace,
|
|
caml_wrap_exception: caml_wrap_exception,
|
|
caml_jsoo_flags_effects: caml_jsoo_flags_effects,
|
|
caml_jsoo_flags_use_js_string: caml_jsoo_flags_use_js_string,
|
|
caml_is_js: caml_is_js,
|
|
caml_callback: caml_callback,
|
|
caml_trampoline_return: caml_trampoline_return,
|
|
caml_trampoline: caml_trampoline,
|
|
caml_js_typeof: caml_js_typeof,
|
|
caml_js_instanceof: caml_js_instanceof,
|
|
caml_js_delete: caml_js_delete,
|
|
caml_js_get: caml_js_get,
|
|
caml_js_set: caml_js_set,
|
|
caml_js_pure_expr: caml_js_pure_expr,
|
|
caml_ml_set_buffered: caml_ml_set_buffered,
|
|
caml_ml_is_buffered: caml_ml_is_buffered,
|
|
caml_ml_output_int: caml_ml_output_int,
|
|
caml_ml_pos_out_64: caml_ml_pos_out_64,
|
|
caml_ml_pos_out: caml_ml_pos_out,
|
|
caml_pos_out: caml_pos_out,
|
|
caml_ml_seek_out_64: caml_ml_seek_out_64,
|
|
caml_ml_seek_out: caml_ml_seek_out,
|
|
caml_seek_out: caml_seek_out,
|
|
caml_output_value: caml_output_value,
|
|
caml_ml_output_char: caml_ml_output_char,
|
|
caml_ml_output: caml_ml_output,
|
|
caml_ml_output_bigarray: caml_ml_output_bigarray,
|
|
caml_ml_output_bytes: caml_ml_output_bytes,
|
|
caml_ml_output_ta: caml_ml_output_ta,
|
|
caml_ml_flush: caml_ml_flush,
|
|
caml_ml_input_scan_line: caml_ml_input_scan_line,
|
|
caml_ml_pos_in_64: caml_ml_pos_in_64,
|
|
caml_ml_pos_in: caml_ml_pos_in,
|
|
caml_pos_in: caml_pos_in,
|
|
caml_ml_seek_in_64: caml_ml_seek_in_64,
|
|
caml_ml_seek_in: caml_ml_seek_in,
|
|
caml_seek_in: caml_seek_in,
|
|
caml_ml_input_int: caml_ml_input_int,
|
|
caml_ml_input_char: caml_ml_input_char,
|
|
caml_input_value_to_outside_heap: caml_input_value_to_outside_heap,
|
|
caml_input_value: caml_input_value,
|
|
caml_ml_input_block: caml_ml_input_block,
|
|
caml_ml_input_bigarray: caml_ml_input_bigarray,
|
|
caml_ml_input: caml_ml_input,
|
|
caml_refill: caml_refill,
|
|
caml_ml_set_channel_refill: caml_ml_set_channel_refill,
|
|
caml_ml_set_channel_output: caml_ml_set_channel_output,
|
|
caml_ml_channel_size_64: caml_ml_channel_size_64,
|
|
caml_ml_channel_size: caml_ml_channel_size,
|
|
caml_ml_close_channel: caml_ml_close_channel,
|
|
caml_ml_is_binary_mode: caml_ml_is_binary_mode,
|
|
caml_ml_set_binary_mode: caml_ml_set_binary_mode,
|
|
caml_channel_descriptor: caml_channel_descriptor,
|
|
caml_ml_open_descriptor_out_with_flags:
|
|
caml_ml_open_descriptor_out_with_flags,
|
|
caml_ml_open_descriptor_in_with_flags:
|
|
caml_ml_open_descriptor_in_with_flags,
|
|
caml_ml_open_descriptor_in: caml_ml_open_descriptor_in,
|
|
caml_ml_open_descriptor_out: caml_ml_open_descriptor_out,
|
|
caml_ml_out_channels_list: caml_ml_out_channels_list,
|
|
caml_ml_channel_restore: caml_ml_channel_restore,
|
|
caml_ml_channel_redirect: caml_ml_channel_redirect,
|
|
caml_ml_channel_get: caml_ml_channel_get,
|
|
caml_ml_channels: caml_ml_channels,
|
|
caml_ml_set_channel_name: caml_ml_set_channel_name,
|
|
caml_sys_open: caml_sys_open,
|
|
MlChanid: MlChanid,
|
|
caml_sys_close: caml_sys_close,
|
|
caml_sys_fds: caml_sys_fds,
|
|
caml_int64_bswap: caml_int64_bswap,
|
|
caml_int32_bswap: caml_int32_bswap,
|
|
caml_bswap16: caml_bswap16,
|
|
caml_mod: caml_mod,
|
|
caml_div: caml_div,
|
|
caml_mul: caml_mul,
|
|
caml_int_of_string: caml_int_of_string,
|
|
caml_parse_digit: caml_parse_digit,
|
|
caml_parse_sign_and_base: caml_parse_sign_and_base,
|
|
caml_format_int: caml_format_int,
|
|
caml_int64_hash: caml_int64_hash,
|
|
caml_int64_to_bytes: caml_int64_to_bytes,
|
|
caml_int64_of_bytes: caml_int64_of_bytes,
|
|
caml_int64_hi32: caml_int64_hi32,
|
|
caml_int64_lo32: caml_int64_lo32,
|
|
caml_int64_create_lo_hi: caml_int64_create_lo_hi,
|
|
caml_int64_create_lo_mi_hi: caml_int64_create_lo_mi_hi,
|
|
caml_int64_of_string: caml_int64_of_string,
|
|
caml_int64_format: caml_int64_format,
|
|
caml_int64_of_float: caml_int64_of_float,
|
|
caml_int64_to_float: caml_int64_to_float,
|
|
caml_int64_to_int32: caml_int64_to_int32,
|
|
caml_int64_of_int32: caml_int64_of_int32,
|
|
caml_int64_mod: caml_int64_mod,
|
|
caml_int64_div: caml_int64_div,
|
|
caml_int64_shift_right: caml_int64_shift_right,
|
|
caml_int64_shift_right_unsigned: caml_int64_shift_right_unsigned,
|
|
caml_int64_shift_left: caml_int64_shift_left,
|
|
caml_int64_xor: caml_int64_xor,
|
|
caml_int64_or: caml_int64_or,
|
|
caml_int64_and: caml_int64_and,
|
|
caml_int64_is_negative: caml_int64_is_negative,
|
|
caml_int64_is_zero: caml_int64_is_zero,
|
|
caml_int64_mul: caml_int64_mul,
|
|
caml_int64_sub: caml_int64_sub,
|
|
caml_int64_add: caml_int64_add,
|
|
caml_int64_neg: caml_int64_neg,
|
|
caml_int64_compare: caml_int64_compare,
|
|
caml_int64_ult: caml_int64_ult,
|
|
MlInt64: MlInt64,
|
|
caml_int64_offset: caml_int64_offset,
|
|
caml_float_of_string: caml_float_of_string,
|
|
caml_format_float: caml_format_float,
|
|
caml_fma_float: caml_fma_float,
|
|
caml_erfc_float: caml_erfc_float,
|
|
caml_erf_float: caml_erf_float,
|
|
caml_cbrt_float: caml_cbrt_float,
|
|
caml_round_float: caml_round_float,
|
|
caml_atanh_float: caml_atanh_float,
|
|
caml_tanh_float: caml_tanh_float,
|
|
caml_asinh_float: caml_asinh_float,
|
|
caml_sinh_float: caml_sinh_float,
|
|
caml_acosh_float: caml_acosh_float,
|
|
caml_cosh_float: caml_cosh_float,
|
|
caml_log10_float: caml_log10_float,
|
|
caml_hypot_float: caml_hypot_float,
|
|
caml_log2_float: caml_log2_float,
|
|
caml_log1p_float: caml_log1p_float,
|
|
caml_exp2_float: caml_exp2_float,
|
|
caml_expm1_float: caml_expm1_float,
|
|
caml_signbit_float: caml_signbit_float,
|
|
caml_copysign_float: caml_copysign_float,
|
|
caml_float_compare: caml_float_compare,
|
|
caml_frexp_float: caml_frexp_float,
|
|
caml_ldexp_float: caml_ldexp_float,
|
|
caml_modf_float: caml_modf_float,
|
|
caml_classify_float: caml_classify_float,
|
|
caml_int32_float_of_bits: caml_int32_float_of_bits,
|
|
caml_trunc_float: caml_trunc_float,
|
|
caml_nextafter_float: caml_nextafter_float,
|
|
caml_int64_float_of_bits: caml_int64_float_of_bits,
|
|
caml_hexstring_of_float: caml_hexstring_of_float,
|
|
caml_int32_bits_of_float: caml_int32_bits_of_float,
|
|
caml_int64_bits_of_float: caml_int64_bits_of_float,
|
|
jsoo_dataview: jsoo_dataview,
|
|
caml_string_hash: caml_string_hash,
|
|
caml_hash: caml_hash,
|
|
caml_hash_mix_string: caml_hash_mix_string,
|
|
caml_hash_mix_bytes: caml_hash_mix_bytes,
|
|
caml_hash_mix_bytes_arr: caml_hash_mix_bytes_arr,
|
|
caml_hash_mix_jsbytes: caml_hash_mix_jsbytes,
|
|
caml_hash_mix_int64: caml_hash_mix_int64,
|
|
caml_hash_mix_float: caml_hash_mix_float,
|
|
caml_hash_mix_final: caml_hash_mix_final,
|
|
caml_hash_mix_int: caml_hash_mix_int,
|
|
caml_gr_close_subwindow: caml_gr_close_subwindow,
|
|
caml_gr_open_subwindow: caml_gr_open_subwindow,
|
|
caml_gr_window_id: caml_gr_window_id,
|
|
caml_gr_display_mode: caml_gr_display_mode,
|
|
caml_gr_remember_mode: caml_gr_remember_mode,
|
|
caml_gr_synchronize: caml_gr_synchronize,
|
|
caml_gr_wait_event: caml_gr_wait_event,
|
|
caml_gr_sigio_signal: caml_gr_sigio_signal,
|
|
caml_gr_sigio_handler: caml_gr_sigio_handler,
|
|
caml_gr_blit_image: caml_gr_blit_image,
|
|
caml_gr_create_image: caml_gr_create_image,
|
|
caml_gr_draw_image: caml_gr_draw_image,
|
|
caml_gr_dump_image: caml_gr_dump_image,
|
|
caml_gr_make_image: caml_gr_make_image,
|
|
caml_gr_text_size: caml_gr_text_size,
|
|
caml_gr_set_text_size: caml_gr_set_text_size,
|
|
caml_gr_set_font: caml_gr_set_font,
|
|
caml_gr_draw_string: caml_gr_draw_string,
|
|
caml_gr_draw_char: caml_gr_draw_char,
|
|
caml_gr_draw_str: caml_gr_draw_str,
|
|
caml_gr_fill_arc: caml_gr_fill_arc,
|
|
caml_gr_fill_poly: caml_gr_fill_poly,
|
|
caml_gr_fill_rect: caml_gr_fill_rect,
|
|
caml_gr_set_line_width: caml_gr_set_line_width,
|
|
caml_gr_draw_arc: caml_gr_draw_arc,
|
|
caml_gr_arc_aux: caml_gr_arc_aux,
|
|
caml_gr_draw_rect: caml_gr_draw_rect,
|
|
caml_gr_lineto: caml_gr_lineto,
|
|
caml_gr_current_y: caml_gr_current_y,
|
|
caml_gr_current_x: caml_gr_current_x,
|
|
caml_gr_moveto: caml_gr_moveto,
|
|
caml_gr_point_color: caml_gr_point_color,
|
|
caml_gr_plot: caml_gr_plot,
|
|
caml_gr_set_color: caml_gr_set_color,
|
|
caml_gr_size_y: caml_gr_size_y,
|
|
caml_gr_size_x: caml_gr_size_x,
|
|
caml_gr_clear_graph: caml_gr_clear_graph,
|
|
caml_gr_resize_window: caml_gr_resize_window,
|
|
caml_gr_set_window_title: caml_gr_set_window_title,
|
|
caml_gr_close_graph: caml_gr_close_graph,
|
|
caml_gr_doc_of_state: caml_gr_doc_of_state,
|
|
caml_gr_state_create: caml_gr_state_create,
|
|
caml_gr_state_init: caml_gr_state_init,
|
|
caml_gr_open_graph: caml_gr_open_graph,
|
|
caml_gr_state_set: caml_gr_state_set,
|
|
caml_gr_state_get: caml_gr_state_get,
|
|
caml_gr_state: caml_gr_state,
|
|
caml_get_minor_free: caml_get_minor_free,
|
|
caml_gc_minor_words: caml_gc_minor_words,
|
|
caml_gc_major_slice: caml_gc_major_slice,
|
|
caml_memprof_discard: caml_memprof_discard,
|
|
caml_memprof_stop: caml_memprof_stop,
|
|
caml_memprof_start: caml_memprof_start,
|
|
caml_final_release: caml_final_release,
|
|
caml_final_register_called_without_value:
|
|
caml_final_register_called_without_value,
|
|
caml_final_register: caml_final_register,
|
|
caml_gc_get: caml_gc_get,
|
|
caml_gc_set: caml_gc_set,
|
|
caml_gc_stat: caml_gc_stat,
|
|
caml_gc_quick_stat: caml_gc_quick_stat,
|
|
caml_gc_counters: caml_gc_counters,
|
|
caml_gc_compaction: caml_gc_compaction,
|
|
caml_gc_full_major: caml_gc_full_major,
|
|
caml_gc_major: caml_gc_major,
|
|
caml_gc_minor: caml_gc_minor,
|
|
caml_raise_nodejs_error: caml_raise_nodejs_error,
|
|
caml_sys_open_for_node: caml_sys_open_for_node,
|
|
MlNodeFd: MlNodeFd,
|
|
ocaml_stats_from_node_stats: ocaml_stats_from_node_stats,
|
|
MlNodeDevice: MlNodeDevice,
|
|
fs_node_supported: fs_node_supported,
|
|
jsoo_is_win32: jsoo_is_win32,
|
|
MlFakeFd: MlFakeFd,
|
|
MlFakeFd_out: MlFakeFd_out,
|
|
MlFakeFile: MlFakeFile,
|
|
MlFakeDevice: MlFakeDevice,
|
|
caml_read_file_content: caml_read_file_content,
|
|
jsoo_create_file: jsoo_create_file,
|
|
caml_create_file: caml_create_file,
|
|
caml_fs_init: caml_fs_init,
|
|
jsoo_create_file_extern: jsoo_create_file_extern,
|
|
caml_ba_map_file_bytecode: caml_ba_map_file_bytecode,
|
|
caml_ba_map_file: caml_ba_map_file,
|
|
caml_sys_rmdir: caml_sys_rmdir,
|
|
caml_sys_mkdir: caml_sys_mkdir,
|
|
caml_sys_rename: caml_sys_rename,
|
|
caml_sys_is_directory: caml_sys_is_directory,
|
|
caml_sys_remove: caml_sys_remove,
|
|
caml_sys_read_directory: caml_sys_read_directory,
|
|
caml_sys_file_exists: caml_sys_file_exists,
|
|
caml_raise_no_such_file: caml_raise_no_such_file,
|
|
caml_sys_chdir: caml_sys_chdir,
|
|
caml_sys_getcwd: caml_sys_getcwd,
|
|
caml_unmount: caml_unmount,
|
|
caml_mount_autoload: caml_mount_autoload,
|
|
resolve_fs_device: resolve_fs_device,
|
|
caml_list_mount_point: caml_list_mount_point,
|
|
jsoo_mount_point: jsoo_mount_point,
|
|
caml_make_path: caml_make_path,
|
|
path_is_absolute: path_is_absolute,
|
|
MlFile: MlFile,
|
|
caml_root: caml_root,
|
|
caml_get_root: caml_get_root,
|
|
caml_current_dir: caml_current_dir,
|
|
caml_trailing_slash: caml_trailing_slash,
|
|
caml_finish_formatting: caml_finish_formatting,
|
|
caml_parse_format: caml_parse_format,
|
|
caml_array_bound_error: caml_array_bound_error,
|
|
caml_raise_not_found: caml_raise_not_found,
|
|
caml_raise_zero_divide: caml_raise_zero_divide,
|
|
caml_raise_end_of_file: caml_raise_end_of_file,
|
|
caml_invalid_argument: caml_invalid_argument,
|
|
caml_failwith: caml_failwith,
|
|
caml_raise_with_string: caml_raise_with_string,
|
|
caml_raise_with_args: caml_raise_with_args,
|
|
caml_raise_with_arg: caml_raise_with_arg,
|
|
caml_raise_constant: caml_raise_constant,
|
|
caml_lessthan: caml_lessthan,
|
|
caml_lessequal: caml_lessequal,
|
|
caml_greaterthan: caml_greaterthan,
|
|
caml_greaterequal: caml_greaterequal,
|
|
caml_notequal: caml_notequal,
|
|
caml_equal: caml_equal,
|
|
caml_int_compare: caml_int_compare,
|
|
caml_compare: caml_compare,
|
|
caml_compare_val: caml_compare_val,
|
|
caml_compare_val_number_custom: caml_compare_val_number_custom,
|
|
caml_compare_val_get_custom: caml_compare_val_get_custom,
|
|
caml_compare_val_tag: caml_compare_val_tag,
|
|
caml_bigstring_blit_ba_to_bytes: caml_bigstring_blit_ba_to_bytes,
|
|
caml_bigstring_blit_bytes_to_ba: caml_bigstring_blit_bytes_to_ba,
|
|
caml_bigstring_blit_string_to_ba: caml_bigstring_blit_string_to_ba,
|
|
caml_bigstring_blit_ba_to_ba: caml_bigstring_blit_ba_to_ba,
|
|
caml_bigstring_memcmp: caml_bigstring_memcmp,
|
|
bigstring_of_typed_array: bigstring_of_typed_array,
|
|
bigstring_of_array_buffer: bigstring_of_array_buffer,
|
|
bigstring_to_typed_array: bigstring_to_typed_array,
|
|
bigstring_to_array_buffer: bigstring_to_array_buffer,
|
|
caml_hash_mix_bigstring: caml_hash_mix_bigstring,
|
|
caml_ba_from_typed_array: caml_ba_from_typed_array,
|
|
caml_ba_kind_of_typed_array: caml_ba_kind_of_typed_array,
|
|
caml_ba_to_typed_array: caml_ba_to_typed_array,
|
|
caml_hash_mix_float32: caml_hash_mix_float32,
|
|
caml_hash_mix_float16: caml_hash_mix_float16,
|
|
caml_ba_hash: caml_ba_hash,
|
|
caml_ba_create_from: caml_ba_create_from,
|
|
caml_ba_deserialize: caml_ba_deserialize,
|
|
caml_ba_serialize: caml_ba_serialize,
|
|
caml_ba_reshape: caml_ba_reshape,
|
|
caml_ba_slice: caml_ba_slice,
|
|
caml_ba_sub: caml_ba_sub,
|
|
caml_ba_blit: caml_ba_blit,
|
|
caml_ba_fill: caml_ba_fill,
|
|
caml_ba_set_3: caml_ba_set_3,
|
|
caml_ba_set_2: caml_ba_set_2,
|
|
caml_ba_set_1: caml_ba_set_1,
|
|
caml_ba_uint8_set64: caml_ba_uint8_set64,
|
|
caml_ba_uint8_set32: caml_ba_uint8_set32,
|
|
caml_ba_uint8_set16: caml_ba_uint8_set16,
|
|
caml_ba_set_generic: caml_ba_set_generic,
|
|
caml_ba_get_3: caml_ba_get_3,
|
|
caml_ba_get_2: caml_ba_get_2,
|
|
caml_ba_get_1: caml_ba_get_1,
|
|
caml_ba_uint8_get64: caml_ba_uint8_get64,
|
|
caml_ba_uint8_get32: caml_ba_uint8_get32,
|
|
caml_ba_uint8_get16: caml_ba_uint8_get16,
|
|
caml_ba_get_generic: caml_ba_get_generic,
|
|
caml_ba_dim_3: caml_ba_dim_3,
|
|
caml_ba_dim_2: caml_ba_dim_2,
|
|
caml_ba_dim_1: caml_ba_dim_1,
|
|
caml_ba_dim: caml_ba_dim,
|
|
caml_ba_num_dims: caml_ba_num_dims,
|
|
caml_ba_layout: caml_ba_layout,
|
|
caml_ba_kind: caml_ba_kind,
|
|
caml_ba_change_layout: caml_ba_change_layout,
|
|
caml_ba_create: caml_ba_create,
|
|
caml_ba_create_unsafe: caml_ba_create_unsafe,
|
|
caml_ba_compare: caml_ba_compare,
|
|
Ml_Bigarray_c_1_1: Ml_Bigarray_c_1_1,
|
|
Ml_Bigarray: Ml_Bigarray,
|
|
caml_ba_custom_name: caml_ba_custom_name,
|
|
caml_ba_create_buffer: caml_ba_create_buffer,
|
|
caml_ba_get_size_per_element: caml_ba_get_size_per_element,
|
|
caml_packFloat16: caml_packFloat16,
|
|
caml_unpackFloat16: caml_unpackFloat16,
|
|
caml_ba_get_size: caml_ba_get_size,
|
|
caml_ba_init: caml_ba_init,
|
|
caml_convert_raw_backtrace_slot: caml_convert_raw_backtrace_slot,
|
|
caml_get_current_callstack: caml_get_current_callstack,
|
|
caml_restore_raw_backtrace: caml_restore_raw_backtrace,
|
|
caml_raw_backtrace_slot: caml_raw_backtrace_slot,
|
|
caml_raw_backtrace_next_slot: caml_raw_backtrace_next_slot,
|
|
caml_raw_backtrace_length: caml_raw_backtrace_length,
|
|
caml_convert_raw_backtrace: caml_convert_raw_backtrace,
|
|
caml_record_backtrace: caml_record_backtrace,
|
|
caml_get_exception_raw_backtrace: caml_get_exception_raw_backtrace,
|
|
caml_get_exception_backtrace: caml_get_exception_backtrace,
|
|
caml_backtrace_status: caml_backtrace_status,
|
|
caml_ml_debug_info_status: caml_ml_debug_info_status,
|
|
caml_record_backtrace_runtime_flag: caml_record_backtrace_runtime_flag,
|
|
caml_record_backtrace_env_flag: caml_record_backtrace_env_flag,
|
|
caml_floatarray_create: caml_floatarray_create,
|
|
caml_make_float_vect: caml_make_float_vect,
|
|
caml_make_vect: caml_make_vect,
|
|
caml_array_make: caml_array_make,
|
|
caml_check_bound: caml_check_bound,
|
|
caml_array_fill: caml_array_fill,
|
|
caml_array_get: caml_array_get,
|
|
caml_array_set: caml_array_set,
|
|
caml_floatarray_blit: caml_floatarray_blit,
|
|
caml_array_blit: caml_array_blit,
|
|
caml_array_concat: caml_array_concat,
|
|
caml_array_append: caml_array_append,
|
|
caml_array_sub: caml_array_sub};
|
|
caml_fs_init();
|
|
var cst_Out_of_memory = "Out_of_memory";
|
|
caml_register_global(0, [248, cst_Out_of_memory, -1], cst_Out_of_memory);
|
|
var cst_Sys_error = "Sys_error";
|
|
caml_register_global(1, [248, cst_Sys_error, -2], cst_Sys_error);
|
|
var cst_Failure = "Failure";
|
|
caml_register_global(2, [248, cst_Failure, -3], cst_Failure);
|
|
var cst_Invalid_argument = "Invalid_argument";
|
|
caml_register_global
|
|
(3, [248, cst_Invalid_argument, -4], cst_Invalid_argument);
|
|
var cst_End_of_file = "End_of_file";
|
|
caml_register_global(4, [248, cst_End_of_file, -5], cst_End_of_file);
|
|
var cst_Division_by_zero = "Division_by_zero";
|
|
caml_register_global
|
|
(5, [248, cst_Division_by_zero, -6], cst_Division_by_zero);
|
|
var cst_Not_found = "Not_found";
|
|
caml_register_global(6, [248, cst_Not_found, -7], cst_Not_found);
|
|
var cst_Match_failure = "Match_failure";
|
|
caml_register_global(7, [248, cst_Match_failure, -8], cst_Match_failure);
|
|
var cst_Stack_overflow = "Stack_overflow";
|
|
caml_register_global(8, [248, cst_Stack_overflow, -9], cst_Stack_overflow);
|
|
var cst_Sys_blocked_io = "Sys_blocked_io";
|
|
caml_register_global(9, [248, cst_Sys_blocked_io, -10], cst_Sys_blocked_io);
|
|
var cst_Assert_failure = "Assert_failure";
|
|
caml_register_global
|
|
(10, [248, cst_Assert_failure, -11], cst_Assert_failure);
|
|
var cst_Undefined_recursive_module = "Undefined_recursive_module";
|
|
caml_register_global
|
|
(11,
|
|
[248, cst_Undefined_recursive_module, -12],
|
|
cst_Undefined_recursive_module);
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
(function(a){"use strict";var
|
|
i=a.jsoo_runtime,c=i.caml_get_global_data(),di="caml_unix_stat_64",dh="unix_lseek",l="caml_unix_inchannel_of_filedescr",dg="caml_unix_stat",df="caml_unix_write_bigarray",eE="caml_nativeint_format",a5="caml_int64_of_nativeint",de="caml_unix_closedir",a4="caml_unix_getgrnam",b4="caml_unix_truncate",b3="caml_unix_getcwd",eA="caml_unix_readlink",eB="caml_floatarray_set",a2="caml_fill_bytes",a1="unix_error_message",b2="win_inchannel_of_filedescr",a0="caml_unix_time",bZ="caml_unix_write",db="unix_lstat",ey="unix_open",c$="unix_rename",ew="caml_unix_chmod",aW="unix_access",aU="caml_unix_lseek",aV="unix_fsync",c_="caml_unix_findnext",aS="caml_weak_get_copy",h="caml_array_set",c9="caml_unix_opendir",ev="caml_unix_lookup_file",aR="caml_unix_getegid",eu="caml_unix_getgid",bX="caml_js_from_nativeint",aN="caml_unix_gmtime",aO="caml_signbit_float",et="caml_unix_close",es="caml_js_from_int32",er="caml_int64_to_int",bT="caml_check_bound_gen",p="caml_format_int",c5="unix_link",bP="unix_mkdir",aK="unix_rewinddir",aL="unix_read",c2="caml_unix_unlink",aH="unix_getgid",c0="caml_unix_error_message",eo="caml_unix_findclose",aD="caml_unix_lseek_64",em="caml_array_get_float",bL="win_outchannel_of_filedescr",cX="caml_unix_fstat",bK="caml_unix_geteuid",cV="unix_lstat_64",aC="unix_inchannel_of_filedescr",bF="unix_getpwnam",bG="unix_geteuid",aB="caml_unix_getuid",cU="caml_unix_utimes",eh="caml_unix_getpwuid",ei="unix_getpwuid",o="caml_check_bound",eg="unix_ftruncate_64",az="unix_isatty",bE="caml_unix_times",cS="caml_unix_exit",ef="unix_exit",aw="caml_unix_single_write",bD="caml_ephe_blit_key",cQ="caml_nativeint_of_string",av="unix_write",cO="caml_unix_ftruncate_64",cP="unix_close",ee="caml_js_to_int32",k="caml_sys_getcwd",cN="caml_unix_readdir",bC="win_findclose",aq="%int_mul",cL="caml_int32_format",ea="caml_weak_blit",cJ="caml_unix_localtime",cK="unix_times",d$="caml_array_set_addr",cI="caml_unix_inet_addr_of_string",d_="unix_ftruncate",cH="caml_weak_check",d9="caml_unix_symlink",an="unix_outchannel_of_filedescr",ak="caml_unix_has_symlink",cG="unix_mktime",s="caml_int64_to_int32",bz="unix_fstat",d6="caml_unix_link",aj="caml_unix_fchmod",bx="unix_symlink",ai="unix_localtime",d5="unix_chdir",ah="unix_getgrgid",ag="caml_int32_compare",af="caml_unix_mkdir",d2="win_startup",d1="caml_int32_bswap",ae="caml_weak_get",d0="unix_readlink",ac="caml_unix_rmdir",e="caml_array_get",ab="caml_unix_lstat_64",aa="unix_inet_addr_of_string",bt="caml_unix_gettimeofday",r="caml_unix_outchannel_of_filedescr",bs="unix_stat",cB="caml_unix_chdir",_="unix_closedir",$="win_cleanup",br="caml_nativeint_bswap",X="caml_unix_mktime",Y="caml_ephe_get_key",Z="%int_mod",bq="unix_stat_64",cz="unix_getegid",cA="caml_unix_access",cx="caml_unix_isatty",W="caml_int32_mul",cw="caml_nativeint_compare",q="caml_int64_of_int32",U="caml_unix_fsync",dW="win_findnext",R="caml_nativeint_mul",dV="unix_single_write",Q="caml_int32_mod",n="caml_js_from_float",cu="unix_truncate_64",ct="caml_ephe_check_key",dT="unix_opendir",bp="caml_array_set_float",dS="caml_ephe_get_key_copy",O="unix_getuid",d="caml_mul",N="caml_fill_string",g="caml_div",co="caml_int64_of_int",dQ="caml_unix_read_bigarray",M="unix_getgrnam",dO="win_findfirst",dN="caml_unix_startup",bm="caml_unix_filedescr_of_fd",dM="caml_unix_ftruncate",f="caml_mod",cn="caml_check_bound_float",bk="unix_utimes",bl="caml_unix_getgrgid",dK="caml_int64_to_nativeint",bj="unix_time",dJ="unix_fstat_64",J="caml_unix_fstat_64",cl="unix_truncate",bh="unix_gmtime",bg="caml_unix_cleanup",dH="unix_getcwd",dG="unix_readdir",j="caml_sys_exit",H="caml_channel_descriptor",bc="unix_lseek_64",t="caml_int_compare",G="caml_array_get_addr",dA="unix_chmod",dB="caml_unix_lstat",dz="caml_js_to_nativeint",F="caml_int32_div",cf="caml_unix_findfirst",E="caml_unix_truncate_64",D="caml_unix_rewinddir",C="unix_has_symlink",m="caml_int_of_string",dw="caml_unix_rename",bb="win_filedescr_of_channel",B="unix_gettimeofday",dv="win_handle_fd",b="caml_unix_getpwnam",ca="caml_int32_of_string",dt="caml_nativeint_mod",w="unix_rmdir",b9="caml_unix_read",b_="unix_read_bigarray",dn="caml_floatarray_get",v="unix_unlink",a9="caml_unix_open",dl="caml_signbit",u="unix_fchmod",a7="caml_nativeint_div",dk="%int_div";c.aliases=i.caml_list_of_js_array([[0,bT,o],[0,er,s],[0,dk,g],[0,es,n],[0,dO,cf],[0,a7,g],[0,u,aj],[0,M,b],[0,an,r],[0,co,q],[0,bX,n],[0,dl,aO],[0,cH,ct],[0,N,a2],[0,v,c2],[0,d_,dM],[0,dn,e],[0,d$,h],[0,O,aB],[0,b_,dQ],[0,w,ac],[0,cK,bE],[0,ea,bD],[0,cL,p],[0,ev,df],[0,bp,h],[0,aq,d],[0,dT,c9],[0,bC,eo],[0,ca,m],[0,dt,f],[0,cu,E],[0,Q,f],[0,aS,dS],[0,R,d],[0,dV,aw],[0,cP,et],[0,aV,U],[0,av,bZ],[0,cQ,m],[0,aW,cA],[0,dv,bm],[0,dW,c_],[0,B,bt],[0,bb,H],[0,ef,j],[0,cw,t],[0,W,d],[0,cS,j],[0,C,ak],[0,c$,dw],[0,az,cx],[0,eg,cO],[0,cz,aR],[0,db,dB],[0,ey,a9],[0,F,g],[0,ei,b],[0,eh,b],[0,bq,di],[0,dz,ee],[0,Z,f],[0,br,d1],[0,bG,bK],[0,bF,b],[0,$,bg],[0,_,de],[0,b2,l],[0,dA,ew],[0,bs,dg],[0,G,e],[0,aC,l],[0,aa,cI],[0,cV,ab],[0,eB,h],[0,b3,k],[0,bL,r],[0,em,e],[0,d0,eA],[0,ae,Y],[0,a4,b],[0,bc,aD],[0,d2,dN],[0,dG,cN],[0,aH,eu],[0,c0,a1],[0,ag,t],[0,dH,k],[0,bh,aN],[0,a5,q],[0,ah,b],[0,cl,b4],[0,d5,cB],[0,ai,cJ],[0,eE,p],[0,dJ,J],[0,bx,d9],[0,bj,a0],[0,dK,s],[0,aL,b9],[0,aK,D],[0,bP,af],[0,bl,b],[0,c5,d6],[0,bk,cU],[0,cn,o],[0,bz,cX],[0,dh,aU],[0,cG,X]]);c.prim_count=952;var
|
|
a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd="Stdlib__Out_channel",eC="Match_failure",a3="Stdlib__Gc",ez="Stdlib__Unit",b1="Jsoo_runtime__Runtime_version",b0="Stdlib__Map",aZ="Sx_vm",da="Stdlib__Parsing",aY="Stdlib__Effect",ex="Sx_scope",bY=108,aX="Stdlib__String",aT="Stdlib__BytesLabels",c8="Stdlib__Condition",c7="Stdlib__Filename",aQ="Stdlib__In_channel",c6="Not_found",aP="CamlinternalLazy",bW="Division_by_zero",bV="Js_of_ocaml__Effect_js",aM=117,bU=104,eq="Js_of_ocaml__",bS="Stdlib__Either",bR=109,bQ="Js_of_ocaml__MutationObserver",bO="Js_of_ocaml__Json",c4="Stdlib__Callback",aJ="Stdlib__Lexing",bN="Undefined_recursive_module",c3="Stdlib__Printf",ep=111,aI="Stdlib__Bool",c1="Stdlib__Int",cZ="Stdlib__MoreLabels",aF=103,aG="Sx_render",cY="Sys_error",aE=100,bM="Js_of_ocaml__Dom_events",en="Stdlib__Digest",cW=101,bJ="Js_of_ocaml__PerformanceObserver",bI="Stdlib__Queue",el=110,bH="Stdlib__Set",ek="Stdlib__Stack",ej="Js_of_ocaml__File",cT="Stdlib__Complex",aA="Jsoo_runtime__",cR="Jsoo_runtime",ax="Js_of_ocaml__WebSockets",ay="Stdlib__Nativeint",au=113,cM="Sys_blocked_io",at="Stdlib__Random",ed="Js_of_ocaml__ResizeObserver",ec="Sx_runtime",eb="Js_of_ocaml",ar=106,as="Stdlib__Marshal",ap="Js_of_ocaml__Console",bB="Sx_primitives",bA="Stdlib__Ephemeron",ao="CamlinternalMod",am="Js_of_ocaml__Js",al="Js_of_ocaml__Url",d8="Stdlib__Fun",d7="Stdlib__Char",by=116,cF="Dune__exe__Sx_browser",d4="CamlinternalFormatBasics",cE="Stdlib__Weak",bw=105,cD="Stdlib__Format",d3="Stdlib__StdLabels",cC="Stdlib__Int64",bv="Js_of_ocaml__Dom_html",ad="Stdlib__ArrayLabels",bu="Stdlib__Bigarray",cy="Js_of_ocaml__IntersectionObserver",V=115,dX=122,dY="Stdlib",dZ="Stdlib__StringLabels",T="Stdlib__Atomic",S="Stdlib__ListLabels",cv="Stdlib__Seq",dU="Js_of_ocaml__CSS",cs="Js_of_ocaml__XmlHttpRequest",P="Stdlib__Uchar",cr="Stdlib__Arg",cq="Js_of_ocaml__Form",cp="Stdlib__Scanf",dR=112,dP="Js_of_ocaml__Intl",bo=107,bn="Stdlib__Printexc",L="Js_of_ocaml__Sys_js",dL="Js_of_ocaml__Import",cm="Js_of_ocaml__Geolocation",K="Js_of_ocaml__Worker",bi="Stdlib__Dynarray",dI="Assert_failure",be=121,bf=118,bd=120,ck="Stdlib__Array",I="Js_of_ocaml__EventSource",cj="Stdlib__Obj",dF="Stdlib__Hashtbl",dD="Stdlib__Domain",dE="Stdlib__Option",dC="Std_exit",ci="Sx_ref",cg="Invalid_argument",ch="Stack_overflow",ce="End_of_file",cd="Js_of_ocaml__WebGL",dy="Sx_types",dx="Failure",A="Js_of_ocaml__Jstable",du="Stdlib__Lazy",ba="Stdlib__Semaphore",cc="Out_of_memory",z="Js_of_ocaml__Lib_version",y="Js_of_ocaml__Regexp",cb="Js_of_ocaml__Dom",x="Stdlib__Bytes",a$="Stdlib__Sys",ds="CamlinternalOO",b$="Stdlib__Int32",dr="Stdlib__Oo",dp=119,dq="Stdlib__Mutex",a_="Stdlib__List",a8="Sx_parser",dm="Stdlib__Float",b8="CamlinternalFormat",dj="Js_of_ocaml__Typed_array",b7="Stdlib__Result";c.symbols=[0,[0,bN,11],[0,cY,10],[0,cM,9],[0,aZ,83],[0,dy,79],[0,ex,84],[0,ec,81],[0,aG,86],[0,ci,82],[0,bB,80],[0,a8,85],[0,cE,62],[0,ez,31],[0,P,26],[0,b6,17],[0,a$,15],[0,dZ,75],[0,aX,30],[0,d3,77],[0,ek,42],[0,bH,40],[0,cv,21],[0,ba,47],[0,cp,64],[0,b7,23],[0,at,60],[0,bI,43],[0,c3,50],[0,bn,53],[0,da,39],[0,dd,57],[0,dE,22],[0,dr,67],[0,cj,16],[0,ay,37],[0,dq,45],[0,cZ,76],[0,as,32],[0,b0,41],[0,S,73],[0,a_,27],[0,aJ,38],[0,du,20],[0,cC,36],[0,b$,35],[0,c1,28],[0,aQ,56],[0,dF,61],[0,a3,55],[0,d8,54],[0,cD,63],[0,dm,34],[0,c7,70],[0,bA,69],[0,bS,14],[0,aY,78],[0,bi,51],[0,dD,48],[0,en,58],[0,c8,46],[0,cT,71],[0,d7,25],[0,c4,65],[0,aT,74],[0,x,29],[0,eD,44],[0,aI,24],[0,bu,59],[0,T,18],[0,ad,72],[0,ck,33],[0,cr,52],[0,dY,13],[0,dC,dX],[0,ch,8],[0,cc,7],[0,c6,6],[0,eC,5],[0,b1,88],[0,aA,87],[0,cR,89],[0,cs,98],[0,K,99],[0,ax,aE],[0,cd,cW],[0,al,aF],[0,dj,94],[0,L,bw],[0,ed,ar],[0,y,a6],[0,bJ,bo],[0,bQ,bY],[0,z,bU],[0,A,bR],[0,bO,el],[0,am,92],[0,dP,dp],[0,cy,bf],[0,dL,91],[0,cm,aM],[0,cq,97],[0,ej,95],[0,I,by],[0,bV,V],[0,dc,b5],[0,bv,96],[0,bM,au],[0,cb,93],[0,ap,dR],[0,dU,ep],[0,eq,90],[0,eb,bd],[0,cg,4],[0,dx,3],[0,ce,2],[0,cF,be],[0,bW,1],[0,ds,66],[0,ao,68],[0,aP,19],[0,d4,12],[0,b8,49],[0,dI,0]];c.sections=[0,[0,123,[0,[0,[0,[0,[0,[0,[0,0,[0,dI],0,[0,0,[0,b8],49,0,1],2],[0,d4],12,0,3],[0,aP],19,[0,[0,[0,0,[0,ao],68,0,1],[0,ds],66,0,2],[0,bW],1,[0,[0,0,[0,cF],be,0,1],[0,ce],2,0,2],3],4],[0,dx],3,[0,[0,[0,0,[0,cg],4,[0,0,[0,eb],bd,0,1],2],[0,eq],90,[0,0,[0,dU],ep,[0,0,[0,ap],dR,0,1],2],3],[0,cb],93,[0,[0,[0,0,[0,bM],au,0,1],[0,bv],96,0,2],[0,dc],b5,[0,[0,0,[0,bV],V,[0,0,[0,I],by,0,1],2],[0,ej],95,[0,0,[0,cq],97,[0,0,[0,cm],aM,0,1],2],3],4],5],6],[0,dL],91,[0,[0,[0,[0,[0,0,[0,cy],bf,[0,0,[0,dP],dp,0,1],2],[0,am],92,[0,[0,0,[0,bO],el,0,1],[0,A],bR,0,2],3],[0,z],bU,[0,[0,0,[0,bQ],bY,0,1],[0,bJ],bo,0,2],4],[0,y],a6,[0,[0,0,[0,ed],ar,0,1],[0,L],bw,0,2],5],[0,dj],94,[0,[0,[0,[0,[0,0,[0,al],aF,0,1],[0,cd],cW,0,2],[0,ax],aE,0,3],[0,K],99,[0,0,[0,cs],98,0,1],4],[0,cR],89,[0,[0,0,[0,aA],87,[0,0,[0,b1],88,0,1],2],[0,eC],5,[0,[0,0,[0,c6],6,0,1],[0,cc],7,[0,0,[0,ch],8,[0,0,[0,dC],dX,0,1],2],3],4],5],6],7],[0,dY],13,[0,[0,[0,[0,0,[0,cr],52,0,1],[0,ck],33,[0,0,[0,ad],72,0,1],2],[0,T],18,[0,0,[0,bu],59,0,1],3],[0,aI],24,[0,[0,[0,0,[0,eD],44,0,1],[0,x],29,[0,[0,0,[0,aT],74,0,1],[0,c4],65,0,2],3],[0,d7],25,[0,[0,0,[0,cT],71,0,1],[0,c8],46,[0,[0,0,[0,en],58,0,1],[0,dD],48,[0,0,[0,bi],51,[0,0,[0,aY],78,0,1],2],3],4],5],6],8],[0,bS],14,[0,[0,[0,[0,[0,[0,0,[0,bA],69,[0,0,[0,c7],70,0,1],2],[0,dm],34,[0,0,[0,cD],63,0,1],3],[0,d8],54,[0,0,[0,a3],55,[0,[0,0,[0,dF],61,0,1],[0,aQ],56,0,2],3],4],[0,c1],28,[0,0,[0,b$],35,[0,0,[0,cC],36,0,1],2],5],[0,du],20,[0,[0,[0,0,[0,aJ],38,0,1],[0,a_],27,[0,[0,0,[0,S],73,0,1],[0,b0],41,0,2],3],[0,as],32,[0,[0,[0,0,[0,cZ],76,0,1],[0,dq],45,0,2],[0,ay],37,0,3],4],6],[0,cj],16,[0,[0,[0,[0,[0,[0,0,[0,dr],67,0,1],[0,dE],22,[0,0,[0,dd],57,0,1],2],[0,da],39,[0,[0,0,[0,bn],53,0,1],[0,c3],50,0,2],3],[0,bI],43,[0,[0,0,[0,at],60,0,1],[0,b7],23,[0,[0,0,[0,cp],64,0,1],[0,ba],47,0,2],3],4],[0,cv],21,[0,[0,0,[0,bH],40,[0,0,[0,ek],42,[0,0,[0,d3],77,0,1],2],3],[0,aX],30,[0,0,[0,dZ],75,0,1],4],5],[0,a$],15,[0,[0,[0,[0,0,[0,b6],17,0,1],[0,P],26,[0,0,[0,ez],31,0,1],2],[0,cE],62,[0,[0,0,[0,a8],85,0,1],[0,bB],80,[0,0,[0,ci],82,[0,0,[0,aG],86,0,1],2],3],4],[0,ec],81,[0,[0,[0,0,[0,ex],84,0,1],[0,dy],79,[0,0,[0,aZ],83,0,1],2],[0,cM],9,[0,0,[0,cY],10,[0,0,[0,bN],11,0,1],2],3],5],6],7],9]],0,i.caml_list_of_js_array(["%caml_format_int_special","%direct_int_div","%direct_int_mod","%direct_int_mul","%direct_obj_tag","%int_add","%int_and","%int_asr",dk,"%int_lsl","%int_lsr",Z,aq,"%int_neg","%int_or","%int_sub","%int_xor","JsStringReader","MlBytes","MlChanid","MlFakeDevice","MlFakeFd","MlFakeFd_out","MlFakeFile","MlFile","MlInt64","MlMutex","MlNat","MlNodeDevice","MlNodeFd","MlObjectTable","Ml_Bigarray","Ml_Bigarray_c_1_1","UInt8ArrayReader","add_nat","bigstring_of_array_buffer","bigstring_of_typed_array","bigstring_to_array_buffer","bigstring_to_typed_array","blake2b","blit_nat","caml_MD5Final","caml_MD5Init","caml_MD5Transform","caml_MD5Update","caml_abs_float","caml_acos_float","caml_acosh_float","caml_add_float","caml_alloc_dummy","caml_alloc_dummy_float","caml_alloc_dummy_infix","caml_alloc_stack","caml_argv","caml_array_append","caml_array_blit","caml_array_bound_error","caml_array_concat","caml_array_fill",e,G,em,"caml_array_make","caml_array_of_bytes","caml_array_of_string",h,d$,bp,"caml_array_sub","caml_array_unsafe_get","caml_array_unsafe_get_float","caml_array_unsafe_set","caml_array_unsafe_set_addr","caml_array_unsafe_set_float","caml_asin_float","caml_asinh_float","caml_atan2_float","caml_atan_float","caml_atanh_float","caml_atomic_cas","caml_atomic_exchange","caml_atomic_fetch_add","caml_atomic_load","caml_atomic_make_contended","caml_ba_blit","caml_ba_change_layout","caml_ba_compare","caml_ba_create","caml_ba_create_buffer","caml_ba_create_from","caml_ba_create_unsafe","caml_ba_custom_name","caml_ba_deserialize","caml_ba_dim","caml_ba_dim_1","caml_ba_dim_2","caml_ba_dim_3","caml_ba_fill","caml_ba_from_typed_array","caml_ba_get_1","caml_ba_get_2","caml_ba_get_3","caml_ba_get_generic","caml_ba_get_size","caml_ba_get_size_per_element","caml_ba_hash","caml_ba_init","caml_ba_kind","caml_ba_kind_of_typed_array","caml_ba_layout","caml_ba_map_file","caml_ba_map_file_bytecode","caml_ba_num_dims","caml_ba_reshape","caml_ba_serialize","caml_ba_set_1","caml_ba_set_2","caml_ba_set_3","caml_ba_set_generic","caml_ba_slice","caml_ba_sub","caml_ba_to_typed_array","caml_ba_uint8_get16","caml_ba_uint8_get32","caml_ba_uint8_get64","caml_ba_uint8_set16","caml_ba_uint8_set32","caml_ba_uint8_set64","caml_backtrace_status","caml_bigstring_blit_ba_to_ba","caml_bigstring_blit_ba_to_bytes","caml_bigstring_blit_bytes_to_ba","caml_bigstring_blit_string_to_ba","caml_bigstring_memcmp","caml_blake2_create","caml_blake2_final","caml_blake2_string","caml_blake2_update","caml_blit_bytes","caml_blit_string","caml_bswap16","caml_build_symbols","caml_bytes_bound_error","caml_bytes_compare","caml_bytes_equal","caml_bytes_get","caml_bytes_get16","caml_bytes_get32","caml_bytes_get64","caml_bytes_greaterequal","caml_bytes_greaterthan","caml_bytes_lessequal","caml_bytes_lessthan","caml_bytes_notequal","caml_bytes_of_array","caml_bytes_of_jsbytes","caml_bytes_of_string","caml_bytes_of_uint8_array","caml_bytes_of_utf16_jsstring","caml_bytes_set","caml_bytes_set16","caml_bytes_set32","caml_bytes_set64","caml_bytes_unsafe_get","caml_bytes_unsafe_set","caml_call_gen","caml_callback","caml_cbrt_float","caml_ceil_float",H,o,cn,bT,"caml_classify_float","caml_compare","caml_compare_val","caml_compare_val_get_custom","caml_compare_val_number_custom","caml_compare_val_tag","caml_continuation_use_and_update_handler_noexc","caml_continuation_use_noexc","caml_convert_bytes_to_array","caml_convert_raw_backtrace","caml_convert_raw_backtrace_slot","caml_convert_string_to_bytes","caml_copysign_float","caml_cos_float","caml_cosh_float","caml_create_bytes","caml_create_file","caml_create_string","caml_current_dir","caml_custom_event_index","caml_custom_identifier","caml_custom_ops","caml_decompress_input",g,"caml_div_float","caml_domain_dls","caml_domain_dls_compare_and_set","caml_domain_dls_get","caml_domain_dls_set","caml_domain_id","caml_domain_spawn","caml_ephe_blit_data",bD,"caml_ephe_check_data",ct,"caml_ephe_create","caml_ephe_data_offset","caml_ephe_get_data","caml_ephe_get_data_copy",Y,dS,"caml_ephe_key_offset","caml_ephe_none","caml_ephe_set_data","caml_ephe_set_data_opt","caml_ephe_set_key","caml_ephe_unset_data","caml_ephe_unset_key","caml_eq_float","caml_equal","caml_erf_float","caml_erfc_float","caml_executable_name","caml_exn_with_js_backtrace","caml_exp2_float","caml_exp_float","caml_expm1_float","caml_failwith","caml_fatal_uncaught_exception",a2,N,"caml_final_register","caml_final_register_called_without_value","caml_final_release","caml_finish_formatting","caml_float_compare","caml_float_of_bytes","caml_float_of_int","caml_float_of_string","caml_floatarray_blit","caml_floatarray_create",dn,eB,"caml_floatarray_unsafe_get","caml_floatarray_unsafe_set","caml_floor_float","caml_fma_float","caml_fmod_float","caml_format_exception","caml_format_float",p,"caml_fresh_oo_id","caml_frexp_float","caml_fs_init","caml_gc_compaction","caml_gc_counters","caml_gc_full_major","caml_gc_get","caml_gc_major","caml_gc_major_slice","caml_gc_minor","caml_gc_minor_words","caml_gc_quick_stat","caml_gc_set","caml_gc_stat","caml_ge_float","caml_get_cached_method","caml_get_continuation_callstack","caml_get_current_callstack","caml_get_exception_backtrace","caml_get_exception_raw_backtrace","caml_get_global_data","caml_get_minor_free","caml_get_public_method","caml_get_root","caml_global_data","caml_gr_arc_aux","caml_gr_blit_image","caml_gr_clear_graph","caml_gr_close_graph","caml_gr_close_subwindow","caml_gr_create_image","caml_gr_current_x","caml_gr_current_y","caml_gr_display_mode","caml_gr_doc_of_state","caml_gr_draw_arc","caml_gr_draw_char","caml_gr_draw_image","caml_gr_draw_rect","caml_gr_draw_str","caml_gr_draw_string","caml_gr_dump_image","caml_gr_fill_arc","caml_gr_fill_poly","caml_gr_fill_rect","caml_gr_lineto","caml_gr_make_image","caml_gr_moveto","caml_gr_open_graph","caml_gr_open_subwindow","caml_gr_plot","caml_gr_point_color","caml_gr_remember_mode","caml_gr_resize_window","caml_gr_set_color","caml_gr_set_font","caml_gr_set_line_width","caml_gr_set_text_size","caml_gr_set_window_title","caml_gr_sigio_handler","caml_gr_sigio_signal","caml_gr_size_x","caml_gr_size_y","caml_gr_state","caml_gr_state_create","caml_gr_state_get","caml_gr_state_init","caml_gr_state_set","caml_gr_synchronize","caml_gr_text_size","caml_gr_wait_event","caml_gr_window_id","caml_greaterequal","caml_greaterthan","caml_gt_float","caml_hash","caml_hash_mix_bigstring","caml_hash_mix_bytes","caml_hash_mix_bytes_arr","caml_hash_mix_final","caml_hash_mix_float","caml_hash_mix_float16","caml_hash_mix_float32","caml_hash_mix_int","caml_hash_mix_int64","caml_hash_mix_jsbytes","caml_hash_mix_string","caml_hash_nat","caml_hexstring_of_float","caml_hypot_float","caml_input_value","caml_input_value_from_bytes","caml_input_value_from_reader","caml_input_value_to_outside_heap","caml_install_signal_handler","caml_int32_add","caml_int32_and","caml_int32_bits_of_float",d1,ag,F,"caml_int32_float_of_bits",cL,Q,W,"caml_int32_neg","caml_int32_of_float","caml_int32_of_int",ca,"caml_int32_or","caml_int32_shift_left","caml_int32_shift_right","caml_int32_shift_right_unsigned","caml_int32_sub","caml_int32_to_float","caml_int32_to_int","caml_int32_unmarshal","caml_int32_xor","caml_int64_add","caml_int64_and","caml_int64_bits_of_float","caml_int64_bswap","caml_int64_compare","caml_int64_create_lo_hi","caml_int64_create_lo_mi_hi","caml_int64_div","caml_int64_float_of_bits","caml_int64_format","caml_int64_hash","caml_int64_hi32","caml_int64_is_negative","caml_int64_is_zero","caml_int64_lo32","caml_int64_marshal","caml_int64_mod","caml_int64_mul","caml_int64_neg","caml_int64_of_bytes","caml_int64_of_float",co,q,a5,"caml_int64_of_string","caml_int64_offset","caml_int64_or","caml_int64_shift_left","caml_int64_shift_right","caml_int64_shift_right_unsigned","caml_int64_sub","caml_int64_to_bytes","caml_int64_to_float",er,s,dK,"caml_int64_ult","caml_int64_unmarshal","caml_int64_xor",t,"caml_int_of_float",m,"caml_invalid_argument","caml_io_buffer_size","caml_is_continuation_tag","caml_is_js","caml_is_ml_bytes","caml_is_ml_string","caml_is_printable","caml_is_special_exception","caml_js_call","caml_js_delete","caml_js_equals","caml_js_error_of_exception","caml_js_error_option_of_exception","caml_js_eval_string","caml_js_expr","caml_js_from_array","caml_js_from_bool",n,es,bX,"caml_js_from_string","caml_js_fun_call","caml_js_function_arity","caml_js_get","caml_js_get_console","caml_js_html_entities","caml_js_html_escape","caml_js_instanceof","caml_js_meth_call","caml_js_new","caml_js_object","caml_js_pure_expr","caml_js_set","caml_js_strict_equals","caml_js_to_array","caml_js_to_bool","caml_js_to_byte_string","caml_js_to_float",ee,dz,"caml_js_to_string","caml_js_typeof","caml_js_var","caml_js_wrap_callback","caml_js_wrap_callback_arguments","caml_js_wrap_callback_strict","caml_js_wrap_callback_unsafe","caml_js_wrap_meth_callback","caml_js_wrap_meth_callback_arguments","caml_js_wrap_meth_callback_strict","caml_js_wrap_meth_callback_unsafe","caml_jsbytes_of_string","caml_jsoo_flags_effects","caml_jsoo_flags_use_js_string","caml_jsstring_of_string","caml_lazy_make_forward","caml_lazy_read_result","caml_lazy_reset_to_lazy","caml_lazy_update_to_forcing","caml_lazy_update_to_forward","caml_ldexp_float","caml_le_float","caml_lessequal","caml_lessthan","caml_lex_array","caml_lex_engine","caml_list_mount_point","caml_list_of_js_array","caml_list_to_js_array","caml_log10_float","caml_log1p_float","caml_log2_float","caml_log_float","caml_lt_float","caml_lxm_M","caml_lxm_daba","caml_lxm_next","caml_make_float_vect","caml_make_path","caml_make_vect","caml_marshal_constants","caml_marshal_data_size","caml_marshal_header_size","caml_maybe_attach_backtrace","caml_maybe_print_stats","caml_md5_bytes","caml_md5_chan","caml_md5_string","caml_memprof_discard","caml_memprof_start","caml_memprof_stop","caml_method_cache","caml_ml_bytes_content","caml_ml_bytes_length","caml_ml_channel_get","caml_ml_channel_redirect","caml_ml_channel_restore","caml_ml_channel_size","caml_ml_channel_size_64","caml_ml_channels","caml_ml_close_channel","caml_ml_condition_broadcast","caml_ml_condition_new","caml_ml_condition_signal","caml_ml_condition_wait","caml_ml_debug_info_status","caml_ml_domain_cpu_relax","caml_ml_domain_id","caml_ml_enable_runtime_warnings","caml_ml_flush","caml_ml_input","caml_ml_input_bigarray","caml_ml_input_block","caml_ml_input_char","caml_ml_input_int","caml_ml_input_scan_line","caml_ml_is_binary_mode","caml_ml_is_buffered","caml_ml_mutex_lock","caml_ml_mutex_new","caml_ml_mutex_try_lock","caml_ml_mutex_unlock","caml_ml_open_descriptor_in","caml_ml_open_descriptor_in_with_flags","caml_ml_open_descriptor_out","caml_ml_open_descriptor_out_with_flags","caml_ml_out_channels_list","caml_ml_output","caml_ml_output_bigarray","caml_ml_output_bytes","caml_ml_output_char","caml_ml_output_int","caml_ml_output_ta","caml_ml_pos_in","caml_ml_pos_in_64","caml_ml_pos_out","caml_ml_pos_out_64","caml_ml_runtime_events_are_active","caml_ml_runtime_events_pause","caml_ml_runtime_events_resume","caml_ml_runtime_events_start","caml_ml_runtime_warnings_enabled","caml_ml_seek_in","caml_ml_seek_in_64","caml_ml_seek_out","caml_ml_seek_out_64","caml_ml_set_binary_mode","caml_ml_set_buffered","caml_ml_set_channel_name","caml_ml_set_channel_output","caml_ml_set_channel_refill","caml_ml_string_length",f,"caml_modf_float","caml_mount_autoload",d,"caml_mul_float","caml_named_value","caml_named_values","caml_nativeint_add","caml_nativeint_and",br,cw,a7,eE,dt,R,"caml_nativeint_neg","caml_nativeint_of_float","caml_nativeint_of_int","caml_nativeint_of_int32",cQ,"caml_nativeint_or","caml_nativeint_shift_left","caml_nativeint_shift_right","caml_nativeint_shift_right_unsigned","caml_nativeint_sub","caml_nativeint_to_float","caml_nativeint_to_int","caml_nativeint_to_int32","caml_nativeint_unmarshal","caml_nativeint_xor","caml_neg_float","caml_neq_float","caml_new_lex_engine","caml_new_string","caml_nextafter_float","caml_notequal","caml_obj_add_offset","caml_obj_block","caml_obj_compare_and_swap","caml_obj_dup","caml_obj_is_shared","caml_obj_raw_field","caml_obj_reachable_words","caml_obj_set_raw_field","caml_obj_tag","caml_obj_update_tag","caml_obj_with_tag","caml_ojs_new_arr","caml_oo_cache_id","caml_oo_last_id","caml_output_val","caml_output_value","caml_output_value_to_buffer","caml_output_value_to_bytes","caml_output_value_to_string","caml_packFloat16","caml_parse_digit","caml_parse_engine","caml_parse_format","caml_parse_sign_and_base","caml_parser_trace","caml_pos_in","caml_pos_out","caml_power_float","caml_pure_js_expr","caml_raise_constant","caml_raise_end_of_file","caml_raise_no_such_file","caml_raise_nodejs_error","caml_raise_not_found","caml_raise_sys_error","caml_raise_system_error","caml_raise_with_arg","caml_raise_with_args","caml_raise_with_string","caml_raise_zero_divide","caml_raw_backtrace_length","caml_raw_backtrace_next_slot","caml_raw_backtrace_slot","caml_read_file_content","caml_recommended_domain_count","caml_record_backtrace","caml_record_backtrace_env_flag","caml_record_backtrace_runtime_flag","caml_refill","caml_register_global","caml_register_named_value","caml_restore_raw_backtrace","caml_root","caml_round_float","caml_runtime_events_create_cursor","caml_runtime_events_free_cursor","caml_runtime_events_read_poll","caml_runtime_events_user_register","caml_runtime_events_user_resolve","caml_runtime_events_user_write","caml_runtime_parameters","caml_runtime_variant","caml_runtime_warnings","caml_seek_in","caml_seek_out","caml_set_oo_id","caml_set_parser_trace","caml_set_static_env",dl,aO,"caml_sin_float","caml_sinh_float","caml_sqrt_float","caml_str_repeat","caml_strerror","caml_string_bound_error","caml_string_compare","caml_string_concat","caml_string_equal","caml_string_get","caml_string_get16","caml_string_get32","caml_string_get64","caml_string_greaterequal","caml_string_greaterthan","caml_string_hash","caml_string_lessequal","caml_string_lessthan","caml_string_notequal","caml_string_of_array","caml_string_of_bytes","caml_string_of_jsbytes","caml_string_of_jsstring","caml_string_of_uint8_array","caml_string_set","caml_string_unsafe_get","caml_sub_float","caml_sub_uint8_array_to_jsbytes","caml_subarray_to_jsbytes","caml_sys_argv","caml_sys_chdir","caml_sys_close","caml_sys_const_backend_type","caml_sys_const_big_endian","caml_sys_const_int_size","caml_sys_const_max_wosize","caml_sys_const_naked_pointers_checked","caml_sys_const_ostype_cygwin","caml_sys_const_ostype_unix","caml_sys_const_ostype_win32","caml_sys_const_word_size","caml_sys_executable_name",j,"caml_sys_fds","caml_sys_file_exists","caml_sys_get_argv","caml_sys_get_config",k,"caml_sys_getenv","caml_sys_is_directory","caml_sys_is_regular_file","caml_sys_isatty","caml_sys_mkdir","caml_sys_modify_argv","caml_sys_open","caml_sys_open_for_node","caml_sys_random_seed","caml_sys_read_directory","caml_sys_remove","caml_sys_rename","caml_sys_rmdir","caml_sys_system_command","caml_sys_time","caml_sys_time_include_children","caml_sys_unsafe_getenv","caml_tan_float","caml_tanh_float","caml_throw_js_exception","caml_to_js_string","caml_trailing_slash","caml_trampoline","caml_trampoline_return","caml_trunc_float","caml_uint8_array_of_bytes","caml_uint8_array_of_string",cA,cB,ew,bg,et,de,c0,cS,aj,bm,eo,cf,c_,cX,J,U,dM,cO,b3,aR,bK,eu,bl,a4,b,eh,bt,aB,aN,ak,l,cI,cx,d6,cJ,ev,aU,aD,dB,ab,af,X,a9,c9,r,b9,dQ,cN,eA,dw,D,ac,aw,dN,dg,di,d9,a0,bE,b4,E,c2,cU,bZ,df,"caml_unmount","caml_unpackFloat16","caml_update_dummy",ea,cH,"caml_weak_create",ae,aS,"caml_weak_set","caml_wrap_exception","caml_xdg_defaults","caml_xmlhttprequest_create","caml_zstd_initialize","compare_digits_nat","compare_nat","complement_nat","create_nat","decr_nat","deserialize_nat","div_digit_nat","div_helper","div_nat","fs_node_supported","incr_nat","initialize_nat","is_digit_int","is_digit_normalized","is_digit_odd","is_digit_zero","jsoo_create_file","jsoo_create_file_extern","jsoo_dataview","jsoo_effect_not_supported","jsoo_is_ascii","jsoo_is_win32","jsoo_mount_point","jsoo_static_env","jsoo_sys_getenv","jsoo_text_decoder","jsoo_text_decoder_buff","jsoo_text_encoder","jsoo_toplevel_reloc","land_digit_nat","length_nat","lor_digit_nat","lxor_digit_nat","make_unix_err_args","mult_digit_nat","mult_nat","nat_of_array","nth_digit_nat","nth_digit_nat_native","num_digits_nat","num_leading_zero_bits_in_digit","ocaml_stats_from_node_stats","os_type","path_is_absolute","re_match","re_partial_match","re_replacement_text","re_search_backward","re_search_forward","re_string_match","resolve_fs_device","serialize_nat","set_digit_nat","set_digit_nat_native","set_to_zero_nat","shift_left_nat","shift_right_nat","square_nat","sub_nat",aW,d5,dA,cP,_,"unix_error",a1,ef,u,bz,dJ,aV,d_,eg,dH,cz,bG,aH,ah,M,bF,ei,B,O,bh,C,aC,aa,az,c5,ai,dh,bc,db,cV,bP,cG,ey,dT,an,aL,b_,dG,d0,c$,aK,w,dV,bs,bq,bx,bj,cK,cl,cu,v,bk,av,$,bb,bC,dO,dW,dv,b2,bL,d2,"zstd_decompress"]),0];return}(globalThis));
|
|
|
|
//# 4 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: CamlinternalFormatBasics:[F(2),F(1),F(2)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var runtime = globalThis.jsoo_runtime;
|
|
function erase_rel(param){
|
|
if(typeof param === "number") return 0;
|
|
switch(param[0]){
|
|
case 0:
|
|
var rest = param[1]; return [0, erase_rel(rest)];
|
|
case 1:
|
|
var rest$0 = param[1]; return [1, erase_rel(rest$0)];
|
|
case 2:
|
|
var rest$1 = param[1]; return [2, erase_rel(rest$1)];
|
|
case 3:
|
|
var rest$2 = param[1]; return [3, erase_rel(rest$2)];
|
|
case 4:
|
|
var rest$3 = param[1]; return [4, erase_rel(rest$3)];
|
|
case 5:
|
|
var rest$4 = param[1]; return [5, erase_rel(rest$4)];
|
|
case 6:
|
|
var rest$5 = param[1]; return [6, erase_rel(rest$5)];
|
|
case 7:
|
|
var rest$6 = param[1]; return [7, erase_rel(rest$6)];
|
|
case 8:
|
|
var rest$7 = param[2], ty = param[1];
|
|
return [8, ty, erase_rel(rest$7)];
|
|
case 9:
|
|
var rest$8 = param[3], ty1 = param[1];
|
|
return [9, ty1, ty1, erase_rel(rest$8)];
|
|
case 10:
|
|
var rest$9 = param[1]; return [10, erase_rel(rest$9)];
|
|
case 11:
|
|
var rest$10 = param[1]; return [11, erase_rel(rest$10)];
|
|
case 12:
|
|
var rest$11 = param[1]; return [12, erase_rel(rest$11)];
|
|
case 13:
|
|
var rest$12 = param[1]; return [13, erase_rel(rest$12)];
|
|
default: var rest$13 = param[1]; return [14, erase_rel(rest$13)];
|
|
}
|
|
}
|
|
function concat_fmtty(fmtty1, fmtty2){
|
|
if(typeof fmtty1 === "number") return fmtty2;
|
|
switch(fmtty1[0]){
|
|
case 0:
|
|
var rest = fmtty1[1]; return [0, concat_fmtty(rest, fmtty2)];
|
|
case 1:
|
|
var rest$0 = fmtty1[1]; return [1, concat_fmtty(rest$0, fmtty2)];
|
|
case 2:
|
|
var rest$1 = fmtty1[1]; return [2, concat_fmtty(rest$1, fmtty2)];
|
|
case 3:
|
|
var rest$2 = fmtty1[1]; return [3, concat_fmtty(rest$2, fmtty2)];
|
|
case 4:
|
|
var rest$3 = fmtty1[1]; return [4, concat_fmtty(rest$3, fmtty2)];
|
|
case 5:
|
|
var rest$4 = fmtty1[1]; return [5, concat_fmtty(rest$4, fmtty2)];
|
|
case 6:
|
|
var rest$5 = fmtty1[1]; return [6, concat_fmtty(rest$5, fmtty2)];
|
|
case 7:
|
|
var rest$6 = fmtty1[1]; return [7, concat_fmtty(rest$6, fmtty2)];
|
|
case 8:
|
|
var rest$7 = fmtty1[2], ty = fmtty1[1];
|
|
return [8, ty, concat_fmtty(rest$7, fmtty2)];
|
|
case 9:
|
|
var rest$8 = fmtty1[3], ty2 = fmtty1[2], ty1 = fmtty1[1];
|
|
return [9, ty1, ty2, concat_fmtty(rest$8, fmtty2)];
|
|
case 10:
|
|
var rest$9 = fmtty1[1]; return [10, concat_fmtty(rest$9, fmtty2)];
|
|
case 11:
|
|
var rest$10 = fmtty1[1]; return [11, concat_fmtty(rest$10, fmtty2)];
|
|
case 12:
|
|
var rest$11 = fmtty1[1]; return [12, concat_fmtty(rest$11, fmtty2)];
|
|
case 13:
|
|
var rest$12 = fmtty1[1]; return [13, concat_fmtty(rest$12, fmtty2)];
|
|
default:
|
|
var rest$13 = fmtty1[1]; return [14, concat_fmtty(rest$13, fmtty2)];
|
|
}
|
|
}
|
|
function concat_fmt(fmt1, fmt2){
|
|
if(typeof fmt1 === "number") return fmt2;
|
|
switch(fmt1[0]){
|
|
case 0:
|
|
var rest = fmt1[1]; return [0, concat_fmt(rest, fmt2)];
|
|
case 1:
|
|
var rest$0 = fmt1[1]; return [1, concat_fmt(rest$0, fmt2)];
|
|
case 2:
|
|
var rest$1 = fmt1[2], pad = fmt1[1];
|
|
return [2, pad, concat_fmt(rest$1, fmt2)];
|
|
case 3:
|
|
var rest$2 = fmt1[2], pad$0 = fmt1[1];
|
|
return [3, pad$0, concat_fmt(rest$2, fmt2)];
|
|
case 4:
|
|
var rest$3 = fmt1[4], prec = fmt1[3], pad$1 = fmt1[2], iconv = fmt1[1];
|
|
return [4, iconv, pad$1, prec, concat_fmt(rest$3, fmt2)];
|
|
case 5:
|
|
var
|
|
rest$4 = fmt1[4],
|
|
prec$0 = fmt1[3],
|
|
pad$2 = fmt1[2],
|
|
iconv$0 = fmt1[1];
|
|
return [5, iconv$0, pad$2, prec$0, concat_fmt(rest$4, fmt2)];
|
|
case 6:
|
|
var
|
|
rest$5 = fmt1[4],
|
|
prec$1 = fmt1[3],
|
|
pad$3 = fmt1[2],
|
|
iconv$1 = fmt1[1];
|
|
return [6, iconv$1, pad$3, prec$1, concat_fmt(rest$5, fmt2)];
|
|
case 7:
|
|
var
|
|
rest$6 = fmt1[4],
|
|
prec$2 = fmt1[3],
|
|
pad$4 = fmt1[2],
|
|
iconv$2 = fmt1[1];
|
|
return [7, iconv$2, pad$4, prec$2, concat_fmt(rest$6, fmt2)];
|
|
case 8:
|
|
var
|
|
rest$7 = fmt1[4],
|
|
prec$3 = fmt1[3],
|
|
pad$5 = fmt1[2],
|
|
fconv = fmt1[1];
|
|
return [8, fconv, pad$5, prec$3, concat_fmt(rest$7, fmt2)];
|
|
case 9:
|
|
var rest$8 = fmt1[2], pad$6 = fmt1[1];
|
|
return [9, pad$6, concat_fmt(rest$8, fmt2)];
|
|
case 10:
|
|
var rest$9 = fmt1[1]; return [10, concat_fmt(rest$9, fmt2)];
|
|
case 11:
|
|
var rest$10 = fmt1[2], str = fmt1[1];
|
|
return [11, str, concat_fmt(rest$10, fmt2)];
|
|
case 12:
|
|
var rest$11 = fmt1[2], chr = fmt1[1];
|
|
return [12, chr, concat_fmt(rest$11, fmt2)];
|
|
case 13:
|
|
var rest$12 = fmt1[3], fmtty = fmt1[2], pad$7 = fmt1[1];
|
|
return [13, pad$7, fmtty, concat_fmt(rest$12, fmt2)];
|
|
case 14:
|
|
var rest$13 = fmt1[3], fmtty$0 = fmt1[2], pad$8 = fmt1[1];
|
|
return [14, pad$8, fmtty$0, concat_fmt(rest$13, fmt2)];
|
|
case 15:
|
|
var rest$14 = fmt1[1]; return [15, concat_fmt(rest$14, fmt2)];
|
|
case 16:
|
|
var rest$15 = fmt1[1]; return [16, concat_fmt(rest$15, fmt2)];
|
|
case 17:
|
|
var rest$16 = fmt1[2], fmting_lit = fmt1[1];
|
|
return [17, fmting_lit, concat_fmt(rest$16, fmt2)];
|
|
case 18:
|
|
var rest$17 = fmt1[2], fmting_gen = fmt1[1];
|
|
return [18, fmting_gen, concat_fmt(rest$17, fmt2)];
|
|
case 19:
|
|
var rest$18 = fmt1[1]; return [19, concat_fmt(rest$18, fmt2)];
|
|
case 20:
|
|
var rest$19 = fmt1[3], char_set = fmt1[2], width_opt = fmt1[1];
|
|
return [20, width_opt, char_set, concat_fmt(rest$19, fmt2)];
|
|
case 21:
|
|
var rest$20 = fmt1[2], counter = fmt1[1];
|
|
return [21, counter, concat_fmt(rest$20, fmt2)];
|
|
case 22:
|
|
var rest$21 = fmt1[1]; return [22, concat_fmt(rest$21, fmt2)];
|
|
case 23:
|
|
var rest$22 = fmt1[2], ign = fmt1[1];
|
|
return [23, ign, concat_fmt(rest$22, fmt2)];
|
|
default:
|
|
var rest$23 = fmt1[3], f = fmt1[2], arity = fmt1[1];
|
|
return [24, arity, f, concat_fmt(rest$23, fmt2)];
|
|
}
|
|
}
|
|
runtime.caml_register_global
|
|
(0, [0, concat_fmtty, erase_rel, concat_fmt], "CamlinternalFormatBasics");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 179 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib:[F(1),F(1),N,N,N,N,N,N,N,N,N,N,N,N,N,F(2),F(2),F(1)*,N,N,F(1)*,N,N,N,N,N,N,F(2)*,F(1),F(1)*,F(1)*,F(1),F(1)*,F(1),F(1),F(1),F(2),N,N,N,F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(3),F(1),F(1),F(2),F(2),F(2),F(4),F(4),F(2),F(2),F(2),F(2),F(1),F(1),F(1),F(1),F(2),F(1),F(1),F(3),F(1),F(1),F(4),F(4),F(2),F(1),F(1),F(1),F(2),F(1),F(1),F(1),F(1),F(2),N,F(1)*,F(2),F(1),F(1),F(1),F(4),F(1),N]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_atomic_cas = runtime.caml_atomic_cas,
|
|
caml_atomic_load = runtime.caml_atomic_load,
|
|
caml_create_bytes = runtime.caml_create_bytes,
|
|
caml_float_of_string = runtime.caml_float_of_string,
|
|
caml_int_of_string = runtime.caml_int_of_string,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_ml_bytes_length = runtime.caml_ml_bytes_length,
|
|
caml_ml_channel_size = runtime.caml_ml_channel_size,
|
|
caml_ml_channel_size_64 = runtime.caml_ml_channel_size_64,
|
|
caml_ml_close_channel = runtime.caml_ml_close_channel,
|
|
caml_ml_flush = runtime.caml_ml_flush,
|
|
caml_ml_input = runtime.caml_ml_input,
|
|
caml_ml_input_char = runtime.caml_ml_input_char,
|
|
caml_ml_open_descriptor_in = runtime.caml_ml_open_descriptor_in,
|
|
caml_ml_open_descriptor_out = runtime.caml_ml_open_descriptor_out,
|
|
caml_ml_output = runtime.caml_ml_output,
|
|
caml_ml_output_bytes = runtime.caml_ml_output_bytes,
|
|
caml_ml_output_char = runtime.caml_ml_output_char,
|
|
caml_ml_set_binary_mode = runtime.caml_ml_set_binary_mode,
|
|
caml_ml_set_channel_name = runtime.caml_ml_set_channel_name,
|
|
caml_ml_string_length = runtime.caml_ml_string_length,
|
|
caml_string_concat = runtime.caml_string_concat,
|
|
caml_string_of_bytes = runtime.caml_string_of_bytes,
|
|
caml_sys_open = runtime.caml_sys_open,
|
|
caml_wrap_exception = runtime.caml_wrap_exception;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
CamlinternalFormatBasics = global_data.CamlinternalFormatBasics,
|
|
Invalid_argument = global_data.Invalid_argument,
|
|
Failure = global_data.Failure,
|
|
Match_failure = global_data.Match_failure,
|
|
Assert_failure = global_data.Assert_failure,
|
|
Not_found = global_data.Not_found,
|
|
Out_of_memory = global_data.Out_of_memory,
|
|
Stack_overflow = global_data.Stack_overflow,
|
|
Sys_error = global_data.Sys_error,
|
|
End_of_file = global_data.End_of_file,
|
|
Division_by_zero = global_data.Division_by_zero,
|
|
Sys_blocked_io = global_data.Sys_blocked_io,
|
|
Undefined_recursive_module = global_data.Undefined_recursive_module;
|
|
function failwith(s){
|
|
throw caml_maybe_attach_backtrace([0, Failure, s], 1);
|
|
}
|
|
function invalid_arg(s){
|
|
throw caml_maybe_attach_backtrace([0, Invalid_argument, s], 1);
|
|
}
|
|
var Exit = [248, "Stdlib.Exit", runtime.caml_fresh_oo_id(0)];
|
|
function min(x, y){return runtime.caml_lessequal(x, y) ? x : y;}
|
|
function max(x, y){return runtime.caml_greaterequal(x, y) ? x : y;}
|
|
function abs(x){return 0 <= x ? x : - x | 0;}
|
|
function lnot(x){return x ^ -1;}
|
|
function char_of_int(n){
|
|
if(0 <= n && 255 >= n) return n;
|
|
return invalid_arg("char_of_int");
|
|
}
|
|
var cst_false = "false", cst_true = "true";
|
|
function string_of_bool(b){return b ? cst_true : cst_false;}
|
|
function bool_of_string(param){
|
|
return param !== cst_false
|
|
? param !== cst_true ? invalid_arg("bool_of_string") : 1
|
|
: 0;
|
|
}
|
|
var a = [0, 1], b = [0, 0];
|
|
function bool_of_string_opt(param){
|
|
return param !== cst_false ? param !== cst_true ? 0 : a : b;
|
|
}
|
|
function string_of_int(n){return "" + n;}
|
|
function int_of_string_opt(s){
|
|
try{var a = [0, caml_int_of_string(s)]; return a;}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn[1] === Failure) return 0;
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
}
|
|
function valid_float_lexem(s1){
|
|
var l = caml_ml_string_length(s1), i = 0;
|
|
for(;;){
|
|
if(l <= i) return s1 + ".";
|
|
var match = runtime.caml_string_get(s1, i);
|
|
a:
|
|
{
|
|
if(48 <= match){if(58 <= match) break a;} else if(45 !== match) break a;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
continue;
|
|
}
|
|
return s1;
|
|
}
|
|
}
|
|
function string_of_float(f){
|
|
return valid_float_lexem(runtime.caml_format_float("%.12g", f));
|
|
}
|
|
function float_of_string_opt(s){
|
|
try{var a = [0, caml_float_of_string(s)]; return a;}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn[1] === Failure) return 0;
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
}
|
|
function symbol(l1, l2){
|
|
if(! l1) return l2;
|
|
var match = l1[2], h1 = l1[1];
|
|
if(! match) return [0, h1, l2];
|
|
var match$0 = match[2], h2 = match[1];
|
|
if(! match$0) return [0, h1, [0, h2, l2]];
|
|
var
|
|
tl = match$0[2],
|
|
h3 = match$0[1],
|
|
block = [0, h3, 24029],
|
|
dst = block,
|
|
offset = 1,
|
|
l1$0 = tl;
|
|
for(;;){
|
|
if(l1$0){
|
|
var match$1 = l1$0[2], h1$0 = l1$0[1];
|
|
if(match$1){
|
|
var match$2 = match$1[2], h2$0 = match$1[1];
|
|
if(match$2){
|
|
var tl$0 = match$2[2], h3$0 = match$2[1], dst$0 = [0, h3$0, 24029];
|
|
dst[offset + 1] = [0, h1$0, [0, h2$0, dst$0]];
|
|
dst = dst$0;
|
|
offset = 1;
|
|
l1$0 = tl$0;
|
|
continue;
|
|
}
|
|
dst[offset + 1] = [0, h1$0, [0, h2$0, l2]];
|
|
}
|
|
else
|
|
dst[offset + 1] = [0, h1$0, l2];
|
|
}
|
|
else
|
|
dst[offset + 1] = l2;
|
|
return [0, h1, [0, h2, block]];
|
|
}
|
|
}
|
|
var
|
|
stdin = caml_ml_open_descriptor_in(0),
|
|
stdout = caml_ml_open_descriptor_out(1),
|
|
stderr = caml_ml_open_descriptor_out(2);
|
|
function open_out_gen(mode, perm, name){
|
|
var c = caml_ml_open_descriptor_out(caml_sys_open(name, mode, perm));
|
|
caml_ml_set_channel_name(c, name);
|
|
return c;
|
|
}
|
|
var c = [0, 1, [0, 3, [0, 4, [0, 7, 0]]]];
|
|
function open_out(name){return open_out_gen(c, 438, name);}
|
|
var d = [0, 1, [0, 3, [0, 4, [0, 6, 0]]]];
|
|
function open_out_bin(name){return open_out_gen(d, 438, name);}
|
|
function flush_all(param){
|
|
var param$0 = runtime.caml_ml_out_channels_list(0);
|
|
for(;;){
|
|
if(! param$0) return 0;
|
|
var l = param$0[2], a = param$0[1];
|
|
try{caml_ml_flush(a); param$0 = l;}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn[1] !== Sys_error) throw caml_maybe_attach_backtrace(exn, 0);
|
|
param$0 = l;
|
|
}
|
|
}
|
|
}
|
|
function output_bytes(oc, s){
|
|
return caml_ml_output_bytes(oc, s, 0, caml_ml_bytes_length(s));
|
|
}
|
|
function output_string(oc, s){
|
|
return caml_ml_output(oc, s, 0, caml_ml_string_length(s));
|
|
}
|
|
function output(oc, s, ofs, len){
|
|
if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs)
|
|
return caml_ml_output_bytes(oc, s, ofs, len);
|
|
return invalid_arg("output");
|
|
}
|
|
function output_substring(oc, s, ofs, len){
|
|
if(0 <= ofs && 0 <= len && (caml_ml_string_length(s) - len | 0) >= ofs)
|
|
return caml_ml_output(oc, s, ofs, len);
|
|
return invalid_arg("output_substring");
|
|
}
|
|
function output_value(chan, v){
|
|
return runtime.caml_output_value(chan, v, 0);
|
|
}
|
|
function close_out(oc){
|
|
caml_ml_flush(oc);
|
|
return caml_ml_close_channel(oc);
|
|
}
|
|
function close_out_noerr(oc){
|
|
try{caml_ml_flush(oc);}catch(exn){}
|
|
try{var a = caml_ml_close_channel(oc); return a;}catch(exn){return 0;}
|
|
}
|
|
function open_in_gen(mode, perm, name){
|
|
var c = caml_ml_open_descriptor_in(caml_sys_open(name, mode, perm));
|
|
caml_ml_set_channel_name(c, name);
|
|
return c;
|
|
}
|
|
var e = [0, 0, [0, 7, 0]];
|
|
function open_in(name){return open_in_gen(e, 0, name);}
|
|
var f = [0, 0, [0, 6, 0]];
|
|
function open_in_bin(name){return open_in_gen(f, 0, name);}
|
|
function input(ic, s, ofs, len){
|
|
if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs)
|
|
return caml_ml_input(ic, s, ofs, len);
|
|
return invalid_arg("input");
|
|
}
|
|
function unsafe_really_input(ic, s, ofs$1, len$1){
|
|
var ofs = ofs$1, len = len$1;
|
|
for(;;){
|
|
if(0 >= len) return 0;
|
|
var r = caml_ml_input(ic, s, ofs, len);
|
|
if(0 === r) throw caml_maybe_attach_backtrace(End_of_file, 1);
|
|
var len$0 = len - r | 0, ofs$0 = ofs + r | 0;
|
|
ofs = ofs$0;
|
|
len = len$0;
|
|
}
|
|
}
|
|
function really_input(ic, s, ofs, len){
|
|
if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs)
|
|
return unsafe_really_input(ic, s, ofs, len);
|
|
return invalid_arg("really_input");
|
|
}
|
|
function really_input_string(ic, len){
|
|
var s = caml_create_bytes(len);
|
|
really_input(ic, s, 0, len);
|
|
return caml_string_of_bytes(s);
|
|
}
|
|
function input_line(chan){
|
|
function build_result(buf, pos$1, param$0){
|
|
var pos = pos$1, param = param$0;
|
|
for(;;){
|
|
if(! param) return buf;
|
|
var tl = param[2], hd = param[1], len = caml_ml_bytes_length(hd);
|
|
runtime.caml_blit_bytes(hd, 0, buf, pos - len | 0, len);
|
|
var pos$0 = pos - len | 0;
|
|
pos = pos$0;
|
|
param = tl;
|
|
}
|
|
}
|
|
var accu = 0, len = 0;
|
|
for(;;){
|
|
var n = runtime.caml_ml_input_scan_line(chan);
|
|
if(0 === n){
|
|
if(! accu) throw caml_maybe_attach_backtrace(End_of_file, 1);
|
|
var a = build_result(caml_create_bytes(len), len, accu);
|
|
}
|
|
else{
|
|
if(0 >= n){
|
|
var beg = caml_create_bytes(- n | 0);
|
|
caml_ml_input(chan, beg, 0, - n | 0);
|
|
var len$1 = len - n | 0, accu$0 = [0, beg, accu];
|
|
accu = accu$0;
|
|
len = len$1;
|
|
continue;
|
|
}
|
|
var res = caml_create_bytes(n - 1 | 0);
|
|
caml_ml_input(chan, res, 0, n - 1 | 0);
|
|
caml_ml_input_char(chan);
|
|
if(accu)
|
|
var
|
|
len$0 = (len + n | 0) - 1 | 0,
|
|
a = build_result(caml_create_bytes(len$0), len$0, [0, res, accu]);
|
|
else
|
|
var a = res;
|
|
}
|
|
return caml_string_of_bytes(a);
|
|
}
|
|
}
|
|
function close_in_noerr(ic){
|
|
try{var a = caml_ml_close_channel(ic); return a;}catch(exn){return 0;}
|
|
}
|
|
function print_char(c){return caml_ml_output_char(stdout, c);}
|
|
function print_string(s){return output_string(stdout, s);}
|
|
function print_bytes(s){return output_bytes(stdout, s);}
|
|
function print_int(i){return output_string(stdout, "" + i);}
|
|
function print_float(f){return output_string(stdout, string_of_float(f));}
|
|
function print_endline(s){
|
|
output_string(stdout, s);
|
|
caml_ml_output_char(stdout, 10);
|
|
return caml_ml_flush(stdout);
|
|
}
|
|
function print_newline(param){
|
|
caml_ml_output_char(stdout, 10);
|
|
return caml_ml_flush(stdout);
|
|
}
|
|
function prerr_char(c){return caml_ml_output_char(stderr, c);}
|
|
function prerr_string(s){return output_string(stderr, s);}
|
|
function prerr_bytes(s){return output_bytes(stderr, s);}
|
|
function prerr_int(i){return output_string(stderr, "" + i);}
|
|
function prerr_float(f){return output_string(stderr, string_of_float(f));}
|
|
function prerr_endline(s){
|
|
output_string(stderr, s);
|
|
caml_ml_output_char(stderr, 10);
|
|
return caml_ml_flush(stderr);
|
|
}
|
|
function prerr_newline(param){
|
|
caml_ml_output_char(stderr, 10);
|
|
return caml_ml_flush(stderr);
|
|
}
|
|
function read_line(param){caml_ml_flush(stdout); return input_line(stdin);}
|
|
function read_int(param){return caml_int_of_string(read_line(0));}
|
|
function read_int_opt(param){return int_of_string_opt(read_line(0));}
|
|
function read_float(param){return caml_float_of_string(read_line(0));}
|
|
function read_float_opt(param){return float_of_string_opt(read_line(0));}
|
|
function string_of_format(param){var str = param[2]; return str;}
|
|
function symbol$0(a, param){
|
|
var
|
|
str2 = param[2],
|
|
fmt2 = param[1],
|
|
str1 = a[2],
|
|
fmt1 = a[1],
|
|
s2 = "%," + str2;
|
|
return [0, CamlinternalFormatBasics[3].call(null, fmt1, fmt2), str1 + s2];
|
|
}
|
|
var exit_function = [0, flush_all];
|
|
function at_exit(f){
|
|
for(;;){
|
|
var old_exit = caml_atomic_load(exit_function);
|
|
let f_yet_to_run = [0, 1], old_exit$0 = old_exit;
|
|
var
|
|
new_exit =
|
|
function(param){
|
|
if(caml_atomic_cas(f_yet_to_run, 1, 0)) caml_call1(f, 0);
|
|
return caml_call1(old_exit$0, 0);
|
|
},
|
|
success = caml_atomic_cas(exit_function, old_exit, new_exit),
|
|
a = 1 - success;
|
|
if(! a) return a;
|
|
}
|
|
}
|
|
var do_domain_local_at_exit = [0, function(param){return 0;}];
|
|
function do_at_exit(param){
|
|
caml_call1(do_domain_local_at_exit[1], 0);
|
|
return caml_call1(caml_atomic_load(exit_function), 0);
|
|
}
|
|
function exit(retcode){
|
|
do_at_exit(0);
|
|
return runtime.caml_sys_exit(retcode);
|
|
}
|
|
runtime.caml_register_named_value("Pervasives.do_at_exit", do_at_exit);
|
|
var
|
|
Stdlib =
|
|
[0,
|
|
invalid_arg,
|
|
failwith,
|
|
Exit,
|
|
Match_failure,
|
|
Assert_failure,
|
|
Invalid_argument,
|
|
Failure,
|
|
Not_found,
|
|
Out_of_memory,
|
|
Stack_overflow,
|
|
Sys_error,
|
|
End_of_file,
|
|
Division_by_zero,
|
|
Sys_blocked_io,
|
|
Undefined_recursive_module,
|
|
min,
|
|
max,
|
|
abs,
|
|
2147483647,
|
|
-2147483648,
|
|
lnot,
|
|
Infinity,
|
|
-Infinity,
|
|
NaN,
|
|
1.7976931348623157e+308,
|
|
2.2250738585072014e-308,
|
|
2.220446049250313e-16,
|
|
caml_string_concat,
|
|
char_of_int,
|
|
string_of_bool,
|
|
bool_of_string_opt,
|
|
bool_of_string,
|
|
string_of_int,
|
|
int_of_string_opt,
|
|
string_of_float,
|
|
float_of_string_opt,
|
|
symbol,
|
|
stdin,
|
|
stdout,
|
|
stderr,
|
|
print_char,
|
|
print_string,
|
|
print_bytes,
|
|
print_int,
|
|
print_float,
|
|
print_endline,
|
|
print_newline,
|
|
prerr_char,
|
|
prerr_string,
|
|
prerr_bytes,
|
|
prerr_int,
|
|
prerr_float,
|
|
prerr_endline,
|
|
prerr_newline,
|
|
read_line,
|
|
read_int_opt,
|
|
read_int,
|
|
read_float_opt,
|
|
read_float,
|
|
open_out,
|
|
open_out_bin,
|
|
open_out_gen,
|
|
caml_ml_flush,
|
|
flush_all,
|
|
caml_ml_output_char,
|
|
output_string,
|
|
output_bytes,
|
|
output,
|
|
output_substring,
|
|
caml_ml_output_char,
|
|
runtime.caml_ml_output_int,
|
|
output_value,
|
|
runtime.caml_ml_seek_out,
|
|
runtime.caml_ml_pos_out,
|
|
caml_ml_channel_size,
|
|
close_out,
|
|
close_out_noerr,
|
|
caml_ml_set_binary_mode,
|
|
open_in,
|
|
open_in_bin,
|
|
open_in_gen,
|
|
caml_ml_input_char,
|
|
input_line,
|
|
input,
|
|
really_input,
|
|
really_input_string,
|
|
caml_ml_input_char,
|
|
runtime.caml_ml_input_int,
|
|
runtime.caml_input_value,
|
|
runtime.caml_ml_seek_in,
|
|
runtime.caml_ml_pos_in,
|
|
caml_ml_channel_size,
|
|
caml_ml_close_channel,
|
|
close_in_noerr,
|
|
caml_ml_set_binary_mode,
|
|
[0,
|
|
runtime.caml_ml_seek_out_64,
|
|
runtime.caml_ml_pos_out_64,
|
|
caml_ml_channel_size_64,
|
|
runtime.caml_ml_seek_in_64,
|
|
runtime.caml_ml_pos_in_64,
|
|
caml_ml_channel_size_64],
|
|
string_of_format,
|
|
symbol$0,
|
|
exit,
|
|
at_exit,
|
|
valid_float_lexem,
|
|
unsafe_really_input,
|
|
do_at_exit,
|
|
do_domain_local_at_exit];
|
|
runtime.caml_register_global(45, Stdlib, "Stdlib");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 743 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Sys:[N,F(1),N,N,[N],N,N,N,N,N,N,N,N,N,F(2)*,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,F(1)*,N,N,N,F(1),F(1),[F(2)*]]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_wrap_exception = runtime.caml_wrap_exception,
|
|
Stdlib = runtime.caml_get_global_data().Stdlib,
|
|
executable_name = runtime.caml_sys_executable_name(0),
|
|
os_type = runtime.caml_sys_get_config(0)[1],
|
|
unix = runtime.caml_sys_const_ostype_unix(0),
|
|
win32 = runtime.caml_sys_const_ostype_win32(0),
|
|
cygwin = runtime.caml_sys_const_ostype_cygwin(0),
|
|
max_array_length = runtime.caml_sys_const_max_wosize(0),
|
|
max_floatarray_length = max_array_length / 2 | 0,
|
|
max_string_length = (4 * max_array_length | 0) - 1 | 0;
|
|
function getenv_opt(s){
|
|
try{var a = [0, runtime.caml_sys_getenv(s)]; return a;}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn === Stdlib[8]) return 0;
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
}
|
|
function set_signal(sig_num, sig_beh){return 0;}
|
|
var Break = [248, "Stdlib.Sys.Break", runtime.caml_fresh_oo_id(0)];
|
|
function catch_break(on){return on ? 0 : 0;}
|
|
function Make(Immediate, Non_immediate){return [0, 1];}
|
|
var
|
|
Stdlib_Sys =
|
|
[0,
|
|
executable_name,
|
|
getenv_opt,
|
|
[0, 0],
|
|
os_type,
|
|
[0, "js_of_ocaml"],
|
|
unix,
|
|
win32,
|
|
cygwin,
|
|
32,
|
|
32,
|
|
0,
|
|
max_string_length,
|
|
max_array_length,
|
|
max_floatarray_length,
|
|
set_signal,
|
|
-1,
|
|
-2,
|
|
-3,
|
|
-4,
|
|
-5,
|
|
-6,
|
|
-7,
|
|
-8,
|
|
-9,
|
|
-10,
|
|
-11,
|
|
-12,
|
|
-13,
|
|
-14,
|
|
-15,
|
|
-16,
|
|
-17,
|
|
-18,
|
|
-19,
|
|
-20,
|
|
-21,
|
|
-22,
|
|
-23,
|
|
-24,
|
|
-25,
|
|
-26,
|
|
-27,
|
|
-28,
|
|
Break,
|
|
catch_break,
|
|
"5.2.0",
|
|
0,
|
|
[0, 5, 2, 0, 0],
|
|
runtime.caml_ml_enable_runtime_warnings,
|
|
runtime.caml_ml_runtime_warnings_enabled,
|
|
[0, Make]];
|
|
runtime.caml_register_global(4, Stdlib_Sys, "Stdlib__Sys");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 833 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Obj:[F(1)*,F(2),F(3),N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,[F(1),F(1)*,F(1)*],N]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_check_bound = runtime.caml_check_bound,
|
|
caml_obj_tag = runtime.caml_obj_tag,
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_Sys = global_data.Stdlib__Sys;
|
|
function is_block(a){return 1 - (typeof a === "number");}
|
|
function double_field(x, i){return caml_check_bound(x, i)[i + 1];}
|
|
function set_double_field(x, i, v){
|
|
caml_check_bound(x, i)[i + 1] = v;
|
|
return 0;
|
|
}
|
|
function of_val(x){
|
|
var
|
|
slot =
|
|
is_block(x)
|
|
? caml_obj_tag(x) !== 248 ? 1 <= x.length - 1 ? x[1] : x : x
|
|
: x,
|
|
cst_Obj_extension_constructor = "Obj.extension_constructor";
|
|
a:
|
|
{
|
|
if(is_block(slot) && caml_obj_tag(slot) === 248){var name = slot[1]; break a;}
|
|
var name = Stdlib[1].call(null, cst_Obj_extension_constructor);
|
|
}
|
|
return caml_obj_tag(name) === 252
|
|
? slot
|
|
: Stdlib[1].call(null, cst_Obj_extension_constructor);
|
|
}
|
|
function name(slot){return slot[1];}
|
|
function id(slot){return slot[2];}
|
|
var max_ephe_length = Stdlib_Sys[13] - 2 | 0;
|
|
function create(l){
|
|
var a = 0 <= l, b = a ? l <= max_ephe_length : a;
|
|
if(1 - b) Stdlib[1].call(null, "Obj.Ephemeron.create");
|
|
return runtime.caml_ephe_create(l);
|
|
}
|
|
function length(x){return x.length - 3 | 0;}
|
|
function raise_if_invalid_offset(e, o, msg){
|
|
var a = 0 <= o, c = a ? o < length(e) : a, b = 1 - c;
|
|
return b ? Stdlib[1].call(null, msg) : b;
|
|
}
|
|
function get_key(e, o){
|
|
raise_if_invalid_offset(e, o, "Obj.Ephemeron.get_key");
|
|
return runtime.caml_ephe_get_key(e, o);
|
|
}
|
|
function get_key_copy(e, o){
|
|
raise_if_invalid_offset(e, o, "Obj.Ephemeron.get_key_copy");
|
|
return runtime.caml_ephe_get_key_copy(e, o);
|
|
}
|
|
function set_key(e, o, x){
|
|
raise_if_invalid_offset(e, o, "Obj.Ephemeron.set_key");
|
|
return runtime.caml_ephe_set_key(e, o, x);
|
|
}
|
|
function unset_key(e, o){
|
|
raise_if_invalid_offset(e, o, "Obj.Ephemeron.unset_key");
|
|
return runtime.caml_ephe_unset_key(e, o);
|
|
}
|
|
function check_key(e, o){
|
|
raise_if_invalid_offset(e, o, "Obj.Ephemeron.check_key");
|
|
return runtime.caml_ephe_check_key(e, o);
|
|
}
|
|
function blit_key(e1, o1, e2, o2, l){
|
|
if
|
|
(0 <= l
|
|
&&
|
|
0 <= o1
|
|
&& (length(e1) - l | 0) >= o1 && 0 <= o2 && (length(e2) - l | 0) >= o2){
|
|
var
|
|
a = 0 !== l ? 1 : 0,
|
|
b = a ? runtime.caml_ephe_blit_key(e1, o1, e2, o2, l) : a;
|
|
return b;
|
|
}
|
|
return Stdlib[1].call(null, "Obj.Ephemeron.blit_key");
|
|
}
|
|
var
|
|
Stdlib_Obj =
|
|
[0,
|
|
is_block,
|
|
double_field,
|
|
set_double_field,
|
|
0,
|
|
243,
|
|
244,
|
|
245,
|
|
246,
|
|
247,
|
|
248,
|
|
249,
|
|
250,
|
|
251,
|
|
251,
|
|
252,
|
|
253,
|
|
254,
|
|
255,
|
|
1000,
|
|
1001,
|
|
1002,
|
|
[0, of_val, name, id],
|
|
[0,
|
|
create,
|
|
length,
|
|
get_key,
|
|
get_key_copy,
|
|
set_key,
|
|
unset_key,
|
|
check_key,
|
|
blit_key,
|
|
runtime.caml_ephe_get_data,
|
|
runtime.caml_ephe_get_data_copy,
|
|
runtime.caml_ephe_set_data,
|
|
runtime.caml_ephe_unset_data,
|
|
runtime.caml_ephe_check_data,
|
|
runtime.caml_ephe_blit_data,
|
|
max_ephe_length]];
|
|
runtime.caml_register_global(11, Stdlib_Obj, "Stdlib__Obj");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 984 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Atomic:[F(1)*,F(1),F(1),F(2),F(2),F(3),F(2),F(1),F(1)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_atomic_exchange = runtime.caml_atomic_exchange,
|
|
caml_atomic_fetch_add = runtime.caml_atomic_fetch_add;
|
|
function set(r, x){caml_atomic_exchange(r, x); return 0;}
|
|
function incr(r){caml_atomic_fetch_add(r, 1); return 0;}
|
|
function decr(r){caml_atomic_fetch_add(r, -1); return 0;}
|
|
var
|
|
Stdlib_Atomic =
|
|
[0,
|
|
function(a){return [0, a];},
|
|
runtime.caml_atomic_make_contended,
|
|
runtime.caml_atomic_load,
|
|
set,
|
|
caml_atomic_exchange,
|
|
runtime.caml_atomic_cas,
|
|
caml_atomic_fetch_add,
|
|
incr,
|
|
decr];
|
|
runtime.caml_register_global(0, Stdlib_Atomic, "Stdlib__Atomic");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 1014 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: CamlinternalLazy:[N,F(1),F(2)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_lazy_update_to_forward = runtime.caml_lazy_update_to_forward,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_wrap_exception = runtime.caml_wrap_exception;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
var
|
|
Stdlib_Obj = runtime.caml_get_global_data().Stdlib__Obj,
|
|
Undefined =
|
|
[248, "CamlinternalLazy.Undefined", runtime.caml_fresh_oo_id(0)];
|
|
function force_gen_lazy_block(only_val, blk){
|
|
if(0 !== runtime.caml_lazy_update_to_forcing(blk))
|
|
throw caml_maybe_attach_backtrace(Undefined, 1);
|
|
if(only_val){
|
|
var closure$0 = blk[1];
|
|
blk[1] = 0;
|
|
var result$0 = caml_call1(closure$0, 0);
|
|
blk[1] = result$0;
|
|
caml_lazy_update_to_forward(blk);
|
|
return result$0;
|
|
}
|
|
var closure = blk[1];
|
|
blk[1] = 0;
|
|
try{
|
|
var result = caml_call1(closure, 0);
|
|
blk[1] = result;
|
|
caml_lazy_update_to_forward(blk);
|
|
return result;
|
|
}
|
|
catch(e$0){
|
|
var e = caml_wrap_exception(e$0);
|
|
blk[1] = function(param){throw caml_maybe_attach_backtrace(e, 0);};
|
|
runtime.caml_lazy_reset_to_lazy(blk);
|
|
throw caml_maybe_attach_backtrace(e, 0);
|
|
}
|
|
}
|
|
function force_lazy_block(blk){return force_gen_lazy_block(0, blk);}
|
|
function force_gen(only_val, lzv){
|
|
var t = runtime.caml_obj_tag(lzv);
|
|
if(t === Stdlib_Obj[12]) return lzv[1];
|
|
if(t === Stdlib_Obj[6]) throw caml_maybe_attach_backtrace(Undefined, 1);
|
|
return t !== Stdlib_Obj[8] ? lzv : force_gen_lazy_block(only_val, lzv);
|
|
}
|
|
runtime.caml_register_global
|
|
(2, [0, Undefined, force_lazy_block, force_gen], "CamlinternalLazy");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 1073 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Lazy:[N,F(2)*,F(1),F(1),F(2),F(1),F(1)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var runtime = globalThis.jsoo_runtime, caml_obj_tag = runtime.caml_obj_tag;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
CamlinternalLazy = global_data.CamlinternalLazy,
|
|
Stdlib_Obj = global_data.Stdlib__Obj,
|
|
Undefined = CamlinternalLazy[1];
|
|
function force_val(l){return CamlinternalLazy[3].call(null, 1, l);}
|
|
function from_fun(f){
|
|
var x = runtime.caml_obj_block(Stdlib_Obj[8], 1);
|
|
x[1] = f;
|
|
return x;
|
|
}
|
|
function from_val(v){
|
|
var t = caml_obj_tag(v);
|
|
if
|
|
(t !== Stdlib_Obj[12]
|
|
&& t !== Stdlib_Obj[8] && t !== Stdlib_Obj[6] && t !== Stdlib_Obj[16])
|
|
return v;
|
|
return runtime.caml_lazy_make_forward(v);
|
|
}
|
|
function is_val(l){
|
|
var a = Stdlib_Obj[8];
|
|
return caml_obj_tag(l) !== a ? 1 : 0;
|
|
}
|
|
function map(f, x){
|
|
return [246,
|
|
function(param){
|
|
var a = caml_obj_tag(x);
|
|
a:
|
|
if(250 === a)
|
|
var b = x[1];
|
|
else{
|
|
if(246 !== a && 244 !== a){var b = x; break a;}
|
|
var b = CamlinternalLazy[2].call(null, x);
|
|
}
|
|
return caml_call1(f, b);
|
|
}];
|
|
}
|
|
function map_val(f, x){
|
|
if(! is_val(x))
|
|
return [246,
|
|
function(param){
|
|
var a = caml_obj_tag(x);
|
|
a:
|
|
if(250 === a)
|
|
var b = x[1];
|
|
else{
|
|
if(246 !== a && 244 !== a){var b = x; break a;}
|
|
var b = CamlinternalLazy[2].call(null, x);
|
|
}
|
|
return caml_call1(f, b);
|
|
}];
|
|
var a = caml_obj_tag(x);
|
|
a:
|
|
if(250 === a)
|
|
var b = x[1];
|
|
else{
|
|
if(246 !== a && 244 !== a){var b = x; break a;}
|
|
var b = CamlinternalLazy[2].call(null, x);
|
|
}
|
|
return from_val(caml_call1(f, b));
|
|
}
|
|
runtime.caml_register_global
|
|
(2,
|
|
[0, Undefined, map, is_val, from_val, map_val, from_fun, force_val],
|
|
"Stdlib__Lazy");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 1154 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Seq:[F(1),F(1),F(1),F(2),F(3),F(2),F(3),F(2),F(2),F(2),F(2),F(2),F(2),F(3),F(4),F(3),F(3),F(3),F(3),F(1)*,F(2)*,F(3)*,F(2),F(3),F(2)*,F(2),F(2),F(2)*->F(1)*,F(3),F(2)*->F(1),F(3),F(3),F(3)*->F(1)*,F(2),F(2),F(3),F(3),F(3),F(1)->F(1),N,F(1)*->F(1),F(2),F(3),F(2),F(3),F(3),F(3),F(4),F(3),F(4),F(2)*,F(3)*->F(1),F(1)*,F(1)*,F(2)*,F(2)*,F(1)*->F(1),F(1)*->F(1),F(2)*]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
function caml_call3(f, a0, a1, a2){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 3
|
|
? f(a0, a1, a2)
|
|
: runtime.caml_call_gen(f, [a0, a1, a2]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Assert_failure = global_data.Assert_failure,
|
|
Stdlib_Atomic = global_data.Stdlib__Atomic,
|
|
CamlinternalLazy = global_data.CamlinternalLazy,
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_Lazy = global_data.Stdlib__Lazy;
|
|
function empty(param){return 0;}
|
|
function return$(x, param){return [0, x, empty];}
|
|
function cons(x, next, param){return [0, x, next];}
|
|
function append(seq1, seq2, param){
|
|
var match = caml_call1(seq1, 0);
|
|
if(! match) return caml_call1(seq2, 0);
|
|
var next = match[2], x = match[1];
|
|
return [0, x, function(a){return append(next, seq2, a);}];
|
|
}
|
|
function map(f, seq, param){
|
|
var match = caml_call1(seq, 0);
|
|
if(! match) return 0;
|
|
var next = match[2], x = match[1];
|
|
return [0, caml_call1(f, x), function(a){return map(f, next, a);}];
|
|
}
|
|
function filter_map(f, seq$0, param){
|
|
var seq = seq$0;
|
|
for(;;){
|
|
var match = caml_call1(seq, 0);
|
|
if(! match) return 0;
|
|
var next = match[2], x = match[1], match$0 = caml_call1(f, x);
|
|
if(match$0) break;
|
|
seq = next;
|
|
}
|
|
var y = match$0[1];
|
|
return [0, y, function(a){return filter_map(f, next, a);}];
|
|
}
|
|
function filter(f, seq$0, param){
|
|
var seq = seq$0;
|
|
for(;;){
|
|
var match = caml_call1(seq, 0);
|
|
if(! match) return 0;
|
|
var next = match[2], x = match[1];
|
|
if(caml_call1(f, x)) break;
|
|
seq = next;
|
|
}
|
|
return [0, x, function(a){return filter(f, next, a);}];
|
|
}
|
|
function concat(seq, param){
|
|
var match = caml_call1(seq, 0);
|
|
if(! match) return 0;
|
|
var next = match[2], x = match[1];
|
|
return append(x, function(a){return concat(next, a);}, 0);
|
|
}
|
|
function flat_map(f, seq, param){
|
|
var match = caml_call1(seq, 0);
|
|
if(! match) return 0;
|
|
var next = match[2], x = match[1];
|
|
return append
|
|
(caml_call1(f, x), function(a){return flat_map(f, next, a);}, 0);
|
|
}
|
|
function fold_left(f, acc$1, seq$0){
|
|
var acc = acc$1, seq = seq$0;
|
|
for(;;){
|
|
var match = caml_call1(seq, 0);
|
|
if(! match) return acc;
|
|
var next = match[2], x = match[1], acc$0 = caml_call2(f, acc, x);
|
|
acc = acc$0;
|
|
seq = next;
|
|
}
|
|
}
|
|
function iter(f, seq$0){
|
|
var seq = seq$0;
|
|
for(;;){
|
|
var match = caml_call1(seq, 0);
|
|
if(! match) return 0;
|
|
var next = match[2], x = match[1];
|
|
caml_call1(f, x);
|
|
seq = next;
|
|
}
|
|
}
|
|
function unfold(f, u, param){
|
|
var match = caml_call1(f, u);
|
|
if(! match) return 0;
|
|
var match$0 = match[1], u$0 = match$0[2], x = match$0[1];
|
|
return [0, x, function(a){return unfold(f, u$0, a);}];
|
|
}
|
|
function is_empty(xs){return caml_call1(xs, 0) ? 0 : 1;}
|
|
function uncons(xs){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 0;
|
|
var xs$0 = match[2], x = match[1];
|
|
return [0, [0, x, xs$0]];
|
|
}
|
|
function length(xs$1){
|
|
var accu = 0, xs = xs$1;
|
|
for(;;){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return accu;
|
|
var xs$0 = match[2], accu$0 = accu + 1 | 0;
|
|
accu = accu$0;
|
|
xs = xs$0;
|
|
}
|
|
}
|
|
function iteri(f, xs$1){
|
|
var i = 0, xs = xs$1;
|
|
for(;;){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 0;
|
|
var xs$0 = match[2], x = match[1];
|
|
caml_call2(f, i, x);
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
xs = xs$0;
|
|
}
|
|
}
|
|
function fold_lefti(f, accu$1, xs$1){
|
|
var accu = accu$1, i = 0, xs = xs$1;
|
|
for(;;){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return accu;
|
|
var
|
|
xs$0 = match[2],
|
|
x = match[1],
|
|
accu$0 = caml_call3(f, accu, i, x),
|
|
i$0 = i + 1 | 0;
|
|
accu = accu$0;
|
|
i = i$0;
|
|
xs = xs$0;
|
|
}
|
|
}
|
|
function for_all(p, xs$1){
|
|
var xs = xs$1;
|
|
for(;;){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 1;
|
|
var xs$0 = match[2], x = match[1], a = caml_call1(p, x);
|
|
if(! a) return a;
|
|
xs = xs$0;
|
|
}
|
|
}
|
|
function exists(p, xs$1){
|
|
var xs = xs$1;
|
|
for(;;){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 0;
|
|
var xs$0 = match[2], x = match[1], a = caml_call1(p, x);
|
|
if(a) return a;
|
|
xs = xs$0;
|
|
}
|
|
}
|
|
function find(p, xs$1){
|
|
var xs = xs$1;
|
|
for(;;){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 0;
|
|
var xs$0 = match[2], x = match[1];
|
|
if(caml_call1(p, x)) return [0, x];
|
|
xs = xs$0;
|
|
}
|
|
}
|
|
function find_index(p, xs){
|
|
var i = 0, xs$0 = xs;
|
|
for(;;){
|
|
var match = caml_call1(xs$0, 0);
|
|
if(! match) return 0;
|
|
var xs$1 = match[2], x = match[1];
|
|
if(caml_call1(p, x)) return [0, i];
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
xs$0 = xs$1;
|
|
}
|
|
}
|
|
function find_map(f, xs$1){
|
|
var xs = xs$1;
|
|
for(;;){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 0;
|
|
var xs$0 = match[2], x = match[1], result = caml_call1(f, x);
|
|
if(result) return result;
|
|
xs = xs$0;
|
|
}
|
|
}
|
|
function find_mapi(f, xs){
|
|
var i = 0, xs$0 = xs;
|
|
for(;;){
|
|
var match = caml_call1(xs$0, 0);
|
|
if(! match) return 0;
|
|
var xs$1 = match[2], x = match[1], result = caml_call2(f, i, x);
|
|
if(result) return result;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
xs$0 = xs$1;
|
|
}
|
|
}
|
|
function iter2(f, xs$1, ys$1){
|
|
var xs = xs$1, ys = ys$1;
|
|
for(;;){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 0;
|
|
var xs$0 = match[2], x = match[1], match$0 = caml_call1(ys, 0);
|
|
if(! match$0) return 0;
|
|
var ys$0 = match$0[2], y = match$0[1];
|
|
caml_call2(f, x, y);
|
|
xs = xs$0;
|
|
ys = ys$0;
|
|
}
|
|
}
|
|
function fold_left2(f, accu$1, xs$1, ys$1){
|
|
var accu = accu$1, xs = xs$1, ys = ys$1;
|
|
for(;;){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return accu;
|
|
var xs$0 = match[2], x = match[1], match$0 = caml_call1(ys, 0);
|
|
if(! match$0) return accu;
|
|
var
|
|
ys$0 = match$0[2],
|
|
y = match$0[1],
|
|
accu$0 = caml_call3(f, accu, x, y);
|
|
accu = accu$0;
|
|
xs = xs$0;
|
|
ys = ys$0;
|
|
}
|
|
}
|
|
function for_all2(f, xs$1, ys$1){
|
|
var xs = xs$1, ys = ys$1;
|
|
for(;;){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 1;
|
|
var xs$0 = match[2], x = match[1], match$0 = caml_call1(ys, 0);
|
|
if(! match$0) return 1;
|
|
var ys$0 = match$0[2], y = match$0[1], a = caml_call2(f, x, y);
|
|
if(! a) return a;
|
|
xs = xs$0;
|
|
ys = ys$0;
|
|
}
|
|
}
|
|
function exists2(f, xs$1, ys$1){
|
|
var xs = xs$1, ys = ys$1;
|
|
for(;;){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 0;
|
|
var xs$0 = match[2], x = match[1], match$0 = caml_call1(ys, 0);
|
|
if(! match$0) return 0;
|
|
var ys$0 = match$0[2], y = match$0[1], a = caml_call2(f, x, y);
|
|
if(a) return a;
|
|
xs = xs$0;
|
|
ys = ys$0;
|
|
}
|
|
}
|
|
function equal(eq, xs$1, ys$1){
|
|
var xs = xs$1, ys = ys$1;
|
|
for(;;){
|
|
var match = caml_call1(xs, 0), match$0 = caml_call1(ys, 0);
|
|
if(match){
|
|
if(match$0){
|
|
var
|
|
ys$0 = match$0[2],
|
|
y = match$0[1],
|
|
xs$0 = match[2],
|
|
x = match[1],
|
|
a = caml_call2(eq, x, y);
|
|
if(! a) return a;
|
|
xs = xs$0;
|
|
ys = ys$0;
|
|
continue;
|
|
}
|
|
}
|
|
else if(! match$0) return 1;
|
|
return 0;
|
|
}
|
|
}
|
|
function compare(cmp, xs$1, ys$1){
|
|
var xs = xs$1, ys = ys$1;
|
|
for(;;){
|
|
var match = caml_call1(xs, 0), match$0 = caml_call1(ys, 0);
|
|
if(! match) return match$0 ? -1 : 0;
|
|
var xs$0 = match[2], x = match[1];
|
|
if(! match$0) return 1;
|
|
var ys$0 = match$0[2], y = match$0[1], c = caml_call2(cmp, x, y);
|
|
if(0 !== c) return c;
|
|
xs = xs$0;
|
|
ys = ys$0;
|
|
}
|
|
}
|
|
function init_aux(f, i, j, param){
|
|
if(i >= j) return 0;
|
|
var a = i + 1 | 0;
|
|
return [0, caml_call1(f, i), function(b){return init_aux(f, a, j, b);}];
|
|
}
|
|
function init(n, f){
|
|
if(0 > n) return Stdlib[1].call(null, "Seq.init");
|
|
return function(a){return init_aux(f, 0, n, a);};
|
|
}
|
|
function repeat(x, param){
|
|
return [0, x, function(a){return repeat(x, a);}];
|
|
}
|
|
function forever(f, param){
|
|
return [0, caml_call1(f, 0), function(a){return forever(f, a);}];
|
|
}
|
|
function cycle_nonempty(xs, param){
|
|
return append(xs, function(a){return cycle_nonempty(xs, a);}, 0);
|
|
}
|
|
function cycle(xs, param){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 0;
|
|
var xs$0 = match[2], x = match[1];
|
|
function a(a){return cycle_nonempty(xs, a);}
|
|
return [0, x, function(b){return append(xs$0, a, b);}];
|
|
}
|
|
function iterate1(f, x, param){
|
|
var y = caml_call1(f, x);
|
|
return [0, y, function(a){return iterate1(f, y, a);}];
|
|
}
|
|
function iterate(f, x){
|
|
function next(a){return iterate1(f, x, a);}
|
|
return function(param){return [0, x, next];};
|
|
}
|
|
function mapi_aux(f, i, xs, param){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 0;
|
|
var xs$0 = match[2], x = match[1], a = i + 1 | 0;
|
|
return [0,
|
|
caml_call2(f, i, x),
|
|
function(b){return mapi_aux(f, a, xs$0, b);}];
|
|
}
|
|
function mapi(f, xs){return function(a){return mapi_aux(f, 0, xs, a);};}
|
|
function tail_scan(f, s, xs, param){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 0;
|
|
var xs$0 = match[2], x = match[1], s$0 = caml_call2(f, s, x);
|
|
return [0, s$0, function(a){return tail_scan(f, s$0, xs$0, a);}];
|
|
}
|
|
function scan(f, s, xs){
|
|
function next(a){return tail_scan(f, s, xs, a);}
|
|
return function(param){return [0, s, next];};
|
|
}
|
|
function take_aux(n, xs){
|
|
return 0 === n
|
|
? empty
|
|
: function
|
|
(param){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 0;
|
|
var xs$0 = match[2], x = match[1];
|
|
return [0, x, take_aux(n - 1 | 0, xs$0)];
|
|
};
|
|
}
|
|
function take(n, xs){
|
|
if(n < 0) Stdlib[1].call(null, "Seq.take");
|
|
return take_aux(n, xs);
|
|
}
|
|
function drop(n, xs){
|
|
return 0 <= n
|
|
? 0
|
|
=== n
|
|
? xs
|
|
: function
|
|
(param){
|
|
var n$0 = n, xs$0 = xs;
|
|
for(;;){
|
|
var match = caml_call1(xs$0, 0);
|
|
if(! match) return 0;
|
|
var xs$1 = match[2], n$1 = n$0 - 1 | 0;
|
|
if(0 === n$1) return caml_call1(xs$1, 0);
|
|
n$0 = n$1;
|
|
xs$0 = xs$1;
|
|
}
|
|
}
|
|
: Stdlib[1].call(null, "Seq.drop");
|
|
}
|
|
function take_while(p, xs, param){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 0;
|
|
var xs$0 = match[2], x = match[1];
|
|
return caml_call1(p, x)
|
|
? [0, x, function(a){return take_while(p, xs$0, a);}]
|
|
: 0;
|
|
}
|
|
function drop_while(p, xs$1, param){
|
|
var xs = xs$1;
|
|
for(;;){
|
|
var node = caml_call1(xs, 0);
|
|
if(! node) return 0;
|
|
var xs$0 = node[2], x = node[1];
|
|
if(! caml_call1(p, x)) return node;
|
|
xs = xs$0;
|
|
}
|
|
}
|
|
function group(eq, xs, param){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 0;
|
|
var xs$0 = match[2], x = match[1], a = caml_call1(eq, x);
|
|
function b(b){return drop_while(a, xs$0, b);}
|
|
var c = caml_call1(eq, x);
|
|
function next(a){return take_while(c, xs$0, a);}
|
|
return [0,
|
|
function(param){return [0, x, next];},
|
|
function(a){return group(eq, b, a);}];
|
|
}
|
|
var
|
|
Forced_twice =
|
|
[248, "Stdlib.Seq.Forced_twice", runtime.caml_fresh_oo_id(0)],
|
|
to_lazy = Stdlib_Lazy[6];
|
|
function failure(param){
|
|
throw caml_maybe_attach_backtrace(Forced_twice, 1);
|
|
}
|
|
function memoize(xs){
|
|
function s$0(param){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 0;
|
|
var xs$0 = match[2], x = match[1];
|
|
return [0, x, memoize(xs$0)];
|
|
}
|
|
var s = to_lazy(s$0);
|
|
return function(param){
|
|
var a = runtime.caml_obj_tag(s);
|
|
if(250 === a) return s[1];
|
|
if(246 !== a && 244 !== a) return s;
|
|
return CamlinternalLazy[2].call(null, s);};
|
|
}
|
|
function once(xs){
|
|
function f(param){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 0;
|
|
var xs$0 = match[2], x = match[1];
|
|
return [0, x, once(xs$0)];
|
|
}
|
|
var action = Stdlib_Atomic[1].call(null, f);
|
|
return function(param){
|
|
var f = Stdlib_Atomic[5].call(null, action, failure);
|
|
return caml_call1(f, 0);};
|
|
}
|
|
function zip(xs, ys, param){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 0;
|
|
var xs$0 = match[2], x = match[1], match$0 = caml_call1(ys, 0);
|
|
if(! match$0) return 0;
|
|
var ys$0 = match$0[2], y = match$0[1];
|
|
return [0, [0, x, y], function(a){return zip(xs$0, ys$0, a);}];
|
|
}
|
|
function map2(f, xs, ys, param){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 0;
|
|
var xs$0 = match[2], x = match[1], match$0 = caml_call1(ys, 0);
|
|
if(! match$0) return 0;
|
|
var ys$0 = match$0[2], y = match$0[1];
|
|
return [0,
|
|
caml_call2(f, x, y),
|
|
function(a){return map2(f, xs$0, ys$0, a);}];
|
|
}
|
|
function interleave(xs, ys, param){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return caml_call1(ys, 0);
|
|
var xs$0 = match[2], x = match[1];
|
|
return [0, x, function(a){return interleave(ys, xs$0, a);}];
|
|
}
|
|
function sorted_merge1(cmp, x, xs, y, ys){
|
|
return 0 < caml_call2(cmp, x, y)
|
|
? [0,
|
|
y,
|
|
function(param){
|
|
var match = caml_call1(ys, 0);
|
|
if(! match) return [0, x, xs];
|
|
var ys$0 = match[2], y = match[1];
|
|
return sorted_merge1(cmp, x, xs, y, ys$0);
|
|
}]
|
|
: [0,
|
|
x,
|
|
function(param){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return [0, y, ys];
|
|
var xs$0 = match[2], x = match[1];
|
|
return sorted_merge1(cmp, x, xs$0, y, ys);
|
|
}];
|
|
}
|
|
function sorted_merge(cmp, xs, ys, param){
|
|
var match = caml_call1(xs, 0), match$0 = caml_call1(ys, 0);
|
|
if(match){
|
|
if(match$0){
|
|
var ys$0 = match$0[2], y = match$0[1], xs$0 = match[2], x = match[1];
|
|
return sorted_merge1(cmp, x, xs$0, y, ys$0);
|
|
}
|
|
var c = match;
|
|
}
|
|
else{if(! match$0) return 0; var c = match$0;}
|
|
return c;
|
|
}
|
|
function map_fst(xys, param){
|
|
var match = caml_call1(xys, 0);
|
|
if(! match) return 0;
|
|
var xys$0 = match[2], x = match[1][1];
|
|
return [0, x, function(a){return map_fst(xys$0, a);}];
|
|
}
|
|
function map_snd(xys, param){
|
|
var match = caml_call1(xys, 0);
|
|
if(! match) return 0;
|
|
var xys$0 = match[2], y = match[1][2];
|
|
return [0, y, function(a){return map_snd(xys$0, a);}];
|
|
}
|
|
function unzip(xys){
|
|
return [0,
|
|
function(a){return map_fst(xys, a);},
|
|
function(a){return map_snd(xys, a);}];
|
|
}
|
|
function filter_map_find_left_map(f, xs$1, param){
|
|
var xs = xs$1;
|
|
for(;;){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 0;
|
|
var xs$0 = match[2], x = match[1], match$0 = caml_call1(f, x);
|
|
if(0 === match$0[0]) break;
|
|
xs = xs$0;
|
|
}
|
|
var y = match$0[1];
|
|
return [0, y, function(a){return filter_map_find_left_map(f, xs$0, a);}];
|
|
}
|
|
function filter_map_find_right_map(f, xs$1, param){
|
|
var xs = xs$1;
|
|
for(;;){
|
|
var match = caml_call1(xs, 0);
|
|
if(! match) return 0;
|
|
var xs$0 = match[2], x = match[1], match$0 = caml_call1(f, x);
|
|
if(0 !== match$0[0]) break;
|
|
xs = xs$0;
|
|
}
|
|
var z = match$0[1];
|
|
return [0, z, function(a){return filter_map_find_right_map(f, xs$0, a);}];
|
|
}
|
|
function partition_map(f, xs){
|
|
return [0,
|
|
function(a){return filter_map_find_left_map(f, xs, a);},
|
|
function(a){return filter_map_find_right_map(f, xs, a);}];
|
|
}
|
|
function partition(p, xs){
|
|
function a(x){return 1 - caml_call1(p, x);}
|
|
return [0,
|
|
function(a){return filter(p, xs, a);},
|
|
function(b){return filter(a, xs, b);}];
|
|
}
|
|
function peel(xss){
|
|
return unzip(function(a){return filter_map(uncons, xss, a);});
|
|
}
|
|
var b = [0, "seq.ml", 616, 4];
|
|
function transpose(xss, param){
|
|
var match = peel(xss), tails = match[2], heads = match[1];
|
|
if(! is_empty(heads))
|
|
return [0, heads, function(a){return transpose(tails, a);}];
|
|
if(is_empty(tails)) return 0;
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, b], 1);
|
|
}
|
|
function a(remainders, xss, param){
|
|
var match = caml_call1(xss, 0);
|
|
if(! match) return transpose(remainders, 0);
|
|
var xss$0 = match[2], xs = match[1], match$0 = caml_call1(xs, 0);
|
|
if(match$0){
|
|
var
|
|
xs$0 = match$0[2],
|
|
x = match$0[1],
|
|
match$1 = peel(remainders),
|
|
tails = match$1[2],
|
|
heads = match$1[1],
|
|
b = function(param){return [0, xs$0, tails];};
|
|
return [0,
|
|
function(param){return [0, x, heads];},
|
|
function(c){return a(b, xss$0, c);}];
|
|
}
|
|
var
|
|
match$2 = peel(remainders),
|
|
tails$0 = match$2[2],
|
|
heads$0 = match$2[1];
|
|
return [0, heads$0, function(b){return a(tails$0, xss$0, b);}];
|
|
}
|
|
function map_product(f, xs, ys){
|
|
function c(x){
|
|
function a(y){return caml_call2(f, x, y);}
|
|
return function(b){return map(a, ys, b);};
|
|
}
|
|
function xss(a){return map(c, xs, a);}
|
|
function b(b){return a(empty, xss, b);}
|
|
return function(a){return concat(b, a);};
|
|
}
|
|
function product(xs, ys){
|
|
return map_product(function(x, y){return [0, x, y];}, xs, ys);
|
|
}
|
|
function of_dispenser(it){
|
|
function c(param){
|
|
var match = caml_call1(it, 0);
|
|
if(! match) return 0;
|
|
var x = match[1];
|
|
return [0, x, c];
|
|
}
|
|
return c;
|
|
}
|
|
function to_dispenser(xs){
|
|
var s = [0, xs];
|
|
return function(param){
|
|
var match = caml_call1(s[1], 0);
|
|
if(! match) return 0;
|
|
var xs = match[2], x = match[1];
|
|
s[1] = xs;
|
|
return [0, x];};
|
|
}
|
|
function ints(i, param){
|
|
var a = i + 1 | 0;
|
|
return [0, i, function(b){return ints(a, b);}];
|
|
}
|
|
runtime.caml_register_global
|
|
(10,
|
|
[0,
|
|
is_empty,
|
|
uncons,
|
|
length,
|
|
iter,
|
|
fold_left,
|
|
iteri,
|
|
fold_lefti,
|
|
for_all,
|
|
exists,
|
|
find,
|
|
find_index,
|
|
find_map,
|
|
find_mapi,
|
|
iter2,
|
|
fold_left2,
|
|
for_all2,
|
|
exists2,
|
|
equal,
|
|
compare,
|
|
empty,
|
|
return$,
|
|
cons,
|
|
init,
|
|
unfold,
|
|
repeat,
|
|
forever,
|
|
cycle,
|
|
iterate,
|
|
map,
|
|
mapi,
|
|
filter,
|
|
filter_map,
|
|
scan,
|
|
take,
|
|
drop,
|
|
take_while,
|
|
drop_while,
|
|
group,
|
|
memoize,
|
|
Forced_twice,
|
|
once,
|
|
transpose,
|
|
append,
|
|
concat,
|
|
flat_map,
|
|
flat_map,
|
|
zip,
|
|
map2,
|
|
interleave,
|
|
sorted_merge,
|
|
product,
|
|
map_product,
|
|
unzip,
|
|
unzip,
|
|
partition_map,
|
|
partition,
|
|
of_dispenser,
|
|
to_dispenser,
|
|
ints],
|
|
"Stdlib__Seq");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 1849 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Option:[N,F(1)*,F(2)*,F(1),F(2),F(1)*,F(2),F(3),F(2),F(1)*,F(1)*,F(3),F(3),F(2)*,F(1)*,F(1)*->F(1)*]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var runtime = globalThis.jsoo_runtime;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib_Seq = global_data.Stdlib__Seq,
|
|
Stdlib = global_data.Stdlib;
|
|
function some(v){return [0, v];}
|
|
function value(o, default$){
|
|
if(! o) return default$;
|
|
var v = o[1];
|
|
return v;
|
|
}
|
|
function get(param){
|
|
if(! param) return Stdlib[1].call(null, "option is None");
|
|
var v = param[1];
|
|
return v;
|
|
}
|
|
function bind(o, f){
|
|
if(! o) return 0;
|
|
var v = o[1];
|
|
return caml_call1(f, v);
|
|
}
|
|
function join(param){if(! param) return 0; var o = param[1]; return o;}
|
|
function map(f, o){
|
|
if(! o) return 0;
|
|
var v = o[1];
|
|
return [0, caml_call1(f, v)];
|
|
}
|
|
function fold(none, some, param){
|
|
if(! param) return none;
|
|
var v = param[1];
|
|
return caml_call1(some, v);
|
|
}
|
|
function iter(f, param){
|
|
if(! param) return 0;
|
|
var v = param[1];
|
|
return caml_call1(f, v);
|
|
}
|
|
function is_none(param){return param ? 0 : 1;}
|
|
function is_some(param){return param ? 1 : 0;}
|
|
function equal(eq, o0, o1){
|
|
if(o0){
|
|
if(o1){var v1 = o1[1], v0 = o0[1]; return caml_call2(eq, v0, v1);}
|
|
}
|
|
else if(! o1) return 1;
|
|
return 0;
|
|
}
|
|
function compare(cmp, o0, o1){
|
|
if(! o0) return o1 ? -1 : 0;
|
|
var v0 = o0[1];
|
|
if(! o1) return 1;
|
|
var v1 = o1[1];
|
|
return caml_call2(cmp, v0, v1);
|
|
}
|
|
function to_result(none, param){
|
|
if(! param) return [1, none];
|
|
var v = param[1];
|
|
return [0, v];
|
|
}
|
|
function to_list(param){
|
|
if(! param) return 0;
|
|
var v = param[1];
|
|
return [0, v, 0];
|
|
}
|
|
function to_seq(param){
|
|
if(! param) return Stdlib_Seq[20];
|
|
var v = param[1], a = Stdlib_Seq[21];
|
|
return function(b){return a(v, b);};
|
|
}
|
|
runtime.caml_register_global
|
|
(3,
|
|
[0,
|
|
0,
|
|
some,
|
|
value,
|
|
get,
|
|
bind,
|
|
join,
|
|
map,
|
|
fold,
|
|
iter,
|
|
is_none,
|
|
is_some,
|
|
equal,
|
|
compare,
|
|
to_result,
|
|
to_list,
|
|
to_seq],
|
|
"Stdlib__Option");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 2121 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Char:[F(1),F(1),F(1)*,F(1)*,F(2)*,F(2)*,F(2)*,F(1)*]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set,
|
|
caml_create_bytes = runtime.caml_create_bytes,
|
|
caml_hash = runtime.caml_hash,
|
|
caml_string_of_bytes = runtime.caml_string_of_bytes,
|
|
Stdlib = runtime.caml_get_global_data().Stdlib;
|
|
function chr(n){
|
|
if(0 <= n && 255 >= n) return n;
|
|
return Stdlib[1].call(null, "Char.chr");
|
|
}
|
|
function escaped(c){
|
|
a:
|
|
{
|
|
if(40 <= c){
|
|
if(92 === c) return "\\\\";
|
|
if(127 <= c) break a;
|
|
}
|
|
else{
|
|
if(32 > c){
|
|
if(14 <= c) break a;
|
|
switch(c){
|
|
case 8:
|
|
return "\\b";
|
|
case 9:
|
|
return "\\t";
|
|
case 10:
|
|
return "\\n";
|
|
case 13:
|
|
return "\\r";
|
|
default: break a;
|
|
}
|
|
}
|
|
if(39 <= c) return "\\'";
|
|
}
|
|
var s$0 = caml_create_bytes(1);
|
|
caml_bytes_unsafe_set(s$0, 0, c);
|
|
return caml_string_of_bytes(s$0);
|
|
}
|
|
var s = caml_create_bytes(4);
|
|
caml_bytes_unsafe_set(s, 0, 92);
|
|
caml_bytes_unsafe_set(s, 1, 48 + (c / 100 | 0) | 0);
|
|
caml_bytes_unsafe_set(s, 2, 48 + ((c / 10 | 0) % 10 | 0) | 0);
|
|
caml_bytes_unsafe_set(s, 3, 48 + (c % 10 | 0) | 0);
|
|
return caml_string_of_bytes(s);
|
|
}
|
|
function lowercase_ascii(c){return 25 < c - 65 >>> 0 ? c : c + 32 | 0;}
|
|
function uppercase_ascii(c){return 25 < c - 97 >>> 0 ? c : c - 32 | 0;}
|
|
function compare(c1, c2){return c1 - c2 | 0;}
|
|
function equal(c1, c2){return 0 === (c1 - c2 | 0) ? 1 : 0;}
|
|
function seeded_hash(seed, x){return caml_hash(10, 100, seed, x);}
|
|
function hash(x){return caml_hash(10, 100, 0, x);}
|
|
runtime.caml_register_global
|
|
(8,
|
|
[0,
|
|
chr,
|
|
escaped,
|
|
lowercase_ascii,
|
|
uppercase_ascii,
|
|
compare,
|
|
equal,
|
|
seeded_hash,
|
|
hash],
|
|
"Stdlib__Char");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 2195 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Uchar:[N,N,N,N,F(1),F(1),F(1)*,F(1),F(1)*,F(1)*,F(1)*,F(1)*,F(1),F(1)*,F(2)*,F(2)*,F(1)*,F(1)*,F(1)*,F(1)*,F(2)*,F(1)*,F(1),F(1)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_format_int = runtime.caml_format_int,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
global_data = runtime.caml_get_global_data(),
|
|
Assert_failure = global_data.Assert_failure,
|
|
Stdlib = global_data.Stdlib;
|
|
function succ(u){
|
|
return u === 55295
|
|
? 57344
|
|
: u
|
|
=== 1114111
|
|
? Stdlib[1].call(null, "U+10FFFF has no successor")
|
|
: u + 1 | 0;
|
|
}
|
|
function pred(u){
|
|
return u === 57344
|
|
? 55295
|
|
: u
|
|
=== 0
|
|
? Stdlib[1].call(null, "U+0000 has no predecessor")
|
|
: u - 1 | 0;
|
|
}
|
|
function is_valid(i){
|
|
var a = 0 <= i ? 1 : 0, b = a ? i <= 55295 ? 1 : 0 : a;
|
|
if(b)
|
|
var c = b;
|
|
else
|
|
var d = 57344 <= i ? 1 : 0, c = d ? i <= 1114111 ? 1 : 0 : d;
|
|
return c;
|
|
}
|
|
function of_int(i){
|
|
if(is_valid(i)) return i;
|
|
var
|
|
a =
|
|
Stdlib[28].call
|
|
(null, caml_format_int("%X", i), " is not an Unicode scalar value");
|
|
return Stdlib[1].call(null, a);
|
|
}
|
|
function is_char(u){return u < 256 ? 1 : 0;}
|
|
function of_char(c){return c;}
|
|
function to_char(u){
|
|
if(255 >= u) return u;
|
|
var
|
|
a =
|
|
Stdlib[28].call
|
|
(null, caml_format_int("%04X", u), " is not a latin1 character"),
|
|
b = Stdlib[28].call(null, "U+", a);
|
|
return Stdlib[1].call(null, b);
|
|
}
|
|
function unsafe_to_char(a){return a;}
|
|
function equal(b, a){return b === a ? 1 : 0;}
|
|
var compare = runtime.caml_int_compare;
|
|
function hash(a){return a;}
|
|
function utf_decode_is_valid(d){return 1 === (d >>> 27 | 0) ? 1 : 0;}
|
|
function utf_decode_length(d){return (d >>> 24 | 0) & 7;}
|
|
function utf_decode_uchar(d){return d & 16777215;}
|
|
function utf_decode(n, u){return (8 | n) << 24 | u;}
|
|
function utf_decode_invalid(n){return n << 24 | 65533;}
|
|
var
|
|
cst_uchar_ml = "uchar.ml",
|
|
a = [0, cst_uchar_ml, 85, 7],
|
|
b = [0, cst_uchar_ml, 80, 18];
|
|
function utf_8_byte_length(u){
|
|
if(0 > u) throw caml_maybe_attach_backtrace([0, Assert_failure, b], 1);
|
|
if(127 >= u) return 1;
|
|
if(2047 >= u) return 2;
|
|
if(65535 >= u) return 3;
|
|
if(1114111 < u)
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, a], 1);
|
|
return 4;
|
|
}
|
|
var c = [0, cst_uchar_ml, 91, 7], d = [0, cst_uchar_ml, 88, 18];
|
|
function utf_16_byte_length(u){
|
|
if(0 > u) throw caml_maybe_attach_backtrace([0, Assert_failure, d], 1);
|
|
if(65535 >= u) return 2;
|
|
if(1114111 < u)
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, c], 1);
|
|
return 4;
|
|
}
|
|
var
|
|
Stdlib_Uchar =
|
|
[0,
|
|
0,
|
|
1114111,
|
|
65279,
|
|
65533,
|
|
succ,
|
|
pred,
|
|
is_valid,
|
|
of_int,
|
|
function(a){return a;},
|
|
function(a){return a;},
|
|
is_char,
|
|
of_char,
|
|
to_char,
|
|
unsafe_to_char,
|
|
equal,
|
|
compare,
|
|
hash,
|
|
utf_decode_is_valid,
|
|
utf_decode_uchar,
|
|
utf_decode_length,
|
|
utf_decode,
|
|
utf_decode_invalid,
|
|
utf_8_byte_length,
|
|
utf_16_byte_length];
|
|
runtime.caml_register_global(13, Stdlib_Uchar, "Stdlib__Uchar");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 2313 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__List:[F(1),F(2),F(2),F(1)*,F(2)*,F(1),F(1),F(2),F(2),F(1),F(2),F(2),F(2),F(1),F(1),F(3),F(3),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(3),F(3),F(3),F(3),F(3),F(3),F(4),F(4),F(2),F(2),F(3),F(3),F(2),F(2),F(2),F(2),F(1)*->F(1),F(2),F(1)*->F(1),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(1),F(2),F(2),F(2),F(2),F(2),F(3),F(1)*->F(1)*,F(1)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_compare = runtime.caml_compare,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
function caml_call3(f, a0, a1, a2){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 3
|
|
? f(a0, a1, a2)
|
|
: runtime.caml_call_gen(f, [a0, a1, a2]);
|
|
}
|
|
var Stdlib = runtime.caml_get_global_data().Stdlib;
|
|
function length(l$0){
|
|
var len = 0, param = l$0;
|
|
for(;;){
|
|
if(! param) return len;
|
|
var l = param[2], len$0 = len + 1 | 0;
|
|
len = len$0;
|
|
param = l;
|
|
}
|
|
}
|
|
function cons(a, l){return [0, a, l];}
|
|
function hd(param){
|
|
if(! param) return Stdlib[2].call(null, "hd");
|
|
var a = param[1];
|
|
return a;
|
|
}
|
|
function tl(param){
|
|
if(! param) return Stdlib[2].call(null, "tl");
|
|
var l = param[2];
|
|
return l;
|
|
}
|
|
var cst_List_nth = "List.nth";
|
|
function nth(l, n){
|
|
if(0 > n) return Stdlib[1].call(null, cst_List_nth);
|
|
var l$0 = l, n$0 = n;
|
|
for(;;){
|
|
if(! l$0) return Stdlib[2].call(null, "nth");
|
|
var l$1 = l$0[2], a = l$0[1];
|
|
if(0 === n$0) return a;
|
|
var n$1 = n$0 - 1 | 0;
|
|
l$0 = l$1;
|
|
n$0 = n$1;
|
|
}
|
|
}
|
|
function nth_opt(l, n){
|
|
if(0 > n) return Stdlib[1].call(null, cst_List_nth);
|
|
var l$0 = l, n$0 = n;
|
|
for(;;){
|
|
if(! l$0) return 0;
|
|
var l$1 = l$0[2], a = l$0[1];
|
|
if(0 === n$0) return [0, a];
|
|
var n$1 = n$0 - 1 | 0;
|
|
l$0 = l$1;
|
|
n$0 = n$1;
|
|
}
|
|
}
|
|
var append = Stdlib[37];
|
|
function rev_append(l1$1, l2$1){
|
|
var l1 = l1$1, l2 = l2$1;
|
|
for(;;){
|
|
if(! l1) return l2;
|
|
var l1$0 = l1[2], a = l1[1], l2$0 = [0, a, l2];
|
|
l1 = l1$0;
|
|
l2 = l2$0;
|
|
}
|
|
}
|
|
function rev(l){return rev_append(l, 0);}
|
|
function init(len, f){
|
|
if(0 > len) return Stdlib[1].call(null, "List.init");
|
|
var last = len - 1 | 0;
|
|
if(last < 0) return 0;
|
|
var i$1 = 0;
|
|
if(0 === last) return [0, caml_call1(f, i$1), 0];
|
|
var
|
|
r1 = caml_call1(f, i$1),
|
|
r2 = caml_call1(f, 1),
|
|
block = [0, r2, 24029],
|
|
dst = block,
|
|
offset = 1,
|
|
i = 2;
|
|
for(;;){
|
|
if(last < i)
|
|
dst[offset + 1] = 0;
|
|
else{
|
|
if(i !== last){
|
|
var
|
|
r1$0 = caml_call1(f, i),
|
|
r2$0 = caml_call1(f, i + 1 | 0),
|
|
dst$0 = [0, r2$0, 24029];
|
|
dst[offset + 1] = [0, r1$0, dst$0];
|
|
var i$0 = i + 2 | 0;
|
|
dst = dst$0;
|
|
offset = 1;
|
|
i = i$0;
|
|
continue;
|
|
}
|
|
dst[offset + 1] = [0, caml_call1(f, i), 0];
|
|
}
|
|
return [0, r1, block];
|
|
}
|
|
}
|
|
function flatten(param){
|
|
if(! param) return 0;
|
|
var r = param[2], l = param[1], a = flatten(r);
|
|
return Stdlib[37].call(null, l, a);
|
|
}
|
|
function map(f, param){
|
|
if(! param) return 0;
|
|
var match = param[2], a1 = param[1];
|
|
if(! match){var r1$0 = caml_call1(f, a1); return [0, r1$0, 0];}
|
|
var
|
|
l = match[2],
|
|
a2 = match[1],
|
|
r1 = caml_call1(f, a1),
|
|
r2 = caml_call1(f, a2),
|
|
block = [0, r2, 24029],
|
|
dst = block,
|
|
offset = 1,
|
|
param$0 = l;
|
|
for(;;){
|
|
if(param$0){
|
|
var match$0 = param$0[2], a1$0 = param$0[1];
|
|
if(match$0){
|
|
var
|
|
l$0 = match$0[2],
|
|
a2$0 = match$0[1],
|
|
r1$1 = caml_call1(f, a1$0),
|
|
r2$0 = caml_call1(f, a2$0),
|
|
dst$0 = [0, r2$0, 24029];
|
|
dst[offset + 1] = [0, r1$1, dst$0];
|
|
dst = dst$0;
|
|
offset = 1;
|
|
param$0 = l$0;
|
|
continue;
|
|
}
|
|
var r1$2 = caml_call1(f, a1$0);
|
|
dst[offset + 1] = [0, r1$2, 0];
|
|
}
|
|
else
|
|
dst[offset + 1] = 0;
|
|
return [0, r1, block];
|
|
}
|
|
}
|
|
function mapi(f, l$1){
|
|
if(! l$1) return 0;
|
|
var match = l$1[2], a1 = l$1[1], i$1 = 0;
|
|
if(! match){var r1$0 = caml_call2(f, i$1, a1); return [0, r1$0, 0];}
|
|
var
|
|
l = match[2],
|
|
a2 = match[1],
|
|
r1 = caml_call2(f, i$1, a1),
|
|
r2 = caml_call2(f, 1, a2),
|
|
block = [0, r2, 24029],
|
|
dst = block,
|
|
offset = 1,
|
|
i = 2,
|
|
param = l;
|
|
for(;;){
|
|
if(param){
|
|
var match$0 = param[2], a1$0 = param[1];
|
|
if(match$0){
|
|
var
|
|
l$0 = match$0[2],
|
|
a2$0 = match$0[1],
|
|
r1$1 = caml_call2(f, i, a1$0),
|
|
r2$0 = caml_call2(f, i + 1 | 0, a2$0),
|
|
dst$0 = [0, r2$0, 24029];
|
|
dst[offset + 1] = [0, r1$1, dst$0];
|
|
var i$0 = i + 2 | 0;
|
|
dst = dst$0;
|
|
offset = 1;
|
|
i = i$0;
|
|
param = l$0;
|
|
continue;
|
|
}
|
|
var r1$2 = caml_call2(f, i, a1$0);
|
|
dst[offset + 1] = [0, r1$2, 0];
|
|
}
|
|
else
|
|
dst[offset + 1] = 0;
|
|
return [0, r1, block];
|
|
}
|
|
}
|
|
function rev_map(f, l){
|
|
var accu = 0, param = l;
|
|
for(;;){
|
|
if(! param) return accu;
|
|
var l$0 = param[2], a = param[1], accu$0 = [0, caml_call1(f, a), accu];
|
|
accu = accu$0;
|
|
param = l$0;
|
|
}
|
|
}
|
|
function iter(f, param$0){
|
|
var param = param$0;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var l = param[2], a = param[1];
|
|
caml_call1(f, a);
|
|
param = l;
|
|
}
|
|
}
|
|
function iteri(f, l$0){
|
|
var i = 0, param = l$0;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var l = param[2], a = param[1];
|
|
caml_call2(f, i, a);
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
param = l;
|
|
}
|
|
}
|
|
function fold_left(f, accu$1, l$1){
|
|
var accu = accu$1, l = l$1;
|
|
for(;;){
|
|
if(! l) return accu;
|
|
var l$0 = l[2], a = l[1], accu$0 = caml_call2(f, accu, a);
|
|
accu = accu$0;
|
|
l = l$0;
|
|
}
|
|
}
|
|
function fold_right(f, l, accu){
|
|
if(! l) return accu;
|
|
var l$0 = l[2], a = l[1];
|
|
return caml_call2(f, a, fold_right(f, l$0, accu));
|
|
}
|
|
function map2(f, l1, l2){
|
|
var cst_List_map2 = "List.map2";
|
|
if(l1){
|
|
var a = l1[2], a1 = l1[1];
|
|
if(a){
|
|
if(l2){
|
|
var match = l2[2];
|
|
if(match){
|
|
var
|
|
l2$0 = match[2],
|
|
b2 = match[1],
|
|
b1 = l2[1],
|
|
l1$0 = a[2],
|
|
a2 = a[1],
|
|
r1 = caml_call2(f, a1, b1),
|
|
r2 = caml_call2(f, a2, b2),
|
|
block = [0, r2, 24029],
|
|
dst = block,
|
|
offset = 1,
|
|
l1$1 = l1$0,
|
|
l2$1 = l2$0;
|
|
for(;;){
|
|
a:
|
|
{
|
|
if(l1$1){
|
|
var b = l1$1[2], a1$0 = l1$1[1];
|
|
if(b){
|
|
if(l2$1){
|
|
var match$0 = l2$1[2];
|
|
if(match$0){
|
|
var
|
|
l2$2 = match$0[2],
|
|
b2$0 = match$0[1],
|
|
b1$1 = l2$1[1],
|
|
l1$2 = b[2],
|
|
a2$0 = b[1],
|
|
r1$1 = caml_call2(f, a1$0, b1$1),
|
|
r2$0 = caml_call2(f, a2$0, b2$0),
|
|
dst$0 = [0, r2$0, 24029];
|
|
dst[offset + 1] = [0, r1$1, dst$0];
|
|
dst = dst$0;
|
|
offset = 1;
|
|
l1$1 = l1$2;
|
|
l2$1 = l2$2;
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
else if(l2$1 && ! l2$1[2]){
|
|
var b1$2 = l2$1[1], r1$2 = caml_call2(f, a1$0, b1$2);
|
|
dst[offset + 1] = [0, r1$2, 0];
|
|
break a;
|
|
}
|
|
}
|
|
else if(! l2$1){dst[offset + 1] = 0; break a;}
|
|
dst[offset + 1] = Stdlib[1].call(null, cst_List_map2);
|
|
}
|
|
return [0, r1, block];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if(l2 && ! l2[2]){
|
|
var b1$0 = l2[1], r1$0 = caml_call2(f, a1, b1$0);
|
|
return [0, r1$0, 0];
|
|
}
|
|
}
|
|
else if(! l2) return 0;
|
|
return Stdlib[1].call(null, cst_List_map2);
|
|
}
|
|
function rev_map2(f, l1, l2){
|
|
var accu = 0, l1$0 = l1, l2$0 = l2;
|
|
for(;;){
|
|
if(l1$0){
|
|
if(l2$0){
|
|
var
|
|
l2$1 = l2$0[2],
|
|
a2 = l2$0[1],
|
|
l1$1 = l1$0[2],
|
|
a1 = l1$0[1],
|
|
accu$0 = [0, caml_call2(f, a1, a2), accu];
|
|
accu = accu$0;
|
|
l1$0 = l1$1;
|
|
l2$0 = l2$1;
|
|
continue;
|
|
}
|
|
}
|
|
else if(! l2$0) return accu;
|
|
return Stdlib[1].call(null, "List.rev_map2");
|
|
}
|
|
}
|
|
function iter2(f, l1$1, l2$1){
|
|
var l1 = l1$1, l2 = l2$1;
|
|
for(;;){
|
|
if(l1){
|
|
if(l2){
|
|
var l2$0 = l2[2], a2 = l2[1], l1$0 = l1[2], a1 = l1[1];
|
|
caml_call2(f, a1, a2);
|
|
l1 = l1$0;
|
|
l2 = l2$0;
|
|
continue;
|
|
}
|
|
}
|
|
else if(! l2) return 0;
|
|
return Stdlib[1].call(null, "List.iter2");
|
|
}
|
|
}
|
|
function fold_left2(f, accu$1, l1$1, l2$1){
|
|
var accu = accu$1, l1 = l1$1, l2 = l2$1;
|
|
for(;;){
|
|
if(l1){
|
|
if(l2){
|
|
var
|
|
l2$0 = l2[2],
|
|
a2 = l2[1],
|
|
l1$0 = l1[2],
|
|
a1 = l1[1],
|
|
accu$0 = caml_call3(f, accu, a1, a2);
|
|
accu = accu$0;
|
|
l1 = l1$0;
|
|
l2 = l2$0;
|
|
continue;
|
|
}
|
|
}
|
|
else if(! l2) return accu;
|
|
return Stdlib[1].call(null, "List.fold_left2");
|
|
}
|
|
}
|
|
function fold_right2(f, l1, l2, accu){
|
|
if(l1){
|
|
if(l2){
|
|
var l2$0 = l2[2], a2 = l2[1], l1$0 = l1[2], a1 = l1[1];
|
|
return caml_call3(f, a1, a2, fold_right2(f, l1$0, l2$0, accu));
|
|
}
|
|
}
|
|
else if(! l2) return accu;
|
|
return Stdlib[1].call(null, "List.fold_right2");
|
|
}
|
|
function for_all(p, param$0){
|
|
var param = param$0;
|
|
for(;;){
|
|
if(! param) return 1;
|
|
var l = param[2], a = param[1], b = caml_call1(p, a);
|
|
if(! b) return b;
|
|
param = l;
|
|
}
|
|
}
|
|
function exists(p, param$0){
|
|
var param = param$0;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var l = param[2], a = param[1], b = caml_call1(p, a);
|
|
if(b) return b;
|
|
param = l;
|
|
}
|
|
}
|
|
function for_all2(p, l1$1, l2$1){
|
|
var l1 = l1$1, l2 = l2$1;
|
|
for(;;){
|
|
if(l1){
|
|
if(l2){
|
|
var
|
|
l2$0 = l2[2],
|
|
a2 = l2[1],
|
|
l1$0 = l1[2],
|
|
a1 = l1[1],
|
|
a = caml_call2(p, a1, a2);
|
|
if(! a) return a;
|
|
l1 = l1$0;
|
|
l2 = l2$0;
|
|
continue;
|
|
}
|
|
}
|
|
else if(! l2) return 1;
|
|
return Stdlib[1].call(null, "List.for_all2");
|
|
}
|
|
}
|
|
function exists2(p, l1$1, l2$1){
|
|
var l1 = l1$1, l2 = l2$1;
|
|
for(;;){
|
|
if(l1){
|
|
if(l2){
|
|
var
|
|
l2$0 = l2[2],
|
|
a2 = l2[1],
|
|
l1$0 = l1[2],
|
|
a1 = l1[1],
|
|
a = caml_call2(p, a1, a2);
|
|
if(a) return a;
|
|
l1 = l1$0;
|
|
l2 = l2$0;
|
|
continue;
|
|
}
|
|
}
|
|
else if(! l2) return 0;
|
|
return Stdlib[1].call(null, "List.exists2");
|
|
}
|
|
}
|
|
function mem(x, param$0){
|
|
var param = param$0;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var l = param[2], a = param[1], b = 0 === caml_compare(a, x) ? 1 : 0;
|
|
if(b) return b;
|
|
param = l;
|
|
}
|
|
}
|
|
function memq(x, param$0){
|
|
var param = param$0;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var l = param[2], a = param[1], b = a === x ? 1 : 0;
|
|
if(b) return b;
|
|
param = l;
|
|
}
|
|
}
|
|
function assoc(x, param$0){
|
|
var param = param$0;
|
|
for(;;){
|
|
if(! param) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
var l = param[2], match = param[1], b = match[2], a = match[1];
|
|
if(0 === caml_compare(a, x)) return b;
|
|
param = l;
|
|
}
|
|
}
|
|
function assoc_opt(x, param$0){
|
|
var param = param$0;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var l = param[2], match = param[1], b = match[2], a = match[1];
|
|
if(0 === caml_compare(a, x)) return [0, b];
|
|
param = l;
|
|
}
|
|
}
|
|
function assq(x, param$0){
|
|
var param = param$0;
|
|
for(;;){
|
|
if(! param) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
var l = param[2], match = param[1], b = match[2], a = match[1];
|
|
if(a === x) return b;
|
|
param = l;
|
|
}
|
|
}
|
|
function assq_opt(x, param$0){
|
|
var param = param$0;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var l = param[2], match = param[1], b = match[2], a = match[1];
|
|
if(a === x) return [0, b];
|
|
param = l;
|
|
}
|
|
}
|
|
function mem_assoc(x, param$0){
|
|
var param = param$0;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var l = param[2], a = param[1][1], b = 0 === caml_compare(a, x) ? 1 : 0;
|
|
if(b) return b;
|
|
param = l;
|
|
}
|
|
}
|
|
function mem_assq(x, param$0){
|
|
var param = param$0;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var l = param[2], a = param[1][1], b = a === x ? 1 : 0;
|
|
if(b) return b;
|
|
param = l;
|
|
}
|
|
}
|
|
function remove_assoc(x, param){
|
|
if(! param) return 0;
|
|
var l = param[2], pair = param[1], a = pair[1];
|
|
return 0 === caml_compare(a, x) ? l : [0, pair, remove_assoc(x, l)];
|
|
}
|
|
function remove_assq(x, param){
|
|
if(! param) return 0;
|
|
var l = param[2], pair = param[1], a = pair[1];
|
|
return a === x ? l : [0, pair, remove_assq(x, l)];
|
|
}
|
|
function find(p, param$0){
|
|
var param = param$0;
|
|
for(;;){
|
|
if(! param) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
var l = param[2], x = param[1];
|
|
if(caml_call1(p, x)) return x;
|
|
param = l;
|
|
}
|
|
}
|
|
function find_opt(p, param$0){
|
|
var param = param$0;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var l = param[2], x = param[1];
|
|
if(caml_call1(p, x)) return [0, x];
|
|
param = l;
|
|
}
|
|
}
|
|
function find_index(p){
|
|
return function(param$0){
|
|
var i = 0, param = param$0;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var l = param[2], a = param[1];
|
|
if(caml_call1(p, a)) return [0, i];
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
param = l;
|
|
}};
|
|
}
|
|
function find_map(f, param$0){
|
|
var param = param$0;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var l = param[2], x = param[1], result = caml_call1(f, x);
|
|
if(result) return result;
|
|
param = l;
|
|
}
|
|
}
|
|
function find_mapi(f){
|
|
return function(param$0){
|
|
var i = 0, param = param$0;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var l = param[2], x = param[1], result = caml_call2(f, i, x);
|
|
if(result) return result;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
param = l;
|
|
}};
|
|
}
|
|
function find_all(p, param$1){
|
|
var param = param$1;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var l = param[2], x = param[1];
|
|
if(caml_call1(p, x)) break;
|
|
param = l;
|
|
}
|
|
var block = [0, x, 24029], dst = block, offset = 1, param$0 = l;
|
|
for(;;){
|
|
if(! param$0){dst[offset + 1] = 0; return block;}
|
|
var l$0 = param$0[2], x$0 = param$0[1];
|
|
if(caml_call1(p, x$0)){
|
|
var dst$0 = [0, x$0, 24029];
|
|
dst[offset + 1] = dst$0;
|
|
dst = dst$0;
|
|
offset = 1;
|
|
param$0 = l$0;
|
|
}
|
|
else
|
|
param$0 = l$0;
|
|
}
|
|
}
|
|
function filteri(p, l$1){
|
|
var i = 0, param = l$1;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var l = param[2], x = param[1], i$0 = i + 1 | 0;
|
|
if(caml_call2(p, i, x)) break;
|
|
i = i$0;
|
|
param = l;
|
|
}
|
|
var
|
|
block = [0, x, 24029],
|
|
dst = block,
|
|
offset = 1,
|
|
i$1 = i$0,
|
|
param$0 = l;
|
|
for(;;){
|
|
if(! param$0){dst[offset + 1] = 0; return block;}
|
|
var l$0 = param$0[2], x$0 = param$0[1], i$2 = i$1 + 1 | 0;
|
|
if(caml_call2(p, i$1, x$0)){
|
|
var dst$0 = [0, x$0, 24029];
|
|
dst[offset + 1] = dst$0;
|
|
dst = dst$0;
|
|
offset = 1;
|
|
i$1 = i$2;
|
|
param$0 = l$0;
|
|
}
|
|
else{i$1 = i$2; param$0 = l$0;}
|
|
}
|
|
}
|
|
function filter_map(f, param$1){
|
|
var param = param$1;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var l = param[2], x = param[1], match = caml_call1(f, x);
|
|
if(match) break;
|
|
param = l;
|
|
}
|
|
var
|
|
v = match[1],
|
|
block = [0, v, 24029],
|
|
dst = block,
|
|
offset = 1,
|
|
param$0 = l;
|
|
for(;;){
|
|
if(! param$0){dst[offset + 1] = 0; return block;}
|
|
var l$0 = param$0[2], x$0 = param$0[1], match$0 = caml_call1(f, x$0);
|
|
if(match$0){
|
|
var v$0 = match$0[1], dst$0 = [0, v$0, 24029];
|
|
dst[offset + 1] = dst$0;
|
|
dst = dst$0;
|
|
offset = 1;
|
|
param$0 = l$0;
|
|
}
|
|
else
|
|
param$0 = l$0;
|
|
}
|
|
}
|
|
function concat_map(f, param$0){
|
|
var param = param$0;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var xs = param[2], x = param[1], ys = caml_call1(f, x);
|
|
if(ys) break;
|
|
param = xs;
|
|
}
|
|
var
|
|
ys$1 = ys[2],
|
|
y = ys[1],
|
|
xs$1 = xs,
|
|
ys$4 = ys$1,
|
|
offset$0 = 1,
|
|
block = [0, y, 24029],
|
|
dst$1 = block;
|
|
for(;;){
|
|
var dst = dst$1, offset = offset$0, ys$2 = ys$4;
|
|
for(;;){
|
|
if(! ys$2){
|
|
if(xs$1){
|
|
var xs$0 = xs$1[2], x$0 = xs$1[1], ys$0 = caml_call1(f, x$0);
|
|
xs$1 = xs$0;
|
|
ys$4 = ys$0;
|
|
offset$0 = offset;
|
|
dst$1 = dst;
|
|
break;
|
|
}
|
|
dst[offset + 1] = 0;
|
|
return block;
|
|
}
|
|
var ys$3 = ys$2[2], y$0 = ys$2[1], dst$0 = [0, y$0, 24029];
|
|
dst[offset + 1] = dst$0;
|
|
dst = dst$0;
|
|
offset = 1;
|
|
ys$2 = ys$3;
|
|
}
|
|
}
|
|
}
|
|
function fold_left_map(f, accu, l){
|
|
var accu$0 = accu, l_accu = 0, param = l;
|
|
for(;;){
|
|
if(! param) return [0, accu$0, rev(l_accu)];
|
|
var
|
|
l$0 = param[2],
|
|
x = param[1],
|
|
match = caml_call2(f, accu$0, x),
|
|
x$0 = match[2],
|
|
accu$1 = match[1],
|
|
l_accu$0 = [0, x$0, l_accu];
|
|
accu$0 = accu$1;
|
|
l_accu = l_accu$0;
|
|
param = l$0;
|
|
}
|
|
}
|
|
function partition(p, l){
|
|
var yes = 0, no = 0, param = l;
|
|
for(;;){
|
|
if(! param){var a = rev(no); return [0, rev(yes), a];}
|
|
var l$0 = param[2], x = param[1];
|
|
if(caml_call1(p, x)){
|
|
var yes$0 = [0, x, yes];
|
|
yes = yes$0;
|
|
param = l$0;
|
|
}
|
|
else{var no$0 = [0, x, no]; no = no$0; param = l$0;}
|
|
}
|
|
}
|
|
function partition_map(p, l){
|
|
var left = 0, right = 0, param = l;
|
|
for(;;){
|
|
if(! param){var a = rev(right); return [0, rev(left), a];}
|
|
var l$0 = param[2], x = param[1], match = caml_call1(p, x);
|
|
if(0 === match[0]){
|
|
var v = match[1], left$0 = [0, v, left];
|
|
left = left$0;
|
|
param = l$0;
|
|
}
|
|
else{
|
|
var v$0 = match[1], right$0 = [0, v$0, right];
|
|
right = right$0;
|
|
param = l$0;
|
|
}
|
|
}
|
|
}
|
|
var a = [0, 0, 0];
|
|
function split(param){
|
|
if(! param) return a;
|
|
var
|
|
l = param[2],
|
|
match = param[1],
|
|
y = match[2],
|
|
x = match[1],
|
|
match$0 = split(l),
|
|
ry = match$0[2],
|
|
rx = match$0[1];
|
|
return [0, [0, x, rx], [0, y, ry]];
|
|
}
|
|
function combine(l1, l2){
|
|
if(l1){
|
|
if(l2){
|
|
var l2$0 = l2[2], a2 = l2[1], l1$0 = l1[2], a1 = l1[1];
|
|
return [0, [0, a1, a2], combine(l1$0, l2$0)];
|
|
}
|
|
}
|
|
else if(! l2) return 0;
|
|
return Stdlib[1].call(null, "List.combine");
|
|
}
|
|
function merge(cmp, l1, l2){
|
|
if(! l1) return l2;
|
|
if(! l2) return l1;
|
|
var t2 = l2[2], h2 = l2[1], t1 = l1[2], h1 = l1[1];
|
|
return 0 < caml_call2(cmp, h1, h2)
|
|
? [0, h2, merge(cmp, l1, t2)]
|
|
: [0, h1, merge(cmp, t1, l2)];
|
|
}
|
|
function stable_sort(cmp, l){
|
|
function sort(n, l){
|
|
if(2 === n){
|
|
if(l){
|
|
var match = l[2];
|
|
if(match){
|
|
var
|
|
tl = match[2],
|
|
x2 = match[1],
|
|
x1 = l[1],
|
|
s =
|
|
0 < caml_call2(cmp, x1, x2)
|
|
? [0, x2, [0, x1, 0]]
|
|
: [0, x1, [0, x2, 0]];
|
|
return [0, s, tl];
|
|
}
|
|
}
|
|
}
|
|
else if(3 === n && l){
|
|
var a = l[2];
|
|
if(a){
|
|
var match$2 = a[2];
|
|
if(match$2){
|
|
var
|
|
tl$1 = match$2[2],
|
|
x3 = match$2[1],
|
|
x2$0 = a[1],
|
|
x1$0 = l[1],
|
|
s$0 =
|
|
0 < caml_call2(cmp, x1$0, x2$0)
|
|
? 0
|
|
< caml_call2(cmp, x1$0, x3)
|
|
? 0
|
|
< caml_call2(cmp, x2$0, x3)
|
|
? [0, x3, [0, x2$0, [0, x1$0, 0]]]
|
|
: [0, x2$0, [0, x3, [0, x1$0, 0]]]
|
|
: [0, x2$0, [0, x1$0, [0, x3, 0]]]
|
|
: 0
|
|
< caml_call2(cmp, x2$0, x3)
|
|
? 0
|
|
< caml_call2(cmp, x1$0, x3)
|
|
? [0, x3, [0, x1$0, [0, x2$0, 0]]]
|
|
: [0, x1$0, [0, x3, [0, x2$0, 0]]]
|
|
: [0, x1$0, [0, x2$0, [0, x3, 0]]];
|
|
return [0, s$0, tl$1];
|
|
}
|
|
}
|
|
}
|
|
var
|
|
n1 = n >> 1,
|
|
n2 = n - n1 | 0,
|
|
match$0 = rev_sort(n1, l),
|
|
l2$0 = match$0[2],
|
|
s1 = match$0[1],
|
|
match$1 = rev_sort(n2, l2$0),
|
|
tl$0 = match$1[2],
|
|
s2 = match$1[1],
|
|
l1 = s1,
|
|
l2 = s2,
|
|
accu = 0;
|
|
for(;;){
|
|
if(l1){
|
|
if(l2){
|
|
var t2 = l2[2], h2 = l2[1], t1 = l1[2], h1 = l1[1];
|
|
if(0 < caml_call2(cmp, h1, h2)){
|
|
var accu$0 = [0, h1, accu];
|
|
l1 = t1;
|
|
accu = accu$0;
|
|
continue;
|
|
}
|
|
var accu$1 = [0, h2, accu];
|
|
l2 = t2;
|
|
accu = accu$1;
|
|
continue;
|
|
}
|
|
var b = rev_append(l1, accu);
|
|
}
|
|
else
|
|
var b = rev_append(l2, accu);
|
|
return [0, b, tl$0];
|
|
}
|
|
}
|
|
function rev_sort(n, l){
|
|
if(2 === n){
|
|
if(l){
|
|
var match = l[2];
|
|
if(match){
|
|
var
|
|
tl = match[2],
|
|
x2 = match[1],
|
|
x1 = l[1],
|
|
s =
|
|
0 < caml_call2(cmp, x1, x2)
|
|
? [0, x1, [0, x2, 0]]
|
|
: [0, x2, [0, x1, 0]];
|
|
return [0, s, tl];
|
|
}
|
|
}
|
|
}
|
|
else if(3 === n && l){
|
|
var a = l[2];
|
|
if(a){
|
|
var match$2 = a[2];
|
|
if(match$2){
|
|
var
|
|
tl$1 = match$2[2],
|
|
x3 = match$2[1],
|
|
x2$0 = a[1],
|
|
x1$0 = l[1],
|
|
s$0 =
|
|
0 < caml_call2(cmp, x1$0, x2$0)
|
|
? 0
|
|
< caml_call2(cmp, x2$0, x3)
|
|
? [0, x1$0, [0, x2$0, [0, x3, 0]]]
|
|
: 0
|
|
< caml_call2(cmp, x1$0, x3)
|
|
? [0, x1$0, [0, x3, [0, x2$0, 0]]]
|
|
: [0, x3, [0, x1$0, [0, x2$0, 0]]]
|
|
: 0
|
|
< caml_call2(cmp, x1$0, x3)
|
|
? [0, x2$0, [0, x1$0, [0, x3, 0]]]
|
|
: 0
|
|
< caml_call2(cmp, x2$0, x3)
|
|
? [0, x2$0, [0, x3, [0, x1$0, 0]]]
|
|
: [0, x3, [0, x2$0, [0, x1$0, 0]]];
|
|
return [0, s$0, tl$1];
|
|
}
|
|
}
|
|
}
|
|
var
|
|
n1 = n >> 1,
|
|
n2 = n - n1 | 0,
|
|
match$0 = sort(n1, l),
|
|
l2$0 = match$0[2],
|
|
s1 = match$0[1],
|
|
match$1 = sort(n2, l2$0),
|
|
tl$0 = match$1[2],
|
|
s2 = match$1[1],
|
|
l1 = s1,
|
|
l2 = s2,
|
|
accu = 0;
|
|
for(;;){
|
|
if(l1){
|
|
if(l2){
|
|
var t2 = l2[2], h2 = l2[1], t1 = l1[2], h1 = l1[1];
|
|
if(0 < caml_call2(cmp, h1, h2)){
|
|
var accu$0 = [0, h2, accu];
|
|
l2 = t2;
|
|
accu = accu$0;
|
|
continue;
|
|
}
|
|
var accu$1 = [0, h1, accu];
|
|
l1 = t1;
|
|
accu = accu$1;
|
|
continue;
|
|
}
|
|
var b = rev_append(l1, accu);
|
|
}
|
|
else
|
|
var b = rev_append(l2, accu);
|
|
return [0, b, tl$0];
|
|
}
|
|
}
|
|
var len = length(l);
|
|
return 2 <= len ? sort(len, l)[1] : l;
|
|
}
|
|
function sort_uniq(cmp, l){
|
|
function sort(n, l){
|
|
if(2 === n){
|
|
if(l){
|
|
var match = l[2];
|
|
if(match){
|
|
var
|
|
tl = match[2],
|
|
x2 = match[1],
|
|
x1 = l[1],
|
|
c$0 = caml_call2(cmp, x1, x2),
|
|
s =
|
|
0 === c$0
|
|
? [0, x1, 0]
|
|
: 0 <= c$0 ? [0, x2, [0, x1, 0]] : [0, x1, [0, x2, 0]];
|
|
return [0, s, tl];
|
|
}
|
|
}
|
|
}
|
|
else if(3 === n && l){
|
|
var a = l[2];
|
|
if(a){
|
|
var match$2 = a[2];
|
|
if(match$2){
|
|
var
|
|
tl$1 = match$2[2],
|
|
x3 = match$2[1],
|
|
x2$0 = a[1],
|
|
x1$0 = l[1],
|
|
c$1 = caml_call2(cmp, x1$0, x2$0);
|
|
if(0 === c$1)
|
|
var
|
|
c$2 = caml_call2(cmp, x2$0, x3),
|
|
s$0 =
|
|
0 === c$2
|
|
? [0, x2$0, 0]
|
|
: 0 <= c$2 ? [0, x3, [0, x2$0, 0]] : [0, x2$0, [0, x3, 0]];
|
|
else if(0 <= c$1){
|
|
var c$3 = caml_call2(cmp, x1$0, x3);
|
|
if(0 === c$3)
|
|
var s$0 = [0, x2$0, [0, x1$0, 0]];
|
|
else if(0 <= c$3)
|
|
var
|
|
c$4 = caml_call2(cmp, x2$0, x3),
|
|
s$0 =
|
|
0 === c$4
|
|
? [0, x2$0, [0, x1$0, 0]]
|
|
: 0
|
|
<= c$4
|
|
? [0, x3, [0, x2$0, [0, x1$0, 0]]]
|
|
: [0, x2$0, [0, x3, [0, x1$0, 0]]];
|
|
else
|
|
var s$0 = [0, x2$0, [0, x1$0, [0, x3, 0]]];
|
|
}
|
|
else{
|
|
var c$5 = caml_call2(cmp, x2$0, x3);
|
|
if(0 === c$5)
|
|
var s$0 = [0, x1$0, [0, x2$0, 0]];
|
|
else if(0 <= c$5)
|
|
var
|
|
c$6 = caml_call2(cmp, x1$0, x3),
|
|
s$0 =
|
|
0 === c$6
|
|
? [0, x1$0, [0, x2$0, 0]]
|
|
: 0
|
|
<= c$6
|
|
? [0, x3, [0, x1$0, [0, x2$0, 0]]]
|
|
: [0, x1$0, [0, x3, [0, x2$0, 0]]];
|
|
else
|
|
var s$0 = [0, x1$0, [0, x2$0, [0, x3, 0]]];
|
|
}
|
|
return [0, s$0, tl$1];
|
|
}
|
|
}
|
|
}
|
|
var
|
|
n1 = n >> 1,
|
|
n2 = n - n1 | 0,
|
|
match$0 = rev_sort(n1, l),
|
|
l2$0 = match$0[2],
|
|
s1 = match$0[1],
|
|
match$1 = rev_sort(n2, l2$0),
|
|
tl$0 = match$1[2],
|
|
s2 = match$1[1],
|
|
l1 = s1,
|
|
l2 = s2,
|
|
accu = 0;
|
|
for(;;){
|
|
if(l1){
|
|
if(l2){
|
|
var
|
|
t2 = l2[2],
|
|
h2 = l2[1],
|
|
t1 = l1[2],
|
|
h1 = l1[1],
|
|
c = caml_call2(cmp, h1, h2);
|
|
if(0 === c){
|
|
var accu$0 = [0, h1, accu];
|
|
l1 = t1;
|
|
l2 = t2;
|
|
accu = accu$0;
|
|
continue;
|
|
}
|
|
if(0 < c){
|
|
var accu$1 = [0, h1, accu];
|
|
l1 = t1;
|
|
accu = accu$1;
|
|
continue;
|
|
}
|
|
var accu$2 = [0, h2, accu];
|
|
l2 = t2;
|
|
accu = accu$2;
|
|
continue;
|
|
}
|
|
var b = rev_append(l1, accu);
|
|
}
|
|
else
|
|
var b = rev_append(l2, accu);
|
|
return [0, b, tl$0];
|
|
}
|
|
}
|
|
function rev_sort(n, l){
|
|
if(2 === n){
|
|
if(l){
|
|
var match = l[2];
|
|
if(match){
|
|
var
|
|
tl = match[2],
|
|
x2 = match[1],
|
|
x1 = l[1],
|
|
c$0 = caml_call2(cmp, x1, x2),
|
|
s =
|
|
0 === c$0
|
|
? [0, x1, 0]
|
|
: 0 < c$0 ? [0, x1, [0, x2, 0]] : [0, x2, [0, x1, 0]];
|
|
return [0, s, tl];
|
|
}
|
|
}
|
|
}
|
|
else if(3 === n && l){
|
|
var a = l[2];
|
|
if(a){
|
|
var match$2 = a[2];
|
|
if(match$2){
|
|
var
|
|
tl$1 = match$2[2],
|
|
x3 = match$2[1],
|
|
x2$0 = a[1],
|
|
x1$0 = l[1],
|
|
c$1 = caml_call2(cmp, x1$0, x2$0);
|
|
if(0 === c$1)
|
|
var
|
|
c$2 = caml_call2(cmp, x2$0, x3),
|
|
s$0 =
|
|
0 === c$2
|
|
? [0, x2$0, 0]
|
|
: 0 < c$2 ? [0, x2$0, [0, x3, 0]] : [0, x3, [0, x2$0, 0]];
|
|
else if(0 < c$1){
|
|
var c$3 = caml_call2(cmp, x2$0, x3);
|
|
if(0 === c$3)
|
|
var s$0 = [0, x1$0, [0, x2$0, 0]];
|
|
else if(0 < c$3)
|
|
var s$0 = [0, x1$0, [0, x2$0, [0, x3, 0]]];
|
|
else
|
|
var
|
|
c$4 = caml_call2(cmp, x1$0, x3),
|
|
s$0 =
|
|
0 === c$4
|
|
? [0, x1$0, [0, x2$0, 0]]
|
|
: 0
|
|
< c$4
|
|
? [0, x1$0, [0, x3, [0, x2$0, 0]]]
|
|
: [0, x3, [0, x1$0, [0, x2$0, 0]]];
|
|
}
|
|
else{
|
|
var c$5 = caml_call2(cmp, x1$0, x3);
|
|
if(0 === c$5)
|
|
var s$0 = [0, x2$0, [0, x1$0, 0]];
|
|
else if(0 < c$5)
|
|
var s$0 = [0, x2$0, [0, x1$0, [0, x3, 0]]];
|
|
else
|
|
var
|
|
c$6 = caml_call2(cmp, x2$0, x3),
|
|
s$0 =
|
|
0 === c$6
|
|
? [0, x2$0, [0, x1$0, 0]]
|
|
: 0
|
|
< c$6
|
|
? [0, x2$0, [0, x3, [0, x1$0, 0]]]
|
|
: [0, x3, [0, x2$0, [0, x1$0, 0]]];
|
|
}
|
|
return [0, s$0, tl$1];
|
|
}
|
|
}
|
|
}
|
|
var
|
|
n1 = n >> 1,
|
|
n2 = n - n1 | 0,
|
|
match$0 = sort(n1, l),
|
|
l2$0 = match$0[2],
|
|
s1 = match$0[1],
|
|
match$1 = sort(n2, l2$0),
|
|
tl$0 = match$1[2],
|
|
s2 = match$1[1],
|
|
l1 = s1,
|
|
l2 = s2,
|
|
accu = 0;
|
|
for(;;){
|
|
if(l1){
|
|
if(l2){
|
|
var
|
|
t2 = l2[2],
|
|
h2 = l2[1],
|
|
t1 = l1[2],
|
|
h1 = l1[1],
|
|
c = caml_call2(cmp, h1, h2);
|
|
if(0 === c){
|
|
var accu$0 = [0, h1, accu];
|
|
l1 = t1;
|
|
l2 = t2;
|
|
accu = accu$0;
|
|
continue;
|
|
}
|
|
if(0 <= c){
|
|
var accu$1 = [0, h2, accu];
|
|
l2 = t2;
|
|
accu = accu$1;
|
|
continue;
|
|
}
|
|
var accu$2 = [0, h1, accu];
|
|
l1 = t1;
|
|
accu = accu$2;
|
|
continue;
|
|
}
|
|
var b = rev_append(l1, accu);
|
|
}
|
|
else
|
|
var b = rev_append(l2, accu);
|
|
return [0, b, tl$0];
|
|
}
|
|
}
|
|
var len = length(l);
|
|
return 2 <= len ? sort(len, l)[1] : l;
|
|
}
|
|
function compare_lengths(l1$1, l2$1){
|
|
var l1 = l1$1, l2 = l2$1;
|
|
for(;;){
|
|
if(! l1) return l2 ? -1 : 0;
|
|
if(! l2) return 1;
|
|
var l2$0 = l2[2], l1$0 = l1[2];
|
|
l1 = l1$0;
|
|
l2 = l2$0;
|
|
}
|
|
}
|
|
function compare_length_with(l$1, n$1){
|
|
var l = l$1, n = n$1;
|
|
for(;;){
|
|
if(! l) return 0 === n ? 0 : 0 < n ? -1 : 1;
|
|
var l$0 = l[2];
|
|
if(0 >= n) return 1;
|
|
var n$0 = n - 1 | 0;
|
|
l = l$0;
|
|
n = n$0;
|
|
}
|
|
}
|
|
function is_empty(param){return param ? 0 : 1;}
|
|
function equal(eq, l1$1, l2$1){
|
|
var l1 = l1$1, l2 = l2$1;
|
|
for(;;){
|
|
if(l1){
|
|
if(l2){
|
|
var
|
|
l2$0 = l2[2],
|
|
a2 = l2[1],
|
|
l1$0 = l1[2],
|
|
a1 = l1[1],
|
|
a = caml_call2(eq, a1, a2);
|
|
if(! a) return a;
|
|
l1 = l1$0;
|
|
l2 = l2$0;
|
|
continue;
|
|
}
|
|
}
|
|
else if(! l2) return 1;
|
|
return 0;
|
|
}
|
|
}
|
|
function compare(cmp, l1$1, l2$1){
|
|
var l1 = l1$1, l2 = l2$1;
|
|
for(;;){
|
|
if(! l1) return l2 ? -1 : 0;
|
|
var l1$0 = l1[2], a1 = l1[1];
|
|
if(! l2) return 1;
|
|
var l2$0 = l2[2], a2 = l2[1], c = caml_call2(cmp, a1, a2);
|
|
if(0 !== c) return c;
|
|
l1 = l1$0;
|
|
l2 = l2$0;
|
|
}
|
|
}
|
|
function to_seq(l){
|
|
function aux(l, param){
|
|
if(! l) return 0;
|
|
var tail = l[2], x = l[1];
|
|
return [0, x, function(a){return aux(tail, a);}];
|
|
}
|
|
return function(a){return aux(l, a);};
|
|
}
|
|
function of_seq(seq){
|
|
var match = caml_call1(seq, 0);
|
|
if(! match) return 0;
|
|
var seq$0 = match[2], x1 = match[1], match$0 = caml_call1(seq$0, 0);
|
|
if(! match$0) return [0, x1, 0];
|
|
var
|
|
seq$1 = match$0[2],
|
|
x2 = match$0[1],
|
|
block = [0, x2, 24029],
|
|
dst = block,
|
|
offset = 1,
|
|
seq$2 = seq$1;
|
|
for(;;){
|
|
var match$1 = caml_call1(seq$2, 0);
|
|
if(match$1){
|
|
var
|
|
seq$3 = match$1[2],
|
|
x1$0 = match$1[1],
|
|
match$2 = caml_call1(seq$3, 0);
|
|
if(match$2){
|
|
var seq$4 = match$2[2], x2$0 = match$2[1], dst$0 = [0, x2$0, 24029];
|
|
dst[offset + 1] = [0, x1$0, dst$0];
|
|
dst = dst$0;
|
|
offset = 1;
|
|
seq$2 = seq$4;
|
|
continue;
|
|
}
|
|
dst[offset + 1] = [0, x1$0, 0];
|
|
}
|
|
else
|
|
dst[offset + 1] = 0;
|
|
return [0, x1, block];
|
|
}
|
|
}
|
|
runtime.caml_register_global
|
|
(17,
|
|
[0,
|
|
length,
|
|
compare_lengths,
|
|
compare_length_with,
|
|
is_empty,
|
|
cons,
|
|
hd,
|
|
tl,
|
|
nth,
|
|
nth_opt,
|
|
rev,
|
|
init,
|
|
append,
|
|
rev_append,
|
|
flatten,
|
|
flatten,
|
|
equal,
|
|
compare,
|
|
iter,
|
|
iteri,
|
|
map,
|
|
mapi,
|
|
rev_map,
|
|
filter_map,
|
|
concat_map,
|
|
fold_left_map,
|
|
fold_left,
|
|
fold_right,
|
|
iter2,
|
|
map2,
|
|
rev_map2,
|
|
fold_left2,
|
|
fold_right2,
|
|
for_all,
|
|
exists,
|
|
for_all2,
|
|
exists2,
|
|
mem,
|
|
memq,
|
|
find,
|
|
find_opt,
|
|
find_index,
|
|
find_map,
|
|
find_mapi,
|
|
find_all,
|
|
find_all,
|
|
filteri,
|
|
partition,
|
|
partition_map,
|
|
assoc,
|
|
assoc_opt,
|
|
assq,
|
|
assq_opt,
|
|
mem_assoc,
|
|
mem_assq,
|
|
remove_assoc,
|
|
remove_assq,
|
|
split,
|
|
combine,
|
|
stable_sort,
|
|
stable_sort,
|
|
stable_sort,
|
|
sort_uniq,
|
|
merge,
|
|
to_seq,
|
|
of_seq],
|
|
"Stdlib__List");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 3660 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Int:[N,N,N,F(1)*,N,N,F(1)*,F(2)*,F(2)*,F(2)*,F(2)*,F(1)*,F(2)*,F(1)*]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var runtime = globalThis.jsoo_runtime, caml_hash = runtime.caml_hash;
|
|
function abs(x){return 0 <= x ? x : - x | 0;}
|
|
function lognot(x){return x ^ -1;}
|
|
function equal(b, a){return b === a ? 1 : 0;}
|
|
var compare = runtime.caml_int_compare;
|
|
function min(x, y){return x <= y ? x : y;}
|
|
function max(x, y){return y <= x ? x : y;}
|
|
function to_string(x){return "" + x;}
|
|
function seeded_hash(seed, x){return caml_hash(10, 100, seed, x);}
|
|
function hash(x){return caml_hash(10, 100, 0, x);}
|
|
runtime.caml_register_global
|
|
(1,
|
|
[0,
|
|
0,
|
|
1,
|
|
-1,
|
|
abs,
|
|
2147483647,
|
|
-2147483648,
|
|
lognot,
|
|
equal,
|
|
compare,
|
|
min,
|
|
max,
|
|
to_string,
|
|
seeded_hash,
|
|
hash],
|
|
"Stdlib__Int");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 3698 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Bytes:[F(2),F(2),N,F(1),F(1),F(1),F(3),F(3),F(3),F(4),F(5),F(5),F(2),F(2),F(2),F(2),F(2),F(2),F(3),F(3),F(2),F(2),F(1),F(1),F(2),F(2),F(2),F(2),F(3),F(3),F(3),F(3),F(2),F(3),F(3),F(1),F(1),F(1),F(1),F(2)*,F(2)*,F(2),F(2),F(1),F(1)*,F(2),F(1)*->F(1),F(1)*->F(1),F(1),F(2),F(3),F(1),F(2),F(3),F(1),F(2),F(3),F(1),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(1)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_blit_bytes = runtime.caml_blit_bytes,
|
|
caml_bswap16 = runtime.caml_bswap16,
|
|
caml_bytes_get = runtime.caml_bytes_get,
|
|
caml_bytes_get16 = runtime.caml_bytes_get16,
|
|
caml_bytes_get32 = runtime.caml_bytes_get32,
|
|
caml_bytes_get64 = runtime.caml_bytes_get64,
|
|
caml_bytes_of_string = runtime.caml_bytes_of_string,
|
|
caml_bytes_set = runtime.caml_bytes_set,
|
|
caml_bytes_set16 = runtime.caml_bytes_set16,
|
|
caml_bytes_set32 = runtime.caml_bytes_set32,
|
|
caml_bytes_set64 = runtime.caml_bytes_set64,
|
|
caml_bytes_unsafe_get = runtime.caml_bytes_unsafe_get,
|
|
caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set,
|
|
caml_create_bytes = runtime.caml_create_bytes,
|
|
caml_fill_bytes = runtime.caml_fill_bytes,
|
|
caml_int32_bswap = runtime.caml_int32_bswap,
|
|
caml_int64_bswap = runtime.caml_int64_bswap,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_ml_bytes_length = runtime.caml_ml_bytes_length,
|
|
caml_string_of_bytes = runtime.caml_string_of_bytes,
|
|
caml_wrap_exception = runtime.caml_wrap_exception;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
var
|
|
dummy = 0,
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_Uchar = global_data.Stdlib__Uchar,
|
|
Assert_failure = global_data.Assert_failure,
|
|
Stdlib_Sys = global_data.Stdlib__Sys,
|
|
Stdlib_Int = global_data.Stdlib__Int,
|
|
Stdlib_Seq = global_data.Stdlib__Seq,
|
|
Stdlib_Char = global_data.Stdlib__Char;
|
|
function make(n, c){
|
|
var s = caml_create_bytes(n);
|
|
caml_fill_bytes(s, 0, n, c);
|
|
return s;
|
|
}
|
|
function init(n, f){
|
|
var s = caml_create_bytes(n), a = n - 1 | 0;
|
|
if(a >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
caml_bytes_unsafe_set(s, i, caml_call1(f, i));
|
|
var b = i + 1 | 0;
|
|
if(a === i) break;
|
|
i = b;
|
|
}
|
|
}
|
|
return s;
|
|
}
|
|
var empty = caml_create_bytes(0);
|
|
function copy(s){
|
|
var len = caml_ml_bytes_length(s), r = caml_create_bytes(len);
|
|
caml_blit_bytes(s, 0, r, 0, len);
|
|
return r;
|
|
}
|
|
function to_string(b){return caml_string_of_bytes(copy(b));}
|
|
function of_string(s){return copy(caml_bytes_of_string(s));}
|
|
function sub(s, ofs, len){
|
|
if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs){
|
|
var r = caml_create_bytes(len);
|
|
caml_blit_bytes(s, ofs, r, 0, len);
|
|
return r;
|
|
}
|
|
return Stdlib[1].call(null, "String.sub / Bytes.sub");
|
|
}
|
|
function sub_string(b, ofs, len){
|
|
return caml_string_of_bytes(sub(b, ofs, len));
|
|
}
|
|
function symbol(a, b){
|
|
var c = a + b | 0, d = b < 0, match = c < 0;
|
|
a:
|
|
{
|
|
if(a < 0){if(! d || match) break a;} else if(d || ! match) break a;
|
|
return Stdlib[1].call(null, "Bytes.extend");
|
|
}
|
|
return c;
|
|
}
|
|
function extend(s, left, right){
|
|
var
|
|
len = symbol(symbol(caml_ml_bytes_length(s), left), right),
|
|
r = caml_create_bytes(len);
|
|
if(0 <= left)
|
|
var dstoff = left, srcoff = 0;
|
|
else
|
|
var dstoff = 0, srcoff = - left | 0;
|
|
var
|
|
cpylen =
|
|
Stdlib_Int[10].call
|
|
(null, caml_ml_bytes_length(s) - srcoff | 0, len - dstoff | 0);
|
|
if(0 < cpylen) caml_blit_bytes(s, srcoff, r, dstoff, cpylen);
|
|
return r;
|
|
}
|
|
function fill(s, ofs, len, c){
|
|
if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs)
|
|
return caml_fill_bytes(s, ofs, len, c);
|
|
return Stdlib[1].call(null, "String.fill / Bytes.fill");
|
|
}
|
|
function blit(s1, ofs1, s2, ofs2, len){
|
|
if
|
|
(0 <= len
|
|
&&
|
|
0 <= ofs1
|
|
&&
|
|
(caml_ml_bytes_length(s1) - len | 0) >= ofs1
|
|
&& 0 <= ofs2 && (caml_ml_bytes_length(s2) - len | 0) >= ofs2)
|
|
return caml_blit_bytes(s1, ofs1, s2, ofs2, len);
|
|
return Stdlib[1].call(null, "Bytes.blit");
|
|
}
|
|
function blit_string(s1, ofs1, s2, ofs2, len){
|
|
if
|
|
(0 <= len
|
|
&&
|
|
0 <= ofs1
|
|
&&
|
|
(runtime.caml_ml_string_length(s1) - len | 0) >= ofs1
|
|
&& 0 <= ofs2 && (caml_ml_bytes_length(s2) - len | 0) >= ofs2)
|
|
return runtime.caml_blit_string(s1, ofs1, s2, ofs2, len);
|
|
return Stdlib[1].call(null, "String.blit / Bytes.blit_string");
|
|
}
|
|
function iter(f, a){
|
|
var b = caml_ml_bytes_length(a) - 1 | 0;
|
|
if(b >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
caml_call1(f, caml_bytes_unsafe_get(a, i));
|
|
var c = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function iteri(f, a){
|
|
var b = caml_ml_bytes_length(a) - 1 | 0;
|
|
if(b >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
caml_call2(f, i, caml_bytes_unsafe_get(a, i));
|
|
var c = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function concat(sep, l){
|
|
if(! l) return empty;
|
|
var seplen = caml_ml_bytes_length(sep);
|
|
a:
|
|
{
|
|
var acc = 0, param = l, pos$1 = 0;
|
|
for(;;){
|
|
if(! param){var a = acc; break a;}
|
|
var hd = param[1];
|
|
if(! param[2]) break;
|
|
var
|
|
tl = param[2],
|
|
x = (caml_ml_bytes_length(hd) + seplen | 0) + acc | 0;
|
|
if(acc <= x){
|
|
acc = x;
|
|
param = tl;
|
|
}
|
|
else{acc = Stdlib[1].call(null, "Bytes.concat"); param = tl;}
|
|
}
|
|
var a = caml_ml_bytes_length(hd) + acc | 0;
|
|
}
|
|
var dst = caml_create_bytes(a), pos = pos$1, param$0 = l;
|
|
for(;;){
|
|
if(! param$0) return dst;
|
|
var hd$0 = param$0[1];
|
|
if(! param$0[2]){
|
|
caml_blit_bytes(hd$0, 0, dst, pos, caml_ml_bytes_length(hd$0));
|
|
return dst;
|
|
}
|
|
var tl$0 = param$0[2];
|
|
caml_blit_bytes(hd$0, 0, dst, pos, caml_ml_bytes_length(hd$0));
|
|
caml_blit_bytes
|
|
(sep, 0, dst, pos + caml_ml_bytes_length(hd$0) | 0, seplen);
|
|
var pos$0 = (pos + caml_ml_bytes_length(hd$0) | 0) + seplen | 0;
|
|
pos = pos$0;
|
|
param$0 = tl$0;
|
|
}
|
|
}
|
|
function cat(s1, s2){
|
|
var
|
|
l1 = caml_ml_bytes_length(s1),
|
|
l2 = caml_ml_bytes_length(s2),
|
|
r = caml_create_bytes(l1 + l2 | 0);
|
|
caml_blit_bytes(s1, 0, r, 0, l1);
|
|
caml_blit_bytes(s2, 0, r, l1, l2);
|
|
return r;
|
|
}
|
|
function is_space(param){
|
|
var a = param - 9 | 0;
|
|
a:
|
|
{
|
|
if(4 < a >>> 0){if(23 !== a) break a;} else if(2 === a) break a;
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
function trim(s){
|
|
var len = caml_ml_bytes_length(s), i = 0;
|
|
for(;;){
|
|
if(i >= len) break;
|
|
if(! is_space(caml_bytes_unsafe_get(s, i))) break;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
var j = len - 1 | 0;
|
|
for(;;){
|
|
if(i <= j && is_space(caml_bytes_unsafe_get(s, j))){var j$0 = j - 1 | 0; j = j$0; continue;}
|
|
return i <= j ? sub(s, i, (j - i | 0) + 1 | 0) : empty;
|
|
}
|
|
}
|
|
function unsafe_escape(s){
|
|
var e = caml_ml_bytes_length(s) - 1 | 0, d = 0;
|
|
if(e < 0)
|
|
var n$0 = d;
|
|
else{
|
|
var n = d, i$0 = 0;
|
|
for(;;){
|
|
var match = caml_bytes_unsafe_get(s, i$0);
|
|
a:
|
|
{
|
|
b:
|
|
{
|
|
c:
|
|
{
|
|
if(32 <= match){
|
|
var a = match - 34 | 0;
|
|
if(58 < a >>> 0){
|
|
if(93 <= a) break c;
|
|
}
|
|
else if(56 < a - 1 >>> 0) break b;
|
|
var b = 1;
|
|
break a;
|
|
}
|
|
if(11 <= match){
|
|
if(13 === match) break b;
|
|
}
|
|
else if(8 <= match) break b;
|
|
}
|
|
var b = 4;
|
|
break a;
|
|
}
|
|
var b = 2;
|
|
}
|
|
var g = n + b | 0, j = i$0 + 1 | 0;
|
|
if(e === i$0){var n$0 = g; break;}
|
|
n = g;
|
|
i$0 = j;
|
|
}
|
|
}
|
|
if(n$0 === caml_ml_bytes_length(s)) return s;
|
|
var s$0 = caml_create_bytes(n$0), f = caml_ml_bytes_length(s) - 1 | 0;
|
|
if(f >= 0){
|
|
var n$1 = 0, i = 0;
|
|
for(;;){
|
|
var c = caml_bytes_unsafe_get(s, i);
|
|
a:
|
|
{
|
|
b:
|
|
{
|
|
c:
|
|
{
|
|
if(35 <= c){
|
|
if(92 !== c){if(127 <= c) break b; break c;}
|
|
}
|
|
else{
|
|
if(32 > c){
|
|
if(14 <= c) break b;
|
|
switch(c){
|
|
case 8:
|
|
caml_bytes_unsafe_set(s$0, n$1, 92);
|
|
var n$2 = n$1 + 1 | 0;
|
|
caml_bytes_unsafe_set(s$0, n$2, 98);
|
|
var n$10 = n$2;
|
|
break a;
|
|
case 9:
|
|
caml_bytes_unsafe_set(s$0, n$1, 92);
|
|
var n$3 = n$1 + 1 | 0;
|
|
caml_bytes_unsafe_set(s$0, n$3, 116);
|
|
var n$10 = n$3;
|
|
break a;
|
|
case 10:
|
|
caml_bytes_unsafe_set(s$0, n$1, 92);
|
|
var n$4 = n$1 + 1 | 0;
|
|
caml_bytes_unsafe_set(s$0, n$4, 110);
|
|
var n$10 = n$4;
|
|
break a;
|
|
case 13:
|
|
caml_bytes_unsafe_set(s$0, n$1, 92);
|
|
var n$5 = n$1 + 1 | 0;
|
|
caml_bytes_unsafe_set(s$0, n$5, 114);
|
|
var n$10 = n$5;
|
|
break a;
|
|
default: break b;
|
|
}
|
|
}
|
|
if(34 > c) break c;
|
|
}
|
|
caml_bytes_unsafe_set(s$0, n$1, 92);
|
|
var n$9 = n$1 + 1 | 0;
|
|
caml_bytes_unsafe_set(s$0, n$9, c);
|
|
var n$10 = n$9;
|
|
break a;
|
|
}
|
|
caml_bytes_unsafe_set(s$0, n$1, c);
|
|
var n$10 = n$1;
|
|
break a;
|
|
}
|
|
caml_bytes_unsafe_set(s$0, n$1, 92);
|
|
var n$6 = n$1 + 1 | 0;
|
|
caml_bytes_unsafe_set(s$0, n$6, 48 + (c / 100 | 0) | 0);
|
|
var n$7 = n$6 + 1 | 0;
|
|
caml_bytes_unsafe_set(s$0, n$7, 48 + ((c / 10 | 0) % 10 | 0) | 0);
|
|
var n$8 = n$7 + 1 | 0;
|
|
caml_bytes_unsafe_set(s$0, n$8, 48 + (c % 10 | 0) | 0);
|
|
var n$10 = n$8;
|
|
}
|
|
var n$11 = n$10 + 1 | 0, h = i + 1 | 0;
|
|
if(f === i) break;
|
|
n$1 = n$11;
|
|
i = h;
|
|
}
|
|
}
|
|
return s$0;
|
|
}
|
|
function escaped(b){var b$0 = copy(b); return unsafe_escape(b$0);}
|
|
function map(f, s){
|
|
var l = caml_ml_bytes_length(s);
|
|
if(0 === l) return s;
|
|
var r = caml_create_bytes(l), a = l - 1 | 0;
|
|
if(a >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
caml_bytes_unsafe_set(r, i, caml_call1(f, caml_bytes_unsafe_get(s, i)));
|
|
var b = i + 1 | 0;
|
|
if(a === i) break;
|
|
i = b;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
function mapi(f, s){
|
|
var l = caml_ml_bytes_length(s);
|
|
if(0 === l) return s;
|
|
var r = caml_create_bytes(l), a = l - 1 | 0;
|
|
if(a >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
caml_bytes_unsafe_set
|
|
(r, i, caml_call2(f, i, caml_bytes_unsafe_get(s, i)));
|
|
var b = i + 1 | 0;
|
|
if(a === i) break;
|
|
i = b;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
function fold_left(f, x, a){
|
|
var b = caml_ml_bytes_length(a) - 1 | 0;
|
|
if(b < 0)
|
|
var r$0 = x;
|
|
else{
|
|
var r = x, i = 0;
|
|
for(;;){
|
|
var c = caml_call2(f, r, caml_bytes_unsafe_get(a, i)), d = i + 1 | 0;
|
|
if(b === i){var r$0 = c; break;}
|
|
r = c;
|
|
i = d;
|
|
}
|
|
}
|
|
return r$0;
|
|
}
|
|
function fold_right(f, a, x){
|
|
var b = caml_ml_bytes_length(a) - 1 | 0;
|
|
if(b < 0)
|
|
var r$0 = x;
|
|
else{
|
|
var r = x, i = b;
|
|
for(;;){
|
|
var c = caml_call2(f, caml_bytes_unsafe_get(a, i), r), d = i - 1 | 0;
|
|
if(0 === i){var r$0 = c; break;}
|
|
r = c;
|
|
i = d;
|
|
}
|
|
}
|
|
return r$0;
|
|
}
|
|
function exists(p, s){
|
|
var n = caml_ml_bytes_length(s), i = 0;
|
|
for(;;){
|
|
if(i === n) return 0;
|
|
if(caml_call1(p, caml_bytes_unsafe_get(s, i))) return 1;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function for_all(p, s){
|
|
var n = caml_ml_bytes_length(s), i = 0;
|
|
for(;;){
|
|
if(i === n) return 1;
|
|
if(! caml_call1(p, caml_bytes_unsafe_get(s, i))) return 0;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function uppercase_ascii(s){return map(Stdlib_Char[4], s);}
|
|
function lowercase_ascii(s){return map(Stdlib_Char[3], s);}
|
|
function apply1(f, s){
|
|
if(0 === caml_ml_bytes_length(s)) return s;
|
|
var r = copy(s);
|
|
caml_bytes_unsafe_set(r, 0, caml_call1(f, caml_bytes_unsafe_get(s, 0)));
|
|
return r;
|
|
}
|
|
function capitalize_ascii(s){return apply1(Stdlib_Char[4], s);}
|
|
function uncapitalize_ascii(s){return apply1(Stdlib_Char[3], s);}
|
|
function starts_with(prefix, s){
|
|
var
|
|
len_s = caml_ml_bytes_length(s),
|
|
len_pre = caml_ml_bytes_length(prefix),
|
|
a = len_pre <= len_s ? 1 : 0;
|
|
if(! a) return a;
|
|
var i = 0;
|
|
for(;;){
|
|
if(i === len_pre) return 1;
|
|
if(caml_bytes_unsafe_get(s, i) !== caml_bytes_unsafe_get(prefix, i))
|
|
return 0;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function ends_with(suffix, s){
|
|
var
|
|
len_s = caml_ml_bytes_length(s),
|
|
len_suf = caml_ml_bytes_length(suffix),
|
|
diff = len_s - len_suf | 0,
|
|
a = 0 <= diff ? 1 : 0;
|
|
if(! a) return a;
|
|
var i = 0;
|
|
for(;;){
|
|
if(i === len_suf) return 1;
|
|
if
|
|
(caml_bytes_unsafe_get(s, diff + i | 0)
|
|
!== caml_bytes_unsafe_get(suffix, i))
|
|
return 0;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function index_rec(s, lim, i$1, c){
|
|
var i = i$1;
|
|
for(;;){
|
|
if(lim <= i) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
if(caml_bytes_unsafe_get(s, i) === c) return i;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function index(s, c){return index_rec(s, caml_ml_bytes_length(s), 0, c);}
|
|
function index_rec_opt(s, lim, i$1, c){
|
|
var i = i$1;
|
|
for(;;){
|
|
if(lim <= i) return 0;
|
|
if(caml_bytes_unsafe_get(s, i) === c) return [0, i];
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function index_opt(s, c){
|
|
return index_rec_opt(s, caml_ml_bytes_length(s), 0, c);
|
|
}
|
|
function index_from(s, i, c){
|
|
var l = caml_ml_bytes_length(s);
|
|
if(0 <= i && l >= i) return index_rec(s, l, i, c);
|
|
return Stdlib[1].call(null, "String.index_from / Bytes.index_from");
|
|
}
|
|
function index_from_opt(s, i, c){
|
|
var l = caml_ml_bytes_length(s);
|
|
if(0 <= i && l >= i) return index_rec_opt(s, l, i, c);
|
|
return Stdlib[1].call
|
|
(null, "String.index_from_opt / Bytes.index_from_opt");
|
|
}
|
|
function rindex_rec(s, i$1, c){
|
|
var i = i$1;
|
|
for(;;){
|
|
if(0 > i) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
if(caml_bytes_unsafe_get(s, i) === c) return i;
|
|
var i$0 = i - 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function rindex(s, c){
|
|
return rindex_rec(s, caml_ml_bytes_length(s) - 1 | 0, c);
|
|
}
|
|
function rindex_from(s, i, c){
|
|
if(-1 <= i && caml_ml_bytes_length(s) > i) return rindex_rec(s, i, c);
|
|
return Stdlib[1].call(null, "String.rindex_from / Bytes.rindex_from");
|
|
}
|
|
function rindex_rec_opt(s, i$1, c){
|
|
var i = i$1;
|
|
for(;;){
|
|
if(0 > i) return 0;
|
|
if(caml_bytes_unsafe_get(s, i) === c) return [0, i];
|
|
var i$0 = i - 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function rindex_opt(s, c){
|
|
return rindex_rec_opt(s, caml_ml_bytes_length(s) - 1 | 0, c);
|
|
}
|
|
function rindex_from_opt(s, i, c){
|
|
if(-1 <= i && caml_ml_bytes_length(s) > i) return rindex_rec_opt(s, i, c);
|
|
return Stdlib[1].call
|
|
(null, "String.rindex_from_opt / Bytes.rindex_from_opt");
|
|
}
|
|
function contains_from(s, i, c){
|
|
var l = caml_ml_bytes_length(s);
|
|
if(0 <= i && l >= i)
|
|
try{index_rec(s, l, i, c); return 1;}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn === Stdlib[8]) return 0;
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
return Stdlib[1].call(null, "String.contains_from / Bytes.contains_from");
|
|
}
|
|
function contains(s, c){return contains_from(s, 0, c);}
|
|
function rcontains_from(s, i, c){
|
|
if(0 <= i && caml_ml_bytes_length(s) > i)
|
|
try{rindex_rec(s, i, c); return 1;}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn === Stdlib[8]) return 0;
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
return Stdlib[1].call
|
|
(null, "String.rcontains_from / Bytes.rcontains_from");
|
|
}
|
|
var compare = runtime.caml_bytes_compare;
|
|
function split_on_char(sep, s){
|
|
var
|
|
b = caml_ml_bytes_length(s),
|
|
c = caml_ml_bytes_length(s) - 1 | 0,
|
|
a = 0;
|
|
if(c < 0)
|
|
var j$1 = b, r$1 = a;
|
|
else{
|
|
var j = b, r = a, i = c;
|
|
for(;;){
|
|
if(caml_bytes_unsafe_get(s, i) === sep)
|
|
var j$0 = i, r$0 = [0, sub(s, i + 1 | 0, (j - i | 0) - 1 | 0), r];
|
|
else
|
|
var j$0 = j, r$0 = r;
|
|
var d = i - 1 | 0;
|
|
if(0 === i){var j$1 = j$0, r$1 = r$0; break;}
|
|
j = j$0;
|
|
r = r$0;
|
|
i = d;
|
|
}
|
|
}
|
|
return [0, sub(s, 0, j$1), r$1];
|
|
}
|
|
function to_seq(s){
|
|
function aux(i, param){
|
|
if(i === caml_ml_bytes_length(s)) return 0;
|
|
var x = caml_bytes_get(s, i), a = i + 1 | 0;
|
|
return [0, x, function(b){return aux(a, b);}];
|
|
}
|
|
return function(a){return aux(0, a);};
|
|
}
|
|
function to_seqi(s){
|
|
function aux(i, param){
|
|
if(i === caml_ml_bytes_length(s)) return 0;
|
|
var x = caml_bytes_get(s, i), a = i + 1 | 0;
|
|
return [0, [0, i, x], function(b){return aux(a, b);}];
|
|
}
|
|
return function(a){return aux(0, a);};
|
|
}
|
|
function of_seq(i){
|
|
var buf = [0, make(256, 0)], n = [0, 0];
|
|
Stdlib_Seq[4].call
|
|
(null,
|
|
function(c){
|
|
if(n[1] === caml_ml_bytes_length(buf[1])){
|
|
var
|
|
new_len =
|
|
Stdlib_Int[10].call
|
|
(null, 2 * caml_ml_bytes_length(buf[1]) | 0, Stdlib_Sys[12]);
|
|
if(caml_ml_bytes_length(buf[1]) === new_len)
|
|
Stdlib[2].call(null, "Bytes.of_seq: cannot grow bytes");
|
|
var new_buf = make(new_len, 0);
|
|
blit(buf[1], 0, new_buf, 0, n[1]);
|
|
buf[1] = new_buf;
|
|
}
|
|
caml_bytes_set(buf[1], n[1], c);
|
|
n[1]++;
|
|
return 0;
|
|
},
|
|
i);
|
|
return sub(buf[1], 0, n[1]);
|
|
}
|
|
function unsafe_get_uint16_le(b, i){
|
|
return Stdlib_Sys[11]
|
|
? caml_bswap16(caml_bytes_get16(b, i))
|
|
: caml_bytes_get16(b, i);
|
|
}
|
|
function unsafe_get_uint16_be(b, i){
|
|
return Stdlib_Sys[11]
|
|
? caml_bytes_get16(b, i)
|
|
: caml_bswap16(caml_bytes_get16(b, i));
|
|
}
|
|
function get_int8(b, i){
|
|
var a = Stdlib_Sys[10] - 8 | 0, c = Stdlib_Sys[10] - 8 | 0;
|
|
return caml_bytes_get(b, i) << c >> a;
|
|
}
|
|
function get_uint16_le(b, i){
|
|
return Stdlib_Sys[11]
|
|
? caml_bswap16(caml_bytes_get16(b, i))
|
|
: caml_bytes_get16(b, i);
|
|
}
|
|
function get_uint16_be(b, i){
|
|
return Stdlib_Sys[11]
|
|
? caml_bytes_get16(b, i)
|
|
: caml_bswap16(caml_bytes_get16(b, i));
|
|
}
|
|
function get_int16_ne(b, i){
|
|
var a = Stdlib_Sys[10] - 16 | 0, c = Stdlib_Sys[10] - 16 | 0;
|
|
return caml_bytes_get16(b, i) << c >> a;
|
|
}
|
|
function get_int16_le(b, i){
|
|
var a = Stdlib_Sys[10] - 16 | 0, c = Stdlib_Sys[10] - 16 | 0;
|
|
return get_uint16_le(b, i) << c >> a;
|
|
}
|
|
function get_int16_be(b, i){
|
|
var a = Stdlib_Sys[10] - 16 | 0, c = Stdlib_Sys[10] - 16 | 0;
|
|
return get_uint16_be(b, i) << c >> a;
|
|
}
|
|
function get_int32_le(b, i){
|
|
return Stdlib_Sys[11]
|
|
? caml_int32_bswap(caml_bytes_get32(b, i))
|
|
: caml_bytes_get32(b, i);
|
|
}
|
|
function get_int32_be(b, i){
|
|
return Stdlib_Sys[11]
|
|
? caml_bytes_get32(b, i)
|
|
: caml_int32_bswap(caml_bytes_get32(b, i));
|
|
}
|
|
function get_int64_le(b, i){
|
|
return Stdlib_Sys[11]
|
|
? caml_int64_bswap(caml_bytes_get64(b, i))
|
|
: caml_bytes_get64(b, i);
|
|
}
|
|
function get_int64_be(b, i){
|
|
return Stdlib_Sys[11]
|
|
? caml_bytes_get64(b, i)
|
|
: caml_int64_bswap(caml_bytes_get64(b, i));
|
|
}
|
|
function unsafe_set_uint16_le(b, i, x){
|
|
if(Stdlib_Sys[11]){caml_bytes_set16(b, i, caml_bswap16(x)); return;}
|
|
caml_bytes_set16(b, i, x);
|
|
}
|
|
function unsafe_set_uint16_be(b, i, x){
|
|
if(Stdlib_Sys[11]){caml_bytes_set16(b, i, x); return;}
|
|
caml_bytes_set16(b, i, caml_bswap16(x));
|
|
}
|
|
function set_int16_le(b, i, x){
|
|
return Stdlib_Sys[11]
|
|
? caml_bytes_set16(b, i, caml_bswap16(x))
|
|
: caml_bytes_set16(b, i, x);
|
|
}
|
|
function set_int16_be(b, i, x){
|
|
return Stdlib_Sys[11]
|
|
? caml_bytes_set16(b, i, x)
|
|
: caml_bytes_set16(b, i, caml_bswap16(x));
|
|
}
|
|
function set_int32_le(b, i, x){
|
|
return Stdlib_Sys[11]
|
|
? caml_bytes_set32(b, i, caml_int32_bswap(x))
|
|
: caml_bytes_set32(b, i, x);
|
|
}
|
|
function set_int32_be(b, i, x){
|
|
return Stdlib_Sys[11]
|
|
? caml_bytes_set32(b, i, x)
|
|
: caml_bytes_set32(b, i, caml_int32_bswap(x));
|
|
}
|
|
function set_int64_le(b, i, x){
|
|
return Stdlib_Sys[11]
|
|
? caml_bytes_set64(b, i, caml_int64_bswap(x))
|
|
: caml_bytes_set64(b, i, x);
|
|
}
|
|
function set_int64_be(b, i, x){
|
|
return Stdlib_Sys[11]
|
|
? caml_bytes_set64(b, i, x)
|
|
: caml_bytes_set64(b, i, caml_int64_bswap(x));
|
|
}
|
|
var dec_invalid = Stdlib_Uchar[22];
|
|
function dec_ret(n, u){
|
|
var a = Stdlib_Uchar[9].call(null, u);
|
|
return Stdlib_Uchar[21].call(null, n, a);
|
|
}
|
|
function not_in_x80_to_xBF(b){return 2 !== (b >>> 6 | 0) ? 1 : 0;}
|
|
function not_in_xA0_to_xBF(b){return 5 !== (b >>> 5 | 0) ? 1 : 0;}
|
|
function not_in_x80_to_x9F(b){return 4 !== (b >>> 5 | 0) ? 1 : 0;}
|
|
function not_in_x90_to_xBF(b){
|
|
var a = b < 144 ? 1 : 0, c = a || (191 < b ? 1 : 0);
|
|
return c;
|
|
}
|
|
function not_in_x80_to_x8F(b){return 8 !== (b >>> 4 | 0) ? 1 : 0;}
|
|
function utf_8_uchar_3(b0, b1, b2){
|
|
return (b0 & 15) << 12 | (b1 & 63) << 6 | b2 & 63;
|
|
}
|
|
function utf_8_uchar_4(b0, b1, b2, b3){
|
|
return (b0 & 7) << 18 | (b1 & 63) << 12 | (b2 & 63) << 6 | b3 & 63;
|
|
}
|
|
function get_utf_8_uchar(b, i){
|
|
var b0 = caml_bytes_get(b, i), max = caml_ml_bytes_length(b) - 1 | 0;
|
|
a:
|
|
{
|
|
if(224 <= b0){
|
|
if(237 <= b0){
|
|
if(245 <= b0) break a;
|
|
switch(b0 - 237 | 0){
|
|
case 0:
|
|
var i$0 = i + 1 | 0;
|
|
if(max < i$0) return dec_invalid(1);
|
|
var b1$4 = caml_bytes_unsafe_get(b, i$0);
|
|
if(not_in_x80_to_x9F(b1$4)) return dec_invalid(1);
|
|
var i$1 = i$0 + 1 | 0;
|
|
if(max < i$1) return dec_invalid(2);
|
|
var b2$3 = caml_bytes_unsafe_get(b, i$1);
|
|
return not_in_x80_to_xBF(b2$3)
|
|
? dec_invalid(2)
|
|
: dec_ret(3, utf_8_uchar_3(b0, b1$4, b2$3));
|
|
case 3:
|
|
var i$4 = i + 1 | 0;
|
|
if(max < i$4) return dec_invalid(1);
|
|
var b1$2 = caml_bytes_unsafe_get(b, i$4);
|
|
if(not_in_x90_to_xBF(b1$2)) return dec_invalid(1);
|
|
var i$5 = i$4 + 1 | 0;
|
|
if(max < i$5) return dec_invalid(2);
|
|
var b2$1 = caml_bytes_unsafe_get(b, i$5);
|
|
if(not_in_x80_to_xBF(b2$1)) return dec_invalid(2);
|
|
var i$6 = i$5 + 1 | 0;
|
|
if(max < i$6) return dec_invalid(3);
|
|
var b3$1 = caml_bytes_unsafe_get(b, i$6);
|
|
return not_in_x80_to_xBF(b3$1)
|
|
? dec_invalid(3)
|
|
: dec_ret(4, utf_8_uchar_4(b0, b1$2, b2$1, b3$1));
|
|
case 7:
|
|
var i$10 = i + 1 | 0;
|
|
if(max < i$10) return dec_invalid(1);
|
|
var b1$0 = caml_bytes_unsafe_get(b, i$10);
|
|
if(not_in_x80_to_x8F(b1$0)) return dec_invalid(1);
|
|
var i$11 = i$10 + 1 | 0;
|
|
if(max < i$11) return dec_invalid(2);
|
|
var b2 = caml_bytes_unsafe_get(b, i$11);
|
|
if(not_in_x80_to_xBF(b2)) return dec_invalid(2);
|
|
var i$12 = i$11 + 1 | 0;
|
|
if(max < i$12) return dec_invalid(3);
|
|
var b3 = caml_bytes_unsafe_get(b, i$12);
|
|
return not_in_x80_to_xBF(b3)
|
|
? dec_invalid(3)
|
|
: dec_ret(4, utf_8_uchar_4(b0, b1$0, b2, b3));
|
|
case 1:
|
|
case 2: break;
|
|
default:
|
|
var i$7 = i + 1 | 0;
|
|
if(max < i$7) return dec_invalid(1);
|
|
var b1$1 = caml_bytes_unsafe_get(b, i$7);
|
|
if(not_in_x80_to_xBF(b1$1)) return dec_invalid(1);
|
|
var i$8 = i$7 + 1 | 0;
|
|
if(max < i$8) return dec_invalid(2);
|
|
var b2$0 = caml_bytes_unsafe_get(b, i$8);
|
|
if(not_in_x80_to_xBF(b2$0)) return dec_invalid(2);
|
|
var i$9 = i$8 + 1 | 0;
|
|
if(max < i$9) return dec_invalid(3);
|
|
var b3$0 = caml_bytes_unsafe_get(b, i$9);
|
|
return not_in_x80_to_xBF(b3$0)
|
|
? dec_invalid(3)
|
|
: dec_ret(4, utf_8_uchar_4(b0, b1$1, b2$0, b3$0));
|
|
}
|
|
}
|
|
else if(225 > b0){
|
|
var i$13 = i + 1 | 0;
|
|
if(max < i$13) return dec_invalid(1);
|
|
var b1$5 = caml_bytes_unsafe_get(b, i$13);
|
|
if(not_in_xA0_to_xBF(b1$5)) return dec_invalid(1);
|
|
var i$14 = i$13 + 1 | 0;
|
|
if(max < i$14) return dec_invalid(2);
|
|
var b2$4 = caml_bytes_unsafe_get(b, i$14);
|
|
return not_in_x80_to_xBF(b2$4)
|
|
? dec_invalid(2)
|
|
: dec_ret(3, utf_8_uchar_3(b0, b1$5, b2$4));
|
|
}
|
|
var i$2 = i + 1 | 0;
|
|
if(max < i$2) return dec_invalid(1);
|
|
var b1$3 = caml_bytes_unsafe_get(b, i$2);
|
|
if(not_in_x80_to_xBF(b1$3)) return dec_invalid(1);
|
|
var i$3 = i$2 + 1 | 0;
|
|
if(max < i$3) return dec_invalid(2);
|
|
var b2$2 = caml_bytes_unsafe_get(b, i$3);
|
|
return not_in_x80_to_xBF(b2$2)
|
|
? dec_invalid(2)
|
|
: dec_ret(3, utf_8_uchar_3(b0, b1$3, b2$2));
|
|
}
|
|
if(128 > b0) return dec_ret(1, b0);
|
|
if(194 <= b0){
|
|
var i$15 = i + 1 | 0;
|
|
if(max < i$15) return dec_invalid(1);
|
|
var b1 = caml_bytes_unsafe_get(b, i$15);
|
|
return not_in_x80_to_xBF(b1)
|
|
? dec_invalid(1)
|
|
: dec_ret(2, (b0 & 31) << 6 | b1 & 63);
|
|
}
|
|
}
|
|
return dec_invalid(1);
|
|
}
|
|
var
|
|
cst_bytes_ml = "bytes.ml",
|
|
a = [0, cst_bytes_ml, 679, 9],
|
|
b = [0, cst_bytes_ml, 654, 20];
|
|
function set_utf_8_uchar(b$0, i, u){
|
|
function set(c, b, a){caml_bytes_unsafe_set(c, b, a);}
|
|
var
|
|
max = caml_ml_bytes_length(b$0) - 1 | 0,
|
|
u$0 = Stdlib_Uchar[10].call(null, u);
|
|
if(0 > u$0) throw caml_maybe_attach_backtrace([0, Assert_failure, b], 1);
|
|
if(127 >= u$0){caml_bytes_set(b$0, i, u$0); return 1;}
|
|
if(2047 >= u$0){
|
|
var last$1 = i + 1 | 0;
|
|
return max < last$1
|
|
? 0
|
|
: (caml_bytes_set
|
|
(b$0, i, 192 | u$0 >>> 6 | 0),
|
|
set(b$0, last$1, 128 | u$0 & 63),
|
|
2);
|
|
}
|
|
if(65535 >= u$0){
|
|
var last$0 = i + 2 | 0;
|
|
return max < last$0
|
|
? 0
|
|
: (caml_bytes_set
|
|
(b$0, i, 224 | u$0 >>> 12 | 0),
|
|
set(b$0, i + 1 | 0, 128 | (u$0 >>> 6 | 0) & 63),
|
|
set(b$0, last$0, 128 | u$0 & 63),
|
|
3);
|
|
}
|
|
if(1114111 < u$0)
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, a], 1);
|
|
var last = i + 3 | 0;
|
|
return max < last
|
|
? 0
|
|
: (caml_bytes_set
|
|
(b$0, i, 240 | u$0 >>> 18 | 0),
|
|
set(b$0, i + 1 | 0, 128 | (u$0 >>> 12 | 0) & 63),
|
|
set(b$0, i + 2 | 0, 128 | (u$0 >>> 6 | 0) & 63),
|
|
set(b$0, last, 128 | u$0 & 63),
|
|
4);
|
|
}
|
|
function is_valid_utf_8(b){
|
|
var max = caml_ml_bytes_length(b) - 1 | 0, i = 0;
|
|
for(;;){
|
|
if(max < i) return 1;
|
|
var match = caml_bytes_unsafe_get(b, i);
|
|
a:
|
|
{
|
|
if(224 <= match){
|
|
if(237 <= match){
|
|
if(245 <= match) break a;
|
|
switch(match - 237 | 0){
|
|
case 0:
|
|
var last = i + 2 | 0;
|
|
if
|
|
(max >= last
|
|
&&
|
|
!
|
|
not_in_x80_to_x9F(caml_bytes_unsafe_get(b, i + 1 | 0))
|
|
&& ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last))){var i$0 = last + 1 | 0; i = i$0; continue;}
|
|
return 0;
|
|
case 3:
|
|
var last$1 = i + 3 | 0;
|
|
if
|
|
(max >= last$1
|
|
&&
|
|
!
|
|
not_in_x90_to_xBF(caml_bytes_unsafe_get(b, i + 1 | 0))
|
|
&&
|
|
!
|
|
not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 2 | 0))
|
|
&& ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$1))){var i$2 = last$1 + 1 | 0; i = i$2; continue;}
|
|
return 0;
|
|
case 7:
|
|
var last$3 = i + 3 | 0;
|
|
if
|
|
(max >= last$3
|
|
&&
|
|
!
|
|
not_in_x80_to_x8F(caml_bytes_unsafe_get(b, i + 1 | 0))
|
|
&&
|
|
!
|
|
not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 2 | 0))
|
|
&& ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$3))){var i$4 = last$3 + 1 | 0; i = i$4; continue;}
|
|
return 0;
|
|
case 1:
|
|
case 2: break;
|
|
default:
|
|
var last$2 = i + 3 | 0;
|
|
if
|
|
(max >= last$2
|
|
&&
|
|
!
|
|
not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 1 | 0))
|
|
&&
|
|
!
|
|
not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 2 | 0))
|
|
&& ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$2))){var i$3 = last$2 + 1 | 0; i = i$3; continue;}
|
|
return 0;
|
|
}
|
|
}
|
|
else if(225 > match){
|
|
var last$4 = i + 2 | 0;
|
|
if
|
|
(max >= last$4
|
|
&&
|
|
!
|
|
not_in_xA0_to_xBF(caml_bytes_unsafe_get(b, i + 1 | 0))
|
|
&& ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$4))){var i$5 = last$4 + 1 | 0; i = i$5; continue;}
|
|
return 0;
|
|
}
|
|
var last$0 = i + 2 | 0;
|
|
if
|
|
(max >= last$0
|
|
&&
|
|
!
|
|
not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 1 | 0))
|
|
&& ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$0))){var i$1 = last$0 + 1 | 0; i = i$1; continue;}
|
|
return 0;
|
|
}
|
|
if(128 > match){var i$7 = i + 1 | 0; i = i$7; continue;}
|
|
if(194 <= match){
|
|
var last$5 = i + 1 | 0;
|
|
if
|
|
(max >= last$5
|
|
&& ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$5))){var i$6 = last$5 + 1 | 0; i = i$6; continue;}
|
|
return 0;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
var cst_index_out_of_bounds = "index out of bounds";
|
|
function get_utf_16be_uchar(b, i){
|
|
var max = caml_ml_bytes_length(b) - 1 | 0;
|
|
if(0 <= i && max >= i){
|
|
if(i === max) return dec_invalid(1);
|
|
var hi = unsafe_get_uint16_be(b, i);
|
|
if(55296 <= hi && 57343 >= hi){
|
|
if(56319 < hi) return dec_invalid(2);
|
|
var last = i + 3 | 0;
|
|
if(max < last) return dec_invalid((max - i | 0) + 1 | 0);
|
|
var lo = unsafe_get_uint16_be(b, i + 2 | 0);
|
|
if(56320 <= lo && 57343 >= lo){
|
|
var u = ((hi & 1023) << 10 | lo & 1023) + 65536 | 0;
|
|
return dec_ret(4, u);
|
|
}
|
|
return dec_invalid(2);
|
|
}
|
|
return dec_ret(2, hi);
|
|
}
|
|
return Stdlib[1].call(null, cst_index_out_of_bounds);
|
|
}
|
|
var c = [0, cst_bytes_ml, 777, 9], d = [0, cst_bytes_ml, 766, 20];
|
|
function set_utf_16be_uchar(b, i, u){
|
|
var max = caml_ml_bytes_length(b) - 1 | 0;
|
|
if(0 <= i && max >= i){
|
|
var u$0 = Stdlib_Uchar[10].call(null, u);
|
|
if(0 > u$0) throw caml_maybe_attach_backtrace([0, Assert_failure, d], 1);
|
|
if(65535 >= u$0){
|
|
var last$0 = i + 1 | 0;
|
|
return max < last$0 ? 0 : (unsafe_set_uint16_be(b, i, u$0), 2);
|
|
}
|
|
if(1114111 < u$0)
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, c], 1);
|
|
var last = i + 3 | 0;
|
|
if(max < last) return 0;
|
|
var
|
|
u$1 = u$0 - 65536 | 0,
|
|
hi = 55296 | u$1 >>> 10 | 0,
|
|
lo = 56320 | u$1 & 1023;
|
|
unsafe_set_uint16_be(b, i, hi);
|
|
unsafe_set_uint16_be(b, i + 2 | 0, lo);
|
|
return 4;
|
|
}
|
|
return Stdlib[1].call(null, cst_index_out_of_bounds);
|
|
}
|
|
function is_valid_utf_16be(b){
|
|
var max = caml_ml_bytes_length(b) - 1 | 0, i = 0;
|
|
for(;;){
|
|
if(max < i) return 1;
|
|
if(i === max) return 0;
|
|
var u = unsafe_get_uint16_be(b, i);
|
|
if(55296 <= u && 57343 >= u){
|
|
if(56319 < u) return 0;
|
|
var last = i + 3 | 0;
|
|
if(max < last) return 0;
|
|
var u$0 = unsafe_get_uint16_be(b, i + 2 | 0);
|
|
if(56320 <= u$0 && 57343 >= u$0){
|
|
var i$1 = i + 4 | 0;
|
|
i = i$1;
|
|
continue;
|
|
}
|
|
return 0;
|
|
}
|
|
var i$0 = i + 2 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function get_utf_16le_uchar(b, i){
|
|
var max = caml_ml_bytes_length(b) - 1 | 0;
|
|
if(0 <= i && max >= i){
|
|
if(i === max) return dec_invalid(1);
|
|
var hi = unsafe_get_uint16_le(b, i);
|
|
if(55296 <= hi && 57343 >= hi){
|
|
if(56319 < hi) return dec_invalid(2);
|
|
var last = i + 3 | 0;
|
|
if(max < last) return dec_invalid((max - i | 0) + 1 | 0);
|
|
var lo = unsafe_get_uint16_le(b, i + 2 | 0);
|
|
if(56320 <= lo && 57343 >= lo){
|
|
var u = ((hi & 1023) << 10 | lo & 1023) + 65536 | 0;
|
|
return dec_ret(4, u);
|
|
}
|
|
return dec_invalid(2);
|
|
}
|
|
return dec_ret(2, hi);
|
|
}
|
|
return Stdlib[1].call(null, cst_index_out_of_bounds);
|
|
}
|
|
var e = [0, cst_bytes_ml, 831, 9], f = [0, cst_bytes_ml, 820, 20];
|
|
function set_utf_16le_uchar(b, i, u){
|
|
var max = caml_ml_bytes_length(b) - 1 | 0;
|
|
if(0 <= i && max >= i){
|
|
var u$0 = Stdlib_Uchar[10].call(null, u);
|
|
if(0 > u$0) throw caml_maybe_attach_backtrace([0, Assert_failure, f], 1);
|
|
if(65535 >= u$0){
|
|
var last$0 = i + 1 | 0;
|
|
return max < last$0 ? 0 : (unsafe_set_uint16_le(b, i, u$0), 2);
|
|
}
|
|
if(1114111 < u$0)
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, e], 1);
|
|
var last = i + 3 | 0;
|
|
if(max < last) return 0;
|
|
var
|
|
u$1 = u$0 - 65536 | 0,
|
|
hi = 55296 | u$1 >>> 10 | 0,
|
|
lo = 56320 | u$1 & 1023;
|
|
unsafe_set_uint16_le(b, i, hi);
|
|
unsafe_set_uint16_le(b, i + 2 | 0, lo);
|
|
return 4;
|
|
}
|
|
return Stdlib[1].call(null, cst_index_out_of_bounds);
|
|
}
|
|
function is_valid_utf_16le(b){
|
|
var max = caml_ml_bytes_length(b) - 1 | 0, i = 0;
|
|
for(;;){
|
|
if(max < i) return 1;
|
|
if(i === max) return 0;
|
|
var u = unsafe_get_uint16_le(b, i);
|
|
if(55296 <= u && 57343 >= u){
|
|
if(56319 < u) return 0;
|
|
var last = i + 3 | 0;
|
|
if(max < last) return 0;
|
|
var u$0 = unsafe_get_uint16_le(b, i + 2 | 0);
|
|
if(56320 <= u$0 && 57343 >= u$0){
|
|
var i$1 = i + 4 | 0;
|
|
i = i$1;
|
|
continue;
|
|
}
|
|
return 0;
|
|
}
|
|
var i$0 = i + 2 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
var
|
|
Stdlib_Bytes =
|
|
[0,
|
|
make,
|
|
init,
|
|
empty,
|
|
copy,
|
|
of_string,
|
|
to_string,
|
|
sub,
|
|
sub_string,
|
|
extend,
|
|
fill,
|
|
blit,
|
|
blit_string,
|
|
concat,
|
|
cat,
|
|
iter,
|
|
iteri,
|
|
map,
|
|
mapi,
|
|
fold_left,
|
|
fold_right,
|
|
for_all,
|
|
exists,
|
|
trim,
|
|
escaped,
|
|
index,
|
|
index_opt,
|
|
rindex,
|
|
rindex_opt,
|
|
index_from,
|
|
index_from_opt,
|
|
rindex_from,
|
|
rindex_from_opt,
|
|
contains,
|
|
contains_from,
|
|
rcontains_from,
|
|
uppercase_ascii,
|
|
lowercase_ascii,
|
|
capitalize_ascii,
|
|
uncapitalize_ascii,
|
|
compare,
|
|
runtime.caml_bytes_equal,
|
|
starts_with,
|
|
ends_with,
|
|
caml_string_of_bytes,
|
|
caml_bytes_of_string,
|
|
split_on_char,
|
|
to_seq,
|
|
to_seqi,
|
|
of_seq,
|
|
get_utf_8_uchar,
|
|
set_utf_8_uchar,
|
|
is_valid_utf_8,
|
|
get_utf_16be_uchar,
|
|
set_utf_16be_uchar,
|
|
is_valid_utf_16be,
|
|
get_utf_16le_uchar,
|
|
set_utf_16le_uchar,
|
|
is_valid_utf_16le,
|
|
caml_bytes_get,
|
|
get_int8,
|
|
caml_bytes_get16,
|
|
get_uint16_be,
|
|
get_uint16_le,
|
|
get_int16_ne,
|
|
get_int16_be,
|
|
get_int16_le,
|
|
caml_bytes_get32,
|
|
get_int32_be,
|
|
get_int32_le,
|
|
caml_bytes_get64,
|
|
get_int64_be,
|
|
get_int64_le,
|
|
caml_bytes_set,
|
|
caml_bytes_set,
|
|
caml_bytes_set16,
|
|
set_int16_be,
|
|
set_int16_le,
|
|
caml_bytes_set16,
|
|
set_int16_be,
|
|
set_int16_le,
|
|
caml_bytes_set32,
|
|
set_int32_be,
|
|
set_int32_le,
|
|
caml_bytes_set64,
|
|
set_int64_be,
|
|
set_int64_le,
|
|
unsafe_escape];
|
|
runtime.caml_register_global(30, Stdlib_Bytes, "Stdlib__Bytes");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 4897 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__String:[F(2),F(2),N,F(1),F(1),F(5),F(2),F(2)*,F(2)*,F(2)*,F(2),F(2),F(3),F(3),F(2),F(3),F(2),F(2),F(2),F(3),F(3),F(2),F(2),F(1),F(1),F(1),F(1),F(1),F(1),F(2),F(2),F(3),F(3),F(3),F(3),F(2),F(2),F(2),F(2),F(1)*,F(1)*,F(1),F(2),F(1),F(2),F(1),F(2),F(1),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(1),F(2),F(2),F(2),F(2),F(2),F(2)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_blit_string = runtime.caml_blit_string,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_ml_string_length = runtime.caml_ml_string_length,
|
|
caml_string_equal = runtime.caml_string_equal,
|
|
caml_string_hash = runtime.caml_string_hash,
|
|
caml_string_unsafe_get = runtime.caml_string_unsafe_get,
|
|
caml_wrap_exception = runtime.caml_wrap_exception;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_Bytes = global_data.Stdlib__Bytes,
|
|
bts = Stdlib_Bytes[44],
|
|
bos = Stdlib_Bytes[45];
|
|
function make(n, c){return bts(Stdlib_Bytes[1].call(null, n, c));}
|
|
function init(n, f){return bts(Stdlib_Bytes[2].call(null, n, f));}
|
|
var of_bytes = Stdlib_Bytes[6], to_bytes = Stdlib_Bytes[5];
|
|
function sub(s, ofs, len){
|
|
var a = bos(s);
|
|
return bts(Stdlib_Bytes[7].call(null, a, ofs, len));
|
|
}
|
|
var blit = Stdlib_Bytes[12], cst = "";
|
|
function concat(sep, l){
|
|
if(! l) return cst;
|
|
var seplen = caml_ml_string_length(sep);
|
|
a:
|
|
{
|
|
var acc = 0, param = l, pos$1 = 0;
|
|
for(;;){
|
|
if(! param){var a = acc; break a;}
|
|
var hd = param[1];
|
|
if(! param[2]) break;
|
|
var
|
|
tl = param[2],
|
|
x = (caml_ml_string_length(hd) + seplen | 0) + acc | 0;
|
|
if(acc <= x){
|
|
acc = x;
|
|
param = tl;
|
|
}
|
|
else{acc = Stdlib[1].call(null, "String.concat"); param = tl;}
|
|
}
|
|
var a = caml_ml_string_length(hd) + acc | 0;
|
|
}
|
|
var dst = runtime.caml_create_bytes(a), pos = pos$1, param$0 = l;
|
|
for(;;){
|
|
if(param$0){
|
|
var hd$0 = param$0[1];
|
|
if(param$0[2]){
|
|
var tl$0 = param$0[2];
|
|
caml_blit_string(hd$0, 0, dst, pos, caml_ml_string_length(hd$0));
|
|
caml_blit_string
|
|
(sep, 0, dst, pos + caml_ml_string_length(hd$0) | 0, seplen);
|
|
var pos$0 = (pos + caml_ml_string_length(hd$0) | 0) + seplen | 0;
|
|
pos = pos$0;
|
|
param$0 = tl$0;
|
|
continue;
|
|
}
|
|
caml_blit_string(hd$0, 0, dst, pos, caml_ml_string_length(hd$0));
|
|
}
|
|
return bts(dst);
|
|
}
|
|
}
|
|
var cat = Stdlib[28];
|
|
function iter(f, s){
|
|
var a = caml_ml_string_length(s) - 1 | 0;
|
|
if(a >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
caml_call1(f, caml_string_unsafe_get(s, i));
|
|
var b = i + 1 | 0;
|
|
if(a === i) break;
|
|
i = b;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function iteri(f, s){
|
|
var a = caml_ml_string_length(s) - 1 | 0;
|
|
if(a >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
caml_call2(f, i, caml_string_unsafe_get(s, i));
|
|
var b = i + 1 | 0;
|
|
if(a === i) break;
|
|
i = b;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function map(f, s){
|
|
var a = bos(s);
|
|
return bts(Stdlib_Bytes[17].call(null, f, a));
|
|
}
|
|
function mapi(f, s){
|
|
var a = bos(s);
|
|
return bts(Stdlib_Bytes[18].call(null, f, a));
|
|
}
|
|
function fold_right(f, x, a){
|
|
var b = bos(x);
|
|
return Stdlib_Bytes[20].call(null, f, b, a);
|
|
}
|
|
function fold_left(f, a, x){
|
|
var b = bos(x);
|
|
return Stdlib_Bytes[19].call(null, f, a, b);
|
|
}
|
|
function exists(f, s){
|
|
var a = bos(s);
|
|
return Stdlib_Bytes[22].call(null, f, a);
|
|
}
|
|
function for_all(f, s){
|
|
var a = bos(s);
|
|
return Stdlib_Bytes[21].call(null, f, a);
|
|
}
|
|
function is_space(param){
|
|
var a = param - 9 | 0;
|
|
a:
|
|
{
|
|
if(4 < a >>> 0){if(23 !== a) break a;} else if(2 === a) break a;
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
function trim(s){
|
|
if(s === cst) return s;
|
|
if
|
|
(!
|
|
is_space(caml_string_unsafe_get(s, 0))
|
|
&&
|
|
!
|
|
is_space(caml_string_unsafe_get(s, caml_ml_string_length(s) - 1 | 0)))
|
|
return s;
|
|
var a = bos(s);
|
|
return bts(Stdlib_Bytes[23].call(null, a));
|
|
}
|
|
function escaped(s){
|
|
var b = bos(s);
|
|
return bts(Stdlib_Bytes[87].call(null, b));
|
|
}
|
|
function index_rec(s, lim, i$1, c){
|
|
var i = i$1;
|
|
for(;;){
|
|
if(lim <= i) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
if(caml_string_unsafe_get(s, i) === c) return i;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function index(s, c){return index_rec(s, caml_ml_string_length(s), 0, c);}
|
|
function index_rec_opt(s, lim, i$1, c){
|
|
var i = i$1;
|
|
for(;;){
|
|
if(lim <= i) return 0;
|
|
if(caml_string_unsafe_get(s, i) === c) return [0, i];
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function index_opt(s, c){
|
|
return index_rec_opt(s, caml_ml_string_length(s), 0, c);
|
|
}
|
|
function index_from(s, i, c){
|
|
var l = caml_ml_string_length(s);
|
|
if(0 <= i && l >= i) return index_rec(s, l, i, c);
|
|
return Stdlib[1].call(null, "String.index_from / Bytes.index_from");
|
|
}
|
|
function index_from_opt(s, i, c){
|
|
var l = caml_ml_string_length(s);
|
|
if(0 <= i && l >= i) return index_rec_opt(s, l, i, c);
|
|
return Stdlib[1].call
|
|
(null, "String.index_from_opt / Bytes.index_from_opt");
|
|
}
|
|
function rindex_rec(s, i$1, c){
|
|
var i = i$1;
|
|
for(;;){
|
|
if(0 > i) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
if(caml_string_unsafe_get(s, i) === c) return i;
|
|
var i$0 = i - 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function rindex(s, c){
|
|
return rindex_rec(s, caml_ml_string_length(s) - 1 | 0, c);
|
|
}
|
|
function rindex_from(s, i, c){
|
|
if(-1 <= i && caml_ml_string_length(s) > i) return rindex_rec(s, i, c);
|
|
return Stdlib[1].call(null, "String.rindex_from / Bytes.rindex_from");
|
|
}
|
|
function rindex_rec_opt(s, i$1, c){
|
|
var i = i$1;
|
|
for(;;){
|
|
if(0 > i) return 0;
|
|
if(caml_string_unsafe_get(s, i) === c) return [0, i];
|
|
var i$0 = i - 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function rindex_opt(s, c){
|
|
return rindex_rec_opt(s, caml_ml_string_length(s) - 1 | 0, c);
|
|
}
|
|
function rindex_from_opt(s, i, c){
|
|
if(-1 <= i && caml_ml_string_length(s) > i)
|
|
return rindex_rec_opt(s, i, c);
|
|
return Stdlib[1].call
|
|
(null, "String.rindex_from_opt / Bytes.rindex_from_opt");
|
|
}
|
|
function contains_from(s, i, c){
|
|
var l = caml_ml_string_length(s);
|
|
if(0 <= i && l >= i)
|
|
try{index_rec(s, l, i, c); return 1;}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn === Stdlib[8]) return 0;
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
return Stdlib[1].call(null, "String.contains_from / Bytes.contains_from");
|
|
}
|
|
function contains(s, c){return contains_from(s, 0, c);}
|
|
function rcontains_from(s, i, c){
|
|
if(0 <= i && caml_ml_string_length(s) > i)
|
|
try{rindex_rec(s, i, c); return 1;}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn === Stdlib[8]) return 0;
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
return Stdlib[1].call
|
|
(null, "String.rcontains_from / Bytes.rcontains_from");
|
|
}
|
|
function uppercase_ascii(s){
|
|
var a = bos(s);
|
|
return bts(Stdlib_Bytes[36].call(null, a));
|
|
}
|
|
function lowercase_ascii(s){
|
|
var a = bos(s);
|
|
return bts(Stdlib_Bytes[37].call(null, a));
|
|
}
|
|
function capitalize_ascii(s){
|
|
var a = bos(s);
|
|
return bts(Stdlib_Bytes[38].call(null, a));
|
|
}
|
|
function uncapitalize_ascii(s){
|
|
var a = bos(s);
|
|
return bts(Stdlib_Bytes[39].call(null, a));
|
|
}
|
|
function starts_with(prefix, s){
|
|
var
|
|
len_s = caml_ml_string_length(s),
|
|
len_pre = caml_ml_string_length(prefix),
|
|
a = len_pre <= len_s ? 1 : 0;
|
|
if(! a) return a;
|
|
var i = 0;
|
|
for(;;){
|
|
if(i === len_pre) return 1;
|
|
if(caml_string_unsafe_get(s, i) !== caml_string_unsafe_get(prefix, i))
|
|
return 0;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function ends_with(suffix, s){
|
|
var
|
|
len_s = caml_ml_string_length(s),
|
|
len_suf = caml_ml_string_length(suffix),
|
|
diff = len_s - len_suf | 0,
|
|
a = 0 <= diff ? 1 : 0;
|
|
if(! a) return a;
|
|
var i = 0;
|
|
for(;;){
|
|
if(i === len_suf) return 1;
|
|
if
|
|
(caml_string_unsafe_get(s, diff + i | 0)
|
|
!== caml_string_unsafe_get(suffix, i))
|
|
return 0;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function hash(x){return caml_string_hash(0, x);}
|
|
function split_on_char(sep, s){
|
|
var
|
|
b = caml_ml_string_length(s),
|
|
c = caml_ml_string_length(s) - 1 | 0,
|
|
a = 0;
|
|
if(c < 0)
|
|
var j$1 = b, r$1 = a;
|
|
else{
|
|
var j = b, r = a, i = c;
|
|
for(;;){
|
|
if(caml_string_unsafe_get(s, i) === sep)
|
|
var j$0 = i, r$0 = [0, sub(s, i + 1 | 0, (j - i | 0) - 1 | 0), r];
|
|
else
|
|
var j$0 = j, r$0 = r;
|
|
var d = i - 1 | 0;
|
|
if(0 === i){var j$1 = j$0, r$1 = r$0; break;}
|
|
j = j$0;
|
|
r = r$0;
|
|
i = d;
|
|
}
|
|
}
|
|
return [0, sub(s, 0, j$1), r$1];
|
|
}
|
|
var compare = runtime.caml_string_compare;
|
|
function to_seq(s){var a = bos(s); return Stdlib_Bytes[47].call(null, a);}
|
|
function to_seqi(s){var a = bos(s); return Stdlib_Bytes[48].call(null, a);}
|
|
function of_seq(g){return bts(Stdlib_Bytes[49].call(null, g));}
|
|
function get_utf_8_uchar(s, i){
|
|
var a = bos(s);
|
|
return Stdlib_Bytes[50].call(null, a, i);
|
|
}
|
|
function is_valid_utf_8(s){
|
|
var a = bos(s);
|
|
return Stdlib_Bytes[52].call(null, a);
|
|
}
|
|
function get_utf_16be_uchar(s, i){
|
|
var a = bos(s);
|
|
return Stdlib_Bytes[53].call(null, a, i);
|
|
}
|
|
function is_valid_utf_16be(s){
|
|
var a = bos(s);
|
|
return Stdlib_Bytes[55].call(null, a);
|
|
}
|
|
function get_utf_16le_uchar(s, i){
|
|
var a = bos(s);
|
|
return Stdlib_Bytes[56].call(null, a, i);
|
|
}
|
|
function is_valid_utf_16le(s){
|
|
var a = bos(s);
|
|
return Stdlib_Bytes[58].call(null, a);
|
|
}
|
|
function get_int8(s, i){
|
|
var a = bos(s);
|
|
return Stdlib_Bytes[60].call(null, a, i);
|
|
}
|
|
function get_uint16_le(s, i){
|
|
var a = bos(s);
|
|
return Stdlib_Bytes[63].call(null, a, i);
|
|
}
|
|
function get_uint16_be(s, i){
|
|
var a = bos(s);
|
|
return Stdlib_Bytes[62].call(null, a, i);
|
|
}
|
|
function get_int16_ne(s, i){
|
|
var a = bos(s);
|
|
return Stdlib_Bytes[64].call(null, a, i);
|
|
}
|
|
function get_int16_le(s, i){
|
|
var a = bos(s);
|
|
return Stdlib_Bytes[66].call(null, a, i);
|
|
}
|
|
function get_int16_be(s, i){
|
|
var a = bos(s);
|
|
return Stdlib_Bytes[65].call(null, a, i);
|
|
}
|
|
function get_int32_le(s, i){
|
|
var a = bos(s);
|
|
return Stdlib_Bytes[69].call(null, a, i);
|
|
}
|
|
function get_int32_be(s, i){
|
|
var a = bos(s);
|
|
return Stdlib_Bytes[68].call(null, a, i);
|
|
}
|
|
function get_int64_le(s, i){
|
|
var a = bos(s);
|
|
return Stdlib_Bytes[72].call(null, a, i);
|
|
}
|
|
function get_int64_be(s, i){
|
|
var a = bos(s);
|
|
return Stdlib_Bytes[71].call(null, a, i);
|
|
}
|
|
var
|
|
Stdlib_String =
|
|
[0,
|
|
make,
|
|
init,
|
|
cst,
|
|
of_bytes,
|
|
to_bytes,
|
|
blit,
|
|
concat,
|
|
cat,
|
|
caml_string_equal,
|
|
compare,
|
|
starts_with,
|
|
ends_with,
|
|
contains_from,
|
|
rcontains_from,
|
|
contains,
|
|
sub,
|
|
split_on_char,
|
|
map,
|
|
mapi,
|
|
fold_left,
|
|
fold_right,
|
|
for_all,
|
|
exists,
|
|
trim,
|
|
escaped,
|
|
uppercase_ascii,
|
|
lowercase_ascii,
|
|
capitalize_ascii,
|
|
uncapitalize_ascii,
|
|
iter,
|
|
iteri,
|
|
index_from,
|
|
index_from_opt,
|
|
rindex_from,
|
|
rindex_from_opt,
|
|
index,
|
|
index_opt,
|
|
rindex,
|
|
rindex_opt,
|
|
to_seq,
|
|
to_seqi,
|
|
of_seq,
|
|
get_utf_8_uchar,
|
|
is_valid_utf_8,
|
|
get_utf_16be_uchar,
|
|
is_valid_utf_16be,
|
|
get_utf_16le_uchar,
|
|
is_valid_utf_16le,
|
|
runtime.caml_string_get,
|
|
get_int8,
|
|
runtime.caml_string_get16,
|
|
get_uint16_be,
|
|
get_uint16_le,
|
|
get_int16_ne,
|
|
get_int16_be,
|
|
get_int16_le,
|
|
runtime.caml_string_get32,
|
|
hash,
|
|
caml_string_hash,
|
|
get_int32_be,
|
|
get_int32_le,
|
|
runtime.caml_string_get64,
|
|
get_int64_be,
|
|
get_int64_le];
|
|
runtime.caml_register_global(12, Stdlib_String, "Stdlib__String");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 5423 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Array:[F(2),F(3),F(3),F(2)*,F(1)*,F(3),F(1)*,F(4),F(5),F(1),F(1),F(2),F(2),F(2),F(2),F(2),F(2),F(3),F(3),F(3),F(3),F(3),F(2),F(2),F(3),F(3),F(2),F(2),F(2),F(2),F(2),F(2),F(1),F(2),F(2),F(2),F(2),F(2),F(1)*->F(1)*,F(1)*->F(1)*,F(1),[]]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_array_sub = runtime.caml_array_sub,
|
|
caml_check_bound = runtime.caml_check_bound,
|
|
caml_make_vect = runtime.caml_make_vect,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_wrap_exception = runtime.caml_wrap_exception;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib_Seq = global_data.Stdlib__Seq,
|
|
Assert_failure = global_data.Assert_failure,
|
|
Stdlib = global_data.Stdlib;
|
|
function init(l, f){
|
|
if(0 === l) return [0];
|
|
if(0 > l) return Stdlib[1].call(null, "Array.init");
|
|
var res = caml_make_vect(l, caml_call1(f, 0)), a = l - 1 | 0;
|
|
if(a >= 1){
|
|
var i = 1;
|
|
for(;;){
|
|
res[i + 1] = caml_call1(f, i);
|
|
var b = i + 1 | 0;
|
|
if(a === i) break;
|
|
i = b;
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
function make_matrix(sx, sy, init){
|
|
if(sy < 0) Stdlib[1].call(null, "Array.make_matrix");
|
|
var res = caml_make_vect(sx, [0]);
|
|
if(0 < sy){
|
|
var a = sx - 1 | 0;
|
|
if(a >= 0){
|
|
var x = 0;
|
|
for(;;){
|
|
res[x + 1] = caml_make_vect(sy, init);
|
|
var b = x + 1 | 0;
|
|
if(a === x) break;
|
|
x = b;
|
|
}
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
function init_matrix(sx, sy, f){
|
|
if(sy < 0) Stdlib[1].call(null, "Array.init_matrix");
|
|
var res = caml_make_vect(sx, [0]);
|
|
if(0 < sy){
|
|
var a = sx - 1 | 0;
|
|
if(a >= 0){
|
|
var x = 0;
|
|
for(;;){
|
|
var row = caml_make_vect(sy, caml_call2(f, x, 0)), b = sy - 1 | 0;
|
|
if(b >= 1){
|
|
var y = 1;
|
|
for(;;){
|
|
row[y + 1] = caml_call2(f, x, y);
|
|
var d = y + 1 | 0;
|
|
if(b === y) break;
|
|
y = d;
|
|
}
|
|
}
|
|
res[x + 1] = row;
|
|
var c = x + 1 | 0;
|
|
if(a === x) break;
|
|
x = c;
|
|
}
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
function copy(a){
|
|
var l = a.length - 1;
|
|
return 0 === l ? [0] : caml_array_sub(a, 0, l);
|
|
}
|
|
function append(a1, a2){
|
|
var l1 = a1.length - 1;
|
|
return 0 === l1
|
|
? copy(a2)
|
|
: 0
|
|
=== a2.length - 1
|
|
? caml_array_sub(a1, 0, l1)
|
|
: runtime.caml_array_append(a1, a2);
|
|
}
|
|
function sub(a, ofs, len){
|
|
if(0 <= ofs && 0 <= len && (a.length - 1 - len | 0) >= ofs)
|
|
return caml_array_sub(a, ofs, len);
|
|
return Stdlib[1].call(null, "Array.sub");
|
|
}
|
|
function fill(a, ofs, len, v){
|
|
if(0 <= ofs && 0 <= len && (a.length - 1 - len | 0) >= ofs)
|
|
return runtime.caml_array_fill(a, ofs, len, v);
|
|
return Stdlib[1].call(null, "Array.fill");
|
|
}
|
|
function blit(a1, ofs1, a2, ofs2, len){
|
|
if
|
|
(0 <= len
|
|
&&
|
|
0 <= ofs1
|
|
&&
|
|
(a1.length - 1 - len | 0) >= ofs1
|
|
&& 0 <= ofs2 && (a2.length - 1 - len | 0) >= ofs2)
|
|
return runtime.caml_array_blit(a1, ofs1, a2, ofs2, len);
|
|
return Stdlib[1].call(null, "Array.blit");
|
|
}
|
|
function iter(f, a){
|
|
var b = a.length - 2 | 0;
|
|
if(b >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
caml_call1(f, a[i + 1]);
|
|
var c = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function iter2(f, a, b){
|
|
if(a.length - 1 !== b.length - 1)
|
|
return Stdlib[1].call
|
|
(null, "Array.iter2: arrays must have the same length");
|
|
var c = a.length - 2 | 0;
|
|
if(c >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
caml_call2(f, a[i + 1], b[i + 1]);
|
|
var d = i + 1 | 0;
|
|
if(c === i) break;
|
|
i = d;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function map(f, a){
|
|
var l = a.length - 1;
|
|
if(0 === l) return [0];
|
|
var r = caml_make_vect(l, caml_call1(f, a[1])), b = l - 1 | 0;
|
|
if(b >= 1){
|
|
var i = 1;
|
|
for(;;){
|
|
r[i + 1] = caml_call1(f, a[i + 1]);
|
|
var c = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
function map_inplace(f, a){
|
|
var b = a.length - 2 | 0;
|
|
if(b >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
a[i + 1] = caml_call1(f, a[i + 1]);
|
|
var c = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function mapi_inplace(f, a){
|
|
var b = a.length - 2 | 0;
|
|
if(b >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
a[i + 1] = caml_call2(f, i, a[i + 1]);
|
|
var c = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function map2(f, a, b){
|
|
var la = a.length - 1, lb = b.length - 1;
|
|
if(la !== lb)
|
|
return Stdlib[1].call
|
|
(null, "Array.map2: arrays must have the same length");
|
|
if(0 === la) return [0];
|
|
var r = caml_make_vect(la, caml_call2(f, a[1], b[1])), c = la - 1 | 0;
|
|
if(c >= 1){
|
|
var i = 1;
|
|
for(;;){
|
|
r[i + 1] = caml_call2(f, a[i + 1], b[i + 1]);
|
|
var d = i + 1 | 0;
|
|
if(c === i) break;
|
|
i = d;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
function iteri(f, a){
|
|
var b = a.length - 2 | 0;
|
|
if(b >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
caml_call2(f, i, a[i + 1]);
|
|
var c = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function mapi(f, a){
|
|
var l = a.length - 1;
|
|
if(0 === l) return [0];
|
|
var r = caml_make_vect(l, caml_call2(f, 0, a[1])), b = l - 1 | 0;
|
|
if(b >= 1){
|
|
var i = 1;
|
|
for(;;){
|
|
r[i + 1] = caml_call2(f, i, a[i + 1]);
|
|
var c = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
function to_list(a){
|
|
var i$1 = a.length - 2 | 0, i = i$1, res = 0;
|
|
for(;;){
|
|
if(0 > i) return res;
|
|
var res$0 = [0, a[i + 1], res], i$0 = i - 1 | 0;
|
|
i = i$0;
|
|
res = res$0;
|
|
}
|
|
}
|
|
function list_length(accu$1, param$0){
|
|
var accu = accu$1, param = param$0;
|
|
for(;;){
|
|
if(! param) return accu;
|
|
var t = param[2], accu$0 = accu + 1 | 0;
|
|
accu = accu$0;
|
|
param = t;
|
|
}
|
|
}
|
|
function of_list(l){
|
|
if(! l) return [0];
|
|
var
|
|
tl = l[2],
|
|
hd = l[1],
|
|
a = caml_make_vect(list_length(0, l), hd),
|
|
i = 1,
|
|
param = tl;
|
|
for(;;){
|
|
if(! param) return a;
|
|
var tl$0 = param[2], hd$0 = param[1];
|
|
a[i + 1] = hd$0;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
param = tl$0;
|
|
}
|
|
}
|
|
function fold_left(f, x, a){
|
|
var b = a.length - 2 | 0;
|
|
if(b < 0)
|
|
var r$0 = x;
|
|
else{
|
|
var r = x, i = 0;
|
|
for(;;){
|
|
var c = caml_call2(f, r, a[i + 1]), d = i + 1 | 0;
|
|
if(b === i){var r$0 = c; break;}
|
|
r = c;
|
|
i = d;
|
|
}
|
|
}
|
|
return r$0;
|
|
}
|
|
function fold_left_map(f, acc, input_array){
|
|
var len = input_array.length - 1;
|
|
if(0 === len) return [0, acc, [0]];
|
|
var
|
|
match = caml_call2(f, acc, input_array[1]),
|
|
elt = match[2],
|
|
acc$0 = match[1],
|
|
output_array = caml_make_vect(len, elt),
|
|
a = len - 1 | 0;
|
|
if(a < 1)
|
|
var acc$3 = acc$0;
|
|
else{
|
|
var acc$2 = acc$0, i = 1;
|
|
for(;;){
|
|
var
|
|
match$0 = caml_call2(f, acc$2, input_array[i + 1]),
|
|
elt$0 = match$0[2],
|
|
acc$1 = match$0[1];
|
|
output_array[i + 1] = elt$0;
|
|
var b = i + 1 | 0;
|
|
if(a === i){var acc$3 = acc$1; break;}
|
|
acc$2 = acc$1;
|
|
i = b;
|
|
}
|
|
}
|
|
return [0, acc$3, output_array];
|
|
}
|
|
function fold_right(f, a, x){
|
|
var b = a.length - 2 | 0;
|
|
if(b < 0)
|
|
var r$0 = x;
|
|
else{
|
|
var r = x, i = b;
|
|
for(;;){
|
|
var c = caml_call2(f, a[i + 1], r), d = i - 1 | 0;
|
|
if(0 === i){var r$0 = c; break;}
|
|
r = c;
|
|
i = d;
|
|
}
|
|
}
|
|
return r$0;
|
|
}
|
|
function exists(p, a){
|
|
var n = a.length - 1, i = 0;
|
|
for(;;){
|
|
if(i === n) return 0;
|
|
if(caml_call1(p, a[i + 1])) return 1;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function for_all(p, a){
|
|
var n = a.length - 1, i = 0;
|
|
for(;;){
|
|
if(i === n) return 1;
|
|
if(! caml_call1(p, a[i + 1])) return 0;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function for_all2(p, l1, l2){
|
|
var n1 = l1.length - 1, n2 = l2.length - 1;
|
|
if(n1 !== n2) return Stdlib[1].call(null, "Array.for_all2");
|
|
var i = 0;
|
|
for(;;){
|
|
if(i === n1) return 1;
|
|
if(! caml_call2(p, l1[i + 1], l2[i + 1])) return 0;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function exists2(p, l1, l2){
|
|
var n1 = l1.length - 1, n2 = l2.length - 1;
|
|
if(n1 !== n2) return Stdlib[1].call(null, "Array.exists2");
|
|
var i = 0;
|
|
for(;;){
|
|
if(i === n1) return 0;
|
|
if(caml_call2(p, l1[i + 1], l2[i + 1])) return 1;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function mem(x, a){
|
|
var n = a.length - 1, i = 0;
|
|
for(;;){
|
|
if(i === n) return 0;
|
|
if(0 === runtime.caml_compare(a[i + 1], x)) return 1;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function memq(x, a){
|
|
var n = a.length - 1, i = 0;
|
|
for(;;){
|
|
if(i === n) return 0;
|
|
if(x === a[i + 1]) return 1;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function find_opt(p, a){
|
|
var n = a.length - 1, i = 0;
|
|
for(;;){
|
|
if(i === n) return 0;
|
|
var x = a[i + 1];
|
|
if(caml_call1(p, x)) return [0, x];
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function find_index(p, a){
|
|
var n = a.length - 1, i = 0;
|
|
for(;;){
|
|
if(i === n) return 0;
|
|
if(caml_call1(p, a[i + 1])) return [0, i];
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function find_map(f, a){
|
|
var n = a.length - 1, i = 0;
|
|
for(;;){
|
|
if(i === n) return 0;
|
|
var r = caml_call1(f, a[i + 1]);
|
|
if(r) return r;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function find_mapi(f, a){
|
|
var n = a.length - 1, i = 0;
|
|
for(;;){
|
|
if(i === n) return 0;
|
|
var r = caml_call2(f, i, a[i + 1]);
|
|
if(r) return r;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function split(x){
|
|
if(runtime.caml_equal(x, [0])) return [0, [0], [0]];
|
|
var
|
|
match = x[1],
|
|
b0 = match[2],
|
|
a0 = match[1],
|
|
n = x.length - 1,
|
|
a = caml_make_vect(n, a0),
|
|
b = caml_make_vect(n, b0),
|
|
c = n - 1 | 0;
|
|
if(c >= 1){
|
|
var i = 1;
|
|
for(;;){
|
|
var match$0 = x[i + 1], bi = match$0[2], ai = match$0[1];
|
|
a[i + 1] = ai;
|
|
b[i + 1] = bi;
|
|
var d = i + 1 | 0;
|
|
if(c === i) break;
|
|
i = d;
|
|
}
|
|
}
|
|
return [0, a, b];
|
|
}
|
|
function combine(a, b){
|
|
var na = a.length - 1, nb = b.length - 1;
|
|
if(na !== nb) Stdlib[1].call(null, "Array.combine");
|
|
if(0 === na) return [0];
|
|
var x = caml_make_vect(na, [0, a[1], b[1]]), c = na - 1 | 0;
|
|
if(c >= 1){
|
|
var i = 1;
|
|
for(;;){
|
|
x[i + 1] = [0, a[i + 1], b[i + 1]];
|
|
var d = i + 1 | 0;
|
|
if(c === i) break;
|
|
i = d;
|
|
}
|
|
}
|
|
return x;
|
|
}
|
|
var
|
|
Bottom = [248, "Stdlib.Array.Bottom", runtime.caml_fresh_oo_id(0)],
|
|
a = [0, "array.ml", 369, 4];
|
|
function sort(cmp, a$0){
|
|
function maxson(l, i){
|
|
var i31 = ((i + i | 0) + i | 0) + 1 | 0;
|
|
if((i31 + 2 | 0) < l){
|
|
var
|
|
a = i31 + 1 | 0,
|
|
d = caml_check_bound(a$0, a)[a + 1],
|
|
x =
|
|
caml_call2(cmp, caml_check_bound(a$0, i31)[i31 + 1], d) < 0
|
|
? i31 + 1 | 0
|
|
: i31,
|
|
b = i31 + 2 | 0,
|
|
e = caml_check_bound(a$0, b)[b + 1],
|
|
x$0 =
|
|
caml_call2(cmp, caml_check_bound(a$0, x)[x + 1], e) < 0
|
|
? i31 + 2 | 0
|
|
: x;
|
|
return x$0;
|
|
}
|
|
if((i31 + 1 | 0) < l){
|
|
var c = i31 + 1 | 0, f = caml_check_bound(a$0, c)[c + 1];
|
|
if(0 > caml_call2(cmp, caml_check_bound(a$0, i31)[i31 + 1], f))
|
|
return i31 + 1 | 0;
|
|
}
|
|
if(i31 < l) return i31;
|
|
throw caml_maybe_attach_backtrace([0, Bottom, i], 1);
|
|
}
|
|
var l = a$0.length - 1, b = ((l + 1 | 0) / 3 | 0) - 1 | 0;
|
|
if(b >= 0){
|
|
var i$5 = b;
|
|
for(;;){
|
|
var e$1 = caml_check_bound(a$0, i$5)[i$5 + 1];
|
|
try{
|
|
var i = i$5;
|
|
for(;;){
|
|
var j = maxson(l, i);
|
|
if(0 >= caml_call2(cmp, caml_check_bound(a$0, j)[j + 1], e$1)){caml_check_bound(a$0, i)[i + 1] = e$1; break;}
|
|
var g = caml_check_bound(a$0, j)[j + 1];
|
|
caml_check_bound(a$0, i)[i + 1] = g;
|
|
i = j;
|
|
}
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn[1] !== Bottom) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var i$0 = exn[2];
|
|
caml_check_bound(a$0, i$0)[i$0 + 1] = e$1;
|
|
}
|
|
var n = i$5 - 1 | 0;
|
|
if(0 === i$5) break;
|
|
i$5 = n;
|
|
}
|
|
}
|
|
var c = l - 1 | 0;
|
|
if(c >= 2){
|
|
var i$4 = c;
|
|
a:
|
|
for(;;){
|
|
var e$0 = caml_check_bound(a$0, i$4)[i$4 + 1];
|
|
a$0[i$4 + 1] = caml_check_bound(a$0, 0)[1];
|
|
try{
|
|
var i$1 = 0;
|
|
for(;;){
|
|
var j$0 = maxson(i$4, i$1), h = caml_check_bound(a$0, j$0)[j$0 + 1];
|
|
caml_check_bound(a$0, i$1)[i$1 + 1] = h;
|
|
i$1 = j$0;
|
|
}
|
|
}
|
|
catch(exn){
|
|
var exn$0 = caml_wrap_exception(exn);
|
|
if(exn$0[1] !== Bottom) throw caml_maybe_attach_backtrace(exn$0, 0);
|
|
var i$2 = exn$0[2], i$3 = i$2;
|
|
for(;;){
|
|
var father = (i$3 - 1 | 0) / 3 | 0;
|
|
if(i$3 === father)
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, a], 1);
|
|
if
|
|
(0 <= caml_call2(cmp, caml_check_bound(a$0, father)[father + 1], e$0))
|
|
caml_check_bound(a$0, i$3)[i$3 + 1] = e$0;
|
|
else{
|
|
var k = caml_check_bound(a$0, father)[father + 1];
|
|
caml_check_bound(a$0, i$3)[i$3 + 1] = k;
|
|
if(0 < father){i$3 = father; continue;}
|
|
caml_check_bound(a$0, 0)[1] = e$0;
|
|
}
|
|
var m = i$4 - 1 | 0;
|
|
if(2 === i$4) break a;
|
|
i$4 = m;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
var d = 1 < l ? 1 : 0;
|
|
if(d){
|
|
var e = caml_check_bound(a$0, 1)[2];
|
|
a$0[2] = caml_check_bound(a$0, 0)[1];
|
|
a$0[1] = e;
|
|
var f = 0;
|
|
}
|
|
else
|
|
var f = d;
|
|
return f;
|
|
}
|
|
function stable_sort(cmp, a){
|
|
function merge(src1ofs, src1len, src2, src2ofs, src2len, dst, dstofs){
|
|
var
|
|
src1r = src1ofs + src1len | 0,
|
|
src2r = src2ofs + src2len | 0,
|
|
s2$1 = caml_check_bound(src2, src2ofs)[src2ofs + 1],
|
|
s1$1 = caml_check_bound(a, src1ofs)[src1ofs + 1],
|
|
i1 = src1ofs,
|
|
s1 = s1$1,
|
|
i2 = src2ofs,
|
|
s2 = s2$1,
|
|
d = dstofs;
|
|
for(;;)
|
|
if(0 < caml_call2(cmp, s1, s2)){
|
|
caml_check_bound(dst, d)[d + 1] = s2;
|
|
var i2$0 = i2 + 1 | 0;
|
|
if(i2$0 >= src2r) return blit(a, i1, dst, d + 1 | 0, src1r - i1 | 0);
|
|
var d$0 = d + 1 | 0, s2$0 = caml_check_bound(src2, i2$0)[i2$0 + 1];
|
|
i2 = i2$0;
|
|
s2 = s2$0;
|
|
d = d$0;
|
|
}
|
|
else{
|
|
caml_check_bound(dst, d)[d + 1] = s1;
|
|
var i1$0 = i1 + 1 | 0;
|
|
if(i1$0 >= src1r)
|
|
return blit(src2, i2, dst, d + 1 | 0, src2r - i2 | 0);
|
|
var d$1 = d + 1 | 0, s1$0 = caml_check_bound(a, i1$0)[i1$0 + 1];
|
|
i1 = i1$0;
|
|
s1 = s1$0;
|
|
d = d$1;
|
|
}
|
|
}
|
|
function isortto(srcofs, dst, dstofs, len){
|
|
var b = len - 1 | 0;
|
|
if(b >= 0){
|
|
var i = 0;
|
|
a:
|
|
for(;;){
|
|
var
|
|
c = srcofs + i | 0,
|
|
e = caml_check_bound(a, c)[c + 1],
|
|
j = (dstofs + i | 0) - 1 | 0;
|
|
for(;;){
|
|
if
|
|
(dstofs <= j
|
|
&& 0 < caml_call2(cmp, caml_check_bound(dst, j)[j + 1], e)){
|
|
var d = j + 1 | 0, g = caml_check_bound(dst, j)[j + 1];
|
|
caml_check_bound(dst, d)[d + 1] = g;
|
|
var j$0 = j - 1 | 0;
|
|
j = j$0;
|
|
continue;
|
|
}
|
|
var f = j + 1 | 0;
|
|
caml_check_bound(dst, f)[f + 1] = e;
|
|
var h = i + 1 | 0;
|
|
if(b === i) break a;
|
|
i = h;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function sortto(srcofs, dst, dstofs, len){
|
|
if(len <= 5) return isortto(srcofs, dst, dstofs, len);
|
|
var l1 = len / 2 | 0, l2 = len - l1 | 0;
|
|
sortto(srcofs + l1 | 0, dst, dstofs + l1 | 0, l2);
|
|
sortto(srcofs, a, srcofs + l2 | 0, l1);
|
|
return merge(srcofs + l2 | 0, l1, dst, dstofs + l1 | 0, l2, dst, dstofs);
|
|
}
|
|
var l = a.length - 1;
|
|
if(l <= 5) return isortto(0, a, 0, l);
|
|
var
|
|
l1 = l / 2 | 0,
|
|
l2 = l - l1 | 0,
|
|
t = caml_make_vect(l2, caml_check_bound(a, 0)[1]);
|
|
sortto(l1, t, 0, l2);
|
|
sortto(0, a, l2, l1);
|
|
return merge(l2, l1, t, 0, l2, a, 0);
|
|
}
|
|
function shuffle(rand, a){
|
|
var b = a.length - 2 | 0;
|
|
if(b >= 1){
|
|
var i = b;
|
|
for(;;){
|
|
var j = caml_call1(rand, i + 1 | 0), v = a[i + 1];
|
|
a[i + 1] = caml_check_bound(a, j)[j + 1];
|
|
a[j + 1] = v;
|
|
var c = i - 1 | 0;
|
|
if(1 === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function to_seq(a){
|
|
function aux(i, param){
|
|
if(i >= a.length - 1) return 0;
|
|
var x = a[i + 1], b = i + 1 | 0;
|
|
return [0, x, function(a){return aux(b, a);}];
|
|
}
|
|
return function(a){return aux(0, a);};
|
|
}
|
|
function to_seqi(a){
|
|
function aux(i, param){
|
|
if(i >= a.length - 1) return 0;
|
|
var x = a[i + 1], b = i + 1 | 0;
|
|
return [0, [0, i, x], function(a){return aux(b, a);}];
|
|
}
|
|
return function(a){return aux(0, a);};
|
|
}
|
|
function of_seq(i$2){
|
|
var
|
|
l =
|
|
Stdlib_Seq[5].call(null, function(acc, x){return [0, x, acc];}, 0, i$2);
|
|
if(! l) return [0];
|
|
var
|
|
tl = l[2],
|
|
hd = l[1],
|
|
len = list_length(0, l),
|
|
a = caml_make_vect(len, hd),
|
|
i$1 = len - 2 | 0,
|
|
i = i$1,
|
|
param = tl;
|
|
for(;;){
|
|
if(! param) return a;
|
|
var tl$0 = param[2], hd$0 = param[1];
|
|
a[i + 1] = hd$0;
|
|
var i$0 = i - 1 | 0;
|
|
i = i$0;
|
|
param = tl$0;
|
|
}
|
|
}
|
|
var
|
|
Stdlib_Array =
|
|
[0,
|
|
init,
|
|
make_matrix,
|
|
init_matrix,
|
|
append,
|
|
runtime.caml_array_concat,
|
|
sub,
|
|
copy,
|
|
fill,
|
|
blit,
|
|
to_list,
|
|
of_list,
|
|
iter,
|
|
iteri,
|
|
map,
|
|
map_inplace,
|
|
mapi,
|
|
mapi_inplace,
|
|
fold_left,
|
|
fold_left_map,
|
|
fold_right,
|
|
iter2,
|
|
map2,
|
|
for_all,
|
|
exists,
|
|
for_all2,
|
|
exists2,
|
|
mem,
|
|
memq,
|
|
find_opt,
|
|
find_index,
|
|
find_map,
|
|
find_mapi,
|
|
split,
|
|
combine,
|
|
sort,
|
|
stable_sort,
|
|
stable_sort,
|
|
shuffle,
|
|
to_seq,
|
|
to_seqi,
|
|
of_seq,
|
|
[0]];
|
|
runtime.caml_register_global(16, Stdlib_Array, "Stdlib__Array");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 6179 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Float:[N,N,N,F(1)*,F(1)*,N,N,N,N,N,N,N,N,N,F(1)*,F(1)*,F(1)*,F(1)*,F(1),F(1),F(2)*,F(2)*,F(2)*,F(2)*,F(2)*,F(2)*,F(2)*,F(2)*,F(2)*,F(1)*,N,N]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_check_bound = runtime.caml_check_bound,
|
|
caml_float_compare = runtime.caml_float_compare,
|
|
caml_floatarray_blit = runtime.caml_floatarray_blit,
|
|
caml_floatarray_create = runtime.caml_floatarray_create,
|
|
caml_hash = runtime.caml_hash,
|
|
caml_make_vect = runtime.caml_make_vect,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_nextafter_float = runtime.caml_nextafter_float,
|
|
caml_signbit_float = runtime.caml_signbit_float,
|
|
caml_wrap_exception = runtime.caml_wrap_exception;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib_Seq = global_data.Stdlib__Seq,
|
|
Stdlib_List = global_data.Stdlib__List,
|
|
Assert_failure = global_data.Assert_failure,
|
|
Stdlib = global_data.Stdlib,
|
|
infinity = Stdlib[22],
|
|
neg_infinity = Stdlib[23],
|
|
nan = Stdlib[24];
|
|
function is_finite(x){return x - x === 0. ? 1 : 0;}
|
|
function is_infinite(x){return 1. / x === 0. ? 1 : 0;}
|
|
function is_nan(x){return x !== x ? 1 : 0;}
|
|
var
|
|
max_float = Stdlib[25],
|
|
min_float = Stdlib[26],
|
|
epsilon = Stdlib[27],
|
|
of_string_opt = Stdlib[36],
|
|
to_string = Stdlib[35];
|
|
function is_integer(x){
|
|
var a = x === runtime.caml_trunc_float(x) ? 1 : 0;
|
|
return a ? is_finite(x) : a;
|
|
}
|
|
function succ(x){return caml_nextafter_float(x, infinity);}
|
|
function pred(x){return caml_nextafter_float(x, neg_infinity);}
|
|
function equal(x, y){return 0 === caml_float_compare(x, y) ? 1 : 0;}
|
|
function min(x, y){
|
|
a:
|
|
if(! (x < y)){
|
|
if(! caml_signbit_float(y) && caml_signbit_float(x)) break a;
|
|
return x !== x ? x : y;
|
|
}
|
|
return y !== y ? y : x;
|
|
}
|
|
function max(x, y){
|
|
a:
|
|
if(! (x < y)){
|
|
if(! caml_signbit_float(y) && caml_signbit_float(x)) break a;
|
|
return y !== y ? y : x;
|
|
}
|
|
return x !== x ? x : y;
|
|
}
|
|
function min_max(x, y){
|
|
if(x === x && y === y){
|
|
a:
|
|
if(! (x < y)){
|
|
if(! caml_signbit_float(y) && caml_signbit_float(x)) break a;
|
|
return [0, y, x];
|
|
}
|
|
return [0, x, y];
|
|
}
|
|
return [0, nan, nan];
|
|
}
|
|
function min_num(x, y){
|
|
a:
|
|
if(! (x < y)){
|
|
if(! caml_signbit_float(y) && caml_signbit_float(x)) break a;
|
|
return y !== y ? x : y;
|
|
}
|
|
return x !== x ? y : x;
|
|
}
|
|
function max_num(x, y){
|
|
a:
|
|
if(! (x < y)){
|
|
if(! caml_signbit_float(y) && caml_signbit_float(x)) break a;
|
|
return x !== x ? y : x;
|
|
}
|
|
return y !== y ? x : y;
|
|
}
|
|
function min_max_num(x, y){
|
|
if(x !== x) return [0, y, y];
|
|
if(y !== y) return [0, x, x];
|
|
a:
|
|
if(! (x < y)){
|
|
if(! caml_signbit_float(y) && caml_signbit_float(x)) break a;
|
|
return [0, y, x];
|
|
}
|
|
return [0, x, y];
|
|
}
|
|
function seeded_hash(seed, x){return caml_hash(10, 100, seed, x);}
|
|
function hash(x){return caml_hash(10, 100, 0, x);}
|
|
function unsafe_fill(a, ofs, len, v){
|
|
var b = (ofs + len | 0) - 1 | 0;
|
|
if(b >= ofs){
|
|
var i = ofs;
|
|
for(;;){a[i + 1] = v; var c = i + 1 | 0; if(b === i) break; i = c;}
|
|
}
|
|
return 0;
|
|
}
|
|
function check(a, ofs, len, msg){
|
|
var c = ofs < 0 ? 1 : 0;
|
|
if(c)
|
|
var b = c;
|
|
else{
|
|
var d = len < 0 ? 1 : 0;
|
|
if(d)
|
|
var b = d;
|
|
else
|
|
var
|
|
e = (ofs + len | 0) < 0 ? 1 : 0,
|
|
b = e || (a.length - 1 < (ofs + len | 0) ? 1 : 0);
|
|
}
|
|
return b ? Stdlib[1].call(null, msg) : b;
|
|
}
|
|
function make(n, v){
|
|
var result = caml_floatarray_create(n);
|
|
unsafe_fill(result, 0, n, v);
|
|
return result;
|
|
}
|
|
function init(l, f){
|
|
if(0 > l) return Stdlib[1].call(null, "Float.Array.init");
|
|
var res = caml_floatarray_create(l), a = l - 1 | 0;
|
|
if(a >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
res[i + 1] = caml_call1(f, i);
|
|
var b = i + 1 | 0;
|
|
if(a === i) break;
|
|
i = b;
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
function make_matrix(sx, sy, v){
|
|
if(sy < 0) Stdlib[1].call(null, "Float.Array.make_matrix");
|
|
var res = caml_make_vect(sx, caml_floatarray_create(0));
|
|
if(0 < sy){
|
|
var a = sx - 1 | 0;
|
|
if(a >= 0){
|
|
var x = 0;
|
|
for(;;){
|
|
res[x + 1] = make(sy, v);
|
|
var b = x + 1 | 0;
|
|
if(a === x) break;
|
|
x = b;
|
|
}
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
function init_matrix(sx, sy, f){
|
|
if(sy < 0) Stdlib[1].call(null, "Float.Array.init_matrix");
|
|
var res = caml_make_vect(sx, caml_floatarray_create(0));
|
|
if(0 < sy){
|
|
var a = sx - 1 | 0;
|
|
if(a >= 0){
|
|
var x = 0;
|
|
for(;;){
|
|
var row = caml_floatarray_create(sy), b = sy - 1 | 0;
|
|
if(b >= 0){
|
|
var y = 0;
|
|
for(;;){
|
|
row[y + 1] = caml_call2(f, x, y);
|
|
var d = y + 1 | 0;
|
|
if(b === y) break;
|
|
y = d;
|
|
}
|
|
}
|
|
res[x + 1] = row;
|
|
var c = x + 1 | 0;
|
|
if(a === x) break;
|
|
x = c;
|
|
}
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
function append(a1, a2){
|
|
var
|
|
l1 = a1.length - 1,
|
|
l2 = a2.length - 1,
|
|
result = caml_floatarray_create(l1 + l2 | 0);
|
|
caml_floatarray_blit(a1, 0, result, 0, l1);
|
|
caml_floatarray_blit(a2, 0, result, l1, l2);
|
|
return result;
|
|
}
|
|
var cst_float_ml = "float.ml", a = [0, cst_float_ml, 254, 14];
|
|
function concat(l){
|
|
var acc = 0, param = l;
|
|
for(;;){
|
|
if(! param) break;
|
|
var tl = param[2], hd = param[1], x = hd.length - 1 + acc | 0;
|
|
if(acc <= x){
|
|
acc = x;
|
|
param = tl;
|
|
}
|
|
else{acc = Stdlib[1].call(null, "Float.Array.concat"); param = tl;}
|
|
}
|
|
var result = caml_floatarray_create(acc), l$0 = l, i = 0;
|
|
for(;;){
|
|
if(! l$0){
|
|
if(i === acc) return result;
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, a], 1);
|
|
}
|
|
var tl$0 = l$0[2], hd$0 = l$0[1], hlen = hd$0.length - 1;
|
|
caml_floatarray_blit(hd$0, 0, result, i, hlen);
|
|
var i$0 = i + hlen | 0;
|
|
l$0 = tl$0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function sub(a, ofs, len){
|
|
check(a, ofs, len, "Float.Array.sub");
|
|
var result = caml_floatarray_create(len);
|
|
caml_floatarray_blit(a, ofs, result, 0, len);
|
|
return result;
|
|
}
|
|
function copy(a){
|
|
var l = a.length - 1, result = caml_floatarray_create(l);
|
|
caml_floatarray_blit(a, 0, result, 0, l);
|
|
return result;
|
|
}
|
|
function fill(a, ofs, len, v){
|
|
check(a, ofs, len, "Float.Array.fill");
|
|
return unsafe_fill(a, ofs, len, v);
|
|
}
|
|
function blit(src, sofs, dst, dofs, len){
|
|
var cst_Float_array_blit = "Float.array.blit";
|
|
check(src, sofs, len, cst_Float_array_blit);
|
|
check(dst, dofs, len, cst_Float_array_blit);
|
|
return caml_floatarray_blit(src, sofs, dst, dofs, len);
|
|
}
|
|
function to_list(a){
|
|
return Stdlib_List[11].call
|
|
(null, a.length - 1, function(b){return a[b + 1];});
|
|
}
|
|
function of_list(l){
|
|
var
|
|
result = caml_floatarray_create(Stdlib_List[1].call(null, l)),
|
|
i = 0,
|
|
l$0 = l;
|
|
for(;;){
|
|
if(! l$0) return result;
|
|
var t = l$0[2], h = l$0[1];
|
|
result[i + 1] = h;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
l$0 = t;
|
|
}
|
|
}
|
|
function iter(f, a){
|
|
var b = a.length - 2 | 0;
|
|
if(b >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
caml_call1(f, a[i + 1]);
|
|
var c = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function iter2(f, a, b){
|
|
if(a.length - 1 !== b.length - 1)
|
|
return Stdlib[1].call
|
|
(null, "Float.Array.iter2: arrays must have the same length");
|
|
var c = a.length - 2 | 0;
|
|
if(c >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
caml_call2(f, a[i + 1], b[i + 1]);
|
|
var d = i + 1 | 0;
|
|
if(c === i) break;
|
|
i = d;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function map(f, a){
|
|
var l = a.length - 1, r = caml_floatarray_create(l), b = l - 1 | 0;
|
|
if(b >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
r[i + 1] = caml_call1(f, a[i + 1]);
|
|
var c = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
function map_inplace(f, a){
|
|
var b = a.length - 2 | 0;
|
|
if(b >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
a[i + 1] = caml_call1(f, a[i + 1]);
|
|
var c = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function map2(f, a, b){
|
|
var la = a.length - 1, lb = b.length - 1;
|
|
if(la !== lb)
|
|
return Stdlib[1].call
|
|
(null, "Float.Array.map2: arrays must have the same length");
|
|
var r = caml_floatarray_create(la), c = la - 1 | 0;
|
|
if(c >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
r[i + 1] = caml_call2(f, a[i + 1], b[i + 1]);
|
|
var d = i + 1 | 0;
|
|
if(c === i) break;
|
|
i = d;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
function iteri(f, a){
|
|
var b = a.length - 2 | 0;
|
|
if(b >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
caml_call2(f, i, a[i + 1]);
|
|
var c = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function mapi(f, a){
|
|
var l = a.length - 1, r = caml_floatarray_create(l), b = l - 1 | 0;
|
|
if(b >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
r[i + 1] = caml_call2(f, i, a[i + 1]);
|
|
var c = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
function mapi_inplace(f, a){
|
|
var b = a.length - 2 | 0;
|
|
if(b >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
a[i + 1] = caml_call2(f, i, a[i + 1]);
|
|
var c = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function fold_left(f, x, a){
|
|
var b = a.length - 2 | 0;
|
|
if(b < 0)
|
|
var r$0 = x;
|
|
else{
|
|
var r = x, i = 0;
|
|
for(;;){
|
|
var c = caml_call2(f, r, a[i + 1]), d = i + 1 | 0;
|
|
if(b === i){var r$0 = c; break;}
|
|
r = c;
|
|
i = d;
|
|
}
|
|
}
|
|
return r$0;
|
|
}
|
|
function fold_right(f, a, x){
|
|
var b = a.length - 2 | 0;
|
|
if(b < 0)
|
|
var r$0 = x;
|
|
else{
|
|
var r = x, i = b;
|
|
for(;;){
|
|
var c = caml_call2(f, a[i + 1], r), d = i - 1 | 0;
|
|
if(0 === i){var r$0 = c; break;}
|
|
r = c;
|
|
i = d;
|
|
}
|
|
}
|
|
return r$0;
|
|
}
|
|
function exists(p, a){
|
|
var n = a.length - 1, i = 0;
|
|
for(;;){
|
|
if(i === n) return 0;
|
|
if(caml_call1(p, a[i + 1])) return 1;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function for_all(p, a){
|
|
var n = a.length - 1, i = 0;
|
|
for(;;){
|
|
if(i === n) return 1;
|
|
if(! caml_call1(p, a[i + 1])) return 0;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function mem(x, a){
|
|
var n = a.length - 1, i = 0;
|
|
for(;;){
|
|
if(i === n) return 0;
|
|
if(0 === caml_float_compare(a[i + 1], x)) return 1;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function mem_ieee(x, a){
|
|
var n = a.length - 1, i = 0;
|
|
for(;;){
|
|
if(i === n) return 0;
|
|
if(x === a[i + 1]) return 1;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function find_opt(p, a){
|
|
var n = a.length - 1, i = 0;
|
|
for(;;){
|
|
if(i === n) return 0;
|
|
var x = a[i + 1];
|
|
if(caml_call1(p, x)) return [0, x];
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function find_index(p, a){
|
|
var n = a.length - 1, i = 0;
|
|
for(;;){
|
|
if(i === n) return 0;
|
|
if(caml_call1(p, a[i + 1])) return [0, i];
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function find_map(f, a){
|
|
var n = a.length - 1, i = 0;
|
|
for(;;){
|
|
if(i === n) return 0;
|
|
var r = caml_call1(f, a[i + 1]);
|
|
if(r) return r;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
function find_mapi(f, a){
|
|
var n = a.length - 1, i = 0;
|
|
for(;;){
|
|
if(i === n) return 0;
|
|
var r = caml_call2(f, i, a[i + 1]);
|
|
if(r) return r;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
var
|
|
Bottom = [248, "Stdlib.Float.Array.Bottom", runtime.caml_fresh_oo_id(0)],
|
|
b = [0, cst_float_ml, 484, 6];
|
|
function sort(cmp, a){
|
|
function maxson(l, i){
|
|
var i31 = ((i + i | 0) + i | 0) + 1 | 0;
|
|
if((i31 + 2 | 0) < l){
|
|
var
|
|
b = i31 + 1 | 0,
|
|
e = caml_check_bound(a, b)[b + 1],
|
|
x =
|
|
caml_call2(cmp, caml_check_bound(a, i31)[i31 + 1], e) < 0
|
|
? i31 + 1 | 0
|
|
: i31,
|
|
c = i31 + 2 | 0,
|
|
f = caml_check_bound(a, c)[c + 1],
|
|
x$0 =
|
|
caml_call2(cmp, caml_check_bound(a, x)[x + 1], f) < 0
|
|
? i31 + 2 | 0
|
|
: x;
|
|
return x$0;
|
|
}
|
|
if((i31 + 1 | 0) < l){
|
|
var d = i31 + 1 | 0, g = caml_check_bound(a, d)[d + 1];
|
|
if(0 > caml_call2(cmp, caml_check_bound(a, i31)[i31 + 1], g))
|
|
return i31 + 1 | 0;
|
|
}
|
|
if(i31 < l) return i31;
|
|
throw caml_maybe_attach_backtrace([0, Bottom, i], 1);
|
|
}
|
|
var l = a.length - 1, c = ((l + 1 | 0) / 3 | 0) - 1 | 0;
|
|
if(c >= 0){
|
|
var i$5 = c;
|
|
for(;;){
|
|
var e$1 = caml_check_bound(a, i$5)[i$5 + 1];
|
|
try{
|
|
var i = i$5;
|
|
for(;;){
|
|
var j = maxson(l, i);
|
|
if(0 >= caml_call2(cmp, caml_check_bound(a, j)[j + 1], e$1)){caml_check_bound(a, i)[i + 1] = e$1; break;}
|
|
var h = caml_check_bound(a, j)[j + 1];
|
|
caml_check_bound(a, i)[i + 1] = h;
|
|
i = j;
|
|
}
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn[1] !== Bottom) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var i$0 = exn[2];
|
|
caml_check_bound(a, i$0)[i$0 + 1] = e$1;
|
|
}
|
|
var o = i$5 - 1 | 0;
|
|
if(0 === i$5) break;
|
|
i$5 = o;
|
|
}
|
|
}
|
|
var d = l - 1 | 0;
|
|
if(d >= 2){
|
|
var i$4 = d;
|
|
a:
|
|
for(;;){
|
|
var e$0 = caml_check_bound(a, i$4)[i$4 + 1];
|
|
a[i$4 + 1] = caml_check_bound(a, 0)[1];
|
|
try{
|
|
var i$1 = 0;
|
|
for(;;){
|
|
var j$0 = maxson(i$4, i$1), k = caml_check_bound(a, j$0)[j$0 + 1];
|
|
caml_check_bound(a, i$1)[i$1 + 1] = k;
|
|
i$1 = j$0;
|
|
}
|
|
}
|
|
catch(exn){
|
|
var exn$0 = caml_wrap_exception(exn);
|
|
if(exn$0[1] !== Bottom) throw caml_maybe_attach_backtrace(exn$0, 0);
|
|
var i$2 = exn$0[2], i$3 = i$2;
|
|
for(;;){
|
|
var father = (i$3 - 1 | 0) / 3 | 0;
|
|
if(i$3 === father)
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, b], 1);
|
|
if(0 <= caml_call2(cmp, caml_check_bound(a, father)[father + 1], e$0))
|
|
caml_check_bound(a, i$3)[i$3 + 1] = e$0;
|
|
else{
|
|
var m = caml_check_bound(a, father)[father + 1];
|
|
caml_check_bound(a, i$3)[i$3 + 1] = m;
|
|
if(0 < father){i$3 = father; continue;}
|
|
caml_check_bound(a, 0)[1] = e$0;
|
|
}
|
|
var n = i$4 - 1 | 0;
|
|
if(2 === i$4) break a;
|
|
i$4 = n;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
var f = 1 < l ? 1 : 0;
|
|
if(f){
|
|
var e = caml_check_bound(a, 1)[2];
|
|
a[2] = caml_check_bound(a, 0)[1];
|
|
a[1] = e;
|
|
var g = 0;
|
|
}
|
|
else
|
|
var g = f;
|
|
return g;
|
|
}
|
|
function stable_sort(cmp, a){
|
|
function merge(src1ofs, src1len, src2, src2ofs, src2len, dst, dstofs){
|
|
var
|
|
src1r = src1ofs + src1len | 0,
|
|
src2r = src2ofs + src2len | 0,
|
|
s2$1 = caml_check_bound(src2, src2ofs)[src2ofs + 1],
|
|
s1$1 = caml_check_bound(a, src1ofs)[src1ofs + 1],
|
|
i1 = src1ofs,
|
|
s1 = s1$1,
|
|
i2 = src2ofs,
|
|
s2 = s2$1,
|
|
d = dstofs;
|
|
for(;;)
|
|
if(0 < caml_call2(cmp, s1, s2)){
|
|
caml_check_bound(dst, d)[d + 1] = s2;
|
|
var i2$0 = i2 + 1 | 0;
|
|
if(i2$0 >= src2r) return blit(a, i1, dst, d + 1 | 0, src1r - i1 | 0);
|
|
var d$0 = d + 1 | 0, s2$0 = caml_check_bound(src2, i2$0)[i2$0 + 1];
|
|
i2 = i2$0;
|
|
s2 = s2$0;
|
|
d = d$0;
|
|
}
|
|
else{
|
|
caml_check_bound(dst, d)[d + 1] = s1;
|
|
var i1$0 = i1 + 1 | 0;
|
|
if(i1$0 >= src1r)
|
|
return blit(src2, i2, dst, d + 1 | 0, src2r - i2 | 0);
|
|
var d$1 = d + 1 | 0, s1$0 = caml_check_bound(a, i1$0)[i1$0 + 1];
|
|
i1 = i1$0;
|
|
s1 = s1$0;
|
|
d = d$1;
|
|
}
|
|
}
|
|
function isortto(srcofs, dst, dstofs, len){
|
|
var b = len - 1 | 0;
|
|
if(b >= 0){
|
|
var i = 0;
|
|
a:
|
|
for(;;){
|
|
var
|
|
c = srcofs + i | 0,
|
|
e = caml_check_bound(a, c)[c + 1],
|
|
j = (dstofs + i | 0) - 1 | 0;
|
|
for(;;){
|
|
if
|
|
(dstofs <= j
|
|
&& 0 < caml_call2(cmp, caml_check_bound(dst, j)[j + 1], e)){
|
|
var d = j + 1 | 0, g = caml_check_bound(dst, j)[j + 1];
|
|
caml_check_bound(dst, d)[d + 1] = g;
|
|
var j$0 = j - 1 | 0;
|
|
j = j$0;
|
|
continue;
|
|
}
|
|
var f = j + 1 | 0;
|
|
caml_check_bound(dst, f)[f + 1] = e;
|
|
var h = i + 1 | 0;
|
|
if(b === i) break a;
|
|
i = h;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function sortto(srcofs, dst, dstofs, len){
|
|
if(len <= 5) return isortto(srcofs, dst, dstofs, len);
|
|
var l1 = len / 2 | 0, l2 = len - l1 | 0;
|
|
sortto(srcofs + l1 | 0, dst, dstofs + l1 | 0, l2);
|
|
sortto(srcofs, a, srcofs + l2 | 0, l1);
|
|
return merge(srcofs + l2 | 0, l1, dst, dstofs + l1 | 0, l2, dst, dstofs);
|
|
}
|
|
var l = a.length - 1;
|
|
if(l <= 5) return isortto(0, a, 0, l);
|
|
var l1 = l / 2 | 0, l2 = l - l1 | 0, t = caml_floatarray_create(l2);
|
|
sortto(l1, t, 0, l2);
|
|
sortto(0, a, l2, l1);
|
|
return merge(l2, l1, t, 0, l2, a, 0);
|
|
}
|
|
function shuffle(rand, a){
|
|
var b = a.length - 2 | 0;
|
|
if(b >= 1){
|
|
var i = b;
|
|
for(;;){
|
|
var j = caml_call1(rand, i + 1 | 0), v = a[i + 1];
|
|
a[i + 1] = caml_check_bound(a, j)[j + 1];
|
|
a[j + 1] = v;
|
|
var c = i - 1 | 0;
|
|
if(1 === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function to_seq(a){
|
|
function aux(i, param){
|
|
if(i >= a.length - 1) return 0;
|
|
var x = a[i + 1], b = i + 1 | 0;
|
|
return [0, x, function(a){return aux(b, a);}];
|
|
}
|
|
return function(a){return aux(0, a);};
|
|
}
|
|
function to_seqi(a){
|
|
function aux(i, param){
|
|
if(i >= a.length - 1) return 0;
|
|
var x = a[i + 1], b = i + 1 | 0;
|
|
return [0, [0, i, x], function(a){return aux(b, a);}];
|
|
}
|
|
return function(a){return aux(0, a);};
|
|
}
|
|
function of_seq(i$2){
|
|
var
|
|
l =
|
|
Stdlib_Seq[5].call(null, function(acc, x){return [0, x, acc];}, 0, i$2),
|
|
len = Stdlib_List[1].call(null, l),
|
|
a = caml_floatarray_create(len),
|
|
i$1 = len - 1 | 0,
|
|
i = i$1,
|
|
param = l;
|
|
for(;;){
|
|
if(! param) return a;
|
|
var tl = param[2], hd = param[1];
|
|
a[i + 1] = hd;
|
|
var i$0 = i - 1 | 0;
|
|
i = i$0;
|
|
param = tl;
|
|
}
|
|
}
|
|
function map_to_array(f, a){
|
|
var l = a.length - 1;
|
|
if(0 === l) return [0];
|
|
var r = caml_make_vect(l, caml_call1(f, a[1])), b = l - 1 | 0;
|
|
if(b >= 1){
|
|
var i = 1;
|
|
for(;;){
|
|
r[i + 1] = caml_call1(f, a[i + 1]);
|
|
var c = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
function map_from_array(f, a){
|
|
var l = a.length - 1, r = caml_floatarray_create(l), b = l - 1 | 0;
|
|
if(b >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
r[i + 1] = caml_call1(f, a[i + 1]);
|
|
var c = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
var
|
|
Stdlib_Float =
|
|
[0,
|
|
0.,
|
|
1.,
|
|
-1.,
|
|
succ,
|
|
pred,
|
|
infinity,
|
|
neg_infinity,
|
|
nan,
|
|
NaN,
|
|
nan,
|
|
3.141592653589793,
|
|
max_float,
|
|
min_float,
|
|
epsilon,
|
|
is_finite,
|
|
is_infinite,
|
|
is_nan,
|
|
is_integer,
|
|
of_string_opt,
|
|
to_string,
|
|
caml_float_compare,
|
|
equal,
|
|
min,
|
|
max,
|
|
min_max,
|
|
min_num,
|
|
max_num,
|
|
min_max_num,
|
|
seeded_hash,
|
|
hash,
|
|
[0,
|
|
function(a){return a.length - 1;},
|
|
function(b, a){return caml_check_bound(b, a)[a + 1];},
|
|
function(c, a, b){caml_check_bound(c, a)[a + 1] = b; return 0;},
|
|
make,
|
|
caml_floatarray_create,
|
|
init,
|
|
make_matrix,
|
|
init_matrix,
|
|
append,
|
|
concat,
|
|
sub,
|
|
copy,
|
|
fill,
|
|
blit,
|
|
to_list,
|
|
of_list,
|
|
iter,
|
|
iteri,
|
|
map,
|
|
map_inplace,
|
|
mapi,
|
|
mapi_inplace,
|
|
fold_left,
|
|
fold_right,
|
|
iter2,
|
|
map2,
|
|
for_all,
|
|
exists,
|
|
mem,
|
|
mem_ieee,
|
|
find_opt,
|
|
find_index,
|
|
find_map,
|
|
find_mapi,
|
|
sort,
|
|
stable_sort,
|
|
stable_sort,
|
|
shuffle,
|
|
to_seq,
|
|
to_seqi,
|
|
of_seq,
|
|
map_to_array,
|
|
map_from_array],
|
|
[0,
|
|
function(a){return a.length - 1;},
|
|
function(b, a){return caml_check_bound(b, a)[a + 1];},
|
|
function(c, a, b){caml_check_bound(c, a)[a + 1] = b; return 0;},
|
|
make,
|
|
caml_floatarray_create,
|
|
init,
|
|
make_matrix,
|
|
init_matrix,
|
|
append,
|
|
concat,
|
|
sub,
|
|
copy,
|
|
fill,
|
|
blit,
|
|
to_list,
|
|
of_list,
|
|
iter,
|
|
iteri,
|
|
map,
|
|
map_inplace,
|
|
mapi,
|
|
mapi_inplace,
|
|
fold_left,
|
|
fold_right,
|
|
iter2,
|
|
map2,
|
|
for_all,
|
|
exists,
|
|
mem,
|
|
mem_ieee,
|
|
find_opt,
|
|
find_index,
|
|
find_map,
|
|
find_mapi,
|
|
sort,
|
|
stable_sort,
|
|
stable_sort,
|
|
shuffle,
|
|
to_seq,
|
|
to_seqi,
|
|
of_seq,
|
|
map_to_array,
|
|
map_from_array]];
|
|
runtime.caml_register_global(25, Stdlib_Float, "Stdlib__Float");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 7049 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Int32:[N,N,N,F(2),F(2),F(1)*,F(1)*,F(1),N,N,F(1)*,F(1),F(1),F(1)*,F(2)*,F(2)*,F(2),F(2),F(2),F(2)*,F(1)*]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_greaterequal = runtime.caml_greaterequal,
|
|
caml_hash = runtime.caml_hash,
|
|
caml_int_compare = runtime.caml_int_compare,
|
|
caml_lessequal = runtime.caml_lessequal,
|
|
caml_lessthan = runtime.caml_lessthan,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_mul = runtime.caml_mul,
|
|
caml_wrap_exception = runtime.caml_wrap_exception,
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_Sys = global_data.Stdlib__Sys,
|
|
Assert_failure = global_data.Assert_failure;
|
|
function succ(n){return n + 1 | 0;}
|
|
function pred(n){return n - 1 | 0;}
|
|
function abs(n){return caml_greaterequal(n, 0) ? n : - n | 0;}
|
|
function lognot(n){return n ^ -1;}
|
|
var match = Stdlib_Sys[9];
|
|
if(32 === match)
|
|
var
|
|
max_int = Stdlib[19],
|
|
unsigned_to_int =
|
|
function(n){
|
|
if(caml_greaterequal(n, 0) && caml_lessequal(n, max_int))
|
|
return [0, n];
|
|
return 0;
|
|
};
|
|
else{
|
|
if(64 !== match)
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Assert_failure, [0, "int32.ml", 69, 6]], 1);
|
|
var unsigned_to_int = function(n){return [0, n & -1];};
|
|
}
|
|
function to_string(n){return runtime.caml_format_int("%d", n);}
|
|
function of_string_opt(s){
|
|
try{var a = [0, runtime.caml_int_of_string(s)]; return a;}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn[1] === Stdlib[7]) return 0;
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
}
|
|
var equal = runtime.caml_equal;
|
|
function unsigned_compare(n, m){
|
|
var y = m + 2147483648 | 0, x = n + 2147483648 | 0;
|
|
return caml_int_compare(x, y);
|
|
}
|
|
function unsigned_lt(n, m){
|
|
return caml_lessthan(n + 2147483648 | 0, m + 2147483648 | 0);
|
|
}
|
|
function min(x, y){return caml_lessequal(x, y) ? x : y;}
|
|
function max(x, y){return caml_greaterequal(x, y) ? x : y;}
|
|
var zero = 0, one = 1;
|
|
function unsigned_div(n, d){
|
|
if(caml_lessthan(d, 0)) return unsigned_lt(n, d) ? zero : one;
|
|
var q = runtime.caml_div(n >>> 1 | 0, d) << 1, r = n - caml_mul(q, d) | 0;
|
|
return unsigned_lt(r, d) ? q : q + 1 | 0;
|
|
}
|
|
function unsigned_rem(n, d){
|
|
return n - caml_mul(unsigned_div(n, d), d) | 0;
|
|
}
|
|
function seeded_hash(seed, x){return caml_hash(10, 100, seed, x);}
|
|
function hash(x){return caml_hash(10, 100, 0, x);}
|
|
var
|
|
Stdlib_Int32 =
|
|
[0,
|
|
zero,
|
|
one,
|
|
-1,
|
|
unsigned_div,
|
|
unsigned_rem,
|
|
succ,
|
|
pred,
|
|
abs,
|
|
2147483647,
|
|
-2147483648,
|
|
lognot,
|
|
unsigned_to_int,
|
|
of_string_opt,
|
|
to_string,
|
|
caml_int_compare,
|
|
unsigned_compare,
|
|
equal,
|
|
min,
|
|
max,
|
|
seeded_hash,
|
|
hash];
|
|
runtime.caml_register_global(15, Stdlib_Int32, "Stdlib__Int32");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 7148 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Int64:[N,N,N,F(2),F(2),F(1)*,F(1)*,F(1),N,N,F(1)*,F(1),F(1),F(1)*,F(2)*,F(2)*,F(2),F(2),F(2),F(2)*,F(1)*]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_greaterequal = runtime.caml_greaterequal,
|
|
caml_hash = runtime.caml_hash,
|
|
caml_int64_add = runtime.caml_int64_add,
|
|
caml_int64_compare = runtime.caml_int64_compare,
|
|
caml_int64_create_lo_mi_hi = runtime.caml_int64_create_lo_mi_hi,
|
|
caml_int64_mul = runtime.caml_int64_mul,
|
|
caml_int64_sub = runtime.caml_int64_sub,
|
|
caml_lessequal = runtime.caml_lessequal,
|
|
caml_lessthan = runtime.caml_lessthan,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_wrap_exception = runtime.caml_wrap_exception,
|
|
a = caml_int64_create_lo_mi_hi(1, 0, 0),
|
|
zero = caml_int64_create_lo_mi_hi(0, 0, 0),
|
|
one = caml_int64_create_lo_mi_hi(1, 0, 0),
|
|
minus_one = caml_int64_create_lo_mi_hi(16777215, 16777215, 65535),
|
|
min_int = caml_int64_create_lo_mi_hi(0, 0, 32768),
|
|
max_int = caml_int64_create_lo_mi_hi(16777215, 16777215, 32767),
|
|
Stdlib = runtime.caml_get_global_data().Stdlib,
|
|
b = caml_int64_create_lo_mi_hi(1, 0, 0),
|
|
c = caml_int64_create_lo_mi_hi(0, 0, 0),
|
|
d = caml_int64_create_lo_mi_hi(16777215, 16777215, 65535);
|
|
function succ(n){return caml_int64_add(n, a);}
|
|
function pred(n){return caml_int64_sub(n, b);}
|
|
function abs(n){
|
|
return caml_greaterequal(n, c) ? n : runtime.caml_int64_neg(n);
|
|
}
|
|
function lognot(n){return runtime.caml_int64_xor(n, d);}
|
|
var
|
|
max_int$0 = runtime.caml_int64_of_int32(Stdlib[19]),
|
|
e = caml_int64_create_lo_mi_hi(0, 0, 0);
|
|
function unsigned_to_int(n){
|
|
if(caml_greaterequal(n, e) && caml_lessequal(n, max_int$0))
|
|
return [0, runtime.caml_int64_to_int32(n)];
|
|
return 0;
|
|
}
|
|
function to_string(n){return runtime.caml_int64_format("%d", n);}
|
|
function of_string_opt(s){
|
|
try{var a = [0, runtime.caml_int64_of_string(s)]; return a;}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn[1] === Stdlib[7]) return 0;
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
}
|
|
function compare(x, y){return caml_int64_compare(x, y);}
|
|
var equal = runtime.caml_equal;
|
|
function unsigned_compare(n, m){
|
|
var y = caml_int64_sub(m, min_int), x = caml_int64_sub(n, min_int);
|
|
return caml_int64_compare(x, y);
|
|
}
|
|
function unsigned_lt(n, m){
|
|
return caml_lessthan
|
|
(caml_int64_sub(n, min_int), caml_int64_sub(m, min_int));
|
|
}
|
|
function min(x, y){return caml_lessequal(x, y) ? x : y;}
|
|
function max(x, y){return caml_greaterequal(x, y) ? x : y;}
|
|
function unsigned_div(n, d){
|
|
if(caml_lessthan(d, zero)) return unsigned_lt(n, d) ? zero : one;
|
|
var
|
|
q =
|
|
runtime.caml_int64_shift_left
|
|
(runtime.caml_int64_div
|
|
(runtime.caml_int64_shift_right_unsigned(n, 1), d),
|
|
1),
|
|
r = caml_int64_sub(n, caml_int64_mul(q, d));
|
|
return unsigned_lt(r, d) ? q : caml_int64_add(q, a);
|
|
}
|
|
function unsigned_rem(n, d){
|
|
return caml_int64_sub(n, caml_int64_mul(unsigned_div(n, d), d));
|
|
}
|
|
function seeded_hash(seed, x){return caml_hash(10, 100, seed, x);}
|
|
function hash(x){return caml_hash(10, 100, 0, x);}
|
|
runtime.caml_register_global
|
|
(12,
|
|
[0,
|
|
zero,
|
|
one,
|
|
minus_one,
|
|
unsigned_div,
|
|
unsigned_rem,
|
|
succ,
|
|
pred,
|
|
abs,
|
|
max_int,
|
|
min_int,
|
|
lognot,
|
|
unsigned_to_int,
|
|
of_string_opt,
|
|
to_string,
|
|
compare,
|
|
unsigned_compare,
|
|
equal,
|
|
min,
|
|
max,
|
|
seeded_hash,
|
|
hash],
|
|
"Stdlib__Int64");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 7257 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Nativeint:[N,N,N,F(2),F(2),F(1)*,F(1)*,F(1),N,N,N,F(1)*,F(1),F(1),F(1)*,F(2)*,F(2)*,F(2)*,F(2),F(2),F(2)*,F(1)*]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_greaterequal = runtime.caml_greaterequal,
|
|
caml_hash = runtime.caml_hash,
|
|
caml_int_compare = runtime.caml_int_compare,
|
|
caml_lessequal = runtime.caml_lessequal,
|
|
caml_lessthan = runtime.caml_lessthan,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_mul = runtime.caml_mul,
|
|
caml_wrap_exception = runtime.caml_wrap_exception,
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_Sys = global_data.Stdlib__Sys;
|
|
function succ(n){return n + 1 | 0;}
|
|
function pred(n){return n - 1 | 0;}
|
|
function abs(n){return caml_greaterequal(n, 0) ? n : - n | 0;}
|
|
var
|
|
size = Stdlib_Sys[9],
|
|
min_int = 1 << (size - 1 | 0),
|
|
max_int = min_int - 1 | 0;
|
|
function lognot(n){return n ^ -1;}
|
|
var max_int$0 = Stdlib[19];
|
|
function unsigned_to_int(n){
|
|
if(caml_greaterequal(n, 0) && caml_lessequal(n, max_int$0)) return [0, n];
|
|
return 0;
|
|
}
|
|
function to_string(n){return runtime.caml_format_int("%d", n);}
|
|
function of_string_opt(s){
|
|
try{var a = [0, runtime.caml_int_of_string(s)]; return a;}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn[1] === Stdlib[7]) return 0;
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
}
|
|
function equal(x, y){return 0 === caml_int_compare(x, y) ? 1 : 0;}
|
|
function unsigned_compare(n, m){
|
|
var y = m - min_int | 0, x = n - min_int | 0;
|
|
return caml_int_compare(x, y);
|
|
}
|
|
function unsigned_lt(n, m){
|
|
return caml_lessthan(n - min_int | 0, m - min_int | 0);
|
|
}
|
|
function min(x, y){return caml_lessequal(x, y) ? x : y;}
|
|
function max(x, y){return caml_greaterequal(x, y) ? x : y;}
|
|
var zero = 0, one = 1;
|
|
function unsigned_div(n, d){
|
|
if(caml_lessthan(d, 0)) return unsigned_lt(n, d) ? zero : one;
|
|
var q = runtime.caml_div(n >>> 1 | 0, d) << 1, r = n - caml_mul(q, d) | 0;
|
|
return unsigned_lt(r, d) ? q : q + 1 | 0;
|
|
}
|
|
function unsigned_rem(n, d){
|
|
return n - caml_mul(unsigned_div(n, d), d) | 0;
|
|
}
|
|
function seeded_hash(seed, x){return caml_hash(10, 100, seed, x);}
|
|
function hash(x){return caml_hash(10, 100, 0, x);}
|
|
runtime.caml_register_global
|
|
(13,
|
|
[0,
|
|
zero,
|
|
one,
|
|
-1,
|
|
unsigned_div,
|
|
unsigned_rem,
|
|
succ,
|
|
pred,
|
|
abs,
|
|
size,
|
|
max_int,
|
|
min_int,
|
|
lognot,
|
|
unsigned_to_int,
|
|
of_string_opt,
|
|
to_string,
|
|
caml_int_compare,
|
|
unsigned_compare,
|
|
equal,
|
|
min,
|
|
max,
|
|
seeded_hash,
|
|
hash],
|
|
"Stdlib__Nativeint");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 9638 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Buffer:[F(1)*,F(1),F(1),F(3),F(5),F(2),F(1)*,F(1),F(1),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(4),F(4),F(3),F(2),F(3),F(1)*->F(1),F(1)*->F(1),F(2),F(1),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_blit_string = runtime.caml_blit_string,
|
|
caml_bswap16 = runtime.caml_bswap16,
|
|
caml_bytes_get = runtime.caml_bytes_get,
|
|
caml_bytes_set = runtime.caml_bytes_set,
|
|
caml_bytes_set16 = runtime.caml_bytes_set16,
|
|
caml_bytes_set32 = runtime.caml_bytes_set32,
|
|
caml_bytes_set64 = runtime.caml_bytes_set64,
|
|
caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set,
|
|
caml_create_bytes = runtime.caml_create_bytes,
|
|
caml_int32_bswap = runtime.caml_int32_bswap,
|
|
caml_int64_bswap = runtime.caml_int64_bswap,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_ml_bytes_length = runtime.caml_ml_bytes_length,
|
|
caml_ml_string_length = runtime.caml_ml_string_length,
|
|
caml_string_get = runtime.caml_string_get,
|
|
caml_wrap_exception = runtime.caml_wrap_exception;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib_Bytes = global_data.Stdlib__Bytes,
|
|
Stdlib_Sys = global_data.Stdlib__Sys,
|
|
Stdlib_Seq = global_data.Stdlib__Seq,
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_String = global_data.Stdlib__String,
|
|
Assert_failure = global_data.Assert_failure,
|
|
dummy = 0;
|
|
function create(n){
|
|
var
|
|
n$0 = 1 <= n ? n : 1,
|
|
n$1 = Stdlib_Sys[12] < n$0 ? Stdlib_Sys[12] : n$0,
|
|
s = caml_create_bytes(n$1);
|
|
return [0, [0, s, n$1], 0, s];
|
|
}
|
|
function contents(b){return Stdlib_Bytes[8].call(null, b[1][1], 0, b[2]);}
|
|
function to_bytes(b){return Stdlib_Bytes[7].call(null, b[1][1], 0, b[2]);}
|
|
function sub(b, ofs, len){
|
|
if(0 <= ofs && 0 <= len && (b[2] - len | 0) >= ofs)
|
|
return Stdlib_Bytes[8].call(null, b[1][1], ofs, len);
|
|
return Stdlib[1].call(null, "Buffer.sub");
|
|
}
|
|
function blit(src, srcoff, dst, dstoff, len){
|
|
if
|
|
(0 <= len
|
|
&&
|
|
0 <= srcoff
|
|
&&
|
|
(src[2] - len | 0) >= srcoff
|
|
&& 0 <= dstoff && (caml_ml_bytes_length(dst) - len | 0) >= dstoff)
|
|
return Stdlib_Bytes[11].call(null, src[1][1], srcoff, dst, dstoff, len);
|
|
return Stdlib[1].call(null, "Buffer.blit");
|
|
}
|
|
function nth(b, ofs){
|
|
var position = b[2], match = b[1], length = match[2], buffer = match[1];
|
|
if(0 <= ofs && position > ofs && length >= position)
|
|
return runtime.caml_bytes_unsafe_get(buffer, ofs);
|
|
return Stdlib[1].call(null, "Buffer.nth");
|
|
}
|
|
function length(b){return b[2];}
|
|
function clear(b){b[2] = 0; return 0;}
|
|
function reset(b){
|
|
b[2] = 0;
|
|
var inner = [0, b[3], caml_ml_bytes_length(b[3])];
|
|
b[1] = inner;
|
|
return 0;
|
|
}
|
|
function resize(b, more){
|
|
var old_pos = b[2], old_len = b[1][2], new_len = old_len;
|
|
for(;;){
|
|
if(new_len >= (old_pos + more | 0)) break;
|
|
new_len = 2 * new_len | 0;
|
|
}
|
|
var
|
|
new_len$0 =
|
|
Stdlib_Sys[12] < new_len
|
|
? (old_pos
|
|
+ more
|
|
| 0)
|
|
<= Stdlib_Sys[12]
|
|
? Stdlib_Sys[12]
|
|
: (Stdlib[2].call(null, "Buffer.add: cannot grow buffer"), new_len)
|
|
: new_len,
|
|
new_buffer = caml_create_bytes(new_len$0);
|
|
Stdlib_Bytes[11].call(null, b[1][1], 0, new_buffer, 0, b[2]);
|
|
b[1] = [0, new_buffer, new_len$0];
|
|
}
|
|
function add_char(b, c){
|
|
var pos = b[2], match = b[1], length = match[2], buffer = match[1];
|
|
if(length <= pos){
|
|
resize(b, 1);
|
|
caml_bytes_set(b[1][1], b[2], c);
|
|
}
|
|
else
|
|
caml_bytes_unsafe_set(buffer, pos, c);
|
|
b[2] = pos + 1 | 0;
|
|
return 0;
|
|
}
|
|
function add_utf_8_uchar(b, u){
|
|
for(;;){
|
|
var pos = b[2], uchar_utf_8_byte_length_max = 4;
|
|
if(b[1][2] <= pos) resize(b, uchar_utf_8_byte_length_max);
|
|
var n = Stdlib_Bytes[51].call(null, b[1][1], pos, u);
|
|
if(0 !== n){b[2] = pos + n | 0; return 0;}
|
|
resize(b, uchar_utf_8_byte_length_max);
|
|
}
|
|
}
|
|
var uchar_utf_16_byte_length_max = 4;
|
|
function add_utf_16be_uchar(b, u){
|
|
for(;;){
|
|
var pos = b[2];
|
|
if(b[1][2] <= pos) resize(b, uchar_utf_16_byte_length_max);
|
|
var n = Stdlib_Bytes[54].call(null, b[1][1], pos, u);
|
|
if(0 !== n){b[2] = pos + n | 0; return 0;}
|
|
resize(b, uchar_utf_16_byte_length_max);
|
|
}
|
|
}
|
|
function add_utf_16le_uchar(b, u){
|
|
for(;;){
|
|
var pos = b[2];
|
|
if(b[1][2] <= pos) resize(b, uchar_utf_16_byte_length_max);
|
|
var n = Stdlib_Bytes[57].call(null, b[1][1], pos, u);
|
|
if(0 !== n){b[2] = pos + n | 0; return 0;}
|
|
resize(b, uchar_utf_16_byte_length_max);
|
|
}
|
|
}
|
|
function add_substring(b, s, offset, len){
|
|
var a = offset < 0;
|
|
if(a)
|
|
var c = a;
|
|
else
|
|
var d = len < 0, c = d || (caml_ml_string_length(s) - len | 0) < offset;
|
|
if(c) Stdlib[1].call(null, "Buffer.add_substring/add_subbytes");
|
|
var
|
|
position = b[2],
|
|
match = b[1],
|
|
length = match[2],
|
|
buffer = match[1],
|
|
new_position = position + len | 0;
|
|
if(length < new_position){
|
|
resize(b, len);
|
|
Stdlib_Bytes[12].call(null, s, offset, b[1][1], b[2], len);
|
|
}
|
|
else
|
|
caml_blit_string(s, offset, buffer, position, len);
|
|
b[2] = new_position;
|
|
return 0;
|
|
}
|
|
function add_subbytes(b, s, offset, len){
|
|
return add_substring(b, Stdlib_Bytes[44].call(null, s), offset, len);
|
|
}
|
|
function add_string(b, s){
|
|
var
|
|
len = caml_ml_string_length(s),
|
|
position = b[2],
|
|
match = b[1],
|
|
length = match[2],
|
|
buffer = match[1],
|
|
new_position = position + len | 0;
|
|
if(length < new_position){
|
|
resize(b, len);
|
|
Stdlib_Bytes[12].call(null, s, 0, b[1][1], b[2], len);
|
|
}
|
|
else
|
|
caml_blit_string(s, 0, buffer, position, len);
|
|
b[2] = new_position;
|
|
return 0;
|
|
}
|
|
function add_bytes(b, s){
|
|
return add_string(b, Stdlib_Bytes[44].call(null, s));
|
|
}
|
|
function add_buffer(b, bs){return add_subbytes(b, bs[1][1], 0, bs[2]);}
|
|
function add_channel(b, ic, to_read$1){
|
|
var a = to_read$1 < 0, c = a || Stdlib_Sys[12] < to_read$1;
|
|
if(c) Stdlib[1].call(null, "Buffer.add_channel");
|
|
if(b[1][2] < (b[2] + to_read$1 | 0)) resize(b, to_read$1);
|
|
var
|
|
ofs$1 = b[2],
|
|
buf = b[1][1],
|
|
already_read = 0,
|
|
ofs = ofs$1,
|
|
to_read = to_read$1;
|
|
for(;;){
|
|
if(0 !== to_read){
|
|
var r = Stdlib[84].call(null, ic, buf, ofs, to_read);
|
|
if(0 !== r){
|
|
var
|
|
already_read$0 = already_read + r | 0,
|
|
ofs$0 = ofs + r | 0,
|
|
to_read$0 = to_read - r | 0;
|
|
already_read = already_read$0;
|
|
ofs = ofs$0;
|
|
to_read = to_read$0;
|
|
continue;
|
|
}
|
|
}
|
|
b[2] = b[2] + already_read | 0;
|
|
if(already_read < to_read$1)
|
|
throw caml_maybe_attach_backtrace(Stdlib[12], 1);
|
|
return 0;
|
|
}
|
|
}
|
|
function output_buffer(oc, b){
|
|
return Stdlib[68].call(null, oc, b[1][1], 0, b[2]);
|
|
}
|
|
var a = [0, "buffer.ml", 220, 9];
|
|
function add_substitute(b, f, s){
|
|
var lim$1 = caml_ml_string_length(s), previous = 32, i$4 = 0;
|
|
for(;;){
|
|
if(i$4 >= lim$1){
|
|
var c = 92 === previous ? 1 : 0;
|
|
return c ? add_char(b, previous) : c;
|
|
}
|
|
var previous$0 = caml_string_get(s, i$4);
|
|
if(36 === previous$0)
|
|
if(92 === previous){
|
|
add_char(b, previous$0);
|
|
var i$5 = i$4 + 1 | 0;
|
|
previous = 32;
|
|
i$4 = i$5;
|
|
}
|
|
else{
|
|
var start = i$4 + 1 | 0;
|
|
try{
|
|
if(lim$1 <= start) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
var opening = caml_string_get(s, start);
|
|
a:
|
|
{
|
|
if(40 !== opening && 123 !== opening){
|
|
var lim$0 = caml_ml_string_length(s), i$2 = start;
|
|
for(;;){
|
|
b:
|
|
{
|
|
if(lim$0 > i$2){
|
|
var match = caml_string_get(s, i$2);
|
|
if(91 <= match){
|
|
if(97 <= match){
|
|
if(123 <= match){var stop$0 = i$2; break b;}
|
|
}
|
|
else if(95 !== match){var stop$0 = i$2; break b;}
|
|
}
|
|
else
|
|
if(58 <= match){
|
|
if(65 > match){var stop$0 = i$2; break b;}
|
|
}
|
|
else if(48 > match){var stop$0 = i$2; break b;}
|
|
var i$3 = i$2 + 1 | 0;
|
|
i$2 = i$3;
|
|
continue;
|
|
}
|
|
var stop$0 = lim$0;
|
|
}
|
|
if(stop$0 === start)
|
|
throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
var
|
|
val =
|
|
[0,
|
|
Stdlib_String[16].call(null, s, start, stop$0 - start | 0),
|
|
stop$0];
|
|
break a;
|
|
}
|
|
}
|
|
var new_start = start + 1 | 0;
|
|
if(40 === opening)
|
|
var closing = 41;
|
|
else{
|
|
if(123 !== opening)
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, a], 1);
|
|
var closing = 125;
|
|
}
|
|
var lim = caml_ml_string_length(s), k = 0, stop = new_start;
|
|
for(;;){
|
|
if(lim <= stop) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
if(caml_string_get(s, stop) === opening){
|
|
var i = stop + 1 | 0, k$0 = k + 1 | 0;
|
|
k = k$0;
|
|
stop = i;
|
|
}
|
|
else if(caml_string_get(s, stop) === closing){
|
|
if(0 === k){
|
|
var
|
|
val =
|
|
[0,
|
|
Stdlib_String[16].call
|
|
(null, s, new_start, (stop - start | 0) - 1 | 0),
|
|
stop + 1 | 0];
|
|
break;
|
|
}
|
|
var i$0 = stop + 1 | 0, k$1 = k - 1 | 0;
|
|
k = k$1;
|
|
stop = i$0;
|
|
}
|
|
else{var i$1 = stop + 1 | 0; stop = i$1;}
|
|
}
|
|
}
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn !== Stdlib[8]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
add_char(b, 36);
|
|
previous = 32;
|
|
i$4 = start;
|
|
continue;
|
|
}
|
|
var next_i = val[2], ident = val[1];
|
|
add_string(b, caml_call1(f, ident));
|
|
previous = 32;
|
|
i$4 = next_i;
|
|
}
|
|
else{
|
|
if(92 === previous) add_char(b, previous);
|
|
if(92 !== previous$0) add_char(b, previous$0);
|
|
var i$6 = i$4 + 1 | 0;
|
|
previous = previous$0;
|
|
i$4 = i$6;
|
|
}
|
|
}
|
|
}
|
|
function truncate(b, len){
|
|
if(0 <= len && b[2] >= len){b[2] = len; return 0;}
|
|
return Stdlib[1].call(null, "Buffer.truncate");
|
|
}
|
|
function to_seq(b){
|
|
function aux(i, param){
|
|
if(b[2] <= i) return 0;
|
|
var x = caml_bytes_get(b[1][1], i), a = i + 1 | 0;
|
|
return [0, x, function(b){return aux(a, b);}];
|
|
}
|
|
return function(a){return aux(0, a);};
|
|
}
|
|
function to_seqi(b){
|
|
function aux(i, param){
|
|
if(b[2] <= i) return 0;
|
|
var x = caml_bytes_get(b[1][1], i), a = i + 1 | 0;
|
|
return [0, [0, i, x], function(b){return aux(a, b);}];
|
|
}
|
|
return function(a){return aux(0, a);};
|
|
}
|
|
function add_seq(b, seq){
|
|
return Stdlib_Seq[4].call(null, function(a){return add_char(b, a);}, seq);
|
|
}
|
|
function of_seq(i){var b = create(32); add_seq(b, i); return b;}
|
|
function add_int8(b, x){
|
|
var
|
|
position = b[2],
|
|
match = b[1],
|
|
length = match[2],
|
|
buffer = match[1],
|
|
new_position = position + 1 | 0;
|
|
if(length < new_position){
|
|
resize(b, 1);
|
|
caml_bytes_set(b[1][1], b[2], x);
|
|
}
|
|
else
|
|
caml_bytes_unsafe_set(buffer, position, x);
|
|
b[2] = new_position;
|
|
return 0;
|
|
}
|
|
function add_int16_ne(b, x){
|
|
var
|
|
position = b[2],
|
|
match = b[1],
|
|
length = match[2],
|
|
buffer = match[1],
|
|
new_position = position + 2 | 0;
|
|
if(length < new_position){
|
|
resize(b, 2);
|
|
caml_bytes_set16(b[1][1], b[2], x);
|
|
}
|
|
else
|
|
caml_bytes_set16(buffer, position, x);
|
|
b[2] = new_position;
|
|
return 0;
|
|
}
|
|
function add_int32_ne(b, x){
|
|
var
|
|
position = b[2],
|
|
match = b[1],
|
|
length = match[2],
|
|
buffer = match[1],
|
|
new_position = position + 4 | 0;
|
|
if(length < new_position){
|
|
resize(b, 4);
|
|
caml_bytes_set32(b[1][1], b[2], x);
|
|
}
|
|
else
|
|
caml_bytes_set32(buffer, position, x);
|
|
b[2] = new_position;
|
|
return 0;
|
|
}
|
|
function add_int64_ne(b, x){
|
|
var
|
|
position = b[2],
|
|
match = b[1],
|
|
length = match[2],
|
|
buffer = match[1],
|
|
new_position = position + 8 | 0;
|
|
if(length < new_position){
|
|
resize(b, 8);
|
|
caml_bytes_set64(b[1][1], b[2], x);
|
|
}
|
|
else
|
|
caml_bytes_set64(buffer, position, x);
|
|
b[2] = new_position;
|
|
return 0;
|
|
}
|
|
function add_int16_le(b, x){
|
|
var a = Stdlib_Sys[11] ? caml_bswap16(x) : x;
|
|
return add_int16_ne(b, a);
|
|
}
|
|
function add_int16_be(b, x){
|
|
var x$0 = Stdlib_Sys[11] ? x : caml_bswap16(x);
|
|
return add_int16_ne(b, x$0);
|
|
}
|
|
function add_int32_le(b, x){
|
|
var a = Stdlib_Sys[11] ? caml_int32_bswap(x) : x;
|
|
return add_int32_ne(b, a);
|
|
}
|
|
function add_int32_be(b, x){
|
|
var x$0 = Stdlib_Sys[11] ? x : caml_int32_bswap(x);
|
|
return add_int32_ne(b, x$0);
|
|
}
|
|
function add_int64_le(b, x){
|
|
var a = Stdlib_Sys[11] ? caml_int64_bswap(x) : x;
|
|
return add_int64_ne(b, a);
|
|
}
|
|
function add_int64_be(b, x){
|
|
var x$0 = Stdlib_Sys[11] ? x : caml_int64_bswap(x);
|
|
return add_int64_ne(b, x$0);
|
|
}
|
|
runtime.caml_register_global
|
|
(14,
|
|
[0,
|
|
create,
|
|
contents,
|
|
to_bytes,
|
|
sub,
|
|
blit,
|
|
nth,
|
|
length,
|
|
clear,
|
|
reset,
|
|
output_buffer,
|
|
truncate,
|
|
add_char,
|
|
add_utf_8_uchar,
|
|
add_utf_16le_uchar,
|
|
add_utf_16be_uchar,
|
|
add_string,
|
|
add_bytes,
|
|
add_substring,
|
|
add_subbytes,
|
|
add_substitute,
|
|
add_buffer,
|
|
add_channel,
|
|
to_seq,
|
|
to_seqi,
|
|
add_seq,
|
|
of_seq,
|
|
add_int8,
|
|
add_int8,
|
|
add_int16_ne,
|
|
add_int16_be,
|
|
add_int16_le,
|
|
add_int16_ne,
|
|
add_int16_be,
|
|
add_int16_le,
|
|
add_int32_ne,
|
|
add_int32_be,
|
|
add_int32_le,
|
|
add_int64_ne,
|
|
add_int64_be,
|
|
add_int64_le],
|
|
"Stdlib__Buffer");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 10125 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Mutex:[F(1),F(1),F(1),F(1),F(2)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_ml_mutex_lock = runtime.caml_ml_mutex_lock,
|
|
caml_ml_mutex_unlock = runtime.caml_ml_mutex_unlock,
|
|
caml_wrap_exception = runtime.caml_wrap_exception;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function protect(m, f){
|
|
caml_ml_mutex_lock(m);
|
|
try{var x = caml_call1(f, 0);}
|
|
catch(e$0){
|
|
var e = caml_wrap_exception(e$0);
|
|
caml_ml_mutex_unlock(m);
|
|
throw caml_maybe_attach_backtrace(e, 0);
|
|
}
|
|
caml_ml_mutex_unlock(m);
|
|
return x;
|
|
}
|
|
var
|
|
Stdlib_Mutex =
|
|
[0,
|
|
runtime.caml_ml_mutex_new,
|
|
caml_ml_mutex_lock,
|
|
runtime.caml_ml_mutex_try_lock,
|
|
caml_ml_mutex_unlock,
|
|
protect];
|
|
runtime.caml_register_global(0, Stdlib_Mutex, "Stdlib__Mutex");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 10165 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Condition:[F(1),F(2),F(1),F(1)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
Stdlib_Condition =
|
|
[0,
|
|
runtime.caml_ml_condition_new,
|
|
runtime.caml_ml_condition_wait,
|
|
runtime.caml_ml_condition_signal,
|
|
runtime.caml_ml_condition_broadcast];
|
|
runtime.caml_register_global(0, Stdlib_Condition, "Stdlib__Condition");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 10264 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Domain:[F(1),F(1),F(1)*,F(1),F(1),F(1),F(1),F(1),F(1),N]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_check_bound = runtime.caml_check_bound,
|
|
caml_domain_dls_get = runtime.caml_domain_dls_get,
|
|
caml_make_vect = runtime.caml_make_vect,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_ml_domain_id = runtime.caml_ml_domain_id,
|
|
caml_wrap_exception = runtime.caml_wrap_exception;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
var
|
|
dummy = 0,
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib_Condition = global_data.Stdlib__Condition,
|
|
Stdlib_Mutex = global_data.Stdlib__Mutex,
|
|
Stdlib_Atomic = global_data.Stdlib__Atomic,
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_Array = global_data.Stdlib__Array,
|
|
Stdlib_List = global_data.Stdlib__List,
|
|
Assert_failure = global_data.Assert_failure;
|
|
function cpu_relax(param){return runtime.caml_ml_domain_cpu_relax(0);}
|
|
var none = [0, 0];
|
|
function create_dls(param){
|
|
var st = caml_make_vect(8, none);
|
|
runtime.caml_domain_dls_set(st);
|
|
}
|
|
create_dls(0);
|
|
var
|
|
key_counter = Stdlib_Atomic[1].call(null, 0),
|
|
parent_keys = Stdlib_Atomic[1].call(null, 0);
|
|
function new_key(split_from_parent, init_orphan){
|
|
var
|
|
idx = Stdlib_Atomic[7].call(null, key_counter, 1),
|
|
k = [0, idx, init_orphan];
|
|
if(split_from_parent){
|
|
var split = split_from_parent[1], ki = [0, k, split];
|
|
for(;;){
|
|
var l = Stdlib_Atomic[3].call(null, parent_keys);
|
|
if(! (1 - Stdlib_Atomic[6].call(null, parent_keys, l, [0, ki, l])))
|
|
break;
|
|
}
|
|
}
|
|
return k;
|
|
}
|
|
function maybe_grow(idx){
|
|
for(;;){
|
|
var st = caml_domain_dls_get(0), sz = st.length - 1;
|
|
if(idx < sz) return st;
|
|
var new_sz = sz;
|
|
for(;;){
|
|
if(idx < new_sz){
|
|
var new_st = caml_make_vect(new_sz, none);
|
|
Stdlib_Array[9].call(null, st, 0, new_st, 0, sz);
|
|
if(runtime.caml_domain_dls_compare_and_set(st, new_st)) return new_st;
|
|
break;
|
|
}
|
|
var s = 2 * new_sz | 0;
|
|
new_sz = s;
|
|
}
|
|
}
|
|
}
|
|
function set(param, x){
|
|
var idx = param[1], st = maybe_grow(idx);
|
|
caml_check_bound(st, idx)[idx + 1] = x;
|
|
return 0;
|
|
}
|
|
var a = [0, "domain.ml", 184, 13];
|
|
function get(param){
|
|
var
|
|
init = param[2],
|
|
idx = param[1],
|
|
st = maybe_grow(idx),
|
|
oldval = caml_check_bound(st, idx)[idx + 1];
|
|
if(oldval !== none) return oldval;
|
|
var
|
|
new_obj = caml_call1(init, 0),
|
|
st$0 = caml_domain_dls_get(0),
|
|
curval = caml_check_bound(st$0, idx)[idx + 1],
|
|
b = curval === oldval ? (st$0[idx + 1] = new_obj, 1) : 0;
|
|
if(b) return new_obj;
|
|
var updated_obj = caml_check_bound(st$0, idx)[idx + 1];
|
|
if(updated_obj !== none) return updated_obj;
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, a], 1);
|
|
}
|
|
function set_initial_keys(l){
|
|
return Stdlib_List[18].call
|
|
(null,
|
|
function(param){
|
|
var v = param[2], k = param[1];
|
|
return set(k, v);
|
|
},
|
|
l);
|
|
}
|
|
function get_id(param){var domain = param[1]; return domain;}
|
|
function self(param){return caml_ml_domain_id(0);}
|
|
function is_main_domain(param){return 0 === caml_ml_domain_id(0) ? 1 : 0;}
|
|
var
|
|
first_domain_spawned = Stdlib_Atomic[1].call(null, 0),
|
|
first_spawn_function = [0, function(param){}];
|
|
function before_first_spawn(f){
|
|
if(Stdlib_Atomic[3].call(null, first_domain_spawned))
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Stdlib[6], "first domain already spawned"], 1);
|
|
var old_f = first_spawn_function[1];
|
|
function new_f(param){caml_call1(old_f, 0); return caml_call1(f, 0);}
|
|
first_spawn_function[1] = new_f;
|
|
return 0;
|
|
}
|
|
var
|
|
at_exit_key =
|
|
new_key(0, function(param){return function(param){return 0;};});
|
|
function at_exit(f){
|
|
var old_exit = get(at_exit_key);
|
|
function new_exit(param){
|
|
caml_call1(f, 0);
|
|
return caml_call1(old_exit, 0);
|
|
}
|
|
return set(at_exit_key, new_exit);
|
|
}
|
|
function do_at_exit(param){
|
|
var f = get(at_exit_key);
|
|
return caml_call1(f, 0);
|
|
}
|
|
Stdlib[104][1] = do_at_exit;
|
|
function spawn(f){
|
|
if(1 - Stdlib_Atomic[3].call(null, first_domain_spawned)){
|
|
Stdlib_Atomic[4].call(null, first_domain_spawned, 1);
|
|
caml_call1(first_spawn_function[1], 0);
|
|
first_spawn_function[1] = function(param){return 0;};
|
|
}
|
|
var
|
|
a = Stdlib_Atomic[3].call(null, parent_keys),
|
|
pk =
|
|
Stdlib_List[20].call
|
|
(null,
|
|
function(param){
|
|
var split = param[2], k = param[1];
|
|
return [0, k, caml_call1(split, get(k))];
|
|
},
|
|
a),
|
|
b = Stdlib_Condition[1].call(null, 0),
|
|
term_sync = [0, 0, Stdlib_Mutex[1].call(null, 0), b];
|
|
function body(param){
|
|
try{create_dls(0); set_initial_keys(pk); var res = caml_call1(f, 0);}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
try{do_at_exit(0);}catch(exn){}
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
do_at_exit(0);
|
|
return res;
|
|
}
|
|
var domain = runtime.caml_domain_spawn(body, term_sync);
|
|
return [0, domain, term_sync];
|
|
}
|
|
function join(param){
|
|
var term_sync = param[2];
|
|
function loop(param){
|
|
for(;;){
|
|
var match = term_sync[1];
|
|
if(match){var res = match[1]; return res;}
|
|
Stdlib_Condition[2].call(null, term_sync[3], term_sync[2]);
|
|
}
|
|
}
|
|
var match = Stdlib_Mutex[5].call(null, term_sync[2], loop);
|
|
if(0 === match[0]){var x = match[1]; return x;}
|
|
var ex = match[1];
|
|
throw caml_maybe_attach_backtrace(ex, 1);
|
|
}
|
|
var recommended_domain_count = runtime.caml_recommended_domain_count;
|
|
runtime.caml_register_global
|
|
(9,
|
|
[0,
|
|
spawn,
|
|
join,
|
|
get_id,
|
|
self,
|
|
before_first_spawn,
|
|
at_exit,
|
|
cpu_relax,
|
|
is_main_domain,
|
|
recommended_domain_count,
|
|
[0, new_key, get, set]],
|
|
"Stdlib__Domain");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 10461 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: CamlinternalFormat:[F(2),F(1),F(1),F(2),F(1),F(2)*,F(3),F(3),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(1)*,F(1),F(1),F(1),F(1),F(1),F(2),F(2)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_blit_string = runtime.caml_blit_string,
|
|
caml_bytes_set = runtime.caml_bytes_set,
|
|
caml_create_bytes = runtime.caml_create_bytes,
|
|
caml_format_float = runtime.caml_format_float,
|
|
caml_format_int = runtime.caml_format_int,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_ml_string_length = runtime.caml_ml_string_length,
|
|
caml_notequal = runtime.caml_notequal,
|
|
caml_string_get = runtime.caml_string_get,
|
|
caml_string_unsafe_get = runtime.caml_string_unsafe_get,
|
|
caml_trampoline = runtime.caml_trampoline,
|
|
caml_trampoline_return = runtime.caml_trampoline_return,
|
|
caml_wrap_exception = runtime.caml_wrap_exception;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
function caml_call3(f, a0, a1, a2){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 3
|
|
? f(a0, a1, a2)
|
|
: runtime.caml_call_gen(f, [a0, a1, a2]);
|
|
}
|
|
function caml_call4(f, a0, a1, a2, a3){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 4
|
|
? f(a0, a1, a2, a3)
|
|
: runtime.caml_call_gen(f, [a0, a1, a2, a3]);
|
|
}
|
|
function caml_call5(f, a0, a1, a2, a3, a4){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 5
|
|
? f(a0, a1, a2, a3, a4)
|
|
: runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]);
|
|
}
|
|
var
|
|
dummy = 0,
|
|
global_data = runtime.caml_get_global_data(),
|
|
Assert_failure = global_data.Assert_failure,
|
|
CamlinternalFormatBasics = global_data.CamlinternalFormatBasics,
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_Buffer = global_data.Stdlib__Buffer,
|
|
Stdlib_String = global_data.Stdlib__String,
|
|
Stdlib_Sys = global_data.Stdlib__Sys,
|
|
Stdlib_Char = global_data.Stdlib__Char,
|
|
Stdlib_Bytes = global_data.Stdlib__Bytes,
|
|
Stdlib_Int = global_data.Stdlib__Int;
|
|
function create_char_set(param){return Stdlib_Bytes[1].call(null, 32, 0);}
|
|
function add_in_char_set(char_set, c){
|
|
var
|
|
str_ind = c >>> 3 | 0,
|
|
mask = 1 << (c & 7),
|
|
a = runtime.caml_bytes_get(char_set, str_ind) | mask;
|
|
return caml_bytes_set(char_set, str_ind, Stdlib[29].call(null, a));
|
|
}
|
|
function freeze_char_set(char_set){
|
|
return Stdlib_Bytes[6].call(null, char_set);
|
|
}
|
|
function rev_char_set(char_set){
|
|
var char_set$0 = create_char_set(0), i = 0;
|
|
for(;;){
|
|
var a = caml_string_get(char_set, i) ^ 255;
|
|
caml_bytes_set(char_set$0, i, Stdlib[29].call(null, a));
|
|
var b = i + 1 | 0;
|
|
if(31 === i) return Stdlib_Bytes[44].call(null, char_set$0);
|
|
i = b;
|
|
}
|
|
}
|
|
function is_in_char_set(char_set, c){
|
|
var str_ind = c >>> 3 | 0, mask = 1 << (c & 7);
|
|
return 0 !== (caml_string_get(char_set, str_ind) & mask) ? 1 : 0;
|
|
}
|
|
function pad_of_pad_opt(pad_opt){
|
|
if(! pad_opt) return 0;
|
|
var width = pad_opt[1];
|
|
return [0, 1, width];
|
|
}
|
|
var a = [0, 0, 0];
|
|
function param_format_of_ignored_format(ign, fmt){
|
|
if(typeof ign === "number")
|
|
switch(ign){
|
|
case 0:
|
|
return [0, [0, fmt]];
|
|
case 1:
|
|
return [0, [1, fmt]];
|
|
case 2:
|
|
return [0, [19, fmt]];
|
|
default: return [0, [22, fmt]];
|
|
}
|
|
switch(ign[0]){
|
|
case 0:
|
|
var pad_opt = ign[1]; return [0, [2, pad_of_pad_opt(pad_opt), fmt]];
|
|
case 1:
|
|
var pad_opt$0 = ign[1];
|
|
return [0, [3, pad_of_pad_opt(pad_opt$0), fmt]];
|
|
case 2:
|
|
var pad_opt$1 = ign[2], iconv = ign[1];
|
|
return [0, [4, iconv, pad_of_pad_opt(pad_opt$1), 0, fmt]];
|
|
case 3:
|
|
var pad_opt$2 = ign[2], iconv$0 = ign[1];
|
|
return [0, [5, iconv$0, pad_of_pad_opt(pad_opt$2), 0, fmt]];
|
|
case 4:
|
|
var pad_opt$3 = ign[2], iconv$1 = ign[1];
|
|
return [0, [6, iconv$1, pad_of_pad_opt(pad_opt$3), 0, fmt]];
|
|
case 5:
|
|
var pad_opt$4 = ign[2], iconv$2 = ign[1];
|
|
return [0, [7, iconv$2, pad_of_pad_opt(pad_opt$4), 0, fmt]];
|
|
case 6:
|
|
var prec_opt = ign[2], pad_opt$5 = ign[1];
|
|
if(prec_opt) var ndec = prec_opt[1], b = [0, ndec]; else var b = 0;
|
|
return [0, [8, a, pad_of_pad_opt(pad_opt$5), b, fmt]];
|
|
case 7:
|
|
var pad_opt$6 = ign[1];
|
|
return [0, [9, pad_of_pad_opt(pad_opt$6), fmt]];
|
|
case 8:
|
|
var fmtty = ign[2], pad_opt$7 = ign[1];
|
|
return [0, [13, pad_opt$7, fmtty, fmt]];
|
|
case 9:
|
|
var fmtty$0 = ign[2], pad_opt$8 = ign[1];
|
|
return [0, [14, pad_opt$8, fmtty$0, fmt]];
|
|
case 10:
|
|
var char_set = ign[2], width_opt = ign[1];
|
|
return [0, [20, width_opt, char_set, fmt]];
|
|
default: var counter = ign[1]; return [0, [21, counter, fmt]];
|
|
}
|
|
}
|
|
function default_float_precision(fconv){return 5 === fconv[2] ? 12 : -6;}
|
|
function buffer_create(init_size){
|
|
return [0, 0, caml_create_bytes(init_size)];
|
|
}
|
|
function buffer_check_size(buf, overhead){
|
|
var
|
|
len = runtime.caml_ml_bytes_length(buf[2]),
|
|
min_len = buf[1] + overhead | 0;
|
|
if(len < min_len){
|
|
var
|
|
new_len = Stdlib_Int[11].call(null, len * 2 | 0, min_len),
|
|
new_str = caml_create_bytes(new_len);
|
|
Stdlib_Bytes[11].call(null, buf[2], 0, new_str, 0, len);
|
|
buf[2] = new_str;
|
|
}
|
|
}
|
|
function buffer_add_char(buf, c){
|
|
buffer_check_size(buf, 1);
|
|
caml_bytes_set(buf[2], buf[1], c);
|
|
buf[1] = buf[1] + 1 | 0;
|
|
}
|
|
function buffer_add_string(buf, s){
|
|
var str_len = caml_ml_string_length(s);
|
|
buffer_check_size(buf, str_len);
|
|
Stdlib_String[6].call(null, s, 0, buf[2], buf[1], str_len);
|
|
buf[1] = buf[1] + str_len | 0;
|
|
}
|
|
function buffer_contents(buf){
|
|
return Stdlib_Bytes[8].call(null, buf[2], 0, buf[1]);
|
|
}
|
|
function char_of_iconv(iconv){
|
|
switch(iconv){
|
|
case 6:
|
|
case 7:
|
|
return 120;
|
|
case 8:
|
|
case 9:
|
|
return 88;
|
|
case 10:
|
|
case 11:
|
|
return 111;
|
|
case 12:
|
|
case 15:
|
|
return 117;
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
case 13:
|
|
return 100;
|
|
default: return 105;
|
|
}
|
|
}
|
|
function char_of_fconv(opt, fconv){
|
|
var cF = opt ? opt[1] : 70;
|
|
switch(fconv[2]){
|
|
case 0:
|
|
return 102;
|
|
case 1:
|
|
return 101;
|
|
case 2:
|
|
return 69;
|
|
case 3:
|
|
return 103;
|
|
case 4:
|
|
return 71;
|
|
case 5:
|
|
return cF;
|
|
case 6:
|
|
return 104;
|
|
case 7:
|
|
return 72;
|
|
default: return 70;
|
|
}
|
|
}
|
|
function bprint_char_set(buf, char_set){
|
|
function print_char(buf, i){
|
|
var c = Stdlib[29].call(null, i);
|
|
return 37 === c
|
|
? (buffer_add_char(buf, 37), buffer_add_char(buf, 37))
|
|
: 64
|
|
=== c
|
|
? (buffer_add_char(buf, 37), buffer_add_char(buf, 64))
|
|
: buffer_add_char(buf, c);
|
|
}
|
|
buffer_add_char(buf, 91);
|
|
var
|
|
set =
|
|
is_in_char_set(char_set, 0)
|
|
? (buffer_add_char(buf, 94), rev_char_set(char_set))
|
|
: char_set;
|
|
function is_alone(c){
|
|
var
|
|
after = Stdlib_Char[1].call(null, c + 1 | 0),
|
|
before = Stdlib_Char[1].call(null, c - 1 | 0),
|
|
a = is_in_char_set(set, c);
|
|
if(a)
|
|
var
|
|
b = is_in_char_set(set, before),
|
|
e = b ? is_in_char_set(set, after) : b,
|
|
d = 1 - e;
|
|
else
|
|
var d = a;
|
|
return d;
|
|
}
|
|
if(is_alone(93)) buffer_add_char(buf, 93);
|
|
var i = 1;
|
|
a:
|
|
for(;;){
|
|
b:
|
|
if(i < 256){
|
|
if(! is_in_char_set(set, Stdlib[29].call(null, i))){var i$0 = i + 1 | 0; i = i$0; continue;}
|
|
var switcher = Stdlib[29].call(null, i) - 45 | 0;
|
|
if(48 < switcher >>> 0){
|
|
if(210 <= switcher){print_char(buf, 255); break b;}
|
|
}
|
|
else if(46 < switcher - 1 >>> 0){
|
|
var i$2 = i + 1 | 0;
|
|
i = i$2;
|
|
continue;
|
|
}
|
|
var i$1 = i + 1 | 0;
|
|
if(! is_in_char_set(set, Stdlib[29].call(null, i$1))){
|
|
print_char(buf, i$1 - 1 | 0);
|
|
var i$6 = i$1 + 1 | 0;
|
|
i = i$6;
|
|
continue;
|
|
}
|
|
var switcher$0 = Stdlib[29].call(null, i$1) - 45 | 0;
|
|
if(48 < switcher$0 >>> 0){
|
|
if(210 <= switcher$0){
|
|
print_char(buf, 254);
|
|
print_char(buf, 255);
|
|
break b;
|
|
}
|
|
}
|
|
else if
|
|
(46 < switcher$0 - 1 >>> 0
|
|
&& ! is_in_char_set(set, Stdlib[29].call(null, i$1 + 1 | 0))){
|
|
print_char(buf, i$1 - 1 | 0);
|
|
var i$5 = i$1 + 1 | 0;
|
|
i = i$5;
|
|
continue;
|
|
}
|
|
if(! is_in_char_set(set, Stdlib[29].call(null, i$1 + 1 | 0))){
|
|
print_char(buf, i$1 - 1 | 0);
|
|
print_char(buf, i$1);
|
|
var i$4 = i$1 + 2 | 0;
|
|
i = i$4;
|
|
continue;
|
|
}
|
|
var j = i$1 + 2 | 0, i$3 = i$1 - 1 | 0, j$0 = j;
|
|
for(;;){
|
|
if(256 !== j$0 && is_in_char_set(set, Stdlib[29].call(null, j$0))){var j$1 = j$0 + 1 | 0; j$0 = j$1; continue;}
|
|
print_char(buf, i$3);
|
|
print_char(buf, 45);
|
|
print_char(buf, j$0 - 1 | 0);
|
|
if(j$0 >= 256) break;
|
|
var i$7 = j$0 + 1 | 0;
|
|
i = i$7;
|
|
continue a;
|
|
}
|
|
}
|
|
if(is_alone(45)) buffer_add_char(buf, 45);
|
|
return buffer_add_char(buf, 93);
|
|
}
|
|
}
|
|
function bprint_padty(buf, padty){
|
|
switch(padty){
|
|
case 0:
|
|
return buffer_add_char(buf, 45);
|
|
case 1:
|
|
return;
|
|
default: return buffer_add_char(buf, 48);
|
|
}
|
|
}
|
|
function bprint_ignored_flag(buf, ign_flag){
|
|
return ign_flag ? buffer_add_char(buf, 95) : ign_flag;
|
|
}
|
|
function bprint_pad_opt(buf, pad_opt){
|
|
if(! pad_opt) return;
|
|
var width = pad_opt[1];
|
|
return buffer_add_string(buf, Stdlib_Int[12].call(null, width));
|
|
}
|
|
function bprint_padding(buf, pad){
|
|
if(typeof pad === "number") return;
|
|
if(0 === pad[0]){
|
|
var n = pad[2], padty = pad[1];
|
|
bprint_padty(buf, padty);
|
|
return buffer_add_string(buf, Stdlib_Int[12].call(null, n));
|
|
}
|
|
var padty$0 = pad[1];
|
|
bprint_padty(buf, padty$0);
|
|
return buffer_add_char(buf, 42);
|
|
}
|
|
function bprint_precision(buf, prec){
|
|
if(typeof prec !== "number"){
|
|
var n = prec[1];
|
|
buffer_add_char(buf, 46);
|
|
return buffer_add_string(buf, Stdlib_Int[12].call(null, n));
|
|
}
|
|
if(prec) return buffer_add_string(buf, ".*");
|
|
}
|
|
function bprint_iconv_flag(buf, iconv){
|
|
switch(iconv){
|
|
case 1:
|
|
case 4:
|
|
return buffer_add_char(buf, 43);
|
|
case 2:
|
|
case 5:
|
|
return buffer_add_char(buf, 32);
|
|
case 7:
|
|
case 9:
|
|
case 11:
|
|
case 13:
|
|
case 14:
|
|
case 15:
|
|
return buffer_add_char(buf, 35);
|
|
default: return;
|
|
}
|
|
}
|
|
function bprint_altint_fmt(buf, ign_flag, iconv, pad, prec, c){
|
|
buffer_add_char(buf, 37);
|
|
bprint_ignored_flag(buf, ign_flag);
|
|
bprint_iconv_flag(buf, iconv);
|
|
bprint_padding(buf, pad);
|
|
bprint_precision(buf, prec);
|
|
buffer_add_char(buf, c);
|
|
return buffer_add_char(buf, char_of_iconv(iconv));
|
|
}
|
|
function bprint_fconv_flag(buf, fconv){
|
|
switch(fconv[1]){
|
|
case 1:
|
|
buffer_add_char(buf, 43); break;
|
|
case 2:
|
|
buffer_add_char(buf, 32); break;
|
|
}
|
|
if(8 <= fconv[2]) return buffer_add_char(buf, 35);
|
|
}
|
|
function string_of_formatting_lit(formatting_lit){
|
|
if(typeof formatting_lit === "number")
|
|
switch(formatting_lit){
|
|
case 0:
|
|
return "@]";
|
|
case 1:
|
|
return "@}";
|
|
case 2:
|
|
return "@?";
|
|
case 3:
|
|
return "@\n";
|
|
case 4:
|
|
return "@.";
|
|
case 5:
|
|
return "@@";
|
|
default: return "@%";
|
|
}
|
|
if(2 === formatting_lit[0]){
|
|
var c = formatting_lit[1], a = Stdlib_String[1].call(null, 1, c);
|
|
return Stdlib[28].call(null, "@", a);
|
|
}
|
|
var str = formatting_lit[1];
|
|
return str;
|
|
}
|
|
function bprint_char_literal(buf, chr){
|
|
return 37 === chr
|
|
? buffer_add_string(buf, "%%")
|
|
: buffer_add_char(buf, chr);
|
|
}
|
|
function bprint_string_literal(buf, str){
|
|
var a = caml_ml_string_length(str) - 1 | 0;
|
|
if(a >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
bprint_char_literal(buf, caml_string_get(str, i));
|
|
var b = i + 1 | 0;
|
|
if(a === i) break;
|
|
i = b;
|
|
}
|
|
}
|
|
}
|
|
var cst_Li = "%Li", cst_i = "%i", cst_li = "%li", cst_ni = "%ni";
|
|
function bprint_fmtty(buf, fmtty$15){
|
|
var fmtty = fmtty$15;
|
|
for(;;){
|
|
if(typeof fmtty === "number") return;
|
|
switch(fmtty[0]){
|
|
case 0:
|
|
var fmtty$0 = fmtty[1];
|
|
buffer_add_string(buf, "%c");
|
|
fmtty = fmtty$0;
|
|
break;
|
|
case 1:
|
|
var fmtty$1 = fmtty[1];
|
|
buffer_add_string(buf, "%s");
|
|
fmtty = fmtty$1;
|
|
break;
|
|
case 2:
|
|
var fmtty$2 = fmtty[1];
|
|
buffer_add_string(buf, cst_i);
|
|
fmtty = fmtty$2;
|
|
break;
|
|
case 3:
|
|
var fmtty$3 = fmtty[1];
|
|
buffer_add_string(buf, cst_li);
|
|
fmtty = fmtty$3;
|
|
break;
|
|
case 4:
|
|
var fmtty$4 = fmtty[1];
|
|
buffer_add_string(buf, cst_ni);
|
|
fmtty = fmtty$4;
|
|
break;
|
|
case 5:
|
|
var fmtty$5 = fmtty[1];
|
|
buffer_add_string(buf, cst_Li);
|
|
fmtty = fmtty$5;
|
|
break;
|
|
case 6:
|
|
var fmtty$6 = fmtty[1];
|
|
buffer_add_string(buf, "%f");
|
|
fmtty = fmtty$6;
|
|
break;
|
|
case 7:
|
|
var fmtty$7 = fmtty[1];
|
|
buffer_add_string(buf, "%B");
|
|
fmtty = fmtty$7;
|
|
break;
|
|
case 8:
|
|
var fmtty$8 = fmtty[2], sub_fmtty = fmtty[1];
|
|
buffer_add_string(buf, "%{");
|
|
bprint_fmtty(buf, sub_fmtty);
|
|
buffer_add_string(buf, "%}");
|
|
fmtty = fmtty$8;
|
|
break;
|
|
case 9:
|
|
var fmtty$9 = fmtty[3], sub_fmtty$0 = fmtty[1];
|
|
buffer_add_string(buf, "%(");
|
|
bprint_fmtty(buf, sub_fmtty$0);
|
|
buffer_add_string(buf, "%)");
|
|
fmtty = fmtty$9;
|
|
break;
|
|
case 10:
|
|
var fmtty$10 = fmtty[1];
|
|
buffer_add_string(buf, "%a");
|
|
fmtty = fmtty$10;
|
|
break;
|
|
case 11:
|
|
var fmtty$11 = fmtty[1];
|
|
buffer_add_string(buf, "%t");
|
|
fmtty = fmtty$11;
|
|
break;
|
|
case 12:
|
|
var fmtty$12 = fmtty[1];
|
|
buffer_add_string(buf, "%?");
|
|
fmtty = fmtty$12;
|
|
break;
|
|
case 13:
|
|
var fmtty$13 = fmtty[1];
|
|
buffer_add_string(buf, "%r");
|
|
fmtty = fmtty$13;
|
|
break;
|
|
default:
|
|
var fmtty$14 = fmtty[1];
|
|
buffer_add_string(buf, "%_r");
|
|
fmtty = fmtty$14;
|
|
}
|
|
}
|
|
}
|
|
function int_of_custom_arity(param){
|
|
if(! param) return 0;
|
|
var x = param[1];
|
|
return 1 + int_of_custom_arity(x) | 0;
|
|
}
|
|
var cst$0 = "@[", cst = "@{";
|
|
function string_of_fmt(fmt){
|
|
var buf = buffer_create(16);
|
|
function fmtiter(fmt$1, ign_flag$0){
|
|
var fmt = fmt$1, ign_flag = ign_flag$0;
|
|
for(;;){
|
|
if(typeof fmt === "number") return;
|
|
switch(fmt[0]){
|
|
case 0:
|
|
var rest = fmt[1];
|
|
buffer_add_char(buf, 37);
|
|
bprint_ignored_flag(buf, ign_flag);
|
|
buffer_add_char(buf, 99);
|
|
fmt = rest;
|
|
ign_flag = 0;
|
|
break;
|
|
case 1:
|
|
var rest$0 = fmt[1];
|
|
buffer_add_char(buf, 37);
|
|
bprint_ignored_flag(buf, ign_flag);
|
|
buffer_add_char(buf, 67);
|
|
fmt = rest$0;
|
|
ign_flag = 0;
|
|
break;
|
|
case 2:
|
|
var rest$1 = fmt[2], pad = fmt[1];
|
|
buffer_add_char(buf, 37);
|
|
bprint_ignored_flag(buf, ign_flag);
|
|
bprint_padding(buf, pad);
|
|
buffer_add_char(buf, 115);
|
|
fmt = rest$1;
|
|
ign_flag = 0;
|
|
break;
|
|
case 3:
|
|
var rest$2 = fmt[2], pad$0 = fmt[1];
|
|
buffer_add_char(buf, 37);
|
|
bprint_ignored_flag(buf, ign_flag);
|
|
bprint_padding(buf, pad$0);
|
|
buffer_add_char(buf, 83);
|
|
fmt = rest$2;
|
|
ign_flag = 0;
|
|
break;
|
|
case 4:
|
|
var rest$3 = fmt[4], prec = fmt[3], pad$1 = fmt[2], iconv = fmt[1];
|
|
buffer_add_char(buf, 37);
|
|
bprint_ignored_flag(buf, ign_flag);
|
|
bprint_iconv_flag(buf, iconv);
|
|
bprint_padding(buf, pad$1);
|
|
bprint_precision(buf, prec);
|
|
buffer_add_char(buf, char_of_iconv(iconv));
|
|
fmt = rest$3;
|
|
ign_flag = 0;
|
|
break;
|
|
case 5:
|
|
var
|
|
rest$4 = fmt[4],
|
|
prec$0 = fmt[3],
|
|
pad$2 = fmt[2],
|
|
iconv$0 = fmt[1];
|
|
bprint_altint_fmt(buf, ign_flag, iconv$0, pad$2, prec$0, 108);
|
|
fmt = rest$4;
|
|
ign_flag = 0;
|
|
break;
|
|
case 6:
|
|
var
|
|
rest$5 = fmt[4],
|
|
prec$1 = fmt[3],
|
|
pad$3 = fmt[2],
|
|
iconv$1 = fmt[1];
|
|
bprint_altint_fmt(buf, ign_flag, iconv$1, pad$3, prec$1, 110);
|
|
fmt = rest$5;
|
|
ign_flag = 0;
|
|
break;
|
|
case 7:
|
|
var
|
|
rest$6 = fmt[4],
|
|
prec$2 = fmt[3],
|
|
pad$4 = fmt[2],
|
|
iconv$2 = fmt[1];
|
|
bprint_altint_fmt(buf, ign_flag, iconv$2, pad$4, prec$2, 76);
|
|
fmt = rest$6;
|
|
ign_flag = 0;
|
|
break;
|
|
case 8:
|
|
var rest$7 = fmt[4], prec$3 = fmt[3], pad$5 = fmt[2], fconv = fmt[1];
|
|
buffer_add_char(buf, 37);
|
|
bprint_ignored_flag(buf, ign_flag);
|
|
bprint_fconv_flag(buf, fconv);
|
|
bprint_padding(buf, pad$5);
|
|
bprint_precision(buf, prec$3);
|
|
buffer_add_char(buf, char_of_fconv(0, fconv));
|
|
fmt = rest$7;
|
|
ign_flag = 0;
|
|
break;
|
|
case 9:
|
|
var rest$8 = fmt[2], pad$6 = fmt[1];
|
|
buffer_add_char(buf, 37);
|
|
bprint_ignored_flag(buf, ign_flag);
|
|
bprint_padding(buf, pad$6);
|
|
buffer_add_char(buf, 66);
|
|
fmt = rest$8;
|
|
ign_flag = 0;
|
|
break;
|
|
case 10:
|
|
var rest$9 = fmt[1];
|
|
buffer_add_string(buf, "%!");
|
|
fmt = rest$9;
|
|
break;
|
|
case 11:
|
|
var rest$10 = fmt[2], str = fmt[1];
|
|
bprint_string_literal(buf, str);
|
|
fmt = rest$10;
|
|
break;
|
|
case 12:
|
|
var rest$11 = fmt[2], chr = fmt[1];
|
|
bprint_char_literal(buf, chr);
|
|
fmt = rest$11;
|
|
break;
|
|
case 13:
|
|
var rest$12 = fmt[3], fmtty = fmt[2], pad_opt = fmt[1];
|
|
buffer_add_char(buf, 37);
|
|
bprint_ignored_flag(buf, ign_flag);
|
|
bprint_pad_opt(buf, pad_opt);
|
|
buffer_add_char(buf, 123);
|
|
bprint_fmtty(buf, fmtty);
|
|
buffer_add_char(buf, 37);
|
|
buffer_add_char(buf, 125);
|
|
fmt = rest$12;
|
|
ign_flag = 0;
|
|
break;
|
|
case 14:
|
|
var rest$13 = fmt[3], fmtty$0 = fmt[2], pad_opt$0 = fmt[1];
|
|
buffer_add_char(buf, 37);
|
|
bprint_ignored_flag(buf, ign_flag);
|
|
bprint_pad_opt(buf, pad_opt$0);
|
|
buffer_add_char(buf, 40);
|
|
bprint_fmtty(buf, fmtty$0);
|
|
buffer_add_char(buf, 37);
|
|
buffer_add_char(buf, 41);
|
|
fmt = rest$13;
|
|
ign_flag = 0;
|
|
break;
|
|
case 15:
|
|
var rest$14 = fmt[1];
|
|
buffer_add_char(buf, 37);
|
|
bprint_ignored_flag(buf, ign_flag);
|
|
buffer_add_char(buf, 97);
|
|
fmt = rest$14;
|
|
ign_flag = 0;
|
|
break;
|
|
case 16:
|
|
var rest$15 = fmt[1];
|
|
buffer_add_char(buf, 37);
|
|
bprint_ignored_flag(buf, ign_flag);
|
|
buffer_add_char(buf, 116);
|
|
fmt = rest$15;
|
|
ign_flag = 0;
|
|
break;
|
|
case 17:
|
|
var rest$16 = fmt[2], fmting_lit = fmt[1];
|
|
bprint_string_literal(buf, string_of_formatting_lit(fmting_lit));
|
|
fmt = rest$16;
|
|
break;
|
|
case 18:
|
|
var rest$17 = fmt[2], fmting_gen = fmt[1];
|
|
if(0 === fmting_gen[0]){
|
|
var str$0 = fmting_gen[1][2];
|
|
buffer_add_string(buf, cst);
|
|
buffer_add_string(buf, str$0);
|
|
fmt = rest$17;
|
|
}
|
|
else{
|
|
var str$1 = fmting_gen[1][2];
|
|
buffer_add_string(buf, cst$0);
|
|
buffer_add_string(buf, str$1);
|
|
fmt = rest$17;
|
|
}
|
|
break;
|
|
case 19:
|
|
var rest$18 = fmt[1];
|
|
buffer_add_char(buf, 37);
|
|
bprint_ignored_flag(buf, ign_flag);
|
|
buffer_add_char(buf, 114);
|
|
fmt = rest$18;
|
|
ign_flag = 0;
|
|
break;
|
|
case 20:
|
|
var rest$19 = fmt[3], char_set = fmt[2], width_opt = fmt[1];
|
|
buffer_add_char(buf, 37);
|
|
bprint_ignored_flag(buf, ign_flag);
|
|
bprint_pad_opt(buf, width_opt);
|
|
bprint_char_set(buf, char_set);
|
|
fmt = rest$19;
|
|
ign_flag = 0;
|
|
break;
|
|
case 21:
|
|
var rest$20 = fmt[2], counter = fmt[1];
|
|
buffer_add_char(buf, 37);
|
|
bprint_ignored_flag(buf, ign_flag);
|
|
switch(counter){
|
|
case 0:
|
|
var a = 108; break;
|
|
case 1:
|
|
var a = 110; break;
|
|
default: var a = 78;
|
|
}
|
|
buffer_add_char(buf, a);
|
|
fmt = rest$20;
|
|
ign_flag = 0;
|
|
break;
|
|
case 22:
|
|
var rest$21 = fmt[1];
|
|
buffer_add_char(buf, 37);
|
|
bprint_ignored_flag(buf, ign_flag);
|
|
bprint_string_literal(buf, "0c");
|
|
fmt = rest$21;
|
|
ign_flag = 0;
|
|
break;
|
|
case 23:
|
|
var
|
|
rest$22 = fmt[2],
|
|
ign = fmt[1],
|
|
fmt$0 = param_format_of_ignored_format(ign, rest$22)[1];
|
|
fmt = fmt$0;
|
|
ign_flag = 1;
|
|
break;
|
|
default:
|
|
var rest$23 = fmt[3], arity = fmt[1], b = int_of_custom_arity(arity);
|
|
if(b >= 1){
|
|
var i = 1;
|
|
for(;;){
|
|
buffer_add_char(buf, 37);
|
|
bprint_ignored_flag(buf, ign_flag);
|
|
buffer_add_char(buf, 63);
|
|
var c = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
fmt = rest$23;
|
|
ign_flag = 0;
|
|
}
|
|
}
|
|
}
|
|
fmtiter(fmt, 0);
|
|
return buffer_contents(buf);
|
|
}
|
|
function symm(param){
|
|
if(typeof param === "number") return 0;
|
|
switch(param[0]){
|
|
case 0:
|
|
var rest = param[1]; return [0, symm(rest)];
|
|
case 1:
|
|
var rest$0 = param[1]; return [1, symm(rest$0)];
|
|
case 2:
|
|
var rest$1 = param[1]; return [2, symm(rest$1)];
|
|
case 3:
|
|
var rest$2 = param[1]; return [3, symm(rest$2)];
|
|
case 4:
|
|
var rest$3 = param[1]; return [4, symm(rest$3)];
|
|
case 5:
|
|
var rest$4 = param[1]; return [5, symm(rest$4)];
|
|
case 6:
|
|
var rest$5 = param[1]; return [6, symm(rest$5)];
|
|
case 7:
|
|
var rest$6 = param[1]; return [7, symm(rest$6)];
|
|
case 8:
|
|
var rest$7 = param[2], ty = param[1]; return [8, ty, symm(rest$7)];
|
|
case 9:
|
|
var rest$8 = param[3], ty2 = param[2], ty1 = param[1];
|
|
return [9, ty2, ty1, symm(rest$8)];
|
|
case 10:
|
|
var rest$9 = param[1]; return [10, symm(rest$9)];
|
|
case 11:
|
|
var rest$10 = param[1]; return [11, symm(rest$10)];
|
|
case 12:
|
|
var rest$11 = param[1]; return [12, symm(rest$11)];
|
|
case 13:
|
|
var rest$12 = param[1]; return [13, symm(rest$12)];
|
|
default: var rest$13 = param[1]; return [14, symm(rest$13)];
|
|
}
|
|
}
|
|
function fmtty_rel_det(param){
|
|
if(typeof param === "number")
|
|
return [0, , function(param){}, , function(param){}];
|
|
switch(param[0]){
|
|
case 0:
|
|
var
|
|
rest = param[1],
|
|
match = fmtty_rel_det(rest),
|
|
de = match[4],
|
|
af = match[2];
|
|
return [0, , function(param){af(0);}, , de];
|
|
case 1:
|
|
var
|
|
rest$0 = param[1],
|
|
match$0 = fmtty_rel_det(rest$0),
|
|
de$0 = match$0[4],
|
|
af$0 = match$0[2];
|
|
return [0, , function(param){af$0(0);}, , de$0];
|
|
case 2:
|
|
var
|
|
rest$1 = param[1],
|
|
match$1 = fmtty_rel_det(rest$1),
|
|
de$1 = match$1[4],
|
|
af$1 = match$1[2];
|
|
return [0, , function(param){af$1(0);}, , de$1];
|
|
case 3:
|
|
var
|
|
rest$2 = param[1],
|
|
match$2 = fmtty_rel_det(rest$2),
|
|
de$2 = match$2[4],
|
|
af$2 = match$2[2];
|
|
return [0, , function(param){af$2(0);}, , de$2];
|
|
case 4:
|
|
var
|
|
rest$3 = param[1],
|
|
match$3 = fmtty_rel_det(rest$3),
|
|
de$3 = match$3[4],
|
|
af$3 = match$3[2];
|
|
return [0, , function(param){af$3(0);}, , de$3];
|
|
case 5:
|
|
var
|
|
rest$4 = param[1],
|
|
match$4 = fmtty_rel_det(rest$4),
|
|
de$4 = match$4[4],
|
|
af$4 = match$4[2];
|
|
return [0, , function(param){af$4(0);}, , de$4];
|
|
case 6:
|
|
var
|
|
rest$5 = param[1],
|
|
match$5 = fmtty_rel_det(rest$5),
|
|
de$5 = match$5[4],
|
|
af$5 = match$5[2];
|
|
return [0, , function(param){af$5(0);}, , de$5];
|
|
case 7:
|
|
var
|
|
rest$6 = param[1],
|
|
match$6 = fmtty_rel_det(rest$6),
|
|
de$6 = match$6[4],
|
|
af$6 = match$6[2];
|
|
return [0, , function(param){af$6(0);}, , de$6];
|
|
case 8:
|
|
var
|
|
rest$7 = param[2],
|
|
match$7 = fmtty_rel_det(rest$7),
|
|
de$7 = match$7[4],
|
|
af$7 = match$7[2];
|
|
return [0, , function(param){af$7(0);}, , de$7];
|
|
case 9:
|
|
var
|
|
rest$8 = param[3],
|
|
ty2 = param[2],
|
|
ty1 = param[1],
|
|
match$8 = fmtty_rel_det(rest$8),
|
|
de$8 = match$8[4],
|
|
af$8 = match$8[2],
|
|
ty = trans(symm(ty1), ty2),
|
|
match$9 = fmtty_rel_det(ty),
|
|
jd = match$9[4],
|
|
ga = match$9[2];
|
|
return [0,
|
|
,
|
|
function(param){ga(0); af$8(0);},
|
|
,
|
|
function(param){jd(0); de$8(0);}];
|
|
case 10:
|
|
var
|
|
rest$9 = param[1],
|
|
match$10 = fmtty_rel_det(rest$9),
|
|
de$9 = match$10[4],
|
|
af$9 = match$10[2];
|
|
return [0, , function(param){af$9(0);}, , de$9];
|
|
case 11:
|
|
var
|
|
rest$10 = param[1],
|
|
match$11 = fmtty_rel_det(rest$10),
|
|
de$10 = match$11[4],
|
|
af$10 = match$11[2];
|
|
return [0, , function(param){af$10(0);}, , de$10];
|
|
case 12:
|
|
var
|
|
rest$11 = param[1],
|
|
match$12 = fmtty_rel_det(rest$11),
|
|
de$11 = match$12[4],
|
|
af$11 = match$12[2];
|
|
return [0, , function(param){af$11(0);}, , de$11];
|
|
case 13:
|
|
var
|
|
rest$12 = param[1],
|
|
match$13 = fmtty_rel_det(rest$12),
|
|
de$12 = match$13[4],
|
|
af$12 = match$13[2];
|
|
return [0, , function(param){af$12(0);}, , function(param){de$12(0);}];
|
|
default:
|
|
var
|
|
rest$13 = param[1],
|
|
match$14 = fmtty_rel_det(rest$13),
|
|
de$13 = match$14[4],
|
|
af$13 = match$14[2];
|
|
return [0, , function(param){af$13(0);}, , function(param){de$13(0);}];
|
|
}
|
|
}
|
|
var
|
|
cst_camlinternalFormat_ml = "camlinternalFormat.ml",
|
|
b = [0, cst_camlinternalFormat_ml, 850, 23],
|
|
c = [0, cst_camlinternalFormat_ml, 837, 26],
|
|
d = [0, cst_camlinternalFormat_ml, 847, 28],
|
|
e = [0, cst_camlinternalFormat_ml, 815, 21],
|
|
f = [0, cst_camlinternalFormat_ml, 819, 21],
|
|
g = [0, cst_camlinternalFormat_ml, 823, 19],
|
|
h = [0, cst_camlinternalFormat_ml, 827, 22],
|
|
i = [0, cst_camlinternalFormat_ml, 832, 30],
|
|
j = [0, cst_camlinternalFormat_ml, 851, 23],
|
|
k = [0, cst_camlinternalFormat_ml, 836, 26],
|
|
l = [0, cst_camlinternalFormat_ml, 846, 28],
|
|
m = [0, cst_camlinternalFormat_ml, 814, 21],
|
|
n = [0, cst_camlinternalFormat_ml, 818, 21],
|
|
o = [0, cst_camlinternalFormat_ml, 822, 19],
|
|
p = [0, cst_camlinternalFormat_ml, 826, 22],
|
|
q = [0, cst_camlinternalFormat_ml, 831, 30];
|
|
function trans(ty1, ty2){
|
|
a:
|
|
{
|
|
b:
|
|
{
|
|
c:
|
|
{
|
|
d:
|
|
{
|
|
e:
|
|
{
|
|
f:
|
|
{
|
|
g:
|
|
{
|
|
if(typeof ty1 !== "number"){
|
|
switch(ty1[0]){
|
|
case 0:
|
|
var rest1 = ty1[1];
|
|
if(typeof ty2 !== "number")
|
|
switch(ty2[0]){
|
|
case 0:
|
|
var rest2 = ty2[1]; return [0, trans(rest1, rest2)];
|
|
case 10:
|
|
break a;
|
|
case 11:
|
|
break b;
|
|
case 12:
|
|
break c;
|
|
case 13:
|
|
break d;
|
|
case 14:
|
|
break e;
|
|
case 8:
|
|
break f;
|
|
case 9:
|
|
break g;
|
|
}
|
|
break;
|
|
case 1:
|
|
var rest1$0 = ty1[1];
|
|
if(typeof ty2 !== "number")
|
|
switch(ty2[0]){
|
|
case 1:
|
|
var rest2$0 = ty2[1]; return [1, trans(rest1$0, rest2$0)];
|
|
case 10:
|
|
break a;
|
|
case 11:
|
|
break b;
|
|
case 12:
|
|
break c;
|
|
case 13:
|
|
break d;
|
|
case 14:
|
|
break e;
|
|
case 8:
|
|
break f;
|
|
case 9:
|
|
break g;
|
|
}
|
|
break;
|
|
case 2:
|
|
var rest1$1 = ty1[1];
|
|
if(typeof ty2 !== "number")
|
|
switch(ty2[0]){
|
|
case 2:
|
|
var rest2$1 = ty2[1]; return [2, trans(rest1$1, rest2$1)];
|
|
case 10:
|
|
break a;
|
|
case 11:
|
|
break b;
|
|
case 12:
|
|
break c;
|
|
case 13:
|
|
break d;
|
|
case 14:
|
|
break e;
|
|
case 8:
|
|
break f;
|
|
case 9:
|
|
break g;
|
|
}
|
|
break;
|
|
case 3:
|
|
var rest1$2 = ty1[1];
|
|
if(typeof ty2 !== "number")
|
|
switch(ty2[0]){
|
|
case 3:
|
|
var rest2$2 = ty2[1]; return [3, trans(rest1$2, rest2$2)];
|
|
case 10:
|
|
break a;
|
|
case 11:
|
|
break b;
|
|
case 12:
|
|
break c;
|
|
case 13:
|
|
break d;
|
|
case 14:
|
|
break e;
|
|
case 8:
|
|
break f;
|
|
case 9:
|
|
break g;
|
|
}
|
|
break;
|
|
case 4:
|
|
var rest1$3 = ty1[1];
|
|
if(typeof ty2 !== "number")
|
|
switch(ty2[0]){
|
|
case 4:
|
|
var rest2$3 = ty2[1]; return [4, trans(rest1$3, rest2$3)];
|
|
case 10:
|
|
break a;
|
|
case 11:
|
|
break b;
|
|
case 12:
|
|
break c;
|
|
case 13:
|
|
break d;
|
|
case 14:
|
|
break e;
|
|
case 8:
|
|
break f;
|
|
case 9:
|
|
break g;
|
|
}
|
|
break;
|
|
case 5:
|
|
var rest1$4 = ty1[1];
|
|
if(typeof ty2 !== "number")
|
|
switch(ty2[0]){
|
|
case 5:
|
|
var rest2$4 = ty2[1]; return [5, trans(rest1$4, rest2$4)];
|
|
case 10:
|
|
break a;
|
|
case 11:
|
|
break b;
|
|
case 12:
|
|
break c;
|
|
case 13:
|
|
break d;
|
|
case 14:
|
|
break e;
|
|
case 8:
|
|
break f;
|
|
case 9:
|
|
break g;
|
|
}
|
|
break;
|
|
case 6:
|
|
var rest1$5 = ty1[1];
|
|
if(typeof ty2 !== "number")
|
|
switch(ty2[0]){
|
|
case 6:
|
|
var rest2$5 = ty2[1]; return [6, trans(rest1$5, rest2$5)];
|
|
case 10:
|
|
break a;
|
|
case 11:
|
|
break b;
|
|
case 12:
|
|
break c;
|
|
case 13:
|
|
break d;
|
|
case 14:
|
|
break e;
|
|
case 8:
|
|
break f;
|
|
case 9:
|
|
break g;
|
|
}
|
|
break;
|
|
case 7:
|
|
var rest1$6 = ty1[1];
|
|
if(typeof ty2 !== "number")
|
|
switch(ty2[0]){
|
|
case 7:
|
|
var rest2$6 = ty2[1]; return [7, trans(rest1$6, rest2$6)];
|
|
case 10:
|
|
break a;
|
|
case 11:
|
|
break b;
|
|
case 12:
|
|
break c;
|
|
case 13:
|
|
break d;
|
|
case 14:
|
|
break e;
|
|
case 8:
|
|
break f;
|
|
case 9:
|
|
break g;
|
|
}
|
|
break;
|
|
case 8:
|
|
var rest1$7 = ty1[2], ty1$0 = ty1[1];
|
|
if(typeof ty2 !== "number")
|
|
switch(ty2[0]){
|
|
case 8:
|
|
var
|
|
rest2$7 = ty2[2],
|
|
ty2$0 = ty2[1],
|
|
a = trans(rest1$7, rest2$7);
|
|
return [8, trans(ty1$0, ty2$0), a];
|
|
case 10:
|
|
break a;
|
|
case 11:
|
|
break b;
|
|
case 12:
|
|
break c;
|
|
case 13:
|
|
break d;
|
|
case 14:
|
|
break e;
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, k], 1);
|
|
case 9:
|
|
var rest1$8 = ty1[3], ty12 = ty1[2], ty11 = ty1[1];
|
|
if(typeof ty2 !== "number")
|
|
switch(ty2[0]){
|
|
case 9:
|
|
var
|
|
rest2$8 = ty2[3],
|
|
ty22 = ty2[2],
|
|
ty21 = ty2[1],
|
|
ty = trans(symm(ty12), ty21),
|
|
match = fmtty_rel_det(ty),
|
|
f4 = match[4],
|
|
f2 = match[2];
|
|
f2(0);
|
|
f4(0);
|
|
return [9, ty11, ty22, trans(rest1$8, rest2$8)];
|
|
case 10:
|
|
break a;
|
|
case 11:
|
|
break b;
|
|
case 12:
|
|
break c;
|
|
case 13:
|
|
break d;
|
|
case 14:
|
|
break e;
|
|
case 8:
|
|
break f;
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, l], 1);
|
|
case 10:
|
|
var rest1$9 = ty1[1];
|
|
if(typeof ty2 !== "number" && 10 === ty2[0]){
|
|
var rest2$9 = ty2[1];
|
|
return [10, trans(rest1$9, rest2$9)];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, m], 1);
|
|
case 11:
|
|
var rest1$10 = ty1[1];
|
|
if(typeof ty2 !== "number")
|
|
switch(ty2[0]){
|
|
case 11:
|
|
var rest2$10 = ty2[1];
|
|
return [11, trans(rest1$10, rest2$10)];
|
|
case 10:
|
|
break a;
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, n], 1);
|
|
case 12:
|
|
var rest1$11 = ty1[1];
|
|
if(typeof ty2 !== "number")
|
|
switch(ty2[0]){
|
|
case 12:
|
|
var rest2$11 = ty2[1];
|
|
return [12, trans(rest1$11, rest2$11)];
|
|
case 10:
|
|
break a;
|
|
case 11:
|
|
break b;
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, o], 1);
|
|
case 13:
|
|
var rest1$12 = ty1[1];
|
|
if(typeof ty2 !== "number")
|
|
switch(ty2[0]){
|
|
case 13:
|
|
var rest2$12 = ty2[1];
|
|
return [13, trans(rest1$12, rest2$12)];
|
|
case 10:
|
|
break a;
|
|
case 11:
|
|
break b;
|
|
case 12:
|
|
break c;
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, p], 1);
|
|
default:
|
|
var rest1$13 = ty1[1];
|
|
if(typeof ty2 !== "number")
|
|
switch(ty2[0]){
|
|
case 14:
|
|
var rest2$13 = ty2[1];
|
|
return [14, trans(rest1$13, rest2$13)];
|
|
case 10:
|
|
break a;
|
|
case 11:
|
|
break b;
|
|
case 12:
|
|
break c;
|
|
case 13:
|
|
break d;
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, q], 1);
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, j], 1);
|
|
}
|
|
if(typeof ty2 === "number") return 0;
|
|
switch(ty2[0]){
|
|
case 10:
|
|
break a;
|
|
case 11:
|
|
break b;
|
|
case 12:
|
|
break c;
|
|
case 13:
|
|
break d;
|
|
case 14:
|
|
break e;
|
|
case 8:
|
|
break f;
|
|
case 9: break;
|
|
default:
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, b], 1);
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, d], 1);
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, c], 1);
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, i], 1);
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, h], 1);
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, g], 1);
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, f], 1);
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, e], 1);
|
|
}
|
|
function fmtty_of_fmt(fmtty$4){
|
|
var fmtty = fmtty$4;
|
|
for(;;){
|
|
if(typeof fmtty === "number") return 0;
|
|
switch(fmtty[0]){
|
|
case 4:
|
|
var
|
|
rest$1 = fmtty[4],
|
|
prec = fmtty[3],
|
|
pad$0 = fmtty[2],
|
|
ty_rest = fmtty_of_fmt(rest$1),
|
|
prec_ty = fmtty_of_precision_fmtty(prec, [2, ty_rest]);
|
|
return fmtty_of_padding_fmtty(pad$0, prec_ty);
|
|
case 5:
|
|
var
|
|
rest$2 = fmtty[4],
|
|
prec$0 = fmtty[3],
|
|
pad$1 = fmtty[2],
|
|
ty_rest$0 = fmtty_of_fmt(rest$2),
|
|
prec_ty$0 = fmtty_of_precision_fmtty(prec$0, [3, ty_rest$0]);
|
|
return fmtty_of_padding_fmtty(pad$1, prec_ty$0);
|
|
case 6:
|
|
var
|
|
rest$3 = fmtty[4],
|
|
prec$1 = fmtty[3],
|
|
pad$2 = fmtty[2],
|
|
ty_rest$1 = fmtty_of_fmt(rest$3),
|
|
prec_ty$1 = fmtty_of_precision_fmtty(prec$1, [4, ty_rest$1]);
|
|
return fmtty_of_padding_fmtty(pad$2, prec_ty$1);
|
|
case 7:
|
|
var
|
|
rest$4 = fmtty[4],
|
|
prec$2 = fmtty[3],
|
|
pad$3 = fmtty[2],
|
|
ty_rest$2 = fmtty_of_fmt(rest$4),
|
|
prec_ty$2 = fmtty_of_precision_fmtty(prec$2, [5, ty_rest$2]);
|
|
return fmtty_of_padding_fmtty(pad$3, prec_ty$2);
|
|
case 8:
|
|
var
|
|
rest$5 = fmtty[4],
|
|
prec$3 = fmtty[3],
|
|
pad$4 = fmtty[2],
|
|
ty_rest$3 = fmtty_of_fmt(rest$5),
|
|
prec_ty$3 = fmtty_of_precision_fmtty(prec$3, [6, ty_rest$3]);
|
|
return fmtty_of_padding_fmtty(pad$4, prec_ty$3);
|
|
case 9:
|
|
var rest$6 = fmtty[2], pad$5 = fmtty[1];
|
|
return fmtty_of_padding_fmtty(pad$5, [7, fmtty_of_fmt(rest$6)]);
|
|
case 10:
|
|
var fmtty$0 = fmtty[1]; fmtty = fmtty$0; break;
|
|
case 13:
|
|
var rest$7 = fmtty[3], ty = fmtty[2];
|
|
return [8, ty, fmtty_of_fmt(rest$7)];
|
|
case 14:
|
|
var rest$8 = fmtty[3], ty$0 = fmtty[2];
|
|
return [9, ty$0, ty$0, fmtty_of_fmt(rest$8)];
|
|
case 15:
|
|
var rest$9 = fmtty[1]; return [10, fmtty_of_fmt(rest$9)];
|
|
case 16:
|
|
var rest$10 = fmtty[1]; return [11, fmtty_of_fmt(rest$10)];
|
|
case 18:
|
|
var
|
|
rest$11 = fmtty[2],
|
|
formatting_gen = fmtty[1],
|
|
b = fmtty_of_fmt(rest$11);
|
|
if(0 === formatting_gen[0])
|
|
var fmt = formatting_gen[1][1], a = fmtty_of_fmt(fmt);
|
|
else
|
|
var fmt$0 = formatting_gen[1][1], a = fmtty_of_fmt(fmt$0);
|
|
return CamlinternalFormatBasics[1].call(null, a, b);
|
|
case 19:
|
|
var rest$12 = fmtty[1]; return [13, fmtty_of_fmt(rest$12)];
|
|
case 20:
|
|
var rest$13 = fmtty[3]; return [1, fmtty_of_fmt(rest$13)];
|
|
case 21:
|
|
var rest$14 = fmtty[2]; return [2, fmtty_of_fmt(rest$14)];
|
|
case 23:
|
|
var fmtty$2 = fmtty[2], ign = fmtty[1];
|
|
if(typeof ign === "number"){
|
|
if(2 === ign) return [14, fmtty_of_fmt(fmtty$2)];
|
|
fmtty = fmtty$2;
|
|
}
|
|
else{
|
|
if(9 === ign[0]){
|
|
var fmtty$3 = ign[2], c = fmtty_of_fmt(fmtty$2);
|
|
return CamlinternalFormatBasics[1].call(null, fmtty$3, c);
|
|
}
|
|
fmtty = fmtty$2;
|
|
}
|
|
break;
|
|
case 24:
|
|
var rest$15 = fmtty[3], arity = fmtty[1];
|
|
return fmtty_of_custom(arity, fmtty_of_fmt(rest$15));
|
|
case 2:
|
|
case 3:
|
|
var rest$0 = fmtty[2], pad = fmtty[1];
|
|
return fmtty_of_padding_fmtty(pad, [1, fmtty_of_fmt(rest$0)]);
|
|
case 0:
|
|
case 1:
|
|
case 22:
|
|
var rest = fmtty[1]; return [0, fmtty_of_fmt(rest)];
|
|
default: var fmtty$1 = fmtty[2]; fmtty = fmtty$1;
|
|
}
|
|
}
|
|
}
|
|
function fmtty_of_custom(arity, fmtty){
|
|
if(! arity) return fmtty;
|
|
var arity$0 = arity[1];
|
|
return [12, fmtty_of_custom(arity$0, fmtty)];
|
|
}
|
|
function fmtty_of_padding_fmtty(pad, fmtty){
|
|
return typeof pad === "number" ? fmtty : 0 === pad[0] ? fmtty : [2, fmtty];
|
|
}
|
|
function fmtty_of_precision_fmtty(prec, fmtty){
|
|
return typeof prec === "number" ? prec ? [2, fmtty] : fmtty : fmtty;
|
|
}
|
|
var
|
|
Type_mismatch =
|
|
[248, "CamlinternalFormat.Type_mismatch", runtime.caml_fresh_oo_id(0)];
|
|
function type_padding(pad, fmtty){
|
|
if(typeof pad === "number") return [0, 0, fmtty];
|
|
if(0 === pad[0]){
|
|
var w = pad[2], padty = pad[1];
|
|
return [0, [0, padty, w], fmtty];
|
|
}
|
|
if(typeof fmtty !== "number" && 2 === fmtty[0]){
|
|
var rest = fmtty[1], padty$0 = pad[1];
|
|
return [0, [1, padty$0], rest];
|
|
}
|
|
throw caml_maybe_attach_backtrace(Type_mismatch, 1);
|
|
}
|
|
function type_padprec(pad, prec, fmtty){
|
|
var match = type_padding(pad, fmtty);
|
|
if(typeof prec !== "number"){
|
|
var rest$1 = match[2], pad$2 = match[1], p = prec[1];
|
|
return [0, pad$2, [0, p], rest$1];
|
|
}
|
|
if(! prec){
|
|
var rest$0 = match[2], pad$1 = match[1];
|
|
return [0, pad$1, 0, rest$0];
|
|
}
|
|
var match$0 = match[2];
|
|
if(typeof match$0 !== "number" && 2 === match$0[0]){
|
|
var rest = match$0[1], pad$0 = match[1];
|
|
return [0, pad$0, 1, rest];
|
|
}
|
|
throw caml_maybe_attach_backtrace(Type_mismatch, 1);
|
|
}
|
|
function type_format(fmt, fmtty){
|
|
var a = type_format_gen(fmt, fmtty);
|
|
if(typeof a[2] !== "number")
|
|
throw caml_maybe_attach_backtrace(Type_mismatch, 1);
|
|
var fmt$0 = a[1];
|
|
return fmt$0;
|
|
}
|
|
function type_format_gen(fmt, fmtty0){
|
|
if(typeof fmt === "number") return [0, 0, fmtty0];
|
|
switch(fmt[0]){
|
|
case 0:
|
|
if(typeof fmtty0 !== "number" && 0 === fmtty0[0]){
|
|
var
|
|
fmtty_rest = fmtty0[1],
|
|
fmt_rest = fmt[1],
|
|
match = type_format_gen(fmt_rest, fmtty_rest),
|
|
fmtty = match[2],
|
|
fmt$0 = match[1];
|
|
return [0, [0, fmt$0], fmtty];
|
|
}
|
|
break;
|
|
case 1:
|
|
if(typeof fmtty0 !== "number" && 0 === fmtty0[0]){
|
|
var
|
|
fmtty_rest$0 = fmtty0[1],
|
|
fmt_rest$0 = fmt[1],
|
|
match$0 = type_format_gen(fmt_rest$0, fmtty_rest$0),
|
|
fmtty$0 = match$0[2],
|
|
fmt$1 = match$0[1];
|
|
return [0, [1, fmt$1], fmtty$0];
|
|
}
|
|
break;
|
|
case 2:
|
|
var
|
|
fmt_rest$1 = fmt[2],
|
|
pad = fmt[1],
|
|
match$1 = type_padding(pad, fmtty0),
|
|
pad$0 = match$1[1],
|
|
match$2 = match$1[2];
|
|
if(typeof match$2 !== "number" && 1 === match$2[0]){
|
|
var
|
|
fmtty_rest$1 = match$2[1],
|
|
match$3 = type_format_gen(fmt_rest$1, fmtty_rest$1),
|
|
fmtty$1 = match$3[2],
|
|
fmt$2 = match$3[1];
|
|
return [0, [2, pad$0, fmt$2], fmtty$1];
|
|
}
|
|
throw caml_maybe_attach_backtrace(Type_mismatch, 1);
|
|
case 3:
|
|
var
|
|
fmt_rest$2 = fmt[2],
|
|
pad$1 = fmt[1],
|
|
match$4 = type_padding(pad$1, fmtty0),
|
|
pad$2 = match$4[1],
|
|
match$5 = match$4[2];
|
|
if(typeof match$5 !== "number" && 1 === match$5[0]){
|
|
var
|
|
fmtty_rest$2 = match$5[1],
|
|
match$6 = type_format_gen(fmt_rest$2, fmtty_rest$2),
|
|
fmtty$2 = match$6[2],
|
|
fmt$3 = match$6[1];
|
|
return [0, [3, pad$2, fmt$3], fmtty$2];
|
|
}
|
|
throw caml_maybe_attach_backtrace(Type_mismatch, 1);
|
|
case 4:
|
|
var
|
|
fmt_rest$3 = fmt[4],
|
|
prec = fmt[3],
|
|
pad$3 = fmt[2],
|
|
iconv = fmt[1],
|
|
match$7 = type_padprec(pad$3, prec, fmtty0),
|
|
pad$4 = match$7[1],
|
|
match$8 = match$7[3];
|
|
if(typeof match$8 !== "number" && 2 === match$8[0]){
|
|
var
|
|
fmtty_rest$3 = match$8[1],
|
|
prec$0 = match$7[2],
|
|
match$9 = type_format_gen(fmt_rest$3, fmtty_rest$3),
|
|
fmtty$3 = match$9[2],
|
|
fmt$4 = match$9[1];
|
|
return [0, [4, iconv, pad$4, prec$0, fmt$4], fmtty$3];
|
|
}
|
|
throw caml_maybe_attach_backtrace(Type_mismatch, 1);
|
|
case 5:
|
|
var
|
|
fmt_rest$4 = fmt[4],
|
|
prec$1 = fmt[3],
|
|
pad$5 = fmt[2],
|
|
iconv$0 = fmt[1],
|
|
match$10 = type_padprec(pad$5, prec$1, fmtty0),
|
|
pad$6 = match$10[1],
|
|
match$11 = match$10[3];
|
|
if(typeof match$11 !== "number" && 3 === match$11[0]){
|
|
var
|
|
fmtty_rest$4 = match$11[1],
|
|
prec$2 = match$10[2],
|
|
match$12 = type_format_gen(fmt_rest$4, fmtty_rest$4),
|
|
fmtty$4 = match$12[2],
|
|
fmt$5 = match$12[1];
|
|
return [0, [5, iconv$0, pad$6, prec$2, fmt$5], fmtty$4];
|
|
}
|
|
throw caml_maybe_attach_backtrace(Type_mismatch, 1);
|
|
case 6:
|
|
var
|
|
fmt_rest$5 = fmt[4],
|
|
prec$3 = fmt[3],
|
|
pad$7 = fmt[2],
|
|
iconv$1 = fmt[1],
|
|
match$13 = type_padprec(pad$7, prec$3, fmtty0),
|
|
pad$8 = match$13[1],
|
|
match$14 = match$13[3];
|
|
if(typeof match$14 !== "number" && 4 === match$14[0]){
|
|
var
|
|
fmtty_rest$5 = match$14[1],
|
|
prec$4 = match$13[2],
|
|
match$15 = type_format_gen(fmt_rest$5, fmtty_rest$5),
|
|
fmtty$5 = match$15[2],
|
|
fmt$6 = match$15[1];
|
|
return [0, [6, iconv$1, pad$8, prec$4, fmt$6], fmtty$5];
|
|
}
|
|
throw caml_maybe_attach_backtrace(Type_mismatch, 1);
|
|
case 7:
|
|
var
|
|
fmt_rest$6 = fmt[4],
|
|
prec$5 = fmt[3],
|
|
pad$9 = fmt[2],
|
|
iconv$2 = fmt[1],
|
|
match$16 = type_padprec(pad$9, prec$5, fmtty0),
|
|
pad$10 = match$16[1],
|
|
match$17 = match$16[3];
|
|
if(typeof match$17 !== "number" && 5 === match$17[0]){
|
|
var
|
|
fmtty_rest$6 = match$17[1],
|
|
prec$6 = match$16[2],
|
|
match$18 = type_format_gen(fmt_rest$6, fmtty_rest$6),
|
|
fmtty$6 = match$18[2],
|
|
fmt$7 = match$18[1];
|
|
return [0, [7, iconv$2, pad$10, prec$6, fmt$7], fmtty$6];
|
|
}
|
|
throw caml_maybe_attach_backtrace(Type_mismatch, 1);
|
|
case 8:
|
|
var
|
|
fmt_rest$7 = fmt[4],
|
|
prec$7 = fmt[3],
|
|
pad$11 = fmt[2],
|
|
fconv = fmt[1],
|
|
match$19 = type_padprec(pad$11, prec$7, fmtty0),
|
|
pad$12 = match$19[1],
|
|
match$20 = match$19[3];
|
|
if(typeof match$20 !== "number" && 6 === match$20[0]){
|
|
var
|
|
fmtty_rest$7 = match$20[1],
|
|
prec$8 = match$19[2],
|
|
match$21 = type_format_gen(fmt_rest$7, fmtty_rest$7),
|
|
fmtty$7 = match$21[2],
|
|
fmt$8 = match$21[1];
|
|
return [0, [8, fconv, pad$12, prec$8, fmt$8], fmtty$7];
|
|
}
|
|
throw caml_maybe_attach_backtrace(Type_mismatch, 1);
|
|
case 9:
|
|
var
|
|
fmt_rest$8 = fmt[2],
|
|
pad$13 = fmt[1],
|
|
match$22 = type_padding(pad$13, fmtty0),
|
|
pad$14 = match$22[1],
|
|
match$23 = match$22[2];
|
|
if(typeof match$23 !== "number" && 7 === match$23[0]){
|
|
var
|
|
fmtty_rest$8 = match$23[1],
|
|
match$24 = type_format_gen(fmt_rest$8, fmtty_rest$8),
|
|
fmtty$8 = match$24[2],
|
|
fmt$9 = match$24[1];
|
|
return [0, [9, pad$14, fmt$9], fmtty$8];
|
|
}
|
|
throw caml_maybe_attach_backtrace(Type_mismatch, 1);
|
|
case 10:
|
|
var
|
|
fmt_rest$9 = fmt[1],
|
|
match$25 = type_format_gen(fmt_rest$9, fmtty0),
|
|
fmtty$9 = match$25[2],
|
|
fmt$10 = match$25[1];
|
|
return [0, [10, fmt$10], fmtty$9];
|
|
case 11:
|
|
var
|
|
fmt_rest$10 = fmt[2],
|
|
str = fmt[1],
|
|
match$26 = type_format_gen(fmt_rest$10, fmtty0),
|
|
fmtty$10 = match$26[2],
|
|
fmt$11 = match$26[1];
|
|
return [0, [11, str, fmt$11], fmtty$10];
|
|
case 12:
|
|
var
|
|
fmt_rest$11 = fmt[2],
|
|
chr = fmt[1],
|
|
match$27 = type_format_gen(fmt_rest$11, fmtty0),
|
|
fmtty$11 = match$27[2],
|
|
fmt$12 = match$27[1];
|
|
return [0, [12, chr, fmt$12], fmtty$11];
|
|
case 13:
|
|
if(typeof fmtty0 !== "number" && 8 === fmtty0[0]){
|
|
var
|
|
fmtty_rest$9 = fmtty0[2],
|
|
sub_fmtty = fmtty0[1],
|
|
fmt_rest$12 = fmt[3],
|
|
sub_fmtty$0 = fmt[2],
|
|
pad_opt = fmt[1];
|
|
if(caml_notequal([0, sub_fmtty$0], [0, sub_fmtty]))
|
|
throw caml_maybe_attach_backtrace(Type_mismatch, 1);
|
|
var
|
|
match$28 = type_format_gen(fmt_rest$12, fmtty_rest$9),
|
|
fmtty$12 = match$28[2],
|
|
fmt$13 = match$28[1];
|
|
return [0, [13, pad_opt, sub_fmtty, fmt$13], fmtty$12];
|
|
}
|
|
break;
|
|
case 14:
|
|
if(typeof fmtty0 !== "number" && 9 === fmtty0[0]){
|
|
var
|
|
fmtty_rest$10 = fmtty0[3],
|
|
sub_fmtty1 = fmtty0[1],
|
|
fmt_rest$13 = fmt[3],
|
|
sub_fmtty$1 = fmt[2],
|
|
pad_opt$0 = fmt[1],
|
|
b = [0, CamlinternalFormatBasics[2].call(null, sub_fmtty1)];
|
|
if
|
|
(caml_notequal
|
|
([0, CamlinternalFormatBasics[2].call(null, sub_fmtty$1)], b))
|
|
throw caml_maybe_attach_backtrace(Type_mismatch, 1);
|
|
var
|
|
match$29 =
|
|
type_format_gen
|
|
(fmt_rest$13,
|
|
CamlinternalFormatBasics[2].call(null, fmtty_rest$10)),
|
|
fmtty$13 = match$29[2],
|
|
fmt$14 = match$29[1];
|
|
return [0, [14, pad_opt$0, sub_fmtty1, fmt$14], fmtty$13];
|
|
}
|
|
break;
|
|
case 15:
|
|
if(typeof fmtty0 !== "number" && 10 === fmtty0[0]){
|
|
var
|
|
fmtty_rest$11 = fmtty0[1],
|
|
fmt_rest$14 = fmt[1],
|
|
match$30 = type_format_gen(fmt_rest$14, fmtty_rest$11),
|
|
fmtty$14 = match$30[2],
|
|
fmt$15 = match$30[1];
|
|
return [0, [15, fmt$15], fmtty$14];
|
|
}
|
|
break;
|
|
case 16:
|
|
if(typeof fmtty0 !== "number" && 11 === fmtty0[0]){
|
|
var
|
|
fmtty_rest$12 = fmtty0[1],
|
|
fmt_rest$15 = fmt[1],
|
|
match$31 = type_format_gen(fmt_rest$15, fmtty_rest$12),
|
|
fmtty$15 = match$31[2],
|
|
fmt$16 = match$31[1];
|
|
return [0, [16, fmt$16], fmtty$15];
|
|
}
|
|
break;
|
|
case 17:
|
|
var
|
|
fmt_rest$16 = fmt[2],
|
|
formatting_lit = fmt[1],
|
|
match$32 = type_format_gen(fmt_rest$16, fmtty0),
|
|
fmtty$16 = match$32[2],
|
|
fmt$17 = match$32[1];
|
|
return [0, [17, formatting_lit, fmt$17], fmtty$16];
|
|
case 18:
|
|
var fmt_rest$17 = fmt[2], formatting_gen = fmt[1];
|
|
if(0 === formatting_gen[0]){
|
|
var
|
|
match$36 = formatting_gen[1],
|
|
str$0 = match$36[2],
|
|
fmt1 = match$36[1],
|
|
match$37 = type_format_gen(fmt1, fmtty0),
|
|
fmtty2 = match$37[2],
|
|
fmt2 = match$37[1],
|
|
match$38 = type_format_gen(fmt_rest$17, fmtty2),
|
|
fmtty3 = match$38[2],
|
|
fmt3 = match$38[1];
|
|
return [0, [18, [0, [0, fmt2, str$0]], fmt3], fmtty3];
|
|
}
|
|
var
|
|
match$39 = formatting_gen[1],
|
|
str$1 = match$39[2],
|
|
fmt1$0 = match$39[1],
|
|
match$40 = type_format_gen(fmt1$0, fmtty0),
|
|
fmtty2$0 = match$40[2],
|
|
fmt2$0 = match$40[1],
|
|
match$41 = type_format_gen(fmt_rest$17, fmtty2$0),
|
|
fmtty3$0 = match$41[2],
|
|
fmt3$0 = match$41[1];
|
|
return [0, [18, [1, [0, fmt2$0, str$1]], fmt3$0], fmtty3$0];
|
|
case 19:
|
|
if(typeof fmtty0 !== "number" && 13 === fmtty0[0]){
|
|
var
|
|
fmtty_rest$13 = fmtty0[1],
|
|
fmt_rest$18 = fmt[1],
|
|
match$33 = type_format_gen(fmt_rest$18, fmtty_rest$13),
|
|
fmtty$17 = match$33[2],
|
|
fmt$18 = match$33[1];
|
|
return [0, [19, fmt$18], fmtty$17];
|
|
}
|
|
break;
|
|
case 20:
|
|
if(typeof fmtty0 !== "number" && 1 === fmtty0[0]){
|
|
var
|
|
fmtty_rest$14 = fmtty0[1],
|
|
fmt_rest$19 = fmt[3],
|
|
char_set = fmt[2],
|
|
width_opt = fmt[1],
|
|
match$34 = type_format_gen(fmt_rest$19, fmtty_rest$14),
|
|
fmtty$18 = match$34[2],
|
|
fmt$19 = match$34[1];
|
|
return [0, [20, width_opt, char_set, fmt$19], fmtty$18];
|
|
}
|
|
break;
|
|
case 21:
|
|
if(typeof fmtty0 !== "number" && 2 === fmtty0[0]){
|
|
var
|
|
fmtty_rest$15 = fmtty0[1],
|
|
fmt_rest$20 = fmt[2],
|
|
counter = fmt[1],
|
|
match$35 = type_format_gen(fmt_rest$20, fmtty_rest$15),
|
|
fmtty$19 = match$35[2],
|
|
fmt$20 = match$35[1];
|
|
return [0, [21, counter, fmt$20], fmtty$19];
|
|
}
|
|
break;
|
|
case 23:
|
|
var rest = fmt[2], ign = fmt[1];
|
|
if(typeof ign !== "number")
|
|
switch(ign[0]){
|
|
case 8:
|
|
var sub_fmtty$2 = ign[2], pad_opt$1 = ign[1];
|
|
return type_ignored_param_one
|
|
([8, pad_opt$1, sub_fmtty$2], rest, fmtty0);
|
|
case 9:
|
|
var
|
|
sub_fmtty$3 = ign[2],
|
|
pad_opt$2 = ign[1],
|
|
a = type_ignored_format_substituti(sub_fmtty$3, rest, fmtty0),
|
|
match$43 = a[2],
|
|
fmtty$21 = match$43[2],
|
|
fmt$22 = match$43[1],
|
|
sub_fmtty$4 = a[1];
|
|
return [0, [23, [9, pad_opt$2, sub_fmtty$4], fmt$22], fmtty$21];
|
|
default: return type_ignored_param_one(ign, rest, fmtty0);
|
|
}
|
|
if(2 !== ign) return type_ignored_param_one(ign, rest, fmtty0);
|
|
if(typeof fmtty0 !== "number" && 14 === fmtty0[0]){
|
|
var
|
|
fmtty_rest$16 = fmtty0[1],
|
|
match$42 = type_format_gen(rest, fmtty_rest$16),
|
|
fmtty$20 = match$42[2],
|
|
fmt$21 = match$42[1];
|
|
return [0, [23, 2, fmt$21], fmtty$20];
|
|
}
|
|
throw caml_maybe_attach_backtrace(Type_mismatch, 1);
|
|
}
|
|
throw caml_maybe_attach_backtrace(Type_mismatch, 1);
|
|
}
|
|
function type_ignored_param_one(ign, fmt, fmtty){
|
|
var
|
|
match = type_format_gen(fmt, fmtty),
|
|
fmtty$0 = match[2],
|
|
fmt$0 = match[1];
|
|
return [0, [23, ign, fmt$0], fmtty$0];
|
|
}
|
|
function type_ignored_format_substituti(sub_fmtty, fmt, fmtty){
|
|
if(typeof sub_fmtty === "number")
|
|
return [0, 0, type_format_gen(fmt, fmtty)];
|
|
switch(sub_fmtty[0]){
|
|
case 0:
|
|
if(typeof fmtty !== "number" && 0 === fmtty[0]){
|
|
var
|
|
fmtty_rest = fmtty[1],
|
|
sub_fmtty_rest = sub_fmtty[1],
|
|
match =
|
|
type_ignored_format_substituti(sub_fmtty_rest, fmt, fmtty_rest),
|
|
fmt$0 = match[2],
|
|
sub_fmtty_rest$0 = match[1];
|
|
return [0, [0, sub_fmtty_rest$0], fmt$0];
|
|
}
|
|
break;
|
|
case 1:
|
|
if(typeof fmtty !== "number" && 1 === fmtty[0]){
|
|
var
|
|
fmtty_rest$0 = fmtty[1],
|
|
sub_fmtty_rest$1 = sub_fmtty[1],
|
|
match$0 =
|
|
type_ignored_format_substituti(sub_fmtty_rest$1, fmt, fmtty_rest$0),
|
|
fmt$1 = match$0[2],
|
|
sub_fmtty_rest$2 = match$0[1];
|
|
return [0, [1, sub_fmtty_rest$2], fmt$1];
|
|
}
|
|
break;
|
|
case 2:
|
|
if(typeof fmtty !== "number" && 2 === fmtty[0]){
|
|
var
|
|
fmtty_rest$1 = fmtty[1],
|
|
sub_fmtty_rest$3 = sub_fmtty[1],
|
|
match$1 =
|
|
type_ignored_format_substituti(sub_fmtty_rest$3, fmt, fmtty_rest$1),
|
|
fmt$2 = match$1[2],
|
|
sub_fmtty_rest$4 = match$1[1];
|
|
return [0, [2, sub_fmtty_rest$4], fmt$2];
|
|
}
|
|
break;
|
|
case 3:
|
|
if(typeof fmtty !== "number" && 3 === fmtty[0]){
|
|
var
|
|
fmtty_rest$2 = fmtty[1],
|
|
sub_fmtty_rest$5 = sub_fmtty[1],
|
|
match$2 =
|
|
type_ignored_format_substituti(sub_fmtty_rest$5, fmt, fmtty_rest$2),
|
|
fmt$3 = match$2[2],
|
|
sub_fmtty_rest$6 = match$2[1];
|
|
return [0, [3, sub_fmtty_rest$6], fmt$3];
|
|
}
|
|
break;
|
|
case 4:
|
|
if(typeof fmtty !== "number" && 4 === fmtty[0]){
|
|
var
|
|
fmtty_rest$3 = fmtty[1],
|
|
sub_fmtty_rest$7 = sub_fmtty[1],
|
|
match$3 =
|
|
type_ignored_format_substituti(sub_fmtty_rest$7, fmt, fmtty_rest$3),
|
|
fmt$4 = match$3[2],
|
|
sub_fmtty_rest$8 = match$3[1];
|
|
return [0, [4, sub_fmtty_rest$8], fmt$4];
|
|
}
|
|
break;
|
|
case 5:
|
|
if(typeof fmtty !== "number" && 5 === fmtty[0]){
|
|
var
|
|
fmtty_rest$4 = fmtty[1],
|
|
sub_fmtty_rest$9 = sub_fmtty[1],
|
|
match$4 =
|
|
type_ignored_format_substituti(sub_fmtty_rest$9, fmt, fmtty_rest$4),
|
|
fmt$5 = match$4[2],
|
|
sub_fmtty_rest$10 = match$4[1];
|
|
return [0, [5, sub_fmtty_rest$10], fmt$5];
|
|
}
|
|
break;
|
|
case 6:
|
|
if(typeof fmtty !== "number" && 6 === fmtty[0]){
|
|
var
|
|
fmtty_rest$5 = fmtty[1],
|
|
sub_fmtty_rest$11 = sub_fmtty[1],
|
|
match$5 =
|
|
type_ignored_format_substituti
|
|
(sub_fmtty_rest$11, fmt, fmtty_rest$5),
|
|
fmt$6 = match$5[2],
|
|
sub_fmtty_rest$12 = match$5[1];
|
|
return [0, [6, sub_fmtty_rest$12], fmt$6];
|
|
}
|
|
break;
|
|
case 7:
|
|
if(typeof fmtty !== "number" && 7 === fmtty[0]){
|
|
var
|
|
fmtty_rest$6 = fmtty[1],
|
|
sub_fmtty_rest$13 = sub_fmtty[1],
|
|
match$6 =
|
|
type_ignored_format_substituti
|
|
(sub_fmtty_rest$13, fmt, fmtty_rest$6),
|
|
fmt$7 = match$6[2],
|
|
sub_fmtty_rest$14 = match$6[1];
|
|
return [0, [7, sub_fmtty_rest$14], fmt$7];
|
|
}
|
|
break;
|
|
case 8:
|
|
if(typeof fmtty !== "number" && 8 === fmtty[0]){
|
|
var
|
|
fmtty_rest$7 = fmtty[2],
|
|
sub2_fmtty = fmtty[1],
|
|
sub_fmtty_rest$15 = sub_fmtty[2],
|
|
sub2_fmtty$0 = sub_fmtty[1];
|
|
if(caml_notequal([0, sub2_fmtty$0], [0, sub2_fmtty]))
|
|
throw caml_maybe_attach_backtrace(Type_mismatch, 1);
|
|
var
|
|
match$7 =
|
|
type_ignored_format_substituti
|
|
(sub_fmtty_rest$15, fmt, fmtty_rest$7),
|
|
fmt$8 = match$7[2],
|
|
sub_fmtty_rest$16 = match$7[1];
|
|
return [0, [8, sub2_fmtty, sub_fmtty_rest$16], fmt$8];
|
|
}
|
|
break;
|
|
case 9:
|
|
if(typeof fmtty !== "number" && 9 === fmtty[0]){
|
|
var
|
|
fmtty_rest$8 = fmtty[3],
|
|
sub2_fmtty$1 = fmtty[2],
|
|
sub1_fmtty = fmtty[1],
|
|
sub_fmtty_rest$17 = sub_fmtty[3],
|
|
sub2_fmtty$2 = sub_fmtty[2],
|
|
sub1_fmtty$0 = sub_fmtty[1],
|
|
a = [0, CamlinternalFormatBasics[2].call(null, sub1_fmtty)];
|
|
if
|
|
(caml_notequal
|
|
([0, CamlinternalFormatBasics[2].call(null, sub1_fmtty$0)], a))
|
|
throw caml_maybe_attach_backtrace(Type_mismatch, 1);
|
|
var b = [0, CamlinternalFormatBasics[2].call(null, sub2_fmtty$1)];
|
|
if
|
|
(caml_notequal
|
|
([0, CamlinternalFormatBasics[2].call(null, sub2_fmtty$2)], b))
|
|
throw caml_maybe_attach_backtrace(Type_mismatch, 1);
|
|
var
|
|
sub_fmtty$0 = trans(symm(sub1_fmtty), sub2_fmtty$1),
|
|
match$8 = fmtty_rel_det(sub_fmtty$0),
|
|
f4 = match$8[4],
|
|
f2 = match$8[2];
|
|
f2(0);
|
|
f4(0);
|
|
var
|
|
match$9 =
|
|
type_ignored_format_substituti
|
|
(CamlinternalFormatBasics[2].call(null, sub_fmtty_rest$17),
|
|
fmt,
|
|
fmtty_rest$8),
|
|
fmt$9 = match$9[2],
|
|
sub_fmtty_rest$18 = match$9[1];
|
|
return [0,
|
|
[9, sub1_fmtty, sub2_fmtty$1, symm(sub_fmtty_rest$18)],
|
|
fmt$9];
|
|
}
|
|
break;
|
|
case 10:
|
|
if(typeof fmtty !== "number" && 10 === fmtty[0]){
|
|
var
|
|
fmtty_rest$9 = fmtty[1],
|
|
sub_fmtty_rest$19 = sub_fmtty[1],
|
|
match$10 =
|
|
type_ignored_format_substituti
|
|
(sub_fmtty_rest$19, fmt, fmtty_rest$9),
|
|
fmt$10 = match$10[2],
|
|
sub_fmtty_rest$20 = match$10[1];
|
|
return [0, [10, sub_fmtty_rest$20], fmt$10];
|
|
}
|
|
break;
|
|
case 11:
|
|
if(typeof fmtty !== "number" && 11 === fmtty[0]){
|
|
var
|
|
fmtty_rest$10 = fmtty[1],
|
|
sub_fmtty_rest$21 = sub_fmtty[1],
|
|
match$11 =
|
|
type_ignored_format_substituti
|
|
(sub_fmtty_rest$21, fmt, fmtty_rest$10),
|
|
fmt$11 = match$11[2],
|
|
sub_fmtty_rest$22 = match$11[1];
|
|
return [0, [11, sub_fmtty_rest$22], fmt$11];
|
|
}
|
|
break;
|
|
case 13:
|
|
if(typeof fmtty !== "number" && 13 === fmtty[0]){
|
|
var
|
|
fmtty_rest$11 = fmtty[1],
|
|
sub_fmtty_rest$23 = sub_fmtty[1],
|
|
match$12 =
|
|
type_ignored_format_substituti
|
|
(sub_fmtty_rest$23, fmt, fmtty_rest$11),
|
|
fmt$12 = match$12[2],
|
|
sub_fmtty_rest$24 = match$12[1];
|
|
return [0, [13, sub_fmtty_rest$24], fmt$12];
|
|
}
|
|
break;
|
|
case 14:
|
|
if(typeof fmtty !== "number" && 14 === fmtty[0]){
|
|
var
|
|
fmtty_rest$12 = fmtty[1],
|
|
sub_fmtty_rest$25 = sub_fmtty[1],
|
|
match$13 =
|
|
type_ignored_format_substituti
|
|
(sub_fmtty_rest$25, fmt, fmtty_rest$12),
|
|
fmt$13 = match$13[2],
|
|
sub_fmtty_rest$26 = match$13[1];
|
|
return [0, [14, sub_fmtty_rest$26], fmt$13];
|
|
}
|
|
break;
|
|
}
|
|
throw caml_maybe_attach_backtrace(Type_mismatch, 1);
|
|
}
|
|
function recast(fmt, fmtty){
|
|
var a = symm(fmtty);
|
|
return type_format(fmt, CamlinternalFormatBasics[2].call(null, a));
|
|
}
|
|
function fix_padding(padty, width, str){
|
|
var
|
|
len = caml_ml_string_length(str),
|
|
padty$0 = 0 <= width ? padty : 0,
|
|
width$0 = Stdlib[18].call(null, width);
|
|
if(width$0 <= len) return str;
|
|
var
|
|
a = 2 === padty$0 ? 48 : 32,
|
|
res = Stdlib_Bytes[1].call(null, width$0, a);
|
|
switch(padty$0){
|
|
case 0:
|
|
Stdlib_String[6].call(null, str, 0, res, 0, len); break;
|
|
case 1:
|
|
Stdlib_String[6].call(null, str, 0, res, width$0 - len | 0, len);
|
|
break;
|
|
default:
|
|
a:
|
|
if(0 < len){
|
|
if
|
|
(43 !== caml_string_get(str, 0)
|
|
&& 45 !== caml_string_get(str, 0) && 32 !== caml_string_get(str, 0))
|
|
break a;
|
|
caml_bytes_set(res, 0, caml_string_get(str, 0));
|
|
Stdlib_String[6].call
|
|
(null, str, 1, res, (width$0 - len | 0) + 1 | 0, len - 1 | 0);
|
|
break;
|
|
}
|
|
a:
|
|
if(1 < len && 48 === caml_string_get(str, 0)){
|
|
if(120 !== caml_string_get(str, 1) && 88 !== caml_string_get(str, 1))
|
|
break a;
|
|
caml_bytes_set(res, 1, caml_string_get(str, 1));
|
|
Stdlib_String[6].call
|
|
(null, str, 2, res, (width$0 - len | 0) + 2 | 0, len - 2 | 0);
|
|
break;
|
|
}
|
|
Stdlib_String[6].call(null, str, 0, res, width$0 - len | 0, len);
|
|
}
|
|
return Stdlib_Bytes[44].call(null, res);
|
|
}
|
|
function fix_int_precision(prec, str){
|
|
var
|
|
prec$0 = Stdlib[18].call(null, prec),
|
|
len = caml_ml_string_length(str),
|
|
c = caml_string_get(str, 0);
|
|
a:
|
|
{
|
|
b:
|
|
{
|
|
if(58 > c){
|
|
if(32 !== c){
|
|
if(43 > c) break a;
|
|
switch(c - 43 | 0){
|
|
case 5:
|
|
if(len >= (prec$0 + 2 | 0)) break b;
|
|
if(1 >= len) break b;
|
|
if
|
|
(120 !== caml_string_get(str, 1) && 88 !== caml_string_get(str, 1))
|
|
break b;
|
|
var res$1 = Stdlib_Bytes[1].call(null, prec$0 + 2 | 0, 48);
|
|
caml_bytes_set(res$1, 1, caml_string_get(str, 1));
|
|
Stdlib_String[6].call
|
|
(null, str, 2, res$1, (prec$0 - len | 0) + 4 | 0, len - 2 | 0);
|
|
return Stdlib_Bytes[44].call(null, res$1);
|
|
case 0:
|
|
case 2: break;
|
|
case 1:
|
|
case 3:
|
|
case 4:
|
|
break a;
|
|
default: break b;
|
|
}
|
|
}
|
|
if(len >= (prec$0 + 1 | 0)) break a;
|
|
var res$0 = Stdlib_Bytes[1].call(null, prec$0 + 1 | 0, 48);
|
|
caml_bytes_set(res$0, 0, c);
|
|
Stdlib_String[6].call
|
|
(null, str, 1, res$0, (prec$0 - len | 0) + 2 | 0, len - 1 | 0);
|
|
return Stdlib_Bytes[44].call(null, res$0);
|
|
}
|
|
if(71 <= c){if(5 < c - 97 >>> 0) break a;} else if(65 > c) break a;
|
|
}
|
|
if(len < prec$0){
|
|
var res = Stdlib_Bytes[1].call(null, prec$0, 48);
|
|
Stdlib_String[6].call(null, str, 0, res, prec$0 - len | 0, len);
|
|
return Stdlib_Bytes[44].call(null, res);
|
|
}
|
|
}
|
|
return str;
|
|
}
|
|
function string_to_caml_string(str){
|
|
var
|
|
str$0 = Stdlib_String[25].call(null, str),
|
|
l = caml_ml_string_length(str$0),
|
|
res = Stdlib_Bytes[1].call(null, l + 2 | 0, 34);
|
|
caml_blit_string(str$0, 0, res, 1, l);
|
|
return Stdlib_Bytes[44].call(null, res);
|
|
}
|
|
var r = [0, 103];
|
|
function format_of_fconv(fconv, prec){
|
|
var
|
|
prec$0 = Stdlib[18].call(null, prec),
|
|
symb = char_of_fconv(r, fconv),
|
|
buf = buffer_create(16);
|
|
buffer_add_char(buf, 37);
|
|
bprint_fconv_flag(buf, fconv);
|
|
buffer_add_char(buf, 46);
|
|
buffer_add_string(buf, Stdlib_Int[12].call(null, prec$0));
|
|
buffer_add_char(buf, symb);
|
|
return buffer_contents(buf);
|
|
}
|
|
function transform_int_alt(iconv, s){
|
|
if(13 > iconv) return s;
|
|
var b = caml_ml_string_length(s) - 1 | 0, a = 0;
|
|
if(b < 0)
|
|
var n$2 = a;
|
|
else{
|
|
var n = a, i$0 = 0;
|
|
for(;;){
|
|
if(9 < caml_string_unsafe_get(s, i$0) - 48 >>> 0)
|
|
var n$1 = n;
|
|
else
|
|
var n$0 = n + 1 | 0, n$1 = n$0;
|
|
var g = i$0 + 1 | 0;
|
|
if(b === i$0){var n$2 = n$1; break;}
|
|
n = n$1;
|
|
i$0 = g;
|
|
}
|
|
}
|
|
var
|
|
buf =
|
|
caml_create_bytes
|
|
(caml_ml_string_length(s) + ((n$2 - 1 | 0) / 3 | 0) | 0),
|
|
pos = [0, 0];
|
|
function put(c){caml_bytes_set(buf, pos[1], c); pos[1]++;}
|
|
var
|
|
d = caml_ml_string_length(s) - 1 | 0,
|
|
e = ((n$2 - 1 | 0) % 3 | 0) + 1 | 0;
|
|
if(d >= 0){
|
|
var left = e, i = 0;
|
|
for(;;){
|
|
var c = caml_string_unsafe_get(s, i);
|
|
if(9 < c - 48 >>> 0){
|
|
put(c);
|
|
var left$2 = left;
|
|
}
|
|
else{
|
|
var left$0 = 0 === left ? (put(95), 3) : left, left$1 = left$0 - 1 | 0;
|
|
put(c);
|
|
var left$2 = left$1;
|
|
}
|
|
var f = i + 1 | 0;
|
|
if(d === i) break;
|
|
left = left$2;
|
|
i = f;
|
|
}
|
|
}
|
|
return Stdlib_Bytes[44].call(null, buf);
|
|
}
|
|
var cst_u = "%u";
|
|
function convert_int(iconv, n){
|
|
switch(iconv){
|
|
case 1:
|
|
var a = "%+d"; break;
|
|
case 2:
|
|
var a = "% d"; break;
|
|
case 4:
|
|
var a = "%+i"; break;
|
|
case 5:
|
|
var a = "% i"; break;
|
|
case 6:
|
|
var a = "%x"; break;
|
|
case 7:
|
|
var a = "%#x"; break;
|
|
case 8:
|
|
var a = "%X"; break;
|
|
case 9:
|
|
var a = "%#X"; break;
|
|
case 10:
|
|
var a = "%o"; break;
|
|
case 11:
|
|
var a = "%#o"; break;
|
|
case 0:
|
|
case 13:
|
|
var a = "%d"; break;
|
|
case 3:
|
|
case 14:
|
|
var a = cst_i; break;
|
|
default: var a = cst_u;
|
|
}
|
|
return transform_int_alt(iconv, caml_format_int(a, n));
|
|
}
|
|
function convert_int32(iconv, n){
|
|
switch(iconv){
|
|
case 1:
|
|
var a = "%+ld"; break;
|
|
case 2:
|
|
var a = "% ld"; break;
|
|
case 4:
|
|
var a = "%+li"; break;
|
|
case 5:
|
|
var a = "% li"; break;
|
|
case 6:
|
|
var a = "%lx"; break;
|
|
case 7:
|
|
var a = "%#lx"; break;
|
|
case 8:
|
|
var a = "%lX"; break;
|
|
case 9:
|
|
var a = "%#lX"; break;
|
|
case 10:
|
|
var a = "%lo"; break;
|
|
case 11:
|
|
var a = "%#lo"; break;
|
|
case 0:
|
|
case 13:
|
|
var a = "%ld"; break;
|
|
case 3:
|
|
case 14:
|
|
var a = cst_li; break;
|
|
default: var a = "%lu";
|
|
}
|
|
return transform_int_alt(iconv, caml_format_int(a, n));
|
|
}
|
|
function convert_nativeint(iconv, n){
|
|
switch(iconv){
|
|
case 1:
|
|
var a = "%+nd"; break;
|
|
case 2:
|
|
var a = "% nd"; break;
|
|
case 4:
|
|
var a = "%+ni"; break;
|
|
case 5:
|
|
var a = "% ni"; break;
|
|
case 6:
|
|
var a = "%nx"; break;
|
|
case 7:
|
|
var a = "%#nx"; break;
|
|
case 8:
|
|
var a = "%nX"; break;
|
|
case 9:
|
|
var a = "%#nX"; break;
|
|
case 10:
|
|
var a = "%no"; break;
|
|
case 11:
|
|
var a = "%#no"; break;
|
|
case 0:
|
|
case 13:
|
|
var a = "%nd"; break;
|
|
case 3:
|
|
case 14:
|
|
var a = cst_ni; break;
|
|
default: var a = "%nu";
|
|
}
|
|
return transform_int_alt(iconv, caml_format_int(a, n));
|
|
}
|
|
function convert_int64(iconv, n){
|
|
switch(iconv){
|
|
case 1:
|
|
var a = "%+Ld"; break;
|
|
case 2:
|
|
var a = "% Ld"; break;
|
|
case 4:
|
|
var a = "%+Li"; break;
|
|
case 5:
|
|
var a = "% Li"; break;
|
|
case 6:
|
|
var a = "%Lx"; break;
|
|
case 7:
|
|
var a = "%#Lx"; break;
|
|
case 8:
|
|
var a = "%LX"; break;
|
|
case 9:
|
|
var a = "%#LX"; break;
|
|
case 10:
|
|
var a = "%Lo"; break;
|
|
case 11:
|
|
var a = "%#Lo"; break;
|
|
case 0:
|
|
case 13:
|
|
var a = "%Ld"; break;
|
|
case 3:
|
|
case 14:
|
|
var a = cst_Li; break;
|
|
default: var a = "%Lu";
|
|
}
|
|
return transform_int_alt(iconv, runtime.caml_int64_format(a, n));
|
|
}
|
|
function convert_float(fconv, prec, x){
|
|
function hex(param){
|
|
switch(fconv[1]){
|
|
case 0:
|
|
var sign = 45; break;
|
|
case 1:
|
|
var sign = 43; break;
|
|
default: var sign = 32;
|
|
}
|
|
return runtime.caml_hexstring_of_float(x, prec, sign);
|
|
}
|
|
function caml_special_val(str){
|
|
var match = runtime.caml_classify_float(x);
|
|
return 3 === match
|
|
? x < 0. ? "neg_infinity" : "infinity"
|
|
: 4 <= match ? "nan" : str;
|
|
}
|
|
switch(fconv[2]){
|
|
case 5:
|
|
var
|
|
str = caml_format_float(format_of_fconv(fconv, prec), x),
|
|
len = caml_ml_string_length(str),
|
|
i = 0;
|
|
for(;;){
|
|
a:
|
|
{
|
|
if(i !== len){
|
|
var a = caml_string_get(str, i) - 46 | 0;
|
|
b:
|
|
{
|
|
if(23 < a >>> 0){
|
|
if(55 !== a) break b;
|
|
}
|
|
else if(21 >= a - 1 >>> 0) break b;
|
|
var b = 1;
|
|
break a;
|
|
}
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
continue;
|
|
}
|
|
var b = 0;
|
|
}
|
|
var c = b ? str : Stdlib[28].call(null, str, ".");
|
|
return caml_special_val(c);
|
|
}
|
|
case 6:
|
|
return hex(0);
|
|
case 7:
|
|
var d = hex(0); return Stdlib_String[26].call(null, d);
|
|
case 8:
|
|
return caml_special_val(hex(0));
|
|
default: return caml_format_float(format_of_fconv(fconv, prec), x);
|
|
}
|
|
}
|
|
function string_of_fmtty(fmtty){
|
|
var buf = buffer_create(16);
|
|
bprint_fmtty(buf, fmtty);
|
|
return buffer_contents(buf);
|
|
}
|
|
var s = [0, cst_camlinternalFormat_ml, 1558, 4];
|
|
function make_printf$0(counter, k$2, acc$4, fmt$2){
|
|
a:
|
|
{
|
|
b:
|
|
{
|
|
c:
|
|
{
|
|
d:
|
|
{
|
|
e:
|
|
{
|
|
f:
|
|
{
|
|
g:
|
|
{
|
|
h:
|
|
{
|
|
i:
|
|
{
|
|
j:
|
|
{
|
|
var k = k$2, acc = acc$4, fmt = fmt$2;
|
|
k:
|
|
for(;;){
|
|
if(typeof fmt === "number") return caml_call1(k, acc);
|
|
switch(fmt[0]){
|
|
case 0:
|
|
break a;
|
|
case 1:
|
|
break b;
|
|
case 2:
|
|
break c;
|
|
case 3:
|
|
var rest$2 = fmt[2], pad$0 = fmt[1];
|
|
return make_padding
|
|
(k, acc, rest$2, pad$0, string_to_caml_string);
|
|
case 4:
|
|
var
|
|
rest$3 = fmt[4],
|
|
prec = fmt[3],
|
|
pad$1 = fmt[2],
|
|
iconv = fmt[1];
|
|
return make_int_padding_precision
|
|
(k, acc, rest$3, pad$1, prec, convert_int, iconv);
|
|
case 5:
|
|
var
|
|
rest$4 = fmt[4],
|
|
prec$0 = fmt[3],
|
|
pad$2 = fmt[2],
|
|
iconv$0 = fmt[1];
|
|
return make_int_padding_precision
|
|
(k, acc, rest$4, pad$2, prec$0, convert_int32, iconv$0);
|
|
case 6:
|
|
var
|
|
rest$5 = fmt[4],
|
|
prec$1 = fmt[3],
|
|
pad$3 = fmt[2],
|
|
iconv$1 = fmt[1];
|
|
return make_int_padding_precision
|
|
(k, acc, rest$5, pad$3, prec$1, convert_nativeint, iconv$1);
|
|
case 7:
|
|
var
|
|
rest$6 = fmt[4],
|
|
prec$2 = fmt[3],
|
|
pad$4 = fmt[2],
|
|
iconv$2 = fmt[1];
|
|
return make_int_padding_precision
|
|
(k, acc, rest$6, pad$4, prec$2, convert_int64, iconv$2);
|
|
case 8:
|
|
break d;
|
|
case 9:
|
|
var rest$8 = fmt[2], pad$6 = fmt[1];
|
|
return make_padding(k, acc, rest$8, pad$6, Stdlib[30]);
|
|
case 10:
|
|
var rest$9 = fmt[1], acc$0 = [7, acc];
|
|
acc = acc$0;
|
|
fmt = rest$9;
|
|
break;
|
|
case 11:
|
|
var rest$10 = fmt[2], str = fmt[1], acc$1 = [2, acc, str];
|
|
acc = acc$1;
|
|
fmt = rest$10;
|
|
break;
|
|
case 12:
|
|
var rest$11 = fmt[2], chr = fmt[1], acc$2 = [3, acc, chr];
|
|
acc = acc$2;
|
|
fmt = rest$11;
|
|
break;
|
|
case 13:
|
|
break e;
|
|
case 14:
|
|
break f;
|
|
case 15:
|
|
break g;
|
|
case 16:
|
|
break h;
|
|
case 17:
|
|
var
|
|
rest$16 = fmt[2],
|
|
fmting_lit = fmt[1],
|
|
acc$3 = [0, acc, fmting_lit];
|
|
acc = acc$3;
|
|
fmt = rest$16;
|
|
break;
|
|
case 18:
|
|
var a = fmt[1];
|
|
if(0 === a[0]){
|
|
var rest$17 = fmt[2], fmt$0 = a[1][1];
|
|
let acc$0 = acc, k$1 = k, rest = rest$17;
|
|
var
|
|
k$0 =
|
|
function(kacc){
|
|
return make_printf(k$1, [1, acc$0, [0, kacc]], rest);
|
|
};
|
|
k = k$0;
|
|
acc = 0;
|
|
fmt = fmt$0;
|
|
}
|
|
else{
|
|
var rest$18 = fmt[2], fmt$1 = a[1][1];
|
|
let acc$0 = acc, k$0 = k, rest = rest$18;
|
|
var
|
|
k$1 =
|
|
function(kacc){
|
|
return make_printf(k$0, [1, acc$0, [1, kacc]], rest);
|
|
};
|
|
k = k$1;
|
|
acc = 0;
|
|
fmt = fmt$1;
|
|
}
|
|
break;
|
|
case 19:
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, s], 1);
|
|
case 20:
|
|
break i;
|
|
case 21:
|
|
break j;
|
|
case 22:
|
|
break k;
|
|
case 23:
|
|
var rest$22 = fmt[2], ign = fmt[1];
|
|
return counter < 50
|
|
? make_ignored_param$0
|
|
(counter + 1 | 0, k, acc, ign, rest$22)
|
|
: caml_trampoline_return
|
|
(make_ignored_param$0, [0, k, acc, ign, rest$22]);
|
|
default:
|
|
var
|
|
rest$23 = fmt[3],
|
|
f = fmt[2],
|
|
arity = fmt[1],
|
|
b = caml_call1(f, 0);
|
|
return counter < 50
|
|
? make_custom$0(counter + 1 | 0, k, acc, rest$23, arity, b)
|
|
: caml_trampoline_return
|
|
(make_custom$0, [0, k, acc, rest$23, arity, b]);
|
|
}
|
|
}
|
|
var rest$21 = fmt[1];
|
|
return function(c){
|
|
var new_acc = [5, acc, c];
|
|
return make_printf(k, new_acc, rest$21);};
|
|
}
|
|
var rest$20 = fmt[2];
|
|
return function(n){
|
|
var new_acc = [4, acc, caml_format_int(cst_u, n)];
|
|
return make_printf(k, new_acc, rest$20);};
|
|
}
|
|
var
|
|
rest$19 = fmt[3],
|
|
new_acc = [8, acc, "Printf: bad conversion %["];
|
|
return function(param){return make_printf(k, new_acc, rest$19);};
|
|
}
|
|
var rest$15 = fmt[1];
|
|
return function(f){return make_printf(k, [6, acc, f], rest$15);};
|
|
}
|
|
var rest$14 = fmt[1];
|
|
return function(f, x){
|
|
return make_printf
|
|
(k,
|
|
[6, acc, function(o){return caml_call2(f, o, x);}],
|
|
rest$14);};
|
|
}
|
|
var rest$13 = fmt[3], fmtty = fmt[2];
|
|
return function(param){
|
|
var fmt = param[1], a = recast(fmt, fmtty);
|
|
return make_printf
|
|
(k, acc, CamlinternalFormatBasics[3].call(null, a, rest$13));};
|
|
}
|
|
var
|
|
rest$12 = fmt[3],
|
|
sub_fmtty = fmt[2],
|
|
ty = string_of_fmtty(sub_fmtty);
|
|
return function(str){return make_printf(k, [4, acc, ty], rest$12);};
|
|
}
|
|
var rest$7 = fmt[4], prec$3 = fmt[3], pad$5 = fmt[2], fconv = fmt[1];
|
|
if(typeof pad$5 === "number"){
|
|
if(typeof prec$3 === "number")
|
|
return prec$3
|
|
? function
|
|
(p, x){
|
|
var str = convert_float(fconv, p, x);
|
|
return make_printf(k, [4, acc, str], rest$7);
|
|
}
|
|
: function
|
|
(x){
|
|
var
|
|
str =
|
|
convert_float(fconv, default_float_precision(fconv), x);
|
|
return make_printf(k, [4, acc, str], rest$7);
|
|
};
|
|
var p = prec$3[1];
|
|
return function(x){
|
|
var str = convert_float(fconv, p, x);
|
|
return make_printf(k, [4, acc, str], rest$7);};
|
|
}
|
|
if(0 === pad$5[0]){
|
|
var w = pad$5[2], padty = pad$5[1];
|
|
if(typeof prec$3 === "number")
|
|
return prec$3
|
|
? function
|
|
(p, x){
|
|
var str = fix_padding(padty, w, convert_float(fconv, p, x));
|
|
return make_printf(k, [4, acc, str], rest$7);
|
|
}
|
|
: function
|
|
(x){
|
|
var
|
|
str =
|
|
convert_float(fconv, default_float_precision(fconv), x),
|
|
str$0 = fix_padding(padty, w, str);
|
|
return make_printf(k, [4, acc, str$0], rest$7);
|
|
};
|
|
var p$0 = prec$3[1];
|
|
return function(x){
|
|
var str = fix_padding(padty, w, convert_float(fconv, p$0, x));
|
|
return make_printf(k, [4, acc, str], rest$7);};
|
|
}
|
|
var padty$0 = pad$5[1];
|
|
if(typeof prec$3 === "number")
|
|
return prec$3
|
|
? function
|
|
(w, p, x){
|
|
var
|
|
str = fix_padding(padty$0, w, convert_float(fconv, p, x));
|
|
return make_printf(k, [4, acc, str], rest$7);
|
|
}
|
|
: function
|
|
(w, x){
|
|
var
|
|
str =
|
|
convert_float(fconv, default_float_precision(fconv), x),
|
|
str$0 = fix_padding(padty$0, w, str);
|
|
return make_printf(k, [4, acc, str$0], rest$7);
|
|
};
|
|
var p$1 = prec$3[1];
|
|
return function(w, x){
|
|
var str = fix_padding(padty$0, w, convert_float(fconv, p$1, x));
|
|
return make_printf(k, [4, acc, str], rest$7);};
|
|
}
|
|
var rest$1 = fmt[2], pad = fmt[1];
|
|
return make_padding(k, acc, rest$1, pad, function(str){return str;});
|
|
}
|
|
var rest$0 = fmt[1];
|
|
return function(c){
|
|
var
|
|
str = Stdlib_Char[2].call(null, c),
|
|
l = caml_ml_string_length(str),
|
|
res = Stdlib_Bytes[1].call(null, l + 2 | 0, 39);
|
|
caml_blit_string(str, 0, res, 1, l);
|
|
var new_acc = [4, acc, Stdlib_Bytes[44].call(null, res)];
|
|
return make_printf(k, new_acc, rest$0);};
|
|
}
|
|
var rest = fmt[1];
|
|
return function(c){
|
|
var new_acc = [5, acc, c];
|
|
return make_printf(k, new_acc, rest);};
|
|
}
|
|
function make_printf(k, acc, fmt){
|
|
return caml_trampoline(make_printf$0(0, k, acc, fmt));
|
|
}
|
|
var t = [0, cst_camlinternalFormat_ml, 1626, 39];
|
|
function make_ignored_param$0(counter, k, acc, ign, fmt){
|
|
if(typeof ign === "number"){
|
|
if(2 === ign)
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, t], 1);
|
|
return counter < 50
|
|
? make_invalid_arg(counter + 1 | 0, k, acc, fmt)
|
|
: caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]);
|
|
}
|
|
if(9 !== ign[0])
|
|
return counter < 50
|
|
? make_invalid_arg(counter + 1 | 0, k, acc, fmt)
|
|
: caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]);
|
|
var fmtty = ign[2];
|
|
return counter < 50
|
|
? make_from_fmtty$0(counter + 1 | 0, k, acc, fmtty, fmt)
|
|
: caml_trampoline_return
|
|
(make_from_fmtty$0, [0, k, acc, fmtty, fmt]);
|
|
}
|
|
function make_ignored_param(k, acc, ign, fmt){
|
|
return caml_trampoline(make_ignored_param$0(0, k, acc, ign, fmt));
|
|
}
|
|
var
|
|
u = [0, cst_camlinternalFormat_ml, 1649, 31],
|
|
v = [0, cst_camlinternalFormat_ml, 1650, 31];
|
|
function make_from_fmtty$0(counter, k, acc, fmtty, fmt){
|
|
if(typeof fmtty === "number")
|
|
return counter < 50
|
|
? make_invalid_arg(counter + 1 | 0, k, acc, fmt)
|
|
: caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]);
|
|
switch(fmtty[0]){
|
|
case 0:
|
|
var rest = fmtty[1];
|
|
return function(param){return make_from_fmtty(k, acc, rest, fmt);};
|
|
case 1:
|
|
var rest$0 = fmtty[1];
|
|
return function(param){return make_from_fmtty(k, acc, rest$0, fmt);};
|
|
case 2:
|
|
var rest$1 = fmtty[1];
|
|
return function(param){return make_from_fmtty(k, acc, rest$1, fmt);};
|
|
case 3:
|
|
var rest$2 = fmtty[1];
|
|
return function(param){return make_from_fmtty(k, acc, rest$2, fmt);};
|
|
case 4:
|
|
var rest$3 = fmtty[1];
|
|
return function(param){return make_from_fmtty(k, acc, rest$3, fmt);};
|
|
case 5:
|
|
var rest$4 = fmtty[1];
|
|
return function(param){return make_from_fmtty(k, acc, rest$4, fmt);};
|
|
case 6:
|
|
var rest$5 = fmtty[1];
|
|
return function(param){return make_from_fmtty(k, acc, rest$5, fmt);};
|
|
case 7:
|
|
var rest$6 = fmtty[1];
|
|
return function(param){return make_from_fmtty(k, acc, rest$6, fmt);};
|
|
case 8:
|
|
var rest$7 = fmtty[2];
|
|
return function(param){return make_from_fmtty(k, acc, rest$7, fmt);};
|
|
case 9:
|
|
var
|
|
rest$8 = fmtty[3],
|
|
ty2 = fmtty[2],
|
|
ty1 = fmtty[1],
|
|
ty = trans(symm(ty1), ty2);
|
|
return function(param){
|
|
return make_from_fmtty
|
|
(k,
|
|
acc,
|
|
CamlinternalFormatBasics[1].call(null, ty, rest$8),
|
|
fmt);};
|
|
case 10:
|
|
var rest$9 = fmtty[1];
|
|
return function(a, param){
|
|
return make_from_fmtty(k, acc, rest$9, fmt);};
|
|
case 11:
|
|
var rest$10 = fmtty[1];
|
|
return function(param){return make_from_fmtty(k, acc, rest$10, fmt);};
|
|
case 12:
|
|
var rest$11 = fmtty[1];
|
|
return function(param){return make_from_fmtty(k, acc, rest$11, fmt);};
|
|
case 13:
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, u], 1);
|
|
default: throw caml_maybe_attach_backtrace([0, Assert_failure, v], 1);
|
|
}
|
|
}
|
|
function make_from_fmtty(k, acc, fmtty, fmt){
|
|
return caml_trampoline(make_from_fmtty$0(0, k, acc, fmtty, fmt));
|
|
}
|
|
function make_invalid_arg(counter, k, acc, fmt){
|
|
var a = [8, acc, "Printf: bad conversion %_"];
|
|
return counter < 50
|
|
? make_printf$0(counter + 1 | 0, k, a, fmt)
|
|
: caml_trampoline_return(make_printf$0, [0, k, a, fmt]);
|
|
}
|
|
function make_padding(k, acc, fmt, pad, trans){
|
|
if(typeof pad === "number")
|
|
return function(x){
|
|
var new_acc = [4, acc, caml_call1(trans, x)];
|
|
return make_printf(k, new_acc, fmt);};
|
|
if(0 === pad[0]){
|
|
var width = pad[2], padty = pad[1];
|
|
return function(x){
|
|
var new_acc = [4, acc, fix_padding(padty, width, caml_call1(trans, x))];
|
|
return make_printf(k, new_acc, fmt);};
|
|
}
|
|
var padty$0 = pad[1];
|
|
return function(w, x){
|
|
var new_acc = [4, acc, fix_padding(padty$0, w, caml_call1(trans, x))];
|
|
return make_printf(k, new_acc, fmt);};
|
|
}
|
|
function make_int_padding_precision(k, acc, fmt, pad, prec, trans, iconv){
|
|
if(typeof pad === "number"){
|
|
if(typeof prec === "number")
|
|
return prec
|
|
? function
|
|
(p, x){
|
|
var str = fix_int_precision(p, caml_call2(trans, iconv, x));
|
|
return make_printf(k, [4, acc, str], fmt);
|
|
}
|
|
: function
|
|
(x){
|
|
var str = caml_call2(trans, iconv, x);
|
|
return make_printf(k, [4, acc, str], fmt);
|
|
};
|
|
var p = prec[1];
|
|
return function(x){
|
|
var str = fix_int_precision(p, caml_call2(trans, iconv, x));
|
|
return make_printf(k, [4, acc, str], fmt);};
|
|
}
|
|
if(0 === pad[0]){
|
|
var w = pad[2], padty = pad[1];
|
|
if(typeof prec === "number")
|
|
return prec
|
|
? function
|
|
(p, x){
|
|
var
|
|
str =
|
|
fix_padding
|
|
(padty,
|
|
w,
|
|
fix_int_precision(p, caml_call2(trans, iconv, x)));
|
|
return make_printf(k, [4, acc, str], fmt);
|
|
}
|
|
: function
|
|
(x){
|
|
var str = fix_padding(padty, w, caml_call2(trans, iconv, x));
|
|
return make_printf(k, [4, acc, str], fmt);
|
|
};
|
|
var p$0 = prec[1];
|
|
return function(x){
|
|
var
|
|
str =
|
|
fix_padding
|
|
(padty, w, fix_int_precision(p$0, caml_call2(trans, iconv, x)));
|
|
return make_printf(k, [4, acc, str], fmt);};
|
|
}
|
|
var padty$0 = pad[1];
|
|
if(typeof prec === "number")
|
|
return prec
|
|
? function
|
|
(w, p, x){
|
|
var
|
|
str =
|
|
fix_padding
|
|
(padty$0,
|
|
w,
|
|
fix_int_precision(p, caml_call2(trans, iconv, x)));
|
|
return make_printf(k, [4, acc, str], fmt);
|
|
}
|
|
: function
|
|
(w, x){
|
|
var str = fix_padding(padty$0, w, caml_call2(trans, iconv, x));
|
|
return make_printf(k, [4, acc, str], fmt);
|
|
};
|
|
var p$1 = prec[1];
|
|
return function(w, x){
|
|
var
|
|
str =
|
|
fix_padding
|
|
(padty$0, w, fix_int_precision(p$1, caml_call2(trans, iconv, x)));
|
|
return make_printf(k, [4, acc, str], fmt);};
|
|
}
|
|
function make_custom$0(counter, k, acc, rest, arity, f){
|
|
if(arity){
|
|
var arity$0 = arity[1];
|
|
return function(x){
|
|
return make_custom(k, acc, rest, arity$0, caml_call1(f, x));};
|
|
}
|
|
var a = [4, acc, f];
|
|
return counter < 50
|
|
? make_printf$0(counter + 1 | 0, k, a, rest)
|
|
: caml_trampoline_return(make_printf$0, [0, k, a, rest]);
|
|
}
|
|
function make_custom(k, acc, rest, arity, f){
|
|
return caml_trampoline(make_custom$0(0, k, acc, rest, arity, f));
|
|
}
|
|
var w = [0, cst_camlinternalFormat_ml, 1830, 8];
|
|
function make_iprintf$0(counter, k$2, o, fmt$2){
|
|
a:
|
|
{
|
|
b:
|
|
{
|
|
c:
|
|
{
|
|
d:
|
|
{
|
|
e:
|
|
{
|
|
f:
|
|
{
|
|
g:
|
|
{
|
|
h:
|
|
{
|
|
i:
|
|
{
|
|
var k = k$2, fmt = fmt$2;
|
|
j:
|
|
for(;;){
|
|
if(typeof fmt === "number") return caml_call1(k, o);
|
|
switch(fmt[0]){
|
|
case 2:
|
|
break b;
|
|
case 3:
|
|
break c;
|
|
case 9:
|
|
break e;
|
|
case 10:
|
|
var rest$10 = fmt[1]; fmt = rest$10; break;
|
|
case 14:
|
|
break g;
|
|
case 15:
|
|
break h;
|
|
case 18:
|
|
var a = fmt[1];
|
|
if(0 === a[0]){
|
|
var rest$15 = fmt[2], fmt$0 = a[1][1];
|
|
let k$1 = k, rest = rest$15;
|
|
var
|
|
k$0 = function(koc){return make_iprintf(k$1, koc, rest);};
|
|
k = k$0;
|
|
fmt = fmt$0;
|
|
}
|
|
else{
|
|
var rest$16 = fmt[2], fmt$1 = a[1][1];
|
|
let k$0 = k, rest = rest$16;
|
|
var
|
|
k$1 = function(koc){return make_iprintf(k$0, koc, rest);};
|
|
k = k$1;
|
|
fmt = fmt$1;
|
|
}
|
|
break;
|
|
case 19:
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, w], 1);
|
|
case 21:
|
|
break i;
|
|
case 23:
|
|
break j;
|
|
case 24:
|
|
var rest$19 = fmt[3], arity = fmt[1];
|
|
return counter < 50
|
|
? fn_of_custom_arity$0
|
|
(counter + 1 | 0, k, o, rest$19, arity)
|
|
: caml_trampoline_return
|
|
(fn_of_custom_arity$0, [0, k, o, rest$19, arity]);
|
|
case 13:
|
|
case 20:
|
|
break f;
|
|
case 11:
|
|
case 12:
|
|
case 17:
|
|
var rest$11 = fmt[2]; fmt = rest$11; break;
|
|
case 0:
|
|
case 1:
|
|
case 16:
|
|
case 22:
|
|
break a;
|
|
default: break d;
|
|
}
|
|
}
|
|
var rest$18 = fmt[2], ign = fmt[1];
|
|
return make_ignored_param
|
|
(function(param){return caml_call1(k, o);}, 0, ign, rest$18);
|
|
}
|
|
var rest$17 = fmt[2], x$15 = make_iprintf(k, o, rest$17);
|
|
return function(param){return x$15;};
|
|
}
|
|
var
|
|
rest$14 = fmt[1],
|
|
x$13 = make_iprintf(k, o, rest$14),
|
|
x$14 = function(param){return x$13;};
|
|
return function(param){return x$14;};
|
|
}
|
|
var rest$13 = fmt[3], fmtty = fmt[2];
|
|
return function(param){
|
|
var fmt = param[1], a = recast(fmt, fmtty);
|
|
return make_iprintf
|
|
(k, o, CamlinternalFormatBasics[3].call(null, a, rest$13));};
|
|
}
|
|
var rest$12 = fmt[3], x$12 = make_iprintf(k, o, rest$12);
|
|
return function(param){return x$12;};
|
|
}
|
|
var match$1 = fmt[1];
|
|
if(typeof match$1 === "number"){
|
|
var rest$7 = fmt[2], x$8 = make_iprintf(k, o, rest$7);
|
|
return function(param){return x$8;};
|
|
}
|
|
if(0 === match$1[0]){
|
|
var rest$8 = fmt[2], x$9 = make_iprintf(k, o, rest$8);
|
|
return function(param){return x$9;};
|
|
}
|
|
var
|
|
rest$9 = fmt[2],
|
|
x$10 = make_iprintf(k, o, rest$9),
|
|
x$11 = function(param){return x$10;};
|
|
return function(param){return x$11;};
|
|
}
|
|
var rest$6 = fmt[4], prec = fmt[3], pad = fmt[2];
|
|
if(typeof pad === "number"){
|
|
if(typeof prec !== "number"){
|
|
var x$19 = make_iprintf(k, o, rest$6);
|
|
return function(param){return x$19;};
|
|
}
|
|
if(prec){
|
|
var
|
|
x$16 = make_iprintf(k, o, rest$6),
|
|
x$17 = function(param){return x$16;};
|
|
return function(param){return x$17;};
|
|
}
|
|
var x$18 = make_iprintf(k, o, rest$6);
|
|
return function(param){return x$18;};
|
|
}
|
|
if(0 === pad[0]){
|
|
if(typeof prec !== "number"){
|
|
var x$23 = make_iprintf(k, o, rest$6);
|
|
return function(param){return x$23;};
|
|
}
|
|
if(prec){
|
|
var
|
|
x$20 = make_iprintf(k, o, rest$6),
|
|
x$21 = function(param){return x$20;};
|
|
return function(param){return x$21;};
|
|
}
|
|
var x$22 = make_iprintf(k, o, rest$6);
|
|
return function(param){return x$22;};
|
|
}
|
|
if(typeof prec !== "number"){
|
|
var
|
|
x$29 = make_iprintf(k, o, rest$6),
|
|
x$30 = function(param){return x$29;};
|
|
return function(param){return x$30;};
|
|
}
|
|
if(prec){
|
|
var
|
|
x$24 = make_iprintf(k, o, rest$6),
|
|
x$25 = function(param){return x$24;},
|
|
x$26 = function(param){return x$25;};
|
|
return function(param){return x$26;};
|
|
}
|
|
var
|
|
x$27 = make_iprintf(k, o, rest$6),
|
|
x$28 = function(param){return x$27;};
|
|
return function(param){return x$28;};
|
|
}
|
|
var match$0 = fmt[1];
|
|
if(typeof match$0 === "number"){
|
|
var rest$3 = fmt[2], x$4 = make_iprintf(k, o, rest$3);
|
|
return function(param){return x$4;};
|
|
}
|
|
if(0 === match$0[0]){
|
|
var rest$4 = fmt[2], x$5 = make_iprintf(k, o, rest$4);
|
|
return function(param){return x$5;};
|
|
}
|
|
var
|
|
rest$5 = fmt[2],
|
|
x$6 = make_iprintf(k, o, rest$5),
|
|
x$7 = function(param){return x$6;};
|
|
return function(param){return x$7;};
|
|
}
|
|
var match = fmt[1];
|
|
if(typeof match === "number"){
|
|
var rest$0 = fmt[2], x$0 = make_iprintf(k, o, rest$0);
|
|
return function(param){return x$0;};
|
|
}
|
|
if(0 === match[0]){
|
|
var rest$1 = fmt[2], x$1 = make_iprintf(k, o, rest$1);
|
|
return function(param){return x$1;};
|
|
}
|
|
var
|
|
rest$2 = fmt[2],
|
|
x$2 = make_iprintf(k, o, rest$2),
|
|
x$3 = function(param){return x$2;};
|
|
return function(param){return x$3;};
|
|
}
|
|
var rest = fmt[1], x = make_iprintf(k, o, rest);
|
|
return function(param){return x;};
|
|
}
|
|
function make_iprintf(k, o, fmt){
|
|
return caml_trampoline(make_iprintf$0(0, k, o, fmt));
|
|
}
|
|
function fn_of_custom_arity$0(counter, k, o, fmt, param){
|
|
if(! param)
|
|
return counter < 50
|
|
? make_iprintf$0(counter + 1 | 0, k, o, fmt)
|
|
: caml_trampoline_return(make_iprintf$0, [0, k, o, fmt]);
|
|
var arity = param[1], x = fn_of_custom_arity(k, o, fmt, arity);
|
|
return function(param){return x;};
|
|
}
|
|
function fn_of_custom_arity(k, o, fmt, param){
|
|
return caml_trampoline(fn_of_custom_arity$0(0, k, o, fmt, param));
|
|
}
|
|
function output_acc(o, acc$2){
|
|
var acc = acc$2;
|
|
for(;;){
|
|
if(typeof acc === "number") return 0;
|
|
switch(acc[0]){
|
|
case 0:
|
|
var
|
|
fmting_lit = acc[2],
|
|
p = acc[1],
|
|
s = string_of_formatting_lit(fmting_lit);
|
|
output_acc(o, p);
|
|
return Stdlib[66].call(null, o, s);
|
|
case 1:
|
|
var match = acc[2], p$0 = acc[1];
|
|
if(0 === match[0]){
|
|
var acc$0 = match[1];
|
|
output_acc(o, p$0);
|
|
Stdlib[66].call(null, o, cst);
|
|
acc = acc$0;
|
|
}
|
|
else{
|
|
var acc$1 = match[1];
|
|
output_acc(o, p$0);
|
|
Stdlib[66].call(null, o, cst$0);
|
|
acc = acc$1;
|
|
}
|
|
break;
|
|
case 6:
|
|
var f = acc[2], p$3 = acc[1];
|
|
output_acc(o, p$3);
|
|
return caml_call1(f, o);
|
|
case 7:
|
|
var p$4 = acc[1]; output_acc(o, p$4); return Stdlib[63].call(null, o);
|
|
case 8:
|
|
var msg = acc[2], p$5 = acc[1];
|
|
output_acc(o, p$5);
|
|
return Stdlib[1].call(null, msg);
|
|
case 2:
|
|
case 4:
|
|
var s$0 = acc[2], p$1 = acc[1];
|
|
output_acc(o, p$1);
|
|
return Stdlib[66].call(null, o, s$0);
|
|
default:
|
|
var c = acc[2], p$2 = acc[1];
|
|
output_acc(o, p$2);
|
|
return Stdlib[65].call(null, o, c);
|
|
}
|
|
}
|
|
}
|
|
function bufput_acc(b, acc$3){
|
|
var acc = acc$3;
|
|
for(;;){
|
|
if(typeof acc === "number") return 0;
|
|
switch(acc[0]){
|
|
case 0:
|
|
var
|
|
fmting_lit = acc[2],
|
|
p = acc[1],
|
|
s = string_of_formatting_lit(fmting_lit);
|
|
bufput_acc(b, p);
|
|
return Stdlib_Buffer[16].call(null, b, s);
|
|
case 1:
|
|
var match = acc[2], p$0 = acc[1];
|
|
if(0 === match[0]){
|
|
var acc$0 = match[1];
|
|
bufput_acc(b, p$0);
|
|
Stdlib_Buffer[16].call(null, b, cst);
|
|
acc = acc$0;
|
|
}
|
|
else{
|
|
var acc$1 = match[1];
|
|
bufput_acc(b, p$0);
|
|
Stdlib_Buffer[16].call(null, b, cst$0);
|
|
acc = acc$1;
|
|
}
|
|
break;
|
|
case 6:
|
|
var f = acc[2], p$3 = acc[1];
|
|
bufput_acc(b, p$3);
|
|
return caml_call1(f, b);
|
|
case 7:
|
|
var acc$2 = acc[1]; acc = acc$2; break;
|
|
case 8:
|
|
var msg = acc[2], p$4 = acc[1];
|
|
bufput_acc(b, p$4);
|
|
return Stdlib[1].call(null, msg);
|
|
case 2:
|
|
case 4:
|
|
var s$0 = acc[2], p$1 = acc[1];
|
|
bufput_acc(b, p$1);
|
|
return Stdlib_Buffer[16].call(null, b, s$0);
|
|
default:
|
|
var c = acc[2], p$2 = acc[1];
|
|
bufput_acc(b, p$2);
|
|
return Stdlib_Buffer[12].call(null, b, c);
|
|
}
|
|
}
|
|
}
|
|
function strput_acc(b, acc$3){
|
|
var acc = acc$3;
|
|
for(;;){
|
|
if(typeof acc === "number") return 0;
|
|
switch(acc[0]){
|
|
case 0:
|
|
var
|
|
fmting_lit = acc[2],
|
|
p = acc[1],
|
|
s = string_of_formatting_lit(fmting_lit);
|
|
strput_acc(b, p);
|
|
return Stdlib_Buffer[16].call(null, b, s);
|
|
case 1:
|
|
var match = acc[2], p$0 = acc[1];
|
|
if(0 === match[0]){
|
|
var acc$0 = match[1];
|
|
strput_acc(b, p$0);
|
|
Stdlib_Buffer[16].call(null, b, cst);
|
|
acc = acc$0;
|
|
}
|
|
else{
|
|
var acc$1 = match[1];
|
|
strput_acc(b, p$0);
|
|
Stdlib_Buffer[16].call(null, b, cst$0);
|
|
acc = acc$1;
|
|
}
|
|
break;
|
|
case 6:
|
|
var f = acc[2], p$3 = acc[1];
|
|
strput_acc(b, p$3);
|
|
var a = caml_call1(f, 0);
|
|
return Stdlib_Buffer[16].call(null, b, a);
|
|
case 7:
|
|
var acc$2 = acc[1]; acc = acc$2; break;
|
|
case 8:
|
|
var msg = acc[2], p$4 = acc[1];
|
|
strput_acc(b, p$4);
|
|
return Stdlib[1].call(null, msg);
|
|
case 2:
|
|
case 4:
|
|
var s$0 = acc[2], p$1 = acc[1];
|
|
strput_acc(b, p$1);
|
|
return Stdlib_Buffer[16].call(null, b, s$0);
|
|
default:
|
|
var c = acc[2], p$2 = acc[1];
|
|
strput_acc(b, p$2);
|
|
return Stdlib_Buffer[12].call(null, b, c);
|
|
}
|
|
}
|
|
}
|
|
function failwith_message(param){
|
|
var fmt = param[1], buf = Stdlib_Buffer[1].call(null, 256);
|
|
function k(acc){
|
|
strput_acc(buf, acc);
|
|
var a = Stdlib_Buffer[2].call(null, buf);
|
|
return Stdlib[2].call(null, a);
|
|
}
|
|
return make_printf(k, 0, fmt);
|
|
}
|
|
var
|
|
cst$1 = "",
|
|
x = [0, 0, 4],
|
|
y =
|
|
[0,
|
|
[11, "invalid box description ", [3, 0, 0]],
|
|
"invalid box description %S"];
|
|
function open_box_of_string(str){
|
|
if(str === cst$1) return x;
|
|
var len = caml_ml_string_length(str);
|
|
function invalid_box(param){return caml_call1(failwith_message(y), str);}
|
|
function parse_spaces(i$1){
|
|
var i = i$1;
|
|
for(;;){
|
|
if(i === len) return i;
|
|
var match = caml_string_get(str, i);
|
|
if(9 !== match && 32 !== match) return i;
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
var wstart = parse_spaces(0), wend = wstart;
|
|
for(;;){
|
|
if(wend === len) break;
|
|
if(25 < caml_string_get(str, wend) - 97 >>> 0) break;
|
|
var j = wend + 1 | 0;
|
|
wend = j;
|
|
}
|
|
var
|
|
box_name = Stdlib_String[16].call(null, str, wstart, wend - wstart | 0),
|
|
nstart = parse_spaces(wend),
|
|
nend = nstart;
|
|
for(;;){
|
|
if(nend === len) break;
|
|
var match = caml_string_get(str, nend);
|
|
if(48 <= match){if(58 <= match) break;} else if(45 !== match) break;
|
|
var j$0 = nend + 1 | 0;
|
|
nend = j$0;
|
|
}
|
|
if(nstart === nend)
|
|
var indent = 0;
|
|
else
|
|
try{
|
|
var
|
|
a =
|
|
runtime.caml_int_of_string
|
|
(Stdlib_String[16].call(null, str, nstart, nend - nstart | 0)),
|
|
indent = a;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn[1] !== Stdlib[7]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var indent = invalid_box(0);
|
|
}
|
|
var exp_end = parse_spaces(nend);
|
|
if(exp_end !== len) invalid_box(0);
|
|
a:
|
|
{
|
|
if(box_name !== cst$1 && box_name !== "b"){
|
|
if(box_name === "h"){var box_type = 0; break a;}
|
|
if(box_name === "hov"){var box_type = 3; break a;}
|
|
if(box_name === "hv"){var box_type = 2; break a;}
|
|
if(box_name !== "v"){var box_type = invalid_box(0); break a;}
|
|
var box_type = 1;
|
|
break a;
|
|
}
|
|
var box_type = 4;
|
|
}
|
|
return [0, indent, box_type];
|
|
}
|
|
function make_padding_fmt_ebb(pad, fmt){
|
|
if(typeof pad === "number") return [0, 0, fmt];
|
|
if(0 === pad[0]){var w = pad[2], s = pad[1]; return [0, [0, s, w], fmt];}
|
|
var s$0 = pad[1];
|
|
return [0, [1, s$0], fmt];
|
|
}
|
|
function make_padprec_fmt_ebb(pad, prec, fmt){
|
|
if(typeof prec === "number")
|
|
var match = prec ? [0, 1] : [0, 0];
|
|
else
|
|
var p = prec[1], match = [0, [0, p]];
|
|
var prec$0 = match[1];
|
|
if(typeof pad === "number") return [0, 0, prec$0, fmt];
|
|
if(0 === pad[0]){
|
|
var w = pad[2], s = pad[1];
|
|
return [0, [0, s, w], prec$0, fmt];
|
|
}
|
|
var s$0 = pad[1];
|
|
return [0, [1, s$0], prec$0, fmt];
|
|
}
|
|
var
|
|
cst$2 = ", ",
|
|
cst_at_character_number = ": at character number ",
|
|
cst_invalid_format = "invalid format ",
|
|
sub_format = [0, 0, cst$1],
|
|
formatting_lit = [0, "@;", 1, 0],
|
|
z =
|
|
[0,
|
|
[11,
|
|
cst_invalid_format,
|
|
[3,
|
|
0,
|
|
[11, cst_at_character_number, [4, 0, 0, 0, [11, cst$2, [2, 0, 0]]]]]],
|
|
"invalid format %S: at character number %d, %s"],
|
|
A =
|
|
[0,
|
|
[11,
|
|
cst_invalid_format,
|
|
[3,
|
|
0,
|
|
[11,
|
|
cst_at_character_number,
|
|
[4, 0, 0, 0, [11, ", '", [0, [11, "' without ", [2, 0, 0]]]]]]]],
|
|
"invalid format %S: at character number %d, '%c' without %s"],
|
|
B =
|
|
[0,
|
|
[11,
|
|
cst_invalid_format,
|
|
[3,
|
|
0,
|
|
[11,
|
|
cst_at_character_number,
|
|
[4, 0, 0, 0, [11, cst$2, [2, 0, [11, " expected, read ", [1, 0]]]]]]]],
|
|
"invalid format %S: at character number %d, %s expected, read %C"],
|
|
C =
|
|
[0,
|
|
[11,
|
|
cst_invalid_format,
|
|
[3,
|
|
0,
|
|
[11,
|
|
cst_at_character_number,
|
|
[4, 0, 0, 0, [11, ", duplicate flag ", [1, 0]]]]]],
|
|
"invalid format %S: at character number %d, duplicate flag %C"],
|
|
D = [0, 1, 0],
|
|
E = [0, 0],
|
|
F = [1, 0],
|
|
G = [1, 1],
|
|
H = [1, 1],
|
|
I = [1, 1],
|
|
J =
|
|
[0,
|
|
[11,
|
|
cst_invalid_format,
|
|
[3,
|
|
0,
|
|
[11,
|
|
cst_at_character_number,
|
|
[4,
|
|
0,
|
|
0,
|
|
0,
|
|
[11, ', invalid conversion "', [12, 37, [0, [12, 34, 0]]]]]]]],
|
|
'invalid format %S: at character number %d, invalid conversion "%%%c"'],
|
|
K = [0, 0],
|
|
L = [0, 0],
|
|
M =
|
|
[0,
|
|
[11,
|
|
cst_invalid_format,
|
|
[3,
|
|
0,
|
|
[11,
|
|
cst_at_character_number,
|
|
[4,
|
|
0,
|
|
0,
|
|
0,
|
|
[11,
|
|
", flag ",
|
|
[1,
|
|
[11,
|
|
" is only allowed after the '",
|
|
[12, 37, [11, "', before padding and precision", 0]]]]]]]]],
|
|
"invalid format %S: at character number %d, flag %C is only allowed after the '%%', before padding and precision"],
|
|
N = [0, [12, 64, 0]],
|
|
O = [0, "@ ", 1, 0],
|
|
P = [0, "@,", 0, 0],
|
|
Q = [2, 60],
|
|
R =
|
|
[0,
|
|
[11,
|
|
cst_invalid_format,
|
|
[3,
|
|
0,
|
|
[11,
|
|
": '",
|
|
[12,
|
|
37,
|
|
[11,
|
|
"' alone is not accepted in character sets, use ",
|
|
[12,
|
|
37,
|
|
[12,
|
|
37,
|
|
[11, " instead at position ", [4, 0, 0, 0, [12, 46, 0]]]]]]]]]],
|
|
"invalid format %S: '%%' alone is not accepted in character sets, use %%%% instead at position %d."],
|
|
S =
|
|
[0,
|
|
[11,
|
|
cst_invalid_format,
|
|
[3,
|
|
0,
|
|
[11,
|
|
": integer ",
|
|
[4, 0, 0, 0, [11, " is greater than the limit ", [4, 0, 0, 0, 0]]]]]],
|
|
"invalid format %S: integer %d is greater than the limit %d"],
|
|
T = [0, cst_camlinternalFormat_ml, 2837, 11],
|
|
U =
|
|
[0,
|
|
[11,
|
|
cst_invalid_format,
|
|
[3,
|
|
0,
|
|
[11,
|
|
': unclosed sub-format, expected "',
|
|
[12, 37, [0, [11, '" at character number ', [4, 0, 0, 0, 0]]]]]]],
|
|
'invalid format %S: unclosed sub-format, expected "%%%c" at character number %d'],
|
|
V = [0, cst_camlinternalFormat_ml, 2899, 34],
|
|
W = [0, cst_camlinternalFormat_ml, 2935, 28],
|
|
X = [0, cst_camlinternalFormat_ml, 2957, 11],
|
|
Y =
|
|
[0,
|
|
[11,
|
|
cst_invalid_format,
|
|
[3,
|
|
0,
|
|
[11,
|
|
cst_at_character_number,
|
|
[4,
|
|
0,
|
|
0,
|
|
0,
|
|
[11,
|
|
cst$2,
|
|
[2,
|
|
0,
|
|
[11,
|
|
" is incompatible with '",
|
|
[0, [11, "' in sub-format ", [3, 0, 0]]]]]]]]]],
|
|
"invalid format %S: at character number %d, %s is incompatible with '%c' in sub-format %S"];
|
|
function fmt_ebb_of_string(legacy_behavior, str){
|
|
if(legacy_behavior)
|
|
var flag = legacy_behavior[1], legacy_behavior$0 = flag;
|
|
else
|
|
var legacy_behavior$0 = 1;
|
|
function invalid_format_message(str_ind, msg){
|
|
return caml_call3(failwith_message(z), str, str_ind, msg);
|
|
}
|
|
function invalid_format_without(str_ind, c, s){
|
|
return caml_call4(failwith_message(A), str, str_ind, c, s);
|
|
}
|
|
function expected_character(str_ind, expected, read){
|
|
return caml_call4(failwith_message(B), str, str_ind, expected, read);
|
|
}
|
|
var cst_unexpected_end_of_format = "unexpected end of format";
|
|
function parse(lit_start, end_ind){
|
|
var str_ind = lit_start;
|
|
for(;;){
|
|
if(str_ind === end_ind) return add_literal(lit_start, str_ind, 0);
|
|
var match = caml_string_get(str, str_ind);
|
|
if(37 === match) break;
|
|
if(64 === match){
|
|
var fmt_rest$0 = parse_after_at(str_ind + 1 | 0, end_ind)[1];
|
|
return add_literal(lit_start, str_ind, fmt_rest$0);
|
|
}
|
|
var str_ind$0 = str_ind + 1 | 0;
|
|
str_ind = str_ind$0;
|
|
}
|
|
var str_ind$1 = str_ind + 1 | 0;
|
|
if(str_ind$1 === end_ind)
|
|
invalid_format_message(end_ind, cst_unexpected_end_of_format);
|
|
var
|
|
match$0 =
|
|
95 === caml_string_get(str, str_ind$1)
|
|
? parse_flags(str_ind, str_ind$1 + 1 | 0, end_ind, 1)
|
|
: parse_flags(str_ind, str_ind$1, end_ind, 0),
|
|
fmt_rest = match$0[1];
|
|
return add_literal(lit_start, str_ind, fmt_rest);
|
|
}
|
|
var cst_0 = "0";
|
|
function parse_flags(pct_ind, str_ind, end_ind, ign){
|
|
function set_flag(str_ind, flag){
|
|
var a = flag[1], b = a ? 1 - legacy_behavior$0 : a;
|
|
if(b){
|
|
var c = caml_string_get(str, str_ind);
|
|
caml_call3(failwith_message(C), str, str_ind, c);
|
|
}
|
|
flag[1] = 1;
|
|
}
|
|
var
|
|
str_ind$0 = str_ind,
|
|
zero = [0, 0],
|
|
minus = [0, 0],
|
|
plus = [0, 0],
|
|
space = [0, 0],
|
|
hash = [0, 0];
|
|
a:
|
|
for(;;){
|
|
if(str_ind$0 === end_ind)
|
|
invalid_format_message(end_ind, cst_unexpected_end_of_format);
|
|
var switcher = caml_string_get(str, str_ind$0) - 32 | 0;
|
|
if(16 < switcher >>> 0) break;
|
|
switch(switcher){
|
|
case 0:
|
|
set_flag(str_ind$0, space);
|
|
var str_ind$1 = str_ind$0 + 1 | 0;
|
|
str_ind$0 = str_ind$1;
|
|
break;
|
|
case 3:
|
|
set_flag(str_ind$0, hash);
|
|
var str_ind$2 = str_ind$0 + 1 | 0;
|
|
str_ind$0 = str_ind$2;
|
|
break;
|
|
case 11:
|
|
set_flag(str_ind$0, plus);
|
|
var str_ind$3 = str_ind$0 + 1 | 0;
|
|
str_ind$0 = str_ind$3;
|
|
break;
|
|
case 13:
|
|
set_flag(str_ind$0, minus);
|
|
var str_ind$4 = str_ind$0 + 1 | 0;
|
|
str_ind$0 = str_ind$4;
|
|
break;
|
|
case 16:
|
|
set_flag(str_ind$0, zero);
|
|
var str_ind$5 = str_ind$0 + 1 | 0;
|
|
str_ind$0 = str_ind$5;
|
|
break;
|
|
default: break a;
|
|
}
|
|
}
|
|
var
|
|
space$0 = space[1],
|
|
hash$0 = hash[1],
|
|
plus$0 = plus[1],
|
|
minus$0 = minus[1],
|
|
zero$0 = zero[1];
|
|
if(str_ind$0 === end_ind)
|
|
invalid_format_message(end_ind, cst_unexpected_end_of_format);
|
|
var
|
|
padty =
|
|
zero$0
|
|
? minus$0
|
|
? legacy_behavior$0
|
|
? 0
|
|
: incompatible_flag(pct_ind, str_ind$0, 45, cst_0)
|
|
: 2
|
|
: minus$0 ? 0 : 1,
|
|
match = caml_string_get(str, str_ind$0);
|
|
if(48 <= match){
|
|
if(58 > match){
|
|
var
|
|
match$0 = parse_positive(str_ind$0, end_ind, 0),
|
|
width = match$0[2],
|
|
new_ind = match$0[1];
|
|
return parse_after_padding
|
|
(pct_ind,
|
|
new_ind,
|
|
end_ind,
|
|
minus$0,
|
|
plus$0,
|
|
hash$0,
|
|
space$0,
|
|
ign,
|
|
[0, padty, width]);
|
|
}
|
|
}
|
|
else if(42 === match)
|
|
return parse_after_padding
|
|
(pct_ind,
|
|
str_ind$0 + 1 | 0,
|
|
end_ind,
|
|
minus$0,
|
|
plus$0,
|
|
hash$0,
|
|
space$0,
|
|
ign,
|
|
[1, padty]);
|
|
switch(padty){
|
|
case 0:
|
|
if(1 - legacy_behavior$0)
|
|
invalid_format_without(str_ind$0 - 1 | 0, 45, "padding");
|
|
return parse_after_padding
|
|
(pct_ind,
|
|
str_ind$0,
|
|
end_ind,
|
|
minus$0,
|
|
plus$0,
|
|
hash$0,
|
|
space$0,
|
|
ign,
|
|
0);
|
|
case 1:
|
|
return parse_after_padding
|
|
(pct_ind,
|
|
str_ind$0,
|
|
end_ind,
|
|
minus$0,
|
|
plus$0,
|
|
hash$0,
|
|
space$0,
|
|
ign,
|
|
0);
|
|
default:
|
|
return parse_after_padding
|
|
(pct_ind,
|
|
str_ind$0,
|
|
end_ind,
|
|
minus$0,
|
|
plus$0,
|
|
hash$0,
|
|
space$0,
|
|
ign,
|
|
D);
|
|
}
|
|
}
|
|
var cst_precision = "precision";
|
|
function parse_after_padding
|
|
(pct_ind, str_ind, end_ind, minus, plus, hash, space, ign, pad){
|
|
if(str_ind === end_ind)
|
|
invalid_format_message(end_ind, cst_unexpected_end_of_format);
|
|
var symb = caml_string_get(str, str_ind);
|
|
if(46 !== symb)
|
|
return parse_conversion
|
|
(pct_ind,
|
|
str_ind + 1 | 0,
|
|
end_ind,
|
|
plus,
|
|
hash,
|
|
space,
|
|
ign,
|
|
pad,
|
|
0,
|
|
pad,
|
|
symb);
|
|
var str_ind$0 = str_ind + 1 | 0;
|
|
if(str_ind$0 === end_ind)
|
|
invalid_format_message(end_ind, cst_unexpected_end_of_format);
|
|
function parse_literal(minus, str_ind){
|
|
var
|
|
match = parse_positive(str_ind, end_ind, 0),
|
|
prec = match[2],
|
|
new_ind = match[1];
|
|
return parse_after_precision
|
|
(pct_ind,
|
|
new_ind,
|
|
end_ind,
|
|
minus,
|
|
plus,
|
|
hash,
|
|
space,
|
|
ign,
|
|
pad,
|
|
[0, prec]);
|
|
}
|
|
var symb$0 = caml_string_get(str, str_ind$0);
|
|
if(48 <= symb$0){
|
|
if(58 > symb$0) return parse_literal(minus, str_ind$0);
|
|
}
|
|
else if(42 <= symb$0)
|
|
switch(symb$0 - 42 | 0){
|
|
case 0:
|
|
return parse_after_precision
|
|
(pct_ind,
|
|
str_ind$0 + 1 | 0,
|
|
end_ind,
|
|
minus,
|
|
plus,
|
|
hash,
|
|
space,
|
|
ign,
|
|
pad,
|
|
1);
|
|
case 1:
|
|
case 3:
|
|
if(legacy_behavior$0){
|
|
var
|
|
a = str_ind$0 + 1 | 0,
|
|
minus$0 = minus || (45 === symb$0 ? 1 : 0);
|
|
return parse_literal(minus$0, a);
|
|
}
|
|
break;
|
|
}
|
|
return legacy_behavior$0
|
|
? parse_after_precision
|
|
(pct_ind,
|
|
str_ind$0,
|
|
end_ind,
|
|
minus,
|
|
plus,
|
|
hash,
|
|
space,
|
|
ign,
|
|
pad,
|
|
E)
|
|
: invalid_format_without(str_ind$0 - 1 | 0, 46, cst_precision);
|
|
}
|
|
function parse_after_precision
|
|
(pct_ind, str_ind, end_ind, minus, plus, hash, space, ign, pad, prec){
|
|
if(str_ind === end_ind)
|
|
invalid_format_message(end_ind, cst_unexpected_end_of_format);
|
|
function parse_conv(padprec){
|
|
return parse_conversion
|
|
(pct_ind,
|
|
str_ind + 1 | 0,
|
|
end_ind,
|
|
plus,
|
|
hash,
|
|
space,
|
|
ign,
|
|
pad,
|
|
prec,
|
|
padprec,
|
|
caml_string_get(str, str_ind));
|
|
}
|
|
if(typeof pad !== "number") return parse_conv(pad);
|
|
if(typeof prec === "number" && ! prec) return parse_conv(0);
|
|
if(minus){
|
|
if(typeof prec === "number") return parse_conv(F);
|
|
var n = prec[1];
|
|
return parse_conv([0, 0, n]);
|
|
}
|
|
if(typeof prec === "number") return parse_conv(G);
|
|
var n$0 = prec[1];
|
|
return parse_conv([0, 1, n$0]);
|
|
}
|
|
var cst$1 = "' '", cst$0 = "'#'", cst = "'+'";
|
|
function parse_conversion
|
|
(pct_ind,
|
|
str_ind,
|
|
end_ind,
|
|
plus,
|
|
hash,
|
|
space,
|
|
ign,
|
|
pad,
|
|
prec,
|
|
padprec,
|
|
symb){
|
|
var plus_used = [0, 0];
|
|
function get_plus(param){plus_used[1] = 1; return plus;}
|
|
var hash_used = [0, 0];
|
|
function get_hash(param){hash_used[1] = 1; return hash;}
|
|
var space_used = [0, 0];
|
|
function get_space(param){space_used[1] = 1; return space;}
|
|
var ign_used = [0, 0];
|
|
function get_ign(param){ign_used[1] = 1; return ign;}
|
|
var pad_used = [0, 0];
|
|
function get_pad(param){pad_used[1] = 1; return pad;}
|
|
var prec_used = [0, 0];
|
|
function get_prec(param){prec_used[1] = 1; return prec;}
|
|
function get_padprec(param){pad_used[1] = 1; return padprec;}
|
|
function get_int_pad(param){
|
|
var pad = get_pad(0), match = get_prec(0);
|
|
if(typeof match === "number" && ! match) return pad;
|
|
if(typeof pad === "number") return 0;
|
|
if(0 !== pad[0])
|
|
return 2 <= pad[1]
|
|
? legacy_behavior$0
|
|
? H
|
|
: incompatible_flag(pct_ind, str_ind, 48, cst_precision)
|
|
: pad;
|
|
if(2 > pad[1]) return pad;
|
|
var n = pad[2];
|
|
return legacy_behavior$0
|
|
? [0, 1, n]
|
|
: incompatible_flag(pct_ind, str_ind, 48, cst_precision);
|
|
}
|
|
function check_no_0(symb, pad){
|
|
if(typeof pad === "number") return pad;
|
|
if(0 !== pad[0])
|
|
return 2 <= pad[1]
|
|
? legacy_behavior$0
|
|
? I
|
|
: incompatible_flag(pct_ind, str_ind, symb, cst_0)
|
|
: pad;
|
|
if(2 > pad[1]) return pad;
|
|
var width = pad[2];
|
|
return legacy_behavior$0
|
|
? [0, 1, width]
|
|
: incompatible_flag(pct_ind, str_ind, symb, cst_0);
|
|
}
|
|
var cst$2 = "'*'";
|
|
function opt_of_pad(c, pad){
|
|
if(typeof pad === "number") return 0;
|
|
if(0 === pad[0])
|
|
switch(pad[1]){
|
|
case 0:
|
|
var width = pad[2];
|
|
return legacy_behavior$0
|
|
? [0, width]
|
|
: incompatible_flag(pct_ind, str_ind, c, "'-'");
|
|
case 1:
|
|
var width$0 = pad[2]; return [0, width$0];
|
|
default:
|
|
var width$1 = pad[2];
|
|
return legacy_behavior$0
|
|
? [0, width$1]
|
|
: incompatible_flag(pct_ind, str_ind, c, "'0'");
|
|
}
|
|
return incompatible_flag(pct_ind, str_ind, c, cst$2);
|
|
}
|
|
function get_pad_opt(c){return opt_of_pad(c, get_pad(0));}
|
|
function get_padprec_opt(c){return opt_of_pad(c, get_padprec(0));}
|
|
a:
|
|
{
|
|
if(124 > symb)
|
|
switch(symb){
|
|
case 33:
|
|
var
|
|
fmt_rest$5 = parse(str_ind, end_ind)[1],
|
|
fmt_result = [0, [10, fmt_rest$5]];
|
|
break a;
|
|
case 40:
|
|
var
|
|
sub_end = search_subformat_end(str_ind, end_ind, 41),
|
|
fmt_rest$7 = parse(sub_end + 2 | 0, end_ind)[1],
|
|
sub_fmt = parse(str_ind, sub_end)[1],
|
|
sub_fmtty = fmtty_of_fmt(sub_fmt);
|
|
if(get_ign(0)){
|
|
var
|
|
ignored$2 = [9, get_pad_opt(95), sub_fmtty],
|
|
fmt_result = [0, [23, ignored$2, fmt_rest$7]];
|
|
break a;
|
|
}
|
|
var fmt_result = [0, [14, get_pad_opt(40), sub_fmtty, fmt_rest$7]];
|
|
break a;
|
|
case 44:
|
|
var fmt_result = parse(str_ind, end_ind); break a;
|
|
case 67:
|
|
var fmt_rest$10 = parse(str_ind, end_ind)[1];
|
|
if(get_ign(0)){var fmt_result = [0, [23, 1, fmt_rest$10]]; break a;}
|
|
var fmt_result = [0, [1, fmt_rest$10]];
|
|
break a;
|
|
case 78:
|
|
var fmt_rest$14 = parse(str_ind, end_ind)[1], counter$0 = 2;
|
|
if(get_ign(0)){
|
|
var fmt_result = [0, [23, [11, counter$0], fmt_rest$14]];
|
|
break a;
|
|
}
|
|
var fmt_result = [0, [21, counter$0, fmt_rest$14]];
|
|
break a;
|
|
case 83:
|
|
var
|
|
pad$6 = check_no_0(symb, get_padprec(0)),
|
|
fmt_rest$15 = parse(str_ind, end_ind)[1];
|
|
if(get_ign(0)){
|
|
var
|
|
ignored$6 = [1, get_padprec_opt(95)],
|
|
fmt_result = [0, [23, ignored$6, fmt_rest$15]];
|
|
break a;
|
|
}
|
|
var
|
|
match$5 = make_padding_fmt_ebb(pad$6, fmt_rest$15),
|
|
fmt_rest$16 = match$5[2],
|
|
pad$7 = match$5[1],
|
|
fmt_result = [0, [3, pad$7, fmt_rest$16]];
|
|
break a;
|
|
case 91:
|
|
var
|
|
match$7 = parse_char_set(str_ind, end_ind),
|
|
char_set = match$7[2],
|
|
next_ind = match$7[1],
|
|
fmt_rest$19 = parse(next_ind, end_ind)[1];
|
|
if(get_ign(0)){
|
|
var
|
|
ignored$8 = [10, get_pad_opt(95), char_set],
|
|
fmt_result = [0, [23, ignored$8, fmt_rest$19]];
|
|
break a;
|
|
}
|
|
var fmt_result = [0, [20, get_pad_opt(91), char_set, fmt_rest$19]];
|
|
break a;
|
|
case 97:
|
|
var
|
|
fmt_rest$20 = parse(str_ind, end_ind)[1],
|
|
fmt_result = [0, [15, fmt_rest$20]];
|
|
break a;
|
|
case 99:
|
|
var
|
|
char_format =
|
|
function(fmt_rest){
|
|
return get_ign(0) ? [0, [23, 0, fmt_rest]] : [0, [0, fmt_rest]];
|
|
},
|
|
fmt_rest$21 = parse(str_ind, end_ind)[1],
|
|
match$8 = get_pad_opt(99);
|
|
if(! match$8){var fmt_result = char_format(fmt_rest$21); break a;}
|
|
var n = match$8[1];
|
|
if(0 === n){
|
|
if(get_ign(0)){
|
|
var fmt_result = [0, [23, 3, fmt_rest$21]];
|
|
break a;
|
|
}
|
|
var fmt_result = [0, [22, fmt_rest$21]];
|
|
break a;
|
|
}
|
|
if(legacy_behavior$0){
|
|
var fmt_result = char_format(fmt_rest$21);
|
|
break a;
|
|
}
|
|
var
|
|
fmt_result =
|
|
invalid_format_message
|
|
(str_ind, "non-zero widths are unsupported for %c conversions");
|
|
break a;
|
|
case 114:
|
|
var fmt_rest$22 = parse(str_ind, end_ind)[1];
|
|
if(get_ign(0)){var fmt_result = [0, [23, 2, fmt_rest$22]]; break a;}
|
|
var fmt_result = [0, [19, fmt_rest$22]];
|
|
break a;
|
|
case 115:
|
|
var
|
|
pad$9 = check_no_0(symb, get_padprec(0)),
|
|
fmt_rest$23 = parse(str_ind, end_ind)[1];
|
|
if(get_ign(0)){
|
|
var
|
|
ignored$9 = [0, get_padprec_opt(95)],
|
|
fmt_result = [0, [23, ignored$9, fmt_rest$23]];
|
|
break a;
|
|
}
|
|
var
|
|
match$9 = make_padding_fmt_ebb(pad$9, fmt_rest$23),
|
|
fmt_rest$24 = match$9[2],
|
|
pad$10 = match$9[1],
|
|
fmt_result = [0, [2, pad$10, fmt_rest$24]];
|
|
break a;
|
|
case 116:
|
|
var
|
|
fmt_rest$25 = parse(str_ind, end_ind)[1],
|
|
fmt_result = [0, [16, fmt_rest$25]];
|
|
break a;
|
|
case 123:
|
|
var
|
|
sub_end$0 = search_subformat_end(str_ind, end_ind, 125),
|
|
sub_fmt$0 = parse(str_ind, sub_end$0)[1],
|
|
fmt_rest$26 = parse(sub_end$0 + 2 | 0, end_ind)[1],
|
|
sub_fmtty$0 = fmtty_of_fmt(sub_fmt$0);
|
|
if(get_ign(0)){
|
|
var
|
|
ignored$10 = [8, get_pad_opt(95), sub_fmtty$0],
|
|
fmt_result = [0, [23, ignored$10, fmt_rest$26]];
|
|
break a;
|
|
}
|
|
var
|
|
fmt_result = [0, [13, get_pad_opt(123), sub_fmtty$0, fmt_rest$26]];
|
|
break a;
|
|
case 66:
|
|
case 98:
|
|
var
|
|
pad$3 = check_no_0(symb, get_padprec(0)),
|
|
fmt_rest$8 = parse(str_ind, end_ind)[1];
|
|
if(get_ign(0)){
|
|
var
|
|
ignored$3 = [7, get_padprec_opt(95)],
|
|
fmt_result = [0, [23, ignored$3, fmt_rest$8]];
|
|
break a;
|
|
}
|
|
var
|
|
match$3 = make_padding_fmt_ebb(pad$3, fmt_rest$8),
|
|
fmt_rest$9 = match$3[2],
|
|
pad$4 = match$3[1],
|
|
fmt_result = [0, [9, pad$4, fmt_rest$9]];
|
|
break a;
|
|
case 37:
|
|
case 64:
|
|
var
|
|
fmt_rest$6 = parse(str_ind, end_ind)[1],
|
|
fmt_result = [0, [12, symb, fmt_rest$6]];
|
|
break a;
|
|
case 76:
|
|
case 108:
|
|
case 110:
|
|
if(str_ind !== end_ind){
|
|
var symb$0 = caml_string_get(str, str_ind), i = symb$0 - 88 | 0;
|
|
b:
|
|
{
|
|
if(32 >= i >>> 0)
|
|
switch(i){
|
|
case 0:
|
|
case 12:
|
|
case 17:
|
|
case 23:
|
|
case 29:
|
|
case 32:
|
|
var h = 1; break b;
|
|
}
|
|
var h = 0;
|
|
}
|
|
if(h) break;
|
|
}
|
|
var fmt_rest$13 = parse(str_ind, end_ind)[1];
|
|
b:
|
|
{
|
|
if(108 <= symb){
|
|
if(111 > symb)
|
|
switch(symb - 108 | 0){
|
|
case 0:
|
|
var counter = 0; break b;
|
|
case 2:
|
|
var counter = 1; break b;
|
|
}
|
|
}
|
|
else if(76 === symb){var counter = 2; break b;}
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, V], 1);
|
|
}
|
|
if(get_ign(0)){
|
|
var
|
|
ignored$5 = [11, counter],
|
|
fmt_result = [0, [23, ignored$5, fmt_rest$13]];
|
|
break a;
|
|
}
|
|
var fmt_result = [0, [21, counter, fmt_rest$13]];
|
|
break a;
|
|
case 32:
|
|
case 35:
|
|
case 43:
|
|
case 45:
|
|
case 95:
|
|
var
|
|
fmt_result = caml_call3(failwith_message(M), str, pct_ind, symb);
|
|
break a;
|
|
case 88:
|
|
case 100:
|
|
case 105:
|
|
case 111:
|
|
case 117:
|
|
case 120:
|
|
var
|
|
A = get_space(0),
|
|
B = get_hash(0),
|
|
iconv$2 =
|
|
compute_int_conv(pct_ind, str_ind, get_plus(0), B, A, symb),
|
|
fmt_rest$17 = parse(str_ind, end_ind)[1];
|
|
if(get_ign(0)){
|
|
var
|
|
ignored$7 = [2, iconv$2, get_pad_opt(95)],
|
|
fmt_result = [0, [23, ignored$7, fmt_rest$17]];
|
|
break a;
|
|
}
|
|
var
|
|
C = get_prec(0),
|
|
match$6 = make_padprec_fmt_ebb(get_int_pad(0), C, fmt_rest$17),
|
|
fmt_rest$18 = match$6[3],
|
|
prec$4 = match$6[2],
|
|
pad$8 = match$6[1],
|
|
fmt_result = [0, [4, iconv$2, pad$8, prec$4, fmt_rest$18]];
|
|
break a;
|
|
case 69:
|
|
case 70:
|
|
case 71:
|
|
case 72:
|
|
case 101:
|
|
case 102:
|
|
case 103:
|
|
case 104:
|
|
var
|
|
space$1 = get_space(0),
|
|
hash$1 = get_hash(0),
|
|
plus$2 = get_plus(0),
|
|
flag =
|
|
plus$2
|
|
? space$1
|
|
? legacy_behavior$0
|
|
? 1
|
|
: incompatible_flag(pct_ind, str_ind, 32, cst)
|
|
: 1
|
|
: space$1 ? 2 : 0;
|
|
b:
|
|
{
|
|
if(73 <= symb){
|
|
var switcher = symb - 101 | 0;
|
|
if(3 >= switcher >>> 0)
|
|
switch(switcher){
|
|
case 0:
|
|
var kind = 1; break b;
|
|
case 1:
|
|
var kind = 0; break b;
|
|
case 2:
|
|
var kind = 3; break b;
|
|
default: var kind = 6; break b;
|
|
}
|
|
}
|
|
else if(69 <= symb)
|
|
switch(symb - 69 | 0){
|
|
case 0:
|
|
var kind = 2; break b;
|
|
case 2:
|
|
var kind = 4; break b;
|
|
case 3:
|
|
var kind = 7; break b;
|
|
}
|
|
if(hash$1){
|
|
if(70 === symb){var kind = 8; break b;}
|
|
}
|
|
else if(70 === symb){var kind = 5; break b;}
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, X], 1);
|
|
}
|
|
var
|
|
fconv = [0, flag, kind],
|
|
fmt_rest$11 = parse(str_ind, end_ind)[1];
|
|
if(! get_ign(0)){
|
|
var
|
|
z = get_prec(0),
|
|
match$4 = make_padprec_fmt_ebb(get_pad(0), z, fmt_rest$11),
|
|
fmt_rest$12 = match$4[3],
|
|
prec$3 = match$4[2],
|
|
pad$5 = match$4[1],
|
|
fmt_result = [0, [8, fconv, pad$5, prec$3, fmt_rest$12]];
|
|
break a;
|
|
}
|
|
var match = get_prec(0);
|
|
if(typeof match === "number")
|
|
var g = match ? incompatible_flag(pct_ind, str_ind, 95, cst$2) : 0;
|
|
else
|
|
var ndec = match[1], g = [0, ndec];
|
|
var
|
|
ignored$4 = [6, get_pad_opt(95), g],
|
|
fmt_result = [0, [23, ignored$4, fmt_rest$11]];
|
|
break a;
|
|
}
|
|
if(108 <= symb){
|
|
if(111 > symb)
|
|
switch(symb - 108 | 0){
|
|
case 0:
|
|
var
|
|
m = caml_string_get(str, str_ind),
|
|
o = get_space(0),
|
|
p = get_hash(0),
|
|
iconv =
|
|
compute_int_conv(pct_ind, str_ind + 1 | 0, get_plus(0), p, o, m),
|
|
fmt_rest = parse(str_ind + 1 | 0, end_ind)[1];
|
|
if(get_ign(0)){
|
|
var
|
|
ignored = [3, iconv, get_pad_opt(95)],
|
|
fmt_result = [0, [23, ignored, fmt_rest]];
|
|
break a;
|
|
}
|
|
var
|
|
q = get_prec(0),
|
|
match$0 = make_padprec_fmt_ebb(get_int_pad(0), q, fmt_rest),
|
|
fmt_rest$0 = match$0[3],
|
|
prec$0 = match$0[2],
|
|
pad$0 = match$0[1],
|
|
fmt_result = [0, [5, iconv, pad$0, prec$0, fmt_rest$0]];
|
|
break a;
|
|
case 2:
|
|
var
|
|
r = caml_string_get(str, str_ind),
|
|
s = get_space(0),
|
|
t = get_hash(0),
|
|
iconv$0 =
|
|
compute_int_conv(pct_ind, str_ind + 1 | 0, get_plus(0), t, s, r),
|
|
fmt_rest$1 = parse(str_ind + 1 | 0, end_ind)[1];
|
|
if(get_ign(0)){
|
|
var
|
|
ignored$0 = [4, iconv$0, get_pad_opt(95)],
|
|
fmt_result = [0, [23, ignored$0, fmt_rest$1]];
|
|
break a;
|
|
}
|
|
var
|
|
u = get_prec(0),
|
|
match$1 = make_padprec_fmt_ebb(get_int_pad(0), u, fmt_rest$1),
|
|
fmt_rest$2 = match$1[3],
|
|
prec$1 = match$1[2],
|
|
pad$1 = match$1[1],
|
|
fmt_result = [0, [6, iconv$0, pad$1, prec$1, fmt_rest$2]];
|
|
break a;
|
|
}
|
|
}
|
|
else if(76 === symb){
|
|
var
|
|
v = caml_string_get(str, str_ind),
|
|
w = get_space(0),
|
|
x = get_hash(0),
|
|
iconv$1 =
|
|
compute_int_conv(pct_ind, str_ind + 1 | 0, get_plus(0), x, w, v),
|
|
fmt_rest$3 = parse(str_ind + 1 | 0, end_ind)[1];
|
|
if(get_ign(0)){
|
|
var
|
|
ignored$1 = [5, iconv$1, get_pad_opt(95)],
|
|
fmt_result = [0, [23, ignored$1, fmt_rest$3]];
|
|
break a;
|
|
}
|
|
var
|
|
y = get_prec(0),
|
|
match$2 = make_padprec_fmt_ebb(get_int_pad(0), y, fmt_rest$3),
|
|
fmt_rest$4 = match$2[3],
|
|
prec$2 = match$2[2],
|
|
pad$2 = match$2[1],
|
|
fmt_result = [0, [7, iconv$1, pad$2, prec$2, fmt_rest$4]];
|
|
break a;
|
|
}
|
|
var
|
|
fmt_result =
|
|
caml_call3(failwith_message(J), str, str_ind - 1 | 0, symb);
|
|
}
|
|
if(1 - legacy_behavior$0){
|
|
var a = 1 - plus_used[1], plus$0 = a ? plus : a;
|
|
if(plus$0) incompatible_flag(pct_ind, str_ind, symb, cst);
|
|
var b = 1 - hash_used[1], hash$0 = b ? hash : b;
|
|
if(hash$0) incompatible_flag(pct_ind, str_ind, symb, cst$0);
|
|
var c = 1 - space_used[1], space$0 = c ? space : c;
|
|
if(space$0) incompatible_flag(pct_ind, str_ind, symb, cst$1);
|
|
var d = 1 - pad_used[1], j = d ? caml_notequal([0, pad], K) : d;
|
|
if(j) incompatible_flag(pct_ind, str_ind, symb, "`padding'");
|
|
var e = 1 - prec_used[1], k = e ? caml_notequal([0, prec], L) : e;
|
|
if(k){
|
|
var l = ign ? 95 : symb;
|
|
incompatible_flag(pct_ind, str_ind, l, "`precision'");
|
|
}
|
|
var plus$1 = ign ? plus : ign;
|
|
if(plus$1) incompatible_flag(pct_ind, str_ind, 95, cst);
|
|
}
|
|
var f = 1 - ign_used[1], ign$0 = f ? ign : f;
|
|
a:
|
|
if(ign$0){
|
|
b:
|
|
{
|
|
if(38 <= symb){
|
|
if(44 !== symb && 64 !== symb) break b;
|
|
}
|
|
else if(33 !== symb && 37 > symb) break b;
|
|
if(legacy_behavior$0) break a;
|
|
}
|
|
incompatible_flag(pct_ind, str_ind, symb, "'_'");
|
|
}
|
|
return fmt_result;
|
|
}
|
|
function parse_after_at(str_ind, end_ind){
|
|
if(str_ind === end_ind) return N;
|
|
var c = caml_string_get(str, str_ind);
|
|
if(65 <= c){
|
|
if(94 <= c){
|
|
var switcher = c - 123 | 0;
|
|
if(2 >= switcher >>> 0)
|
|
switch(switcher){
|
|
case 0:
|
|
return parse_tag(1, str_ind + 1 | 0, end_ind);
|
|
case 2:
|
|
var fmt_rest$0 = parse(str_ind + 1 | 0, end_ind)[1];
|
|
return [0, [17, 1, fmt_rest$0]];
|
|
}
|
|
}
|
|
else if(91 <= c)
|
|
switch(c - 91 | 0){
|
|
case 0:
|
|
return parse_tag(0, str_ind + 1 | 0, end_ind);
|
|
case 2:
|
|
var fmt_rest$1 = parse(str_ind + 1 | 0, end_ind)[1];
|
|
return [0, [17, 0, fmt_rest$1]];
|
|
}
|
|
}
|
|
else{
|
|
if(10 === c){
|
|
var fmt_rest$2 = parse(str_ind + 1 | 0, end_ind)[1];
|
|
return [0, [17, 3, fmt_rest$2]];
|
|
}
|
|
if(32 <= c)
|
|
switch(c - 32 | 0){
|
|
case 0:
|
|
var fmt_rest$3 = parse(str_ind + 1 | 0, end_ind)[1];
|
|
return [0, [17, O, fmt_rest$3]];
|
|
case 5:
|
|
if
|
|
((str_ind + 1 | 0) < end_ind
|
|
&& 37 === caml_string_get(str, str_ind + 1 | 0)){
|
|
var fmt_rest$4 = parse(str_ind + 2 | 0, end_ind)[1];
|
|
return [0, [17, 6, fmt_rest$4]];
|
|
}
|
|
var fmt_rest$5 = parse(str_ind, end_ind)[1];
|
|
return [0, [12, 64, fmt_rest$5]];
|
|
case 12:
|
|
var fmt_rest$6 = parse(str_ind + 1 | 0, end_ind)[1];
|
|
return [0, [17, P, fmt_rest$6]];
|
|
case 14:
|
|
var fmt_rest$7 = parse(str_ind + 1 | 0, end_ind)[1];
|
|
return [0, [17, 4, fmt_rest$7]];
|
|
case 27:
|
|
var str_ind$0 = str_ind + 1 | 0;
|
|
a:
|
|
try{
|
|
var
|
|
b = str_ind$0 === end_ind,
|
|
d = b || 60 !== caml_string_get(str, str_ind$0);
|
|
if(d) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
var
|
|
str_ind_1 = parse_spaces(str_ind$0 + 1 | 0, end_ind),
|
|
match = caml_string_get(str, str_ind_1);
|
|
b:
|
|
{
|
|
if(48 <= match){
|
|
if(58 <= match) break b;
|
|
}
|
|
else if(45 !== match) break b;
|
|
var
|
|
match$0 = parse_integer(str_ind_1, end_ind),
|
|
width = match$0[2],
|
|
str_ind_2 = match$0[1],
|
|
str_ind_3 = parse_spaces(str_ind_2, end_ind),
|
|
switcher$0 = caml_string_get(str, str_ind_3) - 45 | 0;
|
|
if(12 < switcher$0 >>> 0){
|
|
if(17 === switcher$0){
|
|
var
|
|
s =
|
|
Stdlib_String[16].call
|
|
(null,
|
|
str,
|
|
str_ind$0 - 2 | 0,
|
|
(str_ind_3 - str_ind$0 | 0) + 3 | 0),
|
|
e = str_ind_3 + 1 | 0,
|
|
formatting_lit$0 = [0, s, width, 0],
|
|
next_ind = e;
|
|
break a;
|
|
}
|
|
}
|
|
else if(1 < switcher$0 - 1 >>> 0){
|
|
var
|
|
match$1 = parse_integer(str_ind_3, end_ind),
|
|
offset = match$1[2],
|
|
str_ind_4 = match$1[1],
|
|
str_ind_5 = parse_spaces(str_ind_4, end_ind);
|
|
if(62 !== caml_string_get(str, str_ind_5))
|
|
throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
var
|
|
s$0 =
|
|
Stdlib_String[16].call
|
|
(null,
|
|
str,
|
|
str_ind$0 - 2 | 0,
|
|
(str_ind_5 - str_ind$0 | 0) + 3 | 0),
|
|
f = str_ind_5 + 1 | 0,
|
|
formatting_lit$0 = [0, s$0, width, offset],
|
|
next_ind = f;
|
|
break a;
|
|
}
|
|
throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
}
|
|
throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn === Stdlib[8])
|
|
var formatting_lit$0 = formatting_lit, next_ind = str_ind$0;
|
|
else{
|
|
if(exn[1] !== Stdlib[7])
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
var formatting_lit$0 = formatting_lit, next_ind = str_ind$0;
|
|
}
|
|
}
|
|
var fmt_rest$10 = parse(next_ind, end_ind)[1];
|
|
return [0, [17, formatting_lit$0, fmt_rest$10]];
|
|
case 28:
|
|
var str_ind$1 = str_ind + 1 | 0;
|
|
try{
|
|
var
|
|
str_ind_1$0 = parse_spaces(str_ind$1, end_ind),
|
|
match$4 = caml_string_get(str, str_ind_1$0);
|
|
a:
|
|
{
|
|
b:
|
|
{
|
|
if(48 <= match$4){
|
|
if(58 <= match$4) break b;
|
|
}
|
|
else if(45 !== match$4) break b;
|
|
var
|
|
match$5 = parse_integer(str_ind_1$0, end_ind),
|
|
size = match$5[2],
|
|
str_ind_2$0 = match$5[1],
|
|
str_ind_3$0 = parse_spaces(str_ind_2$0, end_ind);
|
|
if(62 !== caml_string_get(str, str_ind_3$0))
|
|
throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
var
|
|
s$1 =
|
|
Stdlib_String[16].call
|
|
(null,
|
|
str,
|
|
str_ind$1 - 2 | 0,
|
|
(str_ind_3$0 - str_ind$1 | 0) + 3 | 0),
|
|
a = [0, [0, str_ind_3$0 + 1 | 0, [1, s$1, size]]];
|
|
break a;
|
|
}
|
|
var a = 0;
|
|
}
|
|
var match$2 = a;
|
|
}
|
|
catch(exn){
|
|
var exn$0 = caml_wrap_exception(exn);
|
|
if(exn$0 !== Stdlib[8] && exn$0[1] !== Stdlib[7])
|
|
throw caml_maybe_attach_backtrace(exn$0, 0);
|
|
var match$2 = 0;
|
|
}
|
|
if(match$2){
|
|
var
|
|
match$3 = match$2[1],
|
|
formatting_lit$1 = match$3[2],
|
|
next_ind$0 = match$3[1],
|
|
fmt_rest$11 = parse(next_ind$0, end_ind)[1];
|
|
return [0, [17, formatting_lit$1, fmt_rest$11]];
|
|
}
|
|
var fmt_rest$12 = parse(str_ind$1, end_ind)[1];
|
|
return [0, [17, Q, fmt_rest$12]];
|
|
case 31:
|
|
var fmt_rest$8 = parse(str_ind + 1 | 0, end_ind)[1];
|
|
return [0, [17, 2, fmt_rest$8]];
|
|
case 32:
|
|
var fmt_rest$9 = parse(str_ind + 1 | 0, end_ind)[1];
|
|
return [0, [17, 5, fmt_rest$9]];
|
|
}
|
|
}
|
|
var fmt_rest = parse(str_ind + 1 | 0, end_ind)[1];
|
|
return [0, [17, [2, c], fmt_rest]];
|
|
}
|
|
function parse_tag(is_open_tag, str_ind, end_ind){
|
|
try{
|
|
if(str_ind === end_ind) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
if(60 !== caml_string_get(str, str_ind))
|
|
throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
var ind = Stdlib_String[32].call(null, str, str_ind + 1 | 0, 62);
|
|
if(end_ind <= ind) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
var
|
|
sub_str =
|
|
Stdlib_String[16].call
|
|
(null, str, str_ind, (ind - str_ind | 0) + 1 | 0),
|
|
fmt_rest$0 = parse(ind + 1 | 0, end_ind)[1],
|
|
sub_fmt = parse(str_ind, ind + 1 | 0)[1],
|
|
sub_format$0 = [0, sub_fmt, sub_str],
|
|
formatting$0 = is_open_tag ? [0, sub_format$0] : [1, sub_format$0];
|
|
return [0, [18, formatting$0, fmt_rest$0]];
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn !== Stdlib[8]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var
|
|
fmt_rest = parse(str_ind, end_ind)[1],
|
|
formatting = is_open_tag ? [0, sub_format] : [1, sub_format];
|
|
return [0, [18, formatting, fmt_rest]];
|
|
}
|
|
}
|
|
function parse_char_set(str_ind, end_ind){
|
|
if(str_ind === end_ind)
|
|
invalid_format_message(end_ind, cst_unexpected_end_of_format);
|
|
var char_set = create_char_set(0);
|
|
function add_range(c$0, c){
|
|
if(c >= c$0){
|
|
var i = c$0;
|
|
for(;;){
|
|
add_in_char_set(char_set, Stdlib[29].call(null, i));
|
|
var a = i + 1 | 0;
|
|
if(c === i) break;
|
|
i = a;
|
|
}
|
|
}
|
|
}
|
|
function fail_single_percent(str_ind){
|
|
return caml_call2(failwith_message(R), str, str_ind);
|
|
}
|
|
function parse_char_set_content(counter, str_ind$1, end_ind){
|
|
var str_ind = str_ind$1;
|
|
for(;;){
|
|
if(str_ind === end_ind)
|
|
invalid_format_message(end_ind, cst_unexpected_end_of_format);
|
|
var c = caml_string_get(str, str_ind);
|
|
if(45 !== c){
|
|
if(93 === c) return str_ind + 1 | 0;
|
|
var a = str_ind + 1 | 0;
|
|
return counter < 50
|
|
? parse_char_set_after_char$0(counter + 1 | 0, a, end_ind, c)
|
|
: caml_trampoline_return
|
|
(parse_char_set_after_char$0, [0, a, end_ind, c]);
|
|
}
|
|
add_in_char_set(char_set, 45);
|
|
var str_ind$0 = str_ind + 1 | 0;
|
|
str_ind = str_ind$0;
|
|
}
|
|
}
|
|
function parse_char_set_after_char$0(counter, str_ind$2, end_ind, c$3){
|
|
var str_ind = str_ind$2, c = c$3;
|
|
for(;;){
|
|
if(str_ind === end_ind)
|
|
invalid_format_message(end_ind, cst_unexpected_end_of_format);
|
|
var c$0 = caml_string_get(str, str_ind);
|
|
a:
|
|
{
|
|
if(46 <= c$0){
|
|
if(64 !== c$0){
|
|
if(93 !== c$0) break a;
|
|
add_in_char_set(char_set, c);
|
|
return str_ind + 1 | 0;
|
|
}
|
|
}
|
|
else if(37 !== c$0){if(45 <= c$0) break; break a;}
|
|
if(37 === c){
|
|
add_in_char_set(char_set, c$0);
|
|
var a = str_ind + 1 | 0;
|
|
return counter < 50
|
|
? parse_char_set_content(counter + 1 | 0, a, end_ind)
|
|
: caml_trampoline_return
|
|
(parse_char_set_content, [0, a, end_ind]);
|
|
}
|
|
}
|
|
if(37 === c) fail_single_percent(str_ind);
|
|
add_in_char_set(char_set, c);
|
|
var str_ind$0 = str_ind + 1 | 0;
|
|
str_ind = str_ind$0;
|
|
c = c$0;
|
|
}
|
|
var str_ind$1 = str_ind + 1 | 0;
|
|
if(str_ind$1 === end_ind)
|
|
invalid_format_message(end_ind, cst_unexpected_end_of_format);
|
|
var c$1 = caml_string_get(str, str_ind$1);
|
|
if(37 === c$1){
|
|
if((str_ind$1 + 1 | 0) === end_ind)
|
|
invalid_format_message(end_ind, cst_unexpected_end_of_format);
|
|
var c$2 = caml_string_get(str, str_ind$1 + 1 | 0);
|
|
if(37 !== c$2 && 64 !== c$2) return fail_single_percent(str_ind$1);
|
|
add_range(c, c$2);
|
|
var b = str_ind$1 + 2 | 0;
|
|
return counter < 50
|
|
? parse_char_set_content(counter + 1 | 0, b, end_ind)
|
|
: caml_trampoline_return
|
|
(parse_char_set_content, [0, b, end_ind]);
|
|
}
|
|
if(93 === c$1){
|
|
add_in_char_set(char_set, c);
|
|
add_in_char_set(char_set, 45);
|
|
return str_ind$1 + 1 | 0;
|
|
}
|
|
add_range(c, c$1);
|
|
var d = str_ind$1 + 1 | 0;
|
|
return counter < 50
|
|
? parse_char_set_content(counter + 1 | 0, d, end_ind)
|
|
: caml_trampoline_return
|
|
(parse_char_set_content, [0, d, end_ind]);
|
|
}
|
|
function parse_char_set_after_char(str_ind, end_ind, c){
|
|
return caml_trampoline
|
|
(parse_char_set_after_char$0(0, str_ind, end_ind, c));
|
|
}
|
|
if(str_ind === end_ind)
|
|
invalid_format_message(end_ind, cst_unexpected_end_of_format);
|
|
if(94 === caml_string_get(str, str_ind))
|
|
var str_ind$0 = str_ind + 1 | 0, reverse = 1, str_ind$1 = str_ind$0;
|
|
else
|
|
var reverse = 0, str_ind$1 = str_ind;
|
|
if(str_ind$1 === end_ind)
|
|
invalid_format_message(end_ind, cst_unexpected_end_of_format);
|
|
var
|
|
c = caml_string_get(str, str_ind$1),
|
|
next_ind = parse_char_set_after_char(str_ind$1 + 1 | 0, end_ind, c),
|
|
char_set$0 = freeze_char_set(char_set),
|
|
a = reverse ? rev_char_set(char_set$0) : char_set$0;
|
|
return [0, next_ind, a];
|
|
}
|
|
function parse_spaces(str_ind$1, end_ind){
|
|
var str_ind = str_ind$1;
|
|
for(;;){
|
|
if(str_ind === end_ind)
|
|
invalid_format_message(end_ind, cst_unexpected_end_of_format);
|
|
if(32 !== caml_string_get(str, str_ind)) return str_ind;
|
|
var str_ind$0 = str_ind + 1 | 0;
|
|
str_ind = str_ind$0;
|
|
}
|
|
}
|
|
function parse_positive(str_ind$1, end_ind, acc$0){
|
|
var str_ind = str_ind$1, acc = acc$0;
|
|
for(;;){
|
|
if(str_ind === end_ind)
|
|
invalid_format_message(end_ind, cst_unexpected_end_of_format);
|
|
var c = caml_string_get(str, str_ind);
|
|
if(9 < c - 48 >>> 0) return [0, str_ind, acc];
|
|
var new_acc = (acc * 10 | 0) + (c - 48 | 0) | 0;
|
|
if(Stdlib_Sys[12] < new_acc){
|
|
var a = Stdlib_Sys[12];
|
|
return caml_call3(failwith_message(S), str, new_acc, a);
|
|
}
|
|
var str_ind$0 = str_ind + 1 | 0;
|
|
str_ind = str_ind$0;
|
|
acc = new_acc;
|
|
}
|
|
}
|
|
function parse_integer(str_ind, end_ind){
|
|
if(str_ind === end_ind)
|
|
invalid_format_message(end_ind, cst_unexpected_end_of_format);
|
|
var match = caml_string_get(str, str_ind);
|
|
if(48 <= match){
|
|
if(58 > match) return parse_positive(str_ind, end_ind, 0);
|
|
}
|
|
else if(45 === match){
|
|
if((str_ind + 1 | 0) === end_ind)
|
|
invalid_format_message(end_ind, cst_unexpected_end_of_format);
|
|
var c = caml_string_get(str, str_ind + 1 | 0);
|
|
if(9 < c - 48 >>> 0)
|
|
return expected_character(str_ind + 1 | 0, "digit", c);
|
|
var
|
|
match$0 = parse_positive(str_ind + 1 | 0, end_ind, 0),
|
|
n = match$0[2],
|
|
next_ind = match$0[1];
|
|
return [0, next_ind, - n | 0];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, T], 1);
|
|
}
|
|
function add_literal(lit_start, str_ind, fmt){
|
|
var size = str_ind - lit_start | 0;
|
|
return 0 === size
|
|
? [0, fmt]
|
|
: 1
|
|
=== size
|
|
? [0, [12, caml_string_get(str, lit_start), fmt]]
|
|
: [0,
|
|
[11, Stdlib_String[16].call(null, str, lit_start, size), fmt]];
|
|
}
|
|
function search_subformat_end(str_ind$7, end_ind, c){
|
|
var str_ind = str_ind$7;
|
|
for(;;){
|
|
if(str_ind === end_ind)
|
|
caml_call3(failwith_message(U), str, c, end_ind);
|
|
if(37 === caml_string_get(str, str_ind)){
|
|
if((str_ind + 1 | 0) === end_ind)
|
|
invalid_format_message(end_ind, cst_unexpected_end_of_format);
|
|
if(caml_string_get(str, str_ind + 1 | 0) === c) return str_ind;
|
|
var match = caml_string_get(str, str_ind + 1 | 0);
|
|
if(95 <= match){
|
|
if(123 <= match){
|
|
if(126 > match)
|
|
switch(match - 123 | 0){
|
|
case 0:
|
|
var
|
|
sub_end = search_subformat_end(str_ind + 2 | 0, end_ind, 125),
|
|
str_ind$1 = sub_end + 2 | 0;
|
|
str_ind = str_ind$1;
|
|
continue;
|
|
case 2:
|
|
return expected_character(str_ind + 1 | 0, "character ')'", 125);
|
|
}
|
|
}
|
|
else if(96 > match){
|
|
if((str_ind + 2 | 0) === end_ind)
|
|
invalid_format_message(end_ind, cst_unexpected_end_of_format);
|
|
var match$0 = caml_string_get(str, str_ind + 2 | 0);
|
|
if(40 === match$0){
|
|
var
|
|
sub_end$0 = search_subformat_end(str_ind + 3 | 0, end_ind, 41),
|
|
str_ind$2 = sub_end$0 + 2 | 0;
|
|
str_ind = str_ind$2;
|
|
continue;
|
|
}
|
|
if(123 === match$0){
|
|
var
|
|
sub_end$1 = search_subformat_end(str_ind + 3 | 0, end_ind, 125),
|
|
str_ind$3 = sub_end$1 + 2 | 0;
|
|
str_ind = str_ind$3;
|
|
continue;
|
|
}
|
|
var str_ind$4 = str_ind + 3 | 0;
|
|
str_ind = str_ind$4;
|
|
continue;
|
|
}
|
|
}
|
|
else{
|
|
if(40 === match){
|
|
var
|
|
sub_end$2 = search_subformat_end(str_ind + 2 | 0, end_ind, 41),
|
|
str_ind$5 = sub_end$2 + 2 | 0;
|
|
str_ind = str_ind$5;
|
|
continue;
|
|
}
|
|
if(41 === match)
|
|
return expected_character(str_ind + 1 | 0, "character '}'", 41);
|
|
}
|
|
var str_ind$0 = str_ind + 2 | 0;
|
|
str_ind = str_ind$0;
|
|
}
|
|
else{var str_ind$6 = str_ind + 1 | 0; str_ind = str_ind$6;}
|
|
}
|
|
}
|
|
function compute_int_conv(pct_ind, str_ind, plus$0, hash$0, space$0, symb){
|
|
var plus = plus$0, hash = hash$0, space = space$0;
|
|
for(;;){
|
|
a:
|
|
{
|
|
if(plus){
|
|
if(! hash){
|
|
if(space) break a;
|
|
if(100 === symb) return 1;
|
|
if(105 === symb) return 4;
|
|
break a;
|
|
}
|
|
}
|
|
else{
|
|
if(! hash){
|
|
if(space){
|
|
if(100 === symb) return 2;
|
|
if(105 === symb) return 5;
|
|
break a;
|
|
}
|
|
var switcher$1 = symb - 88 | 0;
|
|
if(32 < switcher$1 >>> 0) break a;
|
|
switch(switcher$1){
|
|
case 0:
|
|
return 8;
|
|
case 12:
|
|
return 0;
|
|
case 17:
|
|
return 3;
|
|
case 23:
|
|
return 10;
|
|
case 29:
|
|
return 12;
|
|
case 32:
|
|
return 6;
|
|
default: break a;
|
|
}
|
|
}
|
|
if(! space){
|
|
var switcher$0 = symb - 88 | 0;
|
|
if(32 >= switcher$0 >>> 0)
|
|
switch(switcher$0){
|
|
case 0:
|
|
return 9;
|
|
case 12:
|
|
return 13;
|
|
case 17:
|
|
return 14;
|
|
case 23:
|
|
return 11;
|
|
case 29:
|
|
return 15;
|
|
case 32:
|
|
return 7;
|
|
}
|
|
}
|
|
}
|
|
var switcher = symb - 88 | 0;
|
|
if(32 >= switcher >>> 0)
|
|
switch(switcher){
|
|
case 0:
|
|
if(legacy_behavior$0) return 9; break;
|
|
case 23:
|
|
if(legacy_behavior$0) return 11; break;
|
|
case 32:
|
|
if(legacy_behavior$0) return 7; break;
|
|
case 12:
|
|
case 17:
|
|
case 29:
|
|
if(! legacy_behavior$0)
|
|
return incompatible_flag(pct_ind, str_ind, symb, cst$0);
|
|
hash = 0;
|
|
continue;
|
|
}
|
|
}
|
|
if(plus)
|
|
if(space){
|
|
if(! legacy_behavior$0)
|
|
return incompatible_flag(pct_ind, str_ind, 32, cst);
|
|
space = 0;
|
|
}
|
|
else{
|
|
if(! legacy_behavior$0)
|
|
return incompatible_flag(pct_ind, str_ind, symb, cst);
|
|
plus = 0;
|
|
}
|
|
else{
|
|
if(! space)
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, W], 1);
|
|
if(! legacy_behavior$0)
|
|
return incompatible_flag(pct_ind, str_ind, symb, cst$1);
|
|
space = 0;
|
|
}
|
|
}
|
|
}
|
|
function incompatible_flag(pct_ind, str_ind, symb, option){
|
|
var
|
|
subfmt =
|
|
Stdlib_String[16].call(null, str, pct_ind, str_ind - pct_ind | 0);
|
|
return caml_call5
|
|
(failwith_message(Y), str, pct_ind, option, symb, subfmt);
|
|
}
|
|
return parse(0, caml_ml_string_length(str));
|
|
}
|
|
var
|
|
cst_and = " and ",
|
|
cst_bad_input_format_type_mism =
|
|
"bad input: format type mismatch between ",
|
|
cst_bad_input_format_type_mism$0 =
|
|
"bad input: format type mismatch between %S and %S",
|
|
Z =
|
|
[0,
|
|
[11, cst_bad_input_format_type_mism, [3, 0, [11, cst_and, [3, 0, 0]]]],
|
|
cst_bad_input_format_type_mism$0];
|
|
function format_of_string_fmtty(str, fmtty){
|
|
var fmt = fmt_ebb_of_string(0, str)[1];
|
|
try{var b = [0, type_format(fmt, fmtty), str]; return b;}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn !== Type_mismatch) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var a = string_of_fmtty(fmtty);
|
|
return caml_call2(failwith_message(Z), str, a);
|
|
}
|
|
}
|
|
var
|
|
_ =
|
|
[0,
|
|
[11, cst_bad_input_format_type_mism, [3, 0, [11, cst_and, [3, 0, 0]]]],
|
|
cst_bad_input_format_type_mism$0];
|
|
function format_of_string_format(str, param){
|
|
var
|
|
str$0 = param[2],
|
|
fmt = param[1],
|
|
fmt$0 = fmt_ebb_of_string(0, str)[1];
|
|
try{var a = [0, type_format(fmt$0, fmtty_of_fmt(fmt)), str]; return a;}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn === Type_mismatch)
|
|
return caml_call2(failwith_message(_), str, str$0);
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
}
|
|
runtime.caml_register_global
|
|
(197,
|
|
[0,
|
|
is_in_char_set,
|
|
rev_char_set,
|
|
create_char_set,
|
|
add_in_char_set,
|
|
freeze_char_set,
|
|
param_format_of_ignored_format,
|
|
make_printf,
|
|
make_iprintf,
|
|
output_acc,
|
|
bufput_acc,
|
|
strput_acc,
|
|
type_format,
|
|
fmt_ebb_of_string,
|
|
format_of_string_fmtty,
|
|
format_of_string_format,
|
|
char_of_iconv,
|
|
string_of_formatting_lit,
|
|
string_of_fmtty,
|
|
string_of_fmt,
|
|
open_box_of_string,
|
|
symm,
|
|
trans,
|
|
recast],
|
|
"CamlinternalFormat");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 15317 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Printf:[F(2),F(1),F(1),F(1),F(2),F(2),F(2),F(3),F(3),F(2),F(3),F(3),F(2)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var runtime = globalThis.jsoo_runtime;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib_Buffer = global_data.Stdlib__Buffer,
|
|
CamlinternalFormat = global_data.CamlinternalFormat,
|
|
Stdlib = global_data.Stdlib;
|
|
function kfprintf(k, o, param){
|
|
var fmt = param[1];
|
|
return CamlinternalFormat[7].call
|
|
(null,
|
|
function(acc){
|
|
CamlinternalFormat[9].call(null, o, acc);
|
|
return caml_call1(k, o);
|
|
},
|
|
0,
|
|
fmt);
|
|
}
|
|
function kbprintf(k, b, param){
|
|
var fmt = param[1];
|
|
return CamlinternalFormat[7].call
|
|
(null,
|
|
function(acc){
|
|
CamlinternalFormat[10].call(null, b, acc);
|
|
return caml_call1(k, b);
|
|
},
|
|
0,
|
|
fmt);
|
|
}
|
|
function ikfprintf(k, oc, param){
|
|
var fmt = param[1];
|
|
return CamlinternalFormat[8].call(null, k, oc, fmt);
|
|
}
|
|
function fprintf(oc, fmt){
|
|
return kfprintf(function(a){return 0;}, oc, fmt);
|
|
}
|
|
function bprintf(b, fmt){return kbprintf(function(a){return 0;}, b, fmt);}
|
|
function ifprintf(oc, fmt){
|
|
return ikfprintf(function(a){return 0;}, oc, fmt);
|
|
}
|
|
function ibprintf(b, fmt){
|
|
return ikfprintf(function(a){return 0;}, b, fmt);
|
|
}
|
|
function printf(fmt){return fprintf(Stdlib[39], fmt);}
|
|
function eprintf(fmt){return fprintf(Stdlib[40], fmt);}
|
|
function ksprintf(k, param){
|
|
var fmt = param[1];
|
|
function k$0(acc){
|
|
var buf = Stdlib_Buffer[1].call(null, 64);
|
|
CamlinternalFormat[11].call(null, buf, acc);
|
|
return caml_call1(k, Stdlib_Buffer[2].call(null, buf));
|
|
}
|
|
return CamlinternalFormat[7].call(null, k$0, 0, fmt);
|
|
}
|
|
function sprintf(fmt){return ksprintf(function(s){return s;}, fmt);}
|
|
runtime.caml_register_global
|
|
(3,
|
|
[0,
|
|
fprintf,
|
|
printf,
|
|
eprintf,
|
|
sprintf,
|
|
bprintf,
|
|
ifprintf,
|
|
ibprintf,
|
|
kfprintf,
|
|
ikfprintf,
|
|
ksprintf,
|
|
kbprintf,
|
|
ikfprintf,
|
|
ksprintf],
|
|
"Stdlib__Printf");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 16793 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Printexc:[F(1),F(1),F(2),F(2),F(1),F(1),F(1),F(1),F(1),F(1),F(1)*,F(1)*,F(2),F(1),F(2),F(1),F(1),F(1),N,F(1)*,F(2),F(1),F(1),F(1),F(1),F(1)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_check_bound = runtime.caml_check_bound,
|
|
caml_get_exception_raw_backtra = runtime.caml_get_exception_raw_backtrace,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_obj_tag = runtime.caml_obj_tag,
|
|
caml_wrap_exception = runtime.caml_wrap_exception;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
function caml_call5(f, a0, a1, a2, a3, a4){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 5
|
|
? f(a0, a1, a2, a3, a4)
|
|
: runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]);
|
|
}
|
|
function caml_call7(f, a0, a1, a2, a3, a4, a5, a6){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 7
|
|
? f(a0, a1, a2, a3, a4, a5, a6)
|
|
: runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib_Printf = global_data.Stdlib__Printf,
|
|
Stdlib_Atomic = global_data.Stdlib__Atomic,
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_Buffer = global_data.Stdlib__Buffer,
|
|
Stdlib_Obj = global_data.Stdlib__Obj,
|
|
printers = Stdlib_Atomic[1].call(null, 0),
|
|
a = [0, [3, 0, 0], "%S"],
|
|
b = [0, [4, 0, 0, 0, 0], "%d"];
|
|
function field(x, i){
|
|
var f = x[i + 1];
|
|
if(! Stdlib_Obj[1].call(null, f))
|
|
return caml_call1(Stdlib_Printf[4].call(null, b), f);
|
|
var c = Stdlib_Obj[15];
|
|
if(caml_obj_tag(f) === c)
|
|
return caml_call1(Stdlib_Printf[4].call(null, a), f);
|
|
var d = Stdlib_Obj[16];
|
|
return caml_obj_tag(f) === d ? Stdlib[35].call(null, f) : "_";
|
|
}
|
|
var cst = "", c = [0, [11, ", ", [2, 0, [2, 0, 0]]], ", %s%s"];
|
|
function other_fields(x, i){
|
|
if(x.length - 1 <= i) return cst;
|
|
var a = other_fields(x, i + 1 | 0), b = field(x, i);
|
|
return caml_call2(Stdlib_Printf[4].call(null, c), b, a);
|
|
}
|
|
function use_printers(x){
|
|
var param = Stdlib_Atomic[3].call(null, printers);
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var tl = param[2], hd = param[1];
|
|
try{var val = caml_call1(hd, x);}catch(a){param = tl; continue;}
|
|
if(val){var s = val[1]; return [0, s];}
|
|
param = tl;
|
|
}
|
|
}
|
|
var
|
|
d = [0, [12, 40, [2, 0, [2, 0, [12, 41, 0]]]], "(%s%s)"],
|
|
e = [0, [12, 40, [2, 0, [12, 41, 0]]], "(%s)"];
|
|
function string_of_extension_constructo(t){
|
|
if(0 === caml_obj_tag(t)){
|
|
var constructor = t[1][1], match = t.length - 1;
|
|
if(2 < match >>> 0)
|
|
var
|
|
b = other_fields(t, 2),
|
|
c = field(t, 1),
|
|
a = caml_call2(Stdlib_Printf[4].call(null, d), c, b);
|
|
else
|
|
switch(match){
|
|
case 2:
|
|
var
|
|
g = field(t, 1),
|
|
a = caml_call1(Stdlib_Printf[4].call(null, e), g);
|
|
break;
|
|
case 0:
|
|
var a = cst; break;
|
|
default: var a = cst;
|
|
}
|
|
var match$0 = [0, constructor, [0, a]];
|
|
}
|
|
else
|
|
var match$0 = [0, t[1], 0];
|
|
var fields_opt = match$0[2], constructor$0 = match$0[1];
|
|
if(! fields_opt) return constructor$0;
|
|
var f = fields_opt[1];
|
|
return Stdlib[28].call(null, constructor$0, f);
|
|
}
|
|
var
|
|
cst_characters = ", characters ",
|
|
locfmt =
|
|
[0,
|
|
[11,
|
|
'File "',
|
|
[2,
|
|
0,
|
|
[11,
|
|
'", line ',
|
|
[4,
|
|
0,
|
|
0,
|
|
0,
|
|
[11,
|
|
cst_characters,
|
|
[4, 0, 0, 0, [12, 45, [4, 0, 0, 0, [11, ": ", [2, 0, 0]]]]]]]]]],
|
|
'File "%s", line %d, characters %d-%d: %s'];
|
|
function to_string_default(x){
|
|
if(x === Stdlib[9]) return "Out of memory";
|
|
if(x === Stdlib[10]) return "Stack overflow";
|
|
if(x[1] === Stdlib[4]){
|
|
var match = x[2], char = match[3], line = match[2], file = match[1];
|
|
return caml_call5
|
|
(Stdlib_Printf[4].call(null, locfmt),
|
|
file,
|
|
line,
|
|
char,
|
|
char + 5 | 0,
|
|
"Pattern matching failed");
|
|
}
|
|
if(x[1] === Stdlib[5]){
|
|
var
|
|
match$0 = x[2],
|
|
char$0 = match$0[3],
|
|
line$0 = match$0[2],
|
|
file$0 = match$0[1];
|
|
return caml_call5
|
|
(Stdlib_Printf[4].call(null, locfmt),
|
|
file$0,
|
|
line$0,
|
|
char$0,
|
|
char$0 + 6 | 0,
|
|
"Assertion failed");
|
|
}
|
|
if(x[1] !== Stdlib[15]) return string_of_extension_constructo(x);
|
|
var
|
|
match$1 = x[2],
|
|
char$1 = match$1[3],
|
|
line$1 = match$1[2],
|
|
file$1 = match$1[1];
|
|
return caml_call5
|
|
(Stdlib_Printf[4].call(null, locfmt),
|
|
file$1,
|
|
line$1,
|
|
char$1,
|
|
char$1 + 6 | 0,
|
|
"Undefined recursive module");
|
|
}
|
|
function to_string(e){
|
|
var match = use_printers(e);
|
|
if(! match) return to_string_default(e);
|
|
var s = match[1];
|
|
return s;
|
|
}
|
|
var
|
|
cst_Uncaught_exception = "Uncaught exception: ",
|
|
cst_Uncaught_exception_s = "Uncaught exception: %s\n",
|
|
f =
|
|
[0,
|
|
[11, cst_Uncaught_exception, [2, 0, [12, 10, 0]]],
|
|
cst_Uncaught_exception_s];
|
|
function print(fct, arg){
|
|
try{var b = caml_call1(fct, arg); return b;}
|
|
catch(x$0){
|
|
var x = caml_wrap_exception(x$0), a = to_string(x);
|
|
caml_call1(Stdlib_Printf[3].call(null, f), a);
|
|
Stdlib[63].call(null, Stdlib[40]);
|
|
throw caml_maybe_attach_backtrace(x, 0);
|
|
}
|
|
}
|
|
var
|
|
g =
|
|
[0,
|
|
[11, cst_Uncaught_exception, [2, 0, [12, 10, 0]]],
|
|
cst_Uncaught_exception_s];
|
|
function catch$(fct, arg){
|
|
try{var b = caml_call1(fct, arg); return b;}
|
|
catch(x$0){
|
|
var x = caml_wrap_exception(x$0);
|
|
Stdlib[63].call(null, Stdlib[39]);
|
|
var a = to_string(x);
|
|
caml_call1(Stdlib_Printf[3].call(null, g), a);
|
|
return Stdlib[99].call(null, 2);
|
|
}
|
|
}
|
|
function raw_backtrace_entries(bt){return bt;}
|
|
function convert_raw_backtrace(bt){
|
|
return [0, runtime.caml_convert_raw_backtrace(bt)];
|
|
}
|
|
var
|
|
h = [0, [12, 32, [4, 0, 0, 0, 0]], " %d"],
|
|
i =
|
|
[0,
|
|
[2,
|
|
0,
|
|
[12,
|
|
32,
|
|
[2,
|
|
0,
|
|
[11,
|
|
' in file "',
|
|
[2,
|
|
0,
|
|
[12,
|
|
34,
|
|
[2,
|
|
0,
|
|
[11,
|
|
", line",
|
|
[2,
|
|
0,
|
|
[11, cst_characters, [4, 0, 0, 0, [12, 45, [4, 0, 0, 0, 0]]]]]]]]]]]]],
|
|
'%s %s in file "%s"%s, line%s, characters %d-%d'],
|
|
j = [0, [11, "s ", [4, 0, 0, 0, [12, 45, [4, 0, 0, 0, 0]]]], "s %d-%d"],
|
|
k = [0, [2, 0, [11, " unknown location", 0]], "%s unknown location"];
|
|
function format_backtrace_slot(pos, slot){
|
|
function info(is_raise){
|
|
return is_raise
|
|
? 0 === pos ? "Raised at" : "Re-raised at"
|
|
: 0 === pos ? "Raised by primitive operation at" : "Called from";
|
|
}
|
|
if(0 !== slot[0]){
|
|
if(slot[1]) return 0;
|
|
var n = info(0);
|
|
return [0, caml_call1(Stdlib_Printf[4].call(null, k), n)];
|
|
}
|
|
if(slot[3] === slot[6])
|
|
var a = slot[3], lines = caml_call1(Stdlib_Printf[4].call(null, h), a);
|
|
else
|
|
var
|
|
l = slot[6],
|
|
m = slot[3],
|
|
lines = caml_call2(Stdlib_Printf[4].call(null, j), m, l);
|
|
var
|
|
b = slot[7],
|
|
c = slot[4],
|
|
d = slot[8] ? " (inlined)" : cst,
|
|
e = slot[2],
|
|
f = slot[9],
|
|
g = info(slot[1]);
|
|
return [0,
|
|
caml_call7
|
|
(Stdlib_Printf[4].call(null, i), g, f, e, d, lines, c, b)];
|
|
}
|
|
var
|
|
cst_s = "%s\n",
|
|
cst_Program_not_linked_with_g_ =
|
|
"(Program not linked with -g, cannot print stack backtrace)\n",
|
|
l = [0, [2, 0, [12, 10, 0]], cst_s],
|
|
m =
|
|
[0,
|
|
[11, cst_Program_not_linked_with_g_, 0],
|
|
cst_Program_not_linked_with_g_];
|
|
function print_raw_backtrace(outchan, raw_backtrace){
|
|
var backtrace = convert_raw_backtrace(raw_backtrace);
|
|
if(! backtrace) return Stdlib_Printf[1].call(null, outchan, m);
|
|
var a = backtrace[1], b = a.length - 2 | 0;
|
|
if(b >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
var match = format_backtrace_slot(i, caml_check_bound(a, i)[i + 1]);
|
|
if(match){
|
|
var str = match[1];
|
|
caml_call1(Stdlib_Printf[1].call(null, outchan, l), str);
|
|
}
|
|
var c = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function print_backtrace(outchan){
|
|
return print_raw_backtrace(outchan, caml_get_exception_raw_backtra(0));
|
|
}
|
|
var n = [0, [2, 0, [12, 10, 0]], cst_s];
|
|
function raw_backtrace_to_string(raw_backtrace){
|
|
var backtrace = convert_raw_backtrace(raw_backtrace);
|
|
if(! backtrace) return cst_Program_not_linked_with_g_;
|
|
var
|
|
a = backtrace[1],
|
|
b = Stdlib_Buffer[1].call(null, 1024),
|
|
c = a.length - 2 | 0;
|
|
if(c >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
var match = format_backtrace_slot(i, caml_check_bound(a, i)[i + 1]);
|
|
if(match){
|
|
var str = match[1];
|
|
caml_call1(Stdlib_Printf[5].call(null, b, n), str);
|
|
}
|
|
var d = i + 1 | 0;
|
|
if(c === i) break;
|
|
i = d;
|
|
}
|
|
}
|
|
return Stdlib_Buffer[2].call(null, b);
|
|
}
|
|
function backtrace_slot_is_raise(param){
|
|
return 0 === param[0] ? param[1] : param[1];
|
|
}
|
|
function backtrace_slot_is_inline(param){return 0 === param[0] ? param[8] : 0;
|
|
}
|
|
function backtrace_slot_location(param){
|
|
return 0 === param[0]
|
|
? [0,
|
|
[0, param[2], param[3], param[4], param[5], param[6], param[7]]]
|
|
: 0;
|
|
}
|
|
function backtrace_slot_defname(param){
|
|
if(0 === param[0] && param[9] !== cst) return [0, param[9]];
|
|
return 0;
|
|
}
|
|
function backtrace_slots(raw_backtrace){
|
|
var match = convert_raw_backtrace(raw_backtrace);
|
|
if(! match) return 0;
|
|
var backtrace = match[1], i$1 = backtrace.length - 2 | 0, i = i$1;
|
|
for(;;){
|
|
if(-1 === i)
|
|
var b = 0;
|
|
else{
|
|
var a = 0 === caml_check_bound(backtrace, i)[i + 1][0] ? 1 : 0;
|
|
if(! a){var i$0 = i - 1 | 0; i = i$0; continue;}
|
|
var b = a;
|
|
}
|
|
return b ? [0, backtrace] : 0;
|
|
}
|
|
}
|
|
function backtrace_slots_of_raw_entry(entry){return backtrace_slots([0, entry]);
|
|
}
|
|
function raw_backtrace_length(bt){return bt.length - 1;}
|
|
function get_backtrace(param){
|
|
return raw_backtrace_to_string(caml_get_exception_raw_backtra(0));
|
|
}
|
|
function register_printer(fn){
|
|
for(;;){
|
|
var
|
|
old_printers = Stdlib_Atomic[3].call(null, printers),
|
|
new_printers = [0, fn, old_printers],
|
|
success =
|
|
Stdlib_Atomic[6].call(null, printers, old_printers, new_printers),
|
|
a = 1 - success;
|
|
if(! a) return a;
|
|
}
|
|
}
|
|
function exn_slot(x){return 0 === caml_obj_tag(x) ? x[1] : x;}
|
|
function exn_slot_id(x){var slot = exn_slot(x); return slot[2];}
|
|
function exn_slot_name(x){var slot = exn_slot(x); return slot[1];}
|
|
var
|
|
errors =
|
|
runtime.caml_obj_dup
|
|
([0,
|
|
cst,
|
|
"(Cannot print locations:\n bytecode executable program file not found)",
|
|
"(Cannot print locations:\n bytecode executable program file appears to be corrupt)",
|
|
"(Cannot print locations:\n bytecode executable program file has wrong magic number)",
|
|
"(Cannot print locations:\n bytecode executable program file cannot be opened;\n -- too many open files. Try running with OCAMLRUNPARAM=b=2)"]),
|
|
cst_Fatal_error_exception = "Fatal error: exception ",
|
|
cst_Fatal_error_exception_s = "Fatal error: exception %s\n",
|
|
o =
|
|
[0,
|
|
[11, cst_Fatal_error_exception, [2, 0, [12, 10, 0]]],
|
|
cst_Fatal_error_exception_s];
|
|
function default_uncaught_exception_han(exn, raw_backtrace){
|
|
var b = to_string(exn);
|
|
caml_call1(Stdlib_Printf[3].call(null, o), b);
|
|
print_raw_backtrace(Stdlib[40], raw_backtrace);
|
|
var status = runtime.caml_ml_debug_info_status(0);
|
|
if(status < 0){
|
|
var
|
|
a = Stdlib[18].call(null, status),
|
|
c = caml_check_bound(errors, a)[a + 1];
|
|
Stdlib[53].call(null, c);
|
|
}
|
|
return Stdlib[63].call(null, Stdlib[40]);
|
|
}
|
|
var uncaught_exception_handler = [0, default_uncaught_exception_han];
|
|
function set_uncaught_exception_handler(fn){
|
|
uncaught_exception_handler[1] = fn;
|
|
return 0;
|
|
}
|
|
var
|
|
empty_backtrace = [0],
|
|
p =
|
|
[0,
|
|
[11, cst_Fatal_error_exception, [2, 0, [12, 10, 0]]],
|
|
cst_Fatal_error_exception_s],
|
|
q =
|
|
[0,
|
|
[11,
|
|
"Fatal error in uncaught exception handler: exception ",
|
|
[2, 0, [12, 10, 0]]],
|
|
"Fatal error in uncaught exception handler: exception %s\n"];
|
|
function handle_uncaught_exception(exn$1, debugger_in_use){
|
|
try{
|
|
try{
|
|
var
|
|
raw_backtrace =
|
|
debugger_in_use ? empty_backtrace : caml_get_exception_raw_backtra(0);
|
|
try{Stdlib[103].call(null, 0);}catch(exn){}
|
|
try{
|
|
var
|
|
e = caml_call2(uncaught_exception_handler[1], exn$1, raw_backtrace),
|
|
a = e;
|
|
}
|
|
catch(exn){
|
|
var
|
|
exn$0 = caml_wrap_exception(exn),
|
|
raw_backtrace$0 = caml_get_exception_raw_backtra(0),
|
|
c = to_string(exn$1);
|
|
caml_call1(Stdlib_Printf[3].call(null, p), c);
|
|
print_raw_backtrace(Stdlib[40], raw_backtrace);
|
|
var d = to_string(exn$0);
|
|
caml_call1(Stdlib_Printf[3].call(null, q), d);
|
|
print_raw_backtrace(Stdlib[40], raw_backtrace$0);
|
|
var a = Stdlib[63].call(null, Stdlib[40]);
|
|
}
|
|
var b = a;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn !== Stdlib[9]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var
|
|
b =
|
|
Stdlib[53].call
|
|
(null, "Fatal error: out of memory in uncaught exception handler");
|
|
}
|
|
return b;
|
|
}
|
|
catch(exn){return 0;}
|
|
}
|
|
runtime.caml_register_named_value
|
|
("Printexc.handle_uncaught_exception", handle_uncaught_exception);
|
|
var
|
|
Stdlib_Printexc =
|
|
[0,
|
|
to_string,
|
|
to_string_default,
|
|
print,
|
|
catch$,
|
|
print_backtrace,
|
|
get_backtrace,
|
|
runtime.caml_record_backtrace,
|
|
runtime.caml_backtrace_status,
|
|
register_printer,
|
|
use_printers,
|
|
raw_backtrace_entries,
|
|
caml_get_exception_raw_backtra,
|
|
print_raw_backtrace,
|
|
raw_backtrace_to_string,
|
|
default_uncaught_exception_han,
|
|
set_uncaught_exception_handler,
|
|
backtrace_slots,
|
|
backtrace_slots_of_raw_entry,
|
|
[0,
|
|
backtrace_slot_is_raise,
|
|
backtrace_slot_is_inline,
|
|
backtrace_slot_location,
|
|
backtrace_slot_defname,
|
|
format_backtrace_slot],
|
|
raw_backtrace_length,
|
|
runtime.caml_raw_backtrace_slot,
|
|
runtime.caml_convert_raw_backtrace_slot,
|
|
runtime.caml_raw_backtrace_next_slot,
|
|
exn_slot_id,
|
|
exn_slot_name,
|
|
string_of_extension_constructo];
|
|
runtime.caml_register_global(43, Stdlib_Printexc, "Stdlib__Printexc");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 17276 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Fun:[F(2)*,F(3),F(3),F(2),F(2),N]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_restore_raw_backtrace = runtime.caml_restore_raw_backtrace,
|
|
caml_wrap_exception = runtime.caml_wrap_exception;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib_Printexc = global_data.Stdlib__Printexc,
|
|
Stdlib = global_data.Stdlib;
|
|
function const$(c, param){return c;}
|
|
function compose(f, g, x){return caml_call1(f, caml_call1(g, x));}
|
|
function flip(f, x, y){return caml_call2(f, y, x);}
|
|
function negate(p, v){return 1 - caml_call1(p, v);}
|
|
var
|
|
Finally_raised =
|
|
[248, "Stdlib.Fun.Finally_raised", runtime.caml_fresh_oo_id(0)];
|
|
Stdlib_Printexc[9].call
|
|
(null,
|
|
function(param){
|
|
if(param[1] !== Finally_raised) return 0;
|
|
var exn = param[2], a = Stdlib_Printexc[1].call(null, exn);
|
|
return [0, Stdlib[28].call(null, "Fun.Finally_raised: ", a)];
|
|
});
|
|
var dummy = 0;
|
|
function protect(finally$, work){
|
|
function finally_no_exn(param){
|
|
try{caml_call1(finally$, 0); return;}
|
|
catch(e$0){
|
|
var
|
|
e = caml_wrap_exception(e$0),
|
|
bt = Stdlib_Printexc[12].call(null, 0),
|
|
exn = [0, Finally_raised, e];
|
|
caml_restore_raw_backtrace(exn, bt);
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
}
|
|
try{var result = caml_call1(work, 0);}
|
|
catch(work_exn$0){
|
|
var
|
|
work_exn = caml_wrap_exception(work_exn$0),
|
|
work_bt = Stdlib_Printexc[12].call(null, 0);
|
|
finally_no_exn(0);
|
|
caml_restore_raw_backtrace(work_exn, work_bt);
|
|
throw caml_maybe_attach_backtrace(work_exn, 0);
|
|
}
|
|
finally_no_exn(0);
|
|
return result;
|
|
}
|
|
runtime.caml_register_global
|
|
(4,
|
|
[0, const$, compose, flip, negate, protect, Finally_raised],
|
|
"Stdlib__Fun");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 17540 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__In_channel:[N,F(1),F(1),F(3),F(2),F(2),F(4),F(1),F(1),F(1),F(1),F(1),F(2),F(1),F(1),F(4),F(4),F(4),F(4),F(3),N,N,N,F(2),F(1),F(1)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_ba_dim_1 = runtime.caml_ba_dim_1,
|
|
caml_create_bytes = runtime.caml_create_bytes,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_ml_bytes_length = runtime.caml_ml_bytes_length,
|
|
caml_ml_input_bigarray = runtime.caml_ml_input_bigarray,
|
|
caml_wrap_exception = runtime.caml_wrap_exception;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_Bytes = global_data.Stdlib__Bytes,
|
|
Stdlib_Sys = global_data.Stdlib__Sys,
|
|
Stdlib_Fun = global_data.Stdlib__Fun,
|
|
stdin = Stdlib[38],
|
|
open_bin = Stdlib[80],
|
|
open_text = Stdlib[79],
|
|
open_gen = Stdlib[81];
|
|
function with_open(openfun, s, f){
|
|
var ic = caml_call1(openfun, s);
|
|
return Stdlib_Fun[5].call
|
|
(null,
|
|
function(param){return Stdlib[94].call(null, ic);},
|
|
function(param){return caml_call1(f, ic);});
|
|
}
|
|
function with_open_bin(s, f){return with_open(Stdlib[80], s, f);}
|
|
function with_open_text(s, f){return with_open(Stdlib[79], s, f);}
|
|
function with_open_gen(flags, perm, s, f){
|
|
var a = Stdlib[81];
|
|
return with_open(function(b){return a(flags, perm, b);}, s, f);
|
|
}
|
|
var
|
|
seek = Stdlib[96][4],
|
|
pos = Stdlib[96][5],
|
|
length = Stdlib[96][6],
|
|
close = Stdlib[93],
|
|
close_noerr = Stdlib[94];
|
|
function input_char(ic){
|
|
try{var c = Stdlib[82].call(null, ic);}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn === Stdlib[12]) return 0;
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
return [0, c];
|
|
}
|
|
function input_byte(ic){
|
|
try{var n = Stdlib[87].call(null, ic);}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn === Stdlib[12]) return 0;
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
return [0, n];
|
|
}
|
|
function input_line(ic){
|
|
try{var s = Stdlib[83].call(null, ic);}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn === Stdlib[12]) return 0;
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
return [0, s];
|
|
}
|
|
var input = Stdlib[84];
|
|
function input_bigarray(ic, buf, ofs, len){
|
|
if(0 <= ofs && 0 <= len && (caml_ba_dim_1(buf) - len | 0) >= ofs)
|
|
return caml_ml_input_bigarray(ic, buf, ofs, len);
|
|
return Stdlib[1].call(null, "input_bigarray");
|
|
}
|
|
var a = [0, 0];
|
|
function really_input(ic, buf, pos, len){
|
|
try{Stdlib[85].call(null, ic, buf, pos, len); return a;}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn === Stdlib[12]) return 0;
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
}
|
|
var b = [0, 0];
|
|
function really_input_bigarray(ic, buf, ofs$1, len$1){
|
|
if(0 <= ofs$1 && 0 <= len$1 && (caml_ba_dim_1(buf) - len$1 | 0) >= ofs$1){
|
|
var ofs = ofs$1, len = len$1;
|
|
for(;;){
|
|
if(0 >= len) return b;
|
|
var r = caml_ml_input_bigarray(ic, buf, ofs, len);
|
|
if(0 === r) return 0;
|
|
var len$0 = len - r | 0, ofs$0 = ofs + r | 0;
|
|
ofs = ofs$0;
|
|
len = len$0;
|
|
}
|
|
}
|
|
return Stdlib[1].call(null, "really_input_bigarray");
|
|
}
|
|
function really_input_string(ic, len){
|
|
try{var s = Stdlib[86].call(null, ic, len);}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn === Stdlib[12]) return 0;
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
return [0, s];
|
|
}
|
|
function read_upto(ic, buf, ofs, len){
|
|
var ofs$0 = ofs, len$0 = len;
|
|
for(;;){
|
|
if(0 !== len$0){
|
|
var r = Stdlib[84].call(null, ic, buf, ofs$0, len$0);
|
|
if(0 !== r){
|
|
var len$1 = len$0 - r | 0, ofs$1 = ofs$0 + r | 0;
|
|
ofs$0 = ofs$1;
|
|
len$0 = len$1;
|
|
continue;
|
|
}
|
|
}
|
|
return ofs$0 - ofs | 0;
|
|
}
|
|
}
|
|
function ensure(buf, ofs, n){
|
|
var len = caml_ml_bytes_length(buf);
|
|
if((ofs + n | 0) <= len) return buf;
|
|
var new_len$0 = len;
|
|
for(;;){
|
|
if(new_len$0 >= (ofs + n | 0)) break;
|
|
new_len$0 = (2 * new_len$0 | 0) + 1 | 0;
|
|
}
|
|
var
|
|
new_len =
|
|
new_len$0 <= Stdlib_Sys[12]
|
|
? new_len$0
|
|
: ofs
|
|
< Stdlib_Sys[12]
|
|
? Stdlib_Sys[12]
|
|
: Stdlib
|
|
[2].call
|
|
(null,
|
|
"In_channel.input_all: channel content is larger than maximum string length"),
|
|
new_buf = caml_create_bytes(new_len);
|
|
Stdlib_Bytes[11].call(null, buf, 0, new_buf, 0, ofs);
|
|
return new_buf;
|
|
}
|
|
function input_all(ic){
|
|
try{
|
|
var
|
|
a = Stdlib[91].call(null, ic),
|
|
b = Stdlib[92].call(null, ic) - a | 0,
|
|
initial_size = b;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn[1] !== Stdlib[11]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var initial_size = -1;
|
|
}
|
|
var
|
|
chunk_size = 65536,
|
|
initial_size$0 = 0 <= initial_size ? initial_size : chunk_size,
|
|
initial_size$1 =
|
|
initial_size$0 <= Stdlib_Sys[12] ? initial_size$0 : Stdlib_Sys[12],
|
|
buf = caml_create_bytes(initial_size$1),
|
|
nread = read_upto(ic, buf, 0, initial_size$1);
|
|
if(nread < initial_size$1)
|
|
return Stdlib_Bytes[8].call(null, buf, 0, nread);
|
|
try{var c = Stdlib[82].call(null, ic);}
|
|
catch(exn){
|
|
var exn$0 = caml_wrap_exception(exn);
|
|
if(exn$0 === Stdlib[12]) return Stdlib_Bytes[44].call(null, buf);
|
|
throw caml_maybe_attach_backtrace(exn$0, 0);
|
|
}
|
|
var buf$2 = ensure(buf, nread, 65537);
|
|
runtime.caml_bytes_set(buf$2, nread, c);
|
|
var ofs$1 = nread + 1 | 0, buf$0 = buf$2, ofs = ofs$1;
|
|
for(;;){
|
|
var
|
|
buf$1 = ensure(buf$0, ofs, chunk_size),
|
|
rem = caml_ml_bytes_length(buf$1) - ofs | 0,
|
|
r = read_upto(ic, buf$1, ofs, rem);
|
|
if(r < rem) return Stdlib_Bytes[8].call(null, buf$1, 0, ofs + r | 0);
|
|
var ofs$0 = ofs + rem | 0;
|
|
buf$0 = buf$1;
|
|
ofs = ofs$0;
|
|
}
|
|
}
|
|
function input_lines(ic){
|
|
try{var line = Stdlib[83].call(null, ic);}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn === Stdlib[12]) return 0;
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
var block = [0, line, 24029], dst = block, offset = 1;
|
|
for(;;){
|
|
try{var line$0 = Stdlib[83].call(null, ic);}
|
|
catch(exn){
|
|
var exn$0 = caml_wrap_exception(exn);
|
|
if(exn$0 !== Stdlib[12]) throw caml_maybe_attach_backtrace(exn$0, 0);
|
|
dst[offset + 1] = 0;
|
|
return block;
|
|
}
|
|
var dst$0 = [0, line$0, 24029];
|
|
dst[offset + 1] = dst$0;
|
|
dst = dst$0;
|
|
offset = 1;
|
|
}
|
|
}
|
|
function fold_lines(f, accu$1, ic){
|
|
var accu = accu$1;
|
|
for(;;){
|
|
try{var line = Stdlib[83].call(null, ic);}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn === Stdlib[12]) return accu;
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
var accu$0 = caml_call2(f, accu, line);
|
|
accu = accu$0;
|
|
}
|
|
}
|
|
var
|
|
set_binary_mode = Stdlib[95],
|
|
Stdlib_In_channel =
|
|
[0,
|
|
stdin,
|
|
open_bin,
|
|
open_text,
|
|
open_gen,
|
|
with_open_bin,
|
|
with_open_text,
|
|
with_open_gen,
|
|
close,
|
|
close_noerr,
|
|
input_char,
|
|
input_byte,
|
|
input_line,
|
|
really_input_string,
|
|
input_all,
|
|
input_lines,
|
|
input,
|
|
input_bigarray,
|
|
really_input,
|
|
really_input_bigarray,
|
|
fold_lines,
|
|
seek,
|
|
pos,
|
|
length,
|
|
set_binary_mode,
|
|
runtime.caml_ml_is_binary_mode,
|
|
runtime.caml_sys_isatty];
|
|
runtime.caml_register_global(9, Stdlib_In_channel, "Stdlib__In_channel");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 17897 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Digest:[F(2)*,F(2)*,F(1),F(1),F(3),F(3),F(2),F(1),F(2),F(1),F(1),F(1),F(1),N,N,N,N]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_blake2_final = runtime.caml_blake2_final,
|
|
caml_blake2_string = runtime.caml_blake2_string,
|
|
caml_blake2_update = runtime.caml_blake2_update,
|
|
caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set,
|
|
caml_create_bytes = runtime.caml_create_bytes,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_md5_chan = runtime.caml_md5_chan,
|
|
caml_md5_string = runtime.caml_md5_string,
|
|
caml_ml_string_length = runtime.caml_ml_string_length,
|
|
caml_string_get = runtime.caml_string_get,
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_In_channel = global_data.Stdlib__In_channel,
|
|
Stdlib_Bytes = global_data.Stdlib__Bytes,
|
|
Stdlib_Int = global_data.Stdlib__Int,
|
|
Stdlib_String = global_data.Stdlib__String,
|
|
Stdlib_Char = global_data.Stdlib__Char;
|
|
function hex_of_string(d){
|
|
function char_hex(n){
|
|
var a = 10 <= n ? (97 + n | 0) - 10 | 0 : 48 + n | 0;
|
|
return Stdlib_Char[1].call(null, a);
|
|
}
|
|
var
|
|
len = caml_ml_string_length(d),
|
|
result = caml_create_bytes(len * 2 | 0),
|
|
a = len - 1 | 0;
|
|
if(a >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
var x = caml_string_get(d, i);
|
|
caml_bytes_unsafe_set(result, i * 2 | 0, char_hex(x >>> 4 | 0));
|
|
caml_bytes_unsafe_set(result, (i * 2 | 0) + 1 | 0, char_hex(x & 15));
|
|
var b = i + 1 | 0;
|
|
if(a === i) break;
|
|
i = b;
|
|
}
|
|
}
|
|
return Stdlib_Bytes[44].call(null, result);
|
|
}
|
|
var cst_Digest_of_hex = "Digest.of_hex";
|
|
function string_of_hex(s){
|
|
function digit(c){
|
|
if(65 <= c){
|
|
if(97 <= c){
|
|
if(103 > c) return (c - 97 | 0) + 10 | 0;
|
|
}
|
|
else if(71 > c) return (c - 65 | 0) + 10 | 0;
|
|
}
|
|
else if(9 >= c - 48 >>> 0) return c - 48 | 0;
|
|
return Stdlib[1].call(null, cst_Digest_of_hex);
|
|
}
|
|
return Stdlib_String[2].call
|
|
(null,
|
|
caml_ml_string_length(s) / 2 | 0,
|
|
function(i){
|
|
var
|
|
i$0 = 2 * i | 0,
|
|
a = digit(caml_string_get(s, i$0 + 1 | 0)),
|
|
b = (digit(caml_string_get(s, i$0)) << 4) + a | 0;
|
|
return Stdlib_Char[1].call(null, b);
|
|
});
|
|
}
|
|
var
|
|
cst_Digest_substring = "Digest.substring",
|
|
cst_Digest_to_hex = "Digest.to_hex";
|
|
function BLAKE2(X){
|
|
var a = X[1] < 1, b = a || 64 < X[1];
|
|
if(b) Stdlib[1].call(null, "Digest.BLAKE2: wrong hash size");
|
|
var
|
|
hash_length = X[1],
|
|
compare = Stdlib_String[10],
|
|
equal = Stdlib_String[9],
|
|
cst = "";
|
|
function string(str){
|
|
return caml_blake2_string
|
|
(hash_length, cst, str, 0, caml_ml_string_length(str));
|
|
}
|
|
function bytes(b){return string(Stdlib_Bytes[44].call(null, b));}
|
|
function substring(str, ofs, len){
|
|
var a = ofs < 0;
|
|
if(a)
|
|
var b = a;
|
|
else
|
|
var c = len < 0, b = c || (caml_ml_string_length(str) - len | 0) < ofs;
|
|
if(b) Stdlib[1].call(null, cst_Digest_substring);
|
|
return caml_blake2_string(hash_length, cst, str, ofs, len);
|
|
}
|
|
function subbytes(b, ofs, len){
|
|
return substring(Stdlib_Bytes[44].call(null, b), ofs, len);
|
|
}
|
|
function channel(ic, toread){
|
|
var
|
|
buf = caml_create_bytes(4096),
|
|
ctx = runtime.caml_blake2_create(hash_length, cst),
|
|
buf_size = 4096;
|
|
if(0 <= toread){
|
|
var toread$0 = toread;
|
|
for(;;){
|
|
if(0 === toread$0) return caml_blake2_final(ctx, hash_length);
|
|
var
|
|
a = Stdlib_Int[10].call(null, buf_size, toread$0),
|
|
n = Stdlib_In_channel[16].call(null, ic, buf, 0, a);
|
|
if(0 === n) throw caml_maybe_attach_backtrace(Stdlib[12], 1);
|
|
caml_blake2_update(ctx, Stdlib_Bytes[44].call(null, buf), 0, n);
|
|
var toread$1 = toread$0 - n | 0;
|
|
toread$0 = toread$1;
|
|
}
|
|
}
|
|
else
|
|
for(;;){
|
|
var n$0 = Stdlib_In_channel[16].call(null, ic, buf, 0, buf_size);
|
|
if(0 === n$0) return caml_blake2_final(ctx, hash_length);
|
|
caml_blake2_update(ctx, Stdlib_Bytes[44].call(null, buf), 0, n$0);
|
|
}
|
|
}
|
|
function file(filename){
|
|
return Stdlib_In_channel[5].call
|
|
(null, filename, function(ic){return channel(ic, -1);});
|
|
}
|
|
function output(chan, digest){return Stdlib[66].call(null, chan, digest);}
|
|
function input(chan){return Stdlib[86].call(null, chan, hash_length);}
|
|
function to_hex(d){
|
|
if(caml_ml_string_length(d) !== hash_length)
|
|
Stdlib[1].call(null, cst_Digest_to_hex);
|
|
return hex_of_string(d);
|
|
}
|
|
function of_hex(s){
|
|
if(caml_ml_string_length(s) !== (hash_length * 2 | 0))
|
|
Stdlib[1].call(null, cst_Digest_of_hex);
|
|
return string_of_hex(s);
|
|
}
|
|
return [0,
|
|
hash_length,
|
|
compare,
|
|
equal,
|
|
string,
|
|
bytes,
|
|
substring,
|
|
subbytes,
|
|
channel,
|
|
file,
|
|
output,
|
|
input,
|
|
to_hex,
|
|
of_hex];
|
|
}
|
|
var
|
|
BLAKE128 = BLAKE2([0, 16]),
|
|
BLAKE256 = BLAKE2([0, 32]),
|
|
BLAKE512 = BLAKE2([0, 64]),
|
|
compare = Stdlib_String[10],
|
|
equal = Stdlib_String[9];
|
|
function string(str){
|
|
return caml_md5_string(str, 0, caml_ml_string_length(str));
|
|
}
|
|
function bytes(b){return string(Stdlib_Bytes[44].call(null, b));}
|
|
function substring(str, ofs, len){
|
|
if(0 <= ofs && 0 <= len && (caml_ml_string_length(str) - len | 0) >= ofs)
|
|
return caml_md5_string(str, ofs, len);
|
|
return Stdlib[1].call(null, cst_Digest_substring);
|
|
}
|
|
function subbytes(b, ofs, len){
|
|
return substring(Stdlib_Bytes[44].call(null, b), ofs, len);
|
|
}
|
|
function file(filename){
|
|
return Stdlib_In_channel[5].call
|
|
(null, filename, function(ic){return caml_md5_chan(ic, -1);});
|
|
}
|
|
function output(chan, digest){return Stdlib[66].call(null, chan, digest);}
|
|
function input(chan){return Stdlib[86].call(null, chan, 16);}
|
|
function to_hex(d){
|
|
if(16 !== caml_ml_string_length(d))
|
|
Stdlib[1].call(null, cst_Digest_to_hex);
|
|
return hex_of_string(d);
|
|
}
|
|
function of_hex(s){
|
|
if(32 !== caml_ml_string_length(s))
|
|
Stdlib[1].call(null, "Digest.from_hex");
|
|
return string_of_hex(s);
|
|
}
|
|
runtime.caml_register_global
|
|
(17,
|
|
[0,
|
|
compare,
|
|
equal,
|
|
string,
|
|
bytes,
|
|
substring,
|
|
subbytes,
|
|
caml_md5_chan,
|
|
file,
|
|
output,
|
|
input,
|
|
to_hex,
|
|
of_hex,
|
|
of_hex,
|
|
BLAKE128,
|
|
BLAKE256,
|
|
BLAKE512,
|
|
[0,
|
|
16,
|
|
compare,
|
|
equal,
|
|
string,
|
|
bytes,
|
|
substring,
|
|
subbytes,
|
|
caml_md5_chan,
|
|
file,
|
|
output,
|
|
input,
|
|
to_hex,
|
|
of_hex]],
|
|
"Stdlib__Digest");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 18123 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Bigarray:[N,N,N,N,N,N,N,N,N,N,N,N,N,N,F(1)*,N,N,N,N,N,N,N,F(1),F(1),F(1),F(1),F(2),F(1),F(2),F(3),F(4)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_ba_change_layout = runtime.caml_ba_change_layout,
|
|
caml_ba_create = runtime.caml_ba_create,
|
|
caml_ba_dim_1 = runtime.caml_ba_dim_1,
|
|
caml_ba_dim_2 = runtime.caml_ba_dim_2,
|
|
caml_ba_kind = runtime.caml_ba_kind,
|
|
caml_ba_num_dims = runtime.caml_ba_num_dims,
|
|
caml_ba_reshape = runtime.caml_ba_reshape,
|
|
caml_ba_set_1 = runtime.caml_ba_set_1,
|
|
caml_ba_set_2 = runtime.caml_ba_set_2,
|
|
caml_ba_set_3 = runtime.caml_ba_set_3,
|
|
caml_ba_set_generic = runtime.caml_ba_set_generic,
|
|
caml_ba_slice = runtime.caml_ba_slice,
|
|
caml_check_bound = runtime.caml_check_bound,
|
|
caml_make_vect = runtime.caml_make_vect,
|
|
caml_mul = runtime.caml_mul;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
function caml_call3(f, a0, a1, a2){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 3
|
|
? f(a0, a1, a2)
|
|
: runtime.caml_call_gen(f, [a0, a1, a2]);
|
|
}
|
|
var
|
|
dummy = 0,
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_Array = global_data.Stdlib__Array,
|
|
Stdlib_Sys = global_data.Stdlib__Sys;
|
|
function kind_size_in_bytes(param){
|
|
switch(param){
|
|
case 11:
|
|
return 16;
|
|
case 0:
|
|
case 6:
|
|
return 4;
|
|
case 8:
|
|
case 9:
|
|
return Stdlib_Sys[9] / 8 | 0;
|
|
case 1:
|
|
case 7:
|
|
case 10:
|
|
return 8;
|
|
case 2:
|
|
case 3:
|
|
case 12:
|
|
return 1;
|
|
default: return 2;
|
|
}
|
|
}
|
|
function cloop(arr, idx, f, col, max){
|
|
if(col === idx.length - 1){
|
|
caml_ba_set_generic(arr, idx, caml_call1(f, idx));
|
|
return;
|
|
}
|
|
var a = caml_check_bound(max, col)[col + 1] - 1 | 0;
|
|
if(a >= 0){
|
|
var j = 0;
|
|
for(;;){
|
|
caml_check_bound(idx, col)[col + 1] = j;
|
|
cloop(arr, idx, f, col + 1 | 0, max);
|
|
var b = j + 1 | 0;
|
|
if(a === j) break;
|
|
j = b;
|
|
}
|
|
}
|
|
}
|
|
function floop(arr, idx, f, col, max){
|
|
if(0 > col){caml_ba_set_generic(arr, idx, caml_call1(f, idx)); return;}
|
|
var a = caml_check_bound(max, col)[col + 1];
|
|
if(a >= 1){
|
|
var j = 1;
|
|
for(;;){
|
|
caml_check_bound(idx, col)[col + 1] = j;
|
|
floop(arr, idx, f, col - 1 | 0, max);
|
|
var b = j + 1 | 0;
|
|
if(a === j) break;
|
|
j = b;
|
|
}
|
|
}
|
|
}
|
|
function init(kind, layout, dims, f){
|
|
var arr = caml_ba_create(kind, layout, dims), dlen = dims.length - 1;
|
|
return layout
|
|
? (floop
|
|
(arr, caml_make_vect(dlen, 1), f, dlen - 1 | 0, dims),
|
|
arr)
|
|
: (cloop(arr, caml_make_vect(dlen, 0), f, 0, dims), arr);
|
|
}
|
|
function dims(a){
|
|
var n = caml_ba_num_dims(a), d = caml_make_vect(n, 0), b = n - 1 | 0;
|
|
if(b >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
var c = runtime.caml_ba_dim(a, i);
|
|
caml_check_bound(d, i)[i + 1] = c;
|
|
var e = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = e;
|
|
}
|
|
}
|
|
return d;
|
|
}
|
|
function size_in_bytes(arr){
|
|
var a = dims(arr), b = Stdlib_Array[18].call(null, caml_mul, 1, a);
|
|
return caml_mul(kind_size_in_bytes(caml_ba_kind(arr)), b);
|
|
}
|
|
function create(kind, layout){return caml_ba_create(kind, layout, [0]);}
|
|
function get(arr){return runtime.caml_ba_get_generic(arr, [0]);}
|
|
function set(arr){
|
|
var a = [0];
|
|
return function(b){return caml_ba_set_generic(arr, a, b);};
|
|
}
|
|
function size_in_bytes$0(arr){
|
|
return kind_size_in_bytes(caml_ba_kind(arr));
|
|
}
|
|
function of_value(kind, layout, v){
|
|
var a = create(kind, layout);
|
|
set(a)(v);
|
|
return a;
|
|
}
|
|
function create$0(kind, layout, dim){
|
|
return caml_ba_create(kind, layout, [0, dim]);
|
|
}
|
|
function size_in_bytes$1(arr){
|
|
var a = caml_ba_dim_1(arr);
|
|
return caml_mul(kind_size_in_bytes(caml_ba_kind(arr)), a);
|
|
}
|
|
function slice(a, n){
|
|
return runtime.caml_ba_layout(a)
|
|
? caml_ba_slice(a, [0, n])
|
|
: caml_ba_slice(a, [0, n]);
|
|
}
|
|
function init$0(kind, layout, dim, f){
|
|
var arr = create$0(kind, layout, dim);
|
|
if(layout){
|
|
if(dim >= 1){
|
|
var i$0 = 1;
|
|
for(;;){
|
|
caml_ba_set_1(arr, i$0, caml_call1(f, i$0));
|
|
var c = i$0 + 1 | 0;
|
|
if(dim === i$0) break;
|
|
i$0 = c;
|
|
}
|
|
}
|
|
return arr;
|
|
}
|
|
var a = dim - 1 | 0;
|
|
if(a >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
caml_ba_set_1(arr, i, caml_call1(f, i));
|
|
var b = i + 1 | 0;
|
|
if(a === i) break;
|
|
i = b;
|
|
}
|
|
}
|
|
return arr;
|
|
}
|
|
function of_array(kind, layout, data){
|
|
var
|
|
ba = create$0(kind, layout, data.length - 1),
|
|
ofs = layout ? 1 : 0,
|
|
a = data.length - 2 | 0;
|
|
if(a >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
caml_ba_set_1(ba, i + ofs | 0, caml_check_bound(data, i)[i + 1]);
|
|
var b = i + 1 | 0;
|
|
if(a === i) break;
|
|
i = b;
|
|
}
|
|
}
|
|
return ba;
|
|
}
|
|
function create$1(kind, layout, dim1, dim2){
|
|
return caml_ba_create(kind, layout, [0, dim1, dim2]);
|
|
}
|
|
function size_in_bytes$2(arr){
|
|
var a = caml_ba_dim_2(arr), b = caml_ba_dim_1(arr);
|
|
return caml_mul(caml_mul(kind_size_in_bytes(caml_ba_kind(arr)), b), a);
|
|
}
|
|
function slice_left(a, n){return caml_ba_slice(a, [0, n]);}
|
|
function slice_right(a, n){return caml_ba_slice(a, [0, n]);}
|
|
function init$1(kind, layout, dim1, dim2, f){
|
|
var arr = create$1(kind, layout, dim1, dim2);
|
|
if(layout){
|
|
if(dim2 >= 1){
|
|
var j$0 = 1;
|
|
for(;;){
|
|
if(dim1 >= 1){
|
|
var i$0 = 1;
|
|
for(;;){
|
|
caml_ba_set_2(arr, i$0, j$0, caml_call2(f, i$0, j$0));
|
|
var g = i$0 + 1 | 0;
|
|
if(dim1 === i$0) break;
|
|
i$0 = g;
|
|
}
|
|
}
|
|
var e = j$0 + 1 | 0;
|
|
if(dim2 === j$0) break;
|
|
j$0 = e;
|
|
}
|
|
}
|
|
return arr;
|
|
}
|
|
var a = dim1 - 1 | 0;
|
|
if(a >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
var b = dim2 - 1 | 0;
|
|
if(b >= 0){
|
|
var j = 0;
|
|
for(;;){
|
|
caml_ba_set_2(arr, i, j, caml_call2(f, i, j));
|
|
var d = j + 1 | 0;
|
|
if(b === j) break;
|
|
j = d;
|
|
}
|
|
}
|
|
var c = i + 1 | 0;
|
|
if(a === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return arr;
|
|
}
|
|
function of_array$0(kind, layout, data){
|
|
var
|
|
dim1 = data.length - 1,
|
|
dim2 = 0 === dim1 ? 0 : caml_check_bound(data, 0)[1].length - 1,
|
|
ba = create$1(kind, layout, dim1, dim2),
|
|
ofs = layout ? 1 : 0,
|
|
a = dim1 - 1 | 0;
|
|
if(a >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
var row = caml_check_bound(data, i)[i + 1];
|
|
if(row.length - 1 !== dim2)
|
|
Stdlib[1].call(null, "Bigarray.Array2.of_array: non-rectangular data");
|
|
var b = dim2 - 1 | 0;
|
|
if(b >= 0){
|
|
var j = 0;
|
|
for(;;){
|
|
caml_ba_set_2
|
|
(ba, i + ofs | 0, j + ofs | 0, caml_check_bound(row, j)[j + 1]);
|
|
var d = j + 1 | 0;
|
|
if(b === j) break;
|
|
j = d;
|
|
}
|
|
}
|
|
var c = i + 1 | 0;
|
|
if(a === i) break;
|
|
i = c;
|
|
}
|
|
}
|
|
return ba;
|
|
}
|
|
function create$2(kind, layout, dim1, dim2, dim3){
|
|
return caml_ba_create(kind, layout, [0, dim1, dim2, dim3]);
|
|
}
|
|
function size_in_bytes$3(arr){
|
|
var
|
|
a = runtime.caml_ba_dim_3(arr),
|
|
b = caml_ba_dim_2(arr),
|
|
c = caml_ba_dim_1(arr);
|
|
return caml_mul
|
|
(caml_mul(caml_mul(kind_size_in_bytes(caml_ba_kind(arr)), c), b),
|
|
a);
|
|
}
|
|
function slice_left_1(a, n, m){return caml_ba_slice(a, [0, n, m]);}
|
|
function slice_right_1(a, n, m){return caml_ba_slice(a, [0, n, m]);}
|
|
function slice_left_2(a, n){return caml_ba_slice(a, [0, n]);}
|
|
function slice_right_2(a, n){return caml_ba_slice(a, [0, n]);}
|
|
function init$2(kind, layout, dim1, dim2, dim3, f){
|
|
var arr = create$2(kind, layout, dim1, dim2, dim3);
|
|
if(layout){
|
|
if(dim3 >= 1){
|
|
var k$0 = 1;
|
|
for(;;){
|
|
if(dim2 >= 1){
|
|
var j$0 = 1;
|
|
for(;;){
|
|
if(dim1 >= 1){
|
|
var i$0 = 1;
|
|
for(;;){
|
|
caml_ba_set_3(arr, i$0, j$0, k$0, caml_call3(f, i$0, j$0, k$0));
|
|
var m = i$0 + 1 | 0;
|
|
if(dim1 === i$0) break;
|
|
i$0 = m;
|
|
}
|
|
}
|
|
var l = j$0 + 1 | 0;
|
|
if(dim2 === j$0) break;
|
|
j$0 = l;
|
|
}
|
|
}
|
|
var h = k$0 + 1 | 0;
|
|
if(dim3 === k$0) break;
|
|
k$0 = h;
|
|
}
|
|
}
|
|
return arr;
|
|
}
|
|
var a = dim1 - 1 | 0;
|
|
if(a >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
var b = dim2 - 1 | 0;
|
|
if(b >= 0){
|
|
var j = 0;
|
|
for(;;){
|
|
var c = dim3 - 1 | 0;
|
|
if(c >= 0){
|
|
var k = 0;
|
|
for(;;){
|
|
caml_ba_set_3(arr, i, j, k, caml_call3(f, i, j, k));
|
|
var g = k + 1 | 0;
|
|
if(c === k) break;
|
|
k = g;
|
|
}
|
|
}
|
|
var e = j + 1 | 0;
|
|
if(b === j) break;
|
|
j = e;
|
|
}
|
|
}
|
|
var d = i + 1 | 0;
|
|
if(a === i) break;
|
|
i = d;
|
|
}
|
|
}
|
|
return arr;
|
|
}
|
|
function of_array$1(kind, layout, data){
|
|
var
|
|
dim1 = data.length - 1,
|
|
dim2 = 0 === dim1 ? 0 : caml_check_bound(data, 0)[1].length - 1,
|
|
dim3 =
|
|
0 === dim2
|
|
? 0
|
|
: caml_check_bound(caml_check_bound(data, 0)[1], 0)[1].length - 1,
|
|
ba = create$2(kind, layout, dim1, dim2, dim3),
|
|
ofs = layout ? 1 : 0,
|
|
a = dim1 - 1 | 0;
|
|
if(a >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
var
|
|
row = caml_check_bound(data, i)[i + 1],
|
|
cst_Bigarray_Array3_of_array_n =
|
|
"Bigarray.Array3.of_array: non-cubic data";
|
|
if(row.length - 1 !== dim2)
|
|
Stdlib[1].call(null, cst_Bigarray_Array3_of_array_n);
|
|
var b = dim2 - 1 | 0;
|
|
if(b >= 0){
|
|
var j = 0;
|
|
for(;;){
|
|
var col = caml_check_bound(row, j)[j + 1];
|
|
if(col.length - 1 !== dim3)
|
|
Stdlib[1].call(null, cst_Bigarray_Array3_of_array_n);
|
|
var c = dim3 - 1 | 0;
|
|
if(c >= 0){
|
|
var k = 0;
|
|
for(;;){
|
|
caml_ba_set_3
|
|
(ba,
|
|
i + ofs | 0,
|
|
j + ofs | 0,
|
|
k + ofs | 0,
|
|
caml_check_bound(col, k)[k + 1]);
|
|
var f = k + 1 | 0;
|
|
if(c === k) break;
|
|
k = f;
|
|
}
|
|
}
|
|
var e = j + 1 | 0;
|
|
if(b === j) break;
|
|
j = e;
|
|
}
|
|
}
|
|
var d = i + 1 | 0;
|
|
if(a === i) break;
|
|
i = d;
|
|
}
|
|
}
|
|
return ba;
|
|
}
|
|
function array0_of_genarray(a){
|
|
return 0 === caml_ba_num_dims(a)
|
|
? a
|
|
: Stdlib[1].call(null, "Bigarray.array0_of_genarray");
|
|
}
|
|
function array1_of_genarray(a){
|
|
return 1 === caml_ba_num_dims(a)
|
|
? a
|
|
: Stdlib[1].call(null, "Bigarray.array1_of_genarray");
|
|
}
|
|
function array2_of_genarray(a){
|
|
return 2 === caml_ba_num_dims(a)
|
|
? a
|
|
: Stdlib[1].call(null, "Bigarray.array2_of_genarray");
|
|
}
|
|
function array3_of_genarray(a){
|
|
return 3 === caml_ba_num_dims(a)
|
|
? a
|
|
: Stdlib[1].call(null, "Bigarray.array3_of_genarray");
|
|
}
|
|
function reshape_0(a){return caml_ba_reshape(a, [0]);}
|
|
function reshape_1(a, dim1){return caml_ba_reshape(a, [0, dim1]);}
|
|
function reshape_2(a, dim1, dim2){
|
|
return caml_ba_reshape(a, [0, dim1, dim2]);
|
|
}
|
|
function reshape_3(a, dim1, dim2, dim3){
|
|
return caml_ba_reshape(a, [0, dim1, dim2, dim3]);
|
|
}
|
|
runtime.caml_register_global
|
|
(10,
|
|
[0,
|
|
13,
|
|
0,
|
|
1,
|
|
10,
|
|
11,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
8,
|
|
6,
|
|
7,
|
|
9,
|
|
12,
|
|
kind_size_in_bytes,
|
|
0,
|
|
1,
|
|
[0, init, dims, size_in_bytes],
|
|
[0,
|
|
create,
|
|
of_value,
|
|
caml_ba_change_layout,
|
|
size_in_bytes$0,
|
|
get,
|
|
set,
|
|
of_value],
|
|
[0,
|
|
create$0,
|
|
init$0,
|
|
caml_ba_change_layout,
|
|
size_in_bytes$1,
|
|
slice,
|
|
of_array],
|
|
[0,
|
|
create$1,
|
|
init$1,
|
|
caml_ba_change_layout,
|
|
size_in_bytes$2,
|
|
slice_left,
|
|
slice_right,
|
|
of_array$0],
|
|
[0,
|
|
create$2,
|
|
init$2,
|
|
caml_ba_change_layout,
|
|
size_in_bytes$3,
|
|
slice_left_1,
|
|
slice_right_1,
|
|
slice_left_2,
|
|
slice_right_2,
|
|
of_array$1],
|
|
array0_of_genarray,
|
|
array1_of_genarray,
|
|
array2_of_genarray,
|
|
array3_of_genarray,
|
|
caml_ba_reshape,
|
|
reshape_0,
|
|
reshape_1,
|
|
reshape_2,
|
|
reshape_3],
|
|
"Stdlib__Bigarray");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 18622 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Random:[F(1),F(1),F(1),F(1),F(1),F(1),F(2),F(1),F(2),F(1),F(2),F(1),F(2),F(1),F(1),F(1),F(1),F(1),N,F(1),F(1),F(1)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_ba_blit = runtime.caml_ba_blit,
|
|
caml_ba_set_1 = runtime.caml_ba_set_1,
|
|
caml_bytes_set = runtime.caml_bytes_set,
|
|
caml_create_bytes = runtime.caml_create_bytes,
|
|
caml_greaterthan = runtime.caml_greaterthan,
|
|
caml_int64_add = runtime.caml_int64_add,
|
|
caml_int64_create_lo_mi_hi = runtime.caml_int64_create_lo_mi_hi,
|
|
caml_int64_of_int32 = runtime.caml_int64_of_int32,
|
|
caml_int64_shift_right_unsigne = runtime.caml_int64_shift_right_unsigned,
|
|
caml_int64_sub = runtime.caml_int64_sub,
|
|
caml_int64_to_int32 = runtime.caml_int64_to_int32,
|
|
caml_lessequal = runtime.caml_lessequal,
|
|
caml_lessthan = runtime.caml_lessthan,
|
|
caml_lxm_next = runtime.caml_lxm_next,
|
|
caml_mod = runtime.caml_mod,
|
|
caml_notequal = runtime.caml_notequal,
|
|
caml_sys_random_seed = runtime.caml_sys_random_seed;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
function caml_call3(f, a0, a1, a2){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 3
|
|
? f(a0, a1, a2)
|
|
: runtime.caml_call_gen(f, [a0, a1, a2]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib_Domain = global_data.Stdlib__Domain,
|
|
Stdlib_Sys = global_data.Stdlib__Sys,
|
|
Stdlib_Int32 = global_data.Stdlib__Int32,
|
|
Stdlib_Int64 = global_data.Stdlib__Int64,
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_Bytes = global_data.Stdlib__Bytes,
|
|
Stdlib_Digest = global_data.Stdlib__Digest,
|
|
Stdlib_String = global_data.Stdlib__String,
|
|
Stdlib_Bigarray = global_data.Stdlib__Bigarray,
|
|
Stdlib_Nativeint = global_data.Stdlib__Nativeint,
|
|
a = caml_int64_create_lo_mi_hi(1, 0, 0),
|
|
b = caml_int64_create_lo_mi_hi(0, 0, 0),
|
|
c = caml_int64_create_lo_mi_hi(0, 0, 0),
|
|
d = caml_int64_create_lo_mi_hi(2, 0, 0),
|
|
e = caml_int64_create_lo_mi_hi(1, 0, 0);
|
|
function create(param){return caml_call3(Stdlib_Bigarray[20][1], 7, 0, 4);}
|
|
function set(s, i1, i2, i3, i4){
|
|
caml_ba_set_1(s, 0, runtime.caml_int64_or(i1, a));
|
|
caml_ba_set_1(s, 1, i2);
|
|
var i3$0 = caml_notequal(i3, b) ? i3 : e;
|
|
caml_ba_set_1(s, 2, i3$0);
|
|
var i4$0 = caml_notequal(i4, c) ? i4 : d;
|
|
return caml_ba_set_1(s, 3, i4$0);
|
|
}
|
|
function mk(i1, i2, i3, i4){
|
|
var s = create(0);
|
|
set(s, i1, i2, i3, i4);
|
|
return s;
|
|
}
|
|
var serialization_prefix = "lxm1:";
|
|
function to_binary_string(s){
|
|
var buf = caml_create_bytes(37);
|
|
Stdlib_Bytes[12].call(null, serialization_prefix, 0, buf, 0, 5);
|
|
var i = 0;
|
|
for(;;){
|
|
var a = runtime.caml_ba_get_1(s, i);
|
|
Stdlib_Bytes[86].call(null, buf, 5 + (i * 8 | 0) | 0, a);
|
|
var b = i + 1 | 0;
|
|
if(3 === i) return Stdlib_Bytes[44].call(null, buf);
|
|
i = b;
|
|
}
|
|
}
|
|
function of_binary_string(buf){
|
|
var
|
|
a = runtime.caml_ml_string_length(buf) !== 37,
|
|
b = a || 1 - Stdlib_String[11].call(null, serialization_prefix, buf);
|
|
if(b){
|
|
var
|
|
c =
|
|
Stdlib[28].call
|
|
(null,
|
|
"Random.State.of_binary_string: expected a format compatible with OCaml ",
|
|
Stdlib_Sys[46]);
|
|
Stdlib[2].call(null, c);
|
|
}
|
|
var
|
|
i1 = Stdlib_String[64].call(null, buf, 5),
|
|
i2 = Stdlib_String[64].call(null, buf, 13),
|
|
i3 = Stdlib_String[64].call(null, buf, 21),
|
|
i4 = Stdlib_String[64].call(null, buf, 29);
|
|
return mk(i1, i2, i3, i4);
|
|
}
|
|
function copy(src){
|
|
var dst = create(0);
|
|
caml_ba_blit(src, dst);
|
|
return dst;
|
|
}
|
|
function reinit(s, seed){
|
|
var
|
|
n = seed.length - 1,
|
|
b = caml_create_bytes((n * 8 | 0) + 1 | 0),
|
|
a = n - 1 | 0;
|
|
if(a >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
var f = caml_int64_of_int32(runtime.caml_check_bound(seed, i)[i + 1]);
|
|
Stdlib_Bytes[86].call(null, b, i * 8 | 0, f);
|
|
var g = i + 1 | 0;
|
|
if(a === i) break;
|
|
i = g;
|
|
}
|
|
}
|
|
caml_bytes_set(b, n * 8 | 0, 1);
|
|
var d1 = Stdlib_Digest[4].call(null, b);
|
|
caml_bytes_set(b, n * 8 | 0, 2);
|
|
var
|
|
d2 = Stdlib_Digest[4].call(null, b),
|
|
c = Stdlib_String[64].call(null, d2, 8),
|
|
d = Stdlib_String[64].call(null, d2, 0),
|
|
e = Stdlib_String[64].call(null, d1, 8);
|
|
return set(s, Stdlib_String[64].call(null, d1, 0), e, d, c);
|
|
}
|
|
function make(seed){var s = create(0); reinit(s, seed); return s;}
|
|
function make_self_init(param){return make(caml_sys_random_seed(0));}
|
|
function bits(s){
|
|
return caml_int64_to_int32(caml_lxm_next(s)) & 1073741823;
|
|
}
|
|
function int_aux(s, n, mask){
|
|
for(;;){
|
|
var r = caml_int64_to_int32(caml_lxm_next(s)) & mask, v = caml_mod(r, n);
|
|
if(((mask - n | 0) + 1 | 0) >= (r - v | 0)) return v;
|
|
}
|
|
}
|
|
var max_int31 = 1073741823;
|
|
function int(s, bound){
|
|
if(1073741823 >= bound && 0 < bound) return int_aux(s, bound, max_int31);
|
|
return Stdlib[1].call(null, "Random.int");
|
|
}
|
|
var max_int32 = 2147483647;
|
|
function full_int(s, bound){
|
|
if(0 >= bound) return Stdlib[1].call(null, "Random.full_int");
|
|
var
|
|
a =
|
|
bound <= 1073741823
|
|
? max_int31
|
|
: bound <= 2147483647 ? max_int32 : Stdlib[19];
|
|
return int_aux(s, bound, a);
|
|
}
|
|
function int_in_range_aux(s, min, max, mask, nbits){
|
|
var span = (max - min | 0) + 1 | 0;
|
|
if(span <= mask && 0 < span) return min + int_aux(s, span, mask) | 0;
|
|
for(;;){
|
|
var
|
|
drop = Stdlib_Sys[10] - nbits | 0,
|
|
r = caml_int64_to_int32(caml_lxm_next(s)) << drop >> drop;
|
|
if(r >= min && max >= r) return r;
|
|
}
|
|
}
|
|
function int_in_range(s, min, max){
|
|
if(max < min) Stdlib[1].call(null, "Random.int_in_range");
|
|
if(-1073741824 <= min && max <= 1073741823)
|
|
return int_in_range_aux(s, min, max, max_int31, 31);
|
|
if(-2147483648 <= min && max <= 2147483647)
|
|
return int_in_range_aux(s, min, max, max_int32, 32);
|
|
return int_in_range_aux(s, min, max, Stdlib[19], Stdlib_Sys[10]);
|
|
}
|
|
function bits32(s){return caml_int64_to_int32(caml_lxm_next(s));}
|
|
function int32aux(s, n){
|
|
for(;;){
|
|
var r = bits32(s) >>> 1 | 0, v = caml_mod(r, n);
|
|
if(! caml_greaterthan(r - v | 0, (Stdlib_Int32[9] - n | 0) + 1 | 0))
|
|
return v;
|
|
}
|
|
}
|
|
function int32(s, bound){
|
|
return caml_lessequal(bound, 0)
|
|
? Stdlib[1].call(null, "Random.int32")
|
|
: int32aux(s, bound);
|
|
}
|
|
function int32_in_range(s, min, max){
|
|
if(caml_greaterthan(min, max))
|
|
return Stdlib[1].call(null, "Random.int32_in_range");
|
|
var span = Stdlib_Int32[6].call(null, max - min | 0);
|
|
if(! caml_lessequal(span, Stdlib_Int32[1]))
|
|
return min + int32aux(s, span) | 0;
|
|
for(;;){
|
|
var r = caml_int64_to_int32(caml_lxm_next(s));
|
|
if(! caml_lessthan(r, min) && ! caml_greaterthan(r, max)) return r;
|
|
}
|
|
}
|
|
var
|
|
f = caml_int64_create_lo_mi_hi(1, 0, 0),
|
|
g = caml_int64_create_lo_mi_hi(0, 0, 0);
|
|
function int64aux(s, n){
|
|
for(;;){
|
|
var
|
|
r = caml_int64_shift_right_unsigne(caml_lxm_next(s), 1),
|
|
v = runtime.caml_int64_mod(r, n);
|
|
if
|
|
(!
|
|
caml_greaterthan
|
|
(caml_int64_sub(r, v),
|
|
caml_int64_add(caml_int64_sub(Stdlib_Int64[9], n), f)))
|
|
return v;
|
|
}
|
|
}
|
|
function int64(s, bound){
|
|
return caml_lessequal(bound, g)
|
|
? Stdlib[1].call(null, "Random.int64")
|
|
: int64aux(s, bound);
|
|
}
|
|
function int64_in_range(s, min, max){
|
|
if(caml_greaterthan(min, max))
|
|
return Stdlib[1].call(null, "Random.int64_in_range");
|
|
var span = Stdlib_Int64[6].call(null, caml_int64_sub(max, min));
|
|
if(! caml_lessequal(span, Stdlib_Int64[1]))
|
|
return caml_int64_add(min, int64aux(s, span));
|
|
for(;;){
|
|
var r = caml_lxm_next(s);
|
|
if(! caml_lessthan(r, min) && ! caml_greaterthan(r, max)) return r;
|
|
}
|
|
}
|
|
var
|
|
j = caml_int64_create_lo_mi_hi(14371852, 15349651, 22696),
|
|
k = caml_int64_create_lo_mi_hi(12230193, 11438743, 35013),
|
|
l = caml_int64_create_lo_mi_hi(1424933, 15549263, 2083),
|
|
m = caml_int64_create_lo_mi_hi(9492471, 4696708, 43520),
|
|
h = caml_int64_create_lo_mi_hi(0, 0, 0),
|
|
i = caml_int64_create_lo_mi_hi(0, 0, 0),
|
|
nativebits =
|
|
32 === Stdlib_Nativeint[9]
|
|
? function(s){return bits32(s);}
|
|
: function(s){return caml_int64_to_int32(caml_lxm_next(s));},
|
|
nativeint =
|
|
32 === Stdlib_Nativeint[9]
|
|
? function(s, bound){return int32(s, bound);}
|
|
: function
|
|
(s, bound){
|
|
return caml_int64_to_int32(int64(s, caml_int64_of_int32(bound)));
|
|
},
|
|
nativeint_in_range =
|
|
32 === Stdlib_Nativeint[9]
|
|
? function(s, min, max){return int32_in_range(s, min, max);}
|
|
: function
|
|
(s, min, max){
|
|
return caml_int64_to_int32
|
|
(int64_in_range
|
|
(s, caml_int64_of_int32(min), caml_int64_of_int32(max)));
|
|
};
|
|
function float(s, bound){
|
|
for(;;){
|
|
var b = caml_lxm_next(s), n = caml_int64_shift_right_unsigne(b, 11);
|
|
if(caml_notequal(n, h))
|
|
return runtime.caml_int64_to_float(n) * 1.1102230246251565e-16 * bound;
|
|
}
|
|
}
|
|
function bool(s){return caml_lessthan(caml_lxm_next(s), i);}
|
|
function split(s){
|
|
var
|
|
i1 = caml_lxm_next(s),
|
|
i2 = caml_lxm_next(s),
|
|
i3 = caml_lxm_next(s),
|
|
i4 = caml_lxm_next(s);
|
|
return mk(i1, i2, i3, i4);
|
|
}
|
|
function mk_default(param){return mk(m, l, k, j);}
|
|
var random_key = caml_call2(Stdlib_Domain[10][1], [0, split], mk_default);
|
|
function bits$0(param){
|
|
return bits(caml_call1(Stdlib_Domain[10][2], random_key));
|
|
}
|
|
function int$0(bound){
|
|
return int(caml_call1(Stdlib_Domain[10][2], random_key), bound);
|
|
}
|
|
function full_int$0(bound){
|
|
return full_int(caml_call1(Stdlib_Domain[10][2], random_key), bound);
|
|
}
|
|
function int_in_range$0(min, max){
|
|
return int_in_range
|
|
(caml_call1(Stdlib_Domain[10][2], random_key), min, max);
|
|
}
|
|
function int32$0(bound){
|
|
return int32(caml_call1(Stdlib_Domain[10][2], random_key), bound);
|
|
}
|
|
function int32_in_range$0(min, max){
|
|
return int32_in_range
|
|
(caml_call1(Stdlib_Domain[10][2], random_key), min, max);
|
|
}
|
|
function nativeint$0(bound){
|
|
return nativeint(caml_call1(Stdlib_Domain[10][2], random_key), bound);
|
|
}
|
|
function nativeint_in_range$0(min, max){
|
|
return nativeint_in_range
|
|
(caml_call1(Stdlib_Domain[10][2], random_key), min, max);
|
|
}
|
|
function int64$0(bound){
|
|
return int64(caml_call1(Stdlib_Domain[10][2], random_key), bound);
|
|
}
|
|
function int64_in_range$0(min, max){
|
|
return int64_in_range
|
|
(caml_call1(Stdlib_Domain[10][2], random_key), min, max);
|
|
}
|
|
function float$0(scale){
|
|
return float(caml_call1(Stdlib_Domain[10][2], random_key), scale);
|
|
}
|
|
function bool$0(param){
|
|
return bool(caml_call1(Stdlib_Domain[10][2], random_key));
|
|
}
|
|
function bits32$0(param){
|
|
return bits32(caml_call1(Stdlib_Domain[10][2], random_key));
|
|
}
|
|
function bits64(param){
|
|
var s = caml_call1(Stdlib_Domain[10][2], random_key);
|
|
return caml_lxm_next(s);
|
|
}
|
|
function nativebits$0(param){
|
|
return nativebits(caml_call1(Stdlib_Domain[10][2], random_key));
|
|
}
|
|
function full_init(seed){
|
|
return reinit(caml_call1(Stdlib_Domain[10][2], random_key), seed);
|
|
}
|
|
function init(seed){return full_init([0, seed]);}
|
|
function self_init(param){return full_init(caml_sys_random_seed(0));}
|
|
function split$0(param){
|
|
return split(caml_call1(Stdlib_Domain[10][2], random_key));
|
|
}
|
|
function get_state(param){
|
|
return copy(caml_call1(Stdlib_Domain[10][2], random_key));
|
|
}
|
|
function set_state(src){
|
|
var dst = caml_call1(Stdlib_Domain[10][2], random_key);
|
|
return caml_ba_blit(src, dst);
|
|
}
|
|
runtime.caml_register_global
|
|
(35,
|
|
[0,
|
|
init,
|
|
full_init,
|
|
self_init,
|
|
bits$0,
|
|
int$0,
|
|
full_int$0,
|
|
int_in_range$0,
|
|
int32$0,
|
|
int32_in_range$0,
|
|
nativeint$0,
|
|
nativeint_in_range$0,
|
|
int64$0,
|
|
int64_in_range$0,
|
|
float$0,
|
|
bool$0,
|
|
bits32$0,
|
|
bits64,
|
|
nativebits$0,
|
|
[0,
|
|
make,
|
|
make_self_init,
|
|
copy,
|
|
bits,
|
|
int,
|
|
full_int,
|
|
int_in_range,
|
|
int32,
|
|
int32_in_range,
|
|
nativeint,
|
|
nativeint_in_range,
|
|
int64,
|
|
int64_in_range,
|
|
float,
|
|
bool,
|
|
bits32,
|
|
caml_lxm_next,
|
|
nativebits,
|
|
split,
|
|
to_binary_string,
|
|
of_binary_string],
|
|
get_state,
|
|
set_state,
|
|
split$0],
|
|
"Stdlib__Random");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 19017 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Hashtbl:[F(2),F(1),F(1),F(1),F(3),F(2),F(2),F(2),F(2),F(2),F(3),F(2),F(2),F(3),F(1)*,F(1),F(1),F(2),F(1),F(1)*->F(1),F(1)*->F(1),F(1)*->F(1),F(2),F(2),F(1),F(1)*,F(1)*,F(1)*,F(2)*,F(3)*,F(4)*]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_check_bound = runtime.caml_check_bound,
|
|
caml_compare = runtime.caml_compare,
|
|
caml_hash = runtime.caml_hash,
|
|
caml_make_vect = runtime.caml_make_vect,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_sys_getenv = runtime.caml_sys_getenv,
|
|
caml_wrap_exception = runtime.caml_wrap_exception;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
function caml_call3(f, a0, a1, a2){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 3
|
|
? f(a0, a1, a2)
|
|
: runtime.caml_call_gen(f, [a0, a1, a2]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib_Sys = global_data.Stdlib__Sys,
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_Atomic = global_data.Stdlib__Atomic,
|
|
Stdlib_Domain = global_data.Stdlib__Domain,
|
|
Stdlib_Random = global_data.Stdlib__Random,
|
|
Stdlib_Seq = global_data.Stdlib__Seq,
|
|
Stdlib_Int = global_data.Stdlib__Int,
|
|
Stdlib_Array = global_data.Stdlib__Array;
|
|
global_data.Assert_failure;
|
|
var Stdlib_String = global_data.Stdlib__String;
|
|
function ongoing_traversal(h){
|
|
var a = h.length - 1 < 4 ? 1 : 0, b = a || (h[4] < 0 ? 1 : 0);
|
|
return b;
|
|
}
|
|
function flip_ongoing_traversal(h){h[4] = - h[4] | 0; return 0;}
|
|
try{var c = caml_sys_getenv("OCAMLRUNPARAM"), params = c;}
|
|
catch(exn$1){
|
|
var exn = caml_wrap_exception(exn$1);
|
|
if(exn !== Stdlib[8]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
try{var b = caml_sys_getenv("CAMLRUNPARAM"), params = b;}
|
|
catch(exn){
|
|
var exn$0 = caml_wrap_exception(exn);
|
|
if(exn$0 !== Stdlib[8]) throw caml_maybe_attach_backtrace(exn$0, 0);
|
|
var params = "";
|
|
}
|
|
}
|
|
var
|
|
randomized_default = Stdlib_String[15].call(null, params, 82),
|
|
randomized = Stdlib_Atomic[1].call(null, randomized_default);
|
|
function randomize(param){
|
|
return Stdlib_Atomic[4].call(null, randomized, 1);
|
|
}
|
|
function is_randomized(param){
|
|
return Stdlib_Atomic[3].call(null, randomized);
|
|
}
|
|
var prng_key = caml_call2(Stdlib_Domain[10][1], 0, Stdlib_Random[19][2]);
|
|
function power_2_above(x$1, n){
|
|
var x = x$1;
|
|
for(;;){
|
|
if(n <= x) return x;
|
|
if(Stdlib_Sys[13] < (x * 2 | 0)) return x;
|
|
var x$0 = x * 2 | 0;
|
|
x = x$0;
|
|
}
|
|
}
|
|
function create(opt, initial_size){
|
|
var
|
|
random = opt ? opt[1] : Stdlib_Atomic[3].call(null, randomized),
|
|
s = power_2_above(16, initial_size);
|
|
if(random)
|
|
var
|
|
a = caml_call1(Stdlib_Domain[10][2], prng_key),
|
|
seed = caml_call1(Stdlib_Random[19][4], a);
|
|
else
|
|
var seed = 0;
|
|
return [0, 0, caml_make_vect(s, 0), seed, s];
|
|
}
|
|
function clear(h){
|
|
var a = 0 < h[1] ? 1 : 0;
|
|
return a
|
|
? (h
|
|
[1]
|
|
= 0,
|
|
Stdlib_Array[8].call(null, h[2], 0, h[2].length - 1, 0))
|
|
: a;
|
|
}
|
|
function reset(h){
|
|
var len = h[2].length - 1;
|
|
if(4 <= h.length - 1 && len !== Stdlib[18].call(null, h[4])){
|
|
h[1] = 0;
|
|
h[2] = caml_make_vect(Stdlib[18].call(null, h[4]), 0);
|
|
return 0;
|
|
}
|
|
return clear(h);
|
|
}
|
|
function copy_bucketlist(param){
|
|
if(! param) return 0;
|
|
var
|
|
key = param[1],
|
|
data = param[2],
|
|
next = param[3],
|
|
prec$1 = [0, key, data, next],
|
|
prec = prec$1,
|
|
param$0 = next;
|
|
for(;;){
|
|
if(! param$0) return prec$1;
|
|
var
|
|
key$0 = param$0[1],
|
|
data$0 = param$0[2],
|
|
next$0 = param$0[3],
|
|
prec$0 = [0, key$0, data$0, next$0];
|
|
prec[3] = prec$0;
|
|
prec = prec$0;
|
|
param$0 = next$0;
|
|
}
|
|
}
|
|
function copy(h){
|
|
var
|
|
a = h[4],
|
|
b = h[3],
|
|
c = Stdlib_Array[14].call(null, copy_bucketlist, h[2]);
|
|
return [0, h[1], c, b, a];
|
|
}
|
|
function length(h){return h[1];}
|
|
function insert_all_buckets(indexfun, inplace, odata, ndata){
|
|
var
|
|
nsize = ndata.length - 1,
|
|
ndata_tail = caml_make_vect(nsize, 0),
|
|
a = odata.length - 2 | 0;
|
|
if(a >= 0){
|
|
var i$0 = 0;
|
|
a:
|
|
for(;;){
|
|
var cell$1 = caml_check_bound(odata, i$0)[i$0 + 1], cell = cell$1;
|
|
for(;;){
|
|
if(! cell){var e = i$0 + 1 | 0; if(a === i$0) break a; i$0 = e; break;}
|
|
var
|
|
key = cell[1],
|
|
data = cell[2],
|
|
next = cell[3],
|
|
cell$0 = inplace ? cell : [0, key, data, 0],
|
|
nidx = caml_call1(indexfun, key),
|
|
match = caml_check_bound(ndata_tail, nidx)[nidx + 1];
|
|
if(match)
|
|
match[3] = cell$0;
|
|
else
|
|
caml_check_bound(ndata, nidx)[nidx + 1] = cell$0;
|
|
caml_check_bound(ndata_tail, nidx)[nidx + 1] = cell$0;
|
|
cell = next;
|
|
}
|
|
}
|
|
}
|
|
if(inplace){
|
|
var b = nsize - 1 | 0;
|
|
if(b >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
var match$0 = caml_check_bound(ndata_tail, i)[i + 1];
|
|
if(match$0) match$0[3] = 0;
|
|
var d = i + 1 | 0;
|
|
if(b === i) break;
|
|
i = d;
|
|
}
|
|
}
|
|
var c = 0;
|
|
}
|
|
else
|
|
var c = inplace;
|
|
return c;
|
|
}
|
|
function resize(indexfun, h){
|
|
var
|
|
odata = h[2],
|
|
osize = odata.length - 1,
|
|
nsize = osize * 2 | 0,
|
|
a = nsize < Stdlib_Sys[13] ? 1 : 0;
|
|
if(! a) return a;
|
|
var ndata = caml_make_vect(nsize, 0), inplace = 1 - ongoing_traversal(h);
|
|
h[2] = ndata;
|
|
return insert_all_buckets(caml_call1(indexfun, h), inplace, odata, ndata);
|
|
}
|
|
function iter(f, h){
|
|
var old_trav = ongoing_traversal(h);
|
|
if(1 - old_trav) flip_ongoing_traversal(h);
|
|
try{
|
|
var d = h[2], a = d.length - 2 | 0;
|
|
if(a >= 0){
|
|
var i = 0;
|
|
a:
|
|
for(;;){
|
|
var param = caml_check_bound(d, i)[i + 1];
|
|
for(;;){
|
|
if(! param){var e = i + 1 | 0; if(a === i) break a; i = e; break;}
|
|
var key = param[1], data = param[2], next = param[3];
|
|
caml_call2(f, key, data);
|
|
param = next;
|
|
}
|
|
}
|
|
}
|
|
var b = 1 - old_trav, c = b ? flip_ongoing_traversal(h) : b;
|
|
return c;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(old_trav) throw caml_maybe_attach_backtrace(exn, 0);
|
|
flip_ongoing_traversal(h);
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
}
|
|
function filter_map_inplace(f, h){
|
|
var d = h[2], old_trav = ongoing_traversal(h);
|
|
if(1 - old_trav) flip_ongoing_traversal(h);
|
|
try{
|
|
var a = d.length - 2 | 0;
|
|
if(a >= 0){
|
|
var i = 0;
|
|
a:
|
|
for(;;){
|
|
var slot$0 = caml_check_bound(h[2], i)[i + 1], prec = 0, slot = slot$0;
|
|
for(;;){
|
|
if(! slot){
|
|
if(prec) prec[3] = 0; else caml_check_bound(h[2], i)[i + 1] = 0;
|
|
var e = i + 1 | 0;
|
|
if(a === i) break a;
|
|
i = e;
|
|
break;
|
|
}
|
|
var
|
|
key = slot[1],
|
|
data = slot[2],
|
|
next = slot[3],
|
|
match = caml_call2(f, key, data);
|
|
if(match){
|
|
var data$0 = match[1];
|
|
if(prec)
|
|
prec[3] = slot;
|
|
else
|
|
caml_check_bound(h[2], i)[i + 1] = slot;
|
|
slot[2] = data$0;
|
|
prec = slot;
|
|
slot = next;
|
|
}
|
|
else{h[1] = h[1] - 1 | 0; slot = next;}
|
|
}
|
|
}
|
|
}
|
|
var b = 1 - old_trav, c = b ? flip_ongoing_traversal(h) : b;
|
|
return c;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(old_trav) throw caml_maybe_attach_backtrace(exn, 0);
|
|
flip_ongoing_traversal(h);
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
}
|
|
function fold(f, h, init){
|
|
var old_trav = ongoing_traversal(h);
|
|
if(1 - old_trav) flip_ongoing_traversal(h);
|
|
try{
|
|
var d = h[2], a = d.length - 2 | 0;
|
|
if(a < 0)
|
|
var accu$2 = init;
|
|
else{
|
|
var accu$1 = init, i = 0;
|
|
a:
|
|
for(;;){
|
|
var b$0 = caml_check_bound(d, i)[i + 1], b = b$0, accu = accu$1;
|
|
for(;;){
|
|
if(! b){
|
|
var c = i + 1 | 0;
|
|
if(a !== i){accu$1 = accu; i = c; break;}
|
|
var accu$2 = accu;
|
|
break a;
|
|
}
|
|
var
|
|
key = b[1],
|
|
data = b[2],
|
|
next = b[3],
|
|
accu$0 = caml_call3(f, key, data, accu);
|
|
b = next;
|
|
accu = accu$0;
|
|
}
|
|
}
|
|
}
|
|
if(1 - old_trav) flip_ongoing_traversal(h);
|
|
return accu$2;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(old_trav) throw caml_maybe_attach_backtrace(exn, 0);
|
|
flip_ongoing_traversal(h);
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
}
|
|
function bucket_length(accu$1, param$0){
|
|
var accu = accu$1, param = param$0;
|
|
for(;;){
|
|
if(! param) return accu;
|
|
var next = param[3], accu$0 = accu + 1 | 0;
|
|
accu = accu$0;
|
|
param = next;
|
|
}
|
|
}
|
|
function stats(h){
|
|
var
|
|
mbl =
|
|
Stdlib_Array[18].call
|
|
(null,
|
|
function(m, b){
|
|
var a = bucket_length(0, b);
|
|
return Stdlib_Int[11].call(null, m, a);
|
|
},
|
|
0,
|
|
h[2]),
|
|
histo = caml_make_vect(mbl + 1 | 0, 0);
|
|
Stdlib_Array[12].call
|
|
(null,
|
|
function(b){
|
|
var l = bucket_length(0, b);
|
|
histo[l + 1] = caml_check_bound(histo, l)[l + 1] + 1 | 0;
|
|
return 0;
|
|
},
|
|
h[2]);
|
|
return [0, h[1], h[2].length - 1, mbl, histo];
|
|
}
|
|
function to_seq(tbl){
|
|
var tbl_data = tbl[2];
|
|
function aux(i$1, buck$1, param){
|
|
var i = i$1, buck = buck$1;
|
|
for(;;){
|
|
if(buck) break;
|
|
if(i === tbl_data.length - 1) return 0;
|
|
var buck$0 = caml_check_bound(tbl_data, i)[i + 1], i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
buck = buck$0;
|
|
}
|
|
var key = buck[1], data = buck[2], next = buck[3];
|
|
return [0, [0, key, data], function(a){return aux(i, next, a);}];
|
|
}
|
|
return function(a){return aux(0, 0, a);};
|
|
}
|
|
function to_seq_keys(m){
|
|
var a = to_seq(m);
|
|
function b(a){return a[1];}
|
|
var c = Stdlib_Seq[29];
|
|
return function(d){return c(b, a, d);};
|
|
}
|
|
function to_seq_values(m){
|
|
var a = to_seq(m);
|
|
function b(a){return a[2];}
|
|
var c = Stdlib_Seq[29];
|
|
return function(d){return c(b, a, d);};
|
|
}
|
|
function MakeSeeded(H){
|
|
function key_index(h, key){
|
|
var a = h[2].length - 2 | 0;
|
|
return caml_call2(H[2], h[3], key) & a;
|
|
}
|
|
function add(h, key, data){
|
|
var
|
|
i = key_index(h, key),
|
|
bucket = [0, key, data, caml_check_bound(h[2], i)[i + 1]];
|
|
caml_check_bound(h[2], i)[i + 1] = bucket;
|
|
h[1] = h[1] + 1 | 0;
|
|
var a = h[2].length - 1 << 1 < h[1] ? 1 : 0;
|
|
return a ? resize(key_index, h) : a;
|
|
}
|
|
function remove(h, key){
|
|
var
|
|
i = key_index(h, key),
|
|
prec$1 = caml_check_bound(h[2], i)[i + 1],
|
|
prec$0 = 0,
|
|
prec = prec$1;
|
|
for(;;){
|
|
if(! prec) return 0;
|
|
var k = prec[1], next = prec[3];
|
|
if(caml_call2(H[1], k, key)){
|
|
h[1] = h[1] - 1 | 0;
|
|
return prec$0
|
|
? (prec$0[3] = next, 0)
|
|
: (caml_check_bound(h[2], i)[i + 1] = next, 0);
|
|
}
|
|
prec$0 = prec;
|
|
prec = next;
|
|
}
|
|
}
|
|
function find(h, key){
|
|
var a = key_index(h, key), match = caml_check_bound(h[2], a)[a + 1];
|
|
if(! match) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
var k1 = match[1], d1 = match[2], next1 = match[3];
|
|
if(caml_call2(H[1], key, k1)) return d1;
|
|
if(! next1) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
var k2 = next1[1], d2 = next1[2], next2 = next1[3];
|
|
if(caml_call2(H[1], key, k2)) return d2;
|
|
if(! next2) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
var k3 = next2[1], d3 = next2[2], next3 = next2[3];
|
|
if(caml_call2(H[1], key, k3)) return d3;
|
|
var param = next3;
|
|
for(;;){
|
|
if(! param) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
var k = param[1], data = param[2], next = param[3];
|
|
if(caml_call2(H[1], key, k)) return data;
|
|
param = next;
|
|
}
|
|
}
|
|
function find_opt(h, key){
|
|
var a = key_index(h, key), match = caml_check_bound(h[2], a)[a + 1];
|
|
if(! match) return 0;
|
|
var k1 = match[1], d1 = match[2], next1 = match[3];
|
|
if(caml_call2(H[1], key, k1)) return [0, d1];
|
|
if(! next1) return 0;
|
|
var k2 = next1[1], d2 = next1[2], next2 = next1[3];
|
|
if(caml_call2(H[1], key, k2)) return [0, d2];
|
|
if(! next2) return 0;
|
|
var k3 = next2[1], d3 = next2[2], next3 = next2[3];
|
|
if(caml_call2(H[1], key, k3)) return [0, d3];
|
|
var param = next3;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var k = param[1], data = param[2], next = param[3];
|
|
if(caml_call2(H[1], key, k)) return [0, data];
|
|
param = next;
|
|
}
|
|
}
|
|
function find_all(h, key){
|
|
var a = key_index(h, key), param = caml_check_bound(h[2], a)[a + 1];
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var k = param[1], d = param[2], next = param[3];
|
|
if(caml_call2(H[1], k, key)) break;
|
|
param = next;
|
|
}
|
|
var block = [0, d, 24029], dst = block, offset = 1, param$0 = next;
|
|
for(;;){
|
|
if(! param$0){dst[offset + 1] = 0; return block;}
|
|
var k$0 = param$0[1], d$0 = param$0[2], next$0 = param$0[3];
|
|
if(caml_call2(H[1], k$0, key)){
|
|
var dst$0 = [0, d$0, 24029];
|
|
dst[offset + 1] = dst$0;
|
|
dst = dst$0;
|
|
offset = 1;
|
|
param$0 = next$0;
|
|
}
|
|
else
|
|
param$0 = next$0;
|
|
}
|
|
}
|
|
function replace(h, key, data){
|
|
var
|
|
i = key_index(h, key),
|
|
l = caml_check_bound(h[2], i)[i + 1],
|
|
param = l;
|
|
for(;;){
|
|
if(param){
|
|
var k = param[1], next = param[3];
|
|
if(! caml_call2(H[1], k, key)){param = next; continue;}
|
|
param[1] = key;
|
|
param[2] = data;
|
|
var a = 0;
|
|
}
|
|
else
|
|
var a = 1;
|
|
if(a){
|
|
caml_check_bound(h[2], i)[i + 1] = [0, key, data, l];
|
|
h[1] = h[1] + 1 | 0;
|
|
var b = h[2].length - 1 << 1 < h[1] ? 1 : 0;
|
|
if(b) return resize(key_index, h);
|
|
var c = b;
|
|
}
|
|
else
|
|
var c = a;
|
|
return c;
|
|
}
|
|
}
|
|
function mem(h, key){
|
|
var b = key_index(h, key), param = caml_check_bound(h[2], b)[b + 1];
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var k = param[1], next = param[3], a = caml_call2(H[1], k, key);
|
|
if(a) return a;
|
|
param = next;
|
|
}
|
|
}
|
|
function add_seq(tbl, i){
|
|
return Stdlib_Seq[4].call
|
|
(null,
|
|
function(param){
|
|
var v = param[2], k = param[1];
|
|
return add(tbl, k, v);
|
|
},
|
|
i);
|
|
}
|
|
function replace_seq(tbl, i){
|
|
return Stdlib_Seq[4].call
|
|
(null,
|
|
function(param){
|
|
var v = param[2], k = param[1];
|
|
return replace(tbl, k, v);
|
|
},
|
|
i);
|
|
}
|
|
function of_seq(i){
|
|
var tbl = create(0, 16);
|
|
replace_seq(tbl, i);
|
|
return tbl;
|
|
}
|
|
return [0,
|
|
create,
|
|
clear,
|
|
reset,
|
|
copy,
|
|
add,
|
|
remove,
|
|
find,
|
|
find_opt,
|
|
find_all,
|
|
replace,
|
|
mem,
|
|
iter,
|
|
filter_map_inplace,
|
|
fold,
|
|
length,
|
|
stats,
|
|
to_seq,
|
|
to_seq_keys,
|
|
to_seq_values,
|
|
add_seq,
|
|
replace_seq,
|
|
of_seq];
|
|
}
|
|
var a = [0, 0];
|
|
function Make(H){
|
|
var equal = H[1];
|
|
function seeded_hash(seed, x){return caml_call1(H[2], x);}
|
|
var
|
|
include = MakeSeeded([0, equal, seeded_hash]),
|
|
b = include[1],
|
|
clear = include[2],
|
|
reset = include[3],
|
|
copy = include[4],
|
|
add = include[5],
|
|
remove = include[6],
|
|
find = include[7],
|
|
find_opt = include[8],
|
|
find_all = include[9],
|
|
replace = include[10],
|
|
mem = include[11],
|
|
iter = include[12],
|
|
filter_map_inplace = include[13],
|
|
fold = include[14],
|
|
length = include[15],
|
|
stats = include[16],
|
|
to_seq = include[17],
|
|
to_seq_keys = include[18],
|
|
to_seq_values = include[19],
|
|
add_seq = include[20],
|
|
replace_seq = include[21];
|
|
function create(sz){return caml_call2(b, a, sz);}
|
|
function of_seq(i){
|
|
var tbl = caml_call2(b, a, 16);
|
|
caml_call2(replace_seq, tbl, i);
|
|
return tbl;
|
|
}
|
|
return [0,
|
|
create,
|
|
clear,
|
|
reset,
|
|
copy,
|
|
add,
|
|
remove,
|
|
find,
|
|
find_opt,
|
|
find_all,
|
|
replace,
|
|
mem,
|
|
iter,
|
|
filter_map_inplace,
|
|
fold,
|
|
length,
|
|
stats,
|
|
to_seq,
|
|
to_seq_keys,
|
|
to_seq_values,
|
|
add_seq,
|
|
replace_seq,
|
|
of_seq];
|
|
}
|
|
function hash(x){return caml_hash(10, 100, 0, x);}
|
|
function hash_param(n1, n2, x){return caml_hash(n1, n2, 0, x);}
|
|
function seeded_hash(seed, x){return caml_hash(10, 100, seed, x);}
|
|
function key_index(h, key){
|
|
return 4 <= h.length - 1
|
|
? caml_hash(10, 100, h[3], key) & (h[2].length - 2 | 0)
|
|
: Stdlib[1].call(null, "Hashtbl: unsupported hash table format");
|
|
}
|
|
function add(h, key, data){
|
|
var
|
|
i = key_index(h, key),
|
|
bucket = [0, key, data, caml_check_bound(h[2], i)[i + 1]];
|
|
caml_check_bound(h[2], i)[i + 1] = bucket;
|
|
h[1] = h[1] + 1 | 0;
|
|
var a = h[2].length - 1 << 1 < h[1] ? 1 : 0;
|
|
return a ? resize(key_index, h) : a;
|
|
}
|
|
function remove(h, key){
|
|
var
|
|
i = key_index(h, key),
|
|
prec$1 = caml_check_bound(h[2], i)[i + 1],
|
|
prec$0 = 0,
|
|
prec = prec$1;
|
|
for(;;){
|
|
if(! prec) return 0;
|
|
var k = prec[1], next = prec[3];
|
|
if(0 === caml_compare(k, key)){
|
|
h[1] = h[1] - 1 | 0;
|
|
return prec$0
|
|
? (prec$0[3] = next, 0)
|
|
: (caml_check_bound(h[2], i)[i + 1] = next, 0);
|
|
}
|
|
prec$0 = prec;
|
|
prec = next;
|
|
}
|
|
}
|
|
function find(h, key){
|
|
var a = key_index(h, key), match = caml_check_bound(h[2], a)[a + 1];
|
|
if(! match) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
var k1 = match[1], d1 = match[2], next1 = match[3];
|
|
if(0 === caml_compare(key, k1)) return d1;
|
|
if(! next1) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
var k2 = next1[1], d2 = next1[2], next2 = next1[3];
|
|
if(0 === caml_compare(key, k2)) return d2;
|
|
if(! next2) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
var k3 = next2[1], d3 = next2[2], next3 = next2[3];
|
|
if(0 === caml_compare(key, k3)) return d3;
|
|
var param = next3;
|
|
for(;;){
|
|
if(! param) throw caml_maybe_attach_backtrace(Stdlib[8], 1);
|
|
var k = param[1], data = param[2], next = param[3];
|
|
if(0 === caml_compare(key, k)) return data;
|
|
param = next;
|
|
}
|
|
}
|
|
function find_opt(h, key){
|
|
var a = key_index(h, key), match = caml_check_bound(h[2], a)[a + 1];
|
|
if(! match) return 0;
|
|
var k1 = match[1], d1 = match[2], next1 = match[3];
|
|
if(0 === caml_compare(key, k1)) return [0, d1];
|
|
if(! next1) return 0;
|
|
var k2 = next1[1], d2 = next1[2], next2 = next1[3];
|
|
if(0 === caml_compare(key, k2)) return [0, d2];
|
|
if(! next2) return 0;
|
|
var k3 = next2[1], d3 = next2[2], next3 = next2[3];
|
|
if(0 === caml_compare(key, k3)) return [0, d3];
|
|
var param = next3;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var k = param[1], data = param[2], next = param[3];
|
|
if(0 === caml_compare(key, k)) return [0, data];
|
|
param = next;
|
|
}
|
|
}
|
|
function find_all(h, key){
|
|
var a = key_index(h, key), param = caml_check_bound(h[2], a)[a + 1];
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var k = param[1], data = param[2], next = param[3];
|
|
if(0 === caml_compare(k, key)) break;
|
|
param = next;
|
|
}
|
|
var block = [0, data, 24029], dst = block, offset = 1, param$0 = next;
|
|
for(;;){
|
|
if(! param$0){dst[offset + 1] = 0; return block;}
|
|
var k$0 = param$0[1], data$0 = param$0[2], next$0 = param$0[3];
|
|
if(0 === caml_compare(k$0, key)){
|
|
var dst$0 = [0, data$0, 24029];
|
|
dst[offset + 1] = dst$0;
|
|
dst = dst$0;
|
|
offset = 1;
|
|
param$0 = next$0;
|
|
}
|
|
else
|
|
param$0 = next$0;
|
|
}
|
|
}
|
|
function replace(h, key, data){
|
|
var
|
|
i = key_index(h, key),
|
|
l = caml_check_bound(h[2], i)[i + 1],
|
|
param = l;
|
|
for(;;){
|
|
if(param){
|
|
var k = param[1], next = param[3];
|
|
if(0 !== caml_compare(k, key)){param = next; continue;}
|
|
param[1] = key;
|
|
param[2] = data;
|
|
var a = 0;
|
|
}
|
|
else
|
|
var a = 1;
|
|
if(a){
|
|
caml_check_bound(h[2], i)[i + 1] = [0, key, data, l];
|
|
h[1] = h[1] + 1 | 0;
|
|
var b = h[2].length - 1 << 1 < h[1] ? 1 : 0;
|
|
if(b) return resize(key_index, h);
|
|
var c = b;
|
|
}
|
|
else
|
|
var c = a;
|
|
return c;
|
|
}
|
|
}
|
|
function mem(h, key){
|
|
var b = key_index(h, key), param = caml_check_bound(h[2], b)[b + 1];
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var
|
|
k = param[1],
|
|
next = param[3],
|
|
a = 0 === caml_compare(k, key) ? 1 : 0;
|
|
if(a) return a;
|
|
param = next;
|
|
}
|
|
}
|
|
function add_seq(tbl, i){
|
|
return Stdlib_Seq[4].call
|
|
(null,
|
|
function(param){
|
|
var v = param[2], k = param[1];
|
|
return add(tbl, k, v);
|
|
},
|
|
i);
|
|
}
|
|
function replace_seq(tbl, i){
|
|
return Stdlib_Seq[4].call
|
|
(null,
|
|
function(param){
|
|
var v = param[2], k = param[1];
|
|
return replace(tbl, k, v);
|
|
},
|
|
i);
|
|
}
|
|
function of_seq(i){
|
|
var tbl = create(0, 16);
|
|
replace_seq(tbl, i);
|
|
return tbl;
|
|
}
|
|
function rebuild(opt, h){
|
|
var
|
|
random = opt ? opt[1] : Stdlib_Atomic[3].call(null, randomized),
|
|
s = power_2_above(16, h[2].length - 1);
|
|
if(random)
|
|
var
|
|
a = caml_call1(Stdlib_Domain[10][2], prng_key),
|
|
seed = caml_call1(Stdlib_Random[19][4], a);
|
|
else
|
|
var seed = 4 <= h.length - 1 ? h[3] : 0;
|
|
var
|
|
b = 4 <= h.length - 1 ? h[4] : s,
|
|
h$0 = [0, h[1], caml_make_vect(s, 0), seed, b];
|
|
insert_all_buckets
|
|
(function(a){return key_index(h$0, a);}, 0, h[2], h$0[2]);
|
|
return h$0;
|
|
}
|
|
runtime.caml_register_global
|
|
(16,
|
|
[0,
|
|
create,
|
|
clear,
|
|
reset,
|
|
copy,
|
|
add,
|
|
find,
|
|
find_opt,
|
|
find_all,
|
|
mem,
|
|
remove,
|
|
replace,
|
|
iter,
|
|
filter_map_inplace,
|
|
fold,
|
|
length,
|
|
randomize,
|
|
is_randomized,
|
|
rebuild,
|
|
stats,
|
|
to_seq,
|
|
to_seq_keys,
|
|
to_seq_values,
|
|
add_seq,
|
|
replace_seq,
|
|
of_seq,
|
|
Make,
|
|
MakeSeeded,
|
|
hash,
|
|
seeded_hash,
|
|
hash_param,
|
|
caml_hash],
|
|
"Stdlib__Hashtbl");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 23582 "../.js/default/stdlib/stdlib.cma.js"
|
|
//# shape: Stdlib__Callback:[F(2),F(2)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_register_named_value = runtime.caml_register_named_value,
|
|
Stdlib_Obj = runtime.caml_get_global_data().Stdlib__Obj;
|
|
function register_exception(name, exn){
|
|
var
|
|
a = Stdlib_Obj[10],
|
|
slot = runtime.caml_obj_tag(exn) === a ? exn : exn[1];
|
|
return caml_register_named_value(name, slot);
|
|
}
|
|
runtime.caml_register_global
|
|
(1,
|
|
[0, caml_register_named_value, register_exception],
|
|
"Stdlib__Callback");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 5 "../lib/.sx.objs/jsoo/default/sx.cma.js"
|
|
//# shape: Sx_types:[N,N,N,F(1),F(1),N,N,N,F(1),F(1),F(3),F(2),F(2),F(3),F(2),F(3),F(3),F(2),F(1),F(1),F(1)*,F(1)*,F(1),F(3),F(6),F(5),F(5),F(2),F(1),F(1),F(1)*,F(1)*,F(1)*,F(1)*,F(1)*,F(1)*,F(1)*,F(1),F(1)*,F(1)*,F(1),F(1),F(1),F(1),F(1),F(1),F(2),F(1),F(1),F(1),F(1),F(1),F(1)*,F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(2),F(2),F(3),F(2),F(1),F(1),F(1)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_fresh_oo_id = runtime.caml_fresh_oo_id,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_ml_string_length = runtime.caml_ml_string_length;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib_Hashtbl = global_data.Stdlib__Hashtbl,
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_Printf = global_data.Stdlib__Printf,
|
|
Stdlib_Buffer = global_data.Stdlib__Buffer,
|
|
Stdlib_Float = global_data.Stdlib__Float,
|
|
Stdlib_String = global_data.Stdlib__String,
|
|
Stdlib_List = global_data.Stdlib__List,
|
|
sym_to_id = Stdlib_Hashtbl[1].call(null, 0, 512),
|
|
id_to_sym = Stdlib_Hashtbl[1].call(null, 0, 512),
|
|
sym_next = [0, 0];
|
|
function intern(s){
|
|
var match = Stdlib_Hashtbl[7].call(null, sym_to_id, s);
|
|
if(match){var id = match[1]; return id;}
|
|
var id$0 = sym_next[1];
|
|
sym_next[1]++;
|
|
Stdlib_Hashtbl[11].call(null, sym_to_id, s, id$0);
|
|
Stdlib_Hashtbl[11].call(null, id_to_sym, id$0, s);
|
|
return id$0;
|
|
}
|
|
function unintern(id){
|
|
var match = Stdlib_Hashtbl[7].call(null, id_to_sym, id);
|
|
if(match){var s = match[1]; return s;}
|
|
var a = Stdlib[33].call(null, id), b = Stdlib[28].call(null, a, ">");
|
|
return Stdlib[28].call(null, "<sym:", b);
|
|
}
|
|
var
|
|
vm_call_closure_ref =
|
|
[0,
|
|
function(a, param){
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Stdlib[7], "VM call_closure not initialized"], 1);
|
|
}],
|
|
Eval_error = [248, "Sx_types.Eval_error", caml_fresh_oo_id(0)],
|
|
Parse_error = [248, "Sx_types.Parse_error", caml_fresh_oo_id(0)];
|
|
function make_env(param){
|
|
return [0, Stdlib_Hashtbl[1].call(null, 0, 16), 0];
|
|
}
|
|
function env_extend(parent){
|
|
return [0, Stdlib_Hashtbl[1].call(null, 0, 16), [0, parent]];
|
|
}
|
|
function env_bind(env, name, v){
|
|
var a = intern(name);
|
|
Stdlib_Hashtbl[11].call(null, env[1], a, v);
|
|
return 0;
|
|
}
|
|
function env_has_id(env$1, id){
|
|
var env = env$1;
|
|
for(;;){
|
|
var a = Stdlib_Hashtbl[9].call(null, env[1], id);
|
|
if(a)
|
|
var b = a;
|
|
else{
|
|
var match = env[2];
|
|
if(match){var env$0 = match[1]; env = env$0; continue;}
|
|
var b = 0;
|
|
}
|
|
return b;
|
|
}
|
|
}
|
|
function env_has(env, name){return env_has_id(env, intern(name));}
|
|
function env_get_id(env$1, id, name){
|
|
var env = env$1;
|
|
for(;;){
|
|
var match = Stdlib_Hashtbl[7].call(null, env[1], id);
|
|
if(match){var v = match[1]; return v;}
|
|
var match$0 = env[2];
|
|
if(! match$0)
|
|
throw caml_maybe_attach_backtrace
|
|
([0,
|
|
Eval_error,
|
|
Stdlib[28].call(null, "Undefined symbol: ", name)],
|
|
1);
|
|
var env$0 = match$0[1];
|
|
env = env$0;
|
|
}
|
|
}
|
|
function env_get(env, name){return env_get_id(env, intern(name), name);}
|
|
function env_set_id(env$1, id, v){
|
|
var env = env$1;
|
|
for(;;){
|
|
if(Stdlib_Hashtbl[9].call(null, env[1], id)){
|
|
Stdlib_Hashtbl[11].call(null, env[1], id, v);
|
|
return 0;
|
|
}
|
|
var match = env[2];
|
|
if(! match){Stdlib_Hashtbl[11].call(null, env[1], id, v); return 0;}
|
|
var env$0 = match[1];
|
|
env = env$0;
|
|
}
|
|
}
|
|
function env_set(env, name, v){return env_set_id(env, intern(name), v);}
|
|
function env_merge(base, overlay){
|
|
if(base === overlay)
|
|
return [0, Stdlib_Hashtbl[1].call(null, 0, 16), [0, base]];
|
|
a:
|
|
{
|
|
b:
|
|
{
|
|
c:
|
|
{
|
|
var e = overlay, depth = 0;
|
|
for(;;){
|
|
if(100 < depth) break b;
|
|
if(e === base) break c;
|
|
var match = e[2];
|
|
if(! match) break;
|
|
var p = match[1], depth$0 = depth + 1 | 0;
|
|
e = p;
|
|
depth = depth$0;
|
|
}
|
|
var a = 0;
|
|
break a;
|
|
}
|
|
var a = 1;
|
|
break a;
|
|
}
|
|
var a = 0;
|
|
}
|
|
if(a) return [0, Stdlib_Hashtbl[1].call(null, 0, 16), [0, base]];
|
|
var e$0 = [0, Stdlib_Hashtbl[1].call(null, 0, 16), [0, base]];
|
|
Stdlib_Hashtbl[12].call
|
|
(null,
|
|
function(id, v){
|
|
var a = 1 - env_has_id(base, id);
|
|
return a ? Stdlib_Hashtbl[11].call(null, e$0[1], id, v) : a;
|
|
},
|
|
overlay[1]);
|
|
return e$0;
|
|
}
|
|
var
|
|
cst_g = "%g",
|
|
cst_false = "false",
|
|
cst_true = "true",
|
|
a = [0, [8, [0, 0, 3], 0, 0, 0], cst_g];
|
|
function value_to_string(param){
|
|
if(typeof param === "number") return "";
|
|
switch(param[0]){
|
|
case 0:
|
|
return param[1] ? cst_true : cst_false;
|
|
case 1:
|
|
var n = param[1];
|
|
return Stdlib_Float[18].call(null, n)
|
|
? Stdlib[33].call(null, n | 0)
|
|
: caml_call1(Stdlib_Printf[4].call(null, a), n);
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
var s = param[1]; return s;
|
|
default: return "<value>";
|
|
}
|
|
}
|
|
function value_to_string_list(param){
|
|
a:
|
|
if(typeof param !== "number"){
|
|
switch(param[0]){
|
|
case 5:
|
|
var items = param[1]; break;
|
|
case 19:
|
|
var items = param[1][1]; break;
|
|
default: break a;
|
|
}
|
|
return Stdlib_List[20].call(null, value_to_string, items);
|
|
}
|
|
return 0;
|
|
}
|
|
function value_to_bool(param){
|
|
if(typeof param === "number") return 0;
|
|
if(0 !== param[0]) return 1;
|
|
var b = param[1];
|
|
return b;
|
|
}
|
|
function value_to_string_opt(param){
|
|
if(typeof param === "number") return 0;
|
|
if(param[0] - 2 >>> 0 >= 2) return 0;
|
|
var s = param[1];
|
|
return [0, s];
|
|
}
|
|
function unwrap_env_val(param){
|
|
if(typeof param !== "number" && 18 === param[0]){var e = param[1]; return e;}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Eval_error, "make_lambda: expected env for closure"], 1);
|
|
}
|
|
function make_lambda(params, body, closure){
|
|
a:
|
|
{
|
|
if(typeof params !== "number" && 5 === params[0]){
|
|
var
|
|
items = params[1],
|
|
ps = Stdlib_List[20].call(null, value_to_string, items);
|
|
break a;
|
|
}
|
|
var ps = value_to_string_list(params);
|
|
}
|
|
return [7, [0, ps, body, unwrap_env_val(closure), 0, 0]];
|
|
}
|
|
var cst_auto = "auto";
|
|
function make_component
|
|
(name, params, has_children, body, closure, affinity){
|
|
var
|
|
n = value_to_string(name),
|
|
ps = value_to_string_list(params),
|
|
hc = value_to_bool(has_children);
|
|
if(typeof affinity === "number" || ! (2 === affinity[0]))
|
|
var aff = cst_auto;
|
|
else
|
|
var s = affinity[1], aff = s;
|
|
return [8, [0, n, ps, hc, body, unwrap_env_val(closure), aff, 0]];
|
|
}
|
|
function make_island(name, params, has_children, body, closure){
|
|
var
|
|
n = value_to_string(name),
|
|
ps = value_to_string_list(params),
|
|
hc = value_to_bool(has_children);
|
|
return [9, [0, n, ps, hc, body, unwrap_env_val(closure)]];
|
|
}
|
|
function make_macro(params, rest_param, body, closure, name){
|
|
var
|
|
ps = value_to_string_list(params),
|
|
rp = value_to_string_opt(rest_param),
|
|
n = value_to_string_opt(name);
|
|
return [10, [0, ps, rp, body, unwrap_env_val(closure), n]];
|
|
}
|
|
function make_thunk(expr, env){return [11, expr, unwrap_env_val(env)];}
|
|
function make_symbol(name){return [3, value_to_string(name)];}
|
|
function make_keyword(name){return [4, value_to_string(name)];}
|
|
var cst_lambda = "lambda", cst_macro = "macro", cst_nil = "nil";
|
|
function type_of(param){
|
|
if(typeof param === "number") return cst_nil;
|
|
var cst_dict = "dict", cst_function = "function";
|
|
switch(param[0]){
|
|
case 0:
|
|
return "boolean";
|
|
case 1:
|
|
return "number";
|
|
case 2:
|
|
return "string";
|
|
case 3:
|
|
return "symbol";
|
|
case 4:
|
|
return "keyword";
|
|
case 6:
|
|
return cst_dict;
|
|
case 7:
|
|
return cst_lambda;
|
|
case 8:
|
|
return "component";
|
|
case 9:
|
|
return "island";
|
|
case 10:
|
|
return cst_macro;
|
|
case 11:
|
|
return "thunk";
|
|
case 12:
|
|
return "continuation";
|
|
case 13:
|
|
return cst_function;
|
|
case 14:
|
|
return "signal";
|
|
case 15:
|
|
return "raw-html";
|
|
case 16:
|
|
return "spread";
|
|
case 17:
|
|
return "sx-expr";
|
|
case 18:
|
|
return "env";
|
|
case 20:
|
|
return cst_dict;
|
|
case 21:
|
|
return cst_dict;
|
|
case 22:
|
|
return cst_function;
|
|
default: return "list";
|
|
}
|
|
}
|
|
function is_nil(param){return typeof param === "number" ? 1 : 0;}
|
|
function is_lambda(param){
|
|
if(typeof param !== "number" && 7 === param[0]) return 1;
|
|
return 0;
|
|
}
|
|
function is_component(param){
|
|
if(typeof param !== "number" && 8 === param[0]) return 1;
|
|
return 0;
|
|
}
|
|
function is_island(param){
|
|
if(typeof param !== "number" && 9 === param[0]) return 1;
|
|
return 0;
|
|
}
|
|
function is_macro(param){
|
|
if(typeof param !== "number" && 10 === param[0]) return 1;
|
|
return 0;
|
|
}
|
|
function is_thunk(param){
|
|
if(typeof param !== "number" && 11 === param[0]) return 1;
|
|
return 0;
|
|
}
|
|
function is_signal(param){
|
|
if(typeof param !== "number")
|
|
switch(param[0]){
|
|
case 6:
|
|
var d = param[1]; return Stdlib_Hashtbl[9].call(null, d, "__signal");
|
|
case 14:
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
function is_callable(param){
|
|
if(typeof param !== "number")
|
|
switch(param[0]){case 7:case 12:case 13:case 22: return 1;}
|
|
return 0;
|
|
}
|
|
function sx_truthy(param){
|
|
a:
|
|
if(typeof param !== "number"){
|
|
if(0 === param[0] && ! param[1]) break a;
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
function symbol_name(v){
|
|
if(typeof v !== "number" && 3 === v[0]){var s = v[1]; return [2, s];}
|
|
var a = type_of(v);
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Eval_error, Stdlib[28].call(null, "Expected symbol, got ", a)],
|
|
1);
|
|
}
|
|
function keyword_name(v){
|
|
if(typeof v !== "number" && 4 === v[0]){var k = v[1]; return [2, k];}
|
|
var a = type_of(v);
|
|
throw caml_maybe_attach_backtrace
|
|
([0,
|
|
Eval_error,
|
|
Stdlib[28].call(null, "Expected keyword, got ", a)],
|
|
1);
|
|
}
|
|
var cst_Expected_lambda_got = "Expected lambda, got ";
|
|
function lambda_params(v){
|
|
if(typeof v !== "number" && 7 === v[0]){
|
|
var l = v[1];
|
|
return [5, Stdlib_List[20].call(null, function(s){return [2, s];}, l[1])];
|
|
}
|
|
var a = type_of(v);
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Eval_error, Stdlib[28].call(null, cst_Expected_lambda_got, a)],
|
|
1);
|
|
}
|
|
function lambda_body(v){
|
|
if(typeof v !== "number" && 7 === v[0]){var l = v[1]; return l[2];}
|
|
var a = type_of(v);
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Eval_error, Stdlib[28].call(null, cst_Expected_lambda_got, a)],
|
|
1);
|
|
}
|
|
function lambda_closure(v){
|
|
if(typeof v !== "number" && 7 === v[0]){var l = v[1]; return [18, l[3]];}
|
|
var a = type_of(v);
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Eval_error, Stdlib[28].call(null, cst_Expected_lambda_got, a)],
|
|
1);
|
|
}
|
|
function lambda_name(v){
|
|
if(typeof v !== "number" && 7 === v[0]){
|
|
var l = v[1], match = l[4];
|
|
if(! match) return 0;
|
|
var n = match[1];
|
|
return [2, n];
|
|
}
|
|
var a = type_of(v);
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Eval_error, Stdlib[28].call(null, cst_Expected_lambda_got, a)],
|
|
1);
|
|
}
|
|
function set_lambda_name(l, n){
|
|
if(typeof l !== "number" && 7 === l[0]){
|
|
var l$0 = l[1];
|
|
l$0[4] = [0, n];
|
|
return 0;
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Eval_error, "set-lambda-name!: not a lambda"], 1);
|
|
}
|
|
var cst_Expected_component_got = "Expected component, got ";
|
|
function component_name(v){
|
|
if(typeof v !== "number" && v[0] - 8 >>> 0 < 2){var c = v[1]; return [2, c[1]];}
|
|
var a = type_of(v);
|
|
throw caml_maybe_attach_backtrace
|
|
([0,
|
|
Eval_error,
|
|
Stdlib[28].call(null, cst_Expected_component_got, a)],
|
|
1);
|
|
}
|
|
function component_params(v){
|
|
if(typeof v !== "number")
|
|
switch(v[0]){
|
|
case 8:
|
|
var c = v[1];
|
|
return [5,
|
|
Stdlib_List[20].call(null, function(s){return [2, s];}, c[2])];
|
|
case 9:
|
|
var i = v[1];
|
|
return [5,
|
|
Stdlib_List[20].call(null, function(s){return [2, s];}, i[2])];
|
|
}
|
|
var a = type_of(v);
|
|
throw caml_maybe_attach_backtrace
|
|
([0,
|
|
Eval_error,
|
|
Stdlib[28].call(null, cst_Expected_component_got, a)],
|
|
1);
|
|
}
|
|
function component_body(v){
|
|
if(typeof v !== "number" && v[0] - 8 >>> 0 < 2){var c = v[1]; return c[4];}
|
|
var a = type_of(v);
|
|
throw caml_maybe_attach_backtrace
|
|
([0,
|
|
Eval_error,
|
|
Stdlib[28].call(null, cst_Expected_component_got, a)],
|
|
1);
|
|
}
|
|
function component_closure(v){
|
|
if(typeof v !== "number" && v[0] - 8 >>> 0 < 2){var c = v[1]; return [18, c[5]];}
|
|
var a = type_of(v);
|
|
throw caml_maybe_attach_backtrace
|
|
([0,
|
|
Eval_error,
|
|
Stdlib[28].call(null, cst_Expected_component_got, a)],
|
|
1);
|
|
}
|
|
function component_has_children(v){
|
|
if(typeof v !== "number" && v[0] - 8 >>> 0 < 2){var c = v[1]; return [0, c[3]];}
|
|
var a = type_of(v);
|
|
throw caml_maybe_attach_backtrace
|
|
([0,
|
|
Eval_error,
|
|
Stdlib[28].call(null, cst_Expected_component_got, a)],
|
|
1);
|
|
}
|
|
var b = [2, cst_auto], c = [2, "client"];
|
|
function component_affinity(param){
|
|
if(typeof param !== "number")
|
|
switch(param[0]){
|
|
case 8:
|
|
var c$0 = param[1]; return [2, c$0[6]];
|
|
case 9:
|
|
return c;
|
|
}
|
|
return b;
|
|
}
|
|
var cst_Expected_macro_got = "Expected macro, got ";
|
|
function macro_params(v){
|
|
if(typeof v !== "number" && 10 === v[0]){
|
|
var m = v[1];
|
|
return [5, Stdlib_List[20].call(null, function(s){return [2, s];}, m[1])];
|
|
}
|
|
var a = type_of(v);
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Eval_error, Stdlib[28].call(null, cst_Expected_macro_got, a)],
|
|
1);
|
|
}
|
|
function macro_rest_param(v){
|
|
if(typeof v !== "number" && 10 === v[0]){
|
|
var m = v[1], match = m[2];
|
|
if(! match) return 0;
|
|
var s = match[1];
|
|
return [2, s];
|
|
}
|
|
var a = type_of(v);
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Eval_error, Stdlib[28].call(null, cst_Expected_macro_got, a)],
|
|
1);
|
|
}
|
|
function macro_body(v){
|
|
if(typeof v !== "number" && 10 === v[0]){var m = v[1]; return m[3];}
|
|
var a = type_of(v);
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Eval_error, Stdlib[28].call(null, cst_Expected_macro_got, a)],
|
|
1);
|
|
}
|
|
function macro_closure(v){
|
|
if(typeof v !== "number" && 10 === v[0]){var m = v[1]; return [18, m[4]];}
|
|
var a = type_of(v);
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Eval_error, Stdlib[28].call(null, cst_Expected_macro_got, a)],
|
|
1);
|
|
}
|
|
var cst_Expected_thunk_got = "Expected thunk, got ";
|
|
function thunk_expr(v){
|
|
if(typeof v !== "number" && 11 === v[0]){var e = v[1]; return e;}
|
|
var a = type_of(v);
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Eval_error, Stdlib[28].call(null, cst_Expected_thunk_got, a)],
|
|
1);
|
|
}
|
|
function thunk_env(v){
|
|
if(typeof v !== "number" && 11 === v[0]){var e = v[2]; return [18, e];}
|
|
var a = type_of(v);
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Eval_error, Stdlib[28].call(null, cst_Expected_thunk_got, a)],
|
|
1);
|
|
}
|
|
function make_dict(param){return Stdlib_Hashtbl[1].call(null, 0, 8);}
|
|
function dict_get(d, key){
|
|
var match = Stdlib_Hashtbl[7].call(null, d, key);
|
|
if(! match) return 0;
|
|
var v = match[1];
|
|
return v;
|
|
}
|
|
function dict_has(d, key){return Stdlib_Hashtbl[9].call(null, d, key);}
|
|
function dict_set(d, key, v){
|
|
return Stdlib_Hashtbl[11].call(null, d, key, v);
|
|
}
|
|
function dict_delete(d, key){return Stdlib_Hashtbl[10].call(null, d, key);}
|
|
function dict_keys(d){
|
|
return Stdlib_Hashtbl[14].call
|
|
(null, function(k, param, acc){return [0, [2, k], acc];}, d, 0);
|
|
}
|
|
function dict_vals(d){
|
|
return Stdlib_Hashtbl[14].call
|
|
(null, function(param, v, acc){return [0, v, acc];}, d, 0);
|
|
}
|
|
var
|
|
cst_chars = " chars>",
|
|
cst = ")>",
|
|
cst_s_s = "<%s(%s)>",
|
|
d = [0, [4, 0, 0, 0, 0], "%d"],
|
|
e = [0, [8, [0, 0, 3], 0, 0, 0], cst_g],
|
|
f = [0, [12, 58, [2, 0, [12, 32, [2, 0, 0]]]], ":%s %s"],
|
|
g = [0, [12, 60, [2, 0, [12, 40, [2, 0, [11, cst, 0]]]]], cst_s_s],
|
|
h =
|
|
[0,
|
|
[11, "<Component ~", [2, 0, [12, 40, [2, 0, [11, cst, 0]]]]],
|
|
"<Component ~%s(%s)>"],
|
|
i =
|
|
[0,
|
|
[11, "<Island ~", [2, 0, [12, 40, [2, 0, [11, cst, 0]]]]],
|
|
"<Island ~%s(%s)>"],
|
|
j = [0, [12, 60, [2, 0, [12, 40, [2, 0, [11, cst, 0]]]]], cst_s_s],
|
|
k = [0, [11, "<native:", [2, 0, [12, 62, 0]]], "<native:%s>"],
|
|
l =
|
|
[0,
|
|
[11, "<raw-html:", [4, 0, 0, 0, [11, cst_chars, 0]]],
|
|
"<raw-html:%d chars>"],
|
|
m =
|
|
[0,
|
|
[11, "<sx-expr:", [4, 0, 0, 0, [11, cst_chars, 0]]],
|
|
"<sx-expr:%d chars>"],
|
|
n = [0, [11, "<frame:", [2, 0, [12, 62, 0]]], "<frame:%s>"],
|
|
o = [0, [11, "<vm:", [2, 0, [12, 62, 0]]], "<vm:%s>"];
|
|
function inspect(param){
|
|
if(typeof param === "number") return cst_nil;
|
|
var cst = " ", cst$0 = ", ";
|
|
switch(param[0]){
|
|
case 0:
|
|
return param[1] ? cst_true : cst_false;
|
|
case 1:
|
|
var n$0 = param[1];
|
|
return Stdlib_Float[18].call(null, n$0)
|
|
? caml_call1(Stdlib_Printf[4].call(null, d), n$0 | 0)
|
|
: caml_call1(Stdlib_Printf[4].call(null, e), n$0);
|
|
case 2:
|
|
var
|
|
s = param[1],
|
|
buf = Stdlib_Buffer[1].call(null, caml_ml_string_length(s) + 2 | 0);
|
|
Stdlib_Buffer[12].call(null, buf, 34);
|
|
Stdlib_String[30].call
|
|
(null,
|
|
function(c){
|
|
if(34 === c) return Stdlib_Buffer[16].call(null, buf, '\\"');
|
|
if(14 <= c){
|
|
if(92 === c) return Stdlib_Buffer[16].call(null, buf, "\\\\");
|
|
}
|
|
else if(9 <= c)
|
|
switch(c - 9 | 0){
|
|
case 0:
|
|
return Stdlib_Buffer[16].call(null, buf, "\\t");
|
|
case 1:
|
|
return Stdlib_Buffer[16].call(null, buf, "\\n");
|
|
case 4:
|
|
return Stdlib_Buffer[16].call(null, buf, "\\r");
|
|
}
|
|
return Stdlib_Buffer[12].call(null, buf, c);
|
|
},
|
|
s);
|
|
Stdlib_Buffer[12].call(null, buf, 34);
|
|
return Stdlib_Buffer[2].call(null, buf);
|
|
case 3:
|
|
var s$0 = param[1]; return s$0;
|
|
case 4:
|
|
var k$0 = param[1]; return Stdlib[28].call(null, ":", k$0);
|
|
case 5:
|
|
var items = param[1]; break;
|
|
case 6:
|
|
var
|
|
d$0 = param[1],
|
|
pairs =
|
|
Stdlib_Hashtbl[14].call
|
|
(null,
|
|
function(k, v, acc){
|
|
var a = inspect(v);
|
|
return [0, caml_call2(Stdlib_Printf[4].call(null, f), k, a), acc];
|
|
},
|
|
d$0,
|
|
0),
|
|
q = Stdlib_String[7].call(null, cst, pairs),
|
|
r = Stdlib[28].call(null, q, "}");
|
|
return Stdlib[28].call(null, "{", r);
|
|
case 7:
|
|
var l$0 = param[1], match = l$0[4];
|
|
if(match) var n$1 = match[1], tag = n$1; else var tag = cst_lambda;
|
|
var t = Stdlib_String[7].call(null, cst$0, l$0[1]);
|
|
return caml_call2(Stdlib_Printf[4].call(null, g), tag, t);
|
|
case 8:
|
|
var
|
|
c = param[1],
|
|
u = Stdlib_String[7].call(null, cst$0, c[2]),
|
|
v = c[1];
|
|
return caml_call2(Stdlib_Printf[4].call(null, h), v, u);
|
|
case 9:
|
|
var
|
|
i$0 = param[1],
|
|
w = Stdlib_String[7].call(null, cst$0, i$0[2]),
|
|
x = i$0[1];
|
|
return caml_call2(Stdlib_Printf[4].call(null, i), x, w);
|
|
case 10:
|
|
var m$0 = param[1], match$0 = m$0[5];
|
|
if(match$0)
|
|
var n$2 = match$0[1], tag$0 = n$2;
|
|
else
|
|
var tag$0 = cst_macro;
|
|
var y = Stdlib_String[7].call(null, cst$0, m$0[1]);
|
|
return caml_call2(Stdlib_Printf[4].call(null, j), tag$0, y);
|
|
case 11:
|
|
return "<thunk>";
|
|
case 12:
|
|
return "<continuation>";
|
|
case 13:
|
|
var name = param[1];
|
|
return caml_call1(Stdlib_Printf[4].call(null, k), name);
|
|
case 14:
|
|
return "<signal>";
|
|
case 15:
|
|
var s$1 = param[1];
|
|
return caml_call1
|
|
(Stdlib_Printf[4].call(null, l), caml_ml_string_length(s$1));
|
|
case 16:
|
|
return "<spread>";
|
|
case 17:
|
|
var s$2 = param[1];
|
|
return caml_call1
|
|
(Stdlib_Printf[4].call(null, m), caml_ml_string_length(s$2));
|
|
case 18:
|
|
return "<env>";
|
|
case 19:
|
|
var items = param[1][1]; break;
|
|
case 20:
|
|
return "<cek-state>";
|
|
case 21:
|
|
var f$0 = param[1], z = f$0[1];
|
|
return caml_call1(Stdlib_Printf[4].call(null, n), z);
|
|
default:
|
|
var cl = param[1], match$1 = cl[3];
|
|
if(match$1) var n$3 = match$1[1], n$4 = n$3; else var n$4 = "anon";
|
|
return caml_call1(Stdlib_Printf[4].call(null, o), n$4);
|
|
}
|
|
var
|
|
a = Stdlib_List[20].call(null, inspect, items),
|
|
b = Stdlib_String[7].call(null, cst, a),
|
|
p = Stdlib[28].call(null, b, ")");
|
|
return Stdlib[28].call(null, "(", p);
|
|
}
|
|
runtime.caml_register_global
|
|
(104,
|
|
[0,
|
|
sym_to_id,
|
|
id_to_sym,
|
|
sym_next,
|
|
intern,
|
|
unintern,
|
|
vm_call_closure_ref,
|
|
Eval_error,
|
|
Parse_error,
|
|
make_env,
|
|
env_extend,
|
|
env_bind,
|
|
env_has_id,
|
|
env_has,
|
|
env_get_id,
|
|
env_get,
|
|
env_set_id,
|
|
env_set,
|
|
env_merge,
|
|
value_to_string,
|
|
value_to_string_list,
|
|
value_to_bool,
|
|
value_to_string_opt,
|
|
unwrap_env_val,
|
|
make_lambda,
|
|
make_component,
|
|
make_island,
|
|
make_macro,
|
|
make_thunk,
|
|
make_symbol,
|
|
make_keyword,
|
|
type_of,
|
|
is_nil,
|
|
is_lambda,
|
|
is_component,
|
|
is_island,
|
|
is_macro,
|
|
is_thunk,
|
|
is_signal,
|
|
is_callable,
|
|
sx_truthy,
|
|
symbol_name,
|
|
keyword_name,
|
|
lambda_params,
|
|
lambda_body,
|
|
lambda_closure,
|
|
lambda_name,
|
|
set_lambda_name,
|
|
component_name,
|
|
component_params,
|
|
component_body,
|
|
component_closure,
|
|
component_has_children,
|
|
component_affinity,
|
|
macro_params,
|
|
macro_rest_param,
|
|
macro_body,
|
|
macro_closure,
|
|
thunk_expr,
|
|
thunk_env,
|
|
make_dict,
|
|
dict_get,
|
|
dict_has,
|
|
dict_set,
|
|
dict_delete,
|
|
dict_keys,
|
|
dict_vals,
|
|
inspect],
|
|
"Sx_types");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 773 "../lib/.sx.objs/jsoo/default/sx.cma.js"
|
|
//# shape: Sx_primitives:[N,N,N,F(2),F(1),F(1),N,F(1),F(1),F(1),F(1)*,F(1)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_ml_string_length = runtime.caml_ml_string_length,
|
|
caml_round_float = runtime.caml_round_float,
|
|
caml_string_get = runtime.caml_string_get,
|
|
caml_wrap_exception = runtime.caml_wrap_exception;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib_Hashtbl = global_data.Stdlib__Hashtbl,
|
|
Sx_types = global_data.Sx_types,
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_Float = global_data.Stdlib__Float,
|
|
Stdlib_Printf = global_data.Stdlib__Printf,
|
|
Stdlib_List = global_data.Stdlib__List,
|
|
Stdlib_String = global_data.Stdlib__String,
|
|
Stdlib_Buffer = global_data.Stdlib__Buffer,
|
|
Stdlib_Uchar = global_data.Stdlib__Uchar,
|
|
primitives = Stdlib_Hashtbl[1].call(null, 0, 128),
|
|
sx_call_fn =
|
|
[0,
|
|
function(a, param){
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "sx_call not initialized"], 1);
|
|
}],
|
|
sx_trampoline_fn = [0, function(v){return v;}];
|
|
function register(name, fn){
|
|
return Stdlib_Hashtbl[11].call(null, primitives, name, fn);
|
|
}
|
|
function is_primitive(name){
|
|
return Stdlib_Hashtbl[9].call(null, primitives, name);
|
|
}
|
|
function get_primitive(name){
|
|
var match = Stdlib_Hashtbl[7].call(null, primitives, name);
|
|
if(match){var fn = match[1]; return [13, name, fn];}
|
|
var a = Stdlib[28].call(null, "Unknown primitive: ", name);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], a], 1);
|
|
}
|
|
var
|
|
trampoline_hook = [0, function(v){return v;}],
|
|
cst = "",
|
|
cst_dict = "dict";
|
|
function as_number(t$1){
|
|
var t = t$1;
|
|
a:
|
|
for(;;){
|
|
if(typeof t === "number") return 0.;
|
|
switch(t[0]){
|
|
case 0:
|
|
return t[1] ? 1. : 0.;
|
|
case 1:
|
|
var n = t[1]; return n;
|
|
case 2:
|
|
var s = t[1], match = Stdlib[36].call(null, s);
|
|
if(! match) return Stdlib_Float[8];
|
|
var n$0 = match[1];
|
|
return n$0;
|
|
case 11:
|
|
var t$0 = caml_call1(trampoline_hook[1], t); t = t$0; break;
|
|
default: break a;
|
|
}
|
|
}
|
|
if(typeof t === "number" || ! (6 === t[0]))
|
|
var a = cst;
|
|
else{
|
|
var d = t[1];
|
|
if(Stdlib_Hashtbl[7].call(null, d, "__signal")){
|
|
var match$0 = Stdlib_Hashtbl[7].call(null, d, "value");
|
|
if(match$0)
|
|
var v = match$0[1], b = Sx_types[19].call(null, v);
|
|
else
|
|
var b = "?";
|
|
var
|
|
h = Stdlib[28].call(null, b, "}"),
|
|
a = Stdlib[28].call(null, "signal{value=", h);
|
|
}
|
|
else
|
|
var a = cst_dict;
|
|
}
|
|
var
|
|
c = Stdlib[28].call(null, ": ", a),
|
|
e = Sx_types[31].call(null, t),
|
|
f = Stdlib[28].call(null, e, c),
|
|
g = Stdlib[28].call(null, "Expected number, got ", f);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], g], 1);
|
|
}
|
|
function as_string(v){
|
|
if(typeof v !== "number" && 2 === v[0]){var s = v[1]; return s;}
|
|
var
|
|
a = Sx_types[31].call(null, v),
|
|
b = Stdlib[28].call(null, "Expected string, got ", a);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
|
|
}
|
|
function as_list(t$1){
|
|
var t = t$1;
|
|
for(;;){
|
|
if(typeof t === "number") return 0;
|
|
switch(t[0]){
|
|
case 5:
|
|
var l = t[1]; return l;
|
|
case 11:
|
|
var t$0 = caml_call1(sx_trampoline_fn[1], t); t = t$0; break;
|
|
case 19:
|
|
var r = t[1]; return r[1];
|
|
default:
|
|
var
|
|
a = Sx_types[31].call(null, t),
|
|
b = Stdlib[28].call(null, "Expected list, got ", a);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
|
|
}
|
|
}
|
|
}
|
|
function as_bool(v){
|
|
if(typeof v !== "number" && 0 === v[0]){var b = v[1]; return b;}
|
|
return Sx_types[40].call(null, v);
|
|
}
|
|
var
|
|
cst_g = "%g",
|
|
cst_false = "false",
|
|
cst_true = "true",
|
|
a = [0, [8, [0, 0, 3], 0, 0, 0], cst_g];
|
|
function to_string(t$1){
|
|
var t = t$1;
|
|
for(;;){
|
|
if(typeof t === "number") return cst;
|
|
switch(t[0]){
|
|
case 0:
|
|
return t[1] ? cst_true : cst_false;
|
|
case 1:
|
|
var n = t[1];
|
|
return Stdlib_Float[18].call(null, n)
|
|
? Stdlib[33].call(null, n | 0)
|
|
: caml_call1(Stdlib_Printf[4].call(null, a), n);
|
|
case 11:
|
|
var t$0 = caml_call1(trampoline_hook[1], t); t = t$0; break;
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
var s = t[1]; return s;
|
|
default: return Sx_types[67].call(null, t);
|
|
}
|
|
}
|
|
}
|
|
register
|
|
("+",
|
|
function(args){
|
|
return [1,
|
|
Stdlib_List[26].call
|
|
(null, function(acc, a){return acc + as_number(a);}, 0., args)];
|
|
});
|
|
var b = [1, 0.];
|
|
register
|
|
("-",
|
|
function(args){
|
|
if(! args) return b;
|
|
var a = args[1];
|
|
if(! args[2]) return [1, - as_number(a)];
|
|
var rest = args[2], c = as_number(a);
|
|
return [1,
|
|
Stdlib_List[26].call
|
|
(null, function(acc, x){return acc - as_number(x);}, c, rest)];
|
|
});
|
|
register
|
|
("*",
|
|
function(args){
|
|
return [1,
|
|
Stdlib_List[26].call
|
|
(null, function(acc, a){return acc * as_number(a);}, 1., args)];
|
|
});
|
|
register
|
|
("/",
|
|
function(args){
|
|
if(args){
|
|
var c = args[2];
|
|
if(c && ! c[2]){
|
|
var b = c[1], a = args[1], d = as_number(b);
|
|
return [1, as_number(a) / d];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "/: expected 2 args"], 1);
|
|
});
|
|
register
|
|
("mod",
|
|
function(args){
|
|
if(args){
|
|
var c = args[2];
|
|
if(c && ! c[2]){
|
|
var b = c[1], a = args[1], d = as_number(b);
|
|
return [1, as_number(a) % d];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "mod: expected 2 args"], 1);
|
|
});
|
|
register
|
|
("inc",
|
|
function(args){
|
|
if(args && ! args[2]){var a = args[1]; return [1, as_number(a) + 1.];}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "inc: 1 arg"], 1);
|
|
});
|
|
register
|
|
("dec",
|
|
function(args){
|
|
if(args && ! args[2]){var a = args[1]; return [1, as_number(a) - 1.];}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "dec: 1 arg"], 1);
|
|
});
|
|
register
|
|
("abs",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var a = args[1];
|
|
return [1, Math.abs(as_number(a))];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "abs: 1 arg"], 1);
|
|
});
|
|
register
|
|
("floor",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var a = args[1];
|
|
return [1, Math.floor(as_number(a))];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "floor: 1 arg"], 1);
|
|
});
|
|
register
|
|
("ceil",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var a = args[1];
|
|
return [1, Math.ceil(as_number(a))];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "ceil: 1 arg"], 1);
|
|
});
|
|
register
|
|
("round",
|
|
function(args){
|
|
if(args){
|
|
var match = args[2], a = args[1];
|
|
if(! match) return [1, caml_round_float(as_number(a))];
|
|
if(! match[2]){
|
|
var
|
|
b = match[1],
|
|
n = as_number(a),
|
|
places = as_number(b) | 0,
|
|
factor = Math.pow(10., places);
|
|
return [1, caml_round_float(n * factor) / factor];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "round: 1-2 args"], 1);
|
|
});
|
|
register
|
|
("min",
|
|
function(args){
|
|
if(args)
|
|
return [1,
|
|
Stdlib_List[26].call
|
|
(null,
|
|
function(acc, a){
|
|
var b = as_number(a);
|
|
return Stdlib_Float[23].call(null, acc, b);
|
|
},
|
|
Stdlib_Float[6],
|
|
args)];
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "min: at least 1 arg"], 1);
|
|
});
|
|
register
|
|
("max",
|
|
function(args){
|
|
if(args)
|
|
return [1,
|
|
Stdlib_List[26].call
|
|
(null,
|
|
function(acc, a){
|
|
var b = as_number(a);
|
|
return Stdlib_Float[24].call(null, acc, b);
|
|
},
|
|
Stdlib_Float[7],
|
|
args)];
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "max: at least 1 arg"], 1);
|
|
});
|
|
register
|
|
("sqrt",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var a = args[1];
|
|
return [1, Math.sqrt(as_number(a))];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "sqrt: 1 arg"], 1);
|
|
});
|
|
register
|
|
("pow",
|
|
function(args){
|
|
if(args){
|
|
var c = args[2];
|
|
if(c && ! c[2]){
|
|
var b = c[1], a = args[1], d = as_number(b);
|
|
return [1, Math.pow(as_number(a), d)];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "pow: 2 args"], 1);
|
|
});
|
|
register
|
|
("clamp",
|
|
function(args){
|
|
if(args){
|
|
var a = args[2];
|
|
if(a){
|
|
var b = a[2];
|
|
if(b && ! b[2]){
|
|
var
|
|
hi = b[1],
|
|
lo = a[1],
|
|
x = args[1],
|
|
x$0 = as_number(x),
|
|
lo$0 = as_number(lo),
|
|
hi$0 = as_number(hi),
|
|
c = Stdlib_Float[23].call(null, hi$0, x$0);
|
|
return [1, Stdlib_Float[24].call(null, lo$0, c)];
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "clamp: 3 args"], 1);
|
|
});
|
|
register
|
|
("parse-int",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 1:
|
|
var c = args[2], n = a[1];
|
|
if(c && c[2]) break a;
|
|
return [1, n | 0];
|
|
case 2:
|
|
var match = args[2], s = a[1];
|
|
if(match){
|
|
if(match[2]) break a;
|
|
var default_val$0 = match[1], match$0 = Stdlib[34].call(null, s);
|
|
if(! match$0) return default_val$0;
|
|
var n$0 = match$0[1];
|
|
return [1, n$0];
|
|
}
|
|
var match$1 = Stdlib[34].call(null, s);
|
|
if(! match$1) return 0;
|
|
var n$1 = match$1[1];
|
|
return [1, n$1];
|
|
}
|
|
var b = args[2];
|
|
if(b && ! b[2]){var default_val = b[1]; return default_val;}
|
|
}
|
|
return 0;
|
|
});
|
|
register
|
|
("parse-float",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 1:
|
|
if(! args[2]){var n = a[1]; return [1, n];} break;
|
|
case 2:
|
|
if(! args[2]){
|
|
var s = a[1], match = Stdlib[36].call(null, s);
|
|
if(! match) return 0;
|
|
var n$0 = match[1];
|
|
return [1, n$0];
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
var cst_host_handle = "__host_handle";
|
|
function safe_eq(a, b){
|
|
if(a === b) return 1;
|
|
a:
|
|
if(typeof a === "number"){
|
|
if(typeof b === "number") return 1;
|
|
}
|
|
else{
|
|
switch(a[0]){
|
|
case 0:
|
|
if(typeof b === "number") break a;
|
|
if(0 !== b[0]) break a;
|
|
var y = b[1], x = a[1];
|
|
return x === y ? 1 : 0;
|
|
case 1:
|
|
if(typeof b === "number") break a;
|
|
if(1 !== b[0]) break a;
|
|
var y$0 = b[1], x$0 = a[1];
|
|
return x$0 === y$0 ? 1 : 0;
|
|
case 2:
|
|
if(typeof b === "number") break a;
|
|
if(2 !== b[0]) break a;
|
|
var y$1 = b[1], x$1 = a[1];
|
|
return x$1 === y$1 ? 1 : 0;
|
|
case 3:
|
|
if(typeof b === "number") break a;
|
|
if(3 !== b[0]) break a;
|
|
var y$2 = b[1], x$2 = a[1];
|
|
return x$2 === y$2 ? 1 : 0;
|
|
case 4:
|
|
if(typeof b === "number") break a;
|
|
if(4 !== b[0]) break a;
|
|
var y$3 = b[1], x$3 = a[1];
|
|
return x$3 === y$3 ? 1 : 0;
|
|
case 5:
|
|
var la = a[1]; break;
|
|
case 6:
|
|
if(typeof b === "number") break a;
|
|
if(6 !== b[0]) break a;
|
|
var
|
|
b$0 = b[1],
|
|
a$0 = a[1],
|
|
match = Stdlib_Hashtbl[7].call(null, a$0, cst_host_handle),
|
|
match$0 = Stdlib_Hashtbl[7].call(null, b$0, cst_host_handle);
|
|
if(match){
|
|
var c = match[1];
|
|
if(typeof c !== "number" && 1 === c[0] && match$0){
|
|
var match$1 = match$0[1];
|
|
if(typeof match$1 !== "number" && 1 === match$1[0]){
|
|
var hb = match$1[1], ha = c[1];
|
|
return ha === hb ? 1 : 0;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
case 19:
|
|
var la = a[1][1]; break;
|
|
default: break a;
|
|
}
|
|
if(typeof b !== "number"){
|
|
switch(b[0]){
|
|
case 5:
|
|
var lb = b[1]; break;
|
|
case 19:
|
|
var lb = b[1][1]; break;
|
|
default: break a;
|
|
}
|
|
var
|
|
e = Stdlib_List[1].call(null, lb),
|
|
d = Stdlib_List[1].call(null, la) === e ? 1 : 0;
|
|
return d ? Stdlib_List[35].call(null, safe_eq, la, lb) : d;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
register
|
|
("=",
|
|
function(args){
|
|
if(args){
|
|
var c = args[2];
|
|
if(c && ! c[2]){var b = c[1], a = args[1]; return [0, safe_eq(a, b)];}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "=: 2 args"], 1);
|
|
});
|
|
register
|
|
("!=",
|
|
function(args){
|
|
if(args){
|
|
var c = args[2];
|
|
if(c && ! c[2]){
|
|
var b = c[1], a = args[1];
|
|
return [0, 1 - safe_eq(a, b)];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "!=: 2 args"], 1);
|
|
});
|
|
register
|
|
("<",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0]){
|
|
var d = args[2];
|
|
if(! d) break a;
|
|
var e = d[1];
|
|
if(typeof e !== "number" && 2 === e[0]){
|
|
if(d[2]) break a;
|
|
var b$0 = e[1], a$0 = a[1];
|
|
return [0, runtime.caml_string_lessthan(a$0, b$0)];
|
|
}
|
|
}
|
|
var c = args[2];
|
|
if(c && ! c[2]){
|
|
var b = c[1], f = as_number(b);
|
|
return [0, as_number(a) < f ? 1 : 0];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "<: 2 args"], 1);
|
|
});
|
|
register
|
|
(">",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0]){
|
|
var d = args[2];
|
|
if(! d) break a;
|
|
var e = d[1];
|
|
if(typeof e !== "number" && 2 === e[0]){
|
|
if(d[2]) break a;
|
|
var b$0 = e[1], a$0 = a[1];
|
|
return [0, runtime.caml_string_greaterthan(a$0, b$0)];
|
|
}
|
|
}
|
|
var c = args[2];
|
|
if(c && ! c[2]){
|
|
var b = c[1], f = as_number(b);
|
|
return [0, f < as_number(a) ? 1 : 0];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], ">: 2 args"], 1);
|
|
});
|
|
register
|
|
("<=",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0]){
|
|
var d = args[2];
|
|
if(! d) break a;
|
|
var e = d[1];
|
|
if(typeof e !== "number" && 2 === e[0]){
|
|
if(d[2]) break a;
|
|
var b$0 = e[1], a$0 = a[1];
|
|
return [0, runtime.caml_string_lessequal(a$0, b$0)];
|
|
}
|
|
}
|
|
var c = args[2];
|
|
if(c && ! c[2]){
|
|
var b = c[1], f = as_number(b);
|
|
return [0, as_number(a) <= f ? 1 : 0];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "<=: 2 args"], 1);
|
|
});
|
|
register
|
|
(">=",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0]){
|
|
var d = args[2];
|
|
if(! d) break a;
|
|
var e = d[1];
|
|
if(typeof e !== "number" && 2 === e[0]){
|
|
if(d[2]) break a;
|
|
var b$0 = e[1], a$0 = a[1];
|
|
return [0, runtime.caml_string_greaterequal(a$0, b$0)];
|
|
}
|
|
}
|
|
var c = args[2];
|
|
if(c && ! c[2]){
|
|
var b = c[1], f = as_number(b);
|
|
return [0, f <= as_number(a) ? 1 : 0];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], ">=: 2 args"], 1);
|
|
});
|
|
register
|
|
("not",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var a = args[1];
|
|
return [0, 1 - Sx_types[40].call(null, a)];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "not: 1 arg"], 1);
|
|
});
|
|
register
|
|
("nil?",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var a = args[1];
|
|
return [0, Sx_types[32].call(null, a)];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "nil?: 1 arg"], 1);
|
|
});
|
|
var c = [0, 0], d = [0, 1];
|
|
register
|
|
("number?",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 1 === a[0]){if(args[2]) break a; return d;}
|
|
if(! args[2]) return c;
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "number?: 1 arg"], 1);
|
|
});
|
|
var e = [0, 0], f = [0, 1];
|
|
register
|
|
("string?",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0]){if(args[2]) break a; return f;}
|
|
if(! args[2]) return e;
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "string?: 1 arg"], 1);
|
|
});
|
|
var g = [0, 0], h = [0, 1];
|
|
register
|
|
("boolean?",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 0 === a[0]){if(args[2]) break a; return h;}
|
|
if(! args[2]) return g;
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "boolean?: 1 arg"], 1);
|
|
});
|
|
var i = [0, 0], j = [0, 1];
|
|
register
|
|
("list?",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){case 5:case 19: if(args[2]) break a; return j;}
|
|
if(! args[2]) return i;
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "list?: 1 arg"], 1);
|
|
});
|
|
var k = [0, 0], l = [0, 1];
|
|
register
|
|
("dict?",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 6 === a[0]){if(args[2]) break a; return l;}
|
|
if(! args[2]) return k;
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "dict?: 1 arg"], 1);
|
|
});
|
|
var m = [0, 0], n = [0, 1];
|
|
register
|
|
("symbol?",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 3 === a[0]){if(args[2]) break a; return n;}
|
|
if(! args[2]) return m;
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "symbol?: 1 arg"], 1);
|
|
});
|
|
var o = [0, 0], p = [0, 1];
|
|
register
|
|
("keyword?",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 4 === a[0]){if(args[2]) break a; return p;}
|
|
if(! args[2]) return o;
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "keyword?: 1 arg"], 1);
|
|
});
|
|
var q = [0, 1], r = [0, 0], s = [0, 0], t = [0, 1], u = [0, 0], v = [0, 1];
|
|
register
|
|
("empty?",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number"){
|
|
b:
|
|
{
|
|
switch(a[0]){
|
|
case 2:
|
|
if(a[1] !== cst){if(args[2]) break a; return s;}
|
|
if(args[2]) break a;
|
|
return t;
|
|
case 5:
|
|
if(a[1]){if(args[2]) break a; break b;}
|
|
if(args[2]) break a;
|
|
break;
|
|
case 6:
|
|
if(args[2]) break a;
|
|
var d = a[1];
|
|
return [0, 0 === Stdlib_Hashtbl[15].call(null, d) ? 1 : 0];
|
|
case 19:
|
|
if(a[1][1]){if(args[2]) break a; break b;}
|
|
if(args[2]) break a;
|
|
break;
|
|
default: if(args[2]) break a; return r;
|
|
}
|
|
return v;
|
|
}
|
|
return u;
|
|
}
|
|
if(! args[2]) return q;
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "empty?: 1 arg"], 1);
|
|
});
|
|
register
|
|
("odd?",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var a = args[1];
|
|
return [0, 0 !== ((as_number(a) | 0) % 2 | 0) ? 1 : 0];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "odd?: 1 arg"], 1);
|
|
});
|
|
register
|
|
("even?",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var a = args[1];
|
|
return [0, 0 === ((as_number(a) | 0) % 2 | 0) ? 1 : 0];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "even?: 1 arg"], 1);
|
|
});
|
|
register
|
|
("zero?",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var a = args[1];
|
|
return [0, as_number(a) === 0. ? 1 : 0];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "zero?: 1 arg"], 1);
|
|
});
|
|
register
|
|
("str",
|
|
function(args){
|
|
var a = Stdlib_List[20].call(null, to_string, args);
|
|
return [2, Stdlib_String[7].call(null, cst, a)];
|
|
});
|
|
register
|
|
("upper",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var a = args[1], b = as_string(a);
|
|
return [2, Stdlib_String[26].call(null, b)];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "upper: 1 arg"], 1);
|
|
});
|
|
register
|
|
("upcase",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var a = args[1], b = as_string(a);
|
|
return [2, Stdlib_String[26].call(null, b)];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "upcase: 1 arg"], 1);
|
|
});
|
|
register
|
|
("lower",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var a = args[1], b = as_string(a);
|
|
return [2, Stdlib_String[27].call(null, b)];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "lower: 1 arg"], 1);
|
|
});
|
|
register
|
|
("downcase",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var a = args[1], b = as_string(a);
|
|
return [2, Stdlib_String[27].call(null, b)];
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "downcase: 1 arg"], 1);
|
|
});
|
|
register
|
|
("trim",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var a = args[1], b = as_string(a);
|
|
return [2, Stdlib_String[24].call(null, b)];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "trim: 1 arg"], 1);
|
|
});
|
|
register
|
|
("string-length",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var a = args[1];
|
|
return [1, caml_ml_string_length(as_string(a))];
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "string-length: 1 arg"], 1);
|
|
});
|
|
register
|
|
("string-contains?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0]){
|
|
var b = args[2];
|
|
if(b){
|
|
var c = b[1];
|
|
if(typeof c !== "number" && 2 === c[0] && ! b[2]){
|
|
var needle = c[1], haystack = a[1], i = 0;
|
|
for(;;){
|
|
if
|
|
(caml_ml_string_length(haystack)
|
|
< (i + caml_ml_string_length(needle) | 0))
|
|
var d = 0;
|
|
else{
|
|
if
|
|
(Stdlib_String[16].call
|
|
(null, haystack, i, caml_ml_string_length(needle))
|
|
!== needle){
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
continue;
|
|
}
|
|
var d = 1;
|
|
}
|
|
return [0, d];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "string-contains?: 2 string args"], 1);
|
|
});
|
|
register
|
|
("starts-with?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0]){
|
|
var b = args[2];
|
|
if(b){
|
|
var c = b[1];
|
|
if(typeof c !== "number" && 2 === c[0] && ! b[2]){
|
|
var
|
|
prefix = c[1],
|
|
s = a[1],
|
|
d =
|
|
caml_ml_string_length(prefix) <= caml_ml_string_length(s) ? 1 : 0,
|
|
e =
|
|
d
|
|
? Stdlib_String
|
|
[16].call
|
|
(null, s, 0, caml_ml_string_length(prefix))
|
|
=== prefix
|
|
? 1
|
|
: 0
|
|
: d;
|
|
return [0, e];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "starts-with?: 2 string args"], 1);
|
|
});
|
|
register
|
|
("ends-with?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0]){
|
|
var b = args[2];
|
|
if(b){
|
|
var c = b[1];
|
|
if(typeof c !== "number" && 2 === c[0] && ! b[2]){
|
|
var
|
|
suffix = c[1],
|
|
s = a[1],
|
|
sl = caml_ml_string_length(s),
|
|
xl = caml_ml_string_length(suffix),
|
|
d = xl <= sl ? 1 : 0,
|
|
e =
|
|
d
|
|
? Stdlib_String
|
|
[16].call
|
|
(null, s, sl - xl | 0, xl)
|
|
=== suffix
|
|
? 1
|
|
: 0
|
|
: d;
|
|
return [0, e];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "ends-with?: 2 string args"], 1);
|
|
});
|
|
var w = [1, -1.];
|
|
register
|
|
("index-of",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0]){
|
|
var b = args[2];
|
|
if(b){
|
|
var c = b[1];
|
|
if(typeof c !== "number" && 2 === c[0] && ! b[2]){
|
|
var
|
|
needle = c[1],
|
|
haystack = a[1],
|
|
nl = caml_ml_string_length(needle),
|
|
hl = caml_ml_string_length(haystack),
|
|
i = 0;
|
|
for(;;){
|
|
if(hl < (i + nl | 0)) return w;
|
|
if(Stdlib_String[16].call(null, haystack, i, nl) === needle)
|
|
return [1, i];
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "index-of: 2 string args"], 1);
|
|
});
|
|
register
|
|
("substring",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0]){
|
|
var b = args[2];
|
|
if(b){
|
|
var c = b[1];
|
|
if(typeof c !== "number" && 1 === c[0]){
|
|
var d = b[2];
|
|
if(d){
|
|
var e = d[1];
|
|
if(typeof e !== "number" && 1 === e[0] && ! d[2]){
|
|
var
|
|
end = e[1],
|
|
start = c[1],
|
|
s = a[1],
|
|
i = start | 0,
|
|
j = end | 0,
|
|
len = caml_ml_string_length(s),
|
|
f = Stdlib[16].call(null, i, len),
|
|
i$0 = Stdlib[17].call(null, 0, f),
|
|
g = Stdlib[16].call(null, j, len),
|
|
j$0 = Stdlib[17].call(null, 0, g),
|
|
h = Stdlib[17].call(null, 0, j$0 - i$0 | 0);
|
|
return [2, Stdlib_String[16].call(null, s, i$0, h)];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "substring: 3 args"], 1);
|
|
});
|
|
register
|
|
("substr",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0]){
|
|
var b = args[2];
|
|
if(b){
|
|
var c = b[1];
|
|
if(typeof c !== "number" && 1 === c[0]){
|
|
var match = b[2], start = c[1], s = a[1];
|
|
if(! match){
|
|
var
|
|
i$1 = start | 0,
|
|
sl$0 = caml_ml_string_length(s),
|
|
g = Stdlib[16].call(null, i$1, sl$0),
|
|
i$2 = Stdlib[17].call(null, 0, g);
|
|
return [2, Stdlib_String[16].call(null, s, i$2, sl$0 - i$2 | 0)];
|
|
}
|
|
var d = match[1];
|
|
if(typeof d !== "number" && 1 === d[0] && ! match[2]){
|
|
var
|
|
len = d[1],
|
|
i = start | 0,
|
|
n = len | 0,
|
|
sl = caml_ml_string_length(s),
|
|
e = Stdlib[16].call(null, i, sl),
|
|
i$0 = Stdlib[17].call(null, 0, e),
|
|
f = Stdlib[16].call(null, n, sl - i$0 | 0),
|
|
n$0 = Stdlib[17].call(null, 0, f);
|
|
return [2, Stdlib_String[16].call(null, s, i$0, n$0)];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "substr: 2-3 args"], 1);
|
|
});
|
|
register
|
|
("split",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0]){
|
|
var b = args[2];
|
|
if(b){
|
|
var c = b[1];
|
|
if(typeof c !== "number" && 2 === c[0] && ! b[2]){
|
|
var
|
|
sep = c[1],
|
|
s = a[1],
|
|
d = caml_string_get(sep, 0),
|
|
e = Stdlib_String[17].call(null, d, s);
|
|
return [5,
|
|
Stdlib_List[20].call(null, function(p){return [2, p];}, e)];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "split: 2 args"], 1);
|
|
});
|
|
register
|
|
("join",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var b = args[1];
|
|
if(typeof b !== "number" && 2 === b[0]){
|
|
var c = args[2];
|
|
if(c){
|
|
var a = c[1], sep = b[1];
|
|
if(typeof a !== "number"){
|
|
switch(a[0]){
|
|
case 5:
|
|
var items = a[1]; break;
|
|
case 19:
|
|
var items = a[1][1]; break;
|
|
default: break a;
|
|
}
|
|
if(! c[2]){
|
|
var d = Stdlib_List[20].call(null, to_string, items);
|
|
return [2, Stdlib_String[7].call(null, sep, d)];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "join: 2 args"], 1);
|
|
});
|
|
var x = [0, [8, [0, 0, 3], 0, 0, 0], cst_g];
|
|
register
|
|
("replace",
|
|
function(args){
|
|
function to_str(t){
|
|
if(typeof t === "number") return cst;
|
|
switch(t[0]){
|
|
case 0:
|
|
return t[1] ? cst_true : cst_false;
|
|
case 1:
|
|
var n = t[1];
|
|
return Stdlib_Float[18].call(null, n)
|
|
? Stdlib[33].call(null, n | 0)
|
|
: caml_call1(Stdlib_Printf[4].call(null, x), n);
|
|
case 11:
|
|
var v = caml_call1(sx_trampoline_fn[1], t);
|
|
if(typeof v !== "number" && 2 === v[0]){var s$0 = v[1]; return s$0;}
|
|
return to_string(v);
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 15:
|
|
case 17:
|
|
var s = t[1]; return s;
|
|
default: return to_string(t);
|
|
}
|
|
}
|
|
if(args){
|
|
var a = args[2];
|
|
if(a){
|
|
var b = a[2];
|
|
if(b && ! b[2]){
|
|
var
|
|
new_s = b[1],
|
|
old_s = a[1],
|
|
s = args[1],
|
|
s$0 = to_str(s),
|
|
old_s$0 = to_str(old_s),
|
|
new_s$0 = to_str(new_s),
|
|
ol = caml_ml_string_length(old_s$0);
|
|
if(0 === ol) return [2, s$0];
|
|
var
|
|
buf = Stdlib_Buffer[1].call(null, caml_ml_string_length(s$0)),
|
|
i = 0;
|
|
for(;;){
|
|
if(caml_ml_string_length(s$0) <= i)
|
|
return [2, Stdlib_Buffer[2].call(null, buf)];
|
|
if
|
|
((i + ol | 0) <= caml_ml_string_length(s$0)
|
|
&& Stdlib_String[16].call(null, s$0, i, ol) === old_s$0){
|
|
Stdlib_Buffer[16].call(null, buf, new_s$0);
|
|
var i$0 = i + ol | 0;
|
|
i = i$0;
|
|
continue;
|
|
}
|
|
var c = caml_string_get(s$0, i);
|
|
Stdlib_Buffer[12].call(null, buf, c);
|
|
var i$1 = i + 1 | 0;
|
|
i = i$1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "replace: 3 string args"], 1);
|
|
});
|
|
register
|
|
("char-from-code",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 1 === a[0] && ! args[2]){
|
|
var
|
|
n = a[1],
|
|
buf = Stdlib_Buffer[1].call(null, 4),
|
|
b = Stdlib_Uchar[8].call(null, n | 0);
|
|
Stdlib_Buffer[13].call(null, buf, b);
|
|
return [2, Stdlib_Buffer[2].call(null, buf)];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "char-from-code: 1 arg"], 1);
|
|
});
|
|
register("list", function(args){return [19, [0, args]];});
|
|
var
|
|
cst_args = " args",
|
|
y = [0, [11, "len: ", [4, 0, 0, 0, [11, cst_args, 0]]], "len: %d args"],
|
|
z = [1, 0.],
|
|
A = [1, 1.],
|
|
B = [1, 1.],
|
|
C = [1, 0.];
|
|
register
|
|
("len",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
b:
|
|
{
|
|
if(typeof a !== "number"){
|
|
switch(a[0]){
|
|
case 0:
|
|
if(a[1]){if(args[2]) break a; return A;}
|
|
if(args[2]) break a;
|
|
break b;
|
|
case 1:
|
|
if(args[2]) break a; return B;
|
|
case 2:
|
|
if(args[2]) break a;
|
|
var s = a[1];
|
|
return [1, caml_ml_string_length(s)];
|
|
case 5:
|
|
if(args[2]) break a; var l = a[1]; break;
|
|
case 6:
|
|
if(args[2]) break a;
|
|
var d = a[1];
|
|
return [1, Stdlib_Hashtbl[15].call(null, d)];
|
|
case 15:
|
|
if(args[2]) break a;
|
|
var s$0 = a[1];
|
|
return [1, caml_ml_string_length(s$0)];
|
|
case 16:
|
|
if(args[2]) break a;
|
|
var pairs = a[1];
|
|
return [1, Stdlib_List[1].call(null, pairs)];
|
|
case 17:
|
|
if(args[2]) break a;
|
|
var s$1 = a[1];
|
|
return [1, caml_ml_string_length(s$1)];
|
|
case 19:
|
|
var e = a[1][1]; if(args[2]) break a; var l = e; break;
|
|
case 12:
|
|
case 14:
|
|
case 18:
|
|
case 20:
|
|
case 21:
|
|
case 22:
|
|
break a;
|
|
default: if(args[2]) break a; return C;
|
|
}
|
|
return [1, Stdlib_List[1].call(null, l)];
|
|
}
|
|
if(args[2]) break a;
|
|
}
|
|
return z;
|
|
}
|
|
var
|
|
b = Stdlib_List[1].call(null, args),
|
|
c = caml_call1(Stdlib_Printf[4].call(null, y), b);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], c], 1);
|
|
});
|
|
register
|
|
("first",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var x = args[1];
|
|
if(typeof x !== "number"){
|
|
b:
|
|
{
|
|
switch(x[0]){
|
|
case 5:
|
|
var a = x[1];
|
|
if(a){if(args[2]) break a; var x$0 = a[1]; break b;}
|
|
if(args[2]) break a;
|
|
break;
|
|
case 19:
|
|
var b = x[1][1];
|
|
if(b){if(args[2]) break a; var x$0 = b[1]; break b;}
|
|
if(args[2]) break a;
|
|
break;
|
|
default:
|
|
if(args[2]) break a;
|
|
var
|
|
c = Sx_types[67].call(null, x),
|
|
d = Stdlib[28].call(null, "first: expected list, got ", c);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], d], 1);
|
|
}
|
|
return 0;
|
|
}
|
|
return x$0;
|
|
}
|
|
if(! args[2]) return 0;
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "first: 1 list arg"], 1);
|
|
});
|
|
var D = [5, 0], E = [5, 0];
|
|
register
|
|
("rest",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number"){
|
|
b:
|
|
{
|
|
switch(a[0]){
|
|
case 5:
|
|
var b = a[1];
|
|
if(b){if(args[2]) break a; var xs = b[2]; break b;}
|
|
if(args[2]) break a;
|
|
break;
|
|
case 19:
|
|
var c = a[1][1];
|
|
if(c){if(args[2]) break a; var xs = c[2]; break b;}
|
|
if(args[2]) break a;
|
|
break;
|
|
default: break a;
|
|
}
|
|
return E;
|
|
}
|
|
return [5, xs];
|
|
}
|
|
if(! args[2]) return D;
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "rest: 1 list arg"], 1);
|
|
});
|
|
register
|
|
("last",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number"){
|
|
switch(a[0]){
|
|
case 5:
|
|
if(args[2]) break a; var l = a[1]; break;
|
|
case 19:
|
|
var b = a[1][1]; if(args[2]) break a; var l = b; break;
|
|
default: break a;
|
|
}
|
|
var match = Stdlib_List[10].call(null, l);
|
|
if(! match) return 0;
|
|
var x = match[1];
|
|
return x;
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "last: 1 list arg"], 1);
|
|
});
|
|
var F = [5, 0];
|
|
register
|
|
("init",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number"){
|
|
switch(a[0]){
|
|
case 5:
|
|
if(args[2]) break a; var l = a[1]; break;
|
|
case 19:
|
|
var b = a[1][1]; if(args[2]) break a; var l = b; break;
|
|
default: break a;
|
|
}
|
|
var match = Stdlib_List[10].call(null, l);
|
|
if(! match) return F;
|
|
var rest = match[2];
|
|
return [5, Stdlib_List[10].call(null, rest)];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "init: 1 list arg"], 1);
|
|
});
|
|
register
|
|
("nth",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number"){
|
|
switch(a[0]){
|
|
case 2:
|
|
var b = args[2];
|
|
if(! b) break a;
|
|
var c = b[1];
|
|
if(typeof c === "number") break a;
|
|
if(1 !== c[0]) break a;
|
|
if(b[2]) break a;
|
|
var n = c[1], s = a[1], i = n | 0;
|
|
if(0 <= i && i < caml_ml_string_length(s)){
|
|
var h = caml_string_get(s, i);
|
|
return [2, Stdlib_String[1].call(null, 1, h)];
|
|
}
|
|
return 0;
|
|
case 5:
|
|
var d = args[2];
|
|
if(! d) break a;
|
|
var e = d[1];
|
|
if(typeof e === "number") break a;
|
|
if(1 !== e[0]) break a;
|
|
if(d[2]) break a;
|
|
var n$0 = e[1], l = a[1];
|
|
break;
|
|
case 19:
|
|
var f = args[2], k = a[1][1];
|
|
if(! f) break a;
|
|
var g = f[1];
|
|
if(typeof g === "number") break a;
|
|
if(1 !== g[0]) break a;
|
|
if(f[2]) break a;
|
|
var n$0 = g[1], l = k;
|
|
break;
|
|
default: break a;
|
|
}
|
|
try{var j = Stdlib_List[8].call(null, l, n$0 | 0); return j;}
|
|
catch(exn){return 0;}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "nth: list/string and number"], 1);
|
|
});
|
|
register
|
|
("cons",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[2];
|
|
if(a){
|
|
var b = a[1], x = args[1];
|
|
if(typeof b !== "number"){
|
|
switch(b[0]){
|
|
case 5:
|
|
if(a[2]) break a; var l = b[1]; break;
|
|
case 19:
|
|
var c = b[1][1]; if(a[2]) break a; var l = c; break;
|
|
default: break a;
|
|
}
|
|
return [5, [0, x, l]];
|
|
}
|
|
if(! a[2]) return [5, [0, x, 0]];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "cons: value and list"], 1);
|
|
});
|
|
register
|
|
("append",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var v = args[1];
|
|
if(typeof v === "number"){
|
|
var d = args[2];
|
|
if(d){
|
|
var a = d[1];
|
|
if(typeof a !== "number"){
|
|
switch(a[0]){
|
|
case 5:
|
|
var lb = a[1]; break;
|
|
case 19:
|
|
var lb = a[1][1]; break;
|
|
default: break a;
|
|
}
|
|
if(! d[2]) return [5, lb];
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
b:
|
|
{
|
|
switch(v[0]){
|
|
case 5:
|
|
var la$0 = v[1]; break;
|
|
case 19:
|
|
var la$0 = v[1][1]; break;
|
|
default: break b;
|
|
}
|
|
var f = args[2];
|
|
if(! f) break a;
|
|
var c = f[1];
|
|
if(typeof c !== "number"){
|
|
switch(c[0]){
|
|
case 5:
|
|
var lb$1 = c[1]; break;
|
|
case 19:
|
|
var lb$1 = c[1][1]; break;
|
|
default: break b;
|
|
}
|
|
if(f[2]) break a;
|
|
return [5, Stdlib[37].call(null, la$0, lb$1)];
|
|
}
|
|
c:
|
|
{
|
|
if(typeof v !== "number" && 19 === v[0]){var la$1 = v[1][1]; break c;}
|
|
var la$1 = v[1];
|
|
}
|
|
if(args[2][2]) break a;
|
|
return [5, la$1];
|
|
}
|
|
b:
|
|
if(typeof v !== "number"){
|
|
switch(v[0]){
|
|
case 5:
|
|
var la = v[1]; break;
|
|
case 19:
|
|
var la = v[1][1]; break;
|
|
default: break b;
|
|
}
|
|
var g = args[2];
|
|
if(g[2]) break a;
|
|
var v$0 = g[1];
|
|
return [5, Stdlib[37].call(null, la, [0, v$0, 0])];
|
|
}
|
|
var e = args[2];
|
|
if(e){
|
|
var b = e[1];
|
|
if(typeof b !== "number"){
|
|
switch(b[0]){
|
|
case 5:
|
|
var lb$0 = b[1]; break;
|
|
case 19:
|
|
var lb$0 = b[1][1]; break;
|
|
default: break a;
|
|
}
|
|
if(! e[2]) return [5, Stdlib[37].call(null, [0, v, 0], lb$0)];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
var all = Stdlib_List[24].call(null, as_list, args);
|
|
return [5, all];
|
|
});
|
|
register
|
|
("reverse",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number"){
|
|
switch(a[0]){
|
|
case 5:
|
|
if(args[2]) break a; var l = a[1]; break;
|
|
case 19:
|
|
var b = a[1][1]; if(args[2]) break a; var l = b; break;
|
|
default: break a;
|
|
}
|
|
return [5, Stdlib_List[10].call(null, l)];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "reverse: 1 list"], 1);
|
|
});
|
|
register
|
|
("flatten",
|
|
function(args){
|
|
function flat(x){
|
|
a:
|
|
if(typeof x !== "number"){
|
|
switch(x[0]){
|
|
case 5:
|
|
var items = x[1]; break;
|
|
case 19:
|
|
var items = x[1][1]; break;
|
|
default: break a;
|
|
}
|
|
return Stdlib_List[24].call(null, flat, items);
|
|
}
|
|
return [0, x, 0];
|
|
}
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number"){
|
|
switch(a[0]){
|
|
case 5:
|
|
if(args[2]) break a; var l = a[1]; break;
|
|
case 19:
|
|
var b = a[1][1]; if(args[2]) break a; var l = b; break;
|
|
default: break a;
|
|
}
|
|
return [5, Stdlib_List[24].call(null, flat, l)];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "flatten: 1 list"], 1);
|
|
});
|
|
register
|
|
("concat",
|
|
function(args){return [5, Stdlib_List[24].call(null, as_list, args)];});
|
|
register
|
|
("contains?",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number"){
|
|
switch(a[0]){
|
|
case 2:
|
|
var b = args[2];
|
|
if(! b) break a;
|
|
var c = b[1];
|
|
if(typeof c === "number") break a;
|
|
if(2 !== c[0]) break a;
|
|
if(b[2]) break a;
|
|
var sub = c[1], s = a[1], i = 0;
|
|
for(;;){
|
|
if
|
|
(caml_ml_string_length(s) < (i + caml_ml_string_length(sub) | 0))
|
|
var f = 0;
|
|
else{
|
|
if
|
|
(Stdlib_String[16].call(null, s, i, caml_ml_string_length(sub))
|
|
!== sub){
|
|
var i$0 = i + 1 | 0;
|
|
i = i$0;
|
|
continue;
|
|
}
|
|
var f = 1;
|
|
}
|
|
return [0, f];
|
|
}
|
|
case 5:
|
|
var d = args[2];
|
|
if(! d) break a;
|
|
if(d[2]) break a;
|
|
var item = d[1], l = a[1];
|
|
break;
|
|
case 19:
|
|
var e = args[2], g = a[1][1];
|
|
if(! e) break a;
|
|
if(e[2]) break a;
|
|
var item = e[1], l = g;
|
|
break;
|
|
default: break a;
|
|
}
|
|
return [0,
|
|
Stdlib_List[34].call
|
|
(null,
|
|
function(x$4){
|
|
var d = x$4 === item ? 1 : 0;
|
|
if(d)
|
|
var e = d;
|
|
else{
|
|
if(typeof x$4 === "number"){
|
|
if(typeof item === "number") return 1;
|
|
}
|
|
else
|
|
switch(x$4[0]){
|
|
case 0:
|
|
if(typeof item !== "number" && 0 === item[0]){
|
|
var y = item[1], x = x$4[1];
|
|
return x === y ? 1 : 0;
|
|
}
|
|
break;
|
|
case 1:
|
|
if(typeof item !== "number" && 1 === item[0]){
|
|
var y$0 = item[1], x$0 = x$4[1];
|
|
return x$0 === y$0 ? 1 : 0;
|
|
}
|
|
break;
|
|
case 2:
|
|
if(typeof item !== "number" && 2 === item[0]){
|
|
var y$1 = item[1], x$1 = x$4[1];
|
|
return x$1 === y$1 ? 1 : 0;
|
|
}
|
|
break;
|
|
case 3:
|
|
if(typeof item !== "number" && 3 === item[0]){
|
|
var y$2 = item[1], x$2 = x$4[1];
|
|
return x$2 === y$2 ? 1 : 0;
|
|
}
|
|
break;
|
|
case 4:
|
|
if(typeof item !== "number" && 4 === item[0]){
|
|
var y$3 = item[1], x$3 = x$4[1];
|
|
return x$3 === y$3 ? 1 : 0;
|
|
}
|
|
break;
|
|
case 6:
|
|
if(typeof item !== "number" && 6 === item[0]){
|
|
var
|
|
b = item[1],
|
|
a = x$4[1],
|
|
match = Stdlib_Hashtbl[7].call(null, a, cst_host_handle),
|
|
match$0 = Stdlib_Hashtbl[7].call(null, b, cst_host_handle);
|
|
if(match){
|
|
var c = match[1];
|
|
if(typeof c !== "number" && 1 === c[0] && match$0){
|
|
var match$1 = match$0[1];
|
|
if(typeof match$1 !== "number" && 1 === match$1[0]){
|
|
var hb = match$1[1], ha = c[1];
|
|
return ha === hb ? 1 : 0;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
break;
|
|
}
|
|
var e = 0;
|
|
}
|
|
return e;
|
|
},
|
|
l)];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "contains?: 2 args"], 1);
|
|
});
|
|
var G = [5, 0];
|
|
register
|
|
("range",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 1 === a[0]){
|
|
var match = args[2], stop = a[1];
|
|
if(! match){
|
|
var n = stop | 0, h = Stdlib[17].call(null, 0, n);
|
|
return [5,
|
|
Stdlib_List[11].call(null, h, function(i){return [1, i];})];
|
|
}
|
|
var b = match[1];
|
|
if(typeof b !== "number" && 1 === b[0]){
|
|
var match$0 = match[2], stop$0 = b[1];
|
|
if(! match$0){
|
|
var
|
|
s = stop | 0,
|
|
e = stop$0 | 0,
|
|
len = Stdlib[17].call(null, 0, e - s | 0);
|
|
return [5,
|
|
Stdlib_List[11].call
|
|
(null, len, function(i){return [1, s + i | 0];})];
|
|
}
|
|
var c = match$0[1];
|
|
if(typeof c !== "number" && 1 === c[0] && ! match$0[2]){
|
|
var step = c[1];
|
|
if(step === 0.) return G;
|
|
var d = 0;
|
|
if(0. < step){
|
|
var i = stop, items = d;
|
|
for(;;){
|
|
if(! (i < stop$0)){var items$1 = items; break;}
|
|
var f = [0, [1, i], items];
|
|
i = i + step;
|
|
items = f;
|
|
}
|
|
}
|
|
else{
|
|
var i$0 = stop, items$0 = d;
|
|
for(;;){
|
|
if(! (stop$0 < i$0)){var items$1 = items$0; break;}
|
|
var g = [0, [1, i$0], items$0];
|
|
i$0 = i$0 + step;
|
|
items$0 = g;
|
|
}
|
|
}
|
|
return [5, Stdlib_List[10].call(null, items$1)];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "range: 1-3 args"], 1);
|
|
});
|
|
register
|
|
("slice",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number"){
|
|
switch(a[0]){
|
|
case 2:
|
|
var b = args[2];
|
|
if(! b) break a;
|
|
var c = b[1];
|
|
if(typeof c === "number") break a;
|
|
if(1 !== c[0]) break a;
|
|
var match = b[2], start = c[1], s = a[1];
|
|
if(! match){
|
|
var
|
|
i$0 = Stdlib[17].call(null, 0, start | 0),
|
|
o = Stdlib[17].call(null, 0, caml_ml_string_length(s) - i$0 | 0);
|
|
return [2, Stdlib_String[16].call(null, s, i$0, o)];
|
|
}
|
|
var d = match[1];
|
|
if(typeof d === "number") break a;
|
|
if(1 !== d[0]) break a;
|
|
if(match[2]) break a;
|
|
var
|
|
end = d[1],
|
|
i = Stdlib[17].call(null, 0, start | 0),
|
|
j = end | 0,
|
|
sl = caml_ml_string_length(s),
|
|
j$0 = Stdlib[16].call(null, j, sl),
|
|
m = Stdlib[17].call(null, 0, j$0 - i | 0);
|
|
return [2, Stdlib_String[16].call(null, s, i, m)];
|
|
case 5:
|
|
var l = a[1]; break;
|
|
case 19:
|
|
var l = a[1][1]; break;
|
|
default: break a;
|
|
}
|
|
var e = args[2];
|
|
if(e){
|
|
var f = e[1];
|
|
if(typeof f !== "number" && 1 === f[0]){
|
|
if(! e[2]){
|
|
var
|
|
start$1 = f[1],
|
|
i$2 = Stdlib[17].call(null, 0, start$1 | 0),
|
|
n = i$2,
|
|
l$1 = l;
|
|
for(;;){
|
|
if(l$1){
|
|
var xs = l$1[2];
|
|
if(0 < n){var n$0 = n - 1 | 0; n = n$0; l$1 = xs; continue;}
|
|
}
|
|
return [5, l$1];
|
|
}
|
|
}
|
|
b:
|
|
{
|
|
if(typeof a !== "number" && 19 === a[0]){var l$0 = a[1][1]; break b;}
|
|
var l$0 = a[1];
|
|
}
|
|
var h = args[2], k = h[2], g = k[1];
|
|
if(typeof g !== "number" && 1 === g[0] && ! k[2]){
|
|
var
|
|
end$0 = g[1],
|
|
start$0 = h[1][1],
|
|
i$1 = Stdlib[17].call(null, 0, start$0 | 0),
|
|
j$1 = end$0 | 0,
|
|
len = Stdlib_List[1].call(null, l$0),
|
|
j$2 = Stdlib[16].call(null, j$1, len),
|
|
take_range =
|
|
function(idx$1, param$0){
|
|
var idx = idx$1, param = param$0;
|
|
for(;;){
|
|
if(! param) return 0;
|
|
var xs = param[2], x = param[1];
|
|
if(j$2 <= idx) return 0;
|
|
if(i$1 <= idx) return [0, x, take_range(idx + 1 | 0, xs)];
|
|
var idx$0 = idx + 1 | 0;
|
|
idx = idx$0;
|
|
param = xs;
|
|
}
|
|
};
|
|
return [5, take_range(0, l$0)];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "slice: 2-3 args"], 1);
|
|
});
|
|
register
|
|
("sort",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number"){
|
|
switch(a[0]){
|
|
case 5:
|
|
if(args[2]) break a; var l = a[1]; break;
|
|
case 19:
|
|
var b = a[1][1]; if(args[2]) break a; var l = b; break;
|
|
default: break a;
|
|
}
|
|
return [5, Stdlib_List[59].call(null, runtime.caml_compare, l)];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "sort: 1 list"], 1);
|
|
});
|
|
register
|
|
("zip",
|
|
function(args){
|
|
if(args){
|
|
var c = args[2];
|
|
if(c && ! c[2]){
|
|
var
|
|
b = c[1],
|
|
a = args[1],
|
|
la = as_list(a),
|
|
lb = as_list(b),
|
|
l1 = la,
|
|
l2 = lb,
|
|
acc = 0;
|
|
for(;;){
|
|
if(l1 && l2){
|
|
var
|
|
ys = l2[2],
|
|
y = l2[1],
|
|
xs = l1[2],
|
|
x = l1[1],
|
|
acc$0 = [0, [5, [0, x, [0, y, 0]]], acc];
|
|
l1 = xs;
|
|
l2 = ys;
|
|
acc = acc$0;
|
|
continue;
|
|
}
|
|
return [5, Stdlib_List[10].call(null, acc)];
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "zip: 2 lists"], 1);
|
|
});
|
|
register
|
|
("zip-pairs",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var
|
|
v = args[1],
|
|
l = as_list(v),
|
|
go =
|
|
function(param){
|
|
if(param){
|
|
var match = param[2];
|
|
if(match){
|
|
var rest = match[2], b = match[1], a = param[1];
|
|
return [0, [5, [0, a, [0, b, 0]]], go(rest)];
|
|
}
|
|
}
|
|
return 0;
|
|
};
|
|
return [5, go(l)];
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "zip-pairs: 1 list"], 1);
|
|
});
|
|
register
|
|
("take",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number"){
|
|
switch(a[0]){
|
|
case 5:
|
|
var l = a[1]; break;
|
|
case 19:
|
|
var l = a[1][1]; break;
|
|
default: break a;
|
|
}
|
|
var b = args[2];
|
|
if(b){
|
|
var c = b[1];
|
|
if(typeof c !== "number" && 1 === c[0] && ! b[2]){
|
|
var
|
|
n = c[1],
|
|
take_n =
|
|
function(i, param){
|
|
if(param){
|
|
var xs = param[2], x = param[1];
|
|
if(0 < i) return [0, x, take_n(i - 1 | 0, xs)];
|
|
}
|
|
return 0;
|
|
};
|
|
return [5, take_n(n | 0, l)];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "take: list and number"], 1);
|
|
});
|
|
register
|
|
("drop",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number"){
|
|
switch(a[0]){
|
|
case 5:
|
|
var l = a[1]; break;
|
|
case 19:
|
|
var l = a[1][1]; break;
|
|
default: break a;
|
|
}
|
|
var b = args[2];
|
|
if(b){
|
|
var c = b[1];
|
|
if(typeof c !== "number" && 1 === c[0] && ! b[2]){
|
|
var n = c[1], i$1 = n | 0, i = i$1, l$0 = l;
|
|
for(;;){
|
|
if(l$0){
|
|
var xs = l$0[2];
|
|
if(0 < i){var i$0 = i - 1 | 0; i = i$0; l$0 = xs; continue;}
|
|
}
|
|
return [5, l$0];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "drop: list and number"], 1);
|
|
});
|
|
register
|
|
("chunk-every",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number"){
|
|
switch(a[0]){
|
|
case 5:
|
|
var l = a[1]; break;
|
|
case 19:
|
|
var l = a[1][1]; break;
|
|
default: break a;
|
|
}
|
|
var b = args[2];
|
|
if(b){
|
|
var c = b[1];
|
|
if(typeof c !== "number" && 1 === c[0] && ! b[2]){
|
|
var
|
|
n = c[1],
|
|
size = n | 0,
|
|
go =
|
|
function(l){
|
|
if(! l) return 0;
|
|
function take_n(i, param){
|
|
if(param){
|
|
var xs = param[2], x = param[1];
|
|
if(0 < i) return [0, x, take_n(i - 1 | 0, xs)];
|
|
}
|
|
return 0;
|
|
}
|
|
var i = size, l$0 = l;
|
|
for(;;){
|
|
if(l$0){
|
|
var xs = l$0[2];
|
|
if(0 < i){var i$0 = i - 1 | 0; i = i$0; l$0 = xs; continue;}
|
|
}
|
|
var a = go(l$0);
|
|
return [0, [5, take_n(size, l)], a];
|
|
}
|
|
};
|
|
return [5, go(l)];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "chunk-every: list and number"], 1);
|
|
});
|
|
register
|
|
("unique",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number"){
|
|
switch(a[0]){
|
|
case 5:
|
|
var l = a[1]; break;
|
|
case 19:
|
|
var l = a[1][1]; break;
|
|
default: break a;
|
|
}
|
|
if(! args[2]){
|
|
var
|
|
seen = Stdlib_Hashtbl[1].call(null, 0, 16),
|
|
result =
|
|
Stdlib_List[44].call
|
|
(null,
|
|
function(x){
|
|
var key = Sx_types[67].call(null, x);
|
|
return Stdlib_Hashtbl[9].call(null, seen, key)
|
|
? 0
|
|
: (Stdlib_Hashtbl[11].call(null, seen, key, 1), 1);
|
|
},
|
|
l);
|
|
return [5, result];
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "unique: 1 list"], 1);
|
|
});
|
|
register
|
|
(cst_dict,
|
|
function(args){
|
|
var d = Sx_types[60].call(null, 0), param = args;
|
|
for(;;){
|
|
if(! param) return [6, d];
|
|
var a = param[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 2:
|
|
var match = param[2];
|
|
if(match){
|
|
var rest = match[2], v = match[1], k = a[1];
|
|
Sx_types[63].call(null, d, k, v);
|
|
param = rest;
|
|
continue;
|
|
}
|
|
break;
|
|
case 4:
|
|
var match$0 = param[2];
|
|
if(match$0){
|
|
var rest$0 = match$0[2], v$0 = match$0[1], k$0 = a[1];
|
|
Sx_types[63].call(null, d, k$0, v$0);
|
|
param = rest$0;
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "dict: pairs of key value"], 1);
|
|
}
|
|
});
|
|
register
|
|
("get",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number"){
|
|
b:
|
|
{
|
|
switch(a[0]){
|
|
case 5:
|
|
var e = args[2];
|
|
if(! e) break a;
|
|
var f = e[1];
|
|
if(typeof f !== "number" && 1 === f[0]){
|
|
if(e[2]) break a;
|
|
var n = f[1], l = a[1];
|
|
break b;
|
|
}
|
|
break;
|
|
case 6:
|
|
var b = args[2];
|
|
if(! b) break a;
|
|
var c = b[1], d = a[1];
|
|
if(typeof c !== "number")
|
|
switch(c[0]){
|
|
case 2:
|
|
if(b[2]) break a;
|
|
var k = c[1];
|
|
return Sx_types[61].call(null, d, k);
|
|
case 4:
|
|
if(b[2]) break a;
|
|
var k$0 = c[1];
|
|
return Sx_types[61].call(null, d, k$0);
|
|
}
|
|
break;
|
|
case 19:
|
|
var g = args[2], o = a[1][1];
|
|
if(! g) break a;
|
|
var h = g[1];
|
|
if(typeof h !== "number" && 1 === h[0]){
|
|
if(g[2]) break a;
|
|
var n = h[1], l = o;
|
|
break b;
|
|
}
|
|
break;
|
|
}
|
|
var j = args[2];
|
|
if(! j) break a;
|
|
if(j[2]) break a;
|
|
return 0;
|
|
}
|
|
try{var m = Stdlib_List[8].call(null, l, n | 0); return m;}
|
|
catch(exn){return 0;}
|
|
}
|
|
var i = args[2];
|
|
if(i && ! i[2]) return 0;
|
|
}
|
|
return 0;
|
|
});
|
|
register
|
|
("has-key?",
|
|
function(args){
|
|
if(args){
|
|
var c = args[1];
|
|
if(typeof c !== "number" && 6 === c[0]){
|
|
var a = args[2];
|
|
if(a){
|
|
var b = a[1], d = c[1];
|
|
if(typeof b !== "number")
|
|
switch(b[0]){
|
|
case 2:
|
|
if(! a[2]){
|
|
var k = b[1];
|
|
return [0, Sx_types[62].call(null, d, k)];
|
|
}
|
|
break;
|
|
case 4:
|
|
if(! a[2]){
|
|
var k$0 = b[1];
|
|
return [0, Sx_types[62].call(null, d, k$0)];
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "has-key?: dict and key"], 1);
|
|
});
|
|
register
|
|
("assoc",
|
|
function(args){
|
|
if(args){
|
|
var match = args[1];
|
|
if(typeof match !== "number" && 6 === match[0]){
|
|
var
|
|
rest = args[2],
|
|
d = match[1],
|
|
d2 = Stdlib_Hashtbl[4].call(null, d),
|
|
param = rest;
|
|
for(;;){
|
|
if(! param) return [6, d2];
|
|
var a = param[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 2:
|
|
var match$0 = param[2];
|
|
if(match$0){
|
|
var rest$0 = match$0[2], v = match$0[1], k = a[1];
|
|
Stdlib_Hashtbl[11].call(null, d2, k, v);
|
|
param = rest$0;
|
|
continue;
|
|
}
|
|
break;
|
|
case 4:
|
|
var match$1 = param[2];
|
|
if(match$1){
|
|
var rest$1 = match$1[2], v$0 = match$1[1], k$0 = a[1];
|
|
Stdlib_Hashtbl[11].call(null, d2, k$0, v$0);
|
|
param = rest$1;
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "assoc: pairs"], 1);
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "assoc: dict + pairs"], 1);
|
|
});
|
|
register
|
|
("dissoc",
|
|
function(args){
|
|
if(args){
|
|
var match = args[1];
|
|
if(typeof match !== "number" && 6 === match[0]){
|
|
var
|
|
keys = args[2],
|
|
d = match[1],
|
|
d2 = Stdlib_Hashtbl[4].call(null, d);
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(k){
|
|
var a = to_string(k);
|
|
return Stdlib_Hashtbl[10].call(null, d2, a);
|
|
},
|
|
keys);
|
|
return [6, d2];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "dissoc: dict + keys"], 1);
|
|
});
|
|
register
|
|
("merge",
|
|
function(args){
|
|
var d = Sx_types[60].call(null, 0);
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(param){
|
|
if(typeof param !== "number" && 6 === param[0]){
|
|
var src = param[1];
|
|
return Stdlib_Hashtbl[12].call
|
|
(null,
|
|
function(k, v){
|
|
return Stdlib_Hashtbl[11].call(null, d, k, v);
|
|
},
|
|
src);
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "merge: all args must be dicts"], 1);
|
|
},
|
|
args);
|
|
return [6, d];
|
|
});
|
|
register
|
|
("keys",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 6 === a[0] && ! args[2]){
|
|
var d = a[1];
|
|
return [5, Sx_types[65].call(null, d)];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "keys: 1 dict"], 1);
|
|
});
|
|
register
|
|
("vals",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 6 === a[0] && ! args[2]){
|
|
var d = a[1];
|
|
return [5, Sx_types[66].call(null, d)];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "vals: 1 dict"], 1);
|
|
});
|
|
register("mutable-list", function(args){return [19, [0, 0]];});
|
|
register
|
|
("set-nth!",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 5:
|
|
var e = args[2];
|
|
if(e){
|
|
var f = e[2];
|
|
if(f && ! f[2])
|
|
throw caml_maybe_attach_backtrace
|
|
([0,
|
|
Sx_types[7],
|
|
"set-nth!: list is immutable, use ListRef"],
|
|
1);
|
|
}
|
|
break;
|
|
case 19:
|
|
var b = args[2];
|
|
if(b){
|
|
var c = b[1];
|
|
if(typeof c !== "number" && 1 === c[0]){
|
|
var d = b[2];
|
|
if(d && ! d[2]){
|
|
var v = d[1], n = c[1], r = a[1], i = n | 0, l = r[1];
|
|
r[1] =
|
|
Stdlib_List[21].call
|
|
(null, function(j, x){return j === i ? v : x;}, l);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "set-nth!: expected (list idx val)"], 1);
|
|
});
|
|
register
|
|
("dict-set!",
|
|
function(args){
|
|
if(args){
|
|
var c = args[1];
|
|
if(typeof c !== "number" && 6 === c[0]){
|
|
var a = args[2];
|
|
if(a){
|
|
var b = a[1], d = c[1];
|
|
if(typeof b !== "number")
|
|
switch(b[0]){
|
|
case 2:
|
|
var e = a[2];
|
|
if(e && ! e[2]){
|
|
var v = e[1], k = b[1];
|
|
Sx_types[63].call(null, d, k, v);
|
|
return v;
|
|
}
|
|
break;
|
|
case 4:
|
|
var f = a[2];
|
|
if(f && ! f[2]){
|
|
var v$0 = f[1], k$0 = b[1];
|
|
Sx_types[63].call(null, d, k$0, v$0);
|
|
return v$0;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "dict-set!: dict key val"], 1);
|
|
});
|
|
register
|
|
("dict-get",
|
|
function(args){
|
|
if(args){
|
|
var c = args[1];
|
|
if(typeof c !== "number" && 6 === c[0]){
|
|
var a = args[2];
|
|
if(a){
|
|
var b = a[1], d = c[1];
|
|
if(typeof b !== "number")
|
|
switch(b[0]){
|
|
case 2:
|
|
if(! a[2]){var k = b[1]; return Sx_types[61].call(null, d, k);}
|
|
break;
|
|
case 4:
|
|
if(! a[2]){
|
|
var k$0 = b[1];
|
|
return Sx_types[61].call(null, d, k$0);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "dict-get: dict and key"], 1);
|
|
});
|
|
register
|
|
("dict-has?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 6 === a[0]){
|
|
var b = args[2];
|
|
if(b){
|
|
var c = b[1];
|
|
if(typeof c !== "number" && 2 === c[0] && ! b[2]){
|
|
var k = c[1], d = a[1];
|
|
return [0, Sx_types[62].call(null, d, k)];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "dict-has?: dict and key"], 1);
|
|
});
|
|
register
|
|
("dict-delete!",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 6 === a[0]){
|
|
var b = args[2];
|
|
if(b){
|
|
var c = b[1];
|
|
if(typeof c !== "number" && 2 === c[0] && ! b[2]){
|
|
var k = c[1], d = a[1];
|
|
Sx_types[64].call(null, d, k);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "dict-delete!: dict and key"], 1);
|
|
});
|
|
register
|
|
("type-of",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var a = args[1];
|
|
return [2, Sx_types[31].call(null, a)];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "type-of: 1 arg"], 1);
|
|
});
|
|
register
|
|
("inspect",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var a = args[1];
|
|
return [2, Sx_types[67].call(null, a)];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "inspect: 1 arg"], 1);
|
|
});
|
|
register
|
|
("serialize",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var a = args[1];
|
|
return [2, Sx_types[67].call(null, a)];
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "serialize: 1 arg"], 1);
|
|
});
|
|
register
|
|
("make-symbol",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0] && ! args[2]){var s = a[1]; return [3, s];}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "make-symbol: expected string"], 1);
|
|
});
|
|
register
|
|
("error",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0]){
|
|
if(args[2]) break a;
|
|
var msg = a[1];
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], msg], 1);
|
|
}
|
|
if(! args[2]){
|
|
var b = to_string(a);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "error: 1 arg"], 1);
|
|
});
|
|
register
|
|
("apply",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var d = args[1];
|
|
if(typeof d !== "number" && 13 === d[0]){
|
|
var b = args[2];
|
|
if(b){
|
|
var c = b[1], f = d[2];
|
|
if(typeof c === "number"){
|
|
if(! b[2]) return caml_call1(f, 0);
|
|
}
|
|
else{
|
|
switch(c[0]){
|
|
case 5:
|
|
var a = c[1]; break;
|
|
case 19:
|
|
var a = c[1][1]; break;
|
|
default: break a;
|
|
}
|
|
if(! b[2]) return caml_call1(f, a);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "apply: function and list"], 1);
|
|
});
|
|
register
|
|
("identical?",
|
|
function(args){
|
|
if(args){
|
|
var c = args[2];
|
|
if(c && ! c[2]){
|
|
var b = c[1], a = args[1];
|
|
return [0, a === b ? 1 : 0];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "identical?: 2 args"], 1);
|
|
});
|
|
register
|
|
("make-spread",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 6 === a[0] && ! args[2]){
|
|
var
|
|
d = a[1],
|
|
pairs =
|
|
Stdlib_Hashtbl[14].call
|
|
(null, function(k, v, acc){return [0, [0, k, v], acc];}, d, 0);
|
|
return [16, pairs];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "make-spread: 1 dict"], 1);
|
|
});
|
|
var H = [0, 0], I = [0, 1];
|
|
register
|
|
("spread?",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 16 === a[0]){if(args[2]) break a; return I;}
|
|
if(! args[2]) return H;
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "spread?: 1 arg"], 1);
|
|
});
|
|
register
|
|
("spread-attrs",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 16 === a[0] && ! args[2]){
|
|
var pairs = a[1], d = Sx_types[60].call(null, 0);
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(param){
|
|
var v = param[2], k = param[1];
|
|
return Sx_types[63].call(null, d, k, v);
|
|
},
|
|
pairs);
|
|
return [6, d];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "spread-attrs: 1 spread"], 1);
|
|
});
|
|
function call_any(f, args){
|
|
if(typeof f !== "number" && 13 === f[0]){
|
|
var fn = f[2];
|
|
return caml_call1(fn, args);
|
|
}
|
|
var a = caml_call2(sx_call_fn[1], f, args);
|
|
return caml_call1(sx_trampoline_fn[1], a);
|
|
}
|
|
var J = [5, 0];
|
|
register
|
|
("map",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[2];
|
|
if(a){
|
|
var b = a[1], f = args[1];
|
|
if(typeof b === "number"){if(! a[2]) return J;}
|
|
else{
|
|
switch(b[0]){
|
|
case 5:
|
|
var items = b[1]; break;
|
|
case 19:
|
|
var items = b[1][1]; break;
|
|
default: break a;
|
|
}
|
|
if(! a[2])
|
|
return [5,
|
|
Stdlib_List[20].call
|
|
(null, function(x){return call_any(f, [0, x, 0]);}, items)];
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "map: expected (fn list)"], 1);
|
|
});
|
|
var K = [5, 0];
|
|
register
|
|
("map-indexed",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[2];
|
|
if(a){
|
|
var b = a[1], f = args[1];
|
|
if(typeof b === "number"){if(! a[2]) return K;}
|
|
else{
|
|
switch(b[0]){
|
|
case 5:
|
|
var items = b[1]; break;
|
|
case 19:
|
|
var items = b[1][1]; break;
|
|
default: break a;
|
|
}
|
|
if(! a[2])
|
|
return [5,
|
|
Stdlib_List[21].call
|
|
(null,
|
|
function(i, x){return call_any(f, [0, [1, i], [0, x, 0]]);},
|
|
items)];
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "map-indexed: expected (fn list)"], 1);
|
|
});
|
|
var L = [5, 0];
|
|
register
|
|
("filter",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[2];
|
|
if(a){
|
|
var b = a[1], f = args[1];
|
|
if(typeof b === "number"){if(! a[2]) return L;}
|
|
else{
|
|
switch(b[0]){
|
|
case 5:
|
|
var items = b[1]; break;
|
|
case 19:
|
|
var items = b[1][1]; break;
|
|
default: break a;
|
|
}
|
|
if(! a[2])
|
|
return [5,
|
|
Stdlib_List[44].call
|
|
(null,
|
|
function(x){
|
|
var a = call_any(f, [0, x, 0]);
|
|
return Sx_types[40].call(null, a);
|
|
},
|
|
items)];
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "filter: expected (fn list)"], 1);
|
|
});
|
|
var
|
|
M =
|
|
[0,
|
|
[11,
|
|
"for-each: expected (fn list), got (",
|
|
[2, 0, [11, ") ", [4, 0, 0, 0, [11, cst_args, 0]]]]],
|
|
"for-each: expected (fn list), got (%s) %d args"];
|
|
register
|
|
("for-each",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[2];
|
|
if(a){
|
|
var b = a[1], f = args[1];
|
|
if(typeof b === "number"){if(! a[2]) return 0;}
|
|
else{
|
|
switch(b[0]){
|
|
case 5:
|
|
var items = b[1]; break;
|
|
case 19:
|
|
var items = b[1][1]; break;
|
|
default: break a;
|
|
}
|
|
if(! a[2]){
|
|
Stdlib_List[18].call
|
|
(null, function(x){call_any(f, [0, x, 0]); return 0;}, items);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
var
|
|
c =
|
|
Stdlib_List[20].call
|
|
(null, function(v){return Sx_types[31].call(null, v);}, args),
|
|
types = Stdlib_String[7].call(null, ", ", c),
|
|
d = Stdlib_List[1].call(null, args),
|
|
e = caml_call2(Stdlib_Printf[4].call(null, M), types, d);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], e], 1);
|
|
});
|
|
register
|
|
("reduce",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var b = args[2];
|
|
if(b){
|
|
var c = b[2];
|
|
if(c){
|
|
var a = c[1], init = b[1], f = args[1];
|
|
if(typeof a !== "number"){
|
|
switch(a[0]){
|
|
case 5:
|
|
var items = a[1]; break;
|
|
case 19:
|
|
var items = a[1][1]; break;
|
|
default: break a;
|
|
}
|
|
if(! c[2])
|
|
return Stdlib_List[26].call
|
|
(null,
|
|
function(acc, x){return call_any(f, [0, acc, [0, x, 0]]);},
|
|
init,
|
|
items);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "reduce: expected (fn init list)"], 1);
|
|
});
|
|
var N = [0, 0], O = [0, 0];
|
|
register
|
|
("some",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[2];
|
|
if(a){
|
|
var b = a[1], f = args[1];
|
|
if(typeof b === "number"){if(! a[2]) return N;}
|
|
else{
|
|
switch(b[0]){
|
|
case 5:
|
|
var items = b[1]; break;
|
|
case 19:
|
|
var items = b[1][1]; break;
|
|
default: break a;
|
|
}
|
|
if(! a[2])
|
|
try{
|
|
var
|
|
c =
|
|
Stdlib_List[39].call
|
|
(null,
|
|
function(x){
|
|
var a = call_any(f, [0, x, 0]);
|
|
return Sx_types[40].call(null, a);
|
|
},
|
|
items);
|
|
return c;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn === Stdlib[8]) return O;
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "some: expected (fn list)"], 1);
|
|
});
|
|
var P = [0, 1];
|
|
register
|
|
("every?",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[2];
|
|
if(a){
|
|
var b = a[1], f = args[1];
|
|
if(typeof b === "number"){if(! a[2]) return P;}
|
|
else{
|
|
switch(b[0]){
|
|
case 5:
|
|
var items = b[1]; break;
|
|
case 19:
|
|
var items = b[1][1]; break;
|
|
default: break a;
|
|
}
|
|
if(! a[2])
|
|
return [0,
|
|
Stdlib_List[33].call
|
|
(null,
|
|
function(x){
|
|
var a = call_any(f, [0, x, 0]);
|
|
return Sx_types[40].call(null, a);
|
|
},
|
|
items)];
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "every?: expected (fn list)"], 1);
|
|
});
|
|
register
|
|
("make-vm-stack",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 1 === a[0] && ! args[2]){
|
|
var n = a[1];
|
|
return [19,
|
|
[0,
|
|
Stdlib_List[11].call(null, n | 0, function(param){return 0;})]];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "make-vm-stack: expected (size)"], 1);
|
|
});
|
|
register
|
|
("vm-stack-get",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 19 === a[0]){
|
|
var b = args[2];
|
|
if(b){
|
|
var c = b[1];
|
|
if(typeof c !== "number" && 1 === c[0] && ! b[2]){
|
|
var n = c[1], r = a[1];
|
|
return Stdlib_List[8].call(null, r[1], n | 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "vm-stack-get: expected (stack idx)"], 1);
|
|
});
|
|
register
|
|
("vm-stack-set!",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 19 === a[0]){
|
|
var b = args[2];
|
|
if(b){
|
|
var c = b[1];
|
|
if(typeof c !== "number" && 1 === c[0]){
|
|
var d = b[2];
|
|
if(d && ! d[2]){
|
|
var v = d[1], n = c[1], r = a[1], i = n | 0;
|
|
r[1] =
|
|
Stdlib_List[21].call
|
|
(null, function(j, x){return j === i ? v : x;}, r[1]);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "vm-stack-set!: expected (stack idx val)"], 1);
|
|
});
|
|
register
|
|
("vm-stack-length",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 19 === a[0] && ! args[2]){
|
|
var r = a[1];
|
|
return [1, Stdlib_List[1].call(null, r[1])];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "vm-stack-length: expected (stack)"], 1);
|
|
});
|
|
register
|
|
("vm-stack-copy!",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 19 === a[0]){
|
|
var b = args[2];
|
|
if(b){
|
|
var c = b[1];
|
|
if(typeof c !== "number" && 19 === c[0]){
|
|
var d = b[2];
|
|
if(d){
|
|
var e = d[1];
|
|
if(typeof e !== "number" && 1 === e[0] && ! d[2]){
|
|
var
|
|
n = e[1],
|
|
dst = c[1],
|
|
src = a[1],
|
|
count = n | 0,
|
|
src_items = src[1];
|
|
dst[1] =
|
|
Stdlib_List[21].call
|
|
(null,
|
|
function(i, x){
|
|
return i < count ? Stdlib_List[8].call(null, src_items, i) : x;
|
|
},
|
|
dst[1]);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "vm-stack-copy!: expected (src dst count)"], 1);
|
|
});
|
|
var Q = [0, 0];
|
|
register
|
|
("primitive?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0] && ! args[2]){
|
|
var name = a[1];
|
|
return [0, Stdlib_Hashtbl[9].call(null, primitives, name)];
|
|
}
|
|
}
|
|
return Q;
|
|
});
|
|
var R = [0, 0], S = [0, 1];
|
|
register
|
|
("lambda?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 7 === a[0] && ! args[2]) return S;
|
|
}
|
|
return R;
|
|
});
|
|
var T = [0, 0], U = [0, 1];
|
|
register
|
|
("island?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 9 === a[0] && ! args[2]) return U;
|
|
}
|
|
return T;
|
|
});
|
|
var V = [0, 0], W = [0, 1], X = [0, 1];
|
|
register
|
|
("is-else-clause?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 0:
|
|
if(a[1] && ! args[2]) return W; break;
|
|
case 4:
|
|
if(a[1] === "else" && ! args[2]) return X; break;
|
|
}
|
|
}
|
|
return V;
|
|
});
|
|
var Y = [0, 0];
|
|
register
|
|
("cond-scheme?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 5 === a[0] && ! args[2]){
|
|
var clauses = a[1];
|
|
return [0,
|
|
Stdlib_List[33].call
|
|
(null,
|
|
function(c){
|
|
if(typeof c !== "number" && 5 === c[0]){
|
|
var l = c[1];
|
|
return 2 === Stdlib_List[1].call(null, l) ? 1 : 0;
|
|
}
|
|
return 0;
|
|
},
|
|
clauses)];
|
|
}
|
|
}
|
|
return Y;
|
|
});
|
|
var Z = [0, 0], _ = [0, 1], $ = [0, 1];
|
|
register
|
|
("component?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 8:
|
|
if(! args[2]) return _; break;
|
|
case 9:
|
|
if(! args[2]) return $; break;
|
|
}
|
|
}
|
|
return Z;
|
|
});
|
|
register
|
|
("lambda-closure",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 7 === a[0] && ! args[2]){var l = a[1]; return [18, l[3]];}
|
|
}
|
|
return 0;
|
|
});
|
|
register
|
|
("component-closure",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 8:
|
|
if(! args[2]){var c = a[1]; return [18, c[5]];} break;
|
|
case 9:
|
|
if(! args[2]){var i = a[1]; return [18, i[5]];} break;
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
var aa = [0, 0];
|
|
register
|
|
("component-has-children?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 8:
|
|
if(! args[2]){var c = a[1]; return [0, c[3]];} break;
|
|
case 9:
|
|
if(! args[2]){var i = a[1]; return [0, i[3]];} break;
|
|
}
|
|
}
|
|
return aa;
|
|
});
|
|
register
|
|
("component-name",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 8:
|
|
if(! args[2]){var c = a[1]; return [2, c[1]];} break;
|
|
case 9:
|
|
if(! args[2]){var i = a[1]; return [2, i[1]];} break;
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
var ab = [5, 0];
|
|
register
|
|
("component-params",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 8:
|
|
if(! args[2]){
|
|
var c = a[1];
|
|
return [5,
|
|
Stdlib_List[20].call
|
|
(null, function(s){return [2, s];}, c[2])];
|
|
}
|
|
break;
|
|
case 9:
|
|
if(! args[2]){
|
|
var i = a[1];
|
|
return [5,
|
|
Stdlib_List[20].call
|
|
(null, function(s){return [2, s];}, i[2])];
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return ab;
|
|
});
|
|
register
|
|
("component-body",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 8:
|
|
if(! args[2]){var c = a[1]; return c[4];} break;
|
|
case 9:
|
|
if(! args[2]){var i = a[1]; return i[4];} break;
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
var ac = [0, 0], ad = [0, 1];
|
|
register
|
|
("macro?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 10 === a[0] && ! args[2]) return ad;
|
|
}
|
|
return ac;
|
|
});
|
|
register
|
|
("for-each-indexed",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var b = args[2];
|
|
if(b){
|
|
var a = b[1], f = args[1];
|
|
if(typeof a !== "number"){
|
|
switch(a[0]){
|
|
case 5:
|
|
var items = a[1]; break;
|
|
case 19:
|
|
var items = a[1][1]; break;
|
|
default: break a;
|
|
}
|
|
if(! b[2]){
|
|
Stdlib_List[19].call
|
|
(null,
|
|
function(i, x){call_any(f, [0, [1, i], [0, x, 0]]); return 0;},
|
|
items);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "for-each-indexed: expected (fn list)"], 1);
|
|
});
|
|
var ae = [5, 0];
|
|
register
|
|
("lambda-params",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 7 === a[0] && ! args[2]){
|
|
var l = a[1];
|
|
return [5,
|
|
Stdlib_List[20].call(null, function(s){return [2, s];}, l[1])];
|
|
}
|
|
}
|
|
return ae;
|
|
});
|
|
register
|
|
("lambda-body",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 7 === a[0] && ! args[2]){var l = a[1]; return l[2];}
|
|
}
|
|
return 0;
|
|
});
|
|
var af = [0, 1];
|
|
register
|
|
("empty-dict?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 6 === a[0] && ! args[2]){
|
|
var d = a[1];
|
|
return [0, 0 === Stdlib_Hashtbl[15].call(null, d) ? 1 : 0];
|
|
}
|
|
}
|
|
return af;
|
|
});
|
|
register
|
|
("make-raw-html",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0] && ! args[2]){var s = a[1]; return [15, s];}
|
|
}
|
|
return 0;
|
|
});
|
|
var ag = [2, cst];
|
|
register
|
|
("raw-html-content",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 15 === a[0] && ! args[2]){var s = a[1]; return [2, s];}
|
|
}
|
|
return ag;
|
|
});
|
|
var cst_VM_undefined = "VM undefined: ";
|
|
register
|
|
("get-primitive",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0] && ! args[2]){
|
|
var
|
|
name = a[1],
|
|
match = Stdlib_Hashtbl[7].call(null, primitives, name);
|
|
if(match){var fn = match[1]; return [13, name, fn];}
|
|
var b = Stdlib[28].call(null, cst_VM_undefined, name);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "get-primitive: expected (name)"], 1);
|
|
});
|
|
register
|
|
("call-primitive",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var d = args[1];
|
|
if(typeof d !== "number" && 2 === d[0]){
|
|
var b = args[2];
|
|
if(b){
|
|
var c = b[1], name = d[1];
|
|
if(typeof c === "number"){
|
|
if(! b[2]){
|
|
var match = Stdlib_Hashtbl[7].call(null, primitives, name);
|
|
if(match){var fn = match[1]; return caml_call1(fn, 0);}
|
|
var e = Stdlib[28].call(null, cst_VM_undefined, name);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], e], 1);
|
|
}
|
|
}
|
|
else{
|
|
switch(c[0]){
|
|
case 5:
|
|
var a = c[1]; break;
|
|
case 19:
|
|
var a = c[1][1]; break;
|
|
default: break a;
|
|
}
|
|
if(! b[2]){
|
|
var match$0 = Stdlib_Hashtbl[7].call(null, primitives, name);
|
|
if(match$0){var fn$0 = match$0[1]; return caml_call1(fn$0, a);}
|
|
var f = Stdlib[28].call(null, cst_VM_undefined, name);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], f], 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "call-primitive: expected (name args-list)"],
|
|
1);
|
|
});
|
|
runtime.caml_register_global
|
|
(349,
|
|
[0,
|
|
primitives,
|
|
sx_call_fn,
|
|
sx_trampoline_fn,
|
|
register,
|
|
is_primitive,
|
|
get_primitive,
|
|
trampoline_hook,
|
|
as_number,
|
|
as_string,
|
|
as_list,
|
|
as_bool,
|
|
to_string],
|
|
"Sx_primitives");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 4061 "../lib/.sx.objs/jsoo/default/sx.cma.js"
|
|
//# shape: Sx_runtime:[F(2),F(1),F(1),F(1),F(1),F(2),F(2),F(2),F(3),F(2),F(1),F(1),F(1),F(1),F(2),F(2),F(2),F(1),F(1),F(2),F(2),F(1),F(2),F(1),F(1),F(1),F(2),F(1),F(2),F(2),F(2),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(2),F(2),F(2),F(2),F(2),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(2),F(2),F(3),F(2),F(3),F(1),F(1),F(3),F(2),F(2),F(1),F(1),F(3),F(2),F(2),F(2),F(1),F(1),F(2),F(1),F(1),F(1),F(2),F(2),F(3),F(1),F(1),F(1),F(1),F(2),F(2),F(1),F(1),F(1),F(2),F(1),F(1),F(2),F(1),F(2),F(1)*,F(1)*,F(1),F(2),F(2),F(3),F(3),F(1),F(1),F(2),F(2),F(1)*,F(1)*,F(1)*,F(1)*,F(1)*,F(1)*,F(1),F(1)*,F(2)*,F(1),F(1),F(1)*,F(2),F(2),F(2),F(2),F(1)*,F(2),F(1),F(4),F(2),F(1),F(1),F(2),F(2),F(1),N,F(2),N,N,F(1)*,F(1),F(2),F(1),F(2),F(2),F(1),F(2),F(1),F(1)*,F(1)*,F(2),F(1)*,F(2)*,F(1)*,F(1)*,F(2),F(4),F(4),F(4),F(2),F(2),F(2),F(2),F(2),F(2),F(2)*]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_ml_string_length = runtime.caml_ml_string_length,
|
|
caml_string_compare = runtime.caml_string_compare;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib_String = global_data.Stdlib__String,
|
|
Stdlib_Hashtbl = global_data.Stdlib__Hashtbl,
|
|
Stdlib_List = global_data.Stdlib__List,
|
|
Stdlib = global_data.Stdlib,
|
|
Sx_types = global_data.Sx_types,
|
|
Sx_primitives = global_data.Sx_primitives,
|
|
Stdlib_Float = global_data.Stdlib__Float,
|
|
Stdlib_Printf = global_data.Stdlib__Printf;
|
|
function prim_call(name, args){
|
|
var match = Stdlib_Hashtbl[7].call(null, Sx_primitives[1], name);
|
|
if(match){var f = match[1]; return caml_call1(f, args);}
|
|
var a = Stdlib[28].call(null, "Unknown primitive: ", name);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], a], 1);
|
|
}
|
|
var cst = "", a = [0, [8, [0, 0, 3], 0, 0, 0], "%g"];
|
|
function value_to_str(v){
|
|
if(typeof v === "number") return cst;
|
|
switch(v[0]){
|
|
case 0:
|
|
return v[1] ? "true" : "false";
|
|
case 1:
|
|
var n = v[1];
|
|
return Stdlib_Float[18].call(null, n)
|
|
? Stdlib[33].call(null, n | 0)
|
|
: caml_call1(Stdlib_Printf[4].call(null, a), n);
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
var s = v[1]; return s;
|
|
default: return Sx_types[67].call(null, v);
|
|
}
|
|
}
|
|
function sx_to_string(v){return [2, value_to_str(v)];}
|
|
function sx_str(args){
|
|
var a = Stdlib_List[20].call(null, value_to_str, args);
|
|
return Stdlib_String[7].call(null, cst, a);
|
|
}
|
|
function sx_to_list(v){
|
|
if(typeof v === "number") return 0;
|
|
switch(v[0]){
|
|
case 5:
|
|
var l = v[1]; return l;
|
|
case 19:
|
|
var r = v[1]; return r[1];
|
|
default:
|
|
var
|
|
a = Sx_types[31].call(null, v),
|
|
b = Stdlib[28].call(null, "Expected list, got ", a);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
|
|
}
|
|
}
|
|
function sx_call(f, args){
|
|
if(typeof f !== "number")
|
|
switch(f[0]){
|
|
case 7:
|
|
var l = f[1], local = Sx_types[10].call(null, l[3]);
|
|
Stdlib_List[28].call
|
|
(null,
|
|
function(p, a){Sx_types[11].call(null, local, p, a); return 0;},
|
|
l[1],
|
|
args);
|
|
return [11, l[2], local];
|
|
case 12:
|
|
var k = f[1];
|
|
if(args) var x = args[1], x$0 = x; else var x$0 = 0;
|
|
return caml_call1(k, x$0);
|
|
case 13:
|
|
var fn = f[2]; return caml_call1(fn, args);
|
|
case 22:
|
|
var cl = f[1]; return caml_call2(Sx_types[6][1], cl, args);
|
|
}
|
|
var
|
|
a = Sx_types[67].call(null, f),
|
|
b = Stdlib[28].call(null, "Not callable: ", a);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
|
|
}
|
|
Sx_primitives[2][1] = sx_call;
|
|
function sx_apply(f, args_list){return sx_call(f, sx_to_list(args_list));}
|
|
function sx_append_b(lst, item){
|
|
if(typeof lst !== "number")
|
|
switch(lst[0]){
|
|
case 5:
|
|
var items = lst[1];
|
|
return [5, Stdlib[37].call(null, items, [0, item, 0])];
|
|
case 19:
|
|
var r = lst[1];
|
|
r[1] = Stdlib[37].call(null, r[1], [0, item, 0]);
|
|
return lst;
|
|
}
|
|
var
|
|
a = Sx_types[31].call(null, lst),
|
|
b = Stdlib[28].call(null, "append!: expected list, got ", a);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
|
|
}
|
|
function sx_dict_set_b(d, k, v){
|
|
if(typeof d !== "number" && 6 === d[0]){
|
|
var tbl = d[1];
|
|
if(typeof k !== "number")
|
|
switch(k[0]){
|
|
case 2:
|
|
case 4:
|
|
var key = k[1]; Stdlib_Hashtbl[11].call(null, tbl, key, v); return v;
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "dict-set!: expected dict and string key"], 1);
|
|
}
|
|
var
|
|
cst_body = "body",
|
|
cst_else = "else",
|
|
cst_emitted = "emitted",
|
|
cst_name = "name",
|
|
cst_type = "type",
|
|
cst_value = "value";
|
|
function get_val(container, key){
|
|
if(typeof container === "number") return 0;
|
|
a:
|
|
{
|
|
var cst_env = "env", cst_phase = "phase";
|
|
switch(container[0]){
|
|
case 5:
|
|
var l = container[1]; break;
|
|
case 6:
|
|
var d = container[1];
|
|
if(typeof key === "number") break a;
|
|
switch(key[0]){
|
|
case 2:
|
|
case 4:
|
|
var k = key[1]; return Sx_types[61].call(null, d, k);
|
|
default: break a;
|
|
}
|
|
case 19:
|
|
var l = container[1][1]; break;
|
|
case 20:
|
|
if(typeof key === "number") break a;
|
|
if(2 !== key[0]) break a;
|
|
var k$0 = key[1], s = container[1];
|
|
return k$0 !== "control"
|
|
? k$0
|
|
!== cst_env
|
|
? k$0
|
|
!== "kont"
|
|
? k$0
|
|
!== cst_phase
|
|
? k$0 !== cst_value ? 0 : s[5]
|
|
: [2, s[4]]
|
|
: s[3]
|
|
: s[2]
|
|
: s[1];
|
|
case 21:
|
|
if(typeof key === "number") break a;
|
|
if(2 !== key[0]) break a;
|
|
var
|
|
k$1 = key[1],
|
|
f = container[1],
|
|
switch$ = caml_string_compare(k$1, "ho-type");
|
|
if(0 <= switch$){
|
|
if(0 >= switch$) return f[9];
|
|
var switch$0 = caml_string_compare(k$1, "results");
|
|
if(0 <= switch$0){
|
|
if(0 >= switch$0) return f[8];
|
|
if(k$1 === "scheme") return f[9];
|
|
if(k$1 === "then") return f[4];
|
|
if(k$1 === cst_type) return [2, f[1]];
|
|
if(k$1 === "update-fn") return f[9];
|
|
if(k$1 === cst_value) return f[9];
|
|
}
|
|
else{
|
|
if(k$1 === "indexed") return f[9];
|
|
if(k$1 === "match-val") return f[9];
|
|
if(k$1 === cst_name) return f[3];
|
|
if(k$1 === cst_phase) return f[9];
|
|
if(k$1 === "raw-args") return f[8];
|
|
if(k$1 === "remaining") return f[5];
|
|
}
|
|
}
|
|
else{
|
|
var switch$1 = caml_string_compare(k$1, cst_env);
|
|
if(0 <= switch$1){
|
|
if(0 >= switch$1) return f[2];
|
|
if(k$1 === "evaled") return f[7];
|
|
if(k$1 === "f") return f[6];
|
|
if(k$1 === "first-render") return f[10];
|
|
if(k$1 === "has-effects") return f[9];
|
|
if(k$1 === "head-name") return f[9];
|
|
}
|
|
else{
|
|
if(k$1 === "args") return f[7];
|
|
if(k$1 === cst_body) return f[4];
|
|
if(k$1 === "current-item") return f[9];
|
|
if(k$1 === "effect-list") return f[10];
|
|
if(k$1 === cst_else) return f[3];
|
|
if(k$1 === cst_emitted) return f[10];
|
|
}
|
|
}
|
|
return 0;
|
|
default: break a;
|
|
}
|
|
if(typeof key !== "number" && 1 === key[0]){
|
|
var n = key[1];
|
|
try{var a = Stdlib_List[8].call(null, l, n | 0); return a;}
|
|
catch(exn){return 0;}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
Sx_primitives[4].call
|
|
(null,
|
|
"get",
|
|
function(args){
|
|
if(args){
|
|
var a = args[2];
|
|
if(a){
|
|
var match = a[2], k = a[1], c = args[1];
|
|
if(! match) return get_val(c, k);
|
|
if(! match[2]){
|
|
var default$ = match[1];
|
|
try{
|
|
var v = get_val(c, k), default$0 = 0 === v ? default$ : v;
|
|
return default$0;
|
|
}
|
|
catch(exn){return default$;}
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "get: 2-3 args"], 1);
|
|
});
|
|
function prim(name){
|
|
var match = Stdlib_Hashtbl[7].call(null, Sx_primitives[1], name);
|
|
if(! match)
|
|
return function(param){
|
|
var a = Stdlib[28].call(null, "Missing prim: ", name);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], a], 1);};
|
|
var f = match[1];
|
|
return f;
|
|
}
|
|
function first(args){return caml_call1(prim("first"), [0, args, 0]);}
|
|
function rest(args){return caml_call1(prim("rest"), [0, args, 0]);}
|
|
function last(args){return caml_call1(prim("last"), [0, args, 0]);}
|
|
function nth(coll, i){
|
|
return caml_call1(prim("nth"), [0, coll, [0, i, 0]]);
|
|
}
|
|
function cons(x, l){return caml_call1(prim("cons"), [0, x, [0, l, 0]]);}
|
|
function append(a, b){
|
|
return caml_call1(prim("append"), [0, a, [0, b, 0]]);
|
|
}
|
|
function reverse(l){return caml_call1(prim("reverse"), [0, l, 0]);}
|
|
function flatten(l){return caml_call1(prim("flatten"), [0, l, 0]);}
|
|
function concat(a, b){
|
|
return caml_call1(prim("concat"), [0, a, [0, b, 0]]);
|
|
}
|
|
function slice(a, b){return caml_call1(prim("slice"), [0, a, [0, b, 0]]);}
|
|
function len(a){return caml_call1(prim("len"), [0, a, 0]);}
|
|
function get(a, b){return get_val(a, b);}
|
|
function sort(a){return caml_call1(prim("sort"), [0, a, 0]);}
|
|
function range(a){return caml_call1(prim("range"), [0, a, 0]);}
|
|
function unique(a){return caml_call1(prim("unique"), [0, a, 0]);}
|
|
function zip(a, b){return caml_call1(prim("zip"), [0, a, [0, b, 0]]);}
|
|
function zip_pairs(a){return caml_call1(prim("zip-pairs"), [0, a, 0]);}
|
|
function take(a, b){return caml_call1(prim("take"), [0, a, [0, b, 0]]);}
|
|
function drop(a, b){return caml_call1(prim("drop"), [0, a, [0, b, 0]]);}
|
|
function chunk_every(a, b){
|
|
return caml_call1(prim("chunk-every"), [0, a, [0, b, 0]]);
|
|
}
|
|
function empty_p(a){return caml_call1(prim("empty?"), [0, a, 0]);}
|
|
function nil_p(a){return caml_call1(prim("nil?"), [0, a, 0]);}
|
|
function number_p(a){return caml_call1(prim("number?"), [0, a, 0]);}
|
|
function string_p(a){return caml_call1(prim("string?"), [0, a, 0]);}
|
|
function boolean_p(a){return caml_call1(prim("boolean?"), [0, a, 0]);}
|
|
function list_p(a){return caml_call1(prim("list?"), [0, a, 0]);}
|
|
function dict_p(a){return caml_call1(prim("dict?"), [0, a, 0]);}
|
|
function symbol_p(a){return caml_call1(prim("symbol?"), [0, a, 0]);}
|
|
function keyword_p(a){return caml_call1(prim("keyword?"), [0, a, 0]);}
|
|
function contains_p(a, b){
|
|
return caml_call1(prim("contains?"), [0, a, [0, b, 0]]);
|
|
}
|
|
function has_key_p(a, b){
|
|
return caml_call1(prim("has-key?"), [0, a, [0, b, 0]]);
|
|
}
|
|
function starts_with_p(a, b){
|
|
return caml_call1(prim("starts-with?"), [0, a, [0, b, 0]]);
|
|
}
|
|
function ends_with_p(a, b){
|
|
return caml_call1(prim("ends-with?"), [0, a, [0, b, 0]]);
|
|
}
|
|
function string_contains_p(a, b){
|
|
return caml_call1(prim("string-contains?"), [0, a, [0, b, 0]]);
|
|
}
|
|
function odd_p(a){return caml_call1(prim("odd?"), [0, a, 0]);}
|
|
function even_p(a){return caml_call1(prim("even?"), [0, a, 0]);}
|
|
function zero_p(a){return caml_call1(prim("zero?"), [0, a, 0]);}
|
|
function str(args){return [2, sx_str(args)];}
|
|
function upper(a){return caml_call1(prim("upper"), [0, a, 0]);}
|
|
function upcase(a){return caml_call1(prim("upcase"), [0, a, 0]);}
|
|
function lower(a){return caml_call1(prim("lower"), [0, a, 0]);}
|
|
function downcase(a){return caml_call1(prim("downcase"), [0, a, 0]);}
|
|
function trim(a){return caml_call1(prim("trim"), [0, a, 0]);}
|
|
function split(a, b){return caml_call1(prim("split"), [0, a, [0, b, 0]]);}
|
|
function join(a, b){return caml_call1(prim("join"), [0, a, [0, b, 0]]);}
|
|
function replace(a, b, c){
|
|
return caml_call1(prim("replace"), [0, a, [0, b, [0, c, 0]]]);
|
|
}
|
|
function index_of(a, b){
|
|
return caml_call1(prim("index-of"), [0, a, [0, b, 0]]);
|
|
}
|
|
function substring(a, b, c){
|
|
return caml_call1(prim("substring"), [0, a, [0, b, [0, c, 0]]]);
|
|
}
|
|
function string_length(a){
|
|
return caml_call1(prim("string-length"), [0, a, 0]);
|
|
}
|
|
function char_from_code(a){
|
|
return caml_call1(prim("char-from-code"), [0, a, 0]);
|
|
}
|
|
function assoc(d, k, v){
|
|
return caml_call1(prim("assoc"), [0, d, [0, k, [0, v, 0]]]);
|
|
}
|
|
function dissoc(d, k){
|
|
return caml_call1(prim("dissoc"), [0, d, [0, k, 0]]);
|
|
}
|
|
function merge(a, b){return caml_call1(prim("merge"), [0, a, [0, b, 0]]);}
|
|
function keys(a){return caml_call1(prim("keys"), [0, a, 0]);}
|
|
function vals(a){return caml_call1(prim("vals"), [0, a, 0]);}
|
|
function dict_set(a, b, c){
|
|
return caml_call1(prim("dict-set!"), [0, a, [0, b, [0, c, 0]]]);
|
|
}
|
|
function dict_get(a, b){
|
|
return caml_call1(prim("dict-get"), [0, a, [0, b, 0]]);
|
|
}
|
|
function dict_has_p(a, b){
|
|
return caml_call1(prim("dict-has?"), [0, a, [0, b, 0]]);
|
|
}
|
|
function dict_delete(a, b){
|
|
return caml_call1(prim("dict-delete!"), [0, a, [0, b, 0]]);
|
|
}
|
|
function abs(a){return caml_call1(prim("abs"), [0, a, 0]);}
|
|
function sqrt(a){return caml_call1(prim("sqrt"), [0, a, 0]);}
|
|
function pow(a, b){return caml_call1(prim("pow"), [0, a, [0, b, 0]]);}
|
|
function floor(a){return caml_call1(prim("floor"), [0, a, 0]);}
|
|
function ceil(a){return caml_call1(prim("ceil"), [0, a, 0]);}
|
|
function round(a){return caml_call1(prim("round"), [0, a, 0]);}
|
|
function min(a, b){return caml_call1(prim("min"), [0, a, [0, b, 0]]);}
|
|
function max(a, b){return caml_call1(prim("max"), [0, a, [0, b, 0]]);}
|
|
function clamp(a, b, c){
|
|
return caml_call1(prim("clamp"), [0, a, [0, b, [0, c, 0]]]);
|
|
}
|
|
function parse_int(a){return caml_call1(prim("parse-int"), [0, a, 0]);}
|
|
function parse_float(a){return caml_call1(prim("parse-float"), [0, a, 0]);}
|
|
function error(msg){
|
|
var a = value_to_str(msg);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], a], 1);
|
|
}
|
|
function inspect(v){return [2, Sx_types[67].call(null, v)];}
|
|
function apply(f, args){return sx_apply(f, args);}
|
|
function identical_p(a, b){
|
|
return caml_call1(prim("identical?"), [0, a, [0, b, 0]]);
|
|
}
|
|
function is_spread_prim(a){return caml_call1(prim("spread?"), [0, a, 0]);}
|
|
function spread_attrs(a){
|
|
return caml_call1(prim("spread-attrs"), [0, a, 0]);
|
|
}
|
|
function make_spread(a){return caml_call1(prim("make-spread"), [0, a, 0]);}
|
|
function sx_collect(a, b){return prim_call("collect!", [0, a, [0, b, 0]]);}
|
|
function sx_collected(a){return prim_call("collected", [0, a, 0]);}
|
|
function sx_clear_collected(a){
|
|
return prim_call("clear-collected!", [0, a, 0]);
|
|
}
|
|
function sx_emit(a, b){return prim_call("emit!", [0, a, [0, b, 0]]);}
|
|
function sx_emitted(a){return prim_call(cst_emitted, [0, a, 0]);}
|
|
function sx_context(a, b){return prim_call("context", [0, a, [0, b, 0]]);}
|
|
function trampoline(v){return v;}
|
|
function type_of(v){return [2, Sx_types[31].call(null, v)];}
|
|
function unwrap_env(v){
|
|
if(typeof v === "number") return Sx_types[9].call(null, 0);
|
|
switch(v[0]){
|
|
case 6:
|
|
var d = v[1], e = Sx_types[9].call(null, 0);
|
|
Stdlib_Hashtbl[12].call
|
|
(null, function(k, v){Sx_types[11].call(null, e, k, v); return 0;}, d);
|
|
return e;
|
|
case 18:
|
|
var e$0 = v[1]; return e$0;
|
|
default:
|
|
var
|
|
a = Sx_types[31].call(null, v),
|
|
b = Stdlib[28].call(null, "Expected env, got ", a);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
|
|
}
|
|
}
|
|
function env_has(e, name){
|
|
var a = value_to_str(name), b = unwrap_env(e);
|
|
return [0, Sx_types[13].call(null, b, a)];
|
|
}
|
|
function env_get(e, name){
|
|
var a = value_to_str(name), b = unwrap_env(e);
|
|
return Sx_types[15].call(null, b, a);
|
|
}
|
|
function env_bind(e, name, v){
|
|
var a = value_to_str(name), b = unwrap_env(e);
|
|
return Sx_types[11].call(null, b, a, v);
|
|
}
|
|
function env_set(e, name, v){
|
|
var a = value_to_str(name), b = unwrap_env(e);
|
|
return Sx_types[17].call(null, b, a, v);
|
|
}
|
|
function make_env(param){return [18, Sx_types[9].call(null, 0)];}
|
|
function env_extend(e){
|
|
var a = unwrap_env(e);
|
|
return [18, Sx_types[10].call(null, a)];
|
|
}
|
|
function env_merge(a, b){
|
|
var c = unwrap_env(b), d = unwrap_env(a);
|
|
return [18, Sx_types[18].call(null, d, c)];
|
|
}
|
|
function set_lambda_name(l, n){
|
|
var a = value_to_str(n);
|
|
return Sx_types[47].call(null, l, a);
|
|
}
|
|
function is_nil(v){return [0, Sx_types[32].call(null, v)];}
|
|
function is_thunk(v){return [0, Sx_types[37].call(null, v)];}
|
|
function is_lambda(v){return [0, Sx_types[33].call(null, v)];}
|
|
function is_component(v){return [0, Sx_types[34].call(null, v)];}
|
|
function is_island(v){return [0, Sx_types[35].call(null, v)];}
|
|
function is_macro(v){return [0, Sx_types[36].call(null, v)];}
|
|
function is_signal(v){return [0, Sx_types[38].call(null, v)];}
|
|
function is_callable(v){return [0, Sx_types[39].call(null, v)];}
|
|
function is_identical(a, b){return [0, a === b ? 1 : 0];}
|
|
function is_primitive(name){
|
|
var a = value_to_str(name);
|
|
return [0, Sx_primitives[5].call(null, a)];
|
|
}
|
|
function get_primitive(name){
|
|
var a = value_to_str(name);
|
|
return Sx_primitives[6].call(null, a);
|
|
}
|
|
var b = [0, 0], c = [0, 1];
|
|
function is_spread(v){
|
|
if(typeof v !== "number" && 16 === v[0]) return c;
|
|
return b;
|
|
}
|
|
function map_indexed(fn, coll){
|
|
var a = sx_to_list(coll);
|
|
return [5,
|
|
Stdlib_List[21].call
|
|
(null,
|
|
function(i, x){return sx_call(fn, [0, [1, i], [0, x, 0]]);},
|
|
a)];
|
|
}
|
|
function map_dict(fn, d){
|
|
if(typeof d !== "number" && 6 === d[0]){
|
|
var
|
|
tbl = d[1],
|
|
a = Stdlib_Hashtbl[15].call(null, tbl),
|
|
result = Stdlib_Hashtbl[1].call(null, 0, a);
|
|
Stdlib_Hashtbl[12].call
|
|
(null,
|
|
function(k, v){
|
|
var a = sx_call(fn, [0, [2, k], [0, v, 0]]);
|
|
return Stdlib_Hashtbl[11].call(null, result, k, a);
|
|
},
|
|
tbl);
|
|
return [6, result];
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "map-dict: expected dict"], 1);
|
|
}
|
|
function for_each(fn, coll){
|
|
var a = sx_to_list(coll);
|
|
Stdlib_List[18].call
|
|
(null, function(x){sx_call(fn, [0, x, 0]); return 0;}, a);
|
|
return 0;
|
|
}
|
|
function for_each_indexed(fn, coll){
|
|
var a = sx_to_list(coll);
|
|
Stdlib_List[19].call
|
|
(null, function(i, x){sx_call(fn, [0, [1, i], [0, x, 0]]); return 0;}, a);
|
|
return 0;
|
|
}
|
|
var d = [0, 0], e = [0, 1];
|
|
function continuation_p(v){
|
|
if(typeof v !== "number" && 12 === v[0]) return e;
|
|
return d;
|
|
}
|
|
function make_cek_continuation(captured, rest_kont){
|
|
var data = Stdlib_Hashtbl[1].call(null, 0, 2);
|
|
Stdlib_Hashtbl[11].call(null, data, "captured", captured);
|
|
Stdlib_Hashtbl[11].call(null, data, "rest-kont", rest_kont);
|
|
return [12, function(v){return v;}, [0, data]];
|
|
}
|
|
function continuation_data(v){
|
|
if(typeof v !== "number" && 12 === v[0]){
|
|
var match = v[2];
|
|
if(! match) return [6, Stdlib_Hashtbl[1].call(null, 0, 0)];
|
|
var d = match[1];
|
|
return [6, d];
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "not a continuation"], 1);
|
|
}
|
|
function dynamic_wind_call(before, body, after, env){
|
|
sx_call(before, 0);
|
|
var result = sx_call(body, 0);
|
|
sx_call(after, 0);
|
|
return result;
|
|
}
|
|
var cst_scope_push = "scope-push!";
|
|
function scope_push(name, value){
|
|
return prim_call(cst_scope_push, [0, name, [0, value, 0]]);
|
|
}
|
|
var cst_scope_pop = "scope-pop!";
|
|
function scope_pop(name){return prim_call(cst_scope_pop, [0, name, 0]);}
|
|
function scope_peek(name){return prim_call("scope-peek", [0, name, 0]);}
|
|
function scope_emit(name, value){
|
|
return prim_call("scope-emit!", [0, name, [0, value, 0]]);
|
|
}
|
|
function provide_push(name, value){
|
|
return prim_call(cst_scope_push, [0, name, [0, value, 0]]);
|
|
}
|
|
function provide_pop(name){return prim_call(cst_scope_pop, [0, name, 0]);}
|
|
var custom_special_forms = [6, Stdlib_Hashtbl[1].call(null, 0, 4)];
|
|
function register_special_form(name, handler){
|
|
if(6 !== custom_special_forms[0])
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "custom_special_forms not a dict"], 1);
|
|
var tbl = custom_special_forms[1], a = value_to_str(name);
|
|
Stdlib_Hashtbl[11].call(null, tbl, a, handler);
|
|
return handler;
|
|
}
|
|
var f = [0, 0], g = [0, 1];
|
|
function is_else_clause(v){
|
|
if(typeof v !== "number"){
|
|
var cst_default = "default";
|
|
switch(v[0]){
|
|
case 0:
|
|
if(v[1]) return g; break;
|
|
case 3:
|
|
var
|
|
s = v[1],
|
|
a = s === cst_else ? 1 : 0,
|
|
b = a || (s === cst_default ? 1 : 0);
|
|
return [0, b];
|
|
case 4:
|
|
var
|
|
k = v[1],
|
|
c = k === cst_else ? 1 : 0,
|
|
d = c || (k === cst_default ? 1 : 0);
|
|
return [0, d];
|
|
}
|
|
}
|
|
return f;
|
|
}
|
|
var cst_not_a_signal = "not a signal";
|
|
function signal_value(s){
|
|
if(typeof s !== "number")
|
|
switch(s[0]){
|
|
case 6:
|
|
var d = s[1], match = Stdlib_Hashtbl[7].call(null, d, cst_value);
|
|
if(! match) return 0;
|
|
var v = match[1];
|
|
return v;
|
|
case 14:
|
|
var sig = s[1]; return sig[1];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_not_a_signal], 1);
|
|
}
|
|
function signal_set_value(s, v){
|
|
if(typeof s !== "number" && 14 === s[0]){var sig = s[1]; sig[1] = v; return v;}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_not_a_signal], 1);
|
|
}
|
|
var h = [5, 0];
|
|
function signal_subscribers(s){
|
|
if(typeof s !== "number" && 14 === s[0]){
|
|
var sig = s[1];
|
|
return [5,
|
|
Stdlib_List[20].call(null, function(param){return 0;}, sig[2])];
|
|
}
|
|
return h;
|
|
}
|
|
var cst_subscribers = "subscribers";
|
|
function signal_add_sub_b(s, f){
|
|
if(typeof s !== "number" && 6 === s[0]){
|
|
var d = s[1], match = Stdlib_Hashtbl[7].call(null, d, cst_subscribers);
|
|
if(match){
|
|
var match$0 = match[1];
|
|
if(typeof match$0 !== "number")
|
|
switch(match$0[0]){
|
|
case 5:
|
|
var
|
|
items = match$0[1],
|
|
a = [19, [0, Stdlib[37].call(null, items, [0, f, 0])]];
|
|
Stdlib_Hashtbl[11].call(null, d, cst_subscribers, a);
|
|
return 0;
|
|
case 19:
|
|
var r = match$0[1];
|
|
r[1] = Stdlib[37].call(null, r[1], [0, f, 0]);
|
|
return 0;
|
|
}
|
|
}
|
|
Stdlib_Hashtbl[11].call(null, d, cst_subscribers, [19, [0, [0, f, 0]]]);
|
|
return 0;
|
|
}
|
|
return 0;
|
|
}
|
|
function signal_remove_sub_b(s, f){
|
|
if(typeof s !== "number" && 6 === s[0]){
|
|
var d = s[1], match = Stdlib_Hashtbl[7].call(null, d, cst_subscribers);
|
|
if(match){
|
|
var match$0 = match[1];
|
|
if(typeof match$0 !== "number")
|
|
switch(match$0[0]){
|
|
case 5:
|
|
var
|
|
items = match$0[1],
|
|
a =
|
|
[5,
|
|
Stdlib_List[44].call
|
|
(null, function(x){return x !== f ? 1 : 0;}, items)];
|
|
Stdlib_Hashtbl[11].call(null, d, cst_subscribers, a);
|
|
return 0;
|
|
case 19:
|
|
var r = match$0[1];
|
|
r[1] =
|
|
Stdlib_List[44].call
|
|
(null, function(x){return x !== f ? 1 : 0;}, r[1]);
|
|
return 0;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
return 0;
|
|
}
|
|
var cst_deps = "deps", i = [5, 0], j = [5, 0];
|
|
function signal_deps(s){
|
|
if(typeof s !== "number" && 6 === s[0]){
|
|
var d = s[1], match = Stdlib_Hashtbl[7].call(null, d, cst_deps);
|
|
if(! match) return j;
|
|
var v = match[1];
|
|
return v;
|
|
}
|
|
return i;
|
|
}
|
|
function signal_set_deps(s, d){
|
|
if(typeof s !== "number" && 6 === s[0]){
|
|
var tbl = s[1];
|
|
Stdlib_Hashtbl[11].call(null, tbl, cst_deps, d);
|
|
return 0;
|
|
}
|
|
return 0;
|
|
}
|
|
function notify_subscribers(s){
|
|
a:
|
|
{
|
|
if(typeof s !== "number" && 6 === s[0]){
|
|
var d = s[1], match = Stdlib_Hashtbl[7].call(null, d, cst_subscribers);
|
|
if(match){
|
|
var a = match[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 5:
|
|
var subs = a[1]; break a;
|
|
case 19:
|
|
var subs = a[1][1]; break a;
|
|
}
|
|
}
|
|
var subs = 0;
|
|
break a;
|
|
}
|
|
var subs = 0;
|
|
}
|
|
Stdlib_List[18].call(null, function(f){sx_call(f, 0); return 0;}, subs);
|
|
return 0;
|
|
}
|
|
function flush_subscribers(s){return 0;}
|
|
function dispose_computed(s){return 0;}
|
|
function with_island_scope(register_fn, body_fn){
|
|
if(typeof body_fn !== "number" && 13 === body_fn[0]){var f = body_fn[2]; return caml_call1(f, 0);}
|
|
return 0;
|
|
}
|
|
function register_in_scope(dispose_fn){return 0;}
|
|
function component_set_param_types_b(comp, types){return 0;}
|
|
var k = [5, [0, [5, 0], [0, 0, [0, [0, 0], 0]]]];
|
|
function parse_comp_params(params){return k;}
|
|
var l = [5, [0, [5, 0], [0, 0, 0]]];
|
|
function parse_macro_params(params){return l;}
|
|
var m = [0, [5, 0], 0];
|
|
function parse_keyword_args(raw_args, env){
|
|
return [5, [0, [6, Stdlib_Hashtbl[1].call(null, 0, 0)], m]];
|
|
}
|
|
var n = [2, "handler"];
|
|
function make_handler_def(name, params, body, env){
|
|
var d = Stdlib_Hashtbl[1].call(null, 0, 4);
|
|
Stdlib_Hashtbl[11].call(null, d, cst_type, n);
|
|
Stdlib_Hashtbl[11].call(null, d, cst_name, name);
|
|
Stdlib_Hashtbl[11].call(null, d, "params", params);
|
|
Stdlib_Hashtbl[11].call(null, d, cst_body, body);
|
|
return [6, d];
|
|
}
|
|
function make_query_def(name, params, body, env){
|
|
return make_handler_def(name, params, body, env);
|
|
}
|
|
function make_action_def(name, params, body, env){
|
|
return make_handler_def(name, params, body, env);
|
|
}
|
|
var o = [2, "page"];
|
|
function make_page_def(name, opts){
|
|
var d = Stdlib_Hashtbl[1].call(null, 0, 4);
|
|
Stdlib_Hashtbl[11].call(null, d, cst_type, o);
|
|
Stdlib_Hashtbl[11].call(null, d, cst_name, name);
|
|
return [6, d];
|
|
}
|
|
var p = [1, 1.];
|
|
function sf_defhandler(args, env){
|
|
var name = first(args), rest_args = rest(args), a = nth(rest_args, p);
|
|
return make_handler_def(name, first(rest_args), a, env);
|
|
}
|
|
function sf_defquery(args, env){return sf_defhandler(args, env);}
|
|
function sf_defaction(args, env){return sf_defhandler(args, env);}
|
|
function sf_defpage(args, env){
|
|
var name = first(args);
|
|
return make_page_def(name, rest(args));
|
|
}
|
|
function strip_prefix(s, prefix){
|
|
if
|
|
(typeof s !== "number"
|
|
&& 2 === s[0] && typeof prefix !== "number" && 2 === prefix[0]){
|
|
var p = prefix[1], s$0 = s[1], pl = caml_ml_string_length(p);
|
|
if
|
|
(pl <= caml_ml_string_length(s$0)
|
|
&& Stdlib_String[16].call(null, s$0, 0, pl) === p)
|
|
return [2,
|
|
Stdlib_String[16].call
|
|
(null, s$0, pl, caml_ml_string_length(s$0) - pl | 0)];
|
|
return [2, s$0];
|
|
}
|
|
return s;
|
|
}
|
|
function debug_log(a, param){return 0;}
|
|
runtime.caml_register_global
|
|
(177,
|
|
[0,
|
|
prim_call,
|
|
value_to_str,
|
|
sx_to_string,
|
|
sx_str,
|
|
sx_to_list,
|
|
sx_call,
|
|
sx_apply,
|
|
sx_append_b,
|
|
sx_dict_set_b,
|
|
get_val,
|
|
prim,
|
|
first,
|
|
rest,
|
|
last,
|
|
nth,
|
|
cons,
|
|
append,
|
|
reverse,
|
|
flatten,
|
|
concat,
|
|
slice,
|
|
len,
|
|
get,
|
|
sort,
|
|
range,
|
|
unique,
|
|
zip,
|
|
zip_pairs,
|
|
take,
|
|
drop,
|
|
chunk_every,
|
|
empty_p,
|
|
nil_p,
|
|
number_p,
|
|
string_p,
|
|
boolean_p,
|
|
list_p,
|
|
dict_p,
|
|
symbol_p,
|
|
keyword_p,
|
|
contains_p,
|
|
has_key_p,
|
|
starts_with_p,
|
|
ends_with_p,
|
|
string_contains_p,
|
|
odd_p,
|
|
even_p,
|
|
zero_p,
|
|
str,
|
|
upper,
|
|
upcase,
|
|
lower,
|
|
downcase,
|
|
trim,
|
|
split,
|
|
join,
|
|
replace,
|
|
index_of,
|
|
substring,
|
|
string_length,
|
|
char_from_code,
|
|
assoc,
|
|
dissoc,
|
|
merge,
|
|
keys,
|
|
vals,
|
|
dict_set,
|
|
dict_get,
|
|
dict_has_p,
|
|
dict_delete,
|
|
abs,
|
|
sqrt,
|
|
pow,
|
|
floor,
|
|
ceil,
|
|
round,
|
|
min,
|
|
max,
|
|
clamp,
|
|
parse_int,
|
|
parse_float,
|
|
error,
|
|
inspect,
|
|
apply,
|
|
identical_p,
|
|
is_spread_prim,
|
|
spread_attrs,
|
|
make_spread,
|
|
sx_collect,
|
|
sx_collected,
|
|
sx_clear_collected,
|
|
sx_emit,
|
|
sx_emitted,
|
|
sx_context,
|
|
trampoline,
|
|
type_of,
|
|
unwrap_env,
|
|
env_has,
|
|
env_get,
|
|
env_bind,
|
|
env_set,
|
|
make_env,
|
|
env_extend,
|
|
env_merge,
|
|
set_lambda_name,
|
|
is_nil,
|
|
is_thunk,
|
|
is_lambda,
|
|
is_component,
|
|
is_island,
|
|
is_macro,
|
|
is_signal,
|
|
is_callable,
|
|
is_identical,
|
|
is_primitive,
|
|
get_primitive,
|
|
is_spread,
|
|
map_indexed,
|
|
map_dict,
|
|
for_each,
|
|
for_each_indexed,
|
|
continuation_p,
|
|
make_cek_continuation,
|
|
continuation_data,
|
|
dynamic_wind_call,
|
|
scope_push,
|
|
scope_pop,
|
|
scope_peek,
|
|
scope_emit,
|
|
provide_push,
|
|
provide_pop,
|
|
custom_special_forms,
|
|
register_special_form,
|
|
0,
|
|
0,
|
|
is_else_clause,
|
|
signal_value,
|
|
signal_set_value,
|
|
signal_subscribers,
|
|
signal_add_sub_b,
|
|
signal_remove_sub_b,
|
|
signal_deps,
|
|
signal_set_deps,
|
|
notify_subscribers,
|
|
flush_subscribers,
|
|
dispose_computed,
|
|
with_island_scope,
|
|
register_in_scope,
|
|
component_set_param_types_b,
|
|
parse_comp_params,
|
|
parse_macro_params,
|
|
parse_keyword_args,
|
|
make_handler_def,
|
|
make_query_def,
|
|
make_action_def,
|
|
make_page_def,
|
|
sf_defhandler,
|
|
sf_defquery,
|
|
sf_defaction,
|
|
sf_defpage,
|
|
strip_prefix,
|
|
debug_log],
|
|
"Sx_runtime");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 4991 "../lib/.sx.objs/jsoo/default/sx.cma.js"
|
|
//# shape: Sx_ref:[N,F(1),N,N,N,F(3)*,F(3)*,F(1),F(1),F(1),F(1),F(1),F(1),F(3)*,F(2)*,F(2)*,F(4)*,F(4)*,F(2)*,F(6)*,F(3)*,F(3)*,F(3)*,F(2)*,F(4)*,F(4)*,F(5)*,F(3)*,F(3)*,F(3)*,F(3)*,F(3)*,F(4)*,F(4)*,F(1)*,F(3)*,F(2)*,F(2)*,F(4)*,F(3)*,F(1)*,F(4)*,F(1),F(2),F(1),F(1),F(1),F(1),F(2),F(2),F(1),F(1),N,F(2),N,N,N,F(1),N,F(1),F(2),F(2),F(3),F(3),F(3),F(2),F(1),F(1),F(2),F(2),F(2),F(3),F(1),F(2),F(2),F(1),F(2),F(2),F(3),F(2),F(2),F(2),F(3),F(1),F(1),F(1),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(2),F(3),F(4),F(1),F(1)*,F(2),F(4),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(1),F(5),F(4),F(2),F(1),F(2),F(1)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_equal = runtime.caml_equal,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Sx_runtime = global_data.Sx_runtime,
|
|
Sx_types = global_data.Sx_types,
|
|
Stdlib_List = global_data.Stdlib__List,
|
|
Stdlib_Hashtbl = global_data.Stdlib__Hashtbl,
|
|
Sx_primitives = global_data.Sx_primitives,
|
|
trampoline_fn = [0, function(v){return v;}];
|
|
function trampoline(v){return caml_call1(trampoline_fn[1], v);}
|
|
var
|
|
strict_ref = [0, [0, 0]],
|
|
strict = strict_ref[1],
|
|
prim_param_types_ref = [0, 0],
|
|
prim_param_types = prim_param_types_ref[1],
|
|
cst_eval = "eval";
|
|
function make_cek_state(control, env, kont){
|
|
return [20, [0, control, env, kont, cst_eval, 0]];
|
|
}
|
|
var cst_continue = "continue";
|
|
function make_cek_value(value, env, kont){
|
|
return [20, [0, 0, env, kont, cst_continue, value]];
|
|
}
|
|
var
|
|
cst = "=",
|
|
cst_kont = "kont",
|
|
cst_phase = "phase",
|
|
a = [0, [2, cst_continue], 0],
|
|
b = [2, cst_phase],
|
|
c = [2, cst_kont];
|
|
function cek_terminal_p(state){
|
|
var
|
|
d = [0, Sx_runtime[23].call(null, state, b), a],
|
|
and = Sx_runtime[1].call(null, cst, d);
|
|
if(! Sx_types[40].call(null, and)) return and;
|
|
var e = Sx_runtime[23].call(null, state, c);
|
|
return Sx_runtime[32].call(null, e);
|
|
}
|
|
var d = [2, "control"];
|
|
function cek_control(s){return Sx_runtime[23].call(null, s, d);}
|
|
var cst_env = "env", e = [2, cst_env];
|
|
function cek_env(s){return Sx_runtime[23].call(null, s, e);}
|
|
var f = [2, cst_kont];
|
|
function cek_kont(s){return Sx_runtime[23].call(null, s, f);}
|
|
var g = [2, cst_phase];
|
|
function cek_phase(s){return Sx_runtime[23].call(null, s, g);}
|
|
var cst_value = "value", h = [2, cst_value];
|
|
function cek_value(s){return Sx_runtime[23].call(null, s, h);}
|
|
var cst_if = "if";
|
|
function make_if_frame(then_expr, else_expr, env){
|
|
return [21, [0, cst_if, env, else_expr, then_expr, 0, 0, 0, 0, 0, 0]];
|
|
}
|
|
var cst_when = "when";
|
|
function make_when_frame(body_exprs, env){
|
|
return [21, [0, cst_when, env, 0, body_exprs, 0, 0, 0, 0, 0, 0]];
|
|
}
|
|
var cst_begin = "begin";
|
|
function make_begin_frame(remaining, env){
|
|
return [21, [0, cst_begin, env, 0, 0, remaining, 0, 0, 0, 0, 0]];
|
|
}
|
|
var cst_let = "let";
|
|
function make_let_frame(name, remaining, body, local){
|
|
return [21, [0, cst_let, local, name, body, remaining, 0, 0, 0, 0, 0]];
|
|
}
|
|
var cst_define = "define";
|
|
function make_define_frame(name, env, has_effects, effect_list){
|
|
return [21,
|
|
[0,
|
|
cst_define,
|
|
env,
|
|
name,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
has_effects,
|
|
effect_list]];
|
|
}
|
|
var cst_set = "set";
|
|
function make_set_frame(name, env){
|
|
return [21, [0, cst_set, env, name, 0, 0, 0, 0, 0, 0, 0]];
|
|
}
|
|
var cst_arg = "arg";
|
|
function make_arg_frame(f, evaled, remaining, env, raw_args, head_name){
|
|
var head_name$0 = Sx_types[40].call(null, head_name) ? head_name : 0;
|
|
return [21,
|
|
[0,
|
|
cst_arg,
|
|
env,
|
|
0,
|
|
0,
|
|
remaining,
|
|
f,
|
|
evaled,
|
|
raw_args,
|
|
head_name$0,
|
|
0]];
|
|
}
|
|
function make_call_frame(f, args, env){
|
|
return [21, [0, "call", env, 0, 0, 0, f, args, 0, 0, 0]];
|
|
}
|
|
var cst_cond = "cond";
|
|
function make_cond_frame(remaining, env, scheme_p){
|
|
return [21, [0, cst_cond, env, 0, 0, remaining, 0, 0, 0, scheme_p, 0]];
|
|
}
|
|
var cst_case = "case";
|
|
function make_case_frame(match_val, remaining, env){
|
|
return [21, [0, cst_case, env, 0, 0, remaining, 0, 0, 0, match_val, 0]];
|
|
}
|
|
var cst_thread = "thread";
|
|
function make_thread_frame(remaining, env){
|
|
return [21, [0, cst_thread, env, 0, 0, remaining, 0, 0, 0, 0, 0]];
|
|
}
|
|
var cst_map = "map", i = [0, 0];
|
|
function make_map_frame(f, remaining, results, env){
|
|
return [21, [0, cst_map, env, 0, 0, remaining, f, 0, results, i, 0]];
|
|
}
|
|
var j = [0, 1];
|
|
function make_map_indexed_frame(f, remaining, results, env){
|
|
return [21, [0, cst_map, env, 0, 0, remaining, f, 0, results, j, 0]];
|
|
}
|
|
var cst_filter = "filter";
|
|
function make_filter_frame(f, remaining, results, current_item, env){
|
|
return [21,
|
|
[0,
|
|
cst_filter,
|
|
env,
|
|
0,
|
|
0,
|
|
remaining,
|
|
f,
|
|
0,
|
|
results,
|
|
current_item,
|
|
0]];
|
|
}
|
|
var cst_reduce = "reduce";
|
|
function make_reduce_frame(f, remaining, env){
|
|
return [21, [0, cst_reduce, env, 0, 0, remaining, f, 0, 0, 0, 0]];
|
|
}
|
|
var cst_for_each = "for-each";
|
|
function make_for_each_frame(f, remaining, env){
|
|
return [21, [0, cst_for_each, env, 0, 0, remaining, f, 0, 0, 0, 0]];
|
|
}
|
|
var cst_some = "some";
|
|
function make_some_frame(f, remaining, env){
|
|
return [21, [0, cst_some, env, 0, 0, remaining, f, 0, 0, 0, 0]];
|
|
}
|
|
var cst_every = "every";
|
|
function make_every_frame(f, remaining, env){
|
|
return [21, [0, cst_every, env, 0, 0, remaining, f, 0, 0, 0, 0]];
|
|
}
|
|
var cst_scope = "scope";
|
|
function make_scope_frame(name, remaining, env){
|
|
return [21, [0, cst_scope, env, name, 0, remaining, 0, 0, 0, 0, 0]];
|
|
}
|
|
var cst_provide = "provide";
|
|
function make_provide_frame(name, value, remaining, env){
|
|
return [21, [0, cst_provide, env, name, 0, remaining, 0, 0, 0, value, 0]];
|
|
}
|
|
var cst_scope_acc = "scope-acc", k = [5, 0];
|
|
function make_scope_acc_frame(name, value, remaining, env){
|
|
var value$0 = Sx_types[40].call(null, value) ? value : 0;
|
|
return [21,
|
|
[0, cst_scope_acc, env, name, 0, remaining, 0, 0, 0, value$0, k]];
|
|
}
|
|
var cst_reset = "reset";
|
|
function make_reset_frame(env){
|
|
return [21, [0, cst_reset, env, 0, 0, 0, 0, 0, 0, 0, 0]];
|
|
}
|
|
var cst_dict = "dict";
|
|
function make_dict_frame(remaining, results, env){
|
|
return [21, [0, cst_dict, env, 0, 0, remaining, 0, 0, results, 0, 0]];
|
|
}
|
|
var cst_and = "and";
|
|
function make_and_frame(remaining, env){
|
|
return [21, [0, cst_and, env, 0, 0, remaining, 0, 0, 0, 0, 0]];
|
|
}
|
|
var cst_or = "or";
|
|
function make_or_frame(remaining, env){
|
|
return [21, [0, cst_or, env, 0, 0, remaining, 0, 0, 0, 0, 0]];
|
|
}
|
|
var cst_dynamic_wind = "dynamic-wind";
|
|
function make_dynamic_wind_frame(phase, body_thunk, after_thunk, env){return [21, [0, cst_dynamic_wind, env, 0, 0, 0, 0, 0, 0, phase, 0]];
|
|
}
|
|
var cst_reactive_reset = "reactive-reset";
|
|
function make_reactive_reset_frame(env, update_fn, first_render_p){
|
|
return [21,
|
|
[0,
|
|
cst_reactive_reset,
|
|
env,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
update_fn,
|
|
first_render_p]];
|
|
}
|
|
var cst_deref = "deref";
|
|
function make_deref_frame(env){
|
|
return [21, [0, cst_deref, env, 0, 0, 0, 0, 0, 0, 0, 0]];
|
|
}
|
|
var cst_ho_setup = "ho-setup";
|
|
function make_ho_setup_frame(ho_type, remaining_args, evaled_args, env){
|
|
return [21,
|
|
[0,
|
|
cst_ho_setup,
|
|
env,
|
|
0,
|
|
0,
|
|
remaining_args,
|
|
0,
|
|
evaled_args,
|
|
0,
|
|
ho_type,
|
|
0]];
|
|
}
|
|
var l = [2, "type"];
|
|
function frame_type(f){return Sx_runtime[23].call(null, f, l);}
|
|
function kont_push(frame, kont){
|
|
return Sx_runtime[16].call(null, frame, kont);
|
|
}
|
|
function kont_top(kont){return Sx_runtime[12].call(null, kont);}
|
|
function kont_pop(kont){return Sx_runtime[13].call(null, kont);}
|
|
function kont_empty_p(kont){return Sx_runtime[32].call(null, kont);}
|
|
var
|
|
cst_append = "append",
|
|
captured = [5, 0],
|
|
m = [2, "shift without enclosing reset"],
|
|
n = [0, [2, cst_reset], 0],
|
|
o = [0, [2, cst_reactive_reset], 0];
|
|
function kont_capture_to_reset(kont){
|
|
var k = kont, captured$0 = captured;
|
|
for(;;){
|
|
var a = Sx_runtime[32].call(null, k);
|
|
if(Sx_types[40].call(null, a)){
|
|
var b = Sx_runtime[2].call(null, m);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
|
|
}
|
|
var
|
|
frame = Sx_runtime[12].call(null, k),
|
|
c = [0, frame_type(frame), n],
|
|
or = Sx_runtime[1].call(null, cst, c);
|
|
if(Sx_types[40].call(null, or))
|
|
var or$0 = or;
|
|
else
|
|
var
|
|
d = [0, frame_type(frame), o],
|
|
or$0 = Sx_runtime[1].call(null, cst, d);
|
|
if(Sx_types[40].call(null, or$0))
|
|
return [5, [0, captured$0, [0, Sx_runtime[13].call(null, k), 0]]];
|
|
var
|
|
captured$1 =
|
|
Sx_runtime[1].call
|
|
(null, cst_append, [0, captured$0, [0, [5, [0, frame, 0]], 0]]),
|
|
k$0 = Sx_runtime[13].call(null, k);
|
|
k = k$0;
|
|
captured$0 = captured$1;
|
|
}
|
|
}
|
|
var cst_name = "name", p = [0, [2, cst_provide], 0], q = [2, cst_name];
|
|
function kont_find_provide(kont$1, name){
|
|
var kont = kont$1;
|
|
for(;;){
|
|
var b = Sx_runtime[32].call(null, kont);
|
|
if(Sx_types[40].call(null, b)) return 0;
|
|
var
|
|
frame = Sx_runtime[12].call(null, kont),
|
|
c = [0, frame_type(frame), p],
|
|
and = Sx_runtime[1].call(null, cst, c);
|
|
if(Sx_types[40].call(null, and))
|
|
var
|
|
d = [0, Sx_runtime[23].call(null, frame, q), [0, name, 0]],
|
|
a = Sx_runtime[1].call(null, cst, d);
|
|
else
|
|
var a = and;
|
|
if(Sx_types[40].call(null, a)) return frame;
|
|
var kont$0 = Sx_runtime[13].call(null, kont);
|
|
kont = kont$0;
|
|
}
|
|
}
|
|
var r = [0, [2, cst_scope_acc], 0], s = [2, cst_name];
|
|
function kont_find_scope_acc(kont$1, name){
|
|
var kont = kont$1;
|
|
for(;;){
|
|
var b = Sx_runtime[32].call(null, kont);
|
|
if(Sx_types[40].call(null, b)) return 0;
|
|
var
|
|
frame = Sx_runtime[12].call(null, kont),
|
|
c = [0, frame_type(frame), r],
|
|
and = Sx_runtime[1].call(null, cst, c);
|
|
if(Sx_types[40].call(null, and))
|
|
var
|
|
d = [0, Sx_runtime[23].call(null, frame, s), [0, name, 0]],
|
|
a = Sx_runtime[1].call(null, cst, d);
|
|
else
|
|
var a = and;
|
|
if(Sx_types[40].call(null, a)) return frame;
|
|
var kont$0 = Sx_runtime[13].call(null, kont);
|
|
kont = kont$0;
|
|
}
|
|
}
|
|
var t = [0, 0], u = [0, [2, cst_reactive_reset], 0], v = [0, 1];
|
|
function has_reactive_reset_frame_p(kont$1){
|
|
var kont = kont$1;
|
|
for(;;){
|
|
var a = Sx_runtime[32].call(null, kont);
|
|
if(Sx_types[40].call(null, a)) return t;
|
|
var
|
|
b = [0, frame_type(Sx_runtime[12].call(null, kont)), u],
|
|
c = Sx_runtime[1].call(null, cst, b);
|
|
if(Sx_types[40].call(null, c)) return v;
|
|
var kont$0 = Sx_runtime[13].call(null, kont);
|
|
kont = kont$0;
|
|
}
|
|
}
|
|
var
|
|
captured$0 = [5, 0],
|
|
w = [2, "reactive deref without enclosing reactive-reset"],
|
|
x = [0, [2, cst_reactive_reset], 0];
|
|
function kont_capture_to_reactive_reset(kont){
|
|
var k = kont, captured = captured$0;
|
|
for(;;){
|
|
var a = Sx_runtime[32].call(null, k);
|
|
if(Sx_types[40].call(null, a)){
|
|
var b = Sx_runtime[2].call(null, w);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
|
|
}
|
|
var
|
|
frame = Sx_runtime[12].call(null, k),
|
|
c = [0, frame_type(frame), x],
|
|
d = Sx_runtime[1].call(null, cst, c);
|
|
if(Sx_types[40].call(null, d))
|
|
return [5,
|
|
[0, captured, [0, frame, [0, Sx_runtime[13].call(null, k), 0]]]];
|
|
var
|
|
captured$1 =
|
|
Sx_runtime[1].call
|
|
(null, cst_append, [0, captured, [0, [5, [0, frame, 0]], 0]]),
|
|
k$0 = Sx_runtime[13].call(null, k);
|
|
k = k$0;
|
|
captured = captured$1;
|
|
}
|
|
}
|
|
var custom_special_forms = [];
|
|
function register_special_form(name, handler){
|
|
return Sx_runtime[9].call(null, custom_special_forms, name, handler);
|
|
}
|
|
function set_strict_b(val){strict_ref[1] = val; return 0;}
|
|
function set_prim_param_types_b(types){
|
|
prim_param_types_ref[1] = types;
|
|
return 0;
|
|
}
|
|
var
|
|
cst$0 = "-",
|
|
cst_boolean = "boolean",
|
|
cst_keyword = "keyword",
|
|
cst_lambda = "lambda",
|
|
cst_list = "list",
|
|
cst_nil = "nil",
|
|
cst_number = "number",
|
|
cst_slice = "slice",
|
|
cst_string = "string",
|
|
cst_symbol = "symbol",
|
|
y = [0, [2, "any"], 0],
|
|
z = [0, 1],
|
|
A = [0, [2, cst_number], 0],
|
|
B = [0, [2, cst_string], 0],
|
|
C = [0, [2, cst_boolean], 0],
|
|
D = [0, [2, cst_nil], 0],
|
|
E = [0, [2, cst_list], 0],
|
|
F = [0, [2, cst_dict], 0],
|
|
G = [0, [2, cst_lambda], 0],
|
|
H = [0, [2, cst_symbol], 0],
|
|
I = [0, [2, cst_symbol], 0],
|
|
J = [0, [2, cst_keyword], 0],
|
|
K = [0, [2, cst_keyword], 0],
|
|
L = [0, [2, "?"], 0],
|
|
M = [0, [1, 1.], 0],
|
|
N = [1, 0.],
|
|
O = [0, 1];
|
|
function value_matches_type_p(val, expected_type$1){
|
|
var expected_type = expected_type$1;
|
|
for(;;){
|
|
var a = Sx_runtime[1].call(null, cst, [0, expected_type, y]);
|
|
if(Sx_types[40].call(null, a)) return z;
|
|
var b = Sx_runtime[1].call(null, cst, [0, expected_type, A]);
|
|
if(Sx_types[40].call(null, b)) return Sx_runtime[34].call(null, val);
|
|
var c = Sx_runtime[1].call(null, cst, [0, expected_type, B]);
|
|
if(Sx_types[40].call(null, c)) return Sx_runtime[35].call(null, val);
|
|
var d = Sx_runtime[1].call(null, cst, [0, expected_type, C]);
|
|
if(Sx_types[40].call(null, d)) return Sx_runtime[36].call(null, val);
|
|
var e = Sx_runtime[1].call(null, cst, [0, expected_type, D]);
|
|
if(Sx_types[40].call(null, e)) return Sx_runtime[106].call(null, val);
|
|
var f = Sx_runtime[1].call(null, cst, [0, expected_type, E]);
|
|
if(Sx_types[40].call(null, f)) return Sx_runtime[37].call(null, val);
|
|
var g = Sx_runtime[1].call(null, cst, [0, expected_type, F]);
|
|
if(Sx_types[40].call(null, g)) return Sx_runtime[38].call(null, val);
|
|
var h = Sx_runtime[1].call(null, cst, [0, expected_type, G]);
|
|
if(Sx_types[40].call(null, h)) return Sx_runtime[108].call(null, val);
|
|
var i = Sx_runtime[1].call(null, cst, [0, expected_type, H]);
|
|
if(Sx_types[40].call(null, i)){
|
|
var j = [0, Sx_runtime[96].call(null, val), I];
|
|
return Sx_runtime[1].call(null, cst, j);
|
|
}
|
|
var k = Sx_runtime[1].call(null, cst, [0, expected_type, J]);
|
|
if(Sx_types[40].call(null, k)){
|
|
var l = [0, Sx_runtime[96].call(null, val), K];
|
|
return Sx_runtime[1].call(null, cst, l);
|
|
}
|
|
var
|
|
and = Sx_runtime[35].call(null, expected_type),
|
|
m =
|
|
Sx_types[40].call(null, and)
|
|
? Sx_runtime[1].call(null, "ends-with?", [0, expected_type, L])
|
|
: and;
|
|
if(! Sx_types[40].call(null, m)) return O;
|
|
var or = Sx_runtime[106].call(null, val);
|
|
if(Sx_types[40].call(null, or)) return or;
|
|
var
|
|
n =
|
|
[0,
|
|
Sx_runtime[1].call(null, "string-length", [0, expected_type, 0]),
|
|
M],
|
|
o =
|
|
[0, expected_type, [0, N, [0, Sx_runtime[1].call(null, cst$0, n), 0]]],
|
|
expected_type$0 = Sx_runtime[1].call(null, cst_slice, o);
|
|
expected_type = expected_type$0;
|
|
}
|
|
}
|
|
var
|
|
cst$2 = " (",
|
|
cst_expected = " expected ",
|
|
cst$1 = ")",
|
|
cst_got = ", got ",
|
|
cst$3 = "<",
|
|
cst$4 = ">",
|
|
cst_Type_error = "Type error: ",
|
|
P = [2, "positional"],
|
|
Q = [2, "rest-type"],
|
|
R = [1, 1.],
|
|
S = [1, 1.],
|
|
T = [0, [2, cst$1], 0],
|
|
U = [2, cst$2],
|
|
V = [2, cst_got],
|
|
W = [2, " for param "],
|
|
X = [2, cst_expected],
|
|
Y = [2, cst_Type_error],
|
|
Z = [1, 1.],
|
|
_ = [0, [2, cst$1], 0],
|
|
$ = [2, cst$2],
|
|
aa = [2, cst_got],
|
|
ab = [2, " for rest arg "],
|
|
ac = [2, cst_expected],
|
|
ad = [2, cst_Type_error],
|
|
ae = [5, 0],
|
|
af = [5, 0];
|
|
function strict_check_args(name, args){
|
|
var
|
|
and = strict_ref[1],
|
|
b = Sx_types[40].call(null, and) ? prim_param_types_ref[1] : and;
|
|
if(! Sx_types[40].call(null, b)) return 0;
|
|
var spec = Sx_runtime[23].call(null, prim_param_types_ref[1], name);
|
|
if(! Sx_types[40].call(null, spec)) return 0;
|
|
var
|
|
positional = Sx_runtime[23].call(null, spec, P),
|
|
rest_type = Sx_runtime[23].call(null, spec, Q);
|
|
if(Sx_types[40].call(null, positional)){
|
|
var
|
|
c = Sx_runtime[5].call(null, positional),
|
|
d =
|
|
[5,
|
|
Stdlib_List[21].call
|
|
(null,
|
|
function(i, p){var i$0 = [1, i]; return [5, [0, i$0, [0, p, 0]]];},
|
|
c)],
|
|
e = Sx_runtime[5].call(null, d);
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(pair){
|
|
var
|
|
idx = Sx_runtime[12].call(null, pair),
|
|
param = Sx_runtime[15].call(null, pair, R),
|
|
p_name = Sx_runtime[12].call(null, param),
|
|
p_type = Sx_runtime[15].call(null, param, S),
|
|
a = [0, idx, [0, Sx_runtime[22].call(null, args), 0]],
|
|
b = Sx_runtime[1].call(null, cst$3, a);
|
|
if(Sx_types[40].call(null, b)){
|
|
var
|
|
val = Sx_runtime[15].call(null, args, idx),
|
|
c = value_matches_type_p(val, p_type),
|
|
d = [0, 1 - Sx_types[40].call(null, c)];
|
|
if(Sx_types[40].call(null, d)){
|
|
var
|
|
e = [0, U, [0, [2, Sx_runtime[4].call(null, [0, val, 0])], T]],
|
|
f =
|
|
[0,
|
|
Y,
|
|
[0,
|
|
name,
|
|
[0,
|
|
X,
|
|
[0,
|
|
p_type,
|
|
[0,
|
|
W,
|
|
[0, p_name, [0, V, [0, Sx_runtime[96].call(null, val), e]]]]]]]],
|
|
g = [2, Sx_runtime[4].call(null, f)],
|
|
h = Sx_runtime[2].call(null, g);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], h], 1);
|
|
}
|
|
}
|
|
return 0;
|
|
},
|
|
e);
|
|
}
|
|
if(Sx_types[40].call(null, rest_type))
|
|
var
|
|
positional$0 = Sx_types[40].call(null, positional) ? positional : af,
|
|
f = [0, Sx_runtime[22].call(null, positional$0), 0],
|
|
g = [0, Sx_runtime[22].call(null, args), f],
|
|
a = Sx_runtime[1].call(null, cst$4, g);
|
|
else
|
|
var a = rest_type;
|
|
if(! Sx_types[40].call(null, a)) return 0;
|
|
var
|
|
positional$1 = Sx_types[40].call(null, positional) ? positional : ae,
|
|
h = [0, args, [0, Sx_runtime[22].call(null, positional$1), 0]],
|
|
i = Sx_runtime[1].call(null, cst_slice, h),
|
|
j = Sx_runtime[5].call(null, i),
|
|
k =
|
|
[5,
|
|
Stdlib_List[21].call
|
|
(null,
|
|
function(i, v){var i$0 = [1, i]; return [5, [0, i$0, [0, v, 0]]];},
|
|
j)],
|
|
l = Sx_runtime[5].call(null, k);
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(pair){
|
|
var
|
|
idx = Sx_runtime[12].call(null, pair),
|
|
val = Sx_runtime[15].call(null, pair, Z),
|
|
a = value_matches_type_p(val, rest_type),
|
|
b = [0, 1 - Sx_types[40].call(null, a)];
|
|
if(! Sx_types[40].call(null, b)) return 0;
|
|
var
|
|
c = [0, $, [0, [2, Sx_runtime[4].call(null, [0, val, 0])], _]],
|
|
d =
|
|
[0,
|
|
ad,
|
|
[0,
|
|
name,
|
|
[0,
|
|
ac,
|
|
[0,
|
|
rest_type,
|
|
[0,
|
|
ab,
|
|
[0, idx, [0, aa, [0, Sx_runtime[96].call(null, val), c]]]]]]]],
|
|
e = [2, Sx_runtime[4].call(null, d)],
|
|
f = Sx_runtime[2].call(null, e);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], f], 1);
|
|
},
|
|
l);
|
|
return 0;
|
|
}
|
|
var
|
|
cst_rest = "&rest",
|
|
cst_zip = "zip",
|
|
ag = [5, 0],
|
|
ah = [2, " args, got "],
|
|
ai = [2, " expects "],
|
|
aj = [2, cst_lambda],
|
|
ak = [1, 1.];
|
|
function bind_lambda_params(f, args, local){
|
|
var params = Sx_types[43].call(null, f);
|
|
a:
|
|
{
|
|
if(typeof params !== "number")
|
|
switch(params[0]){
|
|
case 5:
|
|
var param_list = params[1]; break a;
|
|
case 19:
|
|
var param_list = params[1][1]; break a;
|
|
}
|
|
var param_list = 0;
|
|
}
|
|
a:
|
|
{
|
|
if(typeof args !== "number")
|
|
switch(args[0]){
|
|
case 5:
|
|
var args_list = args[1]; break a;
|
|
case 19:
|
|
var args_list = args[1][1]; break a;
|
|
}
|
|
var args_list = 0;
|
|
}
|
|
var rest_idx = [0, -1];
|
|
Stdlib_List[19].call
|
|
(null,
|
|
function(i, p){
|
|
if(typeof p !== "number" && p[0] - 2 >>> 0 < 2 && p[1] === cst_rest){rest_idx[1] = i; return 0;}
|
|
return 0;
|
|
},
|
|
param_list);
|
|
if(0 > rest_idx[1]){
|
|
var
|
|
b = [0, Sx_runtime[22].call(null, params), 0],
|
|
c = [0, Sx_runtime[22].call(null, args), b],
|
|
d = Sx_runtime[1].call(null, cst$4, c);
|
|
if(Sx_types[40].call(null, d)){
|
|
var
|
|
e = [0, ah, [0, Sx_runtime[22].call(null, args), 0]],
|
|
g = [0, ai, [0, Sx_runtime[22].call(null, params), e]],
|
|
or = Sx_types[46].call(null, f),
|
|
or$0 = Sx_types[40].call(null, or) ? or : aj,
|
|
h = [2, Sx_runtime[4].call(null, [0, or$0, g])],
|
|
i = Sx_runtime[2].call(null, h);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], i], 1);
|
|
}
|
|
var
|
|
j = Sx_runtime[1].call(null, cst_zip, [0, params, [0, args, 0]]),
|
|
k = Sx_runtime[5].call(null, j);
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(pair){
|
|
var
|
|
a = Sx_runtime[15].call(null, pair, ak),
|
|
b = Sx_runtime[12].call(null, pair),
|
|
c = Sx_runtime[3].call(null, b);
|
|
Sx_runtime[100].call(null, local, c, a);
|
|
return 0;
|
|
},
|
|
k);
|
|
var
|
|
l = [0, params, [0, Sx_runtime[22].call(null, args), 0]],
|
|
m = Sx_runtime[1].call(null, cst_slice, l),
|
|
n = Sx_runtime[5].call(null, m);
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(p){
|
|
var a = Sx_runtime[3].call(null, p);
|
|
Sx_runtime[100].call(null, local, a, 0);
|
|
return 0;
|
|
},
|
|
n);
|
|
return 0;
|
|
}
|
|
var
|
|
required =
|
|
Stdlib_List[46].call
|
|
(null,
|
|
function(i, param){return i < rest_idx[1] ? 1 : 0;},
|
|
param_list),
|
|
match = Stdlib_List[9].call(null, param_list, rest_idx[1] + 1 | 0),
|
|
cst_rest$0 = "rest";
|
|
if(match){
|
|
var match$0 = match[1];
|
|
if(typeof match$0 === "number" || ! (match$0[0] - 2 >>> 0 < 2))
|
|
var rest_name = cst_rest$0;
|
|
else
|
|
var s = match$0[1], rest_name = s;
|
|
}
|
|
else
|
|
var rest_name = cst_rest$0;
|
|
Stdlib_List[19].call
|
|
(null,
|
|
function(i, p){
|
|
var
|
|
name = Sx_runtime[3].call(null, p),
|
|
match = Stdlib_List[9].call(null, args_list, i);
|
|
if(match) var v = match[1], v$0 = v; else var v$0 = 0;
|
|
Sx_runtime[100].call(null, local, name, v$0);
|
|
return 0;
|
|
},
|
|
required);
|
|
var
|
|
a = Stdlib_List[1].call(null, args_list),
|
|
rest_vals =
|
|
rest_idx[1] <= a
|
|
? [5,
|
|
Stdlib_List[46].call
|
|
(null,
|
|
function(i, param){return rest_idx[1] <= i ? 1 : 0;},
|
|
args_list)]
|
|
: ag;
|
|
Sx_runtime[100].call(null, local, [2, rest_name], rest_vals);
|
|
return 0;
|
|
}
|
|
function call_lambda(f, args, caller_env){
|
|
var
|
|
a = Sx_types[45].call(null, f),
|
|
local = Sx_runtime[104].call(null, a, caller_env);
|
|
bind_lambda_params(f, args, local);
|
|
var b = Sx_types[44].call(null, f);
|
|
return Sx_types[28].call(null, b, local);
|
|
}
|
|
var cst_children = "children", al = [1, 1.], am = [2, cst_children];
|
|
function call_component(comp, raw_args, env){
|
|
var
|
|
parsed = parse_keyword_args(raw_args, env),
|
|
kwargs = Sx_runtime[12].call(null, parsed),
|
|
children = Sx_runtime[15].call(null, parsed, al),
|
|
a = Sx_types[51].call(null, comp),
|
|
local = Sx_runtime[104].call(null, a, env),
|
|
b = Sx_types[49].call(null, comp),
|
|
c = Sx_runtime[5].call(null, b);
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(p){
|
|
var
|
|
or = Sx_runtime[68].call(null, kwargs, p),
|
|
or$0 = Sx_types[40].call(null, or) ? or : 0,
|
|
a = Sx_runtime[3].call(null, p);
|
|
Sx_runtime[100].call(null, local, a, or$0);
|
|
return 0;
|
|
},
|
|
c);
|
|
var d = Sx_types[52].call(null, comp);
|
|
if(Sx_types[40].call(null, d)){
|
|
var e = Sx_runtime[3].call(null, am);
|
|
Sx_runtime[100].call(null, local, e, children);
|
|
}
|
|
var f = Sx_types[50].call(null, comp);
|
|
return Sx_types[28].call(null, f, local);
|
|
}
|
|
var
|
|
cst_assoc = "assoc",
|
|
cst_i = "i",
|
|
cst_inc = "inc",
|
|
cst_skip = "skip",
|
|
an = [5, 0],
|
|
ao = [1, 0.],
|
|
ap = [2, cst_i],
|
|
aq = [0, 0],
|
|
ar = [2, cst_skip],
|
|
as = [2, cst_i],
|
|
at = [2, cst_skip],
|
|
au = [2, cst_i],
|
|
av = [0, 0],
|
|
aw = [2, cst_skip],
|
|
ax = [0, [2, cst_keyword], 0],
|
|
ay = [2, cst_i],
|
|
az = [0, 1],
|
|
aA = [2, cst_skip],
|
|
aB = [2, cst_i];
|
|
function parse_keyword_args(raw_args, env){
|
|
var
|
|
kwargs = [6, Stdlib_Hashtbl[1].call(null, 0, 0)],
|
|
a = Sx_runtime[5].call(null, raw_args),
|
|
d = Stdlib_Hashtbl[1].call(null, 0, 2),
|
|
b = Sx_runtime[2].call(null, ap);
|
|
Stdlib_Hashtbl[11].call(null, d, b, ao);
|
|
var c = Sx_runtime[2].call(null, ar);
|
|
Stdlib_Hashtbl[11].call(null, d, c, aq);
|
|
var children = [0, an];
|
|
Stdlib_List[26].call
|
|
(null,
|
|
function(state, arg){
|
|
var
|
|
idx = Sx_runtime[23].call(null, state, as),
|
|
skip = Sx_runtime[23].call(null, state, at);
|
|
if(Sx_types[40].call(null, skip)){
|
|
var
|
|
b =
|
|
[0,
|
|
state,
|
|
[0,
|
|
aw,
|
|
[0,
|
|
av,
|
|
[0, au, [0, Sx_runtime[1].call(null, cst_inc, [0, idx, 0]), 0]]]]];
|
|
return Sx_runtime[1].call(null, cst_assoc, b);
|
|
}
|
|
var
|
|
c = [0, Sx_runtime[96].call(null, arg), ax],
|
|
and = Sx_runtime[1].call(null, cst, c);
|
|
if(Sx_types[40].call(null, and))
|
|
var
|
|
d = [0, Sx_runtime[22].call(null, raw_args), 0],
|
|
e = [0, Sx_runtime[1].call(null, cst_inc, [0, idx, 0]), d],
|
|
a = Sx_runtime[1].call(null, cst$3, e);
|
|
else
|
|
var a = and;
|
|
if(Sx_types[40].call(null, a)){
|
|
var
|
|
f = Sx_runtime[1].call(null, cst_inc, [0, idx, 0]),
|
|
g =
|
|
trampoline(eval_expr(Sx_runtime[15].call(null, raw_args, f), env)),
|
|
h = Sx_types[42].call(null, arg);
|
|
Sx_runtime[9].call(null, kwargs, h, g);
|
|
var
|
|
i =
|
|
[0,
|
|
state,
|
|
[0,
|
|
aA,
|
|
[0,
|
|
az,
|
|
[0, ay, [0, Sx_runtime[1].call(null, cst_inc, [0, idx, 0]), 0]]]]];
|
|
return Sx_runtime[1].call(null, cst_assoc, i);
|
|
}
|
|
var j = trampoline(eval_expr(arg, env));
|
|
children[1] = Sx_runtime[8].call(null, children[1], j);
|
|
var
|
|
k =
|
|
[0,
|
|
state,
|
|
[0, aB, [0, Sx_runtime[1].call(null, cst_inc, [0, idx, 0]), 0]]];
|
|
return Sx_runtime[1].call(null, cst_assoc, k);
|
|
},
|
|
[6, d],
|
|
a);
|
|
return [5, [0, kwargs, [0, children[1], 0]]];
|
|
}
|
|
var aC = [0, [2, cst_list], 0], aD = [0, [1, 2.], 0];
|
|
function cond_scheme_p(clauses){
|
|
var a = Sx_runtime[5].call(null, clauses);
|
|
return [0,
|
|
Stdlib_List[33].call
|
|
(null,
|
|
function(c){
|
|
var
|
|
b = [0, Sx_runtime[96].call(null, c), aC],
|
|
and = Sx_runtime[1].call(null, cst, b);
|
|
if(Sx_types[40].call(null, and))
|
|
var
|
|
d = [0, Sx_runtime[22].call(null, c), aD],
|
|
a = Sx_runtime[1].call(null, cst, d);
|
|
else
|
|
var a = and;
|
|
return Sx_types[40].call(null, a);
|
|
},
|
|
a)];
|
|
}
|
|
var
|
|
cst_else = "else",
|
|
aE = [0, [2, cst_keyword], 0],
|
|
aF = [0, [2, cst_else], 0],
|
|
aG = [0, [2, cst_symbol], 0],
|
|
aH = [0, [2, cst_else], 0],
|
|
aI = [0, [2, ":else"], 0];
|
|
function is_else_clause(test){
|
|
var
|
|
a = [0, Sx_runtime[96].call(null, test), aE],
|
|
and = Sx_runtime[1].call(null, cst, a);
|
|
if(Sx_types[40].call(null, and))
|
|
var
|
|
b = [0, Sx_types[42].call(null, test), aF],
|
|
or = Sx_runtime[1].call(null, cst, b);
|
|
else
|
|
var or = and;
|
|
if(Sx_types[40].call(null, or)) return or;
|
|
var
|
|
c = [0, Sx_runtime[96].call(null, test), aG],
|
|
and$0 = Sx_runtime[1].call(null, cst, c);
|
|
if(! Sx_types[40].call(null, and$0)) return and$0;
|
|
var
|
|
d = [0, Sx_types[41].call(null, test), aH],
|
|
or$0 = Sx_runtime[1].call(null, cst, d);
|
|
if(Sx_types[40].call(null, or$0)) return or$0;
|
|
var e = [0, Sx_types[41].call(null, test), aI];
|
|
return Sx_runtime[1].call(null, cst, e);
|
|
}
|
|
var
|
|
cst$5 = "*",
|
|
cst$6 = "/",
|
|
cst_range = "range",
|
|
aJ = [1, 1.],
|
|
aK = [0, [1, 2.], 0],
|
|
aL = [5, 0],
|
|
aM = [5, 0],
|
|
aN = [0, [2, cst_list], 0],
|
|
aO = [0, [1, 2.], 0],
|
|
aP = [0, [2, cst_symbol], 0],
|
|
aQ = [1, 1.],
|
|
aR = [0, [1, 1.], 0],
|
|
aS = [2, cst_begin],
|
|
aT = [0, [1, 2.], 0],
|
|
aU = [1, 0.],
|
|
aV = [0, [2, cst_symbol], 0],
|
|
aW = [0, [1, 2.], 0],
|
|
aX = [0, [1, 2.], 0],
|
|
aY = [0, [1, 2.], 0],
|
|
aZ = [0, [1, 2.], 0];
|
|
function sf_named_let(args, env){
|
|
var
|
|
b = Sx_runtime[12].call(null, args),
|
|
loop_name = Sx_types[41].call(null, b),
|
|
bindings = Sx_runtime[15].call(null, args, aJ),
|
|
body = Sx_runtime[1].call(null, cst_slice, [0, args, aK]),
|
|
c = Sx_runtime[12].call(null, bindings),
|
|
d = [0, Sx_runtime[96].call(null, c), aN],
|
|
and = Sx_runtime[1].call(null, cst, d);
|
|
if(Sx_types[40].call(null, and))
|
|
var
|
|
e = Sx_runtime[12].call(null, bindings),
|
|
f = [0, Sx_runtime[22].call(null, e), aO],
|
|
a = Sx_runtime[1].call(null, cst, f);
|
|
else
|
|
var a = and;
|
|
var params = [0, aL], inits = [0, aM];
|
|
if(Sx_types[40].call(null, a)){
|
|
var g = Sx_runtime[5].call(null, bindings);
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(binding){
|
|
var
|
|
b = Sx_runtime[12].call(null, binding),
|
|
c = [0, Sx_runtime[96].call(null, b), aP],
|
|
d = Sx_runtime[1].call(null, cst, c);
|
|
if(Sx_types[40].call(null, d))
|
|
var
|
|
e = Sx_runtime[12].call(null, binding),
|
|
a = Sx_types[41].call(null, e);
|
|
else
|
|
var a = Sx_runtime[12].call(null, binding);
|
|
params[1] = Sx_runtime[8].call(null, params[1], a);
|
|
var f = Sx_runtime[15].call(null, binding, aQ);
|
|
inits[1] = Sx_runtime[8].call(null, inits[1], f);
|
|
return 0;
|
|
},
|
|
g);
|
|
}
|
|
else{
|
|
var
|
|
o = [0, Sx_runtime[22].call(null, bindings), aT],
|
|
p = [0, aU, [0, Sx_runtime[1].call(null, cst$6, o), 0]],
|
|
q = Sx_runtime[1].call(null, cst_range, p),
|
|
r = Sx_runtime[5].call(null, q);
|
|
Stdlib_List[26].call
|
|
(null,
|
|
function(acc, pair_idx){
|
|
var
|
|
b = Sx_runtime[1].call(null, cst$5, [0, pair_idx, aW]),
|
|
c = Sx_runtime[15].call(null, bindings, b),
|
|
d = [0, Sx_runtime[96].call(null, c), aV],
|
|
e = Sx_runtime[1].call(null, cst, d);
|
|
if(Sx_types[40].call(null, e))
|
|
var
|
|
f = Sx_runtime[1].call(null, cst$5, [0, pair_idx, aX]),
|
|
g = Sx_runtime[15].call(null, bindings, f),
|
|
a = Sx_types[41].call(null, g);
|
|
else
|
|
var
|
|
k = Sx_runtime[1].call(null, cst$5, [0, pair_idx, aZ]),
|
|
a = Sx_runtime[15].call(null, bindings, k);
|
|
params[1] = Sx_runtime[8].call(null, params[1], a);
|
|
var
|
|
h = [0, Sx_runtime[1].call(null, cst$5, [0, pair_idx, aY]), 0],
|
|
i = Sx_runtime[1].call(null, cst_inc, h),
|
|
j = Sx_runtime[15].call(null, bindings, i);
|
|
inits[1] = Sx_runtime[8].call(null, inits[1], j);
|
|
return 0;
|
|
},
|
|
0,
|
|
r);
|
|
}
|
|
var
|
|
h = [0, Sx_runtime[22].call(null, body), aR],
|
|
i = Sx_runtime[1].call(null, cst, h);
|
|
if(Sx_types[40].call(null, i))
|
|
var loop_body = Sx_runtime[12].call(null, body);
|
|
else
|
|
var
|
|
n = Sx_types[29].call(null, aS),
|
|
loop_body = Sx_runtime[16].call(null, n, body);
|
|
var
|
|
loop_fn = Sx_types[24].call(null, params[1], loop_body, env),
|
|
j = Sx_runtime[3].call(null, loop_name);
|
|
Sx_runtime[105].call(null, loop_fn, j);
|
|
var
|
|
k = Sx_runtime[3].call(null, loop_name),
|
|
l = Sx_types[45].call(null, loop_fn);
|
|
Sx_runtime[100].call(null, l, k, loop_fn);
|
|
var
|
|
m = Sx_runtime[5].call(null, inits[1]),
|
|
init_vals =
|
|
[5,
|
|
Stdlib_List[20].call
|
|
(null, function(e){return trampoline(eval_expr(e, env));}, m)];
|
|
return call_lambda(loop_fn, init_vals, env);
|
|
}
|
|
var
|
|
cst_as = "as",
|
|
a0 = [0, [1, 1.], 0],
|
|
a1 = [0, [2, cst_symbol], 0],
|
|
a2 = [0, [2, cst_list], 0],
|
|
a3 = [0, [1, 3.], 0],
|
|
a4 = [0, [2, cst_keyword], 0],
|
|
a5 = [1, 1.],
|
|
a6 = [0, [2, cst_as], 0],
|
|
a7 = [1, 1.],
|
|
a8 = [2, cst_begin];
|
|
function sf_lambda(args, env){
|
|
var
|
|
params_expr = Sx_runtime[12].call(null, args),
|
|
body_exprs = Sx_runtime[13].call(null, args),
|
|
a = [0, Sx_runtime[22].call(null, body_exprs), a0],
|
|
b = Sx_runtime[1].call(null, cst, a);
|
|
if(Sx_types[40].call(null, b))
|
|
var body = Sx_runtime[12].call(null, body_exprs);
|
|
else
|
|
var
|
|
d = Sx_types[29].call(null, a8),
|
|
body = Sx_runtime[16].call(null, d, body_exprs);
|
|
var
|
|
c = Sx_runtime[5].call(null, params_expr),
|
|
param_names =
|
|
[5,
|
|
Stdlib_List[20].call
|
|
(null,
|
|
function(p){
|
|
var
|
|
b = [0, Sx_runtime[96].call(null, p), a1],
|
|
c = Sx_runtime[1].call(null, cst, b);
|
|
if(Sx_types[40].call(null, c)) return Sx_types[41].call(null, p);
|
|
var
|
|
d = [0, Sx_runtime[96].call(null, p), a2],
|
|
and = Sx_runtime[1].call(null, cst, d);
|
|
if(Sx_types[40].call(null, and)){
|
|
var
|
|
e = [0, Sx_runtime[22].call(null, p), a3],
|
|
and$0 = Sx_runtime[1].call(null, cst, e);
|
|
if(Sx_types[40].call(null, and$0)){
|
|
var
|
|
f = Sx_runtime[15].call(null, p, a5),
|
|
g = [0, Sx_runtime[96].call(null, f), a4],
|
|
and$1 = Sx_runtime[1].call(null, cst, g);
|
|
if(Sx_types[40].call(null, and$1))
|
|
var
|
|
h = Sx_runtime[15].call(null, p, a7),
|
|
i = [0, Sx_types[42].call(null, h), a6],
|
|
a = Sx_runtime[1].call(null, cst, i);
|
|
else
|
|
var a = and$1;
|
|
}
|
|
else
|
|
var a = and$0;
|
|
}
|
|
else
|
|
var a = and;
|
|
if(! Sx_types[40].call(null, a)) return p;
|
|
var j = Sx_runtime[12].call(null, p);
|
|
return Sx_types[41].call(null, j);
|
|
},
|
|
c)];
|
|
return Sx_types[24].call(null, param_names, body, env);
|
|
}
|
|
var
|
|
cst_effect_annotations = "*effect-annotations*",
|
|
cst_effects = "effects",
|
|
cst_keys = "keys",
|
|
cst$7 = "~",
|
|
a9 = [1, 1.],
|
|
a_ = [2, cst$7],
|
|
a$ = [1, 1.],
|
|
ba = [1, 2.],
|
|
bb = [2, "auto"],
|
|
bc = [2, "affinity"],
|
|
bd = [2, cst_effects],
|
|
be = [0, [2, cst_list], 0],
|
|
bf = [0, [2, cst_symbol], 0],
|
|
bg = [2, cst_effect_annotations],
|
|
bh = [2, cst_effect_annotations],
|
|
bi = [2, cst_effect_annotations];
|
|
function sf_defcomp(args, env){
|
|
var
|
|
name_sym = Sx_runtime[12].call(null, args),
|
|
params_raw = Sx_runtime[15].call(null, args, a9),
|
|
body = Sx_runtime[14].call(null, args),
|
|
a = Sx_types[41].call(null, name_sym),
|
|
comp_name = Sx_runtime[161].call(null, a, a_),
|
|
parsed = parse_comp_params(params_raw),
|
|
params = Sx_runtime[12].call(null, parsed),
|
|
has_children = Sx_runtime[15].call(null, parsed, a$),
|
|
param_types = Sx_runtime[15].call(null, parsed, ba),
|
|
affinity = defcomp_kwarg(args, bc, bb),
|
|
comp =
|
|
Sx_types[25].call
|
|
(null, comp_name, params, has_children, body, env, affinity),
|
|
effects = defcomp_kwarg(args, bd, 0),
|
|
b = Sx_runtime[106].call(null, param_types),
|
|
and = [0, 1 - Sx_types[40].call(null, b)];
|
|
if(Sx_types[40].call(null, and)){
|
|
var c = Sx_runtime[1].call(null, cst_keys, [0, param_types, 0]);
|
|
Sx_runtime[32].call(null, c);
|
|
}
|
|
var
|
|
d = Sx_runtime[106].call(null, effects),
|
|
e = [0, 1 - Sx_types[40].call(null, d)];
|
|
if(Sx_types[40].call(null, e)){
|
|
var
|
|
f = [0, Sx_runtime[96].call(null, effects), be],
|
|
g = Sx_runtime[1].call(null, cst, f);
|
|
if(Sx_types[40].call(null, g))
|
|
var
|
|
h = Sx_runtime[5].call(null, effects),
|
|
effect_list =
|
|
[5,
|
|
Stdlib_List[20].call
|
|
(null,
|
|
function(e){
|
|
var
|
|
a = [0, Sx_runtime[96].call(null, e), bf],
|
|
b = Sx_runtime[1].call(null, cst, a);
|
|
return Sx_types[40].call(null, b)
|
|
? Sx_types[41].call(null, e)
|
|
: [2, Sx_runtime[4].call(null, [0, e, 0])];
|
|
},
|
|
h)];
|
|
else
|
|
var
|
|
effect_list =
|
|
[5, [0, [2, Sx_runtime[4].call(null, [0, effects, 0])], 0]];
|
|
var
|
|
i = Sx_runtime[98].call(null, env, bg),
|
|
effect_anns =
|
|
Sx_types[40].call(null, i)
|
|
? Sx_runtime[99].call(null, env, bh)
|
|
: [6, Stdlib_Hashtbl[1].call(null, 0, 0)],
|
|
j = Sx_types[41].call(null, name_sym);
|
|
Sx_runtime[9].call(null, effect_anns, j, effect_list);
|
|
var k = Sx_runtime[3].call(null, bi);
|
|
Sx_runtime[100].call(null, env, k, effect_anns);
|
|
}
|
|
var
|
|
l = Sx_types[41].call(null, name_sym),
|
|
m = Sx_runtime[3].call(null, l);
|
|
Sx_runtime[100].call(null, env, m, comp);
|
|
return comp;
|
|
}
|
|
var
|
|
bj = [0, [1, 1.], 0],
|
|
bk = [0, [1, 1.], 0],
|
|
bl = [1, 2.],
|
|
bm = [0, [2, cst_keyword], 0],
|
|
bn = [0, [1, 1.], 0],
|
|
bo = [0, [1, 1.], 0],
|
|
bp = [0, [2, cst_keyword], 0];
|
|
function defcomp_kwarg(args, key, default$){
|
|
var
|
|
a = [0, Sx_runtime[22].call(null, args), bj],
|
|
end = Sx_runtime[1].call(null, cst$0, a),
|
|
result = [0, default$],
|
|
b = Sx_runtime[1].call(null, cst_range, [0, bl, [0, end, bk]]),
|
|
c = Sx_runtime[5].call(null, b);
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(i){
|
|
var
|
|
b = Sx_runtime[15].call(null, args, i),
|
|
c = [0, Sx_runtime[96].call(null, b), bm],
|
|
and = Sx_runtime[1].call(null, cst, c),
|
|
cst$0 = "+";
|
|
if(Sx_types[40].call(null, and)){
|
|
var
|
|
d = Sx_runtime[15].call(null, args, i),
|
|
e = [0, Sx_types[42].call(null, d), [0, key, 0]],
|
|
and$0 = Sx_runtime[1].call(null, cst, e);
|
|
if(Sx_types[40].call(null, and$0))
|
|
var
|
|
f = [0, Sx_runtime[1].call(null, cst$0, [0, i, bn]), [0, end, 0]],
|
|
a = Sx_runtime[1].call(null, cst$3, f);
|
|
else
|
|
var a = and$0;
|
|
}
|
|
else
|
|
var a = and;
|
|
if(Sx_types[40].call(null, a)){
|
|
var
|
|
g = Sx_runtime[1].call(null, cst$0, [0, i, bo]),
|
|
val = Sx_runtime[15].call(null, args, g),
|
|
h = [0, Sx_runtime[96].call(null, val), bp],
|
|
j = Sx_runtime[1].call(null, cst, h),
|
|
k = Sx_types[40].call(null, j) ? Sx_types[42].call(null, val) : val;
|
|
result[1] = k;
|
|
}
|
|
return 0;
|
|
},
|
|
c);
|
|
return result[1];
|
|
}
|
|
var
|
|
bq = [5, 0],
|
|
br = [0, 0],
|
|
bs = [0, 0],
|
|
bt = [0, [2, cst_list], 0],
|
|
bu = [0, [1, 3.], 0],
|
|
bv = [0, [2, cst_symbol], 0],
|
|
bw = [0, [2, cst_keyword], 0],
|
|
bx = [1, 1.],
|
|
by = [0, [2, cst_as], 0],
|
|
bz = [1, 1.],
|
|
bA = [1, 2.],
|
|
bB = [0, [2, cst_symbol], 0],
|
|
bC = [0, [2, cst_symbol], 0],
|
|
bD = [0, [2, "&key"], 0],
|
|
bE = [0, 1],
|
|
bF = [0, [2, cst_rest], 0],
|
|
bG = [0, 1],
|
|
bH = [0, [2, "&children"], 0],
|
|
bI = [0, 1];
|
|
function parse_comp_params(params_expr){
|
|
var
|
|
param_types = [6, Stdlib_Hashtbl[1].call(null, 0, 0)],
|
|
a = Sx_runtime[5].call(null, params_expr),
|
|
params = [0, bq],
|
|
has_children = [0, br],
|
|
in_key = [0, bs];
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(p){
|
|
var
|
|
b = [0, Sx_runtime[96].call(null, p), bt],
|
|
and = Sx_runtime[1].call(null, cst, b);
|
|
if(Sx_types[40].call(null, and)){
|
|
var
|
|
c = [0, Sx_runtime[22].call(null, p), bu],
|
|
and$0 = Sx_runtime[1].call(null, cst, c);
|
|
if(Sx_types[40].call(null, and$0)){
|
|
var
|
|
d = Sx_runtime[12].call(null, p),
|
|
e = [0, Sx_runtime[96].call(null, d), bv],
|
|
and$1 = Sx_runtime[1].call(null, cst, e);
|
|
if(Sx_types[40].call(null, and$1)){
|
|
var
|
|
f = Sx_runtime[15].call(null, p, bx),
|
|
g = [0, Sx_runtime[96].call(null, f), bw],
|
|
and$2 = Sx_runtime[1].call(null, cst, g);
|
|
if(Sx_types[40].call(null, and$2))
|
|
var
|
|
h = Sx_runtime[15].call(null, p, bz),
|
|
i = [0, Sx_types[42].call(null, h), by],
|
|
a = Sx_runtime[1].call(null, cst, i);
|
|
else
|
|
var a = and$2;
|
|
}
|
|
else
|
|
var a = and$1;
|
|
}
|
|
else
|
|
var a = and$0;
|
|
}
|
|
else
|
|
var a = and;
|
|
if(Sx_types[40].call(null, a)){
|
|
var
|
|
j = Sx_runtime[12].call(null, p),
|
|
name = Sx_types[41].call(null, j),
|
|
ptype = Sx_runtime[15].call(null, p, bA),
|
|
k = [0, Sx_runtime[96].call(null, ptype), bB],
|
|
l = Sx_runtime[1].call(null, cst, k),
|
|
type_val =
|
|
Sx_types[40].call(null, l) ? Sx_types[41].call(null, ptype) : ptype,
|
|
m = [0, 1 - Sx_types[40].call(null, has_children[1])];
|
|
if(Sx_types[40].call(null, m)){
|
|
params[1] = Sx_runtime[8].call(null, params[1], name);
|
|
Sx_runtime[9].call(null, param_types, name, type_val);
|
|
}
|
|
}
|
|
else{
|
|
var
|
|
n = [0, Sx_runtime[96].call(null, p), bC],
|
|
o = Sx_runtime[1].call(null, cst, n);
|
|
if(Sx_types[40].call(null, o)){
|
|
var
|
|
name$0 = Sx_types[41].call(null, p),
|
|
q = Sx_runtime[1].call(null, cst, [0, name$0, bD]);
|
|
if(Sx_types[40].call(null, q))
|
|
in_key[1] = bE;
|
|
else{
|
|
var r = Sx_runtime[1].call(null, cst, [0, name$0, bF]);
|
|
if(Sx_types[40].call(null, r))
|
|
has_children[1] = bG;
|
|
else{
|
|
var s = Sx_runtime[1].call(null, cst, [0, name$0, bH]);
|
|
if(Sx_types[40].call(null, s))
|
|
has_children[1] = bI;
|
|
else if(! Sx_types[40].call(null, has_children[1]))
|
|
if(Sx_types[40].call(null, in_key[1]))
|
|
params[1] = Sx_runtime[8].call(null, params[1], name$0);
|
|
else
|
|
params[1] = Sx_runtime[8].call(null, params[1], name$0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
},
|
|
a);
|
|
return [5, [0, params[1], [0, has_children[1], [0, param_types, 0]]]];
|
|
}
|
|
var
|
|
bJ = [1, 1.],
|
|
bK = [1, 2.],
|
|
bL = [0, [1, 1.], 0],
|
|
bM = [2, cst$7],
|
|
bN = [1, 1.],
|
|
bO = [2, cst_begin];
|
|
function sf_defisland(args, env){
|
|
var
|
|
name_sym = Sx_runtime[12].call(null, args),
|
|
params_raw = Sx_runtime[15].call(null, args, bJ),
|
|
body_exprs = Sx_runtime[21].call(null, args, bK),
|
|
a = [0, Sx_runtime[22].call(null, body_exprs), bL],
|
|
b = Sx_runtime[1].call(null, cst, a);
|
|
if(Sx_types[40].call(null, b))
|
|
var body = Sx_runtime[12].call(null, body_exprs);
|
|
else
|
|
var
|
|
f = [0, Sx_types[29].call(null, bO), [0, body_exprs, 0]],
|
|
body = Sx_runtime[1].call(null, "cons", f);
|
|
var
|
|
c = Sx_types[41].call(null, name_sym),
|
|
comp_name = Sx_runtime[161].call(null, c, bM),
|
|
parsed = parse_comp_params(params_raw),
|
|
params = Sx_runtime[12].call(null, parsed),
|
|
has_children = Sx_runtime[15].call(null, parsed, bN),
|
|
island =
|
|
Sx_types[26].call(null, comp_name, params, has_children, body, env),
|
|
d = Sx_types[41].call(null, name_sym),
|
|
e = Sx_runtime[3].call(null, d);
|
|
Sx_runtime[100].call(null, env, e, island);
|
|
return island;
|
|
}
|
|
var bP = [1, 1.], bQ = [1, 2.], bR = [1, 1.];
|
|
function sf_defmacro(args, env){
|
|
var
|
|
name_sym = Sx_runtime[12].call(null, args),
|
|
params_raw = Sx_runtime[15].call(null, args, bP),
|
|
body = Sx_runtime[15].call(null, args, bQ),
|
|
parsed = parse_macro_params(params_raw),
|
|
params = Sx_runtime[12].call(null, parsed),
|
|
rest_param = Sx_runtime[15].call(null, parsed, bR),
|
|
a = Sx_types[41].call(null, name_sym),
|
|
mac = Sx_types[27].call(null, params, rest_param, body, env, a),
|
|
b = Sx_types[41].call(null, name_sym),
|
|
c = Sx_runtime[3].call(null, b);
|
|
Sx_runtime[100].call(null, env, c, mac);
|
|
return mac;
|
|
}
|
|
var
|
|
cst_in_rest = "in-rest",
|
|
bS = [5, 0],
|
|
bT = [0, 0],
|
|
bU = [2, cst_in_rest],
|
|
bV = [0, [2, cst_symbol], 0],
|
|
bW = [0, [2, cst_rest], 0],
|
|
bX = [0, [2, cst_in_rest], [0, [0, 1], 0]],
|
|
bY = [2, cst_in_rest],
|
|
bZ = [0, [2, cst_symbol], 0],
|
|
b0 = [0, [2, cst_symbol], 0];
|
|
function parse_macro_params(params_expr){
|
|
var
|
|
a = Sx_runtime[5].call(null, params_expr),
|
|
d = Stdlib_Hashtbl[1].call(null, 0, 1),
|
|
b = Sx_runtime[2].call(null, bU);
|
|
Stdlib_Hashtbl[11].call(null, d, b, bT);
|
|
var params = [0, bS], rest_param = [0, 0];
|
|
Stdlib_List[26].call
|
|
(null,
|
|
function(state, p){
|
|
var
|
|
b = [0, Sx_runtime[96].call(null, p), bV],
|
|
and = Sx_runtime[1].call(null, cst, b);
|
|
if(Sx_types[40].call(null, and))
|
|
var
|
|
c = [0, Sx_types[41].call(null, p), bW],
|
|
a = Sx_runtime[1].call(null, cst, c);
|
|
else
|
|
var a = and;
|
|
if(Sx_types[40].call(null, a))
|
|
return Sx_runtime[1].call(null, cst_assoc, [0, state, bX]);
|
|
var d = Sx_runtime[23].call(null, state, bY);
|
|
if(Sx_types[40].call(null, d)){
|
|
var
|
|
e = [0, Sx_runtime[96].call(null, p), bZ],
|
|
f = Sx_runtime[1].call(null, cst, e),
|
|
g = Sx_types[40].call(null, f) ? Sx_types[41].call(null, p) : p;
|
|
rest_param[1] = g;
|
|
return state;
|
|
}
|
|
var
|
|
h = [0, Sx_runtime[96].call(null, p), b0],
|
|
i = Sx_runtime[1].call(null, cst, h),
|
|
j = Sx_types[40].call(null, i) ? Sx_types[41].call(null, p) : p;
|
|
params[1] = Sx_runtime[8].call(null, params[1], j);
|
|
return state;
|
|
},
|
|
[6, d],
|
|
a);
|
|
return [5, [0, params[1], [0, rest_param[1], 0]]];
|
|
}
|
|
var
|
|
cst_concat = "concat",
|
|
b1 = [0, [2, cst_list], 0],
|
|
b2 = [5, 0],
|
|
b3 = [0, [2, cst_symbol], 0],
|
|
b4 = [0, [2, "unquote"], 0],
|
|
b5 = [1, 1.],
|
|
b6 = [5, 0],
|
|
b7 = [0, [2, cst_list], 0],
|
|
b8 = [0, [1, 2.], 0],
|
|
b9 = [0, [2, cst_symbol], 0],
|
|
b_ = [0, [2, "splice-unquote"], 0],
|
|
b$ = [1, 1.],
|
|
ca = [0, [2, cst_list], 0];
|
|
function qq_expand(template, env){
|
|
var
|
|
b = [0, Sx_runtime[96].call(null, template), b1],
|
|
c = Sx_runtime[1].call(null, cst, b),
|
|
d = [0, 1 - Sx_types[40].call(null, c)];
|
|
if(Sx_types[40].call(null, d)) return template;
|
|
var e = Sx_runtime[32].call(null, template);
|
|
if(Sx_types[40].call(null, e)) return b2;
|
|
var
|
|
head = Sx_runtime[12].call(null, template),
|
|
f = [0, Sx_runtime[96].call(null, head), b3],
|
|
and = Sx_runtime[1].call(null, cst, f);
|
|
if(Sx_types[40].call(null, and))
|
|
var
|
|
g = [0, Sx_types[41].call(null, head), b4],
|
|
a = Sx_runtime[1].call(null, cst, g);
|
|
else
|
|
var a = and;
|
|
if(Sx_types[40].call(null, a))
|
|
return trampoline
|
|
(eval_expr(Sx_runtime[15].call(null, template, b5), env));
|
|
var h = Sx_runtime[5].call(null, template);
|
|
return Stdlib_List[26].call
|
|
(null,
|
|
function(result, item){
|
|
var
|
|
b = [0, Sx_runtime[96].call(null, item), b7],
|
|
and = Sx_runtime[1].call(null, cst, b);
|
|
if(Sx_types[40].call(null, and)){
|
|
var
|
|
c = [0, Sx_runtime[22].call(null, item), b8],
|
|
and$0 = Sx_runtime[1].call(null, cst, c);
|
|
if(Sx_types[40].call(null, and$0)){
|
|
var
|
|
d = Sx_runtime[12].call(null, item),
|
|
e = [0, Sx_runtime[96].call(null, d), b9],
|
|
and$1 = Sx_runtime[1].call(null, cst, e);
|
|
if(Sx_types[40].call(null, and$1))
|
|
var
|
|
f = Sx_runtime[12].call(null, item),
|
|
g = [0, Sx_types[41].call(null, f), b_],
|
|
a = Sx_runtime[1].call(null, cst, g);
|
|
else
|
|
var a = and$1;
|
|
}
|
|
else
|
|
var a = and$0;
|
|
}
|
|
else
|
|
var a = and;
|
|
if(! Sx_types[40].call(null, a)){
|
|
var k = [0, result, [0, [5, [0, qq_expand(item, env), 0]], 0]];
|
|
return Sx_runtime[1].call(null, cst_concat, k);
|
|
}
|
|
var
|
|
spliced =
|
|
trampoline
|
|
(eval_expr(Sx_runtime[15].call(null, item, b$), env)),
|
|
h = [0, Sx_runtime[96].call(null, spliced), ca],
|
|
i = Sx_runtime[1].call(null, cst, h);
|
|
if(Sx_types[40].call(null, i))
|
|
return Sx_runtime[1].call
|
|
(null, cst_concat, [0, result, [0, spliced, 0]]);
|
|
var j = Sx_runtime[106].call(null, spliced);
|
|
return Sx_types[40].call(null, j)
|
|
? result
|
|
: Sx_runtime
|
|
[1].call
|
|
(null,
|
|
cst_concat,
|
|
[0, result, [0, [5, [0, spliced, 0]], 0]]);
|
|
},
|
|
b6,
|
|
h);
|
|
}
|
|
var
|
|
cst_dec = "dec",
|
|
cb = [5, 0],
|
|
cc = [5, 0],
|
|
cd = [0, [2, cst_list], 0],
|
|
ce = [0, [1, 2.], 0],
|
|
cf = [0, [2, cst_symbol], 0],
|
|
cg = [1, 1.],
|
|
ch = [1, 1.],
|
|
ci = [1, 0.],
|
|
cj = [0, [1, 2.], 0],
|
|
ck = [1, 0.],
|
|
cl = [0, [2, cst_symbol], 0],
|
|
cm = [0, [1, 2.], 0],
|
|
cn = [0, [1, 2.], 0],
|
|
co = [0, [1, 2.], 0],
|
|
cp = [0, [1, 2.], 0];
|
|
function sf_letrec(args, env){
|
|
var
|
|
bindings = Sx_runtime[12].call(null, args),
|
|
body = Sx_runtime[13].call(null, args),
|
|
local = Sx_runtime[103].call(null, env),
|
|
b = Sx_runtime[12].call(null, bindings),
|
|
c = [0, Sx_runtime[96].call(null, b), cd],
|
|
and = Sx_runtime[1].call(null, cst, c);
|
|
if(Sx_types[40].call(null, and))
|
|
var
|
|
d = Sx_runtime[12].call(null, bindings),
|
|
e = [0, Sx_runtime[22].call(null, d), ce],
|
|
a = Sx_runtime[1].call(null, cst, e);
|
|
else
|
|
var a = and;
|
|
var names = [0, cb], val_exprs = [0, cc];
|
|
if(Sx_types[40].call(null, a)){
|
|
var f = Sx_runtime[5].call(null, bindings);
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(binding){
|
|
var
|
|
a = Sx_runtime[12].call(null, binding),
|
|
b = [0, Sx_runtime[96].call(null, a), cf],
|
|
c = Sx_runtime[1].call(null, cst, b);
|
|
if(Sx_types[40].call(null, c))
|
|
var
|
|
d = Sx_runtime[12].call(null, binding),
|
|
vname = Sx_types[41].call(null, d);
|
|
else
|
|
var vname = Sx_runtime[12].call(null, binding);
|
|
names[1] = Sx_runtime[8].call(null, names[1], vname);
|
|
var e = Sx_runtime[15].call(null, binding, cg);
|
|
val_exprs[1] = Sx_runtime[8].call(null, val_exprs[1], e);
|
|
var f = Sx_runtime[3].call(null, vname);
|
|
Sx_runtime[100].call(null, local, f, 0);
|
|
return 0;
|
|
},
|
|
f);
|
|
}
|
|
else{
|
|
var
|
|
p = [0, Sx_runtime[22].call(null, bindings), cj],
|
|
q = [0, ck, [0, Sx_runtime[1].call(null, cst$6, p), 0]],
|
|
r = Sx_runtime[1].call(null, cst_range, q),
|
|
s = Sx_runtime[5].call(null, r);
|
|
Stdlib_List[26].call
|
|
(null,
|
|
function(acc, pair_idx){
|
|
var
|
|
a = Sx_runtime[1].call(null, cst$5, [0, pair_idx, cm]),
|
|
b = Sx_runtime[15].call(null, bindings, a),
|
|
c = [0, Sx_runtime[96].call(null, b), cl],
|
|
d = Sx_runtime[1].call(null, cst, c);
|
|
if(Sx_types[40].call(null, d))
|
|
var
|
|
e = Sx_runtime[1].call(null, cst$5, [0, pair_idx, cn]),
|
|
f = Sx_runtime[15].call(null, bindings, e),
|
|
vname = Sx_types[41].call(null, f);
|
|
else
|
|
var
|
|
j = Sx_runtime[1].call(null, cst$5, [0, pair_idx, cp]),
|
|
vname = Sx_runtime[15].call(null, bindings, j);
|
|
var
|
|
g = [0, Sx_runtime[1].call(null, cst$5, [0, pair_idx, co]), 0],
|
|
h = Sx_runtime[1].call(null, cst_inc, g),
|
|
val_expr = Sx_runtime[15].call(null, bindings, h);
|
|
names[1] = Sx_runtime[8].call(null, names[1], vname);
|
|
val_exprs[1] = Sx_runtime[8].call(null, val_exprs[1], val_expr);
|
|
var i = Sx_runtime[3].call(null, vname);
|
|
return Sx_runtime[100].call(null, local, i, 0);
|
|
},
|
|
0,
|
|
s);
|
|
}
|
|
var
|
|
g = Sx_runtime[5].call(null, val_exprs[1]),
|
|
values =
|
|
[5,
|
|
Stdlib_List[20].call
|
|
(null, function(e){return trampoline(eval_expr(e, local));}, g)],
|
|
h = Sx_runtime[1].call(null, cst_zip, [0, names[1], [0, values, 0]]),
|
|
i = Sx_runtime[5].call(null, h);
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(pair){
|
|
var
|
|
a = Sx_runtime[15].call(null, pair, ch),
|
|
b = Sx_runtime[12].call(null, pair),
|
|
c = Sx_runtime[3].call(null, b);
|
|
Sx_runtime[100].call(null, local, c, a);
|
|
return 0;
|
|
},
|
|
i);
|
|
var j = Sx_runtime[5].call(null, values);
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(val){
|
|
var a = Sx_runtime[108].call(null, val);
|
|
if(Sx_types[40].call(null, a)){
|
|
var b = Sx_runtime[5].call(null, names[1]);
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(n){
|
|
var
|
|
a = Sx_runtime[99].call(null, local, n),
|
|
b = Sx_runtime[3].call(null, n),
|
|
c = Sx_types[45].call(null, val);
|
|
Sx_runtime[100].call(null, c, b, a);
|
|
return 0;
|
|
},
|
|
b);
|
|
}
|
|
return 0;
|
|
},
|
|
j);
|
|
var
|
|
k = [0, Sx_runtime[22].call(null, body), 0],
|
|
l = [0, body, [0, ci, [0, Sx_runtime[1].call(null, cst_dec, k), 0]]],
|
|
m = Sx_runtime[1].call(null, cst_slice, l),
|
|
n = Sx_runtime[5].call(null, m);
|
|
Stdlib_List[18].call
|
|
(null, function(e){trampoline(eval_expr(e, local)); return 0;}, n);
|
|
var o = Sx_runtime[14].call(null, body);
|
|
return Sx_types[28].call(null, o, local);
|
|
}
|
|
function step_sf_letrec(args, env, kont){
|
|
var thk = sf_letrec(args, env), a = Sx_types[59].call(null, thk);
|
|
return make_cek_state(Sx_types[58].call(null, thk), a, kont);
|
|
}
|
|
var cq = [1, 1.], cr = [1, 2.];
|
|
function sf_dynamic_wind(args, env){
|
|
var
|
|
before = trampoline(eval_expr(Sx_runtime[12].call(null, args), env)),
|
|
body = trampoline(eval_expr(Sx_runtime[15].call(null, args, cq), env)),
|
|
after = trampoline(eval_expr(Sx_runtime[15].call(null, args, cr), env));
|
|
return Sx_runtime[125].call(null, before, body, after, env);
|
|
}
|
|
var
|
|
cst$8 = ">=",
|
|
cs = [0, [1, 1.], 0],
|
|
ct = [0, [1, 2.], 0],
|
|
cu = [0, [2, cst_keyword], 0],
|
|
cv = [0, [2, cst_value], 0],
|
|
cw = [1, 1.],
|
|
cx = [0, [1, 2.], 0];
|
|
function sf_scope(args, env){
|
|
var
|
|
name = trampoline(eval_expr(Sx_runtime[12].call(null, args), env)),
|
|
rest = Sx_runtime[1].call(null, cst_slice, [0, args, cs]),
|
|
b = [0, Sx_runtime[22].call(null, rest), ct],
|
|
and = Sx_runtime[1].call(null, cst$8, b);
|
|
if(Sx_types[40].call(null, and)){
|
|
var
|
|
c = Sx_runtime[12].call(null, rest),
|
|
d = [0, Sx_runtime[96].call(null, c), cu],
|
|
and$0 = Sx_runtime[1].call(null, cst, d);
|
|
if(Sx_types[40].call(null, and$0))
|
|
var
|
|
e = Sx_runtime[12].call(null, rest),
|
|
f = [0, Sx_types[42].call(null, e), cv],
|
|
a = Sx_runtime[1].call(null, cst, f);
|
|
else
|
|
var a = and$0;
|
|
}
|
|
else
|
|
var a = and;
|
|
if(Sx_types[40].call(null, a))
|
|
var
|
|
g = trampoline(eval_expr(Sx_runtime[15].call(null, rest, cw), env)),
|
|
body_exprs = Sx_runtime[1].call(null, cst_slice, [0, rest, cx]),
|
|
val = g;
|
|
else
|
|
var body_exprs = rest, val = 0;
|
|
Sx_runtime[126].call(null, name, val);
|
|
var h = Sx_runtime[5].call(null, body_exprs), result = [0, 0];
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(e){result[1] = trampoline(eval_expr(e, env)); return 0;},
|
|
h);
|
|
Sx_runtime[127].call(null, name);
|
|
return result[1];
|
|
}
|
|
var cy = [1, 1.], cz = [0, [1, 2.], 0];
|
|
function sf_provide(args, env){
|
|
var
|
|
name = trampoline(eval_expr(Sx_runtime[12].call(null, args), env)),
|
|
val = trampoline(eval_expr(Sx_runtime[15].call(null, args, cy), env)),
|
|
body_exprs = Sx_runtime[1].call(null, cst_slice, [0, args, cz]);
|
|
Sx_runtime[126].call(null, name, val);
|
|
var a = Sx_runtime[5].call(null, body_exprs), result = [0, 0];
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(e){result[1] = trampoline(eval_expr(e, env)); return 0;},
|
|
a);
|
|
Sx_runtime[127].call(null, name);
|
|
return result[1];
|
|
}
|
|
var cA = [1, 1.], cB = [1, 1.];
|
|
function expand_macro(mac, raw_args, env){
|
|
var
|
|
a = Sx_types[57].call(null, mac),
|
|
local = Sx_runtime[104].call(null, a, env),
|
|
b = Sx_types[54].call(null, mac),
|
|
c = Sx_runtime[5].call(null, b),
|
|
d =
|
|
[5,
|
|
Stdlib_List[21].call
|
|
(null,
|
|
function(i, p){var i$0 = [1, i]; return [5, [0, p, [0, i$0, 0]]];},
|
|
c)],
|
|
e = Sx_runtime[5].call(null, d);
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(pair){
|
|
var
|
|
b = [0, Sx_runtime[22].call(null, raw_args), 0],
|
|
c = [0, Sx_runtime[15].call(null, pair, cA), b],
|
|
d = Sx_runtime[1].call(null, cst$3, c);
|
|
if(Sx_types[40].call(null, d))
|
|
var
|
|
e = Sx_runtime[15].call(null, pair, cB),
|
|
a = Sx_runtime[15].call(null, raw_args, e);
|
|
else
|
|
var a = 0;
|
|
var
|
|
f = Sx_runtime[12].call(null, pair),
|
|
g = Sx_runtime[3].call(null, f);
|
|
Sx_runtime[100].call(null, local, g, a);
|
|
return 0;
|
|
},
|
|
e);
|
|
var f = Sx_types[55].call(null, mac);
|
|
if(Sx_types[40].call(null, f)){
|
|
var
|
|
g = Sx_types[54].call(null, mac),
|
|
h = [0, raw_args, [0, Sx_runtime[22].call(null, g), 0]],
|
|
i = Sx_runtime[1].call(null, cst_slice, h),
|
|
j = Sx_types[55].call(null, mac),
|
|
k = Sx_runtime[3].call(null, j);
|
|
Sx_runtime[100].call(null, local, k, i);
|
|
}
|
|
return trampoline(eval_expr(Sx_types[56].call(null, mac), local));
|
|
}
|
|
function cek_run(state){
|
|
var s = state;
|
|
for(;;){
|
|
var match = cek_terminal_p(s);
|
|
a:
|
|
{
|
|
if(typeof match !== "number" && 0 === match[0] && match[1]){var a = 1; break a;}
|
|
var a = 0;
|
|
}
|
|
if(a) return cek_value(s);
|
|
s = cek_step(s);
|
|
}
|
|
}
|
|
var cC = [0, [2, cst_eval], 0];
|
|
function cek_step(state){
|
|
var a = [0, cek_phase(state), cC], b = Sx_runtime[1].call(null, cst, a);
|
|
return Sx_types[40].call(null, b)
|
|
? step_eval(state)
|
|
: step_continue(state);
|
|
}
|
|
var
|
|
cD = [2, cst_number],
|
|
cE = [2, cst_string],
|
|
cF = [2, cst_boolean],
|
|
cG = [2, cst_nil],
|
|
cH = [2, cst_symbol],
|
|
cI = [0, [2, cst$7], 0],
|
|
cJ = [0, [2, "true"], 0],
|
|
cK = [0, 1],
|
|
cL = [0, [2, "false"], 0],
|
|
cM = [0, 0],
|
|
cN = [0, [2, cst_nil], 0],
|
|
cO = [2, "Undefined symbol: "],
|
|
cP = [2, cst_keyword],
|
|
cQ = [2, cst_dict],
|
|
cR = [5, 0],
|
|
cS = [2, cst_list],
|
|
cT = [5, 0];
|
|
function step_eval(state){
|
|
var
|
|
expr = cek_control(state),
|
|
env = cek_env(state),
|
|
kont = cek_kont(state),
|
|
match_val = Sx_runtime[96].call(null, expr);
|
|
if(caml_equal(match_val, cD)) return make_cek_value(expr, env, kont);
|
|
if(caml_equal(match_val, cE)) return make_cek_value(expr, env, kont);
|
|
if(caml_equal(match_val, cF)) return make_cek_value(expr, env, kont);
|
|
if(caml_equal(match_val, cG)) return make_cek_value(0, env, kont);
|
|
if(! caml_equal(match_val, cH)){
|
|
if(caml_equal(match_val, cP))
|
|
return make_cek_value(Sx_types[42].call(null, expr), env, kont);
|
|
if(caml_equal(match_val, cQ)){
|
|
var
|
|
ks = Sx_runtime[1].call(null, cst_keys, [0, expr, 0]),
|
|
h = Sx_runtime[32].call(null, ks);
|
|
if(Sx_types[40].call(null, h))
|
|
return make_cek_value
|
|
([6, Stdlib_Hashtbl[1].call(null, 0, 0)], env, kont);
|
|
var
|
|
first_key = Sx_runtime[12].call(null, ks),
|
|
i = Sx_runtime[13].call(null, ks),
|
|
j = Sx_runtime[5].call(null, i),
|
|
remaining_entries = [0, cR];
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(k){
|
|
var a = [5, [0, k, [0, Sx_runtime[23].call(null, expr, k), 0]]];
|
|
remaining_entries[1] =
|
|
Sx_runtime[8].call(null, remaining_entries[1], a);
|
|
return 0;
|
|
},
|
|
j);
|
|
var
|
|
k =
|
|
kont_push
|
|
(make_dict_frame
|
|
(remaining_entries[1], [5, [0, [5, [0, first_key, 0]], 0]], env),
|
|
kont);
|
|
return make_cek_state
|
|
(Sx_runtime[23].call(null, expr, first_key), env, k);
|
|
}
|
|
if(! caml_equal(match_val, cS)) return make_cek_value(expr, env, kont);
|
|
var l = Sx_runtime[32].call(null, expr);
|
|
return Sx_types[40].call(null, l)
|
|
? make_cek_value(cT, env, kont)
|
|
: step_eval_list(expr, env, kont);
|
|
}
|
|
var
|
|
name = Sx_types[41].call(null, expr),
|
|
a = Sx_runtime[98].call(null, env, name);
|
|
if(Sx_types[40].call(null, a))
|
|
var val = Sx_runtime[99].call(null, env, name);
|
|
else{
|
|
var b = Sx_runtime[115].call(null, name);
|
|
if(Sx_types[40].call(null, b))
|
|
var val = Sx_runtime[116].call(null, name);
|
|
else{
|
|
var c = Sx_runtime[1].call(null, cst, [0, name, cJ]);
|
|
if(Sx_types[40].call(null, c))
|
|
var val = cK;
|
|
else{
|
|
var d = Sx_runtime[1].call(null, cst, [0, name, cL]);
|
|
if(Sx_types[40].call(null, d))
|
|
var val = cM;
|
|
else{
|
|
var e = Sx_runtime[1].call(null, cst, [0, name, cN]);
|
|
if(! Sx_types[40].call(null, e)){
|
|
var
|
|
f = [2, Sx_runtime[4].call(null, [0, cO, [0, name, 0]])],
|
|
g = Sx_runtime[2].call(null, f);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], g], 1);
|
|
}
|
|
var val = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
var and = Sx_runtime[106].call(null, val);
|
|
if(Sx_types[40].call(null, and))
|
|
Sx_runtime[1].call(null, "starts-with?", [0, name, cI]);
|
|
return make_cek_value(val, env, kont);
|
|
}
|
|
var
|
|
cst_emitted = "emitted",
|
|
cst_every$0 = "every?",
|
|
cst_map_indexed = "map-indexed",
|
|
cst_quote = "quote",
|
|
render_check = 0,
|
|
render_fn = 0,
|
|
cU = [0, [2, cst_symbol], 0],
|
|
cV = [5, 0],
|
|
cW = [5, 0],
|
|
cX = [0, [2, cst_symbol], 0],
|
|
cY = [0, [2, cst_if], 0],
|
|
cZ = [0, [2, cst_when], 0],
|
|
c0 = [0, [2, cst_cond], 0],
|
|
c1 = [0, [2, cst_case], 0],
|
|
c2 = [0, [2, cst_and], 0],
|
|
c3 = [0, [2, cst_or], 0],
|
|
c4 = [0, [2, cst_let], 0],
|
|
c5 = [0, [2, "let*"], 0],
|
|
c6 = [0, [2, cst_lambda], 0],
|
|
c7 = [0, [2, "fn"], 0],
|
|
c8 = [0, [2, cst_define], 0],
|
|
c9 = [0, [2, "defcomp"], 0],
|
|
c_ = [0, [2, "defisland"], 0],
|
|
c$ = [0, [2, "defmacro"], 0],
|
|
da = [0, [2, cst_begin], 0],
|
|
db = [0, [2, "do"], 0],
|
|
dc = [0, [2, cst_quote], 0],
|
|
dd = [0, [2, "quasiquote"], 0],
|
|
de = [0, [2, "->"], 0],
|
|
df = [0, [2, "set!"], 0],
|
|
dg = [0, [2, "letrec"], 0],
|
|
dh = [0, [2, cst_reset], 0],
|
|
di = [0, [2, "shift"], 0],
|
|
dj = [0, [2, cst_deref], 0],
|
|
dk = [0, [2, cst_scope], 0],
|
|
dl = [0, [2, cst_provide], 0],
|
|
dm = [0, [2, "context"], 0],
|
|
dn = [0, [2, "emit!"], 0],
|
|
dp = [0, [2, cst_emitted], 0],
|
|
dq = [0, [2, cst_dynamic_wind], 0],
|
|
dr = [0, [2, cst_map], 0],
|
|
ds = [0, [2, cst_map_indexed], 0],
|
|
dt = [0, [2, cst_filter], 0],
|
|
du = [0, [2, cst_reduce], 0],
|
|
dv = [0, [2, cst_some], 0],
|
|
dw = [0, [2, cst_every$0], 0],
|
|
dx = [0, [2, cst_for_each], 0],
|
|
dy = [0, [2, cst_lambda], 0],
|
|
dz = [0, [2, cst_list], 0];
|
|
function step_eval_list(expr, env, kont){
|
|
var
|
|
head = Sx_runtime[12].call(null, expr),
|
|
args = Sx_runtime[13].call(null, expr),
|
|
b = [0, Sx_runtime[96].call(null, head), cU],
|
|
or = Sx_runtime[1].call(null, cst, b);
|
|
if(Sx_types[40].call(null, or))
|
|
var or$0 = or;
|
|
else{
|
|
var
|
|
X = [0, Sx_runtime[96].call(null, head), dy],
|
|
or$1 = Sx_runtime[1].call(null, cst, X);
|
|
if(Sx_types[40].call(null, or$1))
|
|
var or$0 = or$1;
|
|
else
|
|
var
|
|
Y = [0, Sx_runtime[96].call(null, head), dz],
|
|
or$0 = Sx_runtime[1].call(null, cst, Y);
|
|
}
|
|
var c = [0, 1 - Sx_types[40].call(null, or$0)];
|
|
if(Sx_types[40].call(null, c)){
|
|
var d = Sx_runtime[32].call(null, expr);
|
|
if(Sx_types[40].call(null, d)) return make_cek_value(cV, env, kont);
|
|
var
|
|
e =
|
|
kont_push
|
|
(make_map_frame(0, Sx_runtime[13].call(null, expr), cW, env), kont);
|
|
return make_cek_state(Sx_runtime[12].call(null, expr), env, e);
|
|
}
|
|
var
|
|
f = [0, Sx_runtime[96].call(null, head), cX],
|
|
g = Sx_runtime[1].call(null, cst, f);
|
|
if(! Sx_types[40].call(null, g))
|
|
return step_eval_call(head, args, env, kont);
|
|
var
|
|
name = Sx_types[41].call(null, head),
|
|
h = Sx_runtime[1].call(null, cst, [0, name, cY]);
|
|
if(Sx_types[40].call(null, h)) return step_sf_if(args, env, kont);
|
|
var i = Sx_runtime[1].call(null, cst, [0, name, cZ]);
|
|
if(Sx_types[40].call(null, i)) return step_sf_when(args, env, kont);
|
|
var j = Sx_runtime[1].call(null, cst, [0, name, c0]);
|
|
if(Sx_types[40].call(null, j)) return step_sf_cond(args, env, kont);
|
|
var k = Sx_runtime[1].call(null, cst, [0, name, c1]);
|
|
if(Sx_types[40].call(null, k)) return step_sf_case(args, env, kont);
|
|
var l = Sx_runtime[1].call(null, cst, [0, name, c2]);
|
|
if(Sx_types[40].call(null, l)) return step_sf_and(args, env, kont);
|
|
var m = Sx_runtime[1].call(null, cst, [0, name, c3]);
|
|
if(Sx_types[40].call(null, m)) return step_sf_or(args, env, kont);
|
|
var n = Sx_runtime[1].call(null, cst, [0, name, c4]);
|
|
if(Sx_types[40].call(null, n)) return step_sf_let(args, env, kont);
|
|
var o = Sx_runtime[1].call(null, cst, [0, name, c5]);
|
|
if(Sx_types[40].call(null, o)) return step_sf_let(args, env, kont);
|
|
var p = Sx_runtime[1].call(null, cst, [0, name, c6]);
|
|
if(Sx_types[40].call(null, p)) return step_sf_lambda(args, env, kont);
|
|
var q = Sx_runtime[1].call(null, cst, [0, name, c7]);
|
|
if(Sx_types[40].call(null, q)) return step_sf_lambda(args, env, kont);
|
|
var r = Sx_runtime[1].call(null, cst, [0, name, c8]);
|
|
if(Sx_types[40].call(null, r)) return step_sf_define(args, env, kont);
|
|
var s = Sx_runtime[1].call(null, cst, [0, name, c9]);
|
|
if(Sx_types[40].call(null, s))
|
|
return make_cek_value(sf_defcomp(args, env), env, kont);
|
|
var t = Sx_runtime[1].call(null, cst, [0, name, c_]);
|
|
if(Sx_types[40].call(null, t))
|
|
return make_cek_value(sf_defisland(args, env), env, kont);
|
|
var u = Sx_runtime[1].call(null, cst, [0, name, c$]);
|
|
if(Sx_types[40].call(null, u))
|
|
return make_cek_value(sf_defmacro(args, env), env, kont);
|
|
var v = Sx_runtime[1].call(null, cst, [0, name, da]);
|
|
if(Sx_types[40].call(null, v)) return step_sf_begin(args, env, kont);
|
|
var w = Sx_runtime[1].call(null, cst, [0, name, db]);
|
|
if(Sx_types[40].call(null, w)) return step_sf_begin(args, env, kont);
|
|
var x = Sx_runtime[1].call(null, cst, [0, name, dc]);
|
|
if(Sx_types[40].call(null, x)){
|
|
var
|
|
y = Sx_runtime[32].call(null, args),
|
|
z = Sx_types[40].call(null, y) ? 0 : Sx_runtime[12].call(null, args);
|
|
return make_cek_value(z, env, kont);
|
|
}
|
|
var A = Sx_runtime[1].call(null, cst, [0, name, dd]);
|
|
if(Sx_types[40].call(null, A))
|
|
return make_cek_value
|
|
(qq_expand(Sx_runtime[12].call(null, args), env), env, kont);
|
|
var B = Sx_runtime[1].call(null, cst, [0, name, de]);
|
|
if(Sx_types[40].call(null, B))
|
|
return step_sf_thread_first(args, env, kont);
|
|
var C = Sx_runtime[1].call(null, cst, [0, name, df]);
|
|
if(Sx_types[40].call(null, C)) return step_sf_set_b(args, env, kont);
|
|
var D = Sx_runtime[1].call(null, cst, [0, name, dg]);
|
|
if(Sx_types[40].call(null, D)) return step_sf_letrec(args, env, kont);
|
|
var E = Sx_runtime[1].call(null, cst, [0, name, dh]);
|
|
if(Sx_types[40].call(null, E)) return step_sf_reset(args, env, kont);
|
|
var F = Sx_runtime[1].call(null, cst, [0, name, di]);
|
|
if(Sx_types[40].call(null, F)) return step_sf_shift(args, env, kont);
|
|
var G = Sx_runtime[1].call(null, cst, [0, name, dj]);
|
|
if(Sx_types[40].call(null, G)) return step_sf_deref(args, env, kont);
|
|
var H = Sx_runtime[1].call(null, cst, [0, name, dk]);
|
|
if(Sx_types[40].call(null, H)) return step_sf_scope(args, env, kont);
|
|
var I = Sx_runtime[1].call(null, cst, [0, name, dl]);
|
|
if(Sx_types[40].call(null, I)) return step_sf_provide(args, env, kont);
|
|
var J = Sx_runtime[1].call(null, cst, [0, name, dm]);
|
|
if(Sx_types[40].call(null, J)) return step_sf_context(args, env, kont);
|
|
var K = Sx_runtime[1].call(null, cst, [0, name, dn]);
|
|
if(Sx_types[40].call(null, K)) return step_sf_emit(args, env, kont);
|
|
var L = Sx_runtime[1].call(null, cst, [0, name, dp]);
|
|
if(Sx_types[40].call(null, L)) return step_sf_emitted(args, env, kont);
|
|
var M = Sx_runtime[1].call(null, cst, [0, name, dq]);
|
|
if(Sx_types[40].call(null, M))
|
|
return make_cek_value(sf_dynamic_wind(args, env), env, kont);
|
|
var N = Sx_runtime[1].call(null, cst, [0, name, dr]);
|
|
if(Sx_types[40].call(null, N)) return step_ho_map(args, env, kont);
|
|
var O = Sx_runtime[1].call(null, cst, [0, name, ds]);
|
|
if(Sx_types[40].call(null, O))
|
|
return step_ho_map_indexed(args, env, kont);
|
|
var P = Sx_runtime[1].call(null, cst, [0, name, dt]);
|
|
if(Sx_types[40].call(null, P)) return step_ho_filter(args, env, kont);
|
|
var Q = Sx_runtime[1].call(null, cst, [0, name, du]);
|
|
if(Sx_types[40].call(null, Q)) return step_ho_reduce(args, env, kont);
|
|
var R = Sx_runtime[1].call(null, cst, [0, name, dv]);
|
|
if(Sx_types[40].call(null, R)) return step_ho_some(args, env, kont);
|
|
var S = Sx_runtime[1].call(null, cst, [0, name, dw]);
|
|
if(Sx_types[40].call(null, S)) return step_ho_every(args, env, kont);
|
|
var T = Sx_runtime[1].call(null, cst, [0, name, dx]);
|
|
if(Sx_types[40].call(null, T)) return step_ho_for_each(args, env, kont);
|
|
var
|
|
U =
|
|
Sx_runtime[1].call
|
|
(null, "has-key?", [0, custom_special_forms, [0, name, 0]]);
|
|
if(Sx_types[40].call(null, U))
|
|
return make_cek_value
|
|
(cek_call
|
|
(Sx_runtime[23].call(null, custom_special_forms, name),
|
|
[5, [0, args, [0, env, 0]]]),
|
|
env,
|
|
kont);
|
|
var and = Sx_runtime[98].call(null, env, name);
|
|
if(Sx_types[40].call(null, and))
|
|
var
|
|
V = Sx_runtime[99].call(null, env, name),
|
|
a = Sx_runtime[111].call(null, V);
|
|
else
|
|
var a = and;
|
|
if(Sx_types[40].call(null, a)){
|
|
var mac = Sx_runtime[99].call(null, env, name);
|
|
return make_cek_state(expand_macro(mac, args, env), env, kont);
|
|
}
|
|
var
|
|
W =
|
|
Sx_types[40].call(null, render_check)
|
|
? cek_call(render_check, [5, [0, expr, [0, env, 0]]])
|
|
: render_check;
|
|
return Sx_types[40].call(null, W)
|
|
? make_cek_value
|
|
(cek_call(render_fn, [5, [0, expr, [0, env, 0]]]), env, kont)
|
|
: step_eval_call(head, args, env, kont);
|
|
}
|
|
var dA = [0, [1, 2.], 0], dB = [1, 2.], dC = [1, 1.];
|
|
function step_sf_if(args, env, kont){
|
|
var
|
|
a = [0, Sx_runtime[22].call(null, args), dA],
|
|
b = Sx_runtime[1].call(null, cst$4, a),
|
|
c = Sx_types[40].call(null, b) ? Sx_runtime[15].call(null, args, dB) : 0,
|
|
d =
|
|
kont_push
|
|
(make_if_frame(Sx_runtime[15].call(null, args, dC), c, env), kont);
|
|
return make_cek_state(Sx_runtime[12].call(null, args), env, d);
|
|
}
|
|
function step_sf_when(args, env, kont){
|
|
var
|
|
a =
|
|
kont_push(make_when_frame(Sx_runtime[13].call(null, args), env), kont);
|
|
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
|
|
}
|
|
var dD = [0, [1, 1.], 0];
|
|
function step_sf_begin(args, env, kont){
|
|
var a = Sx_runtime[32].call(null, args);
|
|
if(Sx_types[40].call(null, a)) return make_cek_value(0, env, kont);
|
|
var
|
|
b = [0, Sx_runtime[22].call(null, args), dD],
|
|
c = Sx_runtime[1].call(null, cst, b);
|
|
if(Sx_types[40].call(null, c))
|
|
return make_cek_state(Sx_runtime[12].call(null, args), env, kont);
|
|
var
|
|
d =
|
|
kont_push(make_begin_frame(Sx_runtime[13].call(null, args), env), kont);
|
|
return make_cek_state(Sx_runtime[12].call(null, args), env, d);
|
|
}
|
|
var
|
|
dE = [0, [2, cst_symbol], 0],
|
|
dF = [0, [2, cst_list], 0],
|
|
dG = [0, [1, 2.], 0],
|
|
dH = [0, [2, cst_list], 0],
|
|
dI = [0, [1, 2.], 0],
|
|
dJ = [0, [2, cst_symbol], 0],
|
|
dK = [1, 1.],
|
|
dL = [5, 0],
|
|
dM = [0, [1, 2.], 0],
|
|
dN = [1, 1.],
|
|
dO = [0, [1, 2.], 0],
|
|
dP = [0, [1, 2.], 0],
|
|
dQ = [1, 1.];
|
|
function step_sf_let(args, env, kont){
|
|
var
|
|
c = Sx_runtime[12].call(null, args),
|
|
d = [0, Sx_runtime[96].call(null, c), dE],
|
|
e = Sx_runtime[1].call(null, cst, d);
|
|
if(Sx_types[40].call(null, e))
|
|
return make_cek_value(trampoline(sf_named_let(args, env)), env, kont);
|
|
var
|
|
bindings = Sx_runtime[12].call(null, args),
|
|
body = Sx_runtime[13].call(null, args),
|
|
local = Sx_runtime[103].call(null, env),
|
|
f = Sx_runtime[32].call(null, bindings);
|
|
if(Sx_types[40].call(null, f)) return step_sf_begin(body, local, kont);
|
|
var
|
|
g = Sx_runtime[12].call(null, bindings),
|
|
h = [0, Sx_runtime[96].call(null, g), dF],
|
|
and = Sx_runtime[1].call(null, cst, h);
|
|
if(Sx_types[40].call(null, and))
|
|
var
|
|
i = Sx_runtime[12].call(null, bindings),
|
|
j = [0, Sx_runtime[22].call(null, i), dG],
|
|
a = Sx_runtime[1].call(null, cst, j);
|
|
else
|
|
var a = and;
|
|
if(Sx_types[40].call(null, a))
|
|
var first_binding = Sx_runtime[12].call(null, bindings);
|
|
else
|
|
var
|
|
x = [0, Sx_runtime[15].call(null, bindings, dQ), 0],
|
|
first_binding = [5, [0, Sx_runtime[12].call(null, bindings), x]];
|
|
var
|
|
k = Sx_runtime[12].call(null, bindings),
|
|
l = [0, Sx_runtime[96].call(null, k), dH],
|
|
and$0 = Sx_runtime[1].call(null, cst, l);
|
|
if(Sx_types[40].call(null, and$0))
|
|
var
|
|
m = Sx_runtime[12].call(null, bindings),
|
|
n = [0, Sx_runtime[22].call(null, m), dI],
|
|
b = Sx_runtime[1].call(null, cst, n);
|
|
else
|
|
var b = and$0;
|
|
if(Sx_types[40].call(null, b))
|
|
var rest_bindings = Sx_runtime[13].call(null, bindings);
|
|
else{
|
|
var
|
|
t = [0, Sx_runtime[22].call(null, bindings), dM],
|
|
u = [0, dN, [0, Sx_runtime[1].call(null, cst$6, t), 0]],
|
|
v = Sx_runtime[1].call(null, cst_range, u),
|
|
w = Sx_runtime[5].call(null, v),
|
|
pairs = [0, dL];
|
|
Stdlib_List[26].call
|
|
(null,
|
|
function(acc, i){
|
|
var
|
|
a = [0, Sx_runtime[1].call(null, cst$5, [0, i, dO]), 0],
|
|
b = Sx_runtime[1].call(null, cst_inc, a),
|
|
c = [0, Sx_runtime[15].call(null, bindings, b), 0],
|
|
d = Sx_runtime[1].call(null, cst$5, [0, i, dP]),
|
|
e = [5, [0, Sx_runtime[15].call(null, bindings, d), c]];
|
|
pairs[1] = Sx_runtime[8].call(null, pairs[1], e);
|
|
return 0;
|
|
},
|
|
0,
|
|
w);
|
|
var rest_bindings = pairs[1];
|
|
}
|
|
var
|
|
o = Sx_runtime[12].call(null, first_binding),
|
|
p = [0, Sx_runtime[96].call(null, o), dJ],
|
|
q = Sx_runtime[1].call(null, cst, p);
|
|
if(Sx_types[40].call(null, q))
|
|
var
|
|
r = Sx_runtime[12].call(null, first_binding),
|
|
vname = Sx_types[41].call(null, r);
|
|
else
|
|
var vname = Sx_runtime[12].call(null, first_binding);
|
|
var
|
|
s = kont_push(make_let_frame(vname, rest_bindings, body, local), kont);
|
|
return make_cek_state
|
|
(Sx_runtime[15].call(null, first_binding, dK), local, s);
|
|
}
|
|
var
|
|
dR = [0, [1, 4.], 0],
|
|
dS = [0, [2, cst_keyword], 0],
|
|
dT = [1, 1.],
|
|
dU = [0, [2, cst_effects], 0],
|
|
dV = [1, 1.],
|
|
dW = [0, [1, 4.], 0],
|
|
dX = [0, [2, cst_keyword], 0],
|
|
dY = [1, 1.],
|
|
dZ = [0, [2, cst_effects], 0],
|
|
d0 = [1, 1.],
|
|
d1 = [1, 3.],
|
|
d2 = [0, [1, 4.], 0],
|
|
d3 = [0, [2, cst_keyword], 0],
|
|
d4 = [1, 1.],
|
|
d5 = [0, [2, cst_effects], 0],
|
|
d6 = [1, 1.],
|
|
d7 = [1, 2.],
|
|
d8 = [1, 1.];
|
|
function step_sf_define(args, env, kont){
|
|
var
|
|
name_sym = Sx_runtime[12].call(null, args),
|
|
c = [0, Sx_runtime[22].call(null, args), dR],
|
|
and = Sx_runtime[1].call(null, cst$8, c);
|
|
if(Sx_types[40].call(null, and)){
|
|
var
|
|
d = Sx_runtime[15].call(null, args, dT),
|
|
e = [0, Sx_runtime[96].call(null, d), dS],
|
|
and$0 = Sx_runtime[1].call(null, cst, e);
|
|
if(Sx_types[40].call(null, and$0))
|
|
var
|
|
f = Sx_runtime[15].call(null, args, dV),
|
|
g = [0, Sx_types[42].call(null, f), dU],
|
|
has_effects = Sx_runtime[1].call(null, cst, g);
|
|
else
|
|
var has_effects = and$0;
|
|
}
|
|
else
|
|
var has_effects = and;
|
|
var
|
|
h = [0, Sx_runtime[22].call(null, args), dW],
|
|
and$1 = Sx_runtime[1].call(null, cst$8, h);
|
|
if(Sx_types[40].call(null, and$1)){
|
|
var
|
|
i = Sx_runtime[15].call(null, args, dY),
|
|
j = [0, Sx_runtime[96].call(null, i), dX],
|
|
and$2 = Sx_runtime[1].call(null, cst, j);
|
|
if(Sx_types[40].call(null, and$2))
|
|
var
|
|
k = Sx_runtime[15].call(null, args, d0),
|
|
l = [0, Sx_types[42].call(null, k), dZ],
|
|
a = Sx_runtime[1].call(null, cst, l);
|
|
else
|
|
var a = and$2;
|
|
}
|
|
else
|
|
var a = and$1;
|
|
var
|
|
val_idx = Sx_types[40].call(null, a) ? d1 : d8,
|
|
m = [0, Sx_runtime[22].call(null, args), d2],
|
|
and$3 = Sx_runtime[1].call(null, cst$8, m);
|
|
if(Sx_types[40].call(null, and$3)){
|
|
var
|
|
n = Sx_runtime[15].call(null, args, d4),
|
|
o = [0, Sx_runtime[96].call(null, n), d3],
|
|
and$4 = Sx_runtime[1].call(null, cst, o);
|
|
if(Sx_types[40].call(null, and$4))
|
|
var
|
|
p = Sx_runtime[15].call(null, args, d6),
|
|
q = [0, Sx_types[42].call(null, p), d5],
|
|
b = Sx_runtime[1].call(null, cst, q);
|
|
else
|
|
var b = and$4;
|
|
}
|
|
else
|
|
var b = and$3;
|
|
var
|
|
effect_list =
|
|
Sx_types[40].call(null, b) ? Sx_runtime[15].call(null, args, d7) : 0,
|
|
r =
|
|
kont_push
|
|
(make_define_frame
|
|
(Sx_types[41].call(null, name_sym), env, has_effects, effect_list),
|
|
kont);
|
|
return make_cek_state(Sx_runtime[15].call(null, args, val_idx), env, r);
|
|
}
|
|
var d9 = [1, 1.];
|
|
function step_sf_set_b(args, env, kont){
|
|
var
|
|
a = Sx_runtime[12].call(null, args),
|
|
b = kont_push(make_set_frame(Sx_types[41].call(null, a), env), kont);
|
|
return make_cek_state(Sx_runtime[15].call(null, args, d9), env, b);
|
|
}
|
|
var d_ = [0, 1];
|
|
function step_sf_and(args, env, kont){
|
|
var a = Sx_runtime[32].call(null, args);
|
|
if(Sx_types[40].call(null, a)) return make_cek_value(d_, env, kont);
|
|
var
|
|
b = kont_push(make_and_frame(Sx_runtime[13].call(null, args), env), kont);
|
|
return make_cek_state(Sx_runtime[12].call(null, args), env, b);
|
|
}
|
|
var d$ = [0, 0];
|
|
function step_sf_or(args, env, kont){
|
|
var a = Sx_runtime[32].call(null, args);
|
|
if(Sx_types[40].call(null, a)) return make_cek_value(d$, env, kont);
|
|
var
|
|
b = kont_push(make_or_frame(Sx_runtime[13].call(null, args), env), kont);
|
|
return make_cek_state(Sx_runtime[12].call(null, args), env, b);
|
|
}
|
|
var
|
|
ea = [1, 1.],
|
|
eb = [0, 1],
|
|
ec = [0, [1, 2.], 0],
|
|
ed = [1, 1.],
|
|
ee = [0, 0];
|
|
function step_sf_cond(args, env, kont){
|
|
var scheme_p = cond_scheme_p(args);
|
|
if(Sx_types[40].call(null, scheme_p)){
|
|
var a = Sx_runtime[32].call(null, args);
|
|
if(Sx_types[40].call(null, a)) return make_cek_value(0, env, kont);
|
|
var
|
|
clause = Sx_runtime[12].call(null, args),
|
|
test = Sx_runtime[12].call(null, clause),
|
|
b = is_else_clause(test);
|
|
return Sx_types[40].call(null, b)
|
|
? make_cek_state
|
|
(Sx_runtime[15].call(null, clause, ea), env, kont)
|
|
: make_cek_state
|
|
(test, env, kont_push(make_cond_frame(args, env, eb), kont));
|
|
}
|
|
var
|
|
c = [0, Sx_runtime[22].call(null, args), ec],
|
|
d = Sx_runtime[1].call(null, cst$3, c);
|
|
if(Sx_types[40].call(null, d)) return make_cek_value(0, env, kont);
|
|
var test$0 = Sx_runtime[12].call(null, args), e = is_else_clause(test$0);
|
|
return Sx_types[40].call(null, e)
|
|
? make_cek_state(Sx_runtime[15].call(null, args, ed), env, kont)
|
|
: make_cek_state
|
|
(test$0, env, kont_push(make_cond_frame(args, env, ee), kont));
|
|
}
|
|
function step_sf_case(args, env, kont){
|
|
var
|
|
a =
|
|
kont_push
|
|
(make_case_frame(0, Sx_runtime[13].call(null, args), env), kont);
|
|
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
|
|
}
|
|
function step_sf_thread_first(args, env, kont){
|
|
var
|
|
a =
|
|
kont_push
|
|
(make_thread_frame(Sx_runtime[13].call(null, args), env), kont);
|
|
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
|
|
}
|
|
function step_sf_lambda(args, env, kont){
|
|
return make_cek_value(sf_lambda(args, env), env, kont);
|
|
}
|
|
var
|
|
ef = [0, [1, 1.], 0],
|
|
eg = [0, [1, 2.], 0],
|
|
eh = [0, [2, cst_keyword], 0],
|
|
ei = [0, [2, cst_value], 0],
|
|
ej = [1, 1.],
|
|
ek = [0, [1, 2.], 0];
|
|
function step_sf_scope(args, env, kont){
|
|
var
|
|
name = trampoline(eval_expr(Sx_runtime[12].call(null, args), env)),
|
|
rest_args = Sx_runtime[1].call(null, cst_slice, [0, args, ef]),
|
|
b = [0, Sx_runtime[22].call(null, rest_args), eg],
|
|
and = Sx_runtime[1].call(null, cst$8, b);
|
|
if(Sx_types[40].call(null, and)){
|
|
var
|
|
c = Sx_runtime[12].call(null, rest_args),
|
|
d = [0, Sx_runtime[96].call(null, c), eh],
|
|
and$0 = Sx_runtime[1].call(null, cst, d);
|
|
if(Sx_types[40].call(null, and$0))
|
|
var
|
|
e = Sx_runtime[12].call(null, rest_args),
|
|
f = [0, Sx_types[42].call(null, e), ei],
|
|
a = Sx_runtime[1].call(null, cst, f);
|
|
else
|
|
var a = and$0;
|
|
}
|
|
else
|
|
var a = and;
|
|
if(Sx_types[40].call(null, a))
|
|
var
|
|
g = trampoline(eval_expr(Sx_runtime[15].call(null, rest_args, ej), env)),
|
|
body = Sx_runtime[1].call(null, cst_slice, [0, rest_args, ek]),
|
|
val = g;
|
|
else
|
|
var body = rest_args, val = 0;
|
|
var h = Sx_runtime[32].call(null, body);
|
|
if(Sx_types[40].call(null, h)) return make_cek_value(0, env, kont);
|
|
var
|
|
i =
|
|
kont_push
|
|
(make_scope_acc_frame(name, val, Sx_runtime[13].call(null, body), env),
|
|
kont);
|
|
return make_cek_state(Sx_runtime[12].call(null, body), env, i);
|
|
}
|
|
var el = [1, 1.], em = [0, [1, 2.], 0];
|
|
function step_sf_provide(args, env, kont){
|
|
var
|
|
name = trampoline(eval_expr(Sx_runtime[12].call(null, args), env)),
|
|
val = trampoline(eval_expr(Sx_runtime[15].call(null, args, el), env)),
|
|
body = Sx_runtime[1].call(null, cst_slice, [0, args, em]),
|
|
a = Sx_runtime[32].call(null, body);
|
|
if(Sx_types[40].call(null, a)) return make_cek_value(0, env, kont);
|
|
var
|
|
b =
|
|
kont_push
|
|
(make_provide_frame(name, val, Sx_runtime[13].call(null, body), env),
|
|
kont);
|
|
return make_cek_state(Sx_runtime[12].call(null, body), env, b);
|
|
}
|
|
var en = [0, [1, 2.], 0], eo = [1, 1.], ep = [2, cst_value];
|
|
function step_sf_context(args, env, kont){
|
|
var
|
|
name = trampoline(eval_expr(Sx_runtime[12].call(null, args), env)),
|
|
a = [0, Sx_runtime[22].call(null, args), en],
|
|
b = Sx_runtime[1].call(null, cst$8, a),
|
|
default_val =
|
|
Sx_types[40].call(null, b)
|
|
? trampoline(eval_expr(Sx_runtime[15].call(null, args, eo), env))
|
|
: 0,
|
|
frame = kont_find_provide(kont, name),
|
|
c = Sx_runtime[106].call(null, frame),
|
|
default_val$0 =
|
|
Sx_types[40].call(null, c)
|
|
? default_val
|
|
: Sx_runtime[23].call(null, frame, ep);
|
|
return make_cek_value(default_val$0, env, kont);
|
|
}
|
|
var eq = [1, 1.], er = [2, cst_emitted], es = [2, cst_emitted];
|
|
function step_sf_emit(args, env, kont){
|
|
var
|
|
name = trampoline(eval_expr(Sx_runtime[12].call(null, args), env)),
|
|
val = trampoline(eval_expr(Sx_runtime[15].call(null, args, eq), env)),
|
|
frame = kont_find_scope_acc(kont, name);
|
|
if(Sx_types[40].call(null, frame)){
|
|
var
|
|
a = [0, Sx_runtime[23].call(null, frame, er), [0, [5, [0, val, 0]], 0]],
|
|
b = Sx_runtime[1].call(null, cst_append, a);
|
|
Sx_runtime[9].call(null, frame, es, b);
|
|
}
|
|
return make_cek_value(0, env, kont);
|
|
}
|
|
var et = [5, 0], eu = [2, cst_emitted];
|
|
function step_sf_emitted(args, env, kont){
|
|
var
|
|
name = trampoline(eval_expr(Sx_runtime[12].call(null, args), env)),
|
|
frame = kont_find_scope_acc(kont, name),
|
|
a = Sx_runtime[106].call(null, frame),
|
|
b =
|
|
Sx_types[40].call(null, a) ? et : Sx_runtime[23].call(null, frame, eu);
|
|
return make_cek_value(b, env, kont);
|
|
}
|
|
function step_sf_reset(args, env, kont){
|
|
var a = kont_push(make_reset_frame(env), kont);
|
|
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
|
|
}
|
|
var ev = [1, 1.], ew = [1, 1.];
|
|
function step_sf_shift(args, env, kont){
|
|
var
|
|
a = Sx_runtime[12].call(null, args),
|
|
k_name = Sx_types[41].call(null, a),
|
|
body = Sx_runtime[15].call(null, args, ev),
|
|
captured_result = kont_capture_to_reset(kont),
|
|
captured = Sx_runtime[12].call(null, captured_result),
|
|
rest_kont = Sx_runtime[15].call(null, captured_result, ew),
|
|
k = Sx_runtime[123].call(null, captured, rest_kont),
|
|
shift_env = Sx_runtime[103].call(null, env),
|
|
b = Sx_runtime[3].call(null, k_name);
|
|
Sx_runtime[100].call(null, shift_env, b, k);
|
|
return make_cek_state(body, shift_env, rest_kont);
|
|
}
|
|
function step_sf_deref(args, env, kont){
|
|
var a = kont_push(make_deref_frame(env), kont);
|
|
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
|
|
}
|
|
var ex = [5, 0], ey = [5, 0];
|
|
function cek_call(f, args){
|
|
var
|
|
b = Sx_runtime[106].call(null, args),
|
|
a = Sx_types[40].call(null, b) ? ex : args,
|
|
c = Sx_runtime[106].call(null, f);
|
|
if(Sx_types[40].call(null, c)) return 0;
|
|
var
|
|
or = Sx_runtime[108].call(null, f),
|
|
or$0 = Sx_types[40].call(null, or) ? or : Sx_runtime[113].call(null, f);
|
|
return Sx_types[40].call(null, or$0)
|
|
? cek_run
|
|
(continue_with_call(f, a, Sx_runtime[102].call(null, 0), a, ey))
|
|
: 0;
|
|
}
|
|
var
|
|
cst_update_fn = "update-fn",
|
|
ez = [1, 1.],
|
|
eA = [1, 2.],
|
|
eB = [2, cst_update_fn],
|
|
eC = [0, 0];
|
|
function reactive_shift_deref(sig, env, kont){
|
|
var
|
|
scan_result = kont_capture_to_reactive_reset(kont),
|
|
captured_frames = Sx_runtime[12].call(null, scan_result),
|
|
reset_frame = Sx_runtime[15].call(null, scan_result, ez),
|
|
remaining_kont = Sx_runtime[15].call(null, scan_result, eA),
|
|
update_fn = Sx_runtime[23].call(null, reset_frame, eB),
|
|
cst = "\xce\xbb",
|
|
subscriber =
|
|
[13,
|
|
cst,
|
|
function(args){
|
|
var a = Sx_runtime[5].call(null, 0);
|
|
Stdlib_List[18].call(null, function(d){cek_call(d, 0); return 0;}, a);
|
|
var
|
|
new_reset = make_reactive_reset_frame(env, update_fn, eC),
|
|
new_kont =
|
|
Sx_runtime[1].call
|
|
(null,
|
|
cst_concat,
|
|
[0,
|
|
captured_frames,
|
|
[0, [5, [0, new_reset, 0]], [0, remaining_kont, 0]]]);
|
|
return Sx_runtime[147].call
|
|
(null,
|
|
[13,
|
|
cst,
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var d = args[1];
|
|
Sx_runtime[8].call(null, 0, d);
|
|
return 0;
|
|
}
|
|
return 0;
|
|
}],
|
|
[13,
|
|
cst,
|
|
function(args){
|
|
return cek_run
|
|
(make_cek_value
|
|
(Sx_runtime[137].call(null, sig), env, new_kont));
|
|
}]);
|
|
}];
|
|
Sx_runtime[140].call(null, sig, subscriber);
|
|
var
|
|
initial_kont =
|
|
Sx_runtime[1].call
|
|
(null,
|
|
cst_concat,
|
|
[0,
|
|
captured_frames,
|
|
[0, [5, [0, reset_frame, 0]], [0, remaining_kont, 0]]]);
|
|
return make_cek_value(Sx_runtime[137].call(null, sig), env, initial_kont);
|
|
}
|
|
var eD = [0, [2, cst_symbol], 0], eE = [5, 0];
|
|
function step_eval_call(head, args, env, kont){
|
|
var
|
|
a = [0, Sx_runtime[96].call(null, head), eD],
|
|
b = Sx_runtime[1].call(null, cst, a),
|
|
hname = Sx_types[40].call(null, b) ? Sx_types[41].call(null, head) : 0;
|
|
return make_cek_state
|
|
(head,
|
|
env,
|
|
kont_push(make_arg_frame(0, eE, args, env, args, hname), kont));
|
|
}
|
|
var
|
|
eF = [0, [2, cst_map], 0],
|
|
eG = [0, [2, cst_map_indexed], 0],
|
|
eH = [0, [2, cst_filter], 0],
|
|
eI = [0, [2, cst_reduce], 0],
|
|
eJ = [0, [2, cst_some], 0],
|
|
eK = [0, [2, cst_every$0], 0],
|
|
eL = [0, [2, cst_for_each], 0];
|
|
function ho_form_name_p(name){
|
|
var or = Sx_runtime[1].call(null, cst, [0, name, eF]);
|
|
if(Sx_types[40].call(null, or)) return or;
|
|
var or$0 = Sx_runtime[1].call(null, cst, [0, name, eG]);
|
|
if(Sx_types[40].call(null, or$0)) return or$0;
|
|
var or$1 = Sx_runtime[1].call(null, cst, [0, name, eH]);
|
|
if(Sx_types[40].call(null, or$1)) return or$1;
|
|
var or$2 = Sx_runtime[1].call(null, cst, [0, name, eI]);
|
|
if(Sx_types[40].call(null, or$2)) return or$2;
|
|
var or$3 = Sx_runtime[1].call(null, cst, [0, name, eJ]);
|
|
if(Sx_types[40].call(null, or$3)) return or$3;
|
|
var or$4 = Sx_runtime[1].call(null, cst, [0, name, eK]);
|
|
return Sx_types[40].call(null, or$4)
|
|
? or$4
|
|
: Sx_runtime[1].call(null, cst, [0, name, eL]);
|
|
}
|
|
function ho_fn_p(v){
|
|
var or = Sx_runtime[113].call(null, v);
|
|
return Sx_types[40].call(null, or) ? or : Sx_runtime[108].call(null, v);
|
|
}
|
|
var eM = [0, [2, cst_reduce], 0], eN = [1, 1.], eO = [1, 2.], eP = [1, 1.];
|
|
function ho_swap_args(ho_type, evaled){
|
|
var c = Sx_runtime[1].call(null, cst, [0, ho_type, eM]);
|
|
if(Sx_types[40].call(null, c)){
|
|
var
|
|
a = Sx_runtime[12].call(null, evaled),
|
|
b = Sx_runtime[15].call(null, evaled, eN),
|
|
d = ho_fn_p(a),
|
|
and = [0, 1 - Sx_types[40].call(null, d)],
|
|
e = Sx_types[40].call(null, and) ? ho_fn_p(b) : and;
|
|
return Sx_types[40].call(null, e)
|
|
? [5,
|
|
[0, b, [0, Sx_runtime[15].call(null, evaled, eO), [0, a, 0]]]]
|
|
: evaled;
|
|
}
|
|
var
|
|
a$0 = Sx_runtime[12].call(null, evaled),
|
|
b$0 = Sx_runtime[15].call(null, evaled, eP),
|
|
f = ho_fn_p(a$0),
|
|
and$0 = [0, 1 - Sx_types[40].call(null, f)],
|
|
g = Sx_types[40].call(null, and$0) ? ho_fn_p(b$0) : and$0;
|
|
return Sx_types[40].call(null, g) ? [5, [0, b$0, [0, a$0, 0]]] : evaled;
|
|
}
|
|
var
|
|
eQ = [0, [2, cst_map], 0],
|
|
eR = [1, 1.],
|
|
eS = [5, 0],
|
|
eT = [5, 0],
|
|
eU = [5, 0],
|
|
eV = [0, [2, cst_map_indexed], 0],
|
|
eW = [1, 1.],
|
|
eX = [5, 0],
|
|
eY = [5, 0],
|
|
eZ = [5, 0],
|
|
e0 = [1, 0.],
|
|
e1 = [0, [2, cst_filter], 0],
|
|
e2 = [1, 1.],
|
|
e3 = [5, 0],
|
|
e4 = [5, 0],
|
|
e5 = [5, 0],
|
|
e6 = [0, [2, cst_reduce], 0],
|
|
e7 = [1, 1.],
|
|
e8 = [1, 2.],
|
|
e9 = [5, 0],
|
|
e_ = [0, [2, cst_some], 0],
|
|
e$ = [1, 1.],
|
|
fa = [0, 0],
|
|
fb = [5, 0],
|
|
fc = [0, [2, cst_every], 0],
|
|
fd = [1, 1.],
|
|
fe = [0, 1],
|
|
ff = [5, 0],
|
|
fg = [0, [2, cst_for_each], 0],
|
|
fh = [1, 1.],
|
|
fi = [5, 0],
|
|
fj = [2, "Unknown HO type: "];
|
|
function ho_setup_dispatch(ho_type, evaled, env, kont){
|
|
var
|
|
ordered = ho_swap_args(ho_type, evaled),
|
|
f = Sx_runtime[12].call(null, ordered),
|
|
a = Sx_runtime[1].call(null, cst, [0, ho_type, eQ]);
|
|
if(Sx_types[40].call(null, a)){
|
|
var
|
|
coll = Sx_runtime[15].call(null, ordered, eR),
|
|
b = Sx_runtime[32].call(null, coll);
|
|
if(Sx_types[40].call(null, b)) return make_cek_value(eS, env, kont);
|
|
var
|
|
c =
|
|
kont_push
|
|
(make_map_frame(f, Sx_runtime[13].call(null, coll), eT, env), kont);
|
|
return continue_with_call
|
|
(f, [5, [0, Sx_runtime[12].call(null, coll), 0]], env, eU, c);
|
|
}
|
|
var d = Sx_runtime[1].call(null, cst, [0, ho_type, eV]);
|
|
if(Sx_types[40].call(null, d)){
|
|
var
|
|
coll$0 = Sx_runtime[15].call(null, ordered, eW),
|
|
e = Sx_runtime[32].call(null, coll$0);
|
|
if(Sx_types[40].call(null, e)) return make_cek_value(eX, env, kont);
|
|
var
|
|
g =
|
|
kont_push
|
|
(make_map_indexed_frame
|
|
(f, Sx_runtime[13].call(null, coll$0), eY, env),
|
|
kont);
|
|
return continue_with_call
|
|
(f,
|
|
[5, [0, e0, [0, Sx_runtime[12].call(null, coll$0), 0]]],
|
|
env,
|
|
eZ,
|
|
g);
|
|
}
|
|
var h = Sx_runtime[1].call(null, cst, [0, ho_type, e1]);
|
|
if(Sx_types[40].call(null, h)){
|
|
var
|
|
coll$1 = Sx_runtime[15].call(null, ordered, e2),
|
|
i = Sx_runtime[32].call(null, coll$1);
|
|
if(Sx_types[40].call(null, i)) return make_cek_value(e3, env, kont);
|
|
var
|
|
j = Sx_runtime[12].call(null, coll$1),
|
|
k =
|
|
kont_push
|
|
(make_filter_frame(f, Sx_runtime[13].call(null, coll$1), e4, j, env),
|
|
kont);
|
|
return continue_with_call
|
|
(f, [5, [0, Sx_runtime[12].call(null, coll$1), 0]], env, e5, k);
|
|
}
|
|
var l = Sx_runtime[1].call(null, cst, [0, ho_type, e6]);
|
|
if(Sx_types[40].call(null, l)){
|
|
var
|
|
init = Sx_runtime[15].call(null, ordered, e7),
|
|
coll$2 = Sx_runtime[15].call(null, ordered, e8),
|
|
m = Sx_runtime[32].call(null, coll$2);
|
|
if(Sx_types[40].call(null, m)) return make_cek_value(init, env, kont);
|
|
var
|
|
n =
|
|
kont_push
|
|
(make_reduce_frame(f, Sx_runtime[13].call(null, coll$2), env), kont);
|
|
return continue_with_call
|
|
(f,
|
|
[5, [0, init, [0, Sx_runtime[12].call(null, coll$2), 0]]],
|
|
env,
|
|
e9,
|
|
n);
|
|
}
|
|
var o = Sx_runtime[1].call(null, cst, [0, ho_type, e_]);
|
|
if(Sx_types[40].call(null, o)){
|
|
var
|
|
coll$3 = Sx_runtime[15].call(null, ordered, e$),
|
|
p = Sx_runtime[32].call(null, coll$3);
|
|
if(Sx_types[40].call(null, p)) return make_cek_value(fa, env, kont);
|
|
var
|
|
q =
|
|
kont_push
|
|
(make_some_frame(f, Sx_runtime[13].call(null, coll$3), env), kont);
|
|
return continue_with_call
|
|
(f, [5, [0, Sx_runtime[12].call(null, coll$3), 0]], env, fb, q);
|
|
}
|
|
var r = Sx_runtime[1].call(null, cst, [0, ho_type, fc]);
|
|
if(Sx_types[40].call(null, r)){
|
|
var
|
|
coll$4 = Sx_runtime[15].call(null, ordered, fd),
|
|
s = Sx_runtime[32].call(null, coll$4);
|
|
if(Sx_types[40].call(null, s)) return make_cek_value(fe, env, kont);
|
|
var
|
|
t =
|
|
kont_push
|
|
(make_every_frame(f, Sx_runtime[13].call(null, coll$4), env), kont);
|
|
return continue_with_call
|
|
(f, [5, [0, Sx_runtime[12].call(null, coll$4), 0]], env, ff, t);
|
|
}
|
|
var u = Sx_runtime[1].call(null, cst, [0, ho_type, fg]);
|
|
if(! Sx_types[40].call(null, u)){
|
|
var
|
|
x = [2, Sx_runtime[4].call(null, [0, fj, [0, ho_type, 0]])],
|
|
y = Sx_runtime[2].call(null, x);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], y], 1);
|
|
}
|
|
var
|
|
coll$5 = Sx_runtime[15].call(null, ordered, fh),
|
|
v = Sx_runtime[32].call(null, coll$5);
|
|
if(Sx_types[40].call(null, v)) return make_cek_value(0, env, kont);
|
|
var
|
|
w =
|
|
kont_push
|
|
(make_for_each_frame(f, Sx_runtime[13].call(null, coll$5), env), kont);
|
|
return continue_with_call
|
|
(f, [5, [0, Sx_runtime[12].call(null, coll$5), 0]], env, fi, w);
|
|
}
|
|
var fk = [5, 0], fl = [2, cst_map];
|
|
function step_ho_map(args, env, kont){
|
|
var
|
|
a =
|
|
kont_push
|
|
(make_ho_setup_frame(fl, Sx_runtime[13].call(null, args), fk, env),
|
|
kont);
|
|
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
|
|
}
|
|
var fm = [5, 0], fn = [2, cst_map_indexed];
|
|
function step_ho_map_indexed(args, env, kont){
|
|
var
|
|
a =
|
|
kont_push
|
|
(make_ho_setup_frame(fn, Sx_runtime[13].call(null, args), fm, env),
|
|
kont);
|
|
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
|
|
}
|
|
var fo = [5, 0], fp = [2, cst_filter];
|
|
function step_ho_filter(args, env, kont){
|
|
var
|
|
a =
|
|
kont_push
|
|
(make_ho_setup_frame(fp, Sx_runtime[13].call(null, args), fo, env),
|
|
kont);
|
|
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
|
|
}
|
|
var fq = [5, 0], fr = [2, cst_reduce];
|
|
function step_ho_reduce(args, env, kont){
|
|
var
|
|
a =
|
|
kont_push
|
|
(make_ho_setup_frame(fr, Sx_runtime[13].call(null, args), fq, env),
|
|
kont);
|
|
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
|
|
}
|
|
var fs = [5, 0], ft = [2, cst_some];
|
|
function step_ho_some(args, env, kont){
|
|
var
|
|
a =
|
|
kont_push
|
|
(make_ho_setup_frame(ft, Sx_runtime[13].call(null, args), fs, env),
|
|
kont);
|
|
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
|
|
}
|
|
var fu = [5, 0], fv = [2, cst_every];
|
|
function step_ho_every(args, env, kont){
|
|
var
|
|
a =
|
|
kont_push
|
|
(make_ho_setup_frame(fv, Sx_runtime[13].call(null, args), fu, env),
|
|
kont);
|
|
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
|
|
}
|
|
var fw = [5, 0], fx = [2, cst_for_each];
|
|
function step_ho_for_each(args, env, kont){
|
|
var
|
|
a =
|
|
kont_push
|
|
(make_ho_setup_frame(fx, Sx_runtime[13].call(null, args), fw, env),
|
|
kont);
|
|
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
|
|
}
|
|
var
|
|
cst_form_not_callable = "-> form not callable: ",
|
|
cst_body = "body",
|
|
cst_evaled = "evaled",
|
|
cst_f = "f",
|
|
cst_remaining = "remaining",
|
|
cst_results = "results",
|
|
fy = [0, [2, cst_if], 0],
|
|
fz = [2, cst_env],
|
|
fA = [2, "then"],
|
|
fB = [2, cst_else],
|
|
fC = [2, cst_env],
|
|
fD = [2, cst_else],
|
|
fE = [0, [2, cst_when], 0],
|
|
fF = [2, cst_body],
|
|
fG = [2, cst_env],
|
|
fH = [0, [1, 1.], 0],
|
|
fI = [0, [2, cst_begin], 0],
|
|
fJ = [2, cst_remaining],
|
|
fK = [2, cst_env],
|
|
fL = [0, [1, 1.], 0],
|
|
fM = [0, [2, cst_let], 0],
|
|
fN = [2, cst_name],
|
|
fO = [2, cst_remaining],
|
|
fP = [2, cst_body],
|
|
fQ = [2, cst_env],
|
|
fR = [0, [2, cst_symbol], 0],
|
|
fS = [1, 1.],
|
|
fT = [0, [2, cst_define], 0],
|
|
fU = [2, cst_name],
|
|
fV = [2, cst_env],
|
|
fW = [2, "has-effects"],
|
|
fX = [2, "effect-list"],
|
|
fY = [0, [2, cst_list], 0],
|
|
fZ = [0, [2, cst_symbol], 0],
|
|
f0 = [2, cst_effect_annotations],
|
|
f1 = [2, cst_effect_annotations],
|
|
f2 = [2, cst_effect_annotations],
|
|
f3 = [0, [2, cst_set], 0],
|
|
f4 = [2, cst_name],
|
|
f5 = [2, cst_env],
|
|
f6 = [0, [2, cst_and], 0],
|
|
f7 = [2, cst_remaining],
|
|
f8 = [0, [1, 1.], 0],
|
|
f9 = [2, cst_env],
|
|
f_ = [2, cst_env],
|
|
f$ = [0, [2, cst_or], 0],
|
|
ga = [2, cst_remaining],
|
|
gb = [0, 0],
|
|
gc = [0, [1, 1.], 0],
|
|
gd = [2, cst_env],
|
|
ge = [2, cst_env],
|
|
gf = [0, [2, cst_cond], 0],
|
|
gg = [2, cst_remaining],
|
|
gh = [2, cst_env],
|
|
gi = [2, "scheme"],
|
|
gj = [1, 1.],
|
|
gk = [1, 1.],
|
|
gl = [0, 1],
|
|
gm = [1, 1.],
|
|
gn = [0, [1, 2.], 0],
|
|
go = [0, [1, 2.], 0],
|
|
gp = [1, 1.],
|
|
gq = [0, 0],
|
|
gr = [0, [2, cst_case], 0],
|
|
gs = [2, "match-val"],
|
|
gt = [2, cst_remaining],
|
|
gu = [2, cst_env],
|
|
gv = [0, [2, cst_thread], 0],
|
|
gw = [2, cst_remaining],
|
|
gx = [2, cst_env],
|
|
gy = [0, [2, cst_list], 0],
|
|
gz = [0, [2, cst_symbol], 0],
|
|
gA = [3, cst_quote],
|
|
gB = [0, [2, cst_list], 0],
|
|
gC = [2, cst_form_not_callable],
|
|
gD = [2, cst_form_not_callable],
|
|
gE = [0, [2, cst_arg], 0],
|
|
gF = [2, cst_f],
|
|
gG = [2, cst_evaled],
|
|
gH = [2, cst_remaining],
|
|
gI = [2, cst_env],
|
|
gJ = [2, "raw-args"],
|
|
gK = [2, "head-name"],
|
|
gL = [5, 0],
|
|
gM = [5, 0],
|
|
gN = [5, 0],
|
|
gO = [0, [2, cst_dict], 0],
|
|
gP = [2, cst_remaining],
|
|
gQ = [2, cst_results],
|
|
gR = [2, cst_env],
|
|
gS = [1, 0.],
|
|
gT = [1, 1.],
|
|
gU = [1, 1.],
|
|
gV = [0, [2, cst_ho_setup], 0],
|
|
gW = [2, "ho-type"],
|
|
gX = [2, cst_remaining],
|
|
gY = [2, cst_evaled],
|
|
gZ = [2, cst_env],
|
|
g0 = [0, [2, cst_reset], 0],
|
|
g1 = [0, [2, cst_deref], 0],
|
|
g2 = [2, cst_env],
|
|
g3 = [2, "sx-reactive"],
|
|
g4 = [2, "deps"],
|
|
g5 = [2, "notify"],
|
|
g6 = [0, [2, cst_reactive_reset], 0],
|
|
g7 = [2, cst_update_fn],
|
|
g8 = [2, "first-render"],
|
|
g9 = [0, [2, cst_scope], 0],
|
|
g_ = [2, cst_name],
|
|
g$ = [2, cst_remaining],
|
|
ha = [2, cst_env],
|
|
hb = [0, [2, cst_provide], 0],
|
|
hc = [2, cst_remaining],
|
|
hd = [2, cst_env],
|
|
he = [2, cst_value],
|
|
hf = [2, cst_name],
|
|
hg = [0, [2, cst_scope_acc], 0],
|
|
hh = [2, cst_remaining],
|
|
hi = [2, cst_env],
|
|
hj = [2, cst_value],
|
|
hk = [2, cst_name],
|
|
hl = [2, cst_emitted],
|
|
hm = [2, cst_emitted],
|
|
hn = [0, [2, cst_map], 0],
|
|
ho = [2, cst_f],
|
|
hp = [2, cst_remaining],
|
|
hq = [2, cst_results],
|
|
hr = [2, "indexed"],
|
|
hs = [2, cst_env],
|
|
ht = [5, 0],
|
|
hu = [0, [2, cst_filter], 0],
|
|
hv = [2, cst_f],
|
|
hw = [2, cst_remaining],
|
|
hx = [2, cst_results],
|
|
hy = [2, "current-item"],
|
|
hz = [2, cst_env],
|
|
hA = [5, 0],
|
|
hB = [0, [2, cst_reduce], 0],
|
|
hC = [2, cst_f],
|
|
hD = [2, cst_remaining],
|
|
hE = [2, cst_env],
|
|
hF = [5, 0],
|
|
hG = [0, [2, cst_for_each], 0],
|
|
hH = [2, cst_f],
|
|
hI = [2, cst_remaining],
|
|
hJ = [2, cst_env],
|
|
hK = [5, 0],
|
|
hL = [0, [2, cst_some], 0],
|
|
hM = [2, cst_f],
|
|
hN = [2, cst_remaining],
|
|
hO = [2, cst_env],
|
|
hP = [0, 0],
|
|
hQ = [5, 0],
|
|
hR = [0, [2, cst_every], 0],
|
|
hS = [2, cst_f],
|
|
hT = [2, cst_remaining],
|
|
hU = [2, cst_env],
|
|
hV = [0, 0],
|
|
hW = [0, 1],
|
|
hX = [5, 0],
|
|
hY = [2, "Unknown frame type: "];
|
|
function step_continue(state){
|
|
var
|
|
value = cek_value(state),
|
|
env = cek_env(state),
|
|
kont = cek_kont(state),
|
|
i = kont_empty_p(kont);
|
|
if(Sx_types[40].call(null, i)) return state;
|
|
var
|
|
frame = kont_top(kont),
|
|
rest_k = kont_pop(kont),
|
|
ft = frame_type(frame),
|
|
j = Sx_runtime[1].call(null, cst, [0, ft, fy]);
|
|
if(Sx_types[40].call(null, j)){
|
|
if(Sx_types[40].call(null, value))
|
|
var
|
|
k = Sx_runtime[106].call(null, value),
|
|
b = [0, 1 - Sx_types[40].call(null, k)];
|
|
else
|
|
var b = value;
|
|
if(Sx_types[40].call(null, b)){
|
|
var l = Sx_runtime[23].call(null, frame, fz);
|
|
return make_cek_state(Sx_runtime[23].call(null, frame, fA), l, rest_k);
|
|
}
|
|
var
|
|
m = Sx_runtime[23].call(null, frame, fB),
|
|
n = Sx_runtime[106].call(null, m);
|
|
if(Sx_types[40].call(null, n)) return make_cek_value(0, env, rest_k);
|
|
var o = Sx_runtime[23].call(null, frame, fC);
|
|
return make_cek_state(Sx_runtime[23].call(null, frame, fD), o, rest_k);
|
|
}
|
|
var p = Sx_runtime[1].call(null, cst, [0, ft, fE]);
|
|
if(Sx_types[40].call(null, p)){
|
|
if(Sx_types[40].call(null, value))
|
|
var
|
|
q = Sx_runtime[106].call(null, value),
|
|
c = [0, 1 - Sx_types[40].call(null, q)];
|
|
else
|
|
var c = value;
|
|
if(! Sx_types[40].call(null, c)) return make_cek_value(0, env, rest_k);
|
|
var
|
|
body = Sx_runtime[23].call(null, frame, fF),
|
|
fenv = Sx_runtime[23].call(null, frame, fG),
|
|
r = Sx_runtime[32].call(null, body);
|
|
if(Sx_types[40].call(null, r)) return make_cek_value(0, fenv, rest_k);
|
|
var
|
|
s = [0, Sx_runtime[22].call(null, body), fH],
|
|
t = Sx_runtime[1].call(null, cst, s);
|
|
if(Sx_types[40].call(null, t))
|
|
return make_cek_state(Sx_runtime[12].call(null, body), fenv, rest_k);
|
|
var
|
|
u =
|
|
kont_push
|
|
(make_begin_frame(Sx_runtime[13].call(null, body), fenv), rest_k);
|
|
return make_cek_state(Sx_runtime[12].call(null, body), fenv, u);
|
|
}
|
|
var v = Sx_runtime[1].call(null, cst, [0, ft, fI]);
|
|
if(Sx_types[40].call(null, v)){
|
|
var
|
|
remaining = Sx_runtime[23].call(null, frame, fJ),
|
|
fenv$0 = Sx_runtime[23].call(null, frame, fK),
|
|
w = Sx_runtime[32].call(null, remaining);
|
|
if(Sx_types[40].call(null, w))
|
|
return make_cek_value(value, fenv$0, rest_k);
|
|
var
|
|
x = [0, Sx_runtime[22].call(null, remaining), fL],
|
|
y = Sx_runtime[1].call(null, cst, x);
|
|
if(Sx_types[40].call(null, y))
|
|
return make_cek_state
|
|
(Sx_runtime[12].call(null, remaining), fenv$0, rest_k);
|
|
var
|
|
z =
|
|
kont_push
|
|
(make_begin_frame(Sx_runtime[13].call(null, remaining), fenv$0),
|
|
rest_k);
|
|
return make_cek_state(Sx_runtime[12].call(null, remaining), fenv$0, z);
|
|
}
|
|
var A = Sx_runtime[1].call(null, cst, [0, ft, fM]);
|
|
if(Sx_types[40].call(null, A)){
|
|
var
|
|
name = Sx_runtime[23].call(null, frame, fN),
|
|
remaining$0 = Sx_runtime[23].call(null, frame, fO),
|
|
body$0 = Sx_runtime[23].call(null, frame, fP),
|
|
local = Sx_runtime[23].call(null, frame, fQ),
|
|
B = Sx_runtime[3].call(null, name);
|
|
Sx_runtime[100].call(null, local, B, value);
|
|
var C = Sx_runtime[32].call(null, remaining$0);
|
|
if(Sx_types[40].call(null, C))
|
|
return step_sf_begin(body$0, local, rest_k);
|
|
var
|
|
next_binding = Sx_runtime[12].call(null, remaining$0),
|
|
D = Sx_runtime[12].call(null, next_binding),
|
|
E = [0, Sx_runtime[96].call(null, D), fR],
|
|
F = Sx_runtime[1].call(null, cst, E);
|
|
if(Sx_types[40].call(null, F))
|
|
var
|
|
G = Sx_runtime[12].call(null, next_binding),
|
|
vname = Sx_types[41].call(null, G);
|
|
else
|
|
var vname = Sx_runtime[12].call(null, next_binding);
|
|
var
|
|
H =
|
|
kont_push
|
|
(make_let_frame
|
|
(vname, Sx_runtime[13].call(null, remaining$0), body$0, local),
|
|
rest_k);
|
|
return make_cek_state
|
|
(Sx_runtime[15].call(null, next_binding, fS), local, H);
|
|
}
|
|
var I = Sx_runtime[1].call(null, cst, [0, ft, fT]);
|
|
if(Sx_types[40].call(null, I)){
|
|
var
|
|
name$0 = Sx_runtime[23].call(null, frame, fU),
|
|
fenv$1 = Sx_runtime[23].call(null, frame, fV),
|
|
has_effects = Sx_runtime[23].call(null, frame, fW),
|
|
effect_list = Sx_runtime[23].call(null, frame, fX),
|
|
and = Sx_runtime[108].call(null, value);
|
|
if(Sx_types[40].call(null, and))
|
|
var
|
|
J = Sx_types[46].call(null, value),
|
|
e = Sx_runtime[106].call(null, J);
|
|
else
|
|
var e = and;
|
|
if(Sx_types[40].call(null, e)){
|
|
var K = Sx_runtime[3].call(null, name$0);
|
|
Sx_runtime[105].call(null, value, K);
|
|
}
|
|
var L = Sx_runtime[3].call(null, name$0);
|
|
Sx_runtime[100].call(null, fenv$1, L, value);
|
|
if(Sx_types[40].call(null, has_effects)){
|
|
var
|
|
M = [0, Sx_runtime[96].call(null, effect_list), fY],
|
|
N = Sx_runtime[1].call(null, cst, M);
|
|
if(Sx_types[40].call(null, N))
|
|
var
|
|
O = Sx_runtime[5].call(null, effect_list),
|
|
effect_names =
|
|
[5,
|
|
Stdlib_List[20].call
|
|
(null,
|
|
function(e){
|
|
var
|
|
a = [0, Sx_runtime[96].call(null, e), fZ],
|
|
b = Sx_runtime[1].call(null, cst, a);
|
|
return Sx_types[40].call(null, b)
|
|
? Sx_types[41].call(null, e)
|
|
: [2, Sx_runtime[4].call(null, [0, e, 0])];
|
|
},
|
|
O)];
|
|
else
|
|
var
|
|
effect_names =
|
|
[5, [0, [2, Sx_runtime[4].call(null, [0, effect_list, 0])], 0]];
|
|
var
|
|
P = Sx_runtime[98].call(null, fenv$1, f0),
|
|
effect_anns =
|
|
Sx_types[40].call(null, P)
|
|
? Sx_runtime[99].call(null, fenv$1, f1)
|
|
: [6, Stdlib_Hashtbl[1].call(null, 0, 0)];
|
|
Sx_runtime[9].call(null, effect_anns, name$0, effect_names);
|
|
var Q = Sx_runtime[3].call(null, f2);
|
|
Sx_runtime[100].call(null, fenv$1, Q, effect_anns);
|
|
}
|
|
return make_cek_value(value, fenv$1, rest_k);
|
|
}
|
|
var R = Sx_runtime[1].call(null, cst, [0, ft, f3]);
|
|
if(Sx_types[40].call(null, R)){
|
|
var
|
|
name$1 = Sx_runtime[23].call(null, frame, f4),
|
|
fenv$2 = Sx_runtime[23].call(null, frame, f5),
|
|
S = Sx_runtime[3].call(null, name$1);
|
|
Sx_runtime[101].call(null, fenv$2, S, value);
|
|
return make_cek_value(value, env, rest_k);
|
|
}
|
|
var T = Sx_runtime[1].call(null, cst, [0, ft, f6]);
|
|
if(Sx_types[40].call(null, T)){
|
|
var U = [0, 1 - Sx_types[40].call(null, value)];
|
|
if(Sx_types[40].call(null, U)) return make_cek_value(value, env, rest_k);
|
|
var
|
|
remaining$1 = Sx_runtime[23].call(null, frame, f7),
|
|
V = Sx_runtime[32].call(null, remaining$1);
|
|
if(Sx_types[40].call(null, V)) return make_cek_value(value, env, rest_k);
|
|
var
|
|
W = [0, Sx_runtime[22].call(null, remaining$1), f8],
|
|
X = Sx_runtime[1].call(null, cst, W);
|
|
if(Sx_types[40].call(null, X))
|
|
var rest_k$0 = rest_k;
|
|
else
|
|
var
|
|
Z = Sx_runtime[23].call(null, frame, f_),
|
|
rest_k$0 =
|
|
kont_push
|
|
(make_and_frame(Sx_runtime[13].call(null, remaining$1), Z), rest_k);
|
|
var Y = Sx_runtime[23].call(null, frame, f9);
|
|
return make_cek_state
|
|
(Sx_runtime[12].call(null, remaining$1), Y, rest_k$0);
|
|
}
|
|
var _ = Sx_runtime[1].call(null, cst, [0, ft, f$]);
|
|
if(Sx_types[40].call(null, _)){
|
|
if(Sx_types[40].call(null, value))
|
|
return make_cek_value(value, env, rest_k);
|
|
var
|
|
remaining$2 = Sx_runtime[23].call(null, frame, ga),
|
|
$ = Sx_runtime[32].call(null, remaining$2);
|
|
if(Sx_types[40].call(null, $)) return make_cek_value(gb, env, rest_k);
|
|
var
|
|
aa = [0, Sx_runtime[22].call(null, remaining$2), gc],
|
|
ab = Sx_runtime[1].call(null, cst, aa);
|
|
if(Sx_types[40].call(null, ab))
|
|
var rest_k$1 = rest_k;
|
|
else
|
|
var
|
|
ad = Sx_runtime[23].call(null, frame, ge),
|
|
rest_k$1 =
|
|
kont_push
|
|
(make_or_frame(Sx_runtime[13].call(null, remaining$2), ad), rest_k);
|
|
var ac = Sx_runtime[23].call(null, frame, gd);
|
|
return make_cek_state
|
|
(Sx_runtime[12].call(null, remaining$2), ac, rest_k$1);
|
|
}
|
|
var ae = Sx_runtime[1].call(null, cst, [0, ft, gf]);
|
|
if(Sx_types[40].call(null, ae)){
|
|
var
|
|
remaining$3 = Sx_runtime[23].call(null, frame, gg),
|
|
fenv$3 = Sx_runtime[23].call(null, frame, gh),
|
|
scheme_p = Sx_runtime[23].call(null, frame, gi);
|
|
if(! Sx_types[40].call(null, scheme_p)){
|
|
if(Sx_types[40].call(null, value))
|
|
return make_cek_state
|
|
(Sx_runtime[15].call(null, remaining$3, gm), fenv$3, rest_k);
|
|
var
|
|
next = Sx_runtime[1].call(null, cst_slice, [0, remaining$3, gn]),
|
|
ai = [0, Sx_runtime[22].call(null, next), go],
|
|
aj = Sx_runtime[1].call(null, cst$3, ai);
|
|
if(Sx_types[40].call(null, aj))
|
|
return make_cek_value(0, fenv$3, rest_k);
|
|
var
|
|
next_test$0 = Sx_runtime[12].call(null, next),
|
|
ak = is_else_clause(next_test$0);
|
|
return Sx_types[40].call(null, ak)
|
|
? make_cek_state
|
|
(Sx_runtime[15].call(null, next, gp), fenv$3, rest_k)
|
|
: make_cek_state
|
|
(next_test$0,
|
|
fenv$3,
|
|
kont_push(make_cond_frame(next, fenv$3, gq), rest_k));
|
|
}
|
|
if(Sx_types[40].call(null, value)){
|
|
var af = Sx_runtime[12].call(null, remaining$3);
|
|
return make_cek_state(Sx_runtime[15].call(null, af, gj), fenv$3, rest_k);
|
|
}
|
|
var
|
|
next_clauses = Sx_runtime[13].call(null, remaining$3),
|
|
ag = Sx_runtime[32].call(null, next_clauses);
|
|
if(Sx_types[40].call(null, ag)) return make_cek_value(0, fenv$3, rest_k);
|
|
var
|
|
next_clause = Sx_runtime[12].call(null, next_clauses),
|
|
next_test = Sx_runtime[12].call(null, next_clause),
|
|
ah = is_else_clause(next_test);
|
|
return Sx_types[40].call(null, ah)
|
|
? make_cek_state
|
|
(Sx_runtime[15].call(null, next_clause, gk), fenv$3, rest_k)
|
|
: make_cek_state
|
|
(next_test,
|
|
fenv$3,
|
|
kont_push(make_cond_frame(next_clauses, fenv$3, gl), rest_k));
|
|
}
|
|
var al = Sx_runtime[1].call(null, cst, [0, ft, gr]);
|
|
if(Sx_types[40].call(null, al)){
|
|
var
|
|
match_val = Sx_runtime[23].call(null, frame, gs),
|
|
remaining$4 = Sx_runtime[23].call(null, frame, gt),
|
|
fenv$4 = Sx_runtime[23].call(null, frame, gu),
|
|
am = Sx_runtime[106].call(null, match_val);
|
|
return Sx_types[40].call(null, am)
|
|
? sf_case_step_loop(value, remaining$4, fenv$4, rest_k)
|
|
: sf_case_step_loop(match_val, remaining$4, fenv$4, rest_k);
|
|
}
|
|
var an = Sx_runtime[1].call(null, cst, [0, ft, gv]);
|
|
if(Sx_types[40].call(null, an)){
|
|
var
|
|
remaining$5 = Sx_runtime[23].call(null, frame, gw),
|
|
fenv$5 = Sx_runtime[23].call(null, frame, gx),
|
|
ao = Sx_runtime[32].call(null, remaining$5);
|
|
if(Sx_types[40].call(null, ao))
|
|
return make_cek_value(value, fenv$5, rest_k);
|
|
var
|
|
form = Sx_runtime[12].call(null, remaining$5),
|
|
rest_forms = Sx_runtime[13].call(null, remaining$5),
|
|
ap = Sx_runtime[13].call(null, remaining$5),
|
|
aq = Sx_runtime[32].call(null, ap),
|
|
new_kont =
|
|
Sx_types[40].call(null, aq)
|
|
? rest_k
|
|
: kont_push
|
|
(make_thread_frame(Sx_runtime[13].call(null, remaining$5), fenv$5),
|
|
rest_k),
|
|
ar = [0, Sx_runtime[96].call(null, form), gy],
|
|
and$0 = Sx_runtime[1].call(null, cst, ar);
|
|
if(Sx_types[40].call(null, and$0)){
|
|
var
|
|
as = Sx_runtime[32].call(null, form),
|
|
and$1 = [0, 1 - Sx_types[40].call(null, as)];
|
|
if(Sx_types[40].call(null, and$1)){
|
|
var
|
|
at = Sx_runtime[12].call(null, form),
|
|
au = [0, Sx_runtime[96].call(null, at), gz],
|
|
and$2 = Sx_runtime[1].call(null, cst, au);
|
|
if(Sx_types[40].call(null, and$2))
|
|
var
|
|
av = Sx_runtime[12].call(null, form),
|
|
a = ho_form_name_p(Sx_types[41].call(null, av));
|
|
else
|
|
var a = and$2;
|
|
}
|
|
else
|
|
var a = and$1;
|
|
}
|
|
else
|
|
var a = and$0;
|
|
if(Sx_types[40].call(null, a)){
|
|
var
|
|
aw = Sx_runtime[13].call(null, form),
|
|
ax = Sx_runtime[16].call(null, [5, [0, gA, [0, value, 0]]], aw),
|
|
ay = Sx_runtime[12].call(null, form);
|
|
return make_cek_state
|
|
(Sx_runtime[16].call(null, ay, ax), fenv$5, new_kont);
|
|
}
|
|
var
|
|
az = [0, Sx_runtime[96].call(null, form), gB],
|
|
aA = Sx_runtime[1].call(null, cst, az);
|
|
if(Sx_types[40].call(null, aA)){
|
|
var
|
|
f = trampoline(eval_expr(Sx_runtime[12].call(null, form), fenv$5)),
|
|
aB = Sx_runtime[13].call(null, form),
|
|
aC = Sx_runtime[5].call(null, aB),
|
|
rargs =
|
|
[5,
|
|
Stdlib_List[20].call
|
|
(null, function(a){return trampoline(eval_expr(a, fenv$5));}, aC)],
|
|
all_args = Sx_runtime[16].call(null, value, rargs),
|
|
and$3 = Sx_runtime[113].call(null, f);
|
|
if(Sx_types[40].call(null, and$3))
|
|
var
|
|
aD = Sx_runtime[108].call(null, f),
|
|
g = [0, 1 - Sx_types[40].call(null, aD)];
|
|
else
|
|
var g = and$3;
|
|
if(Sx_types[40].call(null, g))
|
|
var result = Sx_runtime[7].call(null, f, all_args);
|
|
else{
|
|
var aF = Sx_runtime[108].call(null, f);
|
|
if(! Sx_types[40].call(null, aF)){
|
|
var
|
|
aG = [0, gC, [0, Sx_runtime[83].call(null, f), 0]],
|
|
aH = [2, Sx_runtime[4].call(null, aG)],
|
|
aI = Sx_runtime[2].call(null, aH);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], aI], 1);
|
|
}
|
|
var result = trampoline(call_lambda(f, all_args, fenv$5));
|
|
}
|
|
}
|
|
else{
|
|
var
|
|
f$0 = trampoline(eval_expr(form, fenv$5)),
|
|
and$4 = Sx_runtime[113].call(null, f$0);
|
|
if(Sx_types[40].call(null, and$4))
|
|
var
|
|
aJ = Sx_runtime[108].call(null, f$0),
|
|
h = [0, 1 - Sx_types[40].call(null, aJ)];
|
|
else
|
|
var h = and$4;
|
|
if(Sx_types[40].call(null, h))
|
|
var result = cek_call(f$0, [5, [0, value, 0]]);
|
|
else{
|
|
var aK = Sx_runtime[108].call(null, f$0);
|
|
if(! Sx_types[40].call(null, aK)){
|
|
var
|
|
aL = [0, gD, [0, Sx_runtime[83].call(null, f$0), 0]],
|
|
aM = [2, Sx_runtime[4].call(null, aL)],
|
|
aN = Sx_runtime[2].call(null, aM);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], aN], 1);
|
|
}
|
|
var result = trampoline(call_lambda(f$0, [5, [0, value, 0]], fenv$5));
|
|
}
|
|
}
|
|
var aE = Sx_runtime[32].call(null, rest_forms);
|
|
return Sx_types[40].call(null, aE)
|
|
? make_cek_value(result, fenv$5, rest_k)
|
|
: make_cek_value
|
|
(result,
|
|
fenv$5,
|
|
kont_push(make_thread_frame(rest_forms, fenv$5), rest_k));
|
|
}
|
|
var aO = Sx_runtime[1].call(null, cst, [0, ft, gE]);
|
|
if(Sx_types[40].call(null, aO)){
|
|
var
|
|
f$1 = Sx_runtime[23].call(null, frame, gF),
|
|
evaled = Sx_runtime[23].call(null, frame, gG),
|
|
remaining$6 = Sx_runtime[23].call(null, frame, gH),
|
|
fenv$6 = Sx_runtime[23].call(null, frame, gI),
|
|
raw_args = Sx_runtime[23].call(null, frame, gJ),
|
|
hname = Sx_runtime[23].call(null, frame, gK),
|
|
aP = Sx_runtime[106].call(null, f$1);
|
|
if(Sx_types[40].call(null, aP)){
|
|
var
|
|
and$5 = strict_ref[1],
|
|
hname$0 = Sx_types[40].call(null, and$5) ? hname : and$5;
|
|
if(Sx_types[40].call(null, hname$0)) strict_check_args(hname, gL);
|
|
var aQ = Sx_runtime[32].call(null, remaining$6);
|
|
if(Sx_types[40].call(null, aQ))
|
|
return continue_with_call(value, gM, fenv$6, raw_args, rest_k);
|
|
var
|
|
aR =
|
|
kont_push
|
|
(make_arg_frame
|
|
(value,
|
|
gN,
|
|
Sx_runtime[13].call(null, remaining$6),
|
|
fenv$6,
|
|
raw_args,
|
|
hname),
|
|
rest_k);
|
|
return make_cek_state
|
|
(Sx_runtime[12].call(null, remaining$6), fenv$6, aR);
|
|
}
|
|
var
|
|
new_evaled =
|
|
Sx_runtime[1].call
|
|
(null, cst_append, [0, evaled, [0, [5, [0, value, 0]], 0]]),
|
|
aS = Sx_runtime[32].call(null, remaining$6);
|
|
if(! Sx_types[40].call(null, aS)){
|
|
var
|
|
aT =
|
|
kont_push
|
|
(make_arg_frame
|
|
(f$1,
|
|
new_evaled,
|
|
Sx_runtime[13].call(null, remaining$6),
|
|
fenv$6,
|
|
raw_args,
|
|
hname),
|
|
rest_k);
|
|
return make_cek_state
|
|
(Sx_runtime[12].call(null, remaining$6), fenv$6, aT);
|
|
}
|
|
var
|
|
and$6 = strict_ref[1],
|
|
hname$1 = Sx_types[40].call(null, and$6) ? hname : and$6;
|
|
if(Sx_types[40].call(null, hname$1))
|
|
strict_check_args(hname, new_evaled);
|
|
return continue_with_call(f$1, new_evaled, fenv$6, raw_args, rest_k);
|
|
}
|
|
var aU = Sx_runtime[1].call(null, cst, [0, ft, gO]);
|
|
if(Sx_types[40].call(null, aU)){
|
|
var
|
|
remaining$7 = Sx_runtime[23].call(null, frame, gP),
|
|
results = Sx_runtime[23].call(null, frame, gQ),
|
|
fenv$7 = Sx_runtime[23].call(null, frame, gR),
|
|
last_result = Sx_runtime[14].call(null, results),
|
|
aV =
|
|
[0,
|
|
[5,
|
|
[0,
|
|
[5, [0, Sx_runtime[12].call(null, last_result), [0, value, 0]]],
|
|
0]],
|
|
0],
|
|
aW = [0, Sx_runtime[22].call(null, results), 0],
|
|
aX =
|
|
[0, results, [0, gS, [0, Sx_runtime[1].call(null, cst_dec, aW), 0]]],
|
|
aY = [0, Sx_runtime[1].call(null, cst_slice, aX), aV],
|
|
completed = Sx_runtime[1].call(null, cst_append, aY),
|
|
aZ = Sx_runtime[32].call(null, remaining$7);
|
|
if(Sx_types[40].call(null, aZ)){
|
|
var
|
|
d = [6, Stdlib_Hashtbl[1].call(null, 0, 0)],
|
|
a0 = Sx_runtime[5].call(null, completed);
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(pair){
|
|
var
|
|
a = Sx_runtime[15].call(null, pair, gT),
|
|
b = Sx_runtime[12].call(null, pair);
|
|
Sx_runtime[9].call(null, d, b, a);
|
|
return 0;
|
|
},
|
|
a0);
|
|
return make_cek_value(d, fenv$7, rest_k);
|
|
}
|
|
var
|
|
next_entry = Sx_runtime[12].call(null, remaining$7),
|
|
a1 =
|
|
[0,
|
|
completed,
|
|
[0,
|
|
[5, [0, [5, [0, Sx_runtime[12].call(null, next_entry), 0]], 0]],
|
|
0]],
|
|
a2 = Sx_runtime[1].call(null, cst_append, a1),
|
|
a3 =
|
|
kont_push
|
|
(make_dict_frame(Sx_runtime[13].call(null, remaining$7), a2, fenv$7),
|
|
rest_k);
|
|
return make_cek_state
|
|
(Sx_runtime[15].call(null, next_entry, gU), fenv$7, a3);
|
|
}
|
|
var a4 = Sx_runtime[1].call(null, cst, [0, ft, gV]);
|
|
if(Sx_types[40].call(null, a4)){
|
|
var
|
|
ho_type = Sx_runtime[23].call(null, frame, gW),
|
|
remaining$8 = Sx_runtime[23].call(null, frame, gX),
|
|
a5 =
|
|
[0, Sx_runtime[23].call(null, frame, gY), [0, [5, [0, value, 0]], 0]],
|
|
evaled$0 = Sx_runtime[1].call(null, cst_append, a5),
|
|
fenv$8 = Sx_runtime[23].call(null, frame, gZ),
|
|
a6 = Sx_runtime[32].call(null, remaining$8);
|
|
if(Sx_types[40].call(null, a6))
|
|
return ho_setup_dispatch(ho_type, evaled$0, fenv$8, rest_k);
|
|
var
|
|
a7 =
|
|
kont_push
|
|
(make_ho_setup_frame
|
|
(ho_type, Sx_runtime[13].call(null, remaining$8), evaled$0, fenv$8),
|
|
rest_k);
|
|
return make_cek_state(Sx_runtime[12].call(null, remaining$8), fenv$8, a7);
|
|
}
|
|
var a8 = Sx_runtime[1].call(null, cst, [0, ft, g0]);
|
|
if(Sx_types[40].call(null, a8)) return make_cek_value(value, env, rest_k);
|
|
var a9 = Sx_runtime[1].call(null, cst, [0, ft, g1]);
|
|
if(Sx_types[40].call(null, a9)){
|
|
var
|
|
fenv$9 = Sx_runtime[23].call(null, frame, g2),
|
|
a_ = Sx_runtime[112].call(null, value),
|
|
a$ = [0, 1 - Sx_types[40].call(null, a_)];
|
|
if(Sx_types[40].call(null, a$))
|
|
return make_cek_value(value, fenv$9, rest_k);
|
|
var ba = has_reactive_reset_frame_p(rest_k);
|
|
if(Sx_types[40].call(null, ba))
|
|
return reactive_shift_deref(value, fenv$9, rest_k);
|
|
var ctx = Sx_runtime[94].call(null, g3, 0);
|
|
if(Sx_types[40].call(null, ctx)){
|
|
var
|
|
dep_list = Sx_runtime[23].call(null, ctx, g4),
|
|
notify_fn = Sx_runtime[23].call(null, ctx, g5),
|
|
bb =
|
|
Sx_runtime[1].call(null, "contains?", [0, dep_list, [0, value, 0]]),
|
|
bc = [0, 1 - Sx_types[40].call(null, bb)];
|
|
if(Sx_types[40].call(null, bc)){
|
|
Sx_runtime[8].call(null, dep_list, value);
|
|
Sx_runtime[140].call(null, value, notify_fn);
|
|
}
|
|
}
|
|
return make_cek_value(Sx_runtime[137].call(null, value), fenv$9, rest_k);
|
|
}
|
|
var bd = Sx_runtime[1].call(null, cst, [0, ft, g6]);
|
|
if(Sx_types[40].call(null, bd)){
|
|
var
|
|
update_fn = Sx_runtime[23].call(null, frame, g7),
|
|
first_p = Sx_runtime[23].call(null, frame, g8),
|
|
be =
|
|
Sx_types[40].call(null, update_fn)
|
|
? [0, 1 - Sx_types[40].call(null, first_p)]
|
|
: update_fn;
|
|
if(Sx_types[40].call(null, be)) cek_call(update_fn, [5, [0, value, 0]]);
|
|
return make_cek_value(value, env, rest_k);
|
|
}
|
|
var bf = Sx_runtime[1].call(null, cst, [0, ft, g9]);
|
|
if(Sx_types[40].call(null, bf)){
|
|
var
|
|
name$2 = Sx_runtime[23].call(null, frame, g_),
|
|
remaining$9 = Sx_runtime[23].call(null, frame, g$),
|
|
fenv$10 = Sx_runtime[23].call(null, frame, ha),
|
|
bg = Sx_runtime[32].call(null, remaining$9);
|
|
if(Sx_types[40].call(null, bg)){
|
|
Sx_runtime[127].call(null, name$2);
|
|
return make_cek_value(value, fenv$10, rest_k);
|
|
}
|
|
var
|
|
bh =
|
|
kont_push
|
|
(make_scope_frame
|
|
(name$2, Sx_runtime[13].call(null, remaining$9), fenv$10),
|
|
rest_k);
|
|
return make_cek_state
|
|
(Sx_runtime[12].call(null, remaining$9), fenv$10, bh);
|
|
}
|
|
var bi = Sx_runtime[1].call(null, cst, [0, ft, hb]);
|
|
if(Sx_types[40].call(null, bi)){
|
|
var
|
|
remaining$10 = Sx_runtime[23].call(null, frame, hc),
|
|
fenv$11 = Sx_runtime[23].call(null, frame, hd),
|
|
bj = Sx_runtime[32].call(null, remaining$10);
|
|
if(Sx_types[40].call(null, bj))
|
|
return make_cek_value(value, fenv$11, rest_k);
|
|
var
|
|
bk = Sx_runtime[13].call(null, remaining$10),
|
|
bl = Sx_runtime[23].call(null, frame, he),
|
|
bm =
|
|
kont_push
|
|
(make_provide_frame
|
|
(Sx_runtime[23].call(null, frame, hf), bl, bk, fenv$11),
|
|
rest_k);
|
|
return make_cek_state
|
|
(Sx_runtime[12].call(null, remaining$10), fenv$11, bm);
|
|
}
|
|
var bn = Sx_runtime[1].call(null, cst, [0, ft, hg]);
|
|
if(Sx_types[40].call(null, bn)){
|
|
var
|
|
remaining$11 = Sx_runtime[23].call(null, frame, hh),
|
|
fenv$12 = Sx_runtime[23].call(null, frame, hi),
|
|
bo = Sx_runtime[32].call(null, remaining$11);
|
|
if(Sx_types[40].call(null, bo))
|
|
return make_cek_value(value, fenv$12, rest_k);
|
|
var
|
|
bp = Sx_runtime[13].call(null, remaining$11),
|
|
bq = Sx_runtime[23].call(null, frame, hj),
|
|
new_frame =
|
|
make_scope_acc_frame
|
|
(Sx_runtime[23].call(null, frame, hk), bq, bp, fenv$12),
|
|
br = Sx_runtime[23].call(null, frame, hl);
|
|
Sx_runtime[9].call(null, new_frame, hm, br);
|
|
var bs = kont_push(new_frame, rest_k);
|
|
return make_cek_state
|
|
(Sx_runtime[12].call(null, remaining$11), fenv$12, bs);
|
|
}
|
|
var bt = Sx_runtime[1].call(null, cst, [0, ft, hn]);
|
|
if(Sx_types[40].call(null, bt)){
|
|
var
|
|
f$2 = Sx_runtime[23].call(null, frame, ho),
|
|
remaining$12 = Sx_runtime[23].call(null, frame, hp),
|
|
results$0 = Sx_runtime[23].call(null, frame, hq),
|
|
indexed = Sx_runtime[23].call(null, frame, hr),
|
|
fenv$13 = Sx_runtime[23].call(null, frame, hs),
|
|
new_results =
|
|
Sx_runtime[1].call
|
|
(null, cst_append, [0, results$0, [0, [5, [0, value, 0]], 0]]),
|
|
bu = Sx_runtime[32].call(null, remaining$12);
|
|
if(Sx_types[40].call(null, bu))
|
|
return make_cek_value(new_results, fenv$13, rest_k);
|
|
if(Sx_types[40].call(null, indexed))
|
|
var
|
|
bv = [0, Sx_runtime[12].call(null, remaining$12), 0],
|
|
call_args = [5, [0, Sx_runtime[22].call(null, new_results), bv]];
|
|
else
|
|
var call_args = [5, [0, Sx_runtime[12].call(null, remaining$12), 0]];
|
|
var
|
|
next_frame =
|
|
Sx_types[40].call(null, indexed)
|
|
? make_map_indexed_frame
|
|
(f$2,
|
|
Sx_runtime[13].call(null, remaining$12),
|
|
new_results,
|
|
fenv$13)
|
|
: make_map_frame
|
|
(f$2,
|
|
Sx_runtime[13].call(null, remaining$12),
|
|
new_results,
|
|
fenv$13);
|
|
return continue_with_call
|
|
(f$2, call_args, fenv$13, ht, kont_push(next_frame, rest_k));
|
|
}
|
|
var bw = Sx_runtime[1].call(null, cst, [0, ft, hu]);
|
|
if(Sx_types[40].call(null, bw)){
|
|
var
|
|
f$3 = Sx_runtime[23].call(null, frame, hv),
|
|
remaining$13 = Sx_runtime[23].call(null, frame, hw),
|
|
results$1 = Sx_runtime[23].call(null, frame, hx),
|
|
current_item = Sx_runtime[23].call(null, frame, hy),
|
|
fenv$14 = Sx_runtime[23].call(null, frame, hz),
|
|
new_results$0 =
|
|
Sx_types[40].call(null, value)
|
|
? Sx_runtime
|
|
[1].call
|
|
(null,
|
|
cst_append,
|
|
[0, results$1, [0, [5, [0, current_item, 0]], 0]])
|
|
: results$1,
|
|
bx = Sx_runtime[32].call(null, remaining$13);
|
|
if(Sx_types[40].call(null, bx))
|
|
return make_cek_value(new_results$0, fenv$14, rest_k);
|
|
var
|
|
by = Sx_runtime[12].call(null, remaining$13),
|
|
bz =
|
|
kont_push
|
|
(make_filter_frame
|
|
(f$3,
|
|
Sx_runtime[13].call(null, remaining$13),
|
|
new_results$0,
|
|
by,
|
|
fenv$14),
|
|
rest_k);
|
|
return continue_with_call
|
|
(f$3,
|
|
[5, [0, Sx_runtime[12].call(null, remaining$13), 0]],
|
|
fenv$14,
|
|
hA,
|
|
bz);
|
|
}
|
|
var bA = Sx_runtime[1].call(null, cst, [0, ft, hB]);
|
|
if(Sx_types[40].call(null, bA)){
|
|
var
|
|
f$4 = Sx_runtime[23].call(null, frame, hC),
|
|
remaining$14 = Sx_runtime[23].call(null, frame, hD),
|
|
fenv$15 = Sx_runtime[23].call(null, frame, hE),
|
|
bB = Sx_runtime[32].call(null, remaining$14);
|
|
if(Sx_types[40].call(null, bB))
|
|
return make_cek_value(value, fenv$15, rest_k);
|
|
var
|
|
bC =
|
|
kont_push
|
|
(make_reduce_frame
|
|
(f$4, Sx_runtime[13].call(null, remaining$14), fenv$15),
|
|
rest_k);
|
|
return continue_with_call
|
|
(f$4,
|
|
[5, [0, value, [0, Sx_runtime[12].call(null, remaining$14), 0]]],
|
|
fenv$15,
|
|
hF,
|
|
bC);
|
|
}
|
|
var bD = Sx_runtime[1].call(null, cst, [0, ft, hG]);
|
|
if(Sx_types[40].call(null, bD)){
|
|
var
|
|
f$5 = Sx_runtime[23].call(null, frame, hH),
|
|
remaining$15 = Sx_runtime[23].call(null, frame, hI),
|
|
fenv$16 = Sx_runtime[23].call(null, frame, hJ),
|
|
bE = Sx_runtime[32].call(null, remaining$15);
|
|
if(Sx_types[40].call(null, bE))
|
|
return make_cek_value(0, fenv$16, rest_k);
|
|
var
|
|
bF =
|
|
kont_push
|
|
(make_for_each_frame
|
|
(f$5, Sx_runtime[13].call(null, remaining$15), fenv$16),
|
|
rest_k);
|
|
return continue_with_call
|
|
(f$5,
|
|
[5, [0, Sx_runtime[12].call(null, remaining$15), 0]],
|
|
fenv$16,
|
|
hK,
|
|
bF);
|
|
}
|
|
var bG = Sx_runtime[1].call(null, cst, [0, ft, hL]);
|
|
if(Sx_types[40].call(null, bG)){
|
|
var
|
|
f$6 = Sx_runtime[23].call(null, frame, hM),
|
|
remaining$16 = Sx_runtime[23].call(null, frame, hN),
|
|
fenv$17 = Sx_runtime[23].call(null, frame, hO);
|
|
if(Sx_types[40].call(null, value))
|
|
return make_cek_value(value, fenv$17, rest_k);
|
|
var bH = Sx_runtime[32].call(null, remaining$16);
|
|
if(Sx_types[40].call(null, bH))
|
|
return make_cek_value(hP, fenv$17, rest_k);
|
|
var
|
|
bI =
|
|
kont_push
|
|
(make_some_frame
|
|
(f$6, Sx_runtime[13].call(null, remaining$16), fenv$17),
|
|
rest_k);
|
|
return continue_with_call
|
|
(f$6,
|
|
[5, [0, Sx_runtime[12].call(null, remaining$16), 0]],
|
|
fenv$17,
|
|
hQ,
|
|
bI);
|
|
}
|
|
var bJ = Sx_runtime[1].call(null, cst, [0, ft, hR]);
|
|
if(! Sx_types[40].call(null, bJ)){
|
|
var
|
|
bN = [2, Sx_runtime[4].call(null, [0, hY, [0, ft, 0]])],
|
|
bO = Sx_runtime[2].call(null, bN);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], bO], 1);
|
|
}
|
|
var
|
|
f$7 = Sx_runtime[23].call(null, frame, hS),
|
|
remaining$17 = Sx_runtime[23].call(null, frame, hT),
|
|
fenv$18 = Sx_runtime[23].call(null, frame, hU),
|
|
bK = [0, 1 - Sx_types[40].call(null, value)];
|
|
if(Sx_types[40].call(null, bK))
|
|
return make_cek_value(hV, fenv$18, rest_k);
|
|
var bL = Sx_runtime[32].call(null, remaining$17);
|
|
if(Sx_types[40].call(null, bL))
|
|
return make_cek_value(hW, fenv$18, rest_k);
|
|
var
|
|
bM =
|
|
kont_push
|
|
(make_every_frame
|
|
(f$7, Sx_runtime[13].call(null, remaining$17), fenv$18),
|
|
rest_k);
|
|
return continue_with_call
|
|
(f$7,
|
|
[5, [0, Sx_runtime[12].call(null, remaining$17), 0]],
|
|
fenv$18,
|
|
hX,
|
|
bM);
|
|
}
|
|
var
|
|
jit_call_hook = [0, 0],
|
|
hZ = [2, "captured"],
|
|
h0 = [1, 1.],
|
|
h1 = [2, cst_children],
|
|
h2 = [2, "Not callable: "];
|
|
function continue_with_call(f, args, env, raw_args, kont){
|
|
var b = Sx_runtime[122].call(null, f);
|
|
if(Sx_types[40].call(null, b)){
|
|
var
|
|
c = Sx_runtime[32].call(null, args),
|
|
arg = Sx_types[40].call(null, c) ? 0 : Sx_runtime[12].call(null, args),
|
|
cont_data = Sx_runtime[124].call(null, f),
|
|
captured = Sx_runtime[23].call(null, cont_data, hZ),
|
|
result = cek_run(make_cek_value(arg, env, captured));
|
|
return make_cek_value(result, env, kont);
|
|
}
|
|
var and = Sx_runtime[113].call(null, f);
|
|
if(Sx_types[40].call(null, and)){
|
|
var
|
|
d = Sx_runtime[108].call(null, f),
|
|
and$0 = [0, 1 - Sx_types[40].call(null, d)];
|
|
if(Sx_types[40].call(null, and$0)){
|
|
var
|
|
e = Sx_runtime[109].call(null, f),
|
|
and$1 = [0, 1 - Sx_types[40].call(null, e)];
|
|
if(Sx_types[40].call(null, and$1))
|
|
var
|
|
g = Sx_runtime[110].call(null, f),
|
|
a = [0, 1 - Sx_types[40].call(null, g)];
|
|
else
|
|
var a = and$1;
|
|
}
|
|
else
|
|
var a = and$0;
|
|
}
|
|
else
|
|
var a = and;
|
|
if(Sx_types[40].call(null, a))
|
|
return make_cek_value(Sx_runtime[7].call(null, f, args), env, kont);
|
|
var h = Sx_runtime[108].call(null, f);
|
|
if(! Sx_types[40].call(null, h)){
|
|
var
|
|
or = Sx_runtime[109].call(null, f),
|
|
or$0 = Sx_types[40].call(null, or) ? or : Sx_runtime[110].call(null, f);
|
|
if(! Sx_types[40].call(null, or$0)){
|
|
var
|
|
p = [0, h2, [0, Sx_runtime[83].call(null, f), 0]],
|
|
q = [2, Sx_runtime[4].call(null, p)],
|
|
r = Sx_runtime[2].call(null, q);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], r], 1);
|
|
}
|
|
var
|
|
parsed = parse_keyword_args(raw_args, env),
|
|
kwargs = Sx_runtime[12].call(null, parsed),
|
|
children = Sx_runtime[15].call(null, parsed, h0),
|
|
j = Sx_types[51].call(null, f),
|
|
local$0 = Sx_runtime[104].call(null, j, env),
|
|
k = Sx_types[49].call(null, f),
|
|
m = Sx_runtime[5].call(null, k);
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(p){
|
|
var
|
|
or = Sx_runtime[68].call(null, kwargs, p),
|
|
or$0 = Sx_types[40].call(null, or) ? or : 0,
|
|
a = Sx_runtime[3].call(null, p);
|
|
Sx_runtime[100].call(null, local$0, a, or$0);
|
|
return 0;
|
|
},
|
|
m);
|
|
var n = Sx_types[52].call(null, f);
|
|
if(Sx_types[40].call(null, n)){
|
|
var o = Sx_runtime[3].call(null, h1);
|
|
Sx_runtime[100].call(null, local$0, o, children);
|
|
}
|
|
return make_cek_state(Sx_types[50].call(null, f), local$0, kont);
|
|
}
|
|
var
|
|
i = Sx_types[45].call(null, f),
|
|
local = Sx_runtime[104].call(null, i, env);
|
|
bind_lambda_params(f, args, local);
|
|
var match = jit_call_hook[1];
|
|
if(match && typeof f !== "number" && 7 === f[0]){
|
|
var l = f[1], hook = match[1];
|
|
if(0 !== l[4]){
|
|
a:
|
|
{
|
|
if(typeof args !== "number")
|
|
switch(args[0]){
|
|
case 5:
|
|
var args_list = args[1]; break a;
|
|
case 19:
|
|
var args_list = args[1][1]; break a;
|
|
}
|
|
var args_list = 0;
|
|
}
|
|
var match$0 = caml_call2(hook, f, args_list);
|
|
if(! match$0)
|
|
return make_cek_state(Sx_types[44].call(null, f), local, kont);
|
|
var result$0 = match$0[1];
|
|
return make_cek_value(result$0, local, kont);
|
|
}
|
|
}
|
|
return make_cek_state(Sx_types[44].call(null, f), local, kont);
|
|
}
|
|
var h3 = [0, [1, 2.], 0], h4 = [1, 1.], h5 = [0, [1, 2.], 0];
|
|
function sf_case_step_loop(match_val, clauses$1, env, kont){
|
|
var clauses = clauses$1;
|
|
for(;;){
|
|
var
|
|
a = [0, Sx_runtime[22].call(null, clauses), h3],
|
|
b = Sx_runtime[1].call(null, cst$3, a);
|
|
if(Sx_types[40].call(null, b)) return make_cek_value(0, env, kont);
|
|
var
|
|
test = Sx_runtime[12].call(null, clauses),
|
|
body = Sx_runtime[15].call(null, clauses, h4),
|
|
c = is_else_clause(test);
|
|
if(Sx_types[40].call(null, c)) return make_cek_state(body, env, kont);
|
|
var
|
|
test_val = trampoline(eval_expr(test, env)),
|
|
d = Sx_runtime[1].call(null, cst, [0, match_val, [0, test_val, 0]]);
|
|
if(Sx_types[40].call(null, d)) return make_cek_state(body, env, kont);
|
|
var clauses$0 = Sx_runtime[1].call(null, cst_slice, [0, clauses, h5]);
|
|
clauses = clauses$0;
|
|
}
|
|
}
|
|
var h6 = [5, 0];
|
|
function eval_expr_cek(expr, env){
|
|
return cek_run(make_cek_state(expr, env, h6));
|
|
}
|
|
function trampoline_cek(val){
|
|
var a = Sx_runtime[107].call(null, val);
|
|
if(! Sx_types[40].call(null, a)) return val;
|
|
var b = Sx_types[59].call(null, val);
|
|
return eval_expr_cek(Sx_types[58].call(null, val), b);
|
|
}
|
|
var h7 = [5, 0];
|
|
function eval_expr(expr, env){
|
|
return cek_run(make_cek_state(expr, env, h7));
|
|
}
|
|
runtime.caml_update_dummy
|
|
(custom_special_forms, [6, Stdlib_Hashtbl[1].call(null, 0, 0)]);
|
|
trampoline_fn[1] =
|
|
function(v){
|
|
if(typeof v !== "number" && 11 === v[0]){
|
|
var env = v[2], expr = v[1];
|
|
return eval_expr(expr, [18, env]);
|
|
}
|
|
return v;
|
|
};
|
|
Sx_primitives[3][1] = trampoline_fn[1];
|
|
Sx_primitives[7][1] = trampoline_fn[1];
|
|
function cek_run_iterative(state){
|
|
var s = state;
|
|
for(;;){
|
|
var match = cek_terminal_p(s);
|
|
a:
|
|
{
|
|
if(typeof match !== "number" && 0 === match[0] && match[1]){var a = 1; break a;}
|
|
var a = 0;
|
|
}
|
|
if(a) return cek_value(s);
|
|
s = cek_step(s);
|
|
}
|
|
}
|
|
runtime.caml_register_global
|
|
(887,
|
|
[0,
|
|
trampoline_fn,
|
|
trampoline,
|
|
strict_ref,
|
|
prim_param_types_ref,
|
|
jit_call_hook,
|
|
make_cek_state,
|
|
make_cek_value,
|
|
cek_terminal_p,
|
|
cek_control,
|
|
cek_env,
|
|
cek_kont,
|
|
cek_phase,
|
|
cek_value,
|
|
make_if_frame,
|
|
make_when_frame,
|
|
make_begin_frame,
|
|
make_let_frame,
|
|
make_define_frame,
|
|
make_set_frame,
|
|
make_arg_frame,
|
|
make_call_frame,
|
|
make_cond_frame,
|
|
make_case_frame,
|
|
make_thread_frame,
|
|
make_map_frame,
|
|
make_map_indexed_frame,
|
|
make_filter_frame,
|
|
make_reduce_frame,
|
|
make_for_each_frame,
|
|
make_some_frame,
|
|
make_every_frame,
|
|
make_scope_frame,
|
|
make_provide_frame,
|
|
make_scope_acc_frame,
|
|
make_reset_frame,
|
|
make_dict_frame,
|
|
make_and_frame,
|
|
make_or_frame,
|
|
make_dynamic_wind_frame,
|
|
make_reactive_reset_frame,
|
|
make_deref_frame,
|
|
make_ho_setup_frame,
|
|
frame_type,
|
|
kont_push,
|
|
kont_top,
|
|
kont_pop,
|
|
kont_empty_p,
|
|
kont_capture_to_reset,
|
|
kont_find_provide,
|
|
kont_find_scope_acc,
|
|
has_reactive_reset_frame_p,
|
|
kont_capture_to_reactive_reset,
|
|
custom_special_forms,
|
|
register_special_form,
|
|
render_check,
|
|
render_fn,
|
|
strict,
|
|
set_strict_b,
|
|
prim_param_types,
|
|
set_prim_param_types_b,
|
|
value_matches_type_p,
|
|
strict_check_args,
|
|
bind_lambda_params,
|
|
call_lambda,
|
|
call_component,
|
|
parse_keyword_args,
|
|
cond_scheme_p,
|
|
is_else_clause,
|
|
sf_named_let,
|
|
sf_lambda,
|
|
sf_defcomp,
|
|
defcomp_kwarg,
|
|
parse_comp_params,
|
|
sf_defisland,
|
|
sf_defmacro,
|
|
parse_macro_params,
|
|
qq_expand,
|
|
sf_letrec,
|
|
step_sf_letrec,
|
|
sf_dynamic_wind,
|
|
sf_scope,
|
|
sf_provide,
|
|
expand_macro,
|
|
cek_run,
|
|
cek_step,
|
|
step_eval,
|
|
step_eval_list,
|
|
step_sf_if,
|
|
step_sf_when,
|
|
step_sf_begin,
|
|
step_sf_let,
|
|
step_sf_define,
|
|
step_sf_set_b,
|
|
step_sf_and,
|
|
step_sf_or,
|
|
step_sf_cond,
|
|
step_sf_case,
|
|
step_sf_thread_first,
|
|
step_sf_lambda,
|
|
step_sf_scope,
|
|
step_sf_provide,
|
|
step_sf_context,
|
|
step_sf_emit,
|
|
step_sf_emitted,
|
|
step_sf_reset,
|
|
step_sf_shift,
|
|
step_sf_deref,
|
|
cek_call,
|
|
reactive_shift_deref,
|
|
step_eval_call,
|
|
ho_form_name_p,
|
|
ho_fn_p,
|
|
ho_swap_args,
|
|
ho_setup_dispatch,
|
|
step_ho_map,
|
|
step_ho_map_indexed,
|
|
step_ho_filter,
|
|
step_ho_reduce,
|
|
step_ho_some,
|
|
step_ho_every,
|
|
step_ho_for_each,
|
|
step_continue,
|
|
continue_with_call,
|
|
sf_case_step_loop,
|
|
eval_expr_cek,
|
|
trampoline_cek,
|
|
eval_expr,
|
|
cek_run_iterative],
|
|
"Sx_ref");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 9097 "../lib/.sx.objs/jsoo/default/sx.cma.js"
|
|
//# shape: Sx_vm:[N,N,F(1)*,F(1)*,F(2),F(1),F(1),F(1),F(1),F(1),F(1)*,N,N,N,F(1),F(1),F(3),F(1),F(3),F(3),F(1),F(2),F(2)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_check_bound = runtime.caml_check_bound,
|
|
caml_make_vect = runtime.caml_make_vect,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_ml_string_length = runtime.caml_ml_string_length,
|
|
caml_wrap_exception = runtime.caml_wrap_exception;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
function caml_call3(f, a0, a1, a2){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 3
|
|
? f(a0, a1, a2)
|
|
: runtime.caml_call_gen(f, [a0, a1, a2]);
|
|
}
|
|
function caml_call8(f, a0, a1, a2, a3, a4, a5, a6, a7){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 8
|
|
? f(a0, a1, a2, a3, a4, a5, a6, a7)
|
|
: runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6, a7]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Sx_ref = global_data.Sx_ref,
|
|
Sx_runtime = global_data.Sx_runtime,
|
|
Stdlib = global_data.Stdlib,
|
|
Sx_types = global_data.Sx_types,
|
|
Sx_primitives = global_data.Sx_primitives,
|
|
Stdlib_Hashtbl = global_data.Stdlib__Hashtbl,
|
|
Stdlib_List = global_data.Stdlib__List,
|
|
Stdlib_String = global_data.Stdlib__String,
|
|
Stdlib_Printf = global_data.Stdlib__Printf,
|
|
Stdlib_Array = global_data.Stdlib__Array,
|
|
Stdlib_Printexc = global_data.Stdlib__Printexc,
|
|
jit_compile_ref = [0, function(a, param){return 0;}],
|
|
jit_failed_sentinel =
|
|
[0,
|
|
[0, -1, 0, [0], [0]],
|
|
[0],
|
|
[0, "__jit_failed__"],
|
|
Stdlib_Hashtbl[1].call(null, 0, 0),
|
|
0];
|
|
function is_jit_failed(cl){return -1 === cl[1][1] ? 1 : 0;}
|
|
function create(globals){
|
|
return [0, caml_make_vect(4096, 0), 0, 0, globals];
|
|
}
|
|
function push(vm, v){
|
|
if(vm[1].length - 1 <= vm[2]){
|
|
var ns = caml_make_vect(vm[2] * 2 | 0, 0);
|
|
Stdlib_Array[9].call(null, vm[1], 0, ns, 0, vm[2]);
|
|
vm[1] = ns;
|
|
}
|
|
var a = vm[2];
|
|
caml_check_bound(vm[1], a)[a + 1] = v;
|
|
vm[2] = vm[2] + 1 | 0;
|
|
return 0;
|
|
}
|
|
function pop(vm){
|
|
vm[2] = vm[2] - 1 | 0;
|
|
var a = vm[2];
|
|
return caml_check_bound(vm[1], a)[a + 1];
|
|
}
|
|
function peek(vm){
|
|
var a = vm[2] - 1 | 0;
|
|
return caml_check_bound(vm[1], a)[a + 1];
|
|
}
|
|
function read_u8(f){
|
|
var a = f[2], v = caml_check_bound(f[1][1][3], a)[a + 1];
|
|
f[2] = f[2] + 1 | 0;
|
|
return v;
|
|
}
|
|
function read_u16(f){
|
|
var
|
|
a = f[2],
|
|
lo = caml_check_bound(f[1][1][3], a)[a + 1],
|
|
b = f[2] + 1 | 0,
|
|
hi = caml_check_bound(f[1][1][3], b)[b + 1];
|
|
f[2] = f[2] + 2 | 0;
|
|
return lo | hi << 8;
|
|
}
|
|
function read_i16(f){
|
|
var v = read_u16(f);
|
|
return 32768 <= v ? v - 65536 | 0 : v;
|
|
}
|
|
function closure_to_value(cl){
|
|
var match = cl[3];
|
|
function a(args){
|
|
var
|
|
a = Stdlib_List[20].call(null, Sx_runtime[2], args),
|
|
b = Stdlib_String[7].call(null, ",", a),
|
|
c = Stdlib[28].call(null, "VM_CLOSURE_CALL:", b);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], c], 1);
|
|
}
|
|
if(match) var n = match[1], n$0 = n; else var n$0 = "anon";
|
|
return [13, Stdlib[28].call(null, "vm:", n$0), a];
|
|
}
|
|
var vm_insn_count = [0, 0], vm_call_count = [0, 0], vm_cek_count = [0, 0];
|
|
function vm_reset_counters(param){
|
|
vm_insn_count[1] = 0;
|
|
vm_call_count[1] = 0;
|
|
vm_cek_count[1] = 0;
|
|
return 0;
|
|
}
|
|
var
|
|
b =
|
|
[0,
|
|
[11,
|
|
"[vm-perf] insns=",
|
|
[4,
|
|
0,
|
|
0,
|
|
0,
|
|
[11,
|
|
" calls=",
|
|
[4,
|
|
0,
|
|
0,
|
|
0,
|
|
[11, " cek_fallbacks=", [4, 0, 0, 0, [12, 10, [10, 0]]]]]]]],
|
|
"[vm-perf] insns=%d calls=%d cek_fallbacks=%d\n%!"];
|
|
function vm_report_counters(param){
|
|
var a = vm_cek_count[1], c = vm_call_count[1], d = vm_insn_count[1];
|
|
return caml_call3(Stdlib_Printf[3].call(null, b), d, c, a);
|
|
}
|
|
function push_closure_frame(vm, cl, args){
|
|
var c = Stdlib_Hashtbl[1].call(null, 0, 4), frame = [0, cl, 0, vm[2], c];
|
|
Stdlib_List[18].call(null, function(a){return push(vm, a);}, args);
|
|
var a = Stdlib_List[1].call(null, args), b = cl[1][2] - 1 | 0;
|
|
if(b >= a){
|
|
var for$ = a;
|
|
for(;;){
|
|
push(vm, 0);
|
|
var d = for$ + 1 | 0;
|
|
if(b === for$) break;
|
|
for$ = d;
|
|
}
|
|
}
|
|
vm[3] = [0, frame, vm[3]];
|
|
return 0;
|
|
}
|
|
var cst_bytecode = "bytecode";
|
|
function code_from_value(v){
|
|
if(typeof v !== "number" && 6 === v[0]){
|
|
var d = v[1], match = Stdlib_Hashtbl[7].call(null, d, cst_bytecode);
|
|
a:
|
|
{
|
|
b:
|
|
if(match){
|
|
var a = match[1];
|
|
if(typeof a !== "number"){
|
|
switch(a[0]){
|
|
case 5:
|
|
var l$0 = a[1]; break;
|
|
case 19:
|
|
var l$0 = a[1][1]; break;
|
|
default: break b;
|
|
}
|
|
var
|
|
c =
|
|
Stdlib_List[20].call
|
|
(null,
|
|
function(x){
|
|
if(typeof x !== "number" && 1 === x[0]){var n = x[1]; return n | 0;}
|
|
return 0;
|
|
},
|
|
l$0),
|
|
bc_list = Stdlib_Array[11].call(null, c);
|
|
break a;
|
|
}
|
|
}
|
|
var bc_list = [0];
|
|
}
|
|
var match$0 = Stdlib_Hashtbl[7].call(null, d, "constants");
|
|
a:
|
|
{
|
|
b:
|
|
if(match$0){
|
|
var b = match$0[1];
|
|
if(typeof b !== "number"){
|
|
switch(b[0]){
|
|
case 5:
|
|
var l = b[1]; break;
|
|
case 19:
|
|
var l = b[1][1]; break;
|
|
default: break b;
|
|
}
|
|
var entries = Stdlib_Array[11].call(null, l);
|
|
break a;
|
|
}
|
|
}
|
|
var entries = [0];
|
|
}
|
|
var
|
|
constants =
|
|
Stdlib_Array[14].call
|
|
(null,
|
|
function(entry){
|
|
if(typeof entry !== "number" && 6 === entry[0]){
|
|
var ed = entry[1];
|
|
if(Stdlib_Hashtbl[9].call(null, ed, cst_bytecode)) return entry;
|
|
}
|
|
return entry;
|
|
},
|
|
entries),
|
|
match$1 = Stdlib_Hashtbl[7].call(null, d, "arity");
|
|
a:
|
|
{
|
|
if(match$1){
|
|
var match$2 = match$1[1];
|
|
if(typeof match$2 !== "number" && 1 === match$2[0]){var n = match$2[1], arity = n | 0; break a;}
|
|
}
|
|
var arity = 0;
|
|
}
|
|
return [0, arity, arity + 16 | 0, bc_list, constants];
|
|
}
|
|
return [0, 0, 16, [0], [0]];
|
|
}
|
|
function call_closure(cl, args, globals){
|
|
vm_call_count[1]++;
|
|
var vm = create(globals);
|
|
push_closure_frame(vm, cl, args);
|
|
try{run(vm);}
|
|
catch(e$0){
|
|
var e = caml_wrap_exception(e$0);
|
|
throw caml_maybe_attach_backtrace(e, 0);
|
|
}
|
|
return pop(vm);
|
|
}
|
|
function vm_call(vm, f, args){
|
|
if(typeof f !== "number")
|
|
switch(f[0]){
|
|
case 7:
|
|
var l = f[1], match = l[5];
|
|
if(match){
|
|
var cl = match[1];
|
|
if(is_jit_failed(cl))
|
|
return push(vm, Sx_ref[108].call(null, f, [5, args]));
|
|
try{var c = push(vm, call_closure(cl, args, cl[4])); return c;}
|
|
catch(exn){return push(vm, Sx_ref[108].call(null, f, [5, args]));}
|
|
}
|
|
if(0 === l[4]) return push(vm, Sx_ref[108].call(null, f, [5, args]));
|
|
l[5] = [0, jit_failed_sentinel];
|
|
var match$0 = caml_call2(jit_compile_ref[1], l, vm[4]);
|
|
if(! match$0) return push(vm, Sx_ref[108].call(null, f, [5, args]));
|
|
var cl$0 = match$0[1];
|
|
l[5] = [0, cl$0];
|
|
try{var d = push(vm, call_closure(cl$0, args, cl$0[4])); return d;}
|
|
catch(exn){
|
|
l[5] = [0, jit_failed_sentinel];
|
|
return push(vm, Sx_ref[108].call(null, f, [5, args]));
|
|
}
|
|
case 13:
|
|
var fn = f[2], result$0 = caml_call1(fn, args);
|
|
return push(vm, result$0);
|
|
case 22:
|
|
var cl$1 = f[1]; return push_closure_frame(vm, cl$1, args);
|
|
case 8:
|
|
case 9:
|
|
vm_cek_count[1]++;
|
|
var result = Sx_ref[108].call(null, f, [5, args]);
|
|
return push(vm, result);
|
|
}
|
|
var
|
|
a = Sx_runtime[2].call(null, f),
|
|
b = Stdlib[28].call(null, "VM: not callable: ", a);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
|
|
}
|
|
var
|
|
cst_at_ip = " at ip=",
|
|
cst_sp = " sp=",
|
|
a = [5, 0],
|
|
c =
|
|
[0,
|
|
[11,
|
|
"VM: ",
|
|
[2,
|
|
0,
|
|
[11,
|
|
cst_at_ip,
|
|
[4,
|
|
0,
|
|
0,
|
|
0,
|
|
[11,
|
|
" op=",
|
|
[4,
|
|
0,
|
|
0,
|
|
0,
|
|
[11,
|
|
" in ",
|
|
[2,
|
|
0,
|
|
[11,
|
|
" (base=",
|
|
[4,
|
|
0,
|
|
0,
|
|
0,
|
|
[11,
|
|
cst_sp,
|
|
[4,
|
|
0,
|
|
0,
|
|
0,
|
|
[11,
|
|
" bc_len=",
|
|
[4, 0, 0, 0, [11, " consts=", [4, 0, 0, 0, [12, 41, 0]]]]]]]]]]]]]]]]],
|
|
"VM: %s at ip=%d op=%d in %s (base=%d sp=%d bc_len=%d consts=%d)"],
|
|
d =
|
|
[0,
|
|
[11,
|
|
"VM: unknown opcode ",
|
|
[4, 0, 0, 0, [11, cst_at_ip, [4, 0, 0, 0, 0]]]],
|
|
"VM: unknown opcode %d at ip=%d"],
|
|
e = [1, 0.],
|
|
f =
|
|
[0,
|
|
[11,
|
|
"VM: CONST index ",
|
|
[4,
|
|
0,
|
|
0,
|
|
0,
|
|
[11, " out of bounds (pool size ", [4, 0, 0, 0, [12, 41, 0]]]]],
|
|
"VM: CONST index %d out of bounds (pool size %d)"],
|
|
g = [0, 1],
|
|
h = [0, 0],
|
|
i =
|
|
[0,
|
|
[11,
|
|
"VM: LOCAL_GET slot=",
|
|
[4,
|
|
0,
|
|
0,
|
|
0,
|
|
[11,
|
|
" base=",
|
|
[4, 0, 0, 0, [11, cst_sp, [4, 0, 0, 0, [11, " out of bounds", 0]]]]]]],
|
|
"VM: LOCAL_GET slot=%d base=%d sp=%d out of bounds"],
|
|
j =
|
|
[0,
|
|
[11,
|
|
"VM: UPVALUE_GET idx=",
|
|
[4, 0, 0, 0, [11, " out of bounds (have ", [4, 0, 0, 0, [12, 41, 0]]]]],
|
|
"VM: UPVALUE_GET idx=%d out of bounds (have %d)"],
|
|
k =
|
|
[0,
|
|
[11,
|
|
"VM: CLOSURE idx ",
|
|
[4, 0, 0, 0, [11, " >= consts ", [4, 0, 0, 0, 0]]]],
|
|
"VM: CLOSURE idx %d >= consts %d"],
|
|
l =
|
|
[0,
|
|
[2,
|
|
0,
|
|
[11,
|
|
' (in CALL_PRIM "',
|
|
[2, 0, [11, '" with ', [4, 0, 0, 0, [11, " args)", 0]]]]]],
|
|
'%s (in CALL_PRIM "%s" with %d args)'];
|
|
function run(vm){
|
|
for(;;){
|
|
if(0 === vm[3]) return 0;
|
|
var match = vm[3];
|
|
if(match){
|
|
var
|
|
rest_frames = match[2],
|
|
frame = match[1],
|
|
bc = frame[1][1][3],
|
|
consts = frame[1][1][4];
|
|
if(bc.length - 1 <= frame[2])
|
|
vm[3] = 0;
|
|
else{
|
|
var
|
|
saved_ip = frame[2],
|
|
z = frame[2],
|
|
op = caml_check_bound(bc, z)[z + 1];
|
|
frame[2] = frame[2] + 1 | 0;
|
|
try{
|
|
a:
|
|
{
|
|
var cst = "";
|
|
if(66 <= op){
|
|
var switcher = op - 128 | 0;
|
|
if(47 >= switcher >>> 0){
|
|
var cst$0 = "-";
|
|
switch(switcher){
|
|
case 0:
|
|
var
|
|
idx = read_u16(frame),
|
|
match$1 = caml_check_bound(consts, idx)[idx + 1];
|
|
if(typeof match$1 === "number" || ! (2 === match$1[0]))
|
|
var name = cst;
|
|
else
|
|
var s = match$1[1], name = s;
|
|
var v = peek(vm);
|
|
Stdlib_Hashtbl[11].call(null, vm[4], name, v);
|
|
break a;
|
|
case 16:
|
|
var
|
|
count = read_u8(frame),
|
|
R =
|
|
Stdlib_List[11].call
|
|
(null, count, function(param){return pop(vm);}),
|
|
parts = Stdlib_List[10].call(null, R),
|
|
S = Stdlib_List[20].call(null, Sx_runtime[2], parts),
|
|
s$0 = Stdlib_String[7].call(null, cst, S);
|
|
push(vm, [2, s$0]);
|
|
break a;
|
|
case 32:
|
|
var b = pop(vm), a$0 = pop(vm);
|
|
b:
|
|
{
|
|
if
|
|
(typeof a$0 !== "number"
|
|
&& 1 === a$0[0] && typeof b !== "number" && 1 === b[0]){var y = b[1], x = a$0[1], A = [1, x + y]; break b;}
|
|
var
|
|
A =
|
|
caml_call1
|
|
(Stdlib_Hashtbl[6].call(null, Sx_primitives[1], "+"),
|
|
[0, a$0, [0, b, 0]]);
|
|
}
|
|
push(vm, A);
|
|
break a;
|
|
case 33:
|
|
var b$0 = pop(vm), a$1 = pop(vm);
|
|
b:
|
|
{
|
|
if
|
|
(typeof a$1 !== "number"
|
|
&& 1 === a$1[0] && typeof b$0 !== "number" && 1 === b$0[0]){
|
|
var y$0 = b$0[1], x$0 = a$1[1], B = [1, x$0 - y$0];
|
|
break b;
|
|
}
|
|
var
|
|
B =
|
|
caml_call1
|
|
(Stdlib_Hashtbl[6].call(null, Sx_primitives[1], cst$0),
|
|
[0, a$1, [0, b$0, 0]]);
|
|
}
|
|
push(vm, B);
|
|
break a;
|
|
case 34:
|
|
var b$1 = pop(vm), a$2 = pop(vm);
|
|
b:
|
|
{
|
|
if
|
|
(typeof a$2 !== "number"
|
|
&& 1 === a$2[0] && typeof b$1 !== "number" && 1 === b$1[0]){
|
|
var y$1 = b$1[1], x$1 = a$2[1], C = [1, x$1 * y$1];
|
|
break b;
|
|
}
|
|
var
|
|
C =
|
|
caml_call1
|
|
(Stdlib_Hashtbl[6].call(null, Sx_primitives[1], "*"),
|
|
[0, a$2, [0, b$1, 0]]);
|
|
}
|
|
push(vm, C);
|
|
break a;
|
|
case 35:
|
|
var b$2 = pop(vm), a$3 = pop(vm);
|
|
b:
|
|
{
|
|
if
|
|
(typeof a$3 !== "number"
|
|
&& 1 === a$3[0] && typeof b$2 !== "number" && 1 === b$2[0]){
|
|
var y$2 = b$2[1], x$2 = a$3[1], D = [1, x$2 / y$2];
|
|
break b;
|
|
}
|
|
var
|
|
D =
|
|
caml_call1
|
|
(Stdlib_Hashtbl[6].call(null, Sx_primitives[1], "/"),
|
|
[0, a$3, [0, b$2, 0]]);
|
|
}
|
|
push(vm, D);
|
|
break a;
|
|
case 36:
|
|
var
|
|
b$3 = pop(vm),
|
|
a$4 = pop(vm),
|
|
norm =
|
|
function(v){
|
|
if(typeof v !== "number")
|
|
switch(v[0]){
|
|
case 5:
|
|
var l = v[1];
|
|
return [5, Stdlib_List[20].call(null, norm$0, l)];
|
|
case 19:
|
|
var l$0 = v[1][1];
|
|
return [5, Stdlib_List[20].call(null, norm$0, l$0)];
|
|
}
|
|
return v;
|
|
};
|
|
let norm$0 = norm;
|
|
var T = norm(b$3);
|
|
push(vm, [0, runtime.caml_equal(norm(a$4), T)]);
|
|
break a;
|
|
case 37:
|
|
var b$4 = pop(vm), a$5 = pop(vm);
|
|
b:
|
|
{
|
|
if(typeof a$5 !== "number")
|
|
switch(a$5[0]){
|
|
case 1:
|
|
if(typeof b$4 !== "number" && 1 === b$4[0]){
|
|
var y$3 = b$4[1], x$3 = a$5[1], u = [0, x$3 < y$3 ? 1 : 0];
|
|
break b;
|
|
}
|
|
break;
|
|
case 2:
|
|
if(typeof b$4 !== "number" && 2 === b$4[0]){
|
|
var
|
|
y$4 = b$4[1],
|
|
x$4 = a$5[1],
|
|
u = [0, runtime.caml_string_lessthan(x$4, y$4)];
|
|
break b;
|
|
}
|
|
break;
|
|
}
|
|
var
|
|
u =
|
|
caml_call1
|
|
(Stdlib_Hashtbl[6].call(null, Sx_primitives[1], "<"),
|
|
[0, a$5, [0, b$4, 0]]);
|
|
}
|
|
push(vm, u);
|
|
break a;
|
|
case 38:
|
|
var b$5 = pop(vm), a$6 = pop(vm);
|
|
b:
|
|
{
|
|
if(typeof a$6 !== "number")
|
|
switch(a$6[0]){
|
|
case 1:
|
|
if(typeof b$5 !== "number" && 1 === b$5[0]){
|
|
var y$5 = b$5[1], x$5 = a$6[1], w = [0, y$5 < x$5 ? 1 : 0];
|
|
break b;
|
|
}
|
|
break;
|
|
case 2:
|
|
if(typeof b$5 !== "number" && 2 === b$5[0]){
|
|
var
|
|
y$6 = b$5[1],
|
|
x$6 = a$6[1],
|
|
w = [0, runtime.caml_string_greaterthan(x$6, y$6)];
|
|
break b;
|
|
}
|
|
break;
|
|
}
|
|
var
|
|
w =
|
|
caml_call1
|
|
(Stdlib_Hashtbl[6].call(null, Sx_primitives[1], ">"),
|
|
[0, a$6, [0, b$5, 0]]);
|
|
}
|
|
push(vm, w);
|
|
break a;
|
|
case 39:
|
|
var v$0 = pop(vm);
|
|
push(vm, [0, 1 - Sx_types[40].call(null, v$0)]);
|
|
break a;
|
|
case 40:
|
|
var v$1 = pop(vm);
|
|
b:
|
|
if(typeof v$1 === "number")
|
|
var m = e;
|
|
else{
|
|
switch(v$1[0]){
|
|
case 2:
|
|
var s$1 = v$1[1], m = [1, caml_ml_string_length(s$1)];
|
|
break b;
|
|
case 5:
|
|
var l$0 = v$1[1]; break;
|
|
case 6:
|
|
var
|
|
d$0 = v$1[1],
|
|
m = [1, Stdlib_Hashtbl[15].call(null, d$0)];
|
|
break b;
|
|
case 19:
|
|
var l$0 = v$1[1][1]; break;
|
|
default:
|
|
var
|
|
m =
|
|
caml_call1
|
|
(Stdlib_Hashtbl[6].call(null, Sx_primitives[1], "len"),
|
|
[0, v$1, 0]);
|
|
break b;
|
|
}
|
|
var m = [1, Stdlib_List[1].call(null, l$0)];
|
|
}
|
|
push(vm, m);
|
|
break a;
|
|
case 41:
|
|
var v$2 = pop(vm);
|
|
b:
|
|
{
|
|
if(typeof v$2 !== "number")
|
|
switch(v$2[0]){
|
|
case 5:
|
|
var E = v$2[1]; if(E){var r = E[1]; break b;} break;
|
|
case 19:
|
|
var F = v$2[1][1]; if(F){var r = F[1]; break b;} break;
|
|
default:
|
|
var
|
|
r =
|
|
caml_call1
|
|
(Stdlib_Hashtbl[6].call(null, Sx_primitives[1], "first"),
|
|
[0, v$2, 0]);
|
|
break b;
|
|
}
|
|
var r = 0;
|
|
}
|
|
push(vm, r);
|
|
break a;
|
|
case 42:
|
|
var v$3 = pop(vm);
|
|
b:
|
|
if(typeof v$3 === "number")
|
|
var o = a;
|
|
else{
|
|
switch(v$3[0]){
|
|
case 5:
|
|
var G = v$3[1];
|
|
if(! G){var o = a; break b;}
|
|
var xs = G[2];
|
|
break;
|
|
case 19:
|
|
var H = v$3[1][1];
|
|
if(! H){var o = a; break b;}
|
|
var xs = H[2];
|
|
break;
|
|
default:
|
|
var
|
|
o =
|
|
caml_call1
|
|
(Stdlib_Hashtbl[6].call(null, Sx_primitives[1], "rest"),
|
|
[0, v$3, 0]);
|
|
break b;
|
|
}
|
|
var o = [5, xs];
|
|
}
|
|
push(vm, o);
|
|
break a;
|
|
case 43:
|
|
var n$0 = pop(vm), coll = pop(vm);
|
|
b:
|
|
{
|
|
c:
|
|
if(typeof coll !== "number"){
|
|
switch(coll[0]){
|
|
case 2:
|
|
if(typeof n$0 === "number") break c;
|
|
if(1 !== n$0[0]) break c;
|
|
var f$0 = n$0[1], s$2 = coll[1], i$0 = f$0 | 0;
|
|
if(0 <= i$0 && i$0 < caml_ml_string_length(s$2)){
|
|
var
|
|
U = runtime.caml_string_get(s$2, i$0),
|
|
q = [2, Stdlib_String[1].call(null, 1, U)];
|
|
break b;
|
|
}
|
|
var q = 0;
|
|
break b;
|
|
case 5:
|
|
var l$1 = coll[1]; break;
|
|
case 19:
|
|
var l$1 = coll[1][1]; break;
|
|
default: break c;
|
|
}
|
|
if(typeof n$0 !== "number" && 1 === n$0[0]){
|
|
var f$1 = n$0[1];
|
|
try{
|
|
var V = Stdlib_List[8].call(null, l$1, f$1 | 0), q = V;
|
|
break b;
|
|
}
|
|
catch(exn){var q = 0; break b;}
|
|
}
|
|
}
|
|
var
|
|
q =
|
|
caml_call1
|
|
(Stdlib_Hashtbl[6].call(null, Sx_primitives[1], "nth"),
|
|
[0, coll, [0, n$0, 0]]);
|
|
}
|
|
push(vm, q);
|
|
break a;
|
|
case 44:
|
|
var coll$0 = pop(vm), x$7 = pop(vm);
|
|
if(typeof coll$0 === "number")
|
|
var t = [5, [0, x$7, 0]];
|
|
else
|
|
switch(coll$0[0]){
|
|
case 5:
|
|
var l$2 = coll$0[1], t = [5, [0, x$7, l$2]]; break;
|
|
case 19:
|
|
var l$3 = coll$0[1][1], t = [5, [0, x$7, l$3]]; break;
|
|
default:
|
|
var
|
|
t =
|
|
caml_call1
|
|
(Stdlib_Hashtbl[6].call(null, Sx_primitives[1], "cons"),
|
|
[0, x$7, [0, coll$0, 0]]);
|
|
}
|
|
push(vm, t);
|
|
break a;
|
|
case 45:
|
|
var v$4 = pop(vm);
|
|
b:
|
|
{
|
|
if(typeof v$4 !== "number" && 1 === v$4[0]){var x$8 = v$4[1], I = [1, - x$8]; break b;
|
|
}
|
|
var
|
|
I =
|
|
caml_call1
|
|
(Stdlib_Hashtbl[6].call(null, Sx_primitives[1], cst$0),
|
|
[0, v$4, 0]);
|
|
}
|
|
push(vm, I);
|
|
break a;
|
|
case 46:
|
|
var v$5 = pop(vm);
|
|
b:
|
|
{
|
|
if(typeof v$5 !== "number" && 1 === v$5[0]){
|
|
var x$9 = v$5[1], J = [1, x$9 + 1.];
|
|
break b;
|
|
}
|
|
var
|
|
J =
|
|
caml_call1
|
|
(Stdlib_Hashtbl[6].call(null, Sx_primitives[1], "inc"),
|
|
[0, v$5, 0]);
|
|
}
|
|
push(vm, J);
|
|
break a;
|
|
case 47:
|
|
var v$6 = pop(vm);
|
|
b:
|
|
{
|
|
if(typeof v$6 !== "number" && 1 === v$6[0]){
|
|
var x$10 = v$6[1], K = [1, x$10 - 1.];
|
|
break b;
|
|
}
|
|
var
|
|
K =
|
|
caml_call1
|
|
(Stdlib_Hashtbl[6].call(null, Sx_primitives[1], "dec"),
|
|
[0, v$6, 0]);
|
|
}
|
|
push(vm, K);
|
|
break a;
|
|
}
|
|
}
|
|
}
|
|
else if(0 < op)
|
|
switch(op - 1 | 0){
|
|
case 0:
|
|
var idx$0 = read_u16(frame);
|
|
if(consts.length - 1 <= idx$0){
|
|
var
|
|
W =
|
|
caml_call2
|
|
(Stdlib_Printf[4].call(null, f), idx$0, consts.length - 1);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], W], 1);
|
|
}
|
|
push(vm, caml_check_bound(consts, idx$0)[idx$0 + 1]);
|
|
break a;
|
|
case 1:
|
|
push(vm, 0); break a;
|
|
case 2:
|
|
push(vm, g); break a;
|
|
case 3:
|
|
push(vm, h); break a;
|
|
case 4:
|
|
pop(vm); break a;
|
|
case 5:
|
|
push(vm, peek(vm)); break a;
|
|
case 15:
|
|
var
|
|
slot = read_u8(frame),
|
|
match$2 = Stdlib_Hashtbl[7].call(null, frame[4], slot);
|
|
if(match$2)
|
|
var cell = match$2[1], v$7 = cell[1];
|
|
else{
|
|
var idx$1 = frame[3] + slot | 0;
|
|
if(vm[2] <= idx$1){
|
|
var
|
|
X = vm[2],
|
|
Y = frame[3],
|
|
Z = caml_call3(Stdlib_Printf[4].call(null, i), slot, Y, X);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], Z], 1);
|
|
}
|
|
var v$7 = caml_check_bound(vm[1], idx$1)[idx$1 + 1];
|
|
}
|
|
push(vm, v$7);
|
|
break a;
|
|
case 16:
|
|
var
|
|
slot$0 = read_u8(frame),
|
|
v$8 = peek(vm),
|
|
match$3 = Stdlib_Hashtbl[7].call(null, frame[4], slot$0);
|
|
if(match$3){var cell$0 = match$3[1]; cell$0[1] = v$8; break a;}
|
|
var L = frame[3] + slot$0 | 0;
|
|
caml_check_bound(vm[1], L)[L + 1] = v$8;
|
|
break a;
|
|
case 17:
|
|
var idx$2 = read_u8(frame);
|
|
if(frame[1][2].length - 1 <= idx$2){
|
|
var
|
|
_ = frame[1][2].length - 1,
|
|
$ = caml_call2(Stdlib_Printf[4].call(null, j), idx$2, _);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], $], 1);
|
|
}
|
|
push(vm, caml_check_bound(frame[1][2], idx$2)[idx$2 + 1][1]);
|
|
break a;
|
|
case 18:
|
|
var idx$3 = read_u8(frame), aa = peek(vm);
|
|
caml_check_bound(frame[1][2], idx$3)[idx$3 + 1][1] = aa;
|
|
break a;
|
|
case 19:
|
|
var
|
|
idx$4 = read_u16(frame),
|
|
match$4 = caml_check_bound(consts, idx$4)[idx$4 + 1];
|
|
if(typeof match$4 === "number" || ! (2 === match$4[0]))
|
|
var name$0 = cst;
|
|
else
|
|
var s$3 = match$4[1], name$0 = s$3;
|
|
try{
|
|
var ag = Stdlib_Hashtbl[6].call(null, vm[4], name$0), v$9 = ag;
|
|
}
|
|
catch(exn){
|
|
var exn$0 = caml_wrap_exception(exn);
|
|
if(exn$0 !== Stdlib[8])
|
|
throw caml_maybe_attach_backtrace(exn$0, 0);
|
|
var
|
|
id = Sx_types[4].call(null, name$0),
|
|
match$6 = frame[1][5],
|
|
cst_VM_undefined = "VM undefined: ";
|
|
if(match$6){
|
|
var env = match$6[1], e$0 = env;
|
|
for(;;)
|
|
try{
|
|
var ad = Stdlib_Hashtbl[6].call(null, e$0[1], id), v$9 = ad;
|
|
break;
|
|
}
|
|
catch(exn){
|
|
var exn$1 = caml_wrap_exception(exn);
|
|
if(exn$1 !== Stdlib[8])
|
|
throw caml_maybe_attach_backtrace(exn$1, 0);
|
|
var match$5 = e$0[2];
|
|
if(! match$5)
|
|
try{
|
|
var ac = Sx_primitives[6].call(null, name$0), v$9 = ac;
|
|
break;
|
|
}
|
|
catch(exn){
|
|
var ab = Stdlib[28].call(null, cst_VM_undefined, name$0);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], ab], 1);
|
|
}
|
|
var p = match$5[1];
|
|
e$0 = p;
|
|
}
|
|
}
|
|
else
|
|
try{var af = Sx_primitives[6].call(null, name$0), v$9 = af;}
|
|
catch(exn){
|
|
var ae = Stdlib[28].call(null, cst_VM_undefined, name$0);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], ae], 1);
|
|
}
|
|
}
|
|
push(vm, v$9);
|
|
break a;
|
|
case 20:
|
|
var
|
|
idx$5 = read_u16(frame),
|
|
match$7 = caml_check_bound(consts, idx$5)[idx$5 + 1];
|
|
if(typeof match$7 === "number" || ! (2 === match$7[0]))
|
|
var name$1 = cst;
|
|
else
|
|
var s$4 = match$7[1], name$1 = s$4;
|
|
var match$8 = frame[1][5];
|
|
if(match$8){
|
|
var
|
|
env$0 = match$8[1],
|
|
id$0 = Sx_types[4].call(null, name$1),
|
|
e$1 = env$0;
|
|
for(;;){
|
|
if(Stdlib_Hashtbl[9].call(null, e$1[1], id$0)){
|
|
var ah = peek(vm);
|
|
Stdlib_Hashtbl[11].call(null, e$1[1], id$0, ah);
|
|
var written = 1;
|
|
break;
|
|
}
|
|
var match$9 = e$1[2];
|
|
if(! match$9){var written = 0; break;}
|
|
var p$0 = match$9[1];
|
|
e$1 = p$0;
|
|
}
|
|
}
|
|
else
|
|
var written = 0;
|
|
if(! (1 - written)) break a;
|
|
var ai = peek(vm);
|
|
Stdlib_Hashtbl[11].call(null, vm[4], name$1, ai);
|
|
break a;
|
|
case 31:
|
|
var offset = read_i16(frame);
|
|
frame[2] = frame[2] + offset | 0;
|
|
break a;
|
|
case 32:
|
|
var offset$0 = read_i16(frame), v$10 = pop(vm);
|
|
if(! (1 - Sx_types[40].call(null, v$10))) break a;
|
|
frame[2] = frame[2] + offset$0 | 0;
|
|
break a;
|
|
case 33:
|
|
var offset$1 = read_i16(frame), v$11 = pop(vm);
|
|
if(! Sx_types[40].call(null, v$11)) break a;
|
|
frame[2] = frame[2] + offset$1 | 0;
|
|
break a;
|
|
case 47:
|
|
var
|
|
argc = read_u8(frame),
|
|
args =
|
|
Stdlib_Array[1].call
|
|
(null, argc, function(param){return pop(vm);}),
|
|
f$2 = pop(vm),
|
|
aj = Stdlib_Array[10].call(null, args),
|
|
args_list = Stdlib_List[10].call(null, aj);
|
|
vm_call(vm, f$2, args_list);
|
|
break a;
|
|
case 48:
|
|
var
|
|
argc$0 = read_u8(frame),
|
|
args$0 =
|
|
Stdlib_Array[1].call
|
|
(null, argc$0, function(param){return pop(vm);}),
|
|
f$3 = pop(vm),
|
|
ak = Stdlib_Array[10].call(null, args$0),
|
|
args_list$0 = Stdlib_List[10].call(null, ak);
|
|
vm[3] = rest_frames;
|
|
vm[2] = frame[3];
|
|
vm_call(vm, f$3, args_list$0);
|
|
break a;
|
|
case 49:
|
|
var result = pop(vm);
|
|
vm[3] = rest_frames;
|
|
vm[2] = frame[3];
|
|
push(vm, result);
|
|
break a;
|
|
case 50:
|
|
var idx$6 = read_u16(frame);
|
|
if(consts.length - 1 <= idx$6){
|
|
var
|
|
al =
|
|
caml_call2
|
|
(Stdlib_Printf[4].call(null, k), idx$6, consts.length - 1);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], al], 1);
|
|
}
|
|
var
|
|
code_val = caml_check_bound(consts, idx$6)[idx$6 + 1],
|
|
code = code_from_value(code_val);
|
|
b:
|
|
{
|
|
if(typeof code_val !== "number" && 6 === code_val[0]){
|
|
var
|
|
d$1 = code_val[1],
|
|
match$10 = Stdlib_Hashtbl[7].call(null, d$1, "upvalue-count");
|
|
if(match$10){
|
|
var match$11 = match$10[1];
|
|
if(typeof match$11 !== "number" && 1 === match$11[0]){var n$1 = match$11[1], uv_count = n$1 | 0; break b;}
|
|
}
|
|
var uv_count = 0;
|
|
break b;
|
|
}
|
|
var uv_count = 0;
|
|
}
|
|
let frame$0 = frame;
|
|
var
|
|
upvalues =
|
|
Stdlib_Array[1].call
|
|
(null,
|
|
uv_count,
|
|
function(param){
|
|
var is_local = read_u8(frame$0), index = read_u8(frame$0);
|
|
if(1 !== is_local)
|
|
return caml_check_bound(frame$0[1][2], index)[index + 1];
|
|
var match = Stdlib_Hashtbl[7].call(null, frame$0[4], index);
|
|
if(match)
|
|
var existing = match[1], cell = existing;
|
|
else{
|
|
var
|
|
a = frame$0[3] + index | 0,
|
|
c = [0, caml_check_bound(vm[1], a)[a + 1]];
|
|
Stdlib_Hashtbl[11].call(null, frame$0[4], index, c);
|
|
var cell = c;
|
|
}
|
|
return cell;
|
|
}),
|
|
cl = [0, code, upvalues, 0, vm[4], 0];
|
|
push(vm, [22, cl]);
|
|
break a;
|
|
case 51:
|
|
var
|
|
idx$7 = read_u16(frame),
|
|
argc$1 = read_u8(frame),
|
|
match$12 = caml_check_bound(consts, idx$7)[idx$7 + 1];
|
|
if(typeof match$12 === "number" || ! (2 === match$12[0]))
|
|
var name$2 = cst;
|
|
else
|
|
var s$5 = match$12[1], name$2 = s$5;
|
|
var
|
|
am =
|
|
Stdlib_List[11].call
|
|
(null, argc$1, function(param){return pop(vm);}),
|
|
args$1 = Stdlib_List[10].call(null, am),
|
|
args$2 =
|
|
Stdlib_List[20].call
|
|
(null,
|
|
function(v){
|
|
if(typeof v !== "number" && 11 === v[0])
|
|
return caml_call1(Sx_primitives[3][1], v);
|
|
return v;
|
|
},
|
|
args$1);
|
|
try{
|
|
try{var aq = Sx_primitives[6].call(null, name$2), fn_val = aq;}
|
|
catch(exn){
|
|
try{
|
|
var
|
|
ap = Stdlib_Hashtbl[6].call(null, vm[4], name$2),
|
|
fn_val = ap;
|
|
}
|
|
catch(exn){
|
|
var exn$3 = caml_wrap_exception(exn);
|
|
if(exn$3 !== Stdlib[8])
|
|
throw caml_maybe_attach_backtrace(exn$3, 0);
|
|
var
|
|
ao = Stdlib[28].call(null, "VM: unknown primitive ", name$2);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], ao], 1);
|
|
}
|
|
}
|
|
b:
|
|
{
|
|
if(typeof fn_val !== "number" && 13 === fn_val[0]){
|
|
var fn = fn_val[2], result$0 = caml_call1(fn, args$2);
|
|
break b;
|
|
}
|
|
var result$0 = 0;
|
|
}
|
|
}
|
|
catch(exn){
|
|
var exn$2 = caml_wrap_exception(exn);
|
|
if(exn$2[1] !== Sx_types[7])
|
|
throw caml_maybe_attach_backtrace(exn$2, 0);
|
|
var
|
|
msg$0 = exn$2[2],
|
|
an =
|
|
caml_call3
|
|
(Stdlib_Printf[4].call(null, l), msg$0, name$2, argc$1);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], an], 1);
|
|
}
|
|
push(vm, result$0);
|
|
break a;
|
|
case 63:
|
|
var
|
|
count$0 = read_u16(frame),
|
|
ar =
|
|
Stdlib_List[11].call
|
|
(null, count$0, function(param){return pop(vm);}),
|
|
items = Stdlib_List[10].call(null, ar);
|
|
push(vm, [5, items]);
|
|
break a;
|
|
case 64:
|
|
var
|
|
count$1 = read_u16(frame),
|
|
d$2 = Stdlib_Hashtbl[1].call(null, 0, count$1);
|
|
if(count$1 >= 1){
|
|
var for$ = 1;
|
|
for(;;){
|
|
var v$12 = pop(vm), k$0 = pop(vm);
|
|
b:
|
|
{
|
|
if(typeof k$0 !== "number")
|
|
switch(k$0[0]){
|
|
case 2:
|
|
case 4:
|
|
var s$6 = k$0[1], key = s$6; break b;
|
|
}
|
|
var key = Sx_runtime[2].call(null, k$0);
|
|
}
|
|
Stdlib_Hashtbl[11].call(null, d$2, key, v$12);
|
|
var as = for$ + 1 | 0;
|
|
if(count$1 === for$) break;
|
|
for$ = as;
|
|
}
|
|
}
|
|
push(vm, [6, d$2]);
|
|
break a;
|
|
}
|
|
var
|
|
P = frame[2] - 1 | 0,
|
|
Q = caml_call2(Stdlib_Printf[4].call(null, d), op, P);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], Q], 1);
|
|
}
|
|
}
|
|
catch(exn$0){var exn = caml_wrap_exception(exn$0); break;}
|
|
}
|
|
}
|
|
}
|
|
if(exn[1] !== Stdlib[6]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var msg = exn[2], match$0 = frame[1][3];
|
|
if(match$0) var n = match$0[1], fn_name = n; else var fn_name = "?";
|
|
var
|
|
M = vm[2],
|
|
N = frame[3],
|
|
O =
|
|
caml_call8
|
|
(Stdlib_Printf[4].call(null, c),
|
|
msg,
|
|
saved_ip,
|
|
op,
|
|
fn_name,
|
|
N,
|
|
M,
|
|
bc.length - 1,
|
|
consts.length - 1);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], O], 1);
|
|
}
|
|
var m = [0, "module"];
|
|
function execute_module(code, globals){
|
|
var
|
|
cl = [0, code, [0], m, globals, 0],
|
|
vm = create(globals),
|
|
frame = [0, cl, 0, 0, Stdlib_Hashtbl[1].call(null, 0, 4)],
|
|
a = code[2] - 1 | 0;
|
|
if(a >= 0){
|
|
var for$ = 0;
|
|
for(;;){
|
|
push(vm, 0);
|
|
var b = for$ + 1 | 0;
|
|
if(a === for$) break;
|
|
for$ = b;
|
|
}
|
|
}
|
|
vm[3] = [0, frame, 0];
|
|
run(vm);
|
|
return pop(vm);
|
|
}
|
|
var
|
|
cst = ")\n",
|
|
cst$0 = ": ",
|
|
cst_jit_FAIL = "[jit] FAIL ",
|
|
n =
|
|
[0,
|
|
[11, cst_jit_FAIL, [2, 0, [11, cst$0, [2, 0, [12, 10, [10, 0]]]]]],
|
|
"[jit] FAIL %s: %s\n%!"],
|
|
o = [3, "fn"],
|
|
p = [3, "quote"],
|
|
q =
|
|
[0,
|
|
[11,
|
|
cst_jit_FAIL,
|
|
[2, 0, [11, ": compiler returned ", [2, 0, [12, 10, [10, 0]]]]]],
|
|
"[jit] FAIL %s: compiler returned %s\n%!"],
|
|
r =
|
|
[0,
|
|
[11,
|
|
cst_jit_FAIL,
|
|
[2,
|
|
0,
|
|
[11,
|
|
": closure index ",
|
|
[4,
|
|
0,
|
|
0,
|
|
0,
|
|
[11, " out of bounds (pool=", [4, 0, 0, 0, [11, cst, [10, 0]]]]]]]],
|
|
"[jit] FAIL %s: closure index %d out of bounds (pool=%d)\n%!"],
|
|
s =
|
|
[0,
|
|
[11,
|
|
"[jit] SKIP ",
|
|
[2,
|
|
0,
|
|
[11,
|
|
": non-closure execution failed (bc[0]=",
|
|
[4, 0, 0, 0, [11, ", len=", [4, 0, 0, 0, [11, cst, [10, 0]]]]]]]],
|
|
"[jit] SKIP %s: non-closure execution failed (bc[0]=%d, len=%d)\n%!"],
|
|
t =
|
|
[0,
|
|
[11,
|
|
"[jit] RESOLVED ",
|
|
[2,
|
|
0,
|
|
[11,
|
|
cst$0,
|
|
[2, 0, [11, " (bc[0]=", [4, 0, 0, 0, [11, cst, [10, 0]]]]]]]],
|
|
"[jit] RESOLVED %s: %s (bc[0]=%d)\n%!"],
|
|
u =
|
|
[0,
|
|
[11,
|
|
"[jit] ",
|
|
[2,
|
|
0,
|
|
[11,
|
|
": injected ",
|
|
[4, 0, 0, 0, [11, " closure bindings\n", [10, 0]]]]]],
|
|
"[jit] %s: injected %d closure bindings\n%!"];
|
|
function jit_compile_lambda(l, globals){
|
|
var match = l[4];
|
|
if(match) var n$0 = match[1], fn_name = n$0; else var fn_name = "<anon>";
|
|
try{
|
|
try{var compile_fn = Stdlib_Hashtbl[6].call(null, globals, "compile");}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn === Stdlib[8])
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "JIT: compiler not loaded"], 1);
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
}
|
|
var
|
|
param_syms =
|
|
[5, Stdlib_List[20].call(null, function(s){return [3, s];}, l[1])],
|
|
fn_expr = [5, [0, o, [0, param_syms, [0, l[2], 0]]]],
|
|
c = [18, Sx_types[9].call(null, 0)],
|
|
result =
|
|
Sx_ref[127].call
|
|
(null, [5, [0, compile_fn, [0, [5, [0, p, [0, fn_expr, 0]]], 0]]], c),
|
|
closure = l[3];
|
|
a:
|
|
{
|
|
if(0 === Stdlib_Hashtbl[15].call(null, closure[1]) && 0 === closure[2]){var effective_globals = globals; break a;}
|
|
var merged = Stdlib_Hashtbl[4].call(null, globals), env = closure;
|
|
for(;;){
|
|
Stdlib_Hashtbl[12].call
|
|
(null,
|
|
function(id, v){
|
|
var a = Sx_types[5].call(null, id);
|
|
return Stdlib_Hashtbl[11].call(null, merged, a, v);
|
|
},
|
|
env[1]);
|
|
var match$0 = env[2];
|
|
if(! match$0){
|
|
var
|
|
v = Stdlib_Hashtbl[15].call(null, globals),
|
|
n$1 = Stdlib_Hashtbl[15].call(null, merged) - v | 0;
|
|
if(0 < n$1){
|
|
caml_call2(Stdlib_Printf[3].call(null, u), fn_name, n$1);
|
|
var effective_globals = merged;
|
|
break;
|
|
}
|
|
var effective_globals = merged;
|
|
break;
|
|
}
|
|
var env$0 = match$0[1];
|
|
env = env$0;
|
|
}
|
|
}
|
|
a:
|
|
{
|
|
if(typeof result !== "number" && 6 === result[0]){
|
|
var d = result[1];
|
|
if(Stdlib_Hashtbl[9].call(null, d, cst_bytecode)){
|
|
var outer_code = code_from_value(result), bc = outer_code[3];
|
|
if(4 <= bc.length - 1 && 51 === caml_check_bound(bc, 0)[1]){
|
|
var
|
|
g = caml_check_bound(bc, 2)[3] << 8,
|
|
idx = caml_check_bound(bc, 1)[2] | g;
|
|
if(idx < outer_code[4].length - 1){
|
|
var
|
|
inner_val = caml_check_bound(outer_code[4], idx)[idx + 1],
|
|
code = code_from_value(inner_val),
|
|
a = [0, [0, code, [0], l[4], effective_globals, [0, l[3]]]];
|
|
break a;
|
|
}
|
|
var h = outer_code[4].length - 1;
|
|
caml_call3(Stdlib_Printf[3].call(null, r), fn_name, idx, h);
|
|
var a = 0;
|
|
break a;
|
|
}
|
|
try{
|
|
var
|
|
value = execute_module(outer_code, globals),
|
|
k = 0 < bc.length - 1 ? caml_check_bound(bc, 0)[1] : -1,
|
|
m = Sx_types[31].call(null, value);
|
|
caml_call3(Stdlib_Printf[3].call(null, t), fn_name, m, k);
|
|
var a = 0;
|
|
break a;
|
|
}
|
|
catch(exn){
|
|
var
|
|
i = bc.length - 1,
|
|
j = 0 < bc.length - 1 ? caml_check_bound(bc, 0)[1] : -1;
|
|
caml_call3(Stdlib_Printf[3].call(null, s), fn_name, j, i);
|
|
var a = 0;
|
|
break a;
|
|
}
|
|
}
|
|
}
|
|
var f = Sx_types[31].call(null, result);
|
|
caml_call2(Stdlib_Printf[3].call(null, q), fn_name, f);
|
|
var a = 0;
|
|
}
|
|
return a;
|
|
}
|
|
catch(e$0){
|
|
var e = caml_wrap_exception(e$0), b = Stdlib_Printexc[1].call(null, e);
|
|
caml_call2(Stdlib_Printf[3].call(null, n), fn_name, b);
|
|
return 0;
|
|
}
|
|
}
|
|
jit_compile_ref[1] = jit_compile_lambda;
|
|
Sx_types[6][1] = function(cl, args){return call_closure(cl, args, cl[4]);};
|
|
runtime.caml_register_global
|
|
(72,
|
|
[0,
|
|
jit_compile_ref,
|
|
jit_failed_sentinel,
|
|
is_jit_failed,
|
|
create,
|
|
push,
|
|
pop,
|
|
peek,
|
|
read_u8,
|
|
read_u16,
|
|
read_i16,
|
|
closure_to_value,
|
|
vm_insn_count,
|
|
vm_call_count,
|
|
vm_cek_count,
|
|
vm_reset_counters,
|
|
vm_report_counters,
|
|
push_closure_frame,
|
|
code_from_value,
|
|
call_closure,
|
|
vm_call,
|
|
run,
|
|
execute_module,
|
|
jit_compile_lambda],
|
|
"Sx_vm");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 10454 "../lib/.sx.objs/jsoo/default/sx.cma.js"
|
|
//# shape: Sx_scope:[N,N,F(1)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_wrap_exception = runtime.caml_wrap_exception;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Sx_primitives = global_data.Sx_primitives,
|
|
Stdlib_Hashtbl = global_data.Stdlib__Hashtbl,
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_List = global_data.Stdlib__List,
|
|
scope_stacks = Stdlib_Hashtbl[1].call(null, 0, 8),
|
|
request_cookies = Stdlib_Hashtbl[1].call(null, 0, 8);
|
|
function clear_all(param){
|
|
return Stdlib_Hashtbl[2].call(null, scope_stacks);
|
|
}
|
|
var register = Sx_primitives[4];
|
|
register
|
|
("get-cookie",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0] && ! args[2]){
|
|
var
|
|
name = a[1],
|
|
match = Stdlib_Hashtbl[7].call(null, request_cookies, name);
|
|
if(! match) return 0;
|
|
var v = match[1];
|
|
return [2, v];
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
register("set-cookie", function(args){return 0;});
|
|
var cst_scope_push = "scope-push!";
|
|
register
|
|
(cst_scope_push,
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0]){
|
|
var b = args[2];
|
|
if(b && ! b[2]){
|
|
var value = b[1], name = a[1];
|
|
try{
|
|
var c = Stdlib_Hashtbl[6].call(null, scope_stacks, name), stack = c;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn !== Stdlib[8]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var stack = 0;
|
|
}
|
|
Stdlib_Hashtbl[11].call(null, scope_stacks, name, [0, value, stack]);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
var cst_scope_pop = "scope-pop!";
|
|
register
|
|
(cst_scope_pop,
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0] && ! args[2]){
|
|
var name = a[1];
|
|
try{
|
|
var b = Stdlib_Hashtbl[6].call(null, scope_stacks, name), stack = b;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn !== Stdlib[8]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var stack = 0;
|
|
}
|
|
if(stack){
|
|
var rest = stack[2];
|
|
Stdlib_Hashtbl[11].call(null, scope_stacks, name, rest);
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
register
|
|
("scope-peek",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0] && ! args[2]){
|
|
var name = a[1];
|
|
try{
|
|
var b = Stdlib_Hashtbl[6].call(null, scope_stacks, name), stack = b;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn !== Stdlib[8]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var stack = 0;
|
|
}
|
|
if(! stack) return 0;
|
|
var v = stack[1];
|
|
return v;
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
register
|
|
("context",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0]){
|
|
var c = args[2], name = a[1];
|
|
if(c && c[2]) break a;
|
|
try{
|
|
var d = Stdlib_Hashtbl[6].call(null, scope_stacks, name), stack = d;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn !== Stdlib[8]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var stack = 0;
|
|
}
|
|
if(stack){var v = stack[1]; return v;}
|
|
if(args){
|
|
var b = args[2];
|
|
if(b && ! b[2]){var default_val = b[1]; return default_val;}
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
register
|
|
("collect!",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0]){
|
|
var b = args[2];
|
|
if(b && ! b[2]){
|
|
var value = b[1], name = a[1];
|
|
try{
|
|
var d = Stdlib_Hashtbl[6].call(null, scope_stacks, name), stack = d;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn !== Stdlib[8]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var stack = 0;
|
|
}
|
|
if(stack){
|
|
var match = stack[1];
|
|
if(typeof match !== "number" && 5 === match[0]){
|
|
var rest = stack[2], items = match[1];
|
|
if(1 - Stdlib_List[37].call(null, value, items)){
|
|
var
|
|
c = [0, [5, Stdlib[37].call(null, items, [0, value, 0])], rest];
|
|
Stdlib_Hashtbl[11].call(null, scope_stacks, name, c);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
Stdlib_Hashtbl[11].call
|
|
(null, scope_stacks, name, [0, [5, [0, value, 0]], 0]);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
var cst_collected = "collected", a = [5, 0], b = [5, 0];
|
|
register
|
|
(cst_collected,
|
|
function(args){
|
|
if(args){
|
|
var c = args[1];
|
|
if(typeof c !== "number" && 2 === c[0] && ! args[2]){
|
|
var name = c[1];
|
|
try{
|
|
var d = Stdlib_Hashtbl[6].call(null, scope_stacks, name), stack = d;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn !== Stdlib[8]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var stack = 0;
|
|
}
|
|
if(stack){
|
|
var match = stack[1];
|
|
if(typeof match !== "number" && 5 === match[0]){var items = match[1]; return [5, items];}
|
|
}
|
|
return b;
|
|
}
|
|
}
|
|
return a;
|
|
});
|
|
var
|
|
cst_clear_collected = "clear-collected!",
|
|
c = [5, 0],
|
|
d = [0, [5, 0], 0];
|
|
register
|
|
(cst_clear_collected,
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0] && ! args[2]){
|
|
var name = a[1];
|
|
try{
|
|
var b = Stdlib_Hashtbl[6].call(null, scope_stacks, name), stack = b;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn !== Stdlib[8]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var stack = 0;
|
|
}
|
|
if(stack){
|
|
var rest = stack[2];
|
|
Stdlib_Hashtbl[11].call(null, scope_stacks, name, [0, c, rest]);
|
|
}
|
|
else
|
|
Stdlib_Hashtbl[11].call(null, scope_stacks, name, d);
|
|
return 0;
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
var cst_scope_emit = "scope-emit!";
|
|
register
|
|
(cst_scope_emit,
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0]){
|
|
var b = args[2];
|
|
if(b && ! b[2]){
|
|
var value = b[1], name = a[1];
|
|
try{
|
|
var d = Stdlib_Hashtbl[6].call(null, scope_stacks, name), stack = d;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn !== Stdlib[8]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var stack = 0;
|
|
}
|
|
if(stack){
|
|
var match = stack[1];
|
|
if(typeof match === "number"){
|
|
var rest = stack[2];
|
|
Stdlib_Hashtbl[11].call
|
|
(null, scope_stacks, name, [0, [5, [0, value, 0]], rest]);
|
|
}
|
|
else if(5 === match[0]){
|
|
var
|
|
rest$0 = stack[2],
|
|
items = match[1],
|
|
c = [0, [5, Stdlib[37].call(null, items, [0, value, 0])], rest$0];
|
|
Stdlib_Hashtbl[11].call(null, scope_stacks, name, c);
|
|
}
|
|
}
|
|
else
|
|
Stdlib_Hashtbl[11].call
|
|
(null, scope_stacks, name, [0, [5, [0, value, 0]], 0]);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
register
|
|
("emit!",
|
|
function(args){
|
|
var match = Sx_primitives[6].call(null, cst_scope_emit);
|
|
if(typeof match !== "number" && 13 === match[0]){var fn = match[2]; return caml_call1(fn, args);
|
|
}
|
|
return 0;
|
|
});
|
|
var cst_emitted = "emitted", e = [5, 0], f = [5, 0];
|
|
register
|
|
(cst_emitted,
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0] && ! args[2]){
|
|
var name = a[1];
|
|
try{
|
|
var b = Stdlib_Hashtbl[6].call(null, scope_stacks, name), stack = b;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn !== Stdlib[8]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var stack = 0;
|
|
}
|
|
if(stack){
|
|
var match = stack[1];
|
|
if(typeof match !== "number" && 5 === match[0]){var items = match[1]; return [5, items];}
|
|
}
|
|
return f;
|
|
}
|
|
}
|
|
return e;
|
|
});
|
|
var g = [5, 0];
|
|
register
|
|
("scope-emitted",
|
|
function(args){
|
|
var match = Sx_primitives[6].call(null, cst_emitted);
|
|
if(typeof match !== "number" && 13 === match[0]){var fn = match[2]; return caml_call1(fn, args);
|
|
}
|
|
return g;
|
|
});
|
|
var h = [5, 0];
|
|
register
|
|
("scope-collected",
|
|
function(args){
|
|
var match = Sx_primitives[6].call(null, cst_collected);
|
|
if(typeof match !== "number" && 13 === match[0]){var fn = match[2]; return caml_call1(fn, args);
|
|
}
|
|
return h;
|
|
});
|
|
register
|
|
("scope-clear-collected!",
|
|
function(args){
|
|
var match = Sx_primitives[6].call(null, cst_clear_collected);
|
|
if(typeof match !== "number" && 13 === match[0]){var fn = match[2]; return caml_call1(fn, args);
|
|
}
|
|
return 0;
|
|
});
|
|
register
|
|
("provide-push!",
|
|
function(args){
|
|
var match = Sx_primitives[6].call(null, cst_scope_push);
|
|
if(typeof match !== "number" && 13 === match[0]){var fn = match[2]; return caml_call1(fn, args);
|
|
}
|
|
return 0;
|
|
});
|
|
register
|
|
("provide-pop!",
|
|
function(args){
|
|
var match = Sx_primitives[6].call(null, cst_scope_pop);
|
|
if(typeof match !== "number" && 13 === match[0]){var fn = match[2]; return caml_call1(fn, args);
|
|
}
|
|
return 0;
|
|
});
|
|
runtime.caml_register_global
|
|
(35, [0, scope_stacks, request_cookies, clear_all], "Sx_scope");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 10812 "../lib/.sx.objs/jsoo/default/sx.cma.js"
|
|
//# shape: Sx_parser:[F(1)*,F(1),F(1),F(1)*,F(1),F(1)*,F(1)*,F(1)*,F(1),F(1),F(1),F(1),F(2),F(1),F(1),F(1)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_ml_string_length = runtime.caml_ml_string_length,
|
|
caml_string_get = runtime.caml_string_get;
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
function caml_call4(f, a0, a1, a2, a3){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 4
|
|
? f(a0, a1, a2, a3)
|
|
: runtime.caml_call_gen(f, [a0, a1, a2, a3]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Sx_types = global_data.Sx_types,
|
|
Stdlib_Buffer = global_data.Stdlib__Buffer,
|
|
Stdlib_String = global_data.Stdlib__String,
|
|
Stdlib_Printf = global_data.Stdlib__Printf,
|
|
Stdlib_List = global_data.Stdlib__List,
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_Uchar = global_data.Stdlib__Uchar;
|
|
function make_state(src){return [0, src, caml_ml_string_length(src), 0];}
|
|
function peek(s){
|
|
return s[3] < s[2] ? [0, caml_string_get(s[1], s[3])] : 0;
|
|
}
|
|
function advance(s){s[3] = s[3] + 1 | 0; return 0;}
|
|
function at_end(s){return s[2] <= s[3] ? 1 : 0;}
|
|
function skip_whitespace_and_comments(s){
|
|
a:
|
|
for(;;){
|
|
if(at_end(s)) return 0;
|
|
var match = caml_string_get(s[1], s[3]);
|
|
b:
|
|
{
|
|
if(14 <= match){
|
|
if(32 !== match){
|
|
if(59 !== match) break b;
|
|
for(;;){
|
|
if(s[3] < s[2] && 10 !== caml_string_get(s[1], s[3])){advance(s); continue;}
|
|
if(s[3] >= s[2]) continue a;
|
|
advance(s);
|
|
continue a;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
if(11 <= match){if(13 > match) break b;} else if(9 > match) break b;
|
|
advance(s);
|
|
continue;
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
function is_ident_start(param){
|
|
a:
|
|
{
|
|
if(96 <= param){
|
|
if(123 <= param){
|
|
if(126 !== param) break a;
|
|
}
|
|
else if(97 > param) break a;
|
|
}
|
|
else{
|
|
var a = param - 33 | 0;
|
|
if(57 < a >>> 0){
|
|
if(62 > a) break a;
|
|
}
|
|
else if(32 > a)
|
|
switch(a){
|
|
case 0:
|
|
case 5:
|
|
case 9:
|
|
case 10:
|
|
case 12:
|
|
case 14:
|
|
case 27:
|
|
case 28:
|
|
case 29:
|
|
case 30: break;
|
|
default: break a;
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
function is_ident_char(c){
|
|
if(is_ident_start(c)) return 1;
|
|
a:
|
|
{
|
|
if(47 <= c){
|
|
if(10 < c - 48 >>> 0) break a;
|
|
}
|
|
else{
|
|
if(35 > c) break a;
|
|
switch(c - 35 | 0){case 0:case 9:case 11: break;default: break a;
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
function read_string(s){
|
|
advance(s);
|
|
var buf = Stdlib_Buffer[1].call(null, 64);
|
|
for(;;){
|
|
if(at_end(s))
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[8], "Unterminated string"], 1);
|
|
var c = caml_string_get(s[1], s[3]);
|
|
advance(s);
|
|
if(34 === c) return Stdlib_Buffer[2].call(null, buf);
|
|
if(92 === c){
|
|
if(at_end(s))
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[8], "Unterminated string escape"], 1);
|
|
var esc = caml_string_get(s[1], s[3]);
|
|
advance(s);
|
|
if(92 <= esc){
|
|
if(118 > esc)
|
|
switch(esc - 92 | 0){
|
|
case 0:
|
|
Stdlib_Buffer[12].call(null, buf, 92); continue;
|
|
case 4:
|
|
Stdlib_Buffer[12].call(null, buf, 96); continue;
|
|
case 18:
|
|
Stdlib_Buffer[12].call(null, buf, 10); continue;
|
|
case 22:
|
|
Stdlib_Buffer[12].call(null, buf, 13); continue;
|
|
case 24:
|
|
Stdlib_Buffer[12].call(null, buf, 9); continue;
|
|
case 25:
|
|
if(s[2] < (s[3] + 4 | 0))
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[8], "Incomplete \\u escape"], 1);
|
|
var hex = Stdlib_String[16].call(null, s[1], s[3], 4);
|
|
s[3] = s[3] + 4 | 0;
|
|
var
|
|
code =
|
|
runtime.caml_int_of_string(Stdlib[28].call(null, "0x", hex)),
|
|
ubuf = Stdlib_Buffer[1].call(null, 4),
|
|
a = Stdlib_Uchar[8].call(null, code);
|
|
Stdlib_Buffer[13].call(null, ubuf, a);
|
|
var b = Stdlib_Buffer[2].call(null, ubuf);
|
|
Stdlib_Buffer[16].call(null, buf, b);
|
|
continue;
|
|
}
|
|
}
|
|
else if(34 === esc){Stdlib_Buffer[12].call(null, buf, 34); continue;}
|
|
Stdlib_Buffer[12].call(null, buf, 92);
|
|
Stdlib_Buffer[12].call(null, buf, esc);
|
|
}
|
|
else
|
|
Stdlib_Buffer[12].call(null, buf, c);
|
|
}
|
|
}
|
|
function read_symbol(s){
|
|
var start = s[3];
|
|
for(;;){
|
|
if(s[3] < s[2] && is_ident_char(caml_string_get(s[1], s[3]))){advance(s); continue;}
|
|
return Stdlib_String[16].call(null, s[1], start, s[3] - start | 0);
|
|
}
|
|
}
|
|
function try_number(str){
|
|
var match = Stdlib[36].call(null, str);
|
|
if(! match) return 0;
|
|
var n = match[1];
|
|
return [0, [1, n]];
|
|
}
|
|
var
|
|
cst_pos = " (pos ",
|
|
cst_quote = "quote",
|
|
a =
|
|
[0,
|
|
[11,
|
|
"Unexpected end of input at line ",
|
|
[4, 0, 0, 0, [11, cst_pos, [4, 0, 0, 0, [12, 41, 0]]]]],
|
|
"Unexpected end of input at line %d (pos %d)"],
|
|
b = [3, "quasiquote"],
|
|
c =
|
|
[0,
|
|
[11,
|
|
"Unexpected char: ",
|
|
[0,
|
|
[11,
|
|
" at line ",
|
|
[4,
|
|
0,
|
|
0,
|
|
0,
|
|
[11,
|
|
" col ",
|
|
[4, 0, 0, 0, [11, cst_pos, [4, 0, 0, 0, [12, 41, 0]]]]]]]]],
|
|
"Unexpected char: %c at line %d col %d (pos %d)"],
|
|
d = [0, 1],
|
|
e = [0, 0],
|
|
f = [3, cst_quote],
|
|
g = [3, cst_quote],
|
|
h = [3, "splice-unquote"],
|
|
i = [3, "unquote"];
|
|
function read_value(s){
|
|
a:
|
|
{
|
|
b:
|
|
{
|
|
c:
|
|
{
|
|
d:
|
|
{
|
|
e:
|
|
{
|
|
f:
|
|
for(;;){
|
|
skip_whitespace_and_comments(s);
|
|
if(at_end(s)) break a;
|
|
var match = caml_string_get(s[1], s[3]);
|
|
if(92 <= match) break c;
|
|
if(45 <= match) break d;
|
|
if(34 > match) break b;
|
|
switch(match - 34 | 0){
|
|
case 0:
|
|
return [2, read_string(s)];
|
|
case 1:
|
|
if((s[3] + 1 | 0) >= s[2]) break e;
|
|
if(59 !== caml_string_get(s[1], s[3] + 1 | 0)) break e;
|
|
advance(s);
|
|
advance(s);
|
|
read_value(s);
|
|
break;
|
|
case 5:
|
|
advance(s); return [5, [0, g, [0, read_value(s), 0]]];
|
|
case 6:
|
|
return read_list(s, 41);
|
|
case 10:
|
|
break f;
|
|
default: break b;
|
|
}
|
|
}
|
|
advance(s);
|
|
if(s[3] < s[2] && 64 === caml_string_get(s[1], s[3])){
|
|
advance(s);
|
|
return [5, [0, h, [0, read_value(s), 0]]];
|
|
}
|
|
return [5, [0, i, [0, read_value(s), 0]]];
|
|
}
|
|
if
|
|
((s[3] + 1 | 0) < s[2] && 39 === caml_string_get(s[1], s[3] + 1 | 0)){advance(s); advance(s); return [5, [0, f, [0, read_value(s), 0]]];}
|
|
if((s[3] + 1 | 0) >= s[2]) break b;
|
|
if(124 !== caml_string_get(s[1], s[3] + 1 | 0)) break b;
|
|
advance(s);
|
|
advance(s);
|
|
var buf = Stdlib_Buffer[1].call(null, 64);
|
|
for(;;){
|
|
if(at_end(s))
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[8], "Unterminated raw string"], 1);
|
|
var c$0 = caml_string_get(s[1], s[3]);
|
|
advance(s);
|
|
if(124 === c$0) return [2, Stdlib_Buffer[2].call(null, buf)];
|
|
Stdlib_Buffer[12].call(null, buf, c$0);
|
|
}
|
|
}
|
|
if(91 <= match) return read_list(s, 93);
|
|
break b;
|
|
}
|
|
if(96 === match){advance(s); return [5, [0, b, [0, read_value(s), 0]]];}
|
|
if(123 === match) return read_dict(s);
|
|
}
|
|
var token = read_symbol(s);
|
|
if(token !== ""){
|
|
if(token === "false") return e;
|
|
if(token === "nil") return 0;
|
|
if(token === "true") return d;
|
|
if(58 === caml_string_get(token, 0))
|
|
return [4,
|
|
Stdlib_String[16].call
|
|
(null, token, 1, caml_ml_string_length(token) - 1 | 0)];
|
|
var match$0 = try_number(token);
|
|
if(! match$0) return [3, token];
|
|
var n = match$0[1];
|
|
return n;
|
|
}
|
|
var l = s[3] - 1 | 0, j = 1, k = 1;
|
|
if(l < 0)
|
|
var col$2 = k, line$3 = j;
|
|
else{
|
|
var col = k, line$0 = j, i$0 = 0;
|
|
for(;;){
|
|
if(10 === caml_string_get(s[1], i$0))
|
|
var line$1 = line$0 + 1 | 0, col$1 = 1, line$2 = line$1;
|
|
else
|
|
var col$0 = col + 1 | 0, col$1 = col$0, line$2 = line$0;
|
|
var u = i$0 + 1 | 0;
|
|
if(l === i$0){var col$2 = col$1, line$3 = line$2; break;}
|
|
col = col$1;
|
|
line$0 = line$2;
|
|
i$0 = u;
|
|
}
|
|
}
|
|
var
|
|
q = s[3],
|
|
r = caml_string_get(s[1], s[3]),
|
|
t = caml_call4(Stdlib_Printf[4].call(null, c), r, line$3, col$2, q);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[8], t], 1);
|
|
}
|
|
var line = [0, 1];
|
|
Stdlib_String[30].call
|
|
(null,
|
|
function(c){
|
|
var a = 10 === c ? 1 : 0, b = a ? (line[1]++, 0) : a;
|
|
return b;
|
|
},
|
|
s[1]);
|
|
var
|
|
m = s[3],
|
|
o = line[1],
|
|
p = caml_call2(Stdlib_Printf[4].call(null, a), o, m);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[8], p], 1);
|
|
}
|
|
function read_list(s, close_char){
|
|
advance(s);
|
|
var items = 0;
|
|
for(;;){
|
|
skip_whitespace_and_comments(s);
|
|
if(at_end(s))
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[8], "Unterminated list"], 1);
|
|
if(caml_string_get(s[1], s[3]) === close_char){
|
|
advance(s);
|
|
return [5, Stdlib_List[10].call(null, items)];
|
|
}
|
|
items = [0, read_value(s), items];
|
|
}
|
|
}
|
|
function read_dict(s){
|
|
advance(s);
|
|
var d = Sx_types[60].call(null, 0);
|
|
for(;;){
|
|
skip_whitespace_and_comments(s);
|
|
if(at_end(s))
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[8], "Unterminated dict"], 1);
|
|
if(125 === caml_string_get(s[1], s[3])){advance(s); return [6, d];}
|
|
var key = read_value(s);
|
|
if(typeof key !== "number" && key[0] - 2 >>> 0 < 3){
|
|
var key_str = key[1], v = read_value(s);
|
|
Sx_types[63].call(null, d, key_str, v);
|
|
continue;
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[8], "Dict key must be keyword, string, or symbol"],
|
|
1);
|
|
}
|
|
}
|
|
function parse_all(src){
|
|
var s = make_state(src), results = 0;
|
|
for(;;){
|
|
skip_whitespace_and_comments(s);
|
|
if(at_end(s)) return Stdlib_List[10].call(null, results);
|
|
results = [0, read_value(s), results];
|
|
}
|
|
}
|
|
function parse_file(path){
|
|
var
|
|
ic = Stdlib[79].call(null, path),
|
|
n = Stdlib[92].call(null, ic),
|
|
src = Stdlib[86].call(null, ic, n);
|
|
Stdlib[93].call(null, ic);
|
|
return parse_all(src);
|
|
}
|
|
runtime.caml_register_global
|
|
(28,
|
|
[0,
|
|
make_state,
|
|
peek,
|
|
advance,
|
|
at_end,
|
|
skip_whitespace_and_comments,
|
|
is_ident_start,
|
|
is_ident_char,
|
|
is_ident_char,
|
|
read_string,
|
|
read_symbol,
|
|
try_number,
|
|
read_value,
|
|
read_list,
|
|
read_dict,
|
|
parse_all,
|
|
parse_file],
|
|
"Sx_parser");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 11215 "../lib/.sx.objs/jsoo/default/sx.cma.js"
|
|
//# shape: Sx_render:[N,N,N,F(1),F(1),F(1),F(1),F(1),N,F(2),F(2),F(2),F(3),F(3),F(3),F(2),F(3),F(2),F(2),F(3),F(2),F(1)]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_list_of_js_array = runtime.caml_list_of_js_array,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_trampoline = runtime.caml_trampoline,
|
|
caml_trampoline_return = runtime.caml_trampoline_return,
|
|
caml_wrap_exception = runtime.caml_wrap_exception;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
function caml_call3(f, a0, a1, a2){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 3
|
|
? f(a0, a1, a2)
|
|
: runtime.caml_call_gen(f, [a0, a1, a2]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
cst_br = "br",
|
|
cst_col = "col",
|
|
cst_embed = "embed",
|
|
cst_filter = "filter",
|
|
cst_hr = "hr",
|
|
cst_img = "img",
|
|
cst_input = "input",
|
|
cst_link = "link",
|
|
cst_meta = "meta",
|
|
cst_param = "param",
|
|
cst_source = "source",
|
|
cst_wbr = "wbr",
|
|
html_tags =
|
|
caml_list_of_js_array
|
|
(["html",
|
|
"head",
|
|
"body",
|
|
"title",
|
|
cst_meta,
|
|
cst_link,
|
|
"script",
|
|
"style",
|
|
"noscript",
|
|
"header",
|
|
"nav",
|
|
"main",
|
|
"section",
|
|
"article",
|
|
"aside",
|
|
"footer",
|
|
"h1",
|
|
"h2",
|
|
"h3",
|
|
"h4",
|
|
"h5",
|
|
"h6",
|
|
"hgroup",
|
|
"div",
|
|
"p",
|
|
"blockquote",
|
|
"pre",
|
|
"figure",
|
|
"figcaption",
|
|
"address",
|
|
cst_hr,
|
|
"ul",
|
|
"ol",
|
|
"li",
|
|
"dl",
|
|
"dt",
|
|
"dd",
|
|
"menu",
|
|
"a",
|
|
"span",
|
|
"em",
|
|
"strong",
|
|
"small",
|
|
"b",
|
|
"i",
|
|
"u",
|
|
"s",
|
|
"sub",
|
|
"sup",
|
|
"mark",
|
|
"del",
|
|
"ins",
|
|
"q",
|
|
"cite",
|
|
"dfn",
|
|
"abbr",
|
|
"code",
|
|
"var",
|
|
"samp",
|
|
"kbd",
|
|
"data",
|
|
"time",
|
|
"ruby",
|
|
"rt",
|
|
"rp",
|
|
"bdi",
|
|
"bdo",
|
|
cst_wbr,
|
|
cst_br,
|
|
"table",
|
|
"thead",
|
|
"tbody",
|
|
"tfoot",
|
|
"tr",
|
|
"th",
|
|
"td",
|
|
"caption",
|
|
"colgroup",
|
|
cst_col,
|
|
"form",
|
|
cst_input,
|
|
"textarea",
|
|
"select",
|
|
"option",
|
|
"optgroup",
|
|
"button",
|
|
"label",
|
|
"fieldset",
|
|
"legend",
|
|
"datalist",
|
|
"output",
|
|
"progress",
|
|
"meter",
|
|
"details",
|
|
"summary",
|
|
"dialog",
|
|
cst_img,
|
|
"video",
|
|
"audio",
|
|
cst_source,
|
|
"picture",
|
|
"canvas",
|
|
"iframe",
|
|
cst_embed,
|
|
"object",
|
|
cst_param,
|
|
"svg",
|
|
"path",
|
|
"circle",
|
|
"rect",
|
|
"line",
|
|
"polyline",
|
|
"polygon",
|
|
"ellipse",
|
|
"g",
|
|
"defs",
|
|
"use",
|
|
"text",
|
|
"tspan",
|
|
"clipPath",
|
|
"mask",
|
|
"pattern",
|
|
"linearGradient",
|
|
"radialGradient",
|
|
"stop",
|
|
cst_filter,
|
|
"feBlend",
|
|
"feFlood",
|
|
"feGaussianBlur",
|
|
"feOffset",
|
|
"feMerge",
|
|
"feMergeNode",
|
|
"feComposite",
|
|
"template",
|
|
"slot"]),
|
|
void_elements =
|
|
caml_list_of_js_array
|
|
(["area",
|
|
"base",
|
|
cst_br,
|
|
cst_col,
|
|
cst_embed,
|
|
cst_hr,
|
|
cst_img,
|
|
cst_input,
|
|
cst_link,
|
|
cst_meta,
|
|
cst_param,
|
|
cst_source,
|
|
"track",
|
|
cst_wbr]),
|
|
boolean_attrs =
|
|
caml_list_of_js_array
|
|
(["async",
|
|
"autofocus",
|
|
"autoplay",
|
|
"checked",
|
|
"controls",
|
|
"default",
|
|
"defer",
|
|
"disabled",
|
|
"formnovalidate",
|
|
"hidden",
|
|
"inert",
|
|
"ismap",
|
|
"loop",
|
|
"multiple",
|
|
"muted",
|
|
"nomodule",
|
|
"novalidate",
|
|
"open",
|
|
"playsinline",
|
|
"readonly",
|
|
"required",
|
|
"reversed",
|
|
"selected"]),
|
|
Sx_ref = global_data.Sx_ref,
|
|
Stdlib_Float = global_data.Stdlib__Float,
|
|
Stdlib = global_data.Stdlib,
|
|
Stdlib_Printf = global_data.Stdlib__Printf,
|
|
Stdlib_List = global_data.Stdlib__List,
|
|
Sx_types = global_data.Sx_types,
|
|
Stdlib_String = global_data.Stdlib__String,
|
|
Stdlib_Printexc = global_data.Stdlib__Printexc,
|
|
Sx_runtime = global_data.Sx_runtime,
|
|
Sx_parser = global_data.Sx_parser,
|
|
Stdlib_Hashtbl = global_data.Stdlib__Hashtbl,
|
|
Stdlib_Buffer = global_data.Stdlib__Buffer;
|
|
function is_html_tag(name){
|
|
return Stdlib_List[37].call(null, name, html_tags);
|
|
}
|
|
function is_void(name){
|
|
return Stdlib_List[37].call(null, name, void_elements);
|
|
}
|
|
function is_boolean_attr(name){
|
|
return Stdlib_List[37].call(null, name, boolean_attrs);
|
|
}
|
|
function escape_html(s){
|
|
var buf = Stdlib_Buffer[1].call(null, runtime.caml_ml_string_length(s));
|
|
Stdlib_String[30].call
|
|
(null,
|
|
function(c){
|
|
if(34 === c) return Stdlib_Buffer[16].call(null, buf, """);
|
|
if(60 <= c){
|
|
if(63 > c)
|
|
switch(c - 60 | 0){
|
|
case 0:
|
|
return Stdlib_Buffer[16].call(null, buf, "<");
|
|
case 2:
|
|
return Stdlib_Buffer[16].call(null, buf, ">");
|
|
}
|
|
}
|
|
else if(38 === c) return Stdlib_Buffer[16].call(null, buf, "&");
|
|
return Stdlib_Buffer[12].call(null, buf, c);
|
|
},
|
|
s);
|
|
return Stdlib_Buffer[2].call(null, buf);
|
|
}
|
|
function render_attrs(attrs){
|
|
var buf = Stdlib_Buffer[1].call(null, 64);
|
|
Stdlib_Hashtbl[12].call
|
|
(null,
|
|
function(k, v){
|
|
if(is_boolean_attr(k)){
|
|
var a = Sx_types[40].call(null, v);
|
|
return a
|
|
? (Stdlib_Buffer
|
|
[12].call
|
|
(null, buf, 32),
|
|
Stdlib_Buffer[16].call(null, buf, k))
|
|
: a;
|
|
}
|
|
var b = 1 - Sx_types[32].call(null, v);
|
|
if(! b) return b;
|
|
Stdlib_Buffer[12].call(null, buf, 32);
|
|
Stdlib_Buffer[16].call(null, buf, k);
|
|
Stdlib_Buffer[16].call(null, buf, '="');
|
|
var c = escape_html(Sx_types[19].call(null, v));
|
|
Stdlib_Buffer[16].call(null, buf, c);
|
|
return Stdlib_Buffer[12].call(null, buf, 34);
|
|
},
|
|
attrs);
|
|
return Stdlib_Buffer[2].call(null, buf);
|
|
}
|
|
var cst = "", render_to_html_ref = [0, function(expr, env){return cst;}];
|
|
function render_to_html(expr, env){
|
|
return caml_call2(render_to_html_ref[1], expr, env);
|
|
}
|
|
function render_children(children, env){
|
|
var
|
|
a =
|
|
Stdlib_List[20].call
|
|
(null, function(c){return render_to_html(c, env);}, children);
|
|
return Stdlib_String[7].call(null, cst, a);
|
|
}
|
|
function parse_element_args(args, env){
|
|
var
|
|
attrs = Stdlib_Hashtbl[1].call(null, 0, 8),
|
|
len = Stdlib_List[1].call(null, args),
|
|
children = [0, 0],
|
|
skip = [0, 0];
|
|
Stdlib_List[19].call
|
|
(null,
|
|
function(idx, arg){
|
|
if(skip[1]){skip[1] = 0; return 0;}
|
|
if(typeof arg !== "number")
|
|
switch(arg[0]){
|
|
case 4:
|
|
var k = arg[1];
|
|
if((idx + 1 | 0) < len){
|
|
var
|
|
a = Stdlib_List[8].call(null, args, idx + 1 | 0),
|
|
v = Sx_ref[127].call(null, a, [18, env]);
|
|
Stdlib_Hashtbl[11].call(null, attrs, k, v);
|
|
skip[1] = 1;
|
|
return 0;
|
|
}
|
|
break;
|
|
case 16:
|
|
var pairs = arg[1];
|
|
return Stdlib_List[18].call
|
|
(null,
|
|
function(param){
|
|
var v = param[2], k = param[1];
|
|
return Stdlib_Hashtbl[11].call(null, attrs, k, v);
|
|
},
|
|
pairs);
|
|
}
|
|
children[1] = [0, arg, children[1]];
|
|
return 0;
|
|
},
|
|
args);
|
|
return [0, attrs, Stdlib_List[10].call(null, children[1])];
|
|
}
|
|
function render_html_element(tag, args, env){
|
|
var
|
|
match = parse_element_args(args, env),
|
|
children = match[2],
|
|
attrs = match[1],
|
|
attr_str = render_attrs(attrs),
|
|
cst$0 = "<";
|
|
if(is_void(tag)){
|
|
var
|
|
a = Stdlib[28].call(null, attr_str, " />"),
|
|
b = Stdlib[28].call(null, tag, a);
|
|
return Stdlib[28].call(null, cst$0, b);
|
|
}
|
|
var
|
|
c =
|
|
Stdlib_List[20].call
|
|
(null, function(c){return render_to_html(c, env);}, children),
|
|
content = Stdlib_String[7].call(null, cst, c),
|
|
cst$1 = ">",
|
|
d = Stdlib[28].call(null, tag, cst$1),
|
|
e = Stdlib[28].call(null, "<\/", d),
|
|
f = Stdlib[28].call(null, content, e),
|
|
g = Stdlib[28].call(null, cst$1, f),
|
|
h = Stdlib[28].call(null, attr_str, g),
|
|
i = Stdlib[28].call(null, tag, h);
|
|
return Stdlib[28].call(null, cst$0, i);
|
|
}
|
|
function render_component(comp, args, env){
|
|
if(typeof comp !== "number" && 8 === comp[0]){
|
|
var
|
|
c = comp[1],
|
|
kwargs = Stdlib_Hashtbl[1].call(null, 0, 8),
|
|
len = Stdlib_List[1].call(null, args),
|
|
children_exprs = [0, 0],
|
|
skip = [0, 0];
|
|
Stdlib_List[19].call
|
|
(null,
|
|
function(idx, arg){
|
|
if(skip[1]){skip[1] = 0; return 0;}
|
|
if(typeof arg !== "number" && 4 === arg[0]){
|
|
var k = arg[1];
|
|
if((idx + 1 | 0) < len){
|
|
var
|
|
a = Stdlib_List[8].call(null, args, idx + 1 | 0),
|
|
v = Sx_ref[127].call(null, a, [18, env]);
|
|
Stdlib_Hashtbl[11].call(null, kwargs, k, v);
|
|
skip[1] = 1;
|
|
return 0;
|
|
}
|
|
}
|
|
children_exprs[1] = [0, arg, children_exprs[1]];
|
|
return 0;
|
|
},
|
|
args);
|
|
var
|
|
children = Stdlib_List[10].call(null, children_exprs[1]),
|
|
local = Sx_types[18].call(null, c[5], env);
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(p){
|
|
var match = Stdlib_Hashtbl[7].call(null, kwargs, p);
|
|
if(match) var v = match[1], v$0 = v; else var v$0 = 0;
|
|
Sx_types[11].call(null, local, p, v$0);
|
|
return 0;
|
|
},
|
|
c[2]);
|
|
if(c[3]){
|
|
var
|
|
a =
|
|
Stdlib_List[20].call
|
|
(null, function(c){return render_to_html(c, env);}, children),
|
|
rendered_children = Stdlib_String[7].call(null, cst, a);
|
|
Sx_types[11].call(null, local, "children", [15, rendered_children]);
|
|
}
|
|
return render_to_html(c[4], local);
|
|
}
|
|
return cst;
|
|
}
|
|
function expand_macro(m, args, env){
|
|
var local = Sx_types[10].call(null, m[4]), params = m[1];
|
|
a:
|
|
{
|
|
var ps = params, as = args;
|
|
for(;;){
|
|
if(! ps){
|
|
var match = m[2];
|
|
if(! match) break a;
|
|
var rp = match[1];
|
|
Sx_types[11].call(null, local, rp, [5, as]);
|
|
break a;
|
|
}
|
|
var ps_rest = ps[2], p = ps[1];
|
|
if(! as) break;
|
|
var as_rest = as[2], a = as[1];
|
|
Sx_types[11].call(null, local, p, a);
|
|
ps = ps_rest;
|
|
as = as_rest;
|
|
}
|
|
var b = Stdlib_List[10].call(null, ps);
|
|
Stdlib_List[18].call
|
|
(null, function(p){Sx_types[11].call(null, local, p, 0); return 0;}, b);
|
|
}
|
|
return Sx_ref[127].call(null, m[3], [18, local]);
|
|
}
|
|
var a = [0, [8, [0, 0, 3], 0, 0, 0], "%g"];
|
|
function do_render_to_html$0(counter, expr$2, env){
|
|
var expr = expr$2;
|
|
for(;;){
|
|
if(typeof expr === "number") return cst;
|
|
a:
|
|
{
|
|
switch(expr[0]){
|
|
case 0:
|
|
return expr[1] ? "true" : "false";
|
|
case 1:
|
|
var n = expr[1];
|
|
return Stdlib_Float[18].call(null, n)
|
|
? Stdlib[33].call(null, n | 0)
|
|
: caml_call1(Stdlib_Printf[4].call(null, a), n);
|
|
case 3:
|
|
var
|
|
s$0 = expr[1],
|
|
expr$0 = Sx_ref[127].call(null, [3, s$0], [18, env]);
|
|
expr = expr$0;
|
|
continue;
|
|
case 5:
|
|
var b = expr[1]; if(b){var args = b[2], head = b[1]; break a;} break;
|
|
case 15:
|
|
var s$1 = expr[1]; return s$1;
|
|
case 19:
|
|
var c = expr[1][1];
|
|
if(c){var args = c[2], head = c[1]; break a;}
|
|
break;
|
|
case 2:
|
|
case 4:
|
|
var s = expr[1]; return escape_html(s);
|
|
default:
|
|
var expr$1 = Sx_ref[127].call(null, expr, [18, env]);
|
|
expr = expr$1;
|
|
continue;
|
|
}
|
|
return cst;
|
|
}
|
|
return counter < 50
|
|
? render_list_to_html$0(counter + 1 | 0, head, args, env)
|
|
: caml_trampoline_return
|
|
(render_list_to_html$0, [0, head, args, env]);
|
|
}
|
|
}
|
|
function do_render_to_html(expr, env){
|
|
return caml_trampoline(do_render_to_html$0(0, expr, env));
|
|
}
|
|
var
|
|
cst_do = "do",
|
|
cst_render_to_html = "render-to-html",
|
|
b =
|
|
[0,
|
|
[11,
|
|
"[ssr-island] ~",
|
|
[2, 0, [11, " FAILED: ", [2, 0, [12, 10, [2, 0, [12, 10, [10, 0]]]]]]]],
|
|
"[ssr-island] ~%s FAILED: %s\n%s\n%!"],
|
|
c = [3, "quote"],
|
|
d = [3, cst_render_to_html];
|
|
function render_list_to_html$0(counter, head, args, env){
|
|
if(typeof head !== "number" && 3 === head[0]){
|
|
var tag = head[1];
|
|
if(tag === "<>") return render_children(args, env);
|
|
if(tag === "raw!"){
|
|
var
|
|
r = Stdlib_List[6].call(null, args),
|
|
v$2 = Sx_ref[127].call(null, r, [18, env]);
|
|
if(typeof v$2 !== "number")
|
|
switch(v$2[0]){case 2:case 15: var s$0 = v$2[1]; return s$0;}
|
|
return Sx_types[19].call(null, v$2);
|
|
}
|
|
if(is_html_tag(tag)) return render_html_element(tag, args, env);
|
|
var switch$ = runtime.caml_string_compare(tag, cst_filter);
|
|
a:
|
|
{
|
|
if(0 <= switch$){
|
|
if(0 >= switch$){
|
|
var v$0 = Sx_ref[127].call(null, [5, [0, head, args]], [18, env]);
|
|
return counter < 50
|
|
? do_render_to_html$0(counter + 1 | 0, v$0, env)
|
|
: caml_trampoline_return(do_render_to_html$0, [0, v$0, env]);
|
|
}
|
|
if(tag === "for-each") return render_for_each(args, env);
|
|
if(tag !== "if"){
|
|
if(tag !== "let" && tag !== "let*"){
|
|
if(tag === "map") return render_map(args, env, 0);
|
|
if(tag === "map-indexed") return render_map(args, env, 1);
|
|
if(tag !== "when") break a;
|
|
var
|
|
n = Stdlib_List[6].call(null, args),
|
|
cond_val = Sx_ref[127].call(null, n, [18, env]);
|
|
if(! Sx_types[40].call(null, cond_val)) return cst;
|
|
var
|
|
o = Stdlib_List[7].call(null, args),
|
|
p =
|
|
Stdlib_List[20].call
|
|
(null, function(e){return do_render_to_html(e, env);}, o);
|
|
return Stdlib_String[7].call(null, cst, p);
|
|
}
|
|
return counter < 50
|
|
? render_let$0(counter + 1 | 0, args, env)
|
|
: caml_trampoline_return(render_let$0, [0, args, env]);
|
|
}
|
|
var
|
|
q = Stdlib_List[6].call(null, args),
|
|
cond_val$0 = Sx_ref[127].call(null, q, [18, env]);
|
|
if(Sx_types[40].call(null, cond_val$0)){
|
|
if(1 >= Stdlib_List[1].call(null, args)) return cst;
|
|
var g = Stdlib_List[8].call(null, args, 1);
|
|
return counter < 50
|
|
? do_render_to_html$0(counter + 1 | 0, g, env)
|
|
: caml_trampoline_return(do_render_to_html$0, [0, g, env]);
|
|
}
|
|
if(2 >= Stdlib_List[1].call(null, args)) return cst;
|
|
var h = Stdlib_List[8].call(null, args, 2);
|
|
return counter < 50
|
|
? do_render_to_html$0(counter + 1 | 0, h, env)
|
|
: caml_trampoline_return(do_render_to_html$0, [0, h, env]);
|
|
}
|
|
b:
|
|
{
|
|
if(tag !== "begin"){
|
|
if(tag === "case"){
|
|
var v$1 = Sx_ref[127].call(null, [5, [0, head, args]], [18, env]);
|
|
return counter < 50
|
|
? do_render_to_html$0(counter + 1 | 0, v$1, env)
|
|
: caml_trampoline_return(do_render_to_html$0, [0, v$1, env]);
|
|
}
|
|
if(tag === "cond")
|
|
return counter < 50
|
|
? render_cond$0(counter + 1 | 0, args, env)
|
|
: caml_trampoline_return(render_cond$0, [0, args, env]);
|
|
if
|
|
(tag !== "defcomp"
|
|
&& tag !== "define" && tag !== "defisland" && tag !== "defmacro"){if(tag !== cst_do) break a; var param = args; break b;}
|
|
Sx_ref[127].call(null, [5, [0, head, args]], [18, env]);
|
|
return cst;
|
|
}
|
|
var param = args;
|
|
}
|
|
for(;;){
|
|
if(! param) return cst;
|
|
var last = param[1];
|
|
if(! param[2])
|
|
return counter < 50
|
|
? do_render_to_html$0(counter + 1 | 0, last, env)
|
|
: caml_trampoline_return(do_render_to_html$0, [0, last, env]);
|
|
var rest = param[2];
|
|
Sx_ref[127].call(null, last, [18, env]);
|
|
param = rest;
|
|
}
|
|
}
|
|
try{
|
|
var v = Sx_types[15].call(null, env, tag);
|
|
a:
|
|
{
|
|
if(typeof v !== "number")
|
|
switch(v[0]){
|
|
case 8:
|
|
var c$0 = v[1];
|
|
if(c$0[6] === "client"){var a = cst; break a;}
|
|
var a = render_component(v, args, env);
|
|
break a;
|
|
case 9:
|
|
var i = v[1];
|
|
try{
|
|
var
|
|
call_expr = [5, [0, [3, tag], args]],
|
|
render_call =
|
|
[5,
|
|
[0, d, [0, [5, [0, c, [0, call_expr, 0]]], [0, [18, env], 0]]]],
|
|
result$2 = Sx_ref[127].call(null, render_call, [18, env]);
|
|
b:
|
|
{
|
|
if(typeof result$2 !== "number")
|
|
switch(result$2[0]){
|
|
case 2:
|
|
case 15:
|
|
var s = result$2[1], f = s; break b;
|
|
}
|
|
var f = Sx_types[19].call(null, result$2);
|
|
}
|
|
var a = f;
|
|
break a;
|
|
}
|
|
catch(e$0){
|
|
var
|
|
e = caml_wrap_exception(e$0),
|
|
j = Stdlib_Printexc[6].call(null, 0),
|
|
k = Stdlib_Printexc[1].call(null, e),
|
|
l = i[1];
|
|
caml_call3(Stdlib_Printf[3].call(null, b), l, k, j);
|
|
var a = cst;
|
|
break a;
|
|
}
|
|
case 10:
|
|
var
|
|
m = v[1],
|
|
expanded = expand_macro(m, args, env),
|
|
a = do_render_to_html(expanded, env);
|
|
break a;
|
|
}
|
|
var
|
|
result$1 = Sx_ref[127].call(null, [5, [0, head, args]], [18, env]),
|
|
a = do_render_to_html(result$1, env);
|
|
}
|
|
return a;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn[1] !== Sx_types[7]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var result$0 = Sx_ref[127].call(null, [5, [0, head, args]], [18, env]);
|
|
return counter < 50
|
|
? do_render_to_html$0(counter + 1 | 0, result$0, env)
|
|
: caml_trampoline_return
|
|
(do_render_to_html$0, [0, result$0, env]);
|
|
}
|
|
}
|
|
var result = Sx_ref[127].call(null, [5, [0, head, args]], [18, env]);
|
|
return counter < 50
|
|
? do_render_to_html$0(counter + 1 | 0, result, env)
|
|
: caml_trampoline_return(do_render_to_html$0, [0, result, env]);
|
|
}
|
|
function render_list_to_html(head, args, env){
|
|
return caml_trampoline(render_list_to_html$0(0, head, args, env));
|
|
}
|
|
function render_cond$0(counter, args, env){
|
|
function as_list(param){
|
|
a:
|
|
if(typeof param !== "number"){
|
|
switch(param[0]){
|
|
case 5:
|
|
var l = param[1]; break;
|
|
case 19:
|
|
var l = param[1][1]; break;
|
|
default: break a;
|
|
}
|
|
return [0, l];
|
|
}
|
|
return 0;
|
|
}
|
|
var
|
|
is_scheme =
|
|
Stdlib_List[33].call
|
|
(null,
|
|
function(a){
|
|
var match = as_list(a);
|
|
if(match){
|
|
var items = match[1];
|
|
if(2 === Stdlib_List[1].call(null, items)) return 1;
|
|
}
|
|
return 0;
|
|
},
|
|
args),
|
|
cst_else$0 = ":else",
|
|
cst_else = "else";
|
|
if(is_scheme){
|
|
var param = args;
|
|
for(;;){
|
|
if(! param) return cst;
|
|
var rest = param[2], clause = param[1], match = as_list(clause);
|
|
if(match){
|
|
var a = match[1];
|
|
if(a){
|
|
var b = a[2];
|
|
if(b && ! b[2]){
|
|
var body = b[1], test = a[1];
|
|
a:
|
|
{
|
|
if(typeof test !== "number")
|
|
switch(test[0]){
|
|
case 3:
|
|
var c = test[1];
|
|
if(c !== cst_else$0 && c !== cst_else) break;
|
|
var is_else = 1;
|
|
break a;
|
|
case 4:
|
|
if(test[1] === cst_else){var is_else = 1; break a;} break;
|
|
}
|
|
var is_else = 0;
|
|
}
|
|
if(is_else)
|
|
return counter < 50
|
|
? do_render_to_html$0(counter + 1 | 0, body, env)
|
|
: caml_trampoline_return
|
|
(do_render_to_html$0, [0, body, env]);
|
|
var v = Sx_ref[127].call(null, test, [18, env]);
|
|
if(Sx_types[40].call(null, v))
|
|
return counter < 50
|
|
? do_render_to_html$0(counter + 1 | 0, body, env)
|
|
: caml_trampoline_return
|
|
(do_render_to_html$0, [0, body, env]);
|
|
param = rest;
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
return cst;
|
|
}
|
|
}
|
|
var param$0 = args;
|
|
for(;;){
|
|
if(! param$0) return cst;
|
|
var match$0 = param$0[2], test$0 = param$0[1];
|
|
if(! match$0) return cst;
|
|
var rest$0 = match$0[2], body$0 = match$0[1];
|
|
a:
|
|
{
|
|
if(typeof test$0 !== "number")
|
|
switch(test$0[0]){
|
|
case 3:
|
|
var d = test$0[1];
|
|
if(d !== cst_else$0 && d !== cst_else) break;
|
|
var is_else$0 = 1;
|
|
break a;
|
|
case 4:
|
|
if(test$0[1] === cst_else){var is_else$0 = 1; break a;} break;
|
|
}
|
|
var is_else$0 = 0;
|
|
}
|
|
if(is_else$0)
|
|
return counter < 50
|
|
? do_render_to_html$0(counter + 1 | 0, body$0, env)
|
|
: caml_trampoline_return(do_render_to_html$0, [0, body$0, env]);
|
|
var v$0 = Sx_ref[127].call(null, test$0, [18, env]);
|
|
if(Sx_types[40].call(null, v$0))
|
|
return counter < 50
|
|
? do_render_to_html$0(counter + 1 | 0, body$0, env)
|
|
: caml_trampoline_return(do_render_to_html$0, [0, body$0, env]);
|
|
param$0 = rest$0;
|
|
}
|
|
}
|
|
function render_cond(args, env){
|
|
return caml_trampoline(render_cond$0(0, args, env));
|
|
}
|
|
function render_let$0(counter, args, env){
|
|
function as_list(param){
|
|
a:
|
|
if(typeof param !== "number"){
|
|
switch(param[0]){
|
|
case 5:
|
|
var l = param[1]; break;
|
|
case 19:
|
|
var l = param[1][1]; break;
|
|
default: break a;
|
|
}
|
|
return [0, l];
|
|
}
|
|
return 0;
|
|
}
|
|
var
|
|
bindings_expr = Stdlib_List[6].call(null, args),
|
|
body = Stdlib_List[7].call(null, args),
|
|
local = Sx_types[10].call(null, env),
|
|
match = as_list(bindings_expr);
|
|
if(match) var l = match[1], bindings = l; else var bindings = 0;
|
|
a:
|
|
{
|
|
if(bindings){
|
|
var b = bindings[1];
|
|
if(typeof b !== "number")
|
|
switch(b[0]){case 5:case 19: var is_scheme = 1; break a;}
|
|
}
|
|
var is_scheme = 0;
|
|
}
|
|
if(is_scheme){
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(b){
|
|
var match = as_list(b);
|
|
if(match){
|
|
var a = match[1];
|
|
if(a){
|
|
var c = a[1];
|
|
if(typeof c !== "number" && c[0] - 2 >>> 0 < 2){
|
|
var d = a[2];
|
|
if(d && ! d[2]){
|
|
var
|
|
expr = d[1],
|
|
name = c[1],
|
|
v = Sx_ref[127].call(null, expr, [18, local]);
|
|
Sx_types[11].call(null, local, name, v);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
},
|
|
bindings);
|
|
var param = body;
|
|
}
|
|
else{
|
|
var param$0 = bindings;
|
|
for(;;){
|
|
if(! param$0){var param = body; break;}
|
|
var a = param$0[1];
|
|
if(typeof a === "number"){var param = body; break;}
|
|
if(a[0] - 2 >>> 0 >= 2){var param = body; break;}
|
|
var match$0 = param$0[2];
|
|
if(! match$0){var param = body; break;}
|
|
var
|
|
rest$0 = match$0[2],
|
|
expr = match$0[1],
|
|
name = a[1],
|
|
v = Sx_ref[127].call(null, expr, [18, local]);
|
|
Sx_types[11].call(null, local, name, v);
|
|
param$0 = rest$0;
|
|
}
|
|
}
|
|
for(;;){
|
|
if(! param) return cst;
|
|
var last = param[1];
|
|
if(! param[2])
|
|
return counter < 50
|
|
? do_render_to_html$0(counter + 1 | 0, last, local)
|
|
: caml_trampoline_return(do_render_to_html$0, [0, last, local]);
|
|
var rest = param[2];
|
|
Sx_ref[127].call(null, last, [18, local]);
|
|
param = rest;
|
|
}
|
|
}
|
|
function render_let(args, env){
|
|
return caml_trampoline(render_let$0(0, args, env));
|
|
}
|
|
function render_map(args, env, indexed){
|
|
a:
|
|
{
|
|
if(args){
|
|
var c = args[2];
|
|
if(c && ! c[2]){
|
|
var
|
|
b = c[1],
|
|
a = args[1],
|
|
va = Sx_ref[127].call(null, a, [18, env]),
|
|
vb = Sx_ref[127].call(null, b, [18, env]);
|
|
if(typeof va !== "number")
|
|
switch(va[0]){case 7:case 13: var coll_val = vb, fn_val = va; break a;
|
|
}
|
|
if(typeof vb !== "number")
|
|
switch(vb[0]){
|
|
case 7:
|
|
case 13:
|
|
var coll_val = va, fn_val = vb; break a;
|
|
default: var coll_val = vb, fn_val = va; break a;
|
|
}
|
|
var coll_val = vb, fn_val = va;
|
|
break a;
|
|
}
|
|
}
|
|
var coll_val = 0, fn_val = 0;
|
|
}
|
|
a:
|
|
{
|
|
if(typeof coll_val !== "number")
|
|
switch(coll_val[0]){
|
|
case 5:
|
|
var items = coll_val[1]; break a;
|
|
case 19:
|
|
var items = coll_val[1][1]; break a;
|
|
}
|
|
var items = 0;
|
|
}
|
|
var
|
|
d =
|
|
Stdlib_List[21].call
|
|
(null,
|
|
function(i, item){
|
|
var call_args = indexed ? [0, [1, i], [0, item, 0]] : [0, item, 0];
|
|
if(typeof fn_val !== "number" && 7 === fn_val[0]){
|
|
var l = fn_val[1], local = Sx_types[10].call(null, l[3]);
|
|
Stdlib_List[28].call
|
|
(null,
|
|
function(p, a){Sx_types[11].call(null, local, p, a); return 0;},
|
|
l[1],
|
|
call_args);
|
|
return do_render_to_html(l[2], local);
|
|
}
|
|
var result = Sx_runtime[6].call(null, fn_val, call_args);
|
|
return do_render_to_html(result, env);
|
|
},
|
|
items);
|
|
return Stdlib_String[7].call(null, cst, d);
|
|
}
|
|
function render_for_each(args, env){
|
|
a:
|
|
{
|
|
if(args){
|
|
var c = args[2];
|
|
if(c && ! c[2]){
|
|
var
|
|
b = c[1],
|
|
a = args[1],
|
|
va = Sx_ref[127].call(null, a, [18, env]),
|
|
vb = Sx_ref[127].call(null, b, [18, env]);
|
|
if(typeof va !== "number")
|
|
switch(va[0]){case 7:case 13: var coll_val = vb, fn_val = va; break a;
|
|
}
|
|
if(typeof vb !== "number")
|
|
switch(vb[0]){
|
|
case 7:
|
|
case 13:
|
|
var coll_val = va, fn_val = vb; break a;
|
|
default: var coll_val = vb, fn_val = va; break a;
|
|
}
|
|
var coll_val = vb, fn_val = va;
|
|
break a;
|
|
}
|
|
}
|
|
var coll_val = 0, fn_val = 0;
|
|
}
|
|
a:
|
|
{
|
|
if(typeof coll_val !== "number")
|
|
switch(coll_val[0]){
|
|
case 5:
|
|
var items = coll_val[1]; break a;
|
|
case 19:
|
|
var items = coll_val[1][1]; break a;
|
|
}
|
|
var items = 0;
|
|
}
|
|
var
|
|
d =
|
|
Stdlib_List[20].call
|
|
(null,
|
|
function(item){
|
|
if(typeof fn_val !== "number" && 7 === fn_val[0]){
|
|
var l = fn_val[1], local = Sx_types[10].call(null, l[3]);
|
|
Stdlib_List[28].call
|
|
(null,
|
|
function(p, a){Sx_types[11].call(null, local, p, a); return 0;},
|
|
l[1],
|
|
[0, item, 0]);
|
|
return do_render_to_html(l[2], local);
|
|
}
|
|
var result = Sx_runtime[6].call(null, fn_val, [0, item, 0]);
|
|
return do_render_to_html(result, env);
|
|
},
|
|
items);
|
|
return Stdlib_String[7].call(null, cst, d);
|
|
}
|
|
var e = [2, cst], f = [3, cst_do], g = [2, cst], h = [3, cst_do];
|
|
function setup_render_env(env){
|
|
render_to_html_ref[1] = do_render_to_html;
|
|
function bind(name, fn){
|
|
Sx_types[11].call(null, env, name, [13, name, fn]);
|
|
return 0;
|
|
}
|
|
bind
|
|
("render-html",
|
|
function(args){
|
|
if(args){
|
|
var expr = args[1];
|
|
if(typeof expr !== "number" && 2 === expr[0] && ! args[2]){
|
|
var src = expr[1], exprs = Sx_parser[15].call(null, src);
|
|
if(exprs)
|
|
if(exprs[2])
|
|
var expr$0 = [5, [0, f, exprs]];
|
|
else
|
|
var e$1 = exprs[1], expr$0 = e$1;
|
|
else
|
|
var expr$0 = 0;
|
|
return [2, render_to_html(expr$0, env)];
|
|
}
|
|
var match = args[2];
|
|
if(! match) return [2, render_to_html(expr, env)];
|
|
var a = match[1];
|
|
if(typeof a !== "number" && 18 === a[0] && ! match[2]){
|
|
var e$0 = a[1];
|
|
return [2, render_to_html(expr, e$0)];
|
|
}
|
|
}
|
|
return e;
|
|
});
|
|
return bind
|
|
(cst_render_to_html,
|
|
function(args){
|
|
if(args){
|
|
var expr = args[1];
|
|
if(typeof expr !== "number" && 2 === expr[0] && ! args[2]){
|
|
var src = expr[1], exprs = Sx_parser[15].call(null, src);
|
|
if(exprs)
|
|
if(exprs[2])
|
|
var expr$0 = [5, [0, h, exprs]];
|
|
else
|
|
var e$0 = exprs[1], expr$0 = e$0;
|
|
else
|
|
var expr$0 = 0;
|
|
return [2, render_to_html(expr$0, env)];
|
|
}
|
|
var match = args[2];
|
|
if(! match) return [2, render_to_html(expr, env)];
|
|
var a = match[1];
|
|
if(typeof a !== "number" && 18 === a[0] && ! match[2]){var e = a[1]; return [2, render_to_html(expr, e)];}
|
|
}
|
|
return g;
|
|
});
|
|
}
|
|
runtime.caml_register_global
|
|
(86,
|
|
[0,
|
|
html_tags,
|
|
void_elements,
|
|
boolean_attrs,
|
|
is_html_tag,
|
|
is_void,
|
|
is_boolean_attr,
|
|
escape_html,
|
|
render_attrs,
|
|
render_to_html_ref,
|
|
render_to_html,
|
|
render_children,
|
|
parse_element_args,
|
|
render_html_element,
|
|
render_component,
|
|
expand_macro,
|
|
do_render_to_html,
|
|
render_list_to_html,
|
|
render_cond,
|
|
render_let,
|
|
render_map,
|
|
render_for_each,
|
|
setup_render_env],
|
|
"Sx_render");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 15 "../.js/default/js_of_ocaml-compiler.runtime/jsoo_runtime.cma.js"
|
|
//# shape: Jsoo_runtime__Runtime_version:[N,N]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var runtime = globalThis.jsoo_runtime;
|
|
runtime.caml_register_global
|
|
(2, [0, "6.3.2", ""], "Jsoo_runtime__Runtime_version");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 28 "../.js/default/js_of_ocaml-compiler.runtime/jsoo_runtime.cma.js"
|
|
//# shape: Jsoo_runtime:[[],[[F(1)],N,N],[F(1),F(2),F(1),N],[],[[]],[],[]]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
global_data = runtime.caml_get_global_data(),
|
|
Assert_failure = global_data.Assert_failure,
|
|
Jsoo_runtime_Runtime_version = global_data.Jsoo_runtime__Runtime_version,
|
|
Stdlib_Callback = global_data.Stdlib__Callback,
|
|
a = [0, "lib/runtime/jsoo_runtime.ml", 166, 13];
|
|
function effects(param){
|
|
var match = runtime.caml_jsoo_flags_effects(0);
|
|
if(match === "cps") return 3356934;
|
|
if(match === "disabled") return -709493348;
|
|
if(match !== "double-translation")
|
|
throw caml_maybe_attach_backtrace([0, Assert_failure, a], 1);
|
|
return -766114909;
|
|
}
|
|
var
|
|
version = Jsoo_runtime_Runtime_version[1],
|
|
git_version = Jsoo_runtime_Runtime_version[2],
|
|
Exn = [248, "Jsoo_runtime.Error.Exn", runtime.caml_fresh_oo_id(0)];
|
|
Stdlib_Callback[2].call(null, "jsError", [0, Exn, [0]]);
|
|
var
|
|
Error =
|
|
[0,
|
|
runtime.caml_throw_js_exception,
|
|
runtime.caml_exn_with_js_backtrace,
|
|
runtime.caml_js_error_option_of_exception,
|
|
Exn];
|
|
runtime.caml_register_global
|
|
(9,
|
|
[0,
|
|
[0],
|
|
[0, [0, effects], version, git_version],
|
|
Error,
|
|
[0],
|
|
[0, [0]],
|
|
[0],
|
|
[0]],
|
|
"Jsoo_runtime");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 16 "../.js/default/js_of_ocaml/js_of_ocaml.cma.js"
|
|
//# shape: Js_of_ocaml__Import:[[],[F(2)*,F(2)*],[F(2),F(2),N,F(1),F(1),F(5),F(2),F(2)*,F(2)*,F(2),F(2),F(3),F(3),F(2),F(3),F(2),F(2),F(2),F(3),F(3),F(2),F(2),F(1),F(1),F(1),F(1),F(1),F(1),F(2),F(2),F(3),F(3),F(3),F(3),F(2),F(2),F(2),F(2),F(1)*,F(1)*,F(1),F(2),F(1),F(2),F(1),F(2),F(1),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(2),F(1),F(2),F(2),F(2),F(2),F(2),F(2),F(2)*],[F(1),F(1),F(1)*,F(1)*,F(2)*,F(2)*,F(1)*,F(2)*],F(2)*,F(2)*]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
global_data = runtime.caml_get_global_data(),
|
|
Stdlib_String = global_data.Stdlib__String,
|
|
Stdlib_Char = global_data.Stdlib__Char;
|
|
function max(x, y){return y <= x ? x : y;}
|
|
function min(x, y){return x <= y ? x : y;}
|
|
var
|
|
make = Stdlib_String[1],
|
|
init = Stdlib_String[2],
|
|
empty = Stdlib_String[3],
|
|
of_bytes = Stdlib_String[4],
|
|
to_bytes = Stdlib_String[5],
|
|
blit = Stdlib_String[6],
|
|
concat = Stdlib_String[7],
|
|
cat = Stdlib_String[8],
|
|
compare = Stdlib_String[10],
|
|
starts_with = Stdlib_String[11],
|
|
ends_with = Stdlib_String[12],
|
|
contains_from = Stdlib_String[13],
|
|
rcontains_from = Stdlib_String[14],
|
|
contains = Stdlib_String[15],
|
|
sub = Stdlib_String[16],
|
|
split_on_char = Stdlib_String[17],
|
|
map = Stdlib_String[18],
|
|
mapi = Stdlib_String[19],
|
|
fold_left = Stdlib_String[20],
|
|
fold_right = Stdlib_String[21],
|
|
for_all = Stdlib_String[22],
|
|
exists = Stdlib_String[23],
|
|
trim = Stdlib_String[24],
|
|
escaped = Stdlib_String[25],
|
|
uppercase_ascii = Stdlib_String[26],
|
|
lowercase_ascii = Stdlib_String[27],
|
|
capitalize_ascii = Stdlib_String[28],
|
|
uncapitalize_ascii = Stdlib_String[29],
|
|
iter = Stdlib_String[30],
|
|
iteri = Stdlib_String[31],
|
|
index_from = Stdlib_String[32],
|
|
index_from_opt = Stdlib_String[33],
|
|
rindex_from = Stdlib_String[34],
|
|
rindex_from_opt = Stdlib_String[35],
|
|
index = Stdlib_String[36],
|
|
index_opt = Stdlib_String[37],
|
|
rindex = Stdlib_String[38],
|
|
rindex_opt = Stdlib_String[39],
|
|
to_seq = Stdlib_String[40],
|
|
to_seqi = Stdlib_String[41],
|
|
of_seq = Stdlib_String[42],
|
|
get_utf_8_uchar = Stdlib_String[43],
|
|
is_valid_utf_8 = Stdlib_String[44],
|
|
get_utf_16be_uchar = Stdlib_String[45],
|
|
is_valid_utf_16be = Stdlib_String[46],
|
|
get_utf_16le_uchar = Stdlib_String[47],
|
|
is_valid_utf_16le = Stdlib_String[48],
|
|
get_uint8 = Stdlib_String[49],
|
|
get_int8 = Stdlib_String[50],
|
|
get_uint16_ne = Stdlib_String[51],
|
|
get_uint16_be = Stdlib_String[52],
|
|
get_uint16_le = Stdlib_String[53],
|
|
get_int16_ne = Stdlib_String[54],
|
|
get_int16_be = Stdlib_String[55],
|
|
get_int16_le = Stdlib_String[56],
|
|
get_int32_ne = Stdlib_String[57],
|
|
hash = Stdlib_String[58],
|
|
seeded_hash = Stdlib_String[59],
|
|
get_int32_be = Stdlib_String[60],
|
|
get_int32_le = Stdlib_String[61],
|
|
get_int64_ne = Stdlib_String[62],
|
|
get_int64_be = Stdlib_String[63],
|
|
get_int64_le = Stdlib_String[64],
|
|
equal = runtime.caml_string_equal,
|
|
chr = Stdlib_Char[1],
|
|
escaped$0 = Stdlib_Char[2],
|
|
lowercase_ascii$0 = Stdlib_Char[3],
|
|
uppercase_ascii$0 = Stdlib_Char[4],
|
|
compare$0 = Stdlib_Char[5],
|
|
seeded_hash$0 = Stdlib_Char[7],
|
|
hash$0 = Stdlib_Char[8];
|
|
function equal$0(x, y){return x === y ? 1 : 0;}
|
|
runtime.caml_register_global
|
|
(2,
|
|
[0,
|
|
[0],
|
|
[0, max, min],
|
|
[0,
|
|
make,
|
|
init,
|
|
empty,
|
|
of_bytes,
|
|
to_bytes,
|
|
blit,
|
|
concat,
|
|
cat,
|
|
compare,
|
|
starts_with,
|
|
ends_with,
|
|
contains_from,
|
|
rcontains_from,
|
|
contains,
|
|
sub,
|
|
split_on_char,
|
|
map,
|
|
mapi,
|
|
fold_left,
|
|
fold_right,
|
|
for_all,
|
|
exists,
|
|
trim,
|
|
escaped,
|
|
uppercase_ascii,
|
|
lowercase_ascii,
|
|
capitalize_ascii,
|
|
uncapitalize_ascii,
|
|
iter,
|
|
iteri,
|
|
index_from,
|
|
index_from_opt,
|
|
rindex_from,
|
|
rindex_from_opt,
|
|
index,
|
|
index_opt,
|
|
rindex,
|
|
rindex_opt,
|
|
to_seq,
|
|
to_seqi,
|
|
of_seq,
|
|
get_utf_8_uchar,
|
|
is_valid_utf_8,
|
|
get_utf_16be_uchar,
|
|
is_valid_utf_16be,
|
|
get_utf_16le_uchar,
|
|
is_valid_utf_16le,
|
|
get_uint8,
|
|
get_int8,
|
|
get_uint16_ne,
|
|
get_uint16_be,
|
|
get_uint16_le,
|
|
get_int16_ne,
|
|
get_int16_be,
|
|
get_int16_le,
|
|
get_int32_ne,
|
|
hash,
|
|
seeded_hash,
|
|
get_int32_be,
|
|
get_int32_le,
|
|
get_int64_ne,
|
|
get_int64_be,
|
|
get_int64_le,
|
|
equal],
|
|
[0,
|
|
chr,
|
|
escaped$0,
|
|
lowercase_ascii$0,
|
|
uppercase_ascii$0,
|
|
compare$0,
|
|
seeded_hash$0,
|
|
hash$0,
|
|
equal$0],
|
|
max,
|
|
min],
|
|
"Js_of_ocaml__Import");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 188 "../.js/default/js_of_ocaml/js_of_ocaml.cma.js"
|
|
//# shape: Js_of_ocaml__Js:[N,F(1)*,N,F(1)*,[N,F(1)*,F(2),F(2),F(1)*,F(2),F(3),F(2),F(1)*,F(1)*],[N,F(1)*,F(2),F(2),F(1)*,F(2),F(3),F(2),F(1)*,F(1)*],N,N,N,N,N,N,N,N,N,N,F(1),N,N,F(2),F(3),F(2),F(2),F(1)*,F(1)*,N,N,N,N,N,N,N,N,N,N,N,N,N,F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(3),F(3),F(2),F(1),[N],F(1),F(1),F(2),F(1),N]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
jsoo_exports = typeof module === "object" && module.exports || globalThis,
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_js_get = runtime.caml_js_get,
|
|
caml_js_set = runtime.caml_js_set,
|
|
caml_js_wrap_callback = runtime.caml_js_wrap_callback,
|
|
caml_string_of_jsstring = runtime.caml_string_of_jsstring;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
function caml_call2(f, a0, a1){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 2
|
|
? f(a0, a1)
|
|
: runtime.caml_call_gen(f, [a0, a1]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Js_of_ocaml_Import = global_data.Js_of_ocaml__Import,
|
|
Stdlib = global_data.Stdlib,
|
|
Jsoo_runtime = global_data.Jsoo_runtime,
|
|
Stdlib_Printexc = global_data.Stdlib__Printexc,
|
|
global = globalThis,
|
|
null$ = null,
|
|
undefined$ = undefined;
|
|
function return$(a){return a;}
|
|
function map(x, f){return x == null$ ? null$ : caml_call1(f, x);}
|
|
function bind(x, f){return x == null$ ? null$ : caml_call1(f, x);}
|
|
function test(x){return 1 - (x == null$);}
|
|
function iter(x, f){
|
|
var a = 1 - (x == null$);
|
|
return a ? caml_call1(f, x) : a;
|
|
}
|
|
function case$(x, f, g){
|
|
return x == null$ ? caml_call1(f, 0) : caml_call1(g, x);
|
|
}
|
|
function get(x, f){return x == null$ ? caml_call1(f, 0) : x;}
|
|
function option(x){if(! x) return null$; var x$0 = x[1]; return x$0;}
|
|
function to_option(x){return x == null$ ? 0 : [0, x];}
|
|
function return$0(a){return a;}
|
|
function map$0(x, f){
|
|
return x === undefined$ ? undefined$ : caml_call1(f, x);
|
|
}
|
|
function bind$0(x, f){
|
|
return x === undefined$ ? undefined$ : caml_call1(f, x);
|
|
}
|
|
function test$0(x){return 1 - (x === undefined$);}
|
|
function iter$0(x, f){
|
|
var a = 1 - (x === undefined$);
|
|
return a ? caml_call1(f, x) : a;
|
|
}
|
|
function case$0(x, f, g){
|
|
return x === undefined$ ? caml_call1(f, 0) : caml_call1(g, x);
|
|
}
|
|
function get$0(x, f){return x === undefined$ ? caml_call1(f, 0) : x;}
|
|
function option$0(x){
|
|
if(! x) return undefined$;
|
|
var x$0 = x[1];
|
|
return x$0;
|
|
}
|
|
function to_option$0(x){return x === undefined$ ? 0 : [0, x];}
|
|
function coerce(x, f, g){
|
|
var x$0 = caml_call1(f, x);
|
|
return x$0 == null$ ? caml_call1(g, x) : x$0;
|
|
}
|
|
function coerce_opt(x, f, g){
|
|
var x$0 = bind(x, f);
|
|
return x$0 == null$ ? caml_call1(g, x) : x$0;
|
|
}
|
|
var
|
|
string_constr = global.String,
|
|
regExp = global.RegExp,
|
|
object_constructor = global.Object;
|
|
function object_keys(t4){return object_constructor.keys(t4);}
|
|
var array_constructor = global.Array;
|
|
function array_map(f, t6){
|
|
var
|
|
cb =
|
|
caml_js_wrap_callback
|
|
(function(x, idx, param){return caml_call1(f, x);});
|
|
return t6.map(cb);
|
|
}
|
|
function array_mapi(f, t6){
|
|
var
|
|
cb =
|
|
caml_js_wrap_callback
|
|
(function(x, idx, param){return caml_call2(f, idx, x);});
|
|
return t6.map(cb);
|
|
}
|
|
function str_array(a){return a;}
|
|
function match_result(a){return a;}
|
|
var
|
|
date_constr = global.Date,
|
|
math = global.Math,
|
|
error_constr = global.Error,
|
|
include = Jsoo_runtime[3],
|
|
raise = include[1],
|
|
exn_with_js_backtrace = include[2],
|
|
of_exn = include[3],
|
|
Error = include[4];
|
|
function name(t11){return caml_string_of_jsstring(t11.name);}
|
|
function message(t12){return caml_string_of_jsstring(t12.message);}
|
|
function stack(t13){
|
|
var x = t13.stack, a = x == null$ ? null$ : caml_string_of_jsstring(x);
|
|
return to_option(a);
|
|
}
|
|
function to_string(t14){return caml_string_of_jsstring(t14.toString());}
|
|
function raise_js_error(e){return raise(e);}
|
|
function string_of_error(e){return to_string(e);}
|
|
var JSON = global.JSON;
|
|
function decodeURI(s){return global.decodeURI(s);}
|
|
function decodeURIComponent(s){return global.decodeURIComponent(s);}
|
|
function encodeURI(s){return global.encodeURI(s);}
|
|
function encodeURIComponent(s){return global.encodeURIComponent(s);}
|
|
function escape(s){return global.escape(s);}
|
|
function unescape(s){return global.unescape(s);}
|
|
function isNaN(i){return global.isNaN(i) | 0;}
|
|
function parseInt(s){
|
|
var s$0 = global.parseInt(s);
|
|
return isNaN(s$0) ? Stdlib[2].call(null, "parseInt") : s$0;
|
|
}
|
|
function parseFloat(s){
|
|
var s$0 = global.parseFloat(s);
|
|
return isNaN(s$0) ? Stdlib[2].call(null, "parseFloat") : s$0;
|
|
}
|
|
Stdlib_Printexc[9].call
|
|
(null,
|
|
function(e){
|
|
if(e instanceof error_constr) return [0, to_string(e)];
|
|
if(e[1] !== Error) return 0;
|
|
var e$0 = e[2];
|
|
return [0, to_string(e$0)];
|
|
});
|
|
function export_js(field, x){
|
|
var
|
|
a = caml_string_of_jsstring(typeof x),
|
|
b =
|
|
Js_of_ocaml_Import[3][64].call(null, a, "function")
|
|
? 0 < x.length ? caml_js_wrap_callback(x) : x
|
|
: x;
|
|
return jsoo_exports[field] = b;
|
|
}
|
|
function export$(field, x){
|
|
return export_js(runtime.caml_jsstring_of_string(field), x);
|
|
}
|
|
function export_all(obj){
|
|
var
|
|
keys = object_constructor.keys(obj),
|
|
t26 =
|
|
caml_js_wrap_callback
|
|
(function(key, a, param){return export_js(key, obj[key]);});
|
|
return keys.forEach(t26);
|
|
}
|
|
var
|
|
Js_of_ocaml_Js =
|
|
[0,
|
|
null$,
|
|
function(a){return a;},
|
|
undefined$,
|
|
function(a){return a;},
|
|
[0,
|
|
null$,
|
|
return$,
|
|
map,
|
|
bind,
|
|
test,
|
|
iter,
|
|
case$,
|
|
get,
|
|
option,
|
|
to_option],
|
|
[0,
|
|
undefined$,
|
|
return$0,
|
|
map$0,
|
|
bind$0,
|
|
test$0,
|
|
iter$0,
|
|
case$0,
|
|
get$0,
|
|
option$0,
|
|
to_option$0],
|
|
true,
|
|
false,
|
|
"NFD",
|
|
"NFC",
|
|
"NFKD",
|
|
"NFKC",
|
|
string_constr,
|
|
regExp,
|
|
regExp,
|
|
regExp,
|
|
object_keys,
|
|
array_constructor,
|
|
array_constructor,
|
|
caml_js_get,
|
|
caml_js_set,
|
|
array_map,
|
|
array_mapi,
|
|
str_array,
|
|
match_result,
|
|
date_constr,
|
|
date_constr,
|
|
date_constr,
|
|
date_constr,
|
|
date_constr,
|
|
date_constr,
|
|
date_constr,
|
|
date_constr,
|
|
date_constr,
|
|
math,
|
|
error_constr,
|
|
[0,
|
|
to_string,
|
|
name,
|
|
message,
|
|
stack,
|
|
raise,
|
|
exn_with_js_backtrace,
|
|
of_exn,
|
|
Error,
|
|
function(a){return a;},
|
|
function(a){return a;}],
|
|
JSON,
|
|
decodeURI,
|
|
decodeURIComponent,
|
|
encodeURI,
|
|
encodeURIComponent,
|
|
escape,
|
|
unescape,
|
|
isNaN,
|
|
parseInt,
|
|
parseFloat,
|
|
coerce,
|
|
coerce_opt,
|
|
export$,
|
|
export_all,
|
|
[0, global],
|
|
string_of_error,
|
|
raise_js_error,
|
|
exn_with_js_backtrace,
|
|
runtime.caml_js_error_of_exception,
|
|
Error];
|
|
runtime.caml_register_global(42, Js_of_ocaml_Js, "Js_of_ocaml__Js");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 5 ".sx_browser.eobjs/jsoo/dune__exe__Sx_browser.cmo.js"
|
|
//# shape: Dune__exe__Sx_browser:[]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var
|
|
runtime = globalThis.jsoo_runtime,
|
|
caml_int_of_string = runtime.caml_int_of_string,
|
|
caml_js_from_array = runtime.caml_js_from_array,
|
|
caml_js_wrap_callback = runtime.caml_js_wrap_callback,
|
|
caml_jsstring_of_string = runtime.caml_jsstring_of_string,
|
|
caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace,
|
|
caml_string_of_jsstring = runtime.caml_string_of_jsstring,
|
|
caml_wrap_exception = runtime.caml_wrap_exception;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
var
|
|
global_data = runtime.caml_get_global_data(),
|
|
Sx_types = global_data.Sx_types,
|
|
Stdlib = global_data.Stdlib,
|
|
Js_of_ocaml_Js = global_data.Js_of_ocaml__Js,
|
|
Stdlib_Hashtbl = global_data.Stdlib__Hashtbl,
|
|
Stdlib_List = global_data.Stdlib__List,
|
|
Stdlib_Array = global_data.Stdlib__Array,
|
|
Stdlib_Option = global_data.Stdlib__Option,
|
|
Sx_vm = global_data.Sx_vm,
|
|
Sx_ref = global_data.Sx_ref,
|
|
Sx_primitives = global_data.Sx_primitives,
|
|
Sx_render = global_data.Sx_render,
|
|
Stdlib_String = global_data.Stdlib__String,
|
|
Sx_runtime = global_data.Sx_runtime,
|
|
Sx_parser = global_data.Sx_parser,
|
|
Stdlib_Printexc = global_data.Stdlib__Printexc,
|
|
Stdlib_Printf = global_data.Stdlib__Printf,
|
|
Sx_scope = global_data.Sx_scope,
|
|
handle_table = Stdlib_Hashtbl[1].call(null, 0, 256),
|
|
next_handle = [0, 0];
|
|
function alloc_handle(v){
|
|
var id = next_handle[1];
|
|
next_handle[1]++;
|
|
Stdlib_Hashtbl[11].call(null, handle_table, id, v);
|
|
return id;
|
|
}
|
|
var
|
|
a =
|
|
[0,
|
|
[11, "Invalid SX handle: ", [4, 0, 0, 0, 0]],
|
|
"Invalid SX handle: %d"];
|
|
function get_handle(id){
|
|
var match = Stdlib_Hashtbl[7].call(null, handle_table, id);
|
|
if(match){var v = match[1]; return v;}
|
|
var b = caml_call1(Stdlib_Printf[4].call(null, a), id);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
|
|
}
|
|
var
|
|
alloc_host_handle =
|
|
function(){
|
|
var t = {}, n = 0;
|
|
return {put: function(obj){var id = n++; t[id] = obj; return id;},
|
|
get: function(id){return t[id];}};
|
|
}
|
|
();
|
|
Sx_scope[3].call(null, 0);
|
|
var global_env = Sx_types[9].call(null, 0);
|
|
function call_sx_fn(fn, args){
|
|
return Sx_ref[127].call(null, [5, [0, fn, args]], [18, global_env]);
|
|
}
|
|
function tag_fn(fn, handle, type){
|
|
fn.__sx_handle = handle;
|
|
fn._type = type;
|
|
return fn;
|
|
}
|
|
var
|
|
dummy = 0,
|
|
cst_host_handle = "__host_handle",
|
|
cst_dict = "dict",
|
|
cst_keyword = "keyword",
|
|
cst_list = "list",
|
|
cst_symbol = "symbol";
|
|
function value_to_js(v){
|
|
if(typeof v === "number") return Js_of_ocaml_Js[1];
|
|
switch(v[0]){
|
|
case 0:
|
|
var b = v[1]; return ! ! b;
|
|
case 1:
|
|
var n = v[1]; return n;
|
|
case 3:
|
|
var s$0 = v[1];
|
|
return {_type: cst_symbol, name: caml_jsstring_of_string(s$0)};
|
|
case 4:
|
|
var k = v[1];
|
|
return {_type: cst_keyword, name: caml_jsstring_of_string(k)};
|
|
case 5:
|
|
var items = v[1]; break;
|
|
case 6:
|
|
var d = v[1], match = Stdlib_Hashtbl[7].call(null, d, cst_host_handle);
|
|
if(match){
|
|
var match$0 = match[1];
|
|
if(typeof match$0 !== "number" && 1 === match$0[0]){
|
|
var n$0 = match$0[1], id = n$0 | 0;
|
|
return alloc_host_handle.get(id);
|
|
}
|
|
}
|
|
var obj = {};
|
|
obj._type = cst_dict;
|
|
Stdlib_Hashtbl[12].call
|
|
(null,
|
|
function(k, v){
|
|
return obj[caml_jsstring_of_string(k)] = value_to_js(v);
|
|
},
|
|
d);
|
|
return obj;
|
|
case 19:
|
|
var items = v[1][1]; break;
|
|
case 2:
|
|
case 15:
|
|
var s = v[1]; return caml_jsstring_of_string(s);
|
|
case 7:
|
|
case 12:
|
|
case 13:
|
|
case 22:
|
|
var
|
|
handle = alloc_handle(v),
|
|
inner =
|
|
caml_js_wrap_callback
|
|
(function(args_js){
|
|
try{
|
|
var
|
|
arg = js_to_value(args_js),
|
|
args = typeof arg === "number" ? 0 : [0, arg, 0],
|
|
result = call_sx_fn(v, args),
|
|
b = value_to_js(result);
|
|
return b;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn[1] !== Sx_types[7])
|
|
throw caml_maybe_attach_backtrace(exn, 0);
|
|
var
|
|
msg = exn[2],
|
|
a =
|
|
caml_jsstring_of_string(Stdlib[28].call(null, "[sx] ", msg));
|
|
Js_of_ocaml_Js[52][1].console.error(a);
|
|
return Js_of_ocaml_Js[1];
|
|
}
|
|
});
|
|
return tag_fn
|
|
(inner,
|
|
handle,
|
|
caml_jsstring_of_string(Sx_types[31].call(null, v)));
|
|
default:
|
|
var handle$0 = alloc_handle(v);
|
|
return {_type: caml_jsstring_of_string(Sx_types[31].call(null, v)),
|
|
__sx_handle: handle$0};
|
|
}
|
|
var
|
|
a = Stdlib_List[20].call(null, value_to_js, items),
|
|
arr = Stdlib_Array[11].call(null, a);
|
|
return {_type: cst_list, items: caml_js_from_array(arr)};
|
|
}
|
|
var next_host_handle = [0, 0];
|
|
function js_to_value(obj){
|
|
if(obj != Js_of_ocaml_Js[1] && obj != Js_of_ocaml_Js[3]){
|
|
var ty = caml_string_of_jsstring(typeof obj);
|
|
if(ty === "boolean") return [0, obj | 0];
|
|
if(ty === "function"){
|
|
var h$0 = obj.__sx_handle;
|
|
return h$0 == Js_of_ocaml_Js[3]
|
|
? [13,
|
|
"js-callback",
|
|
function(args){
|
|
var
|
|
a = Stdlib_List[20].call(null, value_to_js, args),
|
|
js_args = Stdlib_Array[11].call(null, a);
|
|
return js_to_value
|
|
(runtime.caml_js_fun_call
|
|
(obj,
|
|
Stdlib_Array[14].call(null, function(a){return a;}, js_args)));
|
|
}]
|
|
: get_handle(h$0 | 0);
|
|
}
|
|
if(ty === "number") return [1, obj];
|
|
if(ty !== "object")
|
|
return ty !== "string" ? 0 : [2, caml_string_of_jsstring(obj)];
|
|
var h = obj.__sx_handle;
|
|
if(h != Js_of_ocaml_Js[3]) return get_handle(h | 0);
|
|
var type_field = obj._type;
|
|
if(type_field == Js_of_ocaml_Js[3]){
|
|
var t0 = Js_of_ocaml_Js[52][1], t1 = t0.Array;
|
|
if(t1.isArray(obj) | 0){
|
|
var n = obj.length | 0;
|
|
return [5,
|
|
Stdlib_List[11].call
|
|
(null,
|
|
n,
|
|
function(i){
|
|
var
|
|
a = Js_of_ocaml_Js[20].call(null, obj, i),
|
|
b = Js_of_ocaml_Js[6][10].call(null, a);
|
|
return js_to_value(Stdlib_Option[4].call(null, b));
|
|
})];
|
|
}
|
|
var id = next_host_handle[1];
|
|
next_host_handle[1]++;
|
|
alloc_host_handle.put(obj);
|
|
var d = Stdlib_Hashtbl[1].call(null, 0, 2);
|
|
Stdlib_Hashtbl[11].call(null, d, cst_host_handle, [1, id]);
|
|
return [6, d];
|
|
}
|
|
var tag = caml_string_of_jsstring(type_field);
|
|
if(tag !== cst_dict){
|
|
if(tag === cst_keyword) return [4, caml_string_of_jsstring(obj.name)];
|
|
if(tag !== cst_list)
|
|
return tag !== cst_symbol ? 0 : [3, caml_string_of_jsstring(obj.name)];
|
|
var items_js = obj.items, n$0 = items_js.length | 0;
|
|
return [5,
|
|
Stdlib_List[11].call
|
|
(null,
|
|
n$0,
|
|
function(i){
|
|
var
|
|
a = Js_of_ocaml_Js[20].call(null, items_js, i),
|
|
b = Js_of_ocaml_Js[6][10].call(null, a);
|
|
return js_to_value(Stdlib_Option[4].call(null, b));
|
|
})];
|
|
}
|
|
var
|
|
d$0 = Stdlib_Hashtbl[1].call(null, 0, 8),
|
|
t3 = Js_of_ocaml_Js[52][1],
|
|
t4 = t3.Object,
|
|
keys = t4.keys(obj),
|
|
len = keys.length,
|
|
a = len - 1 | 0;
|
|
if(a >= 0){
|
|
var i = 0;
|
|
for(;;){
|
|
var
|
|
b = Js_of_ocaml_Js[20].call(null, keys, i),
|
|
c = Js_of_ocaml_Js[6][10].call(null, b),
|
|
k = caml_string_of_jsstring(Stdlib_Option[4].call(null, c));
|
|
if(k !== "_type"){
|
|
var e = js_to_value(obj[caml_jsstring_of_string(k)]);
|
|
Stdlib_Hashtbl[11].call(null, d$0, k, e);
|
|
}
|
|
var f = i + 1 | 0;
|
|
if(a === i) break;
|
|
i = f;
|
|
}
|
|
}
|
|
return [6, d$0];
|
|
}
|
|
return 0;
|
|
}
|
|
function return_via_side_channel(v){
|
|
Js_of_ocaml_Js[52][1].__sxR = v;
|
|
return v;
|
|
}
|
|
var cst_Parse_error = "Parse error: ";
|
|
function api_parse(src_js){
|
|
var src = caml_string_of_jsstring(src_js);
|
|
try{
|
|
var
|
|
values = Sx_parser[15].call(null, src),
|
|
b = Stdlib_List[20].call(null, value_to_js, values),
|
|
a = caml_js_from_array(Stdlib_Array[11].call(null, b));
|
|
return a;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn[1] !== Sx_types[8]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var msg = exn[2];
|
|
return caml_jsstring_of_string
|
|
(Stdlib[28].call(null, cst_Parse_error, msg));
|
|
}
|
|
}
|
|
var cst_Error = "Error: ";
|
|
function api_eval(src_js){
|
|
var src = caml_string_of_jsstring(src_js);
|
|
try{
|
|
var
|
|
exprs = Sx_parser[15].call(null, src),
|
|
env = [18, global_env],
|
|
result =
|
|
Stdlib_List[26].call
|
|
(null,
|
|
function(acc, expr){return Sx_ref[127].call(null, expr, env);},
|
|
0,
|
|
exprs),
|
|
a = return_via_side_channel(value_to_js(result));
|
|
return a;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn[1] === Sx_types[7]){
|
|
var msg = exn[2];
|
|
return caml_jsstring_of_string(Stdlib[28].call(null, cst_Error, msg));
|
|
}
|
|
if(exn[1] !== Sx_types[8]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var msg$0 = exn[2];
|
|
return caml_jsstring_of_string
|
|
(Stdlib[28].call(null, cst_Parse_error, msg$0));
|
|
}
|
|
}
|
|
function api_eval_expr(expr_js, env_js){
|
|
var expr = js_to_value(expr_js);
|
|
try{
|
|
var
|
|
a =
|
|
return_via_side_channel
|
|
(value_to_js(Sx_ref[127].call(null, expr, [18, global_env])));
|
|
return a;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn[1] !== Sx_types[7]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var msg = exn[2];
|
|
return caml_jsstring_of_string(Stdlib[28].call(null, cst_Error, msg));
|
|
}
|
|
}
|
|
function api_load(src_js){
|
|
var src = caml_string_of_jsstring(src_js);
|
|
try{
|
|
var
|
|
exprs = Sx_parser[15].call(null, src),
|
|
env = [18, global_env],
|
|
count = [0, 0];
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(expr){
|
|
Sx_ref[127].call(null, expr, env);
|
|
count[1]++;
|
|
return 0;
|
|
},
|
|
exprs);
|
|
var a = count[1];
|
|
return a;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn[1] === Sx_types[7]){
|
|
var msg = exn[2];
|
|
return caml_jsstring_of_string(Stdlib[28].call(null, cst_Error, msg));
|
|
}
|
|
if(exn[1] !== Sx_types[8]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var msg$0 = exn[2];
|
|
return caml_jsstring_of_string
|
|
(Stdlib[28].call(null, cst_Parse_error, msg$0));
|
|
}
|
|
}
|
|
var sx_render_mode = [0, 0];
|
|
function api_render_to_html(expr_js){
|
|
var expr = js_to_value(expr_js), prev = sx_render_mode[1];
|
|
sx_render_mode[1] = 1;
|
|
try{
|
|
var html = Sx_render[10].call(null, expr, global_env);
|
|
sx_render_mode[1] = prev;
|
|
var a = caml_jsstring_of_string(html);
|
|
return a;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn[1] !== Sx_types[7]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var msg = exn[2];
|
|
sx_render_mode[1] = prev;
|
|
return caml_jsstring_of_string(Stdlib[28].call(null, cst_Error, msg));
|
|
}
|
|
}
|
|
function api_stringify(v_js){
|
|
var a = js_to_value(v_js);
|
|
return caml_jsstring_of_string(Sx_types[67].call(null, a));
|
|
}
|
|
function api_type_of(v_js){
|
|
var a = js_to_value(v_js);
|
|
return caml_jsstring_of_string(Sx_types[31].call(null, a));
|
|
}
|
|
function api_inspect(v_js){
|
|
var a = js_to_value(v_js);
|
|
return caml_jsstring_of_string(Sx_types[67].call(null, a));
|
|
}
|
|
function api_engine(param){return "ocaml-vm-wasm";}
|
|
function api_register_native(name_js, callback_js){
|
|
var name = caml_string_of_jsstring(name_js);
|
|
function native_fn(args){
|
|
var
|
|
a = Stdlib_List[20].call(null, value_to_js, args),
|
|
js_args = Stdlib_Array[11].call(null, a);
|
|
return js_to_value(callback_js(caml_js_from_array(js_args)));
|
|
}
|
|
Sx_types[11].call(null, global_env, name, [13, name, native_fn]);
|
|
return Js_of_ocaml_Js[1];
|
|
}
|
|
function api_call_fn(fn_js, args_js){
|
|
try{
|
|
var
|
|
fn = js_to_value(fn_js),
|
|
d =
|
|
Stdlib_Array[14].call
|
|
(null, js_to_value, runtime.caml_js_to_array(args_js)),
|
|
args = Stdlib_Array[10].call(null, d),
|
|
e = return_via_side_channel(value_to_js(call_sx_fn(fn, args)));
|
|
return e;
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0), cst_sx_callFn = "[sx] callFn: ";
|
|
if(exn[1] === Sx_types[7]){
|
|
var
|
|
msg = exn[2],
|
|
a = caml_jsstring_of_string(Stdlib[28].call(null, cst_sx_callFn, msg));
|
|
Js_of_ocaml_Js[52][1].console.error(a);
|
|
return Js_of_ocaml_Js[1];
|
|
}
|
|
var
|
|
b = Stdlib_Printexc[1].call(null, exn),
|
|
c = caml_jsstring_of_string(Stdlib[28].call(null, cst_sx_callFn, b));
|
|
Js_of_ocaml_Js[52][1].console.error(c);
|
|
return Js_of_ocaml_Js[1];
|
|
}
|
|
}
|
|
function api_is_callable(fn_js){
|
|
if(fn_js != Js_of_ocaml_Js[1] && fn_js != Js_of_ocaml_Js[3]){
|
|
var h = fn_js.__sx_handle;
|
|
if(h == Js_of_ocaml_Js[3]) return ! ! 0;
|
|
var a = get_handle(h | 0);
|
|
return ! ! Sx_types[39].call(null, a);
|
|
}
|
|
return ! ! 0;
|
|
}
|
|
function api_fn_arity(fn_js){
|
|
var h = fn_js.__sx_handle;
|
|
if(h == Js_of_ocaml_Js[3]) return -1.;
|
|
var v = get_handle(h | 0);
|
|
if(typeof v !== "number" && 7 === v[0]){
|
|
var l = v[1];
|
|
return Stdlib_List[1].call(null, l[1]);
|
|
}
|
|
return -1.;
|
|
}
|
|
function bind(name, fn){
|
|
Sx_types[11].call(null, global_env, name, [13, name, fn]);
|
|
}
|
|
var cst_cek_eval = "cek-eval";
|
|
bind
|
|
(cst_cek_eval,
|
|
function(args){
|
|
if(args){
|
|
var expr = args[1];
|
|
if(typeof expr !== "number" && 2 === expr[0] && ! args[2]){
|
|
var s = expr[1], e = Sx_parser[15].call(null, s);
|
|
if(! e) return 0;
|
|
var h = e[1];
|
|
return Sx_ref[127].call(null, h, [18, global_env]);
|
|
}
|
|
var match = args[2];
|
|
if(! match) return Sx_ref[127].call(null, expr, [18, global_env]);
|
|
if(! match[2]){
|
|
var env_val = match[1];
|
|
return Sx_ref[127].call(null, expr, env_val);
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "cek-eval: expected 1-2 args"], 1);
|
|
});
|
|
bind
|
|
("eval-expr-cek",
|
|
function(args){
|
|
if(args){
|
|
var match = args[2], expr = args[1];
|
|
if(! match) return Sx_ref[127].call(null, expr, [18, global_env]);
|
|
if(! match[2]){
|
|
var e = match[1];
|
|
return Sx_ref[127].call(null, expr, e);
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "eval-expr-cek: expected 1-2 args"], 1);
|
|
});
|
|
var cst_cek_call = "cek-call";
|
|
bind
|
|
(cst_cek_call,
|
|
function(args){
|
|
if(! args)
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "cek-call: expected function and args"], 1);
|
|
var f = args[1], match = args[2];
|
|
if(! match)
|
|
return Sx_ref[127].call(null, [5, [0, f, 0]], [18, global_env]);
|
|
var a = match[1];
|
|
if(typeof a === "number"){
|
|
if(! match[2])
|
|
return Sx_ref[127].call(null, [5, [0, f, 0]], [18, global_env]);
|
|
}
|
|
else
|
|
if(5 === a[0]){
|
|
if(! match[2]){
|
|
var al = a[1];
|
|
return Sx_ref[127].call(null, [5, [0, f, al]], [18, global_env]);
|
|
}
|
|
}
|
|
else if(! match[2])
|
|
return Sx_ref[127].call
|
|
(null, [5, [0, f, [0, a, 0]]], [18, global_env]);
|
|
var rest = args[2];
|
|
return Sx_ref[127].call(null, [5, [0, f, rest]], [18, global_env]);
|
|
});
|
|
bind
|
|
("sx-parse",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0] && ! args[2]){
|
|
var src = a[1];
|
|
return [5, Sx_parser[15].call(null, src)];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "sx-parse: expected string"], 1);
|
|
});
|
|
bind
|
|
("sx-serialize",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var v = args[1];
|
|
return [2, Sx_types[67].call(null, v)];
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "sx-serialize: expected 1 arg"], 1);
|
|
});
|
|
function deep_equal(a, b){
|
|
a:
|
|
if(typeof a === "number"){
|
|
if(typeof b === "number") return 1;
|
|
}
|
|
else{
|
|
switch(a[0]){
|
|
case 0:
|
|
if(typeof b === "number") break a;
|
|
if(0 !== b[0]) break a;
|
|
var b$0 = b[1], a$0 = a[1];
|
|
return a$0 === b$0 ? 1 : 0;
|
|
case 1:
|
|
if(typeof b === "number") break a;
|
|
if(1 !== b[0]) break a;
|
|
var b$1 = b[1], a$1 = a[1];
|
|
return a$1 === b$1 ? 1 : 0;
|
|
case 2:
|
|
if(typeof b === "number") break a;
|
|
if(2 !== b[0]) break a;
|
|
var b$2 = b[1], a$2 = a[1];
|
|
return a$2 === b$2 ? 1 : 0;
|
|
case 3:
|
|
if(typeof b === "number") break a;
|
|
if(3 !== b[0]) break a;
|
|
var b$3 = b[1], a$3 = a[1];
|
|
return a$3 === b$3 ? 1 : 0;
|
|
case 4:
|
|
if(typeof b === "number") break a;
|
|
if(4 !== b[0]) break a;
|
|
var b$4 = b[1], a$4 = a[1];
|
|
return a$4 === b$4 ? 1 : 0;
|
|
case 5:
|
|
var a$5 = a[1]; break;
|
|
case 6:
|
|
if(typeof b === "number") break a;
|
|
if(6 !== b[0]) break a;
|
|
var
|
|
b$6 = b[1],
|
|
a$6 = a[1],
|
|
ka =
|
|
Stdlib_Hashtbl[14].call
|
|
(null, function(k, param, acc){return [0, k, acc];}, a$6, 0),
|
|
kb =
|
|
Stdlib_Hashtbl[14].call
|
|
(null, function(k, param, acc){return [0, k, acc];}, b$6, 0),
|
|
f = Stdlib_List[1].call(null, kb),
|
|
d = Stdlib_List[1].call(null, ka) === f ? 1 : 0;
|
|
return d
|
|
? Stdlib_List
|
|
[33].call
|
|
(null,
|
|
function(k){
|
|
var a = Stdlib_Hashtbl[9].call(null, b$6, k);
|
|
if(! a) return a;
|
|
var b = Stdlib_Hashtbl[6].call(null, b$6, k);
|
|
return deep_equal(Stdlib_Hashtbl[6].call(null, a$6, k), b);
|
|
},
|
|
ka)
|
|
: d;
|
|
case 19:
|
|
var a$5 = a[1][1]; break;
|
|
default: break a;
|
|
}
|
|
if(typeof b !== "number"){
|
|
switch(b[0]){
|
|
case 5:
|
|
var b$5 = b[1]; break;
|
|
case 19:
|
|
var b$5 = b[1][1]; break;
|
|
default: break a;
|
|
}
|
|
var
|
|
e = Stdlib_List[1].call(null, b$5),
|
|
c = Stdlib_List[1].call(null, a$5) === e ? 1 : 0;
|
|
return c ? Stdlib_List[35].call(null, deep_equal, a$5, b$5) : c;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
bind
|
|
("equal?",
|
|
function(args){
|
|
if(args){
|
|
var c = args[2];
|
|
if(c && ! c[2]){
|
|
var b = c[1], a = args[1];
|
|
return [0, deep_equal(a, b)];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], "equal?: 2 args"], 1);
|
|
});
|
|
var b = [0, 1], c = [0, 1];
|
|
bind
|
|
("assert",
|
|
function(args){
|
|
if(args){
|
|
var match = args[2], cond = args[1];
|
|
if(! match){
|
|
if(1 - Sx_types[40].call(null, cond))
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "Assertion failed"], 1);
|
|
return c;
|
|
}
|
|
if(! match[2]){
|
|
var msg = match[1];
|
|
if(! (1 - Sx_types[40].call(null, cond))) return b;
|
|
var
|
|
a = Sx_types[19].call(null, msg),
|
|
d = Stdlib[28].call(null, "Assertion: ", a);
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], d], 1);
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "assert: 1-2 args"], 1);
|
|
});
|
|
var cst_error = "error", cst_ok = "ok", d = [0, 0], e = [0, 1];
|
|
bind
|
|
("try-call",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var thunk = args[1];
|
|
try{
|
|
Sx_ref[127].call(null, [5, [0, thunk, 0]], [18, global_env]);
|
|
var d$1 = Stdlib_Hashtbl[1].call(null, 0, 2);
|
|
Stdlib_Hashtbl[11].call(null, d$1, cst_ok, e);
|
|
return [6, d$1];
|
|
}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn[1] !== Sx_types[7]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var msg = exn[2], d$0 = Stdlib_Hashtbl[1].call(null, 0, 2);
|
|
Stdlib_Hashtbl[11].call(null, d$0, cst_ok, d);
|
|
Stdlib_Hashtbl[11].call(null, d$0, cst_error, [2, msg]);
|
|
return [6, d$0];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "try-call: 1 arg"], 1);
|
|
});
|
|
bind
|
|
("append!",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 5:
|
|
var b = args[2];
|
|
if(b && ! b[2]){
|
|
var v = b[1], items = a[1];
|
|
return [5, Stdlib[37].call(null, items, [0, v, 0])];
|
|
}
|
|
break;
|
|
case 19:
|
|
var c = args[2];
|
|
if(c && ! c[2]){
|
|
var v$0 = c[1], r = a[1];
|
|
r[1] = Stdlib[37].call(null, r[1], [0, v$0, 0]);
|
|
return [19, r];
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "append!: list and value"], 1);
|
|
});
|
|
var uw = Sx_runtime[97];
|
|
bind("make-env", function(param){return [18, Sx_types[9].call(null, 0)];});
|
|
bind("global-env", function(param){return [18, global_env];});
|
|
var cst_env_has = "env-has?";
|
|
bind
|
|
(cst_env_has,
|
|
function(args){
|
|
if(args){
|
|
var a = args[2];
|
|
if(a){
|
|
var b = a[1], e = args[1];
|
|
if(typeof b !== "number")
|
|
switch(b[0]){
|
|
case 2:
|
|
case 4:
|
|
if(! a[2]){
|
|
var k = b[1], c = uw(e);
|
|
return [0, Sx_types[13].call(null, c, k)];
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_env_has], 1);
|
|
});
|
|
var cst_env_get = "env-get";
|
|
bind
|
|
(cst_env_get,
|
|
function(args){
|
|
if(args){
|
|
var a = args[2];
|
|
if(a){
|
|
var b = a[1], e = args[1];
|
|
if(typeof b !== "number")
|
|
switch(b[0]){
|
|
case 2:
|
|
case 4:
|
|
if(! a[2]){
|
|
var k = b[1], c = uw(e);
|
|
return Sx_types[15].call(null, c, k);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_env_get], 1);
|
|
});
|
|
var cst_env_bind = "env-bind!";
|
|
bind
|
|
(cst_env_bind,
|
|
function(args){
|
|
if(args){
|
|
var a = args[2];
|
|
if(a){
|
|
var b = a[1], e = args[1];
|
|
if(typeof b !== "number")
|
|
switch(b[0]){
|
|
case 2:
|
|
case 4:
|
|
var c = a[2];
|
|
if(c && ! c[2]){
|
|
var v = c[1], k = b[1], d = uw(e);
|
|
return Sx_types[11].call(null, d, k, v);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_env_bind], 1);
|
|
});
|
|
var cst_env_set = "env-set!";
|
|
bind
|
|
(cst_env_set,
|
|
function(args){
|
|
if(args){
|
|
var a = args[2];
|
|
if(a){
|
|
var b = a[1], e = args[1];
|
|
if(typeof b !== "number")
|
|
switch(b[0]){
|
|
case 2:
|
|
case 4:
|
|
var c = a[2];
|
|
if(c && ! c[2]){
|
|
var v = c[1], k = b[1], d = uw(e);
|
|
return Sx_types[17].call(null, d, k, v);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_env_set], 1);
|
|
});
|
|
var cst_env_extend = "env-extend";
|
|
bind
|
|
(cst_env_extend,
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var e = args[1], a = uw(e);
|
|
return [18, Sx_types[10].call(null, a)];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_env_extend], 1);
|
|
});
|
|
var cst_env_merge = "env-merge";
|
|
bind
|
|
(cst_env_merge,
|
|
function(args){
|
|
if(args){
|
|
var c = args[2];
|
|
if(c && ! c[2]){
|
|
var b = c[1], a = args[1];
|
|
return Sx_runtime[104].call(null, a, b);
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_env_merge], 1);
|
|
});
|
|
var cst_make_symbol = "make-symbol";
|
|
bind
|
|
(cst_make_symbol,
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var v = args[1];
|
|
if(typeof v !== "number" && 2 === v[0]){
|
|
if(args[2]) break a;
|
|
var s = v[1];
|
|
return [3, s];
|
|
}
|
|
if(! args[2]) return [3, Sx_types[19].call(null, v)];
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_make_symbol], 1);
|
|
});
|
|
var cst_make_keyword = "make-keyword";
|
|
bind
|
|
(cst_make_keyword,
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0] && ! args[2]){var s = a[1]; return [4, s];}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_make_keyword], 1);
|
|
});
|
|
var cst_keyword_name = "keyword-name";
|
|
bind
|
|
(cst_keyword_name,
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 4 === a[0] && ! args[2]){var k = a[1]; return [2, k];}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_keyword_name], 1);
|
|
});
|
|
var cst_symbol_name = "symbol-name";
|
|
bind
|
|
(cst_symbol_name,
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 3 === a[0] && ! args[2]){var s = a[1]; return [2, s];}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_symbol_name], 1);
|
|
});
|
|
var cst = "", f = [2, cst];
|
|
bind
|
|
("component-name",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 8:
|
|
if(! args[2]){var c = a[1]; return [2, c[1]];} break;
|
|
case 9:
|
|
if(! args[2]){var i = a[1]; return [2, i[1]];} break;
|
|
}
|
|
}
|
|
return f;
|
|
});
|
|
bind
|
|
("component-closure",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 8:
|
|
if(! args[2]){var c = a[1]; return [18, c[5]];} break;
|
|
case 9:
|
|
if(! args[2]){var i = a[1]; return [18, i[5]];} break;
|
|
}
|
|
}
|
|
return [6, Stdlib_Hashtbl[1].call(null, 0, 0)];
|
|
});
|
|
bind
|
|
("component-params",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 8:
|
|
if(! args[2]){
|
|
var c = a[1];
|
|
return [5,
|
|
Stdlib_List[20].call
|
|
(null, function(s){return [2, s];}, c[2])];
|
|
}
|
|
break;
|
|
case 9:
|
|
if(! args[2]){
|
|
var i = a[1];
|
|
return [5,
|
|
Stdlib_List[20].call
|
|
(null, function(s){return [2, s];}, i[2])];
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
bind
|
|
("component-body",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 8:
|
|
if(! args[2]){var c = a[1]; return c[4];} break;
|
|
case 9:
|
|
if(! args[2]){var i = a[1]; return i[4];} break;
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
var
|
|
cst_component_has_children = "component-has-children?",
|
|
g = [0, 0],
|
|
has_children_impl =
|
|
[13,
|
|
cst_component_has_children,
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 8:
|
|
if(! args[2]){var c = a[1]; return [0, c[3]];} break;
|
|
case 9:
|
|
if(! args[2]){var i = a[1]; return [0, i[3]];} break;
|
|
}
|
|
}
|
|
return g;
|
|
}];
|
|
Sx_types[11].call
|
|
(null, global_env, "component-has-children", has_children_impl);
|
|
Sx_types[11].call
|
|
(null, global_env, cst_component_has_children, has_children_impl);
|
|
var h = [2, "auto"], i = [2, "client"];
|
|
bind
|
|
("component-affinity",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 8:
|
|
if(! args[2]){var c = a[1]; return [2, c[6]];} break;
|
|
case 9:
|
|
if(! args[2]) return i; break;
|
|
}
|
|
}
|
|
return h;
|
|
});
|
|
bind("component-param-types", function(param){return 0;});
|
|
bind("component-set-param-types!", function(param){return 0;});
|
|
var cst_make_cek_state = "make-cek-state";
|
|
bind
|
|
(cst_make_cek_state,
|
|
function(args){
|
|
if(args){
|
|
var a = args[2];
|
|
if(a){
|
|
var b = a[2];
|
|
if(b && ! b[2]){
|
|
var k = b[1], e = a[1], c = args[1];
|
|
return Sx_ref[6].call(null, c, e, k);
|
|
}
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], cst_make_cek_state], 1);
|
|
});
|
|
var cst_cek_step = "cek-step";
|
|
bind
|
|
(cst_cek_step,
|
|
function(args){
|
|
if(args && ! args[2]){var s = args[1]; return Sx_ref[85].call(null, s);}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_cek_step], 1);
|
|
});
|
|
var cst_cek_phase = "cek-phase";
|
|
bind
|
|
(cst_cek_phase,
|
|
function(args){
|
|
if(args && ! args[2]){var s = args[1]; return Sx_ref[12].call(null, s);}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_cek_phase], 1);
|
|
});
|
|
var cst_cek_value = "cek-value";
|
|
bind
|
|
(cst_cek_value,
|
|
function(args){
|
|
if(args && ! args[2]){var s = args[1]; return Sx_ref[13].call(null, s);}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_cek_value], 1);
|
|
});
|
|
var cst_cek_terminal = "cek-terminal?";
|
|
bind
|
|
(cst_cek_terminal,
|
|
function(args){
|
|
if(args && ! args[2]){var s = args[1]; return Sx_ref[8].call(null, s);}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_cek_terminal], 1);
|
|
});
|
|
var cst_cek_kont = "cek-kont";
|
|
bind
|
|
(cst_cek_kont,
|
|
function(args){
|
|
if(args && ! args[2]){var s = args[1]; return Sx_ref[11].call(null, s);}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_cek_kont], 1);
|
|
});
|
|
var cst_frame_type = "frame-type";
|
|
bind
|
|
(cst_frame_type,
|
|
function(args){
|
|
if(args && ! args[2]){var f = args[1]; return Sx_ref[43].call(null, f);}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_frame_type], 1);
|
|
});
|
|
var cst_strict = "*strict*";
|
|
Sx_types[11].call(null, global_env, cst_strict, [0, 0]);
|
|
var cst_prim_param_types = "*prim-param-types*";
|
|
Sx_types[11].call(null, global_env, cst_prim_param_types, 0);
|
|
bind
|
|
("set-strict!",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var v = args[1];
|
|
Sx_ref[3][1] = v;
|
|
Sx_types[17].call(null, global_env, cst_strict, v);
|
|
return 0;
|
|
}
|
|
return 0;
|
|
});
|
|
bind
|
|
("set-prim-param-types!",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var v = args[1];
|
|
Sx_ref[4][1] = v;
|
|
Sx_types[17].call(null, global_env, cst_prim_param_types, v);
|
|
return 0;
|
|
}
|
|
return 0;
|
|
});
|
|
bind
|
|
("value-matches-type?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[2];
|
|
if(a && ! a[2]){
|
|
var t = a[1], v = args[1];
|
|
return Sx_ref[61].call(null, v, t);
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
var cst_apply = "apply";
|
|
bind
|
|
(cst_apply,
|
|
function(args){
|
|
if(! args)
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_apply], 1);
|
|
var
|
|
rest = args[2],
|
|
f = args[1],
|
|
match = Stdlib_List[10].call(null, rest);
|
|
if(match){
|
|
var match$0 = match[1];
|
|
if(typeof match$0 === "number" || ! (5 === match$0[0]))
|
|
var all_args = rest;
|
|
else
|
|
var
|
|
prefix = match[2],
|
|
last = match$0[1],
|
|
a = Stdlib_List[10].call(null, prefix),
|
|
all_args = Stdlib[37].call(null, a, last);
|
|
}
|
|
else
|
|
var all_args = rest;
|
|
return Sx_runtime[6].call(null, f, all_args);
|
|
});
|
|
var cst_provide_push = "provide-push!";
|
|
bind
|
|
(cst_provide_push,
|
|
function(args){
|
|
if(args){
|
|
var a = args[2];
|
|
if(a && ! a[2]){
|
|
var v = a[1], n = args[1];
|
|
return Sx_runtime[130].call(null, n, v);
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_provide_push], 1);
|
|
});
|
|
var cst_provide_pop = "provide-pop!";
|
|
bind
|
|
(cst_provide_pop,
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var n = args[1];
|
|
return Sx_runtime[131].call(null, n);
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_provide_pop], 1);
|
|
});
|
|
bind
|
|
("<>",
|
|
function(args){
|
|
var
|
|
a =
|
|
Stdlib_List[20].call
|
|
(null,
|
|
function(a){
|
|
if(typeof a === "number") return cst;
|
|
switch(a[0]){
|
|
case 5:
|
|
return Sx_render[10].call(null, a, global_env);
|
|
case 2:
|
|
case 15:
|
|
var s = a[1]; return s;
|
|
default: return Sx_types[19].call(null, a);
|
|
}
|
|
},
|
|
args);
|
|
return [15, Stdlib_String[7].call(null, cst, a)];
|
|
});
|
|
bind
|
|
("raw!",
|
|
function(args){
|
|
var
|
|
a =
|
|
Stdlib_List[20].call
|
|
(null,
|
|
function(a){
|
|
if(typeof a !== "number")
|
|
switch(a[0]){case 2:case 15: var s = a[1]; return s;}
|
|
return Sx_types[19].call(null, a);
|
|
},
|
|
args);
|
|
return [15, Stdlib_String[7].call(null, cst, a)];
|
|
});
|
|
bind("define-page-helper", function(param){return 0;});
|
|
Sx_render[22].call(null, global_env);
|
|
bind("set-render-active!", function(param){return 0;});
|
|
var j = [0, 1];
|
|
bind("render-active?", function(param){return j;});
|
|
var k = [0, 0];
|
|
bind
|
|
("is-html-tag?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0] && ! args[2]){
|
|
var s = a[1];
|
|
return [0, Sx_render[4].call(null, s)];
|
|
}
|
|
}
|
|
return k;
|
|
});
|
|
var
|
|
html_tags =
|
|
[5,
|
|
Stdlib_List[20].call(null, function(s){return [2, s];}, Sx_render[1])],
|
|
void_elements =
|
|
[5,
|
|
Stdlib_List[20].call(null, function(s){return [2, s];}, Sx_render[2])],
|
|
boolean_attrs =
|
|
[5,
|
|
Stdlib_List[20].call(null, function(s){return [2, s];}, Sx_render[3])];
|
|
Sx_types[11].call(null, global_env, "HTML_TAGS", html_tags);
|
|
Sx_types[11].call(null, global_env, "VOID_ELEMENTS", void_elements);
|
|
Sx_types[11].call(null, global_env, "BOOLEAN_ATTRS", boolean_attrs);
|
|
var l = [3, cst_error], m = [3, cst_ok];
|
|
bind
|
|
("cek-try",
|
|
function(args){
|
|
if(args){
|
|
var match = args[2], thunk = args[1];
|
|
if(! match)
|
|
try{
|
|
var r = Sx_ref[108].call(null, thunk, 0);
|
|
return [5, [0, m, [0, r, 0]]];
|
|
}
|
|
catch(exn){
|
|
var exn$0 = caml_wrap_exception(exn);
|
|
if(exn$0[1] !== Sx_types[7])
|
|
throw caml_maybe_attach_backtrace(exn$0, 0);
|
|
var msg$0 = exn$0[2];
|
|
return [5, [0, l, [0, [2, msg$0], 0]]];
|
|
}
|
|
if(! match[2]){
|
|
var handler = match[1];
|
|
try{var a = Sx_ref[108].call(null, thunk, 0); return a;}
|
|
catch(exn$0){
|
|
var exn = caml_wrap_exception(exn$0);
|
|
if(exn[1] !== Sx_types[7]) throw caml_maybe_attach_backtrace(exn, 0);
|
|
var msg = exn[2];
|
|
return Sx_ref[108].call(null, handler, [5, [0, [2, msg], 0]]);
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
bind
|
|
("eval-expr",
|
|
function(args){
|
|
if(args){
|
|
var match = args[2], expr = args[1];
|
|
if(! match) return Sx_ref[127].call(null, expr, [18, global_env]);
|
|
if(! match[2]){
|
|
var e = match[1];
|
|
return Sx_ref[127].call(null, expr, e);
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
bind
|
|
("trampoline",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var v = args[1];
|
|
return caml_call1(Sx_primitives[3][1], v);
|
|
}
|
|
return 0;
|
|
});
|
|
bind
|
|
("expand-macro",
|
|
function(args){
|
|
if(args){
|
|
var a = args[2];
|
|
if(a){
|
|
var match = a[2], raw = a[1], mac = args[1];
|
|
if(! match) return Sx_ref[83].call(null, mac, raw, [18, global_env]);
|
|
var b = match[1];
|
|
if(typeof b !== "number" && 18 === b[0] && ! match[2]){
|
|
var e = b[1];
|
|
return Sx_ref[83].call(null, mac, raw, [18, e]);
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
bind
|
|
("call-lambda",
|
|
function(args){
|
|
if(args){
|
|
var a = args[2];
|
|
if(a){
|
|
var match = a[2], call_args = a[1], fn_val = args[1];
|
|
if(! match) return Sx_ref[108].call(null, fn_val, call_args);
|
|
var b = match[1];
|
|
if(typeof b !== "number" && 18 === b[0] && ! match[2])
|
|
return Sx_ref[108].call(null, fn_val, call_args);
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], "call-lambda: expected (fn args env?)"], 1);
|
|
});
|
|
bind
|
|
(cst_cek_call,
|
|
function(args){
|
|
if(args){
|
|
var b = args[2];
|
|
if(b && ! b[2]){
|
|
var a = b[1], f = args[1];
|
|
return Sx_ref[108].call(null, f, a);
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_cek_call], 1);
|
|
});
|
|
bind
|
|
(cst_cek_eval,
|
|
function(args){
|
|
if(args){
|
|
var match = args[2], expr = args[1];
|
|
if(! match) return Sx_ref[127].call(null, expr, [18, global_env]);
|
|
if(! match[2]){
|
|
var e = match[1];
|
|
return Sx_ref[127].call(null, expr, e);
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
bind
|
|
("qq-expand-runtime",
|
|
function(args){
|
|
if(args){
|
|
var match = args[2], template = args[1];
|
|
if(! match) return Sx_ref[77].call(null, template, [18, global_env]);
|
|
var a = match[1];
|
|
if(typeof a !== "number" && 18 === a[0] && ! match[2]){
|
|
var e = a[1];
|
|
return Sx_ref[77].call(null, template, [18, e]);
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
var n = [0, 0], o = [0, 1];
|
|
bind
|
|
("thunk?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 11 === a[0] && ! args[2]) return o;
|
|
}
|
|
return n;
|
|
});
|
|
bind
|
|
("thunk-expr",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var v = args[1];
|
|
return Sx_types[58].call(null, v);
|
|
}
|
|
return 0;
|
|
});
|
|
bind
|
|
("thunk-env",
|
|
function(args){
|
|
if(args && ! args[2]){
|
|
var v = args[1];
|
|
return Sx_types[59].call(null, v);
|
|
}
|
|
return 0;
|
|
});
|
|
var p = [0, 0], q = [0, 1];
|
|
bind
|
|
("lambda?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 7 === a[0] && ! args[2]) return q;
|
|
}
|
|
return p;
|
|
});
|
|
var r = [0, 0], s = [0, 1];
|
|
bind
|
|
("macro?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 10 === a[0] && ! args[2]) return s;
|
|
}
|
|
return r;
|
|
});
|
|
var t = [0, 0], u = [0, 1];
|
|
bind
|
|
("island?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 9 === a[0] && ! args[2]) return u;
|
|
}
|
|
return t;
|
|
});
|
|
var v = [0, 0], w = [0, 1];
|
|
bind
|
|
("component?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && a[0] - 8 >>> 0 < 2 && ! args[2]) return w;
|
|
}
|
|
return v;
|
|
});
|
|
var x = [0, 0], y = [0, 1];
|
|
bind
|
|
("callable?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 7:
|
|
case 8:
|
|
case 9:
|
|
case 13:
|
|
if(! args[2]) return y; break;
|
|
}
|
|
}
|
|
return x;
|
|
});
|
|
var z = [0, 0], A = [0, 1];
|
|
bind
|
|
("spread?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 16 === a[0] && ! args[2]) return A;
|
|
}
|
|
return z;
|
|
});
|
|
var B = [0, 0], C = [0, 1];
|
|
bind
|
|
("continuation?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 12 === a[0] && ! args[2]) return C;
|
|
}
|
|
return B;
|
|
});
|
|
var D = [5, 0];
|
|
bind
|
|
("lambda-params",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 7 === a[0] && ! args[2]){
|
|
var l = a[1];
|
|
return [5,
|
|
Stdlib_List[20].call(null, function(s){return [2, s];}, l[1])];
|
|
}
|
|
}
|
|
return D;
|
|
});
|
|
bind
|
|
("lambda-body",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 7 === a[0] && ! args[2]){var l = a[1]; return l[2];}
|
|
}
|
|
return 0;
|
|
});
|
|
bind
|
|
("lambda-closure",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 7 === a[0] && ! args[2]){var l = a[1]; return [18, l[3]];}
|
|
}
|
|
return [6, Stdlib_Hashtbl[1].call(null, 0, 0)];
|
|
});
|
|
bind
|
|
("spread-attrs",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 16 === a[0] && ! args[2]){
|
|
var pairs = a[1], d = Stdlib_Hashtbl[1].call(null, 0, 4);
|
|
Stdlib_List[18].call
|
|
(null,
|
|
function(param){
|
|
var v = param[2], k = param[1];
|
|
return Stdlib_Hashtbl[11].call(null, d, k, v);
|
|
},
|
|
pairs);
|
|
return [6, d];
|
|
}
|
|
}
|
|
return [6, Stdlib_Hashtbl[1].call(null, 0, 0)];
|
|
});
|
|
bind
|
|
("make-spread",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 6 === a[0] && ! args[2]){
|
|
var d = a[1];
|
|
return [16,
|
|
Stdlib_Hashtbl[14].call
|
|
(null,
|
|
function(k, v, acc){return [0, [0, k, v], acc];},
|
|
d,
|
|
0)];
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
bind
|
|
("make-raw-html",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var v = args[1];
|
|
if(typeof v !== "number" && 2 === v[0]){
|
|
if(args[2]) break a;
|
|
var s = v[1];
|
|
return [15, s];
|
|
}
|
|
if(! args[2]) return [15, Sx_types[19].call(null, v)];
|
|
}
|
|
return 0;
|
|
});
|
|
var E = [2, cst];
|
|
bind
|
|
("raw-html-content",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 2:
|
|
if(! args[2]){var s = a[1]; return [2, s];} break;
|
|
case 15:
|
|
if(! args[2]){var s$0 = a[1]; return [2, s$0];} break;
|
|
}
|
|
}
|
|
return E;
|
|
});
|
|
var F = [0, 1];
|
|
bind
|
|
("empty-dict?",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 6 === a[0] && ! args[2]){
|
|
var d = a[1];
|
|
return [0, 0 === Stdlib_Hashtbl[15].call(null, d) ? 1 : 0];
|
|
}
|
|
}
|
|
return F;
|
|
});
|
|
var cst_identical = "identical?";
|
|
bind
|
|
(cst_identical,
|
|
function(args){
|
|
if(args){
|
|
var c = args[2];
|
|
if(c && ! c[2]){
|
|
var b = c[1], a = args[1];
|
|
return [0, a === b ? 1 : 0];
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_identical], 1);
|
|
});
|
|
bind
|
|
("for-each-indexed",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[2];
|
|
if(a){
|
|
var b = a[1], fn_val = args[1];
|
|
if(typeof b !== "number"){
|
|
switch(b[0]){
|
|
case 5:
|
|
if(a[2]) break a; var items = b[1]; break;
|
|
case 19:
|
|
var c = b[1][1]; if(a[2]) break a; var items = c; break;
|
|
default: break a;
|
|
}
|
|
Stdlib_List[19].call
|
|
(null,
|
|
function(i, item){
|
|
Sx_ref[127].call
|
|
(null,
|
|
[5, [0, fn_val, [0, [1, i], [0, item, 0]]]],
|
|
[18, global_env]);
|
|
return 0;
|
|
},
|
|
items);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
var cst_make_sx_expr = "make-sx-expr";
|
|
bind
|
|
(cst_make_sx_expr,
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0] && ! args[2]){var s = a[1]; return [17, s];}
|
|
}
|
|
throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_make_sx_expr], 1);
|
|
});
|
|
var cst_sx_expr_source = "sx-expr-source";
|
|
bind
|
|
(cst_sx_expr_source,
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 2:
|
|
if(! args[2]){var s = a[1]; return [2, s];} break;
|
|
case 17:
|
|
if(! args[2]){var s$0 = a[1]; return [2, s$0];} break;
|
|
}
|
|
}
|
|
throw caml_maybe_attach_backtrace
|
|
([0, Sx_types[7], cst_sx_expr_source], 1);
|
|
});
|
|
bind
|
|
("parse-int",
|
|
function(args){
|
|
a:
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number")
|
|
switch(a[0]){
|
|
case 1:
|
|
var c = args[2], n = a[1];
|
|
if(c && c[2]) break a;
|
|
return [1, runtime.caml_round_float(n)];
|
|
case 2:
|
|
var match = args[2], s = a[1];
|
|
if(! match)
|
|
try{var e = [1, caml_int_of_string(s)]; return e;}
|
|
catch(exn){return 0;}
|
|
if(match[2]) break a;
|
|
var default_val$0 = match[1];
|
|
try{var d = [1, caml_int_of_string(s)]; return d;}
|
|
catch(exn){return default_val$0;}
|
|
}
|
|
var b = args[2];
|
|
if(b && ! b[2]){var default_val = b[1]; return default_val;}
|
|
}
|
|
return 0;
|
|
});
|
|
bind
|
|
("parse-number",
|
|
function(args){
|
|
if(args){
|
|
var a = args[1];
|
|
if(typeof a !== "number" && 2 === a[0] && ! args[2]){
|
|
var s = a[1];
|
|
try{var b = [1, runtime.caml_float_of_string(s)]; return b;}
|
|
catch(exn){return 0;}
|
|
}
|
|
}
|
|
return 0;
|
|
});
|
|
bind("query", function(param){return 0;});
|
|
bind("action", function(param){return 0;});
|
|
bind
|
|
("request-arg",
|
|
function(args){
|
|
if(args){var a = args[2]; if(a && ! a[2]){var d = a[1]; return d;}}
|
|
return 0;
|
|
});
|
|
var G = [2, "GET"];
|
|
bind("request-method", function(param){return G;});
|
|
bind("ctx", function(param){return 0;});
|
|
bind("helper", function(param){return 0;});
|
|
var jit_compiling = [0, 0], jit_enabled = [0, 0];
|
|
Sx_ref[5][1] =
|
|
[0,
|
|
function(f, args){
|
|
if(typeof f !== "number" && 7 === f[0]){
|
|
var l = f[1];
|
|
if(jit_enabled[1]){
|
|
var match = l[5];
|
|
if(match){
|
|
var cl = match[1];
|
|
if(Sx_vm[3].call(null, cl)) return 0;
|
|
try{var b = [0, Sx_vm[19].call(null, cl, args, cl[4])]; return b;}
|
|
catch(exn){l[5] = [0, Sx_vm[2]]; return 0;}
|
|
}
|
|
if(jit_compiling[1]) return 0;
|
|
jit_compiling[1] = 1;
|
|
var
|
|
a = Stdlib_Hashtbl[15].call(null, global_env[1]),
|
|
globals = Stdlib_Hashtbl[1].call(null, 0, a);
|
|
Stdlib_Hashtbl[12].call
|
|
(null,
|
|
function(id, v){
|
|
var a = Sx_types[5].call(null, id);
|
|
return Stdlib_Hashtbl[11].call(null, globals, a, v);
|
|
},
|
|
global_env[1]);
|
|
var compiled = Sx_vm[23].call(null, l, globals);
|
|
jit_compiling[1] = 0;
|
|
if(! compiled) return 0;
|
|
var cl$0 = compiled[1];
|
|
l[5] = [0, cl$0];
|
|
try{var c = [0, Sx_vm[19].call(null, cl$0, args, cl$0[4])]; return c;}
|
|
catch(exn){l[5] = [0, Sx_vm[2]]; return 0;}
|
|
}
|
|
}
|
|
return 0;
|
|
}];
|
|
var cst_enable_jit = "enable-jit!";
|
|
Sx_types[11].call
|
|
(null,
|
|
global_env,
|
|
cst_enable_jit,
|
|
[13, cst_enable_jit, function(param){jit_enabled[1] = 1; return 0;}]);
|
|
function wrap(fn){
|
|
return function(fn){
|
|
return function(){
|
|
globalThis.__sxR = undefined;
|
|
var r = fn.apply(null, arguments);
|
|
return globalThis.__sxR !== undefined ? globalThis.__sxR : r;};
|
|
}
|
|
(caml_js_wrap_callback(fn));
|
|
}
|
|
var sx = {};
|
|
sx.parse = caml_js_wrap_callback(api_parse);
|
|
sx.stringify = caml_js_wrap_callback(api_stringify);
|
|
sx.eval = wrap(api_eval);
|
|
sx.evalExpr = wrap(api_eval_expr);
|
|
sx.renderToHtml = caml_js_wrap_callback(api_render_to_html);
|
|
sx.load = caml_js_wrap_callback(api_load);
|
|
sx.typeOf = caml_js_wrap_callback(api_type_of);
|
|
sx.inspect = caml_js_wrap_callback(api_inspect);
|
|
sx.engine = caml_js_wrap_callback(api_engine);
|
|
sx.registerNative = caml_js_wrap_callback(api_register_native);
|
|
sx.loadSource = caml_js_wrap_callback(api_load);
|
|
sx.callFn = wrap(api_call_fn);
|
|
sx.isCallable = caml_js_wrap_callback(api_is_callable);
|
|
sx.fnArity = caml_js_wrap_callback(api_fn_arity);
|
|
Js_of_ocaml_Js[52][1].SxKernel = sx;
|
|
runtime.caml_register_global(271, [0], "Dune__exe__Sx_browser");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# 5 "../.js/default/stdlib/std_exit.cmo.js"
|
|
//# shape: Std_exit:[]
|
|
(function
|
|
(globalThis){
|
|
"use strict";
|
|
var runtime = globalThis.jsoo_runtime;
|
|
function caml_call1(f, a0){
|
|
return (f.l >= 0 ? f.l : f.l = f.length) === 1
|
|
? f(a0)
|
|
: runtime.caml_call_gen(f, [a0]);
|
|
}
|
|
var Stdlib = runtime.caml_get_global_data().Stdlib;
|
|
caml_call1(Stdlib[103], 0);
|
|
runtime.caml_register_global(1, [0], "Std_exit");
|
|
return;
|
|
}
|
|
(globalThis));
|
|
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3hfYnJvd3Nlci5iYy5qcyIsInNlY3Rpb25zIjpbeyJvZmZzZXQiOnsibGluZSI6MywiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiIuc3hfYnJvd3Nlci5lb2Jqcy9qc29vL3N4X2Jyb3dzZXIuYmMucnVudGltZS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvYnVpbHRpbi8rbWxCeXRlcy5qcyIsIi9idWlsdGluLyttYXJzaGFsLmpzIiwiL2J1aWx0aW4vK2lvLmpzIiwiL2J1aWx0aW4vK3N5cy5qcyIsIi9idWlsdGluLytiYWNrdHJhY2UuanMiLCIvYnVpbHRpbi8rc3RkbGliLmpzIiwiL2J1aWx0aW4vK2pzbGliLmpzIiwiL2J1aWx0aW4vK2ZhaWwuanMiLCIvYnVpbHRpbi8rdW5peC5qcyIsIi9idWlsdGluLytmcy5qcyIsIi9idWlsdGluLytmc19mYWtlLmpzIiwiL2J1aWx0aW4vK2ludDY0LmpzIiwiL2J1aWx0aW4vK3N5bmMuanMiLCIvYnVpbHRpbi8rbmF0LmpzIiwiL2J1aWx0aW4vK2ZzX25vZGUuanMiLCIvYnVpbHRpbi8rYmlnYXJyYXkuanMiLCIvYnVpbHRpbi8rYmlnc3RyaW5nLmpzIiwiL2J1aWx0aW4vK2JsYWtlMi5qcyIsIi9idWlsdGluLyttZDUuanMiLCIvYnVpbHRpbi8raWVlZV83NTQuanMiLCIvYnVpbHRpbi8rb2JqLmpzIiwiL2J1aWx0aW4vK2VmZmVjdC5qcyIsIi9idWlsdGluLythcnJheS5qcyIsIi9idWlsdGluLytkb21haW4uanMiLCIvYnVpbHRpbi8raW50cy5qcyIsIi9idWlsdGluLytoYXNoLmpzIiwiL2J1aWx0aW4vK2NvbXBhcmUuanMiLCIvYnVpbHRpbi8rcnVudGltZV9ldmVudHMuanMiLCIvYnVpbHRpbi8renN0ZC5qcyIsIi9idWlsdGluLyt3ZWFrLmpzIiwiL2J1aWx0aW4vK2djLmpzIiwiL2J1aWx0aW4vK2Zvcm1hdC5qcyIsIi9idWlsdGluLytncmFwaGljcy5qcyIsIi9idWlsdGluLytqc2xpYl9qc19vZl9vY2FtbC5qcyIsIi9idWlsdGluLytsZXhpbmcuanMiLCIvYnVpbHRpbi8rcHJuZy5qcyIsIi9idWlsdGluLytwYXJzaW5nLmpzIiwiL2J1aWx0aW4vK3N0ci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vIEFuIE9DYW1sIHN0cmluZyBpcyBhbiBvYmplY3Qgd2l0aCB0aHJlZSBmaWVsZHM6XG4vLyAtIHRhZyAndCdcbi8vIC0gbGVuZ3RoICdsJ1xuLy8gLSBjb250ZW50cyAnYydcbi8vXG4vLyBUaGUgY29udGVudHMgb2YgdGhlIHN0cmluZyBjYW4gYmUgZWl0aGVyIGEgSmF2YVNjcmlwdCBhcnJheSBvclxuLy8gYSBKYXZhU2NyaXB0IHN0cmluZy4gVGhlIGxlbmd0aCBvZiB0aGlzIHN0cmluZyBjYW4gYmUgbGVzcyB0aGFuIHRoZVxuLy8gbGVuZ3RoIG9mIHRoZSBPQ2FtbCBzdHJpbmcuIEluIHRoaXMgY2FzZSwgcmVtYWluaW5nIGJ5dGVzIGFyZVxuLy8gYXNzdW1lZCB0byBiZSB6ZXJvZXMuIEFycmF5cyBhcmUgbXV0YWJsZSBidXQgY29uc3VtZXMgbW9yZSBtZW1vcnlcbi8vIHRoYW4gc3RyaW5ncy4gQSBjb21tb24gcGF0dGVybiBpcyB0byBzdGFydCBmcm9tIGFuIGVtcHR5IHN0cmluZyBhbmRcbi8vIHByb2dyZXNzaXZlbHkgZmlsbCBpdCBmcm9tIHRoZSBzdGFydC4gUGFydGlhbCBzdHJpbmdzIG1ha2VzIGl0XG4vLyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgdGhpcyBlZmZpY2llbnRseS5cbi8vXG4vLyBXaGVuIGNvbnZlcnRpbmcgdG8gYW5kIGZyb20gVVRGLTE2LCB3ZSBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlXG4vLyBzdHJpbmcgaXMgY29tcG9zZWQgb25seSBvZiBBU0NJSSBjaGFyYWN0ZXJzIChpbiB3aGljaCBjYXNlLCBub1xuLy8gY29udmVyc2lvbiBuZWVkcyB0byBiZSBwZXJmb3JtZWQpIG9yIG5vdC5cbi8vXG4vLyBUaGUgc3RyaW5nIHRhZyBjYW4gdGh1cyB0YWtlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOlxuLy8gICBmdWxsIHN0cmluZyAgICAgQllURSB8IFVOS05PV046ICAgICAgMFxuLy8gICAgICAgICAgICAgICAgICAgQllURSB8IEFTQ0lJOiAgICAgICAgOVxuLy8gICAgICAgICAgICAgICAgICAgQllURSB8IE5PVF9BU0NJSTogICAgOFxuLy8gICBzdHJpbmcgcHJlZml4ICAgUEFSVElBTDogICAgICAgICAgICAgMlxuLy8gICBhcnJheSAgICAgICAgICAgQVJSQVk6ICAgICAgICAgICAgICAgNFxuLy9cbi8vIE9uZSBjYW4gdXNlIGJpdCBtYXNraW5nIHRvIGRpc2NyaW1pbmF0ZSB0aGVzZSBkaWZmZXJlbnQgY2FzZXM6XG4vLyAgIGtub3duX2VuY29kaW5nKHgpID0geCY4XG4vLyAgIGlzX2FzY2lpKHgpID0gICAgICAgeCYxXG4vLyAgIGtpbmQoeCkgPSAgICAgICAgICAgeCY2XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyX3JlcGVhdFxuZnVuY3Rpb24gY2FtbF9zdHJfcmVwZWF0KG4sIHMpIHtcbiAgcmV0dXJuIHMucmVwZWF0KG4pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXNcbi8vV2Vha2RlZlxuLy8gUHJlIEVDTUFTY3JpcHQgNSwgW2FwcGx5XSB3b3VsZCBub3Qgc3VwcG9ydCBhcnJheS1saWtlIG9iamVjdC5cbi8vIEluIHN1Y2ggc2V0dXAsIFR5cGVkX2FycmF5IHdvdWxkIGJlIGltcGxlbWVudGVkIGFzIHBvbHlmaWxsLCBhbmQgW2YuYXBwbHldIHdvdWxkXG4vLyBmYWlsIGhlcmUuIE1hcmsgdGhlIHByaW1pdGl2ZSBhcyBXZWFrZGVmLCBzbyB0aGF0IHBlb3BsZSBjYW4gb3ZlcnJpZGUgaXQgZWFzaWx5LlxuZnVuY3Rpb24gY2FtbF9zdWJhcnJheV90b19qc2J5dGVzKGEsIGksIGxlbikge1xuICB2YXIgZiA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG4gIGlmIChpID09PSAwICYmIGxlbiA8PSA0MDk2ICYmIGxlbiA9PT0gYS5sZW5ndGgpIHJldHVybiBmLmFwcGx5KG51bGwsIGEpO1xuICB2YXIgcyA9IFwiXCI7XG4gIGZvciAoOyAwIDwgbGVuOyBpICs9IDEwMjQsIGxlbiAtPSAxMDI0KVxuICAgIHMgKz0gZi5hcHBseShudWxsLCBhLnNsaWNlKGksIGkgKyBNYXRoLm1pbihsZW4sIDEwMjQpKSk7XG4gIHJldHVybiBzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N1Yl91aW50OF9hcnJheV90b19qc2J5dGVzXG4vL1dlYWtkZWZcbi8vIFByZSBFQ01BU2NyaXB0IDUsIFthcHBseV0gd291bGQgbm90IHN1cHBvcnQgYXJyYXktbGlrZSBvYmplY3QuXG4vLyBJbiBzdWNoIHNldHVwLCBUeXBlZF9hcnJheSB3b3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBwb2x5ZmlsbCwgYW5kIFtmLmFwcGx5XSB3b3VsZFxuLy8gZmFpbCBoZXJlLiBNYXJrIHRoZSBwcmltaXRpdmUgYXMgV2Vha2RlZiwgc28gdGhhdCBwZW9wbGUgY2FuIG92ZXJyaWRlIGl0IGVhc2lseS5cbmZ1bmN0aW9uIGNhbWxfc3ViX3VpbnQ4X2FycmF5X3RvX2pzYnl0ZXMoYSwgaSwgbGVuKSB7XG4gIHZhciBmID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbiAgaWYgKGkgPT09IDAgJiYgbGVuIDw9IDQwOTYgJiYgbGVuID09PSBhLmxlbmd0aCkgcmV0dXJuIGYuYXBwbHkobnVsbCwgYSk7XG4gIHZhciBzID0gXCJcIjtcbiAgZm9yICg7IDAgPCBsZW47IGkgKz0gMTAyNCwgbGVuIC09IDEwMjQpXG4gICAgcyArPSBmLmFwcGx5KG51bGwsIGEuc3ViYXJyYXkoaSwgaSArIE1hdGgubWluKGxlbiwgMTAyNCkpKTtcbiAgcmV0dXJuIHM7XG59XG5cbi8vUHJvdmlkZXM6IGpzb29faXNfYXNjaWlcbmZ1bmN0aW9uIGpzb29faXNfYXNjaWkocykge1xuICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9uIGdldHMgYmV0dGVyIGF0IGFyb3VuZCB0aGlzIHBvaW50IGZvciBhbGwgYnJvd3NlcnNcbiAgaWYgKHMubGVuZ3RoIDwgMjQpIHtcbiAgICAvLyBTcGlkZXJtb25rZXkgZ2V0cyBtdWNoIHNsb3dlciB3aGVuIHMubGVuZ3RoID49IDI0IChvbiA2NCBiaXQgYXJjaHMpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSBpZiAocy5jaGFyQ29kZUF0KGkpID4gMTI3KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0NvbnRyb2xDaGFyYWN0ZXJzSW5SZWdleDogZXhwZWN0ZWRcbiAgZWxzZSByZXR1cm4gIS9bXlxceDAwLVxceDdmXS8udGVzdChzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc191bnNhZmVfZ2V0IG11dGFibGVcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfdW5zYWZlX2dldChzLCBpKSB7XG4gIHN3aXRjaCAocy50ICYgNikge1xuICAgIGNhc2UgMCAvKiBCWVRFUyAqLzpcbiAgICAgIHJldHVybiBzLmMuY2hhckNvZGVBdChpKTtcbiAgICBjYXNlIDIgLyogUEFSVElBTCAqLzpcbiAgICAgIGlmIChpID49IHMuYy5sZW5ndGgpIHJldHVybiAwO1xuICAgICAgcmV0dXJuIHMuYy5jaGFyQ29kZUF0KGkpO1xuICAgIGNhc2UgNCAvKiBBUlJBWSAqLzpcbiAgICAgIHJldHVybiBzLmNbaV07XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc191bnNhZmVfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfdW5zYWZlX3NldChzLCBpLCBjKSB7XG4gIC8vIFRoZSBPQ2FtbCBjb21waWxlciB1c2VzIENoYXIudW5zYWZlX2NociBvbiBpbnRlZ2VycyBsYXJnZXIgdGhhbiAyNTUhXG4gIGMgJj0gMHhmZjtcbiAgaWYgKHMudCAhPT0gNCAvKiBBUlJBWSAqLykge1xuICAgIGlmIChpID09PSBzLmMubGVuZ3RoKSB7XG4gICAgICBzLmMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcbiAgICAgIGlmIChpICsgMSA9PT0gcy5sKSBzLnQgPSAwOyAvKkJZVEVTIHwgVU5LTk9XTiovXG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5KHMpO1xuICB9XG4gIHMuY1tpXSA9IGM7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX3N0cmluZ19ib3VuZF9lcnJvcigpIHtcbiAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCkge1xuICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJpbmRleCBvdXQgb2YgYm91bmRzXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19nZXRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yLCBjYW1sX3N0cmluZ191bnNhZmVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dldChzLCBpKSB7XG4gIGlmIChpID4+PiAwID49IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSkgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3IoKTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2dldDE2XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0LCBjYW1sX3N0cmluZ19ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19nZXQxNihzLCBpKSB7XG4gIGlmIChpID4+PiAwID49IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSAtIDEpIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSksXG4gICAgYjIgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkgKyAxKTtcbiAgcmV0dXJuIChiMiA8PCA4KSB8IGIxO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2dldDE2XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQsIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfZ2V0MTYocywgaSkge1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwgLSAxKSBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldChzLCBpKSxcbiAgICBiMiA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldChzLCBpICsgMSk7XG4gIHJldHVybiAoYjIgPDwgOCkgfCBiMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfZ2V0MzJcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQsIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dldDMyKHMsIGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpIC0gMykgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIxID0gY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpKSxcbiAgICBiMiA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSArIDEpLFxuICAgIGIzID0gY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpICsgMiksXG4gICAgYjQgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkgKyAzKTtcbiAgcmV0dXJuIChiNCA8PCAyNCkgfCAoYjMgPDwgMTYpIHwgKGIyIDw8IDgpIHwgYjE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfZ2V0MzJcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfdW5zYWZlX2dldCwgY2FtbF9ieXRlc19ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9ieXRlc19nZXQzMihzLCBpKSB7XG4gIGlmIChpID4+PiAwID49IHMubCAtIDMpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIxID0gY2FtbF9ieXRlc191bnNhZmVfZ2V0KHMsIGkpLFxuICAgIGIyID0gY2FtbF9ieXRlc191bnNhZmVfZ2V0KHMsIGkgKyAxKSxcbiAgICBiMyA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldChzLCBpICsgMiksXG4gICAgYjQgPSBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQocywgaSArIDMpO1xuICByZXR1cm4gKGI0IDw8IDI0KSB8IChiMyA8PCAxNikgfCAoYjIgPDwgOCkgfCBiMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfZ2V0NjRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQsIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dldDY0KHMsIGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpIC0gNykgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGEgPSBuZXcgQXJyYXkoOCk7XG4gIGZvciAodmFyIGogPSAwOyBqIDwgODsgaisrKSB7XG4gICAgYVs3IC0gal0gPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkgKyBqKTtcbiAgfVxuICByZXR1cm4gY2FtbF9pbnQ2NF9vZl9ieXRlcyhhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19nZXQ2NFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc191bnNhZmVfZ2V0LCBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX2dldDY0KHMsIGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sIC0gNykgY2FtbF9ieXRlc19ib3VuZF9lcnJvcigpO1xuICB2YXIgYSA9IG5ldyBBcnJheSg4KTtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHtcbiAgICBhWzcgLSBqXSA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldChzLCBpICsgaik7XG4gIH1cbiAgcmV0dXJuIGNhbWxfaW50NjRfb2ZfYnl0ZXMoYSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yLCBjYW1sX2J5dGVzX3Vuc2FmZV9nZXRcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfZ2V0KHMsIGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sKSBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCk7XG4gIHJldHVybiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQocywgaSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3NldFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19zZXQoX3MsIF9pLCBfYykge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9zdHJpbmdfc2V0XCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19zZXRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9zZXQsIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19zZXQocywgaSwgYykge1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwpIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yKCk7XG4gIHJldHVybiBjYW1sX3N0cmluZ191bnNhZmVfc2V0KHMsIGksIGMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX3NldDE2XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yLCBjYW1sX2J5dGVzX3Vuc2FmZV9zZXRcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfc2V0MTYocywgaSwgaTE2KSB7XG4gIGlmIChpID4+PiAwID49IHMubCAtIDEpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIyID0gMHhmZiAmIChpMTYgPj4gOCksXG4gICAgYjEgPSAweGZmICYgaTE2O1xuICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQocywgaSArIDAsIGIxKTtcbiAgY2FtbF9ieXRlc191bnNhZmVfc2V0KHMsIGkgKyAxLCBiMik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX3NldDMyXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yLCBjYW1sX2J5dGVzX3Vuc2FmZV9zZXRcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfc2V0MzIocywgaSwgaTMyKSB7XG4gIGlmIChpID4+PiAwID49IHMubCAtIDMpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGI0ID0gMHhmZiAmIChpMzIgPj4gMjQpLFxuICAgIGIzID0gMHhmZiAmIChpMzIgPj4gMTYpLFxuICAgIGIyID0gMHhmZiAmIChpMzIgPj4gOCksXG4gICAgYjEgPSAweGZmICYgaTMyO1xuICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQocywgaSArIDAsIGIxKTtcbiAgY2FtbF9ieXRlc191bnNhZmVfc2V0KHMsIGkgKyAxLCBiMik7XG4gIGNhbWxfYnl0ZXNfdW5zYWZlX3NldChzLCBpICsgMiwgYjMpO1xuICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQocywgaSArIDMsIGI0KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfc2V0NjRcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IsIGNhbWxfYnl0ZXNfdW5zYWZlX3NldFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF90b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19zZXQ2NChzLCBpLCBpNjQpIHtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sIC0gNykgY2FtbF9ieXRlc19ib3VuZF9lcnJvcigpO1xuICB2YXIgYSA9IGNhbWxfaW50NjRfdG9fYnl0ZXMoaTY0KTtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHtcbiAgICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQocywgaSArIDcgLSBqLCBhW2pdKTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19zZXRcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IsIGNhbWxfYnl0ZXNfdW5zYWZlX3NldFxuZnVuY3Rpb24gY2FtbF9ieXRlc19zZXQocywgaSwgYykge1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfdW5zYWZlX3NldChzLCBpLCBjKTtcbn1cblxuLy9Qcm92aWRlczoganNvb190ZXh0X2VuY29kZXJcbnZhciBqc29vX3RleHRfZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuXG4vL1Byb3ZpZGVzOiBqc29vX3RleHRfZGVjb2RlclxudmFyIGpzb29fdGV4dF9kZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfb2ZfdXRmMTZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IE1sQnl0ZXMsIGpzb29fdGV4dF9lbmNvZGVyXG4vL1JlcXVpcmVzOiBqc29vX2lzX2FzY2lpXG5mdW5jdGlvbiBjYW1sX2J5dGVzX29mX3V0ZjE2X2pzc3RyaW5nKHMpIHtcbiAgaWYgKGpzb29faXNfYXNjaWkocykpIHtcbiAgICByZXR1cm4gbmV3IE1sQnl0ZXMoOSwgcywgcy5sZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHZhciBhID0ganNvb190ZXh0X2VuY29kZXIuZW5jb2RlKHMpO1xuICAgIHJldHVybiBuZXcgTWxCeXRlcyg0LCBhLCBhLmxlbmd0aCk7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogTWxCeXRlc1xuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcywganNvb19pc19hc2NpaVxuLy9SZXF1aXJlczogY2FtbF91aW50OF9hcnJheV9vZl9ieXRlc1xuLy9SZXF1aXJlczoganNvb190ZXh0X2RlY29kZXJcbmNsYXNzIE1sQnl0ZXMge1xuICBjb25zdHJ1Y3Rvcih0YWcsIGNvbnRlbnRzLCBsZW5ndGgpIHtcbiAgICB0aGlzLnQgPSB0YWc7XG4gICAgdGhpcy5jID0gY29udGVudHM7XG4gICAgdGhpcy5sID0gbGVuZ3RoO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgc3dpdGNoICh0aGlzLnQpIHtcbiAgICAgIGNhc2UgOTogLypCWVRFUyB8IEFTQ0lJKi9cbiAgICAgIGNhc2UgOCAvKkJZVEVTIHwgTk9UX0FTQ0lJKi86XG4gICAgICAgIHJldHVybiB0aGlzLmM7XG4gICAgICBjYXNlIDQ6IC8qIEFSUkFZICovXG4gICAgICBjYXNlIDIgLyogUEFSVElBTCAqLzpcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgICBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHRoaXMpO1xuICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgIGNhc2UgMCAvKkJZVEVTIHwgVU5LTk9XTiovOlxuICAgICAgICBpZiAoanNvb19pc19hc2NpaSh0aGlzLmMpKSB0aGlzLnQgPSA5OyAvKkJZVEVTIHwgQVNDSUkqL1xuICAgICAgICBlbHNlIHRoaXMudCA9IDg7IC8qQllURVMgfCBOT1RfQVNDSUkqL1xuICAgICAgICByZXR1cm4gdGhpcy5jO1xuICAgIH1cbiAgfVxuXG4gIHRvVXRmMTYoKSB7XG4gICAgaWYgKHRoaXMudCA9PT0gOSkgcmV0dXJuIHRoaXMuYztcbiAgICB2YXIgYSA9IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXModGhpcyk7XG4gICAgcmV0dXJuIGpzb29fdGV4dF9kZWNvZGVyLmRlY29kZShhKTtcbiAgfVxuXG4gIHNsaWNlKCkge1xuICAgIHZhciBjb250ZW50ID0gdGhpcy50ID09PSA0ID8gdGhpcy5jLnNsaWNlKCkgOiB0aGlzLmM7XG4gICAgcmV0dXJuIG5ldyBNbEJ5dGVzKHRoaXMudCwgY29udGVudCwgdGhpcy5sKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3N0cl9yZXBlYXQsIGNhbWxfc3ViX3VpbnQ4X2FycmF5X3RvX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMocykge1xuICAvKiBBc3N1bWVzIG5vdCBCWVRFUyAqL1xuICBpZiAocy50ID09PSAyIC8qIFBBUlRJQUwgKi8pIHMuYyArPSBjYW1sX3N0cl9yZXBlYXQocy5sIC0gcy5jLmxlbmd0aCwgXCJcXDBcIik7XG4gIGVsc2Ugcy5jID0gY2FtbF9zdWJfdWludDhfYXJyYXlfdG9fanNieXRlcyhzLmMsIDAsIHMuYy5sZW5ndGgpO1xuICBzLnQgPSAwOyAvKkJZVEVTIHwgVU5LTk9XTiovXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29udmVydF9ieXRlc190b19hcnJheVxuZnVuY3Rpb24gY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5KHMpIHtcbiAgLyogQXNzdW1lcyBub3QgQVJSQVkgKi9cbiAgdmFyIGEgPSBuZXcgVWludDhBcnJheShzLmwpO1xuICB2YXIgYiA9IHMuYyxcbiAgICBsID0gYi5sZW5ndGgsXG4gICAgaSA9IDA7XG4gIGZvciAoOyBpIDwgbDsgaSsrKSBhW2ldID0gYi5jaGFyQ29kZUF0KGkpO1xuICBmb3IgKGwgPSBzLmw7IGkgPCBsOyBpKyspIGFbaV0gPSAwO1xuICBzLmMgPSBhO1xuICBzLnQgPSA0OyAvKiBBUlJBWSAqL1xuICByZXR1cm4gYTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMocykge1xuICBpZiAocy50ICE9PSA0IC8qIEFSUkFZICovKSBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXkocyk7XG4gIHJldHVybiBzLmM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9zdHJpbmdfdW5zYWZlX2dldFxuZnVuY3Rpb24gY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmcocykge1xuICB2YXIgbCA9IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKTtcbiAgdmFyIGEgPSBuZXcgVWludDhBcnJheShsKTtcbiAgdmFyIGkgPSAwO1xuICBmb3IgKDsgaSA8IGw7IGkrKykgYVtpXSA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSk7XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NyZWF0ZV9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IE1sQnl0ZXMsIGNhbWxfaW52YWxpZF9hcmd1bWVudFxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9jcmVhdGVfc3RyaW5nKGxlbikge1xuICBpZiAobGVuIDwgMCkgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiU3RyaW5nLmNyZWF0ZVwiKTtcbiAgcmV0dXJuIG5ldyBNbEJ5dGVzKGxlbiA/IDIgOiA5LCBcIlwiLCBsZW4pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NyZWF0ZV9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2NyZWF0ZV9zdHJpbmcoX2xlbikge1xuICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJTdHJpbmcuY3JlYXRlXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NyZWF0ZV9ieXRlcyBjb25zdFxuLy9SZXF1aXJlczogTWxCeXRlcyxjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfY3JlYXRlX2J5dGVzKGxlbikge1xuICBpZiAobGVuIDwgMCkgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQnl0ZXMuY3JlYXRlXCIpO1xuICByZXR1cm4gbmV3IE1sQnl0ZXMobGVuID8gMiA6IDksIFwiXCIsIGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX29mX2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXMsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2FycmF5KGEpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoY2FtbF9zdWJhcnJheV90b19qc2J5dGVzKGEsIDAsIGEubGVuZ3RoKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX3N1Yl91aW50OF9hcnJheV90b19qc2J5dGVzXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5KGEpIHtcbiAgcmV0dXJuIGNhbWxfc3ViX3VpbnQ4X2FycmF5X3RvX2pzYnl0ZXMoYSwgMCwgYS5sZW5ndGgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl91aW50OF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19vZl91aW50OF9hcnJheVxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfb2ZfdWludDhfYXJyYXkoYSkge1xuICByZXR1cm4gY2FtbF9ieXRlc19vZl91aW50OF9hcnJheShhLnNsaWNlKCkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX29mX2FycmF5XG4vL1JlcXVpcmVzOiBNbEJ5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX29mX2FycmF5KGEpIHtcbiAgaWYgKCEoYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgYSA9IG5ldyBVaW50OEFycmF5KGEpO1xuICB9XG4gIHJldHVybiBuZXcgTWxCeXRlcyg0LCBhLCBhLmxlbmd0aCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXlcbi8vUmVxdWlyZXM6IE1sQnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXkoYSkge1xuICByZXR1cm4gbmV3IE1sQnl0ZXMoNCwgYSwgYS5sZW5ndGgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2NvbXBhcmUgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19jb21wYXJlKHMxLCBzMikge1xuICBzMS50ICYgNiAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMxKTtcbiAgczIudCAmIDYgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzMik7XG4gIHJldHVybiBzMS5jIDwgczIuYyA/IC0xIDogczEuYyA+IHMyLmMgPyAxIDogMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19lcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX2VxdWFsKHMxLCBzMikge1xuICBpZiAoczEgPT09IHMyKSByZXR1cm4gMTtcbiAgczEudCAmIDYgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzMSk7XG4gIHMyLnQgJiA2ICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczIpO1xuICByZXR1cm4gczEuYyA9PT0gczIuYyA/IDEgOiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19ub3RlcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19lcXVhbFxuZnVuY3Rpb24gY2FtbF9zdHJpbmdfbm90ZXF1YWwoczEsIHMyKSB7XG4gIHJldHVybiAxIC0gY2FtbF9zdHJpbmdfZXF1YWwoczEsIHMyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19ub3RlcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2VxdWFsXG5mdW5jdGlvbiBjYW1sX2J5dGVzX25vdGVxdWFsKHMxLCBzMikge1xuICByZXR1cm4gMSAtIGNhbWxfYnl0ZXNfZXF1YWwoczEsIHMyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19sZXNzZXF1YWwgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19sZXNzZXF1YWwoczEsIHMyKSB7XG4gIHMxLnQgJiA2ICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczEpO1xuICBzMi50ICYgNiAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMyKTtcbiAgcmV0dXJuIHMxLmMgPD0gczIuYyA/IDEgOiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2xlc3N0aGFuIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfbGVzc3RoYW4oczEsIHMyKSB7XG4gIHMxLnQgJiA2ICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczEpO1xuICBzMi50ICYgNiAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMyKTtcbiAgcmV0dXJuIHMxLmMgPCBzMi5jID8gMSA6IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2dyZWF0ZXJlcXVhbFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfbGVzc2VxdWFsXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19ncmVhdGVyZXF1YWwoczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19sZXNzZXF1YWwoczIsIHMxKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfZ3JlYXRlcmVxdWFsXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2xlc3NlcXVhbFxuZnVuY3Rpb24gY2FtbF9ieXRlc19ncmVhdGVyZXF1YWwoczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX2xlc3NlcXVhbChzMiwgczEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19ncmVhdGVydGhhblxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfbGVzc3RoYW5cbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dyZWF0ZXJ0aGFuKHMxLCBzMikge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfbGVzc3RoYW4oczIsIHMxKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19ncmVhdGVydGhhblxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19sZXNzdGhhblxuZnVuY3Rpb24gY2FtbF9ieXRlc19ncmVhdGVydGhhbihzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfbGVzc3RoYW4oczIsIHMxKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9maWxsX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3N0cl9yZXBlYXQsIGNhbWxfY29udmVydF9ieXRlc190b19hcnJheVxuLy9BbGlhczogY2FtbF9maWxsX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9maWxsX2J5dGVzKHMsIGksIGwsIGMpIHtcbiAgaWYgKGwgPiAwKSB7XG4gICAgaWYgKGkgPT09IDAgJiYgKGwgPj0gcy5sIHx8IChzLnQgPT09IDIgLyogUEFSVElBTCAqLyAmJiBsID49IHMuYy5sZW5ndGgpKSkge1xuICAgICAgaWYgKGMgPT09IDApIHtcbiAgICAgICAgcy5jID0gXCJcIjtcbiAgICAgICAgcy50ID0gMjsgLyogUEFSVElBTCAqL1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcy5jID0gY2FtbF9zdHJfcmVwZWF0KGwsIFN0cmluZy5mcm9tQ2hhckNvZGUoYykpO1xuICAgICAgICBzLnQgPSBsID09PSBzLmwgPyAwIC8qIEJZVEVTIHwgVU5LTk9XTiAqLyA6IDI7IC8qIFBBUlRJQUwgKi9cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHMudCAhPT0gNCAvKiBBUlJBWSAqLykgY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5KHMpO1xuICAgICAgZm9yIChsICs9IGk7IGkgPCBsOyBpKyspIHMuY1tpXSA9IGM7XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JsaXRfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfc3ViX3VpbnQ4X2FycmF5X3RvX2pzYnl0ZXMsIGNhbWxfY29udmVydF9ieXRlc190b19hcnJheVxuZnVuY3Rpb24gY2FtbF9ibGl0X2J5dGVzKHMxLCBpMSwgczIsIGkyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDA7XG4gIGlmIChcbiAgICBpMiA9PT0gMCAmJlxuICAgIChsZW4gPj0gczIubCB8fCAoczIudCA9PT0gMiAvKiBQQVJUSUFMICovICYmIGxlbiA+PSBzMi5jLmxlbmd0aCkpXG4gICkge1xuICAgIHMyLmMgPVxuICAgICAgczEudCA9PT0gNCAvKiBBUlJBWSAqL1xuICAgICAgICA/IGNhbWxfc3ViX3VpbnQ4X2FycmF5X3RvX2pzYnl0ZXMoczEuYywgaTEsIGxlbilcbiAgICAgICAgOiBpMSA9PT0gMCAmJiBzMS5jLmxlbmd0aCA9PT0gbGVuXG4gICAgICAgICAgPyBzMS5jXG4gICAgICAgICAgOiBzMS5jLnNsaWNlKGkxLCBpMSArIGxlbik7XG4gICAgczIudCA9IHMyLmMubGVuZ3RoID09PSBzMi5sID8gMCAvKiBCWVRFUyB8IFVOS05PV04gKi8gOiAyOyAvKiBQQVJUSUFMICovXG4gIH0gZWxzZSBpZiAoczIudCA9PT0gMiAvKiBQQVJUSUFMICovICYmIGkyID09PSBzMi5jLmxlbmd0aCkge1xuICAgIHMyLmMgKz1cbiAgICAgIHMxLnQgPT09IDQgLyogQVJSQVkgKi9cbiAgICAgICAgPyBjYW1sX3N1Yl91aW50OF9hcnJheV90b19qc2J5dGVzKHMxLmMsIGkxLCBsZW4pXG4gICAgICAgIDogaTEgPT09IDAgJiYgczEuYy5sZW5ndGggPT09IGxlblxuICAgICAgICAgID8gczEuY1xuICAgICAgICAgIDogczEuYy5zbGljZShpMSwgaTEgKyBsZW4pO1xuICAgIHMyLnQgPSBzMi5jLmxlbmd0aCA9PT0gczIubCA/IDAgLyogQllURVMgfCBVTktOT1dOICovIDogMjsgLyogUEFSVElBTCAqL1xuICB9IGVsc2Uge1xuICAgIGlmIChzMi50ICE9PSA0IC8qIEFSUkFZICovKSBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXkoczIpO1xuICAgIHZhciBjMSA9IHMxLmMsXG4gICAgICBjMiA9IHMyLmM7XG4gICAgaWYgKHMxLnQgPT09IDQgLyogQVJSQVkgKi8pIHtcbiAgICAgIGlmIChpMiA8PSBpMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBjMltpMiArIGldID0gYzFbaTEgKyBpXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkgYzJbaTIgKyBpXSA9IGMxW2kxICsgaV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBsID0gTWF0aC5taW4obGVuLCBjMS5sZW5ndGggLSBpMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykgYzJbaTIgKyBpXSA9IGMxLmNoYXJDb2RlQXQoaTEgKyBpKTtcbiAgICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIGMyW2kyICsgaV0gPSAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ibGl0X3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9ibGl0X2J5dGVzLCBjYW1sX2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9ibGl0X3N0cmluZyhhLCBiLCBjLCBkLCBlKSB7XG4gIGNhbWxfYmxpdF9ieXRlcyhjYW1sX2J5dGVzX29mX3N0cmluZyhhKSwgYiwgYywgZCwgZSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2J5dGVzX2xlbmd0aCBjb25zdFxuZnVuY3Rpb24gY2FtbF9tbF9ieXRlc19sZW5ndGgocykge1xuICByZXR1cm4gcy5sO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19jb25jYXQgY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfY29uY2F0KGEsIGIpIHtcbiAgcmV0dXJuIGEgKyBiO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19jb25jYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMsIE1sQnl0ZXNcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2NvbmNhdChzMSwgczIpIHtcbiAgczEudCAmIDYgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzMSk7XG4gIHMyLnQgJiA2ICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczIpO1xuICByZXR1cm4gbmV3IE1sQnl0ZXMoMCwgczEuYyArIHMyLmMsIHMxLmwgKyBzMi5sKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfdW5zYWZlX2dldCBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkpIHtcbiAgcmV0dXJuIHMuY2hhckNvZGVBdChpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoIGNvbnN0XG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSB7XG4gIHJldHVybiBzLmxlbmd0aDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfY29tcGFyZSBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19jb21wYXJlKHMxLCBzMikge1xuICByZXR1cm4gczEgPCBzMiA/IC0xIDogczEgPiBzMiA/IDEgOiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19lcXVhbCBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19lcXVhbChzMSwgczIpIHtcbiAgaWYgKHMxID09PSBzMikgcmV0dXJuIDE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19sZXNzZXF1YWwgY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfbGVzc2VxdWFsKHMxLCBzMikge1xuICByZXR1cm4gczEgPD0gczIgPyAxIDogMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfbGVzc3RoYW4gY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfbGVzc3RoYW4oczEsIHMyKSB7XG4gIHJldHVybiBzMSA8IHMyID8gMSA6IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX29mX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2J5dGVzKHMpIHtcbiAgcy50ICYgNiAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMpO1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhzLmMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX29mX3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19vZl9qc2J5dGVzLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfb2ZfanNieXRlcyhjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHMpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlcyBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHgpIHtcbiAgcmV0dXJuIHg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNieXRlc19vZl9zdHJpbmcgY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc2J5dGVzX29mX3N0cmluZyh4KSB7XG4gIHJldHVybiB4O1xufVxuXG4vL1Byb3ZpZGVzOiBqc29vX3RleHRfZGVjb2Rlcl9idWZmXG52YXIganNvb190ZXh0X2RlY29kZXJfYnVmZiA9IG5ldyBBcnJheUJ1ZmZlcigxMDI0KTtcblxuLy9Qcm92aWRlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IGpzb29faXNfYXNjaWlcbi8vUmVxdWlyZXM6IGpzb29fdGV4dF9kZWNvZGVyXG4vL1JlcXVpcmVzOiBqc29vX3RleHRfZGVjb2Rlcl9idWZmXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpIHtcbiAgaWYgKGpzb29faXNfYXNjaWkocykpIHJldHVybiBzO1xuICB2YXIgYSA9XG4gICAgcy5sZW5ndGggPD0ganNvb190ZXh0X2RlY29kZXJfYnVmZi5sZW5ndGhcbiAgICAgID8gbmV3IFVpbnQ4QXJyYXkoanNvb190ZXh0X2RlY29kZXJfYnVmZiwgMCwgcy5sZW5ndGgpXG4gICAgICA6IG5ldyBVaW50OEFycmF5KHMubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7XG4gICAgYVtpXSA9IHMuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4ganNvb190ZXh0X2RlY29kZXIuZGVjb2RlKGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfYXJyYXlcbi8vUmVxdWlyZXM6IGpzb29fdGV4dF9lbmNvZGVyXG4vL1JlcXVpcmVzOiBqc29vX2lzX2FzY2lpLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHMpIHtcbiAgaWYgKGpzb29faXNfYXNjaWkocykpIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHMpO1xuICB2YXIgYSA9IGpzb29fdGV4dF9lbmNvZGVyLmVuY29kZShzKTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2FycmF5KGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX29mX2pzYnl0ZXMgY29uc3Rcbi8vUmVxdWlyZXM6IE1sQnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfb2ZfanNieXRlcyhzKSB7XG4gIHJldHVybiBuZXcgTWxCeXRlcygwLCBzLCBzLmxlbmd0aCk7XG59XG5cbi8vIFRoZSBzZWN0aW9uIGJlbG93IHNob3VsZCBiZSB1c2VkIHdoZW4gdXNlLWpzLXN0cmluZz1mYWxzZVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXRcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSkge1xuICByZXR1cm4gY2FtbF9ieXRlc191bnNhZmVfZ2V0KHMsIGkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ191bnNhZmVfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9zZXRcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3Vuc2FmZV9zZXQocywgaSwgYykge1xuICByZXR1cm4gY2FtbF9ieXRlc191bnNhZmVfc2V0KHMsIGksIGMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGggY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfbWxfYnl0ZXNfbGVuZ3RoXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX21sX3N0cmluZ19sZW5ndGgocykge1xuICByZXR1cm4gY2FtbF9tbF9ieXRlc19sZW5ndGgocyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2NvbXBhcmVcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfY29tcGFyZVxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfY29tcGFyZShzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfY29tcGFyZShzMSwgczIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19lcXVhbFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19lcXVhbFxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfZXF1YWwoczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX2VxdWFsKHMxLCBzMik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2xlc3NlcXVhbFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19sZXNzZXF1YWxcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2xlc3NlcXVhbChzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfbGVzc2VxdWFsKHMxLCBzMik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2xlc3N0aGFuXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2xlc3N0aGFuXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19sZXNzdGhhbihzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfbGVzc3RoYW4oczEsIHMyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfb2ZfYnl0ZXNcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2J5dGVzKHMpIHtcbiAgcmV0dXJuIHM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfb2Zfc3RyaW5nIGNvbnN0XG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2J5dGVzX29mX3N0cmluZyhzKSB7XG4gIHJldHVybiBzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX29mX2pzYnl0ZXNcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMocykge1xuICByZXR1cm4gY2FtbF9ieXRlc19vZl9qc2J5dGVzKHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHMpIHtcbiAgcy50ICYgNiAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMpO1xuICByZXR1cm4gcy5jO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyBtdXRhYmxlIChjb25zdClcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIHMudG9VdGYxNigpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9ieXRlc19vZl91dGYxNl9qc3N0cmluZ1xuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcocykge1xuICByZXR1cm4gY2FtbF9ieXRlc19vZl91dGYxNl9qc3N0cmluZyhzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pc19tbF9ieXRlc1xuLy9SZXF1aXJlczogTWxCeXRlc1xuZnVuY3Rpb24gY2FtbF9pc19tbF9ieXRlcyhzKSB7XG4gIHJldHVybiBzIGluc3RhbmNlb2YgTWxCeXRlcztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9ieXRlc19jb250ZW50XG4vL1JlcXVpcmVzOiBNbEJ5dGVzLCBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG4vL1JldHVybnMgYSAoZnVsbCkgc3RyaW5nIG9mIGJ5dGVzIG9yIGFuIGFycmF5XG5mdW5jdGlvbiBjYW1sX21sX2J5dGVzX2NvbnRlbnQocykge1xuICBzd2l0Y2ggKHMudCAmIDYpIHtcbiAgICBjYXNlIDIgLyogUEFSVElBTCAqLzpcbiAgICAgIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMocyk7XG4gICAgICByZXR1cm4gcy5jO1xuICAgIGRlZmF1bHQ6IC8qIEJZVEVTIG9yIEFSUkFZICovXG4gICAgICByZXR1cm4gcy5jO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfbWxfc3RyaW5nXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfaXNfbWxfc3RyaW5nKHMpIHtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0NvbnRyb2xDaGFyYWN0ZXJzSW5SZWdleDogZXhwZWN0ZWRcbiAgcmV0dXJuIHR5cGVvZiBzID09PSBcInN0cmluZ1wiICYmICEvW15cXHgwMC1cXHhmZl0vLnRlc3Qocyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfbWxfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX2J5dGVzXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2lzX21sX3N0cmluZyhzKSB7XG4gIHJldHVybiBjYW1sX2lzX21sX2J5dGVzKHMpO1xufVxuXG4vLyBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSBkZXByZWNhdGVkXG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfdG9fYnl0ZV9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbi8vRGVwcmVjYXRlZDogVXNlIFtjYW1sX3N0cmluZ19vZl9qc2J5dGVzXSBpbnN0ZWFkXG5mdW5jdGlvbiBjYW1sX2pzX3RvX2J5dGVfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMocyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZnJvbV9zdHJpbmcgbXV0YWJsZSAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuLy9EZXByZWNhdGVkOiBVc2UgW2NhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXSBpbnN0ZWFkXG5mdW5jdGlvbiBjYW1sX2pzX2Zyb21fc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3RvX2pzX3N0cmluZyBtdXRhYmxlIChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG4vL0RlcHJlY2F0ZWQ6IFVzZSBbY2FtbF9qc3N0cmluZ19vZl9zdHJpbmddIGluc3RlYWRcbmZ1bmN0aW9uIGNhbWxfdG9fanNfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3RvX3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vRGVwcmVjYXRlZDogVXNlIFtjYW1sX3N0cmluZ19vZl9qc3N0cmluZ10gaW5zdGVhZFxuZnVuY3Rpb24gY2FtbF9qc190b19zdHJpbmcocykge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcocyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZ1xuLy9EZXByZWNhdGVkOiBVc2UgW2NhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nXSBpbnN0ZWFkXG5mdW5jdGlvbiBjYW1sX2FycmF5X29mX3N0cmluZyh4KSB7XG4gIHJldHVybiBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZyh4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9vZl9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF91aW50OF9hcnJheV9vZl9ieXRlc1xuLy9EZXByZWNhdGVkOiBVc2UgW2NhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNdIGluc3RlYWRcbmZ1bmN0aW9uIGNhbWxfYXJyYXlfb2ZfYnl0ZXMoeCkge1xuICByZXR1cm4gY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyh4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9uZXdfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL0RlcHJlY2F0ZWQ6IFVzZSBbY2FtbF9zdHJpbmdfb2ZfanNieXRlc10gaW5zdGVhZFxuZnVuY3Rpb24gY2FtbF9uZXdfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMocyk7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogY2FtbF9tYXJzaGFsX2NvbnN0YW50c1xudmFyIGNhbWxfbWFyc2hhbF9jb25zdGFudHMgPSB7XG4gIFBSRUZJWF9TTUFMTF9CTE9DSzogMHg4MCxcbiAgUFJFRklYX1NNQUxMX0lOVDogMHg0MCxcbiAgUFJFRklYX1NNQUxMX1NUUklORzogMHgyMCxcbiAgQ09ERV9JTlQ4OiAweDAwLFxuICBDT0RFX0lOVDE2OiAweDAxLFxuICBDT0RFX0lOVDMyOiAweDAyLFxuICBDT0RFX0lOVDY0OiAweDAzLFxuICBDT0RFX1NIQVJFRDg6IDB4MDQsXG4gIENPREVfU0hBUkVEMTY6IDB4MDUsXG4gIENPREVfU0hBUkVEMzI6IDB4MDYsXG4gIENPREVfQkxPQ0szMjogMHgwOCxcbiAgQ09ERV9CTE9DSzY0OiAweDEzLFxuICBDT0RFX1NUUklORzg6IDB4MDksXG4gIENPREVfU1RSSU5HMzI6IDB4MGEsXG4gIENPREVfRE9VQkxFX0JJRzogMHgwYixcbiAgQ09ERV9ET1VCTEVfTElUVExFOiAweDBjLFxuICBDT0RFX0RPVUJMRV9BUlJBWThfQklHOiAweDBkLFxuICBDT0RFX0RPVUJMRV9BUlJBWThfTElUVExFOiAweDBlLFxuICBDT0RFX0RPVUJMRV9BUlJBWTMyX0JJRzogMHgwZixcbiAgQ09ERV9ET1VCTEVfQVJSQVkzMl9MSVRUTEU6IDB4MDcsXG4gIENPREVfQ09ERVBPSU5URVI6IDB4MTAsXG4gIENPREVfSU5GSVhQT0lOVEVSOiAweDExLFxuICBDT0RFX0NVU1RPTTogMHgxMixcbiAgQ09ERV9DVVNUT01fTEVOOiAweDE4LFxuICBDT0RFX0NVU1RPTV9GSVhFRDogMHgxOSxcbn07XG5cbi8vUHJvdmlkZXM6IFVJbnQ4QXJyYXlSZWFkZXJcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5XG5jbGFzcyBVSW50OEFycmF5UmVhZGVyIHtcbiAgY29uc3RydWN0b3IocywgaSkge1xuICAgIHRoaXMucyA9IHM7XG4gICAgdGhpcy5pID0gaTtcbiAgfVxuXG4gIHJlYWQ4dSgpIHtcbiAgICByZXR1cm4gdGhpcy5zW3RoaXMuaSsrXTtcbiAgfVxuXG4gIHJlYWQ4cygpIHtcbiAgICByZXR1cm4gKHRoaXMuc1t0aGlzLmkrK10gPDwgMjQpID4+IDI0O1xuICB9XG5cbiAgcmVhZDE2dSgpIHtcbiAgICB2YXIgcyA9IHRoaXMucyxcbiAgICAgIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIDI7XG4gICAgcmV0dXJuIChzW2ldIDw8IDgpIHwgc1tpICsgMV07XG4gIH1cblxuICByZWFkMTZzKCkge1xuICAgIHZhciBzID0gdGhpcy5zLFxuICAgICAgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgMjtcbiAgICByZXR1cm4gKChzW2ldIDw8IDI0KSA+PiAxNikgfCBzW2kgKyAxXTtcbiAgfVxuXG4gIHJlYWQzMnUoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyA0O1xuICAgIHJldHVybiAoKHNbaV0gPDwgMjQpIHwgKHNbaSArIDFdIDw8IDE2KSB8IChzW2kgKyAyXSA8PCA4KSB8IHNbaSArIDNdKSA+Pj4gMDtcbiAgfVxuXG4gIHJlYWQzMnMoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyA0O1xuICAgIHJldHVybiAoc1tpXSA8PCAyNCkgfCAoc1tpICsgMV0gPDwgMTYpIHwgKHNbaSArIDJdIDw8IDgpIHwgc1tpICsgM107XG4gIH1cblxuICByZWFkc3RyKGxlbikge1xuICAgIHZhciBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyBsZW47XG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5KHRoaXMucy5zdWJhcnJheShpLCBpICsgbGVuKSk7XG4gIH1cblxuICByZWFkdWludDhhcnJheShsZW4pIHtcbiAgICB2YXIgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgbGVuO1xuICAgIHJldHVybiB0aGlzLnMuc3ViYXJyYXkoaSwgaSArIGxlbik7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogSnNTdHJpbmdSZWFkZXJcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmNsYXNzIEpzU3RyaW5nUmVhZGVyIHtcbiAgY29uc3RydWN0b3IocywgaSkge1xuICAgIHRoaXMucyA9IHM7XG4gICAgdGhpcy5pID0gaTtcbiAgfVxuXG4gIHJlYWQ4dSgpIHtcbiAgICByZXR1cm4gdGhpcy5zLmNoYXJDb2RlQXQodGhpcy5pKyspO1xuICB9XG5cbiAgcmVhZDhzKCkge1xuICAgIHJldHVybiAodGhpcy5zLmNoYXJDb2RlQXQodGhpcy5pKyspIDw8IDI0KSA+PiAyNDtcbiAgfVxuXG4gIHJlYWQxNnUoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyAyO1xuICAgIHJldHVybiAocy5jaGFyQ29kZUF0KGkpIDw8IDgpIHwgcy5jaGFyQ29kZUF0KGkgKyAxKTtcbiAgfVxuXG4gIHJlYWQxNnMoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyAyO1xuICAgIHJldHVybiAoKHMuY2hhckNvZGVBdChpKSA8PCAyNCkgPj4gMTYpIHwgcy5jaGFyQ29kZUF0KGkgKyAxKTtcbiAgfVxuXG4gIHJlYWQzMnUoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyA0O1xuICAgIHJldHVybiAoXG4gICAgICAoKHMuY2hhckNvZGVBdChpKSA8PCAyNCkgfFxuICAgICAgICAocy5jaGFyQ29kZUF0KGkgKyAxKSA8PCAxNikgfFxuICAgICAgICAocy5jaGFyQ29kZUF0KGkgKyAyKSA8PCA4KSB8XG4gICAgICAgIHMuY2hhckNvZGVBdChpICsgMykpID4+PlxuICAgICAgMFxuICAgICk7XG4gIH1cblxuICByZWFkMzJzKCkge1xuICAgIHZhciBzID0gdGhpcy5zLFxuICAgICAgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgNDtcbiAgICByZXR1cm4gKFxuICAgICAgKHMuY2hhckNvZGVBdChpKSA8PCAyNCkgfFxuICAgICAgKHMuY2hhckNvZGVBdChpICsgMSkgPDwgMTYpIHxcbiAgICAgIChzLmNoYXJDb2RlQXQoaSArIDIpIDw8IDgpIHxcbiAgICAgIHMuY2hhckNvZGVBdChpICsgMylcbiAgICApO1xuICB9XG5cbiAgcmVhZHN0cihsZW4pIHtcbiAgICB2YXIgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgbGVuO1xuICAgIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHRoaXMucy5zbGljZShpLCBpICsgbGVuKSk7XG4gIH1cblxuICByZWFkdWludDhhcnJheShsZW4pIHtcbiAgICB2YXIgYiA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gICAgdmFyIHMgPSB0aGlzLnM7XG4gICAgdmFyIGkgPSB0aGlzLmk7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW47IGorKykge1xuICAgICAgYltqXSA9IHMuY2hhckNvZGVBdChpICsgaik7XG4gICAgfVxuICAgIHRoaXMuaSA9IGkgKyBsZW47XG4gICAgcmV0dXJuIGI7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdF9vZl9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzLCBjYW1sX2ludDY0X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2Zsb2F0X29mX2J5dGVzKGEpIHtcbiAgcmV0dXJuIGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0cyhjYW1sX2ludDY0X29mX2J5dGVzKGEpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnB1dF92YWx1ZV9mcm9tX2J5dGVzIG11dGFibGVcbi8vUmVxdWlyZXM6IEpzU3RyaW5nUmVhZGVyLCBVSW50OEFycmF5UmVhZGVyXG4vL1JlcXVpcmVzOiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyXG4vL1JlcXVpcmVzOiBjYW1sX21sX2J5dGVzX2NvbnRlbnRcbmZ1bmN0aW9uIGNhbWxfaW5wdXRfdmFsdWVfZnJvbV9ieXRlcyhzLCBvZnMpIHtcbiAgdmFyIGMgPSBjYW1sX21sX2J5dGVzX2NvbnRlbnQocyk7XG4gIHZhciBvZnMgPSB0eXBlb2Ygb2ZzID09PSBcIm51bWJlclwiID8gb2ZzIDogb2ZzWzBdO1xuICB2YXIgcmVhZGVyID1cbiAgICBjIGluc3RhbmNlb2YgVWludDhBcnJheVxuICAgICAgPyBuZXcgVUludDhBcnJheVJlYWRlcihjLCBvZnMpXG4gICAgICA6IG5ldyBKc1N0cmluZ1JlYWRlcihjLCBvZnMpO1xuICByZXR1cm4gY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3JlYWRlcihyZWFkZXIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3VubWFyc2hhbFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF9pbnQ2NF91bm1hcnNoYWwocmVhZGVyLCBzaXplKSB7XG4gIHZhciB0ID0gbmV3IEFycmF5KDgpO1xuICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgc2l6ZVswXSA9IDg7XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2J5dGVzKHQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X21hcnNoYWxcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdG9fYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfaW50NjRfbWFyc2hhbCh3cml0ZXIsIHYsIHNpemVzKSB7XG4gIHZhciBiID0gY2FtbF9pbnQ2NF90b19ieXRlcyh2KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHdyaXRlci53cml0ZSg4LCBiW2ldKTtcbiAgc2l6ZXNbMF0gPSA4O1xuICBzaXplc1sxXSA9IDg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50MzJfdW5tYXJzaGFsXG5mdW5jdGlvbiBjYW1sX2ludDMyX3VubWFyc2hhbChyZWFkZXIsIHNpemUpIHtcbiAgc2l6ZVswXSA9IDQ7XG4gIHJldHVybiByZWFkZXIucmVhZDMycygpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX25hdGl2ZWludF91bm1hcnNoYWxcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfbmF0aXZlaW50X3VubWFyc2hhbChyZWFkZXIsIHNpemUpIHtcbiAgc3dpdGNoIChyZWFkZXIucmVhZDh1KCkpIHtcbiAgICBjYXNlIDE6XG4gICAgICBzaXplWzBdID0gNDtcbiAgICAgIHJldHVybiByZWFkZXIucmVhZDMycygpO1xuICAgIGNhc2UgMjpcbiAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogbmF0aXZlIGludGVnZXIgdmFsdWUgdG9vIGxhcmdlXCIpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogaWxsLWZvcm1lZCBuYXRpdmUgaW50ZWdlclwiKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2N1c3RvbV9vcHNcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdW5tYXJzaGFsLCBjYW1sX2ludDY0X21hcnNoYWwsIGNhbWxfaW50NjRfY29tcGFyZSwgY2FtbF9pbnQ2NF9oYXNoXG4vL1JlcXVpcmVzOiBjYW1sX2ludDMyX3VubWFyc2hhbCwgY2FtbF9uYXRpdmVpbnRfdW5tYXJzaGFsXG4vL1JlcXVpcmVzOiBjYW1sX2JhX3NlcmlhbGl6ZSwgY2FtbF9iYV9kZXNlcmlhbGl6ZSwgY2FtbF9iYV9jb21wYXJlLCBjYW1sX2JhX2hhc2hcbnZhciBjYW1sX2N1c3RvbV9vcHMgPSB7XG4gIF9qOiB7XG4gICAgZGVzZXJpYWxpemU6IGNhbWxfaW50NjRfdW5tYXJzaGFsLFxuICAgIHNlcmlhbGl6ZTogY2FtbF9pbnQ2NF9tYXJzaGFsLFxuICAgIGZpeGVkX2xlbmd0aDogOCxcbiAgICBjb21wYXJlOiBjYW1sX2ludDY0X2NvbXBhcmUsXG4gICAgaGFzaDogY2FtbF9pbnQ2NF9oYXNoLFxuICB9LFxuICBfaToge1xuICAgIGRlc2VyaWFsaXplOiBjYW1sX2ludDMyX3VubWFyc2hhbCxcbiAgICBmaXhlZF9sZW5ndGg6IDQsXG4gIH0sXG4gIF9uOiB7XG4gICAgZGVzZXJpYWxpemU6IGNhbWxfbmF0aXZlaW50X3VubWFyc2hhbCxcbiAgICBmaXhlZF9sZW5ndGg6IDQsXG4gIH0sXG4gIF9iaWdhcnJheToge1xuICAgIGRlc2VyaWFsaXplOiBmdW5jdGlvbiAocmVhZGVyLCBzeikge1xuICAgICAgcmV0dXJuIGNhbWxfYmFfZGVzZXJpYWxpemUocmVhZGVyLCBzeiwgXCJfYmlnYXJyYXlcIik7XG4gICAgfSxcbiAgICBzZXJpYWxpemU6IGNhbWxfYmFfc2VyaWFsaXplLFxuICAgIGNvbXBhcmU6IGNhbWxfYmFfY29tcGFyZSxcbiAgICBoYXNoOiBjYW1sX2JhX2hhc2gsXG4gIH0sXG4gIF9iaWdhcnIwMjoge1xuICAgIGRlc2VyaWFsaXplOiBmdW5jdGlvbiAocmVhZGVyLCBzeikge1xuICAgICAgcmV0dXJuIGNhbWxfYmFfZGVzZXJpYWxpemUocmVhZGVyLCBzeiwgXCJfYmlnYXJyMDJcIik7XG4gICAgfSxcbiAgICBzZXJpYWxpemU6IGNhbWxfYmFfc2VyaWFsaXplLFxuICAgIGNvbXBhcmU6IGNhbWxfYmFfY29tcGFyZSxcbiAgICBoYXNoOiBjYW1sX2JhX2hhc2gsXG4gIH0sXG59O1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbi8vUmVxdWlyZXM6IGNhbWxfZmxvYXRfb2ZfYnl0ZXMsIGNhbWxfY3VzdG9tX29wc1xuLy9SZXF1aXJlczogVUludDhBcnJheVJlYWRlclxuLy9SZXF1aXJlczogY2FtbF9kZWNvbXByZXNzX2lucHV0XG4vL1JlcXVpcmVzOiBjYW1sX3NldF9vb19pZFxuZnVuY3Rpb24gY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3JlYWRlcihyZWFkZXIpIHtcbiAgZnVuY3Rpb24gcmVhZHZscShvdmVyZmxvdykge1xuICAgIHZhciBjID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgIHZhciBuID0gYyAmIDB4N2Y7XG4gICAgd2hpbGUgKChjICYgMHg4MCkgIT09IDApIHtcbiAgICAgIGMgPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICB2YXIgbjcgPSBuIDw8IDc7XG4gICAgICBpZiAobiAhPT0gbjcgPj4gNykgb3ZlcmZsb3dbMF0gPSB0cnVlO1xuICAgICAgbiA9IG43IHwgKGMgJiAweDdmKTtcbiAgICB9XG4gICAgcmV0dXJuIG47XG4gIH1cbiAgdmFyIG9sZF9wb3MgPSByZWFkZXIuaTtcbiAgdmFyIG1hZ2ljID0gcmVhZGVyLnJlYWQzMnUoKTtcbiAgc3dpdGNoIChtYWdpYykge1xuICAgIGNhc2UgMHg4NDk1YTZiZSAvKiBJbnRleHRfbWFnaWNfbnVtYmVyX3NtYWxsICovOlxuICAgICAgdmFyIGhlYWRlcl9sZW4gPSAyMDtcbiAgICAgIHZhciBjb21wcmVzc2VkID0gMDtcbiAgICAgIHZhciBkYXRhX2xlbiA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICB2YXIgdW5jb21wcmVzc2VkX2RhdGFfbGVuID0gZGF0YV9sZW47XG4gICAgICB2YXIgbnVtX29iamVjdHMgPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgdmFyIF9zaXplXzMyID0gcmVhZGVyLnJlYWQzMnUoKTtcbiAgICAgIHZhciBfc2l6ZV82NCA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDB4ODQ5NWE2YmQgLyogSW50ZXh0X21hZ2ljX251bWJlcl9jb21wcmVzc2VkICovOlxuICAgICAgdmFyIGhlYWRlcl9sZW4gPSByZWFkZXIucmVhZDh1KCkgJiAweDNmO1xuICAgICAgdmFyIGNvbXByZXNzZWQgPSAxO1xuICAgICAgdmFyIG92ZXJmbG93ID0gW2ZhbHNlXTtcbiAgICAgIHZhciBkYXRhX2xlbiA9IHJlYWR2bHEob3ZlcmZsb3cpO1xuICAgICAgdmFyIHVuY29tcHJlc3NlZF9kYXRhX2xlbiA9IHJlYWR2bHEob3ZlcmZsb3cpO1xuICAgICAgdmFyIG51bV9vYmplY3RzID0gcmVhZHZscShvdmVyZmxvdyk7XG4gICAgICB2YXIgX3NpemVfMzIgPSByZWFkdmxxKG92ZXJmbG93KTtcbiAgICAgIHZhciBfc2l6ZV82NCA9IHJlYWR2bHEob3ZlcmZsb3cpO1xuICAgICAgaWYgKG92ZXJmbG93WzBdKSB7XG4gICAgICAgIGNhbWxfZmFpbHdpdGgoXG4gICAgICAgICAgXCJjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyOiBvYmplY3QgdG9vIGxhcmdlIHRvIGJlIHJlYWQgYmFjayBvbiB0aGlzIHBsYXRmb3JtXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDB4ODQ5NWE2YmYgLyogSW50ZXh0X21hZ2ljX251bWJlcl9iaWcgKi86XG4gICAgICBjYW1sX2ZhaWx3aXRoKFxuICAgICAgICBcImNhbWxfaW5wdXRfdmFsdWVfZnJvbV9yZWFkZXI6IG9iamVjdCB0b28gbGFyZ2UgdG8gYmUgcmVhZCBiYWNrIG9uIGEgMzItYml0IHBsYXRmb3JtXCIsXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyOiBiYWQgb2JqZWN0XCIpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgaWYgKGhlYWRlcl9sZW4gIT09IHJlYWRlci5pIC0gb2xkX3Bvcykge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyOiBpbnZhbGlkIGhlYWRlclwiKTtcbiAgfVxuICB2YXIgc3RhY2sgPSBbXTtcbiAgdmFyIG9iamVjdHMgPSBbXTtcbiAgdmFyIGludGVybl9vYmpfdGFibGUgPSBudW1fb2JqZWN0cyA+IDAgPyBbXSA6IG51bGw7XG4gIHZhciBvYmpfY291bnRlciA9IDA7XG4gIGZ1bmN0aW9uIGludGVybl9yZWMocmVhZGVyKSB7XG4gICAgdmFyIGNvZGUgPSByZWFkZXIucmVhZDh1KCk7XG4gICAgaWYgKGNvZGUgPj0gMHg0MCAvKmNzdC5QUkVGSVhfU01BTExfSU5UKi8pIHtcbiAgICAgIGlmIChjb2RlID49IDB4ODAgLypjc3QuUFJFRklYX1NNQUxMX0JMT0NLKi8pIHtcbiAgICAgICAgdmFyIHRhZyA9IGNvZGUgJiAweGY7XG4gICAgICAgIHZhciBzaXplID0gKGNvZGUgPj4gNCkgJiAweDc7XG4gICAgICAgIHZhciB2ID0gW3RhZ107XG4gICAgICAgIGlmIChzaXplID09PSAwKSByZXR1cm4gdjtcbiAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICBpZiAodGFnID09PSAyNDgpIG9iamVjdHMucHVzaCh2KTtcbiAgICAgICAgc3RhY2sucHVzaCh2LCBzaXplKTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgICB9IGVsc2UgcmV0dXJuIGNvZGUgJiAweDNmO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY29kZSA+PSAweDIwIC8qY3N0LlBSRUZJWF9TTUFMTF9TVFJJTkcgKi8pIHtcbiAgICAgICAgdmFyIGxlbiA9IGNvZGUgJiAweDFmO1xuICAgICAgICB2YXIgdiA9IHJlYWRlci5yZWFkc3RyKGxlbik7XG4gICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgICBjYXNlIDB4MDA6IC8vY3N0LkNPREVfSU5UODpcbiAgICAgICAgICAgIHJldHVybiByZWFkZXIucmVhZDhzKCk7XG4gICAgICAgICAgY2FzZSAweDAxOiAvL2NzdC5DT0RFX0lOVDE2OlxuICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkMTZzKCk7XG4gICAgICAgICAgY2FzZSAweDAyOiAvL2NzdC5DT0RFX0lOVDMyOlxuICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkMzJzKCk7XG4gICAgICAgICAgY2FzZSAweDAzOiAvL2NzdC5DT0RFX0lOVDY0OlxuICAgICAgICAgICAgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiBpbnRlZ2VyIHRvbyBsYXJnZVwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMHgwNDogLy9jc3QuQ09ERV9TSEFSRUQ4OlxuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgICAgIGlmIChjb21wcmVzc2VkID09PSAwKSBvZmZzZXQgPSBvYmpfY291bnRlciAtIG9mZnNldDtcbiAgICAgICAgICAgIHJldHVybiBpbnRlcm5fb2JqX3RhYmxlW29mZnNldF07XG4gICAgICAgICAgY2FzZSAweDA1OiAvL2NzdC5DT0RFX1NIQVJFRDE2OlxuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRlci5yZWFkMTZ1KCk7XG4gICAgICAgICAgICBpZiAoY29tcHJlc3NlZCA9PT0gMCkgb2Zmc2V0ID0gb2JqX2NvdW50ZXIgLSBvZmZzZXQ7XG4gICAgICAgICAgICByZXR1cm4gaW50ZXJuX29ial90YWJsZVtvZmZzZXRdO1xuICAgICAgICAgIGNhc2UgMHgwNjogLy9jc3QuQ09ERV9TSEFSRUQzMjpcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgICAgICAgaWYgKGNvbXByZXNzZWQgPT09IDApIG9mZnNldCA9IG9ial9jb3VudGVyIC0gb2Zmc2V0O1xuICAgICAgICAgICAgcmV0dXJuIGludGVybl9vYmpfdGFibGVbb2Zmc2V0XTtcbiAgICAgICAgICBjYXNlIDB4MDg6IC8vY3N0LkNPREVfQkxPQ0szMjpcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgICAgICAgdmFyIHRhZyA9IGhlYWRlciAmIDB4ZmY7XG4gICAgICAgICAgICB2YXIgc2l6ZSA9IGhlYWRlciA+PiAxMDtcbiAgICAgICAgICAgIHZhciB2ID0gW3RhZ107XG4gICAgICAgICAgICBpZiAoc2l6ZSA9PT0gMCkgcmV0dXJuIHY7XG4gICAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgICBpZiAodGFnID09PSAyNDgpIG9iamVjdHMucHVzaCh2KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2godiwgc2l6ZSk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICBjYXNlIDB4MTM6IC8vY3N0LkNPREVfQkxPQ0s2NDpcbiAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogZGF0YSBibG9jayB0b28gbGFyZ2VcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDB4MDk6IC8vY3N0LkNPREVfU1RSSU5HODpcbiAgICAgICAgICAgIHZhciBsZW4gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICB2YXIgdiA9IHJlYWRlci5yZWFkc3RyKGxlbik7XG4gICAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICBjYXNlIDB4MGE6IC8vY3N0LkNPREVfU1RSSU5HMzI6XG4gICAgICAgICAgICB2YXIgbGVuID0gcmVhZGVyLnJlYWQzMnUoKTtcbiAgICAgICAgICAgIHZhciB2ID0gcmVhZGVyLnJlYWRzdHIobGVuKTtcbiAgICAgICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgIGNhc2UgMHgwYzogLy9jc3QuQ09ERV9ET1VCTEVfTElUVExFOlxuICAgICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykgdFs3IC0gaV0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICB2YXIgdiA9IGNhbWxfZmxvYXRfb2ZfYnl0ZXModCk7XG4gICAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICBjYXNlIDB4MGI6IC8vY3N0LkNPREVfRE9VQkxFX0JJRzpcbiAgICAgICAgICAgIHZhciB0ID0gbmV3IEFycmF5KDgpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHRbaV0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICB2YXIgdiA9IGNhbWxfZmxvYXRfb2ZfYnl0ZXModCk7XG4gICAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICBjYXNlIDB4MGU6IC8vY3N0LkNPREVfRE9VQkxFX0FSUkFZOF9MSVRUTEU6XG4gICAgICAgICAgICB2YXIgbGVuID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgICAgICAgdmFyIHYgPSBuZXcgQXJyYXkobGVuICsgMSk7XG4gICAgICAgICAgICB2WzBdID0gMjU0O1xuICAgICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XG4gICAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBsZW47IGkrKykge1xuICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFs3IC0gal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICAgIHZbaV0gPSBjYW1sX2Zsb2F0X29mX2J5dGVzKHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgY2FzZSAweDBkOiAvL2NzdC5DT0RFX0RPVUJMRV9BUlJBWThfQklHOlxuICAgICAgICAgICAgdmFyIGxlbiA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgICAgIHZhciB2ID0gbmV3IEFycmF5KGxlbiArIDEpO1xuICAgICAgICAgICAgdlswXSA9IDI1NDtcbiAgICAgICAgICAgIHZhciB0ID0gbmV3IEFycmF5KDgpO1xuICAgICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHRbal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICAgIHZbaV0gPSBjYW1sX2Zsb2F0X29mX2J5dGVzKHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgY2FzZSAweDA3OiAvL2NzdC5DT0RFX0RPVUJMRV9BUlJBWTMyX0xJVFRMRTpcbiAgICAgICAgICAgIHZhciBsZW4gPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgICAgICAgdmFyIHYgPSBuZXcgQXJyYXkobGVuICsgMSk7XG4gICAgICAgICAgICB2WzBdID0gMjU0O1xuICAgICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBsZW47IGkrKykge1xuICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFs3IC0gal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICAgIHZbaV0gPSBjYW1sX2Zsb2F0X29mX2J5dGVzKHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgY2FzZSAweDBmOiAvL2NzdC5DT0RFX0RPVUJMRV9BUlJBWTMyX0JJRzpcbiAgICAgICAgICAgIHZhciBsZW4gPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgICAgICAgdmFyIHYgPSBuZXcgQXJyYXkobGVuICsgMSk7XG4gICAgICAgICAgICB2WzBdID0gMjU0O1xuICAgICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBsZW47IGkrKykge1xuICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgICAgICAgdltpXSA9IGNhbWxfZmxvYXRfb2ZfYnl0ZXModCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICBjYXNlIDB4MTA6IC8vY3N0LkNPREVfQ09ERVBPSU5URVI6XG4gICAgICAgICAgY2FzZSAweDExOiAvL2NzdC5DT0RFX0lORklYUE9JTlRFUjpcbiAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogY29kZSBwb2ludGVyXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAweDEyOiAvL2NzdC5DT0RFX0NVU1RPTTpcbiAgICAgICAgICBjYXNlIDB4MTg6IC8vY3N0LkNPREVfQ1VTVE9NX0xFTjpcbiAgICAgICAgICBjYXNlIDB4MTk6IC8vY3N0LkNPREVfQ1VTVE9NX0ZJWEVEOlxuICAgICAgICAgICAgdmFyIGMsXG4gICAgICAgICAgICAgIHMgPSBcIlwiO1xuICAgICAgICAgICAgd2hpbGUgKChjID0gcmVhZGVyLnJlYWQ4dSgpKSAhPT0gMCkgcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgICAgICAgICAgdmFyIG9wcyA9IGNhbWxfY3VzdG9tX29wc1tzXTtcbiAgICAgICAgICAgIHZhciBleHBlY3RlZF9zaXplO1xuICAgICAgICAgICAgaWYgKCFvcHMpXG4gICAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogdW5rbm93biBjdXN0b20gYmxvY2sgaWRlbnRpZmllclwiKTtcbiAgICAgICAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICAgICAgICBjYXNlIDB4MTI6IC8vIGNzdC5DT0RFX0NVU1RPTSAoZGVwcmVjYXRlZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAweDE5OiAvLyBjc3QuQ09ERV9DVVNUT01fRklYRURcbiAgICAgICAgICAgICAgICBpZiAoIW9wcy5maXhlZF9sZW5ndGgpXG4gICAgICAgICAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFxuICAgICAgICAgICAgICAgICAgICBcImlucHV0X3ZhbHVlOiBleHBlY3RlZCBhIGZpeGVkLXNpemUgY3VzdG9tIGJsb2NrXCIsXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkX3NpemUgPSBvcHMuZml4ZWRfbGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDB4MTg6IC8vIGNzdC5DT0RFX0NVU1RPTV9MRU5cbiAgICAgICAgICAgICAgICBleHBlY3RlZF9zaXplID0gcmVhZGVyLnJlYWQzMnUoKTtcbiAgICAgICAgICAgICAgICAvLyBTa2lwIHNpemU2NFxuICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkMzJzKCk7XG4gICAgICAgICAgICAgICAgcmVhZGVyLnJlYWQzMnMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzaXplID0gWzBdO1xuICAgICAgICAgICAgdmFyIHYgPSBvcHMuZGVzZXJpYWxpemUocmVhZGVyLCBzaXplKTtcbiAgICAgICAgICAgIGlmIChleHBlY3RlZF9zaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkX3NpemUgIT09IHNpemVbMF0pXG4gICAgICAgICAgICAgICAgY2FtbF9mYWlsd2l0aChcbiAgICAgICAgICAgICAgICAgIFwiaW5wdXRfdmFsdWU6IGluY29ycmVjdCBsZW5ndGggb2Ygc2VyaWFsaXplZCBjdXN0b20gYmxvY2tcIixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogaWxsLWZvcm1lZCBtZXNzYWdlXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChjb21wcmVzc2VkKSB7XG4gICAgaWYgKGNhbWxfZGVjb21wcmVzc19pbnB1dCkge1xuICAgICAgdmFyIGRhdGEgPSByZWFkZXIucmVhZHVpbnQ4YXJyYXkoZGF0YV9sZW4pO1xuICAgICAgdmFyIHJlcyA9IG5ldyBVaW50OEFycmF5KHVuY29tcHJlc3NlZF9kYXRhX2xlbik7XG4gICAgICB2YXIgcmVzID0gY2FtbF9kZWNvbXByZXNzX2lucHV0KGRhdGEsIHJlcyk7XG4gICAgICB2YXIgcmVhZGVyID0gbmV3IFVJbnQ4QXJyYXlSZWFkZXIocmVzLCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiBjb21wcmVzc2VkIG9iamVjdCwgY2Fubm90IGRlY29tcHJlc3NcIik7XG4gICAgfVxuICB9XG4gIHZhciByZXMgPSBpbnRlcm5fcmVjKHJlYWRlcik7XG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgdmFyIHNpemUgPSBzdGFjay5wb3AoKTtcbiAgICB2YXIgdiA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBkID0gdi5sZW5ndGg7XG4gICAgaWYgKGQgPCBzaXplKSBzdGFjay5wdXNoKHYsIHNpemUpO1xuICAgIHZbZF0gPSBpbnRlcm5fcmVjKHJlYWRlcik7XG4gIH1cbiAgd2hpbGUgKG9iamVjdHMubGVuZ3RoID4gMCkge1xuICAgIHZhciB4ID0gb2JqZWN0cy5wb3AoKTtcbiAgICBpZiAoeFsyXSA+PSAwKSBjYW1sX3NldF9vb19pZCh4KTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemVcbi8vVmVyc2lvbjogPCA1LjEuMFxudmFyIGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSA9IDIwO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemVcbi8vVmVyc2lvbjogPj0gNS4xLjBcbnZhciBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemUgPSAxNjtcblxuLy9Qcm92aWRlczogY2FtbF9tYXJzaGFsX2RhdGFfc2l6ZSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCBjYW1sX2J5dGVzX3Vuc2FmZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbi8vUmVxdWlyZXM6IFVJbnQ4QXJyYXlSZWFkZXJcbi8vUmVxdWlyZXM6IGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZVxuZnVuY3Rpb24gY2FtbF9tYXJzaGFsX2RhdGFfc2l6ZShzLCBvZnMpIHtcbiAgdmFyIHIgPSBuZXcgVUludDhBcnJheVJlYWRlcihjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzKHMpLCBvZnMpO1xuICBmdW5jdGlvbiByZWFkdmxxKG92ZXJmbG93KSB7XG4gICAgdmFyIGMgPSByLnJlYWQ4dSgpO1xuICAgIHZhciBuID0gYyAmIDB4N2Y7XG4gICAgd2hpbGUgKChjICYgMHg4MCkgIT09IDApIHtcbiAgICAgIGMgPSByLnJlYWQ4dSgpO1xuICAgICAgdmFyIG43ID0gbiA8PCA3O1xuICAgICAgaWYgKG4gIT09IG43ID4+IDcpIG92ZXJmbG93WzBdID0gdHJ1ZTtcbiAgICAgIG4gPSBuNyB8IChjICYgMHg3Zik7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9XG5cbiAgc3dpdGNoIChyLnJlYWQzMnUoKSkge1xuICAgIGNhc2UgMHg4NDk1YTZiZSAvKiBJbnRleHRfbWFnaWNfbnVtYmVyX3NtYWxsICovOlxuICAgICAgdmFyIGhlYWRlcl9sZW4gPSAyMDtcbiAgICAgIHZhciBkYXRhX2xlbiA9IHIucmVhZDMydSgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAweDg0OTVhNmJkIC8qIEludGV4dF9tYWdpY19udW1iZXJfY29tcHJlc3NlZCAqLzpcbiAgICAgIHZhciBoZWFkZXJfbGVuID0gci5yZWFkOHUoKSAmIDB4M2Y7XG4gICAgICB2YXIgb3ZlcmZsb3cgPSBbZmFsc2VdO1xuICAgICAgdmFyIGRhdGFfbGVuID0gcmVhZHZscShvdmVyZmxvdyk7XG4gICAgICBpZiAob3ZlcmZsb3dbMF0pIHtcbiAgICAgICAgY2FtbF9mYWlsd2l0aChcbiAgICAgICAgICBcIk1hcnNoYWwuZGF0YV9zaXplOiBvYmplY3QgdG9vIGxhcmdlIHRvIGJlIHJlYWQgYmFjayBvbiB0aGlzIHBsYXRmb3JtXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDB4ODQ5NWE2YmYgLyogSW50ZXh0X21hZ2ljX251bWJlcl9iaWcgKi86XG4gICAgICBjYW1sX2ZhaWx3aXRoKFxuICAgICAgICBcIk1hcnNoYWwuZGF0YV9zaXplOiBvYmplY3QgdG9vIGxhcmdlIHRvIGJlIHJlYWQgYmFjayBvbiBhIDMyLWJpdCBwbGF0Zm9ybVwiLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBjYW1sX2ZhaWx3aXRoKFwiTWFyc2hhbC5kYXRhX3NpemU6IGJhZCBvYmplY3RcIik7XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gaGVhZGVyX2xlbiAtIGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSArIGRhdGFfbGVuO1xufVxuXG4vL1Byb3ZpZGVzOiBNbE9iamVjdFRhYmxlXG5jbGFzcyBNbE9iamVjdFRhYmxlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5vYmpzID0gW107XG4gICAgdGhpcy5sb29rdXAgPSBuZXcgZ2xvYmFsVGhpcy5NYXAoKTtcbiAgfVxuXG4gIHN0b3JlKHYpIHtcbiAgICB0aGlzLmxvb2t1cC5zZXQodiwgdGhpcy5vYmpzLmxlbmd0aCk7XG4gICAgdGhpcy5vYmpzLnB1c2godik7XG4gIH1cblxuICByZWNhbGwodikge1xuICAgIHZhciBpID0gdGhpcy5sb29rdXAuZ2V0KHYpO1xuICAgIHJldHVybiBpID09PSB1bmRlZmluZWRcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHRoaXMub2Jqcy5sZW5ndGggLSBpOyAvKiBpbmRleCBpcyByZWxhdGl2ZSAqL1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF90b19ieXRlcywgY2FtbF9mYWlsd2l0aFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0XG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX2J5dGVzLCBjYW1sX21sX2J5dGVzX2xlbmd0aCwgY2FtbF9ieXRlc191bnNhZmVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX3N0cmluZywgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLCBjYW1sX3N0cmluZ191bnNhZmVfZ2V0XG4vL1JlcXVpcmVzOiBNbE9iamVjdFRhYmxlLCBjYW1sX2xpc3RfdG9fanNfYXJyYXksIGNhbWxfY3VzdG9tX29wc1xuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50LGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMsIGNhbWxfaXNfY29udGludWF0aW9uX3RhZ1xudmFyIGNhbWxfb3V0cHV0X3ZhbCA9IChmdW5jdGlvbiAoKSB7XG4gIGNsYXNzIFdyaXRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLmNodW5rID0gW107XG4gICAgICB0aGlzLmNodW5rX2lkeCA9IDIwO1xuICAgICAgdGhpcy5ibG9ja19sZW4gPSAwO1xuICAgICAgdGhpcy5vYmpfY291bnRlciA9IDA7XG4gICAgICB0aGlzLnNpemVfMzIgPSAwO1xuICAgICAgdGhpcy5zaXplXzY0ID0gMDtcbiAgICB9XG5cbiAgICB3cml0ZShzaXplLCB2YWx1ZSkge1xuICAgICAgZm9yICh2YXIgaSA9IHNpemUgLSA4OyBpID49IDA7IGkgLT0gOClcbiAgICAgICAgdGhpcy5jaHVua1t0aGlzLmNodW5rX2lkeCsrXSA9ICh2YWx1ZSA+PiBpKSAmIDB4ZmY7XG4gICAgfVxuXG4gICAgd3JpdGVfYXQocG9zLCBzaXplLCB2YWx1ZSkge1xuICAgICAgdmFyIHBvcyA9IHBvcztcbiAgICAgIGZvciAodmFyIGkgPSBzaXplIC0gODsgaSA+PSAwOyBpIC09IDgpXG4gICAgICAgIHRoaXMuY2h1bmtbcG9zKytdID0gKHZhbHVlID4+IGkpICYgMHhmZjtcbiAgICB9XG5cbiAgICB3cml0ZV9jb2RlKHNpemUsIGNvZGUsIHZhbHVlKSB7XG4gICAgICB0aGlzLmNodW5rW3RoaXMuY2h1bmtfaWR4KytdID0gY29kZTtcbiAgICAgIGZvciAodmFyIGkgPSBzaXplIC0gODsgaSA+PSAwOyBpIC09IDgpXG4gICAgICAgIHRoaXMuY2h1bmtbdGhpcy5jaHVua19pZHgrK10gPSAodmFsdWUgPj4gaSkgJiAweGZmO1xuICAgIH1cblxuICAgIHdyaXRlX3NoYXJlZChvZmZzZXQpIHtcbiAgICAgIGlmIChvZmZzZXQgPCAxIDw8IDgpXG4gICAgICAgIHRoaXMud3JpdGVfY29kZSg4LCAweDA0IC8qY3N0LkNPREVfU0hBUkVEOCovLCBvZmZzZXQpO1xuICAgICAgZWxzZSBpZiAob2Zmc2V0IDwgMSA8PCAxNilcbiAgICAgICAgdGhpcy53cml0ZV9jb2RlKDE2LCAweDA1IC8qY3N0LkNPREVfU0hBUkVEMTYqLywgb2Zmc2V0KTtcbiAgICAgIGVsc2UgdGhpcy53cml0ZV9jb2RlKDMyLCAweDA2IC8qY3N0LkNPREVfU0hBUkVEMzIqLywgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBwb3MoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jaHVua19pZHg7XG4gICAgfVxuXG4gICAgZmluYWxpemUoKSB7XG4gICAgICB0aGlzLmJsb2NrX2xlbiA9IHRoaXMuY2h1bmtfaWR4IC0gMjA7XG4gICAgICB0aGlzLmNodW5rX2lkeCA9IDA7XG4gICAgICB0aGlzLndyaXRlKDMyLCAweDg0OTVhNmJlKTtcbiAgICAgIHRoaXMud3JpdGUoMzIsIHRoaXMuYmxvY2tfbGVuKTtcbiAgICAgIHRoaXMud3JpdGUoMzIsIHRoaXMub2JqX2NvdW50ZXIpO1xuICAgICAgdGhpcy53cml0ZSgzMiwgdGhpcy5zaXplXzMyKTtcbiAgICAgIHRoaXMud3JpdGUoMzIsIHRoaXMuc2l6ZV82NCk7XG4gICAgICByZXR1cm4gdGhpcy5jaHVuaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICh2LCBmbGFncykge1xuICAgIGZsYWdzID0gY2FtbF9saXN0X3RvX2pzX2FycmF5KGZsYWdzKTtcblxuICAgIHZhciBub19zaGFyaW5nID0gZmxhZ3MuaW5kZXhPZigwIC8qTWFyc2hhbC5Ob19zaGFyaW5nKi8pICE9PSAtMSxcbiAgICAgIGNsb3N1cmVzID0gZmxhZ3MuaW5kZXhPZigxIC8qTWFyc2hhbC5DbG9zdXJlcyovKSAhPT0gLTE7XG4gICAgLyogTWFyc2hhbC5Db21wYXRfMzIgaXMgcmVkdW5kYW50IHNpbmNlIGludGVnZXJzIGFyZSAzMi1iaXQgYW55d2F5ICovXG5cbiAgICBpZiAoY2xvc3VyZXMpXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiaW4gY2FtbF9vdXRwdXRfdmFsOiBmbGFnIE1hcnNoYWwuQ2xvc3VyZXMgaXMgbm90IHN1cHBvcnRlZC5cIixcbiAgICAgICk7XG5cbiAgICB2YXIgd3JpdGVyID0gbmV3IFdyaXRlcigpO1xuICAgIHZhciBzdGFjayA9IFtdO1xuICAgIHZhciBpbnRlcm5fb2JqX3RhYmxlID0gbm9fc2hhcmluZyA/IG51bGwgOiBuZXcgTWxPYmplY3RUYWJsZSgpO1xuXG4gICAgZnVuY3Rpb24gbWVtbyh2KSB7XG4gICAgICBpZiAobm9fc2hhcmluZykgcmV0dXJuIGZhbHNlO1xuICAgICAgdmFyIGV4aXN0aW5nX29mZnNldCA9IGludGVybl9vYmpfdGFibGUucmVjYWxsKHYpO1xuICAgICAgaWYgKGV4aXN0aW5nX29mZnNldCkge1xuICAgICAgICB3cml0ZXIud3JpdGVfc2hhcmVkKGV4aXN0aW5nX29mZnNldCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW50ZXJuX29ial90YWJsZS5zdG9yZSh2KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4dGVybl9yZWModikge1xuICAgICAgaWYgKHYuY2FtbF9jdXN0b20pIHtcbiAgICAgICAgaWYgKG1lbW8odikpIHJldHVybjtcbiAgICAgICAgdmFyIG5hbWUgPSB2LmNhbWxfY3VzdG9tO1xuICAgICAgICB2YXIgb3BzID0gY2FtbF9jdXN0b21fb3BzW25hbWVdO1xuICAgICAgICB2YXIgc3pfMzJfNjQgPSBbMCwgMF07XG4gICAgICAgIGlmICghb3BzLnNlcmlhbGl6ZSlcbiAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJvdXRwdXRfdmFsdWU6IGFic3RyYWN0IHZhbHVlIChDdXN0b20pXCIpO1xuICAgICAgICBpZiAob3BzLmZpeGVkX2xlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgd3JpdGVyLndyaXRlKDgsIDB4MTggLypjc3QuQ09ERV9DVVNUT01fTEVOKi8pO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHdyaXRlci53cml0ZSg4LCBuYW1lLmNoYXJDb2RlQXQoaSkpO1xuICAgICAgICAgIHdyaXRlci53cml0ZSg4LCAwKTtcbiAgICAgICAgICB2YXIgaGVhZGVyX3BvcyA9IHdyaXRlci5wb3MoKTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZSg4LCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3BzLnNlcmlhbGl6ZSh3cml0ZXIsIHYsIHN6XzMyXzY0KTtcbiAgICAgICAgICB3cml0ZXIud3JpdGVfYXQoaGVhZGVyX3BvcywgMzIsIHN6XzMyXzY0WzBdKTtcbiAgICAgICAgICB3cml0ZXIud3JpdGVfYXQoaGVhZGVyX3BvcyArIDQsIDMyLCAwKTsgLy8gemVyb1xuICAgICAgICAgIHdyaXRlci53cml0ZV9hdChoZWFkZXJfcG9zICsgOCwgMzIsIHN6XzMyXzY0WzFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3cml0ZXIud3JpdGUoOCwgMHgxOSAvKmNzdC5DT0RFX0NVU1RPTV9GSVhFRCovKTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB3cml0ZXIud3JpdGUoOCwgbmFtZS5jaGFyQ29kZUF0KGkpKTtcbiAgICAgICAgICB3cml0ZXIud3JpdGUoOCwgMCk7XG4gICAgICAgICAgb3BzLnNlcmlhbGl6ZSh3cml0ZXIsIHYsIHN6XzMyXzY0KTtcbiAgICAgICAgICBpZiAob3BzLmZpeGVkX2xlbmd0aCAhPT0gc3pfMzJfNjRbMF0pXG4gICAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFxuICAgICAgICAgICAgICBcIm91dHB1dF92YWx1ZTogaW5jb3JyZWN0IGZpeGVkIHNpemVzIHNwZWNpZmllZCBieSBcIiArIG5hbWUsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5zaXplXzMyICs9IDIgKyAoKHN6XzMyXzY0WzBdICsgMykgPj4gMik7XG4gICAgICAgIHdyaXRlci5zaXplXzY0ICs9IDIgKyAoKHN6XzMyXzY0WzFdICsgNykgPj4gMyk7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodikgJiYgdlswXSA9PT0gKHZbMF0gfCAwKSkge1xuICAgICAgICBpZiAodlswXSA9PT0gMjUxKSB7XG4gICAgICAgICAgY2FtbF9mYWlsd2l0aChcIm91dHB1dF92YWx1ZTogYWJzdHJhY3QgdmFsdWUgKEFic3RyYWN0KVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FtbF9pc19jb250aW51YXRpb25fdGFnKHZbMF0pKVxuICAgICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIm91dHB1dF92YWx1ZTogY29udGludWF0aW9uIHZhbHVlXCIpO1xuICAgICAgICBpZiAodi5sZW5ndGggPiAxICYmIG1lbW8odikpIHJldHVybjtcbiAgICAgICAgaWYgKHZbMF0gPCAxNiAmJiB2Lmxlbmd0aCAtIDEgPCA4KVxuICAgICAgICAgIHdyaXRlci53cml0ZShcbiAgICAgICAgICAgIDgsXG4gICAgICAgICAgICAweDgwIC8qY3N0LlBSRUZJWF9TTUFMTF9CTE9DSyovICsgdlswXSArICgodi5sZW5ndGggLSAxKSA8PCA0KSxcbiAgICAgICAgICApO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgd3JpdGVyLndyaXRlX2NvZGUoXG4gICAgICAgICAgICAzMixcbiAgICAgICAgICAgIDB4MDggLypjc3QuQ09ERV9CTE9DSzMyKi8sXG4gICAgICAgICAgICAoKHYubGVuZ3RoIC0gMSkgPDwgMTApIHwgdlswXSxcbiAgICAgICAgICApO1xuICAgICAgICB3cml0ZXIuc2l6ZV8zMiArPSB2Lmxlbmd0aDtcbiAgICAgICAgd3JpdGVyLnNpemVfNjQgKz0gdi5sZW5ndGg7XG4gICAgICAgIGlmICh2Lmxlbmd0aCA+IDEpIHN0YWNrLnB1c2godiwgMSk7XG4gICAgICB9IGVsc2UgaWYgKGNhbWxfaXNfbWxfYnl0ZXModikpIHtcbiAgICAgICAgaWYgKCFjYW1sX2lzX21sX2J5dGVzKGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoXCJcIikpKSB7XG4gICAgICAgICAgY2FtbF9mYWlsd2l0aChcbiAgICAgICAgICAgIFwib3V0cHV0X3ZhbHVlOiBbQnl0ZXMudF0gY2Fubm90IHNhZmVseSBiZSBtYXJzaGFsZWQgd2l0aCBbLS1lbmFibGUgdXNlLWpzLXN0cmluZ11cIixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZW1vKHYpKSByZXR1cm47XG4gICAgICAgIHZhciBsZW4gPSBjYW1sX21sX2J5dGVzX2xlbmd0aCh2KTtcbiAgICAgICAgaWYgKGxlbiA8IDB4MjApIHdyaXRlci53cml0ZSg4LCAweDIwIC8qY3N0LlBSRUZJWF9TTUFMTF9TVFJJTkcqLyArIGxlbik7XG4gICAgICAgIGVsc2UgaWYgKGxlbiA8IDB4MTAwKVxuICAgICAgICAgIHdyaXRlci53cml0ZV9jb2RlKDgsIDB4MDkgLypjc3QuQ09ERV9TVFJJTkc4Ki8sIGxlbik7XG4gICAgICAgIGVsc2Ugd3JpdGVyLndyaXRlX2NvZGUoMzIsIDB4MGEgLypjc3QuQ09ERV9TVFJJTkczMiovLCBsZW4pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgICAgIHdyaXRlci53cml0ZSg4LCBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQodiwgaSkpO1xuICAgICAgICB3cml0ZXIuc2l6ZV8zMiArPSAxICsgKCgobGVuICsgNCkgLyA0KSB8IDApO1xuICAgICAgICB3cml0ZXIuc2l6ZV82NCArPSAxICsgKCgobGVuICsgOCkgLyA4KSB8IDApO1xuICAgICAgfSBlbHNlIGlmIChjYW1sX2lzX21sX3N0cmluZyh2KSkge1xuICAgICAgICBpZiAobWVtbyh2KSkgcmV0dXJuO1xuICAgICAgICB2YXIgbGVuID0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHYpO1xuICAgICAgICBpZiAobGVuIDwgMHgyMCkgd3JpdGVyLndyaXRlKDgsIDB4MjAgLypjc3QuUFJFRklYX1NNQUxMX1NUUklORyovICsgbGVuKTtcbiAgICAgICAgZWxzZSBpZiAobGVuIDwgMHgxMDApXG4gICAgICAgICAgd3JpdGVyLndyaXRlX2NvZGUoOCwgMHgwOSAvKmNzdC5DT0RFX1NUUklORzgqLywgbGVuKTtcbiAgICAgICAgZWxzZSB3cml0ZXIud3JpdGVfY29kZSgzMiwgMHgwYSAvKmNzdC5DT0RFX1NUUklORzMyKi8sIGxlbik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICAgICAgd3JpdGVyLndyaXRlKDgsIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQodiwgaSkpO1xuICAgICAgICB3cml0ZXIuc2l6ZV8zMiArPSAxICsgKCgobGVuICsgNCkgLyA0KSB8IDApO1xuICAgICAgICB3cml0ZXIuc2l6ZV82NCArPSAxICsgKCgobGVuICsgOCkgLyA4KSB8IDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHYgIT09ICh2IHwgMCkpIHtcbiAgICAgICAgICB2YXIgdHlwZV9vZl92ID0gdHlwZW9mIHY7XG4gICAgICAgICAgaWYgKHR5cGVfb2ZfdiAhPT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJvdXRwdXRfdmFsdWU6IGFic3RyYWN0IHZhbHVlIChcIiArIHR5cGVfb2ZfdiArIFwiKVwiKTtcbiAgICAgICAgICAvLyBJZiBhIGZsb2F0IGhhcHBlbnMgdG8gYmUgYW4gaW50ZWdlciBpdCBpcyBzZXJpYWxpemVkIGFzIGFuIGludGVnZXJcbiAgICAgICAgICAvLyAoSnNfb2Zfb2NhbWwgY2Fubm90IHRlbGwgd2hldGhlciB0aGUgdHlwZSBvZiBhbiBpbnRlZ2VyIG51bWJlciBpc1xuICAgICAgICAgIC8vIGZsb2F0IG9yIGludGVnZXIuKSBUaGlzIGNhbiByZXN1bHQgaW4gdW5leHBlY3RlZCBjcmFzaGVzIHdoZW5cbiAgICAgICAgICAvLyB1bm1hcnNoYWxsaW5nIHVzaW5nIHRoZSBzdGFuZGFyZCBydW50aW1lLlxuICAgICAgICAgIGlmIChtZW1vKHYpKSByZXR1cm47XG4gICAgICAgICAgdmFyIHQgPSBjYW1sX2ludDY0X3RvX2J5dGVzKGNhbWxfaW50NjRfYml0c19vZl9mbG9hdCh2KSk7XG4gICAgICAgICAgd3JpdGVyLndyaXRlKDgsIDB4MGMgLypjc3QuQ09ERV9ET1VCTEVfTElUVExFKi8pO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGUoOCwgdFs3IC0gaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3cml0ZXIuc2l6ZV8zMiArPSAzO1xuICAgICAgICAgIHdyaXRlci5zaXplXzY0ICs9IDI7XG4gICAgICAgIH0gZWxzZSBpZiAodiA+PSAwICYmIHYgPCAweDQwKSB7XG4gICAgICAgICAgd3JpdGVyLndyaXRlKDgsIDB4NDAgLypjc3QuUFJFRklYX1NNQUxMX0lOVCovICsgdik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHYgPj0gLSgxIDw8IDcpICYmIHYgPCAxIDw8IDcpXG4gICAgICAgICAgICB3cml0ZXIud3JpdGVfY29kZSg4LCAweDAwIC8qY3N0LkNPREVfSU5UOCovLCB2KTtcbiAgICAgICAgICBlbHNlIGlmICh2ID49IC0oMSA8PCAxNSkgJiYgdiA8IDEgPDwgMTUpXG4gICAgICAgICAgICB3cml0ZXIud3JpdGVfY29kZSgxNiwgMHgwMSAvKmNzdC5DT0RFX0lOVDE2Ki8sIHYpO1xuICAgICAgICAgIGVsc2Ugd3JpdGVyLndyaXRlX2NvZGUoMzIsIDB4MDIgLypjc3QuQ09ERV9JTlQzMiovLCB2KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBleHRlcm5fcmVjKHYpO1xuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgaSA9IHN0YWNrLnBvcCgpO1xuICAgICAgdmFyIHYgPSBzdGFjay5wb3AoKTtcbiAgICAgIGlmIChpICsgMSA8IHYubGVuZ3RoKSBzdGFjay5wdXNoKHYsIGkgKyAxKTtcbiAgICAgIGV4dGVybl9yZWModltpXSk7XG4gICAgfVxuICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSB3cml0ZXIub2JqX2NvdW50ZXIgPSBpbnRlcm5fb2JqX3RhYmxlLm9ianMubGVuZ3RoO1xuICAgIHdyaXRlci5maW5hbGl6ZSgpO1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheSh3cml0ZXIuY2h1bmspO1xuICB9O1xufSkoKTtcblxuLy9Qcm92aWRlczogY2FtbF9vdXRwdXRfdmFsdWVfdG9fc3RyaW5nIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfb3V0cHV0X3ZhbCwgY2FtbF9zdHJpbmdfb2ZfdWludDhfYXJyYXlcbmZ1bmN0aW9uIGNhbWxfb3V0cHV0X3ZhbHVlX3RvX3N0cmluZyh2LCBmbGFncykge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfdWludDhfYXJyYXkoY2FtbF9vdXRwdXRfdmFsKHYsIGZsYWdzKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J5dGVzIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfb3V0cHV0X3ZhbCwgY2FtbF9ieXRlc19vZl91aW50OF9hcnJheVxuZnVuY3Rpb24gY2FtbF9vdXRwdXRfdmFsdWVfdG9fYnl0ZXModiwgZmxhZ3MpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXkoY2FtbF9vdXRwdXRfdmFsKHYsIGZsYWdzKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J1ZmZlclxuLy9SZXF1aXJlczogY2FtbF9vdXRwdXRfdmFsLCBjYW1sX2ZhaWx3aXRoLCBjYW1sX2JsaXRfYnl0ZXMsIGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXlcbmZ1bmN0aW9uIGNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J1ZmZlcihzLCBvZnMsIGxlbiwgdiwgZmxhZ3MpIHtcbiAgdmFyIHQgPSBjYW1sX291dHB1dF92YWwodiwgZmxhZ3MpO1xuICBpZiAodC5sZW5ndGggPiBsZW4pIGNhbWxfZmFpbHdpdGgoXCJNYXJzaGFsLnRvX2J1ZmZlcjogYnVmZmVyIG92ZXJmbG93XCIpO1xuICBjYW1sX2JsaXRfYnl0ZXMoY2FtbF9ieXRlc19vZl91aW50OF9hcnJheSh0KSwgMCwgcywgb2ZzLCB0Lmxlbmd0aCk7XG4gIHJldHVybiAwO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDE0IErDqXLDtG1lIFZvdWlsbG9uLCBIdWdvIEhldXphcmRcbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8vLy8vLy8vLy8vLyBJb1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19mZHNcbnZhciBjYW1sX3N5c19mZHMgPSBuZXcgQXJyYXkoMyk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2Nsb3NlXG4vL1JlcXVpcmVzOiBjYW1sX3N5c19mZHNcbmZ1bmN0aW9uIGNhbWxfc3lzX2Nsb3NlKGZkKSB7XG4gIHZhciB4ID0gY2FtbF9zeXNfZmRzW2ZkXTtcbiAgaWYgKHgpIHtcbiAgICB4LmZpbGUuY2xvc2UoZmFsc2UpO1xuICAgIGRlbGV0ZSBjYW1sX3N5c19mZHNbZmRdO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBNbENoYW5pZFxuZnVuY3Rpb24gTWxDaGFuaWQoaWQpIHtcbiAgdGhpcy5pZCA9IGlkO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19vcGVuXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvclxuLy9SZXF1aXJlczogTWxGYWtlRmRfb3V0XG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZVxuLy9SZXF1aXJlczogZnNfbm9kZV9zdXBwb3J0ZWRcbi8vUmVxdWlyZXM6IGNhbWxfc3lzX2Zkc1xuLy9SZXF1aXJlczogY2FtbF9zeXNfb3Blbl9mb3Jfbm9kZVxuLy9SZXF1aXJlczogTWxDaGFuaWRcbmZ1bmN0aW9uIGNhbWxfc3lzX29wZW5faW50ZXJuYWwoZmlsZSwgaWR4KSB7XG4gIHZhciBjaGFuaWQ7XG4gIGlmIChpZHggPT09IHVuZGVmaW5lZCkge1xuICAgIGlkeCA9IGNhbWxfc3lzX2Zkcy5sZW5ndGg7XG4gICAgY2hhbmlkID0gbmV3IE1sQ2hhbmlkKGlkeCk7XG4gIH0gZWxzZSBpZiAoY2FtbF9zeXNfZmRzW2lkeF0pIHtcbiAgICBjaGFuaWQgPSBjYW1sX3N5c19mZHNbaWR4XS5jaGFuaWQ7XG4gIH0gZWxzZSBjaGFuaWQgPSBuZXcgTWxDaGFuaWQoaWR4KTtcbiAgY2FtbF9zeXNfZmRzW2lkeF0gPSB7IGZpbGU6IGZpbGUsIGNoYW5pZDogY2hhbmlkIH07XG4gIHJldHVybiBpZHggfCAwO1xufVxuZnVuY3Rpb24gY2FtbF9zeXNfb3BlbihuYW1lLCBmbGFncywgcGVybXMpIHtcbiAgdmFyIGYgPSB7fTtcbiAgd2hpbGUgKGZsYWdzKSB7XG4gICAgc3dpdGNoIChmbGFnc1sxXSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBmLnJkb25seSA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBmLndyb25seSA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBmLmFwcGVuZCA9IDE7XG4gICAgICAgIGYud3JpdGVvbmx5ID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGYuY3JlYXRlID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIGYudHJ1bmNhdGUgPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTpcbiAgICAgICAgZi5leGNsID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDY6XG4gICAgICAgIGYuYmluYXJ5ID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDc6XG4gICAgICAgIGYudGV4dCA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA4OlxuICAgICAgICBmLm5vbmJsb2NrID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGZsYWdzID0gZmxhZ3NbMl07XG4gIH1cbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgdmFyIGZpbGUgPSByb290LmRldmljZS5vcGVuKHJvb3QucmVzdCwgZiwgcGVybXMpO1xuICByZXR1cm4gY2FtbF9zeXNfb3Blbl9pbnRlcm5hbChmaWxlLCB1bmRlZmluZWQpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGlzX25vZGUgPSBmc19ub2RlX3N1cHBvcnRlZCgpO1xuICBmdW5jdGlvbiBmaWxlKGZkLCBmbGFncykge1xuICAgIGlmIChpc19ub2RlKSB7XG4gICAgICByZXR1cm4gY2FtbF9zeXNfb3Blbl9mb3Jfbm9kZShmZCwgZmxhZ3MpO1xuICAgIH0gZWxzZSByZXR1cm4gbmV3IE1sRmFrZUZkX291dChmZCwgZmxhZ3MpO1xuICB9XG4gIGNhbWxfc3lzX29wZW5faW50ZXJuYWwoXG4gICAgZmlsZSgwLCB7IHJkb25seTogMSwgYWx0bmFtZTogXCIvZGV2L3N0ZGluXCIsIGlzQ2hhcmFjdGVyRGV2aWNlOiB0cnVlIH0pLFxuICAgIDAsXG4gICk7XG4gIGNhbWxfc3lzX29wZW5faW50ZXJuYWwoXG4gICAgZmlsZSgxLCB7IGJ1ZmZlcmVkOiBpc19ub2RlID8gMSA6IDIsIHdyb25seTogMSwgaXNDaGFyYWN0ZXJEZXZpY2U6IHRydWUgfSksXG4gICAgMSxcbiAgKTtcbiAgY2FtbF9zeXNfb3Blbl9pbnRlcm5hbChcbiAgICBmaWxlKDIsIHsgYnVmZmVyZWQ6IGlzX25vZGUgPyAxIDogMiwgd3Jvbmx5OiAxLCBpc0NoYXJhY3RlckRldmljZTogdHJ1ZSB9KSxcbiAgICAyLFxuICApO1xufSkoKTtcblxuLy8gb2NhbWwgQ2hhbm5lbHNcblxuLy9Qcm92aWRlczogY2FtbF9tbF9zZXRfY2hhbm5lbF9uYW1lXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX21sX3NldF9jaGFubmVsX25hbWUoY2hhbmlkLCBuYW1lKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsX2dldChjaGFuaWQpO1xuICBjaGFuLm5hbWUgPSBuYW1lO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9jaGFubmVsc1xuLy9SZXF1aXJlczogTWxDaGFuaWRcbmNsYXNzIGNhbWxfbWxfY2hhbm5lbHNfc3RhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm1hcCA9IG5ldyBnbG9iYWxUaGlzLldlYWtNYXAoKTtcbiAgICB0aGlzLm9wZW5lZCA9IG5ldyBnbG9iYWxUaGlzLlNldCgpO1xuICB9XG5cbiAgY2xvc2UoY2hhbmlkKSB7XG4gICAgdGhpcy5vcGVuZWQuZGVsZXRlKGNoYW5pZCk7XG4gIH1cblxuICBnZXQoY2hhbmlkKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldChjaGFuaWQpO1xuICB9XG5cbiAgc2V0KGNoYW5pZCwgdmFsKSB7XG4gICAgaWYgKHZhbC5vcGVuZWQpIHRoaXMub3BlbmVkLmFkZChjaGFuaWQpO1xuICAgIHJldHVybiB0aGlzLm1hcC5zZXQoY2hhbmlkLCB2YWwpO1xuICB9XG5cbiAgYWxsKCkge1xuICAgIHJldHVybiB0aGlzLm9wZW5lZC52YWx1ZXMoKTtcbiAgfVxufVxuXG52YXIgY2FtbF9tbF9jaGFubmVscyA9IG5ldyBjYW1sX21sX2NoYW5uZWxzX3N0YXRlKCk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY2hhbm5lbF9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfY2hhbm5lbF9nZXQoaWQpIHtcbiAgcmV0dXJuIGNhbWxfbWxfY2hhbm5lbHMuZ2V0KGlkKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9jaGFubmVsX3JlZGlyZWN0XG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxfZ2V0LCBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX21sX2NoYW5uZWxfcmVkaXJlY3QoY2FwdHVyZWQsIGludG8pIHtcbiAgdmFyIHRvX3Jlc3RvcmUgPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNhcHR1cmVkKTtcbiAgdmFyIG5ld18gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGludG8pO1xuICBjYW1sX21sX2NoYW5uZWxzLnNldChjYXB0dXJlZCwgbmV3Xyk7XG4gIHJldHVybiB0b19yZXN0b3JlO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2NoYW5uZWxfcmVzdG9yZVxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9tbF9jaGFubmVsX3Jlc3RvcmUoY2FwdHVyZWQsIHRvX3Jlc3RvcmUpIHtcbiAgY2FtbF9tbF9jaGFubmVscy5zZXQoY2FwdHVyZWQsIHRvX3Jlc3RvcmUpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9vdXRfY2hhbm5lbHNfbGlzdFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsc1xuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldFxuZnVuY3Rpb24gY2FtbF9tbF9vdXRfY2hhbm5lbHNfbGlzdCgpIHtcbiAgdmFyIGwgPSAwO1xuICB2YXIga2V5cyA9IGNhbWxfbWxfY2hhbm5lbHMuYWxsKCk7XG4gIGZvciAodmFyIGsgb2Yga2V5cykge1xuICAgIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsX2dldChrKTtcbiAgICBpZiAoY2hhbi5vcGVuZWQgJiYgY2hhbi5vdXQpIGwgPSBbMCwgaywgbF07XG4gIH1cbiAgcmV0dXJuIGw7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX291dFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVscywgY2FtbF9zeXNfZmRzXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvclxuLy9SZXF1aXJlczogY2FtbF9zeXNfb3BlblxuLy9SZXF1aXJlczogY2FtbF9pb19idWZmZXJfc2l6ZVxuZnVuY3Rpb24gY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3Jfb3V0KGZkKSB7XG4gIHZhciBmZF9kZXNjID0gY2FtbF9zeXNfZmRzW2ZkXTtcbiAgaWYgKGZkX2Rlc2MgPT09IHVuZGVmaW5lZClcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihcImZkIFwiICsgZmQgKyBcIiBkb2Vzbid0IGV4aXN0XCIpO1xuICB2YXIgZmlsZSA9IGZkX2Rlc2MuZmlsZTtcbiAgdmFyIGNoYW5pZCA9IGZkX2Rlc2MuY2hhbmlkO1xuICB2YXIgYnVmZmVyZWQgPSBmaWxlLmZsYWdzLmJ1ZmZlcmVkICE9PSB1bmRlZmluZWQgPyBmaWxlLmZsYWdzLmJ1ZmZlcmVkIDogMTtcbiAgdmFyIGNoYW5uZWwgPSB7XG4gICAgZmlsZTogZmlsZSxcbiAgICBvZmZzZXQ6IGZpbGUucG9zKCksXG4gICAgZmQ6IGZkLFxuICAgIG9wZW5lZDogdHJ1ZSxcbiAgICBvdXQ6IHRydWUsXG4gICAgYnVmZmVyX2N1cnI6IDAsXG4gICAgYnVmZmVyOiBuZXcgVWludDhBcnJheShjYW1sX2lvX2J1ZmZlcl9zaXplKSxcbiAgICBidWZmZXJlZDogYnVmZmVyZWQsXG4gIH07XG4gIGNhbWxfbWxfY2hhbm5lbHMuc2V0KGNoYW5pZCwgY2hhbm5lbCk7XG4gIHJldHVybiBjaGFuaWQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX2luXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzLCBjYW1sX3N5c19mZHNcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX3N5c19vcGVuXG4vL1JlcXVpcmVzOiBjYW1sX2lvX2J1ZmZlcl9zaXplXG5mdW5jdGlvbiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pbihmZCkge1xuICB2YXIgZmRfZGVzYyA9IGNhbWxfc3lzX2Zkc1tmZF07XG4gIGlmIChmZF9kZXNjID09PSB1bmRlZmluZWQpXG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXCJmZCBcIiArIGZkICsgXCIgZG9lc24ndCBleGlzdFwiKTtcbiAgdmFyIGZpbGUgPSBmZF9kZXNjLmZpbGU7XG4gIHZhciBjaGFuaWQgPSBmZF9kZXNjLmNoYW5pZDtcbiAgdmFyIHJlZmlsbCA9IG51bGw7XG4gIHZhciBjaGFubmVsID0ge1xuICAgIGZpbGU6IGZpbGUsXG4gICAgb2Zmc2V0OiBmaWxlLnBvcygpLFxuICAgIGZkOiBmZCxcbiAgICBvcGVuZWQ6IHRydWUsXG4gICAgb3V0OiBmYWxzZSxcbiAgICBidWZmZXJfY3VycjogMCxcbiAgICBidWZmZXJfbWF4OiAwLFxuICAgIGJ1ZmZlcjogbmV3IFVpbnQ4QXJyYXkoY2FtbF9pb19idWZmZXJfc2l6ZSksXG4gICAgcmVmaWxsOiByZWZpbGwsXG4gIH07XG4gIGNhbWxfbWxfY2hhbm5lbHMuc2V0KGNoYW5pZCwgY2hhbm5lbCk7XG4gIHJldHVybiBjaGFuaWQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX2luX3dpdGhfZmxhZ3Ncbi8vUmVxdWlyZXM6IGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX2luXG4vL1ZlcnNpb246ID49IDUuMVxuZnVuY3Rpb24gY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3JfaW5fd2l0aF9mbGFncyhmZCwgX2ZsYWdzKSB7XG4gIHJldHVybiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pbihmZCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX291dF93aXRoX2ZsYWdzXG4vL1JlcXVpcmVzOiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9vdXRcbi8vVmVyc2lvbjogPj0gNS4xXG5mdW5jdGlvbiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9vdXRfd2l0aF9mbGFncyhmZCwgX2ZsYWdzKSB7XG4gIHJldHVybiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9vdXQoZmQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NoYW5uZWxfZGVzY3JpcHRvclxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldFxuLy9BbGlhczogd2luX2ZpbGVkZXNjcl9vZl9jaGFubmVsXG5mdW5jdGlvbiBjYW1sX2NoYW5uZWxfZGVzY3JpcHRvcihjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIHJldHVybiBjaGFuLmZkO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NldF9iaW5hcnlfbW9kZVxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldFxuZnVuY3Rpb24gY2FtbF9tbF9zZXRfYmluYXJ5X21vZGUoY2hhbmlkLCBtb2RlKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsX2dldChjaGFuaWQpO1xuICBjaGFuLmZpbGUuZmxhZ3MudGV4dCA9ICFtb2RlO1xuICBjaGFuLmZpbGUuZmxhZ3MuYmluYXJ5ID0gbW9kZTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaXNfYmluYXJ5X21vZGVcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbF9nZXRcbi8vVmVyc2lvbjogPj0gNS4yXG5mdW5jdGlvbiBjYW1sX21sX2lzX2JpbmFyeV9tb2RlKGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbF9nZXQoY2hhbmlkKTtcbiAgcmV0dXJuIGNoYW4uZmlsZS5mbGFncy5iaW5hcnk7XG59XG5cbi8vSW5wdXQgZnJvbSBpbl9jaGFubmVsXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY2xvc2VfY2hhbm5lbFxuLy9SZXF1aXJlczogY2FtbF9tbF9mbHVzaCwgY2FtbF9tbF9jaGFubmVsX2dldFxuLy9SZXF1aXJlczogY2FtbF9zeXNfY2xvc2Vcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfY2xvc2VfY2hhbm5lbChjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIGlmIChjaGFuLm9wZW5lZCkge1xuICAgIGNoYW4ub3BlbmVkID0gZmFsc2U7XG4gICAgY2FtbF9tbF9jaGFubmVscy5jbG9zZShjaGFuaWQpO1xuICAgIGNhbWxfc3lzX2Nsb3NlKGNoYW4uZmQpO1xuICAgIGNoYW4uZmQgPSAtMTtcbiAgICBjaGFuLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgPSAwO1xuICAgIGNoYW4uYnVmZmVyX21heCA9IDA7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY2hhbm5lbF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX21sX2NoYW5uZWxfc2l6ZShjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIHJldHVybiBjaGFuLmZpbGUubGVuZ3RoKCkgfCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2NoYW5uZWxfc2l6ZV82NFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9mbG9hdCxjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX21sX2NoYW5uZWxfc2l6ZV82NChjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2Zsb2F0KGNoYW4uZmlsZS5sZW5ndGgoKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc2V0X2NoYW5uZWxfb3V0cHV0XG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX21sX3NldF9jaGFubmVsX291dHB1dChjaGFuaWQsIGYpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIGNoYW4ub3V0cHV0ID0gZnVuY3Rpb24gKHMpIHtcbiAgICBmKHMpO1xuICB9O1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9zZXRfY2hhbm5lbF9yZWZpbGxcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbF9nZXRcbmZ1bmN0aW9uIGNhbWxfbWxfc2V0X2NoYW5uZWxfcmVmaWxsKGNoYW5pZCwgZikge1xuICBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCkucmVmaWxsID0gZjtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmVmaWxsXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGgsIGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvclxuZnVuY3Rpb24gY2FtbF9yZWZpbGwoY2hhbikge1xuICBpZiAoY2hhbi5yZWZpbGwgIT0gbnVsbCkge1xuICAgIHZhciBzdHIgPSBjaGFuLnJlZmlsbCgpO1xuICAgIHZhciBzdHJfYSA9IGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nKHN0cik7XG4gICAgaWYgKHN0cl9hLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2hhbi5yZWZpbGwgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hhbi5idWZmZXIubGVuZ3RoIDwgY2hhbi5idWZmZXJfbWF4ICsgc3RyX2EubGVuZ3RoKSB7XG4gICAgICAgIHZhciBiID0gbmV3IFVpbnQ4QXJyYXkoY2hhbi5idWZmZXJfbWF4ICsgc3RyX2EubGVuZ3RoKTtcbiAgICAgICAgYi5zZXQoY2hhbi5idWZmZXIpO1xuICAgICAgICBjaGFuLmJ1ZmZlciA9IGI7XG4gICAgICB9XG4gICAgICBjaGFuLmJ1ZmZlci5zZXQoc3RyX2EsIGNoYW4uYnVmZmVyX21heCk7XG4gICAgICBjaGFuLm9mZnNldCArPSBzdHJfYS5sZW5ndGg7XG4gICAgICBjaGFuLmJ1ZmZlcl9tYXggKz0gc3RyX2EubGVuZ3RoO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoY2hhbi5mZCA9PT0gLTEpIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKFwiQmFkIGZpbGUgZGVzY3JpcHRvclwiKTtcbiAgICB9XG4gICAgdmFyIG5yZWFkID0gY2hhbi5maWxlLnJlYWQoXG4gICAgICBjaGFuLmJ1ZmZlcixcbiAgICAgIGNoYW4uYnVmZmVyX21heCxcbiAgICAgIGNoYW4uYnVmZmVyLmxlbmd0aCAtIGNoYW4uYnVmZmVyX21heCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgY2hhbi5vZmZzZXQgKz0gbnJlYWQ7XG4gICAgY2hhbi5idWZmZXJfbWF4ICs9IG5yZWFkO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaW5wdXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfaW5wdXRfYmxvY2tcbi8vUmVxdWlyZXM6IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfbWxfaW5wdXQoY2hhbmlkLCBiLCBpLCBsKSB7XG4gIHZhciBiYSA9IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMoYik7XG4gIHJldHVybiBjYW1sX21sX2lucHV0X2Jsb2NrKGNoYW5pZCwgYmEsIGksIGwpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2lucHV0X2JpZ2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX21sX2lucHV0X2Jsb2NrXG4vL1JlcXVpcmVzOiBjYW1sX2JhX3RvX3R5cGVkX2FycmF5XG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF9tbF9pbnB1dF9iaWdhcnJheShjaGFuaWQsIGIsIGksIGwpIHtcbiAgdmFyIGJhID0gY2FtbF9iYV90b190eXBlZF9hcnJheShiKTtcbiAgcmV0dXJuIGNhbWxfbWxfaW5wdXRfYmxvY2soY2hhbmlkLCBiYSwgaSwgbCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaW5wdXRfYmxvY2tcbi8vUmVxdWlyZXM6IGNhbWxfcmVmaWxsLCBjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX21sX2lucHV0X2Jsb2NrKGNoYW5pZCwgYmEsIGksIGwpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIHZhciBuID0gbDtcbiAgdmFyIGF2YWlsID0gY2hhbi5idWZmZXJfbWF4IC0gY2hhbi5idWZmZXJfY3VycjtcbiAgaWYgKGwgPD0gYXZhaWwpIHtcbiAgICBiYS5zZXQoY2hhbi5idWZmZXIuc3ViYXJyYXkoY2hhbi5idWZmZXJfY3VyciwgY2hhbi5idWZmZXJfY3VyciArIGwpLCBpKTtcbiAgICBjaGFuLmJ1ZmZlcl9jdXJyICs9IGw7XG4gIH0gZWxzZSBpZiAoYXZhaWwgPiAwKSB7XG4gICAgYmEuc2V0KGNoYW4uYnVmZmVyLnN1YmFycmF5KGNoYW4uYnVmZmVyX2N1cnIsIGNoYW4uYnVmZmVyX2N1cnIgKyBhdmFpbCksIGkpO1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgKz0gYXZhaWw7XG4gICAgbiA9IGF2YWlsO1xuICB9IGVsc2Uge1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgPSAwO1xuICAgIGNoYW4uYnVmZmVyX21heCA9IDA7XG4gICAgY2FtbF9yZWZpbGwoY2hhbik7XG4gICAgdmFyIGF2YWlsID0gY2hhbi5idWZmZXJfbWF4IC0gY2hhbi5idWZmZXJfY3VycjtcbiAgICBpZiAobiA+IGF2YWlsKSBuID0gYXZhaWw7XG4gICAgYmEuc2V0KGNoYW4uYnVmZmVyLnN1YmFycmF5KGNoYW4uYnVmZmVyX2N1cnIsIGNoYW4uYnVmZmVyX2N1cnIgKyBuKSwgaSk7XG4gICAgY2hhbi5idWZmZXJfY3VyciArPSBuO1xuICB9XG4gIHJldHVybiBuIHwgMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnB1dF92YWx1ZVxuLy9SZXF1aXJlczogY2FtbF9tYXJzaGFsX2RhdGFfc2l6ZSwgY2FtbF9pbnB1dF92YWx1ZV9mcm9tX2J5dGVzLCBjYW1sX2NyZWF0ZV9ieXRlcywgY2FtbF9tbF9jaGFubmVsX2dldCwgY2FtbF9ieXRlc19vZl91aW50OF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9yZWZpbGwsIGNhbWxfZmFpbHdpdGgsIGNhbWxfcmFpc2VfZW5kX29mX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZVxuZnVuY3Rpb24gY2FtbF9pbnB1dF92YWx1ZShjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIHZhciBoZWFkZXIgPSBuZXcgVWludDhBcnJheShjYW1sX21hcnNoYWxfaGVhZGVyX3NpemUpO1xuICBmdW5jdGlvbiBibG9jayhidWZmZXIsIG9mZnNldCwgbikge1xuICAgIHZhciByID0gMDtcbiAgICB3aGlsZSAociA8IG4pIHtcbiAgICAgIGlmIChjaGFuLmJ1ZmZlcl9jdXJyID49IGNoYW4uYnVmZmVyX21heCkge1xuICAgICAgICBjaGFuLmJ1ZmZlcl9jdXJyID0gMDtcbiAgICAgICAgY2hhbi5idWZmZXJfbWF4ID0gMDtcbiAgICAgICAgY2FtbF9yZWZpbGwoY2hhbik7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbi5idWZmZXJfY3VyciA+PSBjaGFuLmJ1ZmZlcl9tYXgpIGJyZWFrO1xuICAgICAgYnVmZmVyW29mZnNldCArIHJdID0gY2hhbi5idWZmZXJbY2hhbi5idWZmZXJfY3Vycl07XG4gICAgICBjaGFuLmJ1ZmZlcl9jdXJyKys7XG4gICAgICByKys7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG4gIHZhciByID0gYmxvY2soaGVhZGVyLCAwLCBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemUpO1xuICBpZiAociA9PT0gMCkgY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSgpO1xuICBlbHNlIGlmIChyIDwgY2FtbF9tYXJzaGFsX2hlYWRlcl9zaXplKVxuICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogdHJ1bmNhdGVkIG9iamVjdFwiKTtcbiAgdmFyIGxlbiA9IGNhbWxfbWFyc2hhbF9kYXRhX3NpemUoY2FtbF9ieXRlc19vZl91aW50OF9hcnJheShoZWFkZXIpLCAwKTtcbiAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbiArIGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSk7XG4gIGJ1Zi5zZXQoaGVhZGVyLCAwKTtcbiAgdmFyIHIgPSBibG9jayhidWYsIGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSwgbGVuKTtcbiAgaWYgKHIgPCBsZW4pIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogdHJ1bmNhdGVkIG9iamVjdCBcIiArIHIgKyBcIiAgXCIgKyBsZW4pO1xuICB2YXIgcmVzID0gY2FtbF9pbnB1dF92YWx1ZV9mcm9tX2J5dGVzKGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXkoYnVmKSwgMCk7XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW5wdXRfdmFsdWVfdG9fb3V0c2lkZV9oZWFwXG4vL1JlcXVpcmVzOiBjYW1sX2lucHV0X3ZhbHVlXG4vL1ZlcnNpb246ID49IDVcbmZ1bmN0aW9uIGNhbWxfaW5wdXRfdmFsdWVfdG9fb3V0c2lkZV9oZWFwKGMpIHtcbiAgcmV0dXJuIGNhbWxfaW5wdXRfdmFsdWUoYyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaW5wdXRfY2hhclxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSwgY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldCwgY2FtbF9yZWZpbGxcbmZ1bmN0aW9uIGNhbWxfbWxfaW5wdXRfY2hhcihjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIGlmIChjaGFuLmJ1ZmZlcl9jdXJyID49IGNoYW4uYnVmZmVyX21heCkge1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgPSAwO1xuICAgIGNoYW4uYnVmZmVyX21heCA9IDA7XG4gICAgY2FtbF9yZWZpbGwoY2hhbik7XG4gIH1cbiAgaWYgKGNoYW4uYnVmZmVyX2N1cnIgPj0gY2hhbi5idWZmZXJfbWF4KSBjYW1sX3JhaXNlX2VuZF9vZl9maWxlKCk7XG4gIHZhciByZXMgPSBjaGFuLmJ1ZmZlcltjaGFuLmJ1ZmZlcl9jdXJyXTtcbiAgY2hhbi5idWZmZXJfY3VycisrO1xuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2lucHV0X2ludFxuLy9SZXF1aXJlczogY2FtbF9tbF9pbnB1dF9jaGFyXG5mdW5jdGlvbiBjYW1sX21sX2lucHV0X2ludChjaGFuaWQpIHtcbiAgdmFyIHJlcyA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgcmVzID0gKChyZXMgPDwgOCkgKyBjYW1sX21sX2lucHV0X2NoYXIoY2hhbmlkKSkgfCAwO1xuICB9XG4gIHJldHVybiByZXMgfCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3NlZWtfaW5cbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX3NlZWtfaW4oY2hhbmlkLCBwb3MpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIGlmIChjaGFuLnJlZmlsbCAhPSBudWxsKSBjYW1sX3JhaXNlX3N5c19lcnJvcihcIklsbGVnYWwgc2Vla1wiKTtcbiAgaWYgKFxuICAgIHBvcyA+PSBjaGFuLm9mZnNldCAtIGNoYW4uYnVmZmVyX21heCAmJlxuICAgIHBvcyA8PSBjaGFuLm9mZnNldCAmJlxuICAgIGNoYW4uZmlsZS5mbGFncy5iaW5hcnlcbiAgKSB7XG4gICAgY2hhbi5idWZmZXJfY3VyciA9IGNoYW4uYnVmZmVyX21heCAtIChjaGFuLm9mZnNldCAtIHBvcyk7XG4gIH0gZWxzZSB7XG4gICAgY2hhbi5maWxlLnNlZWsocG9zLCAwKTtcbiAgICBjaGFuLm9mZnNldCA9IHBvcztcbiAgICBjaGFuLmJ1ZmZlcl9jdXJyID0gMDtcbiAgICBjaGFuLmJ1ZmZlcl9tYXggPSAwO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NlZWtfaW5cbi8vUmVxdWlyZXM6IGNhbWxfc2Vla19pblxuZnVuY3Rpb24gY2FtbF9tbF9zZWVrX2luKGNoYW5pZCwgcG9zKSB7XG4gIHJldHVybiBjYW1sX3NlZWtfaW4oY2hhbmlkLCBwb3MpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NlZWtfaW5fNjRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdG9fZmxvYXQsIGNhbWxfc2Vla19pblxuZnVuY3Rpb24gY2FtbF9tbF9zZWVrX2luXzY0KGNoYW5pZCwgcG9zKSB7XG4gIHZhciBwb3MgPSBjYW1sX2ludDY0X3RvX2Zsb2F0KHBvcyk7XG4gIHJldHVybiBjYW1sX3NlZWtfaW4oY2hhbmlkLCBwb3MpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3Bvc19pblxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldFxuZnVuY3Rpb24gY2FtbF9wb3NfaW4oY2hhbmlkKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsX2dldChjaGFuaWQpO1xuICByZXR1cm4gY2hhbi5vZmZzZXQgLSAoY2hhbi5idWZmZXJfbWF4IC0gY2hhbi5idWZmZXJfY3Vycik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcG9zX2luXG4vL1JlcXVpcmVzOiBjYW1sX3Bvc19pblxuZnVuY3Rpb24gY2FtbF9tbF9wb3NfaW4oY2hhbmlkKSB7XG4gIHJldHVybiBjYW1sX3Bvc19pbihjaGFuaWQpIHwgMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9wb3NfaW5fNjRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfZmxvYXQsIGNhbWxfcG9zX2luXG5mdW5jdGlvbiBjYW1sX21sX3Bvc19pbl82NChjaGFuaWQpIHtcbiAgcmV0dXJuIGNhbWxfaW50NjRfb2ZfZmxvYXQoY2FtbF9wb3NfaW4oY2hhbmlkKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaW5wdXRfc2Nhbl9saW5lXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxfZ2V0LCBjYW1sX3JlZmlsbFxuZnVuY3Rpb24gY2FtbF9tbF9pbnB1dF9zY2FuX2xpbmUoY2hhbmlkKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsX2dldChjaGFuaWQpO1xuICB2YXIgcCA9IGNoYW4uYnVmZmVyX2N1cnI7XG4gIGRvIHtcbiAgICBpZiAocCA+PSBjaGFuLmJ1ZmZlcl9tYXgpIHtcbiAgICAgIGlmIChjaGFuLmJ1ZmZlcl9jdXJyID4gMCkge1xuICAgICAgICBjaGFuLmJ1ZmZlci5zZXQoY2hhbi5idWZmZXIuc3ViYXJyYXkoY2hhbi5idWZmZXJfY3VyciksIDApO1xuICAgICAgICBwIC09IGNoYW4uYnVmZmVyX2N1cnI7XG4gICAgICAgIGNoYW4uYnVmZmVyX21heCAtPSBjaGFuLmJ1ZmZlcl9jdXJyO1xuICAgICAgICBjaGFuLmJ1ZmZlcl9jdXJyID0gMDtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFuLmJ1ZmZlcl9tYXggPj0gY2hhbi5idWZmZXIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtY2hhbi5idWZmZXJfbWF4IHwgMDtcbiAgICAgIH1cbiAgICAgIHZhciBwcmV2X21heCA9IGNoYW4uYnVmZmVyX21heDtcbiAgICAgIGNhbWxfcmVmaWxsKGNoYW4pO1xuICAgICAgaWYgKHByZXZfbWF4ID09PSBjaGFuLmJ1ZmZlcl9tYXgpIHtcbiAgICAgICAgcmV0dXJuIC1jaGFuLmJ1ZmZlcl9tYXggfCAwO1xuICAgICAgfVxuICAgIH1cbiAgfSB3aGlsZSAoY2hhbi5idWZmZXJbcCsrXSAhPT0gMTApO1xuICByZXR1cm4gKHAgLSBjaGFuLmJ1ZmZlcl9jdXJyKSB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfZmx1c2hcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX21sX2NoYW5uZWxfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX3N1Yl91aW50OF9hcnJheV90b19qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX21sX2ZsdXNoKGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbF9nZXQoY2hhbmlkKTtcbiAgaWYgKCFjaGFuLm9wZW5lZCkgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXCJDYW5ub3QgZmx1c2ggYSBjbG9zZWQgY2hhbm5lbFwiKTtcbiAgaWYgKCFjaGFuLmJ1ZmZlciB8fCBjaGFuLmJ1ZmZlcl9jdXJyID09PSAwKSByZXR1cm4gMDtcbiAgaWYgKGNoYW4ub3V0cHV0KSB7XG4gICAgY2hhbi5vdXRwdXQoXG4gICAgICBjYW1sX3N1Yl91aW50OF9hcnJheV90b19qc2J5dGVzKGNoYW4uYnVmZmVyLCAwLCBjaGFuLmJ1ZmZlcl9jdXJyKSxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IGNoYW4uYnVmZmVyX2N1cnI7ICkge1xuICAgICAgcG9zICs9IGNoYW4uZmlsZS53cml0ZShjaGFuLmJ1ZmZlciwgcG9zLCBjaGFuLmJ1ZmZlcl9jdXJyIC0gcG9zLCBmYWxzZSk7XG4gICAgfVxuICB9XG4gIGNoYW4ub2Zmc2V0ICs9IGNoYW4uYnVmZmVyX2N1cnI7XG4gIGNoYW4uYnVmZmVyX2N1cnIgPSAwO1xuICByZXR1cm4gMDtcbn1cblxuLy9vdXRwdXQgdG8gb3V0X2NoYW5uZWxcblxuLy9Qcm92aWRlczogY2FtbF9tbF9vdXRwdXRfdGFcbi8vUmVxdWlyZXM6IGNhbWxfbWxfZmx1c2gsY2FtbF9tbF9ieXRlc19sZW5ndGhcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX21sX291dHB1dF90YShjaGFuaWQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW4pIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIGlmICghY2hhbi5vcGVuZWQpIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKFwiQ2Fubm90IG91dHB1dCB0byBhIGNsb3NlZCBjaGFubmVsXCIpO1xuICBidWZmZXIgPSBidWZmZXIuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW4pO1xuICBpZiAoY2hhbi5idWZmZXJfY3VyciArIGJ1ZmZlci5sZW5ndGggPiBjaGFuLmJ1ZmZlci5sZW5ndGgpIHtcbiAgICB2YXIgYiA9IG5ldyBVaW50OEFycmF5KGNoYW4uYnVmZmVyX2N1cnIgKyBidWZmZXIubGVuZ3RoKTtcbiAgICBiLnNldChjaGFuLmJ1ZmZlcik7XG4gICAgY2hhbi5idWZmZXIgPSBiO1xuICB9XG4gIHN3aXRjaCAoY2hhbi5idWZmZXJlZCkge1xuICAgIGNhc2UgMDogLy8gVW5idWZmZXJlZFxuICAgICAgY2hhbi5idWZmZXIuc2V0KGJ1ZmZlciwgY2hhbi5idWZmZXJfY3Vycik7XG4gICAgICBjaGFuLmJ1ZmZlcl9jdXJyICs9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICBjYW1sX21sX2ZsdXNoKGNoYW5pZCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6IC8vIEJ1ZmZlcmVkICh0aGUgZGVmYXVsdClcbiAgICAgIGNoYW4uYnVmZmVyLnNldChidWZmZXIsIGNoYW4uYnVmZmVyX2N1cnIpO1xuICAgICAgY2hhbi5idWZmZXJfY3VyciArPSBidWZmZXIubGVuZ3RoO1xuICAgICAgaWYgKGNoYW4uYnVmZmVyX2N1cnIgPj0gY2hhbi5idWZmZXIubGVuZ3RoKSBjYW1sX21sX2ZsdXNoKGNoYW5pZCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI6IC8vIEJ1ZmZlcmVkIChvbmx5IGZvciBzdGRvdXQgYW5kIHN0ZGVycilcbiAgICAgIHZhciBpZCA9IGJ1ZmZlci5sYXN0SW5kZXhPZigxMCk7XG4gICAgICBpZiAoaWQgPCAwKSB7XG4gICAgICAgIGNoYW4uYnVmZmVyLnNldChidWZmZXIsIGNoYW4uYnVmZmVyX2N1cnIpO1xuICAgICAgICBjaGFuLmJ1ZmZlcl9jdXJyICs9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgIGlmIChjaGFuLmJ1ZmZlcl9jdXJyID49IGNoYW4uYnVmZmVyLmxlbmd0aCkgY2FtbF9tbF9mbHVzaChjaGFuaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hhbi5idWZmZXIuc2V0KGJ1ZmZlci5zdWJhcnJheSgwLCBpZCArIDEpLCBjaGFuLmJ1ZmZlcl9jdXJyKTtcbiAgICAgICAgY2hhbi5idWZmZXJfY3VyciArPSBpZCArIDE7XG4gICAgICAgIGNhbWxfbWxfZmx1c2goY2hhbmlkKTtcbiAgICAgICAgY2hhbi5idWZmZXIuc2V0KGJ1ZmZlci5zdWJhcnJheShpZCArIDEpLCBjaGFuLmJ1ZmZlcl9jdXJyKTtcbiAgICAgICAgY2hhbi5idWZmZXJfY3VyciArPSBidWZmZXIubGVuZ3RoIC0gaWQgLSAxO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3V0cHV0X2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzLCBjYW1sX21sX291dHB1dF90YVxuZnVuY3Rpb24gY2FtbF9tbF9vdXRwdXRfYnl0ZXMoY2hhbmlkLCBidWZmZXIsIG9mZnNldCwgbGVuKSB7XG4gIHZhciBidWZmZXIgPSBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzKGJ1ZmZlcik7XG4gIHJldHVybiBjYW1sX21sX291dHB1dF90YShjaGFuaWQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW4pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX291dHB1dF9iaWdhcnJheVxuLy9SZXF1aXJlczogY2FtbF9iYV90b190eXBlZF9hcnJheSwgY2FtbF9tbF9vdXRwdXRfdGFcbi8vVmVyc2lvbjogPj0gNS4yXG5mdW5jdGlvbiBjYW1sX21sX291dHB1dF9iaWdhcnJheShjaGFuaWQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW4pIHtcbiAgdmFyIGJ1ZmZlciA9IGNhbWxfYmFfdG9fdHlwZWRfYXJyYXkoYnVmZmVyKTtcbiAgcmV0dXJuIGNhbWxfbWxfb3V0cHV0X3RhKGNoYW5pZCwgYnVmZmVyLCBvZmZzZXQsIGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3V0cHV0XG4vL1JlcXVpcmVzOiBjYW1sX21sX291dHB1dF9ieXRlcywgY2FtbF9ieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfbWxfb3V0cHV0KGNoYW5pZCwgYnVmZmVyLCBvZmZzZXQsIGxlbikge1xuICByZXR1cm4gY2FtbF9tbF9vdXRwdXRfYnl0ZXMoXG4gICAgY2hhbmlkLFxuICAgIGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKGJ1ZmZlciksXG4gICAgb2Zmc2V0LFxuICAgIGxlbixcbiAgKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9vdXRwdXRfY2hhclxuLy9SZXF1aXJlczogY2FtbF9tbF9vdXRwdXRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfbWxfb3V0cHV0X2NoYXIoY2hhbmlkLCBjKSB7XG4gIHZhciBzID0gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhTdHJpbmcuZnJvbUNoYXJDb2RlKGMpKTtcbiAgY2FtbF9tbF9vdXRwdXQoY2hhbmlkLCBzLCAwLCAxKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbHVlXG4vL1JlcXVpcmVzOiBjYW1sX291dHB1dF92YWx1ZV90b19zdHJpbmcsIGNhbWxfbWxfb3V0cHV0LGNhbWxfbWxfc3RyaW5nX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9vdXRwdXRfdmFsdWUoY2hhbmlkLCB2LCBmbGFncykge1xuICB2YXIgcyA9IGNhbWxfb3V0cHV0X3ZhbHVlX3RvX3N0cmluZyh2LCBmbGFncyk7XG4gIGNhbWxfbWxfb3V0cHV0KGNoYW5pZCwgcywgMCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc2Vla19vdXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbF9nZXQsIGNhbWxfbWxfZmx1c2hcbmZ1bmN0aW9uIGNhbWxfc2Vla19vdXQoY2hhbmlkLCBwb3MpIHtcbiAgY2FtbF9tbF9mbHVzaChjaGFuaWQpO1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbF9nZXQoY2hhbmlkKTtcbiAgY2hhbi5maWxlLnNlZWsocG9zLCAwKTtcbiAgY2hhbi5vZmZzZXQgPSBwb3M7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NlZWtfb3V0XG4vL1JlcXVpcmVzOiBjYW1sX3NlZWtfb3V0XG5mdW5jdGlvbiBjYW1sX21sX3NlZWtfb3V0KGNoYW5pZCwgcG9zKSB7XG4gIHJldHVybiBjYW1sX3NlZWtfb3V0KGNoYW5pZCwgcG9zKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc2Vla19vdXRfNjRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdG9fZmxvYXQsIGNhbWxfc2Vla19vdXRcbmZ1bmN0aW9uIGNhbWxfbWxfc2Vla19vdXRfNjQoY2hhbmlkLCBwb3MpIHtcbiAgdmFyIHBvcyA9IGNhbWxfaW50NjRfdG9fZmxvYXQocG9zKTtcbiAgcmV0dXJuIGNhbWxfc2Vla19vdXQoY2hhbmlkLCBwb3MpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3Bvc19vdXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbF9nZXQsIGNhbWxfbWxfZmx1c2hcbmZ1bmN0aW9uIGNhbWxfcG9zX291dChjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIHJldHVybiBjaGFuLm9mZnNldCArIGNoYW4uYnVmZmVyX2N1cnI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcG9zX291dFxuLy9SZXF1aXJlczogY2FtbF9wb3Nfb3V0XG5mdW5jdGlvbiBjYW1sX21sX3Bvc19vdXQoY2hhbmlkKSB7XG4gIHJldHVybiBjYW1sX3Bvc19vdXQoY2hhbmlkKSB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcG9zX291dF82NFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9mbG9hdCwgY2FtbF9wb3Nfb3V0XG5mdW5jdGlvbiBjYW1sX21sX3Bvc19vdXRfNjQoY2hhbmlkKSB7XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2Zsb2F0KGNhbWxfcG9zX291dChjaGFuaWQpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9vdXRwdXRfaW50XG4vL1JlcXVpcmVzOiBjYW1sX21sX291dHB1dF90YVxuZnVuY3Rpb24gY2FtbF9tbF9vdXRwdXRfaW50KGNoYW5pZCwgaSkge1xuICB2YXIgYXJyID0gWyhpID4+IDI0KSAmIDB4ZmYsIChpID4+IDE2KSAmIDB4ZmYsIChpID4+IDgpICYgMHhmZiwgaSAmIDB4ZmZdO1xuICBjYW1sX21sX291dHB1dF90YShjaGFuaWQsIG5ldyBVaW50OEFycmF5KGFyciksIDAsIDQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9pc19idWZmZXJlZFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldFxuZnVuY3Rpb24gY2FtbF9tbF9pc19idWZmZXJlZChjaGFuaWQpIHtcbiAgcmV0dXJuIGNhbWxfbWxfY2hhbm5lbF9nZXQoY2hhbmlkKS5idWZmZXJlZCA/IDEgOiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NldF9idWZmZXJlZFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldCwgY2FtbF9tbF9mbHVzaFxuZnVuY3Rpb24gY2FtbF9tbF9zZXRfYnVmZmVyZWQoY2hhbmlkLCB2KSB7XG4gIGNhbWxfbWxfY2hhbm5lbF9nZXQoY2hhbmlkKS5idWZmZXJlZCA9IHY7XG4gIGlmICghdikgY2FtbF9tbF9mbHVzaChjaGFuaWQpO1xuICByZXR1cm4gMDtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gU3lzXG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yIChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfd2l0aF9hcmcsIGNhbWxfZ2xvYmFsX2RhdGEsIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3N5c19lcnJvcihtc2cpIHtcbiAgY2FtbF9yYWlzZV93aXRoX2FyZyhjYW1sX2dsb2JhbF9kYXRhLlN5c19lcnJvciwgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcobXNnKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2V4aXRcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuLy9BbGlhczogY2FtbF91bml4X2V4aXRcbi8vQWxpYXM6IHVuaXhfZXhpdFxuZnVuY3Rpb24gY2FtbF9zeXNfZXhpdChjb2RlKSB7XG4gIGlmIChnbG9iYWxUaGlzLnF1aXQpIGdsb2JhbFRoaXMucXVpdChjb2RlKTtcbiAgLy9ub2RlanNcbiAgaWYgKGdsb2JhbFRoaXMucHJvY2Vzcz8uZXhpdCkgZ2xvYmFsVGhpcy5wcm9jZXNzLmV4aXQoY29kZSk7XG4gIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkZ1bmN0aW9uICdleGl0JyBub3QgaW1wbGVtZW50ZWRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfc3BlY2lhbF9leGNlcHRpb25cbmZ1bmN0aW9uIGNhbWxfaXNfc3BlY2lhbF9leGNlcHRpb24oZXhuKSB7XG4gIHN3aXRjaCAoZXhuWzJdKSB7XG4gICAgY2FzZSAtODogLy8gTWF0Y2hfZmFpbHVyZVxuICAgIGNhc2UgLTExOiAvLyBBc3NlcnRfZmFpbHVyZVxuICAgIGNhc2UgLTEyOiAvLyBVbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZVxuICAgICAgcmV0dXJuIDE7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAwO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZm9ybWF0X2V4Y2VwdGlvblxuLy9SZXF1aXJlczogTWxCeXRlcywgY2FtbF9pc19zcGVjaWFsX2V4Y2VwdGlvblxuZnVuY3Rpb24gY2FtbF9mb3JtYXRfZXhjZXB0aW9uKGV4bikge1xuICB2YXIgciA9IFwiXCI7XG4gIGlmIChleG5bMF0gPT09IDApIHtcbiAgICByICs9IGV4blsxXVsxXTtcbiAgICBpZiAoXG4gICAgICBleG4ubGVuZ3RoID09PSAzICYmXG4gICAgICBleG5bMl1bMF0gPT09IDAgJiZcbiAgICAgIGNhbWxfaXNfc3BlY2lhbF9leGNlcHRpb24oZXhuWzFdKVxuICAgICkge1xuICAgICAgdmFyIGJ1Y2tldCA9IGV4blsyXTtcbiAgICAgIHZhciBzdGFydCA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdGFydCA9IDI7XG4gICAgICB2YXIgYnVja2V0ID0gZXhuO1xuICAgIH1cbiAgICByICs9IFwiKFwiO1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGJ1Y2tldC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGkgPiBzdGFydCkgciArPSBcIiwgXCI7XG4gICAgICB2YXIgdiA9IGJ1Y2tldFtpXTtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikgciArPSB2LnRvU3RyaW5nKCk7XG4gICAgICBlbHNlIGlmICh2IGluc3RhbmNlb2YgTWxCeXRlcykge1xuICAgICAgICByICs9ICdcIicgKyB2LnRvU3RyaW5nKCkgKyAnXCInO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByICs9ICdcIicgKyB2LnRvU3RyaW5nKCkgKyAnXCInO1xuICAgICAgfSBlbHNlIHIgKz0gXCJfXCI7XG4gICAgfVxuICAgIHIgKz0gXCIpXCI7XG4gIH0gZWxzZSBpZiAoZXhuWzBdID09PSAyNDgpIHtcbiAgICByICs9IGV4blsxXTtcbiAgfVxuICByZXR1cm4gcjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb25cbi8vUmVxdWlyZXM6IGNhbWxfbmFtZWRfdmFsdWUsIGNhbWxfZm9ybWF0X2V4Y2VwdGlvbiwgY2FtbF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb24oZXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGVycikgJiYgKGVyclswXSA9PT0gMCB8fCBlcnJbMF0gPT09IDI0OCkpIHtcbiAgICB2YXIgaGFuZGxlciA9IGNhbWxfbmFtZWRfdmFsdWUoXCJQcmludGV4Yy5oYW5kbGVfdW5jYXVnaHRfZXhjZXB0aW9uXCIpO1xuICAgIGlmIChoYW5kbGVyKSBjYW1sX2NhbGxiYWNrKGhhbmRsZXIsIFtlcnIsIGZhbHNlXSk7XG4gICAgZWxzZSB7XG4gICAgICB2YXIgbXNnID0gY2FtbF9mb3JtYXRfZXhjZXB0aW9uKGVycik7XG4gICAgICB2YXIgYXRfZXhpdCA9IGNhbWxfbmFtZWRfdmFsdWUoXCJQZXJ2YXNpdmVzLmRvX2F0X2V4aXRcIik7XG4gICAgICBpZiAoYXRfZXhpdCkgY2FtbF9jYWxsYmFjayhhdF9leGl0LCBbMF0pO1xuICAgICAgY29uc29sZS5lcnJvcihcIkZhdGFsIGVycm9yOiBleGNlcHRpb24gXCIgKyBtc2cpO1xuICAgICAgaWYgKGVyci5qc19lcnJvcikgdGhyb3cgZXJyLmpzX2Vycm9yO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuLy9Qcm92aWRlczoganNvb19zdGF0aWNfZW52XG52YXIganNvb19zdGF0aWNfZW52ID0ge307XG5cbi8vUHJvdmlkZXM6IGNhbWxfc2V0X3N0YXRpY19lbnZcbi8vUmVxdWlyZXM6IGpzb29fc3RhdGljX2VudlxuZnVuY3Rpb24gY2FtbF9zZXRfc3RhdGljX2VudihrLCB2KSB7XG4gIGpzb29fc3RhdGljX2VudltrXSA9IHY7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBqc29vX3N5c19nZXRlbnYgKGNvbnN0KVxuLy9SZXF1aXJlczoganNvb19zdGF0aWNfZW52XG5mdW5jdGlvbiBqc29vX3N5c19nZXRlbnYobikge1xuICBpZiAoanNvb19zdGF0aWNfZW52W25dKSByZXR1cm4ganNvb19zdGF0aWNfZW52W25dO1xuICB2YXIgcHJvY2VzcyA9IGdsb2JhbFRoaXMucHJvY2VzcztcbiAgLy9ub2RlanMgZW52XG4gIGlmIChwcm9jZXNzICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52W25dICE9PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIHByb2Nlc3MuZW52W25dO1xuICBpZiAoZ2xvYmFsVGhpcy5qc29vX2VudiAmJiB0eXBlb2YgZ2xvYmFsVGhpcy5qc29vX2VudltuXSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBnbG9iYWxUaGlzLmpzb29fZW52W25dO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2dldGVudiAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX25vdF9mb3VuZFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBqc29vX3N5c19nZXRlbnZcbmZ1bmN0aW9uIGNhbWxfc3lzX2dldGVudihuYW1lKSB7XG4gIHZhciByID0ganNvb19zeXNfZ2V0ZW52KGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKG5hbWUpKTtcbiAgaWYgKHIgPT09IHVuZGVmaW5lZCkgY2FtbF9yYWlzZV9ub3RfZm91bmQoKTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19nZXRlbnZfb3B0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuLy9SZXF1aXJlczoganNvb19zeXNfZ2V0ZW52XG4vL1ZlcnNpb246ID49IDUuNFxuZnVuY3Rpb24gY2FtbF9zeXNfZ2V0ZW52X29wdChuYW1lKSB7XG4gIHZhciByID0ganNvb19zeXNfZ2V0ZW52KGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKG5hbWUpKTtcbiAgaWYgKHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gIHJldHVybiBbMCwgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcocildO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c191bnNhZmVfZ2V0ZW52XG4vL1JlcXVpcmVzOiBjYW1sX3N5c19nZXRlbnZcbmZ1bmN0aW9uIGNhbWxfc3lzX3Vuc2FmZV9nZXRlbnYobmFtZSkge1xuICByZXR1cm4gY2FtbF9zeXNfZ2V0ZW52KG5hbWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FyZ3Zcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG52YXIgY2FtbF9hcmd2ID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHByb2Nlc3MgPSBnbG9iYWxUaGlzLnByb2Nlc3M7XG4gIHZhciBtYWluID0gXCJhLm91dFwiO1xuICB2YXIgYXJncyA9IFtdO1xuXG4gIGlmIChwcm9jZXNzPy5hcmd2Py5sZW5ndGggPiAxKSB7XG4gICAgdmFyIGFyZ3YgPSBwcm9jZXNzLmFyZ3Y7XG4gICAgLy9ub2RlanNcbiAgICBtYWluID0gYXJndlsxXTtcbiAgICBhcmdzID0gYXJndi5zbGljZSgyKTtcbiAgfVxuXG4gIHZhciBwID0gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcobWFpbik7XG4gIHZhciBhcmdzMiA9IFswLCBwXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKVxuICAgIGFyZ3MyLnB1c2goY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoYXJnc1tpXSkpO1xuICByZXR1cm4gYXJnczI7XG59KSgpO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2V4ZWN1dGFibGVfbmFtZVxuLy9SZXF1aXJlczogY2FtbF9hcmd2XG52YXIgY2FtbF9leGVjdXRhYmxlX25hbWUgPSBjYW1sX2FyZ3ZbMV07XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2dldF9hcmd2XG4vL1JlcXVpcmVzOiBjYW1sX2FyZ3ZcbmZ1bmN0aW9uIGNhbWxfc3lzX2dldF9hcmd2KF91bml0KSB7XG4gIHJldHVybiBbMCwgY2FtbF9hcmd2WzFdLCBjYW1sX2FyZ3ZdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19hcmd2XG4vL1JlcXVpcmVzOiBjYW1sX2FyZ3ZcbmZ1bmN0aW9uIGNhbWxfc3lzX2FyZ3YoX3VuaXQpIHtcbiAgcmV0dXJuIGNhbWxfYXJndjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfbW9kaWZ5X2FyZ3Zcbi8vUmVxdWlyZXM6IGNhbWxfYXJndlxuZnVuY3Rpb24gY2FtbF9zeXNfbW9kaWZ5X2FyZ3YoYXJnKSB7XG4gIGNhbWxfYXJndiA9IGFyZztcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2V4ZWN1dGFibGVfbmFtZSBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9leGVjdXRhYmxlX25hbWVcbmZ1bmN0aW9uIGNhbWxfc3lzX2V4ZWN1dGFibGVfbmFtZShfdW5pdCkge1xuICByZXR1cm4gY2FtbF9leGVjdXRhYmxlX25hbWU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX3N5c3RlbV9jb21tYW5kXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9zeXNfc3lzdGVtX2NvbW1hbmQoY21kKSB7XG4gIHZhciBjbWQgPSBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhjbWQpO1xuICBpZiAodHlwZW9mIHJlcXVpcmUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB2YXIgY2hpbGRfcHJvY2VzcyA9IHJlcXVpcmUoXCJub2RlOmNoaWxkX3Byb2Nlc3NcIik7XG4gICAgaWYgKGNoaWxkX3Byb2Nlc3M/LmV4ZWNTeW5jKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY2hpbGRfcHJvY2Vzcy5leGVjU3luYyhjbWQsIHsgc3RkaW86IFwiaW5oZXJpdFwiIH0pO1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gIH0gZWxzZSByZXR1cm4gMTI3O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19zeXN0ZW1fY29tbWFuZFxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbi8vSWY6IGJyb3dzZXJcbmZ1bmN0aW9uIGNhbWxfc3lzX3N5c3RlbV9jb21tYW5kKF9jbWQpIHtcbiAgcmV0dXJuIDEyNztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfdGltZSBtdXRhYmxlXG52YXIgY2FtbF9pbml0aWFsX3RpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAqIDAuMDAxO1xuZnVuY3Rpb24gY2FtbF9zeXNfdGltZSgpIHtcbiAgdmFyIG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICByZXR1cm4gbm93ICogMC4wMDEgLSBjYW1sX2luaXRpYWxfdGltZTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfdGltZV9pbmNsdWRlX2NoaWxkcmVuXG4vL1JlcXVpcmVzOiBjYW1sX3N5c190aW1lXG5mdW5jdGlvbiBjYW1sX3N5c190aW1lX2luY2x1ZGVfY2hpbGRyZW4oX2IpIHtcbiAgcmV0dXJuIGNhbWxfc3lzX3RpbWUoKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfcmFuZG9tX3NlZWQgbXV0YWJsZVxuLy9UaGUgZnVuY3Rpb24gbmVlZHMgdG8gcmV0dXJuIGFuIGFycmF5IHNpbmNlIE9DYW1sIDQuMC4uLlxuZnVuY3Rpb24gY2FtbF9zeXNfcmFuZG9tX3NlZWQoKSB7XG4gIGlmIChnbG9iYWxUaGlzLmNyeXB0bykge1xuICAgIGlmIChnbG9iYWxUaGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgIHZhciBhID0gZ2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBJbnQzMkFycmF5KDQpKTtcbiAgICAgIHJldHVybiBbMCwgYVswXSwgYVsxXSwgYVsyXSwgYVszXV07XG4gICAgfSBlbHNlIGlmIChnbG9iYWxUaGlzLmNyeXB0by5yYW5kb21CeXRlcykge1xuICAgICAgdmFyIGEgPSBuZXcgSW50MzJBcnJheShnbG9iYWxUaGlzLmNyeXB0by5yYW5kb21CeXRlcygxNikuYnVmZmVyKTtcbiAgICAgIHJldHVybiBbMCwgYVswXSwgYVsxXSwgYVsyXSwgYVszXV07XG4gICAgfVxuICB9XG4gIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgdmFyIHggPSBub3cgXiAoMHhmZmZmZmZmZiAqIE1hdGgucmFuZG9tKCkpO1xuICByZXR1cm4gWzAsIHhdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jb25zdF9iaWdfZW5kaWFuIGNvbnN0XG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF9iaWdfZW5kaWFuKCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3Rfd29yZF9zaXplIGNvbnN0XG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF93b3JkX3NpemUoKSB7XG4gIHJldHVybiAzMjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3RfaW50X3NpemUgY29uc3RcbmZ1bmN0aW9uIGNhbWxfc3lzX2NvbnN0X2ludF9zaXplKCkge1xuICByZXR1cm4gMzI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X21heF93b3NpemUgY29uc3Rcbi8vIG1heF9pbnQgLyA0IHNvIHRoYXQgdGhlIGZvbGxvd2luZyBkb2VzIG5vdCBvdmVyZmxvd1xuLy9sZXQgbWF4X3N0cmluZ19sZW5ndGggPSB3b3JkX3NpemUgLyA4ICogbWF4X2FycmF5X2xlbmd0aCAtIDE7O1xuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3RfbWF4X3dvc2l6ZSgpIHtcbiAgcmV0dXJuICgweDdmZmZmZmZmIC8gNCkgfCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jb25zdF9vc3R5cGVfdW5peCBjb25zdFxuLy9SZXF1aXJlczogb3NfdHlwZVxuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3Rfb3N0eXBlX3VuaXgoKSB7XG4gIHJldHVybiBvc190eXBlID09PSBcIlVuaXhcIiA/IDEgOiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3Rfb3N0eXBlX3dpbjMyIGNvbnN0XG4vL1JlcXVpcmVzOiBvc190eXBlXG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF9vc3R5cGVfd2luMzIoKSB7XG4gIHJldHVybiBvc190eXBlID09PSBcIldpbjMyXCIgPyAxIDogMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X29zdHlwZV9jeWd3aW4gY29uc3Rcbi8vUmVxdWlyZXM6IG9zX3R5cGVcbmZ1bmN0aW9uIGNhbWxfc3lzX2NvbnN0X29zdHlwZV9jeWd3aW4oKSB7XG4gIHJldHVybiBvc190eXBlID09PSBcIkN5Z3dpblwiID8gMSA6IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X2JhY2tlbmRfdHlwZSBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3RfYmFja2VuZF90eXBlKCkge1xuICByZXR1cm4gWzAsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoXCJqc19vZl9vY2FtbFwiKV07XG59XG5cbi8vUHJvdmlkZXM6IG9zX3R5cGVcbi8vUmVxdWlyZXM6IGpzb29faXNfd2luMzJcbnZhciBvc190eXBlID0ganNvb19pc193aW4zMiA/IFwiV2luMzJcIiA6IFwiVW5peFwiO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19nZXRfY29uZmlnIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzLCBvc190eXBlXG5mdW5jdGlvbiBjYW1sX3N5c19nZXRfY29uZmlnKCkge1xuICByZXR1cm4gWzAsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMob3NfdHlwZSksIDMyLCAwXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfaXNhdHR5XG5mdW5jdGlvbiBjYW1sX3N5c19pc2F0dHkoX2NoYW4pIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV92YXJpYW50XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfdmFyaWFudChfdW5pdCkge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIlwiKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9wYXJhbWV0ZXJzXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfcGFyYW1ldGVycyhfdW5pdCkge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIlwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnN0YWxsX3NpZ25hbF9oYW5kbGVyIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2luc3RhbGxfc2lnbmFsX2hhbmRsZXIoKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3J1bnRpbWVfd2FybmluZ3NcbnZhciBjYW1sX3J1bnRpbWVfd2FybmluZ3MgPSAwO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2VuYWJsZV9ydW50aW1lX3dhcm5pbmdzXG4vL1JlcXVpcmVzOiBjYW1sX3J1bnRpbWVfd2FybmluZ3NcbmZ1bmN0aW9uIGNhbWxfbWxfZW5hYmxlX3J1bnRpbWVfd2FybmluZ3MoYm9vbCkge1xuICBjYW1sX3J1bnRpbWVfd2FybmluZ3MgPSBib29sO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9ydW50aW1lX3dhcm5pbmdzX2VuYWJsZWRcbi8vUmVxdWlyZXM6IGNhbWxfcnVudGltZV93YXJuaW5nc1xuZnVuY3Rpb24gY2FtbF9tbF9ydW50aW1lX3dhcm5pbmdzX2VuYWJsZWQoX3VuaXQpIHtcbiAgcmV0dXJuIGNhbWxfcnVudGltZV93YXJuaW5ncztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3RfbmFrZWRfcG9pbnRlcnNfY2hlY2tlZCBjb25zdCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF9uYWtlZF9wb2ludGVyc19jaGVja2VkKF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3hkZ19kZWZhdWx0c1xuLy9WZXJzaW9uOiA+PSA1LjJcbmZ1bmN0aW9uIGNhbWxfeGRnX2RlZmF1bHRzKF91bml0KSB7XG4gIHJldHVybiAwOyAvLyBlbXB0eSBsaXN0XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2lzX3JlZ3VsYXJfZmlsZVxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2Vcbi8vVmVyc2lvbjogPj0gNS4xXG5mdW5jdGlvbiBjYW1sX3N5c19pc19yZWd1bGFyX2ZpbGUobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICByZXR1cm4gcm9vdC5kZXZpY2UuaXNGaWxlKHJvb3QucmVzdCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW9fYnVmZmVyX3NpemVcbnZhciBjYW1sX2lvX2J1ZmZlcl9zaXplID0gNjU1MzY7XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2lvX2J1ZmZlcl9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX2lvX2J1ZmZlcl9zaXplXG4vL1ZlcnNpb246ID49IDUuNFxuZnVuY3Rpb24gY2FtbF9zeXNfaW9fYnVmZmVyX3NpemUoX3VuaXQpIHtcbiAgcmV0dXJuIGNhbWxfaW9fYnVmZmVyX3NpemU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX3RlbXBfZGlyX25hbWVcbi8vUmVxdWlyZXM6IG9zX3R5cGVcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG4vL1ZlcnNpb246ID49IDUuNFxuZnVuY3Rpb24gY2FtbF9zeXNfdGVtcF9kaXJfbmFtZShfdW5pdCkge1xuICBpZiAob3NfdHlwZSA9PT0gXCJXaW4zMlwiKSB7XG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHJlcXVpcmUoXCJub2RlOm9zXCIpLnRtcGRpcigpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoXCJcIik7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfdGVtcF9kaXJfbmFtZVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vVmVyc2lvbjogPj0gNS40XG4vL0lmOiBicm93c2VyXG5mdW5jdGlvbiBjYW1sX3N5c190ZW1wX2Rpcl9uYW1lKF91bml0KSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhcIlwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29udmVydF9zaWduYWxfbnVtYmVyXG4vL1ZlcnNpb246ID49IDUuNFxuZnVuY3Rpb24gY2FtbF9zeXNfY29udmVydF9zaWduYWxfbnVtYmVyKHNpZ25vKSB7XG4gIHJldHVybiBzaWdubztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfcmV2X2NvbnZlcnRfc2lnbmFsX251bWJlclxuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfc3lzX3Jldl9jb252ZXJ0X3NpZ25hbF9udW1iZXIoc2lnbm8pIHtcbiAgcmV0dXJuIHNpZ25vO1xufVxuXG4vL0Fsd2F5c1xuLy9SZXF1aXJlczogY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb25cbi8vSWY6ICF3YXNtXG5mdW5jdGlvbiBjYW1sX3NldHVwX3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyKCkge1xuICB2YXIgcHJvY2VzcyA9IGdsb2JhbFRoaXMucHJvY2VzcztcbiAgaWYgKHByb2Nlc3M/Lm9uKSB7XG4gICAgcHJvY2Vzcy5vbihcInVuY2F1Z2h0RXhjZXB0aW9uXCIsIGZ1bmN0aW9uIChlcnIsIG9yaWdpbikge1xuICAgICAgY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb24oZXJyKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgyKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICBnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5lcnJvcikge1xuICAgICAgICBjYW1sX2ZhdGFsX3VuY2F1Z2h0X2V4Y2VwdGlvbihldmVudC5lcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbmNhbWxfc2V0dXBfdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIoKTtcbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9lbnZfZmxhZ1xuLy9SZXF1aXJlczoganNvb19zeXNfZ2V0ZW52XG52YXIgY2FtbF9yZWNvcmRfYmFja3RyYWNlX2Vudl9mbGFnID0gRkxBRyhcIndpdGgtanMtZXJyb3JcIik7XG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciByID0ganNvb19zeXNfZ2V0ZW52KFwiT0NBTUxSVU5QQVJBTVwiKTtcbiAgaWYgKHIgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBsID0gci5zcGxpdChcIixcIik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobFtpXSA9PT0gXCJiXCIpIHtcbiAgICAgICAgY2FtbF9yZWNvcmRfYmFja3RyYWNlX2Vudl9mbGFnID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKGxbaV0uc3RhcnRzV2l0aChcImI9XCIpKSB7XG4gICAgICAgIGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9lbnZfZmxhZyA9ICtsW2ldLnNsaWNlKDIpO1xuICAgICAgfSBlbHNlIGNvbnRpbnVlO1xuICAgIH1cbiAgfVxufSkoKTtcblxuLy9Qcm92aWRlczogY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZ1xuLy9SZXF1aXJlczogY2FtbF9yZWNvcmRfYmFja3RyYWNlX2Vudl9mbGFnXG52YXIgY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZyA9IGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9lbnZfZmxhZztcblxuLy9Qcm92aWRlczogY2FtbF9tbF9kZWJ1Z19pbmZvX3N0YXR1cyBjb25zdFxuZnVuY3Rpb24gY2FtbF9tbF9kZWJ1Z19pbmZvX3N0YXR1cygpIHtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2JhY2t0cmFjZV9zdGF0dXNcbi8vUmVxdWlyZXM6IGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9ydW50aW1lX2ZsYWdcbmZ1bmN0aW9uIGNhbWxfYmFja3RyYWNlX3N0YXR1cyhfdW5pdCkge1xuICByZXR1cm4gY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZyA/IDEgOiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9nZXRfZXhjZXB0aW9uX2JhY2t0cmFjZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9nZXRfZXhjZXB0aW9uX2JhY2t0cmFjZSgpIHtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9leGNlcHRpb25fcmF3X2JhY2t0cmFjZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9nZXRfZXhjZXB0aW9uX3Jhd19iYWNrdHJhY2UoX3VuaXQpIHtcbiAgcmV0dXJuIFswXTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfcmVjb3JkX2JhY2t0cmFjZVxuLy9SZXF1aXJlczogY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZ1xuZnVuY3Rpb24gY2FtbF9yZWNvcmRfYmFja3RyYWNlKGIpIHtcbiAgY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZyA9IGI7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9jb252ZXJ0X3Jhd19iYWNrdHJhY2UgY29uc3RcbmZ1bmN0aW9uIGNhbWxfY29udmVydF9yYXdfYmFja3RyYWNlKCkge1xuICByZXR1cm4gWzBdO1xufVxuLy9Qcm92aWRlczogY2FtbF9yYXdfYmFja3RyYWNlX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9yYXdfYmFja3RyYWNlX2xlbmd0aCgpIHtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3Jhd19iYWNrdHJhY2VfbmV4dF9zbG90XG5mdW5jdGlvbiBjYW1sX3Jhd19iYWNrdHJhY2VfbmV4dF9zbG90KF9zbG90KSB7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9yYXdfYmFja3RyYWNlX3Nsb3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9yYXdfYmFja3RyYWNlX3Nsb3QoX2J0LCBfaWR4KSB7XG4gIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIlByaW50ZXhjLmdldF9yYXdfYmFja3RyYWNlX3Nsb3Q6IGluZGV4IG91dCBvZiBib3VuZHNcIik7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3Jlc3RvcmVfcmF3X2JhY2t0cmFjZVxuZnVuY3Rpb24gY2FtbF9yZXN0b3JlX3Jhd19iYWNrdHJhY2UoX2V4biwgX2J0KSB7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9nZXRfY3VycmVudF9jYWxsc3RhY2sgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZ2V0X2N1cnJlbnRfY2FsbHN0YWNrKCkge1xuICByZXR1cm4gWzBdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZV9zbG90XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZV9zbG90KF9yYnQpIHtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfY29udmVydF9yYXdfYmFja3RyYWNlX3Nsb3RcIik7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogY2FtbF9jYWxsX2dlbiAoY29uc3QsIHNoYWxsb3cpXG4vL0lmOiAhZWZmZWN0c1xuLy9XZWFrZGVmXG5mdW5jdGlvbiBjYW1sX2NhbGxfZ2VuKGYsIGFyZ3MpIHtcbiAgdmFyIG4gPSBmLmwgPj0gMCA/IGYubCA6IChmLmwgPSBmLmxlbmd0aCk7XG4gIHZhciBhcmdzTGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBkID0gbiAtIGFyZ3NMZW47XG4gIGlmIChkID09PSAwKSByZXR1cm4gZiguLi5hcmdzKTtcbiAgZWxzZSBpZiAoZCA8IDApIHtcbiAgICB2YXIgZyA9IGYoLi4uYXJncy5zbGljZSgwLCBuKSk7XG4gICAgaWYgKHR5cGVvZiBnICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBnO1xuICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuKGcsIGFyZ3Muc2xpY2UobikpO1xuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAoZCkge1xuICAgICAgY2FzZSAxOiB7XG4gICAgICAgIHZhciBnID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICB2YXIgbmFyZ3MgPSBuZXcgQXJyYXkoYXJnc0xlbiArIDEpO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnc0xlbjsgaSsrKSBuYXJnc1tpXSA9IGFyZ3NbaV07XG4gICAgICAgICAgbmFyZ3NbYXJnc0xlbl0gPSB4O1xuICAgICAgICAgIHJldHVybiBmKC4uLm5hcmdzKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIDI6IHtcbiAgICAgICAgdmFyIGcgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICAgIHZhciBuYXJncyA9IG5ldyBBcnJheShhcmdzTGVuICsgMik7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzTGVuOyBpKyspIG5hcmdzW2ldID0gYXJnc1tpXTtcbiAgICAgICAgICBuYXJnc1thcmdzTGVuXSA9IHg7XG4gICAgICAgICAgbmFyZ3NbYXJnc0xlbiArIDFdID0geTtcbiAgICAgICAgICByZXR1cm4gZiguLi5uYXJncyk7XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB2YXIgZyA9IGZ1bmN0aW9uICguLi5leHRyYV9hcmdzKSB7XG4gICAgICAgICAgaWYgKGV4dHJhX2FyZ3MubGVuZ3RoID09PSAwKSBleHRyYV9hcmdzID0gW3VuZGVmaW5lZF07XG4gICAgICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW4oZiwgYXJncy5jb25jYXQoZXh0cmFfYXJncykpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICBnLmwgPSBkO1xuICAgIHJldHVybiBnO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY2FsbF9nZW4gKGNvbnN0LCBzaGFsbG93KVxuLy9JZjogZWZmZWN0c1xuLy9JZjogIWRvdWJsZXRyYW5zbGF0ZVxuLy9XZWFrZGVmXG5mdW5jdGlvbiBjYW1sX2NhbGxfZ2VuKGYsIGFyZ3MpIHtcbiAgdmFyIG4gPSBmLmwgPj0gMCA/IGYubCA6IChmLmwgPSBmLmxlbmd0aCk7XG4gIHZhciBhcmdzTGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBkID0gbiAtIGFyZ3NMZW47XG4gIGlmIChkID09PSAwKSB7XG4gICAgcmV0dXJuIGYoLi4uYXJncyk7XG4gIH0gZWxzZSBpZiAoZCA8IDApIHtcbiAgICB2YXIgcmVzdCA9IGFyZ3Muc2xpY2UobiAtIDEpO1xuICAgIHZhciBrID0gYXJnc1thcmdzTGVuIC0gMV07XG4gICAgYXJncyA9IGFyZ3Muc2xpY2UoMCwgbik7XG4gICAgYXJnc1tuIC0gMV0gPSBmdW5jdGlvbiAoZykge1xuICAgICAgaWYgKHR5cGVvZiBnICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBrKGcpO1xuICAgICAgdmFyIGFyZ3MgPSByZXN0LnNsaWNlKCk7XG4gICAgICBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPSBrO1xuICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW4oZywgYXJncyk7XG4gICAgfTtcbiAgICByZXR1cm4gZiguLi5hcmdzKTtcbiAgfSBlbHNlIHtcbiAgICBhcmdzTGVuLS07XG4gICAgdmFyIGsgPSBhcmdzW2FyZ3NMZW5dO1xuICAgIHN3aXRjaCAoZCkge1xuICAgICAgY2FzZSAxOiB7XG4gICAgICAgIHZhciBnID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgICB2YXIgbmFyZ3MgPSBuZXcgQXJyYXkoYXJnc0xlbiArIDIpO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnc0xlbjsgaSsrKSBuYXJnc1tpXSA9IGFyZ3NbaV07XG4gICAgICAgICAgbmFyZ3NbYXJnc0xlbl0gPSB4O1xuICAgICAgICAgIG5hcmdzW2FyZ3NMZW4gKyAxXSA9IHk7XG4gICAgICAgICAgcmV0dXJuIGYoLi4ubmFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgMjoge1xuICAgICAgICB2YXIgZyA9IGZ1bmN0aW9uICh4LCB5LCB6KSB7XG4gICAgICAgICAgdmFyIG5hcmdzID0gbmV3IEFycmF5KGFyZ3NMZW4gKyAzKTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3NMZW47IGkrKykgbmFyZ3NbaV0gPSBhcmdzW2ldO1xuICAgICAgICAgIG5hcmdzW2FyZ3NMZW5dID0geDtcbiAgICAgICAgICBuYXJnc1thcmdzTGVuICsgMV0gPSB5O1xuICAgICAgICAgIG5hcmdzW2FyZ3NMZW4gKyAyXSA9IHo7XG4gICAgICAgICAgcmV0dXJuIGYoLi4ubmFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgYXJncy5sZW5ndGggPSBhcmdzTGVuO1xuICAgICAgICB2YXIgZyA9IGZ1bmN0aW9uICguLi5leHRyYV9hcmdzKSB7XG4gICAgICAgICAgaWYgKGV4dHJhX2FyZ3MubGVuZ3RoID09PSAwKSBleHRyYV9hcmdzID0gW3VuZGVmaW5lZF07XG4gICAgICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW4oZiwgYXJncy5jb25jYXQoZXh0cmFfYXJncykpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICBnLmwgPSBkICsgMTtcbiAgICByZXR1cm4gayhnKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxfZ2VuX2Nwc1xuLy9SZXF1aXJlczogY2FtbF9jYWxsX2dlblxuLy9JZjogZWZmZWN0c1xuLy9JZjogIWRvdWJsZXRyYW5zbGF0ZVxuLy9XZWFrZGVmXG52YXIgY2FtbF9jYWxsX2dlbl9jcHMgPSBjYW1sX2NhbGxfZ2VuO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxfZ2VuX3R1cGxlIChjb25zdCwgc2hhbGxvdylcbi8vUmVxdWlyZXM6IGNhbWxfY3BzX2Nsb3N1cmVcbi8vSWY6IGVmZmVjdHNcbi8vSWY6IGRvdWJsZXRyYW5zbGF0ZVxuLy9XZWFrZGVmXG52YXIgY2FtbF9jYWxsX2dlbl90dXBsZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGNhbWxfY2FsbF9nZW5fZGlyZWN0KGYsIGFyZ3MpIHtcbiAgICB2YXIgbiA9IGYubCA+PSAwID8gZi5sIDogKGYubCA9IGYubGVuZ3RoKTtcbiAgICB2YXIgYXJnc0xlbiA9IGFyZ3MubGVuZ3RoO1xuICAgIHZhciBkID0gbiAtIGFyZ3NMZW47XG4gICAgaWYgKGQgPT09IDApIHtcbiAgICAgIHJldHVybiBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH0gZWxzZSBpZiAoZCA8IDApIHtcbiAgICAgIHZhciBnID0gZiguLi5hcmdzLnNsaWNlKDAsIG4pKTtcbiAgICAgIGlmICh0eXBlb2YgZyAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZztcbiAgICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuX2RpcmVjdChnLCBhcmdzLnNsaWNlKG4pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRklYTUU6IFJlc3RvcmUgdGhlIG9wdGltaXphdGlvbiBvZiBoYW5kbGluZyBzcGVjaWFsbHkgZCA9IDEgb3IgMlxuICAgICAgdmFyIGFyZ3NfID0gYXJncy5zbGljZSgpO1xuICAgICAgYXJnc18ubGVuZ3RoID0gYXJnc0xlbjtcbiAgICAgIHZhciByZXQgPSBjYW1sX2Nwc19jbG9zdXJlKFxuICAgICAgICBmdW5jdGlvbiAoLi4uZXh0cmFfYXJncykge1xuICAgICAgICAgIGlmIChleHRyYV9hcmdzLmxlbmd0aCA9PT0gMCkgZXh0cmFfYXJncyA9IFt1bmRlZmluZWRdO1xuICAgICAgICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuX2RpcmVjdChmLCBhcmdzLmNvbmNhdChleHRyYV9hcmdzKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uICguLi5leHRyYV9hcmdzKSB7XG4gICAgICAgICAgaWYgKGV4dHJhX2FyZ3MubGVuZ3RoID09PSAwKSBleHRyYV9hcmdzID0gW3VuZGVmaW5lZF07XG4gICAgICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW5fY3BzKGYsIGFyZ3NfLmNvbmNhdChleHRyYV9hcmdzKSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgcmV0LmwgPSBkO1xuICAgICAgcmV0LmNwcy5sID0gZCArIDE7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBjYW1sX2NhbGxfZ2VuX2NwcyhmLCBhcmdzKSB7XG4gICAgaWYgKCFmLmNwcykge1xuICAgICAgdmFyIGsgPSBhcmdzLnBvcCgpO1xuICAgICAgcmV0dXJuIGsoY2FtbF9jYWxsX2dlbl9kaXJlY3QoZiwgYXJncykpO1xuICAgIH1cbiAgICB2YXIgbiA9IGYuY3BzLmwgPj0gMCA/IGYuY3BzLmwgOiAoZi5jcHMubCA9IGYuY3BzLmxlbmd0aCk7XG4gICAgdmFyIGFyZ3NMZW4gPSBhcmdzLmxlbmd0aDtcbiAgICB2YXIgZCA9IG4gLSBhcmdzTGVuO1xuICAgIGlmIChkID09PSAwKSB7XG4gICAgICByZXR1cm4gZi5jcHMuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSBlbHNlIGlmIChkIDwgMCkge1xuICAgICAgdmFyIHJlc3QgPSBhcmdzLnNsaWNlKG4gLSAxKTtcbiAgICAgIHZhciBrID0gYXJnc1thcmdzTGVuIC0gMV07XG4gICAgICBhcmdzID0gYXJncy5zbGljZSgwLCBuKTtcbiAgICAgIGFyZ3NbbiAtIDFdID0gZnVuY3Rpb24gKGcpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSByZXN0LnNsaWNlKCk7XG4gICAgICAgIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9IGs7XG4gICAgICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuX2NwcyhnLCBhcmdzKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gZi5jcHMuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3NMZW4tLTtcbiAgICAgIHZhciBhcmdzXyA9IGFyZ3Muc2xpY2UoKTtcbiAgICAgIGFyZ3NfLmxlbmd0aCA9IGFyZ3NMZW47XG4gICAgICB2YXIgY29udCA9IGNhbWxfY3BzX2Nsb3N1cmUoXG4gICAgICAgIGZ1bmN0aW9uICguLi5leHRyYV9hcmdzKSB7XG4gICAgICAgICAgaWYgKGV4dHJhX2FyZ3MubGVuZ3RoID09PSAwKSBleHRyYV9hcmdzID0gW3VuZGVmaW5lZF07XG4gICAgICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW5fZGlyZWN0KGYsIGFyZ3NfLmNvbmNhdChleHRyYV9hcmdzKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uICguLi5leHRyYV9hcmdzKSB7XG4gICAgICAgICAgaWYgKGV4dHJhX2FyZ3MubGVuZ3RoID09PSAwKSBleHRyYV9hcmdzID0gW3VuZGVmaW5lZF07XG4gICAgICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW5fY3BzKGYsIGFyZ3NfLmNvbmNhdChleHRyYV9hcmdzKSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgdmFyIGsgPSBhcmdzW2FyZ3NMZW5dO1xuICAgICAgY29udC5sID0gZDtcbiAgICAgIGNvbnQuY3BzLmwgPSBkICsgMTtcbiAgICAgIHJldHVybiBrKGNvbnQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2NhbWxfY2FsbF9nZW5fZGlyZWN0LCBjYW1sX2NhbGxfZ2VuX2Nwc107XG59KSgpO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxfZ2VuXG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxfZ2VuX3R1cGxlXG4vL0lmOiBlZmZlY3RzXG4vL0lmOiBkb3VibGV0cmFuc2xhdGVcbi8vV2Vha2RlZlxudmFyIGNhbWxfY2FsbF9nZW4gPSBjYW1sX2NhbGxfZ2VuX3R1cGxlWzBdO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxfZ2VuX2Nwc1xuLy9SZXF1aXJlczogY2FtbF9jYWxsX2dlbl90dXBsZVxuLy9JZjogZWZmZWN0c1xuLy9JZjogZG91YmxldHJhbnNsYXRlXG4vL1dlYWtkZWZcbnZhciBjYW1sX2NhbGxfZ2VuX2NwcyA9IGNhbWxfY2FsbF9nZW5fdHVwbGVbMV07XG5cbi8vUHJvdmlkZXM6IGNhbWxfbmFtZWRfdmFsdWVzXG52YXIgY2FtbF9uYW1lZF92YWx1ZXMgPSB7fTtcblxuLy9Qcm92aWRlczogY2FtbF9yZWdpc3Rlcl9uYW1lZF92YWx1ZSAoY29uc3QsbXV0YWJsZSlcbi8vUmVxdWlyZXM6IGNhbWxfbmFtZWRfdmFsdWVzLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3JlZ2lzdGVyX25hbWVkX3ZhbHVlKG5tLCB2KSB7XG4gIGNhbWxfbmFtZWRfdmFsdWVzW2NhbWxfanNieXRlc19vZl9zdHJpbmcobm0pXSA9IHY7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX25hbWVkX3ZhbHVlXG4vL1JlcXVpcmVzOiBjYW1sX25hbWVkX3ZhbHVlc1xuZnVuY3Rpb24gY2FtbF9uYW1lZF92YWx1ZShubSkge1xuICByZXR1cm4gY2FtbF9uYW1lZF92YWx1ZXNbbm1dO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dsb2JhbF9kYXRhXG52YXIgY2FtbF9nbG9iYWxfZGF0YSA9IFswXTtcblxuLy9Qcm92aWRlczogY2FtbF9idWlsZF9zeW1ib2xzXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9idWlsZF9zeW1ib2xzKHN5bWIpIHtcbiAgdmFyIHIgPSB7fTtcbiAgdmFyIG1heCA9IC0xO1xuICBpZiAoc3ltYikge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgc3ltYi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkeCA9IHN5bWJbaV1bMl07XG4gICAgICBtYXggPSBNYXRoLm1heChtYXgsIGlkeCk7XG4gICAgICByW2NhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHN5bWJbaV1bMV0pXSA9IGlkeDtcbiAgICB9XG4gIH1cbiAgci5uZXh0X2lkeCA9IG1heCArIDE7XG4gIHJldHVybiByO1xufVxuXG4vL1Byb3ZpZGVzOiBqc29vX3RvcGxldmVsX3JlbG9jXG52YXIganNvb190b3BsZXZlbF9yZWxvYyA9IHVuZGVmaW5lZDtcblxuLy9Qcm92aWRlczogY2FtbF9yZWdpc3Rlcl9nbG9iYWwgKGNvbnN0LCBzaGFsbG93LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfZ2xvYmFsX2RhdGEsIGNhbWxfY2FsbGJhY2ssIGNhbWxfYnVpbGRfc3ltYm9sc1xuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuLy9SZXF1aXJlczoganNvb190b3BsZXZlbF9yZWxvY1xuZnVuY3Rpb24gY2FtbF9yZWdpc3Rlcl9nbG9iYWwobiwgdiwgbmFtZV9vcHQpIHtcbiAgaWYgKG5hbWVfb3B0KSB7XG4gICAgdmFyIG5hbWUgPSBuYW1lX29wdDtcbiAgICBpZiAoanNvb190b3BsZXZlbF9yZWxvYykge1xuICAgICAgbiA9IGNhbWxfY2FsbGJhY2soanNvb190b3BsZXZlbF9yZWxvYywgW25hbWVdKTtcbiAgICB9IGVsc2UgaWYgKGNhbWxfZ2xvYmFsX2RhdGEuc3ltYm9scykge1xuICAgICAgaWYgKCFjYW1sX2dsb2JhbF9kYXRhLnN5bWlkeCkge1xuICAgICAgICBjYW1sX2dsb2JhbF9kYXRhLnN5bWlkeCA9IGNhbWxfYnVpbGRfc3ltYm9scyhjYW1sX2dsb2JhbF9kYXRhLnN5bWJvbHMpO1xuICAgICAgfVxuICAgICAgdmFyIG5pZCA9IGNhbWxfZ2xvYmFsX2RhdGEuc3ltaWR4W25hbWVdO1xuICAgICAgaWYgKG5pZCA+PSAwKSBuID0gbmlkO1xuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIFRoZSB1bml0IGlzIHVua25vd24sIHRoaXMgY2FuIGhhcHBlbiB3aGVuIGR5bmxpbmtpbmcgYSBwcmVjb21waWxlZCBqcyxcbiAgICAgICAgLy8gbGV0J3MgYWxsb2NhdGUgYSBmcmVzaCBpZHguXG4gICAgICAgIHZhciBuID0gY2FtbF9nbG9iYWxfZGF0YS5zeW1pZHgubmV4dF9pZHgrKztcbiAgICAgICAgY2FtbF9nbG9iYWxfZGF0YS5zeW1pZHhbbmFtZV0gPSBuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjYW1sX2dsb2JhbF9kYXRhW24gKyAxXSA9IHY7XG4gIGlmIChuYW1lX29wdCkgY2FtbF9nbG9iYWxfZGF0YVtuYW1lX29wdF0gPSB2O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9nbG9iYWxfZGF0YSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX2dldF9nbG9iYWxfZGF0YShfdW5pdCkge1xuICByZXR1cm4gY2FtbF9nbG9iYWxfZGF0YTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pc19wcmludGFibGUgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9pc19wcmludGFibGUoYykge1xuICByZXR1cm4gKyhjID4gMzEgJiYgYyA8IDEyNyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWF5YmVfcHJpbnRfc3RhdHNcbmZ1bmN0aW9uIGNhbWxfbWF5YmVfcHJpbnRfc3RhdHMoX3VuaXQpIHtcbiAgcmV0dXJuIDA7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBsaWJyYXJ5XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gSnNsaWJcblxuLy9Qcm92aWRlczogY2FtbF9qc19wdXJlX2V4cHIgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2tcbmZ1bmN0aW9uIGNhbWxfanNfcHVyZV9leHByKGYpIHtcbiAgcmV0dXJuIGNhbWxfY2FsbGJhY2soZiwgWzBdKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19zZXQgKG11dGFibGUsIGNvbnN0LCBtdXRhYmxlKVxuZnVuY3Rpb24gY2FtbF9qc19zZXQobywgZiwgdikge1xuICBvW2ZdID0gdjtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2dldCAobXV0YWJsZSwgY29uc3QpXG5mdW5jdGlvbiBjYW1sX2pzX2dldChvLCBmKSB7XG4gIHJldHVybiBvW2ZdO1xufVxuLy9Qcm92aWRlczogY2FtbF9qc19kZWxldGUgKG11dGFibGUsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19kZWxldGUobywgZikge1xuICBkZWxldGUgb1tmXTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfaW5zdGFuY2VvZiAoY29uc3QsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19pbnN0YW5jZW9mKG8sIGMpIHtcbiAgcmV0dXJuIG8gaW5zdGFuY2VvZiBjID8gMSA6IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfdHlwZW9mIChjb25zdClcbmZ1bmN0aW9uIGNhbWxfanNfdHlwZW9mKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvO1xufVxuXG4vL1Byb3ZpZGVzOmNhbWxfdHJhbXBvbGluZVxuZnVuY3Rpb24gY2FtbF90cmFtcG9saW5lKHJlcykge1xuICB2YXIgYyA9IDE7XG4gIHdoaWxlIChyZXM/Lmpvb190cmFtcCkge1xuICAgIHJlcyA9IHJlcy5qb29fdHJhbXAuYXBwbHkobnVsbCwgcmVzLmpvb19hcmdzKTtcbiAgICBjKys7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuLy9Qcm92aWRlczpjYW1sX3RyYW1wb2xpbmVfcmV0dXJuXG5mdW5jdGlvbiBjYW1sX3RyYW1wb2xpbmVfcmV0dXJuKGYsIGFyZ3MsIGRpcmVjdCkge1xuICByZXR1cm4geyBqb29fdHJhbXA6IGYsIGpvb19hcmdzOiBhcmdzLCBqb29fZGlyZWN0OiBkaXJlY3QgfTtcbn1cblxuLy9Qcm92aWRlczpjYW1sX3N0YWNrX2RlcHRoXG4vL0lmOiBlZmZlY3RzXG52YXIgY2FtbF9zdGFja19kZXB0aCA9IDA7XG5cbi8vUHJvdmlkZXM6Y2FtbF9zdGFja19jaGVja19kZXB0aFxuLy9JZjogZWZmZWN0c1xuLy9SZXF1aXJlczpjYW1sX3N0YWNrX2RlcHRoXG5mdW5jdGlvbiBjYW1sX3N0YWNrX2NoZWNrX2RlcHRoKCkge1xuICByZXR1cm4gLS1jYW1sX3N0YWNrX2RlcHRoID4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jYWxsYmFja1xuLy9JZjogIWVmZmVjdHNcbi8vUmVxdWlyZXM6Y2FtbF9jYWxsX2dlblxudmFyIGNhbWxfY2FsbGJhY2sgPSBjYW1sX2NhbGxfZ2VuO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxiYWNrXG4vL0lmOiBlZmZlY3RzXG4vL0lmOiAhZG91YmxldHJhbnNsYXRlXG4vL1JlcXVpcmVzOiBjYW1sX3N0YWNrX2RlcHRoLCBjYW1sX2NhbGxfZ2VuLCBjYW1sX3dyYXBfZXhjZXB0aW9uXG4vL1JlcXVpcmVzOiBjYW1sX2N1cnJlbnRfc3RhY2tcbi8vQWxpYXM6IGNhbWxfY3BzX3RyYW1wb2xpbmVcbmZ1bmN0aW9uIGNhbWxfY2FsbGJhY2soZiwgYXJncykge1xuICB2YXIgc2F2ZWRfc3RhY2tfZGVwdGggPSBjYW1sX3N0YWNrX2RlcHRoO1xuICB2YXIgc2F2ZWRfY3VycmVudF9zdGFjayA9IGNhbWxfY3VycmVudF9zdGFjaztcbiAgdHJ5IHtcbiAgICBjYW1sX2N1cnJlbnRfc3RhY2sgPSB7IGs6IDAsIHg6IDAsIGg6IDAsIGU6IDAgfTtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgam9vX3RyYW1wOiBmLFxuICAgICAgam9vX2FyZ3M6IGFyZ3MuY29uY2F0KGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgICAgfSksXG4gICAgfTtcbiAgICBkbyB7XG4gICAgICBjYW1sX3N0YWNrX2RlcHRoID0gNDA7XG4gICAgICB0cnkge1xuICAgICAgICByZXMgPSBjYW1sX2NhbGxfZ2VuKHJlcy5qb29fdHJhbXAsIHJlcy5qb29fYXJncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8qIEhhbmRsZSBleGNlcHRpb24gY29taW5nIGZyb20gSmF2YVNjcmlwdCBvciBmcm9tIHRoZSBydW50aW1lLiAqL1xuICAgICAgICBpZiAoIWNhbWxfY3VycmVudF9zdGFjay54KSB0aHJvdyBlO1xuICAgICAgICB2YXIgaGFuZGxlciA9IGNhbWxfY3VycmVudF9zdGFjay54Lmg7XG4gICAgICAgIGNhbWxfY3VycmVudF9zdGFjay54ID0gY2FtbF9jdXJyZW50X3N0YWNrLngudDtcbiAgICAgICAgcmVzID0geyBqb29fdHJhbXA6IGhhbmRsZXIsIGpvb19hcmdzOiBbY2FtbF93cmFwX2V4Y2VwdGlvbihlKV0gfTtcbiAgICAgIH1cbiAgICB9IHdoaWxlIChyZXM/Lmpvb19hcmdzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjYW1sX3N0YWNrX2RlcHRoID0gc2F2ZWRfc3RhY2tfZGVwdGg7XG4gICAgY2FtbF9jdXJyZW50X3N0YWNrID0gc2F2ZWRfY3VycmVudF9zdGFjaztcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxiYWNrXG4vL0lmOiBlZmZlY3RzXG4vL0lmOiBkb3VibGV0cmFuc2xhdGVcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbF9nZW5cbnZhciBjYW1sX2NhbGxiYWNrID0gY2FtbF9jYWxsX2dlbjtcblxuLy9Qcm92aWRlczogY2FtbF9pc19qc1xuZnVuY3Rpb24gY2FtbF9pc19qcygpIHtcbiAgcmV0dXJuIDE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNvb19mbGFnc191c2VfanNfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzb29fZmxhZ3NfdXNlX2pzX3N0cmluZyhfdW5pdCkge1xuICByZXR1cm4gRkxBRyhcInVzZS1qcy1zdHJpbmdcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNvb19mbGFnc19lZmZlY3RzXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc29vX2ZsYWdzX2VmZmVjdHMoX3VuaXQpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKENPTkZJRyhcImVmZmVjdHNcIikpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3dyYXBfZXhjZXB0aW9uIGNvbnN0IChtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9nbG9iYWxfZGF0YSxjYW1sX3N0cmluZ19vZl9qc3N0cmluZyxjYW1sX25hbWVkX3ZhbHVlXG5mdW5jdGlvbiBjYW1sX3dyYXBfZXhjZXB0aW9uKGUpIHtcbiAgaWYgKEZMQUcoXCJleGN3cmFwXCIpKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHJldHVybiBlO1xuICAgIHZhciBleG47XG4gICAgLy9TdGFja19vdmVyZmxvdzogY2hyb21lLCBzYWZhcmlcbiAgICBpZiAoXG4gICAgICBnbG9iYWxUaGlzLlJhbmdlRXJyb3IgJiZcbiAgICAgIGUgaW5zdGFuY2VvZiBnbG9iYWxUaGlzLlJhbmdlRXJyb3IgJiZcbiAgICAgIGUubWVzc2FnZSAmJlxuICAgICAgZS5tZXNzYWdlLm1hdGNoKC9tYXhpbXVtIGNhbGwgc3RhY2svaSlcbiAgICApXG4gICAgICBleG4gPSBjYW1sX2dsb2JhbF9kYXRhLlN0YWNrX292ZXJmbG93O1xuICAgIC8vU3RhY2tfb3ZlcmZsb3c6IGZpcmVmb3hcbiAgICBlbHNlIGlmIChcbiAgICAgIGdsb2JhbFRoaXMuSW50ZXJuYWxFcnJvciAmJlxuICAgICAgZSBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuSW50ZXJuYWxFcnJvciAmJlxuICAgICAgZS5tZXNzYWdlICYmXG4gICAgICBlLm1lc3NhZ2UubWF0Y2goL3RvbyBtdWNoIHJlY3Vyc2lvbi9pKVxuICAgIClcbiAgICAgIGV4biA9IGNhbWxfZ2xvYmFsX2RhdGEuU3RhY2tfb3ZlcmZsb3c7XG4gICAgLy9XcmFwIEVycm9yIGluIEpzLkVycm9yIGV4Y2VwdGlvblxuICAgIGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBnbG9iYWxUaGlzLkVycm9yICYmIGNhbWxfbmFtZWRfdmFsdWUoXCJqc0Vycm9yXCIpKVxuICAgICAgZXhuID0gWzAsIGNhbWxfbmFtZWRfdmFsdWUoXCJqc0Vycm9yXCIpLCBlXTtcbiAgICAvL2ZhbGxiYWNrOiB3cmFwcGVkIGluIEZhaWx1cmVcbiAgICBlbHNlXG4gICAgICBleG4gPSBbMCwgY2FtbF9nbG9iYWxfZGF0YS5GYWlsdXJlLCBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhTdHJpbmcoZSkpXTtcbiAgICAvLyBXZSBhbHJlYWR5IGhhdmUgYW4gZXJyb3IgYXQgaGFuZCwgbGV0J3MgdXNlIGl0LlxuICAgIGlmIChlIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5FcnJvcikgZXhuLmpzX2Vycm9yID0gZTtcbiAgICByZXR1cm4gZXhuO1xuICB9IGVsc2UgcmV0dXJuIGU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZVxuLy9SZXF1aXJlczogY2FtbF9leG5fd2l0aF9qc19iYWNrdHJhY2Vcbi8vUmVxdWlyZXM6IGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9lbnZfZmxhZ1xuLy9SZXF1aXJlczogY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZ1xuZnVuY3Rpb24gY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlKGV4biwgZm9yY2UpIHtcbiAgLy8gQmFja3RyYWNlcyBhcmUgdmVyeSBleHBlbnNpdmUsIHdlIG9ubHkgZW5hYmxlIHRoZW0gd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZFxuICAvLyBhdCBjb21waWxlLXRpbWUgKC0tZW5hYmxlIHdpdGgtanMtZXJyb3IpIG9yIGF0IHN0YXJ0dXAgd2l0aCBPQ0FNTFJVTlBBUkFNPWI9MS5cbiAgLy8gTGlicmFyaWVzIHN1Y2ggYXMgQmFzZSB1bmNvbmRpdGlvbmFsbHkgZW5hYmxlIGJhY2t0cmFjZXMgKHByb2dyYW1tYXRpY2FsbHkpIGJ1dFxuICAvLyBpdCdzIHdheSB0byBzbG93LiBIZXJlLCB3ZSBmb3JjZSB0aGUgZW5kLXVzZXIgdG8gb3B0LWluIHRvIGJhY2t0cmFjZXMuXG4gIGlmIChjYW1sX3JlY29yZF9iYWNrdHJhY2VfZW52X2ZsYWcgJiYgY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZylcbiAgICByZXR1cm4gY2FtbF9leG5fd2l0aF9qc19iYWNrdHJhY2UoZXhuLCBmb3JjZSk7XG4gIGVsc2UgcmV0dXJuIGV4bjtcbn1cblxuLy8gRXhwZXJpbWVudGFsXG4vL1Byb3ZpZGVzOiBjYW1sX2V4bl93aXRoX2pzX2JhY2t0cmFjZVxuLy9SZXF1aXJlczogY2FtbF9nbG9iYWxfZGF0YVxuZnVuY3Rpb24gY2FtbF9leG5fd2l0aF9qc19iYWNrdHJhY2UoZXhuLCBmb3JjZSkge1xuICAvL25ldmVyIHJlcmFpc2UgZm9yIGNvbnN0YW50IGV4blxuICBpZiAoIWV4bi5qc19lcnJvciB8fCBmb3JjZSB8fCBleG5bMF0gPT09IDI0OClcbiAgICBleG4uanNfZXJyb3IgPSBuZXcgZ2xvYmFsVGhpcy5FcnJvcihcIkpzIGV4Y2VwdGlvbiBjb250YWluaW5nIGJhY2t0cmFjZVwiKTtcbiAgcmV0dXJuIGV4bjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19lcnJvcl9vcHRpb25fb2ZfZXhjZXB0aW9uXG5mdW5jdGlvbiBjYW1sX2pzX2Vycm9yX29wdGlvbl9vZl9leGNlcHRpb24oZXhuKSB7XG4gIGlmIChleG4uanNfZXJyb3IpIHtcbiAgICByZXR1cm4gWzAsIGV4bi5qc19lcnJvcl07XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdGhyb3dfanNfZXhjZXB0aW9uXG5mdW5jdGlvbiBjYW1sX3Rocm93X2pzX2V4Y2VwdGlvbihleG4pIHtcbiAgdGhyb3cgZXhuO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Zyb21fYm9vbCBjb25zdCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX2pzX2Zyb21fYm9vbCh4KSB7XG4gIHJldHVybiAhIXg7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3RvX2Jvb2wgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc190b19ib29sKHgpIHtcbiAgcmV0dXJuICt4O1xufVxuLy9Qcm92aWRlczogY2FtbF9qc19mcm9tX2Zsb2F0IGNvbnN0IChjb25zdClcbi8vQWxpYXM6IGNhbWxfanNfZnJvbV9pbnQzMlxuLy9BbGlhczogY2FtbF9qc19mcm9tX25hdGl2ZWludFxuZnVuY3Rpb24gY2FtbF9qc19mcm9tX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIHg7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3RvX2Zsb2F0IGNvbnN0IChjb25zdClcbmZ1bmN0aW9uIGNhbWxfanNfdG9fZmxvYXQoeCkge1xuICByZXR1cm4geDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfdG9faW50MzIgY29uc3QgKGNvbnN0KVxuLy9BbGlhczogY2FtbF9qc190b19uYXRpdmVpbnRcbmZ1bmN0aW9uIGNhbWxfanNfdG9faW50MzIoeCkge1xuICByZXR1cm4geCB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZnJvbV9hcnJheSBtdXRhYmxlIChzaGFsbG93KVxuZnVuY3Rpb24gY2FtbF9qc19mcm9tX2FycmF5KGEpIHtcbiAgcmV0dXJuIGEuc2xpY2UoMSk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3RvX2FycmF5IG11dGFibGUgKHNoYWxsb3cpXG5mdW5jdGlvbiBjYW1sX2pzX3RvX2FycmF5KGEpIHtcbiAgdmFyIGxlbiA9IGEubGVuZ3RoO1xuICB2YXIgYiA9IG5ldyBBcnJheShsZW4gKyAxKTtcbiAgYlswXSA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIGJbaSArIDFdID0gYVtpXTtcbiAgcmV0dXJuIGI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbGlzdF9vZl9qc19hcnJheSBjb25zdCAobXV0YWJsZSlcbmZ1bmN0aW9uIGNhbWxfbGlzdF9vZl9qc19hcnJheShhKSB7XG4gIHZhciBsID0gMDtcbiAgZm9yICh2YXIgaSA9IGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgZSA9IGFbaV07XG4gICAgbCA9IFswLCBlLCBsXTtcbiAgfVxuICByZXR1cm4gbDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9saXN0X3RvX2pzX2FycmF5IGNvbnN0IChtdXRhYmxlKVxuZnVuY3Rpb24gY2FtbF9saXN0X3RvX2pzX2FycmF5KGwpIHtcbiAgdmFyIGEgPSBbXTtcbiAgZm9yICg7IGwgIT09IDA7IGwgPSBsWzJdKSB7XG4gICAgYS5wdXNoKGxbMV0pO1xuICB9XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3ZhciBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc192YXIoeCkge1xuICB2YXIgeCA9IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHgpO1xuICAvL0NoZWNrcyB0aGF0IHggaGFzIHRoZSBmb3JtIGlkZW50Wy5pZGVudF0qXG4gIGlmICgheC5tYXRjaCgvXlthLXpBLVpfJF1bYS16QS1aXyQwLTldKihcXC5bYS16QS1aXyRdW2EtekEtWl8kMC05XSopKiQvKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAnY2FtbF9qc192YXI6IFwiJyArXG4gICAgICAgIHggK1xuICAgICAgICAnXCIgaXMgbm90IGEgdmFsaWQgSmF2YVNjcmlwdCB2YXJpYWJsZS4gY29udGludWluZyAuLicsXG4gICAgKTtcbiAgICAvL2NvbnNvbGUuZXJyb3IoXCJKcy5VbnNhZmUuZXZhbF9zdHJpbmdcIilcbiAgfVxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zZWN1cml0eS9ub0dsb2JhbEV2YWw6XG4gIHJldHVybiBldmFsPy4oeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2NhbGwgKGNvbnN0LCBtdXRhYmxlLCBzaGFsbG93KVxuLy9SZXF1aXJlczogY2FtbF9qc19mcm9tX2FycmF5XG5mdW5jdGlvbiBjYW1sX2pzX2NhbGwoZiwgbywgYXJncykge1xuICByZXR1cm4gZi5hcHBseShvLCBjYW1sX2pzX2Zyb21fYXJyYXkoYXJncykpO1xufVxuLy9Qcm92aWRlczogY2FtbF9qc19mdW5fY2FsbCAoY29uc3QsIHNoYWxsb3cpXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfanNfZnVuX2NhbGwoZiwgYSkge1xuICBzd2l0Y2ggKGEubGVuZ3RoKSB7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIGYoKTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gZihhWzFdKTtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gZihhWzFdLCBhWzJdKTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gZihhWzFdLCBhWzJdLCBhWzNdKTtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gZihhWzFdLCBhWzJdLCBhWzNdLCBhWzRdKTtcbiAgICBjYXNlIDY6XG4gICAgICByZXR1cm4gZihhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdKTtcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gZihhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLCBhWzZdKTtcbiAgICBjYXNlIDg6XG4gICAgICByZXR1cm4gZihhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLCBhWzZdLCBhWzddKTtcbiAgfVxuICByZXR1cm4gZi5hcHBseShudWxsLCBjYW1sX2pzX2Zyb21fYXJyYXkoYSkpO1xufVxuLy9Qcm92aWRlczogY2FtbF9qc19tZXRoX2NhbGwgKG11dGFibGUsIGNvbnN0LCBzaGFsbG93KVxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9qc19tZXRoX2NhbGwobywgZiwgYXJncykge1xuICByZXR1cm4gb1tjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhmKV0uYXBwbHkobywgY2FtbF9qc19mcm9tX2FycmF5KGFyZ3MpKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfbmV3IChjb25zdCwgc2hhbGxvdylcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9qc19uZXcoYywgYSkge1xuICBzd2l0Y2ggKGEubGVuZ3RoKSB7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIG5ldyBjKCk7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIG5ldyBjKGFbMV0pO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBuZXcgYyhhWzFdLCBhWzJdKTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gbmV3IGMoYVsxXSwgYVsyXSwgYVszXSk7XG4gICAgY2FzZSA1OlxuICAgICAgcmV0dXJuIG5ldyBjKGFbMV0sIGFbMl0sIGFbM10sIGFbNF0pO1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiBuZXcgYyhhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdKTtcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gbmV3IGMoYVsxXSwgYVsyXSwgYVszXSwgYVs0XSwgYVs1XSwgYVs2XSk7XG4gICAgY2FzZSA4OlxuICAgICAgcmV0dXJuIG5ldyBjKGFbMV0sIGFbMl0sIGFbM10sIGFbNF0sIGFbNV0sIGFbNl0sIGFbN10pO1xuICB9XG4gIGZ1bmN0aW9uIEYoKSB7XG4gICAgcmV0dXJuIGMuYXBwbHkodGhpcywgY2FtbF9qc19mcm9tX2FycmF5KGEpKTtcbiAgfVxuICBGLnByb3RvdHlwZSA9IGMucHJvdG90eXBlO1xuICByZXR1cm4gbmV3IEYoKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfb2pzX25ld19hcnIgKGNvbnN0LCBzaGFsbG93KVxuLy9SZXF1aXJlczogY2FtbF9qc19mcm9tX2FycmF5XG5mdW5jdGlvbiBjYW1sX29qc19uZXdfYXJyKGMsIGEpIHtcbiAgc3dpdGNoIChhLmxlbmd0aCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBuZXcgYygpO1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBuZXcgYyhhWzBdKTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gbmV3IGMoYVswXSwgYVsxXSk7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIG5ldyBjKGFbMF0sIGFbMV0sIGFbMl0pO1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiBuZXcgYyhhWzBdLCBhWzFdLCBhWzJdLCBhWzNdKTtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gbmV3IGMoYVswXSwgYVsxXSwgYVsyXSwgYVszXSwgYVs0XSk7XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIG5ldyBjKGFbMF0sIGFbMV0sIGFbMl0sIGFbM10sIGFbNF0sIGFbNV0pO1xuICAgIGNhc2UgNzpcbiAgICAgIHJldHVybiBuZXcgYyhhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLCBhWzZdKTtcbiAgfVxuICBmdW5jdGlvbiBGKCkge1xuICAgIHJldHVybiBjLmFwcGx5KHRoaXMsIGEpO1xuICB9XG4gIEYucHJvdG90eXBlID0gYy5wcm90b3R5cGU7XG4gIHJldHVybiBuZXcgRigpO1xufVxuLy9Qcm92aWRlczogY2FtbF9qc193cmFwX2NhbGxiYWNrIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2tcbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9jYWxsYmFjayhmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYXJncyA9IFt1bmRlZmluZWRdO1xuICAgIH1cbiAgICB2YXIgcmVzID0gY2FtbF9jYWxsYmFjayhmLCBhcmdzKTtcbiAgICByZXR1cm4gcmVzIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBjYW1sX2pzX3dyYXBfY2FsbGJhY2socmVzKSA6IHJlcztcbiAgfTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc193cmFwX2NhbGxiYWNrX2FyZ3VtZW50c1xuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9qc193cmFwX2NhbGxiYWNrX2FyZ3VtZW50cyhmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIHJldHVybiBjYW1sX2NhbGxiYWNrKGYsIFthcmdzXSk7XG4gIH07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3dyYXBfY2FsbGJhY2tfc3RyaWN0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxiYWNrXG5mdW5jdGlvbiBjYW1sX2pzX3dyYXBfY2FsbGJhY2tfc3RyaWN0KGFyaXR5LCBmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIGFyZ3MubGVuZ3RoID0gYXJpdHk7XG4gICAgcmV0dXJuIGNhbWxfY2FsbGJhY2soZiwgYXJncyk7XG4gIH07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3dyYXBfY2FsbGJhY2tfdW5zYWZlIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2ssIGNhbWxfanNfZnVuY3Rpb25fYXJpdHlcbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9jYWxsYmFja191bnNhZmUoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICB2YXIgbGVuID0gY2FtbF9qc19mdW5jdGlvbl9hcml0eShmKTtcbiAgICBhcmdzLmxlbmd0aCA9IGxlbjtcbiAgICByZXR1cm4gY2FtbF9jYWxsYmFjayhmLCBhcmdzKTtcbiAgfTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2ssIGNhbWxfanNfd3JhcF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2soZikge1xuICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICBhcmdzLnVuc2hpZnQodGhpcyk7XG4gICAgdmFyIHJlcyA9IGNhbWxfY2FsbGJhY2soZiwgYXJncyk7XG4gICAgcmV0dXJuIHJlcyBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gY2FtbF9qc193cmFwX2NhbGxiYWNrKHJlcykgOiByZXM7XG4gIH07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19hcmd1bWVudHMgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfYXJndW1lbnRzKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIGNhbWxfY2FsbGJhY2soZiwgW3RoaXMsIGFyZ3NdKTtcbiAgfTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3N0cmljdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfc3RyaWN0KGFyaXR5LCBmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIGFyZ3MubGVuZ3RoID0gYXJpdHk7XG4gICAgYXJncy51bnNoaWZ0KHRoaXMpO1xuICAgIHJldHVybiBjYW1sX2NhbGxiYWNrKGYsIGFyZ3MpO1xuICB9O1xufVxuLy9Qcm92aWRlczogY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfdW5zYWZlIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2ssIGNhbWxfanNfZnVuY3Rpb25fYXJpdHlcbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3Vuc2FmZShmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIHZhciBsZW4gPSBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5KGYpO1xuICAgIGFyZ3MudW5zaGlmdCh0aGlzKTtcbiAgICBhcmdzLmxlbmd0aCA9IGxlbjtcbiAgICByZXR1cm4gY2FtbF9jYWxsYmFjayhmLCBhcmdzKTtcbiAgfTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19mdW5jdGlvbl9hcml0eVxuLy9JZjogIWVmZmVjdHNcbmZ1bmN0aW9uIGNhbWxfanNfZnVuY3Rpb25fYXJpdHkoZikge1xuICByZXR1cm4gZi5sID49IDAgPyBmLmwgOiAoZi5sID0gZi5sZW5ndGgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5XG4vL0lmOiBlZmZlY3RzXG4vL0lmOiBkb3VibGV0cmFuc2xhdGVcbmZ1bmN0aW9uIGNhbWxfanNfZnVuY3Rpb25fYXJpdHkoZikge1xuICByZXR1cm4gZi5sID49IDAgPyBmLmwgOiAoZi5sID0gZi5sZW5ndGgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5XG4vL0lmOiBlZmZlY3RzXG4vL0lmOiAhZG91YmxldHJhbnNsYXRlXG5mdW5jdGlvbiBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5KGYpIHtcbiAgLy8gRnVuY3Rpb25zIGhhdmUgYW4gYWRkaXRpb25hbCBjb250aW51YXRpb24gcGFyYW1ldGVyLiBUaGlzIHNob3VsZFxuICAvLyBub3QgYmUgdmlzaWJsZSB3aGVuIGNhbGxpbmcgdGhlbSBmcm9tIEphdmFTY3JpcHRcbiAgcmV0dXJuIChmLmwgPj0gMCA/IGYubCA6IChmLmwgPSBmLmxlbmd0aCkpIC0gMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19lcXVhbHMgbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19lcXVhbHMoeCwgeSkge1xuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRG91YmxlRXF1YWxzOlxuICByZXR1cm4gKyh4ID09IHkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3N0cmljdF9lcXVhbHMgbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19zdHJpY3RfZXF1YWxzKHgsIHkpIHtcbiAgcmV0dXJuICsoeCA9PT0geSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZXZhbF9zdHJpbmcgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNfZXZhbF9zdHJpbmcocykge1xuICAvLyBVc2VzIGFuIGluZGlyZWN0IGV2YWwgdGhyb3VnaCB0aGUgb3B0aW9uYWwgY2hhaW5pbmcgb3BlcmF0b3IuXG4gIC8vIChzZWUgaHR0cHM6Ly9tZG4uZGV2L2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL2V2YWwpXG4gIC8vIFRoaXMgaXMgZmFzdGVyIGFuZCBhdm9pZCB2YXJpYWJsZSBjYXB0dXJlcy5cbiAgLy8gQWxzbyBwcmVwZW5kcyBgXCJ1c2Ugc3RyaWN0XCJgIGRpcmVjdGl2ZSBzaW5jZSB0aGlzIGlzIG5vdCBpbmhlcml0ZWRcbiAgLy8gZnJvbSB0aGUgZW5jbG9zaW5nIGZ1bmN0aW9uIHdpdGggYW4gaW5kaXJlY3QgZXZhbC5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc2VjdXJpdHkvbm9HbG9iYWxFdmFsOlxuICByZXR1cm4gZXZhbD8uKCdcInVzZSBzdHJpY3RcIjsnICsgY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocykpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2V4cHIgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNfZXhwcihzKSB7XG4gIGNvbnNvbGUuZXJyb3IoXCJjYW1sX2pzX2V4cHI6IGZhbGxiYWNrIHRvIHJ1bnRpbWUgZXZhbHVhdGlvblxcblwiKTtcbiAgLy8gV2UgYWRkIHBhcmVudGhlc2VzIHRvIGF2b2lkIHRoZSBhbWJpZ3VpdHkgYmV0d2VlbiBleHByZXNzaW9uc1xuICAvLyBhbmQgc3RhdGVtZW50cy4gVGhpcyBtZWFucyB0aGF0IHdlIGFjY2VwdCBpbnZhbGlkIGlucHV0cyBsaWtlXG4gIC8vIFwiYSkoYlwiLCBidXQgdGhpcyBpcyB1bmxpa2VseSB0byBiZSBhbiBpc3N1ZSBpbiBwcmFjdGljZS5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc2VjdXJpdHkvbm9HbG9iYWxFdmFsOlxuICByZXR1cm4gZXZhbD8uKCdcInVzZSBzdHJpY3RcIjsoJyArIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpICsgXCIpXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3B1cmVfanNfZXhwciBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9wdXJlX2pzX2V4cHIocykge1xuICBjb25zb2xlLmVycm9yKFwiY2FtbF9wdXJlX2pzX2V4cHI6IGZhbGxiYWNrIHRvIHJ1bnRpbWUgZXZhbHVhdGlvblxcblwiKTtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc2VjdXJpdHkvbm9HbG9iYWxFdmFsOlxuICByZXR1cm4gZXZhbD8uKCdcInVzZSBzdHJpY3RcIjsoJyArIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpICsgXCIpXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX29iamVjdCAob2JqZWN0X2xpdGVyYWwpXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc19vYmplY3QoYSkge1xuICB2YXIgbyA9IHt9O1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcCA9IGFbaV07XG4gICAgb1tjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhwWzFdKV0gPSBwWzJdO1xuICB9XG4gIHJldHVybiBvO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9SYWlzZSBleGNlcHRpb25cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV9jb25zdGFudCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX3JhaXNlX2NvbnN0YW50KHRhZykge1xuICB0aHJvdyB0YWc7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfd2l0aF9hcmcgKGNvbnN0LCBtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3dpdGhfYXJnKHRhZywgYXJnKSB7XG4gIHRocm93IGNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZShbMCwgdGFnLCBhcmddKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV93aXRoX2FyZ3MgKGNvbnN0LCBtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3dpdGhfYXJncyh0YWcsIGFyZ3MpIHtcbiAgdGhyb3cgY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlKFswLCB0YWddLmNvbmNhdChhcmdzKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfd2l0aF9hcmcsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcodGFnLCBtc2cpIHtcbiAgY2FtbF9yYWlzZV93aXRoX2FyZyh0YWcsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMobXNnKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmFpbHdpdGggKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV93aXRoX3N0cmluZywgY2FtbF9nbG9iYWxfZGF0YSwgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9mYWlsd2l0aChtc2cpIHtcbiAgaWYgKCFjYW1sX2dsb2JhbF9kYXRhLkZhaWx1cmUpXG4gICAgY2FtbF9nbG9iYWxfZGF0YS5GYWlsdXJlID0gWzI0OCwgY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIkZhaWx1cmVcIiksIC0zXTtcbiAgY2FtbF9yYWlzZV93aXRoX3N0cmluZyhjYW1sX2dsb2JhbF9kYXRhLkZhaWx1cmUsIG1zZyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3dpdGhfc3RyaW5nLCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX2ludmFsaWRfYXJndW1lbnQobXNnKSB7XG4gIGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcoY2FtbF9nbG9iYWxfZGF0YS5JbnZhbGlkX2FyZ3VtZW50LCBtc2cpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JhaXNlX2VuZF9vZl9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX2NvbnN0YW50LCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX3JhaXNlX2VuZF9vZl9maWxlKCkge1xuICBjYW1sX3JhaXNlX2NvbnN0YW50KGNhbWxfZ2xvYmFsX2RhdGEuRW5kX29mX2ZpbGUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JhaXNlX3plcm9fZGl2aWRlXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX2NvbnN0YW50LCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3plcm9fZGl2aWRlKCkge1xuICBjYW1sX3JhaXNlX2NvbnN0YW50KGNhbWxfZ2xvYmFsX2RhdGEuRGl2aXNpb25fYnlfemVybyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfbm90X2ZvdW5kXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX2NvbnN0YW50LCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX3JhaXNlX25vdF9mb3VuZCgpIHtcbiAgY2FtbF9yYWlzZV9jb25zdGFudChjYW1sX2dsb2JhbF9kYXRhLk5vdF9mb3VuZCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpIHtcbiAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiKTtcbn1cbiIsIi8vUHJvdmlkZXM6IGNhbWxfdW5peF9nZXR0aW1lb2ZkYXlcbi8vQWxpYXM6IHVuaXhfZ2V0dGltZW9mZGF5XG5mdW5jdGlvbiBjYW1sX3VuaXhfZ2V0dGltZW9mZGF5KCkge1xuICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfdGltZVxuLy9SZXF1aXJlczogY2FtbF91bml4X2dldHRpbWVvZmRheVxuLy9BbGlhczogdW5peF90aW1lXG5mdW5jdGlvbiBjYW1sX3VuaXhfdGltZSgpIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoY2FtbF91bml4X2dldHRpbWVvZmRheSgpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3RpbWVzXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vL0FsaWFzOiB1bml4X3RpbWVzXG5mdW5jdGlvbiBjYW1sX3VuaXhfdGltZXMoKSB7XG4gIGlmIChnbG9iYWxUaGlzLnByb2Nlc3M/LmNwdVVzYWdlKSB7XG4gICAgdmFyIHQgPSBnbG9iYWxUaGlzLnByb2Nlc3MuY3B1VXNhZ2UoKTtcbiAgICByZXR1cm4gQkxPQ0soMCwgdC51c2VyIC8gMWU2LCB0LnN5c3RlbSAvIDFlNiwgMCwgMCk7XG4gIH0gZWxzZSBpZiAoZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZT8ubm93KSB7XG4gICAgcmV0dXJuIEJMT0NLKDAsIGdsb2JhbFRoaXMucGVyZm9ybWFuY2Uubm93KCkgLyAxMDAwLCAwLCAwLCAwKTtcbiAgfSBlbHNlIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3RpbWVzOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2dtdGltZVxuLy9BbGlhczogdW5peF9nbXRpbWVcbmZ1bmN0aW9uIGNhbWxfdW5peF9nbXRpbWUodCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKHQgKiAxMDAwKTtcbiAgdmFyIGRfbnVtID0gZC5nZXRUaW1lKCk7XG4gIHZhciBqYW51YXJ5Zmlyc3QgPSBuZXcgRGF0ZShEYXRlLlVUQyhkLmdldFVUQ0Z1bGxZZWFyKCksIDAsIDEpKS5nZXRUaW1lKCk7XG4gIHZhciBkb3kgPSBNYXRoLmZsb29yKChkX251bSAtIGphbnVhcnlmaXJzdCkgLyA4NjQwMDAwMCk7XG4gIHJldHVybiBCTE9DSyhcbiAgICAwLFxuICAgIGQuZ2V0VVRDU2Vjb25kcygpLFxuICAgIGQuZ2V0VVRDTWludXRlcygpLFxuICAgIGQuZ2V0VVRDSG91cnMoKSxcbiAgICBkLmdldFVUQ0RhdGUoKSxcbiAgICBkLmdldFVUQ01vbnRoKCksXG4gICAgZC5nZXRVVENGdWxsWWVhcigpIC0gMTkwMCxcbiAgICBkLmdldFVUQ0RheSgpLFxuICAgIGRveSxcbiAgICBmYWxzZSB8IDAgLyogZm9yIFVUQyBkYXlsaWdodCBzYXZpbmdzIHRpbWUgaXMgZmFsc2UgKi8sXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9sb2NhbHRpbWVcbi8vQWxpYXM6IHVuaXhfbG9jYWx0aW1lXG5mdW5jdGlvbiBjYW1sX3VuaXhfbG9jYWx0aW1lKHQpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSh0ICogMTAwMCk7XG4gIHZhciBkX251bSA9IGQuZ2V0VGltZSgpO1xuICB2YXIgamFudWFyeWZpcnN0ID0gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCAwLCAxKS5nZXRUaW1lKCk7XG4gIHZhciBkb3kgPSBNYXRoLmZsb29yKChkX251bSAtIGphbnVhcnlmaXJzdCkgLyA4NjQwMDAwMCk7XG4gIHZhciBqYW4gPSBuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIDAsIDEpO1xuICB2YXIganVsID0gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCA2LCAxKTtcbiAgdmFyIHN0ZFRpbWV6b25lT2Zmc2V0ID0gTWF0aC5tYXgoXG4gICAgamFuLmdldFRpbWV6b25lT2Zmc2V0KCksXG4gICAganVsLmdldFRpbWV6b25lT2Zmc2V0KCksXG4gICk7XG4gIHJldHVybiBCTE9DSyhcbiAgICAwLFxuICAgIGQuZ2V0U2Vjb25kcygpLFxuICAgIGQuZ2V0TWludXRlcygpLFxuICAgIGQuZ2V0SG91cnMoKSxcbiAgICBkLmdldERhdGUoKSxcbiAgICBkLmdldE1vbnRoKCksXG4gICAgZC5nZXRGdWxsWWVhcigpIC0gMTkwMCxcbiAgICBkLmdldERheSgpLFxuICAgIGRveSxcbiAgICAoZC5nZXRUaW1lem9uZU9mZnNldCgpIDwgc3RkVGltZXpvbmVPZmZzZXQpIHxcbiAgICAgIDAgLyogZGF5bGlnaHQgc2F2aW5ncyB0aW1lICBmaWVsZC4gKi8sXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9ta3RpbWVcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb2NhbHRpbWVcbi8vQWxpYXM6IHVuaXhfbWt0aW1lXG5mdW5jdGlvbiBjYW1sX3VuaXhfbWt0aW1lKHRtKSB7XG4gIHZhciBkID0gbmV3IERhdGUodG1bNl0gKyAxOTAwLCB0bVs1XSwgdG1bNF0sIHRtWzNdLCB0bVsyXSwgdG1bMV0pLmdldFRpbWUoKTtcbiAgdmFyIHQgPSBNYXRoLmZsb29yKGQgLyAxMDAwKTtcbiAgdmFyIHRtMiA9IGNhbWxfdW5peF9sb2NhbHRpbWUodCk7XG4gIHJldHVybiBCTE9DSygwLCB0LCB0bTIpO1xufVxuLy9Qcm92aWRlczogY2FtbF91bml4X3N0YXJ0dXAgY29uc3Rcbi8vQWxpYXM6IHdpbl9zdGFydHVwXG5mdW5jdGlvbiBjYW1sX3VuaXhfc3RhcnR1cCgpIHt9XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9jbGVhbnVwIGNvbnN0XG4vL0FsaWFzOiB3aW5fY2xlYW51cFxuZnVuY3Rpb24gY2FtbF91bml4X2NsZWFudXAoKSB7fVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfZmlsZWRlc2NyX29mX2ZkIGNvbnN0XG4vL0FsaWFzOiB3aW5faGFuZGxlX2ZkXG5mdW5jdGlvbiBjYW1sX3VuaXhfZmlsZWRlc2NyX29mX2ZkKHgpIHtcbiAgcmV0dXJuIHg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9pc2F0dHlcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZVxuLy9BbGlhczogdW5peF9pc2F0dHlcbmZ1bmN0aW9uIGNhbWxfdW5peF9pc2F0dHkoZmQpIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3VuaXhfbG9va3VwX2ZpbGUoZmQpO1xuICBpZiAoIWZpbGUuaXNhdHR5KSByZXR1cm4gMDtcbiAgcmV0dXJuIGZpbGUuaXNhdHR5KCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9pc2F0dHlcbi8vQWxpYXM6IHVuaXhfaXNhdHR5XG4vL0lmOiBicm93c2VyXG5mdW5jdGlvbiBjYW1sX3VuaXhfaXNhdHR5KF9maWxlRGVzY3JpcHRvcikge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogdW5peF9lcnJvclxudmFyIHVuaXhfZXJyb3IgPSBbXG4gIC8qID09PVVuaXguZXJyb3I9PT1cbiAgICpcbiAgICogVGhpcyBhcnJheSBpcyBpbiBvcmRlciBvZiB0aGUgdmFyaWFudCBpbiBPQ2FtbFxuICAgKi9cbiAgXCJFMkJJR1wiLFxuICBcIkVBQ0NFU1wiLFxuICBcIkVBR0FJTlwiLFxuICBcIkVCQURGXCIsXG4gIFwiRUJVU1lcIixcbiAgXCJFQ0hJTERcIixcbiAgXCJFREVBRExLXCIsXG4gIFwiRURPTVwiLFxuICBcIkVFWElTVFwiLFxuICBcIkVGQVVMVFwiLFxuICBcIkVGQklHXCIsXG4gIFwiRUlOVFJcIixcbiAgXCJFSU5WQUxcIixcbiAgXCJFSU9cIixcbiAgXCJFSVNESVJcIixcbiAgXCJFTUZJTEVcIixcbiAgXCJFTUxJTktcIixcbiAgXCJFTkFNRVRPT0xPTkdcIixcbiAgXCJFTkZJTEVcIixcbiAgXCJFTk9ERVZcIixcbiAgXCJFTk9FTlRcIixcbiAgXCJFTk9FWEVDXCIsXG4gIFwiRU5PTENLXCIsXG4gIFwiRU5PTUVNXCIsXG4gIFwiRU5PU1BDXCIsXG4gIFwiRU5PU1lTXCIsXG4gIFwiRU5PVERJUlwiLFxuICBcIkVOT1RFTVBUWVwiLFxuICBcIkVOT1RUWVwiLFxuICBcIkVOWElPXCIsXG4gIFwiRVBFUk1cIixcbiAgXCJFUElQRVwiLFxuICBcIkVSQU5HRVwiLFxuICBcIkVST0ZTXCIsXG4gIFwiRVNQSVBFXCIsXG4gIFwiRVNSQ0hcIixcbiAgXCJFWERFVlwiLFxuICBcIkVXT1VMREJMT0NLXCIsXG4gIFwiRUlOUFJPR1JFU1NcIixcbiAgXCJFQUxSRUFEWVwiLFxuICBcIkVOT1RTT0NLXCIsXG4gIFwiRURFU1RBRERSUkVRXCIsXG4gIFwiRU1TR1NJWkVcIixcbiAgXCJFUFJPVE9UWVBFXCIsXG4gIFwiRU5PUFJPVE9PUFRcIixcbiAgXCJFUFJPVE9OT1NVUFBPUlRcIixcbiAgXCJFU09DS1ROT1NVUFBPUlRcIixcbiAgXCJFT1BOT1RTVVBQXCIsXG4gIFwiRVBGTk9TVVBQT1JUXCIsXG4gIFwiRUFGTk9TVVBQT1JUXCIsXG4gIFwiRUFERFJJTlVTRVwiLFxuICBcIkVBRERSTk9UQVZBSUxcIixcbiAgXCJFTkVURE9XTlwiLFxuICBcIkVORVRVTlJFQUNIXCIsXG4gIFwiRU5FVFJFU0VUXCIsXG4gIFwiRUNPTk5BQk9SVEVEXCIsXG4gIFwiRUNPTk5SRVNFVFwiLFxuICBcIkVOT0JVRlNcIixcbiAgXCJFSVNDT05OXCIsXG4gIFwiRU5PVENPTk5cIixcbiAgXCJFU0hVVERPV05cIixcbiAgXCJFVE9PTUFOWVJFRlNcIixcbiAgXCJFVElNRURPVVRcIixcbiAgXCJFQ09OTlJFRlVTRURcIixcbiAgXCJFSE9TVERPV05cIixcbiAgXCJFSE9TVFVOUkVBQ0hcIixcbiAgXCJFTE9PUFwiLFxuICBcIkVPVkVSRkxPV1wiLFxuXTtcblxuLy9Qcm92aWRlczogbWFrZV91bml4X2Vycl9hcmdzXG4vL1JlcXVpcmVzOiB1bml4X2Vycm9yLCBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuZnVuY3Rpb24gbWFrZV91bml4X2Vycl9hcmdzKGNvZGUsIHN5c2NhbGwsIHBhdGgsIGVycm5vKSB7XG4gIHZhciB2YXJpYW50ID0gdW5peF9lcnJvci5pbmRleE9mKGNvZGUpO1xuICBpZiAodmFyaWFudCA8IDApIHtcbiAgICAvLyBEZWZhdWx0IGlmIHVuZGVmaW5lZFxuICAgIGlmIChlcnJubyA9PSBudWxsKSB7XG4gICAgICBlcnJubyA9IC05OTk5O1xuICAgIH1cbiAgICAvLyBJZiBub25lIG9mIHRoZSBhYm92ZSB2YXJpYW50cywgZmFsbGJhY2sgdG8gRVVOS05PV05FUlIoaW50KVxuICAgIC8vIGVycm5vIGlzIGV4cGVjdGVkIHRvIGJlIHBvc2l0aXZlXG4gICAgdmFyaWFudCA9IEJMT0NLKDAsIC1lcnJubyk7XG4gIH1cbiAgdmFyIGFyZ3MgPSBbXG4gICAgdmFyaWFudCxcbiAgICBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhzeXNjYWxsIHx8IFwiXCIpLFxuICAgIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHBhdGggfHwgXCJcIiksXG4gIF07XG4gIHJldHVybiBhcmdzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmVycm9yXG4vL1JlcXVpcmVzOiB1bml4X2Vycm9yXG5mdW5jdGlvbiBjYW1sX3N0cmVycm9yKGVycm5vKSB7XG4gIGNvbnN0IHV0aWwgPSByZXF1aXJlKFwibm9kZTp1dGlsXCIpO1xuICBpZiAoZXJybm8gPj0gMCkge1xuICAgIGNvbnN0IGNvZGUgPSB1bml4X2Vycm9yW2Vycm5vXTtcbiAgICByZXR1cm4gdXRpbFxuICAgICAgLmdldFN5c3RlbUVycm9yTWFwKClcbiAgICAgIC5lbnRyaWVzKClcbiAgICAgIC5maW5kKCh4KSA9PiB4WzFdWzBdID09PSBjb2RlKVsxXVsxXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdXRpbC5nZXRTeXN0ZW1FcnJvck1lc3NhZ2UoZXJybm8pO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyZXJyb3Jcbi8vUmVxdWlyZXM6IHVuaXhfZXJyb3Jcbi8vSWY6IGJyb3dzZXJcbmZ1bmN0aW9uIGNhbWxfc3RyZXJyb3IoZXJybm8pIHtcbiAgY29uc3QgY29kZSA9IHVuaXhfZXJyb3JbZXJybm9dO1xuICByZXR1cm4gY29kZSB8fCBcIlVua25vd24gZXJyb3IgXCIgKyBlcnJubztcbn1cblxuLy9Qcm92aWRlczogdW5peF9lcnJvcl9tZXNzYWdlXG4vL0FsaWFzOiBjYW1sX3VuaXhfZXJyb3JfbWVzc2FnZVxuLy9SZXF1aXJlczogY2FtbF9zdHJlcnJvciwgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbmZ1bmN0aW9uIHVuaXhfZXJyb3JfbWVzc2FnZShlcnIpIHtcbiAgY29uc3QgZXJybm8gPSB0eXBlb2YgZXJyID09PSBcIm51bWJlclwiID8gZXJyIDogLWVyclsxXTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKGNhbWxfc3RyZXJyb3IoZXJybm8pKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2NoZGlyXG4vL1JlcXVpcmVzOiBjYW1sX3N5c19jaGRpclxuLy9BbGlhczogdW5peF9jaGRpclxuZnVuY3Rpb24gY2FtbF91bml4X2NoZGlyKGRpcikge1xuICByZXR1cm4gY2FtbF9zeXNfY2hkaXIoZGlyLCAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfc3RhdFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfc3RhdFxuZnVuY3Rpb24gY2FtbF91bml4X3N0YXQobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZiAoIXJvb3QuZGV2aWNlLnN0YXQpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3N0YXQ6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gcm9vdC5kZXZpY2Uuc3RhdChcbiAgICByb290LnJlc3QsXG4gICAgLyogbGFyZ2UgKi8gZmFsc2UsXG4gICAgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlLFxuICApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfc3RhdF82NFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfc3RhdF82NFxuZnVuY3Rpb24gY2FtbF91bml4X3N0YXRfNjQobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZiAoIXJvb3QuZGV2aWNlLnN0YXQpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3N0YXRfNjQ6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gcm9vdC5kZXZpY2Uuc3RhdChcbiAgICByb290LnJlc3QsXG4gICAgLyogbGFyZ2UgKi8gdHJ1ZSxcbiAgICAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUsXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9sc3RhdFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfbHN0YXRcbmZ1bmN0aW9uIGNhbWxfdW5peF9sc3RhdChuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UubHN0YXQpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X2xzdGF0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLmxzdGF0KFxuICAgIHJvb3QucmVzdCxcbiAgICAvKiBsYXJnZSAqLyBmYWxzZSxcbiAgICAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUsXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9sc3RhdF82NFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfbHN0YXRfNjRcbmZ1bmN0aW9uIGNhbWxfdW5peF9sc3RhdF82NChuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UubHN0YXQpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X2xzdGF0XzY0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLmxzdGF0KFxuICAgIHJvb3QucmVzdCxcbiAgICAvKiBsYXJnZSAqLyB0cnVlLFxuICAgIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSxcbiAgKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2NobW9kXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF9jaG1vZFxuZnVuY3Rpb24gY2FtbF91bml4X2NobW9kKG5hbWUsIHBlcm1zKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UuY2htb2QpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X2NobW9kOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLmNobW9kKHJvb3QucmVzdCwgcGVybXMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfcmVuYW1lXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCByZXNvbHZlX2ZzX2RldmljZVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3Jcbi8vQWxpYXM6IHVuaXhfcmVuYW1lXG5mdW5jdGlvbiBjYW1sX3VuaXhfcmVuYW1lKG8sIG4pIHtcbiAgdmFyIG9fcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG8pO1xuICB2YXIgbl9yb290ID0gcmVzb2x2ZV9mc19kZXZpY2Uobik7XG4gIGlmIChvX3Jvb3QuZGV2aWNlICE9PSBuX3Jvb3QuZGV2aWNlKVxuICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gMSwgXCJFWERFVlwiLCBcInJlbmFtZVwiKTtcbiAgaWYgKCFvX3Jvb3QuZGV2aWNlLnJlbmFtZSkgY2FtbF9mYWlsd2l0aChcImNhbWxfc3lzX3JlbmFtZTogbm90IGltcGxlbWVudGVkXCIpO1xuICBvX3Jvb3QuZGV2aWNlLnJlbmFtZShvX3Jvb3QucmVzdCwgbl9yb290LnJlc3QsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9ta2RpclxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfbWtkaXJcbmZ1bmN0aW9uIGNhbWxfdW5peF9ta2RpcihuYW1lLCBwZXJtKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UubWtkaXIpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X21rZGlyOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLm1rZGlyKHJvb3QucmVzdCwgcGVybSwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3JtZGlyXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF9ybWRpclxuZnVuY3Rpb24gY2FtbF91bml4X3JtZGlyKG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgaWYgKCFyb290LmRldmljZS5ybWRpcikge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfcm1kaXI6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gcm9vdC5kZXZpY2Uucm1kaXIocm9vdC5yZXN0LCAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfbGlua1xuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGgsIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yXG4vL0FsaWFzOiB1bml4X2xpbmtcbmZ1bmN0aW9uIGNhbWxfdW5peF9saW5rKGZvbGxvdywgc3JjLCBkc3QpIHtcbiAgdmFyIHNyY19yb290ID0gcmVzb2x2ZV9mc19kZXZpY2Uoc3JjKTtcbiAgdmFyIGRzdF9yb290ID0gcmVzb2x2ZV9mc19kZXZpY2UoZHN0KTtcbiAgaWYgKCFzcmNfcm9vdC5kZXZpY2UubGluaykge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfbGluazogbm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIC8vIFdlIGNhbid0IGNvbnRyb2wgd2hldGhlciBhICdzcmMnIHN5bWxpbmsgaXMgZm9sbG93ZWQgb3Igbm90LlxuICAvLyBTbyB3ZSBmYWlsIHdoZW4gJ2ZvbGxvdycgaXMgc2V0LCBhcyBkb2N1bWVudGVkIGluIHRoZSBVbml4IG1vZHVsZS5cbiAgaWYgKHR5cGVvZiBmb2xsb3cgIT09IFwibnVtYmVyXCIpXG4gICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IoLyogcmFpc2UgVW5peF9lcnJvciAqLyAxLCBcIkVOT1NZU1wiLCBcImxpbmtcIik7XG4gIGlmIChzcmNfcm9vdC5kZXZpY2UgIT09IGRzdF9yb290LmRldmljZSlcbiAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcigvKiByYWlzZSBVbml4X2Vycm9yICovIDEsIFwiRVhERVZcIiwgXCJsaW5rXCIpO1xuICByZXR1cm4gc3JjX3Jvb3QuZGV2aWNlLmxpbmsoXG4gICAgc3JjX3Jvb3QucmVzdCxcbiAgICBkc3Rfcm9vdC5yZXN0LFxuICAgIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSxcbiAgKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3N5bWxpbmtcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoLCBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuLy9BbGlhczogdW5peF9zeW1saW5rXG5mdW5jdGlvbiBjYW1sX3VuaXhfc3ltbGluayh0b19kaXIsIHNyYywgZHN0KSB7XG4gIHZhciBkc3Rfcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKGRzdCk7XG4gIGlmICghZHN0X3Jvb3QuZGV2aWNlLnN5bWxpbmspIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3N5bWxpbms6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gZHN0X3Jvb3QuZGV2aWNlLnN5bWxpbmsoXG4gICAgdG9fZGlyLFxuICAgIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHNyYyksXG4gICAgZHN0X3Jvb3QucmVzdCxcbiAgICAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUsXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9yZWFkbGlua1xuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfcmVhZGxpbmtcbmZ1bmN0aW9uIGNhbWxfdW5peF9yZWFkbGluayhuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UucmVhZGxpbmspIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3JlYWRsaW5rOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLnJlYWRsaW5rKHJvb3QucmVzdCwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3VubGlua1xuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfdW5saW5rXG5mdW5jdGlvbiBjYW1sX3VuaXhfdW5saW5rKG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgaWYgKCFyb290LmRldmljZS51bmxpbmspIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3VubGluazogbm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIHJvb3QuZGV2aWNlLnVubGluayhyb290LnJlc3QsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfdXRpbWVzXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF91dGltZXNcbmZ1bmN0aW9uIGNhbWxfdW5peF91dGltZXMobmFtZSwgYXRpbWUsIG10aW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UudXRpbWVzKSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF91dGltZXM6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByb290LmRldmljZS51dGltZXMocm9vdC5yZXN0LCBhdGltZSwgbXRpbWUsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfdHJ1bmNhdGVcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoXG4vL0FsaWFzOiB1bml4X3RydW5jYXRlXG5mdW5jdGlvbiBjYW1sX3VuaXhfdHJ1bmNhdGUobmFtZSwgbGVuKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UudHJ1bmNhdGUpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3RydW5jYXRlOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcm9vdC5kZXZpY2UudHJ1bmNhdGUocm9vdC5yZXN0LCBsZW4sIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfdHJ1bmNhdGVfNjRcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoLCBjYW1sX2ludDY0X3RvX2Zsb2F0XG4vL0FsaWFzOiB1bml4X3RydW5jYXRlXzY0XG5mdW5jdGlvbiBjYW1sX3VuaXhfdHJ1bmNhdGVfNjQobmFtZSwgbGVuKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UudHJ1bmNhdGUpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3RydW5jYXRlXzY0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcm9vdC5kZXZpY2UudHJ1bmNhdGUoXG4gICAgcm9vdC5yZXN0LFxuICAgIGNhbWxfaW50NjRfdG9fZmxvYXQobGVuKSxcbiAgICAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUsXG4gICk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfYWNjZXNzXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF9hY2Nlc3NcbmZ1bmN0aW9uIGNhbWxfdW5peF9hY2Nlc3MobmFtZSwgZmxhZ3MpIHtcbiAgdmFyIGYgPSB7fTtcbiAgd2hpbGUgKGZsYWdzKSB7XG4gICAgc3dpdGNoIChmbGFnc1sxXSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBmLnIgPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgZi53ID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGYueCA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBmLmYgPSAxO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZmxhZ3MgPSBmbGFnc1syXTtcbiAgfVxuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZiAoIXJvb3QuZGV2aWNlLmFjY2Vzcykge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfYWNjZXNzOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcm9vdC5kZXZpY2UuYWNjZXNzKHJvb3QucmVzdCwgZiwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9vcGVuXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9zeXNfZmRzLCBNbENoYW5pZFxuLy9BbGlhczogdW5peF9vcGVuXG5mdW5jdGlvbiBjYW1sX3VuaXhfb3BlbihuYW1lLCBmbGFncywgcGVybXMpIHtcbiAgdmFyIGYgPSB7fTtcbiAgd2hpbGUgKGZsYWdzKSB7XG4gICAgc3dpdGNoIChmbGFnc1sxXSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBmLnJkb25seSA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBmLndyb25seSA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBmLnJkd3IgPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgZi5ub25ibG9jayA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA0OlxuICAgICAgICBmLmFwcGVuZCA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA1OlxuICAgICAgICBmLmNyZWF0ZSA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA2OlxuICAgICAgICBmLnRydW5jYXRlID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDc6XG4gICAgICAgIGYuZXhjbCA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA4OlxuICAgICAgICBmLm5vY3R0eSA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA5OlxuICAgICAgICBmLmRzeW5jID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEwOlxuICAgICAgICBmLnN5bmMgPSAxO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZmxhZ3MgPSBmbGFnc1syXTtcbiAgfVxuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICB2YXIgZmlsZSA9IHJvb3QuZGV2aWNlLm9wZW4ocm9vdC5yZXN0LCBmLCBwZXJtcywgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbiAgdmFyIGlkeCA9IGNhbWxfc3lzX2Zkcy5sZW5ndGg7XG4gIHZhciBjaGFuaWQgPSBuZXcgTWxDaGFuaWQoaWR4KTtcbiAgY2FtbF9zeXNfZmRzW2lkeF0gPSB7IGZpbGU6IGZpbGUsIGNoYW5pZDogY2hhbmlkIH07XG4gIHJldHVybiBpZHggfCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfbG9va3VwX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfc3lzX2ZkcywgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3JcbmZ1bmN0aW9uIGNhbWxfdW5peF9sb29rdXBfZmlsZShmZCwgY21kKSB7XG4gIHZhciBmZF9kZXNjID0gY2FtbF9zeXNfZmRzW2ZkXTtcbiAgaWYgKGZkX2Rlc2MgPT09IHVuZGVmaW5lZClcbiAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcigvKiByYWlzZSBVbml4X2Vycm9yICovIDEsIFwiRUJBREZcIiwgY21kKTtcbiAgcmV0dXJuIGZkX2Rlc2MuZmlsZTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2ZzdGF0XG4vL0FsaWFzOiB1bml4X2ZzdGF0XG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfbG9va3VwX2ZpbGUsIGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfdW5peF9mc3RhdChmZCkge1xuICB2YXIgZmlsZSA9IGNhbWxfdW5peF9sb29rdXBfZmlsZShmZCwgXCJmc3RhdFwiKTtcbiAgaWYgKCFmaWxlLnN0YXQpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X2ZzdGF0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIGZpbGUuc3RhdCgvKiBsYXJnZSAqLyBmYWxzZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9mc3RhdF82NFxuLy9BbGlhczogdW5peF9mc3RhdF82NFxuLy9SZXF1aXJlczogY2FtbF91bml4X2xvb2t1cF9maWxlLCBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX3VuaXhfZnN0YXRfNjQoZmQpIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3VuaXhfbG9va3VwX2ZpbGUoZmQsIFwiZnN0YXRcIik7XG4gIGlmICghZmlsZS5zdGF0KSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF9mc3RhdDY0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIGZpbGUuc3RhdCgvKiBsYXJnZSAqLyB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2ZjaG1vZFxuLy9BbGlhczogdW5peF9mY2htb2Rcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZSwgY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF91bml4X2ZjaG1vZChmZCwgcGVybXMpIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3VuaXhfbG9va3VwX2ZpbGUoZmQsIFwiZmNobW9kXCIpO1xuICBpZiAoIWZpbGUuY2htb2QpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X2ZjaG1vZDogbm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIHJldHVybiBmaWxlLmNobW9kKHBlcm1zKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2ZzeW5jXG4vL0FsaWFzOiB1bml4X2ZzeW5jXG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfbG9va3VwX2ZpbGUsIGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfdW5peF9mc3luYyhmZCkge1xuICB2YXIgZmlsZSA9IGNhbWxfdW5peF9sb29rdXBfZmlsZShmZCwgXCJmc3luY1wiKTtcbiAgaWYgKCFmaWxlLnN5bmMpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X2ZzeW5jOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIGZpbGUuc3luYygpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfd3JpdGVcbi8vQWxpYXM6IHVuaXhfd3JpdGVcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZSwgY2FtbF91aW50OF9hcnJheV9vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF91bml4X3dyaXRlKGZkLCBidWYsIHBvcywgbGVuKSB7XG4gIHZhciBmaWxlID0gY2FtbF91bml4X2xvb2t1cF9maWxlKGZkLCBcIndyaXRlXCIpO1xuICB2YXIgYSA9IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMoYnVmKTtcbiAgdmFyIHdyaXR0ZW4gPSAwO1xuICB3aGlsZSAobGVuID4gMCkge1xuICAgIHZhciBuID0gZmlsZS53cml0ZShhLCBwb3MsIGxlbiwgLyogcmFpc2UgdW5peF9lcnJvciAqLyAxKTtcbiAgICB3cml0dGVuICs9IG47XG4gICAgcG9zICs9IG47XG4gICAgbGVuIC09IG47XG4gIH1cbiAgcmV0dXJuIHdyaXR0ZW47XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9zaW5nbGVfd3JpdGVcbi8vQWxpYXM6IHVuaXhfc2luZ2xlX3dyaXRlXG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfbG9va3VwX2ZpbGUsIGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfdW5peF9zaW5nbGVfd3JpdGUoZmQsIGJ1ZiwgcG9zLCBsZW4pIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3VuaXhfbG9va3VwX2ZpbGUoZmQsIFwid3JpdGVcIik7XG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwO1xuICByZXR1cm4gZmlsZS53cml0ZShcbiAgICBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzKGJ1ZiksXG4gICAgcG9zLFxuICAgIGxlbixcbiAgICAvKiByYWlzZSB1bml4X2Vycm9yICovIDEsXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF93cml0ZV9iaWdhcnJheVxuLy9BbGlhczogY2FtbF91bml4X2xvb2t1cF9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX2JhX3RvX3R5cGVkX2FycmF5LCBjYW1sX3VuaXhfbG9va3VwX2ZpbGVcbi8vVmVyc2lvbjogPj0gNS4yXG5mdW5jdGlvbiBjYW1sX3VuaXhfd3JpdGVfYmlnYXJyYXkoZmQsIGJ1ZiwgcG9zLCBsZW4pIHtcbiAgdmFyIGEgPSBjYW1sX2JhX3RvX3R5cGVkX2FycmF5KGJ1Zik7XG4gIHZhciBmaWxlID0gY2FtbF91bml4X2xvb2t1cF9maWxlKGZkLCBcIndyaXRlXCIpO1xuICB2YXIgd3JpdHRlbiA9IDA7XG4gIHdoaWxlIChsZW4gPiAwKSB7XG4gICAgdmFyIG4gPSBmaWxlLndyaXRlKGEsIHBvcywgbGVuLCAvKiByYWlzZSB1bml4X2Vycm9yICovIDEpO1xuICAgIHdyaXR0ZW4gKz0gbjtcbiAgICBwb3MgKz0gbjtcbiAgICBsZW4gLT0gbjtcbiAgfVxuICByZXR1cm4gd3JpdHRlbjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3JlYWRcbi8vQWxpYXM6IHVuaXhfcmVhZFxuLy9SZXF1aXJlczogY2FtbF91bml4X2xvb2t1cF9maWxlLCBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX3VuaXhfcmVhZChmZCwgYnVmLCBwb3MsIGxlbikge1xuICB2YXIgZmlsZSA9IGNhbWxfdW5peF9sb29rdXBfZmlsZShmZCwgXCJyZWFkXCIpO1xuICByZXR1cm4gZmlsZS5yZWFkKFxuICAgIGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMoYnVmKSxcbiAgICBwb3MsXG4gICAgbGVuLFxuICAgIC8qIHJhaXNlIHVuaXhfZXJyb3IgKi8gMSxcbiAgKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3JlYWRfYmlnYXJyYXlcbi8vQWxpYXM6IHVuaXhfcmVhZF9iaWdhcnJheVxuLy9SZXF1aXJlczogY2FtbF9iYV90b190eXBlZF9hcnJheSwgY2FtbF91bml4X2xvb2t1cF9maWxlXG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF91bml4X3JlYWRfYmlnYXJyYXkoZmQsIGJ1ZiwgcG9zLCBsZW4pIHtcbiAgdmFyIGEgPSBjYW1sX2JhX3RvX3R5cGVkX2FycmF5KGJ1Zik7XG4gIHZhciBmaWxlID0gY2FtbF91bml4X2xvb2t1cF9maWxlKGZkLCBcInJlYWRcIik7XG4gIHJldHVybiBmaWxlLnJlYWQoYSwgcG9zLCBsZW4sIC8qIHJhaXNlIHVuaXhfZXJyb3IgKi8gMSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9sc2Vla1xuLy9BbGlhczogdW5peF9sc2Vla1xuLy9SZXF1aXJlczogY2FtbF91bml4X2xvb2t1cF9maWxlXG5mdW5jdGlvbiBjYW1sX3VuaXhfbHNlZWsoZmQsIGxlbiwgd2hlbmNlKSB7XG4gIHZhciBmaWxlID0gY2FtbF91bml4X2xvb2t1cF9maWxlKGZkLCBcImxzZWVrXCIpO1xuICByZXR1cm4gZmlsZS5zZWVrKGxlbiwgd2hlbmNlLCAvKiByYWlzZSB1bml4X2Vycm9yICovIDEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfbHNlZWtfNjRcbi8vQWxpYXM6IHVuaXhfbHNlZWtfNjRcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZSwgY2FtbF9pbnQ2NF90b19mbG9hdFxuZnVuY3Rpb24gY2FtbF91bml4X2xzZWVrXzY0KGZkLCBsZW4sIHdoZW5jZSkge1xuICB2YXIgZmlsZSA9IGNhbWxfdW5peF9sb29rdXBfZmlsZShmZCwgXCJsc2Vla1wiKTtcbiAgcmV0dXJuIGZpbGUuc2VlayhjYW1sX2ludDY0X3RvX2Zsb2F0KGxlbiksIHdoZW5jZSwgLyogcmFpc2UgdW5peF9lcnJvciAqLyAxKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2Z0cnVuY2F0ZVxuLy9BbGlhczogdW5peF9mdHJ1bmNhdGVcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZSwgY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF91bml4X2Z0cnVuY2F0ZShmZCwgbGVuKSB7XG4gIHZhciBmaWxlID0gY2FtbF91bml4X2xvb2t1cF9maWxlKGZkLCBcImZ0cnVuY2F0ZVwiKTtcbiAgaWYgKCFmaWxlLnRydW5jYXRlKSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF9mdHJ1bmNhdGU6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICBmaWxlLnRydW5jYXRlKGxlbiwgLyogcmFpc2UgdW5peF9lcnJvciAqLyAxKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9mdHJ1bmNhdGVfNjRcbi8vQWxpYXM6IHVuaXhfZnRydW5jYXRlXzY0XG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfbG9va3VwX2ZpbGUsIGNhbWxfZmFpbHdpdGgsIGNhbWxfaW50NjRfdG9fZmxvYXRcbmZ1bmN0aW9uIGNhbWxfdW5peF9mdHJ1bmNhdGVfNjQoZmQsIGxlbikge1xuICB2YXIgZmlsZSA9IGNhbWxfdW5peF9sb29rdXBfZmlsZShmZCwgXCJmdHJ1bmNhdGVcIik7XG4gIGlmICghZmlsZS50cnVuY2F0ZSkge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfZnRydW5jYXRlXzY0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgZmlsZS50cnVuY2F0ZShjYW1sX2ludDY0X3RvX2Zsb2F0KGxlbiksIC8qIHJhaXNlIHVuaXhfZXJyb3IgKi8gMSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfY2xvc2Vcbi8vQWxpYXM6IHVuaXhfY2xvc2Vcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZVxuZnVuY3Rpb24gY2FtbF91bml4X2Nsb3NlKGZkKSB7XG4gIHZhciBmaWxlID0gY2FtbF91bml4X2xvb2t1cF9maWxlKGZkLCBcImNsb3NlXCIpO1xuICBmaWxlLmNsb3NlKC8qIHJhaXNlIHVuaXhfZXJyb3IgKi8gMSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfaW5jaGFubmVsX29mX2ZpbGVkZXNjclxuLy9BbGlhczogdW5peF9pbmNoYW5uZWxfb2ZfZmlsZWRlc2NyXG4vL0FsaWFzOiB3aW5faW5jaGFubmVsX29mX2ZpbGVkZXNjclxuLy9SZXF1aXJlczogY2FtbF91bml4X2xvb2t1cF9maWxlLCBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pblxuZnVuY3Rpb24gY2FtbF91bml4X2luY2hhbm5lbF9vZl9maWxlZGVzY3IoZmQpIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3VuaXhfbG9va3VwX2ZpbGUoZmQsIFwiaW5fY2hhbm5lbF9vZl9kZXNjclwiKTtcbiAgZmlsZS5jaGVja19zdHJlYW1fc2VtYW50aWNzKFwiaW5fY2hhbm5lbF9vZl9kZXNjclwiKTtcbiAgcmV0dXJuIGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX2luKGZkKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X291dGNoYW5uZWxfb2ZfZmlsZWRlc2NyXG4vL0FsaWFzOiB1bml4X291dGNoYW5uZWxfb2ZfZmlsZWRlc2NyXG4vL0FsaWFzOiB3aW5fb3V0Y2hhbm5lbF9vZl9maWxlZGVzY3Jcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZSwgY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3Jfb3V0XG5mdW5jdGlvbiBjYW1sX3VuaXhfb3V0Y2hhbm5lbF9vZl9maWxlZGVzY3IoZmQpIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3VuaXhfbG9va3VwX2ZpbGUoZmQsIFwib3V0X2NoYW5uZWxfb2ZfZGVzY3JcIik7XG4gIGZpbGUuY2hlY2tfc3RyZWFtX3NlbWFudGljcyhcIm91dF9jaGFubmVsX29mX2Rlc2NyXCIpO1xuICByZXR1cm4gY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3Jfb3V0KGZkKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2dldHVpZFxuLy9BbGlhczogdW5peF9nZXR1aWRcbmZ1bmN0aW9uIGNhbWxfdW5peF9nZXR1aWQoX3VuaXQpIHtcbiAgaWYgKGdsb2JhbFRoaXMucHJvY2Vzcz8uZ2V0dWlkKSB7XG4gICAgcmV0dXJuIGdsb2JhbFRoaXMucHJvY2Vzcy5nZXR1aWQoKTtcbiAgfVxuICByZXR1cm4gMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2dldGV1aWRcbi8vQWxpYXM6IHVuaXhfZ2V0ZXVpZFxuZnVuY3Rpb24gY2FtbF91bml4X2dldGV1aWQoX3VuaXQpIHtcbiAgaWYgKGdsb2JhbFRoaXMucHJvY2Vzcz8uZ2V0ZXVpZCkge1xuICAgIHJldHVybiBnbG9iYWxUaGlzLnByb2Nlc3MuZ2V0ZXVpZCgpO1xuICB9XG4gIHJldHVybiAxO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfZ2V0Z2lkXG4vL0FsaWFzOiB1bml4X2dldGdpZFxuZnVuY3Rpb24gY2FtbF91bml4X2dldGdpZChfdW5pdCkge1xuICBpZiAoZ2xvYmFsVGhpcy5wcm9jZXNzPy5nZXRnaWQpIHtcbiAgICByZXR1cm4gZ2xvYmFsVGhpcy5wcm9jZXNzLmdldGdpZCgpO1xuICB9XG4gIHJldHVybiAxO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfZ2V0ZWdpZFxuLy9BbGlhczogdW5peF9nZXRlZ2lkXG5mdW5jdGlvbiBjYW1sX3VuaXhfZ2V0ZWdpZChfdW5pdCkge1xuICBpZiAoZ2xvYmFsVGhpcy5wcm9jZXNzPy5nZXRlZ2lkKSB7XG4gICAgcmV0dXJuIGdsb2JhbFRoaXMucHJvY2Vzcy5nZXRlZ2lkKCk7XG4gIH1cbiAgcmV0dXJuIDE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9nZXRwd25hbVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9ub3RfZm91bmRcbi8vQWxpYXM6IHVuaXhfZ2V0cHduYW1cbi8vQWxpYXM6IGNhbWxfdW5peF9nZXRwd3VpZFxuLy9BbGlhczogdW5peF9nZXRwd3VpZFxuLy9BbGlhczogY2FtbF91bml4X2dldGdybmFtXG4vL0FsaWFzOiB1bml4X2dldGdybmFtXG4vL0FsaWFzOiBjYW1sX3VuaXhfZ2V0Z3JnaWRcbi8vQWxpYXM6IHVuaXhfZ2V0Z3JnaWRcbmZ1bmN0aW9uIGNhbWxfdW5peF9nZXRwd25hbShfdW5pdCkge1xuICBjYW1sX3JhaXNlX25vdF9mb3VuZCgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfaGFzX3N5bWxpbmtcbi8vUmVxdWlyZXM6IGZzX25vZGVfc3VwcG9ydGVkXG4vL0FsaWFzOiB1bml4X2hhc19zeW1saW5rXG5mdW5jdGlvbiBjYW1sX3VuaXhfaGFzX3N5bWxpbmsoX3VuaXQpIHtcbiAgcmV0dXJuIGZzX25vZGVfc3VwcG9ydGVkKCkgPyAxIDogMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X29wZW5kaXJcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoXG4vL0FsaWFzOiB1bml4X29wZW5kaXJcbmZ1bmN0aW9uIGNhbWxfdW5peF9vcGVuZGlyKHBhdGgpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShwYXRoKTtcbiAgaWYgKCFyb290LmRldmljZS5vcGVuZGlyKSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF9vcGVuZGlyOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgdmFyIGRpcl9oYW5kbGUgPSByb290LmRldmljZS5vcGVuZGlyKHJvb3QucmVzdCwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbiAgcmV0dXJuIHsgcG9pbnRlcjogZGlyX2hhbmRsZSwgcGF0aDogcGF0aCB9O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfcmVhZGRpclxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yXG4vL0FsaWFzOiB1bml4X3JlYWRkaXJcbmZ1bmN0aW9uIGNhbWxfdW5peF9yZWFkZGlyKGRpcl9oYW5kbGUpIHtcbiAgdmFyIGVudHJ5O1xuICB0cnkge1xuICAgIGVudHJ5ID0gZGlyX2hhbmRsZS5wb2ludGVyLnJlYWRTeW5jKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcigvKiByYWlzZSBVbml4X2Vycm9yICovIDEsIFwiRUJBREZcIiwgXCJyZWFkZGlyXCIpO1xuICB9XG4gIGlmIChlbnRyeSA9PT0gbnVsbCkge1xuICAgIGNhbWxfcmFpc2VfZW5kX29mX2ZpbGUoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoZW50cnkubmFtZSk7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2Nsb3NlZGlyXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvclxuLy9BbGlhczogdW5peF9jbG9zZWRpclxuZnVuY3Rpb24gY2FtbF91bml4X2Nsb3NlZGlyKGRpcl9oYW5kbGUpIHtcbiAgdHJ5IHtcbiAgICBkaXJfaGFuZGxlLnBvaW50ZXIuY2xvc2VTeW5jKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcigvKiByYWlzZSBVbml4X2Vycm9yICovIDEsIFwiRUJBREZcIiwgXCJjbG9zZWRpclwiKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfcmV3aW5kZGlyXG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfY2xvc2VkaXIsIGNhbWxfdW5peF9vcGVuZGlyXG4vL0FsaWFzOiB1bml4X3Jld2luZGRpclxuZnVuY3Rpb24gY2FtbF91bml4X3Jld2luZGRpcihkaXJfaGFuZGxlKSB7XG4gIGNhbWxfdW5peF9jbG9zZWRpcihkaXJfaGFuZGxlKTtcbiAgdmFyIG5ld19kaXJfaGFuZGxlID0gY2FtbF91bml4X29wZW5kaXIoZGlyX2hhbmRsZS5wYXRoKTtcbiAgZGlyX2hhbmRsZS5wb2ludGVyID0gbmV3X2Rpcl9oYW5kbGUucG9pbnRlcjtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9maW5kZmlyc3Rcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nLCBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF91bml4X29wZW5kaXIsIGNhbWxfdW5peF9yZWFkZGlyXG4vL0FsaWFzOiB3aW5fZmluZGZpcnN0XG5mdW5jdGlvbiBjYW1sX3VuaXhfZmluZGZpcnN0KHBhdGgpIHtcbiAgLy8gVGhlIFdpbmRvd3MgY29kZSBhZGRzIHRoaXMgZ2xvYiB0byB0aGUgcGF0aCwgc28gd2UgbmVlZCB0byByZW1vdmUgaXRcbiAgdmFyIHBhdGhfanMgPSBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhwYXRoKTtcbiAgcGF0aF9qcyA9IHBhdGhfanMucmVwbGFjZSgvKF58W1xcXFwvXSlcXCpcXC5cXCokLywgXCJcIik7XG4gIHBhdGggPSBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhwYXRoX2pzKTtcbiAgLy8gKi4qIGlzIG5vdyBzdHJpcHBlZFxuICB2YXIgZGlyX2hhbmRsZSA9IGNhbWxfdW5peF9vcGVuZGlyKHBhdGgpO1xuICB2YXIgZmlyc3RfZW50cnkgPSBjYW1sX3VuaXhfcmVhZGRpcihkaXJfaGFuZGxlKTtcbiAgLy8gVGhlIFdpbmRvd3MgYmluZGluZ3MgdHlwZSBkaXJfaGFuZGxlIGFzIGFuIGBpbnRgIGJ1dCBpdCdzIG5vdCBpbiBKU1xuICByZXR1cm4gWzAsIGZpcnN0X2VudHJ5LCBkaXJfaGFuZGxlXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2ZpbmRuZXh0XG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfcmVhZGRpclxuLy9BbGlhczogd2luX2ZpbmRuZXh0XG5mdW5jdGlvbiBjYW1sX3VuaXhfZmluZG5leHQoZGlyX2hhbmRsZSkge1xuICByZXR1cm4gY2FtbF91bml4X3JlYWRkaXIoZGlyX2hhbmRsZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9maW5kY2xvc2Vcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9jbG9zZWRpclxuLy9BbGlhczogd2luX2ZpbmRjbG9zZVxuZnVuY3Rpb24gY2FtbF91bml4X2ZpbmRjbG9zZShkaXJfaGFuZGxlKSB7XG4gIHJldHVybiBjYW1sX3VuaXhfY2xvc2VkaXIoZGlyX2hhbmRsZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9pbmV0X2FkZHJfb2Zfc3RyaW5nIGNvbnN0XG4vL0FsaWFzOiB1bml4X2luZXRfYWRkcl9vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfdW5peF9pbmV0X2FkZHJfb2Zfc3RyaW5nKCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfd2l0aF9hcmdzLCBtYWtlX3VuaXhfZXJyX2FyZ3MsIGNhbWxfbmFtZWRfdmFsdWVcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihyYWlzZV91bml4LCBjb2RlLCBjbWQsIG1zZywgcGF0aCkge1xuICB2YXIgdW5peF9lcnJvciA9IGNhbWxfbmFtZWRfdmFsdWUoXCJVbml4LlVuaXhfZXJyb3JcIik7XG4gIGlmIChyYWlzZV91bml4ICYmIHVuaXhfZXJyb3IpXG4gICAgY2FtbF9yYWlzZV93aXRoX2FyZ3ModW5peF9lcnJvciwgbWFrZV91bml4X2Vycl9hcmdzKGNvZGUsIGNtZCwgcGF0aCkpO1xuICBlbHNlIHtcbiAgICB2YXIgbXNnID0gY29kZSArIFwiOiBcIiArIG1zZyArIFwiLCBcIiArIGNtZDtcbiAgICBpZiAocGF0aCAhPT0gdW5kZWZpbmVkKSBtc2cgKz0gXCIgJ1wiICsgcGF0aCArIFwiJ1wiO1xuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKG1zZyk7XG4gIH1cbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxNCBKw6lyw7RtZSBWb3VpbGxvbiwgSHVnbyBIZXV6YXJkXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gRHVtbXkgZmlsZXN5c3RlbVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3RyYWlsaW5nX3NsYXNoXG5mdW5jdGlvbiBjYW1sX3RyYWlsaW5nX3NsYXNoKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUuc2xpY2UoLTEpICE9PSBcIi9cIiA/IG5hbWUgKyBcIi9cIiA6IG5hbWU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY3VycmVudF9kaXJcbi8vUmVxdWlyZXM6IGNhbWxfdHJhaWxpbmdfc2xhc2gsIGZzX25vZGVfc3VwcG9ydGVkXG5pZiAoZnNfbm9kZV9zdXBwb3J0ZWQoKSAmJiBnbG9iYWxUaGlzLnByb2Nlc3MgJiYgZ2xvYmFsVGhpcy5wcm9jZXNzLmN3ZClcbiAgdmFyIGNhbWxfY3VycmVudF9kaXIgPSBnbG9iYWxUaGlzLnByb2Nlc3MuY3dkKCkucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG5lbHNlIHZhciBjYW1sX2N1cnJlbnRfZGlyID0gXCIvc3RhdGljXCI7XG5jYW1sX2N1cnJlbnRfZGlyID0gY2FtbF90cmFpbGluZ19zbGFzaChjYW1sX2N1cnJlbnRfZGlyKTtcblxuLy9Qcm92aWRlczogY2FtbF9nZXRfcm9vdFxuLy9SZXF1aXJlczogcGF0aF9pc19hYnNvbHV0ZVxuZnVuY3Rpb24gY2FtbF9nZXRfcm9vdChwYXRoKSB7XG4gIHZhciB4ID0gcGF0aF9pc19hYnNvbHV0ZShwYXRoKTtcbiAgaWYgKCF4KSByZXR1cm47XG4gIHJldHVybiB4WzBdICsgXCIvXCI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcm9vdFxuLy9SZXF1aXJlczogY2FtbF9nZXRfcm9vdCwgY2FtbF9jdXJyZW50X2RpciwgY2FtbF9mYWlsd2l0aFxudmFyIGNhbWxfcm9vdCA9XG4gIGNhbWxfZ2V0X3Jvb3QoY2FtbF9jdXJyZW50X2RpcikgfHxcbiAgY2FtbF9mYWlsd2l0aChcInVuYWJsZSB0byBjb21wdXRlIGNhbWxfcm9vdFwiKTtcblxuLy9Qcm92aWRlczogTWxGaWxlXG5mdW5jdGlvbiBNbEZpbGUoKSB7fVxuXG4vL1Byb3ZpZGVzOiBwYXRoX2lzX2Fic29sdXRlXG4vL1JlcXVpcmVzOiBmc19ub2RlX3N1cHBvcnRlZFxuLy9SZXF1aXJlczoganNvb19pc193aW4zMlxuZnVuY3Rpb24gbWFrZV9wYXRoX2lzX2Fic29sdXRlKCkge1xuICBmdW5jdGlvbiBwb3NpeChwYXRoKSB7XG4gICAgaWYgKHBhdGguY2hhckF0KDApID09PSBcIi9cIikgcmV0dXJuIFtcIlwiLCBwYXRoLnNsaWNlKDEpXTtcbiAgICByZXR1cm47XG4gIH1cblxuICBmdW5jdGlvbiB3aW4zMihwYXRoKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvYjNmY2MyNDVmYjI1NTM5OTA5ZWYxZDVlYWEwMWRiZjkyZTE2ODYzMy9saWIvcGF0aC5qcyNMNTZcbiAgICB2YXIgc3BsaXREZXZpY2VSZSA9XG4gICAgICAvXihbYS16QS1aXTp8W1xcXFwvXXsyfVteXFxcXC9dK1tcXFxcL10rW15cXFxcL10rKT8oW1xcXFwvXSk/KFtcXHNcXFNdKj8pJC87XG4gICAgdmFyIHJlc3VsdCA9IHNwbGl0RGV2aWNlUmUuZXhlYyhwYXRoKTtcbiAgICB2YXIgZGV2aWNlID0gcmVzdWx0WzFdIHx8IFwiXCI7XG4gICAgdmFyIGlzVW5jID0gZGV2aWNlLmxlbmd0aCA+IDAgJiYgZGV2aWNlLmNoYXJBdCgxKSAhPT0gXCI6XCI7XG5cbiAgICAvLyBVTkMgcGF0aHMgYXJlIGFsd2F5cyBhYnNvbHV0ZVxuICAgIGlmIChyZXN1bHRbMl0gfHwgaXNVbmMpIHtcbiAgICAgIHZhciByb290ID0gcmVzdWx0WzFdIHx8IFwiXCI7XG4gICAgICB2YXIgc2VwID0gcmVzdWx0WzJdIHx8IFwiXCI7XG4gICAgICByZXR1cm4gW3Jvb3QsIHBhdGguc2xpY2Uocm9vdC5sZW5ndGggKyBzZXAubGVuZ3RoKV07XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICByZXR1cm4ganNvb19pc193aW4zMiA/IHdpbjMyIDogcG9zaXg7XG59XG52YXIgcGF0aF9pc19hYnNvbHV0ZSA9IG1ha2VfcGF0aF9pc19hYnNvbHV0ZSgpO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX21ha2VfcGF0aFxuLy9SZXF1aXJlczogY2FtbF9jdXJyZW50X2RpclxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcsIHBhdGhfaXNfYWJzb2x1dGVcbmZ1bmN0aW9uIGNhbWxfbWFrZV9wYXRoKG5hbWUpIHtcbiAgbmFtZSA9IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKG5hbWUpO1xuICBpZiAoIXBhdGhfaXNfYWJzb2x1dGUobmFtZSkpIG5hbWUgPSBjYW1sX2N1cnJlbnRfZGlyICsgbmFtZTtcbiAgdmFyIGNvbXAwID0gcGF0aF9pc19hYnNvbHV0ZShuYW1lKTtcbiAgdmFyIGNvbXAgPSBjb21wMFsxXS5zcGxpdCgvWy9cXFxcXS8pO1xuICB2YXIgbmNvbXAgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wLmxlbmd0aDsgaSsrKSB7XG4gICAgc3dpdGNoIChjb21wW2ldKSB7XG4gICAgICBjYXNlIFwiLi5cIjpcbiAgICAgICAgbmNvbXAucG9wKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIi5cIjpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiXCI6XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbmNvbXAucHVzaChjb21wW2ldKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIG5jb21wLnVuc2hpZnQoY29tcDBbMF0pO1xuICBuY29tcC5vcmlnID0gbmFtZTtcbiAgcmV0dXJuIG5jb21wO1xufVxuXG4vL1Byb3ZpZGVzOmpzb29fbW91bnRfcG9pbnRcbi8vUmVxdWlyZXM6IE1sRmFrZURldmljZSwgTWxOb2RlRGV2aWNlLCBjYW1sX3Jvb3QsIGZzX25vZGVfc3VwcG9ydGVkXG52YXIganNvb19tb3VudF9wb2ludCA9IFtdO1xuaWYgKGZzX25vZGVfc3VwcG9ydGVkKCkpIHtcbiAganNvb19tb3VudF9wb2ludC5wdXNoKHtcbiAgICBwYXRoOiBjYW1sX3Jvb3QsXG4gICAgZGV2aWNlOiBuZXcgTWxOb2RlRGV2aWNlKGNhbWxfcm9vdCksXG4gIH0pO1xufSBlbHNlIHtcbiAganNvb19tb3VudF9wb2ludC5wdXNoKHtcbiAgICBwYXRoOiBjYW1sX3Jvb3QsXG4gICAgZGV2aWNlOiBuZXcgTWxGYWtlRGV2aWNlKGNhbWxfcm9vdCksXG4gIH0pO1xufVxuanNvb19tb3VudF9wb2ludC5wdXNoKHtcbiAgcGF0aDogXCIvc3RhdGljL1wiLFxuICBkZXZpY2U6IG5ldyBNbEZha2VEZXZpY2UoXCIvc3RhdGljL1wiKSxcbn0pO1xuXG4vL1Byb3ZpZGVzOmNhbWxfbGlzdF9tb3VudF9wb2ludFxuLy9SZXF1aXJlczoganNvb19tb3VudF9wb2ludCwgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbmZ1bmN0aW9uIGNhbWxfbGlzdF9tb3VudF9wb2ludCgpIHtcbiAgdmFyIHByZXYgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGpzb29fbW91bnRfcG9pbnQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgb2xkID0gcHJldjtcbiAgICBwcmV2ID0gWzAsIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKGpzb29fbW91bnRfcG9pbnRbaV0ucGF0aCksIG9sZF07XG4gIH1cbiAgcmV0dXJuIHByZXY7XG59XG5cbi8vUHJvdmlkZXM6IHJlc29sdmVfZnNfZGV2aWNlXG4vL1JlcXVpcmVzOiBjYW1sX21ha2VfcGF0aCwganNvb19tb3VudF9wb2ludCwgY2FtbF9yYWlzZV9zeXNfZXJyb3IsIGNhbWxfZ2V0X3Jvb3QsIE1sTm9kZURldmljZSwgY2FtbF90cmFpbGluZ19zbGFzaCwgZnNfbm9kZV9zdXBwb3J0ZWRcbmZ1bmN0aW9uIHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpIHtcbiAgdmFyIHBhdGggPSBjYW1sX21ha2VfcGF0aChuYW1lKTtcbiAgdmFyIG5hbWUgPSBwYXRoLmpvaW4oXCIvXCIpO1xuICB2YXIgbmFtZV9zbGFzaCA9IGNhbWxfdHJhaWxpbmdfc2xhc2gobmFtZSk7XG4gIHZhciByZXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwganNvb19tb3VudF9wb2ludC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtID0ganNvb19tb3VudF9wb2ludFtpXTtcbiAgICBpZiAoXG4gICAgICBuYW1lX3NsYXNoLnNlYXJjaChtLnBhdGgpID09PSAwICYmXG4gICAgICAoIXJlcyB8fCByZXMucGF0aC5sZW5ndGggPCBtLnBhdGgubGVuZ3RoKVxuICAgIClcbiAgICAgIHJlcyA9IHtcbiAgICAgICAgcGF0aDogbS5wYXRoLFxuICAgICAgICBkZXZpY2U6IG0uZGV2aWNlLFxuICAgICAgICByZXN0OiBuYW1lLnNsaWNlKG0ucGF0aC5sZW5ndGgsIG5hbWUubGVuZ3RoKSxcbiAgICAgIH07XG4gIH1cbiAgaWYgKCFyZXMgJiYgZnNfbm9kZV9zdXBwb3J0ZWQoKSkge1xuICAgIHZhciByb290ID0gY2FtbF9nZXRfcm9vdChuYW1lKTtcbiAgICBpZiAocm9vdD8ubWF0Y2goL15bYS16QS1aXTpcXC8kLykpIHtcbiAgICAgIHZhciBtID0geyBwYXRoOiByb290LCBkZXZpY2U6IG5ldyBNbE5vZGVEZXZpY2Uocm9vdCkgfTtcbiAgICAgIGpzb29fbW91bnRfcG9pbnQucHVzaChtKTtcbiAgICAgIHJlcyA9IHtcbiAgICAgICAgcGF0aDogbS5wYXRoLFxuICAgICAgICBkZXZpY2U6IG0uZGV2aWNlLFxuICAgICAgICByZXN0OiBuYW1lLnNsaWNlKG0ucGF0aC5sZW5ndGgsIG5hbWUubGVuZ3RoKSxcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGlmIChyZXMpIHJldHVybiByZXM7XG4gIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKFwibm8gZGV2aWNlIGZvdW5kIGZvciBcIiArIG5hbWVfc2xhc2gpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21vdW50X2F1dG9sb2FkXG4vL1JlcXVpcmVzOiBNbEZha2VEZXZpY2UsIGNhbWxfbWFrZV9wYXRoLCBqc29vX21vdW50X3BvaW50LCBjYW1sX3RyYWlsaW5nX3NsYXNoXG5mdW5jdGlvbiBjYW1sX21vdW50X2F1dG9sb2FkKG5hbWUsIGYpIHtcbiAgdmFyIHBhdGggPSBjYW1sX21ha2VfcGF0aChuYW1lKTtcbiAgdmFyIG5hbWUgPSBjYW1sX3RyYWlsaW5nX3NsYXNoKHBhdGguam9pbihcIi9cIikpO1xuICBqc29vX21vdW50X3BvaW50LnB1c2goeyBwYXRoOiBuYW1lLCBkZXZpY2U6IG5ldyBNbEZha2VEZXZpY2UobmFtZSwgZikgfSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VubW91bnRcbi8vUmVxdWlyZXM6IGpzb29fbW91bnRfcG9pbnQsIGNhbWxfbWFrZV9wYXRoLCBjYW1sX3RyYWlsaW5nX3NsYXNoXG5mdW5jdGlvbiBjYW1sX3VubW91bnQobmFtZSkge1xuICB2YXIgcGF0aCA9IGNhbWxfbWFrZV9wYXRoKG5hbWUpO1xuICB2YXIgbmFtZSA9IGNhbWxfdHJhaWxpbmdfc2xhc2gocGF0aC5qb2luKFwiL1wiKSk7XG4gIHZhciBpZHggPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBqc29vX21vdW50X3BvaW50Lmxlbmd0aDsgaSsrKVxuICAgIGlmIChqc29vX21vdW50X3BvaW50W2ldLnBhdGggPT09IG5hbWUpIGlkeCA9IGk7XG4gIGlmIChpZHggPiAtMSkganNvb19tb3VudF9wb2ludC5zcGxpY2UoaWR4LCAxKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2dldGN3ZFxuLy9SZXF1aXJlczogY2FtbF9jdXJyZW50X2RpciwgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vQWxpYXM6IGNhbWxfdW5peF9nZXRjd2Rcbi8vQWxpYXM6IHVuaXhfZ2V0Y3dkXG5mdW5jdGlvbiBjYW1sX3N5c19nZXRjd2QoKSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhjYW1sX2N1cnJlbnRfZGlyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY2hkaXJcbi8vUmVxdWlyZXM6IGNhbWxfY3VycmVudF9kaXIsIGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlLCByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF90cmFpbGluZ19zbGFzaCwgY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcsIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yXG5mdW5jdGlvbiBjYW1sX3N5c19jaGRpcihkaXIsIHJhaXNlX3VuaXgpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShkaXIpO1xuICBpZiAocm9vdC5kZXZpY2UuaXNfZGlyKHJvb3QucmVzdCkpIHtcbiAgICBpZiAocm9vdC5yZXN0KVxuICAgICAgY2FtbF9jdXJyZW50X2RpciA9IGNhbWxfdHJhaWxpbmdfc2xhc2gocm9vdC5wYXRoICsgcm9vdC5yZXN0KTtcbiAgICBlbHNlIGNhbWxfY3VycmVudF9kaXIgPSByb290LnBhdGg7XG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSBpZiAocm9vdC5kZXZpY2UuZXhpc3RzKHJvb3QucmVzdCkpIHtcbiAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgIHJhaXNlX3VuaXgsXG4gICAgICBcIkVOT1RESVJcIixcbiAgICAgIFwiY2hkaXJcIixcbiAgICAgIFwibm90IGEgZGlyZWN0b3J5XCIsXG4gICAgICBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhkaXIpLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUoY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcoZGlyKSwgcmFpc2VfdW5peCk7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yXG5mdW5jdGlvbiBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZShuYW1lLCByYWlzZV91bml4KSB7XG4gIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgIHJhaXNlX3VuaXgsXG4gICAgXCJFTk9FTlRcIixcbiAgICBcIm5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcIixcbiAgICBuYW1lLFxuICApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19maWxlX2V4aXN0c1xuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2VcbmZ1bmN0aW9uIGNhbWxfc3lzX2ZpbGVfZXhpc3RzKG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgcmV0dXJuIHJvb3QuZGV2aWNlLmV4aXN0cyhyb290LnJlc3QpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19yZWFkX2RpcmVjdG9yeVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlXG5mdW5jdGlvbiBjYW1sX3N5c19yZWFkX2RpcmVjdG9yeShuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIHZhciBhID0gcm9vdC5kZXZpY2UucmVhZGRpcihyb290LnJlc3QpO1xuICB2YXIgbCA9IG5ldyBBcnJheShhLmxlbmd0aCArIDEpO1xuICBsWzBdID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSBsW2kgKyAxXSA9IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKGFbaV0pO1xuICByZXR1cm4gbDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfcmVtb3ZlXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZVxuZnVuY3Rpb24gY2FtbF9zeXNfcmVtb3ZlKG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgcmV0dXJuIHJvb3QuZGV2aWNlLnVubGluayhyb290LnJlc3QpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19pc19kaXJlY3Rvcnlcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlXG5mdW5jdGlvbiBjYW1sX3N5c19pc19kaXJlY3RvcnkobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICB2YXIgYSA9IHJvb3QuZGV2aWNlLmlzX2Rpcihyb290LnJlc3QpO1xuICByZXR1cm4gYSA/IDEgOiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19yZW5hbWVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGgsIHJlc29sdmVfZnNfZGV2aWNlXG5mdW5jdGlvbiBjYW1sX3N5c19yZW5hbWUobywgbikge1xuICB2YXIgb19yb290ID0gcmVzb2x2ZV9mc19kZXZpY2Uobyk7XG4gIHZhciBuX3Jvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuKTtcbiAgaWYgKG9fcm9vdC5kZXZpY2UgIT09IG5fcm9vdC5kZXZpY2UpXG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfc3lzX3JlbmFtZTogY2Fubm90IG1vdmUgZmlsZSBiZXR3ZWVuIHR3byBmaWxlc3lzdGVtXCIpO1xuICBpZiAoIW9fcm9vdC5kZXZpY2UucmVuYW1lKSBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9zeXNfcmVuYW1lOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIG9fcm9vdC5kZXZpY2UucmVuYW1lKG9fcm9vdC5yZXN0LCBuX3Jvb3QucmVzdCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX21rZGlyXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZVxuZnVuY3Rpb24gY2FtbF9zeXNfbWtkaXIobmFtZSwgcGVybSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICByb290LmRldmljZS5ta2Rpcihyb290LnJlc3QsIHBlcm0pO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfcm1kaXJcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlXG5mdW5jdGlvbiBjYW1sX3N5c19ybWRpcihuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIHJvb3QuZGV2aWNlLnJtZGlyKHJvb3QucmVzdCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX21hcF9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2JhX21hcF9maWxlKF92ZmQsIF9raW5kLCBfbGF5b3V0LCBfc2hhcmVkLCBfZGltcywgX3Bvcykge1xuICAvLyB2YXIgZGF0YSA9IGNhbWxfc3lzX2Zkc1t2ZmRdO1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9iYV9tYXBfZmlsZSBub3QgaW1wbGVtZW50ZWRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfbWFwX2ZpbGVfYnl0ZWNvZGVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfbWFwX2ZpbGVcbmZ1bmN0aW9uIGNhbWxfYmFfbWFwX2ZpbGVfYnl0ZWNvZGUoYXJndiwgX2FyZ24pIHtcbiAgLy8gYXJnbiA9PT0gNlxuICByZXR1cm4gY2FtbF9iYV9tYXBfZmlsZShhcmd2WzBdLCBhcmd2WzFdLCBhcmd2WzJdLCBhcmd2WzNdLCBhcmd2WzRdLCBhcmd2WzVdKTtcbn1cblxuLy9Qcm92aWRlczoganNvb19jcmVhdGVfZmlsZV9leHRlcm5cbmZ1bmN0aW9uIGpzb29fY3JlYXRlX2ZpbGVfZXh0ZXJuKG5hbWUsIGNvbnRlbnQpIHtcbiAgaWYgKGdsb2JhbFRoaXMuanNvb19jcmVhdGVfZmlsZSkgZ2xvYmFsVGhpcy5qc29vX2NyZWF0ZV9maWxlKG5hbWUsIGNvbnRlbnQpO1xuICBlbHNlIHtcbiAgICBpZiAoIWdsb2JhbFRoaXMuanNvb19mc190bXApIGdsb2JhbFRoaXMuanNvb19mc190bXAgPSBbXTtcbiAgICBnbG9iYWxUaGlzLmpzb29fZnNfdG1wLnB1c2goeyBuYW1lOiBuYW1lLCBjb250ZW50OiBjb250ZW50IH0pO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZzX2luaXRcbi8vUmVxdWlyZXM6IGpzb29fY3JlYXRlX2ZpbGVcbmZ1bmN0aW9uIGNhbWxfZnNfaW5pdCgpIHtcbiAgdmFyIHRtcCA9IGdsb2JhbFRoaXMuanNvb19mc190bXA7XG4gIGlmICh0bXApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRtcC5sZW5ndGg7IGkrKykge1xuICAgICAganNvb19jcmVhdGVfZmlsZSh0bXBbaV0ubmFtZSwgdG1wW2ldLmNvbnRlbnQpO1xuICAgIH1cbiAgfVxuICBnbG9iYWxUaGlzLmpzb29fY3JlYXRlX2ZpbGUgPSBqc29vX2NyZWF0ZV9maWxlO1xuICBnbG9iYWxUaGlzLmpzb29fZnNfdG1wID0gW107XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NyZWF0ZV9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCByZXNvbHZlX2ZzX2RldmljZVxuZnVuY3Rpb24gY2FtbF9jcmVhdGVfZmlsZShuYW1lLCBjb250ZW50KSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UucmVnaXN0ZXIpIGNhbWxfZmFpbHdpdGgoXCJjYW5ub3QgcmVnaXN0ZXIgZmlsZVwiKTtcbiAgcm9vdC5kZXZpY2UucmVnaXN0ZXIocm9vdC5yZXN0LCBjb250ZW50KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGpzb29fY3JlYXRlX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfY3JlYXRlX2ZpbGUsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMsIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG5mdW5jdGlvbiBqc29vX2NyZWF0ZV9maWxlKG5hbWUsIGNvbnRlbnQpIHtcbiAgdmFyIG5hbWUgPSBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhuYW1lKTtcbiAgdmFyIGNvbnRlbnQgPSBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKGNvbnRlbnQpO1xuICByZXR1cm4gY2FtbF9jcmVhdGVfZmlsZShuYW1lLCBjb250ZW50KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9yZWFkX2ZpbGVfY29udGVudFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlLCBjYW1sX3N0cmluZ19vZl91aW50OF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcsIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3JlYWRfZmlsZV9jb250ZW50KG5hbWUpIHtcbiAgdmFyIG5hbWUgPSB0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIiA/IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKG5hbWUpIDogbmFtZTtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgaWYgKHJvb3QuZGV2aWNlLmV4aXN0cyhyb290LnJlc3QpKSB7XG4gICAgdmFyIGZpbGUgPSByb290LmRldmljZS5vcGVuKHJvb3QucmVzdCwgeyByZG9ubHk6IDEgfSk7XG4gICAgdmFyIGxlbiA9IGZpbGUubGVuZ3RoKCk7XG4gICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gICAgZmlsZS5yZWFkKGJ1ZiwgMCwgbGVuLCBmYWxzZSk7XG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5KGJ1Zik7XG4gIH1cbiAgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUoY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcobmFtZSkpO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDE0IErDqXLDtG1lIFZvdWlsbG9uLCBIdWdvIEhldXphcmRcbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogTWxGYWtlRGV2aWNlXG4vL1JlcXVpcmVzOiBNbEZha2VGaWxlLCBNbEZha2VGZCwgY2FtbF9jcmVhdGVfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlcywgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfb2ZfYXJyYXksIGNhbWxfYnl0ZXNfb2Zfc3RyaW5nLCBjYW1sX2J5dGVzX29mX2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaXNfbWxfYnl0ZXMsIGNhbWxfaXNfbWxfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvclxuY2xhc3MgTWxGYWtlRGV2aWNlIHtcbiAgY29uc3RydWN0b3Iocm9vdCwgZikge1xuICAgIHRoaXMuY29udGVudCA9IHt9O1xuICAgIHRoaXMucm9vdCA9IHJvb3Q7XG4gICAgdGhpcy5sb29rdXBGdW4gPSBmO1xuICB9XG5cbiAgbm0obmFtZSkge1xuICAgIHJldHVybiB0aGlzLnJvb3QgKyBuYW1lO1xuICB9XG5cbiAgY3JlYXRlX2Rpcl9pZl9uZWVkZWQobmFtZSkge1xuICAgIHZhciBjb21wID0gbmFtZS5zcGxpdChcIi9cIik7XG4gICAgdmFyIHJlcyA9IFwiXCI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgcmVzICs9IGNvbXBbaV0gKyBcIi9cIjtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnRbcmVzXSkgY29udGludWU7XG4gICAgICB0aGlzLmNvbnRlbnRbcmVzXSA9IFN5bWJvbChcImRpcmVjdG9yeVwiKTtcbiAgICB9XG4gIH1cblxuICBzbGFzaChuYW1lKSB7XG4gICAgcmV0dXJuIC9cXC8kLy50ZXN0KG5hbWUpID8gbmFtZSA6IG5hbWUgKyBcIi9cIjtcbiAgfVxuXG4gIGxvb2t1cChuYW1lKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRbbmFtZV0gJiYgdGhpcy5sb29rdXBGdW4pIHtcbiAgICAgIHZhciByZXMgPSB0aGlzLmxvb2t1cEZ1bihcbiAgICAgICAgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcodGhpcy5yb290KSxcbiAgICAgICAgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcobmFtZSksXG4gICAgICApO1xuICAgICAgaWYgKHJlcyAhPT0gMCkge1xuICAgICAgICB0aGlzLmNyZWF0ZV9kaXJfaWZfbmVlZGVkKG5hbWUpO1xuICAgICAgICB0aGlzLmNvbnRlbnRbbmFtZV0gPSBuZXcgTWxGYWtlRmlsZShjYW1sX2J5dGVzX29mX3N0cmluZyhyZXNbMV0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleGlzdHMobmFtZSwgZG9fbm90X2xvb2t1cCkge1xuICAgIC8vIFRoZSByb290IG9mIHRoZSBkZXZpY2UgZXhpc3RzXG4gICAgaWYgKG5hbWUgPT09IFwiXCIpIHJldHVybiAxO1xuICAgIC8vIENoZWNrIGlmIGEgZGlyZWN0b3J5IGV4aXN0c1xuICAgIHZhciBuYW1lX3NsYXNoID0gdGhpcy5zbGFzaChuYW1lKTtcbiAgICBpZiAodGhpcy5jb250ZW50W25hbWVfc2xhc2hdKSByZXR1cm4gMTtcbiAgICAvLyBDaGVjayBpZiBhIGZpbGUgZXhpc3RzXG4gICAgaWYgKCFkb19ub3RfbG9va3VwKSB0aGlzLmxvb2t1cChuYW1lKTtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50W25hbWVdID8gMSA6IDA7XG4gIH1cblxuICBpc0ZpbGUobmFtZSkge1xuICAgIGlmICh0aGlzLmV4aXN0cyhuYW1lKSAmJiAhdGhpcy5pc19kaXIobmFtZSkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICByZW5hbWVfZGlyKG9sZG5hbWUsIG5ld25hbWUpIHtcbiAgICBpZiAodGhpcy5leGlzdHMobmV3bmFtZSkpIHtcbiAgICAgIGlmICghdGhpcy5pc19kaXIobmV3bmFtZSkpIHtcbiAgICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXG4gICAgICAgICAgdGhpcy5ubShuZXduYW1lKSArIFwiIDogZmlsZSBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgbm90IGEgZGlyZWN0b3J5XCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yZWFkZGlyKG5ld25hbWUpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5ubShuZXduYW1lKSArIFwiIDogZGlyZWN0b3J5IG5vdCBlbXB0eVwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIG9sZF9zbGFzaCA9IHRoaXMuc2xhc2gob2xkbmFtZSk7XG4gICAgdmFyIG5ld19zbGFzaCA9IHRoaXMuc2xhc2gobmV3bmFtZSk7XG4gICAgdGhpcy5jcmVhdGVfZGlyX2lmX25lZWRlZChuZXdfc2xhc2gpO1xuICAgIGZvciAoY29uc3QgZiBvZiB0aGlzLnJlYWRkaXIob2xkbmFtZSkpIHtcbiAgICAgIHRoaXMucmVuYW1lKG9sZF9zbGFzaCArIGYsIG5ld19zbGFzaCArIGYpO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5jb250ZW50W29sZF9zbGFzaF07XG4gIH1cblxuICByZW5hbWUob2xkbmFtZSwgbmV3bmFtZSkge1xuICAgIGlmICghdGhpcy5leGlzdHMob2xkbmFtZSkpXG4gICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5tKG9sZG5hbWUpICsgXCIgOiBubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XCIpO1xuICAgIGlmICh0aGlzLmlzX2RpcihvbGRuYW1lKSkge1xuICAgICAgdGhpcy5yZW5hbWVfZGlyKG9sZG5hbWUsIG5ld25hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5leGlzdHMobmV3bmFtZSkgJiYgdGhpcy5pc19kaXIobmV3bmFtZSkpIHtcbiAgICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXG4gICAgICAgICAgdGhpcy5ubShuZXduYW1lKSArIFwiIDogZmlsZSBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgYSBkaXJlY3RvcnlcIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGVudFtuZXduYW1lXSA9IHRoaXMuY29udGVudFtvbGRuYW1lXTtcbiAgICAgIGRlbGV0ZSB0aGlzLmNvbnRlbnRbb2xkbmFtZV07XG4gICAgfVxuICB9XG5cbiAgbWtkaXIobmFtZSwgX21vZGUsIHJhaXNlX3VuaXgpIHtcbiAgICBpZiAodGhpcy5leGlzdHMobmFtZSkpXG4gICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgXCJFRVhJU1RcIixcbiAgICAgICAgXCJta2RpclwiLFxuICAgICAgICBcImZpbGUgYWxyZWFkeSBleGlzdHNcIixcbiAgICAgICAgdGhpcy5ubShuYW1lKSxcbiAgICAgICk7XG4gICAgdmFyIHBhcmVudCA9IC9eKC4qKVxcL1teL10rLy5leGVjKG5hbWUpO1xuICAgIHBhcmVudCA9IHBhcmVudD8uWzFdIHx8IFwiXCI7XG4gICAgaWYgKCF0aGlzLmV4aXN0cyhwYXJlbnQpKVxuICAgICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IoXG4gICAgICAgIHJhaXNlX3VuaXgsXG4gICAgICAgIFwiRU5PRU5UXCIsXG4gICAgICAgIFwibWtkaXJcIixcbiAgICAgICAgXCJubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XCIsXG4gICAgICAgIHRoaXMubm0obmFtZSksXG4gICAgICApO1xuICAgIGlmICghdGhpcy5pc19kaXIocGFyZW50KSlcbiAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgICByYWlzZV91bml4LFxuICAgICAgICBcIkVOT1RESVJcIixcbiAgICAgICAgXCJta2RpclwiLFxuICAgICAgICBcIm5vdCBhIGRpcmVjdG9yeVwiLFxuICAgICAgICB0aGlzLm5tKG5hbWUpLFxuICAgICAgKTtcbiAgICB0aGlzLmNyZWF0ZV9kaXJfaWZfbmVlZGVkKHRoaXMuc2xhc2gobmFtZSkpO1xuICB9XG5cbiAgcm1kaXIobmFtZSwgcmFpc2VfdW5peCkge1xuICAgIHZhciBuYW1lX3NsYXNoID0gbmFtZSA9PT0gXCJcIiA/IFwiXCIgOiB0aGlzLnNsYXNoKG5hbWUpO1xuICAgIGlmICghdGhpcy5leGlzdHMobmFtZSkpXG4gICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgXCJFTk9FTlRcIixcbiAgICAgICAgXCJybWRpclwiLFxuICAgICAgICBcIm5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcIixcbiAgICAgICAgdGhpcy5ubShuYW1lKSxcbiAgICAgICk7XG4gICAgaWYgKCF0aGlzLmlzX2RpcihuYW1lKSlcbiAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgICByYWlzZV91bml4LFxuICAgICAgICBcIkVOT1RESVJcIixcbiAgICAgICAgXCJybWRpclwiLFxuICAgICAgICBcIm5vdCBhIGRpcmVjdG9yeVwiLFxuICAgICAgICB0aGlzLm5tKG5hbWUpLFxuICAgICAgKTtcbiAgICBmb3IgKHZhciBuIGluIHRoaXMuY29udGVudCkge1xuICAgICAgaWYgKG4uc3RhcnRzV2l0aChuYW1lX3NsYXNoKSAmJiBuICE9PSBuYW1lX3NsYXNoKVxuICAgICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgICByYWlzZV91bml4LFxuICAgICAgICAgIFwiRU5PVEVNUFRZXCIsXG4gICAgICAgICAgXCJybWRpclwiLFxuICAgICAgICAgIFwiZGlyZWN0b3J5IG5vdCBlbXB0eVwiLFxuICAgICAgICAgIHRoaXMubm0obmFtZSksXG4gICAgICAgICk7XG4gICAgfVxuICAgIGRlbGV0ZSB0aGlzLmNvbnRlbnRbbmFtZV9zbGFzaF07XG4gIH1cblxuICByZWFkZGlyKG5hbWUpIHtcbiAgICB2YXIgbmFtZV9zbGFzaCA9IG5hbWUgPT09IFwiXCIgPyBcIlwiIDogdGhpcy5zbGFzaChuYW1lKTtcbiAgICBpZiAoIXRoaXMuZXhpc3RzKG5hbWUpKSB7XG4gICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihuYW1lICsgXCI6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcIik7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc19kaXIobmFtZSkpIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKG5hbWUgKyBcIjogTm90IGEgZGlyZWN0b3J5XCIpO1xuICAgIH1cbiAgICB2YXIgc2VlbiA9IHt9O1xuICAgIHZhciBhID0gW107XG4gICAgZm9yICh2YXIgbiBpbiB0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGlmIChuLnN0YXJ0c1dpdGgobmFtZV9zbGFzaCkgJiYgbiAhPT0gbmFtZV9zbGFzaCkge1xuICAgICAgICB2YXIgbGFzdCA9IG4uaW5kZXhPZihcIi9cIiwgbmFtZV9zbGFzaC5sZW5ndGgpO1xuICAgICAgICBpZiAobGFzdCA8IDApIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBtID0gbi5zbGljZShuYW1lX3NsYXNoLmxlbmd0aCwgbGFzdCk7XG4gICAgICAgIGlmIChtICYmICFzZWVuW21dKSB7XG4gICAgICAgICAgc2VlblttXSA9IHRydWU7XG4gICAgICAgICAgYS5wdXNoKG0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhO1xuICB9XG5cbiAgb3BlbmRpcihuYW1lLCByYWlzZV91bml4KSB7XG4gICAgdmFyIGEgPSB0aGlzLnJlYWRkaXIobmFtZSk7XG4gICAgdmFyIGMgPSBmYWxzZTtcbiAgICB2YXIgaSA9IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlYWRTeW5jOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChjKVxuICAgICAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgICAgIFwiRUJBREZcIixcbiAgICAgICAgICAgIFwicmVhZGRpclwiLFxuICAgICAgICAgICAgXCJiYWQgZmlsZSBkZXNjcmlwdG9yXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKGkgPT09IGEubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGVudHJ5ID0gYVtpXTtcbiAgICAgICAgaSsrO1xuICAgICAgICByZXR1cm4geyBuYW1lOiBlbnRyeSB9O1xuICAgICAgfSxcbiAgICAgIGNsb3NlU3luYzogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoYylcbiAgICAgICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgICAgIHJhaXNlX3VuaXgsXG4gICAgICAgICAgICBcIkVCQURGXCIsXG4gICAgICAgICAgICBcInJlYWRkaXJcIixcbiAgICAgICAgICAgIFwiYmFkIGZpbGUgZGVzY3JpcHRvclwiLFxuICAgICAgICAgICk7XG4gICAgICAgIGMgPSB0cnVlO1xuICAgICAgICBhID0gW107XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpc19kaXIobmFtZSkge1xuICAgIGlmIChuYW1lID09PSBcIlwiKSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgbmFtZV9zbGFzaCA9IHRoaXMuc2xhc2gobmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudFtuYW1lX3NsYXNoXSA/IDEgOiAwO1xuICB9XG5cbiAgdW5saW5rKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgICBpZiAoIXRoaXMuZXhpc3RzKG5hbWUsIHRydWUpKSB7XG4gICAgICAvLyBbdHJ1ZV0gbWVhbnMgbm8gXCJsb29rdXBcIiBpZiBub3QgZm91bmQuXG4gICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgXCJFTk9FTlRcIixcbiAgICAgICAgXCJ1bmxpbmtcIixcbiAgICAgICAgXCJubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XCIsXG4gICAgICAgIG5hbWUsXG4gICAgICApO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5jb250ZW50W25hbWVdO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgYWNjZXNzKG5hbWUsIF9mbGFncywgcmFpc2VfdW5peCkge1xuICAgIHRoaXMubG9va3VwKG5hbWUpO1xuICAgIGlmICh0aGlzLmNvbnRlbnRbbmFtZV0pIHtcbiAgICAgIGlmICh0aGlzLmlzX2RpcihuYW1lKSlcbiAgICAgICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IoXG4gICAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgICBcIkVBQ0NFU1NcIixcbiAgICAgICAgICBcImFjY2Vzc1wiLFxuICAgICAgICAgIFwicGVybWlzc2lvbiBkZW5pZWQsXCIsXG4gICAgICAgICAgdGhpcy5ubShuYW1lKSxcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUodGhpcy5ubShuYW1lKSwgcmFpc2VfdW5peCk7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgb3BlbihuYW1lLCBmLCBfcGVybXMsIHJhaXNlX3VuaXgpIHtcbiAgICB2YXIgZmlsZTtcbiAgICB0aGlzLmxvb2t1cChuYW1lKTtcbiAgICBpZiAodGhpcy5jb250ZW50W25hbWVdKSB7XG4gICAgICBpZiAodGhpcy5pc19kaXIobmFtZSkpXG4gICAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgICAgIHJhaXNlX3VuaXgsXG4gICAgICAgICAgXCJFSVNESVJcIixcbiAgICAgICAgICBcIm9wZW5cIixcbiAgICAgICAgICBcImlsbGVnYWwgb3BlcmF0aW9uIG9uIGEgZGlyZWN0b3J5XCIsXG4gICAgICAgICAgdGhpcy5ubShuYW1lKSxcbiAgICAgICAgKTtcbiAgICAgIGlmIChmLmNyZWF0ZSAmJiBmLmV4Y2wpXG4gICAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgICAgIHJhaXNlX3VuaXgsXG4gICAgICAgICAgXCJFRVhJU1RcIixcbiAgICAgICAgICBcIm9wZW5cIixcbiAgICAgICAgICBcImZpbGUgYWxyZWFkeSBleGlzdHNcIixcbiAgICAgICAgICB0aGlzLm5tKG5hbWUpLFxuICAgICAgICApO1xuICAgICAgZmlsZSA9IHRoaXMuY29udGVudFtuYW1lXTtcbiAgICAgIGlmIChmLnRydW5jYXRlKSBmaWxlLnRydW5jYXRlKDApO1xuICAgIH0gZWxzZSBpZiAoZi5jcmVhdGUpIHtcbiAgICAgIHRoaXMuY3JlYXRlX2Rpcl9pZl9uZWVkZWQobmFtZSk7XG4gICAgICB0aGlzLmNvbnRlbnRbbmFtZV0gPSBuZXcgTWxGYWtlRmlsZShjYW1sX2NyZWF0ZV9ieXRlcygwKSk7XG4gICAgICBmaWxlID0gdGhpcy5jb250ZW50W25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZSh0aGlzLm5tKG5hbWUpLCByYWlzZV91bml4KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBNbEZha2VGZCh0aGlzLm5tKG5hbWUpLCBmaWxlLCBmKTtcbiAgfVxuXG4gIHRydW5jYXRlKG5hbWUsIGxlbiwgcmFpc2VfdW5peCkge1xuICAgIHZhciBmaWxlO1xuICAgIHRoaXMubG9va3VwKG5hbWUpO1xuICAgIGlmICh0aGlzLmNvbnRlbnRbbmFtZV0pIHtcbiAgICAgIGlmICh0aGlzLmlzX2RpcihuYW1lKSlcbiAgICAgICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IoXG4gICAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgICBcIkVJU0RJUlwiLFxuICAgICAgICAgIFwib3BlblwiLFxuICAgICAgICAgIFwiaWxsZWdhbCBvcGVyYXRpb24gb24gYSBkaXJlY3RvcnlcIixcbiAgICAgICAgICB0aGlzLm5tKG5hbWUpLFxuICAgICAgICApO1xuICAgICAgZmlsZSA9IHRoaXMuY29udGVudFtuYW1lXTtcbiAgICAgIGZpbGUudHJ1bmNhdGUobGVuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUodGhpcy5ubShuYW1lKSwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXIobmFtZSwgY29udGVudCkge1xuICAgIHZhciBmaWxlO1xuICAgIGlmICh0aGlzLmNvbnRlbnRbbmFtZV0pXG4gICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5tKG5hbWUpICsgXCIgOiBmaWxlIGFscmVhZHkgZXhpc3RzXCIpO1xuICAgIGlmIChjYW1sX2lzX21sX2J5dGVzKGNvbnRlbnQpKSBmaWxlID0gbmV3IE1sRmFrZUZpbGUoY29udGVudCk7XG4gICAgaWYgKGNhbWxfaXNfbWxfc3RyaW5nKGNvbnRlbnQpKVxuICAgICAgZmlsZSA9IG5ldyBNbEZha2VGaWxlKGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKGNvbnRlbnQpKTtcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbnRlbnQpKVxuICAgICAgZmlsZSA9IG5ldyBNbEZha2VGaWxlKGNhbWxfYnl0ZXNfb2ZfYXJyYXkoY29udGVudCkpO1xuICAgIGVsc2UgaWYgKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKVxuICAgICAgZmlsZSA9IG5ldyBNbEZha2VGaWxlKGNhbWxfYnl0ZXNfb2ZfanNieXRlcyhjb250ZW50KSk7XG4gICAgZWxzZSBpZiAoY29udGVudC50b1N0cmluZykge1xuICAgICAgdmFyIGJ5dGVzID0gY2FtbF9ieXRlc19vZl9zdHJpbmcoXG4gICAgICAgIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKGNvbnRlbnQudG9TdHJpbmcoKSksXG4gICAgICApO1xuICAgICAgZmlsZSA9IG5ldyBNbEZha2VGaWxlKGJ5dGVzKTtcbiAgICB9XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIHRoaXMuY3JlYXRlX2Rpcl9pZl9uZWVkZWQobmFtZSk7XG4gICAgICB0aGlzLmNvbnRlbnRbbmFtZV0gPSBmaWxlO1xuICAgIH0gZWxzZVxuICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXG4gICAgICAgIHRoaXMubm0obmFtZSkgKyBcIiA6IHJlZ2lzdGVyaW5nIGZpbGUgd2l0aCBpbnZhbGlkIGNvbnRlbnQgdHlwZVwiLFxuICAgICAgKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBNbEZha2VGaWxlXG4vL1JlcXVpcmVzOiBNbEZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfY3JlYXRlX2J5dGVzLCBjYW1sX21sX2J5dGVzX2xlbmd0aCwgY2FtbF9ibGl0X2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzLCBjYW1sX2J5dGVzX29mX3VpbnQ4X2FycmF5XG5jbGFzcyBNbEZha2VGaWxlIGV4dGVuZHMgTWxGaWxlIHtcbiAgY29uc3RydWN0b3IoY29udGVudCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5kYXRhID0gY29udGVudDtcbiAgfVxuXG4gIHRydW5jYXRlKGxlbikge1xuICAgIHZhciBvbGQgPSB0aGlzLmRhdGE7XG4gICAgdmFyIG9sZF9sZW4gPSBjYW1sX21sX2J5dGVzX2xlbmd0aChvbGQpO1xuICAgIHRoaXMuZGF0YSA9IGNhbWxfY3JlYXRlX2J5dGVzKGxlbiB8IDApO1xuICAgIGNhbWxfYmxpdF9ieXRlcyhvbGQsIDAsIHRoaXMuZGF0YSwgMCwgTWF0aC5taW4obGVuLCBvbGRfbGVuKSk7XG4gIH1cblxuICBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIGNhbWxfbWxfYnl0ZXNfbGVuZ3RoKHRoaXMuZGF0YSk7XG4gIH1cblxuICB3cml0ZShvZmZzZXQsIGJ1ZiwgcG9zLCBsZW4pIHtcbiAgICB2YXIgY2xlbiA9IHRoaXMubGVuZ3RoKCk7XG4gICAgaWYgKG9mZnNldCArIGxlbiA+PSBjbGVuKSB7XG4gICAgICB2YXIgbmV3X3N0ciA9IGNhbWxfY3JlYXRlX2J5dGVzKG9mZnNldCArIGxlbik7XG4gICAgICB2YXIgb2xkX2RhdGEgPSB0aGlzLmRhdGE7XG4gICAgICB0aGlzLmRhdGEgPSBuZXdfc3RyO1xuICAgICAgY2FtbF9ibGl0X2J5dGVzKG9sZF9kYXRhLCAwLCB0aGlzLmRhdGEsIDAsIGNsZW4pO1xuICAgIH1cbiAgICBjYW1sX2JsaXRfYnl0ZXMoXG4gICAgICBjYW1sX2J5dGVzX29mX3VpbnQ4X2FycmF5KGJ1ZiksXG4gICAgICBwb3MsXG4gICAgICB0aGlzLmRhdGEsXG4gICAgICBvZmZzZXQsXG4gICAgICBsZW4sXG4gICAgKTtcbiAgICByZXR1cm4gbGVuO1xuICB9XG5cbiAgcmVhZChvZmZzZXQsIGJ1ZiwgcG9zLCBsZW4pIHtcbiAgICB2YXIgY2xlbiA9IHRoaXMubGVuZ3RoKCk7XG4gICAgaWYgKG9mZnNldCArIGxlbiA+PSBjbGVuKSB7XG4gICAgICBsZW4gPSBjbGVuIC0gb2Zmc2V0O1xuICAgIH1cbiAgICBpZiAobGVuID4gMCkge1xuICAgICAgdmFyIGRhdGEgPSBjYW1sX2NyZWF0ZV9ieXRlcyhsZW4gfCAwKTtcbiAgICAgIGNhbWxfYmxpdF9ieXRlcyh0aGlzLmRhdGEsIG9mZnNldCwgZGF0YSwgMCwgbGVuKTtcbiAgICAgIGJ1Zi5zZXQoY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyhkYXRhKSwgcG9zKTtcbiAgICAgIHJldHVybiBsZW47XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IE1sRmFrZUZkX291dFxuLy9SZXF1aXJlczogTWxGYWtlRmlsZSwgY2FtbF9jcmVhdGVfYnl0ZXMsIGNhbWxfYmxpdF9ieXRlcywgY2FtbF9ieXRlc19vZl91aW50OF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3JcbmNsYXNzIE1sRmFrZUZkX291dCBleHRlbmRzIE1sRmFrZUZpbGUge1xuICBjb25zdHJ1Y3RvcihmZCwgZmxhZ3MpIHtcbiAgICBzdXBlcihjYW1sX2NyZWF0ZV9ieXRlcygwKSk7XG4gICAgdGhpcy5sb2cgPSBmdW5jdGlvbiAoX3MpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH07XG4gICAgaWYgKGZkID09PSAxICYmIHR5cGVvZiBjb25zb2xlLmxvZyA9PT0gXCJmdW5jdGlvblwiKSB0aGlzLmxvZyA9IGNvbnNvbGUubG9nO1xuICAgIGVsc2UgaWYgKGZkID09PSAyICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICB0aGlzLmxvZyA9IGNvbnNvbGUuZXJyb3I7XG4gICAgZWxzZSBpZiAodHlwZW9mIGNvbnNvbGUubG9nID09PSBcImZ1bmN0aW9uXCIpIHRoaXMubG9nID0gY29uc29sZS5sb2c7XG4gICAgdGhpcy5mbGFncyA9IGZsYWdzO1xuICB9XG5cbiAgbGVuZ3RoKCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdHJ1bmNhdGUoX2xlbiwgcmFpc2VfdW5peCkge1xuICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgcmFpc2VfdW5peCxcbiAgICAgIFwiRUlOVkFMXCIsXG4gICAgICBcImZ0cnVuY2F0ZVwiLFxuICAgICAgXCJpbnZhbGlkIGFyZ3VtZW50XCIsXG4gICAgKTtcbiAgfVxuXG4gIHdyaXRlKGJ1ZiwgcG9zLCBsZW4sIHJhaXNlX3VuaXgpIHtcbiAgICB2YXIgd3JpdHRlbiA9IGxlbjtcbiAgICBpZiAodGhpcy5sb2cpIHtcbiAgICAgIGlmIChcbiAgICAgICAgbGVuID4gMCAmJlxuICAgICAgICBwb3MgPj0gMCAmJlxuICAgICAgICBwb3MgKyBsZW4gPD0gYnVmLmxlbmd0aCAmJlxuICAgICAgICBidWZbcG9zICsgbGVuIC0gMV0gPT09IDEwXG4gICAgICApXG4gICAgICAgIGxlbi0tO1xuICAgICAgLy8gRG8gbm90IG91dHB1dCB0aGUgbGFzdCBcXG4gaWYgcHJlc2VudFxuICAgICAgLy8gYXMgY29uc29sZSBsb2dnaW5nIGRpc3BsYXkgYSBuZXdsaW5lIGF0IHRoZSBlbmRcbiAgICAgIHZhciBzcmMgPSBjYW1sX2NyZWF0ZV9ieXRlcyhsZW4pO1xuICAgICAgY2FtbF9ibGl0X2J5dGVzKGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXkoYnVmKSwgcG9zLCBzcmMsIDAsIGxlbik7XG4gICAgICB0aGlzLmxvZyhzcmMudG9VdGYxNigpKTtcbiAgICAgIHJldHVybiB3cml0dGVuO1xuICAgIH1cbiAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgIHJhaXNlX3VuaXgsXG4gICAgICBcIkVCQURGXCIsXG4gICAgICBcIndyaXRlXCIsXG4gICAgICBcImJhZCBmaWxlIGRlc2NyaXB0b3JcIixcbiAgICApO1xuICB9XG5cbiAgcmVhZChfYnVmLCBfcG9zLCBfbGVuLCByYWlzZV91bml4KSB7XG4gICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IocmFpc2VfdW5peCwgXCJFQkFERlwiLCBcInJlYWRcIiwgXCJiYWQgZmlsZSBkZXNjcmlwdG9yXCIpO1xuICB9XG5cbiAgc2VlayhfbGVuLCBfd2hlbmNlLCByYWlzZV91bml4KSB7XG4gICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IocmFpc2VfdW5peCwgXCJFU1BJUEVcIiwgXCJsc2Vla1wiLCBcImlsbGVnYWwgc2Vla1wiKTtcbiAgfVxuICBwb3MoKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5sb2cgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBjaGVja19zdHJlYW1fc2VtYW50aWNzKF9jbWQpIHt9XG59XG5cbi8vUHJvdmlkZXM6IE1sRmFrZUZkXG4vL1JlcXVpcmVzOiBNbEZha2VGaWxlXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvclxuY2xhc3MgTWxGYWtlRmQge1xuICBjb25zdHJ1Y3RvcihuYW1lLCBmaWxlLCBmbGFncykge1xuICAgIHRoaXMuZmlsZSA9IGZpbGU7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgIHRoaXMuc2Vla2VkID0gZmFsc2U7XG4gIH1cblxuICBlcnJfY2xvc2VkKGNtZCwgcmFpc2VfdW5peCkge1xuICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKHJhaXNlX3VuaXgsIFwiRUJBREZcIiwgY21kLCBcImJhZCBmaWxlIGRlc2NyaXB0b3JcIik7XG4gIH1cblxuICBsZW5ndGgoKSB7XG4gICAgaWYgKHRoaXMuZmlsZSkgcmV0dXJuIHRoaXMuZmlsZS5sZW5ndGgoKTtcbiAgICB0aGlzLmVycl9jbG9zZWQoXCJsZW5ndGhcIik7XG4gIH1cblxuICB0cnVuY2F0ZShsZW4sIHJhaXNlX3VuaXgpIHtcbiAgICBpZiAodGhpcy5maWxlKSB7XG4gICAgICBpZiAoISh0aGlzLmZsYWdzLndyb25seSB8fCB0aGlzLmZsYWdzLnJkd3IpKVxuICAgICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgICByYWlzZV91bml4LFxuICAgICAgICAgIFwiRUlOVkFMXCIsXG4gICAgICAgICAgXCJ0cnVuY2F0ZVwiLFxuICAgICAgICAgIFwiaW52YWxpZCBhcmd1bWVudFwiLFxuICAgICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZS50cnVuY2F0ZShsZW4pO1xuICAgIH1cbiAgICB0aGlzLmVycl9jbG9zZWQoXCJ0cnVuY2F0ZVwiLCByYWlzZV91bml4KTtcbiAgfVxuXG4gIHdyaXRlKGJ1ZiwgcG9zLCBsZW4sIHJhaXNlX3VuaXgpIHtcbiAgICBpZiAodGhpcy5maWxlICYmICh0aGlzLmZsYWdzLndyb25seSB8fCB0aGlzLmZsYWdzLnJkd3IpKSB7XG4gICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICBsZW4gPSB0aGlzLmZpbGUud3JpdGUob2Zmc2V0LCBidWYsIHBvcywgbGVuKTtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IGxlbjtcbiAgICAgIHJldHVybiBsZW47XG4gICAgfVxuICAgIHRoaXMuZXJyX2Nsb3NlZChcIndyaXRlXCIsIHJhaXNlX3VuaXgpO1xuICB9XG5cbiAgcmVhZChidWYsIHBvcywgbGVuLCByYWlzZV91bml4KSB7XG4gICAgaWYgKHRoaXMuZmlsZSAmJiAhdGhpcy5mbGFncy53cm9ubHkpIHtcbiAgICAgIHZhciBvZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgIGxlbiA9IHRoaXMuZmlsZS5yZWFkKG9mZnNldCwgYnVmLCBwb3MsIGxlbik7XG4gICAgICB0aGlzLm9mZnNldCArPSBsZW47XG4gICAgICByZXR1cm4gbGVuO1xuICAgIH1cbiAgICB0aGlzLmVycl9jbG9zZWQoXCJyZWFkXCIsIHJhaXNlX3VuaXgpO1xuICB9XG5cbiAgc2VlayhvZmZzZXQsIHdoZW5jZSwgcmFpc2VfdW5peCkge1xuICAgIHN3aXRjaCAod2hlbmNlKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBvZmZzZXQgKz0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBvZmZzZXQgKz0gdGhpcy5sZW5ndGgoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPCAwKVxuICAgICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IoXG4gICAgICAgIHJhaXNlX3VuaXgsXG4gICAgICAgIFwiRUlOVkFMXCIsXG4gICAgICAgIFwibHNlZWtcIixcbiAgICAgICAgXCJpbnZhbGlkIGFyZ3VtZW50XCIsXG4gICAgICApO1xuICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgIHRoaXMuc2Vla2VkID0gdHJ1ZTtcbiAgICByZXR1cm4gb2Zmc2V0O1xuICB9XG5cbiAgcG9zKCkge1xuICAgIHJldHVybiB0aGlzLm9mZnNldDtcbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIGlmICghdGhpcy5maWxlKSB0aGlzLmVycl9jbG9zZWQoXCJjbG9zZVwiKTtcbiAgICB0aGlzLmZpbGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBjaGVja19zdHJlYW1fc2VtYW50aWNzKGNtZCkge1xuICAgIGlmICghdGhpcy5maWxlKSByZXR1cm4gdGhpcy5lcnJfY2xvc2VkKGNtZCwgLyogcmFpc2UgVW5peF9lcnJvciAqLyAxKTtcbiAgfVxufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb2Zmc2V0XG52YXIgY2FtbF9pbnQ2NF9vZmZzZXQgPSBNYXRoLnBvdygyLCAtMjQpO1xuXG4vL1Byb3ZpZGVzOiBNbEludDY0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mZnNldCwgY2FtbF9yYWlzZV96ZXJvX2RpdmlkZVxuY2xhc3MgTWxJbnQ2NCB7XG4gIGNvbnN0cnVjdG9yKGxvLCBtaSwgaGkpIHtcbiAgICB0aGlzLmxvID0gbG8gJiAweGZmZmZmZjtcbiAgICB0aGlzLm1pID0gbWkgJiAweGZmZmZmZjtcbiAgICB0aGlzLmhpID0gaGkgJiAweGZmZmY7XG4gICAgdGhpcy5jYW1sX2N1c3RvbSA9IFwiX2pcIjtcbiAgfVxuXG4gIHN0YXRpYyBVTlNJR05FRF9NQVggPSBuZXcgTWxJbnQ2NCgweGZmZmZmZiwgMHhmZmZmZmYsIDB4ZmZmZik7XG4gIHN0YXRpYyBTSUdORURfTUFYID0gbmV3IE1sSW50NjQoMHhmZmZmZmYsIDB4ZmZmZmZmLCAweDdmZmYpO1xuICBzdGF0aWMgU0lHTkVEX01JTiA9IG5ldyBNbEludDY0KDB4MDAwMDAwLCAweDAwMDAwMCwgMHg4MDAwKTtcblxuICBzbGljZSgpIHtcbiAgICByZXR1cm4gbmV3IE1sSW50NjQodGhpcy5sbywgdGhpcy5taSwgdGhpcy5oaSk7XG4gIH1cblxuICB1Y29tcGFyZSh4KSB7XG4gICAgaWYgKHRoaXMuaGkgPiB4LmhpKSByZXR1cm4gMTtcbiAgICBpZiAodGhpcy5oaSA8IHguaGkpIHJldHVybiAtMTtcbiAgICBpZiAodGhpcy5taSA+IHgubWkpIHJldHVybiAxO1xuICAgIGlmICh0aGlzLm1pIDwgeC5taSkgcmV0dXJuIC0xO1xuICAgIGlmICh0aGlzLmxvID4geC5sbykgcmV0dXJuIDE7XG4gICAgaWYgKHRoaXMubG8gPCB4LmxvKSByZXR1cm4gLTE7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb21wYXJlKHgpIHtcbiAgICB2YXIgaGkgPSB0aGlzLmhpIDw8IDE2O1xuICAgIHZhciB4aGkgPSB4LmhpIDw8IDE2O1xuICAgIGlmIChoaSA+IHhoaSkgcmV0dXJuIDE7XG4gICAgaWYgKGhpIDwgeGhpKSByZXR1cm4gLTE7XG4gICAgaWYgKHRoaXMubWkgPiB4Lm1pKSByZXR1cm4gMTtcbiAgICBpZiAodGhpcy5taSA8IHgubWkpIHJldHVybiAtMTtcbiAgICBpZiAodGhpcy5sbyA+IHgubG8pIHJldHVybiAxO1xuICAgIGlmICh0aGlzLmxvIDwgeC5sbykgcmV0dXJuIC0xO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgbmVnKCkge1xuICAgIHZhciBsbyA9IC10aGlzLmxvO1xuICAgIHZhciBtaSA9IC10aGlzLm1pICsgKGxvID4+IDI0KTtcbiAgICB2YXIgaGkgPSAtdGhpcy5oaSArIChtaSA+PiAyNCk7XG4gICAgcmV0dXJuIG5ldyBNbEludDY0KGxvLCBtaSwgaGkpO1xuICB9XG5cbiAgYWRkKHgpIHtcbiAgICB2YXIgbG8gPSB0aGlzLmxvICsgeC5sbztcbiAgICB2YXIgbWkgPSB0aGlzLm1pICsgeC5taSArIChsbyA+PiAyNCk7XG4gICAgdmFyIGhpID0gdGhpcy5oaSArIHguaGkgKyAobWkgPj4gMjQpO1xuICAgIHJldHVybiBuZXcgTWxJbnQ2NChsbywgbWksIGhpKTtcbiAgfVxuXG4gIHN1Yih4KSB7XG4gICAgdmFyIGxvID0gdGhpcy5sbyAtIHgubG87XG4gICAgdmFyIG1pID0gdGhpcy5taSAtIHgubWkgKyAobG8gPj4gMjQpO1xuICAgIHZhciBoaSA9IHRoaXMuaGkgLSB4LmhpICsgKG1pID4+IDI0KTtcbiAgICByZXR1cm4gbmV3IE1sSW50NjQobG8sIG1pLCBoaSk7XG4gIH1cblxuICBtdWwoeCkge1xuICAgIHZhciBsbyA9IHRoaXMubG8gKiB4LmxvO1xuICAgIHZhciBtaSA9ICgobG8gKiBjYW1sX2ludDY0X29mZnNldCkgfCAwKSArIHRoaXMubWkgKiB4LmxvICsgdGhpcy5sbyAqIHgubWk7XG4gICAgdmFyIGhpID1cbiAgICAgICgobWkgKiBjYW1sX2ludDY0X29mZnNldCkgfCAwKSArXG4gICAgICB0aGlzLmhpICogeC5sbyArXG4gICAgICB0aGlzLm1pICogeC5taSArXG4gICAgICB0aGlzLmxvICogeC5oaTtcbiAgICByZXR1cm4gbmV3IE1sSW50NjQobG8sIG1pLCBoaSk7XG4gIH1cblxuICBpc1plcm8oKSB7XG4gICAgcmV0dXJuICh0aGlzLmxvIHwgdGhpcy5taSB8IHRoaXMuaGkpID09PSAwO1xuICB9XG5cbiAgaXNOZWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGkgPDwgMTYgPCAwO1xuICB9XG5cbiAgYW5kKHgpIHtcbiAgICByZXR1cm4gbmV3IE1sSW50NjQodGhpcy5sbyAmIHgubG8sIHRoaXMubWkgJiB4Lm1pLCB0aGlzLmhpICYgeC5oaSk7XG4gIH1cblxuICBvcih4KSB7XG4gICAgcmV0dXJuIG5ldyBNbEludDY0KHRoaXMubG8gfCB4LmxvLCB0aGlzLm1pIHwgeC5taSwgdGhpcy5oaSB8IHguaGkpO1xuICB9XG5cbiAgeG9yKHgpIHtcbiAgICByZXR1cm4gbmV3IE1sSW50NjQodGhpcy5sbyBeIHgubG8sIHRoaXMubWkgXiB4Lm1pLCB0aGlzLmhpIF4geC5oaSk7XG4gIH1cblxuICBzaGlmdF9sZWZ0KHMpIHtcbiAgICBzID0gcyAmIDYzO1xuICAgIGlmIChzID09PSAwKSByZXR1cm4gdGhpcztcbiAgICBpZiAocyA8IDI0KSB7XG4gICAgICByZXR1cm4gbmV3IE1sSW50NjQoXG4gICAgICAgIHRoaXMubG8gPDwgcyxcbiAgICAgICAgKHRoaXMubWkgPDwgcykgfCAodGhpcy5sbyA+PiAoMjQgLSBzKSksXG4gICAgICAgICh0aGlzLmhpIDw8IHMpIHwgKHRoaXMubWkgPj4gKDI0IC0gcykpLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHMgPCA0OClcbiAgICAgIHJldHVybiBuZXcgTWxJbnQ2NChcbiAgICAgICAgMCxcbiAgICAgICAgdGhpcy5sbyA8PCAocyAtIDI0KSxcbiAgICAgICAgKHRoaXMubWkgPDwgKHMgLSAyNCkpIHwgKHRoaXMubG8gPj4gKDQ4IC0gcykpLFxuICAgICAgKTtcbiAgICByZXR1cm4gbmV3IE1sSW50NjQoMCwgMCwgdGhpcy5sbyA8PCAocyAtIDQ4KSk7XG4gIH1cblxuICBzaGlmdF9yaWdodF91bnNpZ25lZChzKSB7XG4gICAgcyA9IHMgJiA2MztcbiAgICBpZiAocyA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gICAgaWYgKHMgPCAyNClcbiAgICAgIHJldHVybiBuZXcgTWxJbnQ2NChcbiAgICAgICAgKHRoaXMubG8gPj4gcykgfCAodGhpcy5taSA8PCAoMjQgLSBzKSksXG4gICAgICAgICh0aGlzLm1pID4+IHMpIHwgKHRoaXMuaGkgPDwgKDI0IC0gcykpLFxuICAgICAgICB0aGlzLmhpID4+IHMsXG4gICAgICApO1xuICAgIGlmIChzIDwgNDgpXG4gICAgICByZXR1cm4gbmV3IE1sSW50NjQoXG4gICAgICAgICh0aGlzLm1pID4+IChzIC0gMjQpKSB8ICh0aGlzLmhpIDw8ICg0OCAtIHMpKSxcbiAgICAgICAgdGhpcy5oaSA+PiAocyAtIDI0KSxcbiAgICAgICAgMCxcbiAgICAgICk7XG4gICAgcmV0dXJuIG5ldyBNbEludDY0KHRoaXMuaGkgPj4gKHMgLSA0OCksIDAsIDApO1xuICB9XG5cbiAgc2hpZnRfcmlnaHQocykge1xuICAgIHMgPSBzICYgNjM7XG4gICAgaWYgKHMgPT09IDApIHJldHVybiB0aGlzO1xuICAgIHZhciBoID0gKHRoaXMuaGkgPDwgMTYpID4+IDE2O1xuICAgIGlmIChzIDwgMjQpXG4gICAgICByZXR1cm4gbmV3IE1sSW50NjQoXG4gICAgICAgICh0aGlzLmxvID4+IHMpIHwgKHRoaXMubWkgPDwgKDI0IC0gcykpLFxuICAgICAgICAodGhpcy5taSA+PiBzKSB8IChoIDw8ICgyNCAtIHMpKSxcbiAgICAgICAgKCh0aGlzLmhpIDw8IDE2KSA+PiBzKSA+Pj4gMTYsXG4gICAgICApO1xuICAgIHZhciBzaWduID0gKHRoaXMuaGkgPDwgMTYpID4+IDMxO1xuICAgIGlmIChzIDwgNDgpXG4gICAgICByZXR1cm4gbmV3IE1sSW50NjQoXG4gICAgICAgICh0aGlzLm1pID4+IChzIC0gMjQpKSB8ICh0aGlzLmhpIDw8ICg0OCAtIHMpKSxcbiAgICAgICAgKCh0aGlzLmhpIDw8IDE2KSA+PiAocyAtIDI0KSkgPj4gMTYsXG4gICAgICAgIHNpZ24gJiAweGZmZmYsXG4gICAgICApO1xuICAgIHJldHVybiBuZXcgTWxJbnQ2NCgodGhpcy5oaSA8PCAxNikgPj4gKHMgLSAzMiksIHNpZ24sIHNpZ24pO1xuICB9XG5cbiAgbHNsMSgpIHtcbiAgICB0aGlzLmhpID0gKHRoaXMuaGkgPDwgMSkgfCAodGhpcy5taSA+PiAyMyk7XG4gICAgdGhpcy5taSA9ICgodGhpcy5taSA8PCAxKSB8ICh0aGlzLmxvID4+IDIzKSkgJiAweGZmZmZmZjtcbiAgICB0aGlzLmxvID0gKHRoaXMubG8gPDwgMSkgJiAweGZmZmZmZjtcbiAgfVxuXG4gIGxzcjEoKSB7XG4gICAgdGhpcy5sbyA9ICgodGhpcy5sbyA+Pj4gMSkgfCAodGhpcy5taSA8PCAyMykpICYgMHhmZmZmZmY7XG4gICAgdGhpcy5taSA9ICgodGhpcy5taSA+Pj4gMSkgfCAodGhpcy5oaSA8PCAyMykpICYgMHhmZmZmZmY7XG4gICAgdGhpcy5oaSA9IHRoaXMuaGkgPj4+IDE7XG4gIH1cblxuICB1ZGl2bW9kKHgpIHtcbiAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICB2YXIgbW9kdWx1cyA9IHRoaXMuc2xpY2UoKTtcbiAgICB2YXIgZGl2aXNvciA9IHguc2xpY2UoKTtcbiAgICB2YXIgcXVvdGllbnQgPSBuZXcgTWxJbnQ2NCgwLCAwLCAwKTtcbiAgICB3aGlsZSAobW9kdWx1cy51Y29tcGFyZShkaXZpc29yKSA+IDApIHtcbiAgICAgIG9mZnNldCsrO1xuICAgICAgZGl2aXNvci5sc2wxKCk7XG4gICAgfVxuICAgIHdoaWxlIChvZmZzZXQgPj0gMCkge1xuICAgICAgb2Zmc2V0LS07XG4gICAgICBxdW90aWVudC5sc2wxKCk7XG4gICAgICBpZiAobW9kdWx1cy51Y29tcGFyZShkaXZpc29yKSA+PSAwKSB7XG4gICAgICAgIHF1b3RpZW50LmxvKys7XG4gICAgICAgIG1vZHVsdXMgPSBtb2R1bHVzLnN1YihkaXZpc29yKTtcbiAgICAgIH1cbiAgICAgIGRpdmlzb3IubHNyMSgpO1xuICAgIH1cbiAgICByZXR1cm4geyBxdW90aWVudDogcXVvdGllbnQsIG1vZHVsdXM6IG1vZHVsdXMgfTtcbiAgfVxuXG4gIGRpdih5KSB7XG4gICAgdmFyIHggPSB0aGlzO1xuICAgIGlmICh5LmlzWmVybygpKSBjYW1sX3JhaXNlX3plcm9fZGl2aWRlKCk7XG4gICAgdmFyIHNpZ24gPSB4LmhpIF4geS5oaTtcbiAgICBpZiAoeC5oaSAmIDB4ODAwMCkgeCA9IHgubmVnKCk7XG4gICAgaWYgKHkuaGkgJiAweDgwMDApIHkgPSB5Lm5lZygpO1xuICAgIHZhciBxID0geC51ZGl2bW9kKHkpLnF1b3RpZW50O1xuICAgIGlmIChzaWduICYgMHg4MDAwKSBxID0gcS5uZWcoKTtcbiAgICByZXR1cm4gcTtcbiAgfVxuXG4gIG1vZCh5KSB7XG4gICAgdmFyIHggPSB0aGlzO1xuICAgIGlmICh5LmlzWmVybygpKSBjYW1sX3JhaXNlX3plcm9fZGl2aWRlKCk7XG4gICAgdmFyIHNpZ24gPSB4LmhpO1xuICAgIGlmICh4LmhpICYgMHg4MDAwKSB4ID0geC5uZWcoKTtcbiAgICBpZiAoeS5oaSAmIDB4ODAwMCkgeSA9IHkubmVnKCk7XG4gICAgdmFyIHIgPSB4LnVkaXZtb2QoeSkubW9kdWx1cztcbiAgICBpZiAoc2lnbiAmIDB4ODAwMCkgciA9IHIubmVnKCk7XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICB0b0ludCgpIHtcbiAgICByZXR1cm4gdGhpcy5sbyB8ICh0aGlzLm1pIDw8IDI0KTtcbiAgfVxuXG4gIHRvRmxvYXQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICh0aGlzLmhpIDw8IDE2KSAqIE1hdGgucG93KDIsIDMyKSArIHRoaXMubWkgKiBNYXRoLnBvdygyLCAyNCkgKyB0aGlzLmxvXG4gICAgKTtcbiAgfVxuXG4gIHRvQXJyYXkoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuaGkgPj4gOCxcbiAgICAgIHRoaXMuaGkgJiAweGZmLFxuICAgICAgdGhpcy5taSA+PiAxNixcbiAgICAgICh0aGlzLm1pID4+IDgpICYgMHhmZixcbiAgICAgIHRoaXMubWkgJiAweGZmLFxuICAgICAgdGhpcy5sbyA+PiAxNixcbiAgICAgICh0aGlzLmxvID4+IDgpICYgMHhmZixcbiAgICAgIHRoaXMubG8gJiAweGZmLFxuICAgIF07XG4gIH1cblxuICBsbzMyKCkge1xuICAgIHJldHVybiB0aGlzLmxvIHwgKCh0aGlzLm1pICYgMHhmZikgPDwgMjQpO1xuICB9XG5cbiAgaGkzMigpIHtcbiAgICByZXR1cm4gKCh0aGlzLm1pID4+PiA4KSAmIDB4ZmZmZikgfCAodGhpcy5oaSA8PCAxNik7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF91bHQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfdWx0KHgsIHkpIHtcbiAgcmV0dXJuIHgudWNvbXBhcmUoeSkgPCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2NvbXBhcmUgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfY29tcGFyZSh4LCB5LCBfdG90YWwpIHtcbiAgcmV0dXJuIHguY29tcGFyZSh5KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9uZWcgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfbmVnKHgpIHtcbiAgcmV0dXJuIHgubmVnKCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfYWRkIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2FkZCh4LCB5KSB7XG4gIHJldHVybiB4LmFkZCh5KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9zdWIgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfc3ViKHgsIHkpIHtcbiAgcmV0dXJuIHguc3ViKHkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X211bCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZmZzZXRcbmZ1bmN0aW9uIGNhbWxfaW50NjRfbXVsKHgsIHkpIHtcbiAgcmV0dXJuIHgubXVsKHkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2lzX3plcm8gY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfaXNfemVybyh4KSB7XG4gIHJldHVybiAreC5pc1plcm8oKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9pc19uZWdhdGl2ZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9pc19uZWdhdGl2ZSh4KSB7XG4gIHJldHVybiAreC5pc05lZygpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2FuZCBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9hbmQoeCwgeSkge1xuICByZXR1cm4geC5hbmQoeSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb3IgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfb3IoeCwgeSkge1xuICByZXR1cm4geC5vcih5KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF94b3IgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfeG9yKHgsIHkpIHtcbiAgcmV0dXJuIHgueG9yKHkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3NoaWZ0X2xlZnQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfc2hpZnRfbGVmdCh4LCBzKSB7XG4gIHJldHVybiB4LnNoaWZ0X2xlZnQocyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQoeCwgcykge1xuICByZXR1cm4geC5zaGlmdF9yaWdodF91bnNpZ25lZChzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9zaGlmdF9yaWdodCBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9zaGlmdF9yaWdodCh4LCBzKSB7XG4gIHJldHVybiB4LnNoaWZ0X3JpZ2h0KHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2RpdlxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9kaXYoeCwgeSkge1xuICByZXR1cm4geC5kaXYoeSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfbW9kXG5mdW5jdGlvbiBjYW1sX2ludDY0X21vZCh4LCB5KSB7XG4gIHJldHVybiB4Lm1vZCh5KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9vZl9pbnQzMiBjb25zdFxuLy9SZXF1aXJlczogTWxJbnQ2NFxuLy9BbGlhczogY2FtbF9pbnQ2NF9vZl9pbnRcbi8vQWxpYXM6IGNhbWxfaW50NjRfb2ZfbmF0aXZlaW50XG5mdW5jdGlvbiBjYW1sX2ludDY0X29mX2ludDMyKHgpIHtcbiAgcmV0dXJuIG5ldyBNbEludDY0KHggJiAweGZmZmZmZiwgKHggPj4gMjQpICYgMHhmZmZmZmYsICh4ID4+IDMxKSAmIDB4ZmZmZik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfdG9faW50MzIgY29uc3Rcbi8vQWxpYXM6IGNhbWxfaW50NjRfdG9faW50XG4vL0FsaWFzOiBjYW1sX2ludDY0X3RvX25hdGl2ZWludFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF90b19pbnQzMih4KSB7XG4gIHJldHVybiB4LnRvSW50KCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfdG9fZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfdG9fZmxvYXQoeCkge1xuICByZXR1cm4geC50b0Zsb2F0KCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb2ZfZmxvYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2Zmc2V0LCBNbEludDY0XG5mdW5jdGlvbiBjYW1sX2ludDY0X29mX2Zsb2F0KHgpIHtcbiAgaWYgKHggPCAwKSB4ID0gTWF0aC5jZWlsKHgpO1xuICByZXR1cm4gbmV3IE1sSW50NjQoXG4gICAgeCAmIDB4ZmZmZmZmLFxuICAgIE1hdGguZmxvb3IoeCAqIGNhbWxfaW50NjRfb2Zmc2V0KSAmIDB4ZmZmZmZmLFxuICAgIE1hdGguZmxvb3IoeCAqIGNhbWxfaW50NjRfb2Zmc2V0ICogY2FtbF9pbnQ2NF9vZmZzZXQpICYgMHhmZmZmLFxuICApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2Zvcm1hdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9wYXJzZV9mb3JtYXQsIGNhbWxfZmluaXNoX2Zvcm1hdHRpbmdcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfaXNfbmVnYXRpdmUsIGNhbWxfaW50NjRfbmVnXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2ludDMyLCBjYW1sX2ludDY0X3RvX2ludDMyXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2lzX3plcm8sIGNhbWxfc3RyX3JlcGVhdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9mb3JtYXQoZm10LCB4KSB7XG4gIHZhciBmID0gY2FtbF9wYXJzZV9mb3JtYXQoZm10KTtcbiAgaWYgKGYuc2lnbmVkY29udiAmJiBjYW1sX2ludDY0X2lzX25lZ2F0aXZlKHgpKSB7XG4gICAgZi5zaWduID0gLTE7XG4gICAgeCA9IGNhbWxfaW50NjRfbmVnKHgpO1xuICB9XG4gIHZhciBidWZmZXIgPSBcIlwiO1xuICB2YXIgd2Jhc2UgPSBjYW1sX2ludDY0X29mX2ludDMyKGYuYmFzZSk7XG4gIHZhciBjdnRibCA9IFwiMDEyMzQ1Njc4OWFiY2RlZlwiO1xuICBkbyB7XG4gICAgdmFyIHAgPSB4LnVkaXZtb2Qod2Jhc2UpO1xuICAgIHggPSBwLnF1b3RpZW50O1xuICAgIGJ1ZmZlciA9IGN2dGJsLmNoYXJBdChjYW1sX2ludDY0X3RvX2ludDMyKHAubW9kdWx1cykpICsgYnVmZmVyO1xuICB9IHdoaWxlICghY2FtbF9pbnQ2NF9pc196ZXJvKHgpKTtcbiAgaWYgKGYucHJlYyA+PSAwKSB7XG4gICAgZi5maWxsZXIgPSBcIiBcIjtcbiAgICB2YXIgbiA9IGYucHJlYyAtIGJ1ZmZlci5sZW5ndGg7XG4gICAgaWYgKG4gPiAwKSBidWZmZXIgPSBjYW1sX3N0cl9yZXBlYXQobiwgXCIwXCIpICsgYnVmZmVyO1xuICB9XG4gIHJldHVybiBjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nKGYsIGJ1ZmZlcik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3BhcnNlX3NpZ25fYW5kX2Jhc2UsIGNhbWxfZmFpbHdpdGgsIGNhbWxfcGFyc2VfZGlnaXRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfaW50MzIsIGNhbWxfaW50NjRfdWx0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2FkZCwgY2FtbF9pbnQ2NF9tdWwsIGNhbWxfaW50NjRfbmVnXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGgsY2FtbF9zdHJpbmdfdW5zYWZlX2dldCwgTWxJbnQ2NFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9vZl9zdHJpbmcocykge1xuICB2YXIgciA9IGNhbWxfcGFyc2Vfc2lnbl9hbmRfYmFzZShzKTtcbiAgdmFyIGkgPSByWzBdLFxuICAgIHNpZ24gPSByWzFdLFxuICAgIGJhc2UgPSByWzJdLFxuICAgIHNpZ25lZG5lc3MgPSByWzNdO1xuICB2YXIgYmFzZTY0ID0gY2FtbF9pbnQ2NF9vZl9pbnQzMihiYXNlKTtcbiAgdmFyIHRocmVzaG9sZCA9IE1sSW50NjQuVU5TSUdORURfTUFYLnVkaXZtb2QoYmFzZTY0KS5xdW90aWVudDtcbiAgdmFyIGMgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkpO1xuICB2YXIgZCA9IGNhbWxfcGFyc2VfZGlnaXQoYyk7XG4gIGlmIChkIDwgMCB8fCBkID49IGJhc2UpIGNhbWxfZmFpbHdpdGgoXCJJbnQ2NC5vZl9zdHJpbmdcIik7XG4gIHZhciByZXMgPSBjYW1sX2ludDY0X29mX2ludDMyKGQpO1xuICBmb3IgKDs7KSB7XG4gICAgaSsrO1xuICAgIGMgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkpO1xuICAgIGlmIChjID09PSA5NSkgY29udGludWU7XG4gICAgZCA9IGNhbWxfcGFyc2VfZGlnaXQoYyk7XG4gICAgaWYgKGQgPCAwIHx8IGQgPj0gYmFzZSkgYnJlYWs7XG4gICAgLyogRGV0ZWN0IG92ZXJmbG93IGluIG11bHRpcGxpY2F0aW9uIGJhc2UgKiByZXMgKi9cbiAgICBpZiAoY2FtbF9pbnQ2NF91bHQodGhyZXNob2xkLCByZXMpKSBjYW1sX2ZhaWx3aXRoKFwiSW50NjQub2Zfc3RyaW5nXCIpO1xuICAgIGQgPSBjYW1sX2ludDY0X29mX2ludDMyKGQpO1xuICAgIHJlcyA9IGNhbWxfaW50NjRfYWRkKGNhbWxfaW50NjRfbXVsKGJhc2U2NCwgcmVzKSwgZCk7XG4gICAgLyogRGV0ZWN0IG92ZXJmbG93IGluIGFkZGl0aW9uIChiYXNlICogcmVzKSArIGQgKi9cbiAgICBpZiAoY2FtbF9pbnQ2NF91bHQocmVzLCBkKSkgY2FtbF9mYWlsd2l0aChcIkludDY0Lm9mX3N0cmluZ1wiKTtcbiAgfVxuICBpZiAoaSAhPT0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKSBjYW1sX2ZhaWx3aXRoKFwiSW50NjQub2Zfc3RyaW5nXCIpO1xuICBpZiAoXG4gICAgc2lnbmVkbmVzcyAmJlxuICAgIGNhbWxfaW50NjRfdWx0KHNpZ24gPCAwID8gTWxJbnQ2NC5TSUdORURfTUlOIDogTWxJbnQ2NC5TSUdORURfTUFYLCByZXMpXG4gIClcbiAgICBjYW1sX2ZhaWx3aXRoKFwiSW50NjQub2Zfc3RyaW5nXCIpO1xuICBpZiAoc2lnbiA8IDApIHJlcyA9IGNhbWxfaW50NjRfbmVnKHJlcyk7XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpIGNvbnN0XG4vL1JlcXVpcmVzOiBNbEludDY0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaShsbywgbWksIGhpKSB7XG4gIHJldHVybiBuZXcgTWxJbnQ2NChsbywgbWksIGhpKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfY3JlYXRlX2xvX2hpIGNvbnN0XG4vL1JlcXVpcmVzOiBNbEludDY0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2NyZWF0ZV9sb19oaShsbywgaGkpIHtcbiAgcmV0dXJuIG5ldyBNbEludDY0KFxuICAgIGxvICYgMHhmZmZmZmYsXG4gICAgKChsbyA+Pj4gMjQpICYgMHhmZikgfCAoKGhpICYgMHhmZmZmKSA8PCA4KSxcbiAgICAoaGkgPj4+IDE2KSAmIDB4ZmZmZixcbiAgKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfbG8zMiBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9sbzMyKHYpIHtcbiAgcmV0dXJuIHYubG8zMigpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2hpMzIgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfaGkzMih2KSB7XG4gIHJldHVybiB2LmhpMzIoKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9vZl9ieXRlcyBjb25zdFxuLy9SZXF1aXJlczogTWxJbnQ2NFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9vZl9ieXRlcyhhKSB7XG4gIHJldHVybiBuZXcgTWxJbnQ2NChcbiAgICAoYVs3XSA8PCAwKSB8IChhWzZdIDw8IDgpIHwgKGFbNV0gPDwgMTYpLFxuICAgIChhWzRdIDw8IDApIHwgKGFbM10gPDwgOCkgfCAoYVsyXSA8PCAxNiksXG4gICAgKGFbMV0gPDwgMCkgfCAoYVswXSA8PCA4KSxcbiAgKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfdG9fYnl0ZXMgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfdG9fYnl0ZXMoeCkge1xuICByZXR1cm4geC50b0FycmF5KCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfaGFzaCBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9oYXNoKHYpIHtcbiAgcmV0dXJuIHYubG8zMigpIF4gdi5oaTMyKCk7XG59XG4iLCIvL1Byb3ZpZGVzOiBNbE11dGV4XG5jbGFzcyBNbE11dGV4IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5sb2NrZWQgPSBmYWxzZTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX211dGV4X25ld1xuLy9SZXF1aXJlczogTWxNdXRleFxuZnVuY3Rpb24gY2FtbF9tbF9tdXRleF9uZXcoX3VuaXQpIHtcbiAgcmV0dXJuIG5ldyBNbE11dGV4KCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfbXV0ZXhfbG9ja1xuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9tbF9tdXRleF9sb2NrKHQpIHtcbiAgaWYgKHQubG9ja2VkKSBjYW1sX2ZhaWx3aXRoKFwiTXV0ZXgubG9jazogbXV0ZXggYWxyZWFkeSBsb2NrZWQuIENhbm5vdCB3YWl0LlwiKTtcbiAgZWxzZSB0LmxvY2tlZCA9IHRydWU7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX211dGV4X3RyeV9sb2NrXG5mdW5jdGlvbiBjYW1sX21sX211dGV4X3RyeV9sb2NrKHQpIHtcbiAgaWYgKCF0LmxvY2tlZCkge1xuICAgIHQubG9ja2VkID0gdHJ1ZTtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9tdXRleF91bmxvY2tcbmZ1bmN0aW9uIGNhbWxfbWxfbXV0ZXhfdW5sb2NrKHQpIHtcbiAgdC5sb2NrZWQgPSBmYWxzZTtcbiAgcmV0dXJuIDA7XG59XG4iLCIvL1Byb3ZpZGVzOiBpbml0aWFsaXplX25hdFxuLy9SZXF1aXJlczogY2FtbF9jdXN0b21fb3BzXG4vL1JlcXVpcmVzOiBzZXJpYWxpemVfbmF0LCBkZXNlcmlhbGl6ZV9uYXQsIGNhbWxfaGFzaF9uYXRcbmZ1bmN0aW9uIGluaXRpYWxpemVfbmF0KCkge1xuICBjYW1sX2N1c3RvbV9vcHMuX25hdCA9IHtcbiAgICBkZXNlcmlhbGl6ZTogZGVzZXJpYWxpemVfbmF0LFxuICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplX25hdCxcbiAgICBoYXNoOiBjYW1sX2hhc2hfbmF0LFxuICB9O1xufVxuXG4vL1Byb3ZpZGVzOiBNbE5hdFxuY2xhc3MgTWxOYXQge1xuICBjb25zdHJ1Y3Rvcih4KSB7XG4gICAgdGhpcy5kYXRhID0gbmV3IEludDMyQXJyYXkoeCk7XG4gICAgLy8gRm9yIG51bSA8IDEuNVxuICAgIC8vIGxlbmd0aF9uYXQgaXNuJ3QgZXh0ZXJuYWwsIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGUgT2JqLnNpemVcbiAgICAvLyB3b3JrIG91dCByaWdodC5cbiAgICAvLyBXZSBhZGQgKzIgdG8gdGhlIGFycmF5IGxlbmd0aDpcbiAgICAvLyAtICsxIGZvciB0aGUgdGFnXG4gICAgLy8gLSArMSBmb3IgdGhlIGN1c3RvbV9vcHMgc2xvdFxuICAgIHRoaXMubGVuZ3RoID0gdGhpcy5kYXRhLmxlbmd0aCArIDI7XG4gICAgdGhpcy5jYW1sX2N1c3RvbSA9IFwiX25hdFwiO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9uYXRcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfaW50LCBudW1fZGlnaXRzX25hdFxuZnVuY3Rpb24gY2FtbF9oYXNoX25hdCh4KSB7XG4gIHZhciBsZW4gPSBudW1fZGlnaXRzX25hdCh4LCAwLCB4LmRhdGEubGVuZ3RoKTtcbiAgdmFyIGggPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHguZGF0YVtpXSk7XG4gIH1cbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGxlbmd0aF9uYXRcbmZ1bmN0aW9uIGxlbmd0aF9uYXQoeCkge1xuICByZXR1cm4geC5kYXRhLmxlbmd0aDtcbn1cblxuLy9Qcm92aWRlczogbmF0X29mX2FycmF5XG4vL1JlcXVpcmVzOiBNbE5hdFxuZnVuY3Rpb24gbmF0X29mX2FycmF5KGwpIHtcbiAgcmV0dXJuIG5ldyBNbE5hdChsKTtcbn1cblxuLy9Qcm92aWRlczogY3JlYXRlX25hdFxuLy9SZXF1aXJlczogTWxOYXRcbmZ1bmN0aW9uIGNyZWF0ZV9uYXQoc2l6ZSkge1xuICB2YXIgYXJyID0gbmV3IE1sTmF0KHNpemUpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgIGFyci5kYXRhW2ldID0gLTE7XG4gIH1cbiAgcmV0dXJuIGFycjtcbn1cblxuLy9Qcm92aWRlczogc2V0X3RvX3plcm9fbmF0XG5mdW5jdGlvbiBzZXRfdG9femVyb19uYXQobmF0LCBvZnMsIGxlbikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgbmF0LmRhdGFbb2ZzICsgaV0gPSAwO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBibGl0X25hdFxuZnVuY3Rpb24gYmxpdF9uYXQobmF0MSwgb2ZzMSwgbmF0Miwgb2ZzMiwgbGVuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBuYXQxLmRhdGFbb2ZzMSArIGldID0gbmF0Mi5kYXRhW29mczIgKyBpXTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogc2V0X2RpZ2l0X25hdFxuZnVuY3Rpb24gc2V0X2RpZ2l0X25hdChuYXQsIG9mcywgZGlnaXQpIHtcbiAgbmF0LmRhdGFbb2ZzXSA9IGRpZ2l0O1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogbnRoX2RpZ2l0X25hdFxuZnVuY3Rpb24gbnRoX2RpZ2l0X25hdChuYXQsIG9mcykge1xuICByZXR1cm4gbmF0LmRhdGFbb2ZzXTtcbn1cblxuLy9Qcm92aWRlczogc2V0X2RpZ2l0X25hdF9uYXRpdmVcbmZ1bmN0aW9uIHNldF9kaWdpdF9uYXRfbmF0aXZlKG5hdCwgb2ZzLCBkaWdpdCkge1xuICBuYXQuZGF0YVtvZnNdID0gZGlnaXQ7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBudGhfZGlnaXRfbmF0X25hdGl2ZVxuZnVuY3Rpb24gbnRoX2RpZ2l0X25hdF9uYXRpdmUobmF0LCBvZnMpIHtcbiAgcmV0dXJuIG5hdC5kYXRhW29mc107XG59XG5cbi8vUHJvdmlkZXM6IG51bV9kaWdpdHNfbmF0XG5mdW5jdGlvbiBudW1fZGlnaXRzX25hdChuYXQsIG9mcywgbGVuKSB7XG4gIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChuYXQuZGF0YVtvZnMgKyBpXSAhPT0gMCkgcmV0dXJuIGkgKyAxO1xuICB9XG4gIHJldHVybiAxOyAvLyAwIGNvdW50cyBhcyAxIGRpZ2l0XG59XG5cbi8vUHJvdmlkZXM6IG51bV9sZWFkaW5nX3plcm9fYml0c19pbl9kaWdpdFxuZnVuY3Rpb24gbnVtX2xlYWRpbmdfemVyb19iaXRzX2luX2RpZ2l0KG5hdCwgb2ZzKSB7XG4gIHZhciBhID0gbmF0LmRhdGFbb2ZzXTtcbiAgdmFyIGIgPSAwO1xuICBpZiAoYSAmIDB4ZmZmZjAwMDApIHtcbiAgICBiICs9IDE2O1xuICAgIGEgPj4+PSAxNjtcbiAgfVxuICBpZiAoYSAmIDB4ZmYwMCkge1xuICAgIGIgKz0gODtcbiAgICBhID4+Pj0gODtcbiAgfVxuICBpZiAoYSAmIDB4ZjApIHtcbiAgICBiICs9IDQ7XG4gICAgYSA+Pj49IDQ7XG4gIH1cbiAgaWYgKGEgJiAxMikge1xuICAgIGIgKz0gMjtcbiAgICBhID4+Pj0gMjtcbiAgfVxuICBpZiAoYSAmIDIpIHtcbiAgICBiICs9IDE7XG4gICAgYSA+Pj49IDE7XG4gIH1cbiAgaWYgKGEgJiAxKSB7XG4gICAgYiArPSAxO1xuICB9XG4gIHJldHVybiAzMiAtIGI7XG59XG5cbi8vUHJvdmlkZXM6IGlzX2RpZ2l0X2ludFxuZnVuY3Rpb24gaXNfZGlnaXRfaW50KG5hdCwgb2ZzKSB7XG4gIGlmIChuYXQuZGF0YVtvZnNdID49IDApIHJldHVybiAxO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogaXNfZGlnaXRfemVyb1xuZnVuY3Rpb24gaXNfZGlnaXRfemVybyhuYXQsIG9mcykge1xuICBpZiAobmF0LmRhdGFbb2ZzXSA9PT0gMCkgcmV0dXJuIDE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBpc19kaWdpdF9ub3JtYWxpemVkXG5mdW5jdGlvbiBpc19kaWdpdF9ub3JtYWxpemVkKF9uYXQsIF9vZnMpIHtcbiAgcmV0dXJuIDE7XG59XG5cbi8vUHJvdmlkZXM6IGlzX2RpZ2l0X29kZFxuZnVuY3Rpb24gaXNfZGlnaXRfb2RkKG5hdCwgb2ZzKSB7XG4gIGlmIChuYXQuZGF0YVtvZnNdICYgMSkgcmV0dXJuIDE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBpbmNyX25hdFxuZnVuY3Rpb24gaW5jcl9uYXQobmF0LCBvZnMsIGxlbiwgY2FycnlfaW4pIHtcbiAgdmFyIGNhcnJ5ID0gY2FycnlfaW47XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgeCA9IChuYXQuZGF0YVtvZnMgKyBpXSA+Pj4gMCkgKyBjYXJyeTtcbiAgICBuYXQuZGF0YVtvZnMgKyBpXSA9IHggfCAwO1xuICAgIGlmICh4ID09PSB4ID4+PiAwKSB7XG4gICAgICBjYXJyeSA9IDA7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgY2FycnkgPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2Fycnk7XG59XG5cbi8vIGxlbjEgPj0gbGVuMlxuLy9Qcm92aWRlczogYWRkX25hdFxuLy9SZXF1aXJlczogaW5jcl9uYXRcbmZ1bmN0aW9uIGFkZF9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMiwgY2FycnlfaW4pIHtcbiAgdmFyIGNhcnJ5ID0gY2FycnlfaW47XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuMjsgaSsrKSB7XG4gICAgdmFyIHggPSAobmF0MS5kYXRhW29mczEgKyBpXSA+Pj4gMCkgKyAobmF0Mi5kYXRhW29mczIgKyBpXSA+Pj4gMCkgKyBjYXJyeTtcbiAgICBuYXQxLmRhdGFbb2ZzMSArIGldID0geDtcbiAgICBpZiAoeCA9PT0geCA+Pj4gMCkge1xuICAgICAgY2FycnkgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYXJyeSA9IDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmNyX25hdChuYXQxLCBvZnMxICsgbGVuMiwgbGVuMSAtIGxlbjIsIGNhcnJ5KTtcbn1cblxuLy9Qcm92aWRlczogY29tcGxlbWVudF9uYXRcbmZ1bmN0aW9uIGNvbXBsZW1lbnRfbmF0KG5hdCwgb2ZzLCBsZW4pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIG5hdC5kYXRhW29mcyArIGldID0gKC0xID4+PiAwKSAtIChuYXQuZGF0YVtvZnMgKyBpXSA+Pj4gMCk7XG4gIH1cbn1cblxuLy8gb2NhbWwgZmxpcHMgY2FycnlfaW5cbi8vUHJvdmlkZXM6IGRlY3JfbmF0XG5mdW5jdGlvbiBkZWNyX25hdChuYXQsIG9mcywgbGVuLCBjYXJyeV9pbikge1xuICB2YXIgYm9ycm93ID0gY2FycnlfaW4gPT09IDEgPyAwIDogMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciB4ID0gKG5hdC5kYXRhW29mcyArIGldID4+PiAwKSAtIGJvcnJvdztcbiAgICBuYXQuZGF0YVtvZnMgKyBpXSA9IHg7XG4gICAgaWYgKHggPj0gMCkge1xuICAgICAgYm9ycm93ID0gMDtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBib3Jyb3cgPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYm9ycm93ID09PSAxID8gMCA6IDE7XG59XG5cbi8vIG9jYW1sIGZsaXBzIGNhcnJ5X2luXG4vLyBsZW4xID49IGxlbjJcbi8vUHJvdmlkZXM6IHN1Yl9uYXRcbi8vUmVxdWlyZXM6IGRlY3JfbmF0XG5mdW5jdGlvbiBzdWJfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIGxlbjIsIGNhcnJ5X2luKSB7XG4gIHZhciBib3Jyb3cgPSBjYXJyeV9pbiA9PT0gMSA/IDAgOiAxO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjI7IGkrKykge1xuICAgIHZhciB4ID0gKG5hdDEuZGF0YVtvZnMxICsgaV0gPj4+IDApIC0gKG5hdDIuZGF0YVtvZnMyICsgaV0gPj4+IDApIC0gYm9ycm93O1xuICAgIG5hdDEuZGF0YVtvZnMxICsgaV0gPSB4O1xuICAgIGlmICh4ID49IDApIHtcbiAgICAgIGJvcnJvdyA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvcnJvdyA9IDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWNyX25hdChuYXQxLCBvZnMxICsgbGVuMiwgbGVuMSAtIGxlbjIsIGJvcnJvdyA9PT0gMSA/IDAgOiAxKTtcbn1cblxuLy8gbmF0MSArPSBuYXQyICogbmF0M1tvZnMzXVxuLy8gbGVuMSA+PSBsZW4yXG4vL1Byb3ZpZGVzOiBtdWx0X2RpZ2l0X25hdFxuLy9SZXF1aXJlczogYWRkX25hdCwgbmF0X29mX2FycmF5XG5mdW5jdGlvbiBtdWx0X2RpZ2l0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBsZW4yLCBuYXQzLCBvZnMzKSB7XG4gIHZhciBjYXJyeSA9IDA7XG4gIHZhciBhID0gbmF0My5kYXRhW29mczNdID4+PiAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjI7IGkrKykge1xuICAgIHZhciB4MSA9XG4gICAgICAobmF0MS5kYXRhW29mczEgKyBpXSA+Pj4gMCkgK1xuICAgICAgKG5hdDIuZGF0YVtvZnMyICsgaV0gPj4+IDApICogKGEgJiAweDAwMDBmZmZmKSArXG4gICAgICBjYXJyeTtcbiAgICB2YXIgeDIgPSAobmF0Mi5kYXRhW29mczIgKyBpXSA+Pj4gMCkgKiAoYSA+Pj4gMTYpO1xuICAgIGNhcnJ5ID0gTWF0aC5mbG9vcih4MiAvIDY1NTM2KTtcbiAgICB2YXIgeDMgPSB4MSArICh4MiAlIDY1NTM2KSAqIDY1NTM2O1xuICAgIG5hdDEuZGF0YVtvZnMxICsgaV0gPSB4MztcbiAgICBjYXJyeSArPSBNYXRoLmZsb29yKHgzIC8gNDI5NDk2NzI5Nik7XG4gIH1cblxuICBpZiAobGVuMiA8IGxlbjEgJiYgY2FycnkpIHtcbiAgICByZXR1cm4gYWRkX25hdChcbiAgICAgIG5hdDEsXG4gICAgICBvZnMxICsgbGVuMixcbiAgICAgIGxlbjEgLSBsZW4yLFxuICAgICAgbmF0X29mX2FycmF5KFtjYXJyeV0pLFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICAwLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNhcnJ5O1xuICB9XG59XG5cbi8vIG5hdDEgKz0gbmF0MiAqIG5hdDNcbi8vIGxlbjEgPj0gbGVuMiArIGxlbjMuXG4vL1Byb3ZpZGVzOiBtdWx0X25hdFxuLy9SZXF1aXJlczogbXVsdF9kaWdpdF9uYXRcbmZ1bmN0aW9uIG11bHRfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIGxlbjIsIG5hdDMsIG9mczMsIGxlbjMpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW4zOyBpKyspIHtcbiAgICBjYXJyeSArPSBtdWx0X2RpZ2l0X25hdChcbiAgICAgIG5hdDEsXG4gICAgICBvZnMxICsgaSxcbiAgICAgIGxlbjEgLSBpLFxuICAgICAgbmF0MixcbiAgICAgIG9mczIsXG4gICAgICBsZW4yLFxuICAgICAgbmF0MyxcbiAgICAgIG9mczMgKyBpLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNhcnJ5O1xufVxuXG4vLyBuYXQxID0gMiAqIG5hdDEgKyBuYXQyICogbmF0MlxuLy8gbGVuMSA+PSAyICogbGVuMlxuLy9Qcm92aWRlczogc3F1YXJlX25hdFxuLy9SZXF1aXJlczogbXVsdF9uYXQsIGFkZF9uYXRcbmZ1bmN0aW9uIHNxdWFyZV9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMikge1xuICB2YXIgY2FycnkgPSAwO1xuICBjYXJyeSArPSBhZGRfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDEsIG9mczEsIGxlbjEsIDApO1xuICBjYXJyeSArPSBtdWx0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBsZW4yLCBuYXQyLCBvZnMyLCBsZW4yKTtcbiAgcmV0dXJuIGNhcnJ5O1xufVxuXG4vLyAwIDw9IHNoaWZ0IDwgMzJcbi8vUHJvdmlkZXM6IHNoaWZ0X2xlZnRfbmF0XG5mdW5jdGlvbiBzaGlmdF9sZWZ0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBuYml0cykge1xuICBpZiAobmJpdHMgPT09IDApIHtcbiAgICBuYXQyLmRhdGFbb2ZzMl0gPSAwO1xuICAgIHJldHVybiAwO1xuICB9XG4gIHZhciB3cmFwID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW4xOyBpKyspIHtcbiAgICB2YXIgYSA9IG5hdDEuZGF0YVtvZnMxICsgaV0gPj4+IDA7XG4gICAgbmF0MS5kYXRhW29mczEgKyBpXSA9IChhIDw8IG5iaXRzKSB8IHdyYXA7XG4gICAgd3JhcCA9IGEgPj4+ICgzMiAtIG5iaXRzKTtcbiAgfVxuICBuYXQyLmRhdGFbb2ZzMl0gPSB3cmFwO1xuICByZXR1cm4gMDtcbn1cblxuLy8gQXNzdW1pbmcgYyA+IGEsIHJldHVybnMgW3F1b3RpZW50LCByZW1haW5kZXJdIG9mIChhPDwzMiArIGIpL2Ncbi8vUHJvdmlkZXM6IGRpdl9oZWxwZXJcbmZ1bmN0aW9uIGRpdl9oZWxwZXIoYSwgYiwgYykge1xuICB2YXIgeCA9IGEgKiA2NTUzNiArIChiID4+PiAxNik7XG4gIHZhciB5ID0gTWF0aC5mbG9vcih4IC8gYykgKiA2NTUzNjtcbiAgdmFyIHogPSAoeCAlIGMpICogNjU1MzY7XG4gIHZhciB3ID0geiArIChiICYgMHgwMDAwZmZmZik7XG4gIHJldHVybiBbeSArIE1hdGguZmxvb3IodyAvIGMpLCB3ICUgY107XG59XG5cbi8vIG5hdDFbb2ZzMStsZW5dIDwgbmF0MltvZnMyXVxuLy9Qcm92aWRlczogZGl2X2RpZ2l0X25hdFxuLy9SZXF1aXJlczogZGl2X2hlbHBlclxuZnVuY3Rpb24gZGl2X2RpZ2l0X25hdChuYXRxLCBvZnNxLCBuYXRyLCBvZnNyLCBuYXQxLCBvZnMxLCBsZW4sIG5hdDIsIG9mczIpIHtcbiAgdmFyIHJlbSA9IG5hdDEuZGF0YVtvZnMxICsgbGVuIC0gMV0gPj4+IDA7XG4gIC8vIG5hdHFbb2ZzcStsZW4tMV0gaXMgZ3VhcmFudGVlZCB0byBiZSB6ZXJvIChkdWUgdG8gdGhlIE1TRCByZXF1aXJlbWVudCksXG4gIC8vIGFuZCBzaG91bGQgbm90IGJlIHdyaXR0ZW4gdG8uXG4gIGZvciAodmFyIGkgPSBsZW4gLSAyOyBpID49IDA7IGktLSkge1xuICAgIHZhciB4ID0gZGl2X2hlbHBlcihyZW0sIG5hdDEuZGF0YVtvZnMxICsgaV0gPj4+IDAsIG5hdDIuZGF0YVtvZnMyXSA+Pj4gMCk7XG4gICAgbmF0cS5kYXRhW29mc3EgKyBpXSA9IHhbMF07XG4gICAgcmVtID0geFsxXTtcbiAgfVxuICBuYXRyLmRhdGFbb2Zzcl0gPSByZW07XG4gIHJldHVybiAwO1xufVxuXG4vLyBuYXQxW25hdDI6XSA6PSBuYXQxIC8gbmF0MlxuLy8gbmF0MVs6bmF0Ml0gOj0gbmF0MSAlIG5hdDJcbi8vIGxlbjEgPiBsZW4yLCBuYXQyW29mczIrbGVuMi0xXSA+IG5hdDFbb2ZzMStsZW4xLTFdXG4vL1Byb3ZpZGVzOiBkaXZfbmF0XG4vL1JlcXVpcmVzOiBkaXZfZGlnaXRfbmF0LCBkaXZfaGVscGVyLCBudW1fbGVhZGluZ196ZXJvX2JpdHNfaW5fZGlnaXQsIHNoaWZ0X2xlZnRfbmF0LCBzaGlmdF9yaWdodF9uYXQsIGNyZWF0ZV9uYXQsIHNldF90b196ZXJvX25hdCwgbXVsdF9kaWdpdF9uYXQsIHN1Yl9uYXQsIGNvbXBhcmVfbmF0LCBuYXRfb2ZfYXJyYXlcbmZ1bmN0aW9uIGRpdl9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMikge1xuICBpZiAobGVuMiA9PT0gMSkge1xuICAgIGRpdl9kaWdpdF9uYXQobmF0MSwgb2ZzMSArIDEsIG5hdDEsIG9mczEsIG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIpO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIHMgPSBudW1fbGVhZGluZ196ZXJvX2JpdHNfaW5fZGlnaXQobmF0Miwgb2ZzMiArIGxlbjIgLSAxKTtcbiAgc2hpZnRfbGVmdF9uYXQobmF0Miwgb2ZzMiwgbGVuMiwgbmF0X29mX2FycmF5KFswXSksIDAsIHMpO1xuICBzaGlmdF9sZWZ0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXRfb2ZfYXJyYXkoWzBdKSwgMCwgcyk7XG5cbiAgdmFyIGQgPSAobmF0Mi5kYXRhW29mczIgKyBsZW4yIC0gMV0gPj4+IDApICsgMTtcbiAgdmFyIGEgPSBjcmVhdGVfbmF0KGxlbjIgKyAxKTtcbiAgZm9yICh2YXIgaSA9IGxlbjEgLSAxOyBpID49IGxlbjI7IGktLSkge1xuICAgIC8vIERlY2VudCBsb3dlciBib3VuZCBvbiBxdW9cbiAgICB2YXIgcXVvID1cbiAgICAgIGQgPT09IDQyOTQ5NjcyOTZcbiAgICAgICAgPyBuYXQxLmRhdGFbb2ZzMSArIGldID4+PiAwXG4gICAgICAgIDogZGl2X2hlbHBlcihcbiAgICAgICAgICAgIG5hdDEuZGF0YVtvZnMxICsgaV0gPj4+IDAsXG4gICAgICAgICAgICBuYXQxLmRhdGFbb2ZzMSArIGkgLSAxXSA+Pj4gMCxcbiAgICAgICAgICAgIGQsXG4gICAgICAgICAgKVswXTtcbiAgICBzZXRfdG9femVyb19uYXQoYSwgMCwgbGVuMiArIDEpO1xuICAgIG11bHRfZGlnaXRfbmF0KGEsIDAsIGxlbjIgKyAxLCBuYXQyLCBvZnMyLCBsZW4yLCBuYXRfb2ZfYXJyYXkoW3F1b10pLCAwKTtcbiAgICBzdWJfbmF0KG5hdDEsIG9mczEgKyBpIC0gbGVuMiwgbGVuMiArIDEsIGEsIDAsIGxlbjIgKyAxLCAxKTtcblxuICAgIHdoaWxlIChcbiAgICAgIG5hdDEuZGF0YVtvZnMxICsgaV0gIT09IDAgfHxcbiAgICAgIGNvbXBhcmVfbmF0KG5hdDEsIG9mczEgKyBpIC0gbGVuMiwgbGVuMiwgbmF0Miwgb2ZzMiwgbGVuMikgPj0gMFxuICAgICkge1xuICAgICAgcXVvID0gcXVvICsgMTtcbiAgICAgIHN1Yl9uYXQobmF0MSwgb2ZzMSArIGkgLSBsZW4yLCBsZW4yICsgMSwgbmF0Miwgb2ZzMiwgbGVuMiwgMSk7XG4gICAgfVxuXG4gICAgbmF0MS5kYXRhW29mczEgKyBpXSA9IHF1bztcbiAgfVxuXG4gIHNoaWZ0X3JpZ2h0X25hdChuYXQxLCBvZnMxLCBsZW4yLCBuYXRfb2ZfYXJyYXkoWzBdKSwgMCwgcyk7IC8vIHNoaWZ0IHJlbWFpbmRlclxuICBzaGlmdF9yaWdodF9uYXQobmF0Miwgb2ZzMiwgbGVuMiwgbmF0X29mX2FycmF5KFswXSksIDAsIHMpOyAvLyByZXN0b3JlXG4gIHJldHVybiAwO1xufVxuXG4vLyAwIDw9IHNoaWZ0IDwgMzJcbi8vUHJvdmlkZXM6IHNoaWZ0X3JpZ2h0X25hdFxuZnVuY3Rpb24gc2hpZnRfcmlnaHRfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIG5iaXRzKSB7XG4gIGlmIChuYml0cyA9PT0gMCkge1xuICAgIG5hdDIuZGF0YVtvZnMyXSA9IDA7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgdmFyIHdyYXAgPSAwO1xuICBmb3IgKHZhciBpID0gbGVuMSAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGEgPSBuYXQxLmRhdGFbb2ZzMSArIGldID4+PiAwO1xuICAgIG5hdDEuZGF0YVtvZnMxICsgaV0gPSAoYSA+Pj4gbmJpdHMpIHwgd3JhcDtcbiAgICB3cmFwID0gYSA8PCAoMzIgLSBuYml0cyk7XG4gIH1cbiAgbmF0Mi5kYXRhW29mczJdID0gd3JhcDtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNvbXBhcmVfZGlnaXRzX25hdFxuZnVuY3Rpb24gY29tcGFyZV9kaWdpdHNfbmF0KG5hdDEsIG9mczEsIG5hdDIsIG9mczIpIHtcbiAgaWYgKG5hdDEuZGF0YVtvZnMxXSA+IG5hdDIuZGF0YVtvZnMyXSkgcmV0dXJuIDE7XG4gIGlmIChuYXQxLmRhdGFbb2ZzMV0gPCBuYXQyLmRhdGFbb2ZzMl0pIHJldHVybiAtMTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNvbXBhcmVfbmF0XG4vL1JlcXVpcmVzOiBudW1fZGlnaXRzX25hdFxuZnVuY3Rpb24gY29tcGFyZV9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMikge1xuICB2YXIgYSA9IG51bV9kaWdpdHNfbmF0KG5hdDEsIG9mczEsIGxlbjEpO1xuICB2YXIgYiA9IG51bV9kaWdpdHNfbmF0KG5hdDIsIG9mczIsIGxlbjIpO1xuICBpZiAoYSA+IGIpIHJldHVybiAxO1xuICBpZiAoYSA8IGIpIHJldHVybiAtMTtcbiAgZm9yICh2YXIgaSA9IGxlbjEgLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChuYXQxLmRhdGFbb2ZzMSArIGldID4+PiAwID4gbmF0Mi5kYXRhW29mczIgKyBpXSA+Pj4gMCkgcmV0dXJuIDE7XG4gICAgaWYgKG5hdDEuZGF0YVtvZnMxICsgaV0gPj4+IDAgPCBuYXQyLmRhdGFbb2ZzMiArIGldID4+PiAwKSByZXR1cm4gLTE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGxhbmRfZGlnaXRfbmF0XG5mdW5jdGlvbiBsYW5kX2RpZ2l0X25hdChuYXQxLCBvZnMxLCBuYXQyLCBvZnMyKSB7XG4gIG5hdDEuZGF0YVtvZnMxXSAmPSBuYXQyLmRhdGFbb2ZzMl07XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBsb3JfZGlnaXRfbmF0XG5mdW5jdGlvbiBsb3JfZGlnaXRfbmF0KG5hdDEsIG9mczEsIG5hdDIsIG9mczIpIHtcbiAgbmF0MS5kYXRhW29mczFdIHw9IG5hdDIuZGF0YVtvZnMyXTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGx4b3JfZGlnaXRfbmF0XG5mdW5jdGlvbiBseG9yX2RpZ2l0X25hdChuYXQxLCBvZnMxLCBuYXQyLCBvZnMyKSB7XG4gIG5hdDEuZGF0YVtvZnMxXSBePSBuYXQyLmRhdGFbb2ZzMl07XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBzZXJpYWxpemVfbmF0XG5mdW5jdGlvbiBzZXJpYWxpemVfbmF0KHdyaXRlciwgbmF0LCBzeikge1xuICB2YXIgbGVuID0gbmF0LmRhdGEubGVuZ3RoO1xuICB3cml0ZXIud3JpdGUoMzIsIGxlbik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB3cml0ZXIud3JpdGUoMzIsIG5hdC5kYXRhW2ldKTtcbiAgfVxuICBzelswXSA9IGxlbiAqIDQ7XG4gIHN6WzFdID0gbGVuICogODtcbn1cblxuLy9Qcm92aWRlczogZGVzZXJpYWxpemVfbmF0XG4vL1JlcXVpcmVzOiBNbE5hdFxuZnVuY3Rpb24gZGVzZXJpYWxpemVfbmF0KHJlYWRlciwgc3opIHtcbiAgdmFyIGxlbiA9IHJlYWRlci5yZWFkMzJzKCk7XG4gIHZhciBuYXQgPSBuZXcgTWxOYXQobGVuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIG5hdC5kYXRhW2ldID0gcmVhZGVyLnJlYWQzMnMoKTtcbiAgfVxuICBzelswXSA9IGxlbiAqIDQ7XG4gIHJldHVybiBuYXQ7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTQgSsOpcsO0bWUgVm91aWxsb24sIEh1Z28gSGV1emFyZFxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBqc29vX2lzX3dpbjMyXG52YXIganNvb19pc193aW4zMiA9XG4gIGdsb2JhbFRoaXMuRGVubz8uYnVpbGQ/Lm9zID09PSBcIndpbmRvd3NcIiB8fFxuICBnbG9iYWxUaGlzLnByb2Nlc3M/LnBsYXRmb3JtID09PSBcIndpbjMyXCI7XG5cbi8vUHJvdmlkZXM6IGZzX25vZGVfc3VwcG9ydGVkXG5mdW5jdGlvbiBmc19ub2RlX3N1cHBvcnRlZCgpIHtcbiAgcmV0dXJuIGdsb2JhbFRoaXMucHJvY2Vzcz8udmVyc2lvbnM/Lm5vZGUgIT09IHVuZGVmaW5lZDtcbn1cbi8vUHJvdmlkZXM6IGZzX25vZGVfc3VwcG9ydGVkXG4vL0lmOiBicm93c2VyXG5mdW5jdGlvbiBmc19ub2RlX3N1cHBvcnRlZCgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vL1Byb3ZpZGVzOiBNbE5vZGVEZXZpY2Vcbi8vUmVxdWlyZXM6IE1sTm9kZUZkLCBjYW1sX3JhaXNlX3N5c19lcnJvciwgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yLCBvY2FtbF9zdGF0c19mcm9tX25vZGVfc3RhdHNcbi8vUmVxdWlyZXM6IGpzb29faXNfd2luMzJcbmNsYXNzIE1sTm9kZURldmljZSB7XG4gIGNvbnN0cnVjdG9yKHJvb3QpIHtcbiAgICB0aGlzLmZzID0gcmVxdWlyZShcIm5vZGU6ZnNcIik7XG4gICAgdGhpcy5yb290ID0gcm9vdDtcbiAgfVxuXG4gIG5tKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5yb290ICsgbmFtZTtcbiAgfVxuXG4gIGV4aXN0cyhuYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmZzLmV4aXN0c1N5bmModGhpcy5ubShuYW1lKSkgPyAxIDogMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuXG4gIGlzRmlsZShuYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmZzLnN0YXRTeW5jKHRoaXMubm0obmFtZSkpLmlzRmlsZSgpID8gMSA6IDA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihlcnIudG9TdHJpbmcoKSk7XG4gICAgfVxuICB9XG5cbiAgbWtkaXIobmFtZSwgbW9kZSwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLm1rZGlyU3luYyh0aGlzLm5tKG5hbWUpLCB7IG1vZGU6IG1vZGUgfSk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgcm1kaXIobmFtZSwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLnJtZGlyU3luYyh0aGlzLm5tKG5hbWUpKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgICB9XG4gIH1cblxuICByZWFkZGlyKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuZnMucmVhZGRpclN5bmModGhpcy5ubShuYW1lKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgfVxuXG4gIGlzX2RpcihuYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmZzLnN0YXRTeW5jKHRoaXMubm0obmFtZSkpLmlzRGlyZWN0b3J5KCkgPyAxIDogMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKGVyci50b1N0cmluZygpKTtcbiAgICB9XG4gIH1cblxuICB1bmxpbmsobmFtZSwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLnVubGlua1N5bmModGhpcy5ubShuYW1lKSk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgdXRpbWVzKG5hbWUsIGF0aW1lLCBtdGltZSwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXRpbWUgPT09IDAgJiYgbXRpbWUgPT09IDApIHtcbiAgICAgICAgYXRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDA7XG4gICAgICAgIG10aW1lID0gYXRpbWU7XG4gICAgICB9XG4gICAgICB0aGlzLmZzLnV0aW1lc1N5bmModGhpcy5ubShuYW1lKSwgYXRpbWUsIG10aW1lKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgICB9XG4gIH1cblxuICB0cnVuY2F0ZShuYW1lLCBsZW4sIHJhaXNlX3VuaXgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5mcy50cnVuY2F0ZVN5bmModGhpcy5ubShuYW1lKSwgbGVuIHwgMCk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgYWNjZXNzKG5hbWUsIGYsIHJhaXNlX3VuaXgpIHtcbiAgICB2YXIgY29uc3RzID0gdGhpcy5mcy5jb25zdGFudHM7XG4gICAgdmFyIHJlcyA9IDA7XG4gICAgZm9yICh2YXIga2V5IGluIGYpIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgXCJyXCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5SX09LO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwid1wiOlxuICAgICAgICAgIHJlcyB8PSBjb25zdHMuV19PSztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgICByZXMgfD0ganNvb19pc193aW4zMiA/IGNvbnN0cy5SX09LIDogY29uc3RzLlhfT0s7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJmXCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5GX09LO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5mcy5hY2Nlc3NTeW5jKHRoaXMubm0obmFtZSksIHJlcyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgb3BlbihuYW1lLCBmLCBwZXJtcywgcmFpc2VfdW5peCkge1xuICAgIHZhciBjb25zdHMgPSB0aGlzLmZzLmNvbnN0YW50cztcbiAgICB2YXIgcmVzID0gMDtcbiAgICBmb3IgKHZhciBrZXkgaW4gZikge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBcInJkb25seVwiOlxuICAgICAgICAgIHJlcyB8PSBjb25zdHMuT19SRE9OTFk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ3cm9ubHlcIjpcbiAgICAgICAgICByZXMgfD0gY29uc3RzLk9fV1JPTkxZO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicmR3clwiOlxuICAgICAgICAgIHJlcyB8PSBjb25zdHMuT19SRFdSO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYXBwZW5kXCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5PX0FQUEVORDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImNyZWF0ZVwiOlxuICAgICAgICAgIHJlcyB8PSBjb25zdHMuT19DUkVBVDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInRydW5jYXRlXCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5PX1RSVU5DO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZXhjbFwiOlxuICAgICAgICAgIHJlcyB8PSBjb25zdHMuT19FWENMO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYmluYXJ5XCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5PX0JJTkFSWTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgICByZXMgfD0gY29uc3RzLk9fVEVYVDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIm5vbmJsb2NrXCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5PX05PTkJMT0NLO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibm9jdHR5XCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5PX05PQ1RUWTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImRzeW5jXCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5PX0RTWU5DO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwic3luY1wiOlxuICAgICAgICAgIHJlcyB8PSBjb25zdHMuT19TWU5DO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgdmFyIGZkID0gdGhpcy5mcy5vcGVuU3luYyh0aGlzLm5tKG5hbWUpLCByZXMsIHBlcm1zKTtcbiAgICAgIHJldHVybiBuZXcgTWxOb2RlRmQoZmQsIGYpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgICB9XG4gIH1cblxuICBzbGFzaChuYW1lKSB7XG4gICAgcmV0dXJuIC9cXC8kLy50ZXN0KG5hbWUpID8gbmFtZSA6IG5hbWUgKyBcIi9cIjtcbiAgfVxuXG4gIHJlbmFtZShvLCBuLCByYWlzZV91bml4KSB7XG4gICAgaWYgKGpzb29faXNfd2luMzIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLm5tKG4pO1xuICAgICAgICB2YXIgc291cmNlID0gdGhpcy5ubShvKTtcbiAgICAgICAgdmFyIHRhcmdldF9zdGF0cywgc291cmNlX3N0YXRzO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHRhcmdldF9zdGF0cyA9IHRoaXMuZnMuc3RhdFN5bmModGFyZ2V0LCB7XG4gICAgICAgICAgICB0aHJvd0lmTm9FbnRyeTogZmFsc2UsXG4gICAgICAgICAgfSkpICYmXG4gICAgICAgICAgKHNvdXJjZV9zdGF0cyA9IHRoaXMuZnMuc3RhdFN5bmMoc291cmNlLCB7XG4gICAgICAgICAgICB0aHJvd0lmTm9FbnRyeTogZmFsc2UsXG4gICAgICAgICAgfSkpICYmXG4gICAgICAgICAgc291cmNlX3N0YXRzLmlzRGlyZWN0b3J5KClcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHRhcmdldF9zdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc2xhc2godGFyZ2V0KS5zdGFydHNXaXRoKHRoaXMuc2xhc2goc291cmNlKSkpXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcy5ybWRpclN5bmModGFyZ2V0KTtcbiAgICAgICAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgRU5PVERJUjogbm90IGEgZGlyZWN0b3J5LCByZW5hbWUgJyR7c291cmNlfScgLT4gJyR7dGFyZ2V0fSdgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRocm93IE9iamVjdC5hc3NpZ24oZXJyLCB7XG4gICAgICAgICAgICAgIGVycm5vOiAtMjAsXG4gICAgICAgICAgICAgIGNvZGU6IFwiRU5PVERJUlwiLFxuICAgICAgICAgICAgICBzeXNjYWxsOiBcInJlbmFtZVwiLFxuICAgICAgICAgICAgICBwYXRoOiB0YXJnZXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mcy5yZW5hbWVTeW5jKHRoaXMubm0obyksIHRoaXMubm0obikpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZnMucmVuYW1lU3luYyh0aGlzLm5tKG8pLCB0aGlzLm5tKG4pKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXQobmFtZSwgbGFyZ2UsIHJhaXNlX3VuaXgpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGpzX3N0YXRzID0gdGhpcy5mcy5zdGF0U3luYyh0aGlzLm5tKG5hbWUpKTtcbiAgICAgIHJldHVybiBvY2FtbF9zdGF0c19mcm9tX25vZGVfc3RhdHMoanNfc3RhdHMsIGxhcmdlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgbHN0YXQobmFtZSwgbGFyZ2UsIHJhaXNlX3VuaXgpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGpzX3N0YXRzID0gdGhpcy5mcy5sc3RhdFN5bmModGhpcy5ubShuYW1lKSk7XG4gICAgICByZXR1cm4gb2NhbWxfc3RhdHNfZnJvbV9ub2RlX3N0YXRzKGpzX3N0YXRzLCBsYXJnZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgfVxuXG4gIGNobW9kKG5hbWUsIHBlcm1zLCByYWlzZV91bml4KSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZnMuY2htb2RTeW5jKHRoaXMubm0obmFtZSksIHBlcm1zKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgICB9XG4gIH1cblxuICBsaW5rKHRhcmdldCwgcGF0aCwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLmxpbmtTeW5jKHRoaXMubm0odGFyZ2V0KSwgdGhpcy5ubShwYXRoKSk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgc3ltbGluayh0b19kaXIsIHRhcmdldCwgcGF0aCwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLnN5bWxpbmtTeW5jKFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHRoaXMubm0ocGF0aCksXG4gICAgICAgIHRvX2RpciA9PT0gMCA/IG51bGwgOiB0b19kaXJbMV0gPyBcImRpclwiIDogXCJmaWxlXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgfVxuXG4gIHJlYWRsaW5rKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGxpbmsgPSB0aGlzLmZzLnJlYWRsaW5rU3luYyh0aGlzLm5tKG5hbWUpLCBcInV0ZjhcIik7XG4gICAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcobGluayk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5kaXIobmFtZSwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5mcy5vcGVuZGlyU3luYyh0aGlzLm5tKG5hbWUpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG59XG5cbi8vUHJvdmlkZXM6IG9jYW1sX3N0YXRzX2Zyb21fbm9kZV9zdGF0c1xuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9mbG9hdFxuZnVuY3Rpb24gb2NhbWxfc3RhdHNfZnJvbV9ub2RlX3N0YXRzKGpzX3N0YXRzLCBsYXJnZSkge1xuICAvKiA9PT1Vbml4LmZpbGVfa2luZD09PVxuICAgKiB0eXBlIGZpbGVfa2luZCA9XG4gICAqICAgICBTX1JFRyAgICAgICAgICAgICAgICAgICAgICAgKCoqIFJlZ3VsYXIgZmlsZSAqKVxuICAgKiAgIHwgU19ESVIgICAgICAgICAgICAgICAgICAgICAgICgqKiBEaXJlY3RvcnkgKilcbiAgICogICB8IFNfQ0hSICAgICAgICAgICAgICAgICAgICAgICAoKiogQ2hhcmFjdGVyIGRldmljZSAqKVxuICAgKiAgIHwgU19CTEsgICAgICAgICAgICAgICAgICAgICAgICgqKiBCbG9jayBkZXZpY2UgKilcbiAgICogICB8IFNfTE5LICAgICAgICAgICAgICAgICAgICAgICAoKiogU3ltYm9saWMgbGluayAqKVxuICAgKiAgIHwgU19GSUZPICAgICAgICAgICAgICAgICAgICAgICgqKiBOYW1lZCBwaXBlICopXG4gICAqICAgfCBTX1NPQ0sgICAgICAgICAgICAgICAgICAgICAgKCoqIFNvY2tldCAqKVxuICAgKi9cbiAgdmFyIGZpbGVfa2luZDtcbiAgaWYgKGpzX3N0YXRzLmlzRmlsZSgpKSB7XG4gICAgZmlsZV9raW5kID0gMDtcbiAgfSBlbHNlIGlmIChqc19zdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgZmlsZV9raW5kID0gMTtcbiAgfSBlbHNlIGlmIChqc19zdGF0cy5pc0NoYXJhY3RlckRldmljZSgpKSB7XG4gICAgZmlsZV9raW5kID0gMjtcbiAgfSBlbHNlIGlmIChqc19zdGF0cy5pc0Jsb2NrRGV2aWNlKCkpIHtcbiAgICBmaWxlX2tpbmQgPSAzO1xuICB9IGVsc2UgaWYgKGpzX3N0YXRzLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICBmaWxlX2tpbmQgPSA0O1xuICB9IGVsc2UgaWYgKGpzX3N0YXRzLmlzRklGTygpKSB7XG4gICAgZmlsZV9raW5kID0gNTtcbiAgfSBlbHNlIGlmIChqc19zdGF0cy5pc1NvY2tldCgpKSB7XG4gICAgZmlsZV9raW5kID0gNjtcbiAgfVxuICAvKiA9PT1Vbml4LnN0YXRzPT09XG4gICAqIHR5cGUgc3RhdHMgPVxuICAgKiAgeyBzdF9kZXYgOiBpbnQ7ICAgICAgICAgICAgICAgKCoqIERldmljZSBudW1iZXIgKilcbiAgICogICAgc3RfaW5vIDogaW50OyAgICAgICAgICAgICAgICgqKiBJbm9kZSBudW1iZXIgKilcbiAgICogICAgc3Rfa2luZCA6IGZpbGVfa2luZDsgICAgICAgICgqKiBLaW5kIG9mIHRoZSBmaWxlICopXG4gICAqICAgIHN0X3Blcm0gOiBmaWxlX3Blcm07ICAgICAgICAoKiogQWNjZXNzIHJpZ2h0cyAqKVxuICAgKiAgICBzdF9ubGluayA6IGludDsgICAgICAgICAgICAgKCoqIE51bWJlciBvZiBsaW5rcyAqKVxuICAgKiAgICBzdF91aWQgOiBpbnQ7ICAgICAgICAgICAgICAgKCoqIFVzZXIgaWQgb2YgdGhlIG93bmVyICopXG4gICAqICAgIHN0X2dpZCA6IGludDsgICAgICAgICAgICAgICAoKiogR3JvdXAgSUQgb2YgdGhlIGZpbGUncyBncm91cCAqKVxuICAgKiAgICBzdF9yZGV2IDogaW50OyAgICAgICAgICAgICAgKCoqIERldmljZSBJRCAoaWYgc3BlY2lhbCBmaWxlKSAqKVxuICAgKiAgICBzdF9zaXplIDogaW50OyAgICAgICAgICAgICAgKCoqIFNpemUgaW4gYnl0ZXMgKilcbiAgICogICAgc3RfYXRpbWUgOiBmbG9hdDsgICAgICAgICAgICgqKiBMYXN0IGFjY2VzcyB0aW1lICopXG4gICAqICAgIHN0X210aW1lIDogZmxvYXQ7ICAgICAgICAgICAoKiogTGFzdCBtb2RpZmljYXRpb24gdGltZSAqKVxuICAgKiAgICBzdF9jdGltZSA6IGZsb2F0OyAgICAgICAgICAgKCoqIExhc3Qgc3RhdHVzIGNoYW5nZSB0aW1lICopXG4gICAqICB9XG4gICAqL1xuICByZXR1cm4gQkxPQ0soXG4gICAgMCxcbiAgICBqc19zdGF0cy5kZXYsXG4gICAganNfc3RhdHMuaW5vIHwgMCxcbiAgICBmaWxlX2tpbmQsXG4gICAganNfc3RhdHMubW9kZSxcbiAgICBqc19zdGF0cy5ubGluayxcbiAgICBqc19zdGF0cy51aWQsXG4gICAganNfc3RhdHMuZ2lkLFxuICAgIGpzX3N0YXRzLnJkZXYsXG4gICAgbGFyZ2UgPyBjYW1sX2ludDY0X29mX2Zsb2F0KGpzX3N0YXRzLnNpemUpIDoganNfc3RhdHMuc2l6ZSB8IDAsXG4gICAganNfc3RhdHMuYXRpbWVNcyAvIDEwMDAsXG4gICAganNfc3RhdHMubXRpbWVNcyAvIDEwMDAsXG4gICAganNfc3RhdHMuY3RpbWVNcyAvIDEwMDAsXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IE1sTm9kZURldmljZVxuLy9JZjogYnJvd3NlclxuY2xhc3MgTWxOb2RlRGV2aWNlIHt9XG5cbi8vUHJvdmlkZXM6IE1sTm9kZUZkXG4vL1JlcXVpcmVzOiBNbEZpbGUsIGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nLCBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzLCBjYW1sX2J5dGVzX3NldCwgY2FtbF9yYWlzZV9zeXNfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yLCBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvciwgb2NhbWxfc3RhdHNfZnJvbV9ub2RlX3N0YXRzXG5jbGFzcyBNbE5vZGVGZCBleHRlbmRzIE1sRmlsZSB7XG4gIGNvbnN0cnVjdG9yKGZkLCBmbGFncykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5mcyA9IHJlcXVpcmUoXCJub2RlOmZzXCIpO1xuICAgIHRoaXMuZmQgPSBmZDtcbiAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBzdGF0cyA9IHRoaXMuZnMuZnN0YXRTeW5jKGZkKTtcbiAgICAgIGZsYWdzLm5vU2VlayA9XG4gICAgICAgIHN0YXRzLmlzQ2hhcmFjdGVyRGV2aWNlKCkgfHwgc3RhdHMuaXNGSUZPKCkgfHwgc3RhdHMuaXNTb2NrZXQoKTtcbiAgICAgIHRoaXMub2Zmc2V0ID0gdGhpcy5mbGFncy5hcHBlbmQgPyBzdGF0cy5zaXplIDogMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIFRoZSBmc3RhdCB3aWxsIGZhaWwgb24gc3RhbmRhcmQgc3RyZWFtcyB1bmRlciBXaW5kb3dzIHdpdGggbm9kZVxuICAgICAgLy8gMTggKGFuZCBsb3dlcikuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbGlidXYvbGlidXYvcHVsbC8zODExLlxuICAgICAgZmxhZ3Mubm9TZWVrID0gdHJ1ZTtcbiAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgdGhpcy5zZWVrZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHRydW5jYXRlKGxlbiwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLmZ0cnVuY2F0ZVN5bmModGhpcy5mZCwgbGVuIHwgMCk7XG4gICAgICBpZiAodGhpcy5vZmZzZXQgPiBsZW4pIHRoaXMub2Zmc2V0ID0gbGVuO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgICB9XG4gIH1cblxuICBpc2F0dHkoKSB7XG4gICAgdmFyIHR0eSA9IHJlcXVpcmUoXCJub2RlOnR0eVwiKTtcbiAgICByZXR1cm4gdHR5LmlzYXR0eSh0aGlzLmZkKSA/IDEgOiAwO1xuICB9XG5cbiAgbGVuZ3RoKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5mcy5mc3RhdFN5bmModGhpcy5mZCkuc2l6ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKGVyci50b1N0cmluZygpKTtcbiAgICB9XG4gIH1cblxuICB3cml0ZShidWYsIGJ1Zl9vZmZzZXQsIGxlbiwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5mbGFncy5ub1NlZWsgfHwgIXRoaXMuc2Vla2VkKSB7XG4gICAgICAgIHZhciB3cml0dGVuID0gdGhpcy5mcy53cml0ZVN5bmModGhpcy5mZCwgYnVmLCBidWZfb2Zmc2V0LCBsZW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHdyaXR0ZW4gPSB0aGlzLmZzLndyaXRlU3luYyhcbiAgICAgICAgICB0aGlzLmZkLFxuICAgICAgICAgIGJ1ZixcbiAgICAgICAgICBidWZfb2Zmc2V0LFxuICAgICAgICAgIGxlbixcbiAgICAgICAgICB0aGlzLm9mZnNldCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub2Zmc2V0ICs9IHdyaXR0ZW47XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgICByZXR1cm4gd3JpdHRlbjtcbiAgfVxuXG4gIHJlYWQoYSwgYnVmX29mZnNldCwgbGVuLCByYWlzZV91bml4KSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmZsYWdzLm5vU2VlayB8fCAhdGhpcy5zZWVrZWQpIHtcbiAgICAgICAgdmFyIHJlYWQgPSB0aGlzLmZzLnJlYWRTeW5jKHRoaXMuZmQsIGEsIGJ1Zl9vZmZzZXQsIGxlbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVhZCA9IHRoaXMuZnMucmVhZFN5bmModGhpcy5mZCwgYSwgYnVmX29mZnNldCwgbGVuLCB0aGlzLm9mZnNldCk7XG4gICAgICB9XG4gICAgICB0aGlzLm9mZnNldCArPSByZWFkO1xuICAgICAgcmV0dXJuIHJlYWQ7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgfVxuXG4gIHNlZWsob2Zmc2V0LCB3aGVuY2UsIHJhaXNlX3VuaXgpIHtcbiAgICBpZiAodGhpcy5mbGFncy5ub1NlZWspIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKHJhaXNlX3VuaXgsIFwiRVNQSVBFXCIsIFwibHNlZWtcIiwgXCJpbGxlZ2FsIHNlZWtcIik7XG4gICAgfVxuICAgIHN3aXRjaCAod2hlbmNlKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBvZmZzZXQgKz0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBvZmZzZXQgKz0gdGhpcy5sZW5ndGgoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgXCJFSU5WQUxcIixcbiAgICAgICAgXCJsc2Vla1wiLFxuICAgICAgICBcImludmFsaWQgYXJndW1lbnRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgIHRoaXMuc2Vla2VkID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5vZmZzZXQ7XG4gIH1cblxuICBwb3MoKSB7XG4gICAgcmV0dXJuIHRoaXMub2Zmc2V0O1xuICB9XG5cbiAgc3RhdChsYXJnZSkge1xuICAgIHRyeSB7XG4gICAgICB2YXIganNfc3RhdHMgPSB0aGlzLmZzLmZzdGF0U3luYyh0aGlzLmZkKTtcbiAgICAgIHJldHVybiBvY2FtbF9zdGF0c19mcm9tX25vZGVfc3RhdHMoanNfc3RhdHMsIGxhcmdlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgLyogcmFpc2UgVW5peF9lcnJvciAqLyAxKTtcbiAgICB9XG4gIH1cblxuICBjaG1vZChwZXJtcykge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLmZjaG1vZFN5bmModGhpcy5mZCwgcGVybXMpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gMSk7XG4gICAgfVxuICB9XG5cbiAgc3luYygpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5mcy5mc3luY1N5bmModGhpcy5mZCk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgLyogcmFpc2UgVW5peF9lcnJvciAqLyAxKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZShyYWlzZV91bml4KSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZnMuY2xvc2VTeW5jKHRoaXMuZmQpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrX3N0cmVhbV9zZW1hbnRpY3MoY21kKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBqc19zdGF0cyA9IHRoaXMuZnMuZnN0YXRTeW5jKHRoaXMuZmQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCAvKiByYWlzZSBVbml4X2Vycm9yICovIDEsIGNtZCk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIGpzX3N0YXRzLmlzRmlsZSgpIHx8XG4gICAgICAgIGpzX3N0YXRzLmlzQ2hhcmFjdGVyRGV2aWNlKCkgfHxcbiAgICAgICAganNfc3RhdHMuaXNGSUZPKCkgfHxcbiAgICAgICAganNfc3RhdHMuaXNTb2NrZXQoKVxuICAgICAgKVxuICAgIClcbiAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgICAvKiByYWlzZSBVbml4X2Vycm9yICovIDEsXG4gICAgICAgIFwiRUlOVkFMXCIsXG4gICAgICAgIGNtZCxcbiAgICAgICAgXCJpbnZhbGlkIGFyZ3VtZW50XCIsXG4gICAgICApO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IE1sTm9kZUZkXG4vL0lmOiBicm93c2VyXG5jbGFzcyBNbE5vZGVGZCB7fVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19vcGVuX2Zvcl9ub2RlXG4vL1JlcXVpcmVzOiBNbE5vZGVGZFxuZnVuY3Rpb24gY2FtbF9zeXNfb3Blbl9mb3Jfbm9kZShmZCwgZmxhZ3MpIHtcbiAgaWYgKGZsYWdzLmFsdG5hbWUpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGZzID0gcmVxdWlyZShcIm5vZGU6ZnNcIik7XG4gICAgICB2YXIgZmQyID0gZnMub3BlblN5bmMoZmxhZ3MuYWx0bmFtZSwgXCJyc1wiKTtcbiAgICAgIHJldHVybiBuZXcgTWxOb2RlRmQoZmQyLCBmbGFncyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gbmV3IE1sTm9kZUZkKGZkLCBmbGFncyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX29wZW5fZm9yX25vZGVcbi8vSWY6IGJyb3dzZXJcbmZ1bmN0aW9uIGNhbWxfc3lzX29wZW5fZm9yX25vZGUoX2ZkLCBfZmxhZ3MpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3dpdGhfYXJncywgbWFrZV91bml4X2Vycl9hcmdzLCBjYW1sX25hbWVkX3ZhbHVlXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvclxuZnVuY3Rpb24gY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4LCBjbWQpIHtcbiAgdmFyIHVuaXhfZXJyb3IgPSBjYW1sX25hbWVkX3ZhbHVlKFwiVW5peC5Vbml4X2Vycm9yXCIpO1xuICBpZiAocmFpc2VfdW5peCAmJiB1bml4X2Vycm9yKSB7XG4gICAgdmFyIGFyZ3MgPSBtYWtlX3VuaXhfZXJyX2FyZ3MoXG4gICAgICBlcnIuY29kZSxcbiAgICAgIGNtZCB8fCBlcnIuc3lzY2FsbCxcbiAgICAgIGVyci5wYXRoLFxuICAgICAgZXJyLmVycm5vLFxuICAgICk7XG4gICAgY2FtbF9yYWlzZV93aXRoX2FyZ3ModW5peF9lcnJvciwgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoZXJyLnRvU3RyaW5nKCkpO1xuICB9XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTQgSsOpcsO0bWUgVm91aWxsb24sIEh1Z28gSGV1emFyZCwgQW5keSBSYXlcbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbi8vXG4vLyBCaWdhcnJheS5cbi8vXG4vLyAtIGFsbCBiaWdhcnJheSB0eXBlcyBpbmNsdWRpbmcgSW50NjQgYW5kIENvbXBsZXguXG4vLyAtIGZvcnRyYW4gKyBjIGxheW91dHNcbi8vIC0gc3ViL3NsaWNlL3Jlc2hhcGVcbi8vIC0gcmV0YWluIGZhc3QgcGF0aCBmb3IgMWQgYXJyYXkgYWNjZXNzXG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfaW5pdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9iYV9pbml0KCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfc2l6ZVxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2JhX2dldF9zaXplKGRpbXMpIHtcbiAgdmFyIG5fZGltcyA9IGRpbXMubGVuZ3RoO1xuICB2YXIgc2l6ZSA9IDE7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbl9kaW1zOyBpKyspIHtcbiAgICBpZiAoZGltc1tpXSA8IDApXG4gICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5jcmVhdGU6IG5lZ2F0aXZlIGRpbWVuc2lvblwiKTtcbiAgICBzaXplID0gc2l6ZSAqIGRpbXNbaV07XG4gIH1cbiAgcmV0dXJuIHNpemU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5wYWNrRmxvYXQxNlxudmFyIGNhbWxfdW5wYWNrRmxvYXQxNiA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBwb3cgPSBNYXRoLnBvdztcblxuICB2YXIgRVhQX01BU0sxNiA9IDMxOyAvLyAyICoqIDUgLSAxXG4gIHZhciBTSUdOSUZJQ0FORF9NQVNLMTYgPSAxMDIzOyAvLyAyICoqIDEwIC0gMVxuICB2YXIgTUlOX1NVQk5PUk1BTDE2ID0gcG93KDIsIC0yNCk7IC8vIDIgKiogLTEwICogMiAqKiAtMTRcbiAgdmFyIFNJR05JRklDQU5EX0RFTk9NMTYgPSAwLjAwMDk3NjU2MjU7IC8vIDIgKiogLTEwXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChieXRlcykge1xuICAgIHZhciBzaWduID0gYnl0ZXMgPj4+IDE1O1xuICAgIHZhciBleHBvbmVudCA9IChieXRlcyA+Pj4gMTApICYgRVhQX01BU0sxNjtcbiAgICB2YXIgc2lnbmlmaWNhbmQgPSBieXRlcyAmIFNJR05JRklDQU5EX01BU0sxNjtcbiAgICBpZiAoZXhwb25lbnQgPT09IEVYUF9NQVNLMTYpXG4gICAgICByZXR1cm4gc2lnbmlmaWNhbmQgPT09IDBcbiAgICAgICAgPyBzaWduID09PSAwXG4gICAgICAgICAgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgICAgICAgICA6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICAgICAgICA6IE51bWJlci5OYU47XG4gICAgaWYgKGV4cG9uZW50ID09PSAwKVxuICAgICAgcmV0dXJuIHNpZ25pZmljYW5kICogKHNpZ24gPT09IDAgPyBNSU5fU1VCTk9STUFMMTYgOiAtTUlOX1NVQk5PUk1BTDE2KTtcbiAgICB2YXIgciA9XG4gICAgICBwb3coMiwgZXhwb25lbnQgLSAxNSkgKlxuICAgICAgKHNpZ24gPT09IDBcbiAgICAgICAgPyAxICsgc2lnbmlmaWNhbmQgKiBTSUdOSUZJQ0FORF9ERU5PTTE2XG4gICAgICAgIDogLTEgLSBzaWduaWZpY2FuZCAqIFNJR05JRklDQU5EX0RFTk9NMTYpO1xuICAgIHJldHVybiByO1xuICB9O1xufSkoKTtcblxuLy9Qcm92aWRlczogY2FtbF9wYWNrRmxvYXQxNlxudmFyIGNhbWxfcGFja0Zsb2F0MTYgPSAoZnVuY3Rpb24gKCkge1xuICBjb25zdCBJTlZFUlNFX09GX0VQU0lMT04gPSAxIC8gTnVtYmVyLkVQU0lMT047XG5cbiAgZnVuY3Rpb24gcm91bmRUaWVzVG9FdmVuKG51bSkge1xuICAgIHJldHVybiBudW0gKyBJTlZFUlNFX09GX0VQU0lMT04gLSBJTlZFUlNFX09GX0VQU0lMT047XG4gIH1cblxuICBjb25zdCBGTE9BVDE2X01JTl9WQUxVRSA9IDYuMTAzNTE1NjI1ZS01O1xuICBjb25zdCBGTE9BVDE2X01BWF9WQUxVRSA9IDY1NTA0O1xuICBjb25zdCBGTE9BVDE2X0VQU0lMT04gPSAwLjAwMDk3NjU2MjU7XG5cbiAgY29uc3QgRkxPQVQxNl9FUFNJTE9OX01VTFRJUExJRURfQllfRkxPQVQxNl9NSU5fVkFMVUUgPVxuICAgIEZMT0FUMTZfRVBTSUxPTiAqIEZMT0FUMTZfTUlOX1ZBTFVFO1xuICBjb25zdCBGTE9BVDE2X0VQU0lMT05fREVWSURFRF9CWV9FUFNJTE9OID1cbiAgICBGTE9BVDE2X0VQU0lMT04gKiBJTlZFUlNFX09GX0VQU0lMT047XG5cbiAgZnVuY3Rpb24gcm91bmRUb0Zsb2F0MTYobnVtKSB7XG4gICAgY29uc3QgbnVtYmVyID0gK251bTtcblxuICAgIC8vIE5hTiwgSW5maW5pdHksIC1JbmZpbml0eSwgMCwgLTBcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShudW1iZXIpIHx8IG51bWJlciA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9XG5cbiAgICAvLyBmaW5pdGUgZXhjZXB0IDAsIC0wXG4gICAgY29uc3Qgc2lnbiA9IG51bWJlciA+IDAgPyAxIDogLTE7XG4gICAgY29uc3QgYWJzb2x1dGUgPSBNYXRoLmFicyhudW1iZXIpO1xuXG4gICAgLy8gc21hbGwgbnVtYmVyXG4gICAgaWYgKGFic29sdXRlIDwgRkxPQVQxNl9NSU5fVkFMVUUpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHNpZ24gKlxuICAgICAgICByb3VuZFRpZXNUb0V2ZW4oXG4gICAgICAgICAgYWJzb2x1dGUgLyBGTE9BVDE2X0VQU0lMT05fTVVMVElQTElFRF9CWV9GTE9BVDE2X01JTl9WQUxVRSxcbiAgICAgICAgKSAqXG4gICAgICAgIEZMT0FUMTZfRVBTSUxPTl9NVUxUSVBMSUVEX0JZX0ZMT0FUMTZfTUlOX1ZBTFVFXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXAgPSAoMSArIEZMT0FUMTZfRVBTSUxPTl9ERVZJREVEX0JZX0VQU0lMT04pICogYWJzb2x1dGU7XG4gICAgY29uc3QgcmVzdWx0ID0gdGVtcCAtICh0ZW1wIC0gYWJzb2x1dGUpO1xuXG4gICAgLy8gbGFyZ2UgbnVtYmVyXG4gICAgaWYgKHJlc3VsdCA+IEZMT0FUMTZfTUFYX1ZBTFVFIHx8IE51bWJlci5pc05hTihyZXN1bHQpKSB7XG4gICAgICByZXR1cm4gc2lnbiAqIE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2lnbiAqIHJlc3VsdDtcbiAgfVxuXG4gIC8vIGJhc2UgYWxnb3JpdGhtOiBodHRwOi8vZm94LXRvb2xraXQub3JnL2Z0cC9mYXN0aGFsZmZsb2F0Y29udmVyc2lvbi5wZGZcblxuICBjb25zdCBiYXNlVGFibGUgPSBuZXcgVWludDE2QXJyYXkoNTEyKTtcbiAgY29uc3Qgc2hpZnRUYWJsZSA9IG5ldyBVaW50OEFycmF5KDUxMik7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgIGNvbnN0IGUgPSBpIC0gMTI3O1xuXG4gICAgLy8gdmVyeSBzbWFsbCBudW1iZXIgKDAsIC0wKVxuICAgIGlmIChlIDwgLTI0KSB7XG4gICAgICBiYXNlVGFibGVbaV0gPSAweDAwMDA7XG4gICAgICBiYXNlVGFibGVbaSB8IDB4MTAwXSA9IDB4ODAwMDtcbiAgICAgIHNoaWZ0VGFibGVbaV0gPSAyNDtcbiAgICAgIHNoaWZ0VGFibGVbaSB8IDB4MTAwXSA9IDI0O1xuXG4gICAgICAvLyBzbWFsbCBudW1iZXIgKGRlbm9ybSlcbiAgICB9IGVsc2UgaWYgKGUgPCAtMTQpIHtcbiAgICAgIGJhc2VUYWJsZVtpXSA9IDB4MDQwMCA+PiAoLWUgLSAxNCk7XG4gICAgICBiYXNlVGFibGVbaSB8IDB4MTAwXSA9ICgweDA0MDAgPj4gKC1lIC0gMTQpKSB8IDB4ODAwMDtcbiAgICAgIHNoaWZ0VGFibGVbaV0gPSAtZSAtIDE7XG4gICAgICBzaGlmdFRhYmxlW2kgfCAweDEwMF0gPSAtZSAtIDE7XG5cbiAgICAgIC8vIG5vcm1hbCBudW1iZXJcbiAgICB9IGVsc2UgaWYgKGUgPD0gMTUpIHtcbiAgICAgIGJhc2VUYWJsZVtpXSA9IChlICsgMTUpIDw8IDEwO1xuICAgICAgYmFzZVRhYmxlW2kgfCAweDEwMF0gPSAoKGUgKyAxNSkgPDwgMTApIHwgMHg4MDAwO1xuICAgICAgc2hpZnRUYWJsZVtpXSA9IDEzO1xuICAgICAgc2hpZnRUYWJsZVtpIHwgMHgxMDBdID0gMTM7XG5cbiAgICAgIC8vIGxhcmdlIG51bWJlciAoSW5maW5pdHksIC1JbmZpbml0eSlcbiAgICB9IGVsc2UgaWYgKGUgPCAxMjgpIHtcbiAgICAgIGJhc2VUYWJsZVtpXSA9IDB4N2MwMDtcbiAgICAgIGJhc2VUYWJsZVtpIHwgMHgxMDBdID0gMHhmYzAwO1xuICAgICAgc2hpZnRUYWJsZVtpXSA9IDI0O1xuICAgICAgc2hpZnRUYWJsZVtpIHwgMHgxMDBdID0gMjQ7XG5cbiAgICAgIC8vIHN0YXkgKE5hTiwgSW5maW5pdHksIC1JbmZpbml0eSlcbiAgICB9IGVsc2Uge1xuICAgICAgYmFzZVRhYmxlW2ldID0gMHg3YzAwO1xuICAgICAgYmFzZVRhYmxlW2kgfCAweDEwMF0gPSAweGZjMDA7XG4gICAgICBzaGlmdFRhYmxlW2ldID0gMTM7XG4gICAgICBzaGlmdFRhYmxlW2kgfCAweDEwMF0gPSAxMztcbiAgICB9XG4gIH1cblxuICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoNCk7XG4gIGNvbnN0IGZsb2F0VmlldyA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyKTtcbiAgY29uc3QgdWludDMyVmlldyA9IG5ldyBVaW50MzJBcnJheShidWZmZXIpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAobnVtKSB7XG4gICAgZmxvYXRWaWV3WzBdID0gcm91bmRUb0Zsb2F0MTYobnVtKTtcbiAgICBjb25zdCBmID0gdWludDMyVmlld1swXTtcbiAgICBjb25zdCBlID0gKGYgPj4gMjMpICYgMHgxZmY7XG4gICAgcmV0dXJuIGJhc2VUYWJsZVtlXSArICgoZiAmIDB4MDA3ZmZmZmYpID4+IHNoaWZ0VGFibGVbZV0pO1xuICB9O1xufSkoKTtcblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudFxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudChraW5kKSB7XG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgNzpcbiAgICBjYXNlIDEwOlxuICAgIGNhc2UgMTE6XG4gICAgICByZXR1cm4gMjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIDE7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jcmVhdGVfYnVmZmVyXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50XG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfY3JlYXRlX2J1ZmZlcihraW5kLCBzaXplKSB7XG4gIHZhciB2aWV3O1xuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlIDA6XG4gICAgICB2aWV3ID0gRmxvYXQzMkFycmF5O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgdmlldyA9IEZsb2F0NjRBcnJheTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjpcbiAgICAgIHZpZXcgPSBJbnQ4QXJyYXk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDM6XG4gICAgICB2aWV3ID0gVWludDhBcnJheTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDpcbiAgICAgIHZpZXcgPSBJbnQxNkFycmF5O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA1OlxuICAgICAgdmlldyA9IFVpbnQxNkFycmF5O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA2OlxuICAgICAgdmlldyA9IEludDMyQXJyYXk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDc6XG4gICAgICB2aWV3ID0gSW50MzJBcnJheTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgODpcbiAgICAgIHZpZXcgPSBJbnQzMkFycmF5O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA5OlxuICAgICAgdmlldyA9IEludDMyQXJyYXk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEwOlxuICAgICAgdmlldyA9IEZsb2F0MzJBcnJheTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE6XG4gICAgICB2aWV3ID0gRmxvYXQ2NEFycmF5O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMjpcbiAgICAgIHZpZXcgPSBVaW50OEFycmF5O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMzpcbiAgICAgIHZpZXcgPSBVaW50MTZBcnJheTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIGlmICghdmlldykgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuY3JlYXRlOiB1bnN1cHBvcnRlZCBraW5kXCIpO1xuICB2YXIgZGF0YSA9IG5ldyB2aWV3KHNpemUgKiBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50KGtpbmQpKTtcbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfY3VzdG9tX25hbWVcbnZhciBjYW1sX2JhX2N1c3RvbV9uYW1lID0gXCJfYmlnYXJyMDJcIjtcblxuLy9Qcm92aWRlczogTWxfQmlnYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3IsIGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9iYV9jdXN0b21fbmFtZVxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9jcmVhdGVfbG9faGksIGNhbWxfaW50NjRfaGkzMiwgY2FtbF9pbnQ2NF9sbzMyXG4vL1JlcXVpcmVzOiBjYW1sX3BhY2tGbG9hdDE2LCBjYW1sX3VucGFja0Zsb2F0MTZcbmNsYXNzIE1sX0JpZ2FycmF5IHtcbiAgY29uc3RydWN0b3Ioa2luZCwgbGF5b3V0LCBkaW1zLCBidWZmZXIpIHtcbiAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIHRoaXMubGF5b3V0ID0gbGF5b3V0O1xuICAgIHRoaXMuZGltcyA9IGRpbXM7XG4gICAgdGhpcy5kYXRhID0gYnVmZmVyO1xuICAgIHRoaXMuY2FtbF9jdXN0b20gPSBjYW1sX2JhX2N1c3RvbV9uYW1lO1xuICB9XG5cbiAgb2Zmc2V0KGFyZykge1xuICAgIHZhciBvZnMgPSAwO1xuICAgIGlmICh0eXBlb2YgYXJnID09PSBcIm51bWJlclwiKSBhcmcgPSBbYXJnXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJnKSlcbiAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImJpZ2FycmF5LmpzOiBpbnZhbGlkIG9mZnNldFwiKTtcbiAgICBpZiAodGhpcy5kaW1zLmxlbmd0aCAhPT0gYXJnLmxlbmd0aClcbiAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LmdldC9zZXQ6IGJhZCBudW1iZXIgb2YgZGltZW5zaW9uc1wiKTtcbiAgICBpZiAodGhpcy5sYXlvdXQgPT09IDAgLyogY19sYXlvdXQgKi8pIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kaW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhcmdbaV0gPCAwIHx8IGFyZ1tpXSA+PSB0aGlzLmRpbXNbaV0pIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgICAgICAgb2ZzID0gb2ZzICogdGhpcy5kaW1zW2ldICsgYXJnW2ldO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy5kaW1zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmIChhcmdbaV0gPCAxIHx8IGFyZ1tpXSA+IHRoaXMuZGltc1tpXSkge1xuICAgICAgICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBvZnMgPSBvZnMgKiB0aGlzLmRpbXNbaV0gKyAoYXJnW2ldIC0gMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvZnM7XG4gIH1cblxuICBnZXQob2ZzKSB7XG4gICAgc3dpdGNoICh0aGlzLmtpbmQpIHtcbiAgICAgIGNhc2UgNzpcbiAgICAgICAgLy8gSW50NjRcbiAgICAgICAgdmFyIGwgPSB0aGlzLmRhdGFbb2ZzICogMiArIDBdO1xuICAgICAgICB2YXIgaCA9IHRoaXMuZGF0YVtvZnMgKiAyICsgMV07XG4gICAgICAgIHJldHVybiBjYW1sX2ludDY0X2NyZWF0ZV9sb19oaShsLCBoKTtcbiAgICAgIGNhc2UgMTA6XG4gICAgICBjYXNlIDExOlxuICAgICAgICAvLyBDb21wbGV4MzIsIENvbXBsZXg2NFxuICAgICAgICB2YXIgciA9IHRoaXMuZGF0YVtvZnMgKiAyICsgMF07XG4gICAgICAgIHZhciBpID0gdGhpcy5kYXRhW29mcyAqIDIgKyAxXTtcbiAgICAgICAgcmV0dXJuIFsyNTQsIHIsIGldO1xuICAgICAgY2FzZSAxMzpcbiAgICAgICAgcmV0dXJuIGNhbWxfdW5wYWNrRmxvYXQxNih0aGlzLmRhdGFbb2ZzXSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhW29mc107XG4gICAgfVxuICB9XG5cbiAgc2V0KG9mcywgdikge1xuICAgIHN3aXRjaCAodGhpcy5raW5kKSB7XG4gICAgICBjYXNlIDc6XG4gICAgICAgIC8vIEludDY0XG4gICAgICAgIHRoaXMuZGF0YVtvZnMgKiAyICsgMF0gPSBjYW1sX2ludDY0X2xvMzIodik7XG4gICAgICAgIHRoaXMuZGF0YVtvZnMgKiAyICsgMV0gPSBjYW1sX2ludDY0X2hpMzIodik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMDpcbiAgICAgIGNhc2UgMTE6XG4gICAgICAgIC8vIENvbXBsZXgzMiwgQ29tcGxleDY0XG4gICAgICAgIHRoaXMuZGF0YVtvZnMgKiAyICsgMF0gPSB2WzFdO1xuICAgICAgICB0aGlzLmRhdGFbb2ZzICogMiArIDFdID0gdlsyXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEzOlxuICAgICAgICB0aGlzLmRhdGFbb2ZzXSA9IGNhbWxfcGFja0Zsb2F0MTYodik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5kYXRhW29mc10gPSB2O1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBmaWxsKHYpIHtcbiAgICBzd2l0Y2ggKHRoaXMua2luZCkge1xuICAgICAgY2FzZSA3OlxuICAgICAgICAvLyBJbnQ2NFxuICAgICAgICB2YXIgYSA9IGNhbWxfaW50NjRfbG8zMih2KTtcbiAgICAgICAgdmFyIGIgPSBjYW1sX2ludDY0X2hpMzIodik7XG4gICAgICAgIGlmIChhID09PSBiKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLmZpbGwoYSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtpXSA9IGkgJSAyID09PSAwID8gYSA6IGI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMDpcbiAgICAgIGNhc2UgMTE6XG4gICAgICAgIC8vIENvbXBsZXgzMiwgQ29tcGxleDY0XG4gICAgICAgIHZhciBpbSA9IHZbMV07XG4gICAgICAgIHZhciByZSA9IHZbMl07XG4gICAgICAgIGlmIChpbSA9PT0gcmUpIHtcbiAgICAgICAgICB0aGlzLmRhdGEuZmlsbChpbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtpXSA9IGkgJSAyID09PSAwID8gaW0gOiByZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEzOlxuICAgICAgICB0aGlzLmRhdGEuZmlsbChjYW1sX3BhY2tGbG9hdDE2KHYpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmRhdGEuZmlsbCh2KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY29tcGFyZShiLCB0b3RhbCkge1xuICAgIGlmICh0aGlzLmxheW91dCAhPT0gYi5sYXlvdXQgfHwgdGhpcy5raW5kICE9PSBiLmtpbmQpIHtcbiAgICAgIHZhciBrMSA9IHRoaXMua2luZCB8ICh0aGlzLmxheW91dCA8PCA4KTtcbiAgICAgIHZhciBrMiA9IGIua2luZCB8IChiLmxheW91dCA8PCA4KTtcbiAgICAgIHJldHVybiBrMiAtIGsxO1xuICAgIH1cbiAgICBpZiAodGhpcy5kaW1zLmxlbmd0aCAhPT0gYi5kaW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGIuZGltcy5sZW5ndGggLSB0aGlzLmRpbXMubGVuZ3RoO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGltcy5sZW5ndGg7IGkrKylcbiAgICAgIGlmICh0aGlzLmRpbXNbaV0gIT09IGIuZGltc1tpXSkgcmV0dXJuIHRoaXMuZGltc1tpXSA8IGIuZGltc1tpXSA/IC0xIDogMTtcbiAgICBzd2l0Y2ggKHRoaXMua2luZCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgY2FzZSAxOlxuICAgICAgY2FzZSAxMDpcbiAgICAgIGNhc2UgMTE6XG4gICAgICAgIC8vIEZsb2F0c1xuICAgICAgICB2YXIgeCwgeTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB4ID0gdGhpcy5kYXRhW2ldO1xuICAgICAgICAgIHkgPSBiLmRhdGFbaV07XG4gICAgICAgICAgaWYgKHggPCB5KSByZXR1cm4gLTE7XG4gICAgICAgICAgaWYgKHggPiB5KSByZXR1cm4gMTtcbiAgICAgICAgICBpZiAoeCAhPT0geSkge1xuICAgICAgICAgICAgaWYgKCF0b3RhbCkgcmV0dXJuIE51bWJlci5OYU47XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTih4KSkgcmV0dXJuIDE7XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTih5KSkgcmV0dXJuIC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNzpcbiAgICAgICAgLy8gSW50NjRcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAvLyBDaGVjayBoaWdoZXN0IGJpdHMgZmlyc3RcbiAgICAgICAgICBpZiAodGhpcy5kYXRhW2kgKyAxXSA8IGIuZGF0YVtpICsgMV0pIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhW2kgKyAxXSA+IGIuZGF0YVtpICsgMV0pIHJldHVybiAxO1xuICAgICAgICAgIGlmICh0aGlzLmRhdGFbaV0gPj4+IDAgPCBiLmRhdGFbaV0gPj4+IDApIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhW2ldID4+PiAwID4gYi5kYXRhW2ldID4+PiAwKSByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTM6XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGFhID0gY2FtbF91bnBhY2tGbG9hdDE2KHRoaXMuZGF0YVtpXSk7XG4gICAgICAgICAgdmFyIGJiID0gY2FtbF91bnBhY2tGbG9hdDE2KGIuZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGFhIDwgYmIpIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAoYWEgPiBiYikgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICBjYXNlIDM6XG4gICAgICBjYXNlIDQ6XG4gICAgICBjYXNlIDU6XG4gICAgICBjYXNlIDY6XG4gICAgICBjYXNlIDg6XG4gICAgICBjYXNlIDk6XG4gICAgICBjYXNlIDEyOlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICh0aGlzLmRhdGFbaV0gPCBiLmRhdGFbaV0pIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhW2ldID4gYi5kYXRhW2ldKSByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogTWxfQmlnYXJyYXlfY18xXzFcbi8vUmVxdWlyZXM6IE1sX0JpZ2FycmF5LCBjYW1sX2FycmF5X2JvdW5kX2Vycm9yLCBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmNsYXNzIE1sX0JpZ2FycmF5X2NfMV8xIGV4dGVuZHMgTWxfQmlnYXJyYXkge1xuICBvZmZzZXQoYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykgJiYgYXJnLmxlbmd0aCA9PT0gMSkgYXJnID0gYXJnWzBdO1xuICAgICAgZWxzZSBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJNbF9CaWdhcnJheV9jXzFfMS5vZmZzZXRcIik7XG4gICAgfVxuICAgIGlmIChhcmcgPCAwIHx8IGFyZyA+PSB0aGlzLmRpbXNbMF0pIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgICByZXR1cm4gYXJnO1xuICB9XG5cbiAgZ2V0KG9mcykge1xuICAgIHJldHVybiB0aGlzLmRhdGFbb2ZzXTtcbiAgfVxuXG4gIHNldChvZnMsIHYpIHtcbiAgICB0aGlzLmRhdGFbb2ZzXSA9IHY7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBmaWxsKHYpIHtcbiAgICB0aGlzLmRhdGEuZmlsbCh2KTtcbiAgICByZXR1cm4gMDtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2NvbXBhcmVcbmZ1bmN0aW9uIGNhbWxfYmFfY29tcGFyZShhLCBiLCB0b3RhbCkge1xuICByZXR1cm4gYS5jb21wYXJlKGIsIHRvdGFsKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jcmVhdGVfdW5zYWZlXG4vL1JlcXVpcmVzOiBNbF9CaWdhcnJheSwgTWxfQmlnYXJyYXlfY18xXzEsIGNhbWxfYmFfZ2V0X3NpemUsIGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnRcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGtpbmQsIGxheW91dCwgZGltcywgZGF0YSkge1xuICB2YXIgc2l6ZV9wZXJfZWxlbWVudCA9IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnQoa2luZCk7XG4gIGlmIChjYW1sX2JhX2dldF9zaXplKGRpbXMpICogc2l6ZV9wZXJfZWxlbWVudCAhPT0gZGF0YS5sZW5ndGgpIHtcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJsZW5ndGggZG9lc24ndCBtYXRjaCBkaW1zXCIpO1xuICB9XG4gIGlmIChcbiAgICBsYXlvdXQgPT09IDAgJiYgLy8gY19sYXlvdXRcbiAgICBkaW1zLmxlbmd0aCA9PT0gMSAmJiAvLyBBcnJheTFcbiAgICBzaXplX3Blcl9lbGVtZW50ID09PSAxICYmXG4gICAga2luZCAhPT0gMTMgLy8gZmxvYXQxNlxuICApXG4gICAgLy8gMS10by0xIG1hcHBpbmdcbiAgICByZXR1cm4gbmV3IE1sX0JpZ2FycmF5X2NfMV8xKGtpbmQsIGxheW91dCwgZGltcywgZGF0YSk7XG4gIHJldHVybiBuZXcgTWxfQmlnYXJyYXkoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9iYV9nZXRfc2l6ZSwgY2FtbF9iYV9jcmVhdGVfdW5zYWZlXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV9idWZmZXJcbmZ1bmN0aW9uIGNhbWxfYmFfY3JlYXRlKGtpbmQsIGxheW91dCwgZGltc19tbCkge1xuICB2YXIgZGltcyA9IGNhbWxfanNfZnJvbV9hcnJheShkaW1zX21sKTtcbiAgdmFyIGRhdGEgPSBjYW1sX2JhX2NyZWF0ZV9idWZmZXIoa2luZCwgY2FtbF9iYV9nZXRfc2l6ZShkaW1zKSk7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jaGFuZ2VfbGF5b3V0XG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmVcbmZ1bmN0aW9uIGNhbWxfYmFfY2hhbmdlX2xheW91dChiYSwgbGF5b3V0KSB7XG4gIGlmIChiYS5sYXlvdXQgPT09IGxheW91dCkgcmV0dXJuIGJhO1xuICB2YXIgbmV3X2RpbXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKVxuICAgIG5ld19kaW1zW2ldID0gYmEuZGltc1tiYS5kaW1zLmxlbmd0aCAtIGkgLSAxXTtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShiYS5raW5kLCBsYXlvdXQsIG5ld19kaW1zLCBiYS5kYXRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9raW5kXG5mdW5jdGlvbiBjYW1sX2JhX2tpbmQoYmEpIHtcbiAgcmV0dXJuIGJhLmtpbmQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfbGF5b3V0XG5mdW5jdGlvbiBjYW1sX2JhX2xheW91dChiYSkge1xuICByZXR1cm4gYmEubGF5b3V0O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX251bV9kaW1zXG5mdW5jdGlvbiBjYW1sX2JhX251bV9kaW1zKGJhKSB7XG4gIHJldHVybiBiYS5kaW1zLmxlbmd0aDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9kaW1cbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9iYV9kaW0oYmEsIGkpIHtcbiAgaWYgKGkgPCAwIHx8IGkgPj0gYmEuZGltcy5sZW5ndGgpIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LmRpbVwiKTtcbiAgcmV0dXJuIGJhLmRpbXNbaV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZGltXzFcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZGltXG5mdW5jdGlvbiBjYW1sX2JhX2RpbV8xKGJhKSB7XG4gIHJldHVybiBjYW1sX2JhX2RpbShiYSwgMCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZGltXzJcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZGltXG5mdW5jdGlvbiBjYW1sX2JhX2RpbV8yKGJhKSB7XG4gIHJldHVybiBjYW1sX2JhX2RpbShiYSwgMSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZGltXzNcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZGltXG5mdW5jdGlvbiBjYW1sX2JhX2RpbV8zKGJhKSB7XG4gIHJldHVybiBjYW1sX2JhX2RpbShiYSwgMik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZ2V0X2dlbmVyaWNcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfZ2VuZXJpYyhiYSwgaSkge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGNhbWxfanNfZnJvbV9hcnJheShpKSk7XG4gIHJldHVybiBiYS5nZXQob2ZzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV91aW50OF9nZXQxNlxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9iYV91aW50OF9nZXQxNihiYSwgaTApIHtcbiAgdmFyIG9mcyA9IGJhLm9mZnNldChpMCk7XG4gIGlmIChvZnMgKyAxID49IGJhLmRhdGEubGVuZ3RoKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGJhLmdldChvZnMpO1xuICB2YXIgYjIgPSBiYS5nZXQob2ZzICsgMSk7XG4gIHJldHVybiBiMSB8IChiMiA8PCA4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV91aW50OF9nZXQzMlxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9iYV91aW50OF9nZXQzMihiYSwgaTApIHtcbiAgdmFyIG9mcyA9IGJhLm9mZnNldChpMCk7XG4gIGlmIChvZnMgKyAzID49IGJhLmRhdGEubGVuZ3RoKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGJhLmdldChvZnMgKyAwKTtcbiAgdmFyIGIyID0gYmEuZ2V0KG9mcyArIDEpO1xuICB2YXIgYjMgPSBiYS5nZXQob2ZzICsgMik7XG4gIHZhciBiNCA9IGJhLmdldChvZnMgKyAzKTtcbiAgcmV0dXJuIChiMSA8PCAwKSB8IChiMiA8PCA4KSB8IChiMyA8PCAxNikgfCAoYjQgPDwgMjQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3VpbnQ4X2dldDY0XG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yLCBjYW1sX2ludDY0X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2JhX3VpbnQ4X2dldDY0KGJhLCBpMCkge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGkwKTtcbiAgaWYgKG9mcyArIDcgPj0gYmEuZGF0YS5sZW5ndGgpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIxID0gYmEuZ2V0KG9mcyArIDApO1xuICB2YXIgYjIgPSBiYS5nZXQob2ZzICsgMSk7XG4gIHZhciBiMyA9IGJhLmdldChvZnMgKyAyKTtcbiAgdmFyIGI0ID0gYmEuZ2V0KG9mcyArIDMpO1xuICB2YXIgYjUgPSBiYS5nZXQob2ZzICsgNCk7XG4gIHZhciBiNiA9IGJhLmdldChvZnMgKyA1KTtcbiAgdmFyIGI3ID0gYmEuZ2V0KG9mcyArIDYpO1xuICB2YXIgYjggPSBiYS5nZXQob2ZzICsgNyk7XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2J5dGVzKFtiOCwgYjcsIGI2LCBiNSwgYjQsIGIzLCBiMiwgYjFdKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfMVxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfMShiYSwgaTApIHtcbiAgcmV0dXJuIGJhLmdldChiYS5vZmZzZXQoaTApKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfMlxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfMihiYSwgaTAsIGkxKSB7XG4gIHJldHVybiBiYS5nZXQoYmEub2Zmc2V0KFtpMCwgaTFdKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZ2V0XzNcbmZ1bmN0aW9uIGNhbWxfYmFfZ2V0XzMoYmEsIGkwLCBpMSwgaTIpIHtcbiAgcmV0dXJuIGJhLmdldChiYS5vZmZzZXQoW2kwLCBpMSwgaTJdKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2V0X2dlbmVyaWNcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9iYV9zZXRfZ2VuZXJpYyhiYSwgaSwgdikge1xuICBiYS5zZXQoYmEub2Zmc2V0KGNhbWxfanNfZnJvbV9hcnJheShpKSksIHYpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV91aW50OF9zZXQxNlxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9iYV91aW50OF9zZXQxNihiYSwgaTAsIHYpIHtcbiAgdmFyIG9mcyA9IGJhLm9mZnNldChpMCk7XG4gIGlmIChvZnMgKyAxID49IGJhLmRhdGEubGVuZ3RoKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIGJhLnNldChvZnMgKyAwLCB2ICYgMHhmZik7XG4gIGJhLnNldChvZnMgKyAxLCAodiA+Pj4gOCkgJiAweGZmKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfdWludDhfc2V0MzJcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfYmFfdWludDhfc2V0MzIoYmEsIGkwLCB2KSB7XG4gIHZhciBvZnMgPSBiYS5vZmZzZXQoaTApO1xuICBpZiAob2ZzICsgMyA+PSBiYS5kYXRhLmxlbmd0aCkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICBiYS5zZXQob2ZzICsgMCwgdiAmIDB4ZmYpO1xuICBiYS5zZXQob2ZzICsgMSwgKHYgPj4+IDgpICYgMHhmZik7XG4gIGJhLnNldChvZnMgKyAyLCAodiA+Pj4gMTYpICYgMHhmZik7XG4gIGJhLnNldChvZnMgKyAzLCAodiA+Pj4gMjQpICYgMHhmZik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3VpbnQ4X3NldDY0XG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yLCBjYW1sX2ludDY0X3RvX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2JhX3VpbnQ4X3NldDY0KGJhLCBpMCwgdikge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGkwKTtcbiAgaWYgKG9mcyArIDcgPj0gYmEuZGF0YS5sZW5ndGgpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIHYgPSBjYW1sX2ludDY0X3RvX2J5dGVzKHYpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykgYmEuc2V0KG9mcyArIGksIHZbNyAtIGldKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2V0XzFcbmZ1bmN0aW9uIGNhbWxfYmFfc2V0XzEoYmEsIGkwLCB2KSB7XG4gIGJhLnNldChiYS5vZmZzZXQoaTApLCB2KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2V0XzJcbmZ1bmN0aW9uIGNhbWxfYmFfc2V0XzIoYmEsIGkwLCBpMSwgdikge1xuICBiYS5zZXQoYmEub2Zmc2V0KFtpMCwgaTFdKSwgdik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3NldF8zXG5mdW5jdGlvbiBjYW1sX2JhX3NldF8zKGJhLCBpMCwgaTEsIGkyLCB2KSB7XG4gIGJhLnNldChiYS5vZmZzZXQoW2kwLCBpMSwgaTJdKSwgdik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2ZpbGxcbmZ1bmN0aW9uIGNhbWxfYmFfZmlsbChiYSwgdikge1xuICBiYS5maWxsKHYpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9ibGl0XG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfYmxpdChzcmMsIGRzdCkge1xuICBpZiAoZHN0LmRpbXMubGVuZ3RoICE9PSBzcmMuZGltcy5sZW5ndGgpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuYmxpdDogZGltZW5zaW9uIG1pc21hdGNoXCIpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGRzdC5kaW1zLmxlbmd0aDsgaSsrKVxuICAgIGlmIChkc3QuZGltc1tpXSAhPT0gc3JjLmRpbXNbaV0pXG4gICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5ibGl0OiBkaW1lbnNpb24gbWlzbWF0Y2hcIik7XG4gIGRzdC5kYXRhLnNldChzcmMuZGF0YSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3N1YlxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2JhX2NyZWF0ZV91bnNhZmUsIGNhbWxfYmFfZ2V0X3NpemVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfc3ViKGJhLCBvZnMsIGxlbikge1xuICB2YXIgY2hhbmdlZF9kaW07XG4gIHZhciBtdWwgPSAxO1xuICBpZiAoYmEubGF5b3V0ID09PSAwKSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKSBtdWwgPSBtdWwgKiBiYS5kaW1zW2ldO1xuICAgIGNoYW5nZWRfZGltID0gMDtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJhLmRpbXMubGVuZ3RoIC0gMTsgaSsrKSBtdWwgPSBtdWwgKiBiYS5kaW1zW2ldO1xuICAgIGNoYW5nZWRfZGltID0gYmEuZGltcy5sZW5ndGggLSAxO1xuICAgIG9mcyA9IG9mcyAtIDE7XG4gIH1cbiAgaWYgKG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgKyBsZW4gPiBiYS5kaW1zW2NoYW5nZWRfZGltXSkge1xuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LnN1YjogYmFkIHN1Yi1hcnJheVwiKTtcbiAgfVxuICB2YXIgbmV3X2RpbXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKSBuZXdfZGltc1tpXSA9IGJhLmRpbXNbaV07XG4gIG5ld19kaW1zW2NoYW5nZWRfZGltXSA9IGxlbjtcbiAgbXVsICo9IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnQoYmEua2luZCk7XG4gIHZhciBuZXdfZGF0YSA9IGJhLmRhdGEuc3ViYXJyYXkob2ZzICogbXVsLCAob2ZzICsgbGVuKSAqIG11bCk7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoYmEua2luZCwgYmEubGF5b3V0LCBuZXdfZGltcywgbmV3X2RhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3NsaWNlXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXksIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZSwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2JhX2dldF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50XG5mdW5jdGlvbiBjYW1sX2JhX3NsaWNlKGJhLCB2aW5kKSB7XG4gIHZpbmQgPSBjYW1sX2pzX2Zyb21fYXJyYXkodmluZCk7XG4gIHZhciBudW1faW5kcyA9IHZpbmQubGVuZ3RoO1xuICB2YXIgaW5kZXggPSBbXTtcbiAgdmFyIHN1Yl9kaW1zID0gW107XG4gIHZhciBvZnM7XG5cbiAgaWYgKG51bV9pbmRzID4gYmEuZGltcy5sZW5ndGgpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuc2xpY2U6IHRvbyBtYW55IGluZGljZXNcIik7XG5cbiAgLy8gQ29tcHV0ZSBvZmZzZXQgYW5kIGNoZWNrIGJvdW5kc1xuICBpZiAoYmEubGF5b3V0ID09PSAwKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1faW5kczsgaSsrKSBpbmRleFtpXSA9IHZpbmRbaV07XG4gICAgZm9yICg7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKSBpbmRleFtpXSA9IDA7XG4gICAgc3ViX2RpbXMgPSBiYS5kaW1zLnNsaWNlKG51bV9pbmRzKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bV9pbmRzOyBpKyspXG4gICAgICBpbmRleFtiYS5kaW1zLmxlbmd0aCAtIG51bV9pbmRzICsgaV0gPSB2aW5kW2ldO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGltcy5sZW5ndGggLSBudW1faW5kczsgaSsrKSBpbmRleFtpXSA9IDE7XG4gICAgc3ViX2RpbXMgPSBiYS5kaW1zLnNsaWNlKDAsIGJhLmRpbXMubGVuZ3RoIC0gbnVtX2luZHMpO1xuICB9XG4gIG9mcyA9IGJhLm9mZnNldChpbmRleCk7XG4gIHZhciBzaXplID0gY2FtbF9iYV9nZXRfc2l6ZShzdWJfZGltcyk7XG4gIHZhciBzaXplX3Blcl9lbGVtZW50ID0gY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudChiYS5raW5kKTtcbiAgdmFyIG5ld19kYXRhID0gYmEuZGF0YS5zdWJhcnJheShcbiAgICBvZnMgKiBzaXplX3Blcl9lbGVtZW50LFxuICAgIChvZnMgKyBzaXplKSAqIHNpemVfcGVyX2VsZW1lbnQsXG4gICk7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoYmEua2luZCwgYmEubGF5b3V0LCBzdWJfZGltcywgbmV3X2RhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3Jlc2hhcGVcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheSwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2JhX2NyZWF0ZV91bnNhZmUsIGNhbWxfYmFfZ2V0X3NpemVcbmZ1bmN0aW9uIGNhbWxfYmFfcmVzaGFwZShiYSwgdmluZCkge1xuICB2aW5kID0gY2FtbF9qc19mcm9tX2FycmF5KHZpbmQpO1xuICB2YXIgbmV3X2RpbSA9IFtdO1xuICB2YXIgbnVtX2RpbXMgPSB2aW5kLmxlbmd0aDtcblxuICBpZiAobnVtX2RpbXMgPCAwIHx8IG51bV9kaW1zID4gMTYpIHtcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5yZXNoYXBlOiBiYWQgbnVtYmVyIG9mIGRpbWVuc2lvbnNcIik7XG4gIH1cbiAgdmFyIG51bV9lbHRzID0gMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZGltczsgaSsrKSB7XG4gICAgbmV3X2RpbVtpXSA9IHZpbmRbaV07XG4gICAgaWYgKG5ld19kaW1baV0gPCAwKVxuICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkucmVzaGFwZTogbmVnYXRpdmUgZGltZW5zaW9uXCIpO1xuICAgIG51bV9lbHRzID0gbnVtX2VsdHMgKiBuZXdfZGltW2ldO1xuICB9XG5cbiAgdmFyIHNpemUgPSBjYW1sX2JhX2dldF9zaXplKGJhLmRpbXMpO1xuICAvLyBDaGVjayB0aGF0IHNpemVzIGFncmVlXG4gIGlmIChudW1fZWx0cyAhPT0gc2l6ZSlcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5yZXNoYXBlOiBzaXplIG1pc21hdGNoXCIpO1xuICByZXR1cm4gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGJhLmtpbmQsIGJhLmxheW91dCwgbmV3X2RpbSwgYmEuZGF0YSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2VyaWFsaXplXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQsIGNhbWxfaW50NjRfdG9fYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaW50MzJfYml0c19vZl9mbG9hdFxuLy9SZXF1aXJlczogY2FtbF9wYWNrRmxvYXQxNlxuZnVuY3Rpb24gY2FtbF9iYV9zZXJpYWxpemUod3JpdGVyLCBiYSwgc3opIHtcbiAgd3JpdGVyLndyaXRlKDMyLCBiYS5kaW1zLmxlbmd0aCk7XG4gIHdyaXRlci53cml0ZSgzMiwgYmEua2luZCB8IChiYS5sYXlvdXQgPDwgOCkpO1xuICBpZiAoYmEuY2FtbF9jdXN0b20gPT09IFwiX2JpZ2FycjAyXCIpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYmEuZGltc1tpXSA8IDB4ZmZmZikgd3JpdGVyLndyaXRlKDE2LCBiYS5kaW1zW2ldKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICB3cml0ZXIud3JpdGUoMTYsIDB4ZmZmZik7XG4gICAgICAgIHdyaXRlci53cml0ZSgzMiwgMCk7XG4gICAgICAgIHdyaXRlci53cml0ZSgzMiwgYmEuZGltc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICBlbHNlIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGltcy5sZW5ndGg7IGkrKykgd3JpdGVyLndyaXRlKDMyLCBiYS5kaW1zW2ldKTtcbiAgc3dpdGNoIChiYS5raW5kKSB7XG4gICAgY2FzZSAyOiAvL0ludDhBcnJheVxuICAgIGNhc2UgMzogLy9VaW50OEFycmF5XG4gICAgY2FzZSAxMjogLy9VaW50OEFycmF5XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJhLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgd3JpdGVyLndyaXRlKDgsIGJhLmRhdGFbaV0pO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OiAvLyBJbnQxNkFycmF5XG4gICAgY2FzZSA1OiAvLyBVaW50MTZBcnJheVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHdyaXRlci53cml0ZSgxNiwgYmEuZGF0YVtpXSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDY6IC8vIEludDMyQXJyYXkgKGludDMyKVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHdyaXRlci53cml0ZSgzMiwgYmEuZGF0YVtpXSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDg6IC8vIEludDMyQXJyYXkgKGludClcbiAgICBjYXNlIDk6IC8vIEludDMyQXJyYXkgKG5hdGl2ZWludClcbiAgICAgIHdyaXRlci53cml0ZSg4LCAwKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICB3cml0ZXIud3JpdGUoMzIsIGJhLmRhdGFbaV0pO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA3OiAvLyBJbnQzMkFycmF5IChpbnQ2NClcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGggLyAyOyBpKyspIHtcbiAgICAgICAgdmFyIGIgPSBjYW1sX2ludDY0X3RvX2J5dGVzKGJhLmdldChpKSk7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgODsgaisrKSB3cml0ZXIud3JpdGUoOCwgYltqXSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6IC8vIEZsb2F0NjRBcnJheVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBiID0gY2FtbF9pbnQ2NF90b19ieXRlcyhjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQoYmEuZ2V0KGkpKSk7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgODsgaisrKSB3cml0ZXIud3JpdGUoOCwgYltqXSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEzOiAvLyBGbG9hdDE2QXJyYXlcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICB3cml0ZXIud3JpdGUoMTYsIGJhLmRhdGFbaV0pO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAwOiAvLyBGbG9hdDMyQXJyYXlcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYiA9IGNhbWxfaW50MzJfYml0c19vZl9mbG9hdChiYS5nZXQoaSkpO1xuICAgICAgICB3cml0ZXIud3JpdGUoMzIsIGIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMDogLy8gRmxvYXQzMkFycmF5IChjb21wbGV4MzIpXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJhLmRhdGEubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgICAgIHZhciBqID0gYmEuZ2V0KGkpO1xuICAgICAgICB3cml0ZXIud3JpdGUoMzIsIGNhbWxfaW50MzJfYml0c19vZl9mbG9hdChqWzFdKSk7XG4gICAgICAgIHdyaXRlci53cml0ZSgzMiwgY2FtbF9pbnQzMl9iaXRzX29mX2Zsb2F0KGpbMl0pKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE6IC8vIEZsb2F0NjRBcnJheSAoY29tcGxleDY0KVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aCAvIDI7IGkrKykge1xuICAgICAgICB2YXIgY29tcGxleCA9IGJhLmdldChpKTtcbiAgICAgICAgdmFyIGIgPSBjYW1sX2ludDY0X3RvX2J5dGVzKGNhbWxfaW50NjRfYml0c19vZl9mbG9hdChjb21wbGV4WzFdKSk7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgODsgaisrKSB3cml0ZXIud3JpdGUoOCwgYltqXSk7XG4gICAgICAgIHZhciBiID0gY2FtbF9pbnQ2NF90b19ieXRlcyhjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQoY29tcGxleFsyXSkpO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgd3JpdGVyLndyaXRlKDgsIGJbal0pO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cbiAgc3pbMF0gPSAoNCArIGJhLmRpbXMubGVuZ3RoKSAqIDQ7XG4gIHN6WzFdID0gKDQgKyBiYS5kaW1zLmxlbmd0aCkgKiA4O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2Rlc2VyaWFsaXplXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUsIGNhbWxfZmFpbHdpdGhcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZ2V0X3NpemVcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfYnl0ZXMsIGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0c1xuLy9SZXF1aXJlczogY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV9idWZmZXJcbi8vUmVxdWlyZXM6IGNhbWxfdW5wYWNrRmxvYXQxNlxuZnVuY3Rpb24gY2FtbF9iYV9kZXNlcmlhbGl6ZShyZWFkZXIsIHN6LCBuYW1lKSB7XG4gIHZhciBudW1fZGltcyA9IHJlYWRlci5yZWFkMzJzKCk7XG4gIGlmIChudW1fZGltcyA8IDAgfHwgbnVtX2RpbXMgPiAxNilcbiAgICBjYW1sX2ZhaWx3aXRoKFwiaW5wdXRfdmFsdWU6IHdyb25nIG51bWJlciBvZiBiaWdhcnJheSBkaW1lbnNpb25zXCIpO1xuICB2YXIgdGFnID0gcmVhZGVyLnJlYWQzMnMoKTtcbiAgdmFyIGtpbmQgPSB0YWcgJiAweGZmO1xuICB2YXIgbGF5b3V0ID0gKHRhZyA+PiA4KSAmIDE7XG4gIHZhciBkaW1zID0gW107XG4gIGlmIChuYW1lID09PSBcIl9iaWdhcnIwMlwiKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2RpbXM7IGkrKykge1xuICAgICAgdmFyIHNpemVfZGltID0gcmVhZGVyLnJlYWQxNnUoKTtcbiAgICAgIGlmIChzaXplX2RpbSA9PT0gMHhmZmZmKSB7XG4gICAgICAgIHZhciBzaXplX2RpbV9oaSA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICAgIHZhciBzaXplX2RpbV9sbyA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICAgIGlmIChzaXplX2RpbV9oaSAhPT0gMClcbiAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwiaW5wdXRfdmFsdWU6IGJpZ2FycmF5IGRpbWVuc2lvbiBvdmVyZmxvdyBpbiAzMmJpdFwiKTtcbiAgICAgICAgc2l6ZV9kaW0gPSBzaXplX2RpbV9sbztcbiAgICAgIH1cbiAgICAgIGRpbXMucHVzaChzaXplX2RpbSk7XG4gICAgfVxuICBlbHNlIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2RpbXM7IGkrKykgZGltcy5wdXNoKHJlYWRlci5yZWFkMzJ1KCkpO1xuICB2YXIgc2l6ZSA9IGNhbWxfYmFfZ2V0X3NpemUoZGltcyk7XG4gIHZhciBkYXRhID0gY2FtbF9iYV9jcmVhdGVfYnVmZmVyKGtpbmQsIHNpemUpO1xuICB2YXIgYmEgPSBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhKTtcbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAyOiAvL0ludDhBcnJheVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgZGF0YVtpXSA9IHJlYWRlci5yZWFkOHMoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzogLy9VaW50OEFycmF5XG4gICAgY2FzZSAxMjogLy9VaW50OEFycmF5XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICBkYXRhW2ldID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OiAvLyBJbnQxNkFycmF5XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICBkYXRhW2ldID0gcmVhZGVyLnJlYWQxNnMoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNTogLy8gVWludDE2QXJyYXlcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgIGRhdGFbaV0gPSByZWFkZXIucmVhZDE2dSgpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA2OiAvLyBJbnQzMkFycmF5IChpbnQzMilcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgIGRhdGFbaV0gPSByZWFkZXIucmVhZDMycygpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA4OiAvLyBJbnQzMkFycmF5IChpbnQpXG4gICAgY2FzZSA5OiAvLyBJbnQzMkFycmF5IChuYXRpdmVpbnQpXG4gICAgICB2YXIgc2l4dHkgPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICBpZiAoc2l4dHkpXG4gICAgICAgIGNhbWxfZmFpbHdpdGgoXG4gICAgICAgICAgXCJpbnB1dF92YWx1ZTogY2Fubm90IHJlYWQgYmlnYXJyYXkgd2l0aCA2NC1iaXQgT0NhbWwgaW50c1wiLFxuICAgICAgICApO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgZGF0YVtpXSA9IHJlYWRlci5yZWFkMzJzKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDc6IC8vIChpbnQ2NClcbiAgICAgIHZhciB0ID0gbmV3IEFycmF5KDgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHRbal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgIHZhciBpbnQ2NCA9IGNhbWxfaW50NjRfb2ZfYnl0ZXModCk7XG4gICAgICAgIGJhLnNldChpLCBpbnQ2NCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6IC8vIEZsb2F0NjRBcnJheVxuICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgdmFyIGYgPSBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMoY2FtbF9pbnQ2NF9vZl9ieXRlcyh0KSk7XG4gICAgICAgIGJhLnNldChpLCBmKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTM6IC8vIEZsb2F0MTZBcnJheVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgZGF0YVtpXSA9IHJlYWRlci5yZWFkMTZ1KCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDA6IC8vIEZsb2F0MzJBcnJheVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgdmFyIGYgPSBjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHMocmVhZGVyLnJlYWQzMnMoKSk7XG4gICAgICAgIGJhLnNldChpLCBmKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTA6IC8vIEZsb2F0MzJBcnJheSAoY29tcGxleDMyKVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgdmFyIHJlID0gY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzKHJlYWRlci5yZWFkMzJzKCkpO1xuICAgICAgICB2YXIgaW0gPSBjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHMocmVhZGVyLnJlYWQzMnMoKSk7XG4gICAgICAgIGJhLnNldChpLCBbMjU0LCByZSwgaW1dKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE6IC8vIEZsb2F0NjRBcnJheSAoY29tcGxleDY0KVxuICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgdmFyIHJlID0gY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzKGNhbWxfaW50NjRfb2ZfYnl0ZXModCkpO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgdmFyIGltID0gY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzKGNhbWxfaW50NjRfb2ZfYnl0ZXModCkpO1xuICAgICAgICBiYS5zZXQoaSwgWzI1NCwgcmUsIGltXSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxuICBzelswXSA9ICg0ICsgbnVtX2RpbXMpICogNDtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShraW5kLCBsYXlvdXQsIGRpbXMsIGRhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2NyZWF0ZV9mcm9tXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUsIGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudFxuLy9EZXByZWNhdGVkOiBVc2UgW2NhbWxfYmFfY3JlYXRlX3Vuc2FmZV0gaW5zdGVhZFxuZnVuY3Rpb24gY2FtbF9iYV9jcmVhdGVfZnJvbShkYXRhMSwgZGF0YTIsIF9qc3R5cCwga2luZCwgbGF5b3V0LCBkaW1zKSB7XG4gIGlmIChkYXRhMiB8fCBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50KGtpbmQpID09PSAyKSB7XG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFxuICAgICAgXCJjYW1sX2JhX2NyZWF0ZV9mcm9tOiB1c2UgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZVwiLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShraW5kLCBsYXlvdXQsIGRpbXMsIGRhdGExKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9oYXNoIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF9zaXplLCBjYW1sX2hhc2hfbWl4X2ludCwgY2FtbF9oYXNoX21peF9mbG9hdFxuLy9SZXF1aXJlczogY2FtbF91bnBhY2tGbG9hdDE2LCBjYW1sX2hhc2hfbWl4X2Zsb2F0MTYsIGNhbWxfaGFzaF9taXhfZmxvYXQzMlxuZnVuY3Rpb24gY2FtbF9iYV9oYXNoKGJhKSB7XG4gIHZhciBudW1fZWx0cyA9IGNhbWxfYmFfZ2V0X3NpemUoYmEuZGltcyk7XG4gIHZhciBoID0gMDtcbiAgc3dpdGNoIChiYS5raW5kKSB7XG4gICAgY2FzZSAyOiAvL0ludDhBcnJheVxuICAgIGNhc2UgMzogLy9VaW50OEFycmF5XG4gICAgY2FzZSAxMjogLy9VaW50OEFycmF5XG4gICAgICBpZiAobnVtX2VsdHMgPiAyNTYpIG51bV9lbHRzID0gMjU2O1xuICAgICAgdmFyIHcgPSAwLFxuICAgICAgICBpID0gMDtcbiAgICAgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9lbHRzOyBpICs9IDQpIHtcbiAgICAgICAgdyA9XG4gICAgICAgICAgKGJhLmRhdGFbaSArIDBdICYgMHhmZikgfFxuICAgICAgICAgICgoYmEuZGF0YVtpICsgMV0gJiAweGZmKSA8PCA4KSB8XG4gICAgICAgICAgKChiYS5kYXRhW2kgKyAyXSAmIDB4ZmYpIDw8IDE2KSB8XG4gICAgICAgICAgKGJhLmRhdGFbaSArIDNdIDw8IDI0KTtcbiAgICAgICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHcpO1xuICAgICAgfVxuICAgICAgdyA9IDA7XG4gICAgICBzd2l0Y2ggKG51bV9lbHRzICYgMykge1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgICAgIHcgPSBiYS5kYXRhW2kgKyAyXSA8PCAxNjtcbiAgICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9GYWxsdGhyb3VnaFN3aXRjaENsYXVzZTpcbiAgICAgICAgICB3IHw9IGJhLmRhdGFbaSArIDFdIDw8IDg7XG4gICAgICAgIC8vIGZhbGx0aHJvdWdoXG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICB3IHw9IGJhLmRhdGFbaSArIDBdO1xuICAgICAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB3KTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDogLy8gSW50MTZBcnJheVxuICAgIGNhc2UgNTogLy8gVWludDE2QXJyYXlcbiAgICAgIGlmIChudW1fZWx0cyA+IDEyOCkgbnVtX2VsdHMgPSAxMjg7XG4gICAgICB2YXIgdyA9IDAsXG4gICAgICAgIGkgPSAwO1xuICAgICAgZm9yIChpID0gMDsgaSArIDIgPD0gbnVtX2VsdHM7IGkgKz0gMikge1xuICAgICAgICB3ID0gKGJhLmRhdGFbaSArIDBdICYgMHhmZmZmKSB8IChiYS5kYXRhW2kgKyAxXSA8PCAxNik7XG4gICAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB3KTtcbiAgICAgIH1cbiAgICAgIGlmICgobnVtX2VsdHMgJiAxKSAhPT0gMCkgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIGJhLmRhdGFbaV0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA2OiAvLyBJbnQzMkFycmF5IChpbnQzMilcbiAgICAgIGlmIChudW1fZWx0cyA+IDY0KSBudW1fZWx0cyA9IDY0O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZWx0czsgaSsrKSBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgYmEuZGF0YVtpXSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDg6IC8vIEludDMyQXJyYXkgKGludClcbiAgICBjYXNlIDk6IC8vIEludDMyQXJyYXkgKG5hdGl2ZWludClcbiAgICAgIGlmIChudW1fZWx0cyA+IDY0KSBudW1fZWx0cyA9IDY0O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZWx0czsgaSsrKSBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgYmEuZGF0YVtpXSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDc6IC8vIEludDMyQXJyYXkgKGludDY0KVxuICAgICAgaWYgKG51bV9lbHRzID4gMzIpIG51bV9lbHRzID0gMzI7XG4gICAgICBudW1fZWx0cyAqPSAyO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZWx0czsgaSsrKSB7XG4gICAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCBiYS5kYXRhW2ldKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTA6IC8vIEZsb2F0MzJBcnJheSAoY29tcGxleDMyKVxuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgbnVtX2VsdHMgKj0gMjtcbiAgICAvLyBmYWxsdGhyb3VnaFxuICAgIGNhc2UgMDogLy8gRmxvYXQzMkFycmF5XG4gICAgICBpZiAobnVtX2VsdHMgPiA2NCkgbnVtX2VsdHMgPSA2NDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2VsdHM7IGkrKylcbiAgICAgICAgaCA9IGNhbWxfaGFzaF9taXhfZmxvYXQzMihoLCBiYS5kYXRhW2ldKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE6IC8vIEZsb2F0NjRBcnJheSAoY29tcGxleDY0KVxuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgbnVtX2VsdHMgKj0gMjtcbiAgICAvLyBmYWxsdGhyb3VnaFxuICAgIGNhc2UgMTogLy8gRmxvYXQ2NEFycmF5XG4gICAgICBpZiAobnVtX2VsdHMgPiAzMikgbnVtX2VsdHMgPSAzMjtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2VsdHM7IGkrKykgaCA9IGNhbWxfaGFzaF9taXhfZmxvYXQoaCwgYmEuZGF0YVtpXSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEzOlxuICAgICAgaWYgKG51bV9lbHRzID4gMTI4KSBudW1fZWx0cyA9IDEyODtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2VsdHM7IGkrKykge1xuICAgICAgICBoID0gY2FtbF9oYXNoX21peF9mbG9hdDE2KGgsIGJhLmRhdGFbaV0pO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfZmxvYXQxNlxuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnRcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfZmxvYXQxNihoYXNoLCBkKSB7XG4gIC8qIE5vcm1hbGl6ZSBOYU5zICovXG4gIGlmICgoZCAmIDB4N2MwMCkgPT09IDB4N2MwMCAmJiAoZCAmIDB4MDNmZikgIT09IDApIHtcbiAgICBkID0gMHg3YzAxO1xuICB9IGVsc2UgaWYgKGQgPT09IDB4ODAwMCkge1xuICAgIC8qIE5vcm1hbGl6ZSAtMCBpbnRvICswICovXG4gICAgZCA9IDA7XG4gIH1cbiAgcmV0dXJuIGNhbWxfaGFzaF9taXhfaW50KGhhc2gsIGQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X2Zsb2F0MzJcbi8vUmVxdWlyZXM6IGNhbWxfaW50MzJfYml0c19vZl9mbG9hdFxuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnRcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfZmxvYXQzMihoYXNoLCB2KSB7XG4gIHZhciBpID0gY2FtbF9pbnQzMl9iaXRzX29mX2Zsb2F0KHYpO1xuICAvKiBOb3JtYWxpemUgTmFOcyAqL1xuICBpZiAoKGkgJiAweDdmODAwMDAwKSA9PT0gMHg3ZjgwMDAwMCAmJiAoaSAmIDB4N2ZmZmZmKSAhPT0gMCkge1xuICAgIGkgPSAweDdmODAwMDAxO1xuICB9IGVsc2UgaWYgKGkgPT09ICgweDgwMDAwMDAwIHwgMCkpIHtcbiAgICAvKiBOb3JtYWxpemUgLTAgaW50byArMCAqL1xuICAgIC8vIFRoaXMgY29kZSBwYXRoIGlzIG5vdCB1c2VkIGJ5IGNhbWxfaGFzaCBiZWNhdXNlIDAgYW5kIC0wIGxvb2tcbiAgICAvLyBsaWtlIGludGVnZXJzXG4gICAgaSA9IDA7XG4gIH1cbiAgaGFzaCA9IGNhbWxfaGFzaF9taXhfaW50KGhhc2gsIGkpO1xuICByZXR1cm4gaGFzaDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV90b190eXBlZF9hcnJheSBtdXRhYmxlXG5mdW5jdGlvbiBjYW1sX2JhX3RvX3R5cGVkX2FycmF5KGJhKSB7XG4gIHJldHVybiBiYS5kYXRhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXkgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXkodGEpIHtcbiAgdmFyIGtpbmQ7XG4gIGlmICh0YSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkga2luZCA9IDA7XG4gIGVsc2UgaWYgKHRhIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KSBraW5kID0gMTtcbiAgZWxzZSBpZiAodGEgaW5zdGFuY2VvZiBJbnQ4QXJyYXkpIGtpbmQgPSAyO1xuICBlbHNlIGlmICh0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIGtpbmQgPSAzO1xuICBlbHNlIGlmICh0YSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSBraW5kID0gMztcbiAgZWxzZSBpZiAodGEgaW5zdGFuY2VvZiBJbnQxNkFycmF5KSBraW5kID0gNDtcbiAgZWxzZSBpZiAodGEgaW5zdGFuY2VvZiBVaW50MTZBcnJheSkga2luZCA9IDU7XG4gIGVsc2UgaWYgKHRhIGluc3RhbmNlb2YgSW50MzJBcnJheSkga2luZCA9IDY7XG4gIGVsc2UgaWYgKHRhIGluc3RhbmNlb2YgVWludDMyQXJyYXkpIGtpbmQgPSA2O1xuICBlbHNlIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNhbWxfYmFfa2luZF9vZl90eXBlZF9hcnJheTogdW5zdXBwb3J0ZWQga2luZFwiKTtcbiAgcmV0dXJuIGtpbmQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZnJvbV90eXBlZF9hcnJheSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfYmFfY3JlYXRlX3Vuc2FmZVxuZnVuY3Rpb24gY2FtbF9iYV9mcm9tX3R5cGVkX2FycmF5KHRhKSB7XG4gIHZhciBraW5kID0gY2FtbF9iYV9raW5kX29mX3R5cGVkX2FycmF5KHRhKTtcbiAgdmFyIHRhID1cbiAgICAvKiBOZWVkZWQgdG8gYXZvaWQgdW5zaWduZWQgc2V0dGVycyBvdmVyZmxvd2luZ1xuICAgICAgICAgdGhlIHJhbmdlIG9mIE9DYW1sIFtpbnQzMl0gdmFsdWVzLiAqL1xuICAgIHRhIGluc3RhbmNlb2YgVWludDMyQXJyYXlcbiAgICAgID8gbmV3IEludDMyQXJyYXkodGEuYnVmZmVyLCB0YS5ieXRlT2Zmc2V0LCB0YS5sZW5ndGgpXG4gICAgICA6IHRhO1xuICByZXR1cm4gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGtpbmQsIDAsIFt0YS5sZW5ndGhdLCB0YSk7XG59XG4iLCIvLy8vLy8vLy8gQklHU1RSSU5HXG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfYmlnc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2J5dGVzX2FyclxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9iaWdzdHJpbmcoaCwgYnMpIHtcbiAgcmV0dXJuIGNhbWxfaGFzaF9taXhfYnl0ZXNfYXJyKGgsIGJzLmRhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBiaWdzdHJpbmdfdG9fYXJyYXlfYnVmZmVyIG11dGFibGVcbmZ1bmN0aW9uIGJpZ3N0cmluZ190b19hcnJheV9idWZmZXIoYnMpIHtcbiAgcmV0dXJuIGJzLmRhdGEuYnVmZmVyO1xufVxuXG4vL1Byb3ZpZGVzOiBiaWdzdHJpbmdfdG9fdHlwZWRfYXJyYXkgbXV0YWJsZVxuZnVuY3Rpb24gYmlnc3RyaW5nX3RvX3R5cGVkX2FycmF5KGJzKSB7XG4gIHJldHVybiBicy5kYXRhO1xufVxuXG4vL1Byb3ZpZGVzOiBiaWdzdHJpbmdfb2ZfYXJyYXlfYnVmZmVyIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfY3JlYXRlX3Vuc2FmZVxuZnVuY3Rpb24gYmlnc3RyaW5nX29mX2FycmF5X2J1ZmZlcihhYikge1xuICB2YXIgdGEgPSBuZXcgVWludDhBcnJheShhYik7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoMTIsIDAsIFt0YS5sZW5ndGhdLCB0YSk7XG59XG5cbi8vUHJvdmlkZXM6IGJpZ3N0cmluZ19vZl90eXBlZF9hcnJheSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmVcbmZ1bmN0aW9uIGJpZ3N0cmluZ19vZl90eXBlZF9hcnJheShiYSkge1xuICB2YXIgdGEgPSBuZXcgVWludDhBcnJheShcbiAgICBiYS5idWZmZXIsXG4gICAgYmEuYnl0ZU9mZnNldCxcbiAgICBiYS5sZW5ndGggKiBiYS5CWVRFU19QRVJfRUxFTUVOVCxcbiAgKTtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZSgxMiwgMCwgW3RhLmxlbmd0aF0sIHRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iaWdzdHJpbmdfbWVtY21wXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF8xXG5mdW5jdGlvbiBjYW1sX2JpZ3N0cmluZ19tZW1jbXAoczEsIHBvczEsIHMyLCBwb3MyLCBsZW4pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBhID0gY2FtbF9iYV9nZXRfMShzMSwgcG9zMSArIGkpO1xuICAgIHZhciBiID0gY2FtbF9iYV9nZXRfMShzMiwgcG9zMiArIGkpO1xuICAgIGlmIChhIDwgYikgcmV0dXJuIC0xO1xuICAgIGlmIChhID4gYikgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYmFcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9iaWdzdHJpbmdfYmxpdF9iYV90b19iYShiYTEsIHBvczEsIGJhMiwgcG9zMiwgbGVuKSB7XG4gIGlmICgxMiAhPT0gYmExLmtpbmQpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY2FtbF9iaWdzdHJpbmdfYmxpdF9iYV90b19iYToga2luZCBtaXNtYXRjaFwiKTtcbiAgaWYgKDEyICE9PSBiYTIua2luZClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjYW1sX2JpZ3N0cmluZ19ibGl0X2JhX3RvX2JhOiBraW5kIG1pc21hdGNoXCIpO1xuICBpZiAobGVuID09PSAwKSByZXR1cm4gMDtcbiAgdmFyIG9mczEgPSBiYTEub2Zmc2V0KHBvczEpO1xuICB2YXIgb2ZzMiA9IGJhMi5vZmZzZXQocG9zMik7XG4gIGlmIChvZnMxICsgbGVuID4gYmExLmRhdGEubGVuZ3RoKSB7XG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB9XG4gIGlmIChvZnMyICsgbGVuID4gYmEyLmRhdGEubGVuZ3RoKSB7XG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB9XG4gIHZhciBzbGljZSA9IGJhMS5kYXRhLnN1YmFycmF5KG9mczEsIG9mczEgKyBsZW4pO1xuICBiYTIuZGF0YS5zZXQoc2xpY2UsIHBvczIpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmFcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9hcnJheV9ib3VuZF9lcnJvciwgY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmEoc3RyMSwgcG9zMSwgYmEyLCBwb3MyLCBsZW4pIHtcbiAgaWYgKDEyICE9PSBiYTIua2luZClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjYW1sX2JpZ3N0cmluZ19ibGl0X3N0cmluZ190b19iYToga2luZCBtaXNtYXRjaFwiKTtcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDA7XG4gIHZhciBvZnMyID0gYmEyLm9mZnNldChwb3MyKTtcbiAgaWYgKHBvczEgKyBsZW4gPiBjYW1sX21sX3N0cmluZ19sZW5ndGgoc3RyMSkpIHtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgaWYgKG9mczIgKyBsZW4gPiBiYTIuZGF0YS5sZW5ndGgpIHtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgdmFyIHNsaWNlID0gY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmcoc3RyMSkuc3ViYXJyYXkocG9zMSwgcG9zMSArIGxlbik7XG4gIGJhMi5kYXRhLnNldChzbGljZSwgb2ZzMik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JpZ3N0cmluZ19ibGl0X2J5dGVzX3RvX2JhXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IsIGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfbWxfYnl0ZXNfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX2JpZ3N0cmluZ19ibGl0X2J5dGVzX3RvX2JhKHN0cjEsIHBvczEsIGJhMiwgcG9zMiwgbGVuKSB7XG4gIGlmICgxMiAhPT0gYmEyLmtpbmQpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmE6IGtpbmQgbWlzbWF0Y2hcIik7XG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwO1xuICB2YXIgb2ZzMiA9IGJhMi5vZmZzZXQocG9zMik7XG4gIGlmIChwb3MxICsgbGVuID4gY2FtbF9tbF9ieXRlc19sZW5ndGgoc3RyMSkpIHtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgaWYgKG9mczIgKyBsZW4gPiBiYTIuZGF0YS5sZW5ndGgpIHtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgdmFyIHNsaWNlID0gY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyhzdHIxKS5zdWJhcnJheShwb3MxLCBwb3MxICsgbGVuKTtcbiAgYmEyLmRhdGEuc2V0KHNsaWNlLCBvZnMyKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9ibGl0X2J5dGVzLCBjYW1sX2J5dGVzX29mX3VpbnQ4X2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX21sX2J5dGVzX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9iaWdzdHJpbmdfYmxpdF9iYV90b19ieXRlcyhiYTEsIHBvczEsIGJ5dGVzMiwgcG9zMiwgbGVuKSB7XG4gIGlmICgxMiAhPT0gYmExLmtpbmQpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmE6IGtpbmQgbWlzbWF0Y2hcIik7XG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwO1xuICB2YXIgb2ZzMSA9IGJhMS5vZmZzZXQocG9zMSk7XG4gIGlmIChvZnMxICsgbGVuID4gYmExLmRhdGEubGVuZ3RoKSB7XG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB9XG4gIGlmIChwb3MyICsgbGVuID4gY2FtbF9tbF9ieXRlc19sZW5ndGgoYnl0ZXMyKSkge1xuICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgfVxuICB2YXIgc2xpY2UgPSBiYTEuZGF0YS5zdWJhcnJheShvZnMxLCBvZnMxICsgbGVuKTtcbiAgY2FtbF9ibGl0X2J5dGVzKGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXkoc2xpY2UpLCAwLCBieXRlczIsIHBvczIsIGxlbik7XG4gIHJldHVybiAwO1xufVxuIiwiLy9Qcm92aWRlczogYmxha2UyYlxuLy9WZXJzaW9uOiA+PSA1LjJcbnZhciBibGFrZTJiID0gKGZ1bmN0aW9uICgpIHtcbiAgLy8gQmxha2UyQiBpbiBwdXJlIEphdmFzY3JpcHRcbiAgLy8gQWRhcHRlZCBmcm9tIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaW4gUkZDNzY5M1xuICAvLyBQb3J0ZWQgdG8gSmF2YXNjcmlwdCBieSBEQyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9kY3Bvc2NoXG5cbiAgLy8gNjQtYml0IHVuc2lnbmVkIGFkZGl0aW9uXG4gIC8vIFNldHMgdlthLGErMV0gKz0gdltiLGIrMV1cbiAgLy8gdiBzaG91bGQgYmUgYSBVaW50MzJBcnJheVxuICBmdW5jdGlvbiBBREQ2NEFBKHYsIGEsIGIpIHtcbiAgICBjb25zdCBvMCA9IHZbYV0gKyB2W2JdO1xuICAgIGxldCBvMSA9IHZbYSArIDFdICsgdltiICsgMV07XG4gICAgaWYgKG8wID49IDB4MTAwMDAwMDAwKSB7XG4gICAgICBvMSsrO1xuICAgIH1cbiAgICB2W2FdID0gbzA7XG4gICAgdlthICsgMV0gPSBvMTtcbiAgfVxuXG4gIC8vIDY0LWJpdCB1bnNpZ25lZCBhZGRpdGlvblxuICAvLyBTZXRzIHZbYSxhKzFdICs9IGJcbiAgLy8gYjAgaXMgdGhlIGxvdyAzMiBiaXRzIG9mIGIsIGIxIHJlcHJlc2VudHMgdGhlIGhpZ2ggMzIgYml0c1xuICBmdW5jdGlvbiBBREQ2NEFDKHYsIGEsIGIwLCBiMSkge1xuICAgIGxldCBvMCA9IHZbYV0gKyBiMDtcbiAgICBpZiAoYjAgPCAwKSB7XG4gICAgICBvMCArPSAweDEwMDAwMDAwMDtcbiAgICB9XG4gICAgbGV0IG8xID0gdlthICsgMV0gKyBiMTtcbiAgICBpZiAobzAgPj0gMHgxMDAwMDAwMDApIHtcbiAgICAgIG8xKys7XG4gICAgfVxuICAgIHZbYV0gPSBvMDtcbiAgICB2W2EgKyAxXSA9IG8xO1xuICB9XG5cbiAgLy8gTGl0dGxlLWVuZGlhbiBieXRlIGFjY2Vzc1xuICBmdW5jdGlvbiBCMkJfR0VUMzIoYXJyLCBpKSB7XG4gICAgcmV0dXJuIGFycltpXSBeIChhcnJbaSArIDFdIDw8IDgpIF4gKGFycltpICsgMl0gPDwgMTYpIF4gKGFycltpICsgM10gPDwgMjQpO1xuICB9XG5cbiAgLy8gRyBNaXhpbmcgZnVuY3Rpb25cbiAgLy8gVGhlIFJPVFJzIGFyZSBpbmxpbmVkIGZvciBzcGVlZFxuICBmdW5jdGlvbiBCMkJfRyhhLCBiLCBjLCBkLCBpeCwgaXkpIHtcbiAgICBjb25zdCB4MCA9IG1baXhdO1xuICAgIGNvbnN0IHgxID0gbVtpeCArIDFdO1xuICAgIGNvbnN0IHkwID0gbVtpeV07XG4gICAgY29uc3QgeTEgPSBtW2l5ICsgMV07XG5cbiAgICBBREQ2NEFBKHYsIGEsIGIpOyAvLyB2W2EsYSsxXSArPSB2W2IsYisxXSAuLi4gaW4gSlMgd2UgbXVzdCBzdG9yZSBhIHVpbnQ2NCBhcyB0d28gdWludDMyc1xuICAgIEFERDY0QUModiwgYSwgeDAsIHgxKTsgLy8gdlthLCBhKzFdICs9IHggLi4uIHgwIGlzIHRoZSBsb3cgMzIgYml0cyBvZiB4LCB4MSBpcyB0aGUgaGlnaCAzMiBiaXRzXG5cbiAgICAvLyB2W2QsZCsxXSA9ICh2W2QsZCsxXSB4b3IgdlthLGErMV0pIHJvdGF0ZWQgdG8gdGhlIHJpZ2h0IGJ5IDMyIGJpdHNcbiAgICBsZXQgeG9yMCA9IHZbZF0gXiB2W2FdO1xuICAgIGxldCB4b3IxID0gdltkICsgMV0gXiB2W2EgKyAxXTtcbiAgICB2W2RdID0geG9yMTtcbiAgICB2W2QgKyAxXSA9IHhvcjA7XG5cbiAgICBBREQ2NEFBKHYsIGMsIGQpO1xuXG4gICAgLy8gdltiLGIrMV0gPSAodltiLGIrMV0geG9yIHZbYyxjKzFdKSByb3RhdGVkIHJpZ2h0IGJ5IDI0IGJpdHNcbiAgICB4b3IwID0gdltiXSBeIHZbY107XG4gICAgeG9yMSA9IHZbYiArIDFdIF4gdltjICsgMV07XG4gICAgdltiXSA9ICh4b3IwID4+PiAyNCkgXiAoeG9yMSA8PCA4KTtcbiAgICB2W2IgKyAxXSA9ICh4b3IxID4+PiAyNCkgXiAoeG9yMCA8PCA4KTtcblxuICAgIEFERDY0QUEodiwgYSwgYik7XG4gICAgQURENjRBQyh2LCBhLCB5MCwgeTEpO1xuXG4gICAgLy8gdltkLGQrMV0gPSAodltkLGQrMV0geG9yIHZbYSxhKzFdKSByb3RhdGVkIHJpZ2h0IGJ5IDE2IGJpdHNcbiAgICB4b3IwID0gdltkXSBeIHZbYV07XG4gICAgeG9yMSA9IHZbZCArIDFdIF4gdlthICsgMV07XG4gICAgdltkXSA9ICh4b3IwID4+PiAxNikgXiAoeG9yMSA8PCAxNik7XG4gICAgdltkICsgMV0gPSAoeG9yMSA+Pj4gMTYpIF4gKHhvcjAgPDwgMTYpO1xuXG4gICAgQURENjRBQSh2LCBjLCBkKTtcblxuICAgIC8vIHZbYixiKzFdID0gKHZbYixiKzFdIHhvciB2W2MsYysxXSkgcm90YXRlZCByaWdodCBieSA2MyBiaXRzXG4gICAgeG9yMCA9IHZbYl0gXiB2W2NdO1xuICAgIHhvcjEgPSB2W2IgKyAxXSBeIHZbYyArIDFdO1xuICAgIHZbYl0gPSAoeG9yMSA+Pj4gMzEpIF4gKHhvcjAgPDwgMSk7XG4gICAgdltiICsgMV0gPSAoeG9yMCA+Pj4gMzEpIF4gKHhvcjEgPDwgMSk7XG4gIH1cblxuICAvLyBJbml0aWFsaXphdGlvbiBWZWN0b3JcbiAgY29uc3QgQkxBS0UyQl9JVjMyID0gbmV3IFVpbnQzMkFycmF5KFtcbiAgICAweGYzYmNjOTA4LCAweDZhMDllNjY3LCAweDg0Y2FhNzNiLCAweGJiNjdhZTg1LCAweGZlOTRmODJiLCAweDNjNmVmMzcyLFxuICAgIDB4NWYxZDM2ZjEsIDB4YTU0ZmY1M2EsIDB4YWRlNjgyZDEsIDB4NTEwZTUyN2YsIDB4MmIzZTZjMWYsIDB4OWIwNTY4OGMsXG4gICAgMHhmYjQxYmQ2YiwgMHgxZjgzZDlhYiwgMHgxMzdlMjE3OSwgMHg1YmUwY2QxOSxcbiAgXSk7XG5cbiAgY29uc3QgU0lHTUE4ID0gW1xuICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE0LCAxMCwgNCwgOCwgOSwgMTUsXG4gICAgMTMsIDYsIDEsIDEyLCAwLCAyLCAxMSwgNywgNSwgMywgMTEsIDgsIDEyLCAwLCA1LCAyLCAxNSwgMTMsIDEwLCAxNCwgMywgNixcbiAgICA3LCAxLCA5LCA0LCA3LCA5LCAzLCAxLCAxMywgMTIsIDExLCAxNCwgMiwgNiwgNSwgMTAsIDQsIDAsIDE1LCA4LCA5LCAwLCA1LFxuICAgIDcsIDIsIDQsIDEwLCAxNSwgMTQsIDEsIDExLCAxMiwgNiwgOCwgMywgMTMsIDIsIDEyLCA2LCAxMCwgMCwgMTEsIDgsIDMsIDQsXG4gICAgMTMsIDcsIDUsIDE1LCAxNCwgMSwgOSwgMTIsIDUsIDEsIDE1LCAxNCwgMTMsIDQsIDEwLCAwLCA3LCA2LCAzLCA5LCAyLCA4LFxuICAgIDExLCAxMywgMTEsIDcsIDE0LCAxMiwgMSwgMywgOSwgNSwgMCwgMTUsIDQsIDgsIDYsIDIsIDEwLCA2LCAxNSwgMTQsIDksIDExLFxuICAgIDMsIDAsIDgsIDEyLCAyLCAxMywgNywgMSwgNCwgMTAsIDUsIDEwLCAyLCA4LCA0LCA3LCA2LCAxLCA1LCAxNSwgMTEsIDksIDE0LFxuICAgIDMsIDEyLCAxMywgMCwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTQsIDEwLFxuICAgIDQsIDgsIDksIDE1LCAxMywgNiwgMSwgMTIsIDAsIDIsIDExLCA3LCA1LCAzLFxuICBdO1xuXG4gIC8vIFRoZXNlIGFyZSBvZmZzZXRzIGludG8gYSB1aW50NjQgYnVmZmVyLlxuICAvLyBNdWx0aXBseSB0aGVtIGFsbCBieSAyIHRvIG1ha2UgdGhlbSBvZmZzZXRzIGludG8gYSB1aW50MzIgYnVmZmVyLFxuICAvLyBiZWNhdXNlIHRoaXMgaXMgSmF2YXNjcmlwdCBhbmQgd2UgZG9uJ3QgaGF2ZSB1aW50NjRzXG4gIGNvbnN0IFNJR01BODIgPSBuZXcgVWludDhBcnJheShcbiAgICBTSUdNQTgubWFwKGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4geCAqIDI7XG4gICAgfSksXG4gICk7XG5cbiAgLy8gQ29tcHJlc3Npb24gZnVuY3Rpb24uICdsYXN0JyBmbGFnIGluZGljYXRlcyBsYXN0IGJsb2NrLlxuICAvLyBOb3RlIHdlJ3JlIHJlcHJlc2VudGluZyAxNiB1aW50NjRzIGFzIDMyIHVpbnQzMnNcbiAgY29uc3QgdiA9IG5ldyBVaW50MzJBcnJheSgzMik7XG4gIGNvbnN0IG0gPSBuZXcgVWludDMyQXJyYXkoMzIpO1xuICBmdW5jdGlvbiBibGFrZTJiQ29tcHJlc3MoY3R4LCBsYXN0KSB7XG4gICAgbGV0IGkgPSAwO1xuXG4gICAgLy8gaW5pdCB3b3JrIHZhcmlhYmxlc1xuICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICB2W2ldID0gY3R4LmhbaV07XG4gICAgICB2W2kgKyAxNl0gPSBCTEFLRTJCX0lWMzJbaV07XG4gICAgfVxuXG4gICAgLy8gbG93IDY0IGJpdHMgb2Ygb2Zmc2V0XG4gICAgdlsyNF0gPSB2WzI0XSBeIGN0eC50O1xuICAgIHZbMjVdID0gdlsyNV0gXiAoY3R4LnQgLyAweDEwMDAwMDAwMCk7XG4gICAgLy8gaGlnaCA2NCBiaXRzIG5vdCBzdXBwb3J0ZWQsIG9mZnNldCBtYXkgbm90IGJlIGhpZ2hlciB0aGFuIDIqKjUzLTFcblxuICAgIC8vIGxhc3QgYmxvY2sgZmxhZyBzZXQgP1xuICAgIGlmIChsYXN0KSB7XG4gICAgICB2WzI4XSA9IH52WzI4XTtcbiAgICAgIHZbMjldID0gfnZbMjldO1xuICAgIH1cblxuICAgIC8vIGdldCBsaXR0bGUtZW5kaWFuIHdvcmRzXG4gICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHtcbiAgICAgIG1baV0gPSBCMkJfR0VUMzIoY3R4LmIsIDQgKiBpKTtcbiAgICB9XG5cbiAgICAvLyB0d2VsdmUgcm91bmRzIG9mIG1peGluZ1xuICAgIC8vIHVuY29tbWVudCB0aGUgRGVidWdQcmludCBjYWxscyB0byBsb2cgdGhlIGNvbXB1dGF0aW9uXG4gICAgLy8gYW5kIG1hdGNoIHRoZSBSRkMgc2FtcGxlIGRvY3VtZW50YXRpb25cbiAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgQjJCX0coMCwgOCwgMTYsIDI0LCBTSUdNQTgyW2kgKiAxNiArIDBdLCBTSUdNQTgyW2kgKiAxNiArIDFdKTtcbiAgICAgIEIyQl9HKDIsIDEwLCAxOCwgMjYsIFNJR01BODJbaSAqIDE2ICsgMl0sIFNJR01BODJbaSAqIDE2ICsgM10pO1xuICAgICAgQjJCX0coNCwgMTIsIDIwLCAyOCwgU0lHTUE4MltpICogMTYgKyA0XSwgU0lHTUE4MltpICogMTYgKyA1XSk7XG4gICAgICBCMkJfRyg2LCAxNCwgMjIsIDMwLCBTSUdNQTgyW2kgKiAxNiArIDZdLCBTSUdNQTgyW2kgKiAxNiArIDddKTtcbiAgICAgIEIyQl9HKDAsIDEwLCAyMCwgMzAsIFNJR01BODJbaSAqIDE2ICsgOF0sIFNJR01BODJbaSAqIDE2ICsgOV0pO1xuICAgICAgQjJCX0coMiwgMTIsIDIyLCAyNCwgU0lHTUE4MltpICogMTYgKyAxMF0sIFNJR01BODJbaSAqIDE2ICsgMTFdKTtcbiAgICAgIEIyQl9HKDQsIDE0LCAxNiwgMjYsIFNJR01BODJbaSAqIDE2ICsgMTJdLCBTSUdNQTgyW2kgKiAxNiArIDEzXSk7XG4gICAgICBCMkJfRyg2LCA4LCAxOCwgMjgsIFNJR01BODJbaSAqIDE2ICsgMTRdLCBTSUdNQTgyW2kgKiAxNiArIDE1XSk7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgIGN0eC5oW2ldID0gY3R4LmhbaV0gXiB2W2ldIF4gdltpICsgMTZdO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJldXNhYmxlIHBhcmFtZXRlckJsb2NrXG4gIGNvbnN0IHBhcmFtZXRlckJsb2NrID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgIDAsXG4gICAgMCxcbiAgICAwLFxuICAgIDAsIC8vICAwOiBvdXRsZW4sIGtleWxlbiwgZmFub3V0LCBkZXB0aFxuICAgIDAsXG4gICAgMCxcbiAgICAwLFxuICAgIDAsIC8vICA0OiBsZWFmIGxlbmd0aCwgc2VxdWVudGlhbCBtb2RlXG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCwgLy8gIDg6IG5vZGUgb2Zmc2V0XG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCwgLy8gMTI6IG5vZGUgb2Zmc2V0XG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCwgLy8gMTY6IG5vZGUgZGVwdGgsIGlubmVyIGxlbmd0aCwgcmZ1XG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCwgLy8gMjA6IHJmdVxuICAgIDAsXG4gICAgMCxcbiAgICAwLFxuICAgIDAsIC8vIDI0OiByZnVcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICAwLCAvLyAyODogcmZ1XG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCwgLy8gMzI6IHNhbHRcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICAwLCAvLyAzNjogc2FsdFxuICAgIDAsXG4gICAgMCxcbiAgICAwLFxuICAgIDAsIC8vIDQwOiBzYWx0XG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCwgLy8gNDQ6IHNhbHRcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICAwLCAvLyA0ODogcGVyc29uYWxcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICAwLCAvLyA1MjogcGVyc29uYWxcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICAwLCAvLyA1NjogcGVyc29uYWxcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICAwLCAvLyA2MDogcGVyc29uYWxcbiAgXSk7XG5cbiAgLy8gQ3JlYXRlcyBhIEJMQUtFMmIgaGFzaGluZyBjb250ZXh0XG4gIC8vIFJlcXVpcmVzIGFuIG91dHB1dCBsZW5ndGggYmV0d2VlbiAxIGFuZCA2NCBieXRlc1xuICAvLyBUYWtlcyBhbiBvcHRpb25hbCBVaW50OEFycmF5IGtleVxuICBmdW5jdGlvbiBibGFrZTJiSW5pdChvdXRsZW4sIGtleSkge1xuICAgIGlmIChvdXRsZW4gPT09IDAgfHwgb3V0bGVuID4gNjQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIklsbGVnYWwgb3V0cHV0IGxlbmd0aCwgZXhwZWN0ZWQgMCA8IGxlbmd0aCA8PSA2NFwiKTtcbiAgICB9XG4gICAgaWYgKGtleS5sZW5ndGggPiA2NCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBrZXksIGV4cGVjdGVkIFVpbnQ4QXJyYXkgd2l0aCAwIDwgbGVuZ3RoIDw9IDY0XCIpO1xuICAgIH1cblxuICAgIC8vIHN0YXRlLCAncGFyYW0gYmxvY2snXG4gICAgY29uc3QgY3R4ID0ge1xuICAgICAgYjogbmV3IFVpbnQ4QXJyYXkoMTI4KSxcbiAgICAgIGg6IG5ldyBVaW50MzJBcnJheSgxNiksXG4gICAgICB0OiAwLCAvLyBpbnB1dCBjb3VudFxuICAgICAgYzogMCwgLy8gcG9pbnRlciB3aXRoaW4gYnVmZmVyXG4gICAgICBvdXRsZW46IG91dGxlbiwgLy8gb3V0cHV0IGxlbmd0aCBpbiBieXRlc1xuICAgIH07XG5cbiAgICAvLyBpbml0aWFsaXplIHBhcmFtZXRlckJsb2NrIGJlZm9yZSB1c2FnZVxuICAgIHBhcmFtZXRlckJsb2NrLmZpbGwoMCk7XG4gICAgcGFyYW1ldGVyQmxvY2tbMF0gPSBvdXRsZW47XG4gICAgcGFyYW1ldGVyQmxvY2tbMV0gPSBrZXkubGVuZ3RoO1xuICAgIHBhcmFtZXRlckJsb2NrWzJdID0gMTsgLy8gZmFub3V0XG4gICAgcGFyYW1ldGVyQmxvY2tbM10gPSAxOyAvLyBkZXB0aFxuXG4gICAgLy8gaW5pdGlhbGl6ZSBoYXNoIHN0YXRlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICBjdHguaFtpXSA9IEJMQUtFMkJfSVYzMltpXSBeIEIyQl9HRVQzMihwYXJhbWV0ZXJCbG9jaywgaSAqIDQpO1xuICAgIH1cblxuICAgIGlmIChrZXkubGVuZ3RoID4gMCkge1xuICAgICAgYmxha2UyYlVwZGF0ZShjdHgsIGtleSk7XG4gICAgICAvLyBhdCB0aGUgZW5kXG4gICAgICBjdHguYyA9IDEyODtcbiAgICB9XG5cbiAgICByZXR1cm4gY3R4O1xuICB9XG5cbiAgLy8gVXBkYXRlcyBhIEJMQUtFMmIgc3RyZWFtaW5nIGhhc2hcbiAgLy8gUmVxdWlyZXMgaGFzaCBjb250ZXh0IGFuZCBVaW50OEFycmF5IChieXRlIGFycmF5KVxuICBmdW5jdGlvbiBibGFrZTJiVXBkYXRlKGN0eCwgaW5wdXQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY3R4LmMgPT09IDEyOCkge1xuICAgICAgICAvLyBidWZmZXIgZnVsbCA/XG4gICAgICAgIGN0eC50ICs9IGN0eC5jOyAvLyBhZGQgY291bnRlcnNcbiAgICAgICAgYmxha2UyYkNvbXByZXNzKGN0eCwgZmFsc2UpOyAvLyBjb21wcmVzcyAobm90IGxhc3QpXG4gICAgICAgIGN0eC5jID0gMDsgLy8gY291bnRlciB0byB6ZXJvXG4gICAgICB9XG4gICAgICBjdHguYltjdHguYysrXSA9IGlucHV0W2ldO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvbXBsZXRlcyBhIEJMQUtFMmIgc3RyZWFtaW5nIGhhc2hcbiAgLy8gUmV0dXJucyBhIFVpbnQ4QXJyYXkgY29udGFpbmluZyB0aGUgbWVzc2FnZSBkaWdlc3RcbiAgZnVuY3Rpb24gYmxha2UyYkZpbmFsKGN0eCkge1xuICAgIGN0eC50ICs9IGN0eC5jOyAvLyBtYXJrIGxhc3QgYmxvY2sgb2Zmc2V0XG5cbiAgICB3aGlsZSAoY3R4LmMgPCAxMjgpIHtcbiAgICAgIC8vIGZpbGwgdXAgd2l0aCB6ZXJvc1xuICAgICAgY3R4LmJbY3R4LmMrK10gPSAwO1xuICAgIH1cbiAgICBibGFrZTJiQ29tcHJlc3MoY3R4LCB0cnVlKTsgLy8gZmluYWwgYmxvY2sgZmxhZyA9IDFcblxuICAgIC8vIGxpdHRsZSBlbmRpYW4gY29udmVydCBhbmQgc3RvcmVcbiAgICBjb25zdCBvdXQgPSBuZXcgVWludDhBcnJheShjdHgub3V0bGVuKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN0eC5vdXRsZW47IGkrKykge1xuICAgICAgb3V0W2ldID0gY3R4LmhbaSA+PiAyXSA+PiAoOCAqIChpICYgMykpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG4gIHJldHVybiB7IEluaXQ6IGJsYWtlMmJJbml0LCBVcGRhdGU6IGJsYWtlMmJVcGRhdGUsIEZpbmFsOiBibGFrZTJiRmluYWwgfTtcbn0pKCk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmxha2UyX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGJsYWtlMmJcbi8vVmVyc2lvbjogPj0gNS4yXG5mdW5jdGlvbiBjYW1sX2JsYWtlMl9jcmVhdGUoaGFzaGxlbiwga2V5KSB7XG4gIGtleSA9IGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nKGtleSk7XG4gIGlmIChrZXkubGVuZ3RoID4gNjQpIHtcbiAgICBrZXkuc3ViYXJyYXkoMCwgNjQpO1xuICB9XG4gIHJldHVybiBibGFrZTJiLkluaXQoaGFzaGxlbiwga2V5KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ibGFrZTJfZmluYWxcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5XG4vL1JlcXVpcmVzOiBibGFrZTJiXG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF9ibGFrZTJfZmluYWwoY3R4LCBfaGFzaGxlbikge1xuICAvLyBjdHgub3V0bGVuID09PSBoYXNobGVuXG4gIHZhciByID0gYmxha2UyYi5GaW5hbChjdHgpO1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfdWludDhfYXJyYXkocik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmxha2UyX3VwZGF0ZVxuLy9SZXF1aXJlczogYmxha2UyYlxuLy9SZXF1aXJlczogY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmdcbi8vVmVyc2lvbjogPj0gNS4yLCA8IDUuM1xuZnVuY3Rpb24gY2FtbF9ibGFrZTJfdXBkYXRlKGN0eCwgYnVmLCBvZnMsIGxlbikge1xuICB2YXIgaW5wdXQgPSBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZyhidWYpO1xuICBpbnB1dCA9IGlucHV0LnN1YmFycmF5KG9mcywgb2ZzICsgbGVuKTtcbiAgYmxha2UyYi5VcGRhdGUoY3R4LCBpbnB1dCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JsYWtlMl91cGRhdGVcbi8vUmVxdWlyZXM6IGJsYWtlMmJcbi8vUmVxdWlyZXM6IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbi8vVmVyc2lvbjogPj0gNS4zXG5mdW5jdGlvbiBjYW1sX2JsYWtlMl91cGRhdGUoY3R4LCBidWYsIG9mcywgbGVuKSB7XG4gIHZhciBpbnB1dCA9IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMoYnVmKTtcbiAgaW5wdXQgPSBpbnB1dC5zdWJhcnJheShvZnMsIG9mcyArIGxlbik7XG4gIGJsYWtlMmIuVXBkYXRlKGN0eCwgaW5wdXQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ibGFrZTJfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2JsYWtlMl9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfYmxha2UyX3VwZGF0ZVxuLy9SZXF1aXJlczogY2FtbF9ibGFrZTJfZmluYWxcbi8vVmVyc2lvbjogPj0gNS4yLCA8IDUuM1xuZnVuY3Rpb24gY2FtbF9ibGFrZTJfc3RyaW5nKGhhc2hsZW4sIGtleSwgYnVmLCBvZnMsIGxlbikge1xuICB2YXIgY3R4ID0gY2FtbF9ibGFrZTJfY3JlYXRlKGhhc2hsZW4sIGtleSk7XG4gIGNhbWxfYmxha2UyX3VwZGF0ZShjdHgsIGJ1Ziwgb2ZzLCBsZW4pO1xuICByZXR1cm4gY2FtbF9ibGFrZTJfZmluYWwoY3R4LCBoYXNobGVuKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ibGFrZTJfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2JsYWtlMl9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfYmxha2UyX3VwZGF0ZVxuLy9SZXF1aXJlczogY2FtbF9ibGFrZTJfZmluYWxcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfb2Zfc3RyaW5nXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9ibGFrZTJfc3RyaW5nKGhhc2hsZW4sIGtleSwgYnVmX3N0ciwgb2ZzLCBsZW4pIHtcbiAgdmFyIGN0eCA9IGNhbWxfYmxha2UyX2NyZWF0ZShoYXNobGVuLCBrZXkpO1xuICB2YXIgYnVmID0gY2FtbF9ieXRlc19vZl9zdHJpbmcoYnVmX3N0cik7XG4gIGNhbWxfYmxha2UyX3VwZGF0ZShjdHgsIGJ1Ziwgb2ZzLCBsZW4pO1xuICByZXR1cm4gY2FtbF9ibGFrZTJfZmluYWwoY3R4LCBoYXNobGVuKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ibGFrZTJfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfYmxha2UyX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF9ibGFrZTJfdXBkYXRlXG4vL1JlcXVpcmVzOiBjYW1sX2JsYWtlMl9maW5hbFxuLy9WZXJzaW9uOiA+PSA1LjNcbmZ1bmN0aW9uIGNhbWxfYmxha2UyX2J5dGVzKGhhc2hsZW4sIGtleSwgYnVmLCBvZnMsIGxlbikge1xuICB2YXIgY3R4ID0gY2FtbF9ibGFrZTJfY3JlYXRlKGhhc2hsZW4sIGtleSk7XG4gIGNhbWxfYmxha2UyX3VwZGF0ZShjdHgsIGJ1Ziwgb2ZzLCBsZW4pO1xuICByZXR1cm4gY2FtbF9ibGFrZTJfZmluYWwoY3R4LCBoYXNobGVuKTtcbn1cblxuLy9Qcm92aWRlczogYmxha2UyX2pzX2Zvcl93YXNtX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF9ibGFrZTJfY3JlYXRlLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL0lmOiB3YXNtXG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gYmxha2UyX2pzX2Zvcl93YXNtX2NyZWF0ZShoYXNobGVuLCBrZXkpIHtcbiAgY29uc3Qga2V5X2pzb29fc3RyaW5nID0gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhrZXkpO1xuICByZXR1cm4gY2FtbF9ibGFrZTJfY3JlYXRlKGhhc2hsZW4sIGtleV9qc29vX3N0cmluZyk7XG59XG5cbi8vUHJvdmlkZXM6IGJsYWtlMl9qc19mb3Jfd2FzbV9maW5hbFxuLy9SZXF1aXJlczogY2FtbF9ibGFrZTJfZmluYWwsIGNhbWxfanNieXRlc19vZl9zdHJpbmdcbi8vSWY6IHdhc21cbi8vVmVyc2lvbjogPj0gNS4yXG5mdW5jdGlvbiBibGFrZTJfanNfZm9yX3dhc21fZmluYWwoY3R4LCBoYXNobGVuKSB7XG4gIHJldHVybiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGNhbWxfYmxha2UyX2ZpbmFsKGN0eCwgaGFzaGxlbikpO1xufVxuXG4vL1Byb3ZpZGVzOiBibGFrZTJfanNfZm9yX3dhc21fdXBkYXRlXG4vL1JlcXVpcmVzOiBjYW1sX2JsYWtlMl91cGRhdGUsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbi8vSWY6IHdhc21cbi8vVmVyc2lvbjogPj0gNS4yLCA8IDUuM1xuZnVuY3Rpb24gYmxha2UyX2pzX2Zvcl93YXNtX3VwZGF0ZShjdHgsIGJ1Ziwgb2ZzLCBsZW4pIHtcbiAgY29uc3QgYnVmX2pzb29fc3RyaW5nID0gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhidWYpO1xuICByZXR1cm4gY2FtbF9ibGFrZTJfdXBkYXRlKGN0eCwgYnVmX2pzb29fc3RyaW5nLCBvZnMsIGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGJsYWtlMl9qc19mb3Jfd2FzbV91cGRhdGVcbi8vUmVxdWlyZXM6IGNhbWxfYmxha2UyX3VwZGF0ZSwgY2FtbF9ieXRlc19vZl9qc2J5dGVzXG4vL0lmOiB3YXNtXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gYmxha2UyX2pzX2Zvcl93YXNtX3VwZGF0ZShjdHgsIGJ1Ziwgb2ZzLCBsZW4pIHtcbiAgY29uc3QgYnVmX2pzb29fc3RyaW5nID0gY2FtbF9ieXRlc19vZl9qc2J5dGVzKGJ1Zik7XG4gIHJldHVybiBjYW1sX2JsYWtlMl91cGRhdGUoY3R4LCBidWZfanNvb19zdHJpbmcsIG9mcywgbGVuKTtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBjYW1sX21kNV9jaGFuXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl91aW50OF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSwgY2FtbF9tbF9pbnB1dF9ibG9ja1xuLy9SZXF1aXJlczogY2FtbF9NRDVJbml0LCBjYW1sX01ENVVwZGF0ZSwgY2FtbF9NRDVGaW5hbFxuZnVuY3Rpb24gY2FtbF9tZDVfY2hhbihjaGFuaWQsIHRvcmVhZCkge1xuICB2YXIgY3R4ID0gY2FtbF9NRDVJbml0KCk7XG4gIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheSg0MDk2KTtcbiAgaWYgKHRvcmVhZCA8IDApIHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdmFyIHJlYWQgPSBjYW1sX21sX2lucHV0X2Jsb2NrKGNoYW5pZCwgYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTtcbiAgICAgIGlmIChyZWFkID09PSAwKSBicmVhaztcbiAgICAgIGNhbWxfTUQ1VXBkYXRlKGN0eCwgYnVmZmVyLnN1YmFycmF5KDAsIHJlYWQpLCByZWFkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHRvcmVhZCA+IDApIHtcbiAgICAgIHZhciByZWFkID0gY2FtbF9tbF9pbnB1dF9ibG9jayhcbiAgICAgICAgY2hhbmlkLFxuICAgICAgICBidWZmZXIsXG4gICAgICAgIDAsXG4gICAgICAgIHRvcmVhZCA+IGJ1ZmZlci5sZW5ndGggPyBidWZmZXIubGVuZ3RoIDogdG9yZWFkLFxuICAgICAgKTtcbiAgICAgIGlmIChyZWFkID09PSAwKSBjYW1sX3JhaXNlX2VuZF9vZl9maWxlKCk7XG4gICAgICBjYW1sX01ENVVwZGF0ZShjdHgsIGJ1ZmZlci5zdWJhcnJheSgwLCByZWFkKSwgcmVhZCk7XG4gICAgICB0b3JlYWQgLT0gcmVhZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5KGNhbWxfTUQ1RmluYWwoY3R4KSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWQ1X3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9ieXRlc19vZl9zdHJpbmcsIGNhbWxfbWQ1X2J5dGVzXG5mdW5jdGlvbiBjYW1sX21kNV9zdHJpbmcocywgb2ZzLCBsZW4pIHtcbiAgcmV0dXJuIGNhbWxfbWQ1X2J5dGVzKGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKHMpLCBvZnMsIGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfTUQ1VHJhbnNmb3JtXG52YXIgY2FtbF9NRDVUcmFuc2Zvcm0gPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBhZGQoeCwgeSkge1xuICAgIHJldHVybiAoeCArIHkpIHwgMDtcbiAgfVxuICBmdW5jdGlvbiB4eChxLCBhLCBiLCB4LCBzLCB0KSB7XG4gICAgYSA9IGFkZChhZGQoYSwgcSksIGFkZCh4LCB0KSk7XG4gICAgcmV0dXJuIGFkZCgoYSA8PCBzKSB8IChhID4+PiAoMzIgLSBzKSksIGIpO1xuICB9XG4gIGZ1bmN0aW9uIGZmKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgICByZXR1cm4geHgoKGIgJiBjKSB8ICh+YiAmIGQpLCBhLCBiLCB4LCBzLCB0KTtcbiAgfVxuICBmdW5jdGlvbiBnZyhhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gICAgcmV0dXJuIHh4KChiICYgZCkgfCAoYyAmIH5kKSwgYSwgYiwgeCwgcywgdCk7XG4gIH1cbiAgZnVuY3Rpb24gaGgoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICAgIHJldHVybiB4eChiIF4gYyBeIGQsIGEsIGIsIHgsIHMsIHQpO1xuICB9XG4gIGZ1bmN0aW9uIGlpKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgICByZXR1cm4geHgoYyBeIChiIHwgfmQpLCBhLCBiLCB4LCBzLCB0KTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAodywgYnVmZmVyKSB7XG4gICAgdmFyIGEgPSB3WzBdLFxuICAgICAgYiA9IHdbMV0sXG4gICAgICBjID0gd1syXSxcbiAgICAgIGQgPSB3WzNdO1xuXG4gICAgYSA9IGZmKGEsIGIsIGMsIGQsIGJ1ZmZlclswXSwgNywgMHhkNzZhYTQ3OCk7XG4gICAgZCA9IGZmKGQsIGEsIGIsIGMsIGJ1ZmZlclsxXSwgMTIsIDB4ZThjN2I3NTYpO1xuICAgIGMgPSBmZihjLCBkLCBhLCBiLCBidWZmZXJbMl0sIDE3LCAweDI0MjA3MGRiKTtcbiAgICBiID0gZmYoYiwgYywgZCwgYSwgYnVmZmVyWzNdLCAyMiwgMHhjMWJkY2VlZSk7XG4gICAgYSA9IGZmKGEsIGIsIGMsIGQsIGJ1ZmZlcls0XSwgNywgMHhmNTdjMGZhZik7XG4gICAgZCA9IGZmKGQsIGEsIGIsIGMsIGJ1ZmZlcls1XSwgMTIsIDB4NDc4N2M2MmEpO1xuICAgIGMgPSBmZihjLCBkLCBhLCBiLCBidWZmZXJbNl0sIDE3LCAweGE4MzA0NjEzKTtcbiAgICBiID0gZmYoYiwgYywgZCwgYSwgYnVmZmVyWzddLCAyMiwgMHhmZDQ2OTUwMSk7XG4gICAgYSA9IGZmKGEsIGIsIGMsIGQsIGJ1ZmZlcls4XSwgNywgMHg2OTgwOThkOCk7XG4gICAgZCA9IGZmKGQsIGEsIGIsIGMsIGJ1ZmZlcls5XSwgMTIsIDB4OGI0NGY3YWYpO1xuICAgIGMgPSBmZihjLCBkLCBhLCBiLCBidWZmZXJbMTBdLCAxNywgMHhmZmZmNWJiMSk7XG4gICAgYiA9IGZmKGIsIGMsIGQsIGEsIGJ1ZmZlclsxMV0sIDIyLCAweDg5NWNkN2JlKTtcbiAgICBhID0gZmYoYSwgYiwgYywgZCwgYnVmZmVyWzEyXSwgNywgMHg2YjkwMTEyMik7XG4gICAgZCA9IGZmKGQsIGEsIGIsIGMsIGJ1ZmZlclsxM10sIDEyLCAweGZkOTg3MTkzKTtcbiAgICBjID0gZmYoYywgZCwgYSwgYiwgYnVmZmVyWzE0XSwgMTcsIDB4YTY3OTQzOGUpO1xuICAgIGIgPSBmZihiLCBjLCBkLCBhLCBidWZmZXJbMTVdLCAyMiwgMHg0OWI0MDgyMSk7XG5cbiAgICBhID0gZ2coYSwgYiwgYywgZCwgYnVmZmVyWzFdLCA1LCAweGY2MWUyNTYyKTtcbiAgICBkID0gZ2coZCwgYSwgYiwgYywgYnVmZmVyWzZdLCA5LCAweGMwNDBiMzQwKTtcbiAgICBjID0gZ2coYywgZCwgYSwgYiwgYnVmZmVyWzExXSwgMTQsIDB4MjY1ZTVhNTEpO1xuICAgIGIgPSBnZyhiLCBjLCBkLCBhLCBidWZmZXJbMF0sIDIwLCAweGU5YjZjN2FhKTtcbiAgICBhID0gZ2coYSwgYiwgYywgZCwgYnVmZmVyWzVdLCA1LCAweGQ2MmYxMDVkKTtcbiAgICBkID0gZ2coZCwgYSwgYiwgYywgYnVmZmVyWzEwXSwgOSwgMHgwMjQ0MTQ1Myk7XG4gICAgYyA9IGdnKGMsIGQsIGEsIGIsIGJ1ZmZlclsxNV0sIDE0LCAweGQ4YTFlNjgxKTtcbiAgICBiID0gZ2coYiwgYywgZCwgYSwgYnVmZmVyWzRdLCAyMCwgMHhlN2QzZmJjOCk7XG4gICAgYSA9IGdnKGEsIGIsIGMsIGQsIGJ1ZmZlcls5XSwgNSwgMHgyMWUxY2RlNik7XG4gICAgZCA9IGdnKGQsIGEsIGIsIGMsIGJ1ZmZlclsxNF0sIDksIDB4YzMzNzA3ZDYpO1xuICAgIGMgPSBnZyhjLCBkLCBhLCBiLCBidWZmZXJbM10sIDE0LCAweGY0ZDUwZDg3KTtcbiAgICBiID0gZ2coYiwgYywgZCwgYSwgYnVmZmVyWzhdLCAyMCwgMHg0NTVhMTRlZCk7XG4gICAgYSA9IGdnKGEsIGIsIGMsIGQsIGJ1ZmZlclsxM10sIDUsIDB4YTllM2U5MDUpO1xuICAgIGQgPSBnZyhkLCBhLCBiLCBjLCBidWZmZXJbMl0sIDksIDB4ZmNlZmEzZjgpO1xuICAgIGMgPSBnZyhjLCBkLCBhLCBiLCBidWZmZXJbN10sIDE0LCAweDY3NmYwMmQ5KTtcbiAgICBiID0gZ2coYiwgYywgZCwgYSwgYnVmZmVyWzEyXSwgMjAsIDB4OGQyYTRjOGEpO1xuXG4gICAgYSA9IGhoKGEsIGIsIGMsIGQsIGJ1ZmZlcls1XSwgNCwgMHhmZmZhMzk0Mik7XG4gICAgZCA9IGhoKGQsIGEsIGIsIGMsIGJ1ZmZlcls4XSwgMTEsIDB4ODc3MWY2ODEpO1xuICAgIGMgPSBoaChjLCBkLCBhLCBiLCBidWZmZXJbMTFdLCAxNiwgMHg2ZDlkNjEyMik7XG4gICAgYiA9IGhoKGIsIGMsIGQsIGEsIGJ1ZmZlclsxNF0sIDIzLCAweGZkZTUzODBjKTtcbiAgICBhID0gaGgoYSwgYiwgYywgZCwgYnVmZmVyWzFdLCA0LCAweGE0YmVlYTQ0KTtcbiAgICBkID0gaGgoZCwgYSwgYiwgYywgYnVmZmVyWzRdLCAxMSwgMHg0YmRlY2ZhOSk7XG4gICAgYyA9IGhoKGMsIGQsIGEsIGIsIGJ1ZmZlcls3XSwgMTYsIDB4ZjZiYjRiNjApO1xuICAgIGIgPSBoaChiLCBjLCBkLCBhLCBidWZmZXJbMTBdLCAyMywgMHhiZWJmYmM3MCk7XG4gICAgYSA9IGhoKGEsIGIsIGMsIGQsIGJ1ZmZlclsxM10sIDQsIDB4Mjg5YjdlYzYpO1xuICAgIGQgPSBoaChkLCBhLCBiLCBjLCBidWZmZXJbMF0sIDExLCAweGVhYTEyN2ZhKTtcbiAgICBjID0gaGgoYywgZCwgYSwgYiwgYnVmZmVyWzNdLCAxNiwgMHhkNGVmMzA4NSk7XG4gICAgYiA9IGhoKGIsIGMsIGQsIGEsIGJ1ZmZlcls2XSwgMjMsIDB4MDQ4ODFkMDUpO1xuICAgIGEgPSBoaChhLCBiLCBjLCBkLCBidWZmZXJbOV0sIDQsIDB4ZDlkNGQwMzkpO1xuICAgIGQgPSBoaChkLCBhLCBiLCBjLCBidWZmZXJbMTJdLCAxMSwgMHhlNmRiOTllNSk7XG4gICAgYyA9IGhoKGMsIGQsIGEsIGIsIGJ1ZmZlclsxNV0sIDE2LCAweDFmYTI3Y2Y4KTtcbiAgICBiID0gaGgoYiwgYywgZCwgYSwgYnVmZmVyWzJdLCAyMywgMHhjNGFjNTY2NSk7XG5cbiAgICBhID0gaWkoYSwgYiwgYywgZCwgYnVmZmVyWzBdLCA2LCAweGY0MjkyMjQ0KTtcbiAgICBkID0gaWkoZCwgYSwgYiwgYywgYnVmZmVyWzddLCAxMCwgMHg0MzJhZmY5Nyk7XG4gICAgYyA9IGlpKGMsIGQsIGEsIGIsIGJ1ZmZlclsxNF0sIDE1LCAweGFiOTQyM2E3KTtcbiAgICBiID0gaWkoYiwgYywgZCwgYSwgYnVmZmVyWzVdLCAyMSwgMHhmYzkzYTAzOSk7XG4gICAgYSA9IGlpKGEsIGIsIGMsIGQsIGJ1ZmZlclsxMl0sIDYsIDB4NjU1YjU5YzMpO1xuICAgIGQgPSBpaShkLCBhLCBiLCBjLCBidWZmZXJbM10sIDEwLCAweDhmMGNjYzkyKTtcbiAgICBjID0gaWkoYywgZCwgYSwgYiwgYnVmZmVyWzEwXSwgMTUsIDB4ZmZlZmY0N2QpO1xuICAgIGIgPSBpaShiLCBjLCBkLCBhLCBidWZmZXJbMV0sIDIxLCAweDg1ODQ1ZGQxKTtcbiAgICBhID0gaWkoYSwgYiwgYywgZCwgYnVmZmVyWzhdLCA2LCAweDZmYTg3ZTRmKTtcbiAgICBkID0gaWkoZCwgYSwgYiwgYywgYnVmZmVyWzE1XSwgMTAsIDB4ZmUyY2U2ZTApO1xuICAgIGMgPSBpaShjLCBkLCBhLCBiLCBidWZmZXJbNl0sIDE1LCAweGEzMDE0MzE0KTtcbiAgICBiID0gaWkoYiwgYywgZCwgYSwgYnVmZmVyWzEzXSwgMjEsIDB4NGUwODExYTEpO1xuICAgIGEgPSBpaShhLCBiLCBjLCBkLCBidWZmZXJbNF0sIDYsIDB4Zjc1MzdlODIpO1xuICAgIGQgPSBpaShkLCBhLCBiLCBjLCBidWZmZXJbMTFdLCAxMCwgMHhiZDNhZjIzNSk7XG4gICAgYyA9IGlpKGMsIGQsIGEsIGIsIGJ1ZmZlclsyXSwgMTUsIDB4MmFkN2QyYmIpO1xuICAgIGIgPSBpaShiLCBjLCBkLCBhLCBidWZmZXJbOV0sIDIxLCAweGViODZkMzkxKTtcblxuICAgIHdbMF0gPSBhZGQoYSwgd1swXSk7XG4gICAgd1sxXSA9IGFkZChiLCB3WzFdKTtcbiAgICB3WzJdID0gYWRkKGMsIHdbMl0pO1xuICAgIHdbM10gPSBhZGQoZCwgd1szXSk7XG4gIH07XG59KSgpO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX01ENUluaXRcbmZ1bmN0aW9uIGNhbWxfTUQ1SW5pdCgpIHtcbiAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig2NCk7XG4gIHZhciBiMzIgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcbiAgdmFyIGI4ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgcmV0dXJuIHtcbiAgICBsZW46IDAsXG4gICAgdzogbmV3IFVpbnQzMkFycmF5KFsweDY3NDUyMzAxLCAweGVmY2RhYjg5LCAweDk4YmFkY2ZlLCAweDEwMzI1NDc2XSksXG4gICAgYjMyOiBiMzIsXG4gICAgYjg6IGI4LFxuICB9O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX01ENVVwZGF0ZVxuLy9SZXF1aXJlczogY2FtbF9NRDVUcmFuc2Zvcm1cbmZ1bmN0aW9uIGNhbWxfTUQ1VXBkYXRlKGN0eCwgaW5wdXQsIGlucHV0X2xlbikge1xuICB2YXIgaW5fYnVmID0gY3R4LmxlbiAmIDB4M2Y7XG4gIHZhciBpbnB1dF9wb3MgPSAwO1xuICBjdHgubGVuICs9IGlucHV0X2xlbjtcbiAgaWYgKGluX2J1Zikge1xuICAgIHZhciBtaXNzaW5nID0gNjQgLSBpbl9idWY7XG4gICAgaWYgKGlucHV0X2xlbiA8IG1pc3NpbmcpIHtcbiAgICAgIGN0eC5iOC5zZXQoaW5wdXQuc3ViYXJyYXkoMCwgaW5wdXRfbGVuKSwgaW5fYnVmKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY3R4LmI4LnNldChpbnB1dC5zdWJhcnJheSgwLCBtaXNzaW5nKSwgaW5fYnVmKTtcbiAgICBjYW1sX01ENVRyYW5zZm9ybShjdHgudywgY3R4LmIzMik7XG4gICAgaW5wdXRfbGVuIC09IG1pc3Npbmc7XG4gICAgaW5wdXRfcG9zICs9IG1pc3Npbmc7XG4gIH1cbiAgd2hpbGUgKGlucHV0X2xlbiA+PSA2NCkge1xuICAgIGN0eC5iOC5zZXQoaW5wdXQuc3ViYXJyYXkoaW5wdXRfcG9zLCBpbnB1dF9wb3MgKyA2NCksIDApO1xuICAgIGNhbWxfTUQ1VHJhbnNmb3JtKGN0eC53LCBjdHguYjMyKTtcbiAgICBpbnB1dF9sZW4gLT0gNjQ7XG4gICAgaW5wdXRfcG9zICs9IDY0O1xuICB9XG4gIGlmIChpbnB1dF9sZW4pXG4gICAgY3R4LmI4LnNldChpbnB1dC5zdWJhcnJheShpbnB1dF9wb3MsIGlucHV0X3BvcyArIGlucHV0X2xlbiksIDApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX01ENUZpbmFsXG4vL1JlcXVpcmVzOiBjYW1sX01ENVRyYW5zZm9ybVxuZnVuY3Rpb24gY2FtbF9NRDVGaW5hbChjdHgpIHtcbiAgdmFyIGluX2J1ZiA9IGN0eC5sZW4gJiAweDNmO1xuICBjdHguYjhbaW5fYnVmXSA9IDB4ODA7XG4gIGluX2J1ZisrO1xuICBpZiAoaW5fYnVmID4gNTYpIHtcbiAgICBmb3IgKHZhciBqID0gaW5fYnVmOyBqIDwgNjQ7IGorKykge1xuICAgICAgY3R4LmI4W2pdID0gMDtcbiAgICB9XG4gICAgY2FtbF9NRDVUcmFuc2Zvcm0oY3R4LncsIGN0eC5iMzIpO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgNTY7IGorKykge1xuICAgICAgY3R4LmI4W2pdID0gMDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaiA9IGluX2J1ZjsgaiA8IDU2OyBqKyspIHtcbiAgICAgIGN0eC5iOFtqXSA9IDA7XG4gICAgfVxuICB9XG4gIGN0eC5iMzJbMTRdID0gY3R4LmxlbiA8PCAzO1xuICBjdHguYjMyWzE1XSA9IChjdHgubGVuID4+IDI5KSAmIDB4MWZmZmZmZmY7XG4gIGNhbWxfTUQ1VHJhbnNmb3JtKGN0eC53LCBjdHguYjMyKTtcbiAgdmFyIHQgPSBuZXcgVWludDhBcnJheSgxNik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgNDsgaisrKSB0W2kgKiA0ICsgal0gPSAoY3R4LndbaV0gPj4gKDggKiBqKSkgJiAweGZmO1xuICByZXR1cm4gdDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tZDVfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMsIGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX01ENUluaXQsIGNhbWxfTUQ1VXBkYXRlLCBjYW1sX01ENUZpbmFsXG5mdW5jdGlvbiBjYW1sX21kNV9ieXRlcyhzLCBvZnMsIGxlbikge1xuICB2YXIgY3R4ID0gY2FtbF9NRDVJbml0KCk7XG4gIHZhciBhID0gY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyhzKTtcbiAgY2FtbF9NRDVVcGRhdGUoY3R4LCBhLnN1YmFycmF5KG9mcywgb2ZzICsgbGVuKSwgbGVuKTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5KGNhbWxfTUQ1RmluYWwoY3R4KSk7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczoganNvb19kYXRhdmlld1xudmFyIGpzb29fZGF0YXZpZXcgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDgpKTtcblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaVxuLy9SZXF1aXJlczoganNvb19kYXRhdmlld1xuZnVuY3Rpb24gY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0KHgpIHtcbiAganNvb19kYXRhdmlldy5zZXRGbG9hdDY0KDAsIHgsIHRydWUpO1xuICB2YXIgbG8zMiA9IGpzb29fZGF0YXZpZXcuZ2V0VWludDMyKDAsIHRydWUpO1xuICB2YXIgaGkzMiA9IGpzb29fZGF0YXZpZXcuZ2V0VWludDMyKDQsIHRydWUpO1xuICB2YXIgbG8gPSBsbzMyICYgMHhmZmZmZmY7XG4gIHZhciBtaSA9IChsbzMyID4+PiAyNCkgfCAoKGhpMzIgPDwgOCkgJiAweGZmZmZmZik7XG4gIHZhciBoaSA9IChoaTMyID4+PiAxNikgJiAweGZmZmY7XG4gIC8vIFY4IHVzZXMgc2lnbmFsaW5nIE5hTnMgYXMgc2VudGluZWwuIFNvLCBOYU5zIGFyZSBtYWRlIHF1aWV0IHdoZW5cbiAgLy8gdGhleSBhcmUgc3RvcmVkIGluIGFuIGFycmF5LiBNYWtlIHRoZW0gcXVpZXQgaGVyZSBzbyB0aGF0IHdlIGdldFxuICAvLyBjb25zaXN0ZW50IHJlc3VsdHMuXG4gIGlmICgoaGkgJiAweDdmZjgpID09PSAweDdmZjAgJiYgKG1pIHwgbG8gfCAoaGkgJiAweGYpKSAhPT0gMCkgaGkgfD0gODtcbiAgcmV0dXJuIGNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpKGxvLCBtaSwgaGkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGpzb29fZGF0YXZpZXdcbmZ1bmN0aW9uIGNhbWxfaW50MzJfYml0c19vZl9mbG9hdCh4KSB7XG4gIGpzb29fZGF0YXZpZXcuc2V0RmxvYXQzMigwLCB4LCB0cnVlKTtcbiAgcmV0dXJuIGpzb29fZGF0YXZpZXcuZ2V0VWludDMyKDAsIHRydWUpIHwgMDtcbn1cblxuLy9GUCBsaXRlcmFscyBjYW4gYmUgd3JpdHRlbiB1c2luZyB0aGUgaGV4YWRlY2ltYWxcbi8vbm90YXRpb24gMHg8bWFudGlzc2EgaW4gaGV4PnA8ZXhwb25lbnQ+IGZyb20gSVNPIEM5OS5cbi8vaHR0cHM6Ly9naXRodWIuY29tL2RhbmtvZ2FpL2pzLWhleGZsb2F0L2Jsb2IvbWFzdGVyL2hleGZsb2F0LmpzXG4vL1Byb3ZpZGVzOiBjYW1sX2hleHN0cmluZ19vZl9mbG9hdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcsIGNhbWxfc3RyX3JlcGVhdFxuZnVuY3Rpb24gY2FtbF9oZXhzdHJpbmdfb2ZfZmxvYXQoeCwgcHJlYywgc3R5bGUpIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoeCkpIHtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHgpKSByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoXCJuYW5cIik7XG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHggPiAwID8gXCJpbmZpbml0eVwiIDogXCItaW5maW5pdHlcIik7XG4gIH1cbiAgdmFyIHNpZ24gPSB4ID09PSAwICYmIDEgLyB4ID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPyAxIDogeCA+PSAwID8gMCA6IDE7XG4gIGlmIChzaWduKSB4ID0gLXg7XG4gIHZhciBleHAgPSAwO1xuICBpZiAoeCA9PT0gMCkge1xuICB9IGVsc2UgaWYgKHggPCAxKSB7XG4gICAgd2hpbGUgKHggPCAxICYmIGV4cCA+IC0xMDIyKSB7XG4gICAgICB4ICo9IDI7XG4gICAgICBleHAtLTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHggPj0gMikge1xuICAgICAgeCAvPSAyO1xuICAgICAgZXhwKys7XG4gICAgfVxuICB9XG4gIHZhciBleHBfc2lnbiA9IGV4cCA8IDAgPyBcIlwiIDogXCIrXCI7XG4gIHZhciBzaWduX3N0ciA9IFwiXCI7XG4gIGlmIChzaWduKSBzaWduX3N0ciA9IFwiLVwiO1xuICBlbHNlIHtcbiAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICBjYXNlIDQzIC8qICcrJyAqLzpcbiAgICAgICAgc2lnbl9zdHIgPSBcIitcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDMyIC8qICcgJyAqLzpcbiAgICAgICAgc2lnbl9zdHIgPSBcIiBcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKHByZWMgPj0gMCAmJiBwcmVjIDwgMTMpIHtcbiAgICAvKiBJZiBhIHByZWNpc2lvbiBpcyBnaXZlbiwgYW5kIGlzIHNtYWxsLCByb3VuZCBtYW50aXNzYSBhY2NvcmRpbmdseSAqL1xuICAgIHZhciBjc3QgPSBNYXRoLnBvdygyLCBwcmVjICogNCk7XG4gICAgeCA9IE1hdGgucm91bmQoeCAqIGNzdCkgLyBjc3Q7XG4gIH1cbiAgdmFyIHhfc3RyID0geC50b1N0cmluZygxNik7XG4gIGlmIChwcmVjID49IDApIHtcbiAgICB2YXIgaWR4ID0geF9zdHIuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGlkeCA8IDApIHtcbiAgICAgIHhfc3RyICs9IFwiLlwiICsgY2FtbF9zdHJfcmVwZWF0KHByZWMsIFwiMFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNpemUgPSBpZHggKyAxICsgcHJlYztcbiAgICAgIGlmICh4X3N0ci5sZW5ndGggPCBzaXplKVxuICAgICAgICB4X3N0ciArPSBjYW1sX3N0cl9yZXBlYXQoc2l6ZSAtIHhfc3RyLmxlbmd0aCwgXCIwXCIpO1xuICAgICAgZWxzZSB4X3N0ciA9IHhfc3RyLnNsaWNlKDAsIHNpemUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoXG4gICAgc2lnbl9zdHIgKyBcIjB4XCIgKyB4X3N0ciArIFwicFwiICsgZXhwX3NpZ24gKyBleHAudG9TdHJpbmcoMTApLFxuICApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMgY29uc3Rcbi8vUmVxdWlyZXM6IGpzb29fZGF0YXZpZXdcbmZ1bmN0aW9uIGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0cyh4KSB7XG4gIHZhciBsbyA9IHgubG87XG4gIHZhciBtaSA9IHgubWk7XG4gIHZhciBoaSA9IHguaGk7XG4gIC8vIFY4IHVzZXMgc2lnbmFsaW5nIE5hTnMgYXMgc2VudGluZWwuIFNvLCBOYU5zIGFyZSBtYWRlIHF1aWV0IHdoZW5cbiAgLy8gdGhleSBhcmUgc3RvcmVkIGluIGFuIGFycmF5LiBNYWtlIHRoZW0gcXVpZXQgaGVyZSBzbyB0aGF0IHdlIGdldFxuICAvLyBjb25zaXN0ZW50IHJlc3VsdHMuXG4gIGlmICgoaGkgJiAweDdmZjgpID09PSAweDdmZjAgJiYgKG1pIHwgbG8gfCAoaGkgJiAweGYpKSAhPT0gMCkgaGkgfD0gODtcbiAganNvb19kYXRhdmlldy5zZXRVaW50MzIoMCwgbG8gfCAobWkgPDwgMjQpLCB0cnVlKTtcbiAganNvb19kYXRhdmlldy5zZXRVaW50MzIoNCwgKG1pID4+PiA4KSB8IChoaSA8PCAxNiksIHRydWUpO1xuICByZXR1cm4ganNvb19kYXRhdmlldy5nZXRGbG9hdDY0KDAsIHRydWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX25leHRhZnRlcl9mbG9hdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzLCBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQsIGNhbWxfaW50NjRfYWRkLCBjYW1sX2ludDY0X3N1YixjYW1sX2ludDY0X29mX2ludDMyXG5mdW5jdGlvbiBjYW1sX25leHRhZnRlcl9mbG9hdCh4LCB5KSB7XG4gIGlmIChOdW1iZXIuaXNOYU4oeCkgfHwgTnVtYmVyLmlzTmFOKHkpKSByZXR1cm4gTnVtYmVyLk5hTjtcbiAgaWYgKHggPT09IHkpIHJldHVybiB5O1xuICBpZiAoeCA9PT0gMCkge1xuICAgIGlmICh5IDwgMCkgcmV0dXJuIC1NYXRoLnBvdygyLCAtMTA3NCk7XG4gICAgZWxzZSByZXR1cm4gTWF0aC5wb3coMiwgLTEwNzQpO1xuICB9XG4gIHZhciBiaXRzID0gY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0KHgpO1xuICB2YXIgb25lID0gY2FtbF9pbnQ2NF9vZl9pbnQzMigxKTtcbiAgaWYgKHggPCB5ID09PSB4ID4gMCkgYml0cyA9IGNhbWxfaW50NjRfYWRkKGJpdHMsIG9uZSk7XG4gIGVsc2UgYml0cyA9IGNhbWxfaW50NjRfc3ViKGJpdHMsIG9uZSk7XG4gIHJldHVybiBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMoYml0cyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdHJ1bmNfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfdHJ1bmNfZmxvYXQoeCkge1xuICByZXR1cm4gTWF0aC50cnVuYyh4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzIGNvbnN0XG4vL1JlcXVpcmVzOiBqc29vX2RhdGF2aWV3XG5mdW5jdGlvbiBjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHMoeCkge1xuICBqc29vX2RhdGF2aWV3LnNldFVpbnQzMigwLCB4LCB0cnVlKTtcbiAgcmV0dXJuIGpzb29fZGF0YXZpZXcuZ2V0RmxvYXQzMigwLCB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jbGFzc2lmeV9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9jbGFzc2lmeV9mbG9hdCh4KSB7XG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoeCkpIHtcbiAgICBpZiAoTWF0aC5hYnMoeCkgPj0gMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDgpIHJldHVybiAwO1xuICAgIGlmICh4ICE9PSAwKSByZXR1cm4gMTtcbiAgICByZXR1cm4gMjtcbiAgfVxuICByZXR1cm4gTnVtYmVyLmlzTmFOKHgpID8gNCA6IDM7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX21vZGZfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfbW9kZl9mbG9hdCh4KSB7XG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoeCkpIHtcbiAgICB2YXIgbmVnID0gMSAvIHggPCAwO1xuICAgIHggPSBNYXRoLmFicyh4KTtcbiAgICB2YXIgaSA9IE1hdGguZmxvb3IoeCk7XG4gICAgdmFyIGYgPSB4IC0gaTtcbiAgICBpZiAobmVnKSB7XG4gICAgICBpID0gLWk7XG4gICAgICBmID0gLWY7XG4gICAgfVxuICAgIHJldHVybiBbMCwgZiwgaV07XG4gIH1cbiAgaWYgKE51bWJlci5pc05hTih4KSkgcmV0dXJuIFswLCBOdW1iZXIuTmFOLCBOdW1iZXIuTmFOXTtcbiAgcmV0dXJuIFswLCAxIC8geCwgeF07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2xkZXhwX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2xkZXhwX2Zsb2F0KHgsIGV4cCkge1xuICBleHAgfD0gMDtcbiAgaWYgKGV4cCA+IDEwMjMpIHtcbiAgICBleHAgLT0gMTAyMztcbiAgICB4ICo9IE1hdGgucG93KDIsIDEwMjMpO1xuICAgIGlmIChleHAgPiAxMDIzKSB7XG4gICAgICAvLyBpbiBjYXNlIHggaXMgc3Vibm9ybWFsXG4gICAgICBleHAgLT0gMTAyMztcbiAgICAgIHggKj0gTWF0aC5wb3coMiwgMTAyMyk7XG4gICAgfVxuICB9XG4gIGlmIChleHAgPCAtMTAyMykge1xuICAgIGV4cCArPSAxMDIzO1xuICAgIHggKj0gTWF0aC5wb3coMiwgLTEwMjMpO1xuICB9XG4gIHggKj0gTWF0aC5wb3coMiwgZXhwKTtcbiAgcmV0dXJuIHg7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2ZyZXhwX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ZyZXhwX2Zsb2F0KHgpIHtcbiAgaWYgKHggPT09IDAgfHwgIU51bWJlci5pc0Zpbml0ZSh4KSkgcmV0dXJuIFswLCB4LCAwXTtcbiAgdmFyIG5lZyA9IHggPCAwO1xuICBpZiAobmVnKSB4ID0gLXg7XG4gIHZhciBleHAgPSBNYXRoLm1heCgtMTAyMywgTWF0aC5mbG9vcihNYXRoLmxvZzIoeCkpICsgMSk7XG4gIHggKj0gTWF0aC5wb3coMiwgLWV4cCk7XG4gIHdoaWxlICh4IDwgMC41KSB7XG4gICAgeCAqPSAyO1xuICAgIGV4cC0tO1xuICB9XG4gIHdoaWxlICh4ID49IDEpIHtcbiAgICB4ICo9IDAuNTtcbiAgICBleHArKztcbiAgfVxuICBpZiAobmVnKSB4ID0gLXg7XG4gIHJldHVybiBbMCwgeCwgZXhwXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdF9jb21wYXJlIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2Zsb2F0X2NvbXBhcmUoeCwgeSkge1xuICBpZiAoeCA9PT0geSkgcmV0dXJuIDA7XG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xO1xuICBpZiAoeCA+IHkpIHJldHVybiAxO1xuICBpZiAoIU51bWJlci5pc05hTih4KSkgcmV0dXJuIDE7XG4gIGlmICghTnVtYmVyLmlzTmFOKHkpKSByZXR1cm4gLTE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvcHlzaWduX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2NvcHlzaWduX2Zsb2F0KHgsIHkpIHtcbiAgaWYgKHkgPT09IDApIHkgPSAxIC8geTtcbiAgeCA9IE1hdGguYWJzKHgpO1xuICByZXR1cm4geSA8IDAgPyAteCA6IHg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc2lnbmJpdF9mbG9hdCBjb25zdFxuLy9BbGlhczogY2FtbF9zaWduYml0XG5mdW5jdGlvbiBjYW1sX3NpZ25iaXRfZmxvYXQoeCkge1xuICBpZiAoeCA9PT0gMCkgeCA9IDEgLyB4O1xuICByZXR1cm4geCA8IDAgPyAxIDogMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9leHBtMV9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9leHBtMV9mbG9hdCh4KSB7XG4gIHJldHVybiBNYXRoLmV4cG0xKHgpO1xufVxuLy9Qcm92aWRlczogY2FtbF9leHAyX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2V4cDJfZmxvYXQoeCkge1xuICByZXR1cm4gTWF0aC5wb3coMiwgeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2xvZzFwX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2xvZzFwX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIE1hdGgubG9nMXAoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2xvZzJfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfbG9nMl9mbG9hdCh4KSB7XG4gIHJldHVybiBNYXRoLmxvZzIoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2h5cG90X2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2h5cG90X2Zsb2F0KHgsIHkpIHtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2xvZzEwX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2xvZzEwX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIE1hdGgubG9nMTAoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2Nvc2hfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfY29zaF9mbG9hdCh4KSB7XG4gIHJldHVybiBNYXRoLmNvc2goeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2Fjb3NoX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2Fjb3NoX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIE1hdGguYWNvc2goeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3NpbmhfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfc2luaF9mbG9hdCh4KSB7XG4gIHJldHVybiBNYXRoLnNpbmgoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2FzaW5oX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2FzaW5oX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIE1hdGguYXNpbmgoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3RhbmhfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfdGFuaF9mbG9hdCh4KSB7XG4gIHJldHVybiBNYXRoLnRhbmgoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2F0YW5oX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2F0YW5oX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIE1hdGguYXRhbmgoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3JvdW5kX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX3JvdW5kX2Zsb2F0KHgpIHtcbiAgaWYgKHggPj0gMCkge1xuICAgIHZhciB5ID0gTWF0aC5mbG9vcih4KTtcbiAgICByZXR1cm4geCAtIHkgPj0gMC41ID8geSArIDEgOiB5O1xuICB9IGVsc2Uge1xuICAgIHZhciB5ID0gTWF0aC5jZWlsKHgpO1xuICAgIHJldHVybiB5IC0geCA+PSAwLjUgPyB5IC0gMSA6IHk7XG4gIH1cbn1cbi8vUHJvdmlkZXM6IGNhbWxfY2JydF9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9jYnJ0X2Zsb2F0KHgpIHtcbiAgcmV0dXJuIE1hdGguY2JydCh4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcmZfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZXJmX2Zsb2F0KHgpIHtcbiAgdmFyIGExID0gMC4yNTQ4Mjk1OTI7XG4gIHZhciBhMiA9IC0wLjI4NDQ5NjczNjtcbiAgdmFyIGEzID0gMS40MjE0MTM3NDE7XG4gIHZhciBhNCA9IC0xLjQ1MzE1MjAyNztcbiAgdmFyIGE1ID0gMS4wNjE0MDU0Mjk7XG4gIHZhciBwID0gMC4zMjc1OTExO1xuXG4gIHZhciBzaWduID0gMTtcbiAgaWYgKHggPCAwKSB7XG4gICAgc2lnbiA9IC0xO1xuICB9XG4gIHggPSBNYXRoLmFicyh4KTtcbiAgdmFyIHQgPSAxLjAgLyAoMS4wICsgcCAqIHgpO1xuICB2YXIgeSA9XG4gICAgMS4wIC0gKCgoKGE1ICogdCArIGE0KSAqIHQgKyBhMykgKiB0ICsgYTIpICogdCArIGExKSAqIHQgKiBNYXRoLmV4cCgteCAqIHgpO1xuXG4gIHJldHVybiBzaWduICogeTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcmZjX2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2VyZl9mbG9hdFxuZnVuY3Rpb24gY2FtbF9lcmZjX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIDEgLSBjYW1sX2VyZl9mbG9hdCh4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbWFfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZm1hX2Zsb2F0KHgsIHksIHopIHtcbiAgdmFyIFNQTElUID0gTWF0aC5wb3coMiwgMjcpICsgMTtcbiAgdmFyIE1JTl9WQUxVRSA9IE1hdGgucG93KDIsIC0xMDIyKTtcbiAgdmFyIEVQU0lMT04gPSBNYXRoLnBvdygyLCAtNTIpO1xuICB2YXIgQyA9IDQxNjtcbiAgdmFyIEEgPSBNYXRoLnBvdygyLCArQyk7XG4gIHZhciBCID0gTWF0aC5wb3coMiwgLUMpO1xuXG4gIGZ1bmN0aW9uIG11bHRpcGx5KGEsIGIpIHtcbiAgICB2YXIgYXQgPSBTUExJVCAqIGE7XG4gICAgdmFyIGFoaSA9IGF0IC0gKGF0IC0gYSk7XG4gICAgdmFyIGFsbyA9IGEgLSBhaGk7XG4gICAgdmFyIGJ0ID0gU1BMSVQgKiBiO1xuICAgIHZhciBiaGkgPSBidCAtIChidCAtIGIpO1xuICAgIHZhciBibG8gPSBiIC0gYmhpO1xuICAgIHZhciBwID0gYSAqIGI7XG4gICAgdmFyIGUgPSBhaGkgKiBiaGkgLSBwICsgYWhpICogYmxvICsgYWxvICogYmhpICsgYWxvICogYmxvO1xuICAgIHJldHVybiB7XG4gICAgICBwOiBwLFxuICAgICAgZTogZSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkKGEsIGIpIHtcbiAgICB2YXIgcyA9IGEgKyBiO1xuICAgIHZhciB2ID0gcyAtIGE7XG4gICAgdmFyIGUgPSBhIC0gKHMgLSB2KSArIChiIC0gdik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHM6IHMsXG4gICAgICBlOiBlLFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBhZGp1c3QoeCwgeSkge1xuICAgIHJldHVybiB4ICE9PSAwICYmIHkgIT09IDAgJiYgU1BMSVQgKiB4IC0gKFNQTElUICogeCAtIHgpID09PSB4XG4gICAgICA/IHggKiAoMSArICh4IDwgMCA/IC0xIDogKzEpICogKHkgPCAwID8gLTEgOiArMSkgKiBFUFNJTE9OKVxuICAgICAgOiB4O1xuICB9XG5cbiAgaWYgKHggPT09IDAgfHwgeSA9PT0gMCB8fCAhTnVtYmVyLmlzRmluaXRlKHgpIHx8ICFOdW1iZXIuaXNGaW5pdGUoeSkpIHtcbiAgICByZXR1cm4geCAqIHkgKyB6O1xuICB9XG4gIGlmICh6ID09PSAwKSB7XG4gICAgcmV0dXJuIHggKiB5O1xuICB9XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHopKSB7XG4gICAgcmV0dXJuIHo7XG4gIH1cblxuICB2YXIgc2NhbGUgPSAxO1xuICB3aGlsZSAoTWF0aC5hYnMoeCkgPiBBKSB7XG4gICAgc2NhbGUgKj0gQTtcbiAgICB4ICo9IEI7XG4gIH1cbiAgd2hpbGUgKE1hdGguYWJzKHkpID4gQSkge1xuICAgIHNjYWxlICo9IEE7XG4gICAgeSAqPSBCO1xuICB9XG4gIGlmIChzY2FsZSA9PT0gMSAvIDApIHtcbiAgICByZXR1cm4geCAqIHkgKiBzY2FsZTtcbiAgfVxuICB3aGlsZSAoTWF0aC5hYnMoeCkgPCBCKSB7XG4gICAgc2NhbGUgKj0gQjtcbiAgICB4ICo9IEE7XG4gIH1cbiAgd2hpbGUgKE1hdGguYWJzKHkpIDwgQikge1xuICAgIHNjYWxlICo9IEI7XG4gICAgeSAqPSBBO1xuICB9XG4gIGlmIChzY2FsZSA9PT0gMCkge1xuICAgIHJldHVybiB6O1xuICB9XG5cbiAgdmFyIHhzID0geDtcbiAgdmFyIHlzID0geTtcbiAgdmFyIHpzID0geiAvIHNjYWxlO1xuXG4gIGlmIChNYXRoLmFicyh6cykgPiAoTWF0aC5hYnMoeHMgKiB5cykgKiA0KSAvIEVQU0lMT04pIHtcbiAgICByZXR1cm4gejtcbiAgfVxuICBpZiAoTWF0aC5hYnMoenMpIDwgKCgoTWF0aC5hYnMoeHMgKiB5cykgKiBFUFNJTE9OKSAvIDQpICogRVBTSUxPTikgLyA0KSB7XG4gICAgenMgPSAoeiA8IDAgPyAtMSA6ICsxKSAqIE1JTl9WQUxVRTtcbiAgfVxuXG4gIHZhciB4eSA9IG11bHRpcGx5KHhzLCB5cyk7XG4gIHZhciBzID0gYWRkKHh5LnAsIHpzKTtcbiAgdmFyIHUgPSBhZGQoeHkuZSwgcy5lKTtcbiAgdmFyIGkgPSBhZGQocy5zLCB1LnMpO1xuXG4gIHZhciBmID0gaS5zICsgYWRqdXN0KGkuZSwgdS5lKTtcbiAgaWYgKGYgPT09IDApIHtcbiAgICByZXR1cm4gZjtcbiAgfVxuXG4gIHZhciBmcyA9IGYgKiBzY2FsZTtcbiAgaWYgKE1hdGguYWJzKGZzKSA+IE1JTl9WQUxVRSkge1xuICAgIHJldHVybiBmcztcbiAgfVxuXG4gIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlcmUgd2FzIGV4dHJhIHJvdW5kaW5nIGZvciBhIGRlbm9ybWFsaXplZCB2YWx1ZS5cbiAgcmV0dXJuIGZzICsgYWRqdXN0KGYgLSBmcyAvIHNjYWxlLCBpLmUpICogc2NhbGU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZm9ybWF0X2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cl9yZXBlYXQsIGNhbWxfcGFyc2VfZm9ybWF0LCBjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nXG5mdW5jdGlvbiBjYW1sX2Zvcm1hdF9mbG9hdChmbXQsIHgpIHtcbiAgZnVuY3Rpb24gdG9GaXhlZCh4LCBkcCkge1xuICAgIGlmIChNYXRoLmFicyh4KSA8IDEuMCkge1xuICAgICAgcmV0dXJuIHgudG9GaXhlZChkcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlID0gTnVtYmVyLnBhcnNlSW50KHgudG9TdHJpbmcoKS5zcGxpdChcIitcIilbMV0pO1xuICAgICAgaWYgKGUgPiAyMCkge1xuICAgICAgICBlIC09IDIwO1xuICAgICAgICB4IC89IE1hdGgucG93KDEwLCBlKTtcbiAgICAgICAgeCArPSBjYW1sX3N0cl9yZXBlYXQoZSwgXCIwXCIpO1xuICAgICAgICBpZiAoZHAgPiAwKSB7XG4gICAgICAgICAgeCA9IHggKyBcIi5cIiArIGNhbWxfc3RyX3JlcGVhdChkcCwgXCIwXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4O1xuICAgICAgfSBlbHNlIHJldHVybiB4LnRvRml4ZWQoZHApO1xuICAgIH1cbiAgfVxuICB2YXIgcyxcbiAgICBmID0gY2FtbF9wYXJzZV9mb3JtYXQoZm10KTtcbiAgdmFyIHByZWMgPSBmLnByZWMgPCAwID8gNiA6IGYucHJlYztcbiAgaWYgKHggPCAwIHx8ICh4ID09PSAwICYmIDEgLyB4ID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpKSB7XG4gICAgZi5zaWduID0gLTE7XG4gICAgeCA9IC14O1xuICB9XG4gIGlmIChOdW1iZXIuaXNOYU4oeCkpIHtcbiAgICBzID0gXCJuYW5cIjtcbiAgICBmLmZpbGxlciA9IFwiIFwiO1xuICB9IGVsc2UgaWYgKCFOdW1iZXIuaXNGaW5pdGUoeCkpIHtcbiAgICBzID0gXCJpbmZcIjtcbiAgICBmLmZpbGxlciA9IFwiIFwiO1xuICB9IGVsc2VcbiAgICBzd2l0Y2ggKGYuY29udikge1xuICAgICAgY2FzZSBcImVcIjpcbiAgICAgICAgdmFyIHMgPSB4LnRvRXhwb25lbnRpYWwocHJlYyk7XG4gICAgICAgIC8vIGV4cG9uZW50IHNob3VsZCBiZSBhdCBsZWFzdCB0d28gZGlnaXRzXG4gICAgICAgIHZhciBpID0gcy5sZW5ndGg7XG4gICAgICAgIGlmIChzLmNoYXJBdChpIC0gMykgPT09IFwiZVwiKVxuICAgICAgICAgIHMgPSBzLnNsaWNlKDAsIGkgLSAxKSArIFwiMFwiICsgcy5zbGljZShpIC0gMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImZcIjpcbiAgICAgICAgcyA9IHRvRml4ZWQoeCwgcHJlYyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImdcIjpcbiAgICAgICAgcHJlYyA9IHByZWMgPyBwcmVjIDogMTtcbiAgICAgICAgcyA9IHgudG9FeHBvbmVudGlhbChwcmVjIC0gMSk7XG4gICAgICAgIHZhciBqID0gcy5pbmRleE9mKFwiZVwiKTtcbiAgICAgICAgdmFyIGV4cCA9ICtzLnNsaWNlKGogKyAxKTtcbiAgICAgICAgaWYgKGV4cCA8IC00IHx8IHggPj0gMWUyMSB8fCB4LnRvRml4ZWQoMCkubGVuZ3RoID4gcHJlYykge1xuICAgICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB6ZXJvZXNcbiAgICAgICAgICB2YXIgaSA9IGogLSAxO1xuICAgICAgICAgIHdoaWxlIChzLmNoYXJBdChpKSA9PT0gXCIwXCIpIGktLTtcbiAgICAgICAgICBpZiAocy5jaGFyQXQoaSkgPT09IFwiLlwiKSBpLS07XG4gICAgICAgICAgcyA9IHMuc2xpY2UoMCwgaSArIDEpICsgcy5zbGljZShqKTtcbiAgICAgICAgICBpID0gcy5sZW5ndGg7XG4gICAgICAgICAgaWYgKHMuY2hhckF0KGkgLSAzKSA9PT0gXCJlXCIpXG4gICAgICAgICAgICBzID0gcy5zbGljZSgwLCBpIC0gMSkgKyBcIjBcIiArIHMuc2xpY2UoaSAtIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBwID0gcHJlYztcbiAgICAgICAgICBpZiAoZXhwIDwgMCkge1xuICAgICAgICAgICAgcCAtPSBleHAgKyAxO1xuICAgICAgICAgICAgcyA9IHgudG9GaXhlZChwKTtcbiAgICAgICAgICB9IGVsc2Ugd2hpbGUgKCgocyA9IHgudG9GaXhlZChwKSksIHMubGVuZ3RoID4gcHJlYyArIDEpKSBwLS07XG4gICAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB6ZXJvZXNcbiAgICAgICAgICAgIHZhciBpID0gcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgd2hpbGUgKHMuY2hhckF0KGkpID09PSBcIjBcIikgaS0tO1xuICAgICAgICAgICAgaWYgKHMuY2hhckF0KGkpID09PSBcIi5cIikgaS0tO1xuICAgICAgICAgICAgcyA9IHMuc2xpY2UoMCwgaSArIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIHJldHVybiBjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nKGYsIHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zsb2F0X29mX3N0cmluZyAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2Zsb2F0X29mX3N0cmluZyhzKSB7XG4gIHZhciByZXM7XG4gIHZhciByX2Zsb2F0ID0gL14gKlstK10/KD86XFxkKlxcLj9cXGQrfFxcZCtcXC4/XFxkKikoPzpbZUVdWy0rXT9cXGQrKT8kLztcbiAgcyA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcocyk7XG4gIHJlcyA9ICtzO1xuICAvL0Zhc3QgcGF0aFxuICBpZiAoIU51bWJlci5pc05hTihyZXMpICYmIHJfZmxvYXQudGVzdChzKSkgcmV0dXJuIHJlcztcbiAgcyA9IHMucmVwbGFjZSgvXy9nLCBcIlwiKTtcbiAgcmVzID0gK3M7XG4gIGlmICgoIU51bWJlci5pc05hTihyZXMpICYmIHJfZmxvYXQudGVzdChzKSkgfHwgL15bKy1dP25hbiQvaS50ZXN0KHMpKVxuICAgIHJldHVybiByZXM7XG4gIHZhciBtID0gL14gKihbKy1dPykweChbMC05YS1mXSspXFwuPyhbMC05YS1mXSopKHAoWystXT9bMC05XSspKT8kL2kuZXhlYyhzKTtcbiAgLy8gICAgICAgICAgMSAgICAgICAgMiAgICAgICAgICAgICAzICAgICAgICAgICA1XG4gIGlmIChtKSB7XG4gICAgdmFyIG0zID0gbVszXS5yZXBsYWNlKC8wKyQvLCBcIlwiKTtcbiAgICB2YXIgbWFudGlzc2EgPSBOdW1iZXIucGFyc2VJbnQobVsxXSArIG1bMl0gKyBtMywgMTYpO1xuICAgIHZhciBleHBvbmVudCA9ICgrbVs1XSB8fCAwKSAtIDQgKiBtMy5sZW5ndGg7XG4gICAgcmVzID0gbWFudGlzc2EgKiBNYXRoLnBvdygyLCBleHBvbmVudCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBpZiAoL15cXCs/aW5mKGluaXR5KT8kL2kudGVzdChzKSkgcmV0dXJuIE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgaWYgKC9eLWluZihpbml0eSk/JC9pLnRlc3QocykpIHJldHVybiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gIGNhbWxfZmFpbHdpdGgoXCJmbG9hdF9vZl9zdHJpbmdcIik7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VwZGF0ZV9kdW1teVxuZnVuY3Rpb24gY2FtbF91cGRhdGVfZHVtbXkoeCwgeSkge1xuICBpZiAoeS5mdW4pIHtcbiAgICB4LmZ1biA9IHkuZnVuO1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmICh0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgeC5mdW4gPSB5O1xuICAgIHJldHVybiAwO1xuICB9XG4gIHZhciBpID0geS5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHhbaV0gPSB5W2ldO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hbGxvY19kdW1teV9pbmZpeFxuLy9SZXF1aXJlczogY2FtbF9jYWxsX2dlblxuLy9WZXJzaW9uOiA8IDUuNFxuZnVuY3Rpb24gY2FtbF9hbGxvY19kdW1teV9pbmZpeCgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGYoeCkge1xuICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuKGYuZnVuLCBbeF0pO1xuICB9O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FsbG9jX2R1bW15X2xhenlcbi8vVmVyc2lvbjogPj0gNS40XG5mdW5jdGlvbiBjYW1sX2FsbG9jX2R1bW15X2xhenkoX3VuaXQpIHtcbiAgcmV0dXJuIFswLCAwXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91cGRhdGVfZHVtbXlfbGF6eVxuLy9SZXF1aXJlczogY2FtbF9vYmpfdGFnXG4vL1JlcXVpcmVzOiBjYW1sX3VwZGF0ZV9kdW1teVxuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfdXBkYXRlX2R1bW15X2xhenkoZHVtbXksIG5ld3ZhbCkge1xuICBzd2l0Y2ggKGNhbWxfb2JqX3RhZyhuZXd2YWwpKSB7XG4gICAgY2FzZSAyNDY6IC8vIExhenlcbiAgICBjYXNlIDI0NDogLy8gRm9yY2luZ1xuICAgIGNhc2UgMjUwOiAvLyBGb3J3YXJkXG4gICAgICBjYW1sX3VwZGF0ZV9kdW1teShkdW1teSwgbmV3dmFsKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBkdW1teVsxXSA9IG5ld3ZhbDtcbiAgICAgIGR1bW15WzBdID0gMjUwO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3RhZ1xuLy9SZXF1aXJlczogY2FtbF9pc19tbF9ieXRlcywgY2FtbF9pc19tbF9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfb2JqX3RhZyh4KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHgpICYmIHhbMF0gPT09IHhbMF0gPj4+IDApIHJldHVybiB4WzBdO1xuICBlbHNlIGlmIChjYW1sX2lzX21sX2J5dGVzKHgpKSByZXR1cm4gMjUyO1xuICBlbHNlIGlmIChjYW1sX2lzX21sX3N0cmluZyh4KSkgcmV0dXJuIDI1MjtcbiAgZWxzZSBpZiAoeCBpbnN0YW5jZW9mIEZ1bmN0aW9uIHx8IHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiAyNDc7XG4gIGVsc2UgaWYgKHg/LmNhbWxfY3VzdG9tKSByZXR1cm4gMjU1O1xuICBlbHNlIHJldHVybiAxMDAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9zZXRfdGFnIChtdXRhYmxlLCBjb25zdClcbi8vVmVyc2lvbjogPCA1LjBcbmZ1bmN0aW9uIGNhbWxfb2JqX3NldF90YWcoeCwgdGFnKSB7XG4gIHhbMF0gPSB0YWc7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9vYmpfYmxvY2sgY29uc3QgKGNvbnN0LGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9vYmpfYmxvY2sodGFnLCBzaXplKSB7XG4gIC8vIFRPRE86IGZhaWwgZm9yIHZhbHVlIHRoYXQgYXJlIG5vdCByZXByZXNlbnRlZCBhcyBhbiBhcnJheVxuICB2YXIgbyA9IG5ldyBBcnJheShzaXplICsgMSk7XG4gIG9bMF0gPSB0YWc7XG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IHNpemU7IGkrKykgb1tpXSA9IDA7XG4gIHJldHVybiBvO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial93aXRoX3RhZ1xuZnVuY3Rpb24gY2FtbF9vYmpfd2l0aF90YWcodGFnLCB4KSB7XG4gIHZhciBsID0geC5sZW5ndGg7XG4gIHZhciBhID0gbmV3IEFycmF5KGwpO1xuICBhWzBdID0gdGFnO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGw7IGkrKykgYVtpXSA9IHhbaV07XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9kdXAgbXV0YWJsZSAobXV0YWJsZSlcbmZ1bmN0aW9uIGNhbWxfb2JqX2R1cCh4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJudW1iZXJcIiA/IHggOiB4LnNsaWNlKCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3RydW5jYXRlIChtdXRhYmxlLCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuLy9WZXJzaW9uOiA8IDUuMFxuZnVuY3Rpb24gY2FtbF9vYmpfdHJ1bmNhdGUoeCwgcykge1xuICBpZiAocyA8PSAwIHx8IHMgKyAxID4geC5sZW5ndGgpIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIk9iai50cnVuY2F0ZVwiKTtcbiAgaWYgKHgubGVuZ3RoICE9PSBzICsgMSkgeC5sZW5ndGggPSBzICsgMTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX21ha2VfZm9yd2FyZFxuLy9WZXJzaW9uOiA8IDUuMFxuZnVuY3Rpb24gY2FtbF9vYmpfbWFrZV9mb3J3YXJkKGIsIHYpIHtcbiAgYlswXSA9IDI1MDtcbiAgYlsxXSA9IHY7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9jb21wYXJlX2FuZF9zd2FwXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9vYmpfY29tcGFyZV9hbmRfc3dhcCh4LCBpLCBvbGQsIG4pIHtcbiAgaWYgKHhbaSArIDFdID09PSBvbGQpIHtcbiAgICB4W2kgKyAxXSA9IG47XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX2lzX3NoYXJlZFxuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfb2JqX2lzX3NoYXJlZChfeCkge1xuICByZXR1cm4gMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9sYXp5X21ha2VfZm9yd2FyZCBjb25zdCAobXV0YWJsZSlcbmZ1bmN0aW9uIGNhbWxfbGF6eV9tYWtlX2ZvcndhcmQodikge1xuICByZXR1cm4gWzI1MCwgdl07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWV0aG9kX2NhY2hlXG52YXIgY2FtbF9tZXRob2RfY2FjaGUgPSBbXTtcblxuLy9Qcm92aWRlczogY2FtbF9vb19jYWNoZV9pZCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9tZXRob2RfY2FjaGVcbmZ1bmN0aW9uIGNhbWxfb29fY2FjaGVfaWQoKSB7XG4gIHZhciBjYWNoZWlkID0gY2FtbF9tZXRob2RfY2FjaGUubGVuZ3RoO1xuICBjYW1sX21ldGhvZF9jYWNoZVtjYWNoZWlkXSA9IDA7XG4gIGNhY2hlaWQ7XG59XG5cbi8vLy8vLy8vLy8vLy8gQ2FtbGludGVybmFsT09cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X2NhY2hlZF9tZXRob2QgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfbWV0aG9kX2NhY2hlXG5mdW5jdGlvbiBjYW1sX2dldF9jYWNoZWRfbWV0aG9kKG9iaiwgdGFnLCBjYWNoZWlkKSB7XG4gIHZhciBtZXRocyA9IG9ialsxXTtcbiAgdmFyIG9mcyA9IGNhbWxfbWV0aG9kX2NhY2hlW2NhY2hlaWRdO1xuICBpZiAobWV0aHNbb2ZzICsgNF0gPT09IHRhZykge1xuICAgIHJldHVybiBtZXRoc1tvZnMgKyAzXTtcbiAgfVxuICB2YXIgbGkgPSAzLFxuICAgIGhpID0gbWV0aHNbMV0gKiAyICsgMSxcbiAgICBtaTtcbiAgd2hpbGUgKGxpIDwgaGkpIHtcbiAgICBtaSA9ICgobGkgKyBoaSkgPj4gMSkgfCAxO1xuICAgIGlmICh0YWcgPCBtZXRoc1ttaSArIDFdKSBoaSA9IG1pIC0gMjtcbiAgICBlbHNlIGxpID0gbWk7XG4gIH1cbiAgY2FtbF9tZXRob2RfY2FjaGVbY2FjaGVpZF0gPSBsaSAtIDM7XG4gIHJldHVybiBtZXRoc1tsaV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X3B1YmxpY19tZXRob2QgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZ2V0X3B1YmxpY19tZXRob2Qob2JqLCB0YWcpIHtcbiAgdmFyIG1ldGhzID0gb2JqWzFdO1xuICB2YXIgbGkgPSAzLFxuICAgIGhpID0gbWV0aHNbMV0gKiAyICsgMSxcbiAgICBtaTtcbiAgd2hpbGUgKGxpIDwgaGkpIHtcbiAgICBtaSA9ICgobGkgKyBoaSkgPj4gMSkgfCAxO1xuICAgIGlmICh0YWcgPCBtZXRoc1ttaSArIDFdKSBoaSA9IG1pIC0gMjtcbiAgICBlbHNlIGxpID0gbWk7XG4gIH1cbiAgLyogcmV0dXJuIDAgaWYgdGFnIGlzIG5vdCB0aGVyZSAqL1xuICByZXR1cm4gdGFnID09PSBtZXRoc1tsaSArIDFdID8gbWV0aHNbbGldIDogMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vb19sYXN0X2lkXG52YXIgY2FtbF9vb19sYXN0X2lkID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9zZXRfb29faWRcbi8vUmVxdWlyZXM6IGNhbWxfb29fbGFzdF9pZFxuZnVuY3Rpb24gY2FtbF9zZXRfb29faWQoYikge1xuICBiWzJdID0gY2FtbF9vb19sYXN0X2lkKys7XG4gIHJldHVybiBiO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZyZXNoX29vX2lkIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX29vX2xhc3RfaWRcbmZ1bmN0aW9uIGNhbWxfZnJlc2hfb29faWQoKSB7XG4gIHJldHVybiBjYW1sX29vX2xhc3RfaWQrKztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vYmpfcmF3X2ZpZWxkXG5mdW5jdGlvbiBjYW1sX29ial9yYXdfZmllbGQobywgaSkge1xuICByZXR1cm4gb1tpICsgMV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3NldF9yYXdfZmllbGRcbmZ1bmN0aW9uIGNhbWxfb2JqX3NldF9yYXdfZmllbGQobywgaSwgdikge1xuICByZXR1cm4gKG9baSArIDFdID0gdik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3JlYWNoYWJsZV93b3Jkc1xuZnVuY3Rpb24gY2FtbF9vYmpfcmVhY2hhYmxlX3dvcmRzKF9vKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9hZGRfb2Zmc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX29ial9hZGRfb2Zmc2V0KF92LCBfb2Zmc2V0KSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJPYmouYWRkX29mZnNldCBpcyBub3Qgc3VwcG9ydGVkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial91cGRhdGVfdGFnXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9vYmpfdXBkYXRlX3RhZyhiLCBvLCBuKSB7XG4gIGlmIChiWzBdID09PSBvKSB7XG4gICAgYlswXSA9IG47XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbGF6eV91cGRhdGVfdG9fZm9yY2luZ1xuLy9SZXF1aXJlczogY2FtbF9vYmpfdXBkYXRlX3RhZ1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfbGF6eV91cGRhdGVfdG9fZm9yY2luZyhvKSB7XG4gIGlmIChcbiAgICBBcnJheS5pc0FycmF5KG8pICYmXG4gICAgb1swXSA9PT0gb1swXSA+Pj4gMCAmJlxuICAgIGNhbWxfb2JqX3VwZGF0ZV90YWcobywgMjQ2LCAyNDQpXG4gICkge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAxO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbGF6eV91cGRhdGVfdG9fZm9yd2FyZFxuLy9SZXF1aXJlczogY2FtbF9vYmpfdXBkYXRlX3RhZ1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfbGF6eV91cGRhdGVfdG9fZm9yd2FyZChvKSB7XG4gIGNhbWxfb2JqX3VwZGF0ZV90YWcobywgMjQ0LCAyNTApO1xuICByZXR1cm4gMDsgLy8gdW5pdFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2xhenlfcmVzZXRfdG9fbGF6eVxuLy9SZXF1aXJlczogY2FtbF9vYmpfdXBkYXRlX3RhZ1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfbGF6eV9yZXNldF90b19sYXp5KG8pIHtcbiAgY2FtbF9vYmpfdXBkYXRlX3RhZyhvLCAyNDQsIDI0Nik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2xhenlfcmVhZF9yZXN1bHRcbi8vUmVxdWlyZXM6IGNhbWxfb2JqX3RhZ1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfbGF6eV9yZWFkX3Jlc3VsdChvKSB7XG4gIHJldHVybiBjYW1sX29ial90YWcobykgPT09IDI1MCA/IG9bMV0gOiBvO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWdcbi8vVmVyc2lvbjogPCA1XG5mdW5jdGlvbiBjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWcoX3QpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfY29udGludWF0aW9uX3RhZ1xuLy9WZXJzaW9uOiA+PSA1XG5mdW5jdGlvbiBjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWcodCkge1xuICByZXR1cm4gdCA9PT0gMjQ1ID8gMSA6IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY3VzdG9tX2lkZW50aWZpZXJcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2N1c3RvbV9pZGVudGlmaWVyKG8pIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKG8uY2FtbF9jdXN0b20gfHwgXCJcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfZ2NfcmFtcF91cFxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfbWxfZ2NfcmFtcF91cChmKSB7XG4gIHZhciBhID0gY2FtbF9jYWxsYmFjayhmLCBbMF0pO1xuICB2YXIgc3VzcGVuZGVkID0gMDtcbiAgcmV0dXJuIFswLCBhLCBzdXNwZW5kZWRdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2djX3JhbXBfZG93blxuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfbWxfZ2NfcmFtcF9kb3duKF9zdXNwZW5kZWRfY29sbGVjdGlvbl93b3JrKSB7XG4gIHJldHVybiAwO1xufVxuIiwiLypcblRvIGRlYWwgd2l0aCBlZmZlY3RzLCB0aGUgZXhlY3V0aW9uIGNvbnRleHQgaXMgaW50dWl0aXZlbHkgY29tcG9zZWQgb2ZcbmEgc3RhY2sgb2YgZmliZXJzLiBFYWNoIGZpYmVyIGhhcyBhIGN1cnJlbnQgbG93LWxldmVsIGNvbnRpbnVhdGlvblxuKG9uZS1hcmd1bWVudCBKYXZhU2NyaXB0IGZ1bmN0aW9uKSwgYSBzdGFjayBvZiBleGNlcHRpb24gaGFuZGxlcnMgYW5kXG5hIHRyaXBsZSBvZiBoYW5kbGVycywgd2hpY2ggYXJlIGludm9rZWQgd2hlbiB0aGUgZmliZXIgdGVybWluYXRlc1xuKGVpdGhlciB3aXRoIGEgdmFsdWUgb3IgYW4gZXhjZXB0aW9uKSBvciB3aGVuIGFuIGVmZmVjdCBpcyBwZXJmb3JtZWQuXG5UaGUgbG93LWxldmVsIGNvbnRpbnVhdGlvbiBvZiB0aGUgdG9wbW9zdCBmaWJlciAod2hpY2ggaXMgY3VycmVudGx5XG5leGVjdXRpbmcpIGlzIHBhc3NlZCBmcm9tIGZ1bmN0aW9uIHRvIGZ1bmN0aW9uIGFzIGFuIGFkZGl0aW9uYWxcbmFyZ3VtZW50LiBJdHMgc3RhY2sgb2YgZXhjZXB0aW9uIGhhbmRsZXJzIGlzIHN0b3JlZCBpblxuW2NhbWxfY3VycmVudF9zdGFjay54XS5cbkV4Y2VwdGlvbiBoYW5kbGVycyBhcmUgcHVzaGVkIGludG8gdGhpcyBzdGFja1xud2hlbiBlbnRlcmluZyBhIFt0cnkgLi4uIHdpdGggLi4uXSBhbmQgcG9wcGVkIG9uIGV4aXQuXG5IYW5kbGVycyBhcmUgc3RvcmVkIGluIFtjYW1sX2N1cnJlbnRfc3RhY2suaF1cbmFuZCB0aGUgcmVtYWluaW5nIGZpYmVycyBhcmUgc3RvcmVkIGluIFtjYW1sX2N1cnJlbnRfc3RhY2suZV0uXG5UbyBpbnN0YWxsIGFuIGVmZmVjdCBoYW5kbGVyLCB3ZSBwdXNoIGEgbmV3IGZpYmVyIGludG8gdGhlIGV4ZWN1dGlvbiBjb250ZXh0LlxuXG5XZSBoYXZlIGJhc2ljYWxseSB0aGUgZm9sbG93aW5nIHR5cGUgZm9yIHJlaWZpZWQgY29udGludWF0aW9ucyAodHlwZVxuW2NvbnRpbnVhdGlvbl0gaW4gbW9kdWxlIFtFZmZlY3RdIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5KTpcblxuICB0eXBlICgnYSwgJ2IpIGNvbnRpbnVhdGlvbiA9ICgnYSwgJ2IpIHN0YWNrIHJlZlxuXG4gIGFuZCAoXywgXykgc3RhY2sgPVxuICAgICAgQ29ucyA6ICgnYiAtPiB1bml0KSAqICAgICAgICAgICAgICgqIGxvdy1sZXZlbCBjb250aW51YXRpb24gKilcbiAgICAgICAgICAgICAoZXhuIC0+IHVuaXQpIGxpc3QgKiAgICAgICAoKiBleGNlcHRpb24gaGFuZGxlcnMgKilcbiAgICAgICAgICAgICAoJ2IsICdjKSBoYW5kbGVyICpcbiAgICAgICAgICAgICAoJ2EsICdiKSBzdGFja1xuICAgICAgICAgICAgIC0+ICgnYSwgJ2MpIHN0YWNrXG4gICAgfCBFbXB0eSA6ICgnYSwgJ2EpIHN0YWNrXG5cbiAgYW5kICgnYSwnYikgaGFuZGxlciA9ICAgKCogQXMgaW4gbW9kdWxlIEVmZmVjdCBmcm9tIHRoZSBzdGFuZGFyZCBsaWJyYXJ5ICopXG4gICAgeyByZXRjOiAnYSAtPiAnYjtcbiAgICAgIGV4bmM6IGV4biAtPiAnYjtcbiAgICAgIGVmZmM6ICdjLidjIEVmZmVjdC50IC0+ICgoJ2MsJ2IpIGNvbnRpbnVhdGlvbiAtPiAnYikgb3B0aW9uIH1cblxuQ29udGludWF0aW9ucyBhcmUgb25lLXNob3QuIEEgY29udGludWF0aW9uIFtyZWYgRW1wdHldIGhhcyBhbHJlYWR5XG5iZWVuIHJlc3VtZWQuXG5cbkEgY29udGludWF0aW9uIGlzIGJhc2ljYWxseSBjb21wb3NlZCBvZiBhIGxpc3Qgb2YgZmliZXJzLCB3aGljaCBlYWNoXG5oYXMgaXRzIGxvdy1sZXZlbCBjb250aW51YXRpb24sIGl0cyBzdGFjayBvZiBleGNlcHRpb24gaGFuZGxlcnMgYW5kIGFcbnRyaXBsZSBvZiBoYW5kbGVycyB0byBkZWFsIHdpdGggd2hlbiB0aGUgZmliZXIgdGVybWluYXRlcyBvciBhblxuZWZmZWN0IGlzIHBlcmZvcm1lZC4gV2hlbiByZXN1bWluZyBhIGNvbnRpbnVhdGlvbiwgdGhlIGlubmVybW9zdCBmaWJlclxuaXMgcmVzdW1lZCBmaXJzdC5cblxuVGhlIGhhbmRsZXJzIGFyZSBDUFMtdHJhbnNmb3JtZWQgZnVuY3Rpb25zOiB0aGV5IGFjdHVhbGx5IHRha2UgYW5cbmFkZGl0aW9uYWwgcGFyYW1ldGVyIHdoaWNoIGlzIHRoZSBjdXJyZW50IGxvdy1sZXZlbCBjb250aW51YXRpb24uXG4qL1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2N1cnJlbnRfc3RhY2tcbi8vSWY6IGVmZmVjdHNcbi8vIFRoaXMgaGFzIHRoZSBzaGFwZSB7aywgeCwgaCwgZX0gd2hlcmVcbi8vIC0gaCBpcyBhIHRyaXBsZSBvZiBoYW5kbGVycyAoc2VlIGVmZmVjdC5tbClcbi8vIC0gayBpcyB0aGUgbG93IGxldmVsIGNvbnRpbnVhdGlvblxuLy8gLSB4IGlzIHRoZSBleGNlcHRpb24gc3RhY2tcbi8vIC0gZSBpcyB0aGUgZmliZXIgc3RhY2sgb2YgdGhlIHBhcmVudCBmaWJlci5cbnZhciBjYW1sX2N1cnJlbnRfc3RhY2sgPSB7IGs6IDAsIHg6IDAsIGg6IDAsIGU6IDAgfTtcblxuLy9Qcm92aWRlczogY2FtbF9wdXNoX3RyYXBcbi8vUmVxdWlyZXM6IGNhbWxfY3VycmVudF9zdGFja1xuLy9JZjogZWZmZWN0c1xuZnVuY3Rpb24gY2FtbF9wdXNoX3RyYXAoaGFuZGxlcikge1xuICBjYW1sX2N1cnJlbnRfc3RhY2sueCA9IHsgaDogaGFuZGxlciwgdDogY2FtbF9jdXJyZW50X3N0YWNrLnggfTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9wb3BfdHJhcFxuLy9SZXF1aXJlczogY2FtbF9jdXJyZW50X3N0YWNrXG4vL0lmOiBlZmZlY3RzXG5mdW5jdGlvbiBjYW1sX3BvcF90cmFwKCkge1xuICBpZiAoIWNhbWxfY3VycmVudF9zdGFjay54KVxuICAgIHJldHVybiBmdW5jdGlvbiAoeCkge1xuICAgICAgdGhyb3cgeDtcbiAgICB9O1xuICB2YXIgaCA9IGNhbWxfY3VycmVudF9zdGFjay54Lmg7XG4gIGNhbWxfY3VycmVudF9zdGFjay54ID0gY2FtbF9jdXJyZW50X3N0YWNrLngudDtcbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2VfdW5oYW5kbGVkXG4vL1JlcXVpcmVzOiBjYW1sX21ha2VfdW5oYW5kbGVkX2VmZmVjdF9leG5cbi8vSWY6IGVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3VuaGFuZGxlZChlZmYpIHtcbiAgdmFyIGV4biA9IGNhbWxfbWFrZV91bmhhbmRsZWRfZWZmZWN0X2V4bihlZmYpO1xuICB0aHJvdyBleG47XG59XG5cbi8vUHJvdmlkZXM6Y2FtbF9yZXN1bWVfc3RhY2tcbi8vUmVxdWlyZXM6IGNhbWxfbmFtZWRfdmFsdWUsIGNhbWxfcmFpc2VfY29uc3RhbnRcbi8vUmVxdWlyZXM6IGNhbWxfcG9wX2ZpYmVyLCBjYW1sX2N1cnJlbnRfc3RhY2tcbi8vSWY6IGVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX3Jlc3VtZV9zdGFjayhzdGFjaywgbGFzdCwgaykge1xuICBpZiAoIXN0YWNrKVxuICAgIGNhbWxfcmFpc2VfY29uc3RhbnQoXG4gICAgICBjYW1sX25hbWVkX3ZhbHVlKFwiRWZmZWN0LkNvbnRpbnVhdGlvbl9hbHJlYWR5X3Jlc3VtZWRcIiksXG4gICAgKTtcbiAgaWYgKGxhc3QgPT09IDApIHtcbiAgICBsYXN0ID0gc3RhY2s7XG4gICAgLy8gUHJlIE9DYW1sIDUuMiwgbGFzdCB3YXMgbm90IHBvcHVsYXRlZC5cbiAgICB3aGlsZSAobGFzdC5lICE9PSAwKSBsYXN0ID0gbGFzdC5lO1xuICB9XG4gIGNhbWxfY3VycmVudF9zdGFjay5rID0gaztcbiAgbGFzdC5lID0gY2FtbF9jdXJyZW50X3N0YWNrO1xuICBjYW1sX2N1cnJlbnRfc3RhY2sgPSBzdGFjaztcbiAgcmV0dXJuIHN0YWNrLms7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcG9wX2ZpYmVyXG4vL1JlcXVpcmVzOiBjYW1sX2N1cnJlbnRfc3RhY2tcbi8vSWY6IGVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX3BvcF9maWJlcigpIHtcbiAgLy8gTW92ZSB0byB0aGUgcGFyZW50IGZpYmVyLCByZXR1cm5pbmcgdGhlIHBhcmVudCdzIGxvdy1sZXZlbCBjb250aW51YXRpb25cbiAgdmFyIGMgPSBjYW1sX2N1cnJlbnRfc3RhY2suZTtcbiAgY2FtbF9jdXJyZW50X3N0YWNrLmUgPSAwO1xuICBjYW1sX2N1cnJlbnRfc3RhY2sgPSBjO1xuICByZXR1cm4gYy5rO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21ha2VfdW5oYW5kbGVkX2VmZmVjdF9leG5cbi8vUmVxdWlyZXM6IGNhbWxfbmFtZWRfdmFsdWUsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMsIGNhbWxfZnJlc2hfb29faWRcbi8vSWY6IGVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX21ha2VfdW5oYW5kbGVkX2VmZmVjdF9leG4oZWZmKSB7XG4gIHZhciBleG4gPSBjYW1sX25hbWVkX3ZhbHVlKFwiRWZmZWN0LlVuaGFuZGxlZFwiKTtcbiAgaWYgKGV4bikgZXhuID0gWzAsIGV4biwgZWZmXTtcbiAgZWxzZSB7XG4gICAgZXhuID0gW1xuICAgICAgMjQ4LFxuICAgICAgY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIkVmZmVjdC5VbmhhbmRsZWRcIiksXG4gICAgICBjYW1sX2ZyZXNoX29vX2lkKDApLFxuICAgIF07XG4gIH1cbiAgcmV0dXJuIGV4bjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9wZXJmb3JtX2VmZmVjdFxuLy9SZXF1aXJlczogY2FtbF9wb3BfZmliZXIsIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgsIGNhbWxfdHJhbXBvbGluZV9yZXR1cm5cbi8vUmVxdWlyZXM6IGNhbWxfbWFrZV91bmhhbmRsZWRfZWZmZWN0X2V4biwgY2FtbF9jdXJyZW50X3N0YWNrXG4vL1JlcXVpcmVzOiBjYW1sX2dldF9jcHNfZnVuXG4vL0lmOiBlZmZlY3RzXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9wZXJmb3JtX2VmZmVjdChlZmYsIGswKSB7XG4gIGlmIChjYW1sX2N1cnJlbnRfc3RhY2suZSA9PT0gMCkge1xuICAgIHZhciBleG4gPSBjYW1sX21ha2VfdW5oYW5kbGVkX2VmZmVjdF9leG4oZWZmKTtcbiAgICB0aHJvdyBleG47XG4gIH1cbiAgLy8gR2V0IGN1cnJlbnQgZWZmZWN0IGhhbmRsZXJcbiAgdmFyIGhhbmRsZXIgPSBjYW1sX2N1cnJlbnRfc3RhY2suaFszXTtcbiAgdmFyIGxhc3RfZmliZXIgPSBjYW1sX2N1cnJlbnRfc3RhY2s7XG4gIGxhc3RfZmliZXIuayA9IGswO1xuICB2YXIgY29udCA9IFsyNDUgLypjb250aW51YXRpb24qLywgbGFzdF9maWJlciwgbGFzdF9maWJlcl07XG4gIC8vIE1vdmUgdG8gcGFyZW50IGZpYmVyIGFuZCBleGVjdXRlIHRoZSBlZmZlY3QgaGFuZGxlciB0aGVyZVxuICAvLyBUaGUgaGFuZGxlciBpcyBkZWZpbmVkIGluIFN0ZGxpYi5FZmZlY3QsIHNvIHdlIGtub3cgdGhhdCB0aGUgYXJpdHkgbWF0Y2hlc1xuICB2YXIgazEgPSBjYW1sX3BvcF9maWJlcigpO1xuICByZXR1cm4gY2FtbF9zdGFja19jaGVja19kZXB0aCgpXG4gICAgPyBjYW1sX2dldF9jcHNfZnVuKGhhbmRsZXIpKGVmZiwgY29udCwgbGFzdF9maWJlciwgazEpXG4gICAgOiBjYW1sX3RyYW1wb2xpbmVfcmV0dXJuKGhhbmRsZXIsIFtlZmYsIGNvbnQsIGxhc3RfZmliZXIsIGsxXSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmVwZXJmb3JtX2VmZmVjdFxuLy9SZXF1aXJlczogY2FtbF9wb3BfZmliZXIsIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgsIGNhbWxfdHJhbXBvbGluZV9yZXR1cm5cbi8vUmVxdWlyZXM6IGNhbWxfbWFrZV91bmhhbmRsZWRfZWZmZWN0X2V4biwgY2FtbF9jdXJyZW50X3N0YWNrXG4vL1JlcXVpcmVzOiBjYW1sX3Jlc3VtZV9zdGFjaywgY2FtbF9jb250aW51YXRpb25fdXNlX25vZXhjXG4vL1JlcXVpcmVzOiBjYW1sX2dldF9jcHNfZnVuXG4vL0lmOiBlZmZlY3RzXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9yZXBlcmZvcm1fZWZmZWN0KGVmZiwgY29udCwgbGFzdCwgazApIHtcbiAgaWYgKGNhbWxfY3VycmVudF9zdGFjay5lID09PSAwKSB7XG4gICAgdmFyIGV4biA9IGNhbWxfbWFrZV91bmhhbmRsZWRfZWZmZWN0X2V4bihlZmYpO1xuICAgIHZhciBzdGFjayA9IGNhbWxfY29udGludWF0aW9uX3VzZV9ub2V4Yyhjb250KTtcbiAgICBjYW1sX3Jlc3VtZV9zdGFjayhzdGFjaywgbGFzdCwgazApO1xuICAgIHRocm93IGV4bjtcbiAgfVxuICAvLyBHZXQgY3VycmVudCBlZmZlY3QgaGFuZGxlclxuICB2YXIgaGFuZGxlciA9IGNhbWxfY3VycmVudF9zdGFjay5oWzNdO1xuICB2YXIgbGFzdF9maWJlciA9IGNhbWxfY3VycmVudF9zdGFjaztcbiAgbGFzdF9maWJlci5rID0gazA7XG4gIGxhc3QuZSA9IGxhc3RfZmliZXI7XG4gIGNvbnRbMl0gPSBsYXN0X2ZpYmVyO1xuICAvLyBNb3ZlIHRvIHBhcmVudCBmaWJlciBhbmQgZXhlY3V0ZSB0aGUgZWZmZWN0IGhhbmRsZXIgdGhlcmVcbiAgLy8gVGhlIGhhbmRsZXIgaXMgZGVmaW5lZCBpbiBTdGRsaWIuRWZmZWN0LCBzbyB3ZSBrbm93IHRoYXQgdGhlIGFyaXR5IG1hdGNoZXNcbiAgdmFyIGsxID0gY2FtbF9wb3BfZmliZXIoKTtcbiAgcmV0dXJuIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgoKVxuICAgID8gY2FtbF9nZXRfY3BzX2Z1bihoYW5kbGVyKShlZmYsIGNvbnQsIGxhc3RfZmliZXIsIGsxKVxuICAgIDogY2FtbF90cmFtcG9saW5lX3JldHVybihoYW5kbGVyLCBbZWZmLCBjb250LCBsYXN0X2ZpYmVyLCBrMV0pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9jcHNfZnVuXG4vL0lmOiBlZmZlY3RzXG4vL0lmOiAhZG91YmxldHJhbnNsYXRlXG5mdW5jdGlvbiBjYW1sX2dldF9jcHNfZnVuKGYpIHtcbiAgcmV0dXJuIGY7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X2Nwc19mdW5cbi8vSWY6IGVmZmVjdHNcbi8vSWY6IGRvdWJsZXRyYW5zbGF0ZVxuZnVuY3Rpb24gY2FtbF9nZXRfY3BzX2Z1bihmKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIHRvIGdldCB0aGUgZWZmZWN0IGhhbmRsZXIuIElmIHRoZVxuICAvLyBlZmZlY3QgaGFuZGxlciBoYXMgbm8gQ1BTIGZ1bmN0aW9uLCB3ZSBrbm93IHRoYXQgd2UgY2FuIGRpcmVjdGx5XG4gIC8vIGNhbGwgdGhlIGRpcmVjdCB2ZXJzaW9uIGluc3RlYWQuXG4gIHJldHVybiBmLmNwcyA/IGYuY3BzIDogZjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hbGxvY19zdGFja1xuLy9SZXF1aXJlczogY2FtbF9wb3BfZmliZXIsIGNhbWxfY2FsbF9nZW4sIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgsIGNhbWxfdHJhbXBvbGluZV9yZXR1cm5cbi8vUmVxdWlyZXM6IGNhbWxfY2FsbF9nZW5fY3BzLCBjYW1sX2N1cnJlbnRfc3RhY2tcbi8vSWY6IGVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX2FsbG9jX3N0YWNrX2NhbGwoZiwgeCkge1xuICB2YXIgYXJncyA9IFt4LCBjYW1sX3BvcF9maWJlcigpXTtcbiAgcmV0dXJuIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgoKVxuICAgID8gY2FtbF9jYWxsX2dlbl9jcHMoZiwgYXJncylcbiAgICA6IGNhbWxfdHJhbXBvbGluZV9yZXR1cm4oZiwgYXJncywgMCk7XG59XG5mdW5jdGlvbiBjYW1sX2FsbG9jX3N0YWNrX2h2YWwoeCkge1xuICAvLyBDYWxsIFtodl0gaW4gdGhlIHBhcmVudCBmaWJlclxuICB2YXIgZiA9IGNhbWxfY3VycmVudF9zdGFjay5oWzFdO1xuICByZXR1cm4gY2FtbF9hbGxvY19zdGFja19jYWxsKGYsIHgpO1xufVxuZnVuY3Rpb24gY2FtbF9hbGxvY19zdGFja19oZXhuKGUpIHtcbiAgLy8gQ2FsbCBbaHhdIGluIHRoZSBwYXJlbnQgZmliZXJcbiAgdmFyIGYgPSBjYW1sX2N1cnJlbnRfc3RhY2suaFsyXTtcbiAgcmV0dXJuIGNhbWxfYWxsb2Nfc3RhY2tfY2FsbChmLCBlKTtcbn1cbmZ1bmN0aW9uIGNhbWxfYWxsb2Nfc3RhY2soaHYsIGh4LCBoZikge1xuICB2YXIgaGFuZGxlcnMgPSBbMCwgaHYsIGh4LCBoZl07XG4gIHJldHVybiB7XG4gICAgazogY2FtbF9hbGxvY19zdGFja19odmFsLFxuICAgIHg6IHsgaDogY2FtbF9hbGxvY19zdGFja19oZXhuLCB0OiAwIH0sXG4gICAgaDogaGFuZGxlcnMsXG4gICAgZTogMCxcbiAgfTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hbGxvY19zdGFja1xuLy9JZjogIWVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX2FsbG9jX3N0YWNrKF9odiwgX2h4LCBfaGYpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29udGludWF0aW9uX3VzZV9ub2V4Y1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfY29udGludWF0aW9uX3VzZV9ub2V4Yyhjb250KSB7XG4gIHZhciBzdGFjayA9IGNvbnRbMV07XG4gIGNvbnRbMV0gPSAwO1xuICByZXR1cm4gc3RhY2s7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29udGludWF0aW9uX3VzZV9hbmRfdXBkYXRlX2hhbmRsZXJfbm9leGNcbi8vUmVxdWlyZXM6IGNhbWxfY29udGludWF0aW9uX3VzZV9ub2V4Y1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfY29udGludWF0aW9uX3VzZV9hbmRfdXBkYXRlX2hhbmRsZXJfbm9leGMoXG4gIGNvbnQsXG4gIGh2YWwsXG4gIGhleG4sXG4gIGhlZmYsXG4pIHtcbiAgdmFyIHN0YWNrID0gY2FtbF9jb250aW51YXRpb25fdXNlX25vZXhjKGNvbnQpO1xuICBpZiAoc3RhY2sgPT09IDApIHJldHVybiBzdGFjaztcbiAgdmFyIGxhc3QgPSBjb250WzJdO1xuICBsYXN0LmhbMV0gPSBodmFsO1xuICBsYXN0LmhbMl0gPSBoZXhuO1xuICBsYXN0LmhbM10gPSBoZWZmO1xuICByZXR1cm4gc3RhY2s7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X2NvbnRpbnVhdGlvbl9jYWxsc3RhY2tcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX2dldF9jb250aW51YXRpb25fY2FsbHN0YWNrKCkge1xuICByZXR1cm4gWzBdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2NvbmRpdGlvbl9uZXdcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX21sX2NvbmRpdGlvbl9uZXcoX3VuaXQpIHtcbiAgcmV0dXJuIHsgY29uZGl0aW9uOiAxIH07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY29uZGl0aW9uX3dhaXRcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX21sX2NvbmRpdGlvbl93YWl0KF90LCBfbXV0ZXh0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2NvbmRpdGlvbl9icm9hZGNhc3Rcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX21sX2NvbmRpdGlvbl9icm9hZGNhc3QoX3QpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY29uZGl0aW9uX3NpZ25hbFxuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfbWxfY29uZGl0aW9uX3NpZ25hbChfdCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczoganNvb19lZmZlY3Rfbm90X3N1cHBvcnRlZFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuLy8hSWY6IGVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBqc29vX2VmZmVjdF9ub3Rfc3VwcG9ydGVkKCkge1xuICBjYW1sX2ZhaWx3aXRoKFwiRWZmZWN0IGhhbmRsZXJzIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3Jlc3VtZVxuLy9SZXF1aXJlczpjYW1sX3N0YWNrX2RlcHRoLCBjYW1sX2NhbGxfZ2VuX2NwcywgY2FtbF9jdXJyZW50X3N0YWNrLCBjYW1sX3dyYXBfZXhjZXB0aW9uLCBjYW1sX3Jlc3VtZV9zdGFja1xuLy9JZjogZWZmZWN0c1xuLy9JZjogZG91YmxldHJhbnNsYXRlXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9yZXN1bWUoZiwgYXJnLCBzdGFjaywgbGFzdCkge1xuICB2YXIgc2F2ZWRfc3RhY2tfZGVwdGggPSBjYW1sX3N0YWNrX2RlcHRoO1xuICB2YXIgc2F2ZWRfY3VycmVudF9zdGFjayA9IGNhbWxfY3VycmVudF9zdGFjaztcbiAgdHJ5IHtcbiAgICBjYW1sX2N1cnJlbnRfc3RhY2sgPSB7IGs6IDAsIHg6IDAsIGg6IDAsIGU6IDAgfTtcbiAgICB2YXIgayA9IGNhbWxfcmVzdW1lX3N0YWNrKHN0YWNrLCBsYXN0LCBmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIHg7XG4gICAgfSk7XG4gICAgLyogTm90ZTogZiBpcyBub3QgYW4gb3JkaW5hcnkgZnVuY3Rpb24gYnV0IGEgKGRpcmVjdC1zdHlsZSwgQ1BTKSBjbG9zdXJlIHBhaXIgKi9cbiAgICB2YXIgcmVzID0geyBqb29fdHJhbXA6IGYsIGpvb19hcmdzOiBbYXJnLCBrXSwgam9vX2RpcmVjdDogMCB9O1xuICAgIGRvIHtcbiAgICAgIC8qIEF2b2lkcyB0cmFtcG9saW5pbmcgdG9vIG9mdGVuIHdoaWxlIHN0aWxsIGF2b2lkaW5nIHN0YWNrIG92ZXJmbG93LiBTZWVcbiAgICAgICAgIFtjYW1sX2NhbGxiYWNrXS4gKi9cbiAgICAgIGNhbWxfc3RhY2tfZGVwdGggPSA0MDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcyA9IHJlcy5qb29fZGlyZWN0XG4gICAgICAgICAgPyByZXMuam9vX3RyYW1wLmFwcGx5KG51bGwsIHJlcy5qb29fYXJncylcbiAgICAgICAgICA6IGNhbWxfY2FsbF9nZW5fY3BzKHJlcy5qb29fdHJhbXAsIHJlcy5qb29fYXJncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8qIEhhbmRsZSBleGNlcHRpb24gY29taW5nIGZyb20gSmF2YVNjcmlwdCBvciBmcm9tIHRoZSBydW50aW1lLiAqL1xuICAgICAgICBpZiAoIWNhbWxfY3VycmVudF9zdGFjay54KSB0aHJvdyBlO1xuICAgICAgICB2YXIgaGFuZGxlciA9IGNhbWxfY3VycmVudF9zdGFjay54Lmg7XG4gICAgICAgIGNhbWxfY3VycmVudF9zdGFjay54ID0gY2FtbF9jdXJyZW50X3N0YWNrLngudDtcbiAgICAgICAgcmVzID0ge1xuICAgICAgICAgIGpvb190cmFtcDogaGFuZGxlcixcbiAgICAgICAgICBqb29fYXJnczogW2NhbWxfd3JhcF9leGNlcHRpb24oZSldLFxuICAgICAgICAgIGpvb19kaXJlY3Q6IDEsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSB3aGlsZSAocmVzPy5qb29fYXJncyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfSBmaW5hbGx5IHtcbiAgICBjYW1sX3N0YWNrX2RlcHRoID0gc2F2ZWRfc3RhY2tfZGVwdGg7XG4gICAgY2FtbF9jdXJyZW50X3N0YWNrID0gc2F2ZWRfY3VycmVudF9zdGFjaztcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Nwc19jbG9zdXJlXG4vL0lmOiBlZmZlY3RzXG4vL0lmOiBkb3VibGV0cmFuc2xhdGVcbmZ1bmN0aW9uIGNhbWxfY3BzX2Nsb3N1cmUoZGlyZWN0X2YsIGNwc19mKSB7XG4gIGRpcmVjdF9mLmNwcyA9IGNwc19mO1xuICByZXR1cm4gZGlyZWN0X2Y7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXNzdW1lX25vX3BlcmZvcm1cbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2tcbi8vSWY6IGVmZmVjdHNcbi8vSWY6ICFkb3VibGV0cmFuc2xhdGVcbmZ1bmN0aW9uIGNhbWxfYXNzdW1lX25vX3BlcmZvcm0oZikge1xuICByZXR1cm4gY2FtbF9jYWxsYmFjayhmLCBbMF0pO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8vLy8vLy8vLy8vLyBBcnJheVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X3N1YiBtdXRhYmxlXG5mdW5jdGlvbiBjYW1sX2FycmF5X3N1YihhLCBpLCBsZW4pIHtcbiAgdmFyIGEyID0gbmV3IEFycmF5KGxlbiArIDEpO1xuICBhMlswXSA9IDA7XG4gIGZvciAodmFyIGkyID0gMSwgaTEgPSBpICsgMTsgaTIgPD0gbGVuOyBpMisrLCBpMSsrKSB7XG4gICAgYTJbaTJdID0gYVtpMV07XG4gIH1cbiAgcmV0dXJuIGEyO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zsb2F0YXJyYXlfc3ViIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfc3ViXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9mbG9hdGFycmF5X3N1YihhLCBpLCBsZW4pIHtcbiAgcmV0dXJuIGNhbWxfYXJyYXlfc3ViKGEsIGksIGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5pZm9ybV9hcnJheV9zdWIgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9zdWJcbi8vVmVyc2lvbjogPj0gNS4zXG5mdW5jdGlvbiBjYW1sX3VuaWZvcm1fYXJyYXlfc3ViKGEsIGksIGxlbikge1xuICByZXR1cm4gY2FtbF9hcnJheV9zdWIoYSwgaSwgbGVuKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9hcHBlbmQgbXV0YWJsZVxuZnVuY3Rpb24gY2FtbF9hcnJheV9hcHBlbmQoYTEsIGEyKSB7XG4gIHZhciBsMSA9IGExLmxlbmd0aCxcbiAgICBsMiA9IGEyLmxlbmd0aDtcbiAgdmFyIGwgPSBsMSArIGwyIC0gMTtcbiAgdmFyIGEgPSBuZXcgQXJyYXkobCk7XG4gIGFbMF0gPSAwO1xuICB2YXIgaSA9IDEsXG4gICAgaiA9IDE7XG4gIGZvciAoOyBpIDwgbDE7IGkrKykgYVtpXSA9IGExW2ldO1xuICBmb3IgKDsgaSA8IGw7IGkrKywgaisrKSBhW2ldID0gYTJbal07XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zsb2F0YXJyYXlfYXBwZW5kIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYXBwZW5kXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9mbG9hdGFycmF5X2FwcGVuZChhMSwgYTIpIHtcbiAgcmV0dXJuIGNhbWxfYXJyYXlfYXBwZW5kKGExLCBhMik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5pZm9ybV9hcnJheV9hcHBlbmQgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9hcHBlbmRcbi8vVmVyc2lvbjogPj0gNS4zXG5mdW5jdGlvbiBjYW1sX3VuaWZvcm1fYXJyYXlfYXBwZW5kKGExLCBhMikge1xuICByZXR1cm4gY2FtbF9hcnJheV9hcHBlbmQoYTEsIGEyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9jb25jYXQgbXV0YWJsZVxuZnVuY3Rpb24gY2FtbF9hcnJheV9jb25jYXQobCkge1xuICB2YXIgYSA9IFswXTtcbiAgd2hpbGUgKGwgIT09IDApIHtcbiAgICB2YXIgYiA9IGxbMV07XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBiLmxlbmd0aDsgaSsrKSBhLnB1c2goYltpXSk7XG4gICAgbCA9IGxbMl07XG4gIH1cbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmxvYXRhcnJheV9jb25jYXQgbXV0YWJsZVxuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfZmxvYXRhcnJheV9jb25jYXQobCkge1xuICB2YXIgYSA9IFswXTtcbiAgd2hpbGUgKGwgIT09IDApIHtcbiAgICB2YXIgYiA9IGxbMV07XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBiLmxlbmd0aDsgaSsrKSBhLnB1c2goYltpXSk7XG4gICAgbCA9IGxbMl07XG4gIH1cbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5pZm9ybV9hcnJheV9jb25jYXQgbXV0YWJsZVxuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfdW5pZm9ybV9hcnJheV9jb25jYXQobCkge1xuICB2YXIgYSA9IFswXTtcbiAgd2hpbGUgKGwgIT09IDApIHtcbiAgICB2YXIgYiA9IGxbMV07XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBiLmxlbmd0aDsgaSsrKSBhLnB1c2goYltpXSk7XG4gICAgbCA9IGxbMl07XG4gIH1cbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfYmxpdFxuZnVuY3Rpb24gY2FtbF9hcnJheV9ibGl0KGExLCBpMSwgYTIsIGkyLCBsZW4pIHtcbiAgaWYgKGkyIDw9IGkxKSB7XG4gICAgZm9yICh2YXIgaiA9IDE7IGogPD0gbGVuOyBqKyspIGEyW2kyICsgal0gPSBhMVtpMSArIGpdO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGogPSBsZW47IGogPj0gMTsgai0tKSBhMltpMiArIGpdID0gYTFbaTEgKyBqXTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdGFycmF5X2JsaXRcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYmxpdFxuZnVuY3Rpb24gY2FtbF9mbG9hdGFycmF5X2JsaXQoYTEsIGkxLCBhMiwgaTIsIGxlbikge1xuICByZXR1cm4gY2FtbF9hcnJheV9ibGl0KGExLCBpMSwgYTIsIGkyLCBsZW4pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaWZvcm1fYXJyYXlfYmxpdFxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ibGl0XG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF91bmlmb3JtX2FycmF5X2JsaXQoYTEsIGkxLCBhMiwgaTIsIGxlbikge1xuICByZXR1cm4gY2FtbF9hcnJheV9ibGl0KGExLCBpMSwgYTIsIGkyLCBsZW4pO1xufVxuXG4vLy8vLy8vLy8vLy8vIFBlcnZhc2l2ZVxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9zZXQgKG11dGFibGUsIGNvbnN0LCBtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuLy9BbGlhczogY2FtbF9hcnJheV9zZXRfZmxvYXRcbi8vQWxpYXM6IGNhbWxfZmxvYXRhcnJheV9zZXRcbi8vQWxpYXM6IGNhbWxfYXJyYXlfc2V0X2FkZHJcbmZ1bmN0aW9uIGNhbWxfYXJyYXlfc2V0KGFycmF5LCBpbmRleCwgbmV3dmFsKSB7XG4gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gYXJyYXkubGVuZ3RoIC0gMSkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICBhcnJheVtpbmRleCArIDFdID0gbmV3dmFsO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9nZXQgbXV0YWJsZSAobXV0YWJsZSwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG4vL0FsaWFzOiBjYW1sX2FycmF5X2dldF9mbG9hdFxuLy9BbGlhczogY2FtbF9mbG9hdGFycmF5X2dldFxuLy9BbGlhczogY2FtbF9hcnJheV9nZXRfYWRkclxuZnVuY3Rpb24gY2FtbF9hcnJheV9nZXQoYXJyYXksIGluZGV4KSB7XG4gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gYXJyYXkubGVuZ3RoIC0gMSkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICByZXR1cm4gYXJyYXlbaW5kZXggKyAxXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9maWxsXG5mdW5jdGlvbiBjYW1sX2FycmF5X2ZpbGwoYXJyYXksIG9mcywgbGVuLCB2KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnJheVtvZnMgKyBpICsgMV0gPSB2O1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zsb2F0YXJyYXlfZmlsbFxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9maWxsXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9mbG9hdGFycmF5X2ZpbGwoYXJyYXksIG9mcywgbGVuLCB2KSB7XG4gIHJldHVybiBjYW1sX2FycmF5X2ZpbGwoYXJyYXksIG9mcywgbGVuLCB2KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdGFycmF5X2ZpbGxfdW5ib3hlZFxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9maWxsXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9mbG9hdGFycmF5X2ZpbGxfdW5ib3hlZChhcnJheSwgb2ZzLCBsZW4sIHYpIHtcbiAgcmV0dXJuIGNhbWxfYXJyYXlfZmlsbChhcnJheSwgb2ZzLCBsZW4sIHYpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaWZvcm1fYXJyYXlfZmlsbFxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9maWxsXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF91bmlmb3JtX2FycmF5X2ZpbGwoYXJyYXksIG9mcywgbGVuLCB2KSB7XG4gIHJldHVybiBjYW1sX2FycmF5X2ZpbGwoYXJyYXksIG9mcywgbGVuLCB2KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jaGVja19ib3VuZCAobXV0YWJsZSwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG4vL0FsaWFzOiBjYW1sX2NoZWNrX2JvdW5kX2dlblxuLy9BbGlhczogY2FtbF9jaGVja19ib3VuZF9mbG9hdFxuZnVuY3Rpb24gY2FtbF9jaGVja19ib3VuZChhcnJheSwgaW5kZXgpIHtcbiAgaWYgKGluZGV4ID4+PiAwID49IGFycmF5Lmxlbmd0aCAtIDEpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgcmV0dXJuIGFycmF5O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X21ha2UgY29uc3QgKGNvbnN0LCBtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9hcnJheV9tYWtlKGxlbiwgaW5pdCkge1xuICBpZiAobGVuID4+PiAwID49ICgoMHg3ZmZmZmZmZiAvIDQpIHwgMCkpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGxlbiA9IChsZW4gKyAxKSB8IDA7XG4gIHZhciBiID0gbmV3IEFycmF5KGxlbik7XG4gIGJbMF0gPSAwO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbjsgaSsrKSBiW2ldID0gaW5pdDtcbiAgcmV0dXJuIGI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWFrZV92ZWN0IGNvbnN0IChjb25zdCwgbXV0YWJsZSlcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfbWFrZVxuZnVuY3Rpb24gY2FtbF9tYWtlX3ZlY3QobGVuLCBpbml0KSB7XG4gIHJldHVybiBjYW1sX2FycmF5X21ha2UobGVuLCBpbml0KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tYWtlX2Zsb2F0X3ZlY3QgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9tYWtlX2Zsb2F0X3ZlY3QobGVuKSB7XG4gIGlmIChsZW4gPj4+IDAgPj0gKCgweDdmZmZmZmZmIC8gOCkgfCAwKSkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB2YXIgbGVuID0gKGxlbiArIDEpIHwgMDtcbiAgdmFyIGIgPSBuZXcgQXJyYXkobGVuKTtcbiAgYlswXSA9IDI1NDtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47IGkrKykgYltpXSA9IDA7XG4gIHJldHVybiBiO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X2NyZWF0ZV9mbG9hdCBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9hcnJheV9jcmVhdGVfZmxvYXQobGVuKSB7XG4gIGlmIChsZW4gPj4+IDAgPj0gKCgweDdmZmZmZmZmIC8gOCkgfCAwKSkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB2YXIgbGVuID0gKGxlbiArIDEpIHwgMDtcbiAgdmFyIGIgPSBuZXcgQXJyYXkobGVuKTtcbiAgYlswXSA9IDI1NDtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47IGkrKykgYltpXSA9IDA7XG4gIHJldHVybiBiO1xufVxuLy9Qcm92aWRlczogY2FtbF9mbG9hdGFycmF5X2NyZWF0ZSBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX2Zsb2F0YXJyYXlfY3JlYXRlKGxlbikge1xuICBpZiAobGVuID4+PiAwID49ICgoMHg3ZmZmZmZmZiAvIDgpIHwgMCkpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGxlbiA9IChsZW4gKyAxKSB8IDA7XG4gIHZhciBiID0gbmV3IEFycmF5KGxlbik7XG4gIGJbMF0gPSAyNTQ7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspIGJbaV0gPSAwO1xuICByZXR1cm4gYjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdGFycmF5X21ha2UgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuLy9WZXJzaW9uOiA+PSA1LjNcbmZ1bmN0aW9uIGNhbWxfZmxvYXRhcnJheV9tYWtlKGxlbiwgaW5pdCkge1xuICBpZiAobGVuID4+PiAwID49ICgoMHg3ZmZmZmZmZiAvIDgpIHwgMCkpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGxlbiA9IChsZW4gKyAxKSB8IDA7XG4gIHZhciBiID0gbmV3IEFycmF5KGxlbik7XG4gIGJbMF0gPSAyNTQ7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspIGJbaV0gPSBpbml0O1xuICByZXR1cm4gYjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdGFycmF5X21ha2VfdW5ib3hlZCBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2Zsb2F0YXJyYXlfbWFrZVxuLy9WZXJzaW9uOiA+PSA1LjNcbmZ1bmN0aW9uIGNhbWxfZmxvYXRhcnJheV9tYWtlX3VuYm94ZWQobGVuLCBpbml0KSB7XG4gIHJldHVybiBjYW1sX2Zsb2F0YXJyYXlfbWFrZShsZW4sIGluaXQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaWZvcm1fYXJyYXlfbWFrZSBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X21ha2Vcbi8vVmVyc2lvbjogPj0gNS4zXG5mdW5jdGlvbiBjYW1sX3VuaWZvcm1fYXJyYXlfbWFrZShsZW4sIGluaXQpIHtcbiAgcmV0dXJuIGNhbWxfYXJyYXlfbWFrZShsZW4sIGluaXQpO1xufVxuIiwiLy9Qcm92aWRlczogY2FtbF9kb21haW5fZGxzXG4vL1ZlcnNpb246ID49IDVcbnZhciBjYW1sX2RvbWFpbl9kbHMgPSBbMF07XG5cbi8vUHJvdmlkZXM6IGNhbWxfZG9tYWluX2Rsc19zZXRcbi8vUmVxdWlyZXM6IGNhbWxfZG9tYWluX2Rsc1xuLy9WZXJzaW9uOiA+PSA1XG5mdW5jdGlvbiBjYW1sX2RvbWFpbl9kbHNfc2V0KGEpIHtcbiAgY2FtbF9kb21haW5fZGxzID0gYTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9kb21haW5fZGxzX2NvbXBhcmVfYW5kX3NldFxuLy9SZXF1aXJlczogY2FtbF9kb21haW5fZGxzXG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF9kb21haW5fZGxzX2NvbXBhcmVfYW5kX3NldChvbGQsIG4pIHtcbiAgaWYgKGNhbWxfZG9tYWluX2RscyAhPT0gb2xkKSByZXR1cm4gMDtcbiAgY2FtbF9kb21haW5fZGxzID0gbjtcbiAgcmV0dXJuIDE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZG9tYWluX2Rsc19nZXRcbi8vUmVxdWlyZXM6IGNhbWxfZG9tYWluX2Rsc1xuLy9WZXJzaW9uOiA+PSA1XG5mdW5jdGlvbiBjYW1sX2RvbWFpbl9kbHNfZ2V0KF91bml0KSB7XG4gIHJldHVybiBjYW1sX2RvbWFpbl9kbHM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXRvbWljX2xvYWRcbi8vVmVyc2lvbjogPj0gNVxuZnVuY3Rpb24gY2FtbF9hdG9taWNfbG9hZChyZWYpIHtcbiAgcmV0dXJuIHJlZlsxXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hdG9taWNfbG9hZF9maWVsZFxuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfYXRvbWljX2xvYWRfZmllbGQoYiwgaSkge1xuICByZXR1cm4gYltpICsgMV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXRvbWljX2Nhc1xuLy9WZXJzaW9uOiA+PSA1XG5mdW5jdGlvbiBjYW1sX2F0b21pY19jYXMocmVmLCBvLCBuKSB7XG4gIGlmIChyZWZbMV0gPT09IG8pIHtcbiAgICByZWZbMV0gPSBuO1xuICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2F0b21pY19jYXNfZmllbGRcbi8vVmVyc2lvbjogPj0gNS40XG5mdW5jdGlvbiBjYW1sX2F0b21pY19jYXNfZmllbGQoYiwgaSwgbywgbikge1xuICBpZiAoYltpICsgMV0gPT09IG8pIHtcbiAgICBiW2kgKyAxXSA9IG47XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXRvbWljX2ZldGNoX2FkZFxuLy9WZXJzaW9uOiA+PSA1XG5mdW5jdGlvbiBjYW1sX2F0b21pY19mZXRjaF9hZGQocmVmLCBpKSB7XG4gIHZhciBvbGQgPSByZWZbMV07XG4gIHJlZlsxXSArPSBpO1xuICByZXR1cm4gb2xkO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2F0b21pY19mZXRjaF9hZGRfZmllbGRcbi8vVmVyc2lvbjogPj0gNS40XG5mdW5jdGlvbiBjYW1sX2F0b21pY19mZXRjaF9hZGRfZmllbGQoYiwgaSwgbikge1xuICB2YXIgb2xkID0gYltpICsgMV07XG4gIGJbaSArIDFdICs9IG47XG4gIHJldHVybiBvbGQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXRvbWljX2V4Y2hhbmdlXG4vL1ZlcnNpb246ID49IDVcbmZ1bmN0aW9uIGNhbWxfYXRvbWljX2V4Y2hhbmdlKHJlZiwgdikge1xuICB2YXIgciA9IHJlZlsxXTtcbiAgcmVmWzFdID0gdjtcbiAgcmV0dXJuIHI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXRvbWljX2V4Y2hhbmdlX2ZpZWxkXG4vL1ZlcnNpb246ID49IDUuNFxuZnVuY3Rpb24gY2FtbF9hdG9taWNfZXhjaGFuZ2VfZmllbGQoYiwgaSwgdikge1xuICB2YXIgciA9IGJbaSArIDFdO1xuICBiW2kgKyAxXSA9IHY7XG4gIHJldHVybiByO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2F0b21pY19tYWtlX2NvbnRlbmRlZFxuLy9WZXJzaW9uOiA+PSA1LjJcbmZ1bmN0aW9uIGNhbWxfYXRvbWljX21ha2VfY29udGVuZGVkKGEpIHtcbiAgcmV0dXJuIFswLCBhXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9kb21haW5fdW5pcXVlX3Rva2VuXG4vL1ZlcnNpb246ID49IDUuMCwgPCA1LjJcbnZhciBjYW1sX21sX2RvbWFpbl91bmlxdWVfdG9rZW5fID0gWzBdO1xuZnVuY3Rpb24gY2FtbF9tbF9kb21haW5fdW5pcXVlX3Rva2VuKF91bml0KSB7XG4gIHJldHVybiBjYW1sX21sX2RvbWFpbl91bmlxdWVfdG9rZW5fO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JlY29tbWVuZGVkX2RvbWFpbl9jb3VudFxuLy9WZXJzaW9uOiA+PSA1XG5mdW5jdGlvbiBjYW1sX3JlY29tbWVuZGVkX2RvbWFpbl9jb3VudChfdW5pdCkge1xuICByZXR1cm4gMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9kb21haW5faW5kZXhcbi8vUmVxdWlyZXM6IGNhbWxfZG9tYWluX2lkXG4vL1ZlcnNpb246ID49IDUuMDNcbmZ1bmN0aW9uIGNhbWxfbWxfZG9tYWluX2luZGV4KF91bml0KSB7XG4gIHJldHVybiBjYW1sX2RvbWFpbl9pZDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9kb21haW5faWRcbi8vVmVyc2lvbjogPj0gNVxudmFyIGNhbWxfZG9tYWluX2lkID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9kb21haW5fc3Bhd25cbi8vUmVxdWlyZXM6IGNhbWxfbWxfbXV0ZXhfdW5sb2NrXG4vL1JlcXVpcmVzOiBjYW1sX2RvbWFpbl9pZFxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuLy9WZXJzaW9uOiA+PSA1LjJcbnZhciBjYW1sX2RvbWFpbl9sYXRlc3RfaWR4ID0gMTtcbmZ1bmN0aW9uIGNhbWxfZG9tYWluX3NwYXduKGYsIHRlcm1fc3luYykge1xuICB2YXIgaWQgPSBjYW1sX2RvbWFpbl9sYXRlc3RfaWR4Kys7XG4gIHZhciBvbGQgPSBjYW1sX2RvbWFpbl9pZDtcbiAgY2FtbF9kb21haW5faWQgPSBpZDtcbiAgdmFyIHJlcyA9IGNhbWxfY2FsbGJhY2soZiwgWzBdKTtcbiAgY2FtbF9kb21haW5faWQgPSBvbGQ7XG4gIGNhbWxfbWxfbXV0ZXhfdW5sb2NrKHRlcm1fc3luY1syXSk7XG4gIC8vVE9ETzogZml4IGV4biBjYXNlXG4gIHRlcm1fc3luY1sxXSA9IFswLCBbMCwgcmVzXV07XG4gIHJldHVybiBpZDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9kb21haW5fc3Bhd25cbi8vUmVxdWlyZXM6IGNhbWxfbWxfbXV0ZXhfdW5sb2NrXG4vL1JlcXVpcmVzOiBjYW1sX2RvbWFpbl9pZFxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuLy9WZXJzaW9uOiA+PSA1LjAsIDwgNS4yXG52YXIgY2FtbF9kb21haW5fbGF0ZXN0X2lkeCA9IDE7XG5mdW5jdGlvbiBjYW1sX2RvbWFpbl9zcGF3bihmLCBtdXRleCkge1xuICB2YXIgaWQgPSBjYW1sX2RvbWFpbl9sYXRlc3RfaWR4Kys7XG4gIHZhciBvbGQgPSBjYW1sX2RvbWFpbl9pZDtcbiAgY2FtbF9kb21haW5faWQgPSBpZDtcbiAgdmFyIF9yZXMgPSBjYW1sX2NhbGxiYWNrKGYsIFswXSk7XG4gIGNhbWxfZG9tYWluX2lkID0gb2xkO1xuICBjYW1sX21sX211dGV4X3VubG9jayhtdXRleCk7XG4gIHJldHVybiBpZDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9kb21haW5faWRcbi8vUmVxdWlyZXM6IGNhbWxfZG9tYWluX2lkXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9tbF9kb21haW5faWQoX3VuaXQpIHtcbiAgcmV0dXJuIGNhbWxfZG9tYWluX2lkO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2RvbWFpbl9jcHVfcmVsYXhcbi8vVmVyc2lvbjogPj0gNVxuZnVuY3Rpb24gY2FtbF9tbF9kb21haW5fY3B1X3JlbGF4KF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogY2FtbF9mb3JtYXRfaW50IGNvbnN0IChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3BhcnNlX2Zvcm1hdCwgY2FtbF9maW5pc2hfZm9ybWF0dGluZywgY2FtbF9zdHJfcmVwZWF0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG4vL0FsaWFzOiBjYW1sX2ludDMyX2Zvcm1hdFxuLy9BbGlhczogY2FtbF9uYXRpdmVpbnRfZm9ybWF0XG5mdW5jdGlvbiBjYW1sX2Zvcm1hdF9pbnQoZm10LCBpKSB7XG4gIGlmIChjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGZtdCkgPT09IFwiJWRcIilcbiAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIlwiICsgaSk7XG4gIHZhciBmID0gY2FtbF9wYXJzZV9mb3JtYXQoZm10KTtcbiAgaWYgKGkgPCAwKSB7XG4gICAgaWYgKGYuc2lnbmVkY29udikge1xuICAgICAgZi5zaWduID0gLTE7XG4gICAgICBpID0gLWk7XG4gICAgfSBlbHNlIGkgPj4+PSAwO1xuICB9XG4gIHZhciBzID0gaS50b1N0cmluZyhmLmJhc2UpO1xuICBpZiAoZi5wcmVjID49IDApIHtcbiAgICBmLmZpbGxlciA9IFwiIFwiO1xuICAgIHZhciBuID0gZi5wcmVjIC0gcy5sZW5ndGg7XG4gICAgaWYgKG4gPiAwKSBzID0gY2FtbF9zdHJfcmVwZWF0KG4sIFwiMFwiKSArIHM7XG4gIH1cbiAgcmV0dXJuIGNhbWxfZmluaXNoX2Zvcm1hdHRpbmcoZiwgcyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcGFyc2Vfc2lnbl9hbmRfYmFzZVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfdW5zYWZlX2dldCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX3BhcnNlX3NpZ25fYW5kX2Jhc2Uocykge1xuICB2YXIgaSA9IDAsXG4gICAgbGVuID0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpLFxuICAgIGJhc2UgPSAxMCxcbiAgICBzaWduID0gMSxcbiAgICBzaWduZWRuZXNzID0gMTtcbiAgaWYgKGxlbiA+IDApIHtcbiAgICBzd2l0Y2ggKGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSkpIHtcbiAgICAgIGNhc2UgNDU6XG4gICAgICAgIGkrKztcbiAgICAgICAgc2lnbiA9IC0xO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDM6XG4gICAgICAgIGkrKztcbiAgICAgICAgc2lnbiA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoaSArIDEgPCBsZW4gJiYgY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpKSA9PT0gNDgpXG4gICAgc3dpdGNoIChjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkgKyAxKSkge1xuICAgICAgY2FzZSAxMjA6XG4gICAgICBjYXNlIDg4OlxuICAgICAgICBzaWduZWRuZXNzID0gMDtcbiAgICAgICAgYmFzZSA9IDE2O1xuICAgICAgICBpICs9IDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMTE6XG4gICAgICBjYXNlIDc5OlxuICAgICAgICBzaWduZWRuZXNzID0gMDtcbiAgICAgICAgYmFzZSA9IDg7XG4gICAgICAgIGkgKz0gMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDk4OlxuICAgICAgY2FzZSA2NjpcbiAgICAgICAgc2lnbmVkbmVzcyA9IDA7XG4gICAgICAgIGJhc2UgPSAyO1xuICAgICAgICBpICs9IDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMTc6XG4gICAgICBjYXNlIDg1OlxuICAgICAgICBzaWduZWRuZXNzID0gMDtcbiAgICAgICAgaSArPSAyO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIHJldHVybiBbaSwgc2lnbiwgYmFzZSwgc2lnbmVkbmVzc107XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcGFyc2VfZGlnaXRcbmZ1bmN0aW9uIGNhbWxfcGFyc2VfZGlnaXQoYykge1xuICBpZiAoYyA+PSA0OCAmJiBjIDw9IDU3KSByZXR1cm4gYyAtIDQ4O1xuICBpZiAoYyA+PSA2NSAmJiBjIDw9IDkwKSByZXR1cm4gYyAtIDU1O1xuICBpZiAoYyA+PSA5NyAmJiBjIDw9IDEyMikgcmV0dXJuIGMgLSA4NztcbiAgcmV0dXJuIC0xO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludF9vZl9zdHJpbmcgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLCBjYW1sX3N0cmluZ191bnNhZmVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX3BhcnNlX3NpZ25fYW5kX2Jhc2UsIGNhbWxfcGFyc2VfZGlnaXQsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IGNhbWxfaW50MzJfb2Zfc3RyaW5nXG4vL0FsaWFzOiBjYW1sX25hdGl2ZWludF9vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfaW50X29mX3N0cmluZyhzKSB7XG4gIHZhciByID0gY2FtbF9wYXJzZV9zaWduX2FuZF9iYXNlKHMpO1xuICB2YXIgaSA9IHJbMF0sXG4gICAgc2lnbiA9IHJbMV0sXG4gICAgYmFzZSA9IHJbMl0sXG4gICAgc2lnbmVkbmVzcyA9IHJbM107XG4gIHZhciBsZW4gPSBjYW1sX21sX3N0cmluZ19sZW5ndGgocyk7XG4gIHZhciB0aHJlc2hvbGQgPSAtMSA+Pj4gMDtcbiAgdmFyIGMgPSBpIDwgbGVuID8gY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpKSA6IDA7XG4gIHZhciBkID0gY2FtbF9wYXJzZV9kaWdpdChjKTtcbiAgaWYgKGQgPCAwIHx8IGQgPj0gYmFzZSkgY2FtbF9mYWlsd2l0aChcImludF9vZl9zdHJpbmdcIik7XG4gIHZhciByZXMgPSBkO1xuICBmb3IgKGkrKzsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYyA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSk7XG4gICAgaWYgKGMgPT09IDk1KSBjb250aW51ZTtcbiAgICBkID0gY2FtbF9wYXJzZV9kaWdpdChjKTtcbiAgICBpZiAoZCA8IDAgfHwgZCA+PSBiYXNlKSBicmVhaztcbiAgICByZXMgPSBiYXNlICogcmVzICsgZDtcbiAgICBpZiAocmVzID4gdGhyZXNob2xkKSBjYW1sX2ZhaWx3aXRoKFwiaW50X29mX3N0cmluZ1wiKTtcbiAgfVxuICBpZiAoaSAhPT0gbGVuKSBjYW1sX2ZhaWx3aXRoKFwiaW50X29mX3N0cmluZ1wiKTtcbiAgLy8gRm9yIGJhc2UgZGlmZmVyZW50IGZyb20gMTAsIHdlIGV4cGVjdCBhbiB1bnNpZ25lZCByZXByZXNlbnRhdGlvbixcbiAgLy8gaGVuY2UgYW55IHZhbHVlIG9mICdyZXMnIChsZXNzIHRoYW4gJ3RocmVzaG9sZCcpIGlzIGFjY2VwdGFibGUuXG4gIC8vIEJ1dCB3ZSBoYXZlIHRvIGNvbnZlcnQgdGhlIHJlc3VsdCBiYWNrIHRvIGEgc2lnbmVkIGludGVnZXIuXG4gIHJlcyA9IHNpZ24gKiByZXM7XG4gIGlmIChzaWduZWRuZXNzICYmIChyZXMgfCAwKSAhPT0gcmVzKVxuICAgIC8qIFNpZ25lZCByZXByZXNlbnRhdGlvbiBleHBlY3RlZCwgYWxsb3cgLTJeKG5iaXRzLTEpIHRvIDJeKG5iaXRzLTEpIC0gMSAqL1xuICAgIGNhbWxfZmFpbHdpdGgoXCJpbnRfb2Zfc3RyaW5nXCIpO1xuICByZXR1cm4gcmVzIHwgMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tdWwgY29uc3Rcbi8vQWxpYXM6IGNhbWxfaW50MzJfbXVsXG4vL0FsaWFzOiBjYW1sX25hdGl2ZWludF9tdWxcbi8vQWxpYXM6ICVpbnRfbXVsXG5mdW5jdGlvbiBjYW1sX211bChhLCBiKSB7XG4gIHJldHVybiBNYXRoLmltdWwoYSwgYik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZGl2XG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3plcm9fZGl2aWRlXG4vL0FsaWFzOiBjYW1sX2ludDMyX2RpdlxuLy9BbGlhczogY2FtbF9uYXRpdmVpbnRfZGl2XG4vL0FsaWFzOiAlaW50X2RpdlxuZnVuY3Rpb24gY2FtbF9kaXYoeCwgeSkge1xuICBpZiAoeSA9PT0gMCkgY2FtbF9yYWlzZV96ZXJvX2RpdmlkZSgpO1xuICByZXR1cm4gKHggLyB5KSB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbW9kXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3plcm9fZGl2aWRlXG4vL0FsaWFzOiBjYW1sX2ludDMyX21vZFxuLy9BbGlhczogY2FtbF9uYXRpdmVpbnRfbW9kXG4vL0FsaWFzOiAlaW50X21vZFxuZnVuY3Rpb24gY2FtbF9tb2QoeCwgeSkge1xuICBpZiAoeSA9PT0gMCkgY2FtbF9yYWlzZV96ZXJvX2RpdmlkZSgpO1xuICByZXR1cm4geCAlIHk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnN3YXAxNiBjb25zdFxuZnVuY3Rpb24gY2FtbF9ic3dhcDE2KHgpIHtcbiAgcmV0dXJuICgoeCAmIDB4MDBmZikgPDwgOCkgfCAoKHggJiAweGZmMDApID4+IDgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDMyX2Jzd2FwIGNvbnN0XG4vL0FsaWFzOiBjYW1sX25hdGl2ZWludF9ic3dhcFxuZnVuY3Rpb24gY2FtbF9pbnQzMl9ic3dhcCh4KSB7XG4gIHJldHVybiAoXG4gICAgKCh4ICYgMHgwMDAwMDBmZikgPDwgMjQpIHxcbiAgICAoKHggJiAweDAwMDBmZjAwKSA8PCA4KSB8XG4gICAgKCh4ICYgMHgwMGZmMDAwMCkgPj4+IDgpIHxcbiAgICAoKHggJiAweGZmMDAwMDAwKSA+Pj4gMjQpXG4gICk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2Jzd2FwIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3RvX2J5dGVzLCBjYW1sX2ludDY0X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2ludDY0X2Jzd2FwKHgpIHtcbiAgdmFyIHkgPSBjYW1sX2ludDY0X3RvX2J5dGVzKHgpO1xuICByZXR1cm4gY2FtbF9pbnQ2NF9vZl9ieXRlcyhbeVs3XSwgeVs2XSwgeVs1XSwgeVs0XSwgeVszXSwgeVsyXSwgeVsxXSwgeVswXV0pO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8vLy8vLy8vLy8vLyBIYXNodGJsXG5cbi8vZnVuY3Rpb24gUk9UTDMyKHgsbikgeyByZXR1cm4gKCh4IDw8IG4pIHwgKHggPj4+ICgzMi1uKSkpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X2ludFxuLy9SZXF1aXJlczogY2FtbF9tdWxcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfaW50KGgsIGQpIHtcbiAgZCA9IGNhbWxfbXVsKGQsIDB4Y2M5ZTJkNTEgfCAwKTtcbiAgZCA9IChkIDw8IDE1KSB8IChkID4+PiAoMzIgLSAxNSkpOyAvLyBST1RMMzIoZCwgMTUpO1xuICBkID0gY2FtbF9tdWwoZCwgMHgxYjg3MzU5Myk7XG4gIGggXj0gZDtcbiAgaCA9IChoIDw8IDEzKSB8IChoID4+PiAoMzIgLSAxMykpOyAvL1JPVEwzMihoLCAxMyk7XG4gIHJldHVybiAoKChoICsgKGggPDwgMikpIHwgMCkgKyAoMHhlNjU0NmI2NCB8IDApKSB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfZmluYWxcbi8vUmVxdWlyZXM6IGNhbWxfbXVsXG5mdW5jdGlvbiBjYW1sX2hhc2hfbWl4X2ZpbmFsKGgpIHtcbiAgaCBePSBoID4+PiAxNjtcbiAgaCA9IGNhbWxfbXVsKGgsIDB4ODVlYmNhNmIgfCAwKTtcbiAgaCBePSBoID4+PiAxMztcbiAgaCA9IGNhbWxfbXVsKGgsIDB4YzJiMmFlMzUgfCAwKTtcbiAgaCBePSBoID4+PiAxNjtcbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfZmxvYXRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfYml0c19vZl9mbG9hdFxuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfbG8zMiwgY2FtbF9pbnQ2NF9oaTMyXG5mdW5jdGlvbiBjYW1sX2hhc2hfbWl4X2Zsb2F0KGhhc2gsIHYwKSB7XG4gIHZhciBpNjQgPSBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQodjApO1xuICB2YXIgbCA9IGNhbWxfaW50NjRfbG8zMihpNjQpO1xuICB2YXIgaCA9IGNhbWxfaW50NjRfaGkzMihpNjQpO1xuICAvKiBOb3JtYWxpemUgTmFOcyAqL1xuICBpZiAoKGggJiAweDdmZjAwMDAwKSA9PT0gMHg3ZmYwMDAwMCAmJiAobCB8IChoICYgMHhmZmZmZikpICE9PSAwKSB7XG4gICAgaCA9IDB4N2ZmMDAwMDA7XG4gICAgbCA9IDB4MDAwMDAwMDE7XG4gIH0gZWxzZSBpZiAoaCA9PT0gKDB4ODAwMDAwMDAgfCAwKSAmJiBsID09PSAwKSB7XG4gICAgLyogTm9ybWFsaXplIC0wIGludG8gKzAgKi9cbiAgICAvLyBUaGlzIGNvZGUgcGF0aCBpcyBub3QgdXNlZCBieSBjYW1sX2hhc2ggYmVjYXVzZSAwIGFuZCAtMCBsb29rXG4gICAgLy8gbGlrZSBpbnRlZ2Vyc1xuICAgIGggPSAwO1xuICB9XG4gIGhhc2ggPSBjYW1sX2hhc2hfbWl4X2ludChoYXNoLCBsKTtcbiAgaGFzaCA9IGNhbWxfaGFzaF9taXhfaW50KGhhc2gsIGgpO1xuICByZXR1cm4gaGFzaDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfaW50NjRcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfaW50XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2xvMzIsIGNhbWxfaW50NjRfaGkzMlxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9pbnQ2NChoLCB2KSB7XG4gIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCBjYW1sX2ludDY0X2xvMzIodikpO1xuICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgY2FtbF9pbnQ2NF9oaTMyKHYpKTtcbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnRcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfanNieXRlcyhoLCBzKSB7XG4gIHZhciBsZW4gPSBzLmxlbmd0aCxcbiAgICBpLFxuICAgIHc7XG4gIGZvciAoaSA9IDA7IGkgKyA0IDw9IGxlbjsgaSArPSA0KSB7XG4gICAgdyA9XG4gICAgICBzLmNoYXJDb2RlQXQoaSkgfFxuICAgICAgKHMuY2hhckNvZGVBdChpICsgMSkgPDwgOCkgfFxuICAgICAgKHMuY2hhckNvZGVBdChpICsgMikgPDwgMTYpIHxcbiAgICAgIChzLmNoYXJDb2RlQXQoaSArIDMpIDw8IDI0KTtcbiAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdyk7XG4gIH1cbiAgdyA9IDA7XG4gIHN3aXRjaCAobGVuICYgMykge1xuICAgIGNhc2UgMzpcbiAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9GYWxsdGhyb3VnaFN3aXRjaENsYXVzZTpcbiAgICAgIHcgPSBzLmNoYXJDb2RlQXQoaSArIDIpIDw8IDE2O1xuICAgIC8vIGZhbGx0aHJvdWdoXG4gICAgY2FzZSAyOlxuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgdyB8PSBzLmNoYXJDb2RlQXQoaSArIDEpIDw8IDg7XG4gICAgLy8gZmFsbHRocm91Z2hcbiAgICBjYXNlIDE6XG4gICAgICB3IHw9IHMuY2hhckNvZGVBdChpKTtcbiAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB3KTtcbiAgfVxuICBoIF49IGxlbjtcbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfYnl0ZXNfYXJyXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2ludFxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9ieXRlc19hcnIoaCwgcykge1xuICB2YXIgbGVuID0gcy5sZW5ndGgsXG4gICAgaSxcbiAgICB3O1xuICBmb3IgKGkgPSAwOyBpICsgNCA8PSBsZW47IGkgKz0gNCkge1xuICAgIHcgPSBzW2ldIHwgKHNbaSArIDFdIDw8IDgpIHwgKHNbaSArIDJdIDw8IDE2KSB8IChzW2kgKyAzXSA8PCAyNCk7XG4gICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHcpO1xuICB9XG4gIHcgPSAwO1xuICBzd2l0Y2ggKGxlbiAmIDMpIHtcbiAgICBjYXNlIDM6XG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRmFsbHRocm91Z2hTd2l0Y2hDbGF1c2U6XG4gICAgICB3ID0gc1tpICsgMl0gPDwgMTY7XG4gICAgLy8gZmFsbHRocm91Z2hcbiAgICBjYXNlIDI6XG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRmFsbHRocm91Z2hTd2l0Y2hDbGF1c2U6XG4gICAgICB3IHw9IHNbaSArIDFdIDw8IDg7XG4gICAgLy8gZmFsbHRocm91Z2hcbiAgICBjYXNlIDE6XG4gICAgICB3IHw9IHNbaV07XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdyk7XG4gIH1cbiAgaCBePSBsZW47XG4gIHJldHVybiBoO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX21sX2J5dGVzX2NvbnRlbnRcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9ieXRlc19hcnJcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfYnl0ZXMoaCwgdikge1xuICB2YXIgY29udGVudCA9IGNhbWxfbWxfYnl0ZXNfY29udGVudCh2KTtcbiAgaWYgKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKSByZXR1cm4gY2FtbF9oYXNoX21peF9qc2J5dGVzKGgsIGNvbnRlbnQpO1xuICAvKiBBUlJBWSAqLyBlbHNlIHJldHVybiBjYW1sX2hhc2hfbWl4X2J5dGVzX2FycihoLCBjb250ZW50KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9oYXNoX21peF9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfanNieXRlcywgY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9zdHJpbmcoaCwgdikge1xuICByZXR1cm4gY2FtbF9oYXNoX21peF9qc2J5dGVzKGgsIGNhbWxfanNieXRlc19vZl9zdHJpbmcodikpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2ggbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9pc19tbF9zdHJpbmcsIGNhbWxfaXNfbWxfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfaW50LCBjYW1sX2hhc2hfbWl4X2ZpbmFsXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2Zsb2F0LCBjYW1sX2hhc2hfbWl4X3N0cmluZywgY2FtbF9oYXNoX21peF9ieXRlcywgY2FtbF9jdXN0b21fb3BzXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaXNfY29udGludWF0aW9uX3RhZ1xuZnVuY3Rpb24gY2FtbF9oYXNoKGNvdW50LCBsaW1pdCwgc2VlZCwgb2JqKSB7XG4gIHZhciBxdWV1ZSwgcmQsIHdyLCBzeiwgbnVtLCBoLCB2LCBpLCBsZW47XG4gIHN6ID0gbGltaXQ7XG4gIGlmIChzeiA8IDAgfHwgc3ogPiAyNTYpIHN6ID0gMjU2O1xuICBudW0gPSBjb3VudDtcbiAgaCA9IHNlZWQ7XG4gIHF1ZXVlID0gW29ial07XG4gIHJkID0gMDtcbiAgd3IgPSAxO1xuICB3aGlsZSAocmQgPCB3ciAmJiBudW0gPiAwKSB7XG4gICAgdiA9IHF1ZXVlW3JkKytdO1xuICAgIGlmICh2Py5jYW1sX2N1c3RvbSkge1xuICAgICAgaWYgKFxuICAgICAgICBjYW1sX2N1c3RvbV9vcHNbdi5jYW1sX2N1c3RvbV0gJiZcbiAgICAgICAgY2FtbF9jdXN0b21fb3BzW3YuY2FtbF9jdXN0b21dLmhhc2hcbiAgICAgICkge1xuICAgICAgICB2YXIgaGggPSBjYW1sX2N1c3RvbV9vcHNbdi5jYW1sX2N1c3RvbV0uaGFzaCh2KTtcbiAgICAgICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIGhoKTtcbiAgICAgICAgbnVtLS07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHYpICYmIHZbMF0gPT09ICh2WzBdIHwgMCkpIHtcbiAgICAgIHN3aXRjaCAodlswXSkge1xuICAgICAgICBjYXNlIDI0ODpcbiAgICAgICAgICAvLyBPYmplY3RcbiAgICAgICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdlsyXSk7XG4gICAgICAgICAgbnVtLS07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjUwOlxuICAgICAgICAgIC8vIEZvcndhcmRcbiAgICAgICAgICBxdWV1ZVstLXJkXSA9IHZbMV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKGNhbWxfaXNfY29udGludWF0aW9uX3RhZyh2WzBdKSkge1xuICAgICAgICAgICAgLyogQWxsIGNvbnRpbnVhdGlvbnMgaGFzaCB0byB0aGUgc2FtZSB2YWx1ZSxcbiAgICAgICAgICAgICBzaW5jZSB3ZSBoYXZlIG5vIGlkZWEgaG93IHRvIGRpc3Rpbmd1aXNoIHRoZW0uICovXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHRhZyA9ICgodi5sZW5ndGggLSAxKSA8PCAxMCkgfCB2WzBdO1xuICAgICAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB0YWcpO1xuICAgICAgICAgIGZvciAoaSA9IDEsIGxlbiA9IHYubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh3ciA+PSBzeikgYnJlYWs7XG4gICAgICAgICAgICBxdWV1ZVt3cisrXSA9IHZbaV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2FtbF9pc19tbF9ieXRlcyh2KSkge1xuICAgICAgaCA9IGNhbWxfaGFzaF9taXhfYnl0ZXMoaCwgdik7XG4gICAgICBudW0tLTtcbiAgICB9IGVsc2UgaWYgKGNhbWxfaXNfbWxfc3RyaW5nKHYpKSB7XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9zdHJpbmcoaCwgdik7XG4gICAgICBudW0tLTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9qc2J5dGVzKGgsIHYpO1xuICAgICAgbnVtLS07XG4gICAgfSBlbHNlIGlmICh2ID09PSAodiB8IDApKSB7XG4gICAgICAvLyBJbnRlZ2VyXG4gICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdiArIHYgKyAxKTtcbiAgICAgIG51bS0tO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIC8vIEZsb2F0XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9mbG9hdChoLCB2KTtcbiAgICAgIG51bS0tO1xuICAgIH1cbiAgfVxuICBoID0gY2FtbF9oYXNoX21peF9maW5hbChoKTtcbiAgcmV0dXJuIGggJiAweDNmZmZmZmZmO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19oYXNoXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2ZpbmFsLCBjYW1sX2hhc2hfbWl4X3N0cmluZ1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2hhc2goaCwgdikge1xuICB2YXIgaCA9IGNhbWxfaGFzaF9taXhfc3RyaW5nKGgsIHYpO1xuICB2YXIgaCA9IGNhbWxfaGFzaF9taXhfZmluYWwoaCk7XG4gIHJldHVybiBoICYgMHgzZmZmZmZmZjtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfY29tcGFyZV92YWxfdGFnXG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX3N0cmluZywgY2FtbF9pc19tbF9ieXRlc1xuZnVuY3Rpb24gY2FtbF9jb21wYXJlX3ZhbF90YWcoYSkge1xuICBpZiAodHlwZW9mIGEgPT09IFwibnVtYmVyXCIpXG4gICAgcmV0dXJuIDEwMDA7IC8vIGludF90YWcgKHdlIHVzZSBpdCBmb3IgYWxsIG51bWJlcnMpXG4gIGVsc2UgaWYgKGNhbWxfaXNfbWxfYnl0ZXMoYSkpXG4gICAgcmV0dXJuIDI1MjsgLy8gc3RyaW5nX3RhZ1xuICBlbHNlIGlmIChjYW1sX2lzX21sX3N0cmluZyhhKSlcbiAgICByZXR1cm4gMTI1MjsgLy8gb2NhbWwgc3RyaW5nIChpZiBkaWZmZXJlbnQgZnJvbSBieXRlcylcbiAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhKSAmJiBhWzBdID09PSBhWzBdID4+PiAwICYmIGFbMF0gPD0gMjU1KSB7XG4gICAgLy8gTG9vayBsaWtlIGFuIG9jYW1sIGJsb2NrXG4gICAgdmFyIHRhZyA9IGFbMF0gfCAwO1xuICAgIC8vIGlnbm9yZSBkb3VibGVfYXJyYXlfdGFnIGJlY2F1c2Ugd2UgY2Fubm90IGFjY3VyYXRlbHkgc2V0XG4gICAgLy8gdGhpcyB0YWcgd2hlbiB3ZSBjcmVhdGUgYW4gYXJyYXkgb2YgZmxvYXQuXG4gICAgcmV0dXJuIHRhZyA9PT0gMjU0ID8gMCA6IHRhZztcbiAgfSBlbHNlIGlmIChhIGluc3RhbmNlb2YgU3RyaW5nKVxuICAgIHJldHVybiAxMjUyMDsgLy8gamF2YXNjcmlwdCBzdHJpbmcsIGxpa2Ugc3RyaW5nX3RhZyAoMjUyKVxuICBlbHNlIGlmICh0eXBlb2YgYSA9PT0gXCJzdHJpbmdcIilcbiAgICByZXR1cm4gMTI1MjA7IC8vIGphdmFzY3JpcHQgc3RyaW5nLCBsaWtlIHN0cmluZ190YWcgKDI1MilcbiAgZWxzZSBpZiAoYSBpbnN0YW5jZW9mIE51bWJlcilcbiAgICByZXR1cm4gMTAwMDsgLy8gaW50X3RhZyAod2UgdXNlIGl0IGZvciBhbGwgbnVtYmVycylcbiAgZWxzZSBpZiAoYT8uY2FtbF9jdXN0b20pXG4gICAgcmV0dXJuIDEyNTU7IC8vIGxpa2UgY3VzdG9tX3RhZyAoMjU1KVxuICBlbHNlIGlmIChhPy5jb21wYXJlKVxuICAgIHJldHVybiAxMjU2OyAvLyBsaWtlIGN1c3RvbV90YWcgKDI1NSlcbiAgZWxzZSBpZiAodHlwZW9mIGEgPT09IFwiZnVuY3Rpb25cIilcbiAgICByZXR1cm4gMTI0NzsgLy8gbGlrZSBjbG9zdXJlX3RhZyAoMjQ3KVxuICBlbHNlIGlmICh0eXBlb2YgYSA9PT0gXCJzeW1ib2xcIikgcmV0dXJuIDEyNTE7XG4gIHJldHVybiAxMDAxOyAvL291dF9vZl9oZWFwX3RhZ1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b21cbi8vUmVxdWlyZXM6IGNhbWxfY3VzdG9tX29wc1xuZnVuY3Rpb24gY2FtbF9jb21wYXJlX3ZhbF9nZXRfY3VzdG9tKGEpIHtcbiAgcmV0dXJuIChcbiAgICBjYW1sX2N1c3RvbV9vcHNbYS5jYW1sX2N1c3RvbV0gJiYgY2FtbF9jdXN0b21fb3BzW2EuY2FtbF9jdXN0b21dLmNvbXBhcmVcbiAgKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jb21wYXJlX3ZhbF9udW1iZXJfY3VzdG9tXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b21cbmZ1bmN0aW9uIGNhbWxfY29tcGFyZV92YWxfbnVtYmVyX2N1c3RvbShudW0sIGN1c3RvbSwgc3dhcCwgdG90YWwpIHtcbiAgdmFyIGNvbXAgPSBjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b20oY3VzdG9tKTtcbiAgaWYgKGNvbXApIHtcbiAgICB2YXIgeCA9IHN3YXAgPiAwID8gY29tcChjdXN0b20sIG51bSwgdG90YWwpIDogY29tcChudW0sIGN1c3RvbSwgdG90YWwpO1xuICAgIGlmICh0b3RhbCAmJiBOdW1iZXIuaXNOYU4oeCkpIHJldHVybiBzd2FwOyAvLyB0b3RhbCAmJiBuYW5cbiAgICBpZiAoTnVtYmVyLmlzTmFOKCt4KSkgcmV0dXJuICt4OyAvLyBuYW5cbiAgICBpZiAoKHggfCAwKSAhPT0gMCkgcmV0dXJuIHggfCAwOyAvLyAhbmFuXG4gIH1cbiAgcmV0dXJuIHN3YXA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29tcGFyZV92YWwgKGNvbnN0LCBjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2ludF9jb21wYXJlLCBjYW1sX3N0cmluZ19jb21wYXJlLCBjYW1sX2J5dGVzX2NvbXBhcmVcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9jb21wYXJlX3ZhbF9nZXRfY3VzdG9tLCBjYW1sX2NvbXBhcmVfdmFsX3RhZ1xuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbF9udW1iZXJfY3VzdG9tXG4vL1JlcXVpcmVzOiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWdcbmZ1bmN0aW9uIGNhbWxfY29tcGFyZV92YWwoYSwgYiwgdG90YWwpIHtcbiAgdmFyIHN0YWNrID0gW107XG4gIGZvciAoOzspIHtcbiAgICBpZiAoISh0b3RhbCAmJiBhID09PSBiKSkge1xuICAgICAgdmFyIHRhZ19hID0gY2FtbF9jb21wYXJlX3ZhbF90YWcoYSk7XG4gICAgICAvLyBmb3J3YXJkX3RhZyA/XG4gICAgICBpZiAodGFnX2EgPT09IDI1MCkge1xuICAgICAgICBhID0gYVsxXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciB0YWdfYiA9IGNhbWxfY29tcGFyZV92YWxfdGFnKGIpO1xuICAgICAgLy8gZm9yd2FyZF90YWcgP1xuICAgICAgaWYgKHRhZ19iID09PSAyNTApIHtcbiAgICAgICAgYiA9IGJbMV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0YWdzIGFyZSBkaWZmZXJlbnRcbiAgICAgIGlmICh0YWdfYSAhPT0gdGFnX2IpIHtcbiAgICAgICAgaWYgKHRhZ19hID09PSAxMDAwKSB7XG4gICAgICAgICAgaWYgKHRhZ19iID09PSAxMjU1KSB7XG4gICAgICAgICAgICAvL2ltbWVkaWF0ZSBjYW4gY29tcGFyZSBhZ2FpbnN0IGN1c3RvbVxuICAgICAgICAgICAgcmV0dXJuIGNhbWxfY29tcGFyZV92YWxfbnVtYmVyX2N1c3RvbShhLCBiLCAtMSwgdG90YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhZ19iID09PSAxMDAwKSB7XG4gICAgICAgICAgaWYgKHRhZ19hID09PSAxMjU1KSB7XG4gICAgICAgICAgICAvL2ltbWVkaWF0ZSBjYW4gY29tcGFyZSBhZ2FpbnN0IGN1c3RvbVxuICAgICAgICAgICAgcmV0dXJuIGNhbWxfY29tcGFyZV92YWxfbnVtYmVyX2N1c3RvbShiLCBhLCAxLCB0b3RhbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YWdfYSA8IHRhZ19iID8gLTEgOiAxO1xuICAgICAgfVxuICAgICAgLy8gdGFnX2EgPSB0YWdfYlxuICAgICAgc3dpdGNoICh0YWdfYSkge1xuICAgICAgICAvLyAyNDY6IExhenlfdGFnIGhhbmRsZWQgYmVsbG93XG4gICAgICAgIGNhc2UgMjQ3OiAvLyBDbG9zdXJlX3RhZ1xuICAgICAgICAgIC8vIENhbm5vdCBoYXBwZW5cbiAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjb21wYXJlOiBmdW5jdGlvbmFsIHZhbHVlXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI0ODogLy8gT2JqZWN0XG4gICAgICAgICAgdmFyIHggPSBjYW1sX2ludF9jb21wYXJlKGFbMl0sIGJbMl0pIHwgMDtcbiAgICAgICAgICBpZiAoeCAhPT0gMCkgcmV0dXJuIHg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjQ5OiAvLyBJbmZpeFxuICAgICAgICAgIC8vIENhbm5vdCBoYXBwZW5cbiAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjb21wYXJlOiBmdW5jdGlvbmFsIHZhbHVlXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI1MDogLy8gRm9yd2FyZCB0YWdcbiAgICAgICAgICAvLyBDYW5ub3QgaGFwcGVuLCBoYW5kbGVkIGFib3ZlXG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiZXF1YWw6IGdvdCBGb3J3YXJkX3RhZywgc2hvdWxkIG5vdCBoYXBwZW5cIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjUxOiAvL0Fic3RyYWN0XG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiZXF1YWw6IGFic3RyYWN0IHZhbHVlXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI1MjogLy8gT0NhbWwgYnl0ZXNcbiAgICAgICAgICBpZiAoYSAhPT0gYikge1xuICAgICAgICAgICAgdmFyIHggPSBjYW1sX2J5dGVzX2NvbXBhcmUoYSwgYikgfCAwO1xuICAgICAgICAgICAgaWYgKHggIT09IDApIHJldHVybiB4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNTM6IC8vIERvdWJsZV90YWdcbiAgICAgICAgICAvLyBDYW5ub3QgaGFwcGVuXG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiZXF1YWw6IGdvdCBEb3VibGVfdGFnLCBzaG91bGQgbm90IGhhcHBlblwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNTQ6IC8vIERvdWJsZV9hcnJheV90YWdcbiAgICAgICAgICAvLyBDYW5ub3QgaGFwcGVuLCBoYW5kbGVkIGluIGNhbWxfY29tcGFyZV92YWxfdGFnXG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFxuICAgICAgICAgICAgXCJlcXVhbDogZ290IERvdWJsZV9hcnJheV90YWcsIHNob3VsZCBub3QgaGFwcGVuXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNTU6IC8vIEN1c3RvbV90YWdcbiAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJlcXVhbDogZ290IEN1c3RvbV90YWcsIHNob3VsZCBub3QgaGFwcGVuXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEyNDc6IC8vIEZ1bmN0aW9uXG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY29tcGFyZTogZnVuY3Rpb25hbCB2YWx1ZVwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjU1OiAvLyBDdXN0b21cbiAgICAgICAgICB2YXIgY29tcCA9IGNhbWxfY29tcGFyZV92YWxfZ2V0X2N1c3RvbShhKTtcbiAgICAgICAgICBpZiAoY29tcCAhPT0gY2FtbF9jb21wYXJlX3ZhbF9nZXRfY3VzdG9tKGIpKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5jYW1sX2N1c3RvbSA8IGIuY2FtbF9jdXN0b20gPyAtMSA6IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghY29tcCkgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY29tcGFyZTogYWJzdHJhY3QgdmFsdWVcIik7XG4gICAgICAgICAgdmFyIHggPSBjb21wKGEsIGIsIHRvdGFsKTtcbiAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHgpKSB7XG4gICAgICAgICAgICAvLyBQcm90ZWN0IGFnYWluc3QgaW52YWxpZCBVTk9SREVSRURcbiAgICAgICAgICAgIHJldHVybiB0b3RhbCA/IC0xIDogeDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHggIT09ICh4IHwgMCkpIHtcbiAgICAgICAgICAgIC8vIFByb3RlY3QgYWdhaW5zdCBpbnZhbGlkIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoeCAhPT0gMCkgcmV0dXJuIHggfCAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEyNTY6IC8vIGNvbXBhcmUgZnVuY3Rpb25cbiAgICAgICAgICB2YXIgeCA9IGEuY29tcGFyZShiLCB0b3RhbCk7XG4gICAgICAgICAgaWYgKE51bWJlci5pc05hTih4KSkge1xuICAgICAgICAgICAgLy8gUHJvdGVjdCBhZ2FpbnN0IGludmFsaWQgVU5PUkRFUkVEXG4gICAgICAgICAgICByZXR1cm4gdG90YWwgPyAtMSA6IHg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh4ICE9PSAoeCB8IDApKSB7XG4gICAgICAgICAgICAvLyBQcm90ZWN0IGFnYWluc3QgaW52YWxpZCByZXR1cm4gdmFsdWVcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHggIT09IDApIHJldHVybiB4IHwgMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDAwOiAvLyBOdW1iZXJcbiAgICAgICAgICBhID0gK2E7XG4gICAgICAgICAgYiA9ICtiO1xuICAgICAgICAgIGlmIChhIDwgYikgcmV0dXJuIC0xO1xuICAgICAgICAgIGlmIChhID4gYikgcmV0dXJuIDE7XG4gICAgICAgICAgaWYgKGEgIT09IGIpIHtcbiAgICAgICAgICAgIGlmICghdG90YWwpIHJldHVybiBOdW1iZXIuTmFOO1xuICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oYSkpIHJldHVybiAxO1xuICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oYikpIHJldHVybiAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTAwMTogLy8gVGhlIHJlc3RcbiAgICAgICAgICAvLyBIZXJlIHdlIGNhbiBiZSBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOlxuICAgICAgICAgIC8vIDEuIEphdmFTY3JpcHQgcHJpbWl0aXZlIHR5cGVzXG4gICAgICAgICAgLy8gMi4gSmF2YVNjcmlwdCBvYmplY3QgdGhhdCBjYW4gYmUgY29lcmNlZCB0byBwcmltaXRpdmUgdHlwZXNcbiAgICAgICAgICAvLyAzLiBKYXZhU2NyaXB0IG9iamVjdCB0aGFuIGNhbm5vdCBiZSBjb2VyY2VkIHRvIHByaW1pdGl2ZSB0eXBlc1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gKDMpIHdpbGwgcmFpc2UgYSBbVHlwZUVycm9yXVxuICAgICAgICAgIC8vICgyKSB3aWxsIGNvZXJjZSB0byBwcmltaXRpdmUgdHlwZXMgdXNpbmcgW3ZhbHVlT2ZdIG9yIFt0b1N0cmluZ11cbiAgICAgICAgICAvLyAoMikgYW5kICgzKSwgYWZ0ZXIgZXZlbnR1YWwgY29lcmNpb25cbiAgICAgICAgICAvLyAtIGlmIGEgYW5kIGIgYXJlIHN0cmluZ3MsIGFwcGx5IGxleGljb2dyYXBoaWMgY29tcGFyaXNvblxuICAgICAgICAgIC8vIC0gaWYgYSBvciBiIGFyZSBub3Qgc3RyaW5ncywgY29udmVydCBhIGFuZCBiIHRvIG51bWJlclxuICAgICAgICAgIC8vICAgYW5kIGFwcGx5IHN0YW5kYXJkIGNvbXBhcmlzb25cbiAgICAgICAgICBpZiAoYSA8IGIpIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAoYSA+IGIpIHJldHVybiAxO1xuICAgICAgICAgIGlmIChhICE9PSBiKSB7XG4gICAgICAgICAgICByZXR1cm4gdG90YWwgPyAxIDogTnVtYmVyLk5hTjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI1MTogLy8gSmF2YVNjcmlwdCBTeW1ib2wsIG5vIG9yZGVyaW5nLlxuICAgICAgICAgIGlmIChhICE9PSBiKSB7XG4gICAgICAgICAgICByZXR1cm4gdG90YWwgPyAxIDogTnVtYmVyLk5hTjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI1MjogLy8gb2NhbWwgc3RyaW5nc1xuICAgICAgICAgIHZhciBhID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhhKTtcbiAgICAgICAgICB2YXIgYiA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcoYik7XG4gICAgICAgICAgaWYgKGEgIT09IGIpIHtcbiAgICAgICAgICAgIGlmIChhIDwgYikgcmV0dXJuIC0xO1xuICAgICAgICAgICAgaWYgKGEgPiBiKSByZXR1cm4gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI1MjA6IC8vIGphdmFzY3JpcHQgc3RyaW5nc1xuICAgICAgICAgIHZhciBhID0gYS50b1N0cmluZygpO1xuICAgICAgICAgIHZhciBiID0gYi50b1N0cmluZygpO1xuICAgICAgICAgIGlmIChhICE9PSBiKSB7XG4gICAgICAgICAgICBpZiAoYSA8IGIpIHJldHVybiAtMTtcbiAgICAgICAgICAgIGlmIChhID4gYikgcmV0dXJuIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiAvLyBMYXp5X3RhZyBvciBCbG9jayB3aXRoIG90aGVyIHRhZ1xuICAgICAgICAgIGlmIChjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWcodGFnX2EpKSB7XG4gICAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjb21wYXJlOiBjb250aW51YXRpb24gdmFsdWVcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGEubGVuZ3RoIDwgYi5sZW5ndGggPyAtMSA6IDE7XG4gICAgICAgICAgaWYgKGEubGVuZ3RoID4gMSkgc3RhY2sucHVzaChhLCBiLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgdmFyIGkgPSBzdGFjay5wb3AoKTtcbiAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgIGlmIChpICsgMSA8IGEubGVuZ3RoKSBzdGFjay5wdXNoKGEsIGIsIGkgKyAxKTtcbiAgICBhID0gYVtpXTtcbiAgICBiID0gYltpXTtcbiAgfVxufVxuXG4vLyBNYXkgcmFpc2Vcbi8vUHJvdmlkZXM6IGNhbWxfY29tcGFyZSAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9jb21wYXJlKGEsIGIpIHtcbiAgcmV0dXJuIGNhbWxfY29tcGFyZV92YWwoYSwgYiwgdHJ1ZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50X2NvbXBhcmUgY29uc3Rcbi8vQWxpYXM6IGNhbWxfaW50MzJfY29tcGFyZVxuLy9BbGlhczogY2FtbF9uYXRpdmVpbnRfY29tcGFyZVxuZnVuY3Rpb24gY2FtbF9pbnRfY29tcGFyZShhLCBiKSB7XG4gIGlmIChhIDwgYikgcmV0dXJuIC0xO1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIDA7XG4gIHJldHVybiAxO1xufVxuXG4vLyBNYXkgcmFpc2Vcbi8vUHJvdmlkZXM6IGNhbWxfZXF1YWwgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY29tcGFyZV92YWxcbmZ1bmN0aW9uIGNhbWxfZXF1YWwoeCwgeSkge1xuICByZXR1cm4gKyhjYW1sX2NvbXBhcmVfdmFsKHgsIHksIGZhbHNlKSA9PT0gMCk7XG59XG5cbi8vIE1heSByYWlzZVxuLy9Qcm92aWRlczogY2FtbF9ub3RlcXVhbCAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9ub3RlcXVhbCh4LCB5KSB7XG4gIHJldHVybiArKGNhbWxfY29tcGFyZV92YWwoeCwgeSwgZmFsc2UpICE9PSAwKTtcbn1cblxuLy8gTWF5IHJhaXNlXG4vL1Byb3ZpZGVzOiBjYW1sX2dyZWF0ZXJlcXVhbCAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9ncmVhdGVyZXF1YWwoeCwgeSkge1xuICByZXR1cm4gKyhjYW1sX2NvbXBhcmVfdmFsKHgsIHksIGZhbHNlKSA+PSAwKTtcbn1cblxuLy8gTWF5IHJhaXNlXG4vL1Byb3ZpZGVzOiBjYW1sX2dyZWF0ZXJ0aGFuIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsXG5mdW5jdGlvbiBjYW1sX2dyZWF0ZXJ0aGFuKHgsIHkpIHtcbiAgcmV0dXJuICsoY2FtbF9jb21wYXJlX3ZhbCh4LCB5LCBmYWxzZSkgPiAwKTtcbn1cblxuLy8gTWF5IHJhaXNlXG4vL1Byb3ZpZGVzOiBjYW1sX2xlc3NlcXVhbCAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9sZXNzZXF1YWwoeCwgeSkge1xuICByZXR1cm4gKyhjYW1sX2NvbXBhcmVfdmFsKHgsIHksIGZhbHNlKSA8PSAwKTtcbn1cblxuLy8gTWF5IHJhaXNlXG4vL1Byb3ZpZGVzOiBjYW1sX2xlc3N0aGFuIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsXG5mdW5jdGlvbiBjYW1sX2xlc3N0aGFuKHgsIHkpIHtcbiAgcmV0dXJuICsoY2FtbF9jb21wYXJlX3ZhbCh4LCB5LCBmYWxzZSkgPCAwKTtcbn1cbiIsIi8vUHJvdmlkZXM6IGNhbWxfY3VzdG9tX2V2ZW50X2luZGV4XG4vL1ZlcnNpb246ID49IDUuMVxudmFyIGNhbWxfY3VzdG9tX2V2ZW50X2luZGV4ID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3JlZ2lzdGVyXG4vL1JlcXVpcmVzOiBjYW1sX2N1c3RvbV9ldmVudF9pbmRleFxuLy9WZXJzaW9uOiA+PSA1LjFcbmZ1bmN0aW9uIGNhbWxfcnVudGltZV9ldmVudHNfdXNlcl9yZWdpc3RlcihldmVudF9uYW1lLCBldmVudF90YWcsIGV2ZW50X3R5cGUpIHtcbiAgY2FtbF9jdXN0b21fZXZlbnRfaW5kZXggKz0gMTtcbiAgcmV0dXJuIFswLCBjYW1sX2N1c3RvbV9ldmVudF9pbmRleCwgZXZlbnRfbmFtZSwgZXZlbnRfdHlwZSwgZXZlbnRfdGFnXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3dyaXRlXG4vL1ZlcnNpb246ID49IDUuMVxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3dyaXRlKF9ldmVudCwgX2V2ZW50X2NvbnRlbnQpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfdXNlcl9yZXNvbHZlXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3Jlc29sdmUoKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3J1bnRpbWVfZXZlbnRzX3N0YXJ0XG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF9tbF9ydW50aW1lX2V2ZW50c19zdGFydCgpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfc3RhcnRcbi8vVmVyc2lvbjogPj0gNS4wLCA8IDUuMlxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c19zdGFydCgpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcnVudGltZV9ldmVudHNfcGF1c2Vcbi8vVmVyc2lvbjogPj0gNS4yXG5mdW5jdGlvbiBjYW1sX21sX3J1bnRpbWVfZXZlbnRzX3BhdXNlKCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c19wYXVzZVxuLy9WZXJzaW9uOiA+PSA1LjAsIDwgNS4yXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX3BhdXNlKCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9ydW50aW1lX2V2ZW50c19hcmVfYWN0aXZlXG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF9tbF9ydW50aW1lX2V2ZW50c19hcmVfYWN0aXZlKCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c19yZXN1bWVcbi8vVmVyc2lvbjogPj01LjAsIDwgNS4yXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX3Jlc3VtZSgpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcnVudGltZV9ldmVudHNfcmVzdW1lXG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF9tbF9ydW50aW1lX2V2ZW50c19yZXN1bWUoKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3J1bnRpbWVfZXZlbnRzX2NyZWF0ZV9jdXJzb3Jcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX2NyZWF0ZV9jdXJzb3IoX3RhcmdldCkge1xuICByZXR1cm4ge307XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfZnJlZV9jdXJzb3Jcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX2ZyZWVfY3Vyc29yKF9jdXJzb3IpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfcmVhZF9wb2xsXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c19yZWFkX3BvbGwoX2N1cnNvciwgX2NhbGxiYWNrcywgX251bSkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9ydW50aW1lX2V2ZW50c19wYXRoIGNvbnN0XG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9tbF9ydW50aW1lX2V2ZW50c19wYXRoKF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuIiwiLy9Qcm92aWRlczogenN0ZF9kZWNvbXByZXNzXG4vL1ZlcnNpb246ID49IDUuMVxudmFyIHpzdGRfZGVjb21wcmVzcyA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIGFsaWFzZXMgZm9yIHNob3J0ZXIgY29tcHJlc3NlZCBjb2RlIChtb3N0IG1pbmlmZXJzIGRvbid0IGRvIHRoaXMpXG4gIHZhciBhYiA9IEFycmF5QnVmZmVyLFxuICAgIHU4ID0gVWludDhBcnJheSxcbiAgICB1MTYgPSBVaW50MTZBcnJheSxcbiAgICBpMTYgPSBJbnQxNkFycmF5LFxuICAgIGkzMiA9IEludDMyQXJyYXk7XG4gIHZhciBzbGMgPSBmdW5jdGlvbiAodiwgcywgZSkge1xuICAgIGlmICh1OC5wcm90b3R5cGUuc2xpY2UpIHJldHVybiB1OC5wcm90b3R5cGUuc2xpY2UuY2FsbCh2LCBzLCBlKTtcbiAgICBpZiAocyA9PSBudWxsIHx8IHMgPCAwKSBzID0gMDtcbiAgICBpZiAoZSA9PSBudWxsIHx8IGUgPiB2Lmxlbmd0aCkgZSA9IHYubGVuZ3RoO1xuICAgIHZhciBuID0gbmV3IHU4KGUgLSBzKTtcbiAgICBuLnNldCh2LnN1YmFycmF5KHMsIGUpKTtcbiAgICByZXR1cm4gbjtcbiAgfTtcbiAgdmFyIGZpbGwgPSBmdW5jdGlvbiAodiwgbiwgcywgZSkge1xuICAgIGlmICh1OC5wcm90b3R5cGUuZmlsbCkgcmV0dXJuIHU4LnByb3RvdHlwZS5maWxsLmNhbGwodiwgbiwgcywgZSk7XG4gICAgaWYgKHMgPT0gbnVsbCB8fCBzIDwgMCkgcyA9IDA7XG4gICAgaWYgKGUgPT0gbnVsbCB8fCBlID4gdi5sZW5ndGgpIGUgPSB2Lmxlbmd0aDtcbiAgICBmb3IgKDsgcyA8IGU7ICsrcykgdltzXSA9IG47XG4gICAgcmV0dXJuIHY7XG4gIH07XG4gIHZhciBjcHcgPSBmdW5jdGlvbiAodiwgdCwgcywgZSkge1xuICAgIGlmICh1OC5wcm90b3R5cGUuY29weVdpdGhpbilcbiAgICAgIHJldHVybiB1OC5wcm90b3R5cGUuY29weVdpdGhpbi5jYWxsKHYsIHQsIHMsIGUpO1xuICAgIGlmIChzID09IG51bGwgfHwgcyA8IDApIHMgPSAwO1xuICAgIGlmIChlID09IG51bGwgfHwgZSA+IHYubGVuZ3RoKSBlID0gdi5sZW5ndGg7XG4gICAgd2hpbGUgKHMgPCBlKSB7XG4gICAgICB2W3QrK10gPSB2W3MrK107XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogQ29kZXMgZm9yIGVycm9ycyBnZW5lcmF0ZWQgd2l0aGluIHRoaXMgbGlicmFyeVxuICAgKi9cbiAgLy8gZXJyb3IgY29kZXNcbiAgdmFyIGVjID0gW1xuICAgIFwiaW52YWxpZCB6c3RkIGRhdGFcIixcbiAgICBcIndpbmRvdyBzaXplIHRvbyBsYXJnZSAoPjIwNDZNQilcIixcbiAgICBcImludmFsaWQgYmxvY2sgdHlwZVwiLFxuICAgIFwiRlNFIGFjY3VyYWN5IHRvbyBoaWdoXCIsXG4gICAgXCJtYXRjaCBkaXN0YW5jZSB0b28gZmFyIGJhY2tcIixcbiAgICBcInVuZXhwZWN0ZWQgRU9GXCIsXG4gIF07XG4gIHZhciBlcnIgPSBmdW5jdGlvbiAoaW5kLCBtc2csIG50KSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobXNnIHx8IGVjW2luZF0pO1xuICAgIGUuY29kZSA9IGluZDtcbiAgICBpZiAoIW50KSB0aHJvdyBlO1xuICAgIHJldHVybiBlO1xuICB9O1xuICB2YXIgcmIgPSBmdW5jdGlvbiAoZCwgYiwgbikge1xuICAgIHZhciBpID0gMCxcbiAgICAgIG8gPSAwO1xuICAgIGZvciAoOyBpIDwgbjsgKytpKSBvIHw9IGRbYisrXSA8PCAoaSA8PCAzKTtcbiAgICByZXR1cm4gbztcbiAgfTtcbiAgdmFyIGI0ID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICByZXR1cm4gKGRbYl0gfCAoZFtiICsgMV0gPDwgOCkgfCAoZFtiICsgMl0gPDwgMTYpIHwgKGRbYiArIDNdIDw8IDI0KSkgPj4+IDA7XG4gIH07XG4gIC8vIHJlYWQgWnN0YW5kYXJkIGZyYW1lIGhlYWRlclxuICB2YXIgcnpmaCA9IGZ1bmN0aW9uIChkYXQsIHcpIHtcbiAgICB2YXIgbjMgPSBkYXRbMF0gfCAoZGF0WzFdIDw8IDgpIHwgKGRhdFsyXSA8PCAxNik7XG4gICAgaWYgKG4zID09PSAweDJmYjUyOCAmJiBkYXRbM10gPT09IDI1Mykge1xuICAgICAgLy8gWnN0YW5kYXJkXG4gICAgICB2YXIgZmxnID0gZGF0WzRdO1xuICAgICAgLy8gICAgc2luZ2xlIHNlZ21lbnQgICAgICAgY2hlY2tzdW0gICAgICAgICAgICAgZGljdCBmbGFnICAgICBmcmFtZSBjb250ZW50IGZsYWdcbiAgICAgIHZhciBzcyA9IChmbGcgPj4gNSkgJiAxLFxuICAgICAgICBjYyA9IChmbGcgPj4gMikgJiAxLFxuICAgICAgICBkZiA9IGZsZyAmIDMsXG4gICAgICAgIGZjZiA9IGZsZyA+PiA2O1xuICAgICAgaWYgKGZsZyAmIDgpIGVycigwKTtcbiAgICAgIC8vIGJ5dGVcbiAgICAgIHZhciBidCA9IDYgLSBzcztcbiAgICAgIC8vIGRpY3QgYnl0ZXNcbiAgICAgIHZhciBkYiA9IGRmID09PSAzID8gNCA6IGRmO1xuICAgICAgLy8gZGljdGlvbmFyeSBpZFxuICAgICAgdmFyIGRpID0gcmIoZGF0LCBidCwgZGIpO1xuICAgICAgYnQgKz0gZGI7XG4gICAgICAvLyBmcmFtZSBzaXplIGJ5dGVzXG4gICAgICB2YXIgZnNiID0gZmNmID8gMSA8PCBmY2YgOiBzcztcbiAgICAgIC8vIGZyYW1lIHNvdXJjZSBzaXplXG4gICAgICB2YXIgZnNzID0gcmIoZGF0LCBidCwgZnNiKSArIChmY2YgPT09IDEgJiYgMjU2KTtcbiAgICAgIC8vIHdpbmRvdyBzaXplXG4gICAgICB2YXIgd3MgPSBmc3M7XG4gICAgICBpZiAoIXNzKSB7XG4gICAgICAgIC8vIHdpbmRvdyBkZXNjcmlwdG9yXG4gICAgICAgIHZhciB3YiA9IDEgPDwgKDEwICsgKGRhdFs1XSA+PiAzKSk7XG4gICAgICAgIHdzID0gd2IgKyAod2IgPj4gMykgKiAoZGF0WzVdICYgNyk7XG4gICAgICB9XG4gICAgICBpZiAod3MgPiAyMTQ1Mzg2NDk2KSBlcnIoMSk7XG4gICAgICB2YXIgYnVmID0gbmV3IHU4KCh3ID09PSAxID8gZnNzIHx8IHdzIDogdyA/IDAgOiB3cykgKyAxMik7XG4gICAgICAoYnVmWzBdID0gMSksIChidWZbNF0gPSA0KSwgKGJ1Zls4XSA9IDgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYjogYnQgKyBmc2IsXG4gICAgICAgIHk6IDAsXG4gICAgICAgIGw6IDAsXG4gICAgICAgIGQ6IGRpLFxuICAgICAgICB3OiB3ICYmIHcgIT09IDEgPyB3IDogYnVmLnN1YmFycmF5KDEyKSxcbiAgICAgICAgZTogd3MsXG4gICAgICAgIG86IG5ldyBpMzIoYnVmLmJ1ZmZlciwgMCwgMyksXG4gICAgICAgIHU6IGZzcyxcbiAgICAgICAgYzogY2MsXG4gICAgICAgIG06IE1hdGgubWluKDEzMTA3Miwgd3MpLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKCgobjMgPj4gNCkgfCAoZGF0WzNdIDw8IDIwKSkgPT09IDB4MTg0ZDJhNSkge1xuICAgICAgLy8gc2tpcHBhYmxlXG4gICAgICByZXR1cm4gYjQoZGF0LCA0KSArIDg7XG4gICAgfVxuICAgIGVycigwKTtcbiAgfTtcbiAgLy8gbW9zdCBzaWduaWZpY2FudCBiaXQgZm9yIG5vbnplcm9cbiAgdmFyIG1zYiA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB2YXIgYml0cyA9IDA7XG4gICAgZm9yICg7IDEgPDwgYml0cyA8PSB2YWw7ICsrYml0cyk7XG4gICAgcmV0dXJuIGJpdHMgLSAxO1xuICB9O1xuICAvLyByZWFkIGZpbml0ZSBzdGF0ZSBlbnRyb3B5XG4gIHZhciByZnNlID0gZnVuY3Rpb24gKGRhdCwgYnQsIG1hbCkge1xuICAgIC8vIHRhYmxlIHBvc1xuICAgIHZhciB0cG9zID0gKGJ0IDw8IDMpICsgNDtcbiAgICAvLyBhY2N1cmFjeSBsb2dcbiAgICB2YXIgYWwgPSAoZGF0W2J0XSAmIDE1KSArIDU7XG4gICAgaWYgKGFsID4gbWFsKSBlcnIoMyk7XG4gICAgLy8gc2l6ZVxuICAgIHZhciBzeiA9IDEgPDwgYWw7XG4gICAgLy8gcHJvYmFiaWxpdGllcyBzeW1ib2xzICByZXBlYXQgICBpbmRleCAgIGhpZ2ggdGhyZXNob2xkXG4gICAgdmFyIHByb2JzID0gc3osXG4gICAgICBzeW0gPSAtMSxcbiAgICAgIHJlID0gLTEsXG4gICAgICBpID0gLTEsXG4gICAgICBodCA9IHN6O1xuICAgIC8vIG9wdGltaXphdGlvbjogc2luZ2xlIGFsbG9jYXRpb24gaXMgbXVjaCBmYXN0ZXJcbiAgICB2YXIgYnVmID0gbmV3IGFiKDUxMiArIChzeiA8PCAyKSk7XG4gICAgdmFyIGZyZXEgPSBuZXcgaTE2KGJ1ZiwgMCwgMjU2KTtcbiAgICAvLyBzYW1lIHZpZXcgYXMgZnJlcVxuICAgIHZhciBkc3RhdGUgPSBuZXcgdTE2KGJ1ZiwgMCwgMjU2KTtcbiAgICB2YXIgbnN0YXRlID0gbmV3IHUxNihidWYsIDUxMiwgc3opO1xuICAgIHZhciBiYjEgPSA1MTIgKyAoc3ogPDwgMSk7XG4gICAgdmFyIHN5bXMgPSBuZXcgdTgoYnVmLCBiYjEsIHN6KTtcbiAgICB2YXIgbmJpdHMgPSBuZXcgdTgoYnVmLCBiYjEgKyBzeik7XG4gICAgd2hpbGUgKHN5bSA8IDI1NSAmJiBwcm9icyA+IDApIHtcbiAgICAgIHZhciBiaXRzID0gbXNiKHByb2JzICsgMSk7XG4gICAgICB2YXIgY2J0ID0gdHBvcyA+PiAzO1xuICAgICAgLy8gbWFza1xuICAgICAgdmFyIG1zayA9ICgxIDw8IChiaXRzICsgMSkpIC0gMTtcbiAgICAgIHZhciB2YWwgPVxuICAgICAgICAoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSB8IChkYXRbY2J0ICsgMl0gPDwgMTYpKSA+PlxuICAgICAgICAgICh0cG9zICYgNykpICZcbiAgICAgICAgbXNrO1xuICAgICAgLy8gbWFzayAoMSBmZXdlciBiaXQpXG4gICAgICB2YXIgbXNrMWZiID0gKDEgPDwgYml0cykgLSAxO1xuICAgICAgLy8gbWF4IHNtYWxsIHZhbHVlXG4gICAgICB2YXIgbXN2ID0gbXNrIC0gcHJvYnMgLSAxO1xuICAgICAgLy8gc21hbGwgdmFsdWVcbiAgICAgIHZhciBzdmFsID0gdmFsICYgbXNrMWZiO1xuICAgICAgaWYgKHN2YWwgPCBtc3YpICh0cG9zICs9IGJpdHMpLCAodmFsID0gc3ZhbCk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgdHBvcyArPSBiaXRzICsgMTtcbiAgICAgICAgaWYgKHZhbCA+IG1zazFmYikgdmFsIC09IG1zdjtcbiAgICAgIH1cbiAgICAgIGZyZXFbKytzeW1dID0gLS12YWw7XG4gICAgICBpZiAodmFsID09PSAtMSkge1xuICAgICAgICBwcm9icyArPSB2YWw7XG4gICAgICAgIHN5bXNbLS1odF0gPSBzeW07XG4gICAgICB9IGVsc2UgcHJvYnMgLT0gdmFsO1xuICAgICAgaWYgKCF2YWwpIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIC8vIHJlcGVhdCBieXRlXG4gICAgICAgICAgdmFyIHJidCA9IHRwb3MgPj4gMztcbiAgICAgICAgICByZSA9ICgoZGF0W3JidF0gfCAoZGF0W3JidCArIDFdIDw8IDgpKSA+PiAodHBvcyAmIDcpKSAmIDM7XG4gICAgICAgICAgdHBvcyArPSAyO1xuICAgICAgICAgIHN5bSArPSByZTtcbiAgICAgICAgfSB3aGlsZSAocmUgPT09IDMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3ltID4gMjU1IHx8IHByb2JzKSBlcnIoMCk7XG4gICAgdmFyIHN5bXBvcyA9IDA7XG4gICAgLy8gc3ltIHN0ZXAgKGNvcHJpbWUgd2l0aCBzeiAtIGZvcm11bGEgZnJvbSB6c3RkIHNvdXJjZSlcbiAgICB2YXIgc3N0ZXAgPSAoc3ogPj4gMSkgKyAoc3ogPj4gMykgKyAzO1xuICAgIC8vIHN5bSBtYXNrXG4gICAgdmFyIHNtYXNrID0gc3ogLSAxO1xuICAgIGZvciAodmFyIHMgPSAwOyBzIDw9IHN5bTsgKytzKSB7XG4gICAgICB2YXIgc2YgPSBmcmVxW3NdO1xuICAgICAgaWYgKHNmIDwgMSkge1xuICAgICAgICBkc3RhdGVbc10gPSAtc2Y7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gVGhpcyBpcyBzcGxpdCBpbnRvIHR3byBsb29wcyBpbiB6c3RkIHRvIGF2b2lkIGJyYW5jaGluZywgYnV0IGFzIEpTIGlzIGhpZ2hlci1sZXZlbCB0aGF0IGlzIHVubmVjZXNzYXJ5XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgc2Y7ICsraSkge1xuICAgICAgICBzeW1zW3N5bXBvc10gPSBzO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgc3ltcG9zID0gKHN5bXBvcyArIHNzdGVwKSAmIHNtYXNrO1xuICAgICAgICB9IHdoaWxlIChzeW1wb3MgPj0gaHQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBBZnRlciBzcHJlYWRpbmcgc3ltYm9scywgc2hvdWxkIGJlIHplcm8gYWdhaW5cbiAgICBpZiAoc3ltcG9zKSBlcnIoMCk7XG4gICAgZm9yIChpID0gMDsgaSA8IHN6OyArK2kpIHtcbiAgICAgIC8vIG5leHQgc3RhdGVcbiAgICAgIHZhciBucyA9IGRzdGF0ZVtzeW1zW2ldXSsrO1xuICAgICAgLy8gbnVtIGJpdHNcbiAgICAgIHZhciBuYiA9IChuYml0c1tpXSA9IGFsIC0gbXNiKG5zKSk7XG4gICAgICBuc3RhdGVbaV0gPSAobnMgPDwgbmIpIC0gc3o7XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICAodHBvcyArIDcpID4+IDMsXG4gICAgICB7XG4gICAgICAgIGI6IGFsLFxuICAgICAgICBzOiBzeW1zLFxuICAgICAgICBuOiBuYml0cyxcbiAgICAgICAgdDogbnN0YXRlLFxuICAgICAgfSxcbiAgICBdO1xuICB9O1xuICAvLyByZWFkIGh1ZmZtYW5cbiAgdmFyIHJodSA9IGZ1bmN0aW9uIChkYXQsIGJ0KSB7XG4gICAgLy8gIGluZGV4ICB3ZWlnaHQgY291bnRcbiAgICB2YXIgaSA9IDAsXG4gICAgICB3YyA9IC0xO1xuICAgIC8vICAgIGJ1ZmZlciAgICAgICAgICAgICBoZWFkZXIgYnl0ZVxuICAgIHZhciBidWYgPSBuZXcgdTgoMjkyKSxcbiAgICAgIGhiID0gZGF0W2J0XTtcbiAgICAvLyBodWZmbWFuIHdlaWdodHNcbiAgICB2YXIgaHcgPSBidWYuc3ViYXJyYXkoMCwgMjU2KTtcbiAgICAvLyByYW5rIGNvdW50XG4gICAgdmFyIHJjID0gYnVmLnN1YmFycmF5KDI1NiwgMjY4KTtcbiAgICAvLyByYW5rIGluZGV4XG4gICAgdmFyIHJpID0gbmV3IHUxNihidWYuYnVmZmVyLCAyNjgpO1xuICAgIC8vIE5PVEU6IGF0IHRoaXMgcG9pbnQgYnQgaXMgMSBsZXNzIHRoYW4gZXhwZWN0ZWRcbiAgICBpZiAoaGIgPCAxMjgpIHtcbiAgICAgIC8vIGVuZCBieXRlLCBmc2UgZGVjb2RlIHRhYmxlXG4gICAgICB2YXIgX2EgPSByZnNlKGRhdCwgYnQgKyAxLCA2KSxcbiAgICAgICAgZWJ0ID0gX2FbMF0sXG4gICAgICAgIGZkdCA9IF9hWzFdO1xuICAgICAgYnQgKz0gaGI7XG4gICAgICB2YXIgZXBvcyA9IGVidCA8PCAzO1xuICAgICAgLy8gbGFzdCBieXRlXG4gICAgICB2YXIgbGIgPSBkYXRbYnRdO1xuICAgICAgaWYgKCFsYikgZXJyKDApO1xuICAgICAgLy8gIHN0YXRlMSAgIHN0YXRlMiAgIHN0YXRlMSBiaXRzICAgc3RhdGUyIGJpdHNcbiAgICAgIHZhciBzdDEgPSAwLFxuICAgICAgICBzdDIgPSAwLFxuICAgICAgICBidHIxID0gZmR0LmIsXG4gICAgICAgIGJ0cjIgPSBidHIxO1xuICAgICAgLy8gZnNlIHBvc1xuICAgICAgLy8gcHJlLWluY3JlbWVudCB0byBhY2NvdW50IGZvciBvcmlnaW5hbCBkZWZpY2l0IG9mIDFcbiAgICAgIHZhciBmcG9zID0gKCsrYnQgPDwgMykgLSA4ICsgbXNiKGxiKTtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgZnBvcyAtPSBidHIxO1xuICAgICAgICBpZiAoZnBvcyA8IGVwb3MpIGJyZWFrO1xuICAgICAgICB2YXIgY2J0ID0gZnBvcyA+PiAzO1xuICAgICAgICBzdDEgKz1cbiAgICAgICAgICAoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSkgPj4gKGZwb3MgJiA3KSkgJiAoKDEgPDwgYnRyMSkgLSAxKTtcbiAgICAgICAgaHdbKyt3Y10gPSBmZHQuc1tzdDFdO1xuICAgICAgICBmcG9zIC09IGJ0cjI7XG4gICAgICAgIGlmIChmcG9zIDwgZXBvcykgYnJlYWs7XG4gICAgICAgIGNidCA9IGZwb3MgPj4gMztcbiAgICAgICAgc3QyICs9XG4gICAgICAgICAgKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChmcG9zICYgNykpICYgKCgxIDw8IGJ0cjIpIC0gMSk7XG4gICAgICAgIGh3Wysrd2NdID0gZmR0LnNbc3QyXTtcbiAgICAgICAgYnRyMSA9IGZkdC5uW3N0MV07XG4gICAgICAgIHN0MSA9IGZkdC50W3N0MV07XG4gICAgICAgIGJ0cjIgPSBmZHQubltzdDJdO1xuICAgICAgICBzdDIgPSBmZHQudFtzdDJdO1xuICAgICAgfVxuICAgICAgaWYgKCsrd2MgPiAyNTUpIGVycigwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2MgPSBoYiAtIDEyNztcbiAgICAgIGZvciAoOyBpIDwgd2M7IGkgKz0gMikge1xuICAgICAgICB2YXIgYnl0ZSA9IGRhdFsrK2J0XTtcbiAgICAgICAgaHdbaV0gPSBieXRlID4+IDQ7XG4gICAgICAgIGh3W2kgKyAxXSA9IGJ5dGUgJiAxNTtcbiAgICAgIH1cbiAgICAgICsrYnQ7XG4gICAgfVxuICAgIC8vIHdlaWdodCBleHBvbmVudGlhbCBzdW1cbiAgICB2YXIgd2VzID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgd2M7ICsraSkge1xuICAgICAgdmFyIHd0ID0gaHdbaV07XG4gICAgICAvLyBiaXRzIG11c3QgYmUgYXQgbW9zdCAxMSwgc2FtZSBhcyB3ZWlnaHRcbiAgICAgIGlmICh3dCA+IDExKSBlcnIoMCk7XG4gICAgICB3ZXMgKz0gd3QgJiYgMSA8PCAod3QgLSAxKTtcbiAgICB9XG4gICAgLy8gbWF4IGJpdHNcbiAgICB2YXIgbWIgPSBtc2Iod2VzKSArIDE7XG4gICAgLy8gdGFibGUgc2l6ZVxuICAgIHZhciB0cyA9IDEgPDwgbWI7XG4gICAgLy8gcmVtYWluaW5nIHN1bVxuICAgIHZhciByZW0gPSB0cyAtIHdlcztcbiAgICAvLyBtdXN0IGJlIHBvd2VyIG9mIDJcbiAgICBpZiAocmVtICYgKHJlbSAtIDEpKSBlcnIoMCk7XG4gICAgaHdbd2MrK10gPSBtc2IocmVtKSArIDE7XG4gICAgZm9yIChpID0gMDsgaSA8IHdjOyArK2kpIHtcbiAgICAgIHZhciB3dCA9IGh3W2ldO1xuICAgICAgKytyY1soaHdbaV0gPSB3dCAmJiBtYiArIDEgLSB3dCldO1xuICAgIH1cbiAgICAvLyBodWYgYnVmXG4gICAgdmFyIGhidWYgPSBuZXcgdTgodHMgPDwgMSk7XG4gICAgLy8gICAgc3ltYm9scyAgICAgICAgICAgICAgICAgICAgICBudW0gYml0c1xuICAgIHZhciBzeW1zID0gaGJ1Zi5zdWJhcnJheSgwLCB0cyksXG4gICAgICBuYiA9IGhidWYuc3ViYXJyYXkodHMpO1xuICAgIHJpW21iXSA9IDA7XG4gICAgZm9yIChpID0gbWI7IGkgPiAwOyAtLWkpIHtcbiAgICAgIHZhciBwdiA9IHJpW2ldO1xuICAgICAgZmlsbChuYiwgaSwgcHYsIChyaVtpIC0gMV0gPSBwdiArIHJjW2ldICogKDEgPDwgKG1iIC0gaSkpKSk7XG4gICAgfVxuICAgIGlmIChyaVswXSAhPT0gdHMpIGVycigwKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgd2M7ICsraSkge1xuICAgICAgdmFyIGJpdHMgPSBod1tpXTtcbiAgICAgIGlmIChiaXRzKSB7XG4gICAgICAgIHZhciBjb2RlID0gcmlbYml0c107XG4gICAgICAgIGZpbGwoc3ltcywgaSwgY29kZSwgKHJpW2JpdHNdID0gY29kZSArICgxIDw8IChtYiAtIGJpdHMpKSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgYnQsXG4gICAgICB7XG4gICAgICAgIG46IG5iLFxuICAgICAgICBiOiBtYixcbiAgICAgICAgczogc3ltcyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfTtcbiAgLy8gVGFibGVzIGdlbmVyYXRlZCB1c2luZyB0aGlzOlxuICAvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS8xMDFhcnJvd3ovYTk3OTQ1MmQ0MzU1OTkyY2JmOGYyNTdjYmZmYzllZGRcbiAgLy8gZGVmYXVsdCBsaXRlcmFsIGxlbmd0aCB0YWJsZVxuICB2YXIgZGxsdCA9IC8qI19fUFVSRV9fKi8gcmZzZShcbiAgICAvKiNfX1BVUkVfXyovIG5ldyB1OChbXG4gICAgICA4MSwgMTYsIDk5LCAxNDAsIDQ5LCAxOTgsIDI0LCA5OSwgMTIsIDMzLCAxOTYsIDI0LCA5OSwgMTAyLCAxMDIsIDEzNCwgNzAsXG4gICAgICAxNDYsIDQsXG4gICAgXSksXG4gICAgMCxcbiAgICA2LFxuICApWzFdO1xuICAvLyBkZWZhdWx0IG1hdGNoIGxlbmd0aCB0YWJsZVxuICB2YXIgZG1sdCA9IC8qI19fUFVSRV9fKi8gcmZzZShcbiAgICAvKiNfX1BVUkVfXyovIG5ldyB1OChbXG4gICAgICAzMywgMjAsIDE5NiwgMjQsIDk5LCAxNDAsIDMzLCAxMzIsIDE2LCA2NiwgOCwgMzMsIDEzMiwgMTYsIDY2LCA4LCAzMywgNjgsXG4gICAgICA2OCwgNjgsIDY4LCA2OCwgNjgsIDY4LCA2OCwgMzYsIDksXG4gICAgXSksXG4gICAgMCxcbiAgICA2LFxuICApWzFdO1xuICAvLyBkZWZhdWx0IG9mZnNldCBjb2RlIHRhYmxlXG4gIHZhciBkb2N0ID0gLyojX19QVVJFX18gKi8gcmZzZShcbiAgICAvKiNfX1BVUkVfXyovIG5ldyB1OChbMzIsIDEzMiwgMTYsIDY2LCAxMDIsIDcwLCA2OCwgNjgsIDY4LCA2OCwgMzYsIDczLCAyXSksXG4gICAgMCxcbiAgICA1LFxuICApWzFdO1xuICAvLyBiaXRzIHRvIGJhc2VsaW5lXG4gIHZhciBiMmJsID0gZnVuY3Rpb24gKGIsIHMpIHtcbiAgICB2YXIgbGVuID0gYi5sZW5ndGgsXG4gICAgICBibCA9IG5ldyBpMzIobGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICBibFtpXSA9IHM7XG4gICAgICBzICs9IDEgPDwgYltpXTtcbiAgICB9XG4gICAgcmV0dXJuIGJsO1xuICB9O1xuICAvLyBsaXRlcmFsIGxlbmd0aCBiaXRzXG4gIHZhciBsbGIgPSAvKiNfX1BVUkVfXyAqLyBuZXcgdTgoXG4gICAgLyojX19QVVJFX18gKi8gbmV3IGkzMihbXG4gICAgICAwLCAwLCAwLCAwLCAxNjg0MzAwOSwgNTA1Mjg3NzAsIDEzNDY3ODAyMCwgMjAyMDUwMDU3LCAyNjk0MjIwOTMsXG4gICAgXSkuYnVmZmVyLFxuICAgIDAsXG4gICAgMzYsXG4gICk7XG4gIC8vIGxpdGVyYWwgbGVuZ3RoIGJhc2VsaW5lXG4gIHZhciBsbGJsID0gLyojX19QVVJFX18gKi8gYjJibChsbGIsIDApO1xuICAvLyBtYXRjaCBsZW5ndGggYml0c1xuICB2YXIgbWxiID0gLyojX19QVVJFX18gKi8gbmV3IHU4KFxuICAgIC8qI19fUFVSRV9fICovIG5ldyBpMzIoW1xuICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMTY4NDMwMDksIDUwNTI4NzcwLCAxMTc3NjkyMjAsIDE4NTIwNzA0OCxcbiAgICAgIDI1MjU3OTA4NCwgMTYsXG4gICAgXSkuYnVmZmVyLFxuICAgIDAsXG4gICAgNTMsXG4gICk7XG4gIC8vIG1hdGNoIGxlbmd0aCBiYXNlbGluZVxuICB2YXIgbWxibCA9IC8qI19fUFVSRV9fICovIGIyYmwobWxiLCAzKTtcbiAgLy8gZGVjb2RlIGh1ZmZtYW4gc3RyZWFtXG4gIHZhciBkaHUgPSBmdW5jdGlvbiAoZGF0LCBvdXQsIGh1KSB7XG4gICAgdmFyIGxlbiA9IGRhdC5sZW5ndGgsXG4gICAgICBzcyA9IG91dC5sZW5ndGgsXG4gICAgICBsYiA9IGRhdFtsZW4gLSAxXSxcbiAgICAgIG1zayA9ICgxIDw8IGh1LmIpIC0gMSxcbiAgICAgIGViID0gLWh1LmI7XG4gICAgaWYgKCFsYikgZXJyKDApO1xuICAgIHZhciBzdCA9IDAsXG4gICAgICBidHIgPSBodS5iLFxuICAgICAgcG9zID0gKGxlbiA8PCAzKSAtIDggKyBtc2IobGIpIC0gYnRyLFxuICAgICAgaSA9IC0xO1xuICAgIHdoaWxlIChwb3MgPiBlYiAmJiBpIDwgc3MpIHtcbiAgICAgIHZhciBjYnQgPSBwb3MgPj4gMztcbiAgICAgIHZhciB2YWwgPVxuICAgICAgICAoZGF0W2NidF0gfCAoZGF0W2NidCArIDFdIDw8IDgpIHwgKGRhdFtjYnQgKyAyXSA8PCAxNikpID4+IChwb3MgJiA3KTtcbiAgICAgIHN0ID0gKChzdCA8PCBidHIpIHwgdmFsKSAmIG1zaztcbiAgICAgIG91dFsrK2ldID0gaHUuc1tzdF07XG4gICAgICBwb3MgLT0gYnRyID0gaHUubltzdF07XG4gICAgfVxuICAgIGlmIChwb3MgIT09IGViIHx8IGkgKyAxICE9PSBzcykgZXJyKDApO1xuICB9O1xuICAvLyBkZWNvZGUgaHVmZm1hbiBzdHJlYW0gNHhcbiAgLy8gVE9ETzogdXNlIHdvcmtlcnMgdG8gcGFyYWxsZWxpemVcbiAgdmFyIGRodTQgPSBmdW5jdGlvbiAoZGF0LCBvdXQsIGh1KSB7XG4gICAgdmFyIGJ0ID0gNjtcbiAgICB2YXIgc3MgPSBvdXQubGVuZ3RoLFxuICAgICAgc3oxID0gKHNzICsgMykgPj4gMixcbiAgICAgIHN6MiA9IHN6MSA8PCAxLFxuICAgICAgc3ozID0gc3oxICsgc3oyO1xuICAgIGRodShcbiAgICAgIGRhdC5zdWJhcnJheShidCwgKGJ0ICs9IGRhdFswXSB8IChkYXRbMV0gPDwgOCkpKSxcbiAgICAgIG91dC5zdWJhcnJheSgwLCBzejEpLFxuICAgICAgaHUsXG4gICAgKTtcbiAgICBkaHUoXG4gICAgICBkYXQuc3ViYXJyYXkoYnQsIChidCArPSBkYXRbMl0gfCAoZGF0WzNdIDw8IDgpKSksXG4gICAgICBvdXQuc3ViYXJyYXkoc3oxLCBzejIpLFxuICAgICAgaHUsXG4gICAgKTtcbiAgICBkaHUoXG4gICAgICBkYXQuc3ViYXJyYXkoYnQsIChidCArPSBkYXRbNF0gfCAoZGF0WzVdIDw8IDgpKSksXG4gICAgICBvdXQuc3ViYXJyYXkoc3oyLCBzejMpLFxuICAgICAgaHUsXG4gICAgKTtcbiAgICBkaHUoZGF0LnN1YmFycmF5KGJ0KSwgb3V0LnN1YmFycmF5KHN6MyksIGh1KTtcbiAgfTtcbiAgLy8gcmVhZCBac3RhbmRhcmQgYmxvY2tcbiAgdmFyIHJ6YiA9IGZ1bmN0aW9uIChkYXQsIHN0LCBvdXQpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGJ0ID0gc3QuYjtcbiAgICAvLyAgICBieXRlIDAgICAgICAgIGJsb2NrIHR5cGVcbiAgICB2YXIgYjAgPSBkYXRbYnRdLFxuICAgICAgYnR5cGUgPSAoYjAgPj4gMSkgJiAzO1xuICAgIHN0LmwgPSBiMCAmIDE7XG4gICAgdmFyIHN6ID0gKGIwID4+IDMpIHwgKGRhdFtidCArIDFdIDw8IDUpIHwgKGRhdFtidCArIDJdIDw8IDEzKTtcbiAgICAvLyBlbmQgYnl0ZSBmb3IgYmxvY2tcbiAgICB2YXIgZWJ0ID0gKGJ0ICs9IDMpICsgc3o7XG4gICAgaWYgKGJ0eXBlID09PSAxKSB7XG4gICAgICBpZiAoYnQgPj0gZGF0Lmxlbmd0aCkgcmV0dXJuO1xuICAgICAgc3QuYiA9IGJ0ICsgMTtcbiAgICAgIGlmIChvdXQpIHtcbiAgICAgICAgZmlsbChvdXQsIGRhdFtidF0sIHN0LnksIChzdC55ICs9IHN6KSk7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmlsbChuZXcgdTgoc3opLCBkYXRbYnRdKTtcbiAgICB9XG4gICAgaWYgKGVidCA+IGRhdC5sZW5ndGgpIHJldHVybjtcbiAgICBpZiAoYnR5cGUgPT09IDApIHtcbiAgICAgIHN0LmIgPSBlYnQ7XG4gICAgICBpZiAob3V0KSB7XG4gICAgICAgIG91dC5zZXQoZGF0LnN1YmFycmF5KGJ0LCBlYnQpLCBzdC55KTtcbiAgICAgICAgc3QueSArPSBzejtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzbGMoZGF0LCBidCwgZWJ0KTtcbiAgICB9XG4gICAgaWYgKGJ0eXBlID09PSAyKSB7XG4gICAgICAvLyAgICBieXRlIDMgICAgICAgIGxpdCBidHlwZSAgICAgc2l6ZSBmb3JtYXRcbiAgICAgIHZhciBiMyA9IGRhdFtidF0sXG4gICAgICAgIGxidCA9IGIzICYgMyxcbiAgICAgICAgc2YgPSAoYjMgPj4gMikgJiAzO1xuICAgICAgLy8gbGl0IHNyYyBzaXplICBsaXQgY21wIHN6IDQgc3RyZWFtc1xuICAgICAgdmFyIGxzcyA9IGIzID4+IDQsXG4gICAgICAgIGxjcyA9IDAsXG4gICAgICAgIHM0ID0gMDtcbiAgICAgIGlmIChsYnQgPCAyKSB7XG4gICAgICAgIGlmIChzZiAmIDEpIGxzcyB8PSAoZGF0WysrYnRdIDw8IDQpIHwgKHNmICYgMiAmJiBkYXRbKytidF0gPDwgMTIpO1xuICAgICAgICBlbHNlIGxzcyA9IGIzID4+IDM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzNCA9IHNmO1xuICAgICAgICBpZiAoc2YgPCAyKVxuICAgICAgICAgIChsc3MgfD0gKGRhdFsrK2J0XSAmIDYzKSA8PCA0KSxcbiAgICAgICAgICAgIChsY3MgPSAoZGF0W2J0XSA+PiA2KSB8IChkYXRbKytidF0gPDwgMikpO1xuICAgICAgICBlbHNlIGlmIChzZiA9PT0gMilcbiAgICAgICAgICAobHNzIHw9IChkYXRbKytidF0gPDwgNCkgfCAoKGRhdFsrK2J0XSAmIDMpIDw8IDEyKSksXG4gICAgICAgICAgICAobGNzID0gKGRhdFtidF0gPj4gMikgfCAoZGF0WysrYnRdIDw8IDYpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIChsc3MgfD0gKGRhdFsrK2J0XSA8PCA0KSB8ICgoZGF0WysrYnRdICYgNjMpIDw8IDEyKSksXG4gICAgICAgICAgICAobGNzID0gKGRhdFtidF0gPj4gNikgfCAoZGF0WysrYnRdIDw8IDIpIHwgKGRhdFsrK2J0XSA8PCAxMCkpO1xuICAgICAgfVxuICAgICAgKytidDtcbiAgICAgIC8vIGFkZCBsaXRlcmFscyB0byBlbmQgLSBjYW4gbmV2ZXIgb3ZlcmxhcCB3aXRoIGJhY2tyZWZlcmVuY2VzIGJlY2F1c2UgdW51c2VkIGxpdGVyYWxzIGFsd2F5cyBhcHBlbmRlZFxuICAgICAgdmFyIGJ1ZiA9IG91dCA/IG91dC5zdWJhcnJheShzdC55LCBzdC55ICsgc3QubSkgOiBuZXcgdTgoc3QubSk7XG4gICAgICAvLyBzdGFydGluZyBwb2ludCBmb3IgbGl0ZXJhbHNcbiAgICAgIHZhciBzcGwgPSBidWYubGVuZ3RoIC0gbHNzO1xuICAgICAgaWYgKGxidCA9PT0gMCkgYnVmLnNldChkYXQuc3ViYXJyYXkoYnQsIChidCArPSBsc3MpKSwgc3BsKTtcbiAgICAgIGVsc2UgaWYgKGxidCA9PT0gMSkgZmlsbChidWYsIGRhdFtidCsrXSwgc3BsKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBodWZmbWFuIHRhYmxlXG4gICAgICAgIHZhciBodSA9IHN0Lmg7XG4gICAgICAgIGlmIChsYnQgPT09IDIpIHtcbiAgICAgICAgICB2YXIgaHVkID0gcmh1KGRhdCwgYnQpO1xuICAgICAgICAgIC8vIHN1YnRyYWN0IGRlc2NyaXB0aW9uIGxlbmd0aFxuICAgICAgICAgIGxjcyArPSBidCAtIChidCA9IGh1ZFswXSk7XG4gICAgICAgICAgc3QuaCA9IGh1ID0gaHVkWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKCFodSkgZXJyKDApO1xuICAgICAgICAoczQgPyBkaHU0IDogZGh1KShkYXQuc3ViYXJyYXkoYnQsIChidCArPSBsY3MpKSwgYnVmLnN1YmFycmF5KHNwbCksIGh1KTtcbiAgICAgIH1cbiAgICAgIC8vIG51bSBzZXF1ZW5jZXNcbiAgICAgIHZhciBucyA9IGRhdFtidCsrXTtcbiAgICAgIGlmIChucykge1xuICAgICAgICBpZiAobnMgPT09IDI1NSkgbnMgPSAoZGF0W2J0KytdIHwgKGRhdFtidCsrXSA8PCA4KSkgKyAweDdmMDA7XG4gICAgICAgIGVsc2UgaWYgKG5zID4gMTI3KSBucyA9ICgobnMgLSAxMjgpIDw8IDgpIHwgZGF0W2J0KytdO1xuICAgICAgICAvLyBzeW1ib2wgY29tcHJlc3Npb24gbW9kZXNcbiAgICAgICAgdmFyIHNjbSA9IGRhdFtidCsrXTtcbiAgICAgICAgaWYgKHNjbSAmIDMpIGVycigwKTtcbiAgICAgICAgdmFyIGR0cyA9IFtkbWx0LCBkb2N0LCBkbGx0XTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPiAtMTsgLS1pKSB7XG4gICAgICAgICAgdmFyIG1kID0gKHNjbSA+PiAoKGkgPDwgMSkgKyAyKSkgJiAzO1xuICAgICAgICAgIGlmIChtZCA9PT0gMSkge1xuICAgICAgICAgICAgLy8gcmxlIGJ1ZlxuICAgICAgICAgICAgdmFyIHJidWYgPSBuZXcgdTgoWzAsIDAsIGRhdFtidCsrXV0pO1xuICAgICAgICAgICAgZHRzW2ldID0ge1xuICAgICAgICAgICAgICBzOiByYnVmLnN1YmFycmF5KDIsIDMpLFxuICAgICAgICAgICAgICBuOiByYnVmLnN1YmFycmF5KDAsIDEpLFxuICAgICAgICAgICAgICB0OiBuZXcgdTE2KHJidWYuYnVmZmVyLCAwLCAxKSxcbiAgICAgICAgICAgICAgYjogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChtZCA9PT0gMikge1xuICAgICAgICAgICAgLy8gYWNjdXJhY3kgbG9nIDggZm9yIG9mZnNldHMsIDkgZm9yIG90aGVyc1xuICAgICAgICAgICAgKF9hID0gcmZzZShkYXQsIGJ0LCA5IC0gKGkgJiAxKSkpLCAoYnQgPSBfYVswXSksIChkdHNbaV0gPSBfYVsxXSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChtZCA9PT0gMykge1xuICAgICAgICAgICAgaWYgKCFzdC50KSBlcnIoMCk7XG4gICAgICAgICAgICBkdHNbaV0gPSBzdC50W2ldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgX2IgPSAoc3QudCA9IGR0cyksXG4gICAgICAgICAgbWx0ID0gX2JbMF0sXG4gICAgICAgICAgb2N0ID0gX2JbMV0sXG4gICAgICAgICAgbGx0ID0gX2JbMl07XG4gICAgICAgIHZhciBsYiA9IGRhdFtlYnQgLSAxXTtcbiAgICAgICAgaWYgKCFsYikgZXJyKDApO1xuICAgICAgICB2YXIgc3BvcyA9IChlYnQgPDwgMykgLSA4ICsgbXNiKGxiKSAtIGxsdC5iLFxuICAgICAgICAgIGNidCA9IHNwb3MgPj4gMyxcbiAgICAgICAgICBvdWJ0ID0gMDtcbiAgICAgICAgdmFyIGxzdCA9XG4gICAgICAgICAgKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChzcG9zICYgNykpICYgKCgxIDw8IGxsdC5iKSAtIDEpO1xuICAgICAgICBjYnQgPSAoc3BvcyAtPSBvY3QuYikgPj4gMztcbiAgICAgICAgdmFyIG9zdCA9XG4gICAgICAgICAgKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChzcG9zICYgNykpICYgKCgxIDw8IG9jdC5iKSAtIDEpO1xuICAgICAgICBjYnQgPSAoc3BvcyAtPSBtbHQuYikgPj4gMztcbiAgICAgICAgdmFyIG1zdCA9XG4gICAgICAgICAgKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChzcG9zICYgNykpICYgKCgxIDw8IG1sdC5iKSAtIDEpO1xuICAgICAgICBmb3IgKCsrbnM7IC0tbnM7ICkge1xuICAgICAgICAgIHZhciBsbGMgPSBsbHQuc1tsc3RdO1xuICAgICAgICAgIHZhciBsYnRyID0gbGx0Lm5bbHN0XTtcbiAgICAgICAgICB2YXIgbWxjID0gbWx0LnNbbXN0XTtcbiAgICAgICAgICB2YXIgbWJ0ciA9IG1sdC5uW21zdF07XG4gICAgICAgICAgdmFyIG9mYyA9IG9jdC5zW29zdF07XG4gICAgICAgICAgdmFyIG9idHIgPSBvY3Qubltvc3RdO1xuICAgICAgICAgIGNidCA9IChzcG9zIC09IG9mYykgPj4gMztcbiAgICAgICAgICB2YXIgb2ZwID0gMSA8PCBvZmM7XG4gICAgICAgICAgdmFyIG9mZiA9XG4gICAgICAgICAgICBvZnAgK1xuICAgICAgICAgICAgKCgoZGF0W2NidF0gfFxuICAgICAgICAgICAgICAoZGF0W2NidCArIDFdIDw8IDgpIHxcbiAgICAgICAgICAgICAgKGRhdFtjYnQgKyAyXSA8PCAxNikgfFxuICAgICAgICAgICAgICAoZGF0W2NidCArIDNdIDw8IDI0KSkgPj4+XG4gICAgICAgICAgICAgIChzcG9zICYgNykpICZcbiAgICAgICAgICAgICAgKG9mcCAtIDEpKTtcbiAgICAgICAgICBjYnQgPSAoc3BvcyAtPSBtbGJbbWxjXSkgPj4gMztcbiAgICAgICAgICB2YXIgbWwgPVxuICAgICAgICAgICAgbWxibFttbGNdICtcbiAgICAgICAgICAgICgoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSB8IChkYXRbY2J0ICsgMl0gPDwgMTYpKSA+PlxuICAgICAgICAgICAgICAoc3BvcyAmIDcpKSAmXG4gICAgICAgICAgICAgICgoMSA8PCBtbGJbbWxjXSkgLSAxKSk7XG4gICAgICAgICAgY2J0ID0gKHNwb3MgLT0gbGxiW2xsY10pID4+IDM7XG4gICAgICAgICAgdmFyIGxsID1cbiAgICAgICAgICAgIGxsYmxbbGxjXSArXG4gICAgICAgICAgICAoKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkgfCAoZGF0W2NidCArIDJdIDw8IDE2KSkgPj5cbiAgICAgICAgICAgICAgKHNwb3MgJiA3KSkgJlxuICAgICAgICAgICAgICAoKDEgPDwgbGxiW2xsY10pIC0gMSkpO1xuICAgICAgICAgIGNidCA9IChzcG9zIC09IGxidHIpID4+IDM7XG4gICAgICAgICAgbHN0ID1cbiAgICAgICAgICAgIGxsdC50W2xzdF0gK1xuICAgICAgICAgICAgKCgoZGF0W2NidF0gfCAoZGF0W2NidCArIDFdIDw8IDgpKSA+PiAoc3BvcyAmIDcpKSAmXG4gICAgICAgICAgICAgICgoMSA8PCBsYnRyKSAtIDEpKTtcbiAgICAgICAgICBjYnQgPSAoc3BvcyAtPSBtYnRyKSA+PiAzO1xuICAgICAgICAgIG1zdCA9XG4gICAgICAgICAgICBtbHQudFttc3RdICtcbiAgICAgICAgICAgICgoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSkgPj4gKHNwb3MgJiA3KSkgJlxuICAgICAgICAgICAgICAoKDEgPDwgbWJ0cikgLSAxKSk7XG4gICAgICAgICAgY2J0ID0gKHNwb3MgLT0gb2J0cikgPj4gMztcbiAgICAgICAgICBvc3QgPVxuICAgICAgICAgICAgb2N0LnRbb3N0XSArXG4gICAgICAgICAgICAoKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChzcG9zICYgNykpICZcbiAgICAgICAgICAgICAgKCgxIDw8IG9idHIpIC0gMSkpO1xuICAgICAgICAgIGlmIChvZmYgPiAzKSB7XG4gICAgICAgICAgICBzdC5vWzJdID0gc3Qub1sxXTtcbiAgICAgICAgICAgIHN0Lm9bMV0gPSBzdC5vWzBdO1xuICAgICAgICAgICAgc3Qub1swXSA9IG9mZiAtPSAzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaWR4ID0gb2ZmIC0gKGxsICE9PSAwKTtcbiAgICAgICAgICAgIGlmIChpZHgpIHtcbiAgICAgICAgICAgICAgb2ZmID0gaWR4ID09PSAzID8gc3Qub1swXSAtIDEgOiBzdC5vW2lkeF07XG4gICAgICAgICAgICAgIGlmIChpZHggPiAxKSBzdC5vWzJdID0gc3Qub1sxXTtcbiAgICAgICAgICAgICAgc3Qub1sxXSA9IHN0Lm9bMF07XG4gICAgICAgICAgICAgIHN0Lm9bMF0gPSBvZmY7XG4gICAgICAgICAgICB9IGVsc2Ugb2ZmID0gc3Qub1swXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsbDsgKytpKSB7XG4gICAgICAgICAgICBidWZbb3VidCArIGldID0gYnVmW3NwbCArIGldO1xuICAgICAgICAgIH1cbiAgICAgICAgICAob3VidCArPSBsbCksIChzcGwgKz0gbGwpO1xuICAgICAgICAgIHZhciBzdGluID0gb3VidCAtIG9mZjtcbiAgICAgICAgICBpZiAoc3RpbiA8IDApIHtcbiAgICAgICAgICAgIHZhciBsZW4gPSAtc3RpbjtcbiAgICAgICAgICAgIHZhciBicyA9IHN0LmUgKyBzdGluO1xuICAgICAgICAgICAgaWYgKGxlbiA+IG1sKSBsZW4gPSBtbDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgYnVmW291YnQgKyBpXSA9IHN0LndbYnMgKyBpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIChvdWJ0ICs9IGxlbiksIChtbCAtPSBsZW4pLCAoc3RpbiA9IDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1sOyArK2kpIHtcbiAgICAgICAgICAgIGJ1ZltvdWJ0ICsgaV0gPSBidWZbc3RpbiArIGldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdWJ0ICs9IG1sO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvdWJ0ICE9PSBzcGwpIHtcbiAgICAgICAgICB3aGlsZSAoc3BsIDwgYnVmLmxlbmd0aCkge1xuICAgICAgICAgICAgYnVmW291YnQrK10gPSBidWZbc3BsKytdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIG91YnQgPSBidWYubGVuZ3RoO1xuICAgICAgICBpZiAob3V0KSBzdC55ICs9IG91YnQ7XG4gICAgICAgIGVsc2UgYnVmID0gc2xjKGJ1ZiwgMCwgb3VidCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3V0KSB7XG4gICAgICAgICAgc3QueSArPSBsc3M7XG4gICAgICAgICAgaWYgKHNwbCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsc3M7ICsraSkge1xuICAgICAgICAgICAgICBidWZbaV0gPSBidWZbc3BsICsgaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNwbCkgYnVmID0gc2xjKGJ1Ziwgc3BsKTtcbiAgICAgIH1cbiAgICAgIHN0LmIgPSBlYnQ7XG4gICAgICByZXR1cm4gYnVmO1xuICAgIH1cbiAgICBlcnIoMik7XG4gIH07XG4gIC8vIGNvbmNhdFxuICB2YXIgY2N0ID0gZnVuY3Rpb24gKGJ1ZnMsIG9sKSB7XG4gICAgaWYgKGJ1ZnMubGVuZ3RoID09PSAxKSByZXR1cm4gYnVmc1swXTtcbiAgICB2YXIgYnVmID0gbmV3IHU4KG9sKTtcbiAgICBmb3IgKHZhciBpID0gMCwgYiA9IDA7IGkgPCBidWZzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgY2hrID0gYnVmc1tpXTtcbiAgICAgIGJ1Zi5zZXQoY2hrLCBiKTtcbiAgICAgIGIgKz0gY2hrLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfTtcbiAgLyoqXG4gICAqIERlY29tcHJlc3NlcyBac3RhbmRhcmQgZGF0YVxuICAgKiBAcGFyYW0gZGF0IFRoZSBpbnB1dCBkYXRhXG4gICAqIEBwYXJhbSBidWYgVGhlIG91dHB1dCBidWZmZXIuIElmIHVuc3BlY2lmaWVkLCB0aGUgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZVxuICAgKiAgICAgICAgICAgIGV4YWN0bHkgZW5vdWdoIG1lbW9yeSB0byBmaXQgdGhlIGRlY29tcHJlc3NlZCBkYXRhLiBJZiB5b3VyXG4gICAqICAgICAgICAgICAgZGF0YSBoYXMgbXVsdGlwbGUgZnJhbWVzIGFuZCB5b3Uga25vdyB0aGUgb3V0cHV0IHNpemUsIHNwZWNpZnlpbmdcbiAgICogICAgICAgICAgICBpdCB3aWxsIHlpZWxkIGJldHRlciBwZXJmb3JtYW5jZS5cbiAgICogQHJldHVybnMgVGhlIGRlY29tcHJlc3NlZCBkYXRhXG4gICAqL1xuICByZXR1cm4gZnVuY3Rpb24gZGVjb21wcmVzcyhkYXQsIGJ1Zikge1xuICAgIHZhciBidCA9IDAsXG4gICAgICBidWZzID0gW10sXG4gICAgICBuYiA9ICshYnVmLFxuICAgICAgb2wgPSAwO1xuICAgIHdoaWxlIChkYXQubGVuZ3RoKSB7XG4gICAgICB2YXIgc3QgPSByemZoKGRhdCwgbmIgfHwgYnVmKTtcbiAgICAgIGlmICh0eXBlb2Ygc3QgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYgKG5iKSB7XG4gICAgICAgICAgYnVmID0gbnVsbDtcbiAgICAgICAgICBpZiAoc3Qudy5sZW5ndGggPT09IHN0LnUpIHtcbiAgICAgICAgICAgIGJ1ZnMucHVzaCgoYnVmID0gc3QudykpO1xuICAgICAgICAgICAgb2wgKz0gc3QudTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVmcy5wdXNoKGJ1Zik7XG4gICAgICAgICAgc3QuZSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKCFzdC5sKSB7XG4gICAgICAgICAgdmFyIGJsayA9IHJ6YihkYXQsIHN0LCBidWYpO1xuICAgICAgICAgIGlmICghYmxrKSBlcnIoNSk7XG4gICAgICAgICAgaWYgKGJ1Zikgc3QuZSA9IHN0Lnk7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBidWZzLnB1c2goYmxrKTtcbiAgICAgICAgICAgIG9sICs9IGJsay5sZW5ndGg7XG4gICAgICAgICAgICBjcHcoc3QudywgMCwgYmxrLmxlbmd0aCk7XG4gICAgICAgICAgICBzdC53LnNldChibGssIHN0LncubGVuZ3RoIC0gYmxrLmxlbmd0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJ0ID0gc3QuYiArIHN0LmMgKiA0O1xuICAgICAgfSBlbHNlIGJ0ID0gc3Q7XG4gICAgICBkYXQgPSBkYXQuc3ViYXJyYXkoYnQpO1xuICAgIH1cbiAgICByZXR1cm4gY2N0KGJ1ZnMsIG9sKTtcbiAgfTtcbn0pKCk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfZGVjb21wcmVzc19pbnB1dFxuLy9WZXJzaW9uOiA8IDUuMS4wXG52YXIgY2FtbF9kZWNvbXByZXNzX2lucHV0ID0gbnVsbDtcblxuLy9Qcm92aWRlczogY2FtbF9kZWNvbXByZXNzX2lucHV0XG4vL1ZlcnNpb246ID49IDUuMS4wXG4vL1ZlcnNpb246IDwgNS4xLjFcbi8vUmVxdWlyZXM6IHpzdGRfZGVjb21wcmVzc1xudmFyIGNhbWxfZGVjb21wcmVzc19pbnB1dCA9IHpzdGRfZGVjb21wcmVzcztcblxuLy9Qcm92aWRlczogY2FtbF9kZWNvbXByZXNzX2lucHV0XG4vL1ZlcnNpb246ID49IDUuMS4xXG4vL1ZlcnNpb246IDwgNS4yLjBcbnZhciBjYW1sX2RlY29tcHJlc3NfaW5wdXQgPSBudWxsO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2RlY29tcHJlc3NfaW5wdXRcbi8vVmVyc2lvbjogPj0gNS4yXG4vL1JlcXVpcmVzOiB6c3RkX2RlY29tcHJlc3NcbnZhciBjYW1sX2RlY29tcHJlc3NfaW5wdXQgPSB6c3RkX2RlY29tcHJlc3M7XG5cbi8vUHJvdmlkZXM6IGNhbWxfenN0ZF9pbml0aWFsaXplXG4vL1JlcXVpcmVzOiBjYW1sX2RlY29tcHJlc3NfaW5wdXRcbi8vUmVxdWlyZXM6IHpzdGRfZGVjb21wcmVzc1xuLy9WZXJzaW9uOiA+PSA1LjEuMVxuZnVuY3Rpb24gY2FtbF96c3RkX2luaXRpYWxpemUoX3VuaXQpIHtcbiAgY2FtbF9kZWNvbXByZXNzX2lucHV0ID0genN0ZF9kZWNvbXByZXNzO1xuICByZXR1cm4gMTtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLyBXZWFrIEFQSVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfa2V5X29mZnNldFxudmFyIGNhbWxfZXBoZV9rZXlfb2Zmc2V0ID0gMztcblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XG52YXIgY2FtbF9lcGhlX2RhdGFfb2Zmc2V0ID0gMjtcblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX25vbmVcbnZhciBjYW1sX2VwaGVfbm9uZSA9IHsgY2FtbF9lcGhlX25vbmU6IDAgfTtcblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX3NldF9rZXlcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9rZXlfb2Zmc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZ2V0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9zZXRfZGF0YV9vcHRcbmZ1bmN0aW9uIGNhbWxfZXBoZV9zZXRfa2V5KHgsIGksIHYpIHtcbiAgdmFyIG9sZCA9IGNhbWxfZXBoZV9nZXRfZGF0YSh4KTtcbiAgaWYgKGdsb2JhbFRoaXMuV2Vha1JlZiAmJiB2IGluc3RhbmNlb2YgT2JqZWN0KSB2ID0gbmV3IGdsb2JhbFRoaXMuV2Vha1JlZih2KTtcbiAgeFtjYW1sX2VwaGVfa2V5X29mZnNldCArIGldID0gdjtcbiAgY2FtbF9lcGhlX3NldF9kYXRhX29wdCh4LCBvbGQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX3Vuc2V0X2tleVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2tleV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9nZXRfZGF0YVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX3NldF9kYXRhX29wdFxuLy9SZXF1aXJlczogY2FtbF9lcGhlX25vbmVcbmZ1bmN0aW9uIGNhbWxfZXBoZV91bnNldF9rZXkoeCwgaSkge1xuICB2YXIgb2xkID0gY2FtbF9lcGhlX2dldF9kYXRhKHgpO1xuICB4W2NhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaV0gPSBjYW1sX2VwaGVfbm9uZTtcbiAgY2FtbF9lcGhlX3NldF9kYXRhX29wdCh4LCBvbGQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF93ZWFrX2NyZWF0ZVxuZnVuY3Rpb24gY2FtbF9lcGhlX2NyZWF0ZShuKSB7XG4gIHJldHVybiBjYW1sX3dlYWtfY3JlYXRlKG4pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3dlYWtfY3JlYXRlXG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfa2V5X29mZnNldFxuLy9SZXF1aXJlczogY2FtbF9lcGhlX25vbmVcbmZ1bmN0aW9uIGNhbWxfd2Vha19jcmVhdGUobikge1xuICB2YXIgYWxlbiA9IGNhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgbjtcbiAgdmFyIHggPSBuZXcgQXJyYXkoYWxlbik7XG4gIHhbMF0gPSAyNTE7XG4gIHhbMV0gPSBcImNhbWxfZXBoZV9saXN0X2hlYWRcIjtcbiAgZm9yICh2YXIgaSA9IDI7IGkgPCBhbGVuOyBpKyspIHtcbiAgICB4W2ldID0gY2FtbF9lcGhlX25vbmU7XG4gIH1cbiAgcmV0dXJuIHg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfd2Vha19zZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9zZXRfa2V5LCBjYW1sX2VwaGVfdW5zZXRfa2V5XG5mdW5jdGlvbiBjYW1sX3dlYWtfc2V0KHgsIGksIHYpIHtcbiAgaWYgKHYgPT09IDApIGNhbWxfZXBoZV91bnNldF9rZXkoeCwgaSk7XG4gIGVsc2UgY2FtbF9lcGhlX3NldF9rZXkoeCwgaSwgdlsxXSk7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2dldF9rZXlcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9rZXlfb2Zmc2V0LCBjYW1sX2VwaGVfZGF0YV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9ub25lXG4vL0FsaWFzOiBjYW1sX3dlYWtfZ2V0XG5cbmZ1bmN0aW9uIGNhbWxfZXBoZV9nZXRfa2V5KHgsIGkpIHtcbiAgdmFyIHdlYWsgPSB4W2NhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaV07XG4gIGlmICh3ZWFrID09PSBjYW1sX2VwaGVfbm9uZSkgcmV0dXJuIDA7XG4gIGlmIChnbG9iYWxUaGlzLldlYWtSZWYgJiYgd2VhayBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuV2Vha1JlZikge1xuICAgIHdlYWsgPSB3ZWFrLmRlcmVmKCk7XG4gICAgaWYgKHdlYWsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgeFtjYW1sX2VwaGVfa2V5X29mZnNldCArIGldID0gY2FtbF9lcGhlX25vbmU7XG4gICAgICB4W2NhbWxfZXBoZV9kYXRhX29mZnNldF0gPSBjYW1sX2VwaGVfbm9uZTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gWzAsIHdlYWtdO1xufVxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2dldF9rZXlfY29weVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2dldF9rZXksY2FtbF9lcGhlX2tleV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfb2JqX2R1cFxuLy9BbGlhczogY2FtbF93ZWFrX2dldF9jb3B5XG5mdW5jdGlvbiBjYW1sX2VwaGVfZ2V0X2tleV9jb3B5KHgsIGkpIHtcbiAgdmFyIHkgPSBjYW1sX2VwaGVfZ2V0X2tleSh4LCBpKTtcbiAgaWYgKHkgPT09IDApIHJldHVybiB5O1xuICB2YXIgeiA9IHlbMV07XG4gIGlmIChBcnJheS5pc0FycmF5KHopKSByZXR1cm4gWzAsIGNhbWxfb2JqX2R1cCh6KV07XG4gIHJldHVybiB5O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfY2hlY2tfa2V5IG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9rZXlfb2Zmc2V0LCBjYW1sX2VwaGVfZGF0YV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9ub25lXG4vL0FsaWFzOiBjYW1sX3dlYWtfY2hlY2tcbmZ1bmN0aW9uIGNhbWxfZXBoZV9jaGVja19rZXkoeCwgaSkge1xuICB2YXIgd2VhayA9IHhbY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBpXTtcbiAgaWYgKHdlYWsgPT09IGNhbWxfZXBoZV9ub25lKSByZXR1cm4gMDtcbiAgaWYgKGdsb2JhbFRoaXMuV2Vha1JlZiAmJiB3ZWFrIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5XZWFrUmVmKSB7XG4gICAgd2VhayA9IHdlYWsuZGVyZWYoKTtcbiAgICBpZiAod2VhayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB4W2NhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaV0gPSBjYW1sX2VwaGVfbm9uZTtcbiAgICAgIHhbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XSA9IGNhbWxfZXBoZV9ub25lO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG4gIHJldHVybiAxO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfYmxpdF9rZXlcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYmxpdFxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2tleV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9nZXRfZGF0YVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX3NldF9kYXRhX29wdFxuLy9BbGlhczogY2FtbF93ZWFrX2JsaXRcbmZ1bmN0aW9uIGNhbWxfZXBoZV9ibGl0X2tleShhMSwgaTEsIGEyLCBpMiwgbGVuKSB7XG4gIHZhciBvbGQgPSBjYW1sX2VwaGVfZ2V0X2RhdGEoYTEpO1xuICAvLyBtaW51cyBvbmUgYmVjYXVzZSBjYW1sX2FycmF5X2JsaXQgd29ya3Mgb24gb2NhbWwgYXJyYXlcbiAgY2FtbF9hcnJheV9ibGl0KFxuICAgIGExLFxuICAgIGNhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaTEgLSAxLFxuICAgIGEyLFxuICAgIGNhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaTIgLSAxLFxuICAgIGxlbixcbiAgKTtcbiAgY2FtbF9lcGhlX3NldF9kYXRhX29wdChhMiwgb2xkKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9ibGl0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9nZXRfZGF0YSwgY2FtbF9lcGhlX3NldF9kYXRhX29wdFxuZnVuY3Rpb24gY2FtbF9lcGhlX2JsaXRfZGF0YShzcmMsIGRzdCkge1xuICB2YXIgb2xkID0gY2FtbF9lcGhlX2dldF9kYXRhKHNyYyk7XG4gIGNhbWxfZXBoZV9zZXRfZGF0YV9vcHQoZHN0LCBvbGQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2dldF9kYXRhXG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZGF0YV9vZmZzZXQsIGNhbWxfZXBoZV9rZXlfb2Zmc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfbm9uZVxuZnVuY3Rpb24gY2FtbF9lcGhlX2dldF9kYXRhKHgpIHtcbiAgdmFyIGRhdGEgPSB4W2NhbWxfZXBoZV9kYXRhX29mZnNldF07XG4gIGlmIChkYXRhID09PSBjYW1sX2VwaGVfbm9uZSkgcmV0dXJuIDA7XG4gIGZvciAodmFyIGkgPSBjYW1sX2VwaGVfa2V5X29mZnNldDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgayA9IHhbaV07XG4gICAgaWYgKGdsb2JhbFRoaXMuV2Vha1JlZiAmJiBrIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5XZWFrUmVmKSB7XG4gICAgICB2YXIgZCA9IGsuZGVyZWYoKTtcbiAgICAgIGlmIChkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgeFtpXSA9IGNhbWxfZXBoZV9ub25lO1xuICAgICAgICB4W2NhbWxfZXBoZV9kYXRhX29mZnNldF0gPSBjYW1sX2VwaGVfbm9uZTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBpZiAoZ2xvYmFsVGhpcy5XZWFrTWFwKSB7XG4gICAgICAgIGRhdGEgPSBkYXRhLmdldChrKTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHhbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XSA9IGNhbWxfZXBoZV9ub25lO1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbMCwgZGF0YV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9nZXRfZGF0YV9jb3B5XG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZ2V0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfb2JqX2R1cFxuZnVuY3Rpb24gY2FtbF9lcGhlX2dldF9kYXRhX2NvcHkoeCkge1xuICB2YXIgciA9IGNhbWxfZXBoZV9nZXRfZGF0YSh4KTtcbiAgaWYgKHIgPT09IDApIHJldHVybiAwO1xuICB2YXIgeiA9IHJbMV07XG4gIGlmIChBcnJheS5pc0FycmF5KHopKSByZXR1cm4gWzAsIGNhbWxfb2JqX2R1cCh6KV07XG4gIHJldHVybiByO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfc2V0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9kYXRhX29mZnNldCwgY2FtbF9lcGhlX2tleV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9ub25lXG5mdW5jdGlvbiBjYW1sX2VwaGVfc2V0X2RhdGEoeCwgZGF0YSkge1xuICBmb3IgKHZhciBpID0geC5sZW5ndGggLSAxOyBpID49IGNhbWxfZXBoZV9rZXlfb2Zmc2V0OyBpLS0pIHtcbiAgICB2YXIgayA9IHhbaV07XG4gICAgaWYgKGdsb2JhbFRoaXMuV2Vha1JlZiAmJiBrIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5XZWFrUmVmKSB7XG4gICAgICB2YXIgZCA9IGsuZGVyZWYoKTtcbiAgICAgIGlmIChkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgeFtpXSA9IGNhbWxfZXBoZV9ub25lO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChnbG9iYWxUaGlzLldlYWtNYXApIHtcbiAgICAgICAgZGF0YSA9IG5ldyBnbG9iYWxUaGlzLldlYWtNYXAoKS5zZXQoaywgZGF0YSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHhbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XSA9IGRhdGE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfc2V0X2RhdGFfb3B0XG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfc2V0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV91bnNldF9kYXRhXG5mdW5jdGlvbiBjYW1sX2VwaGVfc2V0X2RhdGFfb3B0KHgsIGRhdGFfb3B0KSB7XG4gIGlmIChkYXRhX29wdCA9PT0gMCkgY2FtbF9lcGhlX3Vuc2V0X2RhdGEoeCk7XG4gIGVsc2UgY2FtbF9lcGhlX3NldF9kYXRhKHgsIGRhdGFfb3B0WzFdKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV91bnNldF9kYXRhXG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZGF0YV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9ub25lXG5mdW5jdGlvbiBjYW1sX2VwaGVfdW5zZXRfZGF0YSh4KSB7XG4gIHhbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XSA9IGNhbWxfZXBoZV9ub25lO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2NoZWNrX2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9nZXRfZGF0YVxuZnVuY3Rpb24gY2FtbF9lcGhlX2NoZWNrX2RhdGEoeCkge1xuICB2YXIgZGF0YSA9IGNhbWxfZXBoZV9nZXRfZGF0YSh4KTtcbiAgaWYgKGRhdGEgPT09IDApIHJldHVybiAwO1xuICBlbHNlIHJldHVybiAxO1xufVxuIiwiLy9Qcm92aWRlczogY2FtbF9nY19taW5vclxuZnVuY3Rpb24gY2FtbF9nY19taW5vcihfdW5pdCkge1xuICAvL2F2YWlsYWJsZSB3aXRoIFtub2RlIC0tZXhwb3NlLWdjXVxuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMuZ2MgPT09IFwiZnVuY3Rpb25cIikgZ2xvYmFsVGhpcy5nYyh0cnVlKTtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2djX21ham9yXG5mdW5jdGlvbiBjYW1sX2djX21ham9yKF91bml0KSB7XG4gIC8vYXZhaWxhYmxlIHdpdGggW25vZGUgLS1leHBvc2UtZ2NdXG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy5nYyA9PT0gXCJmdW5jdGlvblwiKSBnbG9iYWxUaGlzLmdjKCk7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9nY19mdWxsX21ham9yXG5mdW5jdGlvbiBjYW1sX2djX2Z1bGxfbWFqb3IoX3VuaXQpIHtcbiAgLy9hdmFpbGFibGUgd2l0aCBbbm9kZSAtLWV4cG9zZS1nY11cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLmdjID09PSBcImZ1bmN0aW9uXCIpIGdsb2JhbFRoaXMuZ2MoKTtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2djX2NvbXBhY3Rpb25cbmZ1bmN0aW9uIGNhbWxfZ2NfY29tcGFjdGlvbihfdW5pdCkge1xuICByZXR1cm4gMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ2NfY291bnRlcnNcbmZ1bmN0aW9uIGNhbWxfZ2NfY291bnRlcnMoX3VuaXQpIHtcbiAgcmV0dXJuIFsyNTQsIDAsIDAsIDBdO1xufVxuLy9Qcm92aWRlczogY2FtbF9nY19xdWlja19zdGF0XG5mdW5jdGlvbiBjYW1sX2djX3F1aWNrX3N0YXQoX3VuaXQpIHtcbiAgcmV0dXJuIFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9nY19zdGF0XG4vL1JlcXVpcmVzOiBjYW1sX2djX3F1aWNrX3N0YXRcbmZ1bmN0aW9uIGNhbWxfZ2Nfc3RhdCh1bml0KSB7XG4gIHJldHVybiBjYW1sX2djX3F1aWNrX3N0YXQodW5pdCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2Nfc2V0XG5mdW5jdGlvbiBjYW1sX2djX3NldChfY29udHJvbCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9nY19nZXRcbmZ1bmN0aW9uIGNhbWxfZ2NfZ2V0KF91bml0KSB7XG4gIHJldHVybiBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmluYWxfcmVnaXN0ZXIgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZmluYWxfcmVnaXN0ZXIoX2YsIF94KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZpbmFsX3JlZ2lzdGVyX2NhbGxlZF93aXRob3V0X3ZhbHVlXG52YXIgYWxsX2ZpbmFsaXplcnMgPSBuZXcgZ2xvYmFsVGhpcy5TZXQoKTtcbmZ1bmN0aW9uIGNhbWxfZmluYWxfcmVnaXN0ZXJfY2FsbGVkX3dpdGhvdXRfdmFsdWUoY2IsIGEpIHtcbiAgaWYgKGdsb2JhbFRoaXMuRmluYWxpemF0aW9uUmVnaXN0cnkgJiYgYSBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgIHZhciB4ID0gbmV3IGdsb2JhbFRoaXMuRmluYWxpemF0aW9uUmVnaXN0cnkoZnVuY3Rpb24gKHgpIHtcbiAgICAgIGFsbF9maW5hbGl6ZXJzLmRlbGV0ZSh4KTtcbiAgICAgIGNiKDApO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICAgIHgucmVnaXN0ZXIoYSwgeCk7XG4gICAgYWxsX2ZpbmFsaXplcnMuYWRkKHgpO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZpbmFsX3JlbGVhc2UgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZmluYWxfcmVsZWFzZShfdW5pdCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tZW1wcm9mX3N0YXJ0XG5mdW5jdGlvbiBjYW1sX21lbXByb2Zfc3RhcnQoX3JhdGUsIF9zdGFja19zaXplLCBfdHJhY2tlcikge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tZW1wcm9mX3N0b3BcbmZ1bmN0aW9uIGNhbWxfbWVtcHJvZl9zdG9wKF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21lbXByb2ZfZGlzY2FyZFxuLy9WZXJzaW9uOiA+PSA1LjJcbmZ1bmN0aW9uIGNhbWxfbWVtcHJvZl9kaXNjYXJkKF90KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2V2ZW50bG9nX3Jlc3VtZVxuLy9WZXJzaW9uOiA8IDUuMFxuZnVuY3Rpb24gY2FtbF9ldmVudGxvZ19yZXN1bWUoX3VuaXQpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXZlbnRsb2dfcGF1c2Vcbi8vVmVyc2lvbjogPCA1LjBcbmZ1bmN0aW9uIGNhbWxfZXZlbnRsb2dfcGF1c2UoX3VuaXQpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2NfaHVnZV9mYWxsYmFja19jb3VudFxuLy9WZXJzaW9uOiA8IDUuMFxuZnVuY3Rpb24gY2FtbF9nY19odWdlX2ZhbGxiYWNrX2NvdW50KF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2djX21ham9yX3NsaWNlXG5mdW5jdGlvbiBjYW1sX2djX21ham9yX3NsaWNlKF93b3JrKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2djX21pbm9yX3dvcmRzXG5mdW5jdGlvbiBjYW1sX2djX21pbm9yX3dvcmRzKF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9taW5vcl9mcmVlXG5mdW5jdGlvbiBjYW1sX2dldF9taW5vcl9mcmVlKF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9tYWpvcl9idWNrZXRcbi8vVmVyc2lvbjogPCA1LjBcbmZ1bmN0aW9uIGNhbWxfZ2V0X21ham9yX2J1Y2tldChfbikge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9nZXRfbWFqb3JfY3JlZGl0XG4vL1ZlcnNpb246IDwgNS4wXG5mdW5jdGlvbiBjYW1sX2dldF9tYWpvcl9jcmVkaXQoX24pIHtcbiAgcmV0dXJuIDA7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLy8vLy8vLy8vLy8vIEZvcm1hdFxuXG4vL1Byb3ZpZGVzOiBjYW1sX3BhcnNlX2Zvcm1hdFxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZywgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX3BhcnNlX2Zvcm1hdChmbXQpIHtcbiAgZm10ID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhmbXQpO1xuICB2YXIgbGVuID0gZm10Lmxlbmd0aDtcbiAgaWYgKGxlbiA+IDMxKSBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJmb3JtYXRfaW50OiBmb3JtYXQgdG9vIGxvbmdcIik7XG4gIHZhciBmID0ge1xuICAgIGp1c3RpZnk6IFwiK1wiLFxuICAgIHNpZ25zdHlsZTogXCItXCIsXG4gICAgZmlsbGVyOiBcIiBcIixcbiAgICBhbHRlcm5hdGU6IGZhbHNlLFxuICAgIGJhc2U6IDAsXG4gICAgc2lnbmVkY29udjogZmFsc2UsXG4gICAgd2lkdGg6IDAsXG4gICAgdXBwZXJjYXNlOiBmYWxzZSxcbiAgICBzaWduOiAxLFxuICAgIHByZWM6IC0xLFxuICAgIGNvbnY6IFwiZlwiLFxuICB9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIGMgPSBmbXQuY2hhckF0KGkpO1xuICAgIHN3aXRjaCAoYykge1xuICAgICAgY2FzZSBcIi1cIjpcbiAgICAgICAgZi5qdXN0aWZ5ID0gXCItXCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIitcIjpcbiAgICAgIGNhc2UgXCIgXCI6XG4gICAgICAgIGYuc2lnbnN0eWxlID0gYztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiMFwiOlxuICAgICAgICBmLmZpbGxlciA9IFwiMFwiO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCIjXCI6XG4gICAgICAgIGYuYWx0ZXJuYXRlID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiMVwiOlxuICAgICAgY2FzZSBcIjJcIjpcbiAgICAgIGNhc2UgXCIzXCI6XG4gICAgICBjYXNlIFwiNFwiOlxuICAgICAgY2FzZSBcIjVcIjpcbiAgICAgIGNhc2UgXCI2XCI6XG4gICAgICBjYXNlIFwiN1wiOlxuICAgICAgY2FzZSBcIjhcIjpcbiAgICAgIGNhc2UgXCI5XCI6XG4gICAgICAgIGYud2lkdGggPSAwO1xuICAgICAgICB3aGlsZSAoKChjID0gZm10LmNoYXJDb2RlQXQoaSkgLSA0OCksIGMgPj0gMCAmJiBjIDw9IDkpKSB7XG4gICAgICAgICAgZi53aWR0aCA9IGYud2lkdGggKiAxMCArIGM7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGktLTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiLlwiOlxuICAgICAgICBmLnByZWMgPSAwO1xuICAgICAgICBpKys7XG4gICAgICAgIHdoaWxlICgoKGMgPSBmbXQuY2hhckNvZGVBdChpKSAtIDQ4KSwgYyA+PSAwICYmIGMgPD0gOSkpIHtcbiAgICAgICAgICBmLnByZWMgPSBmLnByZWMgKiAxMCArIGM7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGktLTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZFwiOlxuICAgICAgY2FzZSBcImlcIjpcbiAgICAgICAgZi5zaWduZWRjb252ID0gdHJ1ZTtcbiAgICAgICAgZi5iYXNlID0gMTA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInVcIjpcbiAgICAgICAgZi5iYXNlID0gMTA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgZi5iYXNlID0gMTY7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIlhcIjpcbiAgICAgICAgZi5iYXNlID0gMTY7XG4gICAgICAgIGYudXBwZXJjYXNlID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwib1wiOlxuICAgICAgICBmLmJhc2UgPSA4O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJlXCI6XG4gICAgICBjYXNlIFwiZlwiOlxuICAgICAgY2FzZSBcImdcIjpcbiAgICAgICAgZi5zaWduZWRjb252ID0gdHJ1ZTtcbiAgICAgICAgZi5jb252ID0gYztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiRVwiOlxuICAgICAgY2FzZSBcIkZcIjpcbiAgICAgIGNhc2UgXCJHXCI6XG4gICAgICAgIGYuc2lnbmVkY29udiA9IHRydWU7XG4gICAgICAgIGYudXBwZXJjYXNlID0gdHJ1ZTtcbiAgICAgICAgZi5jb252ID0gYy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGY7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmluaXNoX2Zvcm1hdHRpbmdcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfZmluaXNoX2Zvcm1hdHRpbmcoZiwgcmF3YnVmZmVyKSB7XG4gIGlmIChmLnVwcGVyY2FzZSkgcmF3YnVmZmVyID0gcmF3YnVmZmVyLnRvVXBwZXJDYXNlKCk7XG4gIHZhciBsZW4gPSByYXdidWZmZXIubGVuZ3RoO1xuICAvKiBBZGp1c3QgbGVuIHRvIHJlZmxlY3QgYWRkaXRpb25hbCBjaGFycyAoc2lnbiwgZXRjKSAqL1xuICBpZiAoZi5zaWduZWRjb252ICYmIChmLnNpZ24gPCAwIHx8IGYuc2lnbnN0eWxlICE9PSBcIi1cIikpIGxlbisrO1xuICBpZiAoZi5hbHRlcm5hdGUpIHtcbiAgICBpZiAoZi5iYXNlID09PSA4KSBsZW4gKz0gMTtcbiAgICBpZiAoZi5iYXNlID09PSAxNikgbGVuICs9IDI7XG4gIH1cbiAgLyogRG8gdGhlIGZvcm1hdHRpbmcgKi9cbiAgdmFyIGJ1ZmZlciA9IFwiXCI7XG4gIGlmIChmLmp1c3RpZnkgPT09IFwiK1wiICYmIGYuZmlsbGVyID09PSBcIiBcIilcbiAgICBmb3IgKHZhciBpID0gbGVuOyBpIDwgZi53aWR0aDsgaSsrKSBidWZmZXIgKz0gXCIgXCI7XG4gIGlmIChmLnNpZ25lZGNvbnYpIHtcbiAgICBpZiAoZi5zaWduIDwgMCkgYnVmZmVyICs9IFwiLVwiO1xuICAgIGVsc2UgaWYgKGYuc2lnbnN0eWxlICE9PSBcIi1cIikgYnVmZmVyICs9IGYuc2lnbnN0eWxlO1xuICB9XG4gIGlmIChmLmFsdGVybmF0ZSAmJiBmLmJhc2UgPT09IDgpIGJ1ZmZlciArPSBcIjBcIjtcbiAgaWYgKGYuYWx0ZXJuYXRlICYmIGYuYmFzZSA9PT0gMTYpIGJ1ZmZlciArPSBmLnVwcGVyY2FzZSA/IFwiMFhcIiA6IFwiMHhcIjtcbiAgaWYgKGYuanVzdGlmeSA9PT0gXCIrXCIgJiYgZi5maWxsZXIgPT09IFwiMFwiKVxuICAgIGZvciAodmFyIGkgPSBsZW47IGkgPCBmLndpZHRoOyBpKyspIGJ1ZmZlciArPSBcIjBcIjtcbiAgYnVmZmVyICs9IHJhd2J1ZmZlcjtcbiAgaWYgKGYuanVzdGlmeSA9PT0gXCItXCIpIGZvciAodmFyIGkgPSBsZW47IGkgPCBmLndpZHRoOyBpKyspIGJ1ZmZlciArPSBcIiBcIjtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoYnVmZmVyKTtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxNCBIdWdvIEhldXphcmRcblxuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cblxuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG5cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc3RhdGVcbnZhciBjYW1sX2dyX3N0YXRlO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3N0YXRlX2dldFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZVxuLy9SZXF1aXJlczogY2FtbF9uYW1lZF92YWx1ZSwgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlXG5mdW5jdGlvbiBjYW1sX2dyX3N0YXRlX2dldCgpIHtcbiAgaWYgKGNhbWxfZ3Jfc3RhdGUpIHtcbiAgICByZXR1cm4gY2FtbF9ncl9zdGF0ZTtcbiAgfVxuICB0aHJvdyBjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UoW1xuICAgIDAsXG4gICAgY2FtbF9uYW1lZF92YWx1ZShcIkdyYXBoaWNzLkdyYXBoaWNfZmFpbHVyZVwiKSxcbiAgICBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwiTm90IGluaXRpYWxpemVkXCIpLFxuICBdKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc3RhdGVfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlLGNhbWxfZ3Jfc3RhdGVfaW5pdFxuZnVuY3Rpb24gY2FtbF9ncl9zdGF0ZV9zZXQoY3R4KSB7XG4gIGNhbWxfZ3Jfc3RhdGUgPSBjdHg7XG4gIGNhbWxfZ3Jfc3RhdGVfaW5pdCgpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9vcGVuX2dyYXBoXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9zZXRcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX29wZW5fZ3JhcGgoaW5mbykge1xuICB2YXIgaW5mbyA9IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKGluZm8pO1xuICBmdW5jdGlvbiBnZXQobmFtZSkge1xuICAgIHZhciByZXMgPSBpbmZvLm1hdGNoKFwiKF58LCkgKlwiICsgbmFtZSArIFwiICo9ICooW2EtekEtWjAtOV9dKykgKigsfCQpXCIpO1xuICAgIGlmIChyZXMpIHJldHVybiByZXNbMl07XG4gIH1cbiAgdmFyIHNwZWNzID0gW107XG4gIGlmICghKGluZm8gPT09IFwiXCIpKSBzcGVjcy5wdXNoKGluZm8pO1xuICB2YXIgdGFyZ2V0ID0gZ2V0KFwidGFyZ2V0XCIpO1xuICBpZiAoIXRhcmdldCkgdGFyZ2V0ID0gXCJcIjtcbiAgdmFyIHN0YXR1cyA9IGdldChcInN0YXR1c1wiKTtcbiAgaWYgKCFzdGF0dXMpIHNwZWNzLnB1c2goXCJzdGF0dXM9MVwiKTtcblxuICB2YXIgdyA9IGdldChcIndpZHRoXCIpO1xuICB3ID0gdyA/IE51bWJlci5wYXJzZUludCh3KSA6IDIwMDtcbiAgc3BlY3MucHVzaChcIndpZHRoPVwiICsgdyk7XG5cbiAgdmFyIGggPSBnZXQoXCJoZWlnaHRcIik7XG4gIGggPSBoID8gTnVtYmVyLnBhcnNlSW50KGgpIDogMjAwO1xuICBzcGVjcy5wdXNoKFwiaGVpZ2h0PVwiICsgaCk7XG5cbiAgdmFyIHdpbiA9IGdsb2JhbFRoaXMub3BlbihcImFib3V0OmJsYW5rXCIsIHRhcmdldCwgc3BlY3Muam9pbihcIixcIikpO1xuICBpZiAoIXdpbikge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJHcmFwaGljcy5vcGVuX2dyYXBoOiBjYW5ub3Qgb3BlbiB0aGUgd2luZG93XCIpO1xuICB9XG4gIHZhciBkb2MgPSB3aW4uZG9jdW1lbnQ7XG4gIHZhciBjYW52YXMgPSBkb2MuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY2FudmFzLndpZHRoID0gdztcbiAgY2FudmFzLmhlaWdodCA9IGg7XG4gIHZhciBjdHggPSBjYW1sX2dyX3N0YXRlX2NyZWF0ZShjYW52YXMsIHcsIGgpO1xuICBjdHguc2V0X3RpdGxlID0gZnVuY3Rpb24gKHRpdGxlKSB7XG4gICAgZG9jLnRpdGxlID0gdGl0bGU7XG4gIH07XG4gIGNhbWxfZ3Jfc3RhdGVfc2V0KGN0eCk7XG4gIHZhciBib2R5ID0gZG9jLmJvZHk7XG4gIGJvZHkuc3R5bGUubWFyZ2luID0gXCIwcHhcIjtcbiAgYm9keS5hcHBlbmRDaGlsZChjYW52YXMpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zdGF0ZV9pbml0XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3NldF9jb2xvcixjYW1sX2dyX21vdmV0byxjYW1sX2dyX3Jlc2l6ZV93aW5kb3dcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc2V0X2xpbmVfd2lkdGgsY2FtbF9ncl9zZXRfdGV4dF9zaXplLGNhbWxfZ3Jfc2V0X2ZvbnRcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc2V0X3dpbmRvd190aXRsZVxuZnVuY3Rpb24gY2FtbF9ncl9zdGF0ZV9pbml0KCkge1xuICBjYW1sX2dyX21vdmV0byhjYW1sX2dyX3N0YXRlLngsIGNhbWxfZ3Jfc3RhdGUueSk7XG4gIGNhbWxfZ3JfcmVzaXplX3dpbmRvdyhjYW1sX2dyX3N0YXRlLndpZHRoLCBjYW1sX2dyX3N0YXRlLmhlaWdodCk7XG4gIGNhbWxfZ3Jfc2V0X2xpbmVfd2lkdGgoY2FtbF9ncl9zdGF0ZS5saW5lX3dpZHRoKTtcbiAgY2FtbF9ncl9zZXRfdGV4dF9zaXplKGNhbWxfZ3Jfc3RhdGUudGV4dF9zaXplKTtcbiAgY2FtbF9ncl9zZXRfZm9udChjYW1sX2dyX3N0YXRlLmZvbnQpO1xuICBjYW1sX2dyX3NldF9jb2xvcihjYW1sX2dyX3N0YXRlLmNvbG9yKTtcbiAgY2FtbF9ncl9zZXRfd2luZG93X3RpdGxlKGNhbWxfZ3Jfc3RhdGUudGl0bGUpO1xuICAvL2NhbWxfZ3JfcmVzaXplX3dpbmRvdyBtaWdodCByZXNldCBzb21lIGNhbnZhcycgcHJvcGVydGllc1xuICBjYW1sX2dyX3N0YXRlLmNvbnRleHQudGV4dEJhc2VsaW5lID0gXCJib3R0b21cIjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zdGF0ZV9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfZ3Jfc3RhdGVfY3JlYXRlKGNhbnZhcywgdywgaCkge1xuICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gIHJldHVybiB7XG4gICAgY29udGV4dDogY29udGV4dCxcbiAgICBjYW52YXM6IGNhbnZhcyxcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgd2lkdGg6IHcsXG4gICAgaGVpZ2h0OiBoLFxuICAgIGxpbmVfd2lkdGg6IDEsXG4gICAgZm9udDogY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcImZpeGVkXCIpLFxuICAgIHRleHRfc2l6ZTogMjYsXG4gICAgY29sb3I6IDB4MDAwMDAwLFxuICAgIHRpdGxlOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwiXCIpLFxuICB9O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2RvY19vZl9zdGF0ZVxuZnVuY3Rpb24gY2FtbF9ncl9kb2Nfb2Zfc3RhdGUoc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmNhbnZhcy5vd25lckRvY3VtZW50KSByZXR1cm4gc3RhdGUuY2FudmFzLm93bmVyRG9jdW1lbnQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY2xvc2VfZ3JhcGhcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2Nsb3NlX2dyYXBoKCkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY2FudmFzLndpZHRoID0gMDtcbiAgcy5jYW52YXMuaGVpZ2h0ID0gMDtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2V0X3dpbmRvd190aXRsZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX3NldF93aW5kb3dfdGl0bGUobmFtZSkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMudGl0bGUgPSBuYW1lO1xuICB2YXIganNuYW1lID0gY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcobmFtZSk7XG4gIGlmIChzLnNldF90aXRsZSkgcy5zZXRfdGl0bGUoanNuYW1lKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfcmVzaXplX3dpbmRvd1xuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfcmVzaXplX3dpbmRvdyh3LCBoKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy53aWR0aCA9IHc7XG4gIHMuaGVpZ2h0ID0gaDtcbiAgaWYgKHcgIT09IHMuY2FudmFzLndpZHRoKSBzLmNhbnZhcy53aWR0aCA9IHc7XG4gIGlmIChoICE9PSBzLmNhbnZhcy5oZWlnaHQpIHMuY2FudmFzLmhlaWdodCA9IGg7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2NsZWFyX2dyYXBoXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jbGVhcl9ncmFwaCgpIHtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHMuY2FudmFzLndpZHRoLCBzLmNhbnZhcy5oZWlnaHQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zaXplX3hcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX3NpemVfeCgpIHtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICByZXR1cm4gcy53aWR0aDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2l6ZV95XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9zaXplX3koKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcmV0dXJuIHMuaGVpZ2h0O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3NldF9jb2xvclxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3Jfc2V0X2NvbG9yKGNvbG9yKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgZnVuY3Rpb24gY29udmVydChudW1iZXIpIHtcbiAgICB2YXIgc3RyID0gXCJcIiArIG51bWJlci50b1N0cmluZygxNik7XG4gICAgd2hpbGUgKHN0ci5sZW5ndGggPCAyKSBzdHIgPSBcIjBcIiArIHN0cjtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHZhciByID0gKGNvbG9yID4+IDE2KSAmIDB4ZmYsXG4gICAgZyA9IChjb2xvciA+PiA4KSAmIDB4ZmYsXG4gICAgYiA9IChjb2xvciA+PiAwKSAmIDB4ZmY7XG4gIHMuY29sb3IgPSBjb2xvcjtcbiAgdmFyIGNfc3RyID0gXCIjXCIgKyBjb252ZXJ0KHIpICsgY29udmVydChnKSArIGNvbnZlcnQoYik7XG4gIHMuY29udGV4dC5maWxsU3R5bGUgPSBjX3N0cjtcbiAgcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gY19zdHI7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9wbG90XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9wbG90KHgsIHkpIHtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICB2YXIgaW0gPSBzLmNvbnRleHQuY3JlYXRlSW1hZ2VEYXRhKDEsIDEpO1xuICB2YXIgZCA9IGltLmRhdGE7XG4gIHZhciBjb2xvciA9IHMuY29sb3I7XG4gIGRbMF0gPSAoY29sb3IgPj4gMTYpICYgMHhmZjsgLy9yXG4gIChkWzFdID1cbiAgICAoY29sb3IgPj4gOCkgJlxuICAgIDB4ZmYpLCAvL2dcbiAgICAoZFsyXSA9IChjb2xvciA+PiAwKSAmIDB4ZmYpOyAvL2JcbiAgZFszXSA9IDB4ZmY7IC8vYVxuICBzLnggPSB4O1xuICBzLnkgPSB5O1xuICBzLmNvbnRleHQucHV0SW1hZ2VEYXRhKGltLCB4LCBzLmhlaWdodCAtIHkpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9wb2ludF9jb2xvclxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfcG9pbnRfY29sb3IoeCwgeSkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciBpbSA9IHMuY29udGV4dC5nZXRJbWFnZURhdGEoeCwgcy5oZWlnaHQgLSB5LCAxLCAxKTtcbiAgdmFyIGQgPSBpbS5kYXRhO1xuICByZXR1cm4gKGRbMF0gPDwgMTYpICsgKGRbMV0gPDwgOCkgKyBkWzJdO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9tb3ZldG9cbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX21vdmV0byh4LCB5KSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy54ID0geDtcbiAgcy55ID0geTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY3VycmVudF94XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jdXJyZW50X3goKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcmV0dXJuIHMueDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY3VycmVudF95XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jdXJyZW50X3koKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcmV0dXJuIHMueTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfbGluZXRvXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9saW5ldG8oeCwgeSkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY29udGV4dC5iZWdpblBhdGgoKTtcbiAgcy5jb250ZXh0Lm1vdmVUbyhzLngsIHMuaGVpZ2h0IC0gcy55KTtcbiAgcy5jb250ZXh0LmxpbmVUbyh4LCBzLmhlaWdodCAtIHkpO1xuICBzLmNvbnRleHQuc3Ryb2tlKCk7XG4gIHMueCA9IHg7XG4gIHMueSA9IHk7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9kcmF3X3JlY3Rcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2RyYXdfcmVjdCh4LCB5LCB3LCBoKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5jb250ZXh0LnN0cm9rZVJlY3QoeCwgcy5oZWlnaHQgLSB5LCB3LCAtaCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2FyY19hdXhcbmZ1bmN0aW9uIGNhbWxfZ3JfYXJjX2F1eChjdHgsIGN4LCBjeSwgcnksIHJ4LCBhMSwgYTIpIHtcbiAgd2hpbGUgKGExID4gYTIpIGEyICs9IDM2MDtcbiAgYTEgLz0gMTgwO1xuICBhMiAvPSAxODA7XG4gIHZhciByb3QgPSAwLFxuICAgIHhQb3MsXG4gICAgeVBvcyxcbiAgICB4UG9zX3ByZXYsXG4gICAgeVBvc19wcmV2O1xuICB2YXIgc3BhY2UgPSAyO1xuICB2YXIgbnVtID0gKCgoYTIgLSBhMSkgKiBNYXRoLlBJICogKChyeCArIHJ5KSAvIDIpKSAvIHNwYWNlKSB8IDA7XG4gIHZhciBkZWx0YSA9ICgoYTIgLSBhMSkgKiBNYXRoLlBJKSAvIG51bTtcbiAgdmFyIGkgPSBhMSAqIE1hdGguUEk7XG4gIGZvciAodmFyIGogPSAwOyBqIDw9IG51bTsgaisrKSB7XG4gICAgeFBvcyA9XG4gICAgICBjeCAtXG4gICAgICByeCAqIE1hdGguc2luKGkpICogTWF0aC5zaW4ocm90ICogTWF0aC5QSSkgK1xuICAgICAgcnkgKiBNYXRoLmNvcyhpKSAqIE1hdGguY29zKHJvdCAqIE1hdGguUEkpO1xuICAgIHhQb3MgPSB4UG9zLnRvRml4ZWQoMik7XG4gICAgeVBvcyA9XG4gICAgICBjeSArXG4gICAgICByeSAqIE1hdGguY29zKGkpICogTWF0aC5zaW4ocm90ICogTWF0aC5QSSkgK1xuICAgICAgcnggKiBNYXRoLnNpbihpKSAqIE1hdGguY29zKHJvdCAqIE1hdGguUEkpO1xuICAgIHlQb3MgPSB5UG9zLnRvRml4ZWQoMik7XG4gICAgaWYgKGogPT09IDApIHtcbiAgICAgIGN0eC5tb3ZlVG8oeFBvcywgeVBvcyk7XG4gICAgfSBlbHNlIGlmICh4UG9zX3ByZXYgIT09IHhQb3MgfHwgeVBvc19wcmV2ICE9PSB5UG9zKSB7XG4gICAgICBjdHgubGluZVRvKHhQb3MsIHlQb3MpO1xuICAgIH1cbiAgICB4UG9zX3ByZXYgPSB4UG9zO1xuICAgIHlQb3NfcHJldiA9IHlQb3M7XG4gICAgaSAtPSBkZWx0YTsgLy9jY3dcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9kcmF3X2FyY1xuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXQsIGNhbWxfZ3JfYXJjX2F1eFxuZnVuY3Rpb24gY2FtbF9ncl9kcmF3X2FyYyh4LCB5LCByeCwgcnksIGExLCBhMikge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY29udGV4dC5iZWdpblBhdGgoKTtcbiAgY2FtbF9ncl9hcmNfYXV4KHMuY29udGV4dCwgeCwgcy5oZWlnaHQgLSB5LCByeCwgcnksIGExLCBhMik7XG4gIHMuY29udGV4dC5zdHJva2UoKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2V0X2xpbmVfd2lkdGhcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX3NldF9saW5lX3dpZHRoKHcpIHtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmxpbmVfd2lkdGggPSB3O1xuICBzLmNvbnRleHQubGluZVdpZHRoID0gdztcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZmlsbF9yZWN0XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9maWxsX3JlY3QoeCwgeSwgdywgaCkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY29udGV4dC5maWxsUmVjdCh4LCBzLmhlaWdodCAtIHksIHcsIC1oKTtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2ZpbGxfcG9seVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfZmlsbF9wb2x5KGFyKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuICBzLmNvbnRleHQubW92ZVRvKGFyWzFdWzFdLCBzLmhlaWdodCAtIGFyWzFdWzJdKTtcbiAgZm9yICh2YXIgaSA9IDI7IGkgPCBhci5sZW5ndGg7IGkrKylcbiAgICBzLmNvbnRleHQubGluZVRvKGFyW2ldWzFdLCBzLmhlaWdodCAtIGFyW2ldWzJdKTtcbiAgcy5jb250ZXh0LmxpbmVUbyhhclsxXVsxXSwgcy5oZWlnaHQgLSBhclsxXVsyXSk7XG4gIHMuY29udGV4dC5maWxsKCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2ZpbGxfYXJjXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldCwgY2FtbF9ncl9hcmNfYXV4XG5mdW5jdGlvbiBjYW1sX2dyX2ZpbGxfYXJjKHgsIHksIHJ4LCByeSwgYTEsIGEyKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuICBjYW1sX2dyX2FyY19hdXgocy5jb250ZXh0LCB4LCBzLmhlaWdodCAtIHksIHJ4LCByeSwgYTEsIGEyKTtcbiAgcy5jb250ZXh0LmZpbGwoKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZHJhd19zdHJcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2RyYXdfc3RyKHN0cikge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciBtID0gcy5jb250ZXh0Lm1lYXN1cmVUZXh0KHN0cik7XG4gIHZhciBkeCA9IG0ud2lkdGg7XG4gIHMuY29udGV4dC5maWxsVGV4dChzdHIsIHMueCwgcy5oZWlnaHQgLSBzLnkpO1xuICBzLnggKz0gZHggfCAwO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9kcmF3X2NoYXJcbi8vUmVxdWlyZXM6IGNhbWxfZ3JfZHJhd19zdHJcbmZ1bmN0aW9uIGNhbWxfZ3JfZHJhd19jaGFyKGMpIHtcbiAgY2FtbF9ncl9kcmF3X3N0cihTdHJpbmcuZnJvbUNoYXJDb2RlKGMpKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZHJhd19zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfZ3JfZHJhd19zdHJcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX2RyYXdfc3RyaW5nKHN0cikge1xuICBjYW1sX2dyX2RyYXdfc3RyKGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHN0cikpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zZXRfZm9udFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX3NldF9mb250KGYpIHtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmZvbnQgPSBmO1xuICBzLmNvbnRleHQuZm9udCA9IHMudGV4dF9zaXplICsgXCJweCBcIiArIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMuZm9udCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3NldF90ZXh0X3NpemVcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9ncl9zZXRfdGV4dF9zaXplKHNpemUpIHtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLnRleHRfc2l6ZSA9IHNpemU7XG4gIHMuY29udGV4dC5mb250ID0gcy50ZXh0X3NpemUgKyBcInB4IFwiICsgY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocy5mb250KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfdGV4dF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfZ3JfdGV4dF9zaXplKHR4dCkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciB3ID0gcy5jb250ZXh0Lm1lYXN1cmVUZXh0KGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHR4dCkpLndpZHRoO1xuICByZXR1cm4gWzAsIHcsIHMudGV4dF9zaXplXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9tYWtlX2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9tYWtlX2ltYWdlKGFycikge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciBoID0gYXJyLmxlbmd0aCAtIDE7XG4gIHZhciB3ID0gYXJyWzFdLmxlbmd0aCAtIDE7XG4gIHZhciBpbSA9IHMuY29udGV4dC5jcmVhdGVJbWFnZURhdGEodywgaCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaDsgaSsrKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCB3OyBqKyspIHtcbiAgICAgIHZhciBjID0gYXJyW2kgKyAxXVtqICsgMV07XG4gICAgICB2YXIgbyA9IGkgKiAodyAqIDQpICsgaiAqIDQ7XG4gICAgICBpZiAoYyA9PT0gLTEpIHtcbiAgICAgICAgaW0uZGF0YVtvICsgMF0gPSAwO1xuICAgICAgICBpbS5kYXRhW28gKyAxXSA9IDA7XG4gICAgICAgIGltLmRhdGFbbyArIDJdID0gMDtcbiAgICAgICAgaW0uZGF0YVtvICsgM10gPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW0uZGF0YVtvICsgMF0gPSAoYyA+PiAxNikgJiAweGZmO1xuICAgICAgICBpbS5kYXRhW28gKyAxXSA9IChjID4+IDgpICYgMHhmZjtcbiAgICAgICAgaW0uZGF0YVtvICsgMl0gPSAoYyA+PiAwKSAmIDB4ZmY7XG4gICAgICAgIGltLmRhdGFbbyArIDNdID0gMHhmZjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGltO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9kdW1wX2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9kdW1wX2ltYWdlKGltKSB7XG4gIHZhciBkYXRhID0gWzBdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGltLmhlaWdodDsgaSsrKSB7XG4gICAgZGF0YVtpICsgMV0gPSBbMF07XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBpbS53aWR0aDsgaisrKSB7XG4gICAgICB2YXIgbyA9IGkgKiAoaW0ud2lkdGggKiA0KSArIGogKiA0LFxuICAgICAgICByID0gaW0uZGF0YVtvICsgMF0sXG4gICAgICAgIGcgPSBpbS5kYXRhW28gKyAxXSxcbiAgICAgICAgYiA9IGltLmRhdGFbbyArIDJdO1xuICAgICAgZGF0YVtpICsgMV1baiArIDFdID0gKHIgPDwgMTYpICsgKGcgPDwgOCkgKyBiO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZHJhd19pbWFnZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfZHJhd19pbWFnZShpbSwgeCwgeSkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIGlmICghaW0uaW1hZ2UpIHtcbiAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjYW52YXMud2lkdGggPSBzLndpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBzLmhlaWdodDtcbiAgICBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpLnB1dEltYWdlRGF0YShpbSwgMCwgMCk7XG4gICAgdmFyIGltYWdlID0gbmV3IGdsb2JhbFRoaXMuSW1hZ2UoKTtcbiAgICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzLmNvbnRleHQuZHJhd0ltYWdlKGltYWdlLCB4LCBzLmhlaWdodCAtIGltLmhlaWdodCAtIHkpO1xuICAgICAgaW0uaW1hZ2UgPSBpbWFnZTtcbiAgICB9O1xuICAgIGltYWdlLnNyYyA9IGNhbnZhcy50b0RhdGFVUkwoXCJpbWFnZS9wbmdcIik7XG4gIH0gZWxzZSB7XG4gICAgcy5jb250ZXh0LmRyYXdJbWFnZShpbS5pbWFnZSwgeCwgcy5oZWlnaHQgLSBpbS5oZWlnaHQgLSB5KTtcbiAgfVxuICByZXR1cm4gMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY3JlYXRlX2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jcmVhdGVfaW1hZ2UoeCwgeSkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHJldHVybiBzLmNvbnRleHQuY3JlYXRlSW1hZ2VEYXRhKHgsIHkpO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9ibGl0X2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9ibGl0X2ltYWdlKGltLCB4LCB5KSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgdmFyIGltMiA9IHMuY29udGV4dC5nZXRJbWFnZURhdGEoXG4gICAgeCxcbiAgICBzLmhlaWdodCAtIGltLmhlaWdodCAtIHksXG4gICAgaW0ud2lkdGgsXG4gICAgaW0uaGVpZ2h0LFxuICApO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGltMi5kYXRhLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgaW0uZGF0YVtpXSA9IGltMi5kYXRhW2ldO1xuICAgIGltLmRhdGFbaSArIDFdID0gaW0yLmRhdGFbaSArIDFdO1xuICAgIGltLmRhdGFbaSArIDJdID0gaW0yLmRhdGFbaSArIDJdO1xuICAgIGltLmRhdGFbaSArIDNdID0gaW0yLmRhdGFbaSArIDNdO1xuICB9XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9zaWdpb19oYW5kbGVyXG5mdW5jdGlvbiBjYW1sX2dyX3NpZ2lvX2hhbmRsZXIoKSB7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9zaWdpb19zaWduYWxcbmZ1bmN0aW9uIGNhbWxfZ3Jfc2lnaW9fc2lnbmFsKCkge1xuICByZXR1cm4gMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfd2FpdF9ldmVudFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9ncl93YWl0X2V2ZW50KF9ldmwpIHtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfZ3Jfd2FpdF9ldmVudCBub3QgSW1wbGVtZW50ZWQ6IHVzZSBHcmFwaGljc19qcyBpbnN0ZWFkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3N5bmNocm9uaXplXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2dyX3N5bmNocm9uaXplKCkge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9ncl9zeW5jaHJvbml6ZSBub3QgSW1wbGVtZW50ZWRcIik7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3JlbWVtYmVyX21vZGVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfZ3JfcmVtZW1iZXJfbW9kZSgpIHtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfZ3JfcmVtZW1iZXJfbW9kZSBub3QgSW1wbGVtZW50ZWRcIik7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2Rpc3BsYXlfbW9kZVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9ncl9kaXNwbGF5X21vZGUoKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2dyX2Rpc3BsYXlfbW9kZSBub3QgSW1wbGVtZW50ZWRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfd2luZG93X2lkXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2dyX3dpbmRvd19pZChfYSkge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9ncl93aW5kb3dfaWQgbm90IEltcGxlbWVudGVkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX29wZW5fc3Vid2luZG93XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2dyX29wZW5fc3Vid2luZG93KF9hLCBfYiwgX2MsIF9kKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2dyX29wZW5fc3Vid2luZG93IG5vdCBJbXBsZW1lbnRlZFwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9jbG9zZV9zdWJ3aW5kb3dcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfZ3JfY2xvc2Vfc3Vid2luZG93KF9hKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2dyX2Nsb3NlX3N1YndpbmRvdyBub3QgSW1wbGVtZW50ZWRcIik7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBsaWJyYXJ5XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gSnNsaWI6IGNvZGUgc3BlY2lmaWMgdG8gSnNfb2Zfb2NhbWxcblxuLy9Qcm92aWRlczogY2FtbF9qc19odG1sX2VzY2FwZSBjb25zdCAoY29uc3QpXG52YXIgY2FtbF9qc19yZWdleHBzID0geyBhbXA6IC8mL2csIGx0OiAvPC9nLCBxdW90OiAvXCIvZywgYWxsOiAvWyY8XCJdLyB9O1xuZnVuY3Rpb24gY2FtbF9qc19odG1sX2VzY2FwZShzKSB7XG4gIGlmICghY2FtbF9qc19yZWdleHBzLmFsbC50ZXN0KHMpKSByZXR1cm4gcztcbiAgcmV0dXJuIHNcbiAgICAucmVwbGFjZShjYW1sX2pzX3JlZ2V4cHMuYW1wLCBcIiZhbXA7XCIpXG4gICAgLnJlcGxhY2UoY2FtbF9qc19yZWdleHBzLmx0LCBcIiZsdDtcIilcbiAgICAucmVwbGFjZShjYW1sX2pzX3JlZ2V4cHMucXVvdCwgXCImcXVvdDtcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfaHRtbF9lbnRpdGllc1xuZnVuY3Rpb24gY2FtbF9qc19odG1sX2VudGl0aWVzKHMpIHtcbiAgdmFyIGVudGl0eSA9IC9eJiM/WzAtOWEtekEtWl0rOyQvO1xuICBpZiAocy5tYXRjaChlbnRpdHkpKSB7XG4gICAgdmFyIHN0cixcbiAgICAgIHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcbiAgICB0ZW1wLmlubmVySFRNTCA9IHM7XG4gICAgc3RyID0gdGVtcC50ZXh0Q29udGVudCB8fCB0ZW1wLmlubmVyVGV4dDtcbiAgICB0ZW1wID0gbnVsbDtcbiAgICByZXR1cm4gc3RyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZ2V0X2NvbnNvbGUgY29uc3RcbmZ1bmN0aW9uIGNhbWxfanNfZ2V0X2NvbnNvbGUoKSB7XG4gIHZhciBjID0gY29uc29sZTtcbiAgdmFyIG0gPSBbXG4gICAgXCJsb2dcIixcbiAgICBcImRlYnVnXCIsXG4gICAgXCJpbmZvXCIsXG4gICAgXCJ3YXJuXCIsXG4gICAgXCJlcnJvclwiLFxuICAgIFwiYXNzZXJ0XCIsXG4gICAgXCJkaXJcIixcbiAgICBcImRpcnhtbFwiLFxuICAgIFwidHJhY2VcIixcbiAgICBcImdyb3VwXCIsXG4gICAgXCJncm91cENvbGxhcHNlZFwiLFxuICAgIFwiZ3JvdXBFbmRcIixcbiAgICBcInRpbWVcIixcbiAgICBcInRpbWVFbmRcIixcbiAgXTtcbiAgZnVuY3Rpb24gZigpIHt9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbS5sZW5ndGg7IGkrKykgaWYgKCFjW21baV1dKSBjW21baV1dID0gZjtcbiAgcmV0dXJuIGM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfeG1saHR0cHJlcXVlc3RfY3JlYXRlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vL1dlYWtkZWZcbmZ1bmN0aW9uIGNhbWxfeG1saHR0cHJlcXVlc3RfY3JlYXRlKF91bml0KSB7XG4gIGlmICh0eXBlb2YgWE1MSHR0cFJlcXVlc3QgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiWE1MSHR0cFJlcXVlc3QgaXMgbm90IGF2YWlsYWJsZVwiKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgfSBjYXRjaCB7XG4gICAgY2FtbF9mYWlsd2l0aChcIkZhaWxlZCB0byBjcmVhdGUgWE1MSHR0cFJlcXVlc3RcIik7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19lcnJvcl9vZl9leGNlcHRpb25cbmZ1bmN0aW9uIGNhbWxfanNfZXJyb3Jfb2ZfZXhjZXB0aW9uKGV4bikge1xuICBpZiAoZXhuLmpzX2Vycm9yKSB7XG4gICAgcmV0dXJuIGV4bi5qc19lcnJvcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0aXZlIENhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgKi9cbi8qICBlbiBBdXRvbWF0aXF1ZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgICAgKi9cbi8qICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2l0aCAgICAgKi9cbi8qICB0aGUgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gZmlsZSAuLi9MSUNFTlNFLiAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyogJElkOiBsZXhpbmcuYyA2MDQ1IDIwMDQtMDEtMDEgMTY6NDI6NDNaIGRvbGlnZXogJCAqL1xuXG4vKiBUaGUgdGFibGUtZHJpdmVuIGF1dG9tYXRvbiBmb3IgbGV4ZXJzIGdlbmVyYXRlZCBieSBjYW1sbGV4LiAqL1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2xleF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9sZXhfYXJyYXkocykge1xuICBzID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhzKTtcbiAgdmFyIGwgPSBzLmxlbmd0aCAvIDI7XG4gIHZhciBhID0gbmV3IEFycmF5KGwpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKylcbiAgICBhW2ldID0gKChzLmNoYXJDb2RlQXQoMiAqIGkpIHwgKHMuY2hhckNvZGVBdCgyICogaSArIDEpIDw8IDgpKSA8PCAxNikgPj4gMTY7XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2xleF9lbmdpbmVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGgsIGNhbWxfbGV4X2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXRcbmZ1bmN0aW9uIGNhbWxfbGV4X2VuZ2luZSh0YmwsIHN0YXJ0X3N0YXRlLCBsZXhidWYpIHtcbiAgdmFyIGxleF9idWZmZXIgPSAyO1xuICB2YXIgbGV4X2J1ZmZlcl9sZW4gPSAzO1xuICB2YXIgbGV4X3N0YXJ0X3BvcyA9IDU7XG4gIHZhciBsZXhfY3Vycl9wb3MgPSA2O1xuICB2YXIgbGV4X2xhc3RfcG9zID0gNztcbiAgdmFyIGxleF9sYXN0X2FjdGlvbiA9IDg7XG4gIHZhciBsZXhfZW9mX3JlYWNoZWQgPSA5O1xuICB2YXIgbGV4X2Jhc2UgPSAxO1xuICB2YXIgbGV4X2JhY2t0cmsgPSAyO1xuICB2YXIgbGV4X2RlZmF1bHQgPSAzO1xuICB2YXIgbGV4X3RyYW5zID0gNDtcbiAgdmFyIGxleF9jaGVjayA9IDU7XG5cbiAgaWYgKCF0YmwubGV4X2RlZmF1bHQpIHtcbiAgICB0YmwubGV4X2Jhc2UgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X2Jhc2VdKTtcbiAgICB0YmwubGV4X2JhY2t0cmsgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X2JhY2t0cmtdKTtcbiAgICB0YmwubGV4X2NoZWNrID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF9jaGVja10pO1xuICAgIHRibC5sZXhfdHJhbnMgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X3RyYW5zXSk7XG4gICAgdGJsLmxleF9kZWZhdWx0ID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF9kZWZhdWx0XSk7XG4gIH1cblxuICB2YXIgYyxcbiAgICBzdGF0ZSA9IHN0YXJ0X3N0YXRlO1xuXG4gIHZhciBidWZmZXIgPSBsZXhidWZbbGV4X2J1ZmZlcl07XG5cbiAgaWYgKHN0YXRlID49IDApIHtcbiAgICAvKiBGaXJzdCBlbnRyeSAqL1xuICAgIGxleGJ1ZltsZXhfbGFzdF9wb3NdID0gbGV4YnVmW2xleF9zdGFydF9wb3NdID0gbGV4YnVmW2xleF9jdXJyX3Bvc107XG4gICAgbGV4YnVmW2xleF9sYXN0X2FjdGlvbl0gPSAtMTtcbiAgfSBlbHNlIHtcbiAgICAvKiBSZWVudHJ5IGFmdGVyIHJlZmlsbCAqL1xuICAgIHN0YXRlID0gLXN0YXRlIC0gMTtcbiAgfVxuICBmb3IgKDs7KSB7XG4gICAgLyogTG9va3VwIGJhc2UgYWRkcmVzcyBvciBhY3Rpb24gbnVtYmVyIGZvciBjdXJyZW50IHN0YXRlICovXG4gICAgdmFyIGJhc2UgPSB0YmwubGV4X2Jhc2Vbc3RhdGVdO1xuICAgIGlmIChiYXNlIDwgMCkgcmV0dXJuIC1iYXNlIC0gMTtcbiAgICAvKiBTZWUgaWYgaXQncyBhIGJhY2t0cmFjayBwb2ludCAqL1xuICAgIHZhciBiYWNrdHJrID0gdGJsLmxleF9iYWNrdHJrW3N0YXRlXTtcbiAgICBpZiAoYmFja3RyayA+PSAwKSB7XG4gICAgICBsZXhidWZbbGV4X2xhc3RfcG9zXSA9IGxleGJ1ZltsZXhfY3Vycl9wb3NdO1xuICAgICAgbGV4YnVmW2xleF9sYXN0X2FjdGlvbl0gPSBiYWNrdHJrO1xuICAgIH1cbiAgICAvKiBTZWUgaWYgd2UgbmVlZCBhIHJlZmlsbCAqL1xuICAgIGlmIChsZXhidWZbbGV4X2N1cnJfcG9zXSA+PSBsZXhidWZbbGV4X2J1ZmZlcl9sZW5dKSB7XG4gICAgICBpZiAobGV4YnVmW2xleF9lb2ZfcmVhY2hlZF0gPT09IDApIHJldHVybiAtc3RhdGUgLSAxO1xuICAgICAgZWxzZSBjID0gMjU2O1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBSZWFkIG5leHQgaW5wdXQgY2hhciAqL1xuICAgICAgYyA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldChidWZmZXIsIGxleGJ1ZltsZXhfY3Vycl9wb3NdKTtcbiAgICAgIGxleGJ1ZltsZXhfY3Vycl9wb3NdKys7XG4gICAgfVxuICAgIC8qIERldGVybWluZSBuZXh0IHN0YXRlICovXG4gICAgaWYgKHRibC5sZXhfY2hlY2tbYmFzZSArIGNdID09PSBzdGF0ZSkgc3RhdGUgPSB0YmwubGV4X3RyYW5zW2Jhc2UgKyBjXTtcbiAgICBlbHNlIHN0YXRlID0gdGJsLmxleF9kZWZhdWx0W3N0YXRlXTtcbiAgICAvKiBJZiBubyB0cmFuc2l0aW9uIG9uIHRoaXMgY2hhciwgcmV0dXJuIHRvIGxhc3QgYmFja3RyYWNrIHBvaW50ICovXG4gICAgaWYgKHN0YXRlIDwgMCkge1xuICAgICAgbGV4YnVmW2xleF9jdXJyX3Bvc10gPSBsZXhidWZbbGV4X2xhc3RfcG9zXTtcbiAgICAgIGlmIChsZXhidWZbbGV4X2xhc3RfYWN0aW9uXSA9PT0gLTEpIGNhbWxfZmFpbHdpdGgoXCJsZXhpbmc6IGVtcHR5IHRva2VuXCIpO1xuICAgICAgZWxzZSByZXR1cm4gbGV4YnVmW2xleF9sYXN0X2FjdGlvbl07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIEVyYXNlIHRoZSBFT0YgY29uZGl0aW9uIG9ubHkgaWYgdGhlIEVPRiBwc2V1ZG8tY2hhcmFjdGVyIHdhc1xuICAgICAgICAgY29uc3VtZWQgYnkgdGhlIGF1dG9tYXRvbiAoaS5lLiB0aGVyZSB3YXMgbm8gYmFja3RyYWNrIGFib3ZlKVxuICAgICAgKi9cbiAgICAgIGlmIChjID09PSAyNTYpIGxleGJ1ZltsZXhfZW9mX3JlYWNoZWRdID0gMDtcbiAgICB9XG4gIH1cbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyogTmV3IGxleGVyIGVuZ2luZSwgd2l0aCBtZW1vcnkgb2YgcG9zaXRpb25zICAqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vL1Byb3ZpZGVzOiBjYW1sX25ld19sZXhfZW5naW5lXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCBjYW1sX2xleF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9ieXRlc191bnNhZmVfZ2V0XG5mdW5jdGlvbiBjYW1sX2xleF9ydW5fbWVtKHMsIGksIG1lbSwgY3Vycl9wb3MpIHtcbiAgZm9yICg7Oykge1xuICAgIHZhciBkc3QgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgaSsrO1xuICAgIGlmIChkc3QgPT09IDB4ZmYpIHJldHVybjtcbiAgICB2YXIgc3JjID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIGkrKztcbiAgICBpZiAoc3JjID09PSAweGZmKSBtZW1bZHN0ICsgMV0gPSBjdXJyX3BvcztcbiAgICBlbHNlIG1lbVtkc3QgKyAxXSA9IG1lbVtzcmMgKyAxXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYW1sX2xleF9ydW5fdGFnKHMsIGksIG1lbSkge1xuICBmb3IgKDs7KSB7XG4gICAgdmFyIGRzdCA9IHMuY2hhckNvZGVBdChpKTtcbiAgICBpKys7XG4gICAgaWYgKGRzdCA9PT0gMHhmZikgcmV0dXJuO1xuICAgIHZhciBzcmMgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgaSsrO1xuICAgIGlmIChzcmMgPT09IDB4ZmYpIG1lbVtkc3QgKyAxXSA9IC0xO1xuICAgIGVsc2UgbWVtW2RzdCArIDFdID0gbWVtW3NyYyArIDFdO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbWxfbmV3X2xleF9lbmdpbmUodGJsLCBzdGFydF9zdGF0ZSwgbGV4YnVmKSB7XG4gIHZhciBsZXhfYnVmZmVyID0gMjtcbiAgdmFyIGxleF9idWZmZXJfbGVuID0gMztcbiAgdmFyIGxleF9zdGFydF9wb3MgPSA1O1xuICB2YXIgbGV4X2N1cnJfcG9zID0gNjtcbiAgdmFyIGxleF9sYXN0X3BvcyA9IDc7XG4gIHZhciBsZXhfbGFzdF9hY3Rpb24gPSA4O1xuICB2YXIgbGV4X2VvZl9yZWFjaGVkID0gOTtcbiAgdmFyIGxleF9tZW0gPSAxMDtcbiAgdmFyIGxleF9iYXNlID0gMTtcbiAgdmFyIGxleF9iYWNrdHJrID0gMjtcbiAgdmFyIGxleF9kZWZhdWx0ID0gMztcbiAgdmFyIGxleF90cmFucyA9IDQ7XG4gIHZhciBsZXhfY2hlY2sgPSA1O1xuICB2YXIgbGV4X2Jhc2VfY29kZSA9IDY7XG4gIHZhciBsZXhfYmFja3Rya19jb2RlID0gNztcbiAgdmFyIGxleF9kZWZhdWx0X2NvZGUgPSA4O1xuICB2YXIgbGV4X3RyYW5zX2NvZGUgPSA5O1xuICB2YXIgbGV4X2NoZWNrX2NvZGUgPSAxMDtcbiAgdmFyIGxleF9jb2RlID0gMTE7XG5cbiAgaWYgKCF0YmwubGV4X2RlZmF1bHQpIHtcbiAgICB0YmwubGV4X2Jhc2UgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X2Jhc2VdKTtcbiAgICB0YmwubGV4X2JhY2t0cmsgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X2JhY2t0cmtdKTtcbiAgICB0YmwubGV4X2NoZWNrID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF9jaGVja10pO1xuICAgIHRibC5sZXhfdHJhbnMgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X3RyYW5zXSk7XG4gICAgdGJsLmxleF9kZWZhdWx0ID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF9kZWZhdWx0XSk7XG4gIH1cbiAgaWYgKCF0YmwubGV4X2RlZmF1bHRfY29kZSkge1xuICAgIHRibC5sZXhfYmFzZV9jb2RlID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF9iYXNlX2NvZGVdKTtcbiAgICB0YmwubGV4X2JhY2t0cmtfY29kZSA9IGNhbWxfbGV4X2FycmF5KHRibFtsZXhfYmFja3Rya19jb2RlXSk7XG4gICAgdGJsLmxleF9jaGVja19jb2RlID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF9jaGVja19jb2RlXSk7XG4gICAgdGJsLmxleF90cmFuc19jb2RlID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF90cmFuc19jb2RlXSk7XG4gICAgdGJsLmxleF9kZWZhdWx0X2NvZGUgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X2RlZmF1bHRfY29kZV0pO1xuICB9XG4gIGlmICh0YmwubGV4X2NvZGUgPT0gbnVsbClcbiAgICB0YmwubGV4X2NvZGUgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHRibFtsZXhfY29kZV0pO1xuXG4gIHZhciBjLFxuICAgIHN0YXRlID0gc3RhcnRfc3RhdGU7XG5cbiAgdmFyIGJ1ZmZlciA9IGxleGJ1ZltsZXhfYnVmZmVyXTtcblxuICBpZiAoc3RhdGUgPj0gMCkge1xuICAgIC8qIEZpcnN0IGVudHJ5ICovXG4gICAgbGV4YnVmW2xleF9sYXN0X3Bvc10gPSBsZXhidWZbbGV4X3N0YXJ0X3Bvc10gPSBsZXhidWZbbGV4X2N1cnJfcG9zXTtcbiAgICBsZXhidWZbbGV4X2xhc3RfYWN0aW9uXSA9IC0xO1xuICB9IGVsc2Uge1xuICAgIC8qIFJlZW50cnkgYWZ0ZXIgcmVmaWxsICovXG4gICAgc3RhdGUgPSAtc3RhdGUgLSAxO1xuICB9XG4gIGZvciAoOzspIHtcbiAgICAvKiBMb29rdXAgYmFzZSBhZGRyZXNzIG9yIGFjdGlvbiBudW1iZXIgZm9yIGN1cnJlbnQgc3RhdGUgKi9cbiAgICB2YXIgYmFzZSA9IHRibC5sZXhfYmFzZVtzdGF0ZV07XG4gICAgaWYgKGJhc2UgPCAwKSB7XG4gICAgICB2YXIgcGNfb2ZmID0gdGJsLmxleF9iYXNlX2NvZGVbc3RhdGVdO1xuICAgICAgY2FtbF9sZXhfcnVuX3RhZyh0YmwubGV4X2NvZGUsIHBjX29mZiwgbGV4YnVmW2xleF9tZW1dKTtcbiAgICAgIHJldHVybiAtYmFzZSAtIDE7XG4gICAgfVxuICAgIC8qIFNlZSBpZiBpdCdzIGEgYmFja3RyYWNrIHBvaW50ICovXG4gICAgdmFyIGJhY2t0cmsgPSB0YmwubGV4X2JhY2t0cmtbc3RhdGVdO1xuICAgIGlmIChiYWNrdHJrID49IDApIHtcbiAgICAgIHZhciBwY19vZmYgPSB0YmwubGV4X2JhY2t0cmtfY29kZVtzdGF0ZV07XG4gICAgICBjYW1sX2xleF9ydW5fdGFnKHRibC5sZXhfY29kZSwgcGNfb2ZmLCBsZXhidWZbbGV4X21lbV0pO1xuICAgICAgbGV4YnVmW2xleF9sYXN0X3Bvc10gPSBsZXhidWZbbGV4X2N1cnJfcG9zXTtcbiAgICAgIGxleGJ1ZltsZXhfbGFzdF9hY3Rpb25dID0gYmFja3RyaztcbiAgICB9XG4gICAgLyogU2VlIGlmIHdlIG5lZWQgYSByZWZpbGwgKi9cbiAgICBpZiAobGV4YnVmW2xleF9jdXJyX3Bvc10gPj0gbGV4YnVmW2xleF9idWZmZXJfbGVuXSkge1xuICAgICAgaWYgKGxleGJ1ZltsZXhfZW9mX3JlYWNoZWRdID09PSAwKSByZXR1cm4gLXN0YXRlIC0gMTtcbiAgICAgIGVsc2UgYyA9IDI1NjtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogUmVhZCBuZXh0IGlucHV0IGNoYXIgKi9cbiAgICAgIGMgPSBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQoYnVmZmVyLCBsZXhidWZbbGV4X2N1cnJfcG9zXSk7XG4gICAgICBsZXhidWZbbGV4X2N1cnJfcG9zXSsrO1xuICAgIH1cbiAgICAvKiBEZXRlcm1pbmUgbmV4dCBzdGF0ZSAqL1xuICAgIHZhciBwc3RhdGUgPSBzdGF0ZTtcbiAgICBpZiAodGJsLmxleF9jaGVja1tiYXNlICsgY10gPT09IHN0YXRlKSBzdGF0ZSA9IHRibC5sZXhfdHJhbnNbYmFzZSArIGNdO1xuICAgIGVsc2Ugc3RhdGUgPSB0YmwubGV4X2RlZmF1bHRbc3RhdGVdO1xuICAgIC8qIElmIG5vIHRyYW5zaXRpb24gb24gdGhpcyBjaGFyLCByZXR1cm4gdG8gbGFzdCBiYWNrdHJhY2sgcG9pbnQgKi9cbiAgICBpZiAoc3RhdGUgPCAwKSB7XG4gICAgICBsZXhidWZbbGV4X2N1cnJfcG9zXSA9IGxleGJ1ZltsZXhfbGFzdF9wb3NdO1xuICAgICAgaWYgKGxleGJ1ZltsZXhfbGFzdF9hY3Rpb25dID09PSAtMSkgY2FtbF9mYWlsd2l0aChcImxleGluZzogZW1wdHkgdG9rZW5cIik7XG4gICAgICBlbHNlIHJldHVybiBsZXhidWZbbGV4X2xhc3RfYWN0aW9uXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogSWYgc29tZSB0cmFuc2l0aW9uLCBnZXQgYW5kIHBlcmZvcm0gbWVtb3J5IG1vdmVzICovXG4gICAgICB2YXIgYmFzZV9jb2RlID0gdGJsLmxleF9iYXNlX2NvZGVbcHN0YXRlXSxcbiAgICAgICAgcGNfb2ZmO1xuICAgICAgaWYgKHRibC5sZXhfY2hlY2tfY29kZVtiYXNlX2NvZGUgKyBjXSA9PT0gcHN0YXRlKVxuICAgICAgICBwY19vZmYgPSB0YmwubGV4X3RyYW5zX2NvZGVbYmFzZV9jb2RlICsgY107XG4gICAgICBlbHNlIHBjX29mZiA9IHRibC5sZXhfZGVmYXVsdF9jb2RlW3BzdGF0ZV07XG4gICAgICBpZiAocGNfb2ZmID4gMClcbiAgICAgICAgY2FtbF9sZXhfcnVuX21lbShcbiAgICAgICAgICB0YmwubGV4X2NvZGUsXG4gICAgICAgICAgcGNfb2ZmLFxuICAgICAgICAgIGxleGJ1ZltsZXhfbWVtXSxcbiAgICAgICAgICBsZXhidWZbbGV4X2N1cnJfcG9zXSxcbiAgICAgICAgKTtcbiAgICAgIC8qIEVyYXNlIHRoZSBFT0YgY29uZGl0aW9uIG9ubHkgaWYgdGhlIEVPRiBwc2V1ZG8tY2hhcmFjdGVyIHdhc1xuICAgICAgICAgY29uc3VtZWQgYnkgdGhlIGF1dG9tYXRvbiAoaS5lLiB0aGVyZSB3YXMgbm8gYmFja3RyYWNrIGFib3ZlKVxuICAgICAgKi9cbiAgICAgIGlmIChjID09PSAyNTYpIGxleGJ1ZltsZXhfZW9mX3JlYWNoZWRdID0gMDtcbiAgICB9XG4gIH1cbn1cbiIsIi8vUHJvdmlkZXM6IGNhbWxfbHhtX01cbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuLy9WZXJzaW9uOiA+PSA1XG52YXIgY2FtbF9seG1fTSA9IGNhbWxfaW50NjRfb2Zfc3RyaW5nKFxuICBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhcIjB4ZDEzNDI1NDNkZTgyZWY5NVwiKSxcbik7XG5cbi8vUHJvdmlkZXM6IGNhbWxfbHhtX2RhYmFcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuLy9WZXJzaW9uOiA+PSA1XG52YXIgY2FtbF9seG1fZGFiYSA9IGNhbWxfaW50NjRfb2Zfc3RyaW5nKFxuICBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhcIjB4ZGFiYTBiNmViMDkzMjJlM1wiKSxcbik7XG5cbi8vUHJvdmlkZXM6IGNhbWxfbHhtX25leHQgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9zaGlmdF9sZWZ0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29yXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3hvclxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9hZGRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfbXVsXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF8xXG4vL1JlcXVpcmVzOiBjYW1sX2JhX3NldF8xXG4vL1JlcXVpcmVzOiBjYW1sX2x4bV9NXG4vL1JlcXVpcmVzOiBjYW1sX2x4bV9kYWJhXG4vL1ZlcnNpb246ID49IDVcbmZ1bmN0aW9uIGNhbWxfbHhtX25leHQodikge1xuICBmdW5jdGlvbiBzaGlmdF9sKHgsIGspIHtcbiAgICByZXR1cm4gY2FtbF9pbnQ2NF9zaGlmdF9sZWZ0KHgsIGspO1xuICB9XG4gIGZ1bmN0aW9uIHNoaWZ0X3IoeCwgaykge1xuICAgIHJldHVybiBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkKHgsIGspO1xuICB9XG4gIGZ1bmN0aW9uIG9yKGEsIGIpIHtcbiAgICByZXR1cm4gY2FtbF9pbnQ2NF9vcihhLCBiKTtcbiAgfVxuICBmdW5jdGlvbiB4b3IoYSwgYikge1xuICAgIHJldHVybiBjYW1sX2ludDY0X3hvcihhLCBiKTtcbiAgfVxuICBmdW5jdGlvbiBhZGQoYSwgYikge1xuICAgIHJldHVybiBjYW1sX2ludDY0X2FkZChhLCBiKTtcbiAgfVxuICBmdW5jdGlvbiBtdWwoYSwgYikge1xuICAgIHJldHVybiBjYW1sX2ludDY0X211bChhLCBiKTtcbiAgfVxuICBmdW5jdGlvbiByb3RsKHgsIGspIHtcbiAgICByZXR1cm4gb3Ioc2hpZnRfbCh4LCBrKSwgc2hpZnRfcih4LCA2NCAtIGspKTtcbiAgfVxuICBmdW5jdGlvbiBnZXQoYSwgaSkge1xuICAgIHJldHVybiBjYW1sX2JhX2dldF8xKGEsIGkpO1xuICB9XG4gIGZ1bmN0aW9uIHNldChhLCBpLCB4KSB7XG4gICAgcmV0dXJuIGNhbWxfYmFfc2V0XzEoYSwgaSwgeCk7XG4gIH1cbiAgdmFyIE0gPSBjYW1sX2x4bV9NO1xuICB2YXIgZGFiYSA9IGNhbWxfbHhtX2RhYmE7XG4gIHZhciB6LCBxMCwgcTE7XG4gIHZhciBzdCA9IHY7XG4gIHZhciBhID0gZ2V0KHN0LCAwKTtcbiAgdmFyIHMgPSBnZXQoc3QsIDEpO1xuICB2YXIgeDAgPSBnZXQoc3QsIDIpO1xuICB2YXIgeDEgPSBnZXQoc3QsIDMpO1xuICAvKiBDb21iaW5pbmcgb3BlcmF0aW9uICovXG4gIHogPSBhZGQocywgeDApO1xuICAvKiBNaXhpbmcgZnVuY3Rpb24gKi9cbiAgeiA9IG11bCh4b3Ioeiwgc2hpZnRfcih6LCAzMikpLCBkYWJhKTtcbiAgeiA9IG11bCh4b3Ioeiwgc2hpZnRfcih6LCAzMikpLCBkYWJhKTtcbiAgeiA9IHhvcih6LCBzaGlmdF9yKHosIDMyKSk7XG4gIC8qIExDRyB1cGRhdGUgKi9cbiAgc2V0KHN0LCAxLCBhZGQobXVsKHMsIE0pLCBhKSk7XG4gIC8qIFhCRyB1cGRhdGUgKi9cbiAgdmFyIHEwID0geDA7XG4gIHZhciBxMSA9IHgxO1xuICBxMSA9IHhvcihxMSwgcTApO1xuICBxMCA9IHJvdGwocTAsIDI0KTtcbiAgcTAgPSB4b3IoeG9yKHEwLCBxMSksIHNoaWZ0X2wocTEsIDE2KSk7XG4gIHExID0gcm90bChxMSwgMzcpO1xuICBzZXQoc3QsIDIsIHEwKTtcbiAgc2V0KHN0LCAzLCBxMSk7XG4gIC8qIFJldHVybiByZXN1bHQgKi9cbiAgcmV0dXJuIHo7XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdGl2ZSBDYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICovXG4vKiAgZW4gQXV0b21hdGlxdWUuICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkICAgICovXG4vKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdpdGggICAgICovXG4vKiAgdGhlIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIGZpbGUgLi4vTElDRU5TRS4gICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qICRJZDogcGFyc2luZy5jIDg5ODMgMjAwOC0wOC0wNiAwOTozODoyNVogeGxlcm95ICQgKi9cblxuLyogVGhlIFBEQSBhdXRvbWF0b24gZm9yIHBhcnNlcnMgZ2VuZXJhdGVkIGJ5IGNhbWx5YWNjICovXG5cbi8qIFRoZSBwdXNoZG93biBhdXRvbWF0YSAqL1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3BhcnNlcl90cmFjZVxudmFyIGNhbWxfcGFyc2VyX3RyYWNlID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9wYXJzZV9lbmdpbmVcbi8vUmVxdWlyZXM6IGNhbWxfbGV4X2FycmF5LCBjYW1sX3BhcnNlcl90cmFjZSxjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9tbF9vdXRwdXQsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZywgTWxCeXRlc1xuLy9SZXF1aXJlczogY2FtbF9zeXNfZmRzXG5mdW5jdGlvbiBjYW1sX3BhcnNlX2VuZ2luZSh0YWJsZXMsIGVudiwgY21kLCBhcmcpIHtcbiAgdmFyIEVSUkNPREUgPSAyNTY7XG5cbiAgLy92YXIgU1RBUlQgPSAwO1xuICAvL3ZhciBUT0tFTl9SRUFEID0gMTtcbiAgLy92YXIgU1RBQ0tTX0dST1dOXzEgPSAyO1xuICAvL3ZhciBTVEFDS1NfR1JPV05fMiA9IDM7XG4gIC8vdmFyIFNFTUFOVElDX0FDVElPTl9DT01QVVRFRCA9IDQ7XG4gIC8vdmFyIEVSUk9SX0RFVEVDVEVEID0gNTtcbiAgdmFyIGxvb3AgPSA2O1xuICB2YXIgdGVzdHNoaWZ0ID0gNztcbiAgdmFyIHNoaWZ0ID0gODtcbiAgdmFyIHNoaWZ0X3JlY292ZXIgPSA5O1xuICB2YXIgcmVkdWNlID0gMTA7XG5cbiAgdmFyIFJFQURfVE9LRU4gPSAwO1xuICB2YXIgUkFJU0VfUEFSU0VfRVJST1IgPSAxO1xuICB2YXIgR1JPV19TVEFDS1NfMSA9IDI7XG4gIHZhciBHUk9XX1NUQUNLU18yID0gMztcbiAgdmFyIENPTVBVVEVfU0VNQU5USUNfQUNUSU9OID0gNDtcbiAgdmFyIENBTExfRVJST1JfRlVOQ1RJT04gPSA1O1xuXG4gIHZhciBlbnZfc19zdGFjayA9IDE7XG4gIHZhciBlbnZfdl9zdGFjayA9IDI7XG4gIHZhciBlbnZfc3ltYl9zdGFydF9zdGFjayA9IDM7XG4gIHZhciBlbnZfc3ltYl9lbmRfc3RhY2sgPSA0O1xuICB2YXIgZW52X3N0YWNrc2l6ZSA9IDU7XG4gIHZhciBlbnZfc3RhY2tiYXNlID0gNjtcbiAgdmFyIGVudl9jdXJyX2NoYXIgPSA3O1xuICB2YXIgZW52X2x2YWwgPSA4O1xuICB2YXIgZW52X3N5bWJfc3RhcnQgPSA5O1xuICB2YXIgZW52X3N5bWJfZW5kID0gMTA7XG4gIHZhciBlbnZfYXNwID0gMTE7XG4gIHZhciBlbnZfcnVsZV9sZW4gPSAxMjtcbiAgdmFyIGVudl9ydWxlX251bWJlciA9IDEzO1xuICB2YXIgZW52X3NwID0gMTQ7XG4gIHZhciBlbnZfc3RhdGUgPSAxNTtcbiAgdmFyIGVudl9lcnJmbGFnID0gMTY7XG5cbiAgLy8gdmFyIF90YmxfYWN0aW9ucyA9IDE7XG4gIHZhciB0YmxfdHJhbnNsX2NvbnN0ID0gMjtcbiAgdmFyIHRibF90cmFuc2xfYmxvY2sgPSAzO1xuICB2YXIgdGJsX2xocyA9IDQ7XG4gIHZhciB0YmxfbGVuID0gNTtcbiAgdmFyIHRibF9kZWZyZWQgPSA2O1xuICB2YXIgdGJsX2Rnb3RvID0gNztcbiAgdmFyIHRibF9zaW5kZXggPSA4O1xuICB2YXIgdGJsX3JpbmRleCA9IDk7XG4gIHZhciB0YmxfZ2luZGV4ID0gMTA7XG4gIHZhciB0YmxfdGFibGVzaXplID0gMTE7XG4gIHZhciB0YmxfdGFibGUgPSAxMjtcbiAgdmFyIHRibF9jaGVjayA9IDEzO1xuICAvLyB2YXIgX3RibF9lcnJvcl9mdW5jdGlvbiA9IDE0O1xuICB2YXIgdGJsX25hbWVzX2NvbnN0ID0gMTU7XG4gIHZhciB0YmxfbmFtZXNfYmxvY2sgPSAxNjtcblxuICBmdW5jdGlvbiBsb2coeCkge1xuICAgIHZhciBzID0gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyh4ICsgXCJcXG5cIik7XG4gICAgY2FtbF9tbF9vdXRwdXQoY2FtbF9zeXNfZmRzWzJdLmNoYW5pZCwgcywgMCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuX25hbWUobmFtZXMsIG51bWJlcikge1xuICAgIHZhciBzdHIgPSBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhuYW1lcyk7XG4gICAgaWYgKHN0clswXSA9PT0gXCJcXHgwMFwiKSByZXR1cm4gXCI8dW5rbm93biB0b2tlbj5cIjtcbiAgICByZXR1cm4gc3RyLnNwbGl0KFwiXFx4MDBcIilbbnVtYmVyXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50X3Rva2VuKHN0YXRlLCB0b2spIHtcbiAgICB2YXIgdG9rZW4sIGtpbmQ7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodG9rKSkge1xuICAgICAgdG9rZW4gPSB0b2tlbl9uYW1lKHRhYmxlc1t0YmxfbmFtZXNfYmxvY2tdLCB0b2tbMF0pO1xuICAgICAgaWYgKHR5cGVvZiB0b2tbMV0gPT09IFwibnVtYmVyXCIpIGtpbmQgPSBcIlwiICsgdG9rWzFdO1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHRva1sxXSA9PT0gXCJzdHJpbmdcIikga2luZCA9IHRva1sxXTtcbiAgICAgIGVsc2UgaWYgKHRva1sxXSBpbnN0YW5jZW9mIE1sQnl0ZXMpIGtpbmQgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHRva1sxXSk7XG4gICAgICBlbHNlIGtpbmQgPSBcIl9cIjtcbiAgICAgIGxvZyhcIlN0YXRlIFwiICsgc3RhdGUgKyBcIjogcmVhZCB0b2tlbiBcIiArIHRva2VuICsgXCIoXCIgKyBraW5kICsgXCIpXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b2tlbiA9IHRva2VuX25hbWUodGFibGVzW3RibF9uYW1lc19jb25zdF0sIHRvayk7XG4gICAgICBsb2coXCJTdGF0ZSBcIiArIHN0YXRlICsgXCI6IHJlYWQgdG9rZW4gXCIgKyB0b2tlbik7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF0YWJsZXMuZGdvdG8pIHtcbiAgICB0YWJsZXMuZGVmcmVkID0gY2FtbF9sZXhfYXJyYXkodGFibGVzW3RibF9kZWZyZWRdKTtcbiAgICB0YWJsZXMuc2luZGV4ID0gY2FtbF9sZXhfYXJyYXkodGFibGVzW3RibF9zaW5kZXhdKTtcbiAgICB0YWJsZXMuY2hlY2sgPSBjYW1sX2xleF9hcnJheSh0YWJsZXNbdGJsX2NoZWNrXSk7XG4gICAgdGFibGVzLnJpbmRleCA9IGNhbWxfbGV4X2FycmF5KHRhYmxlc1t0YmxfcmluZGV4XSk7XG4gICAgdGFibGVzLnRhYmxlID0gY2FtbF9sZXhfYXJyYXkodGFibGVzW3RibF90YWJsZV0pO1xuICAgIHRhYmxlcy5sZW4gPSBjYW1sX2xleF9hcnJheSh0YWJsZXNbdGJsX2xlbl0pO1xuICAgIHRhYmxlcy5saHMgPSBjYW1sX2xleF9hcnJheSh0YWJsZXNbdGJsX2xoc10pO1xuICAgIHRhYmxlcy5naW5kZXggPSBjYW1sX2xleF9hcnJheSh0YWJsZXNbdGJsX2dpbmRleF0pO1xuICAgIHRhYmxlcy5kZ290byA9IGNhbWxfbGV4X2FycmF5KHRhYmxlc1t0YmxfZGdvdG9dKTtcbiAgfVxuXG4gIHZhciByZXMgPSAwLFxuICAgIG4sXG4gICAgbjEsXG4gICAgbjIsXG4gICAgc3RhdGUxO1xuXG4gIC8vIFJFU1RPUkVcbiAgdmFyIHNwID0gZW52W2Vudl9zcF07XG4gIHZhciBzdGF0ZSA9IGVudltlbnZfc3RhdGVdO1xuICB2YXIgZXJyZmxhZyA9IGVudltlbnZfZXJyZmxhZ107XG5cbiAgdGhlX2xvb3A6IGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGNtZCkge1xuICAgICAgY2FzZSAwOiAvL1NUQVJUOlxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRmFsbHRocm91Z2hTd2l0Y2hDbGF1c2U6XG4gICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgZXJyZmxhZyA9IDA7XG4gICAgICAvLyBmYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIDY6IC8vbG9vcDpcbiAgICAgICAgbiA9IHRhYmxlcy5kZWZyZWRbc3RhdGVdO1xuICAgICAgICBpZiAobiAhPT0gMCkge1xuICAgICAgICAgIGNtZCA9IHJlZHVjZTtcbiAgICAgICAgICBjb250aW51ZSB0aGVfbG9vcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW52W2Vudl9jdXJyX2NoYXJdID49IDApIHtcbiAgICAgICAgICBjbWQgPSB0ZXN0c2hpZnQ7XG4gICAgICAgICAgY29udGludWUgdGhlX2xvb3A7XG4gICAgICAgIH1cbiAgICAgICAgcmVzID0gUkVBRF9UT0tFTjtcbiAgICAgICAgYnJlYWsgdGhlX2xvb3A7XG4gICAgICAvKiBUaGUgTUwgY29kZSBjYWxscyB0aGUgbGV4ZXIgYW5kIHVwZGF0ZXMgKi9cbiAgICAgIC8qIHN5bWJfc3RhcnQgYW5kIHN5bWJfZW5kICovXG4gICAgICBjYXNlIDE6IC8vVE9LRU5fUkVBRDpcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICAgICAgZW52W2Vudl9jdXJyX2NoYXJdID0gdGFibGVzW3RibF90cmFuc2xfYmxvY2tdW2FyZ1swXSArIDFdO1xuICAgICAgICAgIGVudltlbnZfbHZhbF0gPSBhcmdbMV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW52W2Vudl9jdXJyX2NoYXJdID0gdGFibGVzW3RibF90cmFuc2xfY29uc3RdW2FyZyArIDFdO1xuICAgICAgICAgIGVudltlbnZfbHZhbF0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYW1sX3BhcnNlcl90cmFjZSkgcHJpbnRfdG9rZW4oc3RhdGUsIGFyZyk7XG4gICAgICAvLyBmYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIDc6IC8vdGVzdHNoaWZ0OlxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRmFsbHRocm91Z2hTd2l0Y2hDbGF1c2U6XG4gICAgICAgIG4xID0gdGFibGVzLnNpbmRleFtzdGF0ZV07XG4gICAgICAgIG4yID0gbjEgKyBlbnZbZW52X2N1cnJfY2hhcl07XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuMSAhPT0gMCAmJlxuICAgICAgICAgIG4yID49IDAgJiZcbiAgICAgICAgICBuMiA8PSB0YWJsZXNbdGJsX3RhYmxlc2l6ZV0gJiZcbiAgICAgICAgICB0YWJsZXMuY2hlY2tbbjJdID09PSBlbnZbZW52X2N1cnJfY2hhcl1cbiAgICAgICAgKSB7XG4gICAgICAgICAgY21kID0gc2hpZnQ7XG4gICAgICAgICAgY29udGludWUgdGhlX2xvb3A7XG4gICAgICAgIH1cbiAgICAgICAgbjEgPSB0YWJsZXMucmluZGV4W3N0YXRlXTtcbiAgICAgICAgbjIgPSBuMSArIGVudltlbnZfY3Vycl9jaGFyXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG4xICE9PSAwICYmXG4gICAgICAgICAgbjIgPj0gMCAmJlxuICAgICAgICAgIG4yIDw9IHRhYmxlc1t0YmxfdGFibGVzaXplXSAmJlxuICAgICAgICAgIHRhYmxlcy5jaGVja1tuMl0gPT09IGVudltlbnZfY3Vycl9jaGFyXVxuICAgICAgICApIHtcbiAgICAgICAgICBuID0gdGFibGVzLnRhYmxlW24yXTtcbiAgICAgICAgICBjbWQgPSByZWR1Y2U7XG4gICAgICAgICAgY29udGludWUgdGhlX2xvb3A7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycmZsYWcgPD0gMCkge1xuICAgICAgICAgIHJlcyA9IENBTExfRVJST1JfRlVOQ1RJT047XG4gICAgICAgICAgYnJlYWsgdGhlX2xvb3A7XG4gICAgICAgIH1cbiAgICAgIC8vIGZhbGx0aHJvdWdoXG4gICAgICAvKiBUaGUgTUwgY29kZSBjYWxscyB0aGUgZXJyb3IgZnVuY3Rpb24gKi9cbiAgICAgIGNhc2UgNTogLy9FUlJPUl9ERVRFQ1RFRDpcbiAgICAgICAgaWYgKGVycmZsYWcgPCAzKSB7XG4gICAgICAgICAgZXJyZmxhZyA9IDM7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgc3RhdGUxID0gZW52W2Vudl9zX3N0YWNrXVtzcCArIDFdO1xuICAgICAgICAgICAgbjEgPSB0YWJsZXMuc2luZGV4W3N0YXRlMV07XG4gICAgICAgICAgICBuMiA9IG4xICsgRVJSQ09ERTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgbjEgIT09IDAgJiZcbiAgICAgICAgICAgICAgbjIgPj0gMCAmJlxuICAgICAgICAgICAgICBuMiA8PSB0YWJsZXNbdGJsX3RhYmxlc2l6ZV0gJiZcbiAgICAgICAgICAgICAgdGFibGVzLmNoZWNrW24yXSA9PT0gRVJSQ09ERVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmIChjYW1sX3BhcnNlcl90cmFjZSkgbG9nKFwiUmVjb3ZlcmluZyBpbiBzdGF0ZSBcIiArIHN0YXRlMSk7XG4gICAgICAgICAgICAgIGNtZCA9IHNoaWZ0X3JlY292ZXI7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIHRoZV9sb29wO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKGNhbWxfcGFyc2VyX3RyYWNlKSBsb2coXCJEaXNjYXJkaW5nIHN0YXRlIFwiICsgc3RhdGUxKTtcbiAgICAgICAgICAgICAgaWYgKHNwIDw9IGVudltlbnZfc3RhY2tiYXNlXSkge1xuICAgICAgICAgICAgICAgIGlmIChjYW1sX3BhcnNlcl90cmFjZSkgbG9nKFwiTm8gbW9yZSBzdGF0ZXMgdG8gZGlzY2FyZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUkFJU0VfUEFSU0VfRVJST1I7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLyogVGhlIE1MIGNvZGUgcmFpc2VzIFBhcnNlX2Vycm9yICovXG4gICAgICAgICAgICAgIHNwLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChlbnZbZW52X2N1cnJfY2hhcl0gPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUkFJU0VfUEFSU0VfRVJST1I7IC8qIFRoZSBNTCBjb2RlIHJhaXNlcyBQYXJzZV9lcnJvciAqL1xuICAgICAgICAgIGlmIChjYW1sX3BhcnNlcl90cmFjZSkgbG9nKFwiRGlzY2FyZGluZyBsYXN0IHRva2VuIHJlYWRcIik7XG4gICAgICAgICAgZW52W2Vudl9jdXJyX2NoYXJdID0gLTE7XG4gICAgICAgICAgY21kID0gbG9vcDtcbiAgICAgICAgICBjb250aW51ZSB0aGVfbG9vcDtcbiAgICAgICAgfVxuICAgICAgLy8gVW5yZWFjaGFibGVcbiAgICAgIGNhc2UgODogLy9zaGlmdDpcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgICBlbnZbZW52X2N1cnJfY2hhcl0gPSAtMTtcbiAgICAgICAgaWYgKGVycmZsYWcgPiAwKSBlcnJmbGFnLS07XG4gICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgY2FzZSA5OiAvL3NoaWZ0X3JlY292ZXI6XG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9GYWxsdGhyb3VnaFN3aXRjaENsYXVzZTpcbiAgICAgICAgaWYgKGNhbWxfcGFyc2VyX3RyYWNlKVxuICAgICAgICAgIGxvZyhcIlN0YXRlIFwiICsgc3RhdGUgKyBcIjogc2hpZnQgdG8gc3RhdGUgXCIgKyB0YWJsZXMudGFibGVbbjJdKTtcbiAgICAgICAgc3RhdGUgPSB0YWJsZXMudGFibGVbbjJdO1xuICAgICAgICBzcCsrO1xuICAgICAgICBpZiAoc3AgPj0gZW52W2Vudl9zdGFja3NpemVdKSB7XG4gICAgICAgICAgcmVzID0gR1JPV19TVEFDS1NfMTtcbiAgICAgICAgICBicmVhayB0aGVfbG9vcDtcbiAgICAgICAgfVxuICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgIC8qIFRoZSBNTCBjb2RlIHJlc2l6ZXMgdGhlIHN0YWNrcyAqL1xuICAgICAgY2FzZSAyOiAvL1NUQUNLU19HUk9XTl8xOlxuICAgICAgICBlbnZbZW52X3Nfc3RhY2tdW3NwICsgMV0gPSBzdGF0ZTtcbiAgICAgICAgZW52W2Vudl92X3N0YWNrXVtzcCArIDFdID0gZW52W2Vudl9sdmFsXTtcbiAgICAgICAgZW52W2Vudl9zeW1iX3N0YXJ0X3N0YWNrXVtzcCArIDFdID0gZW52W2Vudl9zeW1iX3N0YXJ0XTtcbiAgICAgICAgZW52W2Vudl9zeW1iX2VuZF9zdGFja11bc3AgKyAxXSA9IGVudltlbnZfc3ltYl9lbmRdO1xuICAgICAgICBjbWQgPSBsb29wO1xuICAgICAgICBjb250aW51ZSB0aGVfbG9vcDtcblxuICAgICAgY2FzZSAxMDogLy9yZWR1Y2U6XG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9GYWxsdGhyb3VnaFN3aXRjaENsYXVzZTpcbiAgICAgICAgaWYgKGNhbWxfcGFyc2VyX3RyYWNlKSBsb2coXCJTdGF0ZSBcIiArIHN0YXRlICsgXCI6IHJlZHVjZSBieSBydWxlIFwiICsgbik7XG4gICAgICAgIHZhciBtID0gdGFibGVzLmxlbltuXTtcbiAgICAgICAgZW52W2Vudl9hc3BdID0gc3A7XG4gICAgICAgIGVudltlbnZfcnVsZV9udW1iZXJdID0gbjtcbiAgICAgICAgZW52W2Vudl9ydWxlX2xlbl0gPSBtO1xuICAgICAgICBzcCA9IHNwIC0gbSArIDE7XG4gICAgICAgIG0gPSB0YWJsZXMubGhzW25dO1xuICAgICAgICBzdGF0ZTEgPSBlbnZbZW52X3Nfc3RhY2tdW3NwXTtcbiAgICAgICAgbjEgPSB0YWJsZXMuZ2luZGV4W21dO1xuICAgICAgICBuMiA9IG4xICsgc3RhdGUxO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbjEgIT09IDAgJiZcbiAgICAgICAgICBuMiA+PSAwICYmXG4gICAgICAgICAgbjIgPD0gdGFibGVzW3RibF90YWJsZXNpemVdICYmXG4gICAgICAgICAgdGFibGVzLmNoZWNrW24yXSA9PT0gc3RhdGUxXG4gICAgICAgIClcbiAgICAgICAgICBzdGF0ZSA9IHRhYmxlcy50YWJsZVtuMl07XG4gICAgICAgIGVsc2Ugc3RhdGUgPSB0YWJsZXMuZGdvdG9bbV07XG4gICAgICAgIGlmIChzcCA+PSBlbnZbZW52X3N0YWNrc2l6ZV0pIHtcbiAgICAgICAgICByZXMgPSBHUk9XX1NUQUNLU18yO1xuICAgICAgICAgIGJyZWFrIHRoZV9sb29wO1xuICAgICAgICB9XG4gICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgLyogVGhlIE1MIGNvZGUgcmVzaXplcyB0aGUgc3RhY2tzICovXG4gICAgICBjYXNlIDM6IC8vU1RBQ0tTX0dST1dOXzI6XG4gICAgICAgIHJlcyA9IENPTVBVVEVfU0VNQU5USUNfQUNUSU9OO1xuICAgICAgICBicmVhayB0aGVfbG9vcDtcbiAgICAgIC8qIFRoZSBNTCBjb2RlIGNhbGxzIHRoZSBzZW1hbnRpYyBhY3Rpb24gKi9cbiAgICAgIGNhc2UgNDogLy9TRU1BTlRJQ19BQ1RJT05fQ09NUFVURUQ6XG4gICAgICAgIGVudltlbnZfc19zdGFja11bc3AgKyAxXSA9IHN0YXRlO1xuICAgICAgICBlbnZbZW52X3Zfc3RhY2tdW3NwICsgMV0gPSBhcmc7XG4gICAgICAgIHZhciBhc3AgPSBlbnZbZW52X2FzcF07XG4gICAgICAgIGVudltlbnZfc3ltYl9lbmRfc3RhY2tdW3NwICsgMV0gPSBlbnZbZW52X3N5bWJfZW5kX3N0YWNrXVthc3AgKyAxXTtcbiAgICAgICAgaWYgKHNwID4gYXNwKSB7XG4gICAgICAgICAgLyogVGhpcyBpcyBhbiBlcHNpbG9uIHByb2R1Y3Rpb24uIFRha2Ugc3ltYl9zdGFydCBlcXVhbCB0byBzeW1iX2VuZC4gKi9cbiAgICAgICAgICBlbnZbZW52X3N5bWJfc3RhcnRfc3RhY2tdW3NwICsgMV0gPSBlbnZbZW52X3N5bWJfZW5kX3N0YWNrXVthc3AgKyAxXTtcbiAgICAgICAgfVxuICAgICAgICBjbWQgPSBsb29wO1xuICAgICAgICBjb250aW51ZSB0aGVfbG9vcDtcbiAgICAgIC8qIFNob3VsZCBub3QgaGFwcGVuICovXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gUkFJU0VfUEFSU0VfRVJST1I7XG4gICAgfVxuICB9XG4gIC8vIFNBVkVcbiAgZW52W2Vudl9zcF0gPSBzcDtcbiAgZW52W2Vudl9zdGF0ZV0gPSBzdGF0ZTtcbiAgZW52W2Vudl9lcnJmbGFnXSA9IGVycmZsYWc7XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc2V0X3BhcnNlcl90cmFjZVxuLy9SZXF1aXJlczogY2FtbF9wYXJzZXJfdHJhY2VcbmZ1bmN0aW9uIGNhbWxfc2V0X3BhcnNlcl90cmFjZShib29sKSB7XG4gIHZhciBvbGRmbGFnID0gY2FtbF9wYXJzZXJfdHJhY2U7XG4gIGNhbWxfcGFyc2VyX3RyYWNlID0gYm9vbDtcbiAgcmV0dXJuIG9sZGZsYWc7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMjAgLSBIdWdvIEhldXphcmRcbi8vIENvcHlyaWdodCAoQykgMjAyMCAtIFNoYWNoYXIgSXR6aGFreVxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2Jsb2IvNC4wNy9vdGhlcmxpYnMvc3RyL3N0cnN0dWJzLmNcbi8vIENvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qc2NvcS9qc2NvcS9ibG9iL3Y4LjExL2NvcS1qcy9qc19zdHViL3N0ci5qc1xuXG4vL1Byb3ZpZGVzOiByZV9tYXRjaFxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZywgY2FtbF9qc19mcm9tX2FycmF5LCBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfZ2V0XG5cbnZhciByZV9tYXRjaCA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciByZV93b3JkX2xldHRlcnMgPSBbXG4gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCAvKiAweDAwLTB4MUY6IG5vbmUgKi8sIDB4MDAsIDB4MDAsIDB4ZmYsXG4gICAgMHgwMyAvKiAweDIwLTB4M0Y6IGRpZ2l0cyAwLTkgKi8sIDB4ZmUsIDB4ZmYsIDB4ZmYsXG4gICAgMHg4NyAvKiAweDQwLTB4NUY6IEEgdG8gWiwgXyAqLywgMHhmZSwgMHhmZiwgMHhmZixcbiAgICAweDA3IC8qIDB4NjAtMHg3RjogYSB0byB6ICovLCAweDAwLCAweDAwLCAweDAwLCAweDAwIC8qIDB4ODAtMHg5Rjogbm9uZSAqLyxcbiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwIC8qIDB4QTAtMHhCRjogbm9uZSAqLywgMHhmZiwgMHhmZiwgMHg3ZixcbiAgICAweGZmIC8qIDB4QzAtMHhERjogTGF0aW4tMSBhY2NlbnRlZCB1cHBlcmNhc2UgKi8sIDB4ZmYsIDB4ZmYsIDB4N2YsXG4gICAgMHhmZiAvKiAweEUwLTB4RkY6IExhdGluLTEgYWNjZW50ZWQgbG93ZXJjYXNlICovLFxuICBdO1xuXG4gIHZhciBvcGNvZGVzID0ge1xuICAgIENIQVI6IDAsXG4gICAgQ0hBUk5PUk06IDEsXG4gICAgU1RSSU5HOiAyLFxuICAgIFNUUklOR05PUk06IDMsXG4gICAgQ0hBUkNMQVNTOiA0LFxuICAgIEJPTDogNSxcbiAgICBFT0w6IDYsXG4gICAgV09SREJPVU5EQVJZOiA3LFxuICAgIEJFR0dST1VQOiA4LFxuICAgIEVOREdST1VQOiA5LFxuICAgIFJFRkdST1VQOiAxMCxcbiAgICBBQ0NFUFQ6IDExLFxuICAgIFNJTVBMRU9QVDogMTIsXG4gICAgU0lNUExFU1RBUjogMTMsXG4gICAgU0lNUExFUExVUzogMTQsXG4gICAgR09UTzogMTUsXG4gICAgUFVTSEJBQ0s6IDE2LFxuICAgIFNFVE1BUks6IDE3LFxuICAgIENIRUNLUFJPR1JFU1M6IDE4LFxuICB9O1xuXG4gIGZ1bmN0aW9uIGlzX3dvcmRfbGV0dGVyKGMpIHtcbiAgICByZXR1cm4gKHJlX3dvcmRfbGV0dGVyc1tjID4+IDNdID4+IChjICYgNykpICYgMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluX2JpdHNldChzLCBpKSB7XG4gICAgcmV0dXJuIChjYW1sX3N0cmluZ19nZXQocywgaSA+PiAzKSA+PiAoaSAmIDcpKSAmIDE7XG4gIH1cblxuICBmdW5jdGlvbiByZV9tYXRjaF9pbXBsKHJlLCBzLCBwb3MsIHBhcnRpYWwpIHtcbiAgICB2YXIgcHJvZyA9IGNhbWxfanNfZnJvbV9hcnJheShyZVsxXSksXG4gICAgICBjcG9vbCA9IGNhbWxfanNfZnJvbV9hcnJheShyZVsyXSksXG4gICAgICBub3JtdGFibGUgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHJlWzNdKSxcbiAgICAgIG51bWdyb3VwcyA9IHJlWzRdIHwgMCxcbiAgICAgIG51bXJlZ2lzdGVycyA9IHJlWzVdIHwgMDtcblxuICAgIHZhciBzID0gY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmcocyk7XG5cbiAgICB2YXIgcGMgPSAwLFxuICAgICAgcXVpdCA9IGZhbHNlLFxuICAgICAgc3RhY2sgPSBbXSxcbiAgICAgIGdyb3VwcyA9IG5ldyBBcnJheShudW1ncm91cHMpLFxuICAgICAgcmVfcmVnaXN0ZXIgPSBuZXcgQXJyYXkobnVtcmVnaXN0ZXJzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBncm91cHNbaV0gPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuICAgIH1cbiAgICBncm91cHNbMF0uc3RhcnQgPSBwb3M7XG5cbiAgICB2YXIgYmFja3RyYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICB2YXIgaXRlbSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICBpZiAoaXRlbS51bmRvKSB7XG4gICAgICAgICAgaXRlbS51bmRvLm9ialtpdGVtLnVuZG8ucHJvcF0gPSBpdGVtLnVuZG8udmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS5wb3MpIHtcbiAgICAgICAgICBwYyA9IGl0ZW0ucG9zLnBjO1xuICAgICAgICAgIHBvcyA9IGl0ZW0ucG9zLnR4dDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHF1aXQgPSB0cnVlO1xuICAgIH07XG5cbiAgICB2YXIgcHVzaCA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICBzdGFjay5wdXNoKGl0ZW0pO1xuICAgIH07XG5cbiAgICB2YXIgYWNjZXB0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgZ3JvdXBzWzBdLmVuZCA9IHBvcztcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkoMSArIGdyb3Vwcy5sZW5ndGggKiAyKTtcbiAgICAgIHJlc3VsdFswXSA9IDA7IC8vIHRhZ1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGcgPSBncm91cHNbaV07XG4gICAgICAgIGlmIChnLnN0YXJ0IDwgMCB8fCBnLmVuZCA8IDApIHtcbiAgICAgICAgICBnLnN0YXJ0ID0gZy5lbmQgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbMiAqIGkgKyAxXSA9IGcuc3RhcnQ7XG4gICAgICAgIHJlc3VsdFsyICogaSArIDEgKyAxXSA9IGcuZW5kO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgdmFyIHByZWZpeF9tYXRjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChwYXJ0aWFsKSByZXR1cm4gYWNjZXB0KCk7XG4gICAgICBlbHNlIGJhY2t0cmFjaygpO1xuICAgIH07XG5cbiAgICAvKiBNYWluIERGQSBpbnRlcnByZXRlciBsb29wICovXG4gICAgd2hpbGUgKCFxdWl0KSB7XG4gICAgICB2YXIgb3AgPSBwcm9nW3BjXSAmIDB4ZmYsXG4gICAgICAgIHNhcmcgPSBwcm9nW3BjXSA+PiA4LFxuICAgICAgICB1YXJnID0gc2FyZyAmIDB4ZmYsXG4gICAgICAgIGMgPSBzW3Bvc10sXG4gICAgICAgIGdyb3VwO1xuXG4gICAgICBwYysrO1xuXG4gICAgICBzd2l0Y2ggKG9wKSB7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5DSEFSOlxuICAgICAgICAgIGlmIChwb3MgPT09IHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBwcmVmaXhfbWF0Y2goKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYyA9PT0gdWFyZykgcG9zKys7XG4gICAgICAgICAgZWxzZSBiYWNrdHJhY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBvcGNvZGVzLkNIQVJOT1JNOlxuICAgICAgICAgIGlmIChwb3MgPT09IHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBwcmVmaXhfbWF0Y2goKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobm9ybXRhYmxlLmNoYXJDb2RlQXQoYykgPT09IHVhcmcpIHBvcysrO1xuICAgICAgICAgIGVsc2UgYmFja3RyYWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5TVFJJTkc6XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIHZhciBhcmcgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGNwb29sW3VhcmddKSwgaSA9IDA7XG4gICAgICAgICAgICBpIDwgYXJnLmxlbmd0aDtcbiAgICAgICAgICAgIGkrK1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKHBvcyA9PT0gcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcHJlZml4X21hdGNoKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMgPT09IGFyZy5jaGFyQ29kZUF0KGkpKSBjID0gc1srK3Bvc107XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgYmFja3RyYWNrKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBvcGNvZGVzLlNUUklOR05PUk06XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIHZhciBhcmcgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGNwb29sW3VhcmddKSwgaSA9IDA7XG4gICAgICAgICAgICBpIDwgYXJnLmxlbmd0aDtcbiAgICAgICAgICAgIGkrK1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKHBvcyA9PT0gcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcHJlZml4X21hdGNoKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vcm10YWJsZS5jaGFyQ29kZUF0KGMpID09PSBhcmcuY2hhckNvZGVBdChpKSkgYyA9IHNbKytwb3NdO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGJhY2t0cmFjaygpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5DSEFSQ0xBU1M6XG4gICAgICAgICAgaWYgKHBvcyA9PT0gcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHByZWZpeF9tYXRjaCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbl9iaXRzZXQoY3Bvb2xbdWFyZ10sIGMpKSBwb3MrKztcbiAgICAgICAgICBlbHNlIGJhY2t0cmFjaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuQk9MOlxuICAgICAgICAgIGlmIChwb3MgPiAwICYmIHNbcG9zIC0gMV0gIT09IDEwIC8qIFxcbiAqLykge1xuICAgICAgICAgICAgYmFja3RyYWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuRU9MOlxuICAgICAgICAgIGlmIChwb3MgPCBzLmxlbmd0aCAmJiBzW3Bvc10gIT09IDEwIC8qIFxcbiAqLykge1xuICAgICAgICAgICAgYmFja3RyYWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuV09SREJPVU5EQVJZOlxuICAgICAgICAgIGlmIChwb3MgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChwb3MgPT09IHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHByZWZpeF9tYXRjaCgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc193b3JkX2xldHRlcihzWzBdKSkgYnJlYWs7XG4gICAgICAgICAgICBiYWNrdHJhY2soKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBvcyA9PT0gcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChpc193b3JkX2xldHRlcihzW3BvcyAtIDFdKSkgYnJlYWs7XG4gICAgICAgICAgICBiYWNrdHJhY2soKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlzX3dvcmRfbGV0dGVyKHNbcG9zIC0gMV0pICE9PSBpc193b3JkX2xldHRlcihzW3Bvc10pKSBicmVhaztcbiAgICAgICAgICAgIGJhY2t0cmFjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBvcGNvZGVzLkJFR0dST1VQOlxuICAgICAgICAgIGdyb3VwID0gZ3JvdXBzW3VhcmddO1xuICAgICAgICAgIHB1c2goeyB1bmRvOiB7IG9iajogZ3JvdXAsIHByb3A6IFwic3RhcnRcIiwgdmFsdWU6IGdyb3VwLnN0YXJ0IH0gfSk7XG4gICAgICAgICAgZ3JvdXAuc3RhcnQgPSBwb3M7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5FTkRHUk9VUDpcbiAgICAgICAgICBncm91cCA9IGdyb3Vwc1t1YXJnXTtcbiAgICAgICAgICBwdXNoKHsgdW5kbzogeyBvYmo6IGdyb3VwLCBwcm9wOiBcImVuZFwiLCB2YWx1ZTogZ3JvdXAuZW5kIH0gfSk7XG4gICAgICAgICAgZ3JvdXAuZW5kID0gcG9zO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuUkVGR1JPVVA6XG4gICAgICAgICAgZ3JvdXAgPSBncm91cHNbdWFyZ107XG4gICAgICAgICAgaWYgKGdyb3VwLnN0YXJ0IDwgMCB8fCBncm91cC5lbmQgPCAwKSB7XG4gICAgICAgICAgICBiYWNrdHJhY2soKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKHZhciBpID0gZ3JvdXAuc3RhcnQ7IGkgPCBncm91cC5lbmQ7IGkrKykge1xuICAgICAgICAgICAgaWYgKHBvcyA9PT0gcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcHJlZml4X21hdGNoKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNbaV0gIT09IHNbcG9zXSkge1xuICAgICAgICAgICAgICBiYWNrdHJhY2soKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5TSU1QTEVPUFQ6XG4gICAgICAgICAgaWYgKGluX2JpdHNldChjcG9vbFt1YXJnXSwgYykpIHBvcysrO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuU0lNUExFU1RBUjpcbiAgICAgICAgICB3aGlsZSAoaW5fYml0c2V0KGNwb29sW3VhcmddLCBjKSkgYyA9IHNbKytwb3NdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuU0lNUExFUExVUzpcbiAgICAgICAgICBpZiAocG9zID09PSBzLmxlbmd0aCkge1xuICAgICAgICAgICAgcHJlZml4X21hdGNoKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGluX2JpdHNldChjcG9vbFt1YXJnXSwgYykpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgYyA9IHNbKytwb3NdO1xuICAgICAgICAgICAgfSB3aGlsZSAoaW5fYml0c2V0KGNwb29sW3VhcmddLCBjKSk7XG4gICAgICAgICAgfSBlbHNlIGJhY2t0cmFjaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuQUNDRVBUOlxuICAgICAgICAgIHJldHVybiBhY2NlcHQoKTtcbiAgICAgICAgY2FzZSBvcGNvZGVzLkdPVE86XG4gICAgICAgICAgcGMgPSBwYyArIHNhcmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5QVVNIQkFDSzpcbiAgICAgICAgICBwdXNoKHsgcG9zOiB7IHBjOiBwYyArIHNhcmcsIHR4dDogcG9zIH0gfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5TRVRNQVJLOlxuICAgICAgICAgIHB1c2goe1xuICAgICAgICAgICAgdW5kbzogeyBvYmo6IHJlX3JlZ2lzdGVyLCBwcm9wOiB1YXJnLCB2YWx1ZTogcmVfcmVnaXN0ZXJbdWFyZ10gfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZV9yZWdpc3Rlclt1YXJnXSA9IHBvcztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBvcGNvZGVzLkNIRUNLUFJPR1JFU1M6XG4gICAgICAgICAgaWYgKHJlX3JlZ2lzdGVyW3VhcmddID09PSBwb3MpIGJhY2t0cmFjaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYnl0ZWNvZGVcIik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcmV0dXJuIHJlX21hdGNoX2ltcGw7XG59KSgpO1xuXG4vL1Byb3ZpZGVzOiByZV9zZWFyY2hfZm9yd2FyZFxuLy9SZXF1aXJlczogcmVfbWF0Y2gsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19nZXRcbmZ1bmN0aW9uIHJlX3NlYXJjaF9mb3J3YXJkKHJlLCBzLCBwb3MpIHtcbiAgaWYgKHBvcyA8IDAgfHwgcG9zID4gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIlN0ci5zZWFyY2hfZm9yd2FyZFwiKTtcbiAgdmFyIHN0YXJ0Y2hhcnMgPSByZVs2XSB8IDA7XG4gIHZhciBsZW4gPSBjYW1sX21sX3N0cmluZ19sZW5ndGgocyk7XG4gIGlmIChzdGFydGNoYXJzID49IDApIHtcbiAgICBzdGFydGNoYXJzID0gcmVbMl1bc3RhcnRjaGFycyArIDFdO1xuICAgIGRvIHtcbiAgICAgIHdoaWxlIChcbiAgICAgICAgcG9zIDwgbGVuICYmXG4gICAgICAgIGNhbWxfc3RyaW5nX2dldChzdGFydGNoYXJzLCBjYW1sX3N0cmluZ19nZXQocywgcG9zKSkgPT09IDBcbiAgICAgIClcbiAgICAgICAgcG9zKys7XG4gICAgICB2YXIgcmVzID0gcmVfbWF0Y2gocmUsIHMsIHBvcywgMCk7XG4gICAgICBpZiAocmVzKSByZXR1cm4gcmVzO1xuICAgICAgcG9zKys7XG4gICAgfSB3aGlsZSAocG9zIDw9IGxlbik7XG4gIH0gZWxzZSB7XG4gICAgZG8ge1xuICAgICAgdmFyIHJlcyA9IHJlX21hdGNoKHJlLCBzLCBwb3MsIDApO1xuICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICAgIHBvcysrO1xuICAgIH0gd2hpbGUgKHBvcyA8PSBsZW4pO1xuICB9XG4gIHJldHVybiBbMF07IC8qIFt8fF0gOiBpbnQgYXJyYXkgKi9cbn1cblxuLy9Qcm92aWRlczogcmVfc2VhcmNoX2JhY2t3YXJkXG4vL1JlcXVpcmVzOiByZV9tYXRjaCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLCBjYW1sX2ludmFsaWRfYXJndW1lbnRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX2dldFxuZnVuY3Rpb24gcmVfc2VhcmNoX2JhY2t3YXJkKHJlLCBzLCBwb3MpIHtcbiAgaWYgKHBvcyA8IDAgfHwgcG9zID4gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIlN0ci5zZWFyY2hfYmFja3dhcmRcIik7XG4gIHZhciBzdGFydGNoYXJzID0gcmVbNl0gfCAwO1xuICBpZiAoc3RhcnRjaGFycyA+PSAwKSB7XG4gICAgc3RhcnRjaGFycyA9IHJlWzJdW3N0YXJ0Y2hhcnMgKyAxXTtcbiAgICB2YXIgbGVuID0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpO1xuICAgIGRvIHtcbiAgICAgIHdoaWxlIChcbiAgICAgICAgcG9zID4gMCAmJlxuICAgICAgICBwb3MgPCBsZW4gJiZcbiAgICAgICAgY2FtbF9zdHJpbmdfZ2V0KHN0YXJ0Y2hhcnMsIGNhbWxfc3RyaW5nX2dldChzLCBwb3MpKSA9PT0gMFxuICAgICAgKVxuICAgICAgICBwb3MtLTtcbiAgICAgIHZhciByZXMgPSByZV9tYXRjaChyZSwgcywgcG9zLCAwKTtcbiAgICAgIGlmIChyZXMpIHJldHVybiByZXM7XG4gICAgICBwb3MtLTtcbiAgICB9IHdoaWxlIChwb3MgPj0gMCk7XG4gIH0gZWxzZSB7XG4gICAgZG8ge1xuICAgICAgdmFyIHJlcyA9IHJlX21hdGNoKHJlLCBzLCBwb3MsIDApO1xuICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICAgIHBvcy0tO1xuICAgIH0gd2hpbGUgKHBvcyA+PSAwKTtcbiAgfVxuICByZXR1cm4gWzBdOyAvKiBbfHxdIDogaW50IGFycmF5ICovXG59XG5cbi8vUHJvdmlkZXM6IHJlX3N0cmluZ19tYXRjaFxuLy9SZXF1aXJlczogcmVfbWF0Y2gsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiByZV9zdHJpbmdfbWF0Y2gocmUsIHMsIHBvcykge1xuICBpZiAocG9zIDwgMCB8fCBwb3MgPiBjYW1sX21sX3N0cmluZ19sZW5ndGgocykpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiU3RyLnN0cmluZ19tYXRjaFwiKTtcbiAgdmFyIHJlcyA9IHJlX21hdGNoKHJlLCBzLCBwb3MsIDApO1xuICBpZiAocmVzKSByZXR1cm4gcmVzO1xuICBlbHNlIHJldHVybiBbMF07XG59XG5cbi8vUHJvdmlkZXM6IHJlX3BhcnRpYWxfbWF0Y2hcbi8vUmVxdWlyZXM6IHJlX21hdGNoLCBjYW1sX21sX3N0cmluZ19sZW5ndGgsIGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gcmVfcGFydGlhbF9tYXRjaChyZSwgcywgcG9zKSB7XG4gIGlmIChwb3MgPCAwIHx8IHBvcyA+IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSlcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJTdHIucGFydGlhbF9tYXRjaFwiKTtcbiAgdmFyIHJlcyA9IHJlX21hdGNoKHJlLCBzLCBwb3MsIDEpO1xuICBpZiAocmVzKSByZXR1cm4gcmVzO1xuICBlbHNlIHJldHVybiBbMF07XG59XG5cbi8vUHJvdmlkZXM6IHJlX3JlcGxhY2VtZW50X3RleHRcbi8vUmVxdWlyZXM6IGNhbWxfanNieXRlc19vZl9zdHJpbmcsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vLyBleHRlcm5hbCByZV9yZXBsYWNlbWVudF90ZXh0OiBzdHJpbmcgLT4gaW50IGFycmF5IC0+IHN0cmluZyAtPiBzdHJpbmdcbmZ1bmN0aW9uIHJlX3JlcGxhY2VtZW50X3RleHQocmVwbCwgZ3JvdXBzLCBvcmlnKSB7XG4gIHZhciByZXBsID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhyZXBsKTtcbiAgdmFyIGxlbiA9IHJlcGwubGVuZ3RoO1xuICB2YXIgb3JpZyA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcob3JpZyk7XG4gIHZhciByZXMgPSBcIlwiOyAvL3Jlc3VsdFxuICB2YXIgbiA9IDA7IC8vIGN1cnJlbnQgcG9zaXRpb25cbiAgdmFyIGN1cjsgLy9jdXJyZW50IGNoYXJcbiAgdmFyIHN0YXJ0LCBlbmQsIGM7XG4gIHdoaWxlIChuIDwgbGVuKSB7XG4gICAgY3VyID0gcmVwbC5jaGFyQXQobisrKTtcbiAgICBpZiAoY3VyICE9PSBcIlxcXFxcIikge1xuICAgICAgcmVzICs9IGN1cjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG4gPT09IGxlbikgY2FtbF9mYWlsd2l0aChcIlN0ci5yZXBsYWNlOiBpbGxlZ2FsIGJhY2tzbGFzaCBzZXF1ZW5jZVwiKTtcbiAgICAgIGN1ciA9IHJlcGwuY2hhckF0KG4rKyk7XG4gICAgICBzd2l0Y2ggKGN1cikge1xuICAgICAgICBjYXNlIFwiXFxcXFwiOlxuICAgICAgICAgIHJlcyArPSBjdXI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCIwXCI6XG4gICAgICAgIGNhc2UgXCIxXCI6XG4gICAgICAgIGNhc2UgXCIyXCI6XG4gICAgICAgIGNhc2UgXCIzXCI6XG4gICAgICAgIGNhc2UgXCI0XCI6XG4gICAgICAgIGNhc2UgXCI1XCI6XG4gICAgICAgIGNhc2UgXCI2XCI6XG4gICAgICAgIGNhc2UgXCI3XCI6XG4gICAgICAgIGNhc2UgXCI4XCI6XG4gICAgICAgIGNhc2UgXCI5XCI6XG4gICAgICAgICAgYyA9ICtjdXI7XG4gICAgICAgICAgaWYgKGMgKiAyID49IGdyb3Vwcy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgY2FtbF9mYWlsd2l0aChcIlN0ci5yZXBsYWNlOiByZWZlcmVuY2UgdG8gdW5tYXRjaGVkIGdyb3VwXCIpO1xuICAgICAgICAgIHN0YXJ0ID0gY2FtbF9hcnJheV9nZXQoZ3JvdXBzLCBjICogMik7XG4gICAgICAgICAgZW5kID0gY2FtbF9hcnJheV9nZXQoZ3JvdXBzLCBjICogMiArIDEpO1xuICAgICAgICAgIGlmIChzdGFydCA9PT0gLTEpXG4gICAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwiU3RyLnJlcGxhY2U6IHJlZmVyZW5jZSB0byB1bm1hdGNoZWQgZ3JvdXBcIik7XG4gICAgICAgICAgcmVzICs9IG9yaWcuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmVzICs9IFwiXFxcXFwiICsgY3VyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhyZXMpO1xufVxuIl0sIm5hbWVzIjpbImNzdF9PdXRfb2ZfbWVtb3J5IiwiY3N0X1N5c19lcnJvciIsImNzdF9GYWlsdXJlIiwiY3N0X0ludmFsaWRfYXJndW1lbnQiLCJjc3RfRW5kX29mX2ZpbGUiLCJjc3RfRGl2aXNpb25fYnlfemVybyIsImNzdF9Ob3RfZm91bmQiLCJjc3RfTWF0Y2hfZmFpbHVyZSIsImNzdF9TdGFja19vdmVyZmxvdyIsImNzdF9TeXNfYmxvY2tlZF9pbyIsImNzdF9Bc3NlcnRfZmFpbHVyZSIsImNzdF9VbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZSJdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQTtBQUFBO0FBQUEsR0FBQTtBQUFBO0FBQUE7QUFBQSxRQUFBO0FBQUEsU0FBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQUFBO0FBQUEsSUFBQTtBQUFBLElBQUE7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O0FBQUE7QUFBQTtBQUFBLFdBR3FCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsV0FNUjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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Q0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBRUosSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBRUosSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBRUosSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBRUosT0FBTztBQUFBLFNBQ1AsT0FBTztBQUFBLFNBQ1AsT0FBTztBQUFBLFNBQ1AsT0FBTyxhQTdFRixDQThFTjtBQUFBLE9BbkdzQjtBQUFBLE9BQUQ7QUFB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QUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0p6YUE7QUFBQSxPQUFBQSxvQkFBQTtBQUFBO0FBQUEsT0FBQUMsZ0JBQUE7QUFBQTtBQUFBLE9BQUFDLGNBQUE7QUFBQTtBQUFBLE9BQUFDLHVCQUFBO0FBQUE7QUFBQTtBQUFBLE9BQUFDLGtCQUFBO0FBQUE7QUFBQSxPQUFBQyx1QkFBQTtBQUFBO0FBQUE7QUFBQSxPQUFBQyxnQkFBQTtBQUFBO0FBQUEsT0FBQUMsb0JBQUE7QUFBQTtBQUFBLE9BQUFDLHFCQUFBO0FBQUE7QUFBQSxPQUFBQyxxQkFBQTtBQUFBO0FBQUEsT0FBQUMscUJBQUE7QUFBQTtBQUFBO0FBQUEsT0FBQUMsaUNBQUEiLCJpZ25vcmVMaXN0IjpbMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOF19fSx7Im9mZnNldCI6eyJsaW5lIjo5MzE0LCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2NhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICBCZW5vaXQgVmF1Z29uLCBFTlNUQSAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTQgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogUGFkZGluZyBwb3NpdGlvbi4gKilcbnR5cGUgcGFkdHkgPVxuICB8IExlZnQgICAoKiBUZXh0IGlzIGxlZnQganVzdGlmaWVkICgnLScgb3B0aW9uKS4gICAgICAgICAgICAgICAqKVxuICB8IFJpZ2h0ICAoKiBUZXh0IGlzIHJpZ2h0IGp1c3RpZmllZCAobm8gJy0nIG9wdGlvbikuICAgICAgICAgICAqKVxuICB8IFplcm9zICAoKiBUZXh0IGlzIHJpZ2h0IGp1c3RpZmllZCBieSB6ZXJvcyAoc2VlICcwJyBvcHRpb24pLiAqKVxuXG4oKioqKVxuXG4oKiBJbnRlZ2VyIGNvbnZlcnNpb24uICopXG50eXBlIGludF9jb252ID1cbiAgfCBJbnRfZCB8IEludF9wZCB8IEludF9zZCAgICAgICAgKCogICVkIHwgJStkIHwgJSBkICAqKVxuICB8IEludF9pIHwgSW50X3BpIHwgSW50X3NpICAgICAgICAoKiAgJWkgfCAlK2kgfCAlIGkgICopXG4gIHwgSW50X3ggfCBJbnRfQ3ggICAgICAgICAgICAgICAgICgqICAleCB8ICUjeCAgICAgICAgKilcbiAgfCBJbnRfWCB8IEludF9DWCAgICAgICAgICAgICAgICAgKCogICVYIHwgJSNYICAgICAgICAqKVxuICB8IEludF9vIHwgSW50X0NvICAgICAgICAgICAgICAgICAoKiAgJW8gfCAlI28gICAgICAgICopXG4gIHwgSW50X3UgICAgICAgICAgICAgICAgICAgICAgICAgICgqICAldSAgICAgICAgICAgICAgKilcbiAgfCBJbnRfQ2QgfCBJbnRfQ2kgfCBJbnRfQ3UgICAgICAgKCogICUjZCB8ICUjaSB8ICUjdSAqKVxuXG4oKiBGbG9hdCBjb252ZXJzaW9uLiAqKVxudHlwZSBmbG9hdF9mbGFnX2NvbnYgPVxuICB8IEZsb2F0X2ZsYWdfICAgICAgICAgICAgICAgICAgICAoKiAlW2ZlRWdHRmhIXSAqKVxuICB8IEZsb2F0X2ZsYWdfcCAgICAgICAgICAgICAgICAgICAoKiAlK1tmZUVnR0ZoSF0gKilcbiAgfCBGbG9hdF9mbGFnX3MgICAgICAgICAgICAgICAgICAgKCogJSBbZmVFZ0dGaEhdICopXG50eXBlIGZsb2F0X2tpbmRfY29udiA9XG4gIHwgRmxvYXRfZiAgICAgICAgICAgICAgICAgICAgICAgICgqICAlZiB8ICUrZiB8ICUgZiAgKilcbiAgfCBGbG9hdF9lICAgICAgICAgICAgICAgICAgICAgICAgKCogICVlIHwgJStlIHwgJSBlICAqKVxuICB8IEZsb2F0X0UgICAgICAgICAgICAgICAgICAgICAgICAoKiAgJUUgfCAlK0UgfCAlIEUgICopXG4gIHwgRmxvYXRfZyAgICAgICAgICAgICAgICAgICAgICAgICgqICAlZyB8ICUrZyB8ICUgZyAgKilcbiAgfCBGbG9hdF9HICAgICAgICAgICAgICAgICAgICAgICAgKCogICVHIHwgJStHIHwgJSBHICAqKVxuICB8IEZsb2F0X0YgICAgICAgICAgICAgICAgICAgICAgICAoKiAgJUYgfCAlK0YgfCAlIEYgICopXG4gIHwgRmxvYXRfaCAgICAgICAgICAgICAgICAgICAgICAgICgqICAlaCB8ICUraCB8ICUgaCAgKilcbiAgfCBGbG9hdF9IICAgICAgICAgICAgICAgICAgICAgICAgKCogICVIIHwgJStIIHwgJSBIICAqKVxuICB8IEZsb2F0X0NGICAgICAgICAgICAgICAgICAgICAgICAoKiAgJSNGfCAlKyNGfCAlICNGICopXG50eXBlIGZsb2F0X2NvbnYgPSBmbG9hdF9mbGFnX2NvbnYgKiBmbG9hdF9raW5kX2NvbnZcblxuKCoqKilcblxuKCogQ2hhciBzZXRzIChzZWUgJVsuLi5dKSBhcmUgYml0bWFwcyBpbXBsZW1lbnRlZCBhcyAzMi1jaGFyIHN0cmluZ3MuICopXG50eXBlIGNoYXJfc2V0ID0gc3RyaW5nXG5cbigqKiopXG5cbigqIENvdW50ZXIgdXNlZCBpbiBTY2FuZi4gKilcbnR5cGUgY291bnRlciA9XG4gIHwgTGluZV9jb3VudGVyICAgICAoKiAgJWwgICAgICAqKVxuICB8IENoYXJfY291bnRlciAgICAgKCogICVuICAgICAgKilcbiAgfCBUb2tlbl9jb3VudGVyICAgICgqICAlTiwgJUwgICopXG5cbigqKiopXG5cbigqIFBhZGRpbmcgb2Ygc3RyaW5ncyBhbmQgbnVtYmVycy4gKilcbnR5cGUgKCdhLCAnYikgcGFkZGluZyA9XG4gICgqIE5vIHBhZGRpbmcgKGV4OiBcIiVkXCIpICopXG4gIHwgTm9fcGFkZGluZyAgOiAoJ2EsICdhKSBwYWRkaW5nXG4gICgqIExpdGVyYWwgcGFkZGluZyAoZXg6IFwiJThkXCIpICopXG4gIHwgTGl0X3BhZGRpbmcgOiBwYWR0eSAqIGludCAtPiAoJ2EsICdhKSBwYWRkaW5nXG4gICgqIFBhZGRpbmcgYXMgZXh0cmEgYXJndW1lbnQgKGV4OiBcIiUqZFwiKSAqKVxuICB8IEFyZ19wYWRkaW5nIDogcGFkdHkgLT4gKGludCAtPiAnYSwgJ2EpIHBhZGRpbmdcblxuKCogU29tZSBmb3JtYXRzLCBzdWNoIGFzICVfZCxcbiAgIG9ubHkgYWNjZXB0IGFuIG9wdGlvbmFsIG51bWJlciBhcyBwYWRkaW5nIG9wdGlvbiAobm8gZXh0cmEgYXJndW1lbnQpICopXG50eXBlIHBhZF9vcHRpb24gPSBpbnQgb3B0aW9uXG5cbigqIFByZWNpc2lvbiBvZiBmbG9hdHMgYW5kICcwJy1wYWRkaW5nIG9mIGludGVnZXJzLiAqKVxudHlwZSAoJ2EsICdiKSBwcmVjaXNpb24gPVxuICAoKiBObyBwcmVjaXNpb24gKGV4OiBcIiVmXCIpICopXG4gIHwgTm9fcHJlY2lzaW9uIDogKCdhLCAnYSkgcHJlY2lzaW9uXG4gICgqIExpdGVyYWwgcHJlY2lzaW9uIChleDogXCIlLjNmXCIpICopXG4gIHwgTGl0X3ByZWNpc2lvbiA6IGludCAtPiAoJ2EsICdhKSBwcmVjaXNpb25cbiAgKCogUHJlY2lzaW9uIGFzIGV4dHJhIGFyZ3VtZW50IChleDogXCIlLipmXCIpICopXG4gIHwgQXJnX3ByZWNpc2lvbiA6IChpbnQgLT4gJ2EsICdhKSBwcmVjaXNpb25cblxuKCogU29tZSBmb3JtYXRzLCBzdWNoIGFzICVfZixcbiAgIG9ubHkgYWNjZXB0IGFuIG9wdGlvbmFsIG51bWJlciBhcyBwcmVjaXNpb24gb3B0aW9uIChubyBleHRyYSBhcmd1bWVudCkgKilcbnR5cGUgcHJlY19vcHRpb24gPSBpbnQgb3B0aW9uXG5cbigqIHNlZSB0aGUgQ3VzdG9tIGZvcm1hdCBjb21iaW5hdG9yICopXG50eXBlICgnYSwgJ2IsICdjKSBjdXN0b21fYXJpdHkgPVxuICB8IEN1c3RvbV96ZXJvIDogKCdhLCBzdHJpbmcsICdhKSBjdXN0b21fYXJpdHlcbiAgfCBDdXN0b21fc3VjYyA6ICgnYSwgJ2IsICdjKSBjdXN0b21fYXJpdHkgLT5cbiAgICAoJ2EsICd4IC0+ICdiLCAneCAtPiAnYykgY3VzdG9tX2FyaXR5XG5cbigqKiopXG5cbigqICAgICAgICBSZWxhdGlvbmFsIGZvcm1hdCB0eXBlc1xuXG5JbiB0aGUgZmlyc3QgZm9ybWF0K2dhZHRzIGltcGxlbWVudGF0aW9uLCB0aGUgdHlwZSBmb3IgJSguLiUpIGluIHRoZVxuZm10IEdBRFQgd2FzIGFzIGZvbGxvd3M6XG5cbnwgRm9ybWF0X3N1YnN0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJSguLi4lKSAqKVxuICAgIHBhZF9vcHRpb24gKiAoJ2QxLCAncTEsICdkMiwgJ3EyKSByZWFkZXJfbmJfdW5pZmllciAqXG4gICAgKCd4LCAnYiwgJ2MsICdkMSwgJ3ExLCAndSkgZm10dHkgKlxuICAgICgndSwgJ2IsICdjLCAncTEsICdlMSwgJ2YpIGZtdCAtPlxuICAgICAgKCgneCwgJ2IsICdjLCAnZDIsICdxMiwgJ3UpIGZvcm1hdDYgLT4gJ3gsICdiLCAnYywgJ2QxLCAnZTEsICdmKSBmbXRcblxuTm90aWNlIHRoYXQgdGhlICd1IHBhcmFtZXRlciBpbiAnZiBwb3NpdGlvbiBpbiB0aGUgZm9ybWF0IGFyZ3VtZW50XG4oKCd4LCAuLiwgJ3UpIGZvcm1hdDYgLT4gLi4pIGlzIGVxdWFsIHRvIHRoZSAndSBwYXJhbWV0ZXIgaW4gJ2FcbnBvc2l0aW9uIGluIHRoZSBmb3JtYXQgdGFpbCAoKCd1LCAuLiwgJ2YpIGZtdCkuIFRoaXMgbWVhbnMgdGhhdCB0aGVcbnR5cGUgb2YgdGhlIGV4cGVjdGVkIGZvcm1hdCBwYXJhbWV0ZXIgZGVwZW5kcyBvZiB3aGVyZSB0aGUgJSguLi4lKVxuYXJlIGluIHRoZSBmb3JtYXQgc3RyaW5nOlxuXG4gICMgUHJpbnRmLnByaW50ZiBcIiUoJSlcIlxuICAtIDogKHVuaXQsIG91dF9jaGFubmVsLCB1bml0LCAnX2EsICdfYSwgdW5pdClcbiAgICAgIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5mb3JtYXQ2IC0+IHVuaXRcbiAgPSA8ZnVuPlxuICAjIFByaW50Zi5wcmludGYgXCIlKCUpJWRcIlxuICAtIDogKGludCAtPiB1bml0LCBvdXRfY2hhbm5lbCwgdW5pdCwgJ19hLCAnX2EsIGludCAtPiB1bml0KVxuICAgICAgQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzLmZvcm1hdDYgLT4gaW50IC0+IHVuaXRcbiAgPSA8ZnVuPlxuXG5PbiB0aGUgY29udHJhcnksIHRoZSBsZWdhY3kgdHlwZXIgZ2l2ZXMgYSBjbGV2ZXIgdHlwZSB0aGF0IGRvZXMgbm90XG5kZXBlbmQgb24gdGhlIHBvc2l0aW9uIG9mICUoLi4lKSBpbiB0aGUgZm9ybWF0IHN0cmluZy4gRm9yIGV4YW1wbGUsXG4lKCUpIHdpbGwgaGF2ZSB0aGUgcG9seW1vcnBoaWMgdHlwZSAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSk6IGl0IGNhblxuYmUgY29uY2F0ZW5hdGVkIHRvIGFueSBmb3JtYXQgdHlwZSwgYW5kIG9ubHkgZW5mb3JjZXMgdGhlIGNvbnN0cmFpbnRcbnRoYXQgaXRzICdhIGFuZCAnZiBwYXJhbWV0ZXJzIGFyZSBlcXVhbCAobm8gZm9ybWF0IGFyZ3VtZW50cykgYW5kICdkXG5hbmQgJ2UgYXJlIGVxdWFsIChubyByZWFkZXIgYXJndW1lbnQpLlxuXG5UaGUgd2Vha2VuaW5nIG9mIHRoaXMgcGFyYW1ldGVyIHR5cGUgaW4gdGhlIEdBRFQgdmVyc2lvbiBicm9rZSB1c2VyXG5jb2RlIChpbiBmYWN0IGl0IGVzc2VudGlhbGx5IG1hZGUgJSguLi4lKSB1bnVzYWJsZSBleGNlcHQgYXQgdGhlIGxhc3RcbnBvc2l0aW9uIG9mIGEgZm9ybWF0KS4gSW4gcGFydGljdWxhciwgdGhlIGZvbGxvd2luZyB3b3VsZCBub3Qgd29ya1xuYW55bW9yZTpcblxuICBmdW4gc2VwIC0+XG4gICAgRm9ybWF0LnByaW50ZiBcImZvbyUoJSliYXIlKCUpYmF6XCIgc2VwIHNlcFxuXG5BcyB0aGUgdHlwZS1jaGVja2VyIHdvdWxkIHJlcXVpcmUgdHdvICppbmNvbXBhdGlibGUqIHR5cGVzIGZvciB0aGUgJSglKVxuaW4gZGlmZmVyZW50IHBvc2l0aW9ucy5cblxuVGhlIHNvbHV0aW9uIHRvIHJlZ2FpbiBhIGdlbmVyYWwgdHlwZSBmb3IgJSguLiUpIGlzIHRvIGdlbmVyYWxpemUgdGhpc1xudGVjaG5pcXVlLCBub3Qgb25seSBvbiB0aGUgJ2QsICdlIHBhcmFtZXRlcnMsIGJ1dCBvbiBhbGwgc2l4XG5wYXJhbWV0ZXJzIG9mIGEgZm9ybWF0OiB3ZSBpbnRyb2R1Y2UgYSBcInJlbGF0aW9uYWxcIiB0eXBlXG4gICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG53aG9zZSB2YWx1ZXMgYXJlIHByb29mcyB0aGF0ICgnYTEsIC4uLCAnZjEpIGFuZCAoJ2EyLCAuLiwgJ2YyKSBtb3JhbGx5XG5jb3JyZXNwb25kIHRvIHRoZSBzYW1lIGZvcm1hdCB0eXBlOiAnYTEgaXMgb2J0YWluZWQgZnJvbSAnZjEsJ2IxLCdjMVxuaW4gdGhlIGV4YWN0IHNhbWUgd2F5IHRoYXQgJ2EyIGlzIG9idGFpbmVkIGZyb20gJ2YyLCdiMiwnYzIsIGV0Yy5cblxuRm9yIGV4YW1wbGUsIHRoZSByZWxhdGlvbiBiZXR3ZWVuIHR3byBmb3JtYXQgdHlwZXMgYmVnaW5uaW5nIHdpdGggYSBDaGFyXG5wYXJhbWV0ZXIgaXMgYXMgZm9sbG93czpcblxufCBDaGFyX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWMgICopXG4gICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgIChjaGFyIC0+ICdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgIGNoYXIgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG5cbkluIHRoZSBnZW5lcmFsIGNhc2UsIHRoZSB0ZXJtIHN0cnVjdHVyZSBvZiBmbXR0eV9yZWwgaXMgKGFsbW9zdFsxXSlcbmlzb21vcnBoaWMgdG8gdGhlIGZtdHR5IG9mIHRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbjogZXZlcnlcbmNvbnN0cnVjdG9yIGlzIHJlLXJlYWQgd2l0aCBhIGJpbmFyeSwgcmVsYXRpb25hbCB0eXBlLCBpbnN0ZWFkIG9mIHRoZVxucHJldmlvdXMgdW5hcnkgdHlwaW5nLiBmbXR0eSBjYW4gdGhlbiBiZSByZS1kZWZpbmVkIGFzIHRoZSBkaWFnb25hbCBvZlxuZm10dHlfcmVsOlxuXG4gIHR5cGUgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5ID1cbiAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZixcbiAgICAgICAgJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHlfcmVsXG5cbk9uY2Ugd2UgaGF2ZSB0aGlzIGZtdHR5X3JlbCB0eXBlIGluIHBsYWNlLCB3ZSBjYW4gZ2l2ZSB0aGUgbW9yZVxuZ2VuZXJhbCB0eXBlIHRvICUoLi4uJSk6XG5cbnwgRm9ybWF0X3N1YnN0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJSguLi4lKSAqKVxuICAgIHBhZF9vcHRpb24gKlxuICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsLFxuICAgICAnZzIsICdiLCAnYywgJ2oyLCAnZCwgJ2EpIGZtdHR5X3JlbCAqXG4gICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICgoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnZzIsICdiLCAnYywgJ2oyLCAnZSwgJ2YpIGZtdFxuXG5XZSBhY2NlcHQgYW55IGZvcm1hdCAoKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZvcm1hdDYpICh0aGlzIGlzXG5jb21wbGV0ZWx5IHVucmVsYXRlZCB0byB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBmb3JtYXQpLCBidXQgYWxzb1xucmVxdWlyZSBhIHByb29mIHRoYXQgdGhpcyBmb3JtYXQgaXMgaW4gcmVsYXRpb24gdG8gYW5vdGhlciBmb3JtYXQgdGhhdFxuaXMgY29uY2F0ZW5hYmxlIHRvIHRoZSBmb3JtYXQgdGFpbC4gV2hlbiBleGVjdXRpbmcgYSAlKC4uLiUpIGZvcm1hdFxuKGluIGNhbWxpbnRlcm5hbEZvcm1hdC5tbDptYWtlX3ByaW50ZiBvciBzY2FuZi5tbDptYWtlX3NjYW5mKSwgd2VcbnRyYW5zdHlwZSB0aGUgZm9ybWF0IGFsb25nIHRoaXMgcmVsYXRpb24gdXNpbmcgdGhlICdyZWNhc3QnIGZ1bmN0aW9uXG50byB0cmFuc3Bvc2UgYmV0d2VlbiByZWxhdGVkIGZvcm1hdCB0eXBlcy5cblxuICB2YWwgcmVjYXN0IDpcbiAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEpIGZtdFxuICAtPiAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICAtPiAoJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10XG5cbk5PVEUgWzFdOiB0aGUgdHlwaW5nIG9mIEZvcm1hdF9zdWJzdF90eSByZXF1aXJlcyBub3Qgb25lIGZvcm1hdCB0eXBlLCBidXRcbnR3bywgb25lIHRvIGVzdGFibGlzaCB0aGUgbGluayBiZXR3ZWVuIHRoZSBmb3JtYXQgYXJndW1lbnQgYW5kIHRoZVxuZmlyc3Qgc2l4IHBhcmFtZXRlcnMsIGFuZCB0aGUgb3RoZXIgZm9yIHRoZSBsaW5rIGJldHdlZW4gdGhlIGZvcm1hdFxuYXJndW1lbnQgYW5kIHRoZSBsYXN0IHNpeCBwYXJhbWV0ZXJzLlxuXG58IEZvcm1hdF9zdWJzdF90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlKC4uLiUpICopXG4gICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICdnMSwgJ2IxLCAnYzEsICdqMSwgJ2QxLCAnYTEpIGZtdHR5X3JlbCAqXG4gICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICdnMiwgJ2IyLCAnYzIsICdqMiwgJ2QyLCAnYTIpIGZtdHR5X3JlbCAqXG4gICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICgoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnZzEsICdiMSwgJ2MxLCAnajEsICdlMSwgJ2YxLFxuICAgICAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnZzIsICdiMiwgJ2MyLCAnajIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcblxuV2hlbiB3ZSBnZW5lcmF0ZSBhIGZvcm1hdCBBU1QsIHdlIGdlbmVyYXRlIGV4YWN0bHkgdGhlIHNhbWUgd2l0bmVzc1xuZm9yIGJvdGggcmVsYXRpb25zLCBhbmQgdGhlIHdpdG5lc3MtY29udmVyc2lvbiBmdW5jdGlvbnMgaW5cbmNhbWxpbnRlcm5hbEZvcm1hdCBkbyByZWx5IG9uIHRoaXMgaW52YXJpYW50LiBGb3IgZXhhbXBsZSwgdGhlXG5mdW5jdGlvbiB0aGF0IHByb3ZlcyB0aGF0IHRoZSByZWxhdGlvbiBpcyB0cmFuc2l0aXZlXG5cbiAgdmFsIHRyYW5zIDpcbiAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgLT4gKCdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIsXG4gICAgICAnYTMsICdiMywgJ2MzLCAnZDMsICdlMywgJ2YzKSBmbXR0eV9yZWxcbiAgLT4gKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAnYTMsICdiMywgJ2MzLCAnZDMsICdlMywgJ2YzKSBmbXR0eV9yZWxcblxuZG9lcyBhc3N1bWUgdGhhdCB0aGUgdHdvIGlucHV0cyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgdGVybSBzdHJ1Y3R1cmVcbihhbmQgaXMgb25seSBldmVyeSB1c2VkIGZvciBhcmd1bWVudCB3aXRuZXNzZXMgb2YgdGhlXG5Gb3JtYXRfc3Vic3RfdHkgY29uc3RydWN0b3IpLlxuKilcblxuKCogVHlwZSBvZiBhIGJsb2NrIHVzZWQgYnkgdGhlIEZvcm1hdCBwcmV0dHktcHJpbnRlci4gKilcbnR5cGUgYmxvY2tfdHlwZSA9XG4gIHwgUHBfaGJveCAgICgqIEhvcml6b250YWwgYmxvY2sgbm8gbGluZSBicmVha2luZyAqKVxuICB8IFBwX3Zib3ggICAoKiBWZXJ0aWNhbCBibG9jayBlYWNoIGJyZWFrIGxlYWRzIHRvIGEgbmV3IGxpbmUgKilcbiAgfCBQcF9odmJveCAgKCogSG9yaXpvbnRhbC12ZXJ0aWNhbCBibG9jazogc2FtZSBhcyB2Ym94LCBleGNlcHQgaWYgdGhpcyBibG9ja1xuICAgICAgICAgICAgICAgICBpcyBzbWFsbCBlbm91Z2ggdG8gZml0IG9uIGEgc2luZ2xlIGxpbmUgKilcbiAgfCBQcF9ob3Zib3ggKCogSG9yaXpvbnRhbCBvciBWZXJ0aWNhbCBibG9jazogYnJlYWtzIGxlYWQgdG8gbmV3IGxpbmVcbiAgICAgICAgICAgICAgICAgb25seSB3aGVuIG5lY2Vzc2FyeSB0byBwcmludCB0aGUgY29udGVudCBvZiB0aGUgYmxvY2sgKilcbiAgfCBQcF9ib3ggICAgKCogSG9yaXpvbnRhbCBvciBJbmRlbnQgYmxvY2s6IGJyZWFrcyBsZWFkIHRvIG5ldyBsaW5lXG4gICAgICAgICAgICAgICAgIG9ubHkgd2hlbiBuZWNlc3NhcnkgdG8gcHJpbnQgdGhlIGNvbnRlbnQgb2YgdGhlIGJsb2NrLCBvclxuICAgICAgICAgICAgICAgICB3aGVuIGl0IGxlYWRzIHRvIGEgbmV3IGluZGVudGF0aW9uIG9mIHRoZSBjdXJyZW50IGxpbmUgKilcbiAgfCBQcF9maXRzICAgKCogSW50ZXJuYWwgdXNhZ2U6IHdoZW4gYSBibG9jayBmaXRzIG9uIGEgc2luZ2xlIGxpbmUgKilcblxuKCogRm9ybWF0dGluZyBlbGVtZW50IHVzZWQgYnkgdGhlIEZvcm1hdCBwcmV0dHktcHJpbnRlci4gKilcbnR5cGUgZm9ybWF0dGluZ19saXQgPVxuICB8IENsb3NlX2JveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAXSAgICopXG4gIHwgQ2xvc2VfdGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEB9ICAgKilcbiAgfCBCcmVhayBvZiBzdHJpbmcgKiBpbnQgKiBpbnQgICAgICAgICAgKCogQCwgfCBAICB8IEA7IHwgQDs8PiAqKVxuICB8IEZGbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAPyAgICopXG4gIHwgRm9yY2VfbmV3bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEBcXG4gICopXG4gIHwgRmx1c2hfbmV3bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEAuICAgKilcbiAgfCBNYWdpY19zaXplIG9mIHN0cmluZyAqIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQDxuPiAqKVxuICB8IEVzY2FwZWRfYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAQCAgICopXG4gIHwgRXNjYXBlZF9wZXJjZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEAlJSAgKilcbiAgfCBTY2FuX2luZGljIG9mIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQFggICAqKVxuXG4oKiBGb3JtYXR0aW5nIGVsZW1lbnQgdXNlZCBieSB0aGUgRm9ybWF0IHByZXR0eS1wcmludGVyLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0dGluZ19nZW4gPVxuICB8IE9wZW5fdGFnIDogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgLT4gICAgICAoKiBAeyAgICopXG4gICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdHRpbmdfZ2VuXG4gIHwgT3Blbl9ib3ggOiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiAtPiAgICAgICgqIEBbICAgKilcbiAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0dGluZ19nZW5cblxuKCoqKilcblxuKCogTGlzdCBvZiBmb3JtYXQgdHlwZSBlbGVtZW50cy4gKilcbigqIEluIHBhcnRpY3VsYXIgdXNlZCB0byByZXByZXNlbnQgJSguLi4lKSBhbmQgJXsuLi4lfSBjb250ZW50cy4gKilcbmFuZCAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHkgPVxuICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZixcbiAgICAgICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5X3JlbFxuYW5kICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgPVxuICB8IENoYXJfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlYyAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKGNoYXIgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBjaGFyIC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IFN0cmluZ190eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlcyAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKHN0cmluZyAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgIHN0cmluZyAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBJbnRfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWQgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChpbnQgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBpbnQgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgSW50MzJfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVsZCAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoaW50MzIgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBpbnQzMiAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBOYXRpdmVpbnRfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJW5kICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChuYXRpdmVpbnQgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBuYXRpdmVpbnQgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgSW50NjRfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVMZCAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoaW50NjQgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBpbnQ2NCAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBGbG9hdF90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWYgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChmbG9hdCAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgIGZsb2F0IC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IEJvb2xfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlQiAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKGJvb2wgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBib29sIC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuXG4gIHwgRm9ybWF0X2FyZ190eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICV7Li4uJX0gKilcbiAgICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmbXR0eSAqXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpXG4gICAgICAgICAgIGZtdHR5X3JlbFxuICB8IEZvcm1hdF9zdWJzdF90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlKC4uLiUpICopXG4gICAgICAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCxcbiAgICAgICAnZzEsICdiMSwgJ2MxLCAnajEsICdkMSwgJ2ExKSBmbXR0eV9yZWwgKlxuICAgICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICAgJ2cyLCAnYjIsICdjMiwgJ2oyLCAnZDIsICdhMikgZm10dHlfcmVsICpcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKCgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdnMSwgJ2IxLCAnYzEsICdqMSwgJ2UxLCAnZjEsXG4gICAgICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZvcm1hdDYgLT4gJ2cyLCAnYjIsICdjMiwgJ2oyLCAnZTIsICdmMilcbiAgICAgICAgICAgZm10dHlfcmVsXG5cbiAgKCogUHJpbnRmIGFuZCBGb3JtYXQgc3BlY2lmaWMgY29uc3RydWN0b3JzLiAqKVxuICB8IEFscGhhX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlYSAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKCgnYjEgLT4gJ3ggLT4gJ2MxKSAtPiAneCAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICgnYjIgLT4gJ3ggLT4gJ2MyKSAtPiAneCAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBUaGV0YV90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXQgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgoJ2IxIC0+ICdjMSkgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAoJ2IyIC0+ICdjMikgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgQW55X3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBVc2VkIGZvciBjdXN0b20gZm9ybWF0cyAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoJ3ggLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAneCAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcblxuICAoKiBTY2FuZiBzcGVjaWZpYyBjb25zdHJ1Y3Rvci4gKilcbiAgfCBSZWFkZXJfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXIgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgneCAtPiAnYTEsICdiMSwgJ2MxLCAoJ2IxIC0+ICd4KSAtPiAnZDEsICdlMSwgJ2YxLFxuICAgICAgICd4IC0+ICdhMiwgJ2IyLCAnYzIsICgnYjIgLT4gJ3gpIC0+ICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IElnbm9yZWRfcmVhZGVyX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX3IgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgnYTEsICdiMSwgJ2MxLCAoJ2IxIC0+ICd4KSAtPiAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICgnYjIgLT4gJ3gpIC0+ICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuXG4gIHwgRW5kX29mX2ZtdHR5IDpcbiAgICAgICgnZjEsICdiMSwgJ2MxLCAnZDEsICdkMSwgJ2YxLFxuICAgICAgICdmMiwgJ2IyLCAnYzIsICdkMiwgJ2QyLCAnZjIpIGZtdHR5X3JlbFxuXG4oKioqKVxuXG4oKiBMaXN0IG9mIGZvcm1hdCBlbGVtZW50cy4gKilcbmFuZCAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10ID1cbiAgfCBDaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlYyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoY2hhciAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBDYW1sX2NoYXIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlQyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoY2hhciAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBTdHJpbmcgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlcyAqKVxuICAgICAgKCd4LCBzdHJpbmcgLT4gJ2EpIHBhZGRpbmcgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBDYW1sX3N0cmluZyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlUyAqKVxuICAgICAgKCd4LCBzdHJpbmcgLT4gJ2EpIHBhZGRpbmcgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBJbnQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlW2RpeFh1b10gKilcbiAgICAgIGludF9jb252ICogKCd4LCAneSkgcGFkZGluZyAqICgneSwgaW50IC0+ICdhKSBwcmVjaXNpb24gKlxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgSW50MzIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWxbZGl4WHVvXSAqKVxuICAgICAgaW50X2NvbnYgKiAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCBpbnQzMiAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IE5hdGl2ZWludCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVuW2RpeFh1b10gKilcbiAgICAgIGludF9jb252ICogKCd4LCAneSkgcGFkZGluZyAqICgneSwgbmF0aXZlaW50IC0+ICdhKSBwcmVjaXNpb24gKlxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgSW50NjQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJUxbZGl4WHVvXSAqKVxuICAgICAgaW50X2NvbnYgKiAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCBpbnQ2NCAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEZsb2F0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVbZmVFZ0dGaEhdICopXG4gICAgICBmbG9hdF9jb252ICogKCd4LCAneSkgcGFkZGluZyAqICgneSwgZmxvYXQgLT4gJ2EpIHByZWNpc2lvbiAqXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBCb29sIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlW2JCXSAqKVxuICAgICAgKCd4LCBib29sIC0+ICdhKSBwYWRkaW5nICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgRmx1c2ggOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJSEgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuXG4gIHwgU3RyaW5nX2xpdGVyYWwgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogYWJjICopXG4gICAgICBzdHJpbmcgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBDaGFyX2xpdGVyYWwgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiB4ICopXG4gICAgICBjaGFyICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG5cbiAgfCBGb3JtYXRfYXJnIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAley4uLiV9ICopXG4gICAgICBwYWRfb3B0aW9uICogKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZtdHR5ICpcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEZvcm1hdF9zdWJzdCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICUoLi4uJSkgKilcbiAgICAgIHBhZF9vcHRpb24gKlxuICAgICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICAgJ2cyLCAnYiwgJ2MsICdqMiwgJ2QsICdhKSBmbXR0eV9yZWwgKlxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgKCgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdnMiwgJ2IsICdjLCAnajIsICdlLCAnZikgZm10XG5cbiAgKCogUHJpbnRmIGFuZCBGb3JtYXQgc3BlY2lmaWMgY29uc3RydWN0b3IuICopXG4gIHwgQWxwaGEgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWEgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCgnYiAtPiAneCAtPiAnYykgLT4gJ3ggLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgVGhldGEgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXQgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCgnYiAtPiAnYykgLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG5cbiAgKCogRm9ybWF0IHNwZWNpZmljIGNvbnN0cnVjdG9yOiAqKVxuICB8IEZvcm1hdHRpbmdfbGl0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEBfICopXG4gICAgICBmb3JtYXR0aW5nX2xpdCAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEZvcm1hdHRpbmdfZ2VuIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAXyAqKVxuICAgICAgKCdhMSwgJ2IsICdjLCAnZDEsICdlMSwgJ2YxKSBmb3JtYXR0aW5nX2dlbiAqXG4gICAgICAoJ2YxLCAnYiwgJ2MsICdlMSwgJ2UyLCAnZjIpIGZtdCAtPiAoJ2ExLCAnYiwgJ2MsICdkMSwgJ2UyLCAnZjIpIGZtdFxuXG4gICgqIFNjYW5mIHNwZWNpZmljIGNvbnN0cnVjdG9yczogKilcbiAgfCBSZWFkZXIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlciAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3ggLT4gJ2EsICdiLCAnYywgKCdiIC0+ICd4KSAtPiAnZCwgJ2UsICdmKSBmbXRcbiAgfCBTY2FuX2NoYXJfc2V0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlWy4uLl0gKilcbiAgICAgIHBhZF9vcHRpb24gKiBjaGFyX3NldCAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKHN0cmluZyAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBTY2FuX2dldF9jb3VudGVyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlW25sTkxdICopXG4gICAgICBjb3VudGVyICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoaW50IC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IFNjYW5fbmV4dF9jaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICUwYyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgKGNoYXIgLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgSWdub3JlZF9wYXJhbSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV8gKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ3ksICd4KSBpZ25vcmVkICogKCd4LCAnYiwgJ2MsICd5LCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG5cbiAgKCogQ3VzdG9tIHByaW50aW5nIGZvcm1hdCAoUFIjNjQ1MiwgR1BSIzE0MClcblxuICAgICBXZSBpbmNsdWRlIGEgdHlwZSBDdXN0b20gb2YgXCJjdXN0b20gY29udmVydGVyc1wiLCB3aGVyZSBhblxuICAgICBhcmJpdHJhcnkgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY29udmVydCBvbmUgb3IgbW9yZVxuICAgICBhcmd1bWVudHMuIFRoZXJlIGlzIG5vIHN5bnRheCBmb3IgY3VzdG9tIGNvbnZlcnRlcnMsIGl0IGlzIG9ubHlcbiAgICAgaW50ZW5kZWQgZm9yIGN1c3RvbSBwcm9jZXNzb3JzIHRoYXQgd2lzaCB0byByZWx5IG9uIHRoZVxuICAgICBzdGRsaWItZGVmaW5lZCBmb3JtYXQgR0FEVHMuXG5cbiAgICAgRm9yIGluc3RhbmNlIGEgcHJlLXByb2Nlc3NvciBjb3VsZCBjaG9vc2UgdG8gaW50ZXJwcmV0IHN0cmluZ3NcbiAgICAgcHJlZml4ZWQgd2l0aCBbXCIhXCJdIGFzIGZvcm1hdCBzdHJpbmdzIHdoZXJlIFsle3sgLi4uIH19XSBpc1xuICAgICBhIHNwZWNpYWwgZm9ybSB0byBwYXNzIGEgdG9fc3RyaW5nIGZ1bmN0aW9uLCBzbyB0aGF0IG9uZSBjb3VsZFxuICAgICB3cml0ZTpcblxuICAgICB7W1xuICAgICAgIHR5cGUgdCA9IHsgeCA6IGludDsgeSA6IGludCB9XG5cbiAgICAgICBsZXQgc3RyaW5nX29mX3QgdCA9IFByaW50Zi5zcHJpbnRmIFwieyB4ID0gJWQ7IHkgPSAlZCB9XCIgdC54IHQueVxuXG4gICAgICAgUHJpbnRmLnByaW50ZiAhXCJ0ID0gJXt7c3RyaW5nX29mX3R9fVwiIHsgeCA9IDQyOyB5ID0gNDIgfVxuICAgICBdfVxuICAqKVxuICB8IEN1c3RvbSA6XG4gICAgICAoJ2EsICd4LCAneSkgY3VzdG9tX2FyaXR5ICogKHVuaXQgLT4gJ3gpICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgKCd5LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuXG4gICgqIGVuZCBvZiBhIGZvcm1hdCBzcGVjaWZpY2F0aW9uICopXG4gIHwgRW5kX29mX2Zvcm1hdCA6XG4gICAgICAgICgnZiwgJ2IsICdjLCAnZSwgJ2UsICdmKSBmbXRcblxuKCoqKilcblxuKCogVHlwZSBmb3IgaWdub3JlZCBwYXJhbWV0ZXJzIChzZWUgXCIlX1wiKS4gKilcbmFuZCAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgaWdub3JlZCA9XG4gIHwgSWdub3JlZF9jaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9jICopXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfY2FtbF9jaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfQyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX3N0cmluZyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX3MgKilcbiAgICAgIHBhZF9vcHRpb24gLT4gKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2NhbWxfc3RyaW5nIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX1MgKilcbiAgICAgIHBhZF9vcHRpb24gLT4gKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2ludCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX2QgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfaW50MzIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfbGQgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfbmF0aXZlaW50IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfbmQgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfaW50NjQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfTGQgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfZmxvYXQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfZiAqKVxuICAgICAgcGFkX29wdGlvbiAqIHByZWNfb3B0aW9uIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9ib29sIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9CICopXG4gICAgICBwYWRfb3B0aW9uIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9mb3JtYXRfYXJnIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV97Li4uJX0gKilcbiAgICAgIHBhZF9vcHRpb24gKiAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm10dHkgLT5cbiAgICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2Zvcm1hdF9zdWJzdCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlXyguLi4lKSAqKVxuICAgICAgcGFkX29wdGlvbiAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXR0eSAtPlxuICAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgaWdub3JlZFxuICB8IElnbm9yZWRfcmVhZGVyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfciAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICgnYiAtPiAneCkgLT4gJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfc2Nhbl9jaGFyX3NldCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfWy4uLl0gKilcbiAgICAgIHBhZF9vcHRpb24gKiBjaGFyX3NldCAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfW25sTkxdICopXG4gICAgICBjb3VudGVyIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9zY2FuX25leHRfY2hhciA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV8wYyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcblxuYW5kICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2ID1cbiAgRm9ybWF0IG9mICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgKiBzdHJpbmdcblxubGV0IHJlYyBlcmFzZV9yZWwgOiB0eXBlIGEgYiBjIGQgZSBmIGcgaCBpIGogayBsIC5cbiAgKGEsIGIsIGMsIGQsIGUsIGYsXG4gICBnLCBoLCBpLCBqLCBrLCBsKSBmbXR0eV9yZWwgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5XG49IGZ1bmN0aW9uXG4gIHwgQ2hhcl90eSByZXN0IC0+XG4gICAgQ2hhcl90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgU3RyaW5nX3R5IHJlc3QgLT5cbiAgICBTdHJpbmdfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEludF90eSByZXN0IC0+XG4gICAgSW50X3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBJbnQzMl90eSByZXN0IC0+XG4gICAgSW50MzJfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEludDY0X3R5IHJlc3QgLT5cbiAgICBJbnQ2NF90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgLT5cbiAgICBOYXRpdmVpbnRfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEZsb2F0X3R5IHJlc3QgLT5cbiAgICBGbG9hdF90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgQm9vbF90eSByZXN0IC0+XG4gICAgQm9vbF90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgRm9ybWF0X2FyZ190eSAodHksIHJlc3QpIC0+XG4gICAgRm9ybWF0X2FyZ190eSAodHksIGVyYXNlX3JlbCByZXN0KVxuICB8IEZvcm1hdF9zdWJzdF90eSAodHkxLCBfdHkyLCByZXN0KSAtPlxuICAgIEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTEsIGVyYXNlX3JlbCByZXN0KVxuICB8IEFscGhhX3R5IHJlc3QgLT5cbiAgICBBbHBoYV90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgVGhldGFfdHkgcmVzdCAtPlxuICAgIFRoZXRhX3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBBbnlfdHkgcmVzdCAtPlxuICAgIEFueV90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgUmVhZGVyX3R5IHJlc3QgLT5cbiAgICBSZWFkZXJfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IElnbm9yZWRfcmVhZGVyX3R5IHJlc3QgLT5cbiAgICBJZ25vcmVkX3JlYWRlcl90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgRW5kX29mX2ZtdHR5IC0+IEVuZF9vZl9mbXR0eVxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdCB0eXBlIGNvbmNhdGVuYXRpb24gKilcblxuKCogQ29uY2F0ZW5hdGUgdHdvIGZvcm1hdCB0eXBlcy4gKilcbigqIFVzZWQgYnk6XG4gICAqIHJlYWRlcl9uYl91bmlmaWVyX29mX2ZtdHR5IHRvIGNvdW50IHJlYWRlcnMgaW4gYW4gZm10dHksXG4gICAqIFNjYW5mLnRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgdG8gZXh0cmFjdCByZWFkZXJzIGluc2lkZSAlKC4uLiUpLFxuICAgKiBDYW1saW50ZXJuYWxGb3JtYXQuZm10dHlfb2ZfaWdub3JlZF9mb3JtYXQgdG8gZXh0cmFjdCBmb3JtYXQgdHlwZS4gKilcblxuKCpcbmxldCByZWMgY29uY2F0X2ZtdHR5IDogdHlwZSBhIGIgYyBkIGUgZiBnIGggLlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSAtPlxuICAgIChmLCBiLCBjLCBlLCBnLCBoKSBmbXR0eSAtPlxuICAgIChhLCBiLCBjLCBkLCBnLCBoKSBmbXR0eSA9XG4qKVxubGV0IHJlYyBjb25jYXRfZm10dHkgOlxuICB0eXBlIGExIGIxIGMxIGQxIGUxIGYxXG4gICAgICAgYTIgYjIgYzIgZDIgZTIgZjJcbiAgICAgICBnMSBqMSBnMiBqMlxuICAuXG4gICAgKGcxLCBiMSwgYzEsIGoxLCBkMSwgYTEsXG4gICAgIGcyLCBiMiwgYzIsIGoyLCBkMiwgYTIpIGZtdHR5X3JlbCAtPlxuICAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxLFxuICAgICBhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXR0eV9yZWwgLT5cbiAgICAoZzEsIGIxLCBjMSwgajEsIGUxLCBmMSxcbiAgICAgZzIsIGIyLCBjMiwgajIsIGUyLCBmMikgZm10dHlfcmVsID1cbmZ1biBmbXR0eTEgZm10dHkyIC0+IG1hdGNoIGZtdHR5MSB3aXRoXG4gIHwgQ2hhcl90eSByZXN0IC0+XG4gICAgQ2hhcl90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IFN0cmluZ190eSByZXN0IC0+XG4gICAgU3RyaW5nX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgSW50X3R5IHJlc3QgLT5cbiAgICBJbnRfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBJbnQzMl90eSByZXN0IC0+XG4gICAgSW50MzJfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBOYXRpdmVpbnRfdHkgcmVzdCAtPlxuICAgIE5hdGl2ZWludF90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEludDY0X3R5IHJlc3QgLT5cbiAgICBJbnQ2NF90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEZsb2F0X3R5IHJlc3QgLT5cbiAgICBGbG9hdF90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEJvb2xfdHkgcmVzdCAtPlxuICAgIEJvb2xfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBBbHBoYV90eSByZXN0IC0+XG4gICAgQWxwaGFfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBUaGV0YV90eSByZXN0IC0+XG4gICAgVGhldGFfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBBbnlfdHkgcmVzdCAtPlxuICAgIEFueV90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IFJlYWRlcl90eSByZXN0IC0+XG4gICAgUmVhZGVyX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgcmVzdCAtPlxuICAgIElnbm9yZWRfcmVhZGVyX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgRm9ybWF0X2FyZ190eSAodHksIHJlc3QpIC0+XG4gICAgRm9ybWF0X2FyZ190eSAodHksIGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgdHkyLCByZXN0KSAtPlxuICAgIEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTIsIGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBFbmRfb2ZfZm10dHkgLT4gZm10dHkyXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBGb3JtYXQgY29uY2F0ZW5hdGlvbiAqKVxuXG4oKiBDb25jYXRlbmF0ZSB0d28gZm9ybWF0cy4gKilcbmxldCByZWMgY29uY2F0X2ZtdCA6IHR5cGUgYSBiIGMgZCBlIGYgZyBoIC5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgKGYsIGIsIGMsIGUsIGcsIGgpIGZtdCAtPlxuICAgIChhLCBiLCBjLCBkLCBnLCBoKSBmbXQgPVxuZnVuIGZtdDEgZm10MiAtPiBtYXRjaCBmbXQxIHdpdGhcbiAgfCBTdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBTdHJpbmcgKHBhZCwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgQ2FtbF9zdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBDYW1sX3N0cmluZyAocGFkLCBjb25jYXRfZm10IHJlc3QgZm10MilcblxuICB8IEludCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBJbnQgKGljb252LCBwYWQsIHByZWMsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEludDMyIChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIEludDMyIChpY29udiwgcGFkLCBwcmVjLCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBOYXRpdmVpbnQgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgTmF0aXZlaW50IChpY29udiwgcGFkLCBwcmVjLCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgRmxvYXQgKGZjb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgRmxvYXQgKGZjb252LCBwYWQsIHByZWMsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuXG4gIHwgQ2hhciAocmVzdCkgLT5cbiAgICBDaGFyIChjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBDYW1sX2NoYXIgcmVzdCAtPlxuICAgIENhbWxfY2hhciAoY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgQm9vbCAocGFkLCByZXN0KSAtPlxuICAgIEJvb2wgKHBhZCwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgQWxwaGEgcmVzdCAtPlxuICAgIEFscGhhIChjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBUaGV0YSByZXN0IC0+XG4gICAgVGhldGEgKGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEN1c3RvbSAoYXJpdHksIGYsIHJlc3QpIC0+XG4gICAgQ3VzdG9tIChhcml0eSwgZiwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgUmVhZGVyIHJlc3QgLT5cbiAgICBSZWFkZXIgKGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEZsdXNoIHJlc3QgLT5cbiAgICBGbHVzaCAoY29uY2F0X2ZtdCByZXN0IGZtdDIpXG5cbiAgfCBTdHJpbmdfbGl0ZXJhbCAoc3RyLCByZXN0KSAtPlxuICAgIFN0cmluZ19saXRlcmFsIChzdHIsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IENoYXJfbGl0ZXJhbCAoY2hyLCByZXN0KSAtPlxuICAgIENoYXJfbGl0ZXJhbCAgIChjaHIsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuXG4gIHwgRm9ybWF0X2FyZyAocGFkLCBmbXR0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfYXJnICAgKHBhZCwgZm10dHksIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEZvcm1hdF9zdWJzdCAocGFkLCBmbXR0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfc3Vic3QgKHBhZCwgZm10dHksIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuXG4gIHwgU2Nhbl9jaGFyX3NldCAod2lkdGhfb3B0LCBjaGFyX3NldCwgcmVzdCkgLT5cbiAgICBTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCByZXN0KSAtPlxuICAgIFNjYW5fZ2V0X2NvdW50ZXIgKGNvdW50ZXIsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IFNjYW5fbmV4dF9jaGFyIChyZXN0KSAtPlxuICAgIFNjYW5fbmV4dF9jaGFyIChjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpIC0+XG4gICAgSWdub3JlZF9wYXJhbSAoaWduLCBjb25jYXRfZm10IHJlc3QgZm10MilcblxuICB8IEZvcm1hdHRpbmdfbGl0IChmbXRpbmdfbGl0LCByZXN0KSAtPlxuICAgIEZvcm1hdHRpbmdfbGl0IChmbXRpbmdfbGl0LCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBGb3JtYXR0aW5nX2dlbiAoZm10aW5nX2dlbiwgcmVzdCkgLT5cbiAgICBGb3JtYXR0aW5nX2dlbiAoZm10aW5nX2dlbiwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG5cbiAgfCBFbmRfb2ZfZm9ybWF0IC0+XG4gICAgZm10MlxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJlcmFzZV9yZWwiLCJwYXJhbSIsInJlc3QiLCJ0eSIsInR5MSIsImNvbmNhdF9mbXR0eSIsImZtdHR5MSIsImZtdHR5MiIsInR5MiIsImNvbmNhdF9mbXQiLCJmbXQxIiwiZm10MiIsInBhZCIsInByZWMiLCJpY29udiIsImZjb252Iiwic3RyIiwiY2hyIiwiZm10dHkiLCJmbXRpbmdfbGl0IiwiZm10aW5nX2dlbiIsImNoYXJfc2V0Iiwid2lkdGhfb3B0IiwiY291bnRlciIsImlnbiIsImYiLCJhcml0eSJdLCJtYXBwaW5ncyI6Ik9BQUFBLFVBQUE7QUFBQSxZQUFBQyxVQUFBQztBQUFBQSxJQytnQlEsOEJBa0NZO0FBQUEsSUFsQ1o7QUFBQTtBQUFBLFdBQUFDLE9BQUEsVUFLSSwyQkFBZ0I7QUFBQTtBQUFBLFdBQUFBLFNBTHBCLFVBT00sNkJBQWdCO0FBQUE7QUFBQSxXQUFBQSxTQVB0QixVQVNHLDZCQUFnQjtBQUFBO0FBQUEsV0FBQUEsU0FUbkIsVUFXSyw2QkFBZ0I7QUFBQTtBQUFBLFdBQUFBLFNBWHJCLFVBZVMsNkJBQWdCO0FBQUE7QUFBQSxXQUFBQSxTQWZ6QixVQWFLLDZCQUFnQjtBQUFBO0FBQUEsV0FBQUEsU0FickIsVUFpQkssNkJBQWdCO0FBQUE7QUFBQSxXQUFBQSxTQWpCckIsVUFtQkksNkJBQWdCO0FBQUE7QUFBQSxXQUFBQSxTQW5CcEIsVUFBQUMsS0FBQTtBQUFBLE9BcUJlLGlDQUFjO0FBQUE7QUFBQSxXQUFBRCxTQXJCN0IsVUFBQUUsTUFBQTtBQUFBLE9BdUJ1Qix1Q0FBYztBQUFBO0FBQUEsV0FBQUYsU0F2QnJDLFVBeUJLLDhCQUFnQjtBQUFBO0FBQUEsV0FBQUEsVUF6QnJCLFVBMkJLLCtCQUFnQjtBQUFBO0FBQUEsV0FBQUEsVUEzQnJCLFVBNkJHLCtCQUFnQjtBQUFBO0FBQUEsV0FBQUEsVUE3Qm5CLFVBK0JNLCtCQUFnQjtBQUFBLG1CQUFBQSxVQS9CdEIsVUFpQ2MsK0JBQWdCO0FBQUE7QUFBQSxHQUNOO0FBQUEsWUFBQUcsYUFBQUMsUUFBQUM7QUFBQUEsSUE0QlgsK0JBK0JEO0FBQUEsSUEvQkM7QUFBQTtBQUFBLFdBQUFMLE9BQUEsV0FFVCxzQ0FBMEI7QUFBQTtBQUFBLFdBQUFBLFNBRmpCLFdBSVAsd0NBQTBCO0FBQUE7QUFBQSxXQUFBQSxTQUpuQixXQU1WLHdDQUEwQjtBQUFBO0FBQUEsV0FBQUEsU0FOaEIsV0FRUix3Q0FBMEI7QUFBQTtBQUFBLFdBQUFBLFNBUmxCLFdBVUosd0NBQTBCO0FBQUE7QUFBQSxXQUFBQSxTQVZ0QixXQVlSLHdDQUEwQjtBQUFBO0FBQUEsV0FBQUEsU0FabEIsV0FjUix3Q0FBMEI7QUFBQTtBQUFBLFdBQUFBLFNBZGxCLFdBZ0JULHdDQUEwQjtBQUFBO0FBQUEsV0FBQUEsU0FoQmpCLFdBQUFDLEtBQUE7QUFBQSxPQTRCRSw0Q0FBd0I7QUFBQTtBQUFBLFdBQUFELFNBNUIxQixXQUFBTSxNQUFBLFdBQUFKLE1BQUE7QUFBQSxPQThCVSxrREFBd0I7QUFBQTtBQUFBLFdBQUFGLFNBOUJsQyxXQWtCUix5Q0FBMEI7QUFBQTtBQUFBLFdBQUFBLFVBbEJsQixXQW9CUiwwQ0FBMEI7QUFBQTtBQUFBLFdBQUFBLFVBcEJsQixXQXNCViwwQ0FBMEI7QUFBQTtBQUFBLFdBQUFBLFVBdEJoQixXQXdCUCwwQ0FBMEI7QUFBQTtBQUFBLFdBQUFBLFVBeEJuQixXQTBCQywwQ0FBMEI7QUFBQTtBQUFBLEdBS3RCO0FBQUEsWUFBQU8sV0FBQUMsTUFBQUM7QUFBQUEsSUFVVCw2QkEyRGI7QUFBQSxJQTNEYTtBQUFBO0FBQUEsV0FBQVQsT0FBQSxTQWtCUixrQ0FBc0I7QUFBQTtBQUFBLFdBQUFBLFNBbEJkLFNBb0JILG9DQUFzQjtBQUFBO0FBQUEsV0FBQUEsU0FwQm5CLFNBQUFVLE1BQUE7QUFBQSxPQUVBLHlDQUFvQjtBQUFBO0FBQUEsV0FBQVYsU0FGcEIsU0FBQVUsUUFBQTtBQUFBLE9BSUssMkNBQW9CO0FBQUE7QUFBQSxXQUFBVixTQUp6QixTQUFBVyxPQUFBLFNBQUFELFFBQUEsU0FBQUUsUUFBQTtBQUFBLE9BT1Usd0RBQW9CO0FBQUE7QUFBQTtBQUFBLFFBQUFaLFNBUDlCO0FBQUEsUUFBQVcsU0FBQTtBQUFBLFFBQUFELFFBQUE7QUFBQSxRQUFBRSxVQUFBO0FBQUEsT0FTWSw0REFBb0I7QUFBQTtBQUFBO0FBQUEsUUFBQVosU0FUaEM7QUFBQSxRQUFBVyxTQUFBO0FBQUEsUUFBQUQsUUFBQTtBQUFBLFFBQUFFLFVBQUE7QUFBQSxPQVdnQiw0REFBb0I7QUFBQTtBQUFBO0FBQUEsUUFBQVosU0FYcEM7QUFBQSxRQUFBVyxTQUFBO0FBQUEsUUFBQUQsUUFBQTtBQUFBLFFBQUFFLFVBQUE7QUFBQSxPQWFZLDREQUFvQjtBQUFBO0FBQUE7QUFBQSxRQUFBWixTQWJoQztBQUFBLFFBQUFXLFNBQUE7QUFBQSxRQUFBRCxRQUFBO0FBQUEsUUFBQUcsUUFBQTtBQUFBLE9BZVksMERBQW9CO0FBQUE7QUFBQSxXQUFBYixTQWZoQyxTQUFBVSxRQUFBO0FBQUEsT0FzQkYsMkNBQW9CO0FBQUE7QUFBQSxXQUFBVixTQXRCbEIsU0FnQ1AscUNBQXNCO0FBQUE7QUFBQSxXQUFBQSxVQWhDZixTQUFBYyxNQUFBO0FBQUEsT0FtQ1EsMkNBQW9CO0FBQUE7QUFBQSxXQUFBZCxVQW5DNUIsU0FBQWUsTUFBQTtBQUFBLE9BcUNRLDJDQUFvQjtBQUFBO0FBQUEsV0FBQWYsVUFyQzVCLFNBQUFnQixRQUFBLFNBQUFOLFFBQUE7QUFBQSxPQXdDYSxvREFBb0I7QUFBQTtBQUFBLFdBQUFWLFVBeENqQyxTQUFBZ0IsVUFBQSxTQUFBTixRQUFBO0FBQUEsT0EwQ2Esc0RBQW9CO0FBQUE7QUFBQSxXQUFBVixVQTFDakMsU0F3QlAsc0NBQXNCO0FBQUE7QUFBQSxXQUFBQSxVQXhCZixTQTBCUCxzQ0FBc0I7QUFBQTtBQUFBLFdBQUFBLFVBMUJmLFNBQUFpQixhQUFBO0FBQUEsT0FzRGUsa0RBQW9CO0FBQUE7QUFBQSxXQUFBakIsVUF0RG5DLFNBQUFrQixhQUFBO0FBQUEsT0F3RGUsa0RBQW9CO0FBQUE7QUFBQSxXQUFBbEIsVUF4RG5DLFNBOEJOLHNDQUFzQjtBQUFBO0FBQUEsV0FBQUEsVUE5QmhCLFNBQUFtQixXQUFBLFNBQUFDLFlBQUE7QUFBQSxPQTZDdUIsMkRBQW9CO0FBQUE7QUFBQSxXQUFBcEIsVUE3QzNDLFNBQUFxQixVQUFBO0FBQUEsT0ErQ2MsK0NBQW9CO0FBQUE7QUFBQSxXQUFBckIsVUEvQ2xDLFNBaURFLHNDQUFzQjtBQUFBO0FBQUEsV0FBQUEsVUFqRHhCLFNBQUFzQixNQUFBO0FBQUEsT0FtRE8sMkNBQW9CO0FBQUE7QUFBQSxXQUFBdEIsVUFuRDNCLFNBQUF1QixJQUFBLFNBQUFDLFFBQUE7QUFBQSxPQTRCSyxnREFBb0I7QUFBQTtBQUFBLEdBK0JsQztBQUFBLEdEanJCUiIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjk0ODksImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvc3RkbGliLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBFeGNlcHRpb25zICopXG5cbmV4dGVybmFsIHJlZ2lzdGVyX25hbWVkX3ZhbHVlIDogc3RyaW5nIC0+ICdhIC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX3JlZ2lzdGVyX25hbWVkX3ZhbHVlXCJcblxubGV0ICgpID1cbiAgKCogZm9yIHJ1bnRpbWUvZmFpbF9uYXQuYyAqKVxuICByZWdpc3Rlcl9uYW1lZF92YWx1ZSBcIlBlcnZhc2l2ZXMuYXJyYXlfYm91bmRfZXJyb3JcIlxuICAgIChJbnZhbGlkX2FyZ3VtZW50IFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiKVxuXG5leHRlcm5hbCByYWlzZSA6IGV4biAtPiAnYSA9IFwiJXJhaXNlXCJcbmV4dGVybmFsIHJhaXNlX25vdHJhY2UgOiBleG4gLT4gJ2EgPSBcIiVyYWlzZV9ub3RyYWNlXCJcblxubGV0IGZhaWx3aXRoIHMgPSByYWlzZShGYWlsdXJlIHMpXG5sZXQgaW52YWxpZF9hcmcgcyA9IHJhaXNlKEludmFsaWRfYXJndW1lbnQgcylcblxuZXhjZXB0aW9uIEV4aXRcbmV4Y2VwdGlvbiBNYXRjaF9mYWlsdXJlID0gTWF0Y2hfZmFpbHVyZVxuZXhjZXB0aW9uIEFzc2VydF9mYWlsdXJlID0gQXNzZXJ0X2ZhaWx1cmVcbmV4Y2VwdGlvbiBJbnZhbGlkX2FyZ3VtZW50ID0gSW52YWxpZF9hcmd1bWVudFxuZXhjZXB0aW9uIEZhaWx1cmUgPSBGYWlsdXJlXG5leGNlcHRpb24gTm90X2ZvdW5kID0gTm90X2ZvdW5kXG5leGNlcHRpb24gT3V0X29mX21lbW9yeSA9IE91dF9vZl9tZW1vcnlcbmV4Y2VwdGlvbiBTdGFja19vdmVyZmxvdyA9IFN0YWNrX292ZXJmbG93XG5leGNlcHRpb24gU3lzX2Vycm9yID0gU3lzX2Vycm9yXG5leGNlcHRpb24gRW5kX29mX2ZpbGUgPSBFbmRfb2ZfZmlsZVxuZXhjZXB0aW9uIERpdmlzaW9uX2J5X3plcm8gPSBEaXZpc2lvbl9ieV96ZXJvXG5leGNlcHRpb24gU3lzX2Jsb2NrZWRfaW8gPSBTeXNfYmxvY2tlZF9pb1xuZXhjZXB0aW9uIFVuZGVmaW5lZF9yZWN1cnNpdmVfbW9kdWxlID0gVW5kZWZpbmVkX3JlY3Vyc2l2ZV9tb2R1bGVcblxuKCogQ29tcG9zaXRpb24gb3BlcmF0b3JzICopXG5cbmV4dGVybmFsICggfD4gKSA6ICdhIC0+ICgnYSAtPiAnYikgLT4gJ2IgPSBcIiVyZXZhcHBseVwiXG5leHRlcm5hbCAoIEBAICkgOiAoJ2EgLT4gJ2IpIC0+ICdhIC0+ICdiID0gXCIlYXBwbHlcIlxuXG4oKiBEZWJ1Z2dpbmcgKilcblxuZXh0ZXJuYWwgX19MT0NfXyA6IHN0cmluZyA9IFwiJWxvY19MT0NcIlxuZXh0ZXJuYWwgX19GSUxFX18gOiBzdHJpbmcgPSBcIiVsb2NfRklMRVwiXG5leHRlcm5hbCBfX0xJTkVfXyA6IGludCA9IFwiJWxvY19MSU5FXCJcbmV4dGVybmFsIF9fTU9EVUxFX18gOiBzdHJpbmcgPSBcIiVsb2NfTU9EVUxFXCJcbmV4dGVybmFsIF9fUE9TX18gOiBzdHJpbmcgKiBpbnQgKiBpbnQgKiBpbnQgPSBcIiVsb2NfUE9TXCJcbmV4dGVybmFsIF9fRlVOQ1RJT05fXyA6IHN0cmluZyA9IFwiJWxvY19GVU5DVElPTlwiXG5cbmV4dGVybmFsIF9fTE9DX09GX18gOiAnYSAtPiBzdHJpbmcgKiAnYSA9IFwiJWxvY19MT0NcIlxuZXh0ZXJuYWwgX19MSU5FX09GX18gOiAnYSAtPiBpbnQgKiAnYSA9IFwiJWxvY19MSU5FXCJcbmV4dGVybmFsIF9fUE9TX09GX18gOiAnYSAtPiAoc3RyaW5nICogaW50ICogaW50ICogaW50KSAqICdhID0gXCIlbG9jX1BPU1wiXG5cbigqIENvbXBhcmlzb25zICopXG5cbmV4dGVybmFsICggPSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWVxdWFsXCJcbmV4dGVybmFsICggPD4gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVub3RlcXVhbFwiXG5leHRlcm5hbCAoIDwgKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVsZXNzdGhhblwiXG5leHRlcm5hbCAoID4gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVncmVhdGVydGhhblwiXG5leHRlcm5hbCAoIDw9ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlbGVzc2VxdWFsXCJcbmV4dGVybmFsICggPj0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVncmVhdGVyZXF1YWxcIlxuZXh0ZXJuYWwgY29tcGFyZSA6ICdhIC0+ICdhIC0+IGludCA9IFwiJWNvbXBhcmVcIlxuXG5sZXQgbWluIHggeSA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5sZXQgbWF4IHggeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG5cbmV4dGVybmFsICggPT0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVlcVwiXG5leHRlcm5hbCAoICE9ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlbm90ZXFcIlxuXG4oKiBCb29sZWFuIG9wZXJhdGlvbnMgKilcblxuZXh0ZXJuYWwgbm90IDogYm9vbCAtPiBib29sID0gXCIlYm9vbG5vdFwiXG5leHRlcm5hbCAoICYmICkgOiBib29sIC0+IGJvb2wgLT4gYm9vbCA9IFwiJXNlcXVhbmRcIlxuZXh0ZXJuYWwgKCB8fCApIDogYm9vbCAtPiBib29sIC0+IGJvb2wgPSBcIiVzZXF1b3JcIlxuXG4oKiBJbnRlZ2VyIG9wZXJhdGlvbnMgKilcblxuZXh0ZXJuYWwgKCB+LSApIDogaW50IC0+IGludCA9IFwiJW5lZ2ludFwiXG5leHRlcm5hbCAoIH4rICkgOiBpbnQgLT4gaW50ID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgc3VjYyA6IGludCAtPiBpbnQgPSBcIiVzdWNjaW50XCJcbmV4dGVybmFsIHByZWQgOiBpbnQgLT4gaW50ID0gXCIlcHJlZGludFwiXG5leHRlcm5hbCAoICsgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYWRkaW50XCJcbmV4dGVybmFsICggLSApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVzdWJpbnRcIlxuZXh0ZXJuYWwgKCAqICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW11bGludFwiXG5leHRlcm5hbCAoIC8gKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlZGl2aW50XCJcbmV4dGVybmFsICggbW9kICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW1vZGludFwiXG5cbmxldCBhYnMgeCA9IGlmIHggPj0gMCB0aGVuIHggZWxzZSAteFxuXG5leHRlcm5hbCAoIGxhbmQgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYW5kaW50XCJcbmV4dGVybmFsICggbG9yICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW9yaW50XCJcbmV4dGVybmFsICggbHhvciApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiV4b3JpbnRcIlxuXG5sZXQgbG5vdCB4ID0geCBseG9yICgtMSlcblxuZXh0ZXJuYWwgKCBsc2wgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbHNsaW50XCJcbmV4dGVybmFsICggbHNyICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWxzcmludFwiXG5leHRlcm5hbCAoIGFzciApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhc3JpbnRcIlxuXG5sZXQgbWF4X2ludCA9ICgtMSkgbHNyIDFcbmxldCBtaW5faW50ID0gbWF4X2ludCArIDFcblxuKCogRmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCAoIH4tLiApIDogZmxvYXQgLT4gZmxvYXQgPSBcIiVuZWdmbG9hdFwiXG5leHRlcm5hbCAoIH4rLiApIDogZmxvYXQgLT4gZmxvYXQgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCAoICsuICkgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJWFkZGZsb2F0XCJcbmV4dGVybmFsICggLS4gKSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCIlc3ViZmxvYXRcIlxuZXh0ZXJuYWwgKCAqLiApIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVtdWxmbG9hdFwiXG5leHRlcm5hbCAoIC8uICkgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJWRpdmZsb2F0XCJcbmV4dGVybmFsICggKiogKSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3Bvd2VyX2Zsb2F0XCIgXCJwb3dcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZXhwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXhwX2Zsb2F0XCIgXCJleHBcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZXhwbTEgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9leHBtMV9mbG9hdFwiIFwiY2FtbF9leHBtMVwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhY29zIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYWNvc19mbG9hdFwiIFwiYWNvc1wiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhc2luIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXNpbl9mbG9hdFwiIFwiYXNpblwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhdGFuIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXRhbl9mbG9hdFwiIFwiYXRhblwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhdGFuMiA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2F0YW4yX2Zsb2F0XCIgXCJhdGFuMlwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBoeXBvdCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0XG4gICAgICAgICAgICAgICA9IFwiY2FtbF9oeXBvdF9mbG9hdFwiIFwiY2FtbF9oeXBvdFwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjb3MgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9jb3NfZmxvYXRcIiBcImNvc1wiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjb3NoIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY29zaF9mbG9hdFwiIFwiY29zaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhY29zaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Fjb3NoX2Zsb2F0XCIgXCJjYW1sX2Fjb3NoXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2xvZ19mbG9hdFwiIFwibG9nXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZzEwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nMTBfZmxvYXRcIiBcImxvZzEwXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZzFwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nMXBfZmxvYXRcIiBcImNhbWxfbG9nMXBcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2luIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc2luX2Zsb2F0XCIgXCJzaW5cIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2luaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3NpbmhfZmxvYXRcIiBcInNpbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXNpbmggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hc2luaF9mbG9hdFwiIFwiY2FtbF9hc2luaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBzcXJ0IDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc3FydF9mbG9hdFwiIFwic3FydFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB0YW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF90YW5fZmxvYXRcIiBcInRhblwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB0YW5oIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfdGFuaF9mbG9hdFwiIFwidGFuaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhdGFuaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2F0YW5oX2Zsb2F0XCIgXCJjYW1sX2F0YW5oXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGNlaWwgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9jZWlsX2Zsb2F0XCIgXCJjZWlsXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZsb29yIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZmxvb3JfZmxvYXRcIiBcImZsb29yXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGFic19mbG9hdCA6IGZsb2F0IC0+IGZsb2F0ID0gXCIlYWJzZmxvYXRcIlxuZXh0ZXJuYWwgY29weXNpZ24gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdFxuICAgICAgICAgICAgICAgICAgPSBcImNhbWxfY29weXNpZ25fZmxvYXRcIiBcImNhbWxfY29weXNpZ25cIlxuICAgICAgICAgICAgICAgICAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIG1vZF9mbG9hdCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Ztb2RfZmxvYXRcIiBcImZtb2RcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZnJleHAgOiBmbG9hdCAtPiBmbG9hdCAqIGludCA9IFwiY2FtbF9mcmV4cF9mbG9hdFwiXG5leHRlcm5hbCBsZGV4cCA6IChmbG9hdCBbQHVuYm94ZWRdKSAtPiAoaW50IFtAdW50YWdnZWRdKSAtPiAoZmxvYXQgW0B1bmJveGVkXSkgPVxuICBcImNhbWxfbGRleHBfZmxvYXRcIiBcImNhbWxfbGRleHBfZmxvYXRfdW5ib3hlZFwiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBtb2RmIDogZmxvYXQgLT4gZmxvYXQgKiBmbG9hdCA9IFwiY2FtbF9tb2RmX2Zsb2F0XCJcbmV4dGVybmFsIGZsb2F0IDogaW50IC0+IGZsb2F0ID0gXCIlZmxvYXRvZmludFwiXG5leHRlcm5hbCBmbG9hdF9vZl9pbnQgOiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdG9maW50XCJcbmV4dGVybmFsIHRydW5jYXRlIDogZmxvYXQgLT4gaW50ID0gXCIlaW50b2ZmbG9hdFwiXG5leHRlcm5hbCBpbnRfb2ZfZmxvYXQgOiBmbG9hdCAtPiBpbnQgPSBcIiVpbnRvZmZsb2F0XCJcbmV4dGVybmFsIGZsb2F0X29mX2JpdHMgOiBpbnQ2NCAtPiBmbG9hdFxuICA9IFwiY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzXCIgXCJjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHNfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5sZXQgaW5maW5pdHkgPVxuICBmbG9hdF9vZl9iaXRzIDB4N0ZfRjBfMDBfMDBfMDBfMDBfMDBfMDBMXG5sZXQgbmVnX2luZmluaXR5ID1cbiAgZmxvYXRfb2ZfYml0cyAweEZGX0YwXzAwXzAwXzAwXzAwXzAwXzAwTFxubGV0IG5hbiA9XG4gIGZsb2F0X29mX2JpdHMgMHg3Rl9GOF8wMF8wMF8wMF8wMF8wMF8wMUxcbmxldCBtYXhfZmxvYXQgPVxuICBmbG9hdF9vZl9iaXRzIDB4N0ZfRUZfRkZfRkZfRkZfRkZfRkZfRkZMXG5sZXQgbWluX2Zsb2F0ID1cbiAgZmxvYXRfb2ZfYml0cyAweDAwXzEwXzAwXzAwXzAwXzAwXzAwXzAwTFxubGV0IGVwc2lsb25fZmxvYXQgPVxuICBmbG9hdF9vZl9iaXRzIDB4M0NfQjBfMDBfMDBfMDBfMDBfMDBfMDBMXG5cbnR5cGUgZnBjbGFzcyA9XG4gICAgRlBfbm9ybWFsXG4gIHwgRlBfc3Vibm9ybWFsXG4gIHwgRlBfemVyb1xuICB8IEZQX2luZmluaXRlXG4gIHwgRlBfbmFuXG5leHRlcm5hbCBjbGFzc2lmeV9mbG9hdCA6IChmbG9hdCBbQHVuYm94ZWRdKSAtPiBmcGNsYXNzID1cbiAgXCJjYW1sX2NsYXNzaWZ5X2Zsb2F0XCIgXCJjYW1sX2NsYXNzaWZ5X2Zsb2F0X3VuYm94ZWRcIiBbQEBub2FsbG9jXVxuXG4oKiBTdHJpbmcgYW5kIGJ5dGUgc2VxdWVuY2Ugb3BlcmF0aW9ucyAtLSBtb3JlIGluIG1vZHVsZXMgU3RyaW5nIGFuZCBCeXRlcyAqKVxuXG5leHRlcm5hbCBzdHJpbmdfbGVuZ3RoIDogc3RyaW5nIC0+IGludCA9IFwiJXN0cmluZ19sZW5ndGhcIlxuZXh0ZXJuYWwgYnl0ZXNfbGVuZ3RoIDogYnl0ZXMgLT4gaW50ID0gXCIlYnl0ZXNfbGVuZ3RoXCJcbmV4dGVybmFsIGJ5dGVzX2NyZWF0ZSA6IGludCAtPiBieXRlcyA9IFwiY2FtbF9jcmVhdGVfYnl0ZXNcIlxuZXh0ZXJuYWwgc3RyaW5nX2JsaXQgOiBzdHJpbmcgLT4gaW50IC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfYmxpdF9zdHJpbmdcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYnl0ZXNfYmxpdCA6IGJ5dGVzIC0+IGludCAtPiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX2JsaXRfYnl0ZXNcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYnl0ZXNfdW5zYWZlX3RvX3N0cmluZyA6IGJ5dGVzIC0+IHN0cmluZyA9IFwiJWJ5dGVzX3RvX3N0cmluZ1wiXG5cbmxldCAoIF4gKSBzMSBzMiA9XG4gIGxldCBsMSA9IHN0cmluZ19sZW5ndGggczEgYW5kIGwyID0gc3RyaW5nX2xlbmd0aCBzMiBpblxuICBsZXQgcyA9IGJ5dGVzX2NyZWF0ZSAobDEgKyBsMikgaW5cbiAgc3RyaW5nX2JsaXQgczEgMCBzIDAgbDE7XG4gIHN0cmluZ19ibGl0IHMyIDAgcyBsMSBsMjtcbiAgYnl0ZXNfdW5zYWZlX3RvX3N0cmluZyBzXG5cbigqIENoYXJhY3RlciBvcGVyYXRpb25zIC0tIG1vcmUgaW4gbW9kdWxlIENoYXIgKilcblxuZXh0ZXJuYWwgaW50X29mX2NoYXIgOiBjaGFyIC0+IGludCA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIHVuc2FmZV9jaGFyX29mX2ludCA6IGludCAtPiBjaGFyID0gXCIlaWRlbnRpdHlcIlxubGV0IGNoYXJfb2ZfaW50IG4gPVxuICBpZiBuIDwgMCB8fCBuID4gMjU1IHRoZW4gaW52YWxpZF9hcmcgXCJjaGFyX29mX2ludFwiIGVsc2UgdW5zYWZlX2NoYXJfb2ZfaW50IG5cblxuKCogVW5pdCBvcGVyYXRpb25zICopXG5cbmV4dGVybmFsIGlnbm9yZSA6ICdhIC0+IHVuaXQgPSBcIiVpZ25vcmVcIlxuXG4oKiBQYWlyIG9wZXJhdGlvbnMgKilcblxuZXh0ZXJuYWwgZnN0IDogJ2EgKiAnYiAtPiAnYSA9IFwiJWZpZWxkMFwiXG5leHRlcm5hbCBzbmQgOiAnYSAqICdiIC0+ICdiID0gXCIlZmllbGQxXCJcblxuKCogUmVmZXJlbmNlcyAqKVxuXG50eXBlICdhIHJlZiA9IHsgbXV0YWJsZSBjb250ZW50cyA6ICdhIH1cbmV4dGVybmFsIHJlZiA6ICdhIC0+ICdhIHJlZiA9IFwiJW1ha2VtdXRhYmxlXCJcbmV4dGVybmFsICggISApIDogJ2EgcmVmIC0+ICdhID0gXCIlZmllbGQwXCJcbmV4dGVybmFsICggOj0gKSA6ICdhIHJlZiAtPiAnYSAtPiB1bml0ID0gXCIlc2V0ZmllbGQwXCJcbmV4dGVybmFsIGluY3IgOiBpbnQgcmVmIC0+IHVuaXQgPSBcIiVpbmNyXCJcbmV4dGVybmFsIGRlY3IgOiBpbnQgcmVmIC0+IHVuaXQgPSBcIiVkZWNyXCJcblxuKCogUmVzdWx0IHR5cGUgKilcblxudHlwZSAoJ2EsJ2IpIHJlc3VsdCA9IE9rIG9mICdhIHwgRXJyb3Igb2YgJ2JcblxuKCogU3RyaW5nIGNvbnZlcnNpb24gZnVuY3Rpb25zICopXG5cbmV4dGVybmFsIGZvcm1hdF9pbnQgOiBzdHJpbmcgLT4gaW50IC0+IHN0cmluZyA9IFwiY2FtbF9mb3JtYXRfaW50XCJcbmV4dGVybmFsIGZvcm1hdF9mbG9hdCA6IHN0cmluZyAtPiBmbG9hdCAtPiBzdHJpbmcgPSBcImNhbWxfZm9ybWF0X2Zsb2F0XCJcblxubGV0IHN0cmluZ19vZl9ib29sIGIgPVxuICBpZiBiIHRoZW4gXCJ0cnVlXCIgZWxzZSBcImZhbHNlXCJcbmxldCBib29sX29mX3N0cmluZyA9IGZ1bmN0aW9uXG4gIHwgXCJ0cnVlXCIgLT4gdHJ1ZVxuICB8IFwiZmFsc2VcIiAtPiBmYWxzZVxuICB8IF8gLT4gaW52YWxpZF9hcmcgXCJib29sX29mX3N0cmluZ1wiXG5cbmxldCBib29sX29mX3N0cmluZ19vcHQgPSBmdW5jdGlvblxuICB8IFwidHJ1ZVwiIC0+IFNvbWUgdHJ1ZVxuICB8IFwiZmFsc2VcIiAtPiBTb21lIGZhbHNlXG4gIHwgXyAtPiBOb25lXG5cbmxldCBzdHJpbmdfb2ZfaW50IG4gPVxuICBmb3JtYXRfaW50IFwiJWRcIiBuXG5cbmV4dGVybmFsIGludF9vZl9zdHJpbmcgOiBzdHJpbmcgLT4gaW50ID0gXCJjYW1sX2ludF9vZl9zdHJpbmdcIlxuXG5sZXQgaW50X29mX3N0cmluZ19vcHQgcyA9XG4gICgqIFRPRE86IHByb3ZpZGUgdGhpcyBkaXJlY3RseSBhcyBhIG5vbi1yYWlzaW5nIHByaW1pdGl2ZS4gKilcbiAgdHJ5IFNvbWUgKGludF9vZl9zdHJpbmcgcylcbiAgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZVxuXG5leHRlcm5hbCBzdHJpbmdfZ2V0IDogc3RyaW5nIC0+IGludCAtPiBjaGFyID0gXCIlc3RyaW5nX3NhZmVfZ2V0XCJcblxubGV0IHZhbGlkX2Zsb2F0X2xleGVtIHMgPVxuICBsZXQgbCA9IHN0cmluZ19sZW5ndGggcyBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA+PSBsIHRoZW4gcyBeIFwiLlwiIGVsc2VcbiAgICBtYXRjaCBzdHJpbmdfZ2V0IHMgaSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIHwgJy0nIC0+IGxvb3AgKGkgKyAxKVxuICAgIHwgXyAtPiBzXG4gIGluXG4gIGxvb3AgMFxuXG5sZXQgc3RyaW5nX29mX2Zsb2F0IGYgPSB2YWxpZF9mbG9hdF9sZXhlbSAoZm9ybWF0X2Zsb2F0IFwiJS4xMmdcIiBmKVxuXG5leHRlcm5hbCBmbG9hdF9vZl9zdHJpbmcgOiBzdHJpbmcgLT4gZmxvYXQgPSBcImNhbWxfZmxvYXRfb2Zfc3RyaW5nXCJcblxubGV0IGZsb2F0X29mX3N0cmluZ19vcHQgcyA9XG4gICgqIFRPRE86IHByb3ZpZGUgdGhpcyBkaXJlY3RseSBhcyBhIG5vbi1yYWlzaW5nIHByaW1pdGl2ZS4gKilcbiAgdHJ5IFNvbWUgKGZsb2F0X29mX3N0cmluZyBzKVxuICB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG5cbigqIExpc3Qgb3BlcmF0aW9ucyAtLSBtb3JlIGluIG1vZHVsZSBMaXN0ICopXG5cbmxldFtAdGFpbF9tb2RfY29uc10gcmVjICggQCApIGwxIGwyID1cbiAgbWF0Y2ggbDEgd2l0aFxuICB8IFtdIC0+IGwyXG4gIHwgaDEgOjogW10gLT4gaDEgOjogbDJcbiAgfCBoMSA6OiBoMiA6OiBbXSAtPiBoMSA6OiBoMiA6OiBsMlxuICB8IGgxIDo6IGgyIDo6IGgzIDo6IHRsIC0+IGgxIDo6IGgyIDo6IGgzIDo6ICh0bCBAIGwyKVxuXG4oKiBJL08gb3BlcmF0aW9ucyAqKVxuXG50eXBlIGluX2NoYW5uZWxcbnR5cGUgb3V0X2NoYW5uZWxcblxuZXh0ZXJuYWwgb3Blbl9kZXNjcmlwdG9yX291dCA6IGludCAtPiBvdXRfY2hhbm5lbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3Jfb3V0XCJcbmV4dGVybmFsIG9wZW5fZGVzY3JpcHRvcl9pbiA6IGludCAtPiBpbl9jaGFubmVsID0gXCJjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pblwiXG5cbmxldCBzdGRpbiA9IG9wZW5fZGVzY3JpcHRvcl9pbiAwXG5sZXQgc3Rkb3V0ID0gb3Blbl9kZXNjcmlwdG9yX291dCAxXG5sZXQgc3RkZXJyID0gb3Blbl9kZXNjcmlwdG9yX291dCAyXG5cbigqIEdlbmVyYWwgb3V0cHV0IGZ1bmN0aW9ucyAqKVxuXG50eXBlIG9wZW5fZmxhZyA9XG4gICAgT3Blbl9yZG9ubHkgfCBPcGVuX3dyb25seSB8IE9wZW5fYXBwZW5kXG4gIHwgT3Blbl9jcmVhdCB8IE9wZW5fdHJ1bmMgfCBPcGVuX2V4Y2xcbiAgfCBPcGVuX2JpbmFyeSB8IE9wZW5fdGV4dCB8IE9wZW5fbm9uYmxvY2tcblxuZXh0ZXJuYWwgb3Blbl9kZXNjIDogc3RyaW5nIC0+IG9wZW5fZmxhZyBsaXN0IC0+IGludCAtPiBpbnQgPSBcImNhbWxfc3lzX29wZW5cIlxuXG5leHRlcm5hbCBzZXRfb3V0X2NoYW5uZWxfbmFtZTogb3V0X2NoYW5uZWwgLT4gc3RyaW5nIC0+IHVuaXQgPVxuICBcImNhbWxfbWxfc2V0X2NoYW5uZWxfbmFtZVwiXG5cbmxldCBvcGVuX291dF9nZW4gbW9kZSBwZXJtIG5hbWUgPVxuICBsZXQgYyA9IG9wZW5fZGVzY3JpcHRvcl9vdXQob3Blbl9kZXNjIG5hbWUgbW9kZSBwZXJtKSBpblxuICBzZXRfb3V0X2NoYW5uZWxfbmFtZSBjIG5hbWU7XG4gIGNcblxubGV0IG9wZW5fb3V0IG5hbWUgPVxuICBvcGVuX291dF9nZW4gW09wZW5fd3Jvbmx5OyBPcGVuX2NyZWF0OyBPcGVuX3RydW5jOyBPcGVuX3RleHRdIDBvNjY2IG5hbWVcblxubGV0IG9wZW5fb3V0X2JpbiBuYW1lID1cbiAgb3Blbl9vdXRfZ2VuIFtPcGVuX3dyb25seTsgT3Blbl9jcmVhdDsgT3Blbl90cnVuYzsgT3Blbl9iaW5hcnldIDBvNjY2IG5hbWVcblxuZXh0ZXJuYWwgZmx1c2ggOiBvdXRfY2hhbm5lbCAtPiB1bml0ID0gXCJjYW1sX21sX2ZsdXNoXCJcblxuZXh0ZXJuYWwgb3V0X2NoYW5uZWxzX2xpc3QgOiB1bml0IC0+IG91dF9jaGFubmVsIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX291dF9jaGFubmVsc19saXN0XCJcblxubGV0IGZsdXNoX2FsbCAoKSA9XG4gIGxldCByZWMgaXRlciA9IGZ1bmN0aW9uXG4gICAgICBbXSAtPiAoKVxuICAgIHwgYTo6bCAtPlxuICAgICAgICBiZWdpbiB0cnlcbiAgICAgICAgICAgIGZsdXNoIGFcbiAgICAgICAgd2l0aCBTeXNfZXJyb3IgXyAtPlxuICAgICAgICAgICgpICgqIGlnbm9yZSBjaGFubmVscyBjbG9zZWQgZHVyaW5nIGEgcHJlY2VkaW5nIGZsdXNoLiAqKVxuICAgICAgICBlbmQ7XG4gICAgICAgIGl0ZXIgbFxuICBpbiBpdGVyIChvdXRfY2hhbm5lbHNfbGlzdCAoKSlcblxuZXh0ZXJuYWwgdW5zYWZlX291dHB1dCA6IG91dF9jaGFubmVsIC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9vdXRwdXRfYnl0ZXNcIlxuZXh0ZXJuYWwgdW5zYWZlX291dHB1dF9zdHJpbmcgOiBvdXRfY2hhbm5lbCAtPiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9vdXRwdXRcIlxuXG5leHRlcm5hbCBvdXRwdXRfY2hhciA6IG91dF9jaGFubmVsIC0+IGNoYXIgLT4gdW5pdCA9IFwiY2FtbF9tbF9vdXRwdXRfY2hhclwiXG5cbmxldCBvdXRwdXRfYnl0ZXMgb2MgcyA9XG4gIHVuc2FmZV9vdXRwdXQgb2MgcyAwIChieXRlc19sZW5ndGggcylcblxubGV0IG91dHB1dF9zdHJpbmcgb2MgcyA9XG4gIHVuc2FmZV9vdXRwdXRfc3RyaW5nIG9jIHMgMCAoc3RyaW5nX2xlbmd0aCBzKVxuXG5sZXQgb3V0cHV0IG9jIHMgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBieXRlc19sZW5ndGggcyAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwib3V0cHV0XCJcbiAgZWxzZSB1bnNhZmVfb3V0cHV0IG9jIHMgb2ZzIGxlblxuXG5sZXQgb3V0cHV0X3N1YnN0cmluZyBvYyBzIG9mcyBsZW4gPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gc3RyaW5nX2xlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJvdXRwdXRfc3Vic3RyaW5nXCJcbiAgZWxzZSB1bnNhZmVfb3V0cHV0X3N0cmluZyBvYyBzIG9mcyBsZW5cblxuZXh0ZXJuYWwgb3V0cHV0X2J5dGUgOiBvdXRfY2hhbm5lbCAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9tbF9vdXRwdXRfY2hhclwiXG5leHRlcm5hbCBvdXRwdXRfYmluYXJ5X2ludCA6IG91dF9jaGFubmVsIC0+IGludCAtPiB1bml0ID0gXCJjYW1sX21sX291dHB1dF9pbnRcIlxuXG5leHRlcm5hbCBtYXJzaGFsX3RvX2NoYW5uZWwgOiBvdXRfY2hhbm5lbCAtPiAnYSAtPiB1bml0IGxpc3QgLT4gdW5pdFxuICAgICA9IFwiY2FtbF9vdXRwdXRfdmFsdWVcIlxubGV0IG91dHB1dF92YWx1ZSBjaGFuIHYgPSBtYXJzaGFsX3RvX2NoYW5uZWwgY2hhbiB2IFtdXG5cbmV4dGVybmFsIHNlZWtfb3V0IDogb3V0X2NoYW5uZWwgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19vdXRcIlxuZXh0ZXJuYWwgcG9zX291dCA6IG91dF9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9wb3Nfb3V0XCJcbmV4dGVybmFsIG91dF9jaGFubmVsX2xlbmd0aCA6IG91dF9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVcIlxuZXh0ZXJuYWwgY2xvc2Vfb3V0X2NoYW5uZWwgOiBvdXRfY2hhbm5lbCAtPiB1bml0ID0gXCJjYW1sX21sX2Nsb3NlX2NoYW5uZWxcIlxubGV0IGNsb3NlX291dCBvYyA9IGZsdXNoIG9jOyBjbG9zZV9vdXRfY2hhbm5lbCBvY1xubGV0IGNsb3NlX291dF9ub2VyciBvYyA9XG4gICh0cnkgZmx1c2ggb2Mgd2l0aCBfIC0+ICgpKTtcbiAgKHRyeSBjbG9zZV9vdXRfY2hhbm5lbCBvYyB3aXRoIF8gLT4gKCkpXG5leHRlcm5hbCBzZXRfYmluYXJ5X21vZGVfb3V0IDogb3V0X2NoYW5uZWwgLT4gYm9vbCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX3NldF9iaW5hcnlfbW9kZVwiXG5cbigqIEdlbmVyYWwgaW5wdXQgZnVuY3Rpb25zICopXG5cbmV4dGVybmFsIHNldF9pbl9jaGFubmVsX25hbWU6IGluX2NoYW5uZWwgLT4gc3RyaW5nIC0+IHVuaXQgPVxuICBcImNhbWxfbWxfc2V0X2NoYW5uZWxfbmFtZVwiXG5cbmxldCBvcGVuX2luX2dlbiBtb2RlIHBlcm0gbmFtZSA9XG4gIGxldCBjID0gb3Blbl9kZXNjcmlwdG9yX2luKG9wZW5fZGVzYyBuYW1lIG1vZGUgcGVybSkgaW5cbiAgc2V0X2luX2NoYW5uZWxfbmFtZSBjIG5hbWU7XG4gIGNcblxubGV0IG9wZW5faW4gbmFtZSA9XG4gIG9wZW5faW5fZ2VuIFtPcGVuX3Jkb25seTsgT3Blbl90ZXh0XSAwIG5hbWVcblxubGV0IG9wZW5faW5fYmluIG5hbWUgPVxuICBvcGVuX2luX2dlbiBbT3Blbl9yZG9ubHk7IE9wZW5fYmluYXJ5XSAwIG5hbWVcblxuZXh0ZXJuYWwgaW5wdXRfY2hhciA6IGluX2NoYW5uZWwgLT4gY2hhciA9IFwiY2FtbF9tbF9pbnB1dF9jaGFyXCJcblxuZXh0ZXJuYWwgdW5zYWZlX2lucHV0IDogaW5fY2hhbm5lbCAtPiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IGludFxuICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX2lucHV0XCJcblxubGV0IGlucHV0IGljIHMgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBieXRlc19sZW5ndGggcyAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiaW5wdXRcIlxuICBlbHNlIHVuc2FmZV9pbnB1dCBpYyBzIG9mcyBsZW5cblxubGV0IHJlYyB1bnNhZmVfcmVhbGx5X2lucHV0IGljIHMgb2ZzIGxlbiA9XG4gIGlmIGxlbiA8PSAwIHRoZW4gKCkgZWxzZSBiZWdpblxuICAgIGxldCByID0gdW5zYWZlX2lucHV0IGljIHMgb2ZzIGxlbiBpblxuICAgIGlmIHIgPSAwXG4gICAgdGhlbiByYWlzZSBFbmRfb2ZfZmlsZVxuICAgIGVsc2UgdW5zYWZlX3JlYWxseV9pbnB1dCBpYyBzIChvZnMgKyByKSAobGVuIC0gcilcbiAgZW5kXG5cbmxldCByZWFsbHlfaW5wdXQgaWMgcyBvZnMgbGVuID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IGJ5dGVzX2xlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJyZWFsbHlfaW5wdXRcIlxuICBlbHNlIHVuc2FmZV9yZWFsbHlfaW5wdXQgaWMgcyBvZnMgbGVuXG5cbmxldCByZWFsbHlfaW5wdXRfc3RyaW5nIGljIGxlbiA9XG4gIGxldCBzID0gYnl0ZXNfY3JlYXRlIGxlbiBpblxuICByZWFsbHlfaW5wdXQgaWMgcyAwIGxlbjtcbiAgYnl0ZXNfdW5zYWZlX3RvX3N0cmluZyBzXG5cbmV4dGVybmFsIGlucHV0X3NjYW5fbGluZSA6IGluX2NoYW5uZWwgLT4gaW50ID0gXCJjYW1sX21sX2lucHV0X3NjYW5fbGluZVwiXG5cbmxldCBpbnB1dF9saW5lIGNoYW4gPVxuICBsZXQgcmVjIGJ1aWxkX3Jlc3VsdCBidWYgcG9zID0gZnVuY3Rpb25cbiAgICBbXSAtPiBidWZcbiAgfCBoZCA6OiB0bCAtPlxuICAgICAgbGV0IGxlbiA9IGJ5dGVzX2xlbmd0aCBoZCBpblxuICAgICAgYnl0ZXNfYmxpdCBoZCAwIGJ1ZiAocG9zIC0gbGVuKSBsZW47XG4gICAgICBidWlsZF9yZXN1bHQgYnVmIChwb3MgLSBsZW4pIHRsIGluXG4gIGxldCByZWMgc2NhbiBhY2N1IGxlbiA9XG4gICAgbGV0IG4gPSBpbnB1dF9zY2FuX2xpbmUgY2hhbiBpblxuICAgIGlmIG4gPSAwIHRoZW4gYmVnaW4gICAgICAgICAgICAgICAgICAgKCogbiA9IDA6IHdlIGFyZSBhdCBFT0YgKilcbiAgICAgIG1hdGNoIGFjY3Ugd2l0aFxuICAgICAgICBbXSAtPiByYWlzZSBFbmRfb2ZfZmlsZVxuICAgICAgfCBfICAtPiBidWlsZF9yZXN1bHQgKGJ5dGVzX2NyZWF0ZSBsZW4pIGxlbiBhY2N1XG4gICAgZW5kIGVsc2UgaWYgbiA+IDAgdGhlbiBiZWdpbiAgICAgICAgICAoKiBuID4gMDogbmV3bGluZSBmb3VuZCBpbiBidWZmZXIgKilcbiAgICAgIGxldCByZXMgPSBieXRlc19jcmVhdGUgKG4gLSAxKSBpblxuICAgICAgaWdub3JlICh1bnNhZmVfaW5wdXQgY2hhbiByZXMgMCAobiAtIDEpKTtcbiAgICAgIGlnbm9yZSAoaW5wdXRfY2hhciBjaGFuKTsgICAgICAgICAgICgqIHNraXAgdGhlIG5ld2xpbmUgKilcbiAgICAgIG1hdGNoIGFjY3Ugd2l0aFxuICAgICAgICBbXSAtPiByZXNcbiAgICAgIHwgIF8gLT4gbGV0IGxlbiA9IGxlbiArIG4gLSAxIGluXG4gICAgICAgICAgICAgIGJ1aWxkX3Jlc3VsdCAoYnl0ZXNfY3JlYXRlIGxlbikgbGVuIChyZXMgOjogYWNjdSlcbiAgICBlbmQgZWxzZSBiZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICgqIG4gPCAwOiBuZXdsaW5lIG5vdCBmb3VuZCAqKVxuICAgICAgbGV0IGJlZyA9IGJ5dGVzX2NyZWF0ZSAoLW4pIGluXG4gICAgICBpZ25vcmUodW5zYWZlX2lucHV0IGNoYW4gYmVnIDAgKC1uKSk7XG4gICAgICBzY2FuIChiZWcgOjogYWNjdSkgKGxlbiAtIG4pXG4gICAgZW5kXG4gIGluIGJ5dGVzX3Vuc2FmZV90b19zdHJpbmcgKHNjYW4gW10gMClcblxuZXh0ZXJuYWwgaW5wdXRfYnl0ZSA6IGluX2NoYW5uZWwgLT4gaW50ID0gXCJjYW1sX21sX2lucHV0X2NoYXJcIlxuZXh0ZXJuYWwgaW5wdXRfYmluYXJ5X2ludCA6IGluX2NoYW5uZWwgLT4gaW50ID0gXCJjYW1sX21sX2lucHV0X2ludFwiXG5leHRlcm5hbCBpbnB1dF92YWx1ZSA6IGluX2NoYW5uZWwgLT4gJ2EgPSBcImNhbWxfaW5wdXRfdmFsdWVcIlxuZXh0ZXJuYWwgc2Vla19pbiA6IGluX2NoYW5uZWwgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19pblwiXG5leHRlcm5hbCBwb3NfaW4gOiBpbl9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9wb3NfaW5cIlxuZXh0ZXJuYWwgaW5fY2hhbm5lbF9sZW5ndGggOiBpbl9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVcIlxuZXh0ZXJuYWwgY2xvc2VfaW4gOiBpbl9jaGFubmVsIC0+IHVuaXQgPSBcImNhbWxfbWxfY2xvc2VfY2hhbm5lbFwiXG5sZXQgY2xvc2VfaW5fbm9lcnIgaWMgPSAodHJ5IGNsb3NlX2luIGljIHdpdGggXyAtPiAoKSlcbmV4dGVybmFsIHNldF9iaW5hcnlfbW9kZV9pbiA6IGluX2NoYW5uZWwgLT4gYm9vbCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfbWxfc2V0X2JpbmFyeV9tb2RlXCJcblxuKCogT3V0cHV0IGZ1bmN0aW9ucyBvbiBzdGFuZGFyZCBvdXRwdXQgKilcblxubGV0IHByaW50X2NoYXIgYyA9IG91dHB1dF9jaGFyIHN0ZG91dCBjXG5sZXQgcHJpbnRfc3RyaW5nIHMgPSBvdXRwdXRfc3RyaW5nIHN0ZG91dCBzXG5sZXQgcHJpbnRfYnl0ZXMgcyA9IG91dHB1dF9ieXRlcyBzdGRvdXQgc1xubGV0IHByaW50X2ludCBpID0gb3V0cHV0X3N0cmluZyBzdGRvdXQgKHN0cmluZ19vZl9pbnQgaSlcbmxldCBwcmludF9mbG9hdCBmID0gb3V0cHV0X3N0cmluZyBzdGRvdXQgKHN0cmluZ19vZl9mbG9hdCBmKVxubGV0IHByaW50X2VuZGxpbmUgcyA9XG4gIG91dHB1dF9zdHJpbmcgc3Rkb3V0IHM7IG91dHB1dF9jaGFyIHN0ZG91dCAnXFxuJzsgZmx1c2ggc3Rkb3V0XG5sZXQgcHJpbnRfbmV3bGluZSAoKSA9IG91dHB1dF9jaGFyIHN0ZG91dCAnXFxuJzsgZmx1c2ggc3Rkb3V0XG5cbigqIE91dHB1dCBmdW5jdGlvbnMgb24gc3RhbmRhcmQgZXJyb3IgKilcblxubGV0IHByZXJyX2NoYXIgYyA9IG91dHB1dF9jaGFyIHN0ZGVyciBjXG5sZXQgcHJlcnJfc3RyaW5nIHMgPSBvdXRwdXRfc3RyaW5nIHN0ZGVyciBzXG5sZXQgcHJlcnJfYnl0ZXMgcyA9IG91dHB1dF9ieXRlcyBzdGRlcnIgc1xubGV0IHByZXJyX2ludCBpID0gb3V0cHV0X3N0cmluZyBzdGRlcnIgKHN0cmluZ19vZl9pbnQgaSlcbmxldCBwcmVycl9mbG9hdCBmID0gb3V0cHV0X3N0cmluZyBzdGRlcnIgKHN0cmluZ19vZl9mbG9hdCBmKVxubGV0IHByZXJyX2VuZGxpbmUgcyA9XG4gIG91dHB1dF9zdHJpbmcgc3RkZXJyIHM7IG91dHB1dF9jaGFyIHN0ZGVyciAnXFxuJzsgZmx1c2ggc3RkZXJyXG5sZXQgcHJlcnJfbmV3bGluZSAoKSA9IG91dHB1dF9jaGFyIHN0ZGVyciAnXFxuJzsgZmx1c2ggc3RkZXJyXG5cbigqIElucHV0IGZ1bmN0aW9ucyBvbiBzdGFuZGFyZCBpbnB1dCAqKVxuXG5sZXQgcmVhZF9saW5lICgpID0gZmx1c2ggc3Rkb3V0OyBpbnB1dF9saW5lIHN0ZGluXG5sZXQgcmVhZF9pbnQgKCkgPSBpbnRfb2Zfc3RyaW5nKHJlYWRfbGluZSgpKVxubGV0IHJlYWRfaW50X29wdCAoKSA9IGludF9vZl9zdHJpbmdfb3B0KHJlYWRfbGluZSgpKVxubGV0IHJlYWRfZmxvYXQgKCkgPSBmbG9hdF9vZl9zdHJpbmcocmVhZF9saW5lKCkpXG5sZXQgcmVhZF9mbG9hdF9vcHQgKCkgPSBmbG9hdF9vZl9zdHJpbmdfb3B0KHJlYWRfbGluZSgpKVxuXG4oKiBPcGVyYXRpb25zIG9uIGxhcmdlIGZpbGVzICopXG5cbm1vZHVsZSBMYXJnZUZpbGUgPVxuICBzdHJ1Y3RcbiAgICBleHRlcm5hbCBzZWVrX291dCA6IG91dF9jaGFubmVsIC0+IGludDY0IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19vdXRfNjRcIlxuICAgIGV4dGVybmFsIHBvc19vdXQgOiBvdXRfY2hhbm5lbCAtPiBpbnQ2NCA9IFwiY2FtbF9tbF9wb3Nfb3V0XzY0XCJcbiAgICBleHRlcm5hbCBvdXRfY2hhbm5lbF9sZW5ndGggOiBvdXRfY2hhbm5lbCAtPiBpbnQ2NFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVfNjRcIlxuICAgIGV4dGVybmFsIHNlZWtfaW4gOiBpbl9jaGFubmVsIC0+IGludDY0IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19pbl82NFwiXG4gICAgZXh0ZXJuYWwgcG9zX2luIDogaW5fY2hhbm5lbCAtPiBpbnQ2NCA9IFwiY2FtbF9tbF9wb3NfaW5fNjRcIlxuICAgIGV4dGVybmFsIGluX2NoYW5uZWxfbGVuZ3RoIDogaW5fY2hhbm5lbCAtPiBpbnQ2NCA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVfNjRcIlxuICBlbmRcblxuKCogRm9ybWF0cyAqKVxuXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2XG4gICA9ICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBDYW1saW50ZXJuYWxGb3JtYXRCYXNpY3MuZm9ybWF0NlxuICAgPSBGb3JtYXQgb2YgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5mbXRcbiAgICAgICAgICAgICAgICogc3RyaW5nXG5cbnR5cGUgKCdhLCAnYiwgJ2MsICdkKSBmb3JtYXQ0ID0gKCdhLCAnYiwgJ2MsICdjLCAnYywgJ2QpIGZvcm1hdDZcblxudHlwZSAoJ2EsICdiLCAnYykgZm9ybWF0ID0gKCdhLCAnYiwgJ2MsICdjKSBmb3JtYXQ0XG5cbmxldCBzdHJpbmdfb2ZfZm9ybWF0IChGb3JtYXQgKF9mbXQsIHN0cikpID0gc3RyXG5cbmV4dGVybmFsIGZvcm1hdF9vZl9zdHJpbmcgOlxuICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2IC0+XG4gKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgPSBcIiVpZGVudGl0eVwiXG5cbmxldCAoIF5eICkgKEZvcm1hdCAoZm10MSwgc3RyMSkpIChGb3JtYXQgKGZtdDIsIHN0cjIpKSA9XG4gIEZvcm1hdCAoQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzLmNvbmNhdF9mbXQgZm10MSBmbXQyLFxuICAgICAgICAgIHN0cjEgXiBcIiUsXCIgXiBzdHIyKVxuXG4oKiBNaXNjZWxsYW5lb3VzICopXG5cbmV4dGVybmFsIHN5c19leGl0IDogaW50IC0+ICdhID0gXCJjYW1sX3N5c19leGl0XCJcblxuKCogZm9yIGF0X2V4aXQgKilcbnR5cGUgJ2EgYXRvbWljX3RcbmV4dGVybmFsIGF0b21pY19tYWtlIDogJ2EgLT4gJ2EgYXRvbWljX3QgPSBcIiVtYWtlbXV0YWJsZVwiXG5leHRlcm5hbCBhdG9taWNfZ2V0IDogJ2EgYXRvbWljX3QgLT4gJ2EgPSBcIiVhdG9taWNfbG9hZFwiXG5leHRlcm5hbCBhdG9taWNfY29tcGFyZV9hbmRfc2V0IDogJ2EgYXRvbWljX3QgLT4gJ2EgLT4gJ2EgLT4gYm9vbFxuICA9IFwiJWF0b21pY19jYXNcIlxuXG5sZXQgZXhpdF9mdW5jdGlvbiA9IGF0b21pY19tYWtlIGZsdXNoX2FsbFxuXG5sZXQgcmVjIGF0X2V4aXQgZiA9XG4gICgqIE1QUiM3MjUzLCBNUFIjNzc5NjogbWFrZSBzdXJlIFwiZlwiIGlzIGV4ZWN1dGVkIG9ubHkgb25jZSAqKVxuICBsZXQgZl95ZXRfdG9fcnVuID0gYXRvbWljX21ha2UgdHJ1ZSBpblxuICBsZXQgb2xkX2V4aXQgPSBhdG9taWNfZ2V0IGV4aXRfZnVuY3Rpb24gaW5cbiAgbGV0IG5ld19leGl0ICgpID1cbiAgICBpZiBhdG9taWNfY29tcGFyZV9hbmRfc2V0IGZfeWV0X3RvX3J1biB0cnVlIGZhbHNlIHRoZW4gZiAoKSA7XG4gICAgb2xkX2V4aXQgKClcbiAgaW5cbiAgbGV0IHN1Y2Nlc3MgPSBhdG9taWNfY29tcGFyZV9hbmRfc2V0IGV4aXRfZnVuY3Rpb24gb2xkX2V4aXQgbmV3X2V4aXQgaW5cbiAgaWYgbm90IHN1Y2Nlc3MgdGhlbiBhdF9leGl0IGZcblxubGV0IGRvX2RvbWFpbl9sb2NhbF9hdF9leGl0ID0gcmVmIChmdW4gKCkgLT4gKCkpXG5cbmxldCBkb19hdF9leGl0ICgpID1cbiAgKCFkb19kb21haW5fbG9jYWxfYXRfZXhpdCkgKCk7XG4gIChhdG9taWNfZ2V0IGV4aXRfZnVuY3Rpb24pICgpXG5cbmxldCBleGl0IHJldGNvZGUgPVxuICBkb19hdF9leGl0ICgpO1xuICBzeXNfZXhpdCByZXRjb2RlXG5cbmxldCBfID0gcmVnaXN0ZXJfbmFtZWRfdmFsdWUgXCJQZXJ2YXNpdmVzLmRvX2F0X2V4aXRcIiBkb19hdF9leGl0XG5cbigqTU9EVUxFX0FMSUFTRVMqKVxubW9kdWxlIEFyZyAgICAgICAgICAgID0gQXJnXG5tb2R1bGUgQXJyYXkgICAgICAgICAgPSBBcnJheVxubW9kdWxlIEFycmF5TGFiZWxzICAgID0gQXJyYXlMYWJlbHNcbm1vZHVsZSBBdG9taWMgICAgICAgICA9IEF0b21pY1xubW9kdWxlIEJpZ2FycmF5ICAgICAgID0gQmlnYXJyYXlcbm1vZHVsZSBCb29sICAgICAgICAgICA9IEJvb2xcbm1vZHVsZSBCdWZmZXIgICAgICAgICA9IEJ1ZmZlclxubW9kdWxlIEJ5dGVzICAgICAgICAgID0gQnl0ZXNcbm1vZHVsZSBCeXRlc0xhYmVscyAgICA9IEJ5dGVzTGFiZWxzXG5tb2R1bGUgQ2FsbGJhY2sgICAgICAgPSBDYWxsYmFja1xubW9kdWxlIENoYXIgICAgICAgICAgID0gQ2hhclxubW9kdWxlIENvbXBsZXggICAgICAgID0gQ29tcGxleFxubW9kdWxlIENvbmRpdGlvbiAgICAgID0gQ29uZGl0aW9uXG5tb2R1bGUgRGlnZXN0ICAgICAgICAgPSBEaWdlc3Rcbm1vZHVsZSBEb21haW4gICAgICAgICA9IERvbWFpblxubW9kdWxlIER5bmFycmF5ICAgICAgID0gRHluYXJyYXlcbm1vZHVsZSBFZmZlY3QgICAgICAgICA9IEVmZmVjdFxubW9kdWxlIEVpdGhlciAgICAgICAgID0gRWl0aGVyXG5tb2R1bGUgRXBoZW1lcm9uICAgICAgPSBFcGhlbWVyb25cbm1vZHVsZSBGaWxlbmFtZSAgICAgICA9IEZpbGVuYW1lXG5tb2R1bGUgRmxvYXQgICAgICAgICAgPSBGbG9hdFxubW9kdWxlIEZvcm1hdCAgICAgICAgID0gRm9ybWF0XG5tb2R1bGUgRnVuICAgICAgICAgICAgPSBGdW5cbm1vZHVsZSBHYyAgICAgICAgICAgICA9IEdjXG5tb2R1bGUgSGFzaHRibCAgICAgICAgPSBIYXNodGJsXG5tb2R1bGUgSW5fY2hhbm5lbCAgICAgPSBJbl9jaGFubmVsXG5tb2R1bGUgSW50ICAgICAgICAgICAgPSBJbnRcbm1vZHVsZSBJbnQzMiAgICAgICAgICA9IEludDMyXG5tb2R1bGUgSW50NjQgICAgICAgICAgPSBJbnQ2NFxubW9kdWxlIExhenkgICAgICAgICAgID0gTGF6eVxubW9kdWxlIExleGluZyAgICAgICAgID0gTGV4aW5nXG5tb2R1bGUgTGlzdCAgICAgICAgICAgPSBMaXN0XG5tb2R1bGUgTGlzdExhYmVscyAgICAgPSBMaXN0TGFiZWxzXG5tb2R1bGUgTWFwICAgICAgICAgICAgPSBNYXBcbm1vZHVsZSBNYXJzaGFsICAgICAgICA9IE1hcnNoYWxcbm1vZHVsZSBNb3JlTGFiZWxzICAgICA9IE1vcmVMYWJlbHNcbm1vZHVsZSBNdXRleCAgICAgICAgICA9IE11dGV4XG5tb2R1bGUgTmF0aXZlaW50ICAgICAgPSBOYXRpdmVpbnRcbm1vZHVsZSBPYmogICAgICAgICAgICA9IE9ialxubW9kdWxlIE9vICAgICAgICAgICAgID0gT29cbm1vZHVsZSBPcHRpb24gICAgICAgICA9IE9wdGlvblxubW9kdWxlIE91dF9jaGFubmVsICAgID0gT3V0X2NoYW5uZWxcbm1vZHVsZSBQYXJzaW5nICAgICAgICA9IFBhcnNpbmdcbm1vZHVsZSBQcmludGV4YyAgICAgICA9IFByaW50ZXhjXG5tb2R1bGUgUHJpbnRmICAgICAgICAgPSBQcmludGZcbm1vZHVsZSBRdWV1ZSAgICAgICAgICA9IFF1ZXVlXG5tb2R1bGUgUmFuZG9tICAgICAgICAgPSBSYW5kb21cbm1vZHVsZSBSZXN1bHQgICAgICAgICA9IFJlc3VsdFxubW9kdWxlIFNjYW5mICAgICAgICAgID0gU2NhbmZcbm1vZHVsZSBTZW1hcGhvcmUgICAgICA9IFNlbWFwaG9yZVxubW9kdWxlIFNlcSAgICAgICAgICAgID0gU2VxXG5tb2R1bGUgU2V0ICAgICAgICAgICAgPSBTZXRcbm1vZHVsZSBTdGFjayAgICAgICAgICA9IFN0YWNrXG5tb2R1bGUgU3RkTGFiZWxzICAgICAgPSBTdGRMYWJlbHNcbm1vZHVsZSBTdHJpbmcgICAgICAgICA9IFN0cmluZ1xubW9kdWxlIFN0cmluZ0xhYmVscyAgID0gU3RyaW5nTGFiZWxzXG5tb2R1bGUgU3lzICAgICAgICAgICAgPSBTeXNcbm1vZHVsZSBUeXBlICAgICAgICAgICA9IFR5cGVcbm1vZHVsZSBVY2hhciAgICAgICAgICA9IFVjaGFyXG5tb2R1bGUgVW5pdCAgICAgICAgICAgPSBVbml0XG5tb2R1bGUgV2VhayAgICAgICAgICAgPSBXZWFrXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfYXRvbWljX2NhcyIsImNhbWxfYXRvbWljX2xvYWQiLCJjYW1sX2NyZWF0ZV9ieXRlcyIsImNhbWxfZmxvYXRfb2Zfc3RyaW5nIiwiY2FtbF9pbnRfb2Zfc3RyaW5nIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9tbF9ieXRlc19sZW5ndGgiLCJjYW1sX21sX2NoYW5uZWxfc2l6ZSIsImNhbWxfbWxfY2hhbm5lbF9zaXplXzY0IiwiY2FtbF9tbF9jbG9zZV9jaGFubmVsIiwiY2FtbF9tbF9mbHVzaCIsImNhbWxfbWxfaW5wdXQiLCJjYW1sX21sX2lucHV0X2NoYXIiLCJjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pbiIsImNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX291dCIsImNhbWxfbWxfb3V0cHV0IiwiY2FtbF9tbF9vdXRwdXRfYnl0ZXMiLCJjYW1sX21sX291dHB1dF9jaGFyIiwiY2FtbF9tbF9zZXRfYmluYXJ5X21vZGUiLCJjYW1sX21sX3NldF9jaGFubmVsX25hbWUiLCJjYW1sX21sX3N0cmluZ19sZW5ndGgiLCJjYW1sX3N0cmluZ19jb25jYXQiLCJjYW1sX3N0cmluZ19vZl9ieXRlcyIsImNhbWxfc3lzX29wZW4iLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImdsb2JhbF9kYXRhIiwiQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzIiwiSW52YWxpZF9hcmd1bWVudCIsIkZhaWx1cmUiLCJNYXRjaF9mYWlsdXJlIiwiQXNzZXJ0X2ZhaWx1cmUiLCJOb3RfZm91bmQiLCJPdXRfb2ZfbWVtb3J5IiwiU3RhY2tfb3ZlcmZsb3ciLCJTeXNfZXJyb3IiLCJFbmRfb2ZfZmlsZSIsIkRpdmlzaW9uX2J5X3plcm8iLCJTeXNfYmxvY2tlZF9pbyIsIlVuZGVmaW5lZF9yZWN1cnNpdmVfbW9kdWxlIiwiZmFpbHdpdGgiLCJzIiwiaW52YWxpZF9hcmciLCJFeGl0IiwibWluIiwieCIsInkiLCJtYXgiLCJhYnMiLCJsbm90IiwiY2hhcl9vZl9pbnQiLCJuIiwiY3N0X2ZhbHNlIiwiY3N0X3RydWUiLCJzdHJpbmdfb2ZfYm9vbCIsImIiLCJib29sX29mX3N0cmluZyIsInBhcmFtIiwiYm9vbF9vZl9zdHJpbmdfb3B0Iiwic3RyaW5nX29mX2ludCIsImludF9vZl9zdHJpbmdfb3B0IiwiZXhuIiwidmFsaWRfZmxvYXRfbGV4ZW0iLCJzMSIsImwiLCJpIiwibWF0Y2giLCJzdHJpbmdfb2ZfZmxvYXQiLCJmbG9hdF9vZl9zdHJpbmdfb3B0Iiwic3ltYm9sIiwibDEiLCJsMiIsImgxIiwiaDIiLCJ0bCIsImgzIiwiYmxvY2siLCJkc3QiLCJvZmZzZXQiLCJzdGRpbiIsInN0ZG91dCIsInN0ZGVyciIsIm9wZW5fb3V0X2dlbiIsIm1vZGUiLCJwZXJtIiwibmFtZSIsImMiLCJvcGVuX291dCIsIm9wZW5fb3V0X2JpbiIsImZsdXNoX2FsbCIsImEiLCJvdXRwdXRfYnl0ZXMiLCJvYyIsIm91dHB1dF9zdHJpbmciLCJvdXRwdXQiLCJvZnMiLCJsZW4iLCJvdXRwdXRfc3Vic3RyaW5nIiwib3V0cHV0X3ZhbHVlIiwiY2hhbiIsInYiLCJjbG9zZV9vdXQiLCJjbG9zZV9vdXRfbm9lcnIiLCJvcGVuX2luX2dlbiIsIm9wZW5faW4iLCJvcGVuX2luX2JpbiIsImlucHV0IiwiaWMiLCJ1bnNhZmVfcmVhbGx5X2lucHV0IiwiciIsInJlYWxseV9pbnB1dCIsInJlYWxseV9pbnB1dF9zdHJpbmciLCJpbnB1dF9saW5lIiwiYnVpbGRfcmVzdWx0IiwiYnVmIiwicG9zIiwiaGQiLCJhY2N1IiwiYmVnIiwicmVzIiwiY2xvc2VfaW5fbm9lcnIiLCJwcmludF9jaGFyIiwicHJpbnRfc3RyaW5nIiwicHJpbnRfYnl0ZXMiLCJwcmludF9pbnQiLCJwcmludF9mbG9hdCIsInByaW50X2VuZGxpbmUiLCJwcmludF9uZXdsaW5lIiwicHJlcnJfY2hhciIsInByZXJyX3N0cmluZyIsInByZXJyX2J5dGVzIiwicHJlcnJfaW50IiwicHJlcnJfZmxvYXQiLCJwcmVycl9lbmRsaW5lIiwicHJlcnJfbmV3bGluZSIsInJlYWRfbGluZSIsInJlYWRfaW50IiwicmVhZF9pbnRfb3B0IiwicmVhZF9mbG9hdCIsInJlYWRfZmxvYXRfb3B0Iiwic3RyaW5nX29mX2Zvcm1hdCIsInN0ciIsInN0cjIiLCJmbXQyIiwic3RyMSIsImZtdDEiLCJzMiIsImV4aXRfZnVuY3Rpb24iLCJhdF9leGl0Iiwib2xkX2V4aXQiLCJmX3lldF90b19ydW4iLCJuZXdfZXhpdCIsInN1Y2Nlc3MiLCJkb19kb21haW5fbG9jYWxfYXRfZXhpdCIsImRvX2F0X2V4aXQiLCJleGl0IiwicmV0Y29kZSIsIlN0ZGxpYiJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsb0JBQUE7QUFBQSxJQUFBQyx1QkFBQTtBQUFBLElBQUFDLHFCQUFB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QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFRHJrQi9EIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6OTk1NywiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9zeXMubWwuaW4iXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKiBAY29uZmlndXJlX2lucHV0QCAqKVxuIzMgXCJzeXMubWwuaW5cIlxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIGJhY2tlbmRfdHlwZSA9XG4gIHwgTmF0aXZlXG4gIHwgQnl0ZWNvZGVcbiAgfCBPdGhlciBvZiBzdHJpbmdcbigqIFN5c3RlbSBpbnRlcmZhY2UgKilcblxuZXh0ZXJuYWwgZ2V0X2NvbmZpZzogdW5pdCAtPiBzdHJpbmcgKiBpbnQgKiBib29sID0gXCJjYW1sX3N5c19nZXRfY29uZmlnXCJcbmV4dGVybmFsIGdldF9leGVjdXRhYmxlX25hbWUgOiB1bml0IC0+IHN0cmluZyA9IFwiY2FtbF9zeXNfZXhlY3V0YWJsZV9uYW1lXCJcbmV4dGVybmFsIGFyZ3YgOiBzdHJpbmcgYXJyYXkgPSBcIiVzeXNfYXJndlwiXG5leHRlcm5hbCBiaWdfZW5kaWFuIDogdW5pdCAtPiBib29sID0gXCIlYmlnX2VuZGlhblwiXG5leHRlcm5hbCB3b3JkX3NpemUgOiB1bml0IC0+IGludCA9IFwiJXdvcmRfc2l6ZVwiXG5leHRlcm5hbCBpbnRfc2l6ZSA6IHVuaXQgLT4gaW50ID0gXCIlaW50X3NpemVcIlxuZXh0ZXJuYWwgbWF4X3dvc2l6ZSA6IHVuaXQgLT4gaW50ID0gXCIlbWF4X3dvc2l6ZVwiXG5leHRlcm5hbCB1bml4IDogdW5pdCAtPiBib29sID0gXCIlb3N0eXBlX3VuaXhcIlxuZXh0ZXJuYWwgd2luMzIgOiB1bml0IC0+IGJvb2wgPSBcIiVvc3R5cGVfd2luMzJcIlxuZXh0ZXJuYWwgY3lnd2luIDogdW5pdCAtPiBib29sID0gXCIlb3N0eXBlX2N5Z3dpblwiXG5leHRlcm5hbCBnZXRfYmFja2VuZF90eXBlIDogdW5pdCAtPiBiYWNrZW5kX3R5cGUgPSBcIiViYWNrZW5kX3R5cGVcIlxuXG5sZXQgZXhlY3V0YWJsZV9uYW1lID0gZ2V0X2V4ZWN1dGFibGVfbmFtZSgpXG5sZXQgKG9zX3R5cGUsIF8sIF8pID0gZ2V0X2NvbmZpZygpXG5sZXQgYmFja2VuZF90eXBlID0gZ2V0X2JhY2tlbmRfdHlwZSAoKVxubGV0IGJpZ19lbmRpYW4gPSBiaWdfZW5kaWFuICgpXG5sZXQgd29yZF9zaXplID0gd29yZF9zaXplICgpXG5sZXQgaW50X3NpemUgPSBpbnRfc2l6ZSAoKVxubGV0IHVuaXggPSB1bml4ICgpXG5sZXQgd2luMzIgPSB3aW4zMiAoKVxubGV0IGN5Z3dpbiA9IGN5Z3dpbiAoKVxubGV0IG1heF9hcnJheV9sZW5ndGggPSBtYXhfd29zaXplICgpXG5sZXQgbWF4X2Zsb2F0YXJyYXlfbGVuZ3RoID0gbWF4X2FycmF5X2xlbmd0aCAvICg2NCAvIHdvcmRfc2l6ZSlcbmxldCBtYXhfc3RyaW5nX2xlbmd0aCA9IHdvcmRfc2l6ZSAvIDggKiBtYXhfYXJyYXlfbGVuZ3RoIC0gMVxuZXh0ZXJuYWwgcnVudGltZV92YXJpYW50IDogdW5pdCAtPiBzdHJpbmcgPSBcImNhbWxfcnVudGltZV92YXJpYW50XCJcbmV4dGVybmFsIHJ1bnRpbWVfcGFyYW1ldGVycyA6IHVuaXQgLT4gc3RyaW5nID0gXCJjYW1sX3J1bnRpbWVfcGFyYW1ldGVyc1wiXG5cbmV4dGVybmFsIGZpbGVfZXhpc3RzOiBzdHJpbmcgLT4gYm9vbCA9IFwiY2FtbF9zeXNfZmlsZV9leGlzdHNcIlxuZXh0ZXJuYWwgaXNfZGlyZWN0b3J5IDogc3RyaW5nIC0+IGJvb2wgPSBcImNhbWxfc3lzX2lzX2RpcmVjdG9yeVwiXG5leHRlcm5hbCBpc19yZWd1bGFyX2ZpbGUgOiBzdHJpbmcgLT4gYm9vbCA9IFwiY2FtbF9zeXNfaXNfcmVndWxhcl9maWxlXCJcbmV4dGVybmFsIHJlbW92ZTogc3RyaW5nIC0+IHVuaXQgPSBcImNhbWxfc3lzX3JlbW92ZVwiXG5leHRlcm5hbCByZW5hbWUgOiBzdHJpbmcgLT4gc3RyaW5nIC0+IHVuaXQgPSBcImNhbWxfc3lzX3JlbmFtZVwiXG5leHRlcm5hbCBnZXRlbnY6IHN0cmluZyAtPiBzdHJpbmcgPSBcImNhbWxfc3lzX2dldGVudlwiXG5cbmxldCBnZXRlbnZfb3B0IHMgPVxuICAoKiBUT0RPOiBleHBvc2UgYSBub24tcmFpc2luZyBwcmltaXRpdmUgZGlyZWN0bHkuICopXG4gIHRyeSBTb21lIChnZXRlbnYgcylcbiAgd2l0aCBOb3RfZm91bmQgLT4gTm9uZVxuXG5leHRlcm5hbCBjb21tYW5kOiBzdHJpbmcgLT4gaW50ID0gXCJjYW1sX3N5c19zeXN0ZW1fY29tbWFuZFwiXG5leHRlcm5hbCB0aW1lOiB1bml0IC0+IChmbG9hdCBbQHVuYm94ZWRdKSA9XG4gIFwiY2FtbF9zeXNfdGltZVwiIFwiY2FtbF9zeXNfdGltZV91bmJveGVkXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIGNoZGlyOiBzdHJpbmcgLT4gdW5pdCA9IFwiY2FtbF9zeXNfY2hkaXJcIlxuZXh0ZXJuYWwgbWtkaXI6IHN0cmluZyAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9zeXNfbWtkaXJcIlxuZXh0ZXJuYWwgcm1kaXI6IHN0cmluZyAtPiB1bml0ID0gXCJjYW1sX3N5c19ybWRpclwiXG5leHRlcm5hbCBnZXRjd2Q6IHVuaXQgLT4gc3RyaW5nID0gXCJjYW1sX3N5c19nZXRjd2RcIlxuZXh0ZXJuYWwgcmVhZGRpciA6IHN0cmluZyAtPiBzdHJpbmcgYXJyYXkgPSBcImNhbWxfc3lzX3JlYWRfZGlyZWN0b3J5XCJcblxubGV0IGludGVyYWN0aXZlID0gcmVmIGZhbHNlXG5cbnR5cGUgc2lnbmFsX2JlaGF2aW9yID1cbiAgICBTaWduYWxfZGVmYXVsdFxuICB8IFNpZ25hbF9pZ25vcmVcbiAgfCBTaWduYWxfaGFuZGxlIG9mIChpbnQgLT4gdW5pdClcblxuZXh0ZXJuYWwgc2lnbmFsIDogaW50IC0+IHNpZ25hbF9iZWhhdmlvciAtPiBzaWduYWxfYmVoYXZpb3JcbiAgICAgICAgICAgICAgICA9IFwiY2FtbF9pbnN0YWxsX3NpZ25hbF9oYW5kbGVyXCJcblxubGV0IHNldF9zaWduYWwgc2lnX251bSBzaWdfYmVoID0gaWdub3JlKHNpZ25hbCBzaWdfbnVtIHNpZ19iZWgpXG5cbmxldCBzaWdhYnJ0ID0gLTFcbmxldCBzaWdhbHJtID0gLTJcbmxldCBzaWdmcGUgPSAtM1xubGV0IHNpZ2h1cCA9IC00XG5sZXQgc2lnaWxsID0gLTVcbmxldCBzaWdpbnQgPSAtNlxubGV0IHNpZ2tpbGwgPSAtN1xubGV0IHNpZ3BpcGUgPSAtOFxubGV0IHNpZ3F1aXQgPSAtOVxubGV0IHNpZ3NlZ3YgPSAtMTBcbmxldCBzaWd0ZXJtID0gLTExXG5sZXQgc2lndXNyMSA9IC0xMlxubGV0IHNpZ3VzcjIgPSAtMTNcbmxldCBzaWdjaGxkID0gLTE0XG5sZXQgc2lnY29udCA9IC0xNVxubGV0IHNpZ3N0b3AgPSAtMTZcbmxldCBzaWd0c3RwID0gLTE3XG5sZXQgc2lndHRpbiA9IC0xOFxubGV0IHNpZ3R0b3UgPSAtMTlcbmxldCBzaWd2dGFscm0gPSAtMjBcbmxldCBzaWdwcm9mID0gLTIxXG5sZXQgc2lnYnVzID0gLTIyXG5sZXQgc2lncG9sbCA9IC0yM1xubGV0IHNpZ3N5cyA9IC0yNFxubGV0IHNpZ3RyYXAgPSAtMjVcbmxldCBzaWd1cmcgPSAtMjZcbmxldCBzaWd4Y3B1ID0gLTI3XG5sZXQgc2lneGZzeiA9IC0yOFxuXG5leGNlcHRpb24gQnJlYWtcblxubGV0IGNhdGNoX2JyZWFrIG9uID1cbiAgaWYgb24gdGhlblxuICAgIHNldF9zaWduYWwgc2lnaW50IChTaWduYWxfaGFuZGxlKGZ1biBfIC0+IHJhaXNlIEJyZWFrKSlcbiAgZWxzZVxuICAgIHNldF9zaWduYWwgc2lnaW50IFNpZ25hbF9kZWZhdWx0XG5cblxuZXh0ZXJuYWwgZW5hYmxlX3J1bnRpbWVfd2FybmluZ3M6IGJvb2wgLT4gdW5pdCA9XG4gIFwiY2FtbF9tbF9lbmFibGVfcnVudGltZV93YXJuaW5nc1wiXG5leHRlcm5hbCBydW50aW1lX3dhcm5pbmdzX2VuYWJsZWQ6IHVuaXQgLT4gYm9vbCA9XG4gIFwiY2FtbF9tbF9ydW50aW1lX3dhcm5pbmdzX2VuYWJsZWRcIlxuXG4oKiBUaGUgdmVyc2lvbiBzdHJpbmcgaXMgZm91bmQgaW4gZmlsZSAuLi9WRVJTSU9OICopXG5cbmxldCBvY2FtbF92ZXJzaW9uID0gXCJAVkVSU0lPTkBcIlxuXG5sZXQgZGV2ZWxvcG1lbnRfdmVyc2lvbiA9IEBPQ0FNTF9ERVZFTE9QTUVOVF9WRVJTSU9OQFxuXG50eXBlIGV4dHJhX3ByZWZpeCA9IFBsdXMgfCBUaWxkZVxuXG50eXBlIGV4dHJhX2luZm8gPSBleHRyYV9wcmVmaXggKiBzdHJpbmdcblxudHlwZSBvY2FtbF9yZWxlYXNlX2luZm8gPSB7XG4gIG1ham9yIDogaW50O1xuICBtaW5vciA6IGludDtcbiAgcGF0Y2hsZXZlbCA6IGludDtcbiAgZXh0cmEgOiBleHRyYV9pbmZvIG9wdGlvblxufVxuXG5sZXQgb2NhbWxfcmVsZWFzZSA9IHtcbiAgbWFqb3IgPSBAT0NBTUxfVkVSU0lPTl9NQUpPUkA7XG4gIG1pbm9yID0gQE9DQU1MX1ZFUlNJT05fTUlOT1JAO1xuICBwYXRjaGxldmVsID0gQE9DQU1MX1ZFUlNJT05fUEFUQ0hMRVZFTEA7XG4gIGV4dHJhID0gQE9DQU1MX1JFTEVBU0VfRVhUUkFAXG59XG5cbigqIE9wdGltaXphdGlvbiAqKVxuXG5leHRlcm5hbCBvcGFxdWVfaWRlbnRpdHkgOiAnYSAtPiAnYSA9IFwiJW9wYXF1ZVwiXG5cbm1vZHVsZSBJbW1lZGlhdGU2NCA9IHN0cnVjdFxuICBtb2R1bGUgdHlwZSBOb25faW1tZWRpYXRlID0gc2lnXG4gICAgdHlwZSB0XG4gIGVuZFxuICBtb2R1bGUgdHlwZSBJbW1lZGlhdGUgPSBzaWdcbiAgICB0eXBlIHQgW0BAaW1tZWRpYXRlXVxuICBlbmRcblxuICBtb2R1bGUgTWFrZShJbW1lZGlhdGUgOiBJbW1lZGlhdGUpKE5vbl9pbW1lZGlhdGUgOiBOb25faW1tZWRpYXRlKSA9IHN0cnVjdFxuICAgIHR5cGUgdCBbQEBpbW1lZGlhdGU2NF1cbiAgICB0eXBlICdhIHJlcHIgPVxuICAgICAgfCBJbW1lZGlhdGUgOiBJbW1lZGlhdGUudCByZXByXG4gICAgICB8IE5vbl9pbW1lZGlhdGUgOiBOb25faW1tZWRpYXRlLnQgcmVwclxuICAgIGV4dGVybmFsIG1hZ2ljIDogXyByZXByIC0+IHQgcmVwciA9IFwiJWlkZW50aXR5XCJcbiAgICBsZXQgcmVwciA9XG4gICAgICBpZiB3b3JkX3NpemUgPSA2NCB0aGVuXG4gICAgICAgIG1hZ2ljIEltbWVkaWF0ZVxuICAgICAgZWxzZVxuICAgICAgICBtYWdpYyBOb25faW1tZWRpYXRlXG4gIGVuZFxuZW5kXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJTdGRsaWIiLCJleGVjdXRhYmxlX25hbWUiLCJvc190eXBlIiwidW5peCIsIndpbjMyIiwiY3lnd2luIiwibWF4X2FycmF5X2xlbmd0aCIsIm1heF9mbG9hdGFycmF5X2xlbmd0aCIsIm1heF9zdHJpbmdfbGVuZ3RoIiwiZ2V0ZW52X29wdCIsInMiLCJleG4iLCJzZXRfc2lnbmFsIiwic2lnX251bSIsInNpZ19iZWgiLCJCcmVhayIsImNhdGNoX2JyZWFrIiwib24iLCJNYWtlIiwiSW1tZWRpYXRlIiwiTm9uX2ltbWVkaWF0ZSIsIlN0ZGxpYl9TeXMiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsOEJBQUE7QUFBQSxJQUFBQyxzQkFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxrQkNtQ3NCO0FBQUEsSUFBQUMsVUFDQTtBQUFBLElBQUFDLE9BQVk7QUFBQSxJQUFBQyxRQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLFlBQUFDLFdBQUFDO0FBQUFBLElBdUJoQyxZQUFTO0FBQUEsVUFBQUM7QUFBQUEsU0FBQUEsTUQzRFg7QUFBQSwyQkM0RG9CO0FBQUEsS0Q1RHBCO0FBQUE7QUFBQSxHQzREd0I7QUFBQSxZQUFBQyxXQUFBQyxTQUFBQyxTQXFCdUM7QUFBQSxPQUFBQyxRQTdDN0I7QUFBQSxZQUFBQyxZQUFBQyxJQStFaEMsaUJBR2tDO0FBQUEsWUFBQUMsS0FBQUMsV0FBQUMsZUFzRDVCO0FBQUE7QUFBQSxJQUFBQztBQUFBQSxNQXhJMEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRURwQ2xDIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTAwNDYsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvb2JqLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBPcGVyYXRpb25zIG9uIGludGVybmFsIHJlcHJlc2VudGF0aW9ucyBvZiB2YWx1ZXMgKilcblxudHlwZSB0XG5cbnR5cGUgcmF3X2RhdGEgPSBuYXRpdmVpbnRcblxuZXh0ZXJuYWwgcmVwciA6ICdhIC0+IHQgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCBvYmogOiB0IC0+ICdhID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgbWFnaWMgOiAnYSAtPiAnYiA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGlzX2ludCA6IHQgLT4gYm9vbCA9IFwiJW9ial9pc19pbnRcIlxubGV0IFtAaW5saW5lIGFsd2F5c10gaXNfYmxvY2sgYSA9IG5vdCAoaXNfaW50IGEpXG5leHRlcm5hbCB0YWcgOiB0IC0+IGludCA9IFwiY2FtbF9vYmpfdGFnXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIHNpemUgOiB0IC0+IGludCA9IFwiJW9ial9zaXplXCJcbmV4dGVybmFsIHJlYWNoYWJsZV93b3JkcyA6IHQgLT4gaW50ID0gXCJjYW1sX29ial9yZWFjaGFibGVfd29yZHNcIlxuZXh0ZXJuYWwgZmllbGQgOiB0IC0+IGludCAtPiB0ID0gXCIlb2JqX2ZpZWxkXCJcbmV4dGVybmFsIHNldF9maWVsZCA6IHQgLT4gaW50IC0+IHQgLT4gdW5pdCA9IFwiJW9ial9zZXRfZmllbGRcIlxuZXh0ZXJuYWwgZmxvYXRhcnJheV9nZXQgOiBmbG9hdGFycmF5IC0+IGludCAtPiBmbG9hdCA9IFwiY2FtbF9mbG9hdGFycmF5X2dldFwiXG5leHRlcm5hbCBmbG9hdGFycmF5X3NldCA6XG4gICAgZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgLT4gdW5pdCA9IFwiY2FtbF9mbG9hdGFycmF5X3NldFwiXG5sZXQgW0BpbmxpbmUgYWx3YXlzXSBkb3VibGVfZmllbGQgeCBpID0gZmxvYXRhcnJheV9nZXQgKG9iaiB4IDogZmxvYXRhcnJheSkgaVxubGV0IFtAaW5saW5lIGFsd2F5c10gc2V0X2RvdWJsZV9maWVsZCB4IGkgdiA9XG4gIGZsb2F0YXJyYXlfc2V0IChvYmogeCA6IGZsb2F0YXJyYXkpIGkgdlxuZXh0ZXJuYWwgcmF3X2ZpZWxkIDogdCAtPiBpbnQgLT4gcmF3X2RhdGEgPSBcImNhbWxfb2JqX3Jhd19maWVsZFwiXG5leHRlcm5hbCBzZXRfcmF3X2ZpZWxkIDogdCAtPiBpbnQgLT4gcmF3X2RhdGEgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfb2JqX3NldF9yYXdfZmllbGRcIlxuXG5leHRlcm5hbCBuZXdfYmxvY2sgOiBpbnQgLT4gaW50IC0+IHQgPSBcImNhbWxfb2JqX2Jsb2NrXCJcbmV4dGVybmFsIGR1cCA6IHQgLT4gdCA9IFwiY2FtbF9vYmpfZHVwXCJcbmV4dGVybmFsIGFkZF9vZmZzZXQgOiB0IC0+IEludDMyLnQgLT4gdCA9IFwiY2FtbF9vYmpfYWRkX29mZnNldFwiXG5leHRlcm5hbCB3aXRoX3RhZyA6IGludCAtPiB0IC0+IHQgPSBcImNhbWxfb2JqX3dpdGhfdGFnXCJcblxubGV0IGZpcnN0X25vbl9jb25zdGFudF9jb25zdHJ1Y3Rvcl90YWcgPSAwXG5sZXQgbGFzdF9ub25fY29uc3RhbnRfY29uc3RydWN0b3JfdGFnID0gMjQzXG5cbmxldCBmb3JjaW5nX3RhZyA9IDI0NFxubGV0IGNvbnRfdGFnID0gMjQ1XG5sZXQgbGF6eV90YWcgPSAyNDZcbmxldCBjbG9zdXJlX3RhZyA9IDI0N1xubGV0IG9iamVjdF90YWcgPSAyNDhcbmxldCBpbmZpeF90YWcgPSAyNDlcbmxldCBmb3J3YXJkX3RhZyA9IDI1MFxuXG5sZXQgbm9fc2Nhbl90YWcgPSAyNTFcblxubGV0IGFic3RyYWN0X3RhZyA9IDI1MVxubGV0IHN0cmluZ190YWcgPSAyNTJcbmxldCBkb3VibGVfdGFnID0gMjUzXG5sZXQgZG91YmxlX2FycmF5X3RhZyA9IDI1NFxubGV0IGN1c3RvbV90YWcgPSAyNTVcblxuXG5sZXQgaW50X3RhZyA9IDEwMDBcbmxldCBvdXRfb2ZfaGVhcF90YWcgPSAxMDAxXG5sZXQgdW5hbGlnbmVkX3RhZyA9IDEwMDJcblxubW9kdWxlIEV4dGVuc2lvbl9jb25zdHJ1Y3RvciA9XG5zdHJ1Y3RcbiAgdHlwZSB0ID0gZXh0ZW5zaW9uX2NvbnN0cnVjdG9yXG4gIGxldCBvZl92YWwgeCA9XG4gICAgbGV0IHggPSByZXByIHggaW5cbiAgICBsZXQgc2xvdCA9XG4gICAgICBpZiAoaXNfYmxvY2sgeCkgJiYgKHRhZyB4KSA8PiBvYmplY3RfdGFnICYmIChzaXplIHgpID49IDEgdGhlbiBmaWVsZCB4IDBcbiAgICAgIGVsc2UgeFxuICAgIGluXG4gICAgbGV0IG5hbWUgPVxuICAgICAgaWYgKGlzX2Jsb2NrIHNsb3QpICYmICh0YWcgc2xvdCkgPSBvYmplY3RfdGFnIHRoZW4gZmllbGQgc2xvdCAwXG4gICAgICBlbHNlIGludmFsaWRfYXJnIFwiT2JqLmV4dGVuc2lvbl9jb25zdHJ1Y3RvclwiXG4gICAgaW5cbiAgICAgIGlmICh0YWcgbmFtZSkgPSBzdHJpbmdfdGFnIHRoZW4gKG9iaiBzbG90IDogdClcbiAgICAgIGVsc2UgaW52YWxpZF9hcmcgXCJPYmouZXh0ZW5zaW9uX2NvbnN0cnVjdG9yXCJcblxuICBsZXQgW0BpbmxpbmUgYWx3YXlzXSBuYW1lIChzbG90IDogdCkgPVxuICAgIChvYmogKGZpZWxkIChyZXByIHNsb3QpIDApIDogc3RyaW5nKVxuXG4gIGxldCBbQGlubGluZSBhbHdheXNdIGlkIChzbG90IDogdCkgPVxuICAgIChvYmogKGZpZWxkIChyZXByIHNsb3QpIDEpIDogaW50KVxuZW5kXG5cbm1vZHVsZSBFcGhlbWVyb24gPSBzdHJ1Y3RcbiAgdHlwZSBvYmpfdCA9IHRcblxuICB0eXBlIHQgKCoqIGVwaGVtZXJvbiAqKVxuXG4gICAoKiogVG8gY2hhbmdlIGluIHN5bmMgd2l0aCB3ZWFrLmggKilcbiAgbGV0IGFkZGl0aW9uYWxfdmFsdWVzID0gMlxuICBsZXQgbWF4X2VwaGVfbGVuZ3RoID0gU3lzLm1heF9hcnJheV9sZW5ndGggLSBhZGRpdGlvbmFsX3ZhbHVlc1xuXG4gIGV4dGVybmFsIGNyZWF0ZSA6IGludCAtPiB0ID0gXCJjYW1sX2VwaGVfY3JlYXRlXCJcbiAgbGV0IGNyZWF0ZSBsID1cbiAgICBpZiBub3QgKDAgPD0gbCAmJiBsIDw9IG1heF9lcGhlX2xlbmd0aCkgdGhlblxuICAgICAgaW52YWxpZF9hcmcgXCJPYmouRXBoZW1lcm9uLmNyZWF0ZVwiO1xuICAgIGNyZWF0ZSBsXG5cbiAgbGV0IGxlbmd0aCB4ID0gc2l6ZShyZXByIHgpIC0gYWRkaXRpb25hbF92YWx1ZXNcblxuICBsZXQgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIG1zZyA9XG4gICAgaWYgbm90ICgwIDw9IG8gJiYgbyA8IGxlbmd0aCBlKSB0aGVuXG4gICAgICBpbnZhbGlkX2FyZyBtc2dcblxuICBleHRlcm5hbCBnZXRfa2V5OiB0IC0+IGludCAtPiBvYmpfdCBvcHRpb24gPSBcImNhbWxfZXBoZV9nZXRfa2V5XCJcbiAgbGV0IGdldF9rZXkgZSBvID1cbiAgICByYWlzZV9pZl9pbnZhbGlkX29mZnNldCBlIG8gXCJPYmouRXBoZW1lcm9uLmdldF9rZXlcIjtcbiAgICBnZXRfa2V5IGUgb1xuXG4gIGV4dGVybmFsIGdldF9rZXlfY29weTogdCAtPiBpbnQgLT4gb2JqX3Qgb3B0aW9uID0gXCJjYW1sX2VwaGVfZ2V0X2tleV9jb3B5XCJcbiAgbGV0IGdldF9rZXlfY29weSBlIG8gPVxuICAgIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIk9iai5FcGhlbWVyb24uZ2V0X2tleV9jb3B5XCI7XG4gICAgZ2V0X2tleV9jb3B5IGUgb1xuXG4gIGV4dGVybmFsIHNldF9rZXk6IHQgLT4gaW50IC0+IG9ial90IC0+IHVuaXQgPSBcImNhbWxfZXBoZV9zZXRfa2V5XCJcbiAgbGV0IHNldF9rZXkgZSBvIHggPVxuICAgIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIk9iai5FcGhlbWVyb24uc2V0X2tleVwiO1xuICAgIHNldF9rZXkgZSBvIHhcblxuICBleHRlcm5hbCB1bnNldF9rZXk6IHQgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfZXBoZV91bnNldF9rZXlcIlxuICBsZXQgdW5zZXRfa2V5IGUgbyA9XG4gICAgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIFwiT2JqLkVwaGVtZXJvbi51bnNldF9rZXlcIjtcbiAgICB1bnNldF9rZXkgZSBvXG5cbiAgZXh0ZXJuYWwgY2hlY2tfa2V5OiB0IC0+IGludCAtPiBib29sID0gXCJjYW1sX2VwaGVfY2hlY2tfa2V5XCJcbiAgbGV0IGNoZWNrX2tleSBlIG8gPVxuICAgIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIk9iai5FcGhlbWVyb24uY2hlY2tfa2V5XCI7XG4gICAgY2hlY2tfa2V5IGUgb1xuXG4gIGV4dGVybmFsIGJsaXRfa2V5IDogdCAtPiBpbnQgLT4gdCAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgICA9IFwiY2FtbF9lcGhlX2JsaXRfa2V5XCJcblxuICBsZXQgYmxpdF9rZXkgZTEgbzEgZTIgbzIgbCA9XG4gICAgaWYgbCA8IDAgfHwgbzEgPCAwIHx8IG8xID4gbGVuZ3RoIGUxIC0gbFxuICAgICAgIHx8IG8yIDwgMCB8fCBvMiA+IGxlbmd0aCBlMiAtIGxcbiAgICB0aGVuIGludmFsaWRfYXJnIFwiT2JqLkVwaGVtZXJvbi5ibGl0X2tleVwiXG4gICAgZWxzZSBpZiBsIDw+IDAgdGhlbiBibGl0X2tleSBlMSBvMSBlMiBvMiBsXG5cbiAgZXh0ZXJuYWwgZ2V0X2RhdGE6IHQgLT4gb2JqX3Qgb3B0aW9uID0gXCJjYW1sX2VwaGVfZ2V0X2RhdGFcIlxuICBleHRlcm5hbCBnZXRfZGF0YV9jb3B5OiB0IC0+IG9ial90IG9wdGlvbiA9IFwiY2FtbF9lcGhlX2dldF9kYXRhX2NvcHlcIlxuICBleHRlcm5hbCBzZXRfZGF0YTogdCAtPiBvYmpfdCAtPiB1bml0ID0gXCJjYW1sX2VwaGVfc2V0X2RhdGFcIlxuICBleHRlcm5hbCB1bnNldF9kYXRhOiB0IC0+IHVuaXQgPSBcImNhbWxfZXBoZV91bnNldF9kYXRhXCJcbiAgZXh0ZXJuYWwgY2hlY2tfZGF0YTogdCAtPiBib29sID0gXCJjYW1sX2VwaGVfY2hlY2tfZGF0YVwiXG4gIGV4dGVybmFsIGJsaXRfZGF0YSA6IHQgLT4gdCAtPiB1bml0ID0gXCJjYW1sX2VwaGVfYmxpdF9kYXRhXCJcblxuZW5kXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfY2hlY2tfYm91bmQiLCJjYW1sX29ial90YWciLCJnbG9iYWxfZGF0YSIsIlN0ZGxpYiIsIlN0ZGxpYl9TeXMiLCJpc19ibG9jayIsImEiLCJkb3VibGVfZmllbGQiLCJ4IiwiaSIsInNldF9kb3VibGVfZmllbGQiLCJ2Iiwib2ZfdmFsIiwic2xvdCIsImNzdF9PYmpfZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIiwibmFtZSIsImlkIiwibWF4X2VwaGVfbGVuZ3RoIiwiY3JlYXRlIiwibCIsImxlbmd0aCIsInJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IiwiZSIsIm8iLCJtc2ciLCJnZXRfa2V5IiwiZ2V0X2tleV9jb3B5Iiwic2V0X2tleSIsInVuc2V0X2tleSIsImNoZWNrX2tleSIsImJsaXRfa2V5IiwiZTEiLCJvMSIsImUyIiwibzIiLCJTdGRsaWJfT2JqIl0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsYUFBQTtBQUFBLFlBQUFDLFNBQUFDLEdDeUJrQyxtQ0FBYztBQUFBLFlBQUFDLGFBQUFDLEdBQUFDLEdBU1Isb0NBQXFDO0FBQUEsWUFBQUMsaUJBQUFGLEdBQUFDLEdBQUFFO0FBQUFBLElBRTNFO0FBQUEsSUFBdUM7QUFBQTtBQUFBLFlBQUFDLE9BQUFKO0FBQUFBO0FBQUFBLEtBQUFLO0FBQUFBLE9Bd0NoQztBQUFBLFVBQWdCO0FBQUE7QUFBQSxLQUFBQyxnQ0Q1RXpCO0FBQUE7QUFBQTtBQUFBLEtDZ0ZTLHFCQUFtQixnQ0FBQUMsT0FBeUM7QUFBQSxTQUFBQSxPQUMxRDtBQUFBO0FBQUEsSUFFRjtBQUFBO0FBQUEsY0FDRSxtREFBdUM7QUFBQTtBQUFBLFlBQUFBLEtBQUFGLE1BR3BCO0FBQUEsWUFBQUcsR0FBQUgsTUFHQTtBQUFBLE9BQUFJLGtCRDFGOUI7QUFBQSxZQUFBQyxPQUFBQztBQUFBQSxRQUFBLElDd0dJO0FBQUEsY0FDRTtBQUFBLElBQ0Ysa0NBQVE7QUFBQTtBQUFBLFlBQUFDLE9BQUFaLEdBRUssd0JBQWdDO0FBQUEsWUFBQWEsd0JBQUFDLEdBQUFDLEdBQUFDO0FBQUFBLFFBQUEsSUFHN0Msb0JBQXNCLG1CQUF0QjtBQUFBLGVBQ0UsNkJBQWU7QUFBQTtBQUFBLFlBQUFDLFFBQUFILEdBQUFDO0FBQUFBLElBSWpCO0FBQUEsSUFDQSxzQ0FBVztBQUFBO0FBQUEsWUFBQUcsYUFBQUosR0FBQUM7QUFBQUEsSUFJWDtBQUFBLElBQ0EsMkNBQWdCO0FBQUE7QUFBQSxZQUFBSSxRQUFBTCxHQUFBQyxHQUFBZjtBQUFBQSxJQUloQjtBQUFBLElBQ0EseUNBQWE7QUFBQTtBQUFBLFlBQUFvQixVQUFBTixHQUFBQztBQUFBQSxJQUliO0FBQUEsSUFDQSx3Q0FBYTtBQUFBO0FBQUEsWUFBQU0sVUFBQVAsR0FBQUM7QUFBQUEsSUFJYjtBQUFBLElBQ0Esd0NBQWE7QUFBQTtBQUFBLFlBQUFPLFNBQUFDLElBQUFDLElBQUFDLElBQUFDLElBQUFmO0FBQUFBLElBTWI7QUFBQTtBQUFBO0FBQUE7QUFBQSxXQUEyQix5Q0FDTjtBQUFBO0FBQUEsVUFFaEI7QUFBQSxjQUFlO0FBQUEsS0FBZjtBQUFBO0FBQUEsSUFEQSxxREFDcUM7QUFBQTtBQUFBO0FBQUEsSUFBQWdCO0FBQUFBLE1EbEo5QyIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjEwMTcyLCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2F0b21pYy5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICBTdGVwaGVuIERvbGFuLCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTctMjAxOCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZS4gICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSAhJ2EgdFxuXG5leHRlcm5hbCBtYWtlIDogJ2EgLT4gJ2EgdCA9IFwiJW1ha2VtdXRhYmxlXCJcbmV4dGVybmFsIG1ha2VfY29udGVuZGVkIDogJ2EgLT4gJ2EgdCA9IFwiY2FtbF9hdG9taWNfbWFrZV9jb250ZW5kZWRcIlxuZXh0ZXJuYWwgZ2V0IDogJ2EgdCAtPiAnYSA9IFwiJWF0b21pY19sb2FkXCJcbmV4dGVybmFsIGV4Y2hhbmdlIDogJ2EgdCAtPiAnYSAtPiAnYSA9IFwiJWF0b21pY19leGNoYW5nZVwiXG5leHRlcm5hbCBjb21wYXJlX2FuZF9zZXQgOiAnYSB0IC0+ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVhdG9taWNfY2FzXCJcbmV4dGVybmFsIGZldGNoX2FuZF9hZGQgOiBpbnQgdCAtPiBpbnQgLT4gaW50ID0gXCIlYXRvbWljX2ZldGNoX2FkZFwiXG5leHRlcm5hbCBpZ25vcmUgOiAnYSAtPiB1bml0ID0gXCIlaWdub3JlXCJcblxubGV0IHNldCByIHggPSBpZ25vcmUgKGV4Y2hhbmdlIHIgeClcbmxldCBpbmNyIHIgPSBpZ25vcmUgKGZldGNoX2FuZF9hZGQgciAxKVxubGV0IGRlY3IgciA9IGlnbm9yZSAoZmV0Y2hfYW5kX2FkZCByICgtMSkpXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfYXRvbWljX2V4Y2hhbmdlIiwiY2FtbF9hdG9taWNfZmV0Y2hfYWRkIiwic2V0IiwiciIsIngiLCJpbmNyIiwiZGVjciIsIlN0ZGxpYl9BdG9taWMiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsdUJBQUE7QUFBQSxJQUFBQyx3QkFBQTtBQUFBLFlBQUFDLElBQUFDLEdBQUFDLEdDd0JjLHFDQUFxQjtBQUFBLFlBQUFDLEtBQUFGLEdBQ3RCLHNDQUEwQjtBQUFBLFlBQUFHLEtBQUFILEdBQzFCLHVDQUE2QjtBQUFBO0FBQUEsSUFBQUk7QUFBQUEsTUQxQjFDIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTAyMDEsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvY2FtbGludGVybmFsTGF6eS5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgUGFyYSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTcgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogSW50ZXJuYWxzIG9mIGZvcmNpbmcgbGF6eSB2YWx1ZXMuICopXG5cbnR5cGUgJ2EgdCA9ICdhIGxhenlfdFxuXG5leGNlcHRpb24gVW5kZWZpbmVkXG5cbigqIFt1cGRhdGVfdG9fZm9yY2luZyBibGtdIHRyaWVzIHRvIHVwZGF0ZSBhIFtibGtdIHdpdGggW2xhenlfdGFnXSB0b1xuICAgW2ZvcmNpbmdfdGFnXSB1c2luZyBjb21wYXJlLWFuZC1zd2FwIChDQVMpLCB0YWtpbmcgY2FyZSB0byBoYW5kbGUgY29uY3VycmVudFxuICAgbWFya2luZyBvZiB0aGUgaGVhZGVyIHdvcmQgYnkgYSBjb25jdXJyZW50IEdDIHRocmVhZC4gUmV0dXJucyBbMF0gaWYgdGhlXG4gICBDQVMgaXMgc3VjY2Vzc2Z1bC4gSWYgdGhlIENBUyBmYWlscywgdGhlbiB0aGUgdGFnIHdhcyBvYnNlcnZlZCB0byBiZVxuICAgc29tZXRoaW5nIG90aGVyIHRoYW4gW2xhenlfdGFnXSBkdWUgdG8gYSBjb25jdXJyZW50IG11dGF0b3IuIEluIHRoaXMgY2FzZSxcbiAgIHRoZSBmdW5jdGlvbiByZXR1cm5zIFsxXS4gKilcbmV4dGVybmFsIHVwZGF0ZV90b19mb3JjaW5nIDogT2JqLnQgLT4gaW50ID1cbiAgXCJjYW1sX2xhenlfdXBkYXRlX3RvX2ZvcmNpbmdcIiBbQEBub2FsbG9jXVxuXG4oKiBbcmVzZXRfdG9fbGF6eSBibGtdIGV4cGVjdHMgW2Jsa10gdG8gYmUgYSBsYXp5IG9iamVjdCB3aXRoIFtPYmouZm9yY2luZ190YWddXG4gICBhbmQgdXBkYXRlcyB0aGUgdGFnIHRvIFtPYmoubGF6eV90YWddLCB0YWtpbmcgY2FyZSB0byBoYW5kbGUgY29uY3VycmVudFxuICAgbWFya2luZyBvZiB0aGlzIG9iamVjdCdzIGhlYWRlciBieSBhIGNvbmN1cnJlbnQgR0MgdGhyZWFkLiAqKVxuZXh0ZXJuYWwgcmVzZXRfdG9fbGF6eSA6IE9iai50IC0+IHVuaXQgPSBcImNhbWxfbGF6eV9yZXNldF90b19sYXp5XCIgW0BAbm9hbGxvY11cblxuKCogW3VwZGF0ZV90b19mb3J3YXJkIGJsa10gZXhwZWN0cyBbYmxrXSB0byBiZSBhIGxhenkgb2JqZWN0IHdpdGhcbiAgIFtPYmouZm9yY2luZ190YWddIGFuZCB1cGRhdGVzIHRoZSB0YWcgdG8gW09iai5mb3J3YXJkX3RhZ10sIHRha2luZyBjYXJlIHRvXG4gICBoYW5kbGUgY29uY3VycmVudCBtYXJraW5nIG9mIHRoaXMgb2JqZWN0J3MgaGVhZGVyIGJ5IGEgY29uY3VycmVudCBHQyB0aHJlYWQuXG4gKilcbmV4dGVybmFsIHVwZGF0ZV90b19mb3J3YXJkIDogT2JqLnQgLT4gdW5pdCA9XG4gIFwiY2FtbF9sYXp5X3VwZGF0ZV90b19mb3J3YXJkXCIgW0BAbm9hbGxvY11cblxuKCogQXNzdW1lcyBbYmxrXSBpcyBhIGJsb2NrIHdpdGggdGFnIGZvcmNpbmcgKilcbmxldCBkb19mb3JjZV9ibG9jayBibGsgPVxuICBsZXQgYiA9IE9iai5yZXByIGJsayBpblxuICBsZXQgY2xvc3VyZSA9IChPYmoub2JqIChPYmouZmllbGQgYiAwKSA6IHVuaXQgLT4gJ2FyZykgaW5cbiAgT2JqLnNldF9maWVsZCBiIDAgKE9iai5yZXByICgpKTsgKCogUmVsZWFzZSB0aGUgY2xvc3VyZSAqKVxuICB0cnlcbiAgICBsZXQgcmVzdWx0ID0gY2xvc3VyZSAoKSBpblxuICAgIE9iai5zZXRfZmllbGQgYiAwIChPYmoucmVwciByZXN1bHQpO1xuICAgIHVwZGF0ZV90b19mb3J3YXJkIGI7XG4gICAgcmVzdWx0XG4gIHdpdGggZSAtPlxuICAgIE9iai5zZXRfZmllbGQgYiAwIChPYmoucmVwciAoZnVuICgpIC0+IHJhaXNlIGUpKTtcbiAgICByZXNldF90b19sYXp5IGI7XG4gICAgcmFpc2UgZVxuXG4oKiBBc3N1bWVzIFtibGtdIGlzIGEgYmxvY2sgd2l0aCB0YWcgZm9yY2luZyAqKVxubGV0IGRvX2ZvcmNlX3ZhbF9ibG9jayBibGsgPVxuICBsZXQgYiA9IE9iai5yZXByIGJsayBpblxuICBsZXQgY2xvc3VyZSA9IChPYmoub2JqIChPYmouZmllbGQgYiAwKSA6IHVuaXQgLT4gJ2FyZykgaW5cbiAgT2JqLnNldF9maWVsZCBiIDAgKE9iai5yZXByICgpKTsgKCogUmVsZWFzZSB0aGUgY2xvc3VyZSAqKVxuICBsZXQgcmVzdWx0ID0gY2xvc3VyZSAoKSBpblxuICBPYmouc2V0X2ZpZWxkIGIgMCAoT2JqLnJlcHIgcmVzdWx0KTtcbiAgdXBkYXRlX3RvX2ZvcndhcmQgYjtcbiAgcmVzdWx0XG5cbigqIENhbGxlZCBieSBbZm9yY2VfZ2VuXSAqKVxubGV0IGZvcmNlX2dlbl9sYXp5X2Jsb2NrIH5vbmx5X3ZhbCAoYmxrIDogJ2FyZyBsYXp5X3QpID1cbiAgKCogV2UgZXhwZWN0IHRoZSB0YWcgdG8gYmUgW2xhenlfdGFnXSwgYnV0IG1heSBiZSBvdGhlciB0YWdzIGR1ZSB0b1xuICAgICBjb25jdXJyZW50IGZvcmNpbmcgb2YgbGF6eSB2YWx1ZXMuICopXG4gIG1hdGNoIHVwZGF0ZV90b19mb3JjaW5nIChPYmoucmVwciBibGspIHdpdGhcbiAgfCAwIHdoZW4gb25seV92YWwgLT4gZG9fZm9yY2VfdmFsX2Jsb2NrIGJsa1xuICB8IDAgLT4gZG9fZm9yY2VfYmxvY2sgYmxrXG4gIHwgXyAtPiByYWlzZSBVbmRlZmluZWRcblxuKCogdXNlZCBpbiB0aGUgJWxhenlfZm9yY2UgcHJpbWl0aXZlICopXG5sZXQgZm9yY2VfbGF6eV9ibG9jayBibGsgPSBmb3JjZV9nZW5fbGF6eV9ibG9jayB+b25seV92YWw6ZmFsc2UgYmxrXG5cbigqIFtmb3JjZV9nZW4gfm9ubHlfdmFsOmZhbHNlXSBpcyBub3QgdXNlZCwgc2luY2UgW0xhenkuZm9yY2VdIGlzXG4gICBkZWNsYXJlZCBhcyBhIHByaW1pdGl2ZSB3aG9zZSBjb2RlIGlubGluZXMgdGhlIHRhZyB0ZXN0cyBvZiBpdHNcbiAgIGFyZ3VtZW50LCBleGNlcHQgd2hlbiBhZmwgaW5zdHJ1bWVudGF0aW9uIGlzIHR1cm5lZCBvbi4gKilcbmxldCBmb3JjZV9nZW4gfm9ubHlfdmFsIChsenYgOiAnYXJnIGxhenlfdCkgPVxuICAoKiBVc2luZyBbU3lzLm9wYXF1ZV9pZGVudGl0eV0gcHJldmVudHMgdHdvIHBvdGVudGlhbCBwcm9ibGVtczpcbiAgICAgLSBJZiB0aGUgdmFsdWUgaXMga25vd24gdG8gaGF2ZSBGb3J3YXJkX3RhZywgdGhlbiBpdCBjb3VsZCBoYXZlIGJlZW5cbiAgICAgICBzaG9ydGN1dCBkdXJpbmcgR0MsIHNvIHRoYXQgaW5mb3JtYXRpb24gbXVzdCBiZSBmb3Jnb3R0ZW4gKHNlZSBHUFIjNzEzXG4gICAgICAgYW5kIGlzc3VlICM3MzAxKS4gVGhpcyBpcyBub3QgYW4gaXNzdWUgaGVyZSBhdCB0aGUgbW9tZW50IHNpbmNlXG4gICAgICAgW09iai50YWddIGlzIG5vdCBzaW1wbGlmaWVkIGJ5IHRoZSBjb21waWxlciwgYW5kIEdQUiM3MTMgYWxzb1xuICAgICAgIGVuc3VyZXMgdGhhdCBubyB2YWx1ZSB3aWxsIGJlIGtub3duIHRvIGhhdmUgRm9yd2FyZF90YWcuXG4gICAgIC0gSWYgdGhlIHZhbHVlIGlzIGtub3duIHRvIGJlIGltbXV0YWJsZSwgdGhlbiBpZiB0aGUgY29tcGlsZXJcbiAgICAgICBjYW5ub3QgcHJvdmUgdGhhdCB0aGUgbGFzdCBicmFuY2ggaXMgbm90IHRha2VuIGl0IHdpbGwgaXNzdWUgYVxuICAgICAgIHdhcm5pbmcgNTkgKG1vZGlmaWNhdGlvbiBvZiBhbiBpbW11dGFibGUgdmFsdWUpICopXG4gIGxldCBsenYgPSBTeXMub3BhcXVlX2lkZW50aXR5IGx6diBpblxuICBsZXQgeCA9IE9iai5yZXByIGx6diBpblxuICAoKiBTVEFSVCBubyBzYWZlIHBvaW50cy4gSWYgYSBHQyBvY2N1cnMgaGVyZSwgdGhlbiB0aGUgb2JqZWN0IFt4XSBtYXkgYmVcbiAgICAgc2hvcnQtY2lyY3VpdGVkLCBhbmQgZ2V0dGluZyB0aGUgZmlyc3QgZmllbGQgb2YgW3hdIHdvdWxkIGdldCB1cyB0aGUgd3JvbmdcbiAgICAgdmFsdWUuIEx1Y2tpbHksIHRoZSBjb21waWxlciBkb2VzIG5vdCBpbnNlcnQgR0Mgc2FmZSBwb2ludHMgYXQgdGhpcyBwbGFjZSxcbiAgICAgc28gaXQgaXMgb2suICopXG4gIGxldCB0ID0gT2JqLnRhZyB4IGluXG4gIGlmIHQgPSBPYmouZm9yd2FyZF90YWcgdGhlblxuICAgIChPYmoub2JqIChPYmouZmllbGQgeCAwKSA6ICdhcmcpXG4gICgqIEVORCBubyBzYWZlIHBvaW50cyAqKVxuICBlbHNlIGlmIHQgPSBPYmouZm9yY2luZ190YWcgdGhlbiByYWlzZSBVbmRlZmluZWRcbiAgZWxzZSBpZiB0IDw+IE9iai5sYXp5X3RhZyB0aGVuIChPYmoub2JqIHggOiAnYXJnKVxuICBlbHNlIGZvcmNlX2dlbl9sYXp5X2Jsb2NrIH5vbmx5X3ZhbCBsenZcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9sYXp5X3VwZGF0ZV90b19mb3J3YXJkIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJTdGRsaWJfT2JqIiwiVW5kZWZpbmVkIiwiZm9yY2VfZ2VuX2xhenlfYmxvY2siLCJvbmx5X3ZhbCIsImJsayIsImNsb3N1cmUiLCJyZXN1bHQiLCJlIiwicGFyYW0iLCJmb3JjZV9sYXp5X2Jsb2NrIiwiZm9yY2VfZ2VuIiwibHp2IiwidCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxhQUFBO0FBQUEsSUFBQUM7QUFBQUEsTUFBQTtBQUFBLFlBQUFDLHFCQUFBQyxVQUFBQztBQUFBQSxJQ3VFUTtBQUFBLEtBR0M7QUFBQSxJQUZFO0FBQUEsU0FBQUMsWUFaYztBQUFBLEtBQ3ZCO0FBQUEsU0FBQUMsV0FDYTtBQUFBLEtBQ2I7QUFBQSxLQUNBO0FBQUEsS0FBbUI7QUFBQTtBQUFBLFFBQUFELFVBbkJJO0FBQUEsSUFDdkI7QUFBQSxJQUErQjtBQUFBLFNBQUFDLFNBRWhCO0FBQUEsS0FDYjtBQUFBLEtBQ0E7QUFBQTtBQUFBO0FBQUEsVUFBQUM7QUFBQUEsU0FBQUEsSURsREo7QUFBQSxLQ3FESSxrQkFBQUMsT0FBdUMsd0NBQU87QUFBQSxLQUM5QztBQUFBLEtBQWU7QUFBQTtBQUFBLEdBb0JLO0FBQUEsWUFBQUMsaUJBQUFMLEtBR0csbUNBQXdDO0FBQUEsWUFBQU0sVUFBQVAsVUFBQVE7QUFBQUEsUUFBQUMsSUFxQnpEO0FBQUEsSUFDUix5QkFDMEI7QUFBQSxJQUVyQix3QkFBNEI7QUFBQSxJQUM1QixtQ0FDQSxtQ0FBa0M7QUFBQTtBQUFBLEdEeEd6QyIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjEwMjU4LCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2xhenkubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBEYW1pZW4gRG9saWdleiwgcHJvamV0IFBhcmEsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk3IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIE1vZHVsZSBbTGF6eV06IGRlZmVycmVkIGNvbXB1dGF0aW9ucyAqKVxuXG5cbigqXG4gICBXQVJOSU5HOiBzb21lIHB1cnBsZSBtYWdpYyBpcyBnb2luZyBvbiBoZXJlLiAgRG8gbm90IHRha2UgdGhpcyBmaWxlXG4gICBhcyBhbiBleGFtcGxlIG9mIGhvdyB0byBwcm9ncmFtIGluIE9DYW1sLlxuKilcblxuXG4oKiBXZSBtYWtlIHVzZSBvZiB0d28gc3BlY2lhbCB0YWdzIHByb3ZpZGVkIGJ5IHRoZSBydW50aW1lOlxuICAgW2xhenlfdGFnXSBhbmQgW2ZvcndhcmRfdGFnXS5cblxuICAgQSB2YWx1ZSBvZiB0eXBlIFsnYSBMYXp5LnRdIGNhbiBiZSBvbmUgb2YgdGhyZWUgdGhpbmdzOlxuICAgMS4gQSBibG9jayBvZiBzaXplIDEgd2l0aCB0YWcgW2xhenlfdGFnXS4gIEl0cyBmaWVsZCBpcyBhIGNsb3N1cmUgb2ZcbiAgICAgIHR5cGUgW3VuaXQgLT4gJ2FdIHRoYXQgY29tcHV0ZXMgdGhlIHZhbHVlLlxuICAgMi4gQSBibG9jayBvZiBzaXplIDEgd2l0aCB0YWcgW2ZvcndhcmRfdGFnXS4gIEl0cyBmaWVsZCBpcyB0aGUgdmFsdWVcbiAgICAgIG9mIHR5cGUgWydhXSB0aGF0IHdhcyBjb21wdXRlZC5cbiAgIDMuIEFueXRoaW5nIGVsc2UgZXhjZXB0IGEgZmxvYXQuICBUaGlzIGhhcyB0eXBlIFsnYV0gYW5kIGlzIHRoZSB2YWx1ZVxuICAgICAgdGhhdCB3YXMgY29tcHV0ZWQuXG4gICBFeGNlcHRpb25zIGFyZSBzdG9yZWQgaW4gZm9ybWF0ICgxKS5cbiAgIFRoZSBHQyB3aWxsIG1hZ2ljYWxseSBjaGFuZ2UgdGhpbmdzIGZyb20gKDIpIHRvICgzKSBhY2NvcmRpbmcgdG8gaXRzXG4gICBmYW5jeS5cblxuICAgSWYgT0NhbWwgd2FzIGNvbmZpZ3VyZWQgd2l0aCB0aGUgLWZsYXQtZmxvYXQtYXJyYXkgb3B0aW9uICh3aGljaCBpc1xuICAgY3VycmVudGx5IHRoZSBkZWZhdWx0KSwgdGhlIGZvbGxvd2luZyBpcyBhbHNvIHRydWU6XG4gICBXZSBjYW5ub3QgdXNlIHJlcHJlc2VudGF0aW9uICgzKSBmb3IgYSBbZmxvYXQgTGF6eS50XSBiZWNhdXNlXG4gICBbY2FtbF9tYWtlX2FycmF5XSBhc3N1bWVzIHRoYXQgb25seSBhIFtmbG9hdF0gdmFsdWUgY2FuIGhhdmUgdGFnXG4gICBbRG91YmxlX3RhZ10uXG5cbiAgIFdlIGhhdmUgdG8gdXNlIHRoZSBidWlsdC1pbiB0eXBlIGNvbnN0cnVjdG9yIFtsYXp5X3RdIHRvXG4gICBsZXQgdGhlIGNvbXBpbGVyIGltcGxlbWVudCB0aGUgc3BlY2lhbCB0eXBpbmcgYW5kIGNvbXBpbGF0aW9uXG4gICBydWxlcyBmb3IgdGhlIFtsYXp5XSBrZXl3b3JkLlxuKilcblxudHlwZSAnYSB0ID0gJ2EgQ2FtbGludGVybmFsTGF6eS50XG5cbmV4Y2VwdGlvbiBVbmRlZmluZWQgPSBDYW1saW50ZXJuYWxMYXp5LlVuZGVmaW5lZFxuZXh0ZXJuYWwgbWFrZV9mb3J3YXJkIDogJ2EgLT4gJ2EgbGF6eV90ID0gXCJjYW1sX2xhenlfbWFrZV9mb3J3YXJkXCJcbmV4dGVybmFsIGZvcmNlIDogJ2EgdCAtPiAnYSA9IFwiJWxhenlfZm9yY2VcIlxuXG5sZXQgZm9yY2VfdmFsIGwgPSBDYW1saW50ZXJuYWxMYXp5LmZvcmNlX2dlbiB+b25seV92YWw6dHJ1ZSBsXG5cbmxldCBmcm9tX2Z1biAoZiA6IHVuaXQgLT4gJ2FyZykgPVxuICBsZXQgeCA9IE9iai5uZXdfYmxvY2sgT2JqLmxhenlfdGFnIDEgaW5cbiAgT2JqLnNldF9maWVsZCB4IDAgKE9iai5yZXByIGYpO1xuICAoT2JqLm9iaiB4IDogJ2FyZyB0KVxuXG5sZXQgZnJvbV92YWwgKHYgOiAnYXJnKSA9XG4gIGxldCB0ID0gT2JqLnRhZyAoT2JqLnJlcHIgdikgaW5cbiAgaWYgdCA9IE9iai5mb3J3YXJkX3RhZyB8fCB0ID0gT2JqLmxhenlfdGFnIHx8XG4gICAgIHQgPSBPYmouZm9yY2luZ190YWcgfHwgdCA9IE9iai5kb3VibGVfdGFnIHRoZW4gYmVnaW5cbiAgICBtYWtlX2ZvcndhcmQgdlxuICBlbmQgZWxzZSBiZWdpblxuICAgIChPYmoubWFnaWMgdiA6ICdhcmcgdClcbiAgZW5kXG5cbmxldCBpc192YWwgKGwgOiAnYXJnIHQpID0gT2JqLnRhZyAoT2JqLnJlcHIgbCkgPD4gT2JqLmxhenlfdGFnXG5cbmxldCBtYXAgZiB4ID1cbiAgbGF6eSAoZiAoZm9yY2UgeCkpXG5cbmxldCBtYXBfdmFsIGYgeCA9XG4gIGlmIGlzX3ZhbCB4XG4gIHRoZW4gZnJvbV92YWwgKGYgKGZvcmNlIHgpKVxuICBlbHNlIGxhenkgKGYgKGZvcmNlIHgpKVxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX29ial90YWciLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiZ2xvYmFsX2RhdGEiLCJDYW1saW50ZXJuYWxMYXp5IiwiU3RkbGliX09iaiIsIlVuZGVmaW5lZCIsImZvcmNlX3ZhbCIsImwiLCJmcm9tX2Z1biIsIngiLCJmcm9tX3ZhbCIsInYiLCJ0IiwiaXNfdmFsIiwibWFwIiwicGFyYW0iLCJtYXBfdmFsIl0sIm1hcHBpbmdzIjoiT0FBQUEsVUFBQSx5QkFBQUMsZUFBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsWUFBQUMsVUFBQUMsR0N1RGtCLDJDQUEyQztBQUFBLFlBQUFDLFNBQUFSO0FBQUFBLFFBQUFTLElBR25EO0FBQUEsSUFDUjtBQUFBLElBQThCO0FBQUEsR0FDVjtBQUFBLFlBQUFDLFNBQUFDO0FBQUFBLFFBQUFDLElBR1o7QUFBQSxJQUNSO0FBQUE7QUFBQTtBQUFBLEtBSUc7QUFBQSxJQUgrQyx3Q0FJL0M7QUFBQTtBQUFBLFlBQUFDLE9BQUFOO0FBQUFBLFFBQUEsSUFFcUI7QUFBQSx3Q0FBb0I7QUFBQSxHQUFnQjtBQUFBLFlBQUFPLElBQUFkLEdBQUFTO0FBQUFBLElBRzVEO0FBQUEscUJBQUFNO0FBQUFBLGlCQUFBLElEMUVGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGNDMEVFO0FBQUEsR0FBa0I7QUFBQSxZQUFBQyxRQUFBaEIsR0FBQVM7QUFBQUEsSUFHZjtBQUFBLEtBRUU7QUFBQSxzQkFBQU07QUFBQUEsa0JBQUEsSUQvRVA7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUMrRU87QUFBQSxZQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFTLE9BQWEsU0FBYixpQkFDUztBQUFBO0FBQUEsR0QvRXpCIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTAzMzksImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvc2VxLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgIFNpbW9uIENydWFuZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNyBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBNb2R1bGUgW1NlcV06IGZ1bmN0aW9uYWwgaXRlcmF0b3JzICopXG5cbnR5cGUgKydhIG5vZGUgPVxuICB8IE5pbFxuICB8IENvbnMgb2YgJ2EgKiAnYSB0XG5cbmFuZCAnYSB0ID0gdW5pdCAtPiAnYSBub2RlXG5cbmxldCBlbXB0eSAoKSA9IE5pbFxuXG5sZXQgcmV0dXJuIHggKCkgPSBDb25zICh4LCBlbXB0eSlcblxubGV0IGNvbnMgeCBuZXh0ICgpID0gQ29ucyAoeCwgbmV4dClcblxubGV0IHJlYyBhcHBlbmQgc2VxMSBzZXEyICgpID1cbiAgbWF0Y2ggc2VxMSgpIHdpdGhcbiAgfCBOaWwgLT4gc2VxMigpXG4gIHwgQ29ucyAoeCwgbmV4dCkgLT4gQ29ucyAoeCwgYXBwZW5kIG5leHQgc2VxMilcblxubGV0IHJlYyBtYXAgZiBzZXEgKCkgPSBtYXRjaCBzZXEoKSB3aXRoXG4gIHwgTmlsIC0+IE5pbFxuICB8IENvbnMgKHgsIG5leHQpIC0+IENvbnMgKGYgeCwgbWFwIGYgbmV4dClcblxubGV0IHJlYyBmaWx0ZXJfbWFwIGYgc2VxICgpID0gbWF0Y2ggc2VxKCkgd2l0aFxuICB8IE5pbCAtPiBOaWxcbiAgfCBDb25zICh4LCBuZXh0KSAtPlxuICAgICAgbWF0Y2ggZiB4IHdpdGhcbiAgICAgICAgfCBOb25lIC0+IGZpbHRlcl9tYXAgZiBuZXh0ICgpXG4gICAgICAgIHwgU29tZSB5IC0+IENvbnMgKHksIGZpbHRlcl9tYXAgZiBuZXh0KVxuXG5sZXQgcmVjIGZpbHRlciBmIHNlcSAoKSA9IG1hdGNoIHNlcSgpIHdpdGhcbiAgfCBOaWwgLT4gTmlsXG4gIHwgQ29ucyAoeCwgbmV4dCkgLT5cbiAgICAgIGlmIGYgeFxuICAgICAgdGhlbiBDb25zICh4LCBmaWx0ZXIgZiBuZXh0KVxuICAgICAgZWxzZSBmaWx0ZXIgZiBuZXh0ICgpXG5cbmxldCByZWMgY29uY2F0IHNlcSAoKSA9IG1hdGNoIHNlcSAoKSB3aXRoXG4gIHwgTmlsIC0+IE5pbFxuICB8IENvbnMgKHgsIG5leHQpIC0+XG4gICAgIGFwcGVuZCB4IChjb25jYXQgbmV4dCkgKClcblxubGV0IHJlYyBmbGF0X21hcCBmIHNlcSAoKSA9IG1hdGNoIHNlcSAoKSB3aXRoXG4gIHwgTmlsIC0+IE5pbFxuICB8IENvbnMgKHgsIG5leHQpIC0+XG4gICAgYXBwZW5kIChmIHgpIChmbGF0X21hcCBmIG5leHQpICgpXG5cbmxldCBjb25jYXRfbWFwID0gZmxhdF9tYXBcblxubGV0IHJlYyBmb2xkX2xlZnQgZiBhY2Mgc2VxID1cbiAgbWF0Y2ggc2VxICgpIHdpdGhcbiAgICB8IE5pbCAtPiBhY2NcbiAgICB8IENvbnMgKHgsIG5leHQpIC0+XG4gICAgICAgIGxldCBhY2MgPSBmIGFjYyB4IGluXG4gICAgICAgIGZvbGRfbGVmdCBmIGFjYyBuZXh0XG5cbmxldCByZWMgaXRlciBmIHNlcSA9XG4gIG1hdGNoIHNlcSAoKSB3aXRoXG4gICAgfCBOaWwgLT4gKClcbiAgICB8IENvbnMgKHgsIG5leHQpIC0+XG4gICAgICAgIGYgeDtcbiAgICAgICAgaXRlciBmIG5leHRcblxubGV0IHJlYyB1bmZvbGQgZiB1ICgpID1cbiAgbWF0Y2ggZiB1IHdpdGhcbiAgfCBOb25lIC0+IE5pbFxuICB8IFNvbWUgKHgsIHUnKSAtPiBDb25zICh4LCB1bmZvbGQgZiB1JylcblxubGV0IGlzX2VtcHR5IHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICB0cnVlXG4gIHwgQ29ucyAoXywgXykgLT5cbiAgICAgIGZhbHNlXG5cbmxldCB1bmNvbnMgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIFNvbWUgKHgsIHhzKVxuICB8IE5pbCAtPlxuICAgICAgTm9uZVxuXG5cblxubGV0IHJlYyBsZW5ndGhfYXV4IGFjY3UgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIGFjY3VcbiAgfCBDb25zIChfLCB4cykgLT5cbiAgICAgIGxlbmd0aF9hdXggKGFjY3UgKyAxKSB4c1xuXG5sZXRbQGlubGluZV0gbGVuZ3RoIHhzID1cbiAgbGVuZ3RoX2F1eCAwIHhzXG5cbmxldCByZWMgaXRlcmlfYXV4IGYgaSB4cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgKClcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIGYgaSB4O1xuICAgICAgaXRlcmlfYXV4IGYgKGkrMSkgeHNcblxubGV0W0BpbmxpbmVdIGl0ZXJpIGYgeHMgPVxuICBpdGVyaV9hdXggZiAwIHhzXG5cbmxldCByZWMgZm9sZF9sZWZ0aV9hdXggZiBhY2N1IGkgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIGFjY3VcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIGxldCBhY2N1ID0gZiBhY2N1IGkgeCBpblxuICAgICAgZm9sZF9sZWZ0aV9hdXggZiBhY2N1IChpKzEpIHhzXG5cbmxldFtAaW5saW5lXSBmb2xkX2xlZnRpIGYgYWNjdSB4cyA9XG4gIGZvbGRfbGVmdGlfYXV4IGYgYWNjdSAwIHhzXG5cbmxldCByZWMgZm9yX2FsbCBwIHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICB0cnVlXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBwIHggJiYgZm9yX2FsbCBwIHhzXG5cbmxldCByZWMgZXhpc3RzIHAgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIGZhbHNlXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBwIHggfHwgZXhpc3RzIHAgeHNcblxubGV0IHJlYyBmaW5kIHAgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5vbmVcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIGlmIHAgeCB0aGVuIFNvbWUgeCBlbHNlIGZpbmQgcCB4c1xuXG5sZXQgZmluZF9pbmRleCBwIHhzID1cbiAgbGV0IHJlYyBhdXggaSB4cyA9IG1hdGNoIHhzKCkgd2l0aFxuICAgIHwgTmlsIC0+XG4gICAgICAgIE5vbmVcbiAgICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgICBpZiBwIHggdGhlbiBTb21lIGkgZWxzZSBhdXggKGkrMSkgeHMgaW5cbiAgYXV4IDAgeHNcblxubGV0IHJlYyBmaW5kX21hcCBmIHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOb25lXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCBmIHggd2l0aFxuICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgZmluZF9tYXAgZiB4c1xuICAgICAgfCBTb21lIF8gYXMgcmVzdWx0IC0+XG4gICAgICAgICAgcmVzdWx0XG5cbmxldCBmaW5kX21hcGkgZiB4cyA9XG4gIGxldCByZWMgYXV4IGkgeHMgPSBtYXRjaCB4cygpIHdpdGhcbiAgICB8IE5pbCAtPlxuICAgICAgICBOb25lXG4gICAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgICAgbWF0Y2ggZiBpIHggd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIGF1eCAoaSsxKSB4c1xuICAgICAgICB8IFNvbWUgXyBhcyByZXN1bHQgLT5cbiAgICAgICAgICAgIHJlc3VsdCBpblxuICBhdXggMCB4c1xuXG4oKiBbaXRlcjJdLCBbZm9sZF9sZWZ0Ml0sIFtmb3JfYWxsMl0sIFtleGlzdHMyXSwgW21hcDJdLCBbemlwXSB3b3JrIGFsc28gaW5cbiAgIHRoZSBjYXNlIHdoZXJlIHRoZSB0d28gc2VxdWVuY2VzIGhhdmUgZGlmZmVyZW50IGxlbmd0aHMuIFRoZXkgc3RvcCBhcyBzb29uXG4gICBhcyBvbmUgc2VxdWVuY2UgaXMgZXhoYXVzdGVkLiBUaGVpciBiZWhhdmlvciBpcyBzbGlnaHRseSBhc3ltbWV0cmljOiB3aGVuXG4gICBbeHNdIGlzIGVtcHR5LCB0aGV5IGRvIG5vdCBmb3JjZSBbeXNdOyBob3dldmVyLCB3aGVuIFt5c10gaXMgZW1wdHksIFt4c10gaXNcbiAgIGZvcmNlZCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gYXBwbGljYXRpb24gW3hzKCldIHR1cm5zIG91dFxuICAgdG8gYmUgdXNlbGVzcy4gKilcblxubGV0IHJlYyBpdGVyMiBmIHhzIHlzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICAoKVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggeXMoKSB3aXRoXG4gICAgICB8IE5pbCAtPlxuICAgICAgICAgICgpXG4gICAgICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgICAgIGYgeCB5O1xuICAgICAgICAgIGl0ZXIyIGYgeHMgeXNcblxubGV0IHJlYyBmb2xkX2xlZnQyIGYgYWNjdSB4cyB5cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgYWNjdVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggeXMoKSB3aXRoXG4gICAgICB8IE5pbCAtPlxuICAgICAgICAgIGFjY3VcbiAgICAgIHwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICAgICAgbGV0IGFjY3UgPSBmIGFjY3UgeCB5IGluXG4gICAgICAgICAgZm9sZF9sZWZ0MiBmIGFjY3UgeHMgeXNcblxubGV0IHJlYyBmb3JfYWxsMiBmIHhzIHlzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICB0cnVlXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCB5cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgdHJ1ZVxuICAgICAgfCBDb25zICh5LCB5cykgLT5cbiAgICAgICAgICBmIHggeSAmJiBmb3JfYWxsMiBmIHhzIHlzXG5cbmxldCByZWMgZXhpc3RzMiBmIHhzIHlzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBmYWxzZVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggeXMoKSB3aXRoXG4gICAgICB8IE5pbCAtPlxuICAgICAgICAgIGZhbHNlXG4gICAgICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgICAgIGYgeCB5IHx8IGV4aXN0czIgZiB4cyB5c1xuXG5sZXQgcmVjIGVxdWFsIGVxIHhzIHlzID1cbiAgbWF0Y2ggeHMoKSwgeXMoKSB3aXRoXG4gIHwgTmlsLCBOaWwgLT5cbiAgICAgIHRydWVcbiAgfCBDb25zICh4LCB4cyksIENvbnMgKHksIHlzKSAtPlxuICAgICAgZXEgeCB5ICYmIGVxdWFsIGVxIHhzIHlzXG4gIHwgTmlsLCBDb25zIChfLCBfKVxuICB8IENvbnMgKF8sIF8pLCBOaWwgLT5cbiAgICAgIGZhbHNlXG5cbmxldCByZWMgY29tcGFyZSBjbXAgeHMgeXMgPVxuICBtYXRjaCB4cygpLCB5cygpIHdpdGhcbiAgfCBOaWwsIE5pbCAtPlxuICAgICAgMFxuICB8IENvbnMgKHgsIHhzKSwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICBsZXQgYyA9IGNtcCB4IHkgaW5cbiAgICAgIGlmIGMgPD4gMCB0aGVuIGMgZWxzZSBjb21wYXJlIGNtcCB4cyB5c1xuICB8IE5pbCwgQ29ucyAoXywgXykgLT5cbiAgICAgIC0xXG4gIHwgQ29ucyAoXywgXyksIE5pbCAtPlxuICAgICAgKzFcblxuXG5cbigqIFtpbml0X2F1eCBmIGkgal0gaXMgdGhlIHNlcXVlbmNlIFtmIGksIC4uLiwgZiAoai0xKV0uICopXG5cbmxldCByZWMgaW5pdF9hdXggZiBpIGogKCkgPVxuICBpZiBpIDwgaiB0aGVuIGJlZ2luXG4gICAgQ29ucyAoZiBpLCBpbml0X2F1eCBmIChpICsgMSkgailcbiAgZW5kXG4gIGVsc2VcbiAgICBOaWxcblxubGV0IGluaXQgbiBmID1cbiAgaWYgbiA8IDAgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU2VxLmluaXRcIlxuICBlbHNlXG4gICAgaW5pdF9hdXggZiAwIG5cblxubGV0IHJlYyByZXBlYXQgeCAoKSA9XG4gIENvbnMgKHgsIHJlcGVhdCB4KVxuXG5sZXQgcmVjIGZvcmV2ZXIgZiAoKSA9XG4gIENvbnMgKGYoKSwgZm9yZXZlciBmKVxuXG4oKiBUaGlzIHByZWxpbWluYXJ5IGRlZmluaXRpb24gb2YgW2N5Y2xlXSByZXF1aXJlcyB0aGUgc2VxdWVuY2UgW3hzXVxuICAgdG8gYmUgbm9uZW1wdHkuIEFwcGx5aW5nIGl0IHRvIGFuIGVtcHR5IHNlcXVlbmNlIHdvdWxkIHByb2R1Y2UgYVxuICAgc2VxdWVuY2UgdGhhdCBkaXZlcmdlcyB3aGVuIGl0IGlzIGZvcmNlZC4gKilcblxubGV0IHJlYyBjeWNsZV9ub25lbXB0eSB4cyAoKSA9XG4gIGFwcGVuZCB4cyAoY3ljbGVfbm9uZW1wdHkgeHMpICgpXG5cbigqIFtjeWNsZSB4c10gY2hlY2tzIHdoZXRoZXIgW3hzXSBpcyBlbXB0eSBhbmQsIGlmIHNvLCByZXR1cm5zIGFuIGVtcHR5XG4gICBzZXF1ZW5jZS4gT3RoZXJ3aXNlLCBbY3ljbGUgeHNdIHByb2R1Y2VzIG9uZSBjb3B5IG9mIFt4c10gZm9sbG93ZWRcbiAgIHdpdGggdGhlIGluZmluaXRlIHNlcXVlbmNlIFtjeWNsZV9ub25lbXB0eSB4c10uIFRodXMsIHRoZSBub25lbXB0aW5lc3NcbiAgIGNoZWNrIGlzIHBlcmZvcm1lZCBqdXN0IG9uY2UuICopXG5cbmxldCBjeWNsZSB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMnKSAtPlxuICAgICAgQ29ucyAoeCwgYXBwZW5kIHhzJyAoY3ljbGVfbm9uZW1wdHkgeHMpKVxuXG4oKiBbaXRlcmF0ZTEgZiB4XSBpcyB0aGUgc2VxdWVuY2UgW2YgeCwgZiAoZiB4KSwgLi4uXS5cbiAgIEl0IGlzIGVxdWl2YWxlbnQgdG8gW3RhaWwgKGl0ZXJhdGUgZiB4KV0uXG4gICBbaXRlcmF0ZTFdIGlzIHVzZWQgYXMgYSBidWlsZGluZyBibG9jayBpbiB0aGUgZGVmaW5pdGlvbiBvZiBbaXRlcmF0ZV0uICopXG5cbmxldCByZWMgaXRlcmF0ZTEgZiB4ICgpID1cbiAgbGV0IHkgPSBmIHggaW5cbiAgQ29ucyAoeSwgaXRlcmF0ZTEgZiB5KVxuXG4oKiBbaXRlcmF0ZSBmIHhdIGlzIHRoZSBzZXF1ZW5jZSBbeCwgZiB4LCAuLi5dLiAqKVxuXG4oKiBUaGUgcmVhc29uIHdoeSB3ZSBnaXZlIHRoaXMgc2xpZ2h0bHkgaW5kaXJlY3QgZGVmaW5pdGlvbiBvZiBbaXRlcmF0ZV0sXG4gICBhcyBvcHBvc2VkIHRvIHRoZSBtb3JlIG5haXZlIGRlZmluaXRpb24gdGhhdCBtYXkgY29tZSB0byBtaW5kLCBpcyB0aGF0XG4gICB3ZSBhcmUgY2FyZWZ1bCB0byBhdm9pZCBldmFsdWF0aW5nIFtmIHhdIHVudGlsIHRoaXMgZnVuY3Rpb24gY2FsbCBpc1xuICAgYWN0dWFsbHkgbmVjZXNzYXJ5LiBUaGUgbmFpdmUgZGVmaW5pdGlvbiAobm90IHNob3duIGhlcmUpIGNvbXB1dGVzIHRoZVxuICAgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBzZXF1ZW5jZSwgW2YgeF0sIHdoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IGlzXG4gICByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuICopXG5cbmxldCBpdGVyYXRlIGYgeCA9XG4gIGNvbnMgeCAoaXRlcmF0ZTEgZiB4KVxuXG5cblxubGV0IHJlYyBtYXBpX2F1eCBmIGkgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgQ29ucyAoZiBpIHgsIG1hcGlfYXV4IGYgKGkrMSkgeHMpXG5cbmxldFtAaW5saW5lXSBtYXBpIGYgeHMgPVxuICBtYXBpX2F1eCBmIDAgeHNcblxuKCogW3RhaWxfc2NhbiBmIHMgeHNdIGlzIGVxdWl2YWxlbnQgdG8gW3RhaWwgKHNjYW4gZiBzIHhzKV0uXG4gICBbdGFpbF9zY2FuXSBpcyB1c2VkIGFzIGEgYnVpbGRpbmcgYmxvY2sgaW4gdGhlIGRlZmluaXRpb24gb2YgW3NjYW5dLiAqKVxuXG4oKiBUaGlzIHNsaWdodGx5IGluZGlyZWN0IGRlZmluaXRpb24gb2YgW3NjYW5dIGlzIG1lYW50IHRvIGF2b2lkIGNvbXB1dGluZ1xuICAgZWxlbWVudHMgdG9vIGVhcmx5OyBzZWUgdGhlIGFib3ZlIGNvbW1lbnQgYWJvdXQgW2l0ZXJhdGUxXSBhbmQgW2l0ZXJhdGVdLiAqKVxuXG5sZXQgcmVjIHRhaWxfc2NhbiBmIHMgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbGV0IHMgPSBmIHMgeCBpblxuICAgICAgQ29ucyAocywgdGFpbF9zY2FuIGYgcyB4cylcblxubGV0IHNjYW4gZiBzIHhzID1cbiAgY29ucyBzICh0YWlsX3NjYW4gZiBzIHhzKVxuXG4oKiBbdGFrZV0gaXMgZGVmaW5lZCBpbiBzdWNoIGEgd2F5IHRoYXQgW3Rha2UgMCB4c10gcmV0dXJucyBbZW1wdHldXG4gICBpbW1lZGlhdGVseSwgd2l0aG91dCBhbGxvY2F0aW5nIGFueSBtZW1vcnkuICopXG5cbmxldCByZWMgdGFrZV9hdXggbiB4cyA9XG4gIGlmIG4gPSAwIHRoZW5cbiAgICBlbXB0eVxuICBlbHNlXG4gICAgZnVuICgpIC0+XG4gICAgICBtYXRjaCB4cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgTmlsXG4gICAgICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgICAgIENvbnMgKHgsIHRha2VfYXV4IChuLTEpIHhzKVxuXG5sZXQgdGFrZSBuIHhzID1cbiAgaWYgbiA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIlNlcS50YWtlXCI7XG4gIHRha2VfYXV4IG4geHNcblxuKCogW2ZvcmNlX2Ryb3AgbiB4c10gaXMgZXF1aXZhbGVudCB0byBbZHJvcCBuIHhzICgpXS5cbiAgIFtmb3JjZV9kcm9wIG4geHNdIHJlcXVpcmVzIFtuID4gMF0uXG4gICBbZm9yY2VfZHJvcF0gaXMgdXNlZCBhcyBhIGJ1aWxkaW5nIGJsb2NrIGluIHRoZSBkZWZpbml0aW9uIG9mIFtkcm9wXS4gKilcblxubGV0IHJlYyBmb3JjZV9kcm9wIG4geHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKF8sIHhzKSAtPlxuICAgICAgbGV0IG4gPSBuIC0gMSBpblxuICAgICAgaWYgbiA9IDAgdGhlblxuICAgICAgICB4cygpXG4gICAgICBlbHNlXG4gICAgICAgIGZvcmNlX2Ryb3AgbiB4c1xuXG4oKiBbZHJvcF0gaXMgZGVmaW5lZCBpbiBzdWNoIGEgd2F5IHRoYXQgW2Ryb3AgMCB4c10gcmV0dXJucyBbeHNdIGltbWVkaWF0ZWx5LFxuICAgd2l0aG91dCBhbGxvY2F0aW5nIGFueSBtZW1vcnkuICopXG5cbmxldCBkcm9wIG4geHMgPVxuICBpZiBuIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiU2VxLmRyb3BcIlxuICBlbHNlIGlmIG4gPSAwIHRoZW5cbiAgICB4c1xuICBlbHNlXG4gICAgZnVuICgpIC0+XG4gICAgICBmb3JjZV9kcm9wIG4geHNcblxubGV0IHJlYyB0YWtlX3doaWxlIHAgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgaWYgcCB4IHRoZW4gQ29ucyAoeCwgdGFrZV93aGlsZSBwIHhzKSBlbHNlIE5pbFxuXG5sZXQgcmVjIGRyb3Bfd2hpbGUgcCB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIGFzIG5vZGUgLT5cbiAgICAgIGlmIHAgeCB0aGVuIGRyb3Bfd2hpbGUgcCB4cyAoKSBlbHNlIG5vZGVcblxubGV0IHJlYyBncm91cCBlcSB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBDb25zIChjb25zIHggKHRha2Vfd2hpbGUgKGVxIHgpIHhzKSwgZ3JvdXAgZXEgKGRyb3Bfd2hpbGUgKGVxIHgpIHhzKSlcblxuZXhjZXB0aW9uIEZvcmNlZF90d2ljZVxuXG5tb2R1bGUgU3VzcGVuc2lvbiA9IHN0cnVjdFxuXG4gIHR5cGUgJ2Egc3VzcGVuc2lvbiA9XG4gICAgdW5pdCAtPiAnYVxuXG4gICgqIENvbnZlcnNpb25zLiAqKVxuXG4gIGxldCB0b19sYXp5IDogJ2Egc3VzcGVuc2lvbiAtPiAnYSBMYXp5LnQgPVxuICAgIExhenkuZnJvbV9mdW5cbiAgICAoKiBmdW4gcyAtPiBsYXp5IChzKCkpICopXG5cbiAgbGV0IGZyb21fbGF6eSAocyA6ICdhIExhenkudCkgOiAnYSBzdXNwZW5zaW9uID1cbiAgICBmdW4gKCkgLT4gTGF6eS5mb3JjZSBzXG5cbiAgKCogW21lbW9pemVdIHR1cm5zIGFuIGFyYml0cmFyeSBzdXNwZW5zaW9uIGludG8gYSBwZXJzaXN0ZW50IHN1c3BlbnNpb24uICopXG5cbiAgbGV0IG1lbW9pemUgKHMgOiAnYSBzdXNwZW5zaW9uKSA6ICdhIHN1c3BlbnNpb24gPVxuICAgIGZyb21fbGF6eSAodG9fbGF6eSBzKVxuXG4gICgqIFtmYWlsdXJlXSBpcyBhIHN1c3BlbnNpb24gdGhhdCBmYWlscyB3aGVuIGZvcmNlZC4gKilcblxuICBsZXQgZmFpbHVyZSA6IF8gc3VzcGVuc2lvbiA9XG4gICAgZnVuICgpIC0+XG4gICAgICAoKiBBIHN1c3BlbnNpb24gY3JlYXRlZCBieSBbb25jZV0gaGFzIGJlZW4gZm9yY2VkIHR3aWNlLiAqKVxuICAgICAgcmFpc2UgRm9yY2VkX3R3aWNlXG5cbiAgKCogSWYgW2ZdIGlzIGEgc3VzcGVuc2lvbiwgdGhlbiBbb25jZSBmXSBpcyBhIHN1c3BlbnNpb24gdGhhdCBjYW4gYmUgZm9yY2VkXG4gICAgIGF0IG1vc3Qgb25jZS4gSWYgaXQgaXMgZm9yY2VkIG1vcmUgdGhhbiBvbmNlLCB0aGVuIFtGb3JjZWRfdHdpY2VdIGlzXG4gICAgIHJhaXNlZC4gKilcblxuICBsZXQgb25jZSAoZiA6ICdhIHN1c3BlbnNpb24pIDogJ2Egc3VzcGVuc2lvbiA9XG4gICAgbGV0IGFjdGlvbiA9IEF0b21pYy5tYWtlIGYgaW5cbiAgICBmdW4gKCkgLT5cbiAgICAgICgqIEdldCB0aGUgZnVuY3Rpb24gY3VycmVudGx5IHN0b3JlZCBpbiBbYWN0aW9uXSwgYW5kIHdyaXRlIHRoZVxuICAgICAgICAgZnVuY3Rpb24gW2ZhaWx1cmVdIGluIGl0cyBwbGFjZSwgc28gdGhlIG5leHQgYWNjZXNzIHdpbGwgcmVzdWx0XG4gICAgICAgICBpbiBhIGNhbGwgdG8gW2ZhaWx1cmUoKV0uICopXG4gICAgICBsZXQgZiA9IEF0b21pYy5leGNoYW5nZSBhY3Rpb24gZmFpbHVyZSBpblxuICAgICAgZigpXG5cbmVuZCAoKiBTdXNwZW5zaW9uICopXG5cbmxldCByZWMgbWVtb2l6ZSB4cyA9XG4gIFN1c3BlbnNpb24ubWVtb2l6ZSAoZnVuICgpIC0+XG4gICAgbWF0Y2ggeHMoKSB3aXRoXG4gICAgfCBOaWwgLT5cbiAgICAgICAgTmlsXG4gICAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgICAgQ29ucyAoeCwgbWVtb2l6ZSB4cylcbiAgKVxuXG5sZXQgcmVjIG9uY2UgeHMgPVxuICBTdXNwZW5zaW9uLm9uY2UgKGZ1biAoKSAtPlxuICAgIG1hdGNoIHhzKCkgd2l0aFxuICAgIHwgTmlsIC0+XG4gICAgICAgIE5pbFxuICAgIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICAgIENvbnMgKHgsIG9uY2UgeHMpXG4gIClcblxuXG5sZXQgcmVjIHppcCB4cyB5cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCB5cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgTmlsXG4gICAgICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgICAgIENvbnMgKCh4LCB5KSwgemlwIHhzIHlzKVxuXG5sZXQgcmVjIG1hcDIgZiB4cyB5cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCB5cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgTmlsXG4gICAgICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgICAgIENvbnMgKGYgeCB5LCBtYXAyIGYgeHMgeXMpXG5cbmxldCByZWMgaW50ZXJsZWF2ZSB4cyB5cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgeXMoKVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgQ29ucyAoeCwgaW50ZXJsZWF2ZSB5cyB4cylcblxuKCogW3NvcnRlZF9tZXJnZTFsIGNtcCB4IHhzIHlzXSBpcyBlcXVpdmFsZW50IHRvXG4gICAgIFtzb3J0ZWRfbWVyZ2UgY21wIChjb25zIHggeHMpIHlzXS5cblxuICAgW3NvcnRlZF9tZXJnZTFyIGNtcCB4cyB5IHlzXSBpcyBlcXVpdmFsZW50IHRvXG4gICAgIFtzb3J0ZWRfbWVyZ2UgY21wIHhzIChjb25zIHkgeXMpXS5cblxuICAgW3NvcnRlZF9tZXJnZTEgY21wIHggeHMgeSB5c10gaXMgZXF1aXZhbGVudCB0b1xuICAgICBbc29ydGVkX21lcmdlIGNtcCAoY29ucyB4IHhzKSAoY29ucyB5IHlzKV0uXG5cbiAgIFRoZXNlIHRocmVlIGZ1bmN0aW9ucyBhcmUgdXNlZCBhcyBidWlsZGluZyBibG9ja3MgaW4gdGhlIGRlZmluaXRpb25cbiAgIG9mIFtzb3J0ZWRfbWVyZ2VdLiAqKVxuXG5sZXQgcmVjIHNvcnRlZF9tZXJnZTFsIGNtcCB4IHhzIHlzICgpID1cbiAgbWF0Y2ggeXMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBDb25zICh4LCB4cylcbiAgfCBDb25zICh5LCB5cykgLT5cbiAgICAgIHNvcnRlZF9tZXJnZTEgY21wIHggeHMgeSB5c1xuXG5hbmQgc29ydGVkX21lcmdlMXIgY21wIHhzIHkgeXMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIENvbnMgKHksIHlzKVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgc29ydGVkX21lcmdlMSBjbXAgeCB4cyB5IHlzXG5cbmFuZCBzb3J0ZWRfbWVyZ2UxIGNtcCB4IHhzIHkgeXMgPVxuICBpZiBjbXAgeCB5IDw9IDAgdGhlblxuICAgIENvbnMgKHgsIHNvcnRlZF9tZXJnZTFyIGNtcCB4cyB5IHlzKVxuICBlbHNlXG4gICAgQ29ucyAoeSwgc29ydGVkX21lcmdlMWwgY21wIHggeHMgeXMpXG5cbmxldCBzb3J0ZWRfbWVyZ2UgY21wIHhzIHlzICgpID1cbiAgbWF0Y2ggeHMoKSwgeXMoKSB3aXRoXG4gICAgfCBOaWwsIE5pbCAtPlxuICAgICAgICBOaWxcbiAgICB8IE5pbCwgY1xuICAgIHwgYywgTmlsIC0+XG4gICAgICAgIGNcbiAgICB8IENvbnMgKHgsIHhzKSwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICAgIHNvcnRlZF9tZXJnZTEgY21wIHggeHMgeSB5c1xuXG5cbmxldCByZWMgbWFwX2ZzdCB4eXMgKCkgPVxuICBtYXRjaCB4eXMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICgoeCwgXyksIHh5cykgLT5cbiAgICAgIENvbnMgKHgsIG1hcF9mc3QgeHlzKVxuXG5sZXQgcmVjIG1hcF9zbmQgeHlzICgpID1cbiAgbWF0Y2ggeHlzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoKF8sIHkpLCB4eXMpIC0+XG4gICAgICBDb25zICh5LCBtYXBfc25kIHh5cylcblxubGV0IHVuemlwIHh5cyA9XG4gIG1hcF9mc3QgeHlzLCBtYXBfc25kIHh5c1xuXG5sZXQgc3BsaXQgPVxuICB1bnppcFxuXG4oKiBbZmlsdGVyX21hcF9maW5kX2xlZnRfbWFwIGYgeHNdIGlzIGVxdWl2YWxlbnQgdG9cbiAgIFtmaWx0ZXJfbWFwIEVpdGhlci5maW5kX2xlZnQgKG1hcCBmIHhzKV0uICopXG5cbmxldCByZWMgZmlsdGVyX21hcF9maW5kX2xlZnRfbWFwIGYgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggZiB4IHdpdGhcbiAgICAgIHwgRWl0aGVyLkxlZnQgeSAtPlxuICAgICAgICAgIENvbnMgKHksIGZpbHRlcl9tYXBfZmluZF9sZWZ0X21hcCBmIHhzKVxuICAgICAgfCBFaXRoZXIuUmlnaHQgXyAtPlxuICAgICAgICAgIGZpbHRlcl9tYXBfZmluZF9sZWZ0X21hcCBmIHhzICgpXG5cbmxldCByZWMgZmlsdGVyX21hcF9maW5kX3JpZ2h0X21hcCBmIHhzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIG1hdGNoIGYgeCB3aXRoXG4gICAgICB8IEVpdGhlci5MZWZ0IF8gLT5cbiAgICAgICAgICBmaWx0ZXJfbWFwX2ZpbmRfcmlnaHRfbWFwIGYgeHMgKClcbiAgICAgIHwgRWl0aGVyLlJpZ2h0IHogLT5cbiAgICAgICAgICBDb25zICh6LCBmaWx0ZXJfbWFwX2ZpbmRfcmlnaHRfbWFwIGYgeHMpXG5cbmxldCBwYXJ0aXRpb25fbWFwIGYgeHMgPVxuICBmaWx0ZXJfbWFwX2ZpbmRfbGVmdF9tYXAgZiB4cyxcbiAgZmlsdGVyX21hcF9maW5kX3JpZ2h0X21hcCBmIHhzXG5cbmxldCBwYXJ0aXRpb24gcCB4cyA9XG4gIGZpbHRlciBwIHhzLCBmaWx0ZXIgKGZ1biB4IC0+IG5vdCAocCB4KSkgeHNcblxuKCogSWYgW3hzc10gaXMgYSBtYXRyaXggKGEgc2VxdWVuY2Ugb2Ygcm93cyksIHRoZW4gW3BlZWwgeHNzXSBpcyBhIHBhaXIgb2ZcbiAgIHRoZSBmaXJzdCBjb2x1bW4gKGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMpIGFuZCBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZVxuICAgbWF0cml4IChhIHNlcXVlbmNlIG9mIHNob3J0ZXIgcm93cykuIFRoZXNlIHR3byBzZXF1ZW5jZXMgaGF2ZSB0aGUgc2FtZVxuICAgbGVuZ3RoLiBUaGUgcm93cyBvZiB0aGUgbWF0cml4IFt4c3NdIGFyZSBub3QgcmVxdWlyZWQgdG8gaGF2ZSB0aGUgc2FtZVxuICAgbGVuZ3RoLiBBbiBlbXB0eSByb3cgaXMgaWdub3JlZC4gKilcblxuKCogQmVjYXVzZSBbcGVlbF0gdXNlcyBbdW56aXBdLCBpdHMgYXJndW1lbnQgbXVzdCBiZSBwZXJzaXN0ZW50LiBUaGUgc2FtZVxuICAgcmVtYXJrIGFwcGxpZXMgdG8gW3RyYW5zcG9zZV0sIFtkaWFnb25hbHNdLCBbcHJvZHVjdF0sIGV0Yy4gKilcblxubGV0IHBlZWwgeHNzID1cbiAgdW56aXAgKGZpbHRlcl9tYXAgdW5jb25zIHhzcylcblxubGV0IHJlYyB0cmFuc3Bvc2UgeHNzICgpID1cbiAgbGV0IGhlYWRzLCB0YWlscyA9IHBlZWwgeHNzIGluXG4gIGlmIGlzX2VtcHR5IGhlYWRzIHRoZW4gYmVnaW5cbiAgICBhc3NlcnQgKGlzX2VtcHR5IHRhaWxzKTtcbiAgICBOaWxcbiAgZW5kXG4gIGVsc2VcbiAgICBDb25zIChoZWFkcywgdHJhbnNwb3NlIHRhaWxzKVxuXG4oKiBUaGUgaW50ZXJuYWwgZnVuY3Rpb24gW2RpYWdvbmFsc10gdGFrZXMgYW4gZXh0cmEgYXJndW1lbnQsIFtyZW1haW5kZXJzXSxcbiAgIHdoaWNoIGNvbnRhaW5zIHRoZSByZW1haW5kZXJzIG9mIHRoZSByb3dzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW5cbiAgIGRpc2NvdmVyZWQuICopXG5cbmxldCByZWMgZGlhZ29uYWxzIHJlbWFpbmRlcnMgeHNzICgpID1cbiAgbWF0Y2ggeHNzKCkgd2l0aFxuICB8IENvbnMgKHhzLCB4c3MpIC0+XG4gICAgICBiZWdpbiBtYXRjaCB4cygpIHdpdGhcbiAgICAgIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICAgICAgKCogV2UgZGlzY292ZXIgYSBuZXcgbm9uZW1wdHkgcm93IFt4IDo6IHhzXS4gVGh1cywgdGhlIG5leHQgZGlhZ29uYWxcbiAgICAgICAgICAgICBpcyBbeCA6OiBoZWFkc106IHRoaXMgZGlhZ29uYWwgYmVnaW5zIHdpdGggW3hdIGFuZCBjb250aW51ZXMgd2l0aFxuICAgICAgICAgICAgIHRoZSBmaXJzdCBlbGVtZW50IG9mIGV2ZXJ5IHJvdyBpbiBbcmVtYWluZGVyc10uIEluIHRoZSByZWN1cnNpdmVcbiAgICAgICAgICAgICBjYWxsLCB0aGUgYXJndW1lbnQgW3JlbWFpbmRlcnNdIGlzIGluc3RhbnRpYXRlZCB3aXRoIFt4cyA6OlxuICAgICAgICAgICAgIHRhaWxzXSwgd2hpY2ggbWVhbnMgdGhhdCB3ZSBoYXZlIG9uZSBtb3JlIHJlbWFpbmluZyByb3csIFt4c10sXG4gICAgICAgICAgICAgYW5kIHRoYXQgd2Uga2VlcCB0aGUgdGFpbHMgb2YgdGhlIHByZS1leGlzdGluZyByZW1haW5pbmcgcm93cy4gKilcbiAgICAgICAgICBsZXQgaGVhZHMsIHRhaWxzID0gcGVlbCByZW1haW5kZXJzIGluXG4gICAgICAgICAgQ29ucyAoY29ucyB4IGhlYWRzLCBkaWFnb25hbHMgKGNvbnMgeHMgdGFpbHMpIHhzcylcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgKCogV2UgZGlzY292ZXIgYSBuZXcgZW1wdHkgcm93LiBJbiB0aGlzIGNhc2UsIHRoZSBuZXcgZGlhZ29uYWwgaXNcbiAgICAgICAgICAgICBqdXN0IFtoZWFkc10sIGFuZCBbcmVtYWluZGVyc10gaXMgaW5zdGFudGlhdGVkIHdpdGgganVzdCBbdGFpbHNdLFxuICAgICAgICAgICAgIGFzIHdlIGRvIG5vdCBoYXZlIG9uZSBtb3JlIHJlbWFpbmluZyByb3cuICopXG4gICAgICAgICAgbGV0IGhlYWRzLCB0YWlscyA9IHBlZWwgcmVtYWluZGVycyBpblxuICAgICAgICAgIENvbnMgKGhlYWRzLCBkaWFnb25hbHMgdGFpbHMgeHNzKVxuICAgICAgZW5kXG4gIHwgTmlsIC0+XG4gICAgICAoKiBUaGVyZSBhcmUgbm8gbW9yZSByb3dzIHRvIGJlIGRpc2NvdmVyZWQuIFRoZXJlIHJlbWFpbnMgdG8gZXhoYXVzdFxuICAgICAgICAgdGhlIHJlbWFpbmluZyByb3dzLiAqKVxuICAgICAgdHJhbnNwb3NlIHJlbWFpbmRlcnMgKClcblxuKCogSWYgW3hzc10gaXMgYSBtYXRyaXggKGEgc2VxdWVuY2Ugb2Ygcm93cyksIHRoZW4gW2RpYWdvbmFscyB4c3NdIGlzXG4gICB0aGUgc2VxdWVuY2Ugb2YgaXRzIGRpYWdvbmFscy5cblxuICAgVGhlIGZpcnN0IGRpYWdvbmFsIGNvbnRhaW5zIGp1c3QgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlXG4gICBmaXJzdCByb3cuIFRoZSBzZWNvbmQgZGlhZ29uYWwgY29udGFpbnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlXG4gICBzZWNvbmQgcm93IGFuZCB0aGUgc2Vjb25kIGVsZW1lbnQgb2YgdGhlIGZpcnN0IHJvdzsgYW5kIHNvIG9uLlxuICAgVGhpcyBraW5kIG9mIGRpYWdvbmFsIGlzIGluIGZhY3Qgc29tZXRpbWVzIGtub3duIGFzIGFuIGFudGlkaWFnb25hbC5cblxuICAgLSBFdmVyeSBkaWFnb25hbCBpcyBhIGZpbml0ZSBzZXF1ZW5jZS5cbiAgIC0gVGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCBbeHNzXSBhcmUgbm90IHJlcXVpcmVkIHRvIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLlxuICAgLSBUaGUgbWF0cml4IFt4c3NdIGlzIG5vdCByZXF1aXJlZCB0byBiZSBmaW5pdGUgKGluIGVpdGhlciBkaXJlY3Rpb24pLlxuICAgLSBUaGUgbWF0cml4IFt4c3NdIG11c3QgYmUgcGVyc2lzdGVudC4gKilcblxubGV0IGRpYWdvbmFscyB4c3MgPVxuICBkaWFnb25hbHMgZW1wdHkgeHNzXG5cbmxldCBtYXBfcHJvZHVjdCBmIHhzIHlzID1cbiAgY29uY2F0IChkaWFnb25hbHMgKFxuICAgIG1hcCAoZnVuIHggLT5cbiAgICAgIG1hcCAoZnVuIHkgLT5cbiAgICAgICAgZiB4IHlcbiAgICAgICkgeXNcbiAgICApIHhzXG4gICkpXG5cbmxldCBwcm9kdWN0IHhzIHlzID1cbiAgbWFwX3Byb2R1Y3QgKGZ1biB4IHkgLT4gKHgsIHkpKSB4cyB5c1xuXG5sZXQgb2ZfZGlzcGVuc2VyIGl0ID1cbiAgbGV0IHJlYyBjICgpID1cbiAgICBtYXRjaCBpdCgpIHdpdGhcbiAgICB8IE5vbmUgLT5cbiAgICAgICAgTmlsXG4gICAgfCBTb21lIHggLT5cbiAgICAgICAgQ29ucyAoeCwgYylcbiAgaW5cbiAgY1xuXG5sZXQgdG9fZGlzcGVuc2VyIHhzID1cbiAgbGV0IHMgPSByZWYgeHMgaW5cbiAgZnVuICgpIC0+XG4gICAgbWF0Y2ggKCFzKSgpIHdpdGhcbiAgICB8IE5pbCAtPlxuICAgICAgICBOb25lXG4gICAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgICAgcyA6PSB4cztcbiAgICAgICAgU29tZSB4XG5cblxuXG5sZXQgcmVjIGludHMgaSAoKSA9XG4gIENvbnMgKGksIGludHMgKGkgKyAxKSlcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImNhbWxfY2FsbDMiLCJhMiIsImdsb2JhbF9kYXRhIiwiQXNzZXJ0X2ZhaWx1cmUiLCJTdGRsaWJfQXRvbWljIiwiQ2FtbGludGVybmFsTGF6eSIsIlN0ZGxpYiIsIlN0ZGxpYl9MYXp5IiwiZW1wdHkiLCJwYXJhbSIsInJldHVybiQiLCJ4IiwiY29ucyIsIm5leHQiLCJhcHBlbmQiLCJzZXExIiwic2VxMiIsIm1hdGNoIiwibWFwIiwic2VxIiwiZmlsdGVyX21hcCIsInkiLCJmaWx0ZXIiLCJjb25jYXQiLCJmbGF0X21hcCIsImZvbGRfbGVmdCIsImFjYyIsIml0ZXIiLCJ1bmZvbGQiLCJ1IiwiaXNfZW1wdHkiLCJ4cyIsInVuY29ucyIsImxlbmd0aCIsImFjY3UiLCJpdGVyaSIsImkiLCJmb2xkX2xlZnRpIiwiZm9yX2FsbCIsInAiLCJleGlzdHMiLCJmaW5kIiwiZmluZF9pbmRleCIsImZpbmRfbWFwIiwicmVzdWx0IiwiZmluZF9tYXBpIiwiaXRlcjIiLCJ5cyIsImZvbGRfbGVmdDIiLCJmb3JfYWxsMiIsImV4aXN0czIiLCJlcXVhbCIsImVxIiwiY29tcGFyZSIsImNtcCIsImMiLCJpbml0X2F1eCIsImoiLCJpbml0IiwibiIsInJlcGVhdCIsImZvcmV2ZXIiLCJjeWNsZV9ub25lbXB0eSIsImN5Y2xlIiwiaXRlcmF0ZTEiLCJpdGVyYXRlIiwibWFwaV9hdXgiLCJtYXBpIiwidGFpbF9zY2FuIiwicyIsInNjYW4iLCJ0YWtlX2F1eCIsInRha2UiLCJkcm9wIiwidGFrZV93aGlsZSIsImRyb3Bfd2hpbGUiLCJub2RlIiwiZ3JvdXAiLCJGb3JjZWRfdHdpY2UiLCJ0b19sYXp5IiwiZmFpbHVyZSIsIm1lbW9pemUiLCJvbmNlIiwiYWN0aW9uIiwiemlwIiwibWFwMiIsImludGVybGVhdmUiLCJzb3J0ZWRfbWVyZ2UxIiwic29ydGVkX21lcmdlIiwibWFwX2ZzdCIsInh5cyIsIm1hcF9zbmQiLCJ1bnppcCIsImZpbHRlcl9tYXBfZmluZF9sZWZ0X21hcCIsImZpbHRlcl9tYXBfZmluZF9yaWdodF9tYXAiLCJ6IiwicGFydGl0aW9uX21hcCIsInBhcnRpdGlvbiIsInBlZWwiLCJ4c3MiLCJ0cmFuc3Bvc2UiLCJ0YWlscyIsImhlYWRzIiwicmVtYWluZGVycyIsIm1hcF9wcm9kdWN0IiwicHJvZHVjdCIsIm9mX2Rpc3BlbnNlciIsIml0IiwidG9fZGlzcGVuc2VyIiwiaW50cyJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQyxXQUFBRixHQUFBQyxJQUFBRTtBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUosR0FBQUMsSUFBQUUsSUFBQUU7QUFBQUEsSUFB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LFNBQUFOLElBRk07QUFBQSxLQUlOO0FBQUEsSUFBVztBQUFBLElBRWpCO0FBQUEsR0FBQztBQUFBLFlBQUFpRyxhQUFBN0U7QUFBQUEsUUFBQXNDLElBR0Q7QUFBQSxJQUNBLGdCQUFBNUQ7QUFBQUEsU0FBQVEsUUFDUTtBQUFBLEtBQU0sWUFFUjtBQUFBLFNBQUFjLEtBRlEsVUFBQXBCLElBQUE7QUFBQSxLQUlSO0FBQUEsS0FDQSxjQUFNLENBTlo7QUFBQSxHQU1ZO0FBQUEsWUFBQWtHLEtBQUF6RSxHQUFBM0I7QUFBQUEsUUFBQSxJQUtIO0FBQUEsSUFBWSwwQkFBWixvQkFBWTtBQUFBLEdBQUM7QUFBQSxHRDdyQnhCIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTEwMzIsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvb3B0aW9uLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIE9DYW1sIHByb2dyYW1tZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxOCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlICdhIHQgPSAnYSBvcHRpb24gPSBOb25lIHwgU29tZSBvZiAnYVxuXG5sZXQgbm9uZSA9IE5vbmVcbmxldCBzb21lIHYgPSBTb21lIHZcbmxldCB2YWx1ZSBvIH5kZWZhdWx0ID0gbWF0Y2ggbyB3aXRoIFNvbWUgdiAtPiB2IHwgTm9uZSAtPiBkZWZhdWx0XG5sZXQgZ2V0ID0gZnVuY3Rpb24gU29tZSB2IC0+IHYgfCBOb25lIC0+IGludmFsaWRfYXJnIFwib3B0aW9uIGlzIE5vbmVcIlxubGV0IGJpbmQgbyBmID0gbWF0Y2ggbyB3aXRoIE5vbmUgLT4gTm9uZSB8IFNvbWUgdiAtPiBmIHZcbmxldCBqb2luID0gZnVuY3Rpb24gU29tZSBvIC0+IG8gfCBOb25lIC0+IE5vbmVcbmxldCBtYXAgZiBvID0gbWF0Y2ggbyB3aXRoIE5vbmUgLT4gTm9uZSB8IFNvbWUgdiAtPiBTb21lIChmIHYpXG5sZXQgZm9sZCB+bm9uZSB+c29tZSA9IGZ1bmN0aW9uIFNvbWUgdiAtPiBzb21lIHYgfCBOb25lIC0+IG5vbmVcbmxldCBpdGVyIGYgPSBmdW5jdGlvbiBTb21lIHYgLT4gZiB2IHwgTm9uZSAtPiAoKVxubGV0IGlzX25vbmUgPSBmdW5jdGlvbiBOb25lIC0+IHRydWUgfCBTb21lIF8gLT4gZmFsc2VcbmxldCBpc19zb21lID0gZnVuY3Rpb24gTm9uZSAtPiBmYWxzZSB8IFNvbWUgXyAtPiB0cnVlXG5cbmxldCBlcXVhbCBlcSBvMCBvMSA9IG1hdGNoIG8wLCBvMSB3aXRoXG58IFNvbWUgdjAsIFNvbWUgdjEgLT4gZXEgdjAgdjFcbnwgTm9uZSwgTm9uZSAtPiB0cnVlXG58IF8gLT4gZmFsc2VcblxubGV0IGNvbXBhcmUgY21wIG8wIG8xID0gbWF0Y2ggbzAsIG8xIHdpdGhcbnwgU29tZSB2MCwgU29tZSB2MSAtPiBjbXAgdjAgdjFcbnwgTm9uZSwgTm9uZSAtPiAwXG58IE5vbmUsIFNvbWUgXyAtPiAtMVxufCBTb21lIF8sIE5vbmUgLT4gMVxuXG5sZXQgdG9fcmVzdWx0IH5ub25lID0gZnVuY3Rpb24gTm9uZSAtPiBFcnJvciBub25lIHwgU29tZSB2IC0+IE9rIHZcbmxldCB0b19saXN0ID0gZnVuY3Rpb24gTm9uZSAtPiBbXSB8IFNvbWUgdiAtPiBbdl1cbmxldCB0b19zZXEgPSBmdW5jdGlvbiBOb25lIC0+IFNlcS5lbXB0eSB8IFNvbWUgdiAtPiBTZXEucmV0dXJuIHZcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImdsb2JhbF9kYXRhIiwiU3RkbGliX1NlcSIsIlN0ZGxpYiIsInNvbWUiLCJ2IiwidmFsdWUiLCJvIiwiZGVmYXVsdCQiLCJnZXQiLCJwYXJhbSIsImJpbmQiLCJqb2luIiwibWFwIiwiZm9sZCIsIm5vbmUiLCJpdGVyIiwiaXNfbm9uZSIsImlzX3NvbWUiLCJlcXVhbCIsImVxIiwibzAiLCJvMSIsInYxIiwidjAiLCJjb21wYXJlIiwiY21wIiwidG9fcmVzdWx0IiwidG9fbGlzdCIsInRvX3NlcSJdLCJtYXBwaW5ncyI6Ik9BQUFBLFVBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsWUFBQUMsS0FBQUMsR0NrQmEsY0FBTTtBQUFBLFlBQUFDLE1BQUFDLEdBQUFDO0FBQUFBLElBQ0ksUUFBbUM7QUFBQSxRQUFBSCxJQUFuQztBQUFBLElBQXVCO0FBQUEsR0FBbUI7QUFBQSxZQUFBSSxJQUFBQztBQUFBQSxJQUN2RCxZQUErQiw2Q0FBNEI7QUFBQSxRQUFBTCxJQUEzRDtBQUFBLElBQW1CO0FBQUEsR0FBd0M7QUFBQSxZQUFBTSxLQUFBSixHQUFBVjtBQUFBQSxJQUN0RCxRQUFxQjtBQUFBLFFBQUFRLElBQXJCO0FBQUEsSUFBc0MsdUJBQUc7QUFBQTtBQUFBLFlBQUFPLEtBQUFGLE9BQzdDLFlBQStCLGNBQUFILElBQS9CLFVBQW1CLFNBQWdCO0FBQUEsWUFBQU0sSUFBQWhCLEdBQUFVO0FBQUFBLElBQ2hDLFFBQXFCO0FBQUEsUUFBQUYsSUFBckI7QUFBQSxJQUEyQyw0QkFBSztBQUFBO0FBQUEsWUFBQVMsS0FBQUMsTUFBQVgsTUFBQU07QUFBQUEsSUFDckQsWUFBa0Q7QUFBQSxRQUFBTCxJQUFsRDtBQUFBLElBQWlDLDBCQUFxQjtBQUFBO0FBQUEsWUFBQVcsS0FBQW5CLEdBQUFhO0FBQUFBLElBQ3RELFlBQXFDO0FBQUEsUUFBQUwsSUFBckM7QUFBQSxJQUF1Qix1QkFBZ0I7QUFBQTtBQUFBLFlBQUFZLFFBQUFQLE9BQ2xDLG9CQUF1QztBQUFBLFlBQUFRLFFBQUFSLE9BQ3ZDLG9CQUF1QztBQUFBLFlBQUFTLE1BQUFDLElBQUFDLElBQUFDO0FBQUFBLElBRWhDO0FBQUEsZ0JBQUFDLEtBQUEsT0FBQUMsS0FBQSxPQUNDLDZCQUVWO0FBQUE7QUFBQSxrQkFESTtBQUFBLElBQ1Q7QUFBQSxHQUFLO0FBQUEsWUFBQUMsUUFBQUMsS0FBQUwsSUFBQUM7QUFBQUEsSUFFWSwyQkFJTDtBQUFBLFFBQUFFLEtBSks7QUFBQSxhQUlOO0FBQUEsUUFBQUQsS0FKTTtBQUFBLElBQ0YsOEJBR0g7QUFBQTtBQUFBLFlBQUFJLFVBQUFaLE1BQUFMO0FBQUFBLElBRUwsWUFBeUI7QUFBQSxRQUFBTCxJQUF6QjtBQUFBLElBQWdEO0FBQUEsR0FBSTtBQUFBLFlBQUF1QixRQUFBbEI7QUFBQUEsSUFDcEQsWUFBaUI7QUFBQSxRQUFBTCxJQUFqQjtBQUFBLElBQWdDO0FBQUEsR0FBRztBQUFBLFlBQUF3QixPQUFBbkI7QUFBQUEsSUFDcEMsWUFBaUI7QUFBQSxRQUFBTCxJQUFqQixjQUF1QztBQUFBLHVCRDFDcEQsZ0JDMENvRDtBQUFBLEdBQVk7QUFBQSxHRDFDaEUiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoxMTE0MCwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9jaGFyLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBDaGFyYWN0ZXIgb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCBjb2RlOiBjaGFyIC0+IGludCA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIHVuc2FmZV9jaHI6IGludCAtPiBjaGFyID0gXCIlaWRlbnRpdHlcIlxuXG5sZXQgY2hyIG4gPVxuICBpZiBuIDwgMCB8fCBuID4gMjU1IHRoZW4gaW52YWxpZF9hcmcgXCJDaGFyLmNoclwiIGVsc2UgdW5zYWZlX2NociBuXG5cbmV4dGVybmFsIGJ5dGVzX2NyZWF0ZTogaW50IC0+IGJ5dGVzID0gXCJjYW1sX2NyZWF0ZV9ieXRlc1wiXG5leHRlcm5hbCBieXRlc191bnNhZmVfc2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcIiVieXRlc191bnNhZmVfc2V0XCJcbmV4dGVybmFsIHVuc2FmZV90b19zdHJpbmcgOiBieXRlcyAtPiBzdHJpbmcgPSBcIiVieXRlc190b19zdHJpbmdcIlxuXG5sZXQgZXNjYXBlZCA9IGZ1bmN0aW9uXG4gIHwgJ1xcJycgLT4gXCJcXFxcJ1wiXG4gIHwgJ1xcXFwnIC0+IFwiXFxcXFxcXFxcIlxuICB8ICdcXG4nIC0+IFwiXFxcXG5cIlxuICB8ICdcXHQnIC0+IFwiXFxcXHRcIlxuICB8ICdcXHInIC0+IFwiXFxcXHJcIlxuICB8ICdcXGInIC0+IFwiXFxcXGJcIlxuICB8ICcgJyAuLiAnficgYXMgYyAtPlxuICAgICAgbGV0IHMgPSBieXRlc19jcmVhdGUgMSBpblxuICAgICAgYnl0ZXNfdW5zYWZlX3NldCBzIDAgYztcbiAgICAgIHVuc2FmZV90b19zdHJpbmcgc1xuICB8IGMgLT5cbiAgICAgIGxldCBuID0gY29kZSBjIGluXG4gICAgICBsZXQgcyA9IGJ5dGVzX2NyZWF0ZSA0IGluXG4gICAgICBieXRlc191bnNhZmVfc2V0IHMgMCAnXFxcXCc7XG4gICAgICBieXRlc191bnNhZmVfc2V0IHMgMSAodW5zYWZlX2NociAoNDggKyBuIC8gMTAwKSk7XG4gICAgICBieXRlc191bnNhZmVfc2V0IHMgMiAodW5zYWZlX2NociAoNDggKyAobiAvIDEwKSBtb2QgMTApKTtcbiAgICAgIGJ5dGVzX3Vuc2FmZV9zZXQgcyAzICh1bnNhZmVfY2hyICg0OCArIG4gbW9kIDEwKSk7XG4gICAgICB1bnNhZmVfdG9fc3RyaW5nIHNcblxubGV0IGxvd2VyY2FzZV9hc2NpaSA9IGZ1bmN0aW9uXG4gIHwgJ0EnIC4uICdaJyBhcyBjIC0+IHVuc2FmZV9jaHIoY29kZSBjICsgMzIpXG4gIHwgYyAtPiBjXG5cbmxldCB1cHBlcmNhc2VfYXNjaWkgPSBmdW5jdGlvblxuICB8ICdhJyAuLiAneicgYXMgYyAtPiB1bnNhZmVfY2hyKGNvZGUgYyAtIDMyKVxuICB8IGMgLT4gY1xuXG50eXBlIHQgPSBjaGFyXG5cbmxldCBjb21wYXJlIGMxIGMyID0gY29kZSBjMSAtIGNvZGUgYzJcbmxldCBlcXVhbCAoYzE6IHQpIChjMjogdCkgPSBjb21wYXJlIGMxIGMyID0gMFxuXG5leHRlcm5hbCBzZWVkZWRfaGFzaF9wYXJhbSA6XG4gIGludCAtPiBpbnQgLT4gaW50IC0+ICdhIC0+IGludCA9IFwiY2FtbF9oYXNoXCIgW0BAbm9hbGxvY11cbmxldCBzZWVkZWRfaGFzaCBzZWVkIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgc2VlZCB4XG5sZXQgaGFzaCB4ID0gc2VlZGVkX2hhc2hfcGFyYW0gMTAgMTAwIDAgeFxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2J5dGVzX3Vuc2FmZV9zZXQiLCJjYW1sX2NyZWF0ZV9ieXRlcyIsImNhbWxfaGFzaCIsImNhbWxfc3RyaW5nX29mX2J5dGVzIiwiU3RkbGliIiwiY2hyIiwibiIsImVzY2FwZWQiLCJjIiwicyIsImxvd2VyY2FzZV9hc2NpaSIsInVwcGVyY2FzZV9hc2NpaSIsImNvbXBhcmUiLCJjMSIsImMyIiwiZXF1YWwiLCJzZWVkZWRfaGFzaCIsInNlZWQiLCJ4IiwiaGFzaCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyx3QkFBQTtBQUFBLElBQUFDLG9CQUFBO0FBQUEsSUFBQUMsWUFBQTtBQUFBLElBQUFDLHVCQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLFlBQUFDLElBQUFDO0FBQUFBLElDcUJFLHVCQUFxRDtBQUFBLElBQTVCLHVDQUF3QztBQUFBO0FBQUEsWUFBQUMsUUFBQUM7QUFBQUE7QUFBQUE7QUFBQUEsS0FPckQ7QUFBQSxtQkFFRjtBQUFBLE1BRkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQU1GO0FBQUE7QUFBQSxVQUZBO0FBQUE7QUFBQSxVQURBO0FBQUE7QUFBQSxVQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFMRSxZQUNGO0FBQUE7QUFBQSxTQUFBQyxNQU9FO0FBQUEsS0FDUjtBQUFBLEtBQ0EsZ0NBUWtCO0FBQUE7QUFBQSxRQUFBQSxJQUxWO0FBQUEsSUFDUjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsOEJBQWtCO0FBQUE7QUFBQSxZQUFBQyxnQkFBQUYsR0FFRix5Q0FFWjtBQUFBLFlBQUFHLGdCQUFBSCxHQUVZLHlDQUVaO0FBQUEsWUFBQUksUUFBQUMsSUFBQUMsSUFJVSxtQkFBaUI7QUFBQSxZQUFBQyxNQUFBRixJQUFBQyxJQUNJLG1DQUFJO0FBQUEsWUFBQUUsWUFBQUMsTUFBQUMsR0FJcEIsa0NBQStCO0FBQUEsWUFBQUMsS0FBQUQsR0FDM0MsK0JBQTRCO0FBQUEsR0RoRXpDIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTEyMTMsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvdWNoYXIubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgIERhbmllbCBDLiBCdWVuemxpICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE0IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbmV4dGVybmFsIGZvcm1hdF9pbnQgOiBzdHJpbmcgLT4gaW50IC0+IHN0cmluZyA9IFwiY2FtbF9mb3JtYXRfaW50XCJcblxubGV0IGVycl9ub19wcmVkID0gXCJVKzAwMDAgaGFzIG5vIHByZWRlY2Vzc29yXCJcbmxldCBlcnJfbm9fc3VjYyA9IFwiVSsxMEZGRkYgaGFzIG5vIHN1Y2Nlc3NvclwiXG5sZXQgZXJyX25vdF9zdiBpID0gZm9ybWF0X2ludCBcIiVYXCIgaSBeIFwiIGlzIG5vdCBhbiBVbmljb2RlIHNjYWxhciB2YWx1ZVwiXG5sZXQgZXJyX25vdF9sYXRpbjEgdSA9IFwiVStcIiBeIGZvcm1hdF9pbnQgXCIlMDRYXCIgdSBeIFwiIGlzIG5vdCBhIGxhdGluMSBjaGFyYWN0ZXJcIlxuXG50eXBlIHQgPSBpbnRcblxubGV0IG1pbiA9IDB4MDAwMFxubGV0IG1heCA9IDB4MTBGRkZGXG5sZXQgbG9fYm91bmQgPSAweEQ3RkZcbmxldCBoaV9ib3VuZCA9IDB4RTAwMFxuXG5sZXQgYm9tID0gMHhGRUZGXG5sZXQgcmVwID0gMHhGRkZEXG5cbmxldCBzdWNjIHUgPVxuICBpZiB1ID0gbG9fYm91bmQgdGhlbiBoaV9ib3VuZCBlbHNlXG4gIGlmIHUgPSBtYXggdGhlbiBpbnZhbGlkX2FyZyBlcnJfbm9fc3VjYyBlbHNlXG4gIHUgKyAxXG5cbmxldCBwcmVkIHUgPVxuICBpZiB1ID0gaGlfYm91bmQgdGhlbiBsb19ib3VuZCBlbHNlXG4gIGlmIHUgPSBtaW4gdGhlbiBpbnZhbGlkX2FyZyBlcnJfbm9fcHJlZCBlbHNlXG4gIHUgLSAxXG5cbmxldCBpc192YWxpZCBpID0gKG1pbiA8PSBpICYmIGkgPD0gbG9fYm91bmQpIHx8IChoaV9ib3VuZCA8PSBpICYmIGkgPD0gbWF4KVxubGV0IG9mX2ludCBpID0gaWYgaXNfdmFsaWQgaSB0aGVuIGkgZWxzZSBpbnZhbGlkX2FyZyAoZXJyX25vdF9zdiBpKVxuZXh0ZXJuYWwgdW5zYWZlX29mX2ludCA6IGludCAtPiB0ID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgdG9faW50IDogdCAtPiBpbnQgPSBcIiVpZGVudGl0eVwiXG5cbmxldCBpc19jaGFyIHUgPSB1IDwgMjU2XG5sZXQgb2ZfY2hhciBjID0gQ2hhci5jb2RlIGNcbmxldCB0b19jaGFyIHUgPVxuICBpZiB1ID4gMjU1IHRoZW4gaW52YWxpZF9hcmcgKGVycl9ub3RfbGF0aW4xIHUpIGVsc2VcbiAgQ2hhci51bnNhZmVfY2hyIHVcblxubGV0IHVuc2FmZV90b19jaGFyID0gQ2hhci51bnNhZmVfY2hyXG5cbmxldCBlcXVhbCA6IGludCAtPiBpbnQgLT4gYm9vbCA9ICggPSApXG5sZXQgY29tcGFyZSA6IGludCAtPiBpbnQgLT4gaW50ID0gU3RkbGliLmNvbXBhcmVcbmxldCBoYXNoID0gdG9faW50XG5cbigqIFVURiBjb2RlY3MgdG9vbHMgKilcblxudHlwZSB1dGZfZGVjb2RlID0gaW50XG4oKiBUaGlzIGlzIGFuIGludCBbMHhEVVVVVVVVXSBkZWNvbXBvc2VkIGFzIGZvbGxvd3M6XG4gICAtIFtEXSBpcyBmb3VyIGJpdHMgZm9yIGRlY29kZSBpbmZvcm1hdGlvbiwgdGhlIGhpZ2hlc3QgYml0IGlzIHNldCBpZiB0aGVcbiAgICAgZGVjb2RlIGlzIHZhbGlkLiBUaGUgdGhyZWUgbG93ZXIgYml0cyBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzXG4gICAgIGZyb20gdGhlIHNvdXJjZSB0aGF0IHdlcmUgY29uc3VtZWQgYnkgdGhlIGRlY29kZS5cbiAgIC0gW1VVVVVVVV0gaXMgdGhlIGRlY29kZWQgVW5pY29kZSBjaGFyYWN0ZXIgb3IgdGhlIFVuaWNvZGUgcmVwbGFjZW1lbnRcbiAgICAgY2hhcmFjdGVyIFUrRkZGRCBpZiBmb3IgaW52YWxpZCBkZWNvZGVzLiAqKVxuXG5sZXQgdmFsaWRfYml0ID0gMjdcbmxldCBkZWNvZGVfYml0cyA9IDI0XG5cbmxldFtAaW5saW5lXSB1dGZfZGVjb2RlX2lzX3ZhbGlkIGQgPSAoZCBsc3IgdmFsaWRfYml0KSA9IDFcbmxldFtAaW5saW5lXSB1dGZfZGVjb2RlX2xlbmd0aCBkID0gKGQgbHNyIGRlY29kZV9iaXRzKSBsYW5kIDBiMTExXG5sZXRbQGlubGluZV0gdXRmX2RlY29kZV91Y2hhciBkID0gdW5zYWZlX29mX2ludCAoZCBsYW5kIDB4RkZGRkZGKVxubGV0W0BpbmxpbmVdIHV0Zl9kZWNvZGUgbiB1ID0gKCg4IGxvciBuKSBsc2wgZGVjb2RlX2JpdHMpIGxvciAodG9faW50IHUpXG5sZXRbQGlubGluZV0gdXRmX2RlY29kZV9pbnZhbGlkIG4gPSAobiBsc2wgZGVjb2RlX2JpdHMpIGxvciByZXBcblxubGV0IHV0Zl84X2J5dGVfbGVuZ3RoIHUgPSBtYXRjaCB0b19pbnQgdSB3aXRoXG58IHUgd2hlbiB1IDwgMCAtPiBhc3NlcnQgZmFsc2VcbnwgdSB3aGVuIHUgPD0gMHgwMDdGIC0+IDFcbnwgdSB3aGVuIHUgPD0gMHgwN0ZGIC0+IDJcbnwgdSB3aGVuIHUgPD0gMHhGRkZGIC0+IDNcbnwgdSB3aGVuIHUgPD0gMHgxMEZGRkYgLT4gNFxufCBfIC0+IGFzc2VydCBmYWxzZVxuXG5sZXQgdXRmXzE2X2J5dGVfbGVuZ3RoIHUgPSBtYXRjaCB0b19pbnQgdSB3aXRoXG58IHUgd2hlbiB1IDwgMCAtPiBhc3NlcnQgZmFsc2VcbnwgdSB3aGVuIHUgPD0gMHhGRkZGIC0+IDJcbnwgdSB3aGVuIHUgPD0gMHgxMEZGRkYgLT4gNFxufCBfIC0+IGFzc2VydCBmYWxzZVxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2Zvcm1hdF9pbnQiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJnbG9iYWxfZGF0YSIsIkFzc2VydF9mYWlsdXJlIiwiU3RkbGliIiwic3VjYyIsInUiLCJwcmVkIiwiaXNfdmFsaWQiLCJpIiwib2ZfaW50IiwiaXNfY2hhciIsIm9mX2NoYXIiLCJjIiwidG9fY2hhciIsInVuc2FmZV90b19jaGFyIiwiZXF1YWwiLCJjb21wYXJlIiwiaGFzaCIsInV0Zl9kZWNvZGVfaXNfdmFsaWQiLCJkIiwidXRmX2RlY29kZV9sZW5ndGgiLCJ1dGZfZGVjb2RlX3VjaGFyIiwidXRmX2RlY29kZSIsIm4iLCJ1dGZfZGVjb2RlX2ludmFsaWQiLCJjc3RfdWNoYXJfbWwiLCJ1dGZfOF9ieXRlX2xlbmd0aCIsInV0Zl8xNl9ieXRlX2xlbmd0aCIsIlN0ZGxpYl9VY2hhciJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLFlBQUFDLEtBQUFDO0FBQUFBLElDaUNFO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBQ2dCO0FBQUEseUJBQ1g7QUFBQTtBQUFBLFlBQUFDLEtBQUFEO0FBQUFBLElBR0w7QUFBQTtBQUFBO0FBQUE7QUFBQSxnQkFDZ0I7QUFBQSx5QkFDWDtBQUFBO0FBQUEsWUFBQUUsU0FBQUM7QUFBQUEsUUFBQSxJQUVVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQTBEO0FBQUEsWUFBQUMsT0FBQUQ7QUFBQUEsSUFDekQsZ0JBQWdCO0FBQUE7QUFBQTtBQUFBLE9BeEJFO0FBQUEsZUFBakI7QUFBQSxJQXdCZ0Q7QUFBQTtBQUFBLFlBQUFFLFFBQUFMLEdBSW5ELHVCQUFPO0FBQUEsWUFBQU0sUUFBQUMsR0FDUCxTQUFXO0FBQUEsWUFBQUMsUUFBQVI7QUFBQUEsSUFFekIsYUFDQTtBQUFBO0FBQUE7QUFBQSxPQS9CNEI7QUFBQTtBQUFBLFNBQWtEO0FBQUEsSUE4QmhDLDhCQUM3QjtBQUFBO0FBQUEsWUFBQVMsZUFBQSxHRG5EbkI7QUFBQSxZQUFBQyxNQUFBO0FBQUEsT0FBQUMsVUFBQTtBQUFBLFlBQUFDLEtBQUE7QUFBQSxZQUFBQyxvQkFBQUMsR0N3RXFDLG9DQUFxQjtBQUFBLFlBQUFDLGtCQUFBRCxHQUN2QiwwQkFBOEI7QUFBQSxZQUFBRSxpQkFBQUYsR0FDL0Isb0JBQStCO0FBQUEsWUFBQUcsV0FBQUMsR0FBQWxCLEdBQ25DLHlCQUEwQztBQUFBLFlBQUFtQixtQkFBQUQsR0FDcEMsdUJBQTJCO0FBQUE7QUFBQSxJQUFBRSxlRDVFL0Q7QUFBQTtBQUFBO0FBQUEsWUFBQUMsa0JBQUFyQjtBQUFBQSxJQytFUyxVQUFTO0FBQUEsSUFDVCxhQUFlO0FBQUEsSUFDZixjQUFlO0FBQUEsSUFDZixlQUFlO0FBQUEsSUFDZjtBQUFBLEtBQ0Y7QUFBQSxJQURtQjtBQUFBLEdBQ1A7QUFBQSxXRHBGbkI7QUFBQSxZQUFBc0IsbUJBQUF0QjtBQUFBQSxJQ3VGUyxVQUFTO0FBQUEsSUFDVCxlQUFlO0FBQUEsSUFDZjtBQUFBLEtBQ0Y7QUFBQSxJQURtQjtBQUFBLEdBQ1A7QUFBQTtBQUFBLElBQUF1QjtBQUFBQSxNRDFGbkIiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoxMTMzMCwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9saXN0Lm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBBbiBhbGlhcyBmb3IgdGhlIHR5cGUgb2YgbGlzdHMuICopXG50eXBlICdhIHQgPSAnYSBsaXN0ID0gW10gfCAoOjopIG9mICdhICogJ2EgbGlzdFxuXG4oKiBMaXN0IG9wZXJhdGlvbnMgKilcblxubGV0IHJlYyBsZW5ndGhfYXV4IGxlbiA9IGZ1bmN0aW9uXG4gICAgW10gLT4gbGVuXG4gIHwgXzo6bCAtPiBsZW5ndGhfYXV4IChsZW4gKyAxKSBsXG5cbmxldCBsZW5ndGggbCA9IGxlbmd0aF9hdXggMCBsXG5cbmxldCBjb25zIGEgbCA9IGE6OmxcblxubGV0IGhkID0gZnVuY3Rpb25cbiAgICBbXSAtPiBmYWlsd2l0aCBcImhkXCJcbiAgfCBhOjpfIC0+IGFcblxubGV0IHRsID0gZnVuY3Rpb25cbiAgICBbXSAtPiBmYWlsd2l0aCBcInRsXCJcbiAgfCBfOjpsIC0+IGxcblxubGV0IG50aCBsIG4gPVxuICBpZiBuIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiTGlzdC5udGhcIiBlbHNlXG4gIGxldCByZWMgbnRoX2F1eCBsIG4gPVxuICAgIG1hdGNoIGwgd2l0aFxuICAgIHwgW10gLT4gZmFpbHdpdGggXCJudGhcIlxuICAgIHwgYTo6bCAtPiBpZiBuID0gMCB0aGVuIGEgZWxzZSBudGhfYXV4IGwgKG4tMSlcbiAgaW4gbnRoX2F1eCBsIG5cblxubGV0IG50aF9vcHQgbCBuID1cbiAgaWYgbiA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIkxpc3QubnRoXCIgZWxzZVxuICBsZXQgcmVjIG50aF9hdXggbCBuID1cbiAgICBtYXRjaCBsIHdpdGhcbiAgICB8IFtdIC0+IE5vbmVcbiAgICB8IGE6OmwgLT4gaWYgbiA9IDAgdGhlbiBTb21lIGEgZWxzZSBudGhfYXV4IGwgKG4tMSlcbiAgaW4gbnRoX2F1eCBsIG5cblxubGV0IGFwcGVuZCA9IChAKVxuXG5sZXQgcmVjIHJldl9hcHBlbmQgbDEgbDIgPVxuICBtYXRjaCBsMSB3aXRoXG4gICAgW10gLT4gbDJcbiAgfCBhIDo6IGwgLT4gcmV2X2FwcGVuZCBsIChhIDo6IGwyKVxuXG5sZXQgcmV2IGwgPSByZXZfYXBwZW5kIGwgW11cblxubGV0W0B0YWlsX21vZF9jb25zXSByZWMgaW5pdCBpIGxhc3QgZiA9XG4gIGlmIGkgPiBsYXN0IHRoZW4gW11cbiAgZWxzZSBpZiBpID0gbGFzdCB0aGVuIFtmIGldXG4gIGVsc2VcbiAgICBsZXQgcjEgPSBmIGkgaW5cbiAgICBsZXQgcjIgPSBmIChpKzEpIGluXG4gICAgcjEgOjogcjIgOjogaW5pdCAoaSsyKSBsYXN0IGZcblxubGV0IGluaXQgbGVuIGYgPVxuICBpZiBsZW4gPCAwIHRoZW4gaW52YWxpZF9hcmcgXCJMaXN0LmluaXRcIiBlbHNlXG4gIGluaXQgMCAobGVuIC0gMSkgZlxuXG5sZXQgcmVjIGZsYXR0ZW4gPSBmdW5jdGlvblxuICAgIFtdIC0+IFtdXG4gIHwgbDo6ciAtPiBsIEAgZmxhdHRlbiByXG5cbmxldCBjb25jYXQgPSBmbGF0dGVuXG5cbmxldFtAdGFpbF9tb2RfY29uc10gcmVjIG1hcCBmID0gZnVuY3Rpb25cbiAgICBbXSAtPiBbXVxuICB8IFthMV0gLT5cbiAgICAgIGxldCByMSA9IGYgYTEgaW5cbiAgICAgIFtyMV1cbiAgfCBhMTo6YTI6OmwgLT5cbiAgICAgIGxldCByMSA9IGYgYTEgaW5cbiAgICAgIGxldCByMiA9IGYgYTIgaW5cbiAgICAgIHIxOjpyMjo6bWFwIGYgbFxuXG5sZXRbQHRhaWxfbW9kX2NvbnNdIHJlYyBtYXBpIGkgZiA9IGZ1bmN0aW9uXG4gICAgW10gLT4gW11cbiAgfCBbYTFdIC0+XG4gICAgICBsZXQgcjEgPSBmIGkgYTEgaW5cbiAgICAgIFtyMV1cbiAgfCBhMTo6YTI6OmwgLT5cbiAgICAgIGxldCByMSA9IGYgaSBhMSBpblxuICAgICAgbGV0IHIyID0gZiAoaSsxKSBhMiBpblxuICAgICAgcjE6OnIyOjptYXBpIChpKzIpIGYgbFxuXG5sZXQgbWFwaSBmIGwgPSBtYXBpIDAgZiBsXG5cbmxldCByZXZfbWFwIGYgbCA9XG4gIGxldCByZWMgcm1hcF9mIGFjY3UgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gYWNjdVxuICAgIHwgYTo6bCAtPiBybWFwX2YgKGYgYSA6OiBhY2N1KSBsXG4gIGluXG4gIHJtYXBfZiBbXSBsXG5cblxubGV0IHJlYyBpdGVyIGYgPSBmdW5jdGlvblxuICAgIFtdIC0+ICgpXG4gIHwgYTo6bCAtPiBmIGE7IGl0ZXIgZiBsXG5cbmxldCByZWMgaXRlcmkgaSBmID0gZnVuY3Rpb25cbiAgICBbXSAtPiAoKVxuICB8IGE6OmwgLT4gZiBpIGE7IGl0ZXJpIChpICsgMSkgZiBsXG5cbmxldCBpdGVyaSBmIGwgPSBpdGVyaSAwIGYgbFxuXG5sZXQgcmVjIGZvbGRfbGVmdCBmIGFjY3UgbCA9XG4gIG1hdGNoIGwgd2l0aFxuICAgIFtdIC0+IGFjY3VcbiAgfCBhOjpsIC0+IGZvbGRfbGVmdCBmIChmIGFjY3UgYSkgbFxuXG5sZXQgcmVjIGZvbGRfcmlnaHQgZiBsIGFjY3UgPVxuICBtYXRjaCBsIHdpdGhcbiAgICBbXSAtPiBhY2N1XG4gIHwgYTo6bCAtPiBmIGEgKGZvbGRfcmlnaHQgZiBsIGFjY3UpXG5cbmxldFtAdGFpbF9tb2RfY29uc10gcmVjIG1hcDIgZiBsMSBsMiA9XG4gIG1hdGNoIChsMSwgbDIpIHdpdGhcbiAgICAoW10sIFtdKSAtPiBbXVxuICB8IChbYTFdLCBbYjFdKSAtPlxuICAgICAgbGV0IHIxID0gZiBhMSBiMSBpblxuICAgICAgW3IxXVxuICB8IChhMTo6YTI6OmwxLCBiMTo6YjI6OmwyKSAtPlxuICAgICAgbGV0IHIxID0gZiBhMSBiMSBpblxuICAgICAgbGV0IHIyID0gZiBhMiBiMiBpblxuICAgICAgcjE6OnIyOjptYXAyIGYgbDEgbDJcbiAgfCAoXywgXykgLT4gaW52YWxpZF9hcmcgXCJMaXN0Lm1hcDJcIlxuXG5sZXQgcmV2X21hcDIgZiBsMSBsMiA9XG4gIGxldCByZWMgcm1hcDJfZiBhY2N1IGwxIGwyID1cbiAgICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgfCAoW10sIFtdKSAtPiBhY2N1XG4gICAgfCAoYTE6OmwxLCBhMjo6bDIpIC0+IHJtYXAyX2YgKGYgYTEgYTIgOjogYWNjdSkgbDEgbDJcbiAgICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QucmV2X21hcDJcIlxuICBpblxuICBybWFwMl9mIFtdIGwxIGwyXG5cblxubGV0IHJlYyBpdGVyMiBmIGwxIGwyID1cbiAgbWF0Y2ggKGwxLCBsMikgd2l0aFxuICAgIChbXSwgW10pIC0+ICgpXG4gIHwgKGExOjpsMSwgYTI6OmwyKSAtPiBmIGExIGEyOyBpdGVyMiBmIGwxIGwyXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5pdGVyMlwiXG5cbmxldCByZWMgZm9sZF9sZWZ0MiBmIGFjY3UgbDEgbDIgPVxuICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgKFtdLCBbXSkgLT4gYWNjdVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gZm9sZF9sZWZ0MiBmIChmIGFjY3UgYTEgYTIpIGwxIGwyXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5mb2xkX2xlZnQyXCJcblxubGV0IHJlYyBmb2xkX3JpZ2h0MiBmIGwxIGwyIGFjY3UgPVxuICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgKFtdLCBbXSkgLT4gYWNjdVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gZiBhMSBhMiAoZm9sZF9yaWdodDIgZiBsMSBsMiBhY2N1KVxuICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QuZm9sZF9yaWdodDJcIlxuXG5sZXQgcmVjIGZvcl9hbGwgcCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gdHJ1ZVxuICB8IGE6OmwgLT4gcCBhICYmIGZvcl9hbGwgcCBsXG5cbmxldCByZWMgZXhpc3RzIHAgPSBmdW5jdGlvblxuICAgIFtdIC0+IGZhbHNlXG4gIHwgYTo6bCAtPiBwIGEgfHwgZXhpc3RzIHAgbFxuXG5sZXQgcmVjIGZvcl9hbGwyIHAgbDEgbDIgPVxuICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgKFtdLCBbXSkgLT4gdHJ1ZVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gcCBhMSBhMiAmJiBmb3JfYWxsMiBwIGwxIGwyXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5mb3JfYWxsMlwiXG5cbmxldCByZWMgZXhpc3RzMiBwIGwxIGwyID1cbiAgbWF0Y2ggKGwxLCBsMikgd2l0aFxuICAgIChbXSwgW10pIC0+IGZhbHNlXG4gIHwgKGExOjpsMSwgYTI6OmwyKSAtPiBwIGExIGEyIHx8IGV4aXN0czIgcCBsMSBsMlxuICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QuZXhpc3RzMlwiXG5cbmxldCByZWMgbWVtIHggPSBmdW5jdGlvblxuICAgIFtdIC0+IGZhbHNlXG4gIHwgYTo6bCAtPiBjb21wYXJlIGEgeCA9IDAgfHwgbWVtIHggbFxuXG5sZXQgcmVjIG1lbXEgeCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gZmFsc2VcbiAgfCBhOjpsIC0+IGEgPT0geCB8fCBtZW1xIHggbFxuXG5sZXQgcmVjIGFzc29jIHggPSBmdW5jdGlvblxuICAgIFtdIC0+IHJhaXNlIE5vdF9mb3VuZFxuICB8IChhLGIpOjpsIC0+IGlmIGNvbXBhcmUgYSB4ID0gMCB0aGVuIGIgZWxzZSBhc3NvYyB4IGxcblxubGV0IHJlYyBhc3NvY19vcHQgeCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gTm9uZVxuICB8IChhLGIpOjpsIC0+IGlmIGNvbXBhcmUgYSB4ID0gMCB0aGVuIFNvbWUgYiBlbHNlIGFzc29jX29wdCB4IGxcblxubGV0IHJlYyBhc3NxIHggPSBmdW5jdGlvblxuICAgIFtdIC0+IHJhaXNlIE5vdF9mb3VuZFxuICB8IChhLGIpOjpsIC0+IGlmIGEgPT0geCB0aGVuIGIgZWxzZSBhc3NxIHggbFxuXG5sZXQgcmVjIGFzc3Ffb3B0IHggPSBmdW5jdGlvblxuICAgIFtdIC0+IE5vbmVcbiAgfCAoYSxiKTo6bCAtPiBpZiBhID09IHggdGhlbiBTb21lIGIgZWxzZSBhc3NxX29wdCB4IGxcblxubGV0IHJlYyBtZW1fYXNzb2MgeCA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gZmFsc2VcbiAgfCAoYSwgXykgOjogbCAtPiBjb21wYXJlIGEgeCA9IDAgfHwgbWVtX2Fzc29jIHggbFxuXG5sZXQgcmVjIG1lbV9hc3NxIHggPSBmdW5jdGlvblxuICB8IFtdIC0+IGZhbHNlXG4gIHwgKGEsIF8pIDo6IGwgLT4gYSA9PSB4IHx8IG1lbV9hc3NxIHggbFxuXG5sZXQgcmVjIHJlbW92ZV9hc3NvYyB4ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBbXVxuICB8IChhLCBfIGFzIHBhaXIpIDo6IGwgLT5cbiAgICAgIGlmIGNvbXBhcmUgYSB4ID0gMCB0aGVuIGwgZWxzZSBwYWlyIDo6IHJlbW92ZV9hc3NvYyB4IGxcblxubGV0IHJlYyByZW1vdmVfYXNzcSB4ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBbXVxuICB8IChhLCBfIGFzIHBhaXIpIDo6IGwgLT4gaWYgYSA9PSB4IHRoZW4gbCBlbHNlIHBhaXIgOjogcmVtb3ZlX2Fzc3EgeCBsXG5cbmxldCByZWMgZmluZCBwID0gZnVuY3Rpb25cbiAgfCBbXSAtPiByYWlzZSBOb3RfZm91bmRcbiAgfCB4IDo6IGwgLT4gaWYgcCB4IHRoZW4geCBlbHNlIGZpbmQgcCBsXG5cbmxldCByZWMgZmluZF9vcHQgcCA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gTm9uZVxuICB8IHggOjogbCAtPiBpZiBwIHggdGhlbiBTb21lIHggZWxzZSBmaW5kX29wdCBwIGxcblxubGV0IGZpbmRfaW5kZXggcCA9XG4gIGxldCByZWMgYXV4IGkgPSBmdW5jdGlvblxuICAgIFtdIC0+IE5vbmVcbiAgICB8IGE6OmwgLT4gaWYgcCBhIHRoZW4gU29tZSBpIGVsc2UgYXV4IChpKzEpIGwgaW5cbiAgYXV4IDBcblxubGV0IHJlYyBmaW5kX21hcCBmID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBOb25lXG4gIHwgeCA6OiBsIC0+XG4gICAgIGJlZ2luIG1hdGNoIGYgeCB3aXRoXG4gICAgICAgfCBTb21lIF8gYXMgcmVzdWx0IC0+IHJlc3VsdFxuICAgICAgIHwgTm9uZSAtPiBmaW5kX21hcCBmIGxcbiAgICAgZW5kXG5cbmxldCBmaW5kX21hcGkgZiA9XG4gIGxldCByZWMgYXV4IGkgPSBmdW5jdGlvblxuICB8IFtdIC0+IE5vbmVcbiAgfCB4IDo6IGwgLT5cbiAgICAgYmVnaW4gbWF0Y2ggZiBpIHggd2l0aFxuICAgICAgIHwgU29tZSBfIGFzIHJlc3VsdCAtPiByZXN1bHRcbiAgICAgICB8IE5vbmUgLT4gYXV4IChpKzEpIGxcbiAgICAgZW5kIGluXG4gIGF1eCAwXG5cbmxldFtAdGFpbF9tb2RfY29uc10gcmVjIGZpbmRfYWxsIHAgPSBmdW5jdGlvblxuICB8IFtdIC0+IFtdXG4gIHwgeCA6OiBsIC0+IGlmIHAgeCB0aGVuIHggOjogZmluZF9hbGwgcCBsIGVsc2UgZmluZF9hbGwgcCBsXG5cbmxldCBmaWx0ZXIgPSBmaW5kX2FsbFxuXG5sZXRbQHRhaWxfbW9kX2NvbnNdIHJlYyBmaWx0ZXJpIHAgaSA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gW11cbiAgfCB4OjpsIC0+XG4gICAgICBsZXQgaScgPSBpICsgMSBpblxuICAgICAgaWYgcCBpIHggdGhlbiB4IDo6IGZpbHRlcmkgcCBpJyBsIGVsc2UgZmlsdGVyaSBwIGknIGxcblxubGV0IGZpbHRlcmkgcCBsID0gZmlsdGVyaSBwIDAgbFxuXG5sZXRbQHRhaWxfbW9kX2NvbnNdIHJlYyBmaWx0ZXJfbWFwIGYgPSBmdW5jdGlvblxuICB8IFtdIC0+IFtdXG4gIHwgeCA6OiBsIC0+XG4gICAgICBtYXRjaCBmIHggd2l0aFxuICAgICAgfCBOb25lIC0+IGZpbHRlcl9tYXAgZiBsXG4gICAgICB8IFNvbWUgdiAtPiB2IDo6IGZpbHRlcl9tYXAgZiBsXG5cbmxldFtAdGFpbF9tb2RfY29uc10gcmVjIGNvbmNhdF9tYXAgZiA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gW11cbiAgfCB4Ojp4cyAtPiBwcmVwZW5kX2NvbmNhdF9tYXAgKGYgeCkgZiB4c1xuYW5kW0B0YWlsX21vZF9jb25zXSBwcmVwZW5kX2NvbmNhdF9tYXAgeXMgZiB4cyA9XG4gIG1hdGNoIHlzIHdpdGhcbiAgfCBbXSAtPiBjb25jYXRfbWFwIGYgeHNcbiAgfCB5IDo6IHlzIC0+IHkgOjogcHJlcGVuZF9jb25jYXRfbWFwIHlzIGYgeHNcblxubGV0IGZvbGRfbGVmdF9tYXAgZiBhY2N1IGwgPVxuICBsZXQgcmVjIGF1eCBhY2N1IGxfYWNjdSA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiBhY2N1LCByZXYgbF9hY2N1XG4gICAgfCB4IDo6IGwgLT5cbiAgICAgICAgbGV0IGFjY3UsIHggPSBmIGFjY3UgeCBpblxuICAgICAgICBhdXggYWNjdSAoeCA6OiBsX2FjY3UpIGwgaW5cbiAgYXV4IGFjY3UgW10gbFxuXG5sZXQgcGFydGl0aW9uIHAgbCA9XG4gIGxldCByZWMgcGFydCB5ZXMgbm8gPSBmdW5jdGlvblxuICB8IFtdIC0+IChyZXYgeWVzLCByZXYgbm8pXG4gIHwgeCA6OiBsIC0+IGlmIHAgeCB0aGVuIHBhcnQgKHggOjogeWVzKSBubyBsIGVsc2UgcGFydCB5ZXMgKHggOjogbm8pIGwgaW5cbiAgcGFydCBbXSBbXSBsXG5cbmxldCBwYXJ0aXRpb25fbWFwIHAgbCA9XG4gIGxldCByZWMgcGFydCBsZWZ0IHJpZ2h0ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiAocmV2IGxlZnQsIHJldiByaWdodClcbiAgfCB4IDo6IGwgLT5cbiAgICAgYmVnaW4gbWF0Y2ggcCB4IHdpdGhcbiAgICAgICB8IEVpdGhlci5MZWZ0IHYgLT4gcGFydCAodiA6OiBsZWZ0KSByaWdodCBsXG4gICAgICAgfCBFaXRoZXIuUmlnaHQgdiAtPiBwYXJ0IGxlZnQgKHYgOjogcmlnaHQpIGxcbiAgICAgZW5kXG4gIGluXG4gIHBhcnQgW10gW10gbFxuXG5sZXQgcmVjIHNwbGl0ID0gZnVuY3Rpb25cbiAgICBbXSAtPiAoW10sIFtdKVxuICB8ICh4LHkpOjpsIC0+XG4gICAgICBsZXQgKHJ4LCByeSkgPSBzcGxpdCBsIGluICh4OjpyeCwgeTo6cnkpXG5cbmxldCByZWMgY29tYmluZSBsMSBsMiA9XG4gIG1hdGNoIChsMSwgbDIpIHdpdGhcbiAgICAoW10sIFtdKSAtPiBbXVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gKGExLCBhMikgOjogY29tYmluZSBsMSBsMlxuICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QuY29tYmluZVwiXG5cbigqKiBzb3J0aW5nICopXG5cbmxldCByZWMgbWVyZ2UgY21wIGwxIGwyID1cbiAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgfCBbXSwgbDIgLT4gbDJcbiAgfCBsMSwgW10gLT4gbDFcbiAgfCBoMSA6OiB0MSwgaDIgOjogdDIgLT5cbiAgICAgIGlmIGNtcCBoMSBoMiA8PSAwXG4gICAgICB0aGVuIGgxIDo6IG1lcmdlIGNtcCB0MSBsMlxuICAgICAgZWxzZSBoMiA6OiBtZXJnZSBjbXAgbDEgdDJcblxuXG5sZXQgc3RhYmxlX3NvcnQgY21wIGwgPVxuICBsZXQgcmVjIHJldl9tZXJnZSBsMSBsMiBhY2N1ID1cbiAgICBtYXRjaCBsMSwgbDIgd2l0aFxuICAgIHwgW10sIGwyIC0+IHJldl9hcHBlbmQgbDIgYWNjdVxuICAgIHwgbDEsIFtdIC0+IHJldl9hcHBlbmQgbDEgYWNjdVxuICAgIHwgaDE6OnQxLCBoMjo6dDIgLT5cbiAgICAgICAgaWYgY21wIGgxIGgyIDw9IDBcbiAgICAgICAgdGhlbiByZXZfbWVyZ2UgdDEgbDIgKGgxOjphY2N1KVxuICAgICAgICBlbHNlIHJldl9tZXJnZSBsMSB0MiAoaDI6OmFjY3UpXG4gIGluXG4gIGxldCByZWMgcmV2X21lcmdlX3JldiBsMSBsMiBhY2N1ID1cbiAgICBtYXRjaCBsMSwgbDIgd2l0aFxuICAgIHwgW10sIGwyIC0+IHJldl9hcHBlbmQgbDIgYWNjdVxuICAgIHwgbDEsIFtdIC0+IHJldl9hcHBlbmQgbDEgYWNjdVxuICAgIHwgaDE6OnQxLCBoMjo6dDIgLT5cbiAgICAgICAgaWYgY21wIGgxIGgyID4gMFxuICAgICAgICB0aGVuIHJldl9tZXJnZV9yZXYgdDEgbDIgKGgxOjphY2N1KVxuICAgICAgICBlbHNlIHJldl9tZXJnZV9yZXYgbDEgdDIgKGgyOjphY2N1KVxuICBpblxuICBsZXQgcmVjIHNvcnQgbiBsID1cbiAgICBtYXRjaCBuLCBsIHdpdGhcbiAgICB8IDIsIHgxIDo6IHgyIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID0gaWYgY21wIHgxIHgyIDw9IDAgdGhlbiBbeDE7IHgyXSBlbHNlIFt4MjsgeDFdIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IDMsIHgxIDo6IHgyIDo6IHgzIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBpZiBjbXAgeDEgeDIgPD0gMCB0aGVuXG4gICAgICAgICAgICBpZiBjbXAgeDIgeDMgPD0gMCB0aGVuIFt4MTsgeDI7IHgzXVxuICAgICAgICAgICAgZWxzZSBpZiBjbXAgeDEgeDMgPD0gMCB0aGVuIFt4MTsgeDM7IHgyXVxuICAgICAgICAgICAgZWxzZSBbeDM7IHgxOyB4Ml1cbiAgICAgICAgICBlbHNlIGlmIGNtcCB4MSB4MyA8PSAwIHRoZW4gW3gyOyB4MTsgeDNdXG4gICAgICAgICAgZWxzZSBpZiBjbXAgeDIgeDMgPD0gMCB0aGVuIFt4MjsgeDM7IHgxXVxuICAgICAgICAgIGVsc2UgW3gzOyB4MjsgeDFdXG4gICAgICAgIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IG4sIGwgLT5cbiAgICAgICAgbGV0IG4xID0gbiBhc3IgMSBpblxuICAgICAgICBsZXQgbjIgPSBuIC0gbjEgaW5cbiAgICAgICAgbGV0IHMxLCBsMiA9IHJldl9zb3J0IG4xIGwgaW5cbiAgICAgICAgbGV0IHMyLCB0bCA9IHJldl9zb3J0IG4yIGwyIGluXG4gICAgICAgIChyZXZfbWVyZ2VfcmV2IHMxIHMyIFtdLCB0bClcbiAgYW5kIHJldl9zb3J0IG4gbCA9XG4gICAgbWF0Y2ggbiwgbCB3aXRoXG4gICAgfCAyLCB4MSA6OiB4MiA6OiB0bCAtPlxuICAgICAgICBsZXQgcyA9IGlmIGNtcCB4MSB4MiA+IDAgdGhlbiBbeDE7IHgyXSBlbHNlIFt4MjsgeDFdIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IDMsIHgxIDo6IHgyIDo6IHgzIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBpZiBjbXAgeDEgeDIgPiAwIHRoZW5cbiAgICAgICAgICAgIGlmIGNtcCB4MiB4MyA+IDAgdGhlbiBbeDE7IHgyOyB4M11cbiAgICAgICAgICAgIGVsc2UgaWYgY21wIHgxIHgzID4gMCB0aGVuIFt4MTsgeDM7IHgyXVxuICAgICAgICAgICAgZWxzZSBbeDM7IHgxOyB4Ml1cbiAgICAgICAgICBlbHNlIGlmIGNtcCB4MSB4MyA+IDAgdGhlbiBbeDI7IHgxOyB4M11cbiAgICAgICAgICBlbHNlIGlmIGNtcCB4MiB4MyA+IDAgdGhlbiBbeDI7IHgzOyB4MV1cbiAgICAgICAgICBlbHNlIFt4MzsgeDI7IHgxXVxuICAgICAgICBpblxuICAgICAgICAocywgdGwpXG4gICAgfCBuLCBsIC0+XG4gICAgICAgIGxldCBuMSA9IG4gYXNyIDEgaW5cbiAgICAgICAgbGV0IG4yID0gbiAtIG4xIGluXG4gICAgICAgIGxldCBzMSwgbDIgPSBzb3J0IG4xIGwgaW5cbiAgICAgICAgbGV0IHMyLCB0bCA9IHNvcnQgbjIgbDIgaW5cbiAgICAgICAgKHJldl9tZXJnZSBzMSBzMiBbXSwgdGwpXG4gIGluXG4gIGxldCBsZW4gPSBsZW5ndGggbCBpblxuICBpZiBsZW4gPCAyIHRoZW4gbCBlbHNlIGZzdCAoc29ydCBsZW4gbClcblxuXG5sZXQgc29ydCA9IHN0YWJsZV9zb3J0XG5sZXQgZmFzdF9zb3J0ID0gc3RhYmxlX3NvcnRcblxuKCogTm90ZTogb24gYSB2ZXJ5IGxvbmcgbGlzdCAobGVuZ3RoIG92ZXIgYWJvdXQgMTAwMDAwKSwgaXQgdXNlZCB0byBiZVxuICAgZmFzdGVyIHRvIGNvbnZlcnQgdGhlIGxpc3QgdG8gYW4gYXJyYXksIHNvcnQgdGhlIGFycmF5LCBhbmQgY29udmVydFxuICAgYmFjaywgdHJ1bmNhdGluZyB0aGUgYXJyYXkgb2JqZWN0IGFmdGVyIHByZXBlbmRpbmcgZWFjaCB0aG91c2FuZFxuICAgZW50cmllcyB0byB0aGUgcmVzdWx0aW5nIGxpc3QuIEltcG9zc2libGUgbm93IHRoYXQgT2JqLnRydW5jYXRlIGhhc1xuICAgYmVlbiByZW1vdmVkLiAqKVxuXG4oKiogc29ydGluZyArIHJlbW92aW5nIGR1cGxpY2F0ZXMgKilcblxubGV0IHNvcnRfdW5pcSBjbXAgbCA9XG4gIGxldCByZWMgcmV2X21lcmdlIGwxIGwyIGFjY3UgPVxuICAgIG1hdGNoIGwxLCBsMiB3aXRoXG4gICAgfCBbXSwgbDIgLT4gcmV2X2FwcGVuZCBsMiBhY2N1XG4gICAgfCBsMSwgW10gLT4gcmV2X2FwcGVuZCBsMSBhY2N1XG4gICAgfCBoMTo6dDEsIGgyOjp0MiAtPlxuICAgICAgICBsZXQgYyA9IGNtcCBoMSBoMiBpblxuICAgICAgICBpZiBjID0gMCB0aGVuIHJldl9tZXJnZSB0MSB0MiAoaDE6OmFjY3UpXG4gICAgICAgIGVsc2UgaWYgYyA8IDBcbiAgICAgICAgdGhlbiByZXZfbWVyZ2UgdDEgbDIgKGgxOjphY2N1KVxuICAgICAgICBlbHNlIHJldl9tZXJnZSBsMSB0MiAoaDI6OmFjY3UpXG4gIGluXG4gIGxldCByZWMgcmV2X21lcmdlX3JldiBsMSBsMiBhY2N1ID1cbiAgICBtYXRjaCBsMSwgbDIgd2l0aFxuICAgIHwgW10sIGwyIC0+IHJldl9hcHBlbmQgbDIgYWNjdVxuICAgIHwgbDEsIFtdIC0+IHJldl9hcHBlbmQgbDEgYWNjdVxuICAgIHwgaDE6OnQxLCBoMjo6dDIgLT5cbiAgICAgICAgbGV0IGMgPSBjbXAgaDEgaDIgaW5cbiAgICAgICAgaWYgYyA9IDAgdGhlbiByZXZfbWVyZ2VfcmV2IHQxIHQyIChoMTo6YWNjdSlcbiAgICAgICAgZWxzZSBpZiBjID4gMFxuICAgICAgICB0aGVuIHJldl9tZXJnZV9yZXYgdDEgbDIgKGgxOjphY2N1KVxuICAgICAgICBlbHNlIHJldl9tZXJnZV9yZXYgbDEgdDIgKGgyOjphY2N1KVxuICBpblxuICBsZXQgcmVjIHNvcnQgbiBsID1cbiAgICBtYXRjaCBuLCBsIHdpdGhcbiAgICB8IDIsIHgxIDo6IHgyIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gxXSBlbHNlIGlmIGMgPCAwIHRoZW4gW3gxOyB4Ml0gZWxzZSBbeDI7IHgxXVxuICAgICAgICBpblxuICAgICAgICAocywgdGwpXG4gICAgfCAzLCB4MSA6OiB4MiA6OiB4MyA6OiB0bCAtPlxuICAgICAgICBsZXQgcyA9XG4gICAgICAgICAgbGV0IGMgPSBjbXAgeDEgeDIgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDJdIGVsc2UgaWYgYyA8IDAgdGhlbiBbeDI7IHgzXSBlbHNlIFt4MzsgeDJdXG4gICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDE7IHgyXVxuICAgICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuIFt4MTsgeDI7IHgzXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MyBpblxuICAgICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MTsgeDJdXG4gICAgICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlbiBbeDE7IHgzOyB4Ml1cbiAgICAgICAgICAgICAgZWxzZSBbeDM7IHgxOyB4Ml1cbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDI7IHgxXVxuICAgICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuIFt4MjsgeDE7IHgzXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MjsgeDFdXG4gICAgICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlbiBbeDI7IHgzOyB4MV1cbiAgICAgICAgICAgICAgZWxzZSBbeDM7IHgyOyB4MV1cbiAgICAgICAgaW5cbiAgICAgICAgKHMsIHRsKVxuICAgIHwgbiwgbCAtPlxuICAgICAgICBsZXQgbjEgPSBuIGFzciAxIGluXG4gICAgICAgIGxldCBuMiA9IG4gLSBuMSBpblxuICAgICAgICBsZXQgczEsIGwyID0gcmV2X3NvcnQgbjEgbCBpblxuICAgICAgICBsZXQgczIsIHRsID0gcmV2X3NvcnQgbjIgbDIgaW5cbiAgICAgICAgKHJldl9tZXJnZV9yZXYgczEgczIgW10sIHRsKVxuICBhbmQgcmV2X3NvcnQgbiBsID1cbiAgICBtYXRjaCBuLCBsIHdpdGhcbiAgICB8IDIsIHgxIDo6IHgyIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gxXSBlbHNlIGlmIGMgPiAwIHRoZW4gW3gxOyB4Ml0gZWxzZSBbeDI7IHgxXVxuICAgICAgICBpblxuICAgICAgICAocywgdGwpXG4gICAgfCAzLCB4MSA6OiB4MiA6OiB4MyA6OiB0bCAtPlxuICAgICAgICBsZXQgcyA9XG4gICAgICAgICAgbGV0IGMgPSBjbXAgeDEgeDIgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDJdIGVsc2UgaWYgYyA+IDAgdGhlbiBbeDI7IHgzXSBlbHNlIFt4MzsgeDJdXG4gICAgICAgICAgZWxzZSBpZiBjID4gMCB0aGVuXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDE7IHgyXVxuICAgICAgICAgICAgZWxzZSBpZiBjID4gMCB0aGVuIFt4MTsgeDI7IHgzXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MyBpblxuICAgICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MTsgeDJdXG4gICAgICAgICAgICAgIGVsc2UgaWYgYyA+IDAgdGhlbiBbeDE7IHgzOyB4Ml1cbiAgICAgICAgICAgICAgZWxzZSBbeDM7IHgxOyB4Ml1cbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDI7IHgxXVxuICAgICAgICAgICAgZWxzZSBpZiBjID4gMCB0aGVuIFt4MjsgeDE7IHgzXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MjsgeDFdXG4gICAgICAgICAgICAgIGVsc2UgaWYgYyA+IDAgdGhlbiBbeDI7IHgzOyB4MV1cbiAgICAgICAgICAgICAgZWxzZSBbeDM7IHgyOyB4MV1cbiAgICAgICAgaW5cbiAgICAgICAgKHMsIHRsKVxuICAgIHwgbiwgbCAtPlxuICAgICAgICBsZXQgbjEgPSBuIGFzciAxIGluXG4gICAgICAgIGxldCBuMiA9IG4gLSBuMSBpblxuICAgICAgICBsZXQgczEsIGwyID0gc29ydCBuMSBsIGluXG4gICAgICAgIGxldCBzMiwgdGwgPSBzb3J0IG4yIGwyIGluXG4gICAgICAgIChyZXZfbWVyZ2UgczEgczIgW10sIHRsKVxuICBpblxuICBsZXQgbGVuID0gbGVuZ3RoIGwgaW5cbiAgaWYgbGVuIDwgMiB0aGVuIGwgZWxzZSBmc3QgKHNvcnQgbGVuIGwpXG5cblxubGV0IHJlYyBjb21wYXJlX2xlbmd0aHMgbDEgbDIgPVxuICBtYXRjaCBsMSwgbDIgd2l0aFxuICB8IFtdLCBbXSAtPiAwXG4gIHwgW10sIF8gLT4gLTFcbiAgfCBfLCBbXSAtPiAxXG4gIHwgXyA6OiBsMSwgXyA6OiBsMiAtPiBjb21wYXJlX2xlbmd0aHMgbDEgbDJcblxubGV0IHJlYyBjb21wYXJlX2xlbmd0aF93aXRoIGwgbiA9XG4gIG1hdGNoIGwgd2l0aFxuICB8IFtdIC0+XG4gICAgaWYgbiA9IDAgdGhlbiAwIGVsc2VcbiAgICAgIGlmIG4gPiAwIHRoZW4gLTEgZWxzZSAxXG4gIHwgXyA6OiBsIC0+XG4gICAgaWYgbiA8PSAwIHRoZW4gMSBlbHNlXG4gICAgICBjb21wYXJlX2xlbmd0aF93aXRoIGwgKG4tMSlcblxubGV0IGlzX2VtcHR5ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiB0cnVlXG4gIHwgXyA6OiBfIC0+IGZhbHNlXG5cbigqKiB7MSBDb21wYXJpc29ufSAqKVxuXG4oKiBOb3RlOiB3ZSBhcmUgKm5vdCogc2hvcnRjdXR0aW5nIHRoZSBsaXN0IGJ5IHVzaW5nXG4gICBbTGlzdC5jb21wYXJlX2xlbmd0aHNdIGZpcnN0OyB0aGlzIG1heSBiZSBzbG93ZXIgb24gbG9uZyBsaXN0c1xuICAgaW1tZWRpYXRlbHkgc3RhcnQgd2l0aCBkaXN0aW5jdCBlbGVtZW50cy4gSXQgaXMgYWxzbyBpbmNvcnJlY3QgZm9yXG4gICBbY29tcGFyZV0gYmVsb3csIGFuZCBpdCBpcyBiZXR0ZXIgKHByaW5jaXBsZSBvZiBsZWFzdCBzdXJwcmlzZSkgdG9cbiAgIHVzZSB0aGUgc2FtZSBhcHByb2FjaCBmb3IgYm90aCBmdW5jdGlvbnMuICopXG5sZXQgcmVjIGVxdWFsIGVxIGwxIGwyID1cbiAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgfCBbXSwgW10gLT4gdHJ1ZVxuICB8IFtdLCBfOjpfIHwgXzo6XywgW10gLT4gZmFsc2VcbiAgfCBhMTo6bDEsIGEyOjpsMiAtPiBlcSBhMSBhMiAmJiBlcXVhbCBlcSBsMSBsMlxuXG5sZXQgcmVjIGNvbXBhcmUgY21wIGwxIGwyID1cbiAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgfCBbXSwgW10gLT4gMFxuICB8IFtdLCBfOjpfIC0+IC0xXG4gIHwgXzo6XywgW10gLT4gMVxuICB8IGExOjpsMSwgYTI6OmwyIC0+XG4gICAgbGV0IGMgPSBjbXAgYTEgYTIgaW5cbiAgICBpZiBjIDw+IDAgdGhlbiBjXG4gICAgZWxzZSBjb21wYXJlIGNtcCBsMSBsMlxuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIGwgPVxuICBsZXQgcmVjIGF1eCBsICgpID0gbWF0Y2ggbCB3aXRoXG4gICAgfCBbXSAtPiBTZXEuTmlsXG4gICAgfCB4IDo6IHRhaWwgLT4gU2VxLkNvbnMgKHgsIGF1eCB0YWlsKVxuICBpblxuICBhdXggbFxuXG5sZXRbQHRhaWxfbW9kX2NvbnNdIHJlYyBvZl9zZXEgc2VxID1cbiAgbWF0Y2ggc2VxICgpIHdpdGhcbiAgfCBTZXEuTmlsIC0+IFtdXG4gIHwgU2VxLkNvbnMgKHgxLCBzZXEpIC0+XG4gICAgICBiZWdpbiBtYXRjaCBzZXEgKCkgd2l0aFxuICAgICAgfCBTZXEuTmlsIC0+IFt4MV1cbiAgICAgIHwgU2VxLkNvbnMgKHgyLCBzZXEpIC0+IHgxIDo6IHgyIDo6IG9mX3NlcSBzZXFcbiAgICAgIGVuZFxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2NvbXBhcmUiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiY2FtbF9jYWxsMyIsImEyIiwiU3RkbGliIiwibGVuZ3RoIiwibCIsImxlbiIsInBhcmFtIiwiY29ucyIsImEiLCJoZCIsInRsIiwiY3N0X0xpc3RfbnRoIiwibnRoIiwibiIsIm50aF9vcHQiLCJhcHBlbmQiLCJyZXZfYXBwZW5kIiwibDEiLCJsMiIsInJldiIsImluaXQiLCJsYXN0IiwiaSIsInIxIiwicjIiLCJibG9jayIsImRzdCIsIm9mZnNldCIsImZsYXR0ZW4iLCJyIiwibWFwIiwibWF0Y2giLCJtYXBpIiwicmV2X21hcCIsImFjY3UiLCJpdGVyIiwiaXRlcmkiLCJmb2xkX2xlZnQiLCJmb2xkX3JpZ2h0IiwibWFwMiIsImNzdF9MaXN0X21hcDIiLCJiMiIsImIxIiwicmV2X21hcDIiLCJpdGVyMiIsImZvbGRfbGVmdDIiLCJmb2xkX3JpZ2h0MiIsImZvcl9hbGwiLCJwIiwiZXhpc3RzIiwiZm9yX2FsbDIiLCJleGlzdHMyIiwibWVtIiwieCIsIm1lbXEiLCJhc3NvYyIsImIiLCJhc3NvY19vcHQiLCJhc3NxIiwiYXNzcV9vcHQiLCJtZW1fYXNzb2MiLCJtZW1fYXNzcSIsInJlbW92ZV9hc3NvYyIsInBhaXIiLCJyZW1vdmVfYXNzcSIsImZpbmQiLCJmaW5kX29wdCIsImZpbmRfaW5kZXgiLCJmaW5kX21hcCIsInJlc3VsdCIsImZpbmRfbWFwaSIsImZpbmRfYWxsIiwiZmlsdGVyaSIsImZpbHRlcl9tYXAiLCJ2IiwiY29uY2F0X21hcCIsInhzIiwieXMiLCJ5IiwiZm9sZF9sZWZ0X21hcCIsImxfYWNjdSIsInBhcnRpdGlvbiIsInllcyIsIm5vIiwicGFydGl0aW9uX21hcCIsImxlZnQiLCJyaWdodCIsInNwbGl0IiwicnkiLCJyeCIsImNvbWJpbmUiLCJtZXJnZSIsImNtcCIsInQyIiwiaDIiLCJ0MSIsImgxIiwic3RhYmxlX3NvcnQiLCJzb3J0IiwieDIiLCJ4MSIsInMiLCJ4MyIsIm4xIiwibjIiLCJzMSIsInMyIiwicmV2X3NvcnQiLCJzb3J0X3VuaXEiLCJjIiwiY29tcGFyZV9sZW5ndGhzIiwiY29tcGFyZV9sZW5ndGhfd2l0aCIsImlzX2VtcHR5IiwiZXF1YWwiLCJlcSIsImNvbXBhcmUiLCJ0b19zZXEiLCJhdXgiLCJ0YWlsIiwib2Zfc2VxIiwic2VxIl0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLFlBQUFDLFdBQUFDLEdB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LEtBQWY7QUFBQTtBQUFBO0FBQUEsR0FDc0I7QUFBQSxZQUFBTyxPQUFBaEg7QUFBQUEsYUFBQWlILElBQUFqSCxHQUFBRTtBQUFBQSxLQUtMLFFBQ1Q7QUFBQSxTQUFBZ0gsT0FEUyxNQUFBakUsSUFBQTtBQUFBLEtBRW1CLDBCQUFSLHNCQUFRO0FBQUEsSUFBQztBQUFBLElBRXZDO0FBQUEsR0FBSztBQUFBLFlBQUFrRSxPQUFBQztBQUFBQSxRQUFBekYsUUFHQztBQUFBLElBQU0sWUFDQztBQUFBLFFBQUF5RixRQURELFVBQUFwQixLQUFBLFVBQUFyRSxVQUdJO0FBQUEsSUFBTSxjQUNMO0FBQUE7QUFBQSxLQUFBeUYsUUFESztBQUFBLEtBQUFyQixLQUFBO0FBQUEsS0FBQTFFLFFBRU07QUFBQSxLQUFBQyxNQUFZO0FBQUEsS0FBQUMsU0FBQTtBQUFBLEtBQUE2RixRQUFBO0FBQUE7QUFBQSxTQUFBekYsVUFMbEM7QUFBQSxLQUFNO0FBQUE7QUFBQSxPQUFBeUYsUUFBQTtBQUFBLE9BQUFwQixPQUFBO0FBQUEsT0FBQXJFLFVBR0k7QUFBQSxNQUFNO0FBQUEsV0FBQXlGLFFBQUEsWUFBQXJCLE9BQUEsWUFBQXpFLFFBRU07QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQURYO0FBQUE7QUFBQTtBQUFBLE1BSEo7QUFBQSxLQUlxQztBQUFBO0FBQUEsR0FDM0M7QUFBQSxHRHprQlQiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoxMjY3NiwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9pbnQubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgT0NhbWwgcHJvZ3JhbW1lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE4IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgdCA9IGludFxuXG5sZXQgemVybyA9IDBcbmxldCBvbmUgPSAxXG5sZXQgbWludXNfb25lID0gLTFcbmV4dGVybmFsIG5lZyA6IGludCAtPiBpbnQgPSBcIiVuZWdpbnRcIlxuZXh0ZXJuYWwgYWRkIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhZGRpbnRcIlxuZXh0ZXJuYWwgc3ViIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVzdWJpbnRcIlxuZXh0ZXJuYWwgbXVsIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVtdWxpbnRcIlxuZXh0ZXJuYWwgZGl2IDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVkaXZpbnRcIlxuZXh0ZXJuYWwgcmVtIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVtb2RpbnRcIlxuZXh0ZXJuYWwgc3VjYyA6IGludCAtPiBpbnQgPSBcIiVzdWNjaW50XCJcbmV4dGVybmFsIHByZWQgOiBpbnQgLT4gaW50ID0gXCIlcHJlZGludFwiXG5sZXQgYWJzIHggPSBpZiB4ID49IDAgdGhlbiB4IGVsc2UgLXhcbmxldCBtYXhfaW50ID0gKC0xKSBsc3IgMVxubGV0IG1pbl9pbnQgPSBtYXhfaW50ICsgMVxuZXh0ZXJuYWwgbG9nYW5kIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhbmRpbnRcIlxuZXh0ZXJuYWwgbG9nb3IgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW9yaW50XCJcbmV4dGVybmFsIGxvZ3hvciA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIleG9yaW50XCJcbmxldCBsb2dub3QgeCA9IGxvZ3hvciB4ICgtMSlcbmV4dGVybmFsIHNoaWZ0X2xlZnQgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWxzbGludFwiXG5leHRlcm5hbCBzaGlmdF9yaWdodCA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYXNyaW50XCJcbmV4dGVybmFsIHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWxzcmludFwiXG5sZXQgZXF1YWwgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSAoID0gKVxubGV0IGNvbXBhcmUgOiBpbnQgLT4gaW50IC0+IGludCA9IFN0ZGxpYi5jb21wYXJlXG5sZXQgbWluIHggeSA6IHQgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxubGV0IG1heCB4IHkgOiB0ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcbmV4dGVybmFsIHRvX2Zsb2F0IDogaW50IC0+IGZsb2F0ID0gXCIlZmxvYXRvZmludFwiXG5leHRlcm5hbCBvZl9mbG9hdCA6IGZsb2F0IC0+IGludCA9IFwiJWludG9mZmxvYXRcIlxuXG4oKlxuZXh0ZXJuYWwgaW50X29mX3N0cmluZyA6IHN0cmluZyAtPiBpbnQgPSBcImNhbWxfaW50X29mX3N0cmluZ1wiXG5sZXQgb2Zfc3RyaW5nIHMgPSB0cnkgU29tZSAoaW50X29mX3N0cmluZyBzKSB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG4qKVxuXG5leHRlcm5hbCBmb3JtYXRfaW50IDogc3RyaW5nIC0+IGludCAtPiBzdHJpbmcgPSBcImNhbWxfZm9ybWF0X2ludFwiXG5sZXQgdG9fc3RyaW5nIHggPSBmb3JtYXRfaW50IFwiJWRcIiB4XG5cbmV4dGVybmFsIHNlZWRlZF9oYXNoX3BhcmFtIDpcbiAgaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gaW50ID0gXCJjYW1sX2hhc2hcIiBbQEBub2FsbG9jXVxubGV0IHNlZWRlZF9oYXNoIHNlZWQgeCA9IHNlZWRlZF9oYXNoX3BhcmFtIDEwIDEwMCBzZWVkIHhcbmxldCBoYXNoIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgMCB4XG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfaGFzaCIsImFicyIsIngiLCJsb2dub3QiLCJlcXVhbCIsImNvbXBhcmUiLCJtaW4iLCJ5IiwibWF4IiwidG9fc3RyaW5nIiwic2VlZGVkX2hhc2giLCJzZWVkIiwiaGFzaCJdLCJtYXBwaW5ncyI6Ik9BQUFBLFVBQUEseUJBQUFDLFlBQUE7QUFBQSxZQUFBQyxJQUFBQyxHQzRCWSwyQkFBd0I7QUFBQSxZQUFBQyxPQUFBRCxHQU1yQixjQUFhO0FBQUEsWUFBQUUsTUFBQSxNRGxDNUI7QUFBQSxPQUFBQyxVQUFBO0FBQUEsWUFBQUMsSUFBQUosR0FBQUssR0N3Q2tCLHFCQUF1QjtBQUFBLFlBQUFDLElBQUFOLEdBQUFLLEdBQ3ZCLHFCQUF1QjtBQUFBLFlBQUFFLFVBQUFQLEdBVU47QUFBQSxZQUFBUSxZQUFBQyxNQUFBVCxHQUlWLGtDQUErQjtBQUFBLFlBQUFVLEtBQUFWLEdBQzNDLCtCQUE0QjtBQUFBLEdEeER6QyIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjEyNzE0LCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2J5dGVzLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBCeXRlIHNlcXVlbmNlIG9wZXJhdGlvbnMgKilcblxuKCogV0FSTklORzogU29tZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGFyZSBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCBmb3JcbiAgIGVmZmljaWVuY3kgcmVhc29ucy4gV2hlbiB5b3UgbW9kaWZ5IHRoZSBvbmUgaW4gdGhpcyBmaWxlIHlvdSBuZWVkIHRvXG4gICBtb2RpZnkgaXRzIGR1cGxpY2F0ZSBpbiBzdHJpbmcubWwuXG4gICBUaGVzZSBmdW5jdGlvbnMgaGF2ZSBhIFwiZHVwbGljYXRlZFwiIGNvbW1lbnQgYWJvdmUgdGhlaXIgZGVmaW5pdGlvbi5cbiopXG5cbmV4dGVybmFsIGxlbmd0aCA6IGJ5dGVzIC0+IGludCA9IFwiJWJ5dGVzX2xlbmd0aFwiXG5leHRlcm5hbCBzdHJpbmdfbGVuZ3RoIDogc3RyaW5nIC0+IGludCA9IFwiJXN0cmluZ19sZW5ndGhcIlxuZXh0ZXJuYWwgZ2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgPSBcIiVieXRlc19zYWZlX2dldFwiXG5leHRlcm5hbCBzZXQgOiBieXRlcyAtPiBpbnQgLT4gY2hhciAtPiB1bml0ID0gXCIlYnl0ZXNfc2FmZV9zZXRcIlxuZXh0ZXJuYWwgY3JlYXRlIDogaW50IC0+IGJ5dGVzID0gXCJjYW1sX2NyZWF0ZV9ieXRlc1wiXG5leHRlcm5hbCB1bnNhZmVfZ2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgPSBcIiVieXRlc191bnNhZmVfZ2V0XCJcbmV4dGVybmFsIHVuc2FmZV9zZXQgOiBieXRlcyAtPiBpbnQgLT4gY2hhciAtPiB1bml0ID0gXCIlYnl0ZXNfdW5zYWZlX3NldFwiXG5leHRlcm5hbCB1bnNhZmVfZmlsbCA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gY2hhciAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9maWxsX2J5dGVzXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIHVuc2FmZV90b19zdHJpbmcgOiBieXRlcyAtPiBzdHJpbmcgPSBcIiVieXRlc190b19zdHJpbmdcIlxuZXh0ZXJuYWwgdW5zYWZlX29mX3N0cmluZyA6IHN0cmluZyAtPiBieXRlcyA9IFwiJWJ5dGVzX29mX3N0cmluZ1wiXG5cbmV4dGVybmFsIHVuc2FmZV9ibGl0IDogYnl0ZXMgLT4gaW50IC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfYmxpdF9ieXRlc1wiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB1bnNhZmVfYmxpdF9zdHJpbmcgOiBzdHJpbmcgLT4gaW50IC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfYmxpdF9zdHJpbmdcIiBbQEBub2FsbG9jXVxuXG5sZXQgbWFrZSBuIGMgPVxuICBsZXQgcyA9IGNyZWF0ZSBuIGluXG4gIHVuc2FmZV9maWxsIHMgMCBuIGM7XG4gIHNcblxubGV0IGluaXQgbiBmID1cbiAgbGV0IHMgPSBjcmVhdGUgbiBpblxuICBmb3IgaSA9IDAgdG8gbiAtIDEgZG9cbiAgICB1bnNhZmVfc2V0IHMgaSAoZiBpKVxuICBkb25lO1xuICBzXG5cbmxldCBlbXB0eSA9IGNyZWF0ZSAwXG5cbmxldCBjb3B5IHMgPVxuICBsZXQgbGVuID0gbGVuZ3RoIHMgaW5cbiAgbGV0IHIgPSBjcmVhdGUgbGVuIGluXG4gIHVuc2FmZV9ibGl0IHMgMCByIDAgbGVuO1xuICByXG5cbmxldCB0b19zdHJpbmcgYiA9IHVuc2FmZV90b19zdHJpbmcgKGNvcHkgYilcbmxldCBvZl9zdHJpbmcgcyA9IGNvcHkgKHVuc2FmZV9vZl9zdHJpbmcgcylcblxubGV0IHN1YiBzIG9mcyBsZW4gPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gbGVuZ3RoIHMgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5zdWIgLyBCeXRlcy5zdWJcIlxuICBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBjcmVhdGUgbGVuIGluXG4gICAgdW5zYWZlX2JsaXQgcyBvZnMgciAwIGxlbjtcbiAgICByXG4gIGVuZFxuXG5sZXQgc3ViX3N0cmluZyBiIG9mcyBsZW4gPSB1bnNhZmVfdG9fc3RyaW5nIChzdWIgYiBvZnMgbGVuKVxuXG4oKiBhZGRpdGlvbiB3aXRoIGFuIG92ZXJmbG93IGNoZWNrICopXG5sZXQgKCsrKSBhIGIgPVxuICBsZXQgYyA9IGEgKyBiIGluXG4gIG1hdGNoIGEgPCAwLCBiIDwgMCwgYyA8IDAgd2l0aFxuICB8IHRydWUgLCB0cnVlICwgZmFsc2VcbiAgfCBmYWxzZSwgZmFsc2UsIHRydWUgIC0+IGludmFsaWRfYXJnIFwiQnl0ZXMuZXh0ZW5kXCIgKCogb3ZlcmZsb3cgKilcbiAgfCBfIC0+IGNcblxubGV0IGV4dGVuZCBzIGxlZnQgcmlnaHQgPVxuICBsZXQgbGVuID0gbGVuZ3RoIHMgKysgbGVmdCArKyByaWdodCBpblxuICBsZXQgciA9IGNyZWF0ZSBsZW4gaW5cbiAgbGV0IChzcmNvZmYsIGRzdG9mZikgPSBpZiBsZWZ0IDwgMCB0aGVuIC1sZWZ0LCAwIGVsc2UgMCwgbGVmdCBpblxuICBsZXQgY3B5bGVuID0gSW50Lm1pbiAobGVuZ3RoIHMgLSBzcmNvZmYpIChsZW4gLSBkc3RvZmYpIGluXG4gIGlmIGNweWxlbiA+IDAgdGhlbiB1bnNhZmVfYmxpdCBzIHNyY29mZiByIGRzdG9mZiBjcHlsZW47XG4gIHJcblxubGV0IGZpbGwgcyBvZnMgbGVuIGMgPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gbGVuZ3RoIHMgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5maWxsIC8gQnl0ZXMuZmlsbFwiXG4gIGVsc2UgdW5zYWZlX2ZpbGwgcyBvZnMgbGVuIGNcblxubGV0IGJsaXQgczEgb2ZzMSBzMiBvZnMyIGxlbiA9XG4gIGlmIGxlbiA8IDAgfHwgb2ZzMSA8IDAgfHwgb2ZzMSA+IGxlbmd0aCBzMSAtIGxlblxuICAgICAgICAgICAgIHx8IG9mczIgPCAwIHx8IG9mczIgPiBsZW5ndGggczIgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkJ5dGVzLmJsaXRcIlxuICBlbHNlIHVuc2FmZV9ibGl0IHMxIG9mczEgczIgb2ZzMiBsZW5cblxubGV0IGJsaXRfc3RyaW5nIHMxIG9mczEgczIgb2ZzMiBsZW4gPVxuICBpZiBsZW4gPCAwIHx8IG9mczEgPCAwIHx8IG9mczEgPiBzdHJpbmdfbGVuZ3RoIHMxIC0gbGVuXG4gICAgICAgICAgICAgfHwgb2ZzMiA8IDAgfHwgb2ZzMiA+IGxlbmd0aCBzMiAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiU3RyaW5nLmJsaXQgLyBCeXRlcy5ibGl0X3N0cmluZ1wiXG4gIGVsc2UgdW5zYWZlX2JsaXRfc3RyaW5nIHMxIG9mczEgczIgb2ZzMiBsZW5cblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBpdGVyIGYgYSA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG8gZih1bnNhZmVfZ2V0IGEgaSkgZG9uZVxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGl0ZXJpIGYgYSA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG8gZiBpICh1bnNhZmVfZ2V0IGEgaSkgZG9uZVxuXG5sZXQgZW5zdXJlX2dlICh4OmludCkgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSBpbnZhbGlkX2FyZyBcIkJ5dGVzLmNvbmNhdFwiXG5cbmxldCByZWMgc3VtX2xlbmd0aHMgYWNjIHNlcGxlbiA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gYWNjXG4gIHwgaGQgOjogW10gLT4gbGVuZ3RoIGhkICsgYWNjXG4gIHwgaGQgOjogdGwgLT4gc3VtX2xlbmd0aHMgKGVuc3VyZV9nZSAobGVuZ3RoIGhkICsgc2VwbGVuICsgYWNjKSBhY2MpIHNlcGxlbiB0bFxuXG5sZXQgcmVjIHVuc2FmZV9ibGl0cyBkc3QgcG9zIHNlcCBzZXBsZW4gPSBmdW5jdGlvblxuICAgIFtdIC0+IGRzdFxuICB8IGhkIDo6IFtdIC0+XG4gICAgdW5zYWZlX2JsaXQgaGQgMCBkc3QgcG9zIChsZW5ndGggaGQpOyBkc3RcbiAgfCBoZCA6OiB0bCAtPlxuICAgIHVuc2FmZV9ibGl0IGhkIDAgZHN0IHBvcyAobGVuZ3RoIGhkKTtcbiAgICB1bnNhZmVfYmxpdCBzZXAgMCBkc3QgKHBvcyArIGxlbmd0aCBoZCkgc2VwbGVuO1xuICAgIHVuc2FmZV9ibGl0cyBkc3QgKHBvcyArIGxlbmd0aCBoZCArIHNlcGxlbikgc2VwIHNlcGxlbiB0bFxuXG5sZXQgY29uY2F0IHNlcCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gZW1wdHlcbiAgfCBsIC0+IGxldCBzZXBsZW4gPSBsZW5ndGggc2VwIGluXG4gICAgICAgICAgdW5zYWZlX2JsaXRzXG4gICAgICAgICAgICAoY3JlYXRlIChzdW1fbGVuZ3RocyAwIHNlcGxlbiBsKSlcbiAgICAgICAgICAgIDAgc2VwIHNlcGxlbiBsXG5cbmxldCBjYXQgczEgczIgPVxuICBsZXQgbDEgPSBsZW5ndGggczEgaW5cbiAgbGV0IGwyID0gbGVuZ3RoIHMyIGluXG4gIGxldCByID0gY3JlYXRlIChsMSArIGwyKSBpblxuICB1bnNhZmVfYmxpdCBzMSAwIHIgMCBsMTtcbiAgdW5zYWZlX2JsaXQgczIgMCByIGwxIGwyO1xuICByXG5cblxuZXh0ZXJuYWwgY2hhcl9jb2RlOiBjaGFyIC0+IGludCA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGNoYXJfY2hyOiBpbnQgLT4gY2hhciA9IFwiJWlkZW50aXR5XCJcblxubGV0IGlzX3NwYWNlID0gZnVuY3Rpb25cbiAgfCAnICcgfCAnXFwwMTInIHwgJ1xcbicgfCAnXFxyJyB8ICdcXHQnIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG5cbmxldCB0cmltIHMgPVxuICBsZXQgbGVuID0gbGVuZ3RoIHMgaW5cbiAgbGV0IGkgPSByZWYgMCBpblxuICB3aGlsZSAhaSA8IGxlbiAmJiBpc19zcGFjZSAodW5zYWZlX2dldCBzICFpKSBkb1xuICAgIGluY3IgaVxuICBkb25lO1xuICBsZXQgaiA9IHJlZiAobGVuIC0gMSkgaW5cbiAgd2hpbGUgIWogPj0gIWkgJiYgaXNfc3BhY2UgKHVuc2FmZV9nZXQgcyAhaikgZG9cbiAgICBkZWNyIGpcbiAgZG9uZTtcbiAgaWYgIWogPj0gIWkgdGhlblxuICAgIHN1YiBzICFpICghaiAtICFpICsgMSlcbiAgZWxzZVxuICAgIGVtcHR5XG5cbmxldCB1bnNhZmVfZXNjYXBlIHMgPVxuICAoKiBXZSBwZXJmb3JtIHR3byBwYXNzZXMgb24gdGhlIGlucHV0IHNlcXVlbmNlLCBvbmUgdG8gY29tcHV0ZSB0aGVcbiAgICAgcmVzdWx0IHNpemUgYW5kIG9uZSB0byB3cml0ZSB0aGUgcmVzdWx0LlxuXG4gICAgICMxMTUwOCwgIzExNTA5OiBUaGlzIGxvZ2ljIHdvdWxkIGJlIGluY29ycmVjdCBpbiBwcmVzZW5jZSBvZlxuICAgICBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiB0byB0aGUgaW5wdXQsIG1ha2luZyB0aGUgdXNlIG9mXG4gICAgIFt1bnNhZmVfc2V0XSBiZWxvdyBtZW1vcnktdW5zYWZlLlxuXG4gICAgIFByZWNvbmRpdGlvbjogVGhpcyBmdW5jdGlvbiBtYXkgYmUgc2FmZWx5IGNhbGxlZCBvbjpcbiAgICAgLSBhbiBpbW11dGFibGUgYnl0ZSBzZXF1ZW5jZVxuICAgICAtIGEgdW5pcXVlbHktb3duZWQgYnl0ZSBzZXF1ZW5jZSAodGhlIGZ1bmN0aW9uIHRha2VzIG93bmVyc2hpcClcblxuICAgICBJbiBlaXRoZXIgY2FzZSB3ZSByZXR1cm4gYSB1bmlxdWVseS1vd25lZCBieXRlIHNlcXVlbmNlLlxuICAqKVxuICBsZXQgbiA9IHJlZiAwIGluXG4gIGZvciBpID0gMCB0byBsZW5ndGggcyAtIDEgZG9cbiAgICBuIDo9ICFuICtcbiAgICAgIChtYXRjaCB1bnNhZmVfZ2V0IHMgaSB3aXRoXG4gICAgICAgfCAnXFxcIicgfCAnXFxcXCcgfCAnXFxuJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxiJyAtPiAyXG4gICAgICAgfCAnICcgLi4gJ34nIC0+IDFcbiAgICAgICB8IF8gLT4gNClcbiAgZG9uZTtcbiAgaWYgIW4gPSBsZW5ndGggcyB0aGVuIHNcbiAgZWxzZSBiZWdpblxuICAgIGxldCBzJyA9IGNyZWF0ZSAhbiBpblxuICAgIG4gOj0gMDtcbiAgICBmb3IgaSA9IDAgdG8gbGVuZ3RoIHMgLSAxIGRvXG4gICAgICBiZWdpbiBtYXRjaCB1bnNhZmVfZ2V0IHMgaSB3aXRoXG4gICAgICB8ICgnXFxcIicgfCAnXFxcXCcpIGFzIGMgLT5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJzsgaW5jciBuOyB1bnNhZmVfc2V0IHMnICFuIGNcbiAgICAgIHwgJ1xcbicgLT5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJzsgaW5jciBuOyB1bnNhZmVfc2V0IHMnICFuICduJ1xuICAgICAgfCAnXFx0JyAtPlxuICAgICAgICAgIHVuc2FmZV9zZXQgcycgIW4gJ1xcXFwnOyBpbmNyIG47IHVuc2FmZV9zZXQgcycgIW4gJ3QnXG4gICAgICB8ICdcXHInIC0+XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAnXFxcXCc7IGluY3IgbjsgdW5zYWZlX3NldCBzJyAhbiAncidcbiAgICAgIHwgJ1xcYicgLT5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJzsgaW5jciBuOyB1bnNhZmVfc2V0IHMnICFuICdiJ1xuICAgICAgfCAoJyAnIC4uICd+JykgYXMgYyAtPiB1bnNhZmVfc2V0IHMnICFuIGNcbiAgICAgIHwgYyAtPlxuICAgICAgICAgIGxldCBhID0gY2hhcl9jb2RlIGMgaW5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJztcbiAgICAgICAgICBpbmNyIG47XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAoY2hhcl9jaHIgKDQ4ICsgYSAvIDEwMCkpO1xuICAgICAgICAgIGluY3IgbjtcbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuIChjaGFyX2NociAoNDggKyAoYSAvIDEwKSBtb2QgMTApKTtcbiAgICAgICAgICBpbmNyIG47XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAoY2hhcl9jaHIgKDQ4ICsgYSBtb2QgMTApKTtcbiAgICAgIGVuZDtcbiAgICAgIGluY3IgblxuICAgIGRvbmU7XG4gICAgcydcbiAgZW5kXG5cbmxldCBlc2NhcGVkIGIgPVxuICBsZXQgYiA9IGNvcHkgYiBpblxuICAoKiBXZSBjb3B5IG91ciBpbnB1dCB0byBvYnRhaW4gYSB1bmlxdWVseS1vd25lZCBieXRlIHNlcXVlbmNlIFtiXVxuICAgICB0byBzYXRpc2Z5IFt1bnNhZmVfZXNjYXBlXSdzIHByZWNvbmRpdGlvbiAqKVxuICB1bnNhZmVfZXNjYXBlIGJcblxubGV0IG1hcCBmIHMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGwgPSAwIHRoZW4gcyBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBjcmVhdGUgbCBpblxuICAgIGZvciBpID0gMCB0byBsIC0gMSBkbyB1bnNhZmVfc2V0IHIgaSAoZiAodW5zYWZlX2dldCBzIGkpKSBkb25lO1xuICAgIHJcbiAgZW5kXG5cbmxldCBtYXBpIGYgcyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgbCA9IDAgdGhlbiBzIGVsc2UgYmVnaW5cbiAgICBsZXQgciA9IGNyZWF0ZSBsIGluXG4gICAgZm9yIGkgPSAwIHRvIGwgLSAxIGRvIHVuc2FmZV9zZXQgciBpIChmIGkgKHVuc2FmZV9nZXQgcyBpKSkgZG9uZTtcbiAgICByXG4gIGVuZFxuXG5sZXQgZm9sZF9sZWZ0IGYgeCBhID1cbiAgbGV0IHIgPSByZWYgeCBpblxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvXG4gICAgciA6PSBmICFyICh1bnNhZmVfZ2V0IGEgaSlcbiAgZG9uZTtcbiAgIXJcblxubGV0IGZvbGRfcmlnaHQgZiBhIHggPVxuICBsZXQgciA9IHJlZiB4IGluXG4gIGZvciBpID0gbGVuZ3RoIGEgLSAxIGRvd250byAwIGRvXG4gICAgciA6PSBmICh1bnNhZmVfZ2V0IGEgaSkgIXJcbiAgZG9uZTtcbiAgIXJcblxubGV0IGV4aXN0cyBwIHMgPVxuICBsZXQgbiA9IGxlbmd0aCBzIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IHMgaSkgdGhlbiB0cnVlXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgZm9yX2FsbCBwIHMgPVxuICBsZXQgbiA9IGxlbmd0aCBzIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIHRydWVcbiAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgcyBpKSB0aGVuIGxvb3AgKHN1Y2MgaSlcbiAgICBlbHNlIGZhbHNlIGluXG4gIGxvb3AgMFxuXG5sZXQgdXBwZXJjYXNlX2FzY2lpIHMgPSBtYXAgQ2hhci51cHBlcmNhc2VfYXNjaWkgc1xubGV0IGxvd2VyY2FzZV9hc2NpaSBzID0gbWFwIENoYXIubG93ZXJjYXNlX2FzY2lpIHNcblxubGV0IGFwcGx5MSBmIHMgPVxuICBpZiBsZW5ndGggcyA9IDAgdGhlbiBzIGVsc2UgYmVnaW5cbiAgICBsZXQgciA9IGNvcHkgcyBpblxuICAgIHVuc2FmZV9zZXQgciAwIChmKHVuc2FmZV9nZXQgcyAwKSk7XG4gICAgclxuICBlbmRcblxubGV0IGNhcGl0YWxpemVfYXNjaWkgcyA9IGFwcGx5MSBDaGFyLnVwcGVyY2FzZV9hc2NpaSBzXG5sZXQgdW5jYXBpdGFsaXplX2FzY2lpIHMgPSBhcHBseTEgQ2hhci5sb3dlcmNhc2VfYXNjaWkgc1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHN0YXJ0c193aXRoIH5wcmVmaXggcyA9XG4gIGxldCBsZW5fcyA9IGxlbmd0aCBzXG4gIGFuZCBsZW5fcHJlID0gbGVuZ3RoIHByZWZpeCBpblxuICBsZXQgcmVjIGF1eCBpID1cbiAgICBpZiBpID0gbGVuX3ByZSB0aGVuIHRydWVcbiAgICBlbHNlIGlmIHVuc2FmZV9nZXQgcyBpIDw+IHVuc2FmZV9nZXQgcHJlZml4IGkgdGhlbiBmYWxzZVxuICAgIGVsc2UgYXV4IChpICsgMSlcbiAgaW4gbGVuX3MgPj0gbGVuX3ByZSAmJiBhdXggMFxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGVuZHNfd2l0aCB+c3VmZml4IHMgPVxuICBsZXQgbGVuX3MgPSBsZW5ndGggc1xuICBhbmQgbGVuX3N1ZiA9IGxlbmd0aCBzdWZmaXggaW5cbiAgbGV0IGRpZmYgPSBsZW5fcyAtIGxlbl9zdWYgaW5cbiAgbGV0IHJlYyBhdXggaSA9XG4gICAgaWYgaSA9IGxlbl9zdWYgdGhlbiB0cnVlXG4gICAgZWxzZSBpZiB1bnNhZmVfZ2V0IHMgKGRpZmYgKyBpKSA8PiB1bnNhZmVfZ2V0IHN1ZmZpeCBpIHRoZW4gZmFsc2VcbiAgICBlbHNlIGF1eCAoaSArIDEpXG4gIGluIGRpZmYgPj0gMCAmJiBhdXggMFxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJlYyBpbmRleF9yZWMgcyBsaW0gaSBjID1cbiAgaWYgaSA+PSBsaW0gdGhlbiByYWlzZSBOb3RfZm91bmQgZWxzZVxuICBpZiB1bnNhZmVfZ2V0IHMgaSA9IGMgdGhlbiBpIGVsc2UgaW5kZXhfcmVjIHMgbGltIChpICsgMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGluZGV4IHMgYyA9IGluZGV4X3JlYyBzIChsZW5ndGggcykgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmVjIGluZGV4X3JlY19vcHQgcyBsaW0gaSBjID1cbiAgaWYgaSA+PSBsaW0gdGhlbiBOb25lIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gU29tZSBpIGVsc2UgaW5kZXhfcmVjX29wdCBzIGxpbSAoaSArIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBpbmRleF9vcHQgcyBjID0gaW5kZXhfcmVjX29wdCBzIChsZW5ndGggcykgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgaW5kZXhfZnJvbSBzIGkgYyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IGwgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5pbmRleF9mcm9tIC8gQnl0ZXMuaW5kZXhfZnJvbVwiIGVsc2VcbiAgaW5kZXhfcmVjIHMgbCBpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBpbmRleF9mcm9tX29wdCBzIGkgYyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IGwgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLmluZGV4X2Zyb21fb3B0IC8gQnl0ZXMuaW5kZXhfZnJvbV9vcHRcIlxuICBlbHNlXG4gICAgaW5kZXhfcmVjX29wdCBzIGwgaSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmVjIHJpbmRleF9yZWMgcyBpIGMgPVxuICBpZiBpIDwgMCB0aGVuIHJhaXNlIE5vdF9mb3VuZCBlbHNlXG4gIGlmIHVuc2FmZV9nZXQgcyBpID0gYyB0aGVuIGkgZWxzZSByaW5kZXhfcmVjIHMgKGkgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmluZGV4IHMgYyA9IHJpbmRleF9yZWMgcyAobGVuZ3RoIHMgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmluZGV4X2Zyb20gcyBpIGMgPVxuICBpZiBpIDwgLTEgfHwgaSA+PSBsZW5ndGggcyB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcucmluZGV4X2Zyb20gLyBCeXRlcy5yaW5kZXhfZnJvbVwiXG4gIGVsc2VcbiAgICByaW5kZXhfcmVjIHMgaSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmVjIHJpbmRleF9yZWNfb3B0IHMgaSBjID1cbiAgaWYgaSA8IDAgdGhlbiBOb25lIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gU29tZSBpIGVsc2UgcmluZGV4X3JlY19vcHQgcyAoaSAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCByaW5kZXhfb3B0IHMgYyA9IHJpbmRleF9yZWNfb3B0IHMgKGxlbmd0aCBzIC0gMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJpbmRleF9mcm9tX29wdCBzIGkgYyA9XG4gIGlmIGkgPCAtMSB8fCBpID49IGxlbmd0aCBzIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5yaW5kZXhfZnJvbV9vcHQgLyBCeXRlcy5yaW5kZXhfZnJvbV9vcHRcIlxuICBlbHNlXG4gICAgcmluZGV4X3JlY19vcHQgcyBpIGNcblxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGNvbnRhaW5zX2Zyb20gcyBpIGMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBsIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5jb250YWluc19mcm9tIC8gQnl0ZXMuY29udGFpbnNfZnJvbVwiXG4gIGVsc2VcbiAgICB0cnkgaWdub3JlIChpbmRleF9yZWMgcyBsIGkgYyk7IHRydWUgd2l0aCBOb3RfZm91bmQgLT4gZmFsc2VcblxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGNvbnRhaW5zIHMgYyA9IGNvbnRhaW5zX2Zyb20gcyAwIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCByY29udGFpbnNfZnJvbSBzIGkgYyA9XG4gIGlmIGkgPCAwIHx8IGkgPj0gbGVuZ3RoIHMgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLnJjb250YWluc19mcm9tIC8gQnl0ZXMucmNvbnRhaW5zX2Zyb21cIlxuICBlbHNlXG4gICAgdHJ5IGlnbm9yZSAocmluZGV4X3JlYyBzIGkgYyk7IHRydWUgd2l0aCBOb3RfZm91bmQgLT4gZmFsc2VcblxuXG50eXBlIHQgPSBieXRlc1xuXG5sZXQgY29tcGFyZSAoeDogdCkgKHk6IHQpID0gU3RkbGliLmNvbXBhcmUgeCB5XG5leHRlcm5hbCBlcXVhbCA6IHQgLT4gdCAtPiBib29sID0gXCJjYW1sX2J5dGVzX2VxdWFsXCIgW0BAbm9hbGxvY11cblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBzcGxpdF9vbl9jaGFyIHNlcCBzID1cbiAgbGV0IHIgPSByZWYgW10gaW5cbiAgbGV0IGogPSByZWYgKGxlbmd0aCBzKSBpblxuICBmb3IgaSA9IGxlbmd0aCBzIC0gMSBkb3dudG8gMCBkb1xuICAgIGlmIHVuc2FmZV9nZXQgcyBpID0gc2VwIHRoZW4gYmVnaW5cbiAgICAgIHIgOj0gc3ViIHMgKGkgKyAxKSAoIWogLSBpIC0gMSkgOjogIXI7XG4gICAgICBqIDo9IGlcbiAgICBlbmRcbiAgZG9uZTtcbiAgc3ViIHMgMCAhaiA6OiAhclxuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIHMgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICBpZiBpID0gbGVuZ3RoIHMgdGhlbiBTZXEuTmlsXG4gICAgZWxzZVxuICAgICAgbGV0IHggPSBnZXQgcyBpIGluXG4gICAgICBTZXEuQ29ucyAoeCwgYXV4IChpKzEpKVxuICBpblxuICBhdXggMFxuXG5sZXQgdG9fc2VxaSBzID1cbiAgbGV0IHJlYyBhdXggaSAoKSA9XG4gICAgaWYgaSA9IGxlbmd0aCBzIHRoZW4gU2VxLk5pbFxuICAgIGVsc2VcbiAgICAgIGxldCB4ID0gZ2V0IHMgaSBpblxuICAgICAgU2VxLkNvbnMgKChpLHgpLCBhdXggKGkrMSkpXG4gIGluXG4gIGF1eCAwXG5cbmxldCBvZl9zZXEgaSA9XG4gIGxldCBuID0gcmVmIDAgaW5cbiAgbGV0IGJ1ZiA9IHJlZiAobWFrZSAyNTYgJ1xcMDAwJykgaW5cbiAgbGV0IHJlc2l6ZSAoKSA9XG4gICAgKCogcmVzaXplICopXG4gICAgbGV0IG5ld19sZW4gPSBJbnQubWluICgyICogbGVuZ3RoICFidWYpIFN5cy5tYXhfc3RyaW5nX2xlbmd0aCBpblxuICAgIGlmIGxlbmd0aCAhYnVmID0gbmV3X2xlbiB0aGVuIGZhaWx3aXRoIFwiQnl0ZXMub2Zfc2VxOiBjYW5ub3QgZ3JvdyBieXRlc1wiO1xuICAgIGxldCBuZXdfYnVmID0gbWFrZSBuZXdfbGVuICdcXDAwMCcgaW5cbiAgICBibGl0ICFidWYgMCBuZXdfYnVmIDAgIW47XG4gICAgYnVmIDo9IG5ld19idWZcbiAgaW5cbiAgU2VxLml0ZXJcbiAgICAoZnVuIGMgLT5cbiAgICAgICBpZiAhbiA9IGxlbmd0aCAhYnVmIHRoZW4gcmVzaXplKCk7XG4gICAgICAgc2V0ICFidWYgIW4gYztcbiAgICAgICBpbmNyIG4pXG4gICAgaTtcbiAgc3ViICFidWYgMCAhblxuXG4oKiogezYgQmluYXJ5IGVuY29kaW5nL2RlY29kaW5nIG9mIGludGVnZXJzfSAqKVxuXG4oKiBUaGUgZ2V0XyBmdW5jdGlvbnMgYXJlIGFsbCBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxuXG5leHRlcm5hbCB1bnNhZmVfZ2V0X3VpbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCA9IFwiJWJ5dGVzX3Vuc2FmZV9nZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX2dldF91aW50MTZfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50ID0gXCIlY2FtbF9ieXRlc19nZXQxNnVcIlxuZXh0ZXJuYWwgZ2V0X3VpbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCA9IFwiJWJ5dGVzX3NhZmVfZ2V0XCJcbmV4dGVybmFsIGdldF91aW50MTZfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50ID0gXCIlY2FtbF9ieXRlc19nZXQxNlwiXG5leHRlcm5hbCBnZXRfaW50MzJfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50MzIgPSBcIiVjYW1sX2J5dGVzX2dldDMyXCJcbmV4dGVybmFsIGdldF9pbnQ2NF9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQ2NCA9IFwiJWNhbWxfYnl0ZXNfZ2V0NjRcIlxuXG5leHRlcm5hbCB1bnNhZmVfc2V0X3VpbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCIlYnl0ZXNfdW5zYWZlX3NldFwiXG5leHRlcm5hbCB1bnNhZmVfc2V0X3VpbnQxNl9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcIiVjYW1sX2J5dGVzX3NldDE2dVwiXG5leHRlcm5hbCBzZXRfaW50OCA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiJWJ5dGVzX3NhZmVfc2V0XCJcbmV4dGVybmFsIHNldF9pbnQxNl9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0MTZcIlxuZXh0ZXJuYWwgc2V0X2ludDMyX25lIDogYnl0ZXMgLT4gaW50IC0+IGludDMyIC0+IHVuaXQgPSBcIiVjYW1sX2J5dGVzX3NldDMyXCJcbmV4dGVybmFsIHNldF9pbnQ2NF9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQ2NCAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQ2NFwiXG5leHRlcm5hbCBzd2FwMTYgOiBpbnQgLT4gaW50ID0gXCIlYnN3YXAxNlwiXG5leHRlcm5hbCBzd2FwMzIgOiBpbnQzMiAtPiBpbnQzMiA9IFwiJWJzd2FwX2ludDMyXCJcbmV4dGVybmFsIHN3YXA2NCA6IGludDY0IC0+IGludDY0ID0gXCIlYnN3YXBfaW50NjRcIlxuXG5sZXQgdW5zYWZlX2dldF91aW50MTZfbGUgYiBpID1cbiAgaWYgU3lzLmJpZ19lbmRpYW5cbiAgdGhlbiBzd2FwMTYgKHVuc2FmZV9nZXRfdWludDE2X25lIGIgaSlcbiAgZWxzZSB1bnNhZmVfZ2V0X3VpbnQxNl9uZSBiIGlcblxubGV0IHVuc2FmZV9nZXRfdWludDE2X2JlIGIgaSA9XG4gIGlmIFN5cy5iaWdfZW5kaWFuXG4gIHRoZW4gdW5zYWZlX2dldF91aW50MTZfbmUgYiBpXG4gIGVsc2Ugc3dhcDE2ICh1bnNhZmVfZ2V0X3VpbnQxNl9uZSBiIGkpXG5cbmxldCBnZXRfaW50OCBiIGkgPVxuICAoKGdldF91aW50OCBiIGkpIGxzbCAoU3lzLmludF9zaXplIC0gOCkpIGFzciAoU3lzLmludF9zaXplIC0gOClcblxubGV0IGdldF91aW50MTZfbGUgYiBpID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzd2FwMTYgKGdldF91aW50MTZfbmUgYiBpKVxuICBlbHNlIGdldF91aW50MTZfbmUgYiBpXG5cbmxldCBnZXRfdWludDE2X2JlIGIgaSA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXAxNiAoZ2V0X3VpbnQxNl9uZSBiIGkpXG4gIGVsc2UgZ2V0X3VpbnQxNl9uZSBiIGlcblxubGV0IGdldF9pbnQxNl9uZSBiIGkgPVxuICAoKGdldF91aW50MTZfbmUgYiBpKSBsc2wgKFN5cy5pbnRfc2l6ZSAtIDE2KSkgYXNyIChTeXMuaW50X3NpemUgLSAxNilcblxubGV0IGdldF9pbnQxNl9sZSBiIGkgPVxuICAoKGdldF91aW50MTZfbGUgYiBpKSBsc2wgKFN5cy5pbnRfc2l6ZSAtIDE2KSkgYXNyIChTeXMuaW50X3NpemUgLSAxNilcblxubGV0IGdldF9pbnQxNl9iZSBiIGkgPVxuICAoKGdldF91aW50MTZfYmUgYiBpKSBsc2wgKFN5cy5pbnRfc2l6ZSAtIDE2KSkgYXNyIChTeXMuaW50X3NpemUgLSAxNilcblxubGV0IGdldF9pbnQzMl9sZSBiIGkgPVxuICBpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXAzMiAoZ2V0X2ludDMyX25lIGIgaSlcbiAgZWxzZSBnZXRfaW50MzJfbmUgYiBpXG5cbmxldCBnZXRfaW50MzJfYmUgYiBpID1cbiAgaWYgbm90IFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDMyIChnZXRfaW50MzJfbmUgYiBpKVxuICBlbHNlIGdldF9pbnQzMl9uZSBiIGlcblxubGV0IGdldF9pbnQ2NF9sZSBiIGkgPVxuICBpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXA2NCAoZ2V0X2ludDY0X25lIGIgaSlcbiAgZWxzZSBnZXRfaW50NjRfbmUgYiBpXG5cbmxldCBnZXRfaW50NjRfYmUgYiBpID1cbiAgaWYgbm90IFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDY0IChnZXRfaW50NjRfbmUgYiBpKVxuICBlbHNlIGdldF9pbnQ2NF9uZSBiIGlcblxubGV0IHVuc2FmZV9zZXRfdWludDE2X2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW5cbiAgdGhlbiB1bnNhZmVfc2V0X3VpbnQxNl9uZSBiIGkgKHN3YXAxNiB4KVxuICBlbHNlIHVuc2FmZV9zZXRfdWludDE2X25lIGIgaSB4XG5cbmxldCB1bnNhZmVfc2V0X3VpbnQxNl9iZSBiIGkgeCA9XG4gIGlmIFN5cy5iaWdfZW5kaWFuXG4gIHRoZW4gdW5zYWZlX3NldF91aW50MTZfbmUgYiBpIHggZWxzZVxuICB1bnNhZmVfc2V0X3VpbnQxNl9uZSBiIGkgKHN3YXAxNiB4KVxuXG5sZXQgc2V0X2ludDE2X2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzZXRfaW50MTZfbmUgYiBpIChzd2FwMTYgeClcbiAgZWxzZSBzZXRfaW50MTZfbmUgYiBpIHhcblxubGV0IHNldF9pbnQxNl9iZSBiIGkgeCA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHNldF9pbnQxNl9uZSBiIGkgKHN3YXAxNiB4KVxuICBlbHNlIHNldF9pbnQxNl9uZSBiIGkgeFxuXG5sZXQgc2V0X2ludDMyX2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzZXRfaW50MzJfbmUgYiBpIChzd2FwMzIgeClcbiAgZWxzZSBzZXRfaW50MzJfbmUgYiBpIHhcblxubGV0IHNldF9pbnQzMl9iZSBiIGkgeCA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHNldF9pbnQzMl9uZSBiIGkgKHN3YXAzMiB4KVxuICBlbHNlIHNldF9pbnQzMl9uZSBiIGkgeFxuXG5sZXQgc2V0X2ludDY0X2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzZXRfaW50NjRfbmUgYiBpIChzd2FwNjQgeClcbiAgZWxzZSBzZXRfaW50NjRfbmUgYiBpIHhcblxubGV0IHNldF9pbnQ2NF9iZSBiIGkgeCA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHNldF9pbnQ2NF9uZSBiIGkgKHN3YXA2NCB4KVxuICBlbHNlIHNldF9pbnQ2NF9uZSBiIGkgeFxuXG5sZXQgc2V0X3VpbnQ4ID0gc2V0X2ludDhcbmxldCBzZXRfdWludDE2X25lID0gc2V0X2ludDE2X25lXG5sZXQgc2V0X3VpbnQxNl9iZSA9IHNldF9pbnQxNl9iZVxubGV0IHNldF91aW50MTZfbGUgPSBzZXRfaW50MTZfbGVcblxuKCogVVRGIGNvZGVjcyBhbmQgdmFsaWRhdGlvbnMgKilcblxubGV0IGRlY19pbnZhbGlkID0gVWNoYXIudXRmX2RlY29kZV9pbnZhbGlkXG5sZXRbQGlubGluZV0gZGVjX3JldCBuIHUgPSBVY2hhci51dGZfZGVjb2RlIG4gKFVjaGFyLnVuc2FmZV9vZl9pbnQgdSlcblxuKCogSW4gY2FzZSBvZiBkZWNvZGluZyBlcnJvciwgaWYgd2UgZXJyb3Igb24gdGhlIGZpcnN0IGJ5dGUsIHdlXG4gICBjb25zdW1lIHRoZSBieXRlLCBvdGhlcndpc2Ugd2UgY29uc3VtZSB0aGUgW25dIGJ5dGVzIHByZWNlZGluZ1xuICAgdGhlIGVycm9yaW5nIGJ5dGUuXG5cbiAgIFRoaXMgbWVhbnMgdGhhdCBpZiBhIGNsaWVudCB1c2VzIGRlY29kZXMgd2l0aG91dCBjYXJpbmcgYWJvdXRcbiAgIHZhbGlkaXR5IGl0IG5hdHVyYWxseSByZXBsYWNlIGJvZ3VzIGRhdGEgd2l0aCBVY2hhci5yZXAgYWNjb3JkaW5nXG4gICB0byB0aGUgV0hBVFdHIEVuY29kaW5nIHN0YW5kYXJkLiBPdGhlciBzY2hlbWVzIGFyZSBwb3NzaWJsZSBieVxuICAgY29uc3VsdGluZyB0aGUgbnVtYmVyIG9mIHVzZWQgYnl0ZXMgb24gaW52YWxpZCBkZWNvZGVzLiBGb3IgbW9yZVxuICAgZGV0YWlscyBzZWUgaHR0cHM6Ly9oc2l2b25lbi5maS9icm9rZW4tdXRmLTgvXG5cbiAgIEZvciB0aGlzIHJlYXNvbiBpbiBbZ2V0X3V0Zl84X3VjaGFyXSB3ZSBncmFkdWFsbHkgY2hlY2sgdGhlIG5leHRcbiAgIGJ5dGUgaXMgYXZhaWxhYmxlIHJhdGhlciB0aGFuIGRvaW5nIGl0IGltbWVkaWF0ZWx5IGFmdGVyIHRoZVxuICAgZmlyc3QgYnl0ZS4gQ29udHJhc3Qgd2l0aCBbaXNfdmFsaWRfdXRmXzhdLiAqKVxuXG4oKiBVVEYtOCAqKVxuXG5sZXRbQGlubGluZV0gbm90X2luX3g4MF90b194QkYgYiA9IGIgbHNyIDYgPD4gMGIxMFxubGV0W0BpbmxpbmVdIG5vdF9pbl94QTBfdG9feEJGIGIgPSBiIGxzciA1IDw+IDBiMTAxXG5sZXRbQGlubGluZV0gbm90X2luX3g4MF90b194OUYgYiA9IGIgbHNyIDUgPD4gMGIxMDBcbmxldFtAaW5saW5lXSBub3RfaW5feDkwX3RvX3hCRiBiID0gYiA8IDB4OTAgfHwgMHhCRiA8IGJcbmxldFtAaW5saW5lXSBub3RfaW5feDgwX3RvX3g4RiBiID0gYiBsc3IgNCA8PiAweDhcblxubGV0W0BpbmxpbmVdIHV0Zl84X3VjaGFyXzIgYjAgYjEgPVxuICAoKGIwIGxhbmQgMHgxRikgbHNsIDYpIGxvclxuICAoKGIxIGxhbmQgMHgzRikpXG5cbmxldFtAaW5saW5lXSB1dGZfOF91Y2hhcl8zIGIwIGIxIGIyID1cbiAgKChiMCBsYW5kIDB4MEYpIGxzbCAxMikgbG9yXG4gICgoYjEgbGFuZCAweDNGKSBsc2wgNikgbG9yXG4gICgoYjIgbGFuZCAweDNGKSlcblxubGV0W0BpbmxpbmVdIHV0Zl84X3VjaGFyXzQgYjAgYjEgYjIgYjMgPVxuICAoKGIwIGxhbmQgMHgwNykgbHNsIDE4KSBsb3JcbiAgKChiMSBsYW5kIDB4M0YpIGxzbCAxMikgbG9yXG4gICgoYjIgbGFuZCAweDNGKSBsc2wgNikgbG9yXG4gICgoYjMgbGFuZCAweDNGKSlcblxubGV0IGdldF91dGZfOF91Y2hhciBiIGkgPVxuICBsZXQgYjAgPSBnZXRfdWludDggYiBpIGluICgqIHJhaXNlcyBpZiBbaV0gaXMgbm90IGEgdmFsaWQgaW5kZXguICopXG4gIGxldCBnZXQgPSB1bnNhZmVfZ2V0X3VpbnQ4IGluXG4gIGxldCBtYXggPSBsZW5ndGggYiAtIDEgaW5cbiAgbWF0Y2ggQ2hhci51bnNhZmVfY2hyIGIwIHdpdGggKCogU2VlIFRoZSBVbmljb2RlIFN0YW5kYXJkLCBUYWJsZSAzLjcgKilcbiAgfCAnXFx4MDAnIC4uICdcXHg3RicgLT4gZGVjX3JldCAxIGIwXG4gIHwgJ1xceEMyJyAuLiAnXFx4REYnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGRlY19yZXQgMiAodXRmXzhfdWNoYXJfMiBiMCBiMSlcbiAgfCAnXFx4RTAnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3hBMF90b194QkYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGIyID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMiB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgZGVjX3JldCAzICh1dGZfOF91Y2hhcl8zIGIwIGIxIGIyKVxuICB8ICdcXHhFMScgLi4gJ1xceEVDJyB8ICdcXHhFRScgLi4gJ1xceEVGJyAtPlxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgYjEgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIxIHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGxldCBiMiA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjIgdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGRlY19yZXQgMyAodXRmXzhfdWNoYXJfMyBiMCBiMSBiMilcbiAgfCAnXFx4RUQnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194OUYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGIyID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMiB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgZGVjX3JldCAzICh1dGZfOF91Y2hhcl8zIGIwIGIxIGIyKVxuICB8ICdcXHhGMCcgLT5cbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGIxID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDkwX3RvX3hCRiBiMSB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgYjIgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIyIHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAzIGVsc2VcbiAgICAgIGxldCBiMyA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjMgdGhlbiBkZWNfaW52YWxpZCAzIGVsc2VcbiAgICAgIGRlY19yZXQgNCAodXRmXzhfdWNoYXJfNCBiMCBiMSBiMiBiMylcbiAgfCAnXFx4RjEnIC4uICdcXHhGMycgLT5cbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGIxID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMSB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgYjIgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIyIHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAzIGVsc2VcbiAgICAgIGxldCBiMyA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjMgdGhlbiBkZWNfaW52YWxpZCAzIGVsc2VcbiAgICAgIGRlY19yZXQgNCAodXRmXzhfdWNoYXJfNCBiMCBiMSBiMiBiMylcbiAgfCAnXFx4RjQnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194OEYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGIyID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMiB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMyBlbHNlXG4gICAgICBsZXQgYjMgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIzIHRoZW4gZGVjX2ludmFsaWQgMyBlbHNlXG4gICAgICBkZWNfcmV0IDQgKHV0Zl84X3VjaGFyXzQgYjAgYjEgYjIgYjMpXG4gIHwgXyAtPiBkZWNfaW52YWxpZCAxXG5cbmxldCBzZXRfdXRmXzhfdWNoYXIgYiBpIHUgPVxuICBsZXQgc2V0ID0gdW5zYWZlX3NldF91aW50OCBpblxuICBsZXQgbWF4ID0gbGVuZ3RoIGIgLSAxIGluXG4gIG1hdGNoIFVjaGFyLnRvX2ludCB1IHdpdGhcbiAgfCB1IHdoZW4gdSA8IDAgLT4gYXNzZXJ0IGZhbHNlXG4gIHwgdSB3aGVuIHUgPD0gMHgwMDdGIC0+XG4gICAgICBzZXRfdWludDggYiBpIHU7XG4gICAgICAxXG4gIHwgdSB3aGVuIHUgPD0gMHgwN0ZGIC0+XG4gICAgICBsZXQgbGFzdCA9IGkgKyAxIGluXG4gICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gMCBlbHNlXG4gICAgICAoc2V0X3VpbnQ4IGIgaSAoMHhDMCBsb3IgKHUgbHNyIDYpKTtcbiAgICAgICBzZXQgYiBsYXN0ICgweDgwIGxvciAodSBsYW5kIDB4M0YpKTtcbiAgICAgICAyKVxuICB8IHUgd2hlbiB1IDw9IDB4RkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMiBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZVxuICAgICAgKHNldF91aW50OCBiIGkgKDB4RTAgbG9yICh1IGxzciAxMikpO1xuICAgICAgIHNldCBiIChpICsgMSkgKDB4ODAgbG9yICgodSBsc3IgNikgbGFuZCAweDNGKSk7XG4gICAgICAgc2V0IGIgbGFzdCAoMHg4MCBsb3IgKHUgbGFuZCAweDNGKSk7XG4gICAgICAgMylcbiAgfCB1IHdoZW4gdSA8PSAweDEwRkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZVxuICAgICAgKHNldF91aW50OCBiIGkgKDB4RjAgbG9yICh1IGxzciAxOCkpO1xuICAgICAgIHNldCBiIChpICsgMSkgKDB4ODAgbG9yICgodSBsc3IgMTIpIGxhbmQgMHgzRikpO1xuICAgICAgIHNldCBiIChpICsgMikgKDB4ODAgbG9yICgodSBsc3IgNikgbGFuZCAweDNGKSk7XG4gICAgICAgc2V0IGIgbGFzdCAoMHg4MCBsb3IgKHUgbGFuZCAweDNGKSk7XG4gICAgICAgNClcbiAgfCBfIC0+IGFzc2VydCBmYWxzZVxuXG5sZXQgaXNfdmFsaWRfdXRmXzggYiA9XG4gIGxldCByZWMgbG9vcCBtYXggYiBpID1cbiAgICBpZiBpID4gbWF4IHRoZW4gdHJ1ZSBlbHNlXG4gICAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDggaW5cbiAgICBtYXRjaCBDaGFyLnVuc2FmZV9jaHIgKGdldCBiIGkpIHdpdGhcbiAgICB8ICdcXHgwMCcgLi4gJ1xceDdGJyAtPiBsb29wIG1heCBiIChpICsgMSlcbiAgICB8ICdcXHhDMicgLi4gJ1xceERGJyAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAxIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXhcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIGxhc3QpXG4gICAgICAgIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBsb29wIG1heCBiIChsYXN0ICsgMSlcbiAgICB8ICdcXHhFMCcgLT5cbiAgICAgICAgbGV0IGxhc3QgPSBpICsgMiBpblxuICAgICAgICBpZiBsYXN0ID4gbWF4XG4gICAgICAgIHx8IG5vdF9pbl94QTBfdG9feEJGIChnZXQgYiAoaSArIDEpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgbGFzdClcbiAgICAgICAgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGxvb3AgbWF4IGIgKGxhc3QgKyAxKVxuICAgIHwgJ1xceEUxJyAuLiAnXFx4RUMnIHwgJ1xceEVFJyAuLiAnXFx4RUYnIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDIgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heFxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgKGkgKyAxKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIGxhc3QpXG4gICAgICAgIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBsb29wIG1heCBiIChsYXN0ICsgMSlcbiAgICB8ICdcXHhFRCcgLT5cbiAgICAgICAgbGV0IGxhc3QgPSBpICsgMiBpblxuICAgICAgICBpZiBsYXN0ID4gbWF4XG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feDlGIChnZXQgYiAoaSArIDEpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgbGFzdClcbiAgICAgICAgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGxvb3AgbWF4IGIgKGxhc3QgKyAxKVxuICAgIHwgJ1xceEYwJyAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXhcbiAgICAgICAgfHwgbm90X2luX3g5MF90b194QkYgKGdldCBiIChpICsgMSkpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiAoaSArIDIpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgbGFzdClcbiAgICAgICAgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGxvb3AgbWF4IGIgKGxhc3QgKyAxKVxuICAgIHwgJ1xceEYxJyAuLiAnXFx4RjMnIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDMgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heFxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgKGkgKyAxKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIChpICsgMikpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiBsYXN0KVxuICAgICAgICB0aGVuIGZhbHNlXG4gICAgICAgIGVsc2UgbG9vcCBtYXggYiAobGFzdCArIDEpXG4gICAgfCAnXFx4RjQnIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDMgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heFxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3g4RiAoZ2V0IGIgKGkgKyAxKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIChpICsgMikpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiBsYXN0KVxuICAgICAgICB0aGVuIGZhbHNlXG4gICAgICAgIGVsc2UgbG9vcCBtYXggYiAobGFzdCArIDEpXG4gICAgfCBfIC0+IGZhbHNlXG4gIGluXG4gIGxvb3AgKGxlbmd0aCBiIC0gMSkgYiAwXG5cbigqIFVURi0xNkJFICopXG5cbmxldCBnZXRfdXRmXzE2YmVfdWNoYXIgYiBpID1cbiAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDE2X2JlIGluXG4gIGxldCBtYXggPSBsZW5ndGggYiAtIDEgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IG1heCB0aGVuIGludmFsaWRfYXJnIFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiIGVsc2VcbiAgaWYgaSA9IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICBtYXRjaCBnZXQgYiBpIHdpdGhcbiAgfCB1IHdoZW4gdSA8IDB4RDgwMCB8fCB1ID4gMHhERkZGIC0+IGRlY19yZXQgMiB1XG4gIHwgdSB3aGVuIHUgPiAweERCRkYgLT4gZGVjX2ludmFsaWQgMlxuICB8IGhpIC0+ICgqIGNvbWJpbmUgW2hpXSB3aXRoIGEgbG93IHN1cnJvZ2F0ZSAqKVxuICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIGRlY19pbnZhbGlkIChtYXggLSBpICsgMSkgZWxzZVxuICAgICAgbWF0Y2ggZ2V0IGIgKGkgKyAyKSB3aXRoXG4gICAgICB8IHUgd2hlbiB1IDwgMHhEQzAwIHx8IHUgPiAweERGRkYgLT4gZGVjX2ludmFsaWQgMiAoKiByZXRyeSBoZXJlICopXG4gICAgICB8IGxvIC0+XG4gICAgICAgICAgbGV0IHUgPSAoKChoaSBsYW5kIDB4M0ZGKSBsc2wgMTApIGxvciAobG8gbGFuZCAweDNGRikpICsgMHgxMDAwMCBpblxuICAgICAgICAgIGRlY19yZXQgNCB1XG5cbmxldCBzZXRfdXRmXzE2YmVfdWNoYXIgYiBpIHUgPVxuICBsZXQgc2V0ID0gdW5zYWZlX3NldF91aW50MTZfYmUgaW5cbiAgbGV0IG1heCA9IGxlbmd0aCBiIC0gMSBpblxuICBpZiBpIDwgMCB8fCBpID4gbWF4IHRoZW4gaW52YWxpZF9hcmcgXCJpbmRleCBvdXQgb2YgYm91bmRzXCIgZWxzZVxuICBtYXRjaCBVY2hhci50b19pbnQgdSB3aXRoXG4gIHwgdSB3aGVuIHUgPCAwIC0+IGFzc2VydCBmYWxzZVxuICB8IHUgd2hlbiB1IDw9IDB4RkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMSBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZSAoc2V0IGIgaSB1OyAyKVxuICB8IHUgd2hlbiB1IDw9IDB4MTBGRkZGIC0+XG4gICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gMCBlbHNlXG4gICAgICBsZXQgdScgPSB1IC0gMHgxMDAwMCBpblxuICAgICAgbGV0IGhpID0gKDB4RDgwMCBsb3IgKHUnIGxzciAxMCkpIGluXG4gICAgICBsZXQgbG8gPSAoMHhEQzAwIGxvciAodScgbGFuZCAweDNGRikpIGluXG4gICAgICBzZXQgYiBpIGhpOyBzZXQgYiAoaSArIDIpIGxvOyA0XG4gIHwgXyAtPiBhc3NlcnQgZmFsc2VcblxubGV0IGlzX3ZhbGlkX3V0Zl8xNmJlIGIgPVxuICBsZXQgcmVjIGxvb3AgbWF4IGIgaSA9XG4gICAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDE2X2JlIGluXG4gICAgaWYgaSA+IG1heCB0aGVuIHRydWUgZWxzZVxuICAgIGlmIGkgPSBtYXggdGhlbiBmYWxzZSBlbHNlXG4gICAgbWF0Y2ggZ2V0IGIgaSB3aXRoXG4gICAgfCB1IHdoZW4gdSA8IDB4RDgwMCB8fCB1ID4gMHhERkZGIC0+IGxvb3AgbWF4IGIgKGkgKyAyKVxuICAgIHwgdSB3aGVuIHUgPiAweERCRkYgLT4gZmFsc2VcbiAgICB8IF9oaSAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiBmYWxzZSBlbHNlXG4gICAgICAgIG1hdGNoIGdldCBiIChpICsgMikgd2l0aFxuICAgICAgICB8IHUgd2hlbiB1IDwgMHhEQzAwIHx8IHUgPiAweERGRkYgLT4gZmFsc2VcbiAgICAgICAgfCBfbG8gLT4gbG9vcCBtYXggYiAoaSArIDQpXG4gIGluXG4gIGxvb3AgKGxlbmd0aCBiIC0gMSkgYiAwXG5cbigqIFVURi0xNkxFICopXG5cbmxldCBnZXRfdXRmXzE2bGVfdWNoYXIgYiBpID1cbiAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDE2X2xlIGluXG4gIGxldCBtYXggPSBsZW5ndGggYiAtIDEgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IG1heCB0aGVuIGludmFsaWRfYXJnIFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiIGVsc2VcbiAgaWYgaSA9IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICBtYXRjaCBnZXQgYiBpIHdpdGhcbiAgfCB1IHdoZW4gdSA8IDB4RDgwMCB8fCB1ID4gMHhERkZGIC0+IGRlY19yZXQgMiB1XG4gIHwgdSB3aGVuIHUgPiAweERCRkYgLT4gZGVjX2ludmFsaWQgMlxuICB8IGhpIC0+ICgqIGNvbWJpbmUgW2hpXSB3aXRoIGEgbG93IHN1cnJvZ2F0ZSAqKVxuICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIGRlY19pbnZhbGlkIChtYXggLSBpICsgMSkgZWxzZVxuICAgICAgbWF0Y2ggZ2V0IGIgKGkgKyAyKSB3aXRoXG4gICAgICB8IHUgd2hlbiB1IDwgMHhEQzAwIHx8IHUgPiAweERGRkYgLT4gZGVjX2ludmFsaWQgMiAoKiByZXRyeSBoZXJlICopXG4gICAgICB8IGxvIC0+XG4gICAgICAgICAgbGV0IHUgPSAoKChoaSBsYW5kIDB4M0ZGKSBsc2wgMTApIGxvciAobG8gbGFuZCAweDNGRikpICsgMHgxMDAwMCBpblxuICAgICAgICAgIGRlY19yZXQgNCB1XG5cbmxldCBzZXRfdXRmXzE2bGVfdWNoYXIgYiBpIHUgPVxuICBsZXQgc2V0ID0gdW5zYWZlX3NldF91aW50MTZfbGUgaW5cbiAgbGV0IG1heCA9IGxlbmd0aCBiIC0gMSBpblxuICBpZiBpIDwgMCB8fCBpID4gbWF4IHRoZW4gaW52YWxpZF9hcmcgXCJpbmRleCBvdXQgb2YgYm91bmRzXCIgZWxzZVxuICBtYXRjaCBVY2hhci50b19pbnQgdSB3aXRoXG4gIHwgdSB3aGVuIHUgPCAwIC0+IGFzc2VydCBmYWxzZVxuICB8IHUgd2hlbiB1IDw9IDB4RkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMSBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZSAoc2V0IGIgaSB1OyAyKVxuICB8IHUgd2hlbiB1IDw9IDB4MTBGRkZGIC0+XG4gICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gMCBlbHNlXG4gICAgICBsZXQgdScgPSB1IC0gMHgxMDAwMCBpblxuICAgICAgbGV0IGhpID0gKDB4RDgwMCBsb3IgKHUnIGxzciAxMCkpIGluXG4gICAgICBsZXQgbG8gPSAoMHhEQzAwIGxvciAodScgbGFuZCAweDNGRikpIGluXG4gICAgICBzZXQgYiBpIGhpOyBzZXQgYiAoaSArIDIpIGxvOyA0XG4gIHwgXyAtPiBhc3NlcnQgZmFsc2VcblxubGV0IGlzX3ZhbGlkX3V0Zl8xNmxlIGIgPVxuICBsZXQgcmVjIGxvb3AgbWF4IGIgaSA9XG4gICAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDE2X2xlIGluXG4gICAgaWYgaSA+IG1heCB0aGVuIHRydWUgZWxzZVxuICAgIGlmIGkgPSBtYXggdGhlbiBmYWxzZSBlbHNlXG4gICAgbWF0Y2ggZ2V0IGIgaSB3aXRoXG4gICAgfCB1IHdoZW4gdSA8IDB4RDgwMCB8fCB1ID4gMHhERkZGIC0+IGxvb3AgbWF4IGIgKGkgKyAyKVxuICAgIHwgdSB3aGVuIHUgPiAweERCRkYgLT4gZmFsc2VcbiAgICB8IF9oaSAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiBmYWxzZSBlbHNlXG4gICAgICAgIG1hdGNoIGdldCBiIChpICsgMikgd2l0aFxuICAgICAgICB8IHUgd2hlbiB1IDwgMHhEQzAwIHx8IHUgPiAweERGRkYgLT4gZmFsc2VcbiAgICAgICAgfCBfbG8gLT4gbG9vcCBtYXggYiAoaSArIDQpXG4gIGluXG4gIGxvb3AgKGxlbmd0aCBiIC0gMSkgYiAwXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfYmxpdF9ieXRlcyIsImNhbWxfYnN3YXAxNiIsImNhbWxfYnl0ZXNfZ2V0IiwiY2FtbF9ieXRlc19nZXQxNiIsImNhbWxfYnl0ZXNfZ2V0MzIiLCJjYW1sX2J5dGVzX2dldDY0IiwiY2FtbF9ieXRlc19vZl9zdHJpbmciLCJjYW1sX2J5dGVzX3NldCIsImNhbWxfYnl0ZXNfc2V0MTYiLCJjYW1sX2J5dGVzX3NldDMyIiwiY2FtbF9ieXRlc19zZXQ2NCIsImNhbWxfYnl0ZXNfdW5zYWZlX2dldCIsImNhbWxfYnl0ZXNfdW5zYWZlX3NldCIsImNhbWxfY3JlYXRlX2J5dGVzIiwiY2FtbF9maWxsX2J5dGVzIiwiY2FtbF9pbnQzMl9ic3dhcCIsImNhbWxfaW50NjRfYnN3YXAiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX21sX2J5dGVzX2xlbmd0aCIsImNhbWxfc3RyaW5nX29mX2J5dGVzIiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJjYW1sX2NhbGwyIiwiYTEiLCJkdW1teSIsImdsb2JhbF9kYXRhIiwiU3RkbGliIiwiU3RkbGliX1VjaGFyIiwiQXNzZXJ0X2ZhaWx1cmUiLCJTdGRsaWJfU3lzIiwiU3RkbGliX0ludCIsIlN0ZGxpYl9TZXEiLCJTdGRsaWJfQ2hhciIsIm1ha2UiLCJuIiwiYyIsInMiLCJpbml0IiwiaSIsImVtcHR5IiwiY29weSIsImxlbiIsInIiLCJ0b19zdHJpbmciLCJiIiwib2Zfc3RyaW5nIiwic3ViIiwib2ZzIiwic3ViX3N0cmluZyIsInN5bWJvbCIsImEiLCJtYXRjaCIsImV4dGVuZCIsImxlZnQiLCJyaWdodCIsImRzdG9mZiIsInNyY29mZiIsImNweWxlbiIsImZpbGwiLCJibGl0IiwiczEiLCJvZnMxIiwiczIiLCJvZnMyIiwiYmxpdF9zdHJpbmciLCJpdGVyIiwiaXRlcmkiLCJjb25jYXQiLCJzZXAiLCJsIiwic2VwbGVuIiwiYWNjIiwicGFyYW0iLCJwb3MiLCJoZCIsInRsIiwieCIsImRzdCIsImNhdCIsImwxIiwibDIiLCJpc19zcGFjZSIsInRyaW0iLCJqIiwidW5zYWZlX2VzY2FwZSIsImVzY2FwZWQiLCJtYXAiLCJtYXBpIiwiZm9sZF9sZWZ0IiwiZm9sZF9yaWdodCIsImV4aXN0cyIsInAiLCJmb3JfYWxsIiwidXBwZXJjYXNlX2FzY2lpIiwibG93ZXJjYXNlX2FzY2lpIiwiYXBwbHkxIiwiY2FwaXRhbGl6ZV9hc2NpaSIsInVuY2FwaXRhbGl6ZV9hc2NpaSIsInN0YXJ0c193aXRoIiwicHJlZml4IiwibGVuX3MiLCJsZW5fcHJlIiwiZW5kc193aXRoIiwic3VmZml4IiwibGVuX3N1ZiIsImRpZmYiLCJpbmRleF9yZWMiLCJsaW0iLCJpbmRleCIsImluZGV4X3JlY19vcHQiLCJpbmRleF9vcHQiLCJpbmRleF9mcm9tIiwiaW5kZXhfZnJvbV9vcHQiLCJyaW5kZXhfcmVjIiwicmluZGV4IiwicmluZGV4X2Zyb20iLCJyaW5kZXhfcmVjX29wdCIsInJpbmRleF9vcHQiLCJyaW5kZXhfZnJvbV9vcHQiLCJjb250YWluc19mcm9tIiwiZXhuIiwiY29udGFpbnMiLCJyY29udGFpbnNfZnJvbSIsImNvbXBhcmUiLCJzcGxpdF9vbl9jaGFyIiwidG9fc2VxIiwiYXV4IiwidG9fc2VxaSIsIm9mX3NlcSIsImJ1ZiIsIm5ld19sZW4iLCJuZXdfYnVmIiwidW5zYWZlX2dldF91aW50MTZfbGUiLCJ1bnNhZmVfZ2V0X3VpbnQxNl9iZSIsImdldF9pbnQ4IiwiZ2V0X3VpbnQxNl9sZSIsImdldF91aW50MTZfYmUiLCJnZXRfaW50MTZfbmUiLCJnZXRfaW50MTZfbGUiLCJnZXRfaW50MTZfYmUiLCJnZXRfaW50MzJfbGUiLCJnZXRfaW50MzJfYmUiLCJnZXRfaW50NjRfbGUiLCJnZXRfaW50NjRfYmUiLCJ1bnNhZmVfc2V0X3VpbnQxNl9sZSIsInVuc2FmZV9zZXRfdWludDE2X2JlIiwic2V0X2ludDE2X2xlIiwic2V0X2ludDE2X2JlIiwic2V0X2ludDMyX2xlIiwic2V0X2ludDMyX2JlIiwic2V0X2ludDY0X2xlIiwic2V0X2ludDY0X2JlIiwiZGVjX2ludmFsaWQiLCJkZWNfcmV0IiwidSIsIm5vdF9pbl94ODBfdG9feEJGIiwibm90X2luX3hBMF90b194QkYiLCJub3RfaW5feDgwX3RvX3g5RiIsIm5vdF9pbl94OTBfdG9feEJGIiwibm90X2luX3g4MF90b194OEYiLCJ1dGZfOF91Y2hhcl8zIiwiYjAiLCJiMSIsImIyIiwidXRmXzhfdWNoYXJfNCIsImIzIiwiZ2V0X3V0Zl84X3VjaGFyIiwibWF4IiwiY3N0X2J5dGVzX21sIiwic2V0X3V0Zl84X3VjaGFyIiwic2V0IiwibGFzdCIsImlzX3ZhbGlkX3V0Zl84IiwiY3N0X2luZGV4X291dF9vZl9ib3VuZHMiLCJnZXRfdXRmXzE2YmVfdWNoYXIiLCJoaSIsImxvIiwic2V0X3V0Zl8xNmJlX3VjaGFyIiwiaXNfdmFsaWRfdXRmXzE2YmUiLCJnZXRfdXRmXzE2bGVfdWNoYXIiLCJzZXRfdXRmXzE2bGVfdWNoYXIiLCJpc192YWxpZF91dGZfMTZsZSIsIlN0ZGxpYl9CeXRlcyJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLHVCQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyx3QkFBQTtBQUFBLElBQUFDLHdCQUFBO0FBQUEsSUFBQUMsb0JBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLHVCQUFBO0FBQUEsSUFBQUMsdUJBQUE7QUFBQSxJQUFBQyxzQkFBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQyxXQUFBRixHQUFBQyxJQUFBRTtBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxRQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyxhQUFBO0FBQUEsSUFBQUMsYUFBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsWUFBQUMsS0FBQUMsR0FBQUM7QUFBQUEsUUFBQUMsSUN5Q1U7QUFBQSxJQUNSO0FBQUEsSUFBbUI7QUFBQSxHQUNsQjtBQUFBLFlBQUFDLEtBQUFILEdBQUFkO0FBQUFBLFFBQUFnQixJQUdPLDBCQUNSO0FBQUE7QUFBQSxTQUFBRSxJQUFBO0FBQUE7QUFBQSxNQUNzQiw0QkFBTDtBQUFBLGNBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBRXRCO0FBQUEsR0FBQztBQUFBLE9BQUFDLFFBRVM7QUFBQSxZQUFBQyxLQUFBSjtBQUFBQSxRQUFBSyxNQUdWLHlCQUFBQyxJQUNRO0FBQUEsSUFDUjtBQUFBLElBQXVCO0FBQUEsR0FDdEI7QUFBQSxZQUFBQyxVQUFBQyxHQUVnQyxPQUFRLHFCQUFSLFFBQVE7QUFBQSxZQUFBQyxVQUFBVCxHQUN6QixvQ0FBeUI7QUFBQSxZQUFBVSxJQUFBVixHQUFBVyxLQUFBTjtBQUFBQSxJQUd6QztBQUFBLFNBQUFDLElBR1U7QUFBQSxLQUNSO0FBQUEsS0FBeUI7QUFBQTtBQUFBLElBSHRCLHFEQUtGO0FBQUE7QUFBQSxZQUFBTSxXQUFBSixHQUFBRyxLQUFBTjtBQUFBQSxJQUV1QyxPQUFlLHFCQUFmLGlCQUFlO0FBQUE7QUFBQSxZQUFBUSxPQUFBQyxHQUFBTjtBQUFBQSxRQUFBVCxJQUl6RCxlQUNBLE9BQUFnQixRQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FFeUIsMkNBQ2pCO0FBQUE7QUFBQSxJQUFEO0FBQUEsR0FBQztBQUFBLFlBQUFDLE9BQUFoQixHQUFBaUIsTUFBQUM7QUFBQUE7QUFBQUEsS0FBQWIsTUFHRSxjQUFWO0FBQUEsS0FBQUMsSUFDUTtBQUFBLElBQ1I7QUFBQSxTQUFBYSxTQUNBLE1BQUFDLFNBQUE7QUFBQTtBQUFBLFNBQUFELFNBRHdDLEdBQUFDLFNBQUE7QUFBQTtBQUFBLEtBQUFDO0FBQUFBLE9BQzNCO0FBQUEsZUFBYjtBQUFBLElBQ0EsZUFBbUI7QUFBQSxJQUNuQjtBQUFBLEdBQUM7QUFBQSxZQUFBQyxLQUFBdEIsR0FBQVcsS0FBQU4sS0FBQU47QUFBQUEsSUFHRDtBQUFBLEtBRUssc0NBQXVCO0FBQUEsSUFEdkIsdURBQ3VCO0FBQUE7QUFBQSxZQUFBd0IsS0FBQUMsSUFBQUMsTUFBQUMsSUFBQUMsTUFBQXRCO0FBQUFBLElBRzVCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FHSywrQ0FBK0I7QUFBQSxJQUQvQix5Q0FDK0I7QUFBQTtBQUFBLFlBQUF1QixZQUFBSixJQUFBQyxNQUFBQyxJQUFBQyxNQUFBdEI7QUFBQUEsSUFHcEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQUdLLHdEQUFzQztBQUFBLElBRHRDLDhEQUNzQztBQUFBO0FBQUEsWUFBQXdCLEtBQUE3QyxHQUFBOEI7QUFBQUEsUUFBQSxJQUkzQztBQUFBO0FBQUEsU0FBQVosSUFBQTtBQUFBO0FBQUEsTUFBNkI7QUFBQSxjQUFpQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBOUM7QUFBQSxHQUFtRDtBQUFBLFlBQUE0QixNQUFBOUMsR0FBQThCO0FBQUFBLFFBQUEsSUFJbkQ7QUFBQTtBQUFBLFNBQUFaLElBQUE7QUFBQTtBQUFBLE1BQTZCO0FBQUEsY0FBb0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQWpEO0FBQUEsR0FBc0Q7QUFBQSxZQUFBNkIsT0FBQUMsS0FBQUM7QUFBQUEsSUFrQjdDLFFBQ0Q7QUFBQSxRQUFBQyxTQUNEO0FBQUE7QUFBQTtBQUFBLFNBQUFDLE1BRVcsR0FBQUMsUUFBQSxHQUFBQyxRQUFBO0FBQUE7QUFBQSxNQWxCQTtBQUFBLFVBQUFDLEtBQUE7QUFBQTtBQUFBO0FBQUEsT0FBQUMsS0FBQTtBQUFBLE9BQUFDLElBR0o7QUFBQSxNQUxVO0FBQUE7QUFBQTtBQUFBO0FBQUEsV0FBc0I7QUFBQTtBQUFBLGFBSWhDO0FBQUE7QUFBQSxRQUFBQyxNQWdCSixzQkFBQUosTUFBaUMsT0FBQUQsVUFBQTtBQUFBO0FBQUEsS0FieEIsY0FDWDtBQUFBLFNBQUFFLE9BRFc7QUFBQTtBQUFBLE1BR2pCO0FBQUEsTUFBb0M7QUFBQTtBQUFBLFNBQUFDLE9BSG5CO0FBQUEsS0FLakI7QUFBQSxLQUNBO0FBQUEsMEJBRG9DO0FBQUEsU0FBQUYsUUFDVTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBUXhCO0FBQUEsWUFBQUssSUFBQWxCLElBQUFFO0FBQUFBO0FBQUFBLEtBQUFpQixLQUd4QjtBQUFBLEtBQUFDLEtBQ0E7QUFBQSxLQUFBdEMsSUFDUTtBQUFBLElBQ1I7QUFBQSxJQUNBO0FBQUEsSUFBd0I7QUFBQSxHQUN2QjtBQUFBLFlBQUF1QyxTQUFBVDtBQUFBQSxRQUFBLElBTVk7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQUMwQjtBQUFBO0FBQUEsSUFDaEM7QUFBQSxHQUFLO0FBQUEsWUFBQVUsS0FBQTlDO0FBQUFBLFFBQUFLLE1BR1oseUJBQUFILElBRUE7QUFBQTtBQUFBO0FBQUEsVUFBa0IsU0FBbEI7QUFBQSxTQUFBQSxNQUNFO0FBQUE7QUFBQTtBQUFBLFFBQUE2QyxJQUdGO0FBQUE7QUFBQSxrQkFBa0IsU0FBbEIsa0NBQUFBLE1BQ0U7QUFBQSxLQUVGLGdCQUNFLHNDQUVLO0FBQUE7QUFBQTtBQUFBLFlBQUFDLGNBQUFoRDtBQUFBQSxRQUFBLElBaUJQLHFDQURBO0FBQUEsSUFDQTtBQUFBLFNBQUFGLE1BQUE7QUFBQTtBQUFBLFNBQUFBLElBQUEsR0FBQUksTUFBQTtBQUFBO0FBQUEsVUFBQWEsUUFDRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGtCQUdtQjtBQUFBO0FBQUE7QUFBQSxTQUhuQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBSVU7QUFBQTtBQUFBO0FBQUEsZUFGc0M7QUFBQTtBQUFBLGNBRmhEO0FBQUEsd0JBQUFqQixNQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQU1GLG9DQUFzQjtBQUFBLFFBQUFFLE1BRVgsNEJBRVQ7QUFBQTtBQUFBLFNBQUFGLE1BQUEsR0FBQUksSUFBQTtBQUFBO0FBQUEsVUFBQUgsSUFDRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxjQVVJO0FBQUEsa0JBQUFELE1BQXVCO0FBQUEsY0FBUTtBQUFBLGtCQUFBQSxPQUFBO0FBQUE7QUFBQTtBQUFBLGNBSi9CO0FBQUEsa0JBQUFBLE1BQXVCO0FBQUEsY0FBUTtBQUFBLGtCQUFBQSxPQUFBO0FBQUE7QUFBQTtBQUFBLGNBRi9CO0FBQUEsa0JBQUFBLE1BQXVCO0FBQUEsY0FBUTtBQUFBLGtCQUFBQSxPQUFBO0FBQUE7QUFBQTtBQUFBLGNBSS9CO0FBQUEsa0JBQUFBLE1BQXVCO0FBQUEsY0FBUTtBQUFBLGtCQUFBQSxPQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQVJuQztBQUFBO0FBQUEsU0FFSTtBQUFBLGFBQUFBLE1BQXVCO0FBQUEsU0FBUTtBQUFBLGFBQUFBLE9BQUE7QUFBQTtBQUFBO0FBQUEsUUFTWjtBQUFBLFlBQUFBLE9BQUE7QUFBQTtBQUFBO0FBQUEsT0FHbkI7QUFBQSxXQUFBQSxNQUNBO0FBQUEsT0FDQTtBQUFBLFdBQUFBLE1BQ0E7QUFBQSxPQUNBO0FBQUEsV0FBQUEsTUFDQTtBQUFBLE9BQ0E7QUFBQSxXQUFBQSxPQUFBO0FBQUE7QUFBQSxVQUFBQSxPQUVKO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBRUY7QUFBQSxHQUNDO0FBQUEsWUFBQW1ELFFBQUF6QyxPQUFBQSxNQUdLLFNBR1IseUJBQWU7QUFBQSxZQUFBMEMsSUFBQWxFLEdBQUFnQjtBQUFBQSxRQUFBaUMsSUFHZjtBQUFBLElBQ0EsWUFBYztBQUFBLFFBQUEzQixJQUNKLDBCQUNSO0FBQUE7QUFBQSxTQUFBSixJQUFBO0FBQUE7QUFBQSxNQUF5RCw0QkFBcEIsY0FBZjtBQUFBLGNBQW1DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUN6RDtBQUFBLEdBQ0M7QUFBQSxZQUFBaUQsS0FBQW5FLEdBQUFnQjtBQUFBQSxRQUFBaUMsSUFHSDtBQUFBLElBQ0EsWUFBYztBQUFBLFFBQUEzQixJQUNKLDBCQUNSO0FBQUE7QUFBQSxTQUFBSixJQUFBO0FBQUE7QUFBQSxNQUEyRDtBQUFBLGNBQXRCLGlCQUFmO0FBQUEsY0FBcUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQzNEO0FBQUEsR0FDQztBQUFBLFlBQUFrRCxVQUFBcEUsR0FBQXdELEdBQUExQjtBQUFBQSxRQUFBLElBSUg7QUFBQTtBQUFBLFNBQUFSLE1BQUE7QUFBQTtBQUFBLFNBQUFBLElBQUEsR0FBQUosSUFBQTtBQUFBO0FBQUEsY0FDTyxpQkFBTCxrQ0FBMEI7QUFBQSxzQkFBQUksTUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFFNUI7QUFBQSxHQUFFO0FBQUEsWUFBQStDLFdBQUFyRSxHQUFBOEIsR0FBQTBCO0FBQUFBLFFBQUEsSUFJRjtBQUFBO0FBQUEsU0FBQWxDLE1BQUE7QUFBQTtBQUFBLFNBQUFBLElBQUEsR0FBQUosSUFBQTtBQUFBO0FBQUEsY0FDTyxjQUFMLHFDQUEwQjtBQUFBLHNCQUFBSSxNQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUU1QjtBQUFBLEdBQUU7QUFBQSxZQUFBZ0QsT0FBQUMsR0FBQXZEO0FBQUFBLFFBQUFGLElBR0YseUJBQUFJLElBS0E7QUFBQTtBQUFBLEtBSEUsWUFBYztBQUFBLEtBQ1QsR0FBRyxjQUFILDhCQUEyQjtBQUFBLFNBQUFBLE1BQzNCO0FBQUE7QUFBQTtBQUFBLEdBQ0Q7QUFBQSxZQUFBc0QsUUFBQUQsR0FBQXZEO0FBQUFBLFFBQUFGLElBR04seUJBQUFJLElBS0E7QUFBQTtBQUFBLEtBSEUsWUFBYztBQUFBLEtBQ1QsS0FBRyxjQUFILDhCQUNBO0FBQUEsU0FBQUEsTUFEMkI7QUFBQTtBQUFBO0FBQUEsR0FFNUI7QUFBQSxZQUFBdUQsZ0JBQUF6RCxHQUVnQiw2QkFBMEI7QUFBQSxZQUFBMEQsZ0JBQUExRCxHQUMxQiw2QkFBMEI7QUFBQSxZQUFBMkQsT0FBQTNFLEdBQUFnQjtBQUFBQSxJQUdoRCxrQ0FBcUI7QUFBQSxRQUFBTSxJQUNYO0FBQUEsSUFDMEIsNEJBQW5CLGNBQWY7QUFBQSxJQUNBO0FBQUEsR0FDQztBQUFBLFlBQUFzRCxpQkFBQTVELEdBRW9CLGdDQUE2QjtBQUFBLFlBQUE2RCxtQkFBQTdELEdBQzNCLGdDQUE2QjtBQUFBLFlBQUE4RCxZQUFBQyxRQUFBL0Q7QUFBQUE7QUFBQUEsS0FBQWdFLFFBSXREO0FBQUEsS0FBQUMsVUFBQTtBQUFBLFNBTUc7QUFBQTtBQUFBLFFBQUEvRCxJQUFBO0FBQUE7QUFBQSxLQUhELGtCQUFvQjtBQUFBLEtBQ2Y7QUFBQSxNQUE4QztBQUFBLFNBQUFBLE1BQzlDO0FBQUE7QUFBQTtBQUFBLEdBQ3FCO0FBQUEsWUFBQWdFLFVBQUFDLFFBQUFuRTtBQUFBQTtBQUFBQSxLQUFBZ0UsUUFJNUI7QUFBQSxLQUFBSSxVQUFBO0FBQUEsS0FBQUMsT0FFQTtBQUFBLFNBS0c7QUFBQTtBQUFBLFFBQUFuRSxJQUFBO0FBQUE7QUFBQSxLQUhELGtCQUFvQjtBQUFBLEtBQ2Y7QUFBQTtBQUFBO0FBQUEsTUFBdUQ7QUFBQSxTQUFBQSxNQUN2RDtBQUFBO0FBQUE7QUFBQSxHQUNjO0FBQUEsWUFBQW9FLFVBQUF0RSxHQUFBdUUsS0FBQXJFLEtBQUFIO0FBQUFBLFFBQUFHLElBSXJCO0FBQUE7QUFBQSxrQkFBaUI7QUFBQSxLQUNqQixzQ0FBMkI7QUFBQSxTQUFBQSxNQUFPO0FBQUE7QUFBQTtBQUFBLEdBQXlCO0FBQUEsWUFBQXNFLE1BQUF4RSxHQUFBRCxHQUc3QyxrREFBMEI7QUFBQSxZQUFBMEUsY0FBQXpFLEdBQUF1RSxLQUFBckUsS0FBQUg7QUFBQUEsUUFBQUcsSUFJeEM7QUFBQTtBQUFBLGtCQUFpQjtBQUFBLEtBQ2pCLHNDQUEyQjtBQUFBLFNBQUFBLE1BQVk7QUFBQTtBQUFBO0FBQUEsR0FBNkI7QUFBQSxZQUFBd0UsVUFBQTFFLEdBQUFEO0FBQUFBLElBR2xELHNEQUE4QjtBQUFBO0FBQUEsWUFBQTRFLFdBQUEzRSxHQUFBRSxHQUFBSDtBQUFBQSxRQUFBa0MsSUFJaEQ7QUFBQSxJQUNBLHFCQUNBLDRCQUFpQjtBQUFBLElBRE0sbUVBQ047QUFBQTtBQUFBLFlBQUEyQyxlQUFBNUUsR0FBQUUsR0FBQUg7QUFBQUEsUUFBQWtDLElBSWpCO0FBQUEsSUFDQSxxQkFHRSxnQ0FBcUI7QUFBQSxJQUZyQjtBQUFBLGtFQUVxQjtBQUFBO0FBQUEsWUFBQTRDLFdBQUE3RSxHQUFBRSxLQUFBSDtBQUFBQSxRQUFBRyxJQUl2QjtBQUFBO0FBQUEsZUFBYztBQUFBLEtBQ2Qsc0NBQTJCO0FBQUEsU0FBQUEsTUFBTztBQUFBO0FBQUE7QUFBQSxHQUFzQjtBQUFBLFlBQUE0RSxPQUFBOUUsR0FBQUQ7QUFBQUEsSUFHekMsd0RBQTZCO0FBQUE7QUFBQSxZQUFBZ0YsWUFBQS9FLEdBQUFFLEdBQUFIO0FBQUFBLElBSTVDLDJDQUdFLDBCQUFnQjtBQUFBLElBRmhCLHFFQUVnQjtBQUFBO0FBQUEsWUFBQWlGLGVBQUFoRixHQUFBRSxLQUFBSDtBQUFBQSxRQUFBRyxJQUlsQjtBQUFBO0FBQUEsZUFBYztBQUFBLEtBQ2Qsc0NBQTJCO0FBQUEsU0FBQUEsTUFBWTtBQUFBO0FBQUE7QUFBQSxHQUEwQjtBQUFBLFlBQUErRSxXQUFBakYsR0FBQUQ7QUFBQUEsSUFHOUMsNERBQWlDO0FBQUE7QUFBQSxZQUFBbUYsZ0JBQUFsRixHQUFBRSxHQUFBSDtBQUFBQSxJQUlwRCwyQ0FHRSw4QkFBb0I7QUFBQSxJQUZwQjtBQUFBLG9FQUVvQjtBQUFBO0FBQUEsWUFBQW9GLGNBQUFuRixHQUFBRSxHQUFBSDtBQUFBQSxRQUFBa0MsSUFLdEI7QUFBQSxJQUNBO0FBQUEsU0FHYTtBQUFBLFdBQUFtRDtBQUFBQSxVQUFBQSxNRHhYZjtBQUFBLDRCQ3dYMkQ7QUFBQSxNRHhYM0Q7QUFBQTtBQUFBLElDc1hJLHlFQUU0RDtBQUFBO0FBQUEsWUFBQUMsU0FBQXJGLEdBQUFELEdBSTdDLDZCQUFtQjtBQUFBLFlBQUF1RixlQUFBdEYsR0FBQUUsR0FBQUg7QUFBQUEsSUFJcEM7QUFBQSxTQUdhO0FBQUEsV0FBQXFGO0FBQUFBLFVBQUFBLE1EbllmO0FBQUEsNEJDbVkwRDtBQUFBLE1EblkxRDtBQUFBO0FBQUEsSUNpWUk7QUFBQSxrRUFFMkQ7QUFBQTtBQUFBLE9BQUFHLFVBL1UzQztBQUFBLFlBQUFDLGNBQUF4RCxLQUFBaEM7QUFBQUE7QUFBQUEsS0FBQSxJQTBWbEI7QUFBQSxTQUNBO0FBQUEsU0FGQTtBQUFBLElBRUE7QUFBQSxTQUFBK0MsTUFBQSxHQUFBekMsTUFBQTtBQUFBO0FBQUEsU0FBQXlDLElBQUEsR0FBQXpDLElBQUEsR0FBQUosSUFBQTtBQUFBO0FBQUEsTUFDRTtBQUFBLFdBQUE2QyxNQUVFLEdBQUF6QyxNQUFBLElBREs7QUFBQTtBQUFBLFdBQUF5QyxNQURQLEdBQUF6QyxNQUFBO0FBQUE7QUFBQSxzQkFBQXlDLE1BQUEsS0FBQXpDLE1BQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFLRiwrQkFBVTtBQUFBLEdBQU07QUFBQSxZQUFBbUYsT0FBQXpGO0FBQUFBLGFBQUEwRixJQUFBeEYsR0FBQWtDO0FBQUFBLEtBTWQsa0NBQXFCO0FBQUEsU0FBQUksSUFFWCwwQkFDSztBQUFBLEtBQVMsMEJBQVQsbUJBQVM7QUFBQSxJQUFDO0FBQUEsSUFFM0IsbUJEaGFGLGtCQ2dhRTtBQUFBLEdBQUs7QUFBQSxZQUFBbUQsUUFBQTNGO0FBQUFBLGFBQUEwRixJQUFBeEYsR0FBQWtDO0FBQUFBLEtBSUgsa0NBQXFCO0FBQUEsU0FBQUksSUFFWCwwQkFDUztBQUFBLEtBQVMsa0NBQVQsbUJBQVM7QUFBQSxJQUFDO0FBQUEsSUFFL0IsbUJEemFGLGtCQ3lhRTtBQUFBLEdBQUs7QUFBQSxZQUFBb0QsT0FBQTFGO0FBQUFBLFFBQUEyRixNQUlTLG1CQUFBL0YsSUFEZDtBQUFBLElBVUE7QUFBQTtBQUFBLGVBQUFDO0FBQUFBLE9BRUs7QUFBQTtBQUFBLFNBQUErRjtBQUFBQSxXQVJXO0FBQUEsdUJBQWQ7QUFBQSxRQUNBO0FBQUEsU0FBOEI7QUFBQSxZQUFBQyxVQUNoQjtBQUFBLFFBQ2Q7QUFBQSxRQUF3QjtBQUFBO0FBQUEsT0FNckI7QUFBQSxPQUFhO0FBQUE7QUFBQSxNQUNQO0FBQUE7QUFBQSxJQUNSLDJCQUNVO0FBQUE7QUFBQSxZQUFBQyxxQkFBQXhGLEdBQUFOO0FBQUFBLElBeUJiO0FBQUEsY0FDc0MsYUFBMUI7QUFBQSxjQUNQLHNCQUF3QjtBQUFBO0FBQUEsWUFBQStGLHFCQUFBekYsR0FBQU47QUFBQUEsSUFHN0I7QUFBQSxjQUNLO0FBQUEsY0FDaUMsYUFBMUIsdUJBQTBCO0FBQUE7QUFBQSxZQUFBZ0csU0FBQTFGLEdBQUFOO0FBQUFBLFFBQUEsSUFHckM7QUFBQSx5Q0FBZTtBQUFBLEdBQStDO0FBQUEsWUFBQWlHLGNBQUEzRixHQUFBTjtBQUFBQSxJQUcvRDtBQUFBLGNBQWlELGFBQW5CO0FBQUEsY0FDekIsc0JBQWlCO0FBQUE7QUFBQSxZQUFBa0csY0FBQTVGLEdBQUFOO0FBQUFBLElBR3RCO0FBQUEsY0FDSztBQUFBLGNBRGdELGFBQW5CLHVCQUNaO0FBQUE7QUFBQSxZQUFBbUcsYUFBQTdGLEdBQUFOO0FBQUFBLFFBQUEsSUFHckI7QUFBQSwyQ0FBbUI7QUFBQSxHQUFpRDtBQUFBLFlBQUFvRyxhQUFBOUYsR0FBQU47QUFBQUEsUUFBQSxJQUdwRTtBQUFBLHdDQUFtQjtBQUFBLEdBQWlEO0FBQUEsWUFBQXFHLGFBQUEvRixHQUFBTjtBQUFBQSxRQUFBLElBR3BFO0FBQUEsd0NBQW1CO0FBQUEsR0FBaUQ7QUFBQSxZQUFBc0csYUFBQWhHLEdBQUFOO0FBQUFBLElBR3JFO0FBQUEsY0FBdUIsaUJBQU87QUFBQSxjQUN6QixzQkFBZ0I7QUFBQTtBQUFBLFlBQUF1RyxhQUFBakcsR0FBQU47QUFBQUEsSUFHckI7QUFBQSxjQUNLO0FBQUEsY0FEc0IsaUJBQU8sdUJBQ2I7QUFBQTtBQUFBLFlBQUF3RyxhQUFBbEcsR0FBQU47QUFBQUEsSUFHckI7QUFBQSxjQUF1QixpQkFBTztBQUFBLGNBQ3pCLHNCQUFnQjtBQUFBO0FBQUEsWUFBQXlHLGFBQUFuRyxHQUFBTjtBQUFBQSxJQUdyQjtBQUFBLGNBQ0s7QUFBQSxjQURzQixpQkFBTyx1QkFDYjtBQUFBO0FBQUEsWUFBQTBHLHFCQUFBcEcsR0FBQU4sR0FBQXNDO0FBQUFBLElBR3JCLG1CQUNLLHlDQUFtQztBQUFBLElBQ25DO0FBQUEsR0FBMEI7QUFBQSxZQUFBcUUscUJBQUFyRyxHQUFBTixHQUFBc0M7QUFBQUEsSUFHL0IsbUJBQ0ssMkJBQTBCO0FBQUEsSUFDL0I7QUFBQSxHQUFtQztBQUFBLFlBQUFzRSxhQUFBdEcsR0FBQU4sR0FBQXNDO0FBQUFBLElBR25DO0FBQUEsY0FBdUI7QUFBQSxjQUNsQix5QkFBa0I7QUFBQTtBQUFBLFlBQUF1RSxhQUFBdkcsR0FBQU4sR0FBQXNDO0FBQUFBLElBR3ZCO0FBQUEsY0FDSztBQUFBLGNBRHNCLHVDQUNKO0FBQUE7QUFBQSxZQUFBd0UsYUFBQXhHLEdBQUFOLEdBQUFzQztBQUFBQSxJQUd2QjtBQUFBLGNBQXVCLHVCQUFpQjtBQUFBLGNBQ25DLHlCQUFrQjtBQUFBO0FBQUEsWUFBQXlFLGFBQUF6RyxHQUFBTixHQUFBc0M7QUFBQUEsSUFHdkI7QUFBQSxjQUNLO0FBQUEsY0FEc0IsdUJBQWlCLG9CQUNyQjtBQUFBO0FBQUEsWUFBQTBFLGFBQUExRyxHQUFBTixHQUFBc0M7QUFBQUEsSUFHdkI7QUFBQSxjQUF1Qix1QkFBaUI7QUFBQSxjQUNuQyx5QkFBa0I7QUFBQTtBQUFBLFlBQUEyRSxhQUFBM0csR0FBQU4sR0FBQXNDO0FBQUFBLElBR3ZCO0FBQUEsY0FDSztBQUFBLGNBRHNCLHVCQUFpQixvQkFDckI7QUFBQTtBQUFBLE9BQUE0RSxjQTllTDtBQUFBLFlBQUFDLFFBQUF2SCxHQUFBd0g7QUFBQUEsUUFBQSxJQXdmMEI7QUFBQSxJQUF1QjtBQUFBO0FBQUEsWUFBQUMsa0JBQUEvRyxHQWtCbEMsbUNBQWU7QUFBQSxZQUFBZ0gsa0JBQUFoSCxHQUNmLG1DQUFnQjtBQUFBLFlBQUFpSCxrQkFBQWpILEdBQ2hCLG1DQUFnQjtBQUFBLFlBQUFrSCxrQkFBQWxIO0FBQUFBLFFBQUEsSUFDaEI7QUFBQTtBQUFBLEdBQW9CO0FBQUEsWUFBQW1ILGtCQUFBbkgsR0FDcEIsbUNBQWM7QUFBQSxZQUFBb0gsY0FBQUMsSUFBQUMsSUFBQUM7QUFBQUEsSUFPL0M7QUFBQSxHQUVnQjtBQUFBLFlBQUFDLGNBQUFILElBQUFDLElBQUFDLElBQUFFO0FBQUFBLElBR2hCO0FBQUEsR0FHZ0I7QUFBQSxZQUFBQyxnQkFBQTFILEdBQUFOO0FBQUFBLFFBQUEySCxLQUdQLHNCQUFBTSxNQUVUO0FBQUE7QUFBQTtBQUFBLEtBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGNBQUFqSSxNQW1CSTtBQUFBLFVBQWlCLGNBQWdCLHFCQTZCakI7QUFBQSxjQUFBNEgsT0E1QlA7QUFBQSxVQUFjLDRCQUEwQixxQkE0QmpDO0FBQUEsY0FBQTVILE1BM0JoQjtBQUFBLFVBQWlCLGNBQWdCLHFCQTJCakI7QUFBQSxjQUFBNkgsT0ExQlA7QUFBQSxVQUFjO0FBQUEsb0JBQTBCO0FBQUEsb0JBQ2YsV0FBeEIsOEJBeUJNO0FBQUE7QUFBQSxjQUFBN0gsTUF2QmhCO0FBQUEsVUFBaUIsY0FBZ0IscUJBdUJqQjtBQUFBLGNBQUE0SCxPQXRCUDtBQUFBLFVBQWMsNEJBQTBCLHFCQXNCakM7QUFBQSxjQUFBNUgsTUFyQmhCO0FBQUEsVUFBaUIsY0FBZ0IscUJBcUJqQjtBQUFBLGNBQUE2SCxPQXBCUDtBQUFBLFVBQWMsNEJBQTBCLHFCQW9CakM7QUFBQSxjQUFBN0gsTUFuQmhCO0FBQUEsVUFBaUIsY0FBZ0IscUJBbUJqQjtBQUFBLGNBQUErSCxPQWxCUDtBQUFBLFVBQWM7QUFBQSxvQkFBMEI7QUFBQSxvQkFDWixXQUEzQixvQ0FpQk07QUFBQTtBQUFBLGNBQUEvSCxPQVBoQjtBQUFBLFVBQWlCLGVBQWdCLHFCQU9qQjtBQUFBLGNBQUE0SCxPQU5QO0FBQUEsVUFBYyw0QkFBMEIscUJBTWpDO0FBQUEsY0FBQTVILE9BTGhCO0FBQUEsVUFBaUIsZUFBZ0IscUJBS2pCO0FBQUEsY0FBQTZILEtBSlA7QUFBQSxVQUFjLDBCQUEwQixxQkFJakM7QUFBQSxjQUFBN0gsT0FIaEI7QUFBQSxVQUFpQixlQUFnQixxQkFHakI7QUFBQSxjQUFBK0gsS0FGUDtBQUFBLFVBQWM7QUFBQSxvQkFBMEI7QUFBQSxvQkFDWixXQUEzQixnQ0FDTTtBQUFBO0FBQUE7QUFBQTtBQUFBLGNBQUEvSCxNQWZoQjtBQUFBLFVBQWlCLGNBQWdCLHFCQWVqQjtBQUFBLGNBQUE0SCxPQWRQO0FBQUEsVUFBYyw0QkFBMEIscUJBY2pDO0FBQUEsY0FBQTVILE1BYmhCO0FBQUEsVUFBaUIsY0FBZ0IscUJBYWpCO0FBQUEsY0FBQTZILE9BWlA7QUFBQSxVQUFjLDRCQUEwQixxQkFZakM7QUFBQSxjQUFBN0gsTUFYaEI7QUFBQSxVQUFpQixjQUFnQixxQkFXakI7QUFBQSxjQUFBK0gsT0FWUDtBQUFBLFVBQWM7QUFBQSxvQkFBMEI7QUFBQSxvQkFDWixXQUEzQixvQ0FTTTtBQUFBO0FBQUE7QUFBQTtBQUFBLFdBQUEvSCxPQXpDaEI7QUFBQSxPQUFpQixlQUFnQixxQkF5Q2pCO0FBQUEsV0FBQTRILE9BeENQO0FBQUEsT0FBYyw0QkFBMEIscUJBd0NqQztBQUFBLFdBQUE1SCxPQXZDaEI7QUFBQSxPQUFpQixlQUFnQixxQkF1Q2pCO0FBQUEsV0FBQTZILE9BdENQO0FBQUEsT0FBYztBQUFBLGlCQUEwQjtBQUFBLGlCQUNmLFdBQXhCLDhCQXFDTTtBQUFBO0FBQUEsVUFBQTdILE1BbkNoQjtBQUFBLE1BQWlCLGNBQWdCLHFCQW1DakI7QUFBQSxVQUFBNEgsT0FsQ1A7QUFBQSxNQUFjLDRCQUEwQixxQkFrQ2pDO0FBQUEsVUFBQTVILE1BakNoQjtBQUFBLE1BQWlCLGNBQWdCLHFCQWlDakI7QUFBQSxVQUFBNkgsT0FoQ1A7QUFBQSxNQUFjO0FBQUEsZ0JBQTBCO0FBQUEsZ0JBQ2YsV0FBeEIsOEJBK0JNO0FBQUE7QUFBQSxLQWhEcEIsYUFDc0IscUJBK0NGO0FBQUEsS0FoRHBCO0FBQUEsVUFBQTdILE9BR0k7QUFBQSxNQUFpQixlQUFnQixxQkE2Q2pCO0FBQUEsVUFBQTRILEtBNUNQO0FBQUEsTUFBYztBQUFBLGdCQUEwQjtBQUFBLGdCQUNsQixvQ0EyQ2Y7QUFBQTtBQUFBO0FBQUEsSUFBYixxQkFBYTtBQUFBO0FBQUE7QUFBQSxJQUFBTSxlRHZvQnRCO0FBQUEsUUNvRG9CO0FBQUE7QUFBQSxZQUFBQyxnQkFBQTdILEtBQUFOLEdBQUFvSDtBQUFBQSxhQUFBZ0IsSUFBQSxTRHBEcEI7QUFBQTtBQUFBLEtBQUFILE1DMm9CRTtBQUFBLEtBQUFiLE1BQ007QUFBQSxJQUNHLFlBQVM7QUFBQSxJQUNULGVBQ0wsNkJBQWU7QUFBQSxJQUVWO0FBQUEsU0FBQWlCLFNBQ0w7QUFBQSxLQUNBO0FBQUE7QUFBQSxnQkFDQztBQUFBO0FBQUEsZUFDQTtBQUFBLGlCQWlCYztBQUFBO0FBQUEsSUFmVjtBQUFBLFNBQUFBLFNBQ0w7QUFBQSxLQUNBO0FBQUE7QUFBQSxnQkFDQztBQUFBO0FBQUEsZUFDQTtBQUFBLGVBQ0E7QUFBQSxpQkFVYztBQUFBO0FBQUEsSUFSVjtBQUFBLEtBUUY7QUFBQSxRQUFBQSxPQVBIO0FBQUEsSUFDQTtBQUFBO0FBQUEsZUFDQztBQUFBO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsZ0JBRWM7QUFBQTtBQUFBLFlBQUFDLGVBQUFoSTtBQUFBQSxRQUFBMkgsTUE2RG5CLGlDQUFBakksSUFBQTtBQUFBO0FBQUEsS0F6REUsWUFBZ0I7QUFBQSxTQUFBYSxRQUVNO0FBQUE7QUFBQTtBQUFBLE1BQVM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGVBQUF3SCxPQXVCM0I7QUFBQSxXQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FDRyxrQkFBa0I7QUFBQSxtQkFDbEIsa0JBQWtCLHFDQUFBckksTUFFaEI7QUFBQSxXQURBO0FBQUE7QUFBQSxlQUFBcUksU0FHTDtBQUFBLFdBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxjQUNHLGtCQUFrQjtBQUFBO0FBQUE7QUFBQSxlQUNsQixrQkFBa0I7QUFBQSxvQkFDbEIsa0JBQWtCLHVDQUFBckksTUFFaEI7QUFBQSxXQURBO0FBQUE7QUFBQSxlQUFBcUksU0FXTDtBQUFBLFdBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxjQUNHLGtCQUFrQjtBQUFBO0FBQUE7QUFBQSxlQUNsQixrQkFBa0I7QUFBQSxvQkFDbEIsa0JBQWtCLHVDQUFBckksTUFFaEI7QUFBQSxXQURBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUFBQXFJLFNBYkw7QUFBQSxXQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FDRyxrQkFBa0I7QUFBQTtBQUFBO0FBQUEsZUFDbEIsa0JBQWtCO0FBQUEsb0JBQ2xCLGtCQUFrQix1Q0FBQXJJLE1BRWhCO0FBQUEsV0FEQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFxSSxTQWxDTDtBQUFBLFFBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxXQUNHLGtCQUFrQjtBQUFBLGdCQUNsQixrQkFBa0IsdUNBQUFySSxNQUVoQjtBQUFBLFFBREE7QUFBQTtBQUFBLFdBQUFxSSxTQUdMO0FBQUEsT0FDQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBQ0csa0JBQWtCO0FBQUEsZUFDbEIsa0JBQWtCLHVDQUFBckksTUFFaEI7QUFBQSxPQURBO0FBQUE7QUFBQSxNQXBCc0Isb0JBQUFBLE1BQ1Q7QUFBQSxNQURTO0FBQUEsV0FBQXFJLFNBRzNCO0FBQUEsT0FDQTtBQUFBO0FBQUEsY0FDRyxrQkFBa0IsdUNBQUFySSxNQUVoQjtBQUFBLE9BREE7QUFBQTtBQUFBO0FBQUEsS0ErQ0Y7QUFBQTtBQUFBLEdBRWM7QUFBQSxPQUFBdUksMEJEbnVCekI7QUFBQSxZQUFBQyxtQkFBQWxJLEdBQUFOO0FBQUFBLFFBQUFpSSxNQ3l1QkU7QUFBQSxJQUNBO0FBQUEsS0FDQSxjQUFnQixxQkFXRztBQUFBLFNBQUFRLEtBVmI7QUFBQSxLQUNHO0FBQUEsTUFDQSxlQUFjLHFCQVFKO0FBQUEsVUFBQUosT0FOZjtBQUFBLE1BQ0EsZUFBbUIseUNBS0o7QUFBQSxVQUFBSyxLQUpUO0FBQUEsTUFDRztBQUFBLFdBQUF0QixJQUVMO0FBQUEsT0FDQSxvQkFBVztBQUFBO0FBQUEsTUFIc0IscUJBR3RCO0FBQUE7QUFBQSxLQVRrQixxQkFTbEI7QUFBQTtBQUFBLElBWk0sb0RBWU47QUFBQTtBQUFBLFdBbHNCRDtBQUFBLFlBQUF1QixtQkFBQXJJLEdBQUFOLEdBQUFvSDtBQUFBQSxRQUFBYSxNQXNzQmxCO0FBQUEsSUFDQTtBQUFBLFNBQUFiLE1BQ007QUFBQSxLQUNHLFlBQVM7QUFBQSxLQUNUO0FBQUEsVUFBQWlCLFNBQ0w7QUFBQSxNQUNBLDJCQUEyQixtQ0FRWjtBQUFBO0FBQUEsS0FQVjtBQUFBLE1BT0Y7QUFBQSxTQUFBQSxPQU5IO0FBQUEsS0FDQSxlQUFtQjtBQUFBO0FBQUEsTUFBQWpCLE1BQ25CO0FBQUEsTUFBQXFCLEtBQ0E7QUFBQSxNQUFBQyxLQUNBO0FBQUEsS0FDQTtBQUFBLEtBQVk7QUFBQSxLQUFnQjtBQUFBO0FBQUEsSUFaUCxvREFhTjtBQUFBO0FBQUEsWUFBQUUsa0JBQUF0STtBQUFBQSxRQUFBMkgsTUFpQm5CLGlDQUFBakksSUFBQTtBQUFBO0FBQUEsS0FaRSxZQUFnQjtBQUFBLEtBQ2hCLGNBQWdCO0FBQUEsU0FBQW9ILElBQ1Y7QUFBQSxLQUNHO0FBQUEsTUFDQSxjQUFjO0FBQUEsVUFBQWlCLE9BRW5CO0FBQUEsTUFDQSxlQUFtQjtBQUFBLFVBQUFqQixNQUNiO0FBQUEsTUFDRztBQUFBLFdBQUFwSCxNQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFENEI7QUFBQTtBQUFBLFNBQUFBLE1BTko7QUFBQTtBQUFBO0FBQUEsR0FTaEI7QUFBQSxZQUFBNkksbUJBQUF2SSxHQUFBTjtBQUFBQSxRQUFBaUksTUFNdkI7QUFBQSxJQUNBO0FBQUEsS0FDQSxjQUFnQixxQkFXRztBQUFBLFNBQUFRLEtBVmI7QUFBQSxLQUNHO0FBQUEsTUFDQSxlQUFjLHFCQVFKO0FBQUEsVUFBQUosT0FOZjtBQUFBLE1BQ0EsZUFBbUIseUNBS0o7QUFBQSxVQUFBSyxLQUpUO0FBQUEsTUFDRztBQUFBLFdBQUF0QixJQUVMO0FBQUEsT0FDQSxvQkFBVztBQUFBO0FBQUEsTUFIc0IscUJBR3RCO0FBQUE7QUFBQSxLQVRrQixxQkFTbEI7QUFBQTtBQUFBLElBWk0sb0RBWU47QUFBQTtBQUFBLFdBeHZCRDtBQUFBLFlBQUEwQixtQkFBQXhJLEdBQUFOLEdBQUFvSDtBQUFBQSxRQUFBYSxNQTR2QmxCO0FBQUEsSUFDQTtBQUFBLFNBQUFiLE1BQ007QUFBQSxLQUNHLFlBQVM7QUFBQSxLQUNUO0FBQUEsVUFBQWlCLFNBQ0w7QUFBQSxNQUNBLDJCQUEyQixtQ0FRWjtBQUFBO0FBQUEsS0FQVjtBQUFBLE1BT0Y7QUFBQSxTQUFBQSxPQU5IO0FBQUEsS0FDQSxlQUFtQjtBQUFBO0FBQUEsTUFBQWpCLE1BQ25CO0FBQUEsTUFBQXFCLEtBQ0E7QUFBQSxNQUFBQyxLQUNBO0FBQUEsS0FDQTtBQUFBLEtBQVk7QUFBQSxLQUFnQjtBQUFBO0FBQUEsSUFaUCxvREFhTjtBQUFBO0FBQUEsWUFBQUssa0JBQUF6STtBQUFBQSxRQUFBMkgsTUFpQm5CLGlDQUFBakksSUFBQTtBQUFBO0FBQUEsS0FaRSxZQUFnQjtBQUFBLEtBQ2hCLGNBQWdCO0FBQUEsU0FBQW9ILElBQ1Y7QUFBQSxLQUNHO0FBQUEsTUFDQSxjQUFjO0FBQUEsVUFBQWlCLE9BRW5CO0FBQUEsTUFDQSxlQUFtQjtBQUFBLFVBQUFqQixNQUNiO0FBQUEsTUFDRztBQUFBLFdBQUFwSCxNQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFENEI7QUFBQTtBQUFBLFNBQUFBLE1BTko7QUFBQTtBQUFBO0FBQUEsR0FTaEI7QUFBQTtBQUFBLElBQUFnSjtBQUFBQSxNQTN4Qkw7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRURwRHBCIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTM5MTIsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvc3RyaW5nLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgR2FsbGl1bSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBTdHJpbmcgb3BlcmF0aW9ucywgYmFzZWQgb24gYnl0ZSBzZXF1ZW5jZSBvcGVyYXRpb25zICopXG5cbigqIFdBUk5JTkc6IFNvbWUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBhcmUgZHVwbGljYXRlZCBpbiBieXRlcy5tbCBmb3JcbiAgIGVmZmljaWVuY3kgcmVhc29ucy4gV2hlbiB5b3UgbW9kaWZ5IHRoZSBvbmUgaW4gdGhpcyBmaWxlIHlvdSBuZWVkIHRvXG4gICBtb2RpZnkgaXRzIGR1cGxpY2F0ZSBpbiBieXRlcy5tbC5cbiAgIFRoZXNlIGZ1bmN0aW9ucyBoYXZlIGEgXCJkdXBsaWNhdGVkXCIgY29tbWVudCBhYm92ZSB0aGVpciBkZWZpbml0aW9uLlxuKilcblxuZXh0ZXJuYWwgbGVuZ3RoIDogc3RyaW5nIC0+IGludCA9IFwiJXN0cmluZ19sZW5ndGhcIlxuZXh0ZXJuYWwgZ2V0IDogc3RyaW5nIC0+IGludCAtPiBjaGFyID0gXCIlc3RyaW5nX3NhZmVfZ2V0XCJcbmV4dGVybmFsIHVuc2FmZV9nZXQgOiBzdHJpbmcgLT4gaW50IC0+IGNoYXIgPSBcIiVzdHJpbmdfdW5zYWZlX2dldFwiXG5leHRlcm5hbCB1bnNhZmVfYmxpdCA6IHN0cmluZyAtPiBpbnQgLT4gIGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfYmxpdF9zdHJpbmdcIiBbQEBub2FsbG9jXVxuXG5tb2R1bGUgQiA9IEJ5dGVzXG5cbmxldCBidHMgPSBCLnVuc2FmZV90b19zdHJpbmdcbmxldCBib3MgPSBCLnVuc2FmZV9vZl9zdHJpbmdcblxubGV0IG1ha2UgbiBjID1cbiAgQi5tYWtlIG4gYyB8PiBidHNcbmxldCBpbml0IG4gZiA9XG4gIEIuaW5pdCBuIGYgfD4gYnRzXG5sZXQgZW1wdHkgPSBcIlwiXG5sZXQgb2ZfYnl0ZXMgPSBCLnRvX3N0cmluZ1xubGV0IHRvX2J5dGVzID0gQi5vZl9zdHJpbmdcbmxldCBzdWIgcyBvZnMgbGVuID1cbiAgQi5zdWIgKGJvcyBzKSBvZnMgbGVuIHw+IGJ0c1xubGV0IGJsaXQgPVxuICBCLmJsaXRfc3RyaW5nXG5cbmxldCBlbnN1cmVfZ2UgKHg6aW50KSB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIGludmFsaWRfYXJnIFwiU3RyaW5nLmNvbmNhdFwiXG5cbmxldCByZWMgc3VtX2xlbmd0aHMgYWNjIHNlcGxlbiA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gYWNjXG4gIHwgaGQgOjogW10gLT4gbGVuZ3RoIGhkICsgYWNjXG4gIHwgaGQgOjogdGwgLT4gc3VtX2xlbmd0aHMgKGVuc3VyZV9nZSAobGVuZ3RoIGhkICsgc2VwbGVuICsgYWNjKSBhY2MpIHNlcGxlbiB0bFxuXG5sZXQgcmVjIHVuc2FmZV9ibGl0cyBkc3QgcG9zIHNlcCBzZXBsZW4gPSBmdW5jdGlvblxuICAgIFtdIC0+IGRzdFxuICB8IGhkIDo6IFtdIC0+XG4gICAgdW5zYWZlX2JsaXQgaGQgMCBkc3QgcG9zIChsZW5ndGggaGQpOyBkc3RcbiAgfCBoZCA6OiB0bCAtPlxuICAgIHVuc2FmZV9ibGl0IGhkIDAgZHN0IHBvcyAobGVuZ3RoIGhkKTtcbiAgICB1bnNhZmVfYmxpdCBzZXAgMCBkc3QgKHBvcyArIGxlbmd0aCBoZCkgc2VwbGVuO1xuICAgIHVuc2FmZV9ibGl0cyBkc3QgKHBvcyArIGxlbmd0aCBoZCArIHNlcGxlbikgc2VwIHNlcGxlbiB0bFxuXG5sZXQgY29uY2F0IHNlcCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gXCJcIlxuICB8IGwgLT4gbGV0IHNlcGxlbiA9IGxlbmd0aCBzZXAgaW4gYnRzIEBAXG4gICAgICAgICAgdW5zYWZlX2JsaXRzXG4gICAgICAgICAgICAoQi5jcmVhdGUgKHN1bV9sZW5ndGhzIDAgc2VwbGVuIGwpKVxuICAgICAgICAgICAgMCBzZXAgc2VwbGVuIGxcblxubGV0IGNhdCA9ICggXiApXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBpdGVyIGYgcyA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggcyAtIDEgZG8gZiAodW5zYWZlX2dldCBzIGkpIGRvbmVcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IGl0ZXJpIGYgcyA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggcyAtIDEgZG8gZiBpICh1bnNhZmVfZ2V0IHMgaSkgZG9uZVxuXG5sZXQgbWFwIGYgcyA9XG4gIEIubWFwIGYgKGJvcyBzKSB8PiBidHNcbmxldCBtYXBpIGYgcyA9XG4gIEIubWFwaSBmIChib3MgcykgfD4gYnRzXG5sZXQgZm9sZF9yaWdodCBmIHggYSA9XG4gIEIuZm9sZF9yaWdodCBmIChib3MgeCkgYVxubGV0IGZvbGRfbGVmdCBmIGEgeCA9XG4gIEIuZm9sZF9sZWZ0IGYgYSAoYm9zIHgpXG5sZXQgZXhpc3RzIGYgcyA9XG4gIEIuZXhpc3RzIGYgKGJvcyBzKVxubGV0IGZvcl9hbGwgZiBzID1cbiAgQi5mb3JfYWxsIGYgKGJvcyBzKVxuXG4oKiBCZXdhcmU6IHdlIGNhbm5vdCB1c2UgQi50cmltIG9yIEIuZXNjYXBlIGJlY2F1c2UgdGhleSBhbHdheXMgbWFrZSBhXG4gICBjb3B5LCBidXQgU3RyaW5nLm1saSBzcGVsbHMgb3V0IHNvbWUgY2FzZXMgd2hlcmUgd2UgYXJlIG5vdCBhbGxvd2VkXG4gICB0byBtYWtlIGEgY29weS4gKilcblxubGV0IGlzX3NwYWNlID0gZnVuY3Rpb25cbiAgfCAnICcgfCAnXFwwMTInIHwgJ1xcbicgfCAnXFxyJyB8ICdcXHQnIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG5cbmxldCB0cmltIHMgPVxuICBpZiBzID0gXCJcIiB0aGVuIHNcbiAgZWxzZSBpZiBpc19zcGFjZSAodW5zYWZlX2dldCBzIDApIHx8IGlzX3NwYWNlICh1bnNhZmVfZ2V0IHMgKGxlbmd0aCBzIC0gMSkpXG4gICAgdGhlbiBidHMgKEIudHJpbSAoYm9zIHMpKVxuICBlbHNlIHNcblxubGV0IGVzY2FwZWQgcyA9XG4gIGxldCBiID0gYm9zIHMgaW5cbiAgKCogV2Ugc2F0aXNmeSBbdW5zYWZlX2VzY2FwZV0ncyBwcmVjb25kaXRpb24gYnkgcGFzc2luZyBhblxuICAgICBpbW11dGFibGUgYnl0ZSBzZXF1ZW5jZSBbYl0uICopXG4gIGJ0cyAoQi51bnNhZmVfZXNjYXBlIGIpXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByZWMgaW5kZXhfcmVjIHMgbGltIGkgYyA9XG4gIGlmIGkgPj0gbGltIHRoZW4gcmFpc2UgTm90X2ZvdW5kIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gaSBlbHNlIGluZGV4X3JlYyBzIGxpbSAoaSArIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IGluZGV4IHMgYyA9IGluZGV4X3JlYyBzIChsZW5ndGggcykgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByZWMgaW5kZXhfcmVjX29wdCBzIGxpbSBpIGMgPVxuICBpZiBpID49IGxpbSB0aGVuIE5vbmUgZWxzZVxuICBpZiB1bnNhZmVfZ2V0IHMgaSA9IGMgdGhlbiBTb21lIGkgZWxzZSBpbmRleF9yZWNfb3B0IHMgbGltIChpICsgMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgaW5kZXhfb3B0IHMgYyA9IGluZGV4X3JlY19vcHQgcyAobGVuZ3RoIHMpIDAgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgaW5kZXhfZnJvbSBzIGkgYyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IGwgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5pbmRleF9mcm9tIC8gQnl0ZXMuaW5kZXhfZnJvbVwiIGVsc2VcbiAgICBpbmRleF9yZWMgcyBsIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgaW5kZXhfZnJvbV9vcHQgcyBpIGMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBsIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5pbmRleF9mcm9tX29wdCAvIEJ5dGVzLmluZGV4X2Zyb21fb3B0XCJcbiAgZWxzZVxuICAgIGluZGV4X3JlY19vcHQgcyBsIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgcmVjIHJpbmRleF9yZWMgcyBpIGMgPVxuICBpZiBpIDwgMCB0aGVuIHJhaXNlIE5vdF9mb3VuZCBlbHNlXG4gIGlmIHVuc2FmZV9nZXQgcyBpID0gYyB0aGVuIGkgZWxzZSByaW5kZXhfcmVjIHMgKGkgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByaW5kZXggcyBjID0gcmluZGV4X3JlYyBzIChsZW5ndGggcyAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHJpbmRleF9mcm9tIHMgaSBjID1cbiAgaWYgaSA8IC0xIHx8IGkgPj0gbGVuZ3RoIHMgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLnJpbmRleF9mcm9tIC8gQnl0ZXMucmluZGV4X2Zyb21cIlxuICBlbHNlXG4gICAgcmluZGV4X3JlYyBzIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgcmVjIHJpbmRleF9yZWNfb3B0IHMgaSBjID1cbiAgaWYgaSA8IDAgdGhlbiBOb25lIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gU29tZSBpIGVsc2UgcmluZGV4X3JlY19vcHQgcyAoaSAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHJpbmRleF9vcHQgcyBjID0gcmluZGV4X3JlY19vcHQgcyAobGVuZ3RoIHMgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByaW5kZXhfZnJvbV9vcHQgcyBpIGMgPVxuICBpZiBpIDwgLTEgfHwgaSA+PSBsZW5ndGggcyB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcucmluZGV4X2Zyb21fb3B0IC8gQnl0ZXMucmluZGV4X2Zyb21fb3B0XCJcbiAgZWxzZVxuICAgIHJpbmRleF9yZWNfb3B0IHMgaSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBjb250YWluc19mcm9tIHMgaSBjID1cbiAgbGV0IGwgPSBsZW5ndGggcyBpblxuICBpZiBpIDwgMCB8fCBpID4gbCB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcuY29udGFpbnNfZnJvbSAvIEJ5dGVzLmNvbnRhaW5zX2Zyb21cIlxuICBlbHNlXG4gICAgdHJ5IGlnbm9yZSAoaW5kZXhfcmVjIHMgbCBpIGMpOyB0cnVlIHdpdGggTm90X2ZvdW5kIC0+IGZhbHNlXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBjb250YWlucyBzIGMgPSBjb250YWluc19mcm9tIHMgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByY29udGFpbnNfZnJvbSBzIGkgYyA9XG4gIGlmIGkgPCAwIHx8IGkgPj0gbGVuZ3RoIHMgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLnJjb250YWluc19mcm9tIC8gQnl0ZXMucmNvbnRhaW5zX2Zyb21cIlxuICBlbHNlXG4gICAgdHJ5IGlnbm9yZSAocmluZGV4X3JlYyBzIGkgYyk7IHRydWUgd2l0aCBOb3RfZm91bmQgLT4gZmFsc2VcblxubGV0IHVwcGVyY2FzZV9hc2NpaSBzID1cbiAgQi51cHBlcmNhc2VfYXNjaWkgKGJvcyBzKSB8PiBidHNcbmxldCBsb3dlcmNhc2VfYXNjaWkgcyA9XG4gIEIubG93ZXJjYXNlX2FzY2lpIChib3MgcykgfD4gYnRzXG5sZXQgY2FwaXRhbGl6ZV9hc2NpaSBzID1cbiAgQi5jYXBpdGFsaXplX2FzY2lpIChib3MgcykgfD4gYnRzXG5sZXQgdW5jYXBpdGFsaXplX2FzY2lpIHMgPVxuICBCLnVuY2FwaXRhbGl6ZV9hc2NpaSAoYm9zIHMpIHw+IGJ0c1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgc3RhcnRzX3dpdGggfnByZWZpeCBzID1cbiAgbGV0IGxlbl9zID0gbGVuZ3RoIHNcbiAgYW5kIGxlbl9wcmUgPSBsZW5ndGggcHJlZml4IGluXG4gIGxldCByZWMgYXV4IGkgPVxuICAgIGlmIGkgPSBsZW5fcHJlIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgdW5zYWZlX2dldCBzIGkgPD4gdW5zYWZlX2dldCBwcmVmaXggaSB0aGVuIGZhbHNlXG4gICAgZWxzZSBhdXggKGkgKyAxKVxuICBpbiBsZW5fcyA+PSBsZW5fcHJlICYmIGF1eCAwXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBlbmRzX3dpdGggfnN1ZmZpeCBzID1cbiAgbGV0IGxlbl9zID0gbGVuZ3RoIHNcbiAgYW5kIGxlbl9zdWYgPSBsZW5ndGggc3VmZml4IGluXG4gIGxldCBkaWZmID0gbGVuX3MgLSBsZW5fc3VmIGluXG4gIGxldCByZWMgYXV4IGkgPVxuICAgIGlmIGkgPSBsZW5fc3VmIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgdW5zYWZlX2dldCBzIChkaWZmICsgaSkgPD4gdW5zYWZlX2dldCBzdWZmaXggaSB0aGVuIGZhbHNlXG4gICAgZWxzZSBhdXggKGkgKyAxKVxuICBpbiBkaWZmID49IDAgJiYgYXV4IDBcblxuZXh0ZXJuYWwgc2VlZGVkX2hhc2ggOiBpbnQgLT4gc3RyaW5nIC0+IGludCA9IFwiY2FtbF9zdHJpbmdfaGFzaFwiIFtAQG5vYWxsb2NdXG5sZXQgaGFzaCB4ID0gc2VlZGVkX2hhc2ggMCB4XG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBzcGxpdF9vbl9jaGFyIHNlcCBzID1cbiAgbGV0IHIgPSByZWYgW10gaW5cbiAgbGV0IGogPSByZWYgKGxlbmd0aCBzKSBpblxuICBmb3IgaSA9IGxlbmd0aCBzIC0gMSBkb3dudG8gMCBkb1xuICAgIGlmIHVuc2FmZV9nZXQgcyBpID0gc2VwIHRoZW4gYmVnaW5cbiAgICAgIHIgOj0gc3ViIHMgKGkgKyAxKSAoIWogLSBpIC0gMSkgOjogIXI7XG4gICAgICBqIDo9IGlcbiAgICBlbmRcbiAgZG9uZTtcbiAgc3ViIHMgMCAhaiA6OiAhclxuXG50eXBlIHQgPSBzdHJpbmdcblxubGV0IGNvbXBhcmUgKHg6IHQpICh5OiB0KSA9IFN0ZGxpYi5jb21wYXJlIHggeVxuZXh0ZXJuYWwgZXF1YWwgOiBzdHJpbmcgLT4gc3RyaW5nIC0+IGJvb2wgPSBcImNhbWxfc3RyaW5nX2VxdWFsXCIgW0BAbm9hbGxvY11cblxuKCoqIHsxIEl0ZXJhdG9yc30gKilcblxubGV0IHRvX3NlcSBzID0gYm9zIHMgfD4gQi50b19zZXFcblxubGV0IHRvX3NlcWkgcyA9IGJvcyBzIHw+IEIudG9fc2VxaVxuXG5sZXQgb2Zfc2VxIGcgPSBCLm9mX3NlcSBnIHw+IGJ0c1xuXG4oKiBVVEYgZGVjb2RlcnMgYW5kIHZhbGlkYXRvcnMgKilcblxubGV0IGdldF91dGZfOF91Y2hhciBzIGkgPSBCLmdldF91dGZfOF91Y2hhciAoYm9zIHMpIGlcbmxldCBpc192YWxpZF91dGZfOCBzID0gQi5pc192YWxpZF91dGZfOCAoYm9zIHMpXG5cbmxldCBnZXRfdXRmXzE2YmVfdWNoYXIgcyBpID0gQi5nZXRfdXRmXzE2YmVfdWNoYXIgKGJvcyBzKSBpXG5sZXQgaXNfdmFsaWRfdXRmXzE2YmUgcyA9IEIuaXNfdmFsaWRfdXRmXzE2YmUgKGJvcyBzKVxuXG5sZXQgZ2V0X3V0Zl8xNmxlX3VjaGFyIHMgaSA9IEIuZ2V0X3V0Zl8xNmxlX3VjaGFyIChib3MgcykgaVxubGV0IGlzX3ZhbGlkX3V0Zl8xNmxlIHMgPSBCLmlzX3ZhbGlkX3V0Zl8xNmxlIChib3MgcylcblxuKCoqIHs2IEJpbmFyeSBlbmNvZGluZy9kZWNvZGluZyBvZiBpbnRlZ2Vyc30gKilcblxuZXh0ZXJuYWwgZ2V0X3VpbnQ4IDogc3RyaW5nIC0+IGludCAtPiBpbnQgPSBcIiVzdHJpbmdfc2FmZV9nZXRcIlxuZXh0ZXJuYWwgZ2V0X3VpbnQxNl9uZSA6IHN0cmluZyAtPiBpbnQgLT4gaW50ID0gXCIlY2FtbF9zdHJpbmdfZ2V0MTZcIlxuZXh0ZXJuYWwgZ2V0X2ludDMyX25lIDogc3RyaW5nIC0+IGludCAtPiBpbnQzMiA9IFwiJWNhbWxfc3RyaW5nX2dldDMyXCJcbmV4dGVybmFsIGdldF9pbnQ2NF9uZSA6IHN0cmluZyAtPiBpbnQgLT4gaW50NjQgPSBcIiVjYW1sX3N0cmluZ19nZXQ2NFwiXG5cbmxldCBnZXRfaW50OCBzIGkgPSBCLmdldF9pbnQ4IChib3MgcykgaVxubGV0IGdldF91aW50MTZfbGUgcyBpID0gQi5nZXRfdWludDE2X2xlIChib3MgcykgaVxubGV0IGdldF91aW50MTZfYmUgcyBpID0gQi5nZXRfdWludDE2X2JlIChib3MgcykgaVxubGV0IGdldF9pbnQxNl9uZSBzIGkgPSBCLmdldF9pbnQxNl9uZSAoYm9zIHMpIGlcbmxldCBnZXRfaW50MTZfbGUgcyBpID0gQi5nZXRfaW50MTZfbGUgKGJvcyBzKSBpXG5sZXQgZ2V0X2ludDE2X2JlIHMgaSA9IEIuZ2V0X2ludDE2X2JlIChib3MgcykgaVxubGV0IGdldF9pbnQzMl9sZSBzIGkgPSBCLmdldF9pbnQzMl9sZSAoYm9zIHMpIGlcbmxldCBnZXRfaW50MzJfYmUgcyBpID0gQi5nZXRfaW50MzJfYmUgKGJvcyBzKSBpXG5sZXQgZ2V0X2ludDY0X2xlIHMgaSA9IEIuZ2V0X2ludDY0X2xlIChib3MgcykgaVxubGV0IGdldF9pbnQ2NF9iZSBzIGkgPSBCLmdldF9pbnQ2NF9iZSAoYm9zIHMpIGlcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9ibGl0X3N0cmluZyIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfbWxfc3RyaW5nX2xlbmd0aCIsImNhbWxfc3RyaW5nX2VxdWFsIiwiY2FtbF9zdHJpbmdfaGFzaCIsImNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQiLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImdsb2JhbF9kYXRhIiwiU3RkbGliIiwiU3RkbGliX0J5dGVzIiwiYnRzIiwiYm9zIiwibWFrZSIsIm4iLCJjIiwiaW5pdCIsIm9mX2J5dGVzIiwidG9fYnl0ZXMiLCJzdWIiLCJzIiwib2ZzIiwibGVuIiwiYmxpdCIsImNzdCIsImNvbmNhdCIsInNlcCIsImwiLCJzZXBsZW4iLCJhY2MiLCJwYXJhbSIsInBvcyIsImhkIiwidGwiLCJ4IiwiZHN0IiwiY2F0IiwiaXRlciIsImkiLCJpdGVyaSIsIm1hcCIsIm1hcGkiLCJmb2xkX3JpZ2h0IiwiYSIsImZvbGRfbGVmdCIsImV4aXN0cyIsImZvcl9hbGwiLCJpc19zcGFjZSIsInRyaW0iLCJlc2NhcGVkIiwiYiIsImluZGV4X3JlYyIsImxpbSIsImluZGV4IiwiaW5kZXhfcmVjX29wdCIsImluZGV4X29wdCIsImluZGV4X2Zyb20iLCJpbmRleF9mcm9tX29wdCIsInJpbmRleF9yZWMiLCJyaW5kZXgiLCJyaW5kZXhfZnJvbSIsInJpbmRleF9yZWNfb3B0IiwicmluZGV4X29wdCIsInJpbmRleF9mcm9tX29wdCIsImNvbnRhaW5zX2Zyb20iLCJleG4iLCJjb250YWlucyIsInJjb250YWluc19mcm9tIiwidXBwZXJjYXNlX2FzY2lpIiwibG93ZXJjYXNlX2FzY2lpIiwiY2FwaXRhbGl6ZV9hc2NpaSIsInVuY2FwaXRhbGl6ZV9hc2NpaSIsInN0YXJ0c193aXRoIiwicHJlZml4IiwibGVuX3MiLCJsZW5fcHJlIiwiZW5kc193aXRoIiwic3VmZml4IiwibGVuX3N1ZiIsImRpZmYiLCJoYXNoIiwic3BsaXRfb25fY2hhciIsImoiLCJyIiwiY29tcGFyZSIsInRvX3NlcSIsInRvX3NlcWkiLCJvZl9zZXEiLCJnIiwiZ2V0X3V0Zl84X3VjaGFyIiwiaXNfdmFsaWRfdXRmXzgiLCJnZXRfdXRmXzE2YmVfdWNoYXIiLCJpc192YWxpZF91dGZfMTZiZSIsImdldF91dGZfMTZsZV91Y2hhciIsImlzX3ZhbGlkX3V0Zl8xNmxlIiwiZ2V0X2ludDgiLCJnZXRfdWludDE2X2xlIiwiZ2V0X3VpbnQxNl9iZSIsImdldF9pbnQxNl9uZSIsImdldF9pbnQxNl9sZSIsImdldF9pbnQxNl9iZSIsImdldF9pbnQzMl9sZSIsImdldF9pbnQzMl9iZSIsImdldF9pbnQ2NF9sZSIsImdldF9pbnQ2NF9iZSIsIlN0ZGxpYl9TdHJpbmciXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLHdCQUFBO0FBQUEsSUFBQUMsb0JBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLHlCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsTUFBQTtBQUFBLElBQUFDLE1BQUE7QUFBQSxZQUFBQyxLQUFBQyxHQUFBQyxHQ21DRSxPQUFVLElBQVYsaUNBQWlCO0FBQUEsWUFBQUMsS0FBQUYsR0FBQVYsR0FFakIsT0FBVSxJQUFWLGlDQUFpQjtBQUFBLE9BQUFhLFdEckNuQixpQkFBQUMs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O0FBQUFBLFFBQUEsSUFDQztBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUEyRCxjQUFBN0UsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUE0RCxhQUFBOUUsR0FBQWtCO0FBQUFBLFFBQUEsSUFDWDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUE2RCxhQUFBL0UsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUE4RCxhQUFBaEYsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUErRCxhQUFBakYsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUFnRSxhQUFBbEYsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUFpRSxhQUFBbkYsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUFrRSxhQUFBcEYsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBO0FBQUEsSUFBQW1FO0FBQUFBLE1EblIvQyIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjE0MzY5LCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2FycmF5Lm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBBbiBhbGlhcyBmb3IgdGhlIHR5cGUgb2YgYXJyYXlzLiAqKVxudHlwZSAnYSB0ID0gJ2EgYXJyYXlcblxuKCogQXJyYXkgb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCBsZW5ndGggOiAnYSBhcnJheSAtPiBpbnQgPSBcIiVhcnJheV9sZW5ndGhcIlxuZXh0ZXJuYWwgZ2V0OiAnYSBhcnJheSAtPiBpbnQgLT4gJ2EgPSBcIiVhcnJheV9zYWZlX2dldFwiXG5leHRlcm5hbCBzZXQ6ICdhIGFycmF5IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCIlYXJyYXlfc2FmZV9zZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX2dldDogJ2EgYXJyYXkgLT4gaW50IC0+ICdhID0gXCIlYXJyYXlfdW5zYWZlX2dldFwiXG5leHRlcm5hbCB1bnNhZmVfc2V0OiAnYSBhcnJheSAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9IFwiJWFycmF5X3Vuc2FmZV9zZXRcIlxuZXh0ZXJuYWwgbWFrZTogaW50IC0+ICdhIC0+ICdhIGFycmF5ID0gXCJjYW1sX21ha2VfdmVjdFwiXG5leHRlcm5hbCBjcmVhdGU6IGludCAtPiAnYSAtPiAnYSBhcnJheSA9IFwiY2FtbF9tYWtlX3ZlY3RcIlxuZXh0ZXJuYWwgdW5zYWZlX3N1YiA6ICdhIGFycmF5IC0+IGludCAtPiBpbnQgLT4gJ2EgYXJyYXkgPSBcImNhbWxfYXJyYXlfc3ViXCJcbmV4dGVybmFsIGFwcGVuZF9wcmltIDogJ2EgYXJyYXkgLT4gJ2EgYXJyYXkgLT4gJ2EgYXJyYXkgPSBcImNhbWxfYXJyYXlfYXBwZW5kXCJcbmV4dGVybmFsIGNvbmNhdCA6ICdhIGFycmF5IGxpc3QgLT4gJ2EgYXJyYXkgPSBcImNhbWxfYXJyYXlfY29uY2F0XCJcbmV4dGVybmFsIHVuc2FmZV9ibGl0IDpcbiAgJ2EgYXJyYXkgLT4gaW50IC0+ICdhIGFycmF5IC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9hcnJheV9ibGl0XCJcbmV4dGVybmFsIHVuc2FmZV9maWxsIDpcbiAgJ2EgYXJyYXkgLT4gaW50IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2FycmF5X2ZpbGxcIlxuZXh0ZXJuYWwgY3JlYXRlX2Zsb2F0OiBpbnQgLT4gZmxvYXQgYXJyYXkgPSBcImNhbWxfbWFrZV9mbG9hdF92ZWN0XCJcblxubW9kdWxlIEZsb2F0YXJyYXkgPSBzdHJ1Y3RcbiAgZXh0ZXJuYWwgY3JlYXRlIDogaW50IC0+IGZsb2F0YXJyYXkgPSBcImNhbWxfZmxvYXRhcnJheV9jcmVhdGVcIlxuICBleHRlcm5hbCBsZW5ndGggOiBmbG9hdGFycmF5IC0+IGludCA9IFwiJWZsb2F0YXJyYXlfbGVuZ3RoXCJcbiAgZXh0ZXJuYWwgZ2V0IDogZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdGFycmF5X3NhZmVfZ2V0XCJcbiAgZXh0ZXJuYWwgc2V0IDogZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgLT4gdW5pdCA9IFwiJWZsb2F0YXJyYXlfc2FmZV9zZXRcIlxuICBleHRlcm5hbCB1bnNhZmVfZ2V0IDogZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdGFycmF5X3Vuc2FmZV9nZXRcIlxuICBleHRlcm5hbCB1bnNhZmVfc2V0IDogZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgLT4gdW5pdFxuICAgICAgPSBcIiVmbG9hdGFycmF5X3Vuc2FmZV9zZXRcIlxuZW5kXG5cbmxldCBpbml0IGwgZiA9XG4gIGlmIGwgPSAwIHRoZW4gW3x8XSBlbHNlXG4gIGlmIGwgPCAwIHRoZW4gaW52YWxpZF9hcmcgXCJBcnJheS5pbml0XCJcbiAgKCogU2VlICM2NTc1LiBXZSBtdXN0IG5vdCBldmFsdWF0ZSBbZiAwXSB3aGVuIFtsIDw9IDBdLlxuICAgICBXZSBjb3VsZCBhbHNvIGNoZWNrIGZvciBtYXhpbXVtIGFycmF5IHNpemUsIGJ1dCB0aGlzIGRlcGVuZHNcbiAgICAgb24gd2hldGhlciB3ZSBjcmVhdGUgYSBmbG9hdCBhcnJheSBvciBhIHJlZ3VsYXIgb25lLi4uICopXG4gIGVsc2VcbiAgIGxldCByZXMgPSBjcmVhdGUgbCAoZiAwKSBpblxuICAgZm9yIGkgPSAxIHRvIHByZWQgbCBkb1xuICAgICB1bnNhZmVfc2V0IHJlcyBpIChmIGkpXG4gICBkb25lO1xuICAgcmVzXG5cbmxldCBtYWtlX21hdHJpeCBzeCBzeSBpbml0ID1cbiAgKCogV2UgcmFpc2UgZXZlbiBpZiBbc3ggPSAwICYmIHN5IDwgMF06ICopXG4gIGlmIHN5IDwgMCB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkubWFrZV9tYXRyaXhcIjtcbiAgbGV0IHJlcyA9IGNyZWF0ZSBzeCBbfHxdIGluXG4gIGlmIHN5ID4gMCB0aGVuIGJlZ2luXG4gICAgZm9yIHggPSAwIHRvIHByZWQgc3ggZG9cbiAgICAgIHVuc2FmZV9zZXQgcmVzIHggKGNyZWF0ZSBzeSBpbml0KVxuICAgIGRvbmU7XG4gIGVuZDtcbiAgcmVzXG5cbmxldCBpbml0X21hdHJpeCBzeCBzeSBmID1cbiAgKCogV2UgcmFpc2UgZXZlbiBpZiBbc3ggPSAwICYmIHN5IDwgMF06ICopXG4gIGlmIHN5IDwgMCB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuaW5pdF9tYXRyaXhcIjtcbiAgbGV0IHJlcyA9IGNyZWF0ZSBzeCBbfHxdIGluXG4gICgqIFdlIG11c3Qgbm90IGV2YWx1YXRlIFtmIHggMF0gd2hlbiBbc3kgPD0gMF06ICopXG4gIGlmIHN5ID4gMCB0aGVuIGJlZ2luXG4gICAgZm9yIHggPSAwIHRvIHByZWQgc3ggZG9cbiAgICAgIGxldCByb3cgPSBjcmVhdGUgc3kgKGYgeCAwKSBpblxuICAgICAgZm9yIHkgPSAxIHRvIHByZWQgc3kgZG9cbiAgICAgICAgdW5zYWZlX3NldCByb3cgeSAoZiB4IHkpXG4gICAgICBkb25lO1xuICAgICAgdW5zYWZlX3NldCByZXMgeCByb3dcbiAgICBkb25lO1xuICBlbmQ7XG4gIHJlc1xuXG5sZXQgY29weSBhID1cbiAgbGV0IGwgPSBsZW5ndGggYSBpbiBpZiBsID0gMCB0aGVuIFt8fF0gZWxzZSB1bnNhZmVfc3ViIGEgMCBsXG5cbmxldCBhcHBlbmQgYTEgYTIgPVxuICBsZXQgbDEgPSBsZW5ndGggYTEgaW5cbiAgaWYgbDEgPSAwIHRoZW4gY29weSBhMlxuICBlbHNlIGlmIGxlbmd0aCBhMiA9IDAgdGhlbiB1bnNhZmVfc3ViIGExIDAgbDFcbiAgZWxzZSBhcHBlbmRfcHJpbSBhMSBhMlxuXG5sZXQgc3ViIGEgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBsZW5ndGggYSAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuc3ViXCJcbiAgZWxzZSB1bnNhZmVfc3ViIGEgb2ZzIGxlblxuXG5sZXQgZmlsbCBhIG9mcyBsZW4gdiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBsZW5ndGggYSAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuZmlsbFwiXG4gIGVsc2UgdW5zYWZlX2ZpbGwgYSBvZnMgbGVuIHZcblxubGV0IGJsaXQgYTEgb2ZzMSBhMiBvZnMyIGxlbiA9XG4gIGlmIGxlbiA8IDAgfHwgb2ZzMSA8IDAgfHwgb2ZzMSA+IGxlbmd0aCBhMSAtIGxlblxuICAgICAgICAgICAgIHx8IG9mczIgPCAwIHx8IG9mczIgPiBsZW5ndGggYTIgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkFycmF5LmJsaXRcIlxuICBlbHNlIHVuc2FmZV9ibGl0IGExIG9mczEgYTIgb2ZzMiBsZW5cblxubGV0IGl0ZXIgZiBhID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmKHVuc2FmZV9nZXQgYSBpKSBkb25lXG5cbmxldCBpdGVyMiBmIGEgYiA9XG4gIGlmIGxlbmd0aCBhIDw+IGxlbmd0aCBiIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIkFycmF5Lml0ZXIyOiBhcnJheXMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiXG4gIGVsc2VcbiAgICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvIGYgKHVuc2FmZV9nZXQgYSBpKSAodW5zYWZlX2dldCBiIGkpIGRvbmVcblxubGV0IG1hcCBmIGEgPVxuICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gIGlmIGwgPSAwIHRoZW4gW3x8XSBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBjcmVhdGUgbCAoZih1bnNhZmVfZ2V0IGEgMCkpIGluXG4gICAgZm9yIGkgPSAxIHRvIGwgLSAxIGRvXG4gICAgICB1bnNhZmVfc2V0IHIgaSAoZih1bnNhZmVfZ2V0IGEgaSkpXG4gICAgZG9uZTtcbiAgICByXG4gIGVuZFxuXG5sZXQgbWFwX2lucGxhY2UgZiBhID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkb1xuICAgIHVuc2FmZV9zZXQgYSBpIChmICh1bnNhZmVfZ2V0IGEgaSkpXG4gIGRvbmVcblxubGV0IG1hcGlfaW5wbGFjZSBmIGEgPVxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvXG4gICAgdW5zYWZlX3NldCBhIGkgKGYgaSAodW5zYWZlX2dldCBhIGkpKVxuICBkb25lXG5cbmxldCBtYXAyIGYgYSBiID1cbiAgbGV0IGxhID0gbGVuZ3RoIGEgaW5cbiAgbGV0IGxiID0gbGVuZ3RoIGIgaW5cbiAgaWYgbGEgPD4gbGIgdGhlblxuICAgIGludmFsaWRfYXJnIFwiQXJyYXkubWFwMjogYXJyYXlzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIlxuICBlbHNlIGJlZ2luXG4gICAgaWYgbGEgPSAwIHRoZW4gW3x8XSBlbHNlIGJlZ2luXG4gICAgICBsZXQgciA9IGNyZWF0ZSBsYSAoZiAodW5zYWZlX2dldCBhIDApICh1bnNhZmVfZ2V0IGIgMCkpIGluXG4gICAgICBmb3IgaSA9IDEgdG8gbGEgLSAxIGRvXG4gICAgICAgIHVuc2FmZV9zZXQgciBpIChmICh1bnNhZmVfZ2V0IGEgaSkgKHVuc2FmZV9nZXQgYiBpKSlcbiAgICAgIGRvbmU7XG4gICAgICByXG4gICAgZW5kXG4gIGVuZFxuXG5sZXQgaXRlcmkgZiBhID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmIGkgKHVuc2FmZV9nZXQgYSBpKSBkb25lXG5cbmxldCBtYXBpIGYgYSA9XG4gIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgaWYgbCA9IDAgdGhlbiBbfHxdIGVsc2UgYmVnaW5cbiAgICBsZXQgciA9IGNyZWF0ZSBsIChmIDAgKHVuc2FmZV9nZXQgYSAwKSkgaW5cbiAgICBmb3IgaSA9IDEgdG8gbCAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgciBpIChmIGkgKHVuc2FmZV9nZXQgYSBpKSlcbiAgICBkb25lO1xuICAgIHJcbiAgZW5kXG5cbmxldCB0b19saXN0IGEgPVxuICBsZXQgcmVjIHRvbGlzdCBpIHJlcyA9XG4gICAgaWYgaSA8IDAgdGhlbiByZXMgZWxzZSB0b2xpc3QgKGkgLSAxKSAodW5zYWZlX2dldCBhIGkgOjogcmVzKSBpblxuICB0b2xpc3QgKGxlbmd0aCBhIC0gMSkgW11cblxuKCogQ2Fubm90IHVzZSBMaXN0Lmxlbmd0aCBoZXJlIGJlY2F1c2UgdGhlIExpc3QgbW9kdWxlIGRlcGVuZHMgb24gQXJyYXkuICopXG5sZXQgcmVjIGxpc3RfbGVuZ3RoIGFjY3UgPSBmdW5jdGlvblxuICB8IFtdIC0+IGFjY3VcbiAgfCBfOjp0IC0+IGxpc3RfbGVuZ3RoIChzdWNjIGFjY3UpIHRcblxubGV0IG9mX2xpc3QgPSBmdW5jdGlvblxuICAgIFtdIC0+IFt8fF1cbiAgfCBoZDo6dGwgYXMgbCAtPlxuICAgICAgbGV0IGEgPSBjcmVhdGUgKGxpc3RfbGVuZ3RoIDAgbCkgaGQgaW5cbiAgICAgIGxldCByZWMgZmlsbCBpID0gZnVuY3Rpb25cbiAgICAgICAgICBbXSAtPiBhXG4gICAgICAgIHwgaGQ6OnRsIC0+IHVuc2FmZV9zZXQgYSBpIGhkOyBmaWxsIChpKzEpIHRsIGluXG4gICAgICBmaWxsIDEgdGxcblxubGV0IGZvbGRfbGVmdCBmIHggYSA9XG4gIGxldCByID0gcmVmIHggaW5cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkb1xuICAgIHIgOj0gZiAhciAodW5zYWZlX2dldCBhIGkpXG4gIGRvbmU7XG4gICFyXG5cbmxldCBmb2xkX2xlZnRfbWFwIGYgYWNjIGlucHV0X2FycmF5ID1cbiAgbGV0IGxlbiA9IGxlbmd0aCBpbnB1dF9hcnJheSBpblxuICBpZiBsZW4gPSAwIHRoZW4gKGFjYywgW3x8XSkgZWxzZSBiZWdpblxuICAgIGxldCBhY2MsIGVsdCA9IGYgYWNjICh1bnNhZmVfZ2V0IGlucHV0X2FycmF5IDApIGluXG4gICAgbGV0IG91dHB1dF9hcnJheSA9IGNyZWF0ZSBsZW4gZWx0IGluXG4gICAgbGV0IGFjYyA9IHJlZiBhY2MgaW5cbiAgICBmb3IgaSA9IDEgdG8gbGVuIC0gMSBkb1xuICAgICAgbGV0IGFjYycsIGVsdCA9IGYgIWFjYyAodW5zYWZlX2dldCBpbnB1dF9hcnJheSBpKSBpblxuICAgICAgYWNjIDo9IGFjYyc7XG4gICAgICB1bnNhZmVfc2V0IG91dHB1dF9hcnJheSBpIGVsdDtcbiAgICBkb25lO1xuICAgICFhY2MsIG91dHB1dF9hcnJheVxuICBlbmRcblxubGV0IGZvbGRfcmlnaHQgZiBhIHggPVxuICBsZXQgciA9IHJlZiB4IGluXG4gIGZvciBpID0gbGVuZ3RoIGEgLSAxIGRvd250byAwIGRvXG4gICAgciA6PSBmICh1bnNhZmVfZ2V0IGEgaSkgIXJcbiAgZG9uZTtcbiAgIXJcblxubGV0IGV4aXN0cyBwIGEgPVxuICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IGEgaSkgdGhlbiB0cnVlXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgZm9yX2FsbCBwIGEgPVxuICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIHRydWVcbiAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgYSBpKSB0aGVuIGxvb3AgKHN1Y2MgaSlcbiAgICBlbHNlIGZhbHNlIGluXG4gIGxvb3AgMFxuXG5sZXQgZm9yX2FsbDIgcCBsMSBsMiA9XG4gIGxldCBuMSA9IGxlbmd0aCBsMVxuICBhbmQgbjIgPSBsZW5ndGggbDIgaW5cbiAgaWYgbjEgPD4gbjIgdGhlbiBpbnZhbGlkX2FyZyBcIkFycmF5LmZvcl9hbGwyXCJcbiAgZWxzZSBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4xIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgcCAodW5zYWZlX2dldCBsMSBpKSAodW5zYWZlX2dldCBsMiBpKSB0aGVuIGxvb3AgKHN1Y2MgaSlcbiAgICBlbHNlIGZhbHNlIGluXG4gIGxvb3AgMFxuXG5sZXQgZXhpc3RzMiBwIGwxIGwyID1cbiAgbGV0IG4xID0gbGVuZ3RoIGwxXG4gIGFuZCBuMiA9IGxlbmd0aCBsMiBpblxuICBpZiBuMSA8PiBuMiB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuZXhpc3RzMlwiXG4gIGVsc2UgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPSBuMSB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IGwxIGkpICh1bnNhZmVfZ2V0IGwyIGkpIHRoZW4gdHJ1ZVxuICAgIGVsc2UgbG9vcCAoc3VjYyBpKSBpblxuICBsb29wIDBcblxubGV0IG1lbSB4IGEgPVxuICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiBjb21wYXJlICh1bnNhZmVfZ2V0IGEgaSkgeCA9IDAgdGhlbiB0cnVlXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgbWVtcSB4IGEgPVxuICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiB4ID09ICh1bnNhZmVfZ2V0IGEgaSkgdGhlbiB0cnVlXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgZmluZF9vcHQgcCBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgZWxzZVxuICAgICAgbGV0IHggPSB1bnNhZmVfZ2V0IGEgaSBpblxuICAgICAgaWYgcCB4IHRoZW4gU29tZSB4XG4gICAgICBlbHNlIGxvb3AgKHN1Y2MgaSlcbiAgaW5cbiAgbG9vcCAwXG5cbmxldCBmaW5kX2luZGV4IHAgYSA9XG4gIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPSBuIHRoZW4gTm9uZVxuICAgIGVsc2UgaWYgcCAodW5zYWZlX2dldCBhIGkpIHRoZW4gU29tZSBpXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgZmluZF9tYXAgZiBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgZWxzZVxuICAgICAgbWF0Y2ggZiAodW5zYWZlX2dldCBhIGkpIHdpdGhcbiAgICAgIHwgTm9uZSAtPiBsb29wIChzdWNjIGkpXG4gICAgICB8IFNvbWUgXyBhcyByIC0+IHJcbiAgaW5cbiAgbG9vcCAwXG5cbmxldCBmaW5kX21hcGkgZiBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgZWxzZVxuICAgICAgbWF0Y2ggZiBpICh1bnNhZmVfZ2V0IGEgaSkgd2l0aFxuICAgICAgfCBOb25lIC0+IGxvb3AgKHN1Y2MgaSlcbiAgICAgIHwgU29tZSBfIGFzIHIgLT4gclxuICBpblxuICBsb29wIDBcblxubGV0IHNwbGl0IHggPVxuICBpZiB4ID0gW3x8XSB0aGVuIFt8fF0sIFt8fF1cbiAgZWxzZSBiZWdpblxuICAgIGxldCBhMCwgYjAgPSB1bnNhZmVfZ2V0IHggMCBpblxuICAgIGxldCBuID0gbGVuZ3RoIHggaW5cbiAgICBsZXQgYSA9IGNyZWF0ZSBuIGEwIGluXG4gICAgbGV0IGIgPSBjcmVhdGUgbiBiMCBpblxuICAgIGZvciBpID0gMSB0byBuIC0gMSBkb1xuICAgICAgbGV0IGFpLCBiaSA9IHVuc2FmZV9nZXQgeCBpIGluXG4gICAgICB1bnNhZmVfc2V0IGEgaSBhaTtcbiAgICAgIHVuc2FmZV9zZXQgYiBpIGJpXG4gICAgZG9uZTtcbiAgICBhLCBiXG4gIGVuZFxuXG5sZXQgY29tYmluZSBhIGIgPVxuICBsZXQgbmEgPSBsZW5ndGggYSBpblxuICBsZXQgbmIgPSBsZW5ndGggYiBpblxuICBpZiBuYSA8PiBuYiB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuY29tYmluZVwiO1xuICBpZiBuYSA9IDAgdGhlbiBbfHxdXG4gIGVsc2UgYmVnaW5cbiAgICBsZXQgeCA9IGNyZWF0ZSBuYSAodW5zYWZlX2dldCBhIDAsIHVuc2FmZV9nZXQgYiAwKSBpblxuICAgIGZvciBpID0gMSB0byBuYSAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgeCBpICh1bnNhZmVfZ2V0IGEgaSwgdW5zYWZlX2dldCBiIGkpXG4gICAgZG9uZTtcbiAgICB4XG4gIGVuZFxuXG5leGNlcHRpb24gQm90dG9tIG9mIGludFxubGV0IHNvcnQgY21wIGEgPVxuICBsZXQgbWF4c29uIGwgaSA9XG4gICAgbGV0IGkzMSA9IGkraStpKzEgaW5cbiAgICBsZXQgeCA9IHJlZiBpMzEgaW5cbiAgICBpZiBpMzErMiA8IGwgdGhlbiBiZWdpblxuICAgICAgaWYgY21wIChnZXQgYSBpMzEpIChnZXQgYSAoaTMxKzEpKSA8IDAgdGhlbiB4IDo9IGkzMSsxO1xuICAgICAgaWYgY21wIChnZXQgYSAheCkgKGdldCBhIChpMzErMikpIDwgMCB0aGVuIHggOj0gaTMxKzI7XG4gICAgICAheFxuICAgIGVuZCBlbHNlXG4gICAgICBpZiBpMzErMSA8IGwgJiYgY21wIChnZXQgYSBpMzEpIChnZXQgYSAoaTMxKzEpKSA8IDBcbiAgICAgIHRoZW4gaTMxKzFcbiAgICAgIGVsc2UgaWYgaTMxIDwgbCB0aGVuIGkzMSBlbHNlIHJhaXNlIChCb3R0b20gaSlcbiAgaW5cbiAgbGV0IHJlYyB0cmlja2xlZG93biBsIGkgZSA9XG4gICAgbGV0IGogPSBtYXhzb24gbCBpIGluXG4gICAgaWYgY21wIChnZXQgYSBqKSBlID4gMCB0aGVuIGJlZ2luXG4gICAgICBzZXQgYSBpIChnZXQgYSBqKTtcbiAgICAgIHRyaWNrbGVkb3duIGwgaiBlO1xuICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICBzZXQgYSBpIGU7XG4gICAgZW5kO1xuICBpblxuICBsZXQgdHJpY2tsZSBsIGkgZSA9IHRyeSB0cmlja2xlZG93biBsIGkgZSB3aXRoIEJvdHRvbSBpIC0+IHNldCBhIGkgZSBpblxuICBsZXQgcmVjIGJ1YmJsZWRvd24gbCBpID1cbiAgICBsZXQgaiA9IG1heHNvbiBsIGkgaW5cbiAgICBzZXQgYSBpIChnZXQgYSBqKTtcbiAgICBidWJibGVkb3duIGwgalxuICBpblxuICBsZXQgYnViYmxlIGwgaSA9IHRyeSBidWJibGVkb3duIGwgaSB3aXRoIEJvdHRvbSBpIC0+IGkgaW5cbiAgbGV0IHJlYyB0cmlja2xldXAgaSBlID1cbiAgICBsZXQgZmF0aGVyID0gKGkgLSAxKSAvIDMgaW5cbiAgICBhc3NlcnQgKGkgPD4gZmF0aGVyKTtcbiAgICBpZiBjbXAgKGdldCBhIGZhdGhlcikgZSA8IDAgdGhlbiBiZWdpblxuICAgICAgc2V0IGEgaSAoZ2V0IGEgZmF0aGVyKTtcbiAgICAgIGlmIGZhdGhlciA+IDAgdGhlbiB0cmlja2xldXAgZmF0aGVyIGUgZWxzZSBzZXQgYSAwIGU7XG4gICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgIHNldCBhIGkgZTtcbiAgICBlbmQ7XG4gIGluXG4gIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgZm9yIGkgPSAobCArIDEpIC8gMyAtIDEgZG93bnRvIDAgZG8gdHJpY2tsZSBsIGkgKGdldCBhIGkpOyBkb25lO1xuICBmb3IgaSA9IGwgLSAxIGRvd250byAyIGRvXG4gICAgbGV0IGUgPSAoZ2V0IGEgaSkgaW5cbiAgICBzZXQgYSBpIChnZXQgYSAwKTtcbiAgICB0cmlja2xldXAgKGJ1YmJsZSBpIDApIGU7XG4gIGRvbmU7XG4gIGlmIGwgPiAxIHRoZW4gKGxldCBlID0gKGdldCBhIDEpIGluIHNldCBhIDEgKGdldCBhIDApOyBzZXQgYSAwIGUpXG5cblxubGV0IGN1dG9mZiA9IDVcbmxldCBzdGFibGVfc29ydCBjbXAgYSA9XG4gIGxldCBtZXJnZSBzcmMxb2ZzIHNyYzFsZW4gc3JjMiBzcmMyb2ZzIHNyYzJsZW4gZHN0IGRzdG9mcyA9XG4gICAgbGV0IHNyYzFyID0gc3JjMW9mcyArIHNyYzFsZW4gYW5kIHNyYzJyID0gc3JjMm9mcyArIHNyYzJsZW4gaW5cbiAgICBsZXQgcmVjIGxvb3AgaTEgczEgaTIgczIgZCA9XG4gICAgICBpZiBjbXAgczEgczIgPD0gMCB0aGVuIGJlZ2luXG4gICAgICAgIHNldCBkc3QgZCBzMTtcbiAgICAgICAgbGV0IGkxID0gaTEgKyAxIGluXG4gICAgICAgIGlmIGkxIDwgc3JjMXIgdGhlblxuICAgICAgICAgIGxvb3AgaTEgKGdldCBhIGkxKSBpMiBzMiAoZCArIDEpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBibGl0IHNyYzIgaTIgZHN0IChkICsgMSkgKHNyYzJyIC0gaTIpXG4gICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICBzZXQgZHN0IGQgczI7XG4gICAgICAgIGxldCBpMiA9IGkyICsgMSBpblxuICAgICAgICBpZiBpMiA8IHNyYzJyIHRoZW5cbiAgICAgICAgICBsb29wIGkxIHMxIGkyIChnZXQgc3JjMiBpMikgKGQgKyAxKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgYmxpdCBhIGkxIGRzdCAoZCArIDEpIChzcmMxciAtIGkxKVxuICAgICAgZW5kXG4gICAgaW4gbG9vcCBzcmMxb2ZzIChnZXQgYSBzcmMxb2ZzKSBzcmMyb2ZzIChnZXQgc3JjMiBzcmMyb2ZzKSBkc3RvZnM7XG4gIGluXG4gIGxldCBpc29ydHRvIHNyY29mcyBkc3QgZHN0b2ZzIGxlbiA9XG4gICAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICAgIGxldCBlID0gKGdldCBhIChzcmNvZnMgKyBpKSkgaW5cbiAgICAgIGxldCBqID0gcmVmIChkc3RvZnMgKyBpIC0gMSkgaW5cbiAgICAgIHdoaWxlICghaiA+PSBkc3RvZnMgJiYgY21wIChnZXQgZHN0ICFqKSBlID4gMCkgZG9cbiAgICAgICAgc2V0IGRzdCAoIWogKyAxKSAoZ2V0IGRzdCAhaik7XG4gICAgICAgIGRlY3IgajtcbiAgICAgIGRvbmU7XG4gICAgICBzZXQgZHN0ICghaiArIDEpIGU7XG4gICAgZG9uZTtcbiAgaW5cbiAgbGV0IHJlYyBzb3J0dG8gc3Jjb2ZzIGRzdCBkc3RvZnMgbGVuID1cbiAgICBpZiBsZW4gPD0gY3V0b2ZmIHRoZW4gaXNvcnR0byBzcmNvZnMgZHN0IGRzdG9mcyBsZW4gZWxzZSBiZWdpblxuICAgICAgbGV0IGwxID0gbGVuIC8gMiBpblxuICAgICAgbGV0IGwyID0gbGVuIC0gbDEgaW5cbiAgICAgIHNvcnR0byAoc3Jjb2ZzICsgbDEpIGRzdCAoZHN0b2ZzICsgbDEpIGwyO1xuICAgICAgc29ydHRvIHNyY29mcyBhIChzcmNvZnMgKyBsMikgbDE7XG4gICAgICBtZXJnZSAoc3Jjb2ZzICsgbDIpIGwxIGRzdCAoZHN0b2ZzICsgbDEpIGwyIGRzdCBkc3RvZnM7XG4gICAgZW5kO1xuICBpblxuICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gIGlmIGwgPD0gY3V0b2ZmIHRoZW4gaXNvcnR0byAwIGEgMCBsIGVsc2UgYmVnaW5cbiAgICBsZXQgbDEgPSBsIC8gMiBpblxuICAgIGxldCBsMiA9IGwgLSBsMSBpblxuICAgIGxldCB0ID0gbWFrZSBsMiAoZ2V0IGEgMCkgaW5cbiAgICBzb3J0dG8gbDEgdCAwIGwyO1xuICAgIHNvcnR0byAwIGEgbDIgbDE7XG4gICAgbWVyZ2UgbDIgbDEgdCAwIGwyIGEgMDtcbiAgZW5kXG5cblxubGV0IGZhc3Rfc29ydCA9IHN0YWJsZV9zb3J0XG5cbmxldCBzaHVmZmxlIH5yYW5kIGEgPSAoKiBGaXNoZXItWWF0ZXMgKilcbiAgZm9yIGkgPSBsZW5ndGggYSAtIDEgZG93bnRvIDEgZG9cbiAgICBsZXQgaiA9IHJhbmQgKGkgKyAxKSBpblxuICAgIGxldCB2ID0gdW5zYWZlX2dldCBhIGkgaW5cbiAgICB1bnNhZmVfc2V0IGEgaSAoZ2V0IGEgaik7XG4gICAgdW5zYWZlX3NldCBhIGogdlxuICBkb25lXG5cbigqKiB7MSBJdGVyYXRvcnN9ICopXG5cbmxldCB0b19zZXEgYSA9XG4gIGxldCByZWMgYXV4IGkgKCkgPVxuICAgIGlmIGkgPCBsZW5ndGggYVxuICAgIHRoZW5cbiAgICAgIGxldCB4ID0gdW5zYWZlX2dldCBhIGkgaW5cbiAgICAgIFNlcS5Db25zICh4LCBhdXggKGkrMSkpXG4gICAgZWxzZSBTZXEuTmlsXG4gIGluXG4gIGF1eCAwXG5cbmxldCB0b19zZXFpIGEgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICBpZiBpIDwgbGVuZ3RoIGFcbiAgICB0aGVuXG4gICAgICBsZXQgeCA9IHVuc2FmZV9nZXQgYSBpIGluXG4gICAgICBTZXEuQ29ucyAoKGkseCksIGF1eCAoaSsxKSlcbiAgICBlbHNlIFNlcS5OaWxcbiAgaW5cbiAgYXV4IDBcblxubGV0IG9mX3Jldl9saXN0ID0gZnVuY3Rpb25cbiAgICBbXSAtPiBbfHxdXG4gIHwgaGQ6OnRsIGFzIGwgLT5cbiAgICAgIGxldCBsZW4gPSBsaXN0X2xlbmd0aCAwIGwgaW5cbiAgICAgIGxldCBhID0gY3JlYXRlIGxlbiBoZCBpblxuICAgICAgbGV0IHJlYyBmaWxsIGkgPSBmdW5jdGlvblxuICAgICAgICAgIFtdIC0+IGFcbiAgICAgICAgfCBoZDo6dGwgLT4gdW5zYWZlX3NldCBhIGkgaGQ7IGZpbGwgKGktMSkgdGxcbiAgICAgIGluXG4gICAgICBmaWxsIChsZW4tMikgdGxcblxubGV0IG9mX3NlcSBpID1cbiAgbGV0IGwgPSBTZXEuZm9sZF9sZWZ0IChmdW4gYWNjIHggLT4geDo6YWNjKSBbXSBpIGluXG4gIG9mX3Jldl9saXN0IGxcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9hcnJheV9zdWIiLCJjYW1sX2NoZWNrX2JvdW5kIiwiY2FtbF9tYWtlX3ZlY3QiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImdsb2JhbF9kYXRhIiwiU3RkbGliX1NlcSIsIkFzc2VydF9mYWlsdXJlIiwiU3RkbGliIiwiaW5pdCIsImwiLCJyZXMiLCJpIiwibWFrZV9tYXRyaXgiLCJzeCIsInN5IiwieCIsImluaXRfbWF0cml4Iiwicm93IiwieSIsImNvcHkiLCJhIiwiYXBwZW5kIiwiYTIiLCJsMSIsInN1YiIsIm9mcyIsImxlbiIsImZpbGwiLCJ2IiwiYmxpdCIsIm9mczEiLCJvZnMyIiwiaXRlciIsIml0ZXIyIiwiYiIsIm1hcCIsInIiLCJtYXBfaW5wbGFjZSIsIm1hcGlfaW5wbGFjZSIsIm1hcDIiLCJsYSIsImxiIiwiaXRlcmkiLCJtYXBpIiwidG9fbGlzdCIsImxpc3RfbGVuZ3RoIiwiYWNjdSIsInBhcmFtIiwidCIsIm9mX2xpc3QiLCJ0bCIsImhkIiwiZm9sZF9sZWZ0IiwiZm9sZF9sZWZ0X21hcCIsImFjYyIsImlucHV0X2FycmF5IiwibWF0Y2giLCJlbHQiLCJvdXRwdXRfYXJyYXkiLCJmb2xkX3JpZ2h0IiwiZXhpc3RzIiwicCIsIm4iLCJmb3JfYWxsIiwiZm9yX2FsbDIiLCJsMiIsIm4xIiwibjIiLCJleGlzdHMyIiwibWVtIiwibWVtcSIsImZpbmRfb3B0IiwiZmluZF9pbmRleCIsImZpbmRfbWFwIiwiZmluZF9tYXBpIiwic3BsaXQiLCJiMCIsImJpIiwiYWkiLCJjb21iaW5lIiwibmEiLCJuYiIsIkJvdHRvbSIsInNvcnQiLCJjbXAiLCJtYXhzb24iLCJpMzEiLCJlIiwiaiIsImV4biIsImZhdGhlciIsInN0YWJsZV9zb3J0IiwibWVyZ2UiLCJzcmMxb2ZzIiwic3JjMWxlbiIsInNyYzIiLCJzcmMyb2ZzIiwic3JjMmxlbiIsImRzdCIsImRzdG9mcyIsInNyYzFyIiwic3JjMnIiLCJzMiIsInMxIiwiaTEiLCJpMiIsImQiLCJpc29ydHRvIiwic3Jjb2ZzIiwic29ydHRvIiwic2h1ZmZsZSIsInJhbmQiLCJ0b19zZXEiLCJhdXgiLCJ0b19zZXFpIiwib2Zfc2VxIiwiU3RkbGliX0FycmF5Il0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxZQUFBQyxLQUFBQyxHQUFBVDtBQUFBQSxJQytDRSxZQUFjO0FBQUEsSUFDZCxVQUFjLHlDQVNWO0FBQUEsUUFBQVUsTUFKTyxrQkFBUyx1QkFDbkI7QUFBQTtBQUFBLFNBQUFDLElBQUE7QUFBQTtBQUFBLE1BQ21CO0FBQUEsY0FBSztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFFeEI7QUFBQSxHQUFHO0FBQUEsWUFBQUMsWUFBQUMsSUFBQUMsSUFBQU47QUFBQUEsSUFJSixXQUFlO0FBQUEsUUFBQUUsTUFDTDtBQUFBLElBQ1Y7QUFBQSxhQUFlO0FBQUE7QUFBQSxVQUFBSyxJQUFBO0FBQUE7QUFBQSxPQUVNO0FBQUEsZUFBZ0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFB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O0FBQUEsSUFBQXlHO0FBQUFBLE1EcGVmIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTUxMjQsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvZmxvYXQubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgIE5pY29sYXMgT2plZGEgQmFyLCBMZXhpRmkgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE4IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbmV4dGVybmFsIG5lZyA6IGZsb2F0IC0+IGZsb2F0ID0gXCIlbmVnZmxvYXRcIlxuZXh0ZXJuYWwgYWRkIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVhZGRmbG9hdFwiXG5leHRlcm5hbCBzdWIgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJXN1YmZsb2F0XCJcbmV4dGVybmFsIG11bCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCIlbXVsZmxvYXRcIlxuZXh0ZXJuYWwgZGl2IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVkaXZmbG9hdFwiXG5leHRlcm5hbCByZW0gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9mbW9kX2Zsb2F0XCIgXCJmbW9kXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZtYSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2ZtYV9mbG9hdFwiIFwiY2FtbF9mbWFcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWJzIDogZmxvYXQgLT4gZmxvYXQgPSBcIiVhYnNmbG9hdFwiXG5cbmxldCB6ZXJvID0gMC5cbmxldCBvbmUgPSAxLlxubGV0IG1pbnVzX29uZSA9IC0xLlxubGV0IGluZmluaXR5ID0gU3RkbGliLmluZmluaXR5XG5sZXQgbmVnX2luZmluaXR5ID0gU3RkbGliLm5lZ19pbmZpbml0eVxubGV0IG5hbiA9IFN0ZGxpYi5uYW5cbmxldCBxdWlldF9uYW4gPSBuYW5cbmV4dGVybmFsIGZsb2F0X29mX2JpdHMgOiBpbnQ2NCAtPiBmbG9hdFxuICA9IFwiY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzXCIgXCJjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHNfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5sZXQgc2lnbmFsaW5nX25hbiA9IGZsb2F0X29mX2JpdHMgMHg3Rl9GMF8wMF8wMF8wMF8wMF8wMF8wMUxcbmxldCBpc19maW5pdGUgKHg6IGZsb2F0KSA9IHggLS4geCA9IDAuXG5sZXQgaXNfaW5maW5pdGUgKHg6IGZsb2F0KSA9IDEuIC8uIHggPSAwLlxubGV0IGlzX25hbiAoeDogZmxvYXQpID0geCA8PiB4XG5cbmxldCBwaSA9IDB4MS45MjFmYjU0NDQyZDE4cCsxXG5sZXQgbWF4X2Zsb2F0ID0gU3RkbGliLm1heF9mbG9hdFxubGV0IG1pbl9mbG9hdCA9IFN0ZGxpYi5taW5fZmxvYXRcbmxldCBlcHNpbG9uID0gU3RkbGliLmVwc2lsb25fZmxvYXRcbmV4dGVybmFsIG9mX2ludCA6IGludCAtPiBmbG9hdCA9IFwiJWZsb2F0b2ZpbnRcIlxuZXh0ZXJuYWwgdG9faW50IDogZmxvYXQgLT4gaW50ID0gXCIlaW50b2ZmbG9hdFwiXG5leHRlcm5hbCBvZl9zdHJpbmcgOiBzdHJpbmcgLT4gZmxvYXQgPSBcImNhbWxfZmxvYXRfb2Zfc3RyaW5nXCJcbmxldCBvZl9zdHJpbmdfb3B0ID0gU3RkbGliLmZsb2F0X29mX3N0cmluZ19vcHRcbmxldCB0b19zdHJpbmcgPSBTdGRsaWIuc3RyaW5nX29mX2Zsb2F0XG50eXBlIGZwY2xhc3MgPSBTdGRsaWIuZnBjbGFzcyA9XG4gICAgRlBfbm9ybWFsXG4gIHwgRlBfc3Vibm9ybWFsXG4gIHwgRlBfemVyb1xuICB8IEZQX2luZmluaXRlXG4gIHwgRlBfbmFuXG5leHRlcm5hbCBjbGFzc2lmeV9mbG9hdCA6IChmbG9hdCBbQHVuYm94ZWRdKSAtPiBmcGNsYXNzID1cbiAgXCJjYW1sX2NsYXNzaWZ5X2Zsb2F0XCIgXCJjYW1sX2NsYXNzaWZ5X2Zsb2F0X3VuYm94ZWRcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgcG93IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfcG93ZXJfZmxvYXRcIiBcInBvd1wiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBzcXJ0IDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc3FydF9mbG9hdFwiIFwic3FydFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjYnJ0IDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY2JydF9mbG9hdFwiIFwiY2FtbF9jYnJ0XCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGV4cCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2V4cF9mbG9hdFwiIFwiZXhwXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGV4cDIgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9leHAyX2Zsb2F0XCIgXCJjYW1sX2V4cDJcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nX2Zsb2F0XCIgXCJsb2dcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nMTAgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9sb2cxMF9mbG9hdFwiIFwibG9nMTBcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nMiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2xvZzJfZmxvYXRcIiBcImNhbWxfbG9nMlwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBleHBtMSA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2V4cG0xX2Zsb2F0XCIgXCJjYW1sX2V4cG0xXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZzFwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nMXBfZmxvYXRcIiBcImNhbWxfbG9nMXBcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgY29zIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY29zX2Zsb2F0XCIgXCJjb3NcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2luIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc2luX2Zsb2F0XCIgXCJzaW5cIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdGFuIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfdGFuX2Zsb2F0XCIgXCJ0YW5cIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWNvcyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Fjb3NfZmxvYXRcIiBcImFjb3NcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXNpbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2FzaW5fZmxvYXRcIiBcImFzaW5cIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXRhbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2F0YW5fZmxvYXRcIiBcImF0YW5cIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXRhbjIgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hdGFuMl9mbG9hdFwiIFwiYXRhbjJcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgaHlwb3QgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdFxuICAgICAgICAgICAgICAgPSBcImNhbWxfaHlwb3RfZmxvYXRcIiBcImNhbWxfaHlwb3RcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgY29zaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Nvc2hfZmxvYXRcIiBcImNvc2hcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2luaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3NpbmhfZmxvYXRcIiBcInNpbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdGFuaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3RhbmhfZmxvYXRcIiBcInRhbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWNvc2ggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hY29zaF9mbG9hdFwiIFwiY2FtbF9hY29zaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhc2luaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2FzaW5oX2Zsb2F0XCIgXCJjYW1sX2FzaW5oXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGF0YW5oIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXRhbmhfZmxvYXRcIiBcImNhbWxfYXRhbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZXJmIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXJmX2Zsb2F0XCIgXCJjYW1sX2VyZlwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBlcmZjIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXJmY19mbG9hdFwiIFwiY2FtbF9lcmZjXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRydW5jIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfdHJ1bmNfZmxvYXRcIiBcImNhbWxfdHJ1bmNcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgcm91bmQgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9yb3VuZF9mbG9hdFwiIFwiY2FtbF9yb3VuZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjZWlsIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY2VpbF9mbG9hdFwiIFwiY2VpbFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBmbG9vciA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Zsb29yX2Zsb2F0XCIgXCJmbG9vclwiXG5bQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG5sZXQgaXNfaW50ZWdlciB4ID0geCA9IHRydW5jIHggJiYgaXNfZmluaXRlIHhcblxuZXh0ZXJuYWwgbmV4dF9hZnRlciA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0XG4gID0gXCJjYW1sX25leHRhZnRlcl9mbG9hdFwiIFwiY2FtbF9uZXh0YWZ0ZXJcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG5sZXQgc3VjYyB4ID0gbmV4dF9hZnRlciB4IGluZmluaXR5XG5sZXQgcHJlZCB4ID0gbmV4dF9hZnRlciB4IG5lZ19pbmZpbml0eVxuXG5leHRlcm5hbCBjb3B5X3NpZ24gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdFxuICAgICAgICAgICAgICAgICAgPSBcImNhbWxfY29weXNpZ25fZmxvYXRcIiBcImNhbWxfY29weXNpZ25cIlxuICAgICAgICAgICAgICAgICAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHNpZ25fYml0IDogKGZsb2F0IFtAdW5ib3hlZF0pIC0+IGJvb2xcbiAgPSBcImNhbWxfc2lnbmJpdF9mbG9hdFwiIFwiY2FtbF9zaWduYml0XCIgW0BAbm9hbGxvY11cblxuZXh0ZXJuYWwgZnJleHAgOiBmbG9hdCAtPiBmbG9hdCAqIGludCA9IFwiY2FtbF9mcmV4cF9mbG9hdFwiXG5leHRlcm5hbCBsZGV4cCA6IChmbG9hdCBbQHVuYm94ZWRdKSAtPiAoaW50IFtAdW50YWdnZWRdKSAtPiAoZmxvYXQgW0B1bmJveGVkXSkgPVxuICBcImNhbWxfbGRleHBfZmxvYXRcIiBcImNhbWxfbGRleHBfZmxvYXRfdW5ib3hlZFwiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBtb2RmIDogZmxvYXQgLT4gZmxvYXQgKiBmbG9hdCA9IFwiY2FtbF9tb2RmX2Zsb2F0XCJcbnR5cGUgdCA9IGZsb2F0XG5leHRlcm5hbCBjb21wYXJlIDogZmxvYXQgLT4gZmxvYXQgLT4gaW50ID0gXCIlY29tcGFyZVwiXG5sZXQgZXF1YWwgeCB5ID0gY29tcGFyZSB4IHkgPSAwXG5cbmxldFtAaW5saW5lXSBtaW4gKHg6IGZsb2F0KSAoeTogZmxvYXQpID1cbiAgaWYgeSA+IHggfHwgKG5vdChzaWduX2JpdCB5KSAmJiBzaWduX2JpdCB4KSB0aGVuXG4gICAgaWYgaXNfbmFuIHkgdGhlbiB5IGVsc2UgeFxuICBlbHNlIGlmIGlzX25hbiB4IHRoZW4geCBlbHNlIHlcblxubGV0W0BpbmxpbmVdIG1heCAoeDogZmxvYXQpICh5OiBmbG9hdCkgPVxuICBpZiB5ID4geCB8fCAobm90KHNpZ25fYml0IHkpICYmIHNpZ25fYml0IHgpIHRoZW5cbiAgICBpZiBpc19uYW4geCB0aGVuIHggZWxzZSB5XG4gIGVsc2UgaWYgaXNfbmFuIHkgdGhlbiB5IGVsc2UgeFxuXG5sZXRbQGlubGluZV0gbWluX21heCAoeDogZmxvYXQpICh5OiBmbG9hdCkgPVxuICBpZiBpc19uYW4geCB8fCBpc19uYW4geSB0aGVuIChuYW4sIG5hbilcbiAgZWxzZSBpZiB5ID4geCB8fCAobm90KHNpZ25fYml0IHkpICYmIHNpZ25fYml0IHgpIHRoZW4gKHgsIHkpIGVsc2UgKHksIHgpXG5cbmxldFtAaW5saW5lXSBtaW5fbnVtICh4OiBmbG9hdCkgKHk6IGZsb2F0KSA9XG4gIGlmIHkgPiB4IHx8IChub3Qoc2lnbl9iaXQgeSkgJiYgc2lnbl9iaXQgeCkgdGhlblxuICAgIGlmIGlzX25hbiB4IHRoZW4geSBlbHNlIHhcbiAgZWxzZSBpZiBpc19uYW4geSB0aGVuIHggZWxzZSB5XG5cbmxldFtAaW5saW5lXSBtYXhfbnVtICh4OiBmbG9hdCkgKHk6IGZsb2F0KSA9XG4gIGlmIHkgPiB4IHx8IChub3Qoc2lnbl9iaXQgeSkgJiYgc2lnbl9iaXQgeCkgdGhlblxuICAgIGlmIGlzX25hbiB5IHRoZW4geCBlbHNlIHlcbiAgZWxzZSBpZiBpc19uYW4geCB0aGVuIHkgZWxzZSB4XG5cbmxldFtAaW5saW5lXSBtaW5fbWF4X251bSAoeDogZmxvYXQpICh5OiBmbG9hdCkgPVxuICBpZiBpc19uYW4geCB0aGVuICh5LHkpXG4gIGVsc2UgaWYgaXNfbmFuIHkgdGhlbiAoeCx4KVxuICBlbHNlIGlmIHkgPiB4IHx8IChub3Qoc2lnbl9iaXQgeSkgJiYgc2lnbl9iaXQgeCkgdGhlbiAoeCx5KSBlbHNlICh5LHgpXG5cbmV4dGVybmFsIHNlZWRlZF9oYXNoX3BhcmFtIDpcbiAgaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gaW50ID0gXCJjYW1sX2hhc2hcIiBbQEBub2FsbG9jXVxubGV0IHNlZWRlZF9oYXNoIHNlZWQgeCA9IHNlZWRlZF9oYXNoX3BhcmFtIDEwIDEwMCBzZWVkIHhcbmxldCBoYXNoIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgMCB4XG5cbm1vZHVsZSBBcnJheSA9IHN0cnVjdFxuXG4gIHR5cGUgdCA9IGZsb2F0YXJyYXlcblxuICBleHRlcm5hbCBsZW5ndGggOiB0IC0+IGludCA9IFwiJWZsb2F0YXJyYXlfbGVuZ3RoXCJcbiAgZXh0ZXJuYWwgZ2V0IDogdCAtPiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdGFycmF5X3NhZmVfZ2V0XCJcbiAgZXh0ZXJuYWwgc2V0IDogdCAtPiBpbnQgLT4gZmxvYXQgLT4gdW5pdCA9IFwiJWZsb2F0YXJyYXlfc2FmZV9zZXRcIlxuICBleHRlcm5hbCBjcmVhdGUgOiBpbnQgLT4gdCA9IFwiY2FtbF9mbG9hdGFycmF5X2NyZWF0ZVwiXG4gIGV4dGVybmFsIHVuc2FmZV9nZXQgOiB0IC0+IGludCAtPiBmbG9hdCA9IFwiJWZsb2F0YXJyYXlfdW5zYWZlX2dldFwiXG4gIGV4dGVybmFsIHVuc2FmZV9zZXQgOiB0IC0+IGludCAtPiBmbG9hdCAtPiB1bml0ID0gXCIlZmxvYXRhcnJheV91bnNhZmVfc2V0XCJcblxuICBsZXQgdW5zYWZlX2ZpbGwgYSBvZnMgbGVuIHYgPVxuICAgIGZvciBpID0gb2ZzIHRvIG9mcyArIGxlbiAtIDEgZG8gdW5zYWZlX3NldCBhIGkgdiBkb25lXG5cbiAgZXh0ZXJuYWwgdW5zYWZlX2JsaXQ6IHQgLT4gaW50IC0+IHQgLT4gaW50IC0+IGludCAtPiB1bml0ID1cbiAgICBcImNhbWxfZmxvYXRhcnJheV9ibGl0XCIgW0BAbm9hbGxvY11cblxuICBsZXQgY2hlY2sgYSBvZnMgbGVuIG1zZyA9XG4gICAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyArIGxlbiA8IDAgfHwgb2ZzICsgbGVuID4gbGVuZ3RoIGEgdGhlblxuICAgICAgaW52YWxpZF9hcmcgbXNnXG5cbiAgbGV0IG1ha2UgbiB2ID1cbiAgICBsZXQgcmVzdWx0ID0gY3JlYXRlIG4gaW5cbiAgICB1bnNhZmVfZmlsbCByZXN1bHQgMCBuIHY7XG4gICAgcmVzdWx0XG5cbiAgbGV0IGluaXQgbCBmID1cbiAgICBpZiBsIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiRmxvYXQuQXJyYXkuaW5pdFwiXG4gICAgZWxzZVxuICAgICAgbGV0IHJlcyA9IGNyZWF0ZSBsIGluXG4gICAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG9cbiAgICAgICAgdW5zYWZlX3NldCByZXMgaSAoZiBpKVxuICAgICAgZG9uZTtcbiAgICAgIHJlc1xuXG4gIGxldCBtYWtlX21hdHJpeCBzeCBzeSB2ID1cbiAgICAoKiBXZSByYWlzZSBldmVuIGlmIFtzeCA9IDAgJiYgc3kgPCAwXTogKilcbiAgICBpZiBzeSA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIkZsb2F0LkFycmF5Lm1ha2VfbWF0cml4XCI7XG4gICAgbGV0IHJlcyA9IEFycmF5Lm1ha2Ugc3ggKGNyZWF0ZSAwKSBpblxuICAgIGlmIHN5ID4gMCB0aGVuIGJlZ2luXG4gICAgICBmb3IgeCA9IDAgdG8gc3ggLSAxIGRvXG4gICAgICAgIEFycmF5LnVuc2FmZV9zZXQgcmVzIHggKG1ha2Ugc3kgdilcbiAgICAgIGRvbmU7XG4gICAgZW5kO1xuICAgIHJlc1xuXG4gIGxldCBpbml0X21hdHJpeCBzeCBzeSBmID1cbiAgICAoKiBXZSByYWlzZSBldmVuIGlmIFtzeCA9IDAgJiYgc3kgPCAwXTogKilcbiAgICBpZiBzeSA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIkZsb2F0LkFycmF5LmluaXRfbWF0cml4XCI7XG4gICAgbGV0IHJlcyA9IEFycmF5Lm1ha2Ugc3ggKGNyZWF0ZSAwKSBpblxuICAgIGlmIHN5ID4gMCB0aGVuIGJlZ2luXG4gICAgICBmb3IgeCA9IDAgdG8gc3ggLSAxIGRvXG4gICAgICAgIGxldCByb3cgPSBjcmVhdGUgc3kgaW5cbiAgICAgICAgZm9yIHkgPSAwIHRvIHN5IC0gMSBkb1xuICAgICAgICAgIHVuc2FmZV9zZXQgcm93IHkgKGYgeCB5KVxuICAgICAgICBkb25lO1xuICAgICAgICBBcnJheS51bnNhZmVfc2V0IHJlcyB4IHJvd1xuICAgICAgZG9uZTtcbiAgICBlbmQ7XG4gICAgcmVzXG5cbiAgbGV0IGFwcGVuZCBhMSBhMiA9XG4gICAgbGV0IGwxID0gbGVuZ3RoIGExIGluXG4gICAgbGV0IGwyID0gbGVuZ3RoIGEyIGluXG4gICAgbGV0IHJlc3VsdCA9IGNyZWF0ZSAobDEgKyBsMikgaW5cbiAgICB1bnNhZmVfYmxpdCBhMSAwIHJlc3VsdCAwIGwxO1xuICAgIHVuc2FmZV9ibGl0IGEyIDAgcmVzdWx0IGwxIGwyO1xuICAgIHJlc3VsdFxuXG4gICgqIG5leHQgMyBmdW5jdGlvbnM6IG1vZGlmaWVkIGNvcHkgb2YgY29kZSBmcm9tIHN0cmluZy5tbCAqKVxuICBsZXQgZW5zdXJlX2dlICh4OmludCkgeSA9XG4gICAgaWYgeCA+PSB5IHRoZW4geCBlbHNlIGludmFsaWRfYXJnIFwiRmxvYXQuQXJyYXkuY29uY2F0XCJcblxuICBsZXQgcmVjIHN1bV9sZW5ndGhzIGFjYyA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiBhY2NcbiAgICB8IGhkIDo6IHRsIC0+IHN1bV9sZW5ndGhzIChlbnN1cmVfZ2UgKGxlbmd0aCBoZCArIGFjYykgYWNjKSB0bFxuXG4gIGxldCBjb25jYXQgbCA9XG4gICAgbGV0IGxlbiA9IHN1bV9sZW5ndGhzIDAgbCBpblxuICAgIGxldCByZXN1bHQgPSBjcmVhdGUgbGVuIGluXG4gICAgbGV0IHJlYyBsb29wIGwgaSA9XG4gICAgICBtYXRjaCBsIHdpdGhcbiAgICAgIHwgW10gLT4gYXNzZXJ0IChpID0gbGVuKVxuICAgICAgfCBoZCA6OiB0bCAtPlxuICAgICAgICBsZXQgaGxlbiA9IGxlbmd0aCBoZCBpblxuICAgICAgICB1bnNhZmVfYmxpdCBoZCAwIHJlc3VsdCBpIGhsZW47XG4gICAgICAgIGxvb3AgdGwgKGkgKyBobGVuKVxuICAgIGluXG4gICAgbG9vcCBsIDA7XG4gICAgcmVzdWx0XG5cbiAgbGV0IHN1YiBhIG9mcyBsZW4gPVxuICAgIGNoZWNrIGEgb2ZzIGxlbiBcIkZsb2F0LkFycmF5LnN1YlwiO1xuICAgIGxldCByZXN1bHQgPSBjcmVhdGUgbGVuIGluXG4gICAgdW5zYWZlX2JsaXQgYSBvZnMgcmVzdWx0IDAgbGVuO1xuICAgIHJlc3VsdFxuXG4gIGxldCBjb3B5IGEgPVxuICAgIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgcmVzdWx0ID0gY3JlYXRlIGwgaW5cbiAgICB1bnNhZmVfYmxpdCBhIDAgcmVzdWx0IDAgbDtcbiAgICByZXN1bHRcblxuICBsZXQgZmlsbCBhIG9mcyBsZW4gdiA9XG4gICAgY2hlY2sgYSBvZnMgbGVuIFwiRmxvYXQuQXJyYXkuZmlsbFwiO1xuICAgIHVuc2FmZV9maWxsIGEgb2ZzIGxlbiB2XG5cbiAgbGV0IGJsaXQgc3JjIHNvZnMgZHN0IGRvZnMgbGVuID1cbiAgICBjaGVjayBzcmMgc29mcyBsZW4gXCJGbG9hdC5hcnJheS5ibGl0XCI7XG4gICAgY2hlY2sgZHN0IGRvZnMgbGVuIFwiRmxvYXQuYXJyYXkuYmxpdFwiO1xuICAgIHVuc2FmZV9ibGl0IHNyYyBzb2ZzIGRzdCBkb2ZzIGxlblxuXG4gIGxldCB0b19saXN0IGEgPVxuICAgIExpc3QuaW5pdCAobGVuZ3RoIGEpICh1bnNhZmVfZ2V0IGEpXG5cbiAgbGV0IG9mX2xpc3QgbCA9XG4gICAgbGV0IHJlc3VsdCA9IGNyZWF0ZSAoTGlzdC5sZW5ndGggbCkgaW5cbiAgICBsZXQgcmVjIGZpbGwgaSBsID1cbiAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgfCBbXSAtPiByZXN1bHRcbiAgICAgIHwgaCA6OiB0IC0+IHVuc2FmZV9zZXQgcmVzdWx0IGkgaDsgZmlsbCAoaSArIDEpIHRcbiAgICBpblxuICAgIGZpbGwgMCBsXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBpdGVyIGYgYSA9XG4gICAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmICh1bnNhZmVfZ2V0IGEgaSkgZG9uZVxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgaXRlcjIgZiBhIGIgPVxuICAgIGlmIGxlbmd0aCBhIDw+IGxlbmd0aCBiIHRoZW5cbiAgICAgIGludmFsaWRfYXJnIFwiRmxvYXQuQXJyYXkuaXRlcjI6IGFycmF5cyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCJcbiAgICBlbHNlXG4gICAgICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvIGYgKHVuc2FmZV9nZXQgYSBpKSAodW5zYWZlX2dldCBiIGkpIGRvbmVcblxuICBsZXQgbWFwIGYgYSA9XG4gICAgbGV0IGwgPSBsZW5ndGggYSBpblxuICAgIGxldCByID0gY3JlYXRlIGwgaW5cbiAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgciBpIChmICh1bnNhZmVfZ2V0IGEgaSkpXG4gICAgZG9uZTtcbiAgICByXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBtYXBfaW5wbGFjZSBmIGEgPVxuICAgIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgYSBpIChmICh1bnNhZmVfZ2V0IGEgaSkpXG4gICAgZG9uZVxuXG4gIGxldCBtYXAyIGYgYSBiID1cbiAgICBsZXQgbGEgPSBsZW5ndGggYSBpblxuICAgIGxldCBsYiA9IGxlbmd0aCBiIGluXG4gICAgaWYgbGEgPD4gbGIgdGhlblxuICAgICAgaW52YWxpZF9hcmcgXCJGbG9hdC5BcnJheS5tYXAyOiBhcnJheXMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiXG4gICAgZWxzZSBiZWdpblxuICAgICAgbGV0IHIgPSBjcmVhdGUgbGEgaW5cbiAgICAgIGZvciBpID0gMCB0byBsYSAtIDEgZG9cbiAgICAgICAgdW5zYWZlX3NldCByIGkgKGYgKHVuc2FmZV9nZXQgYSBpKSAodW5zYWZlX2dldCBiIGkpKVxuICAgICAgZG9uZTtcbiAgICAgIHJcbiAgICBlbmRcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGl0ZXJpIGYgYSA9XG4gICAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmIGkgKHVuc2FmZV9nZXQgYSBpKSBkb25lXG5cbiAgbGV0IG1hcGkgZiBhID1cbiAgICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHIgPSBjcmVhdGUgbCBpblxuICAgIGZvciBpID0gMCB0byBsIC0gMSBkb1xuICAgICAgdW5zYWZlX3NldCByIGkgKGYgaSAodW5zYWZlX2dldCBhIGkpKVxuICAgIGRvbmU7XG4gICAgclxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgbWFwaV9pbnBsYWNlIGYgYSA9XG4gICAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkb1xuICAgICAgdW5zYWZlX3NldCBhIGkgKGYgaSAodW5zYWZlX2dldCBhIGkpKVxuICAgIGRvbmVcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGZvbGRfbGVmdCBmIHggYSA9XG4gICAgbGV0IHIgPSByZWYgeCBpblxuICAgIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG9cbiAgICAgIHIgOj0gZiAhciAodW5zYWZlX2dldCBhIGkpXG4gICAgZG9uZTtcbiAgICAhclxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgZm9sZF9yaWdodCBmIGEgeCA9XG4gICAgbGV0IHIgPSByZWYgeCBpblxuICAgIGZvciBpID0gbGVuZ3RoIGEgLSAxIGRvd250byAwIGRvXG4gICAgICByIDo9IGYgKHVuc2FmZV9nZXQgYSBpKSAhclxuICAgIGRvbmU7XG4gICAgIXJcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGV4aXN0cyBwIGEgPVxuICAgIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgYSBpKSB0aGVuIHRydWVcbiAgICAgIGVsc2UgbG9vcCAoaSArIDEpIGluXG4gICAgbG9vcCAwXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBmb3JfYWxsIHAgYSA9XG4gICAgbGV0IG4gPSBsZW5ndGggYSBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPSBuIHRoZW4gdHJ1ZVxuICAgICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IGEgaSkgdGhlbiBsb29wIChpICsgMSlcbiAgICAgIGVsc2UgZmFsc2UgaW5cbiAgICBsb29wIDBcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IG1lbSB4IGEgPVxuICAgIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgICBlbHNlIGlmIGNvbXBhcmUgKHVuc2FmZV9nZXQgYSBpKSB4ID0gMCB0aGVuIHRydWVcbiAgICAgIGVsc2UgbG9vcCAoaSArIDEpXG4gICAgaW5cbiAgICBsb29wIDBcblxuICAoKiBtb3N0bHkgZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sLCBidXQgc2xpZ2h0bHkgZGlmZmVyZW50ICopXG4gIGxldCBtZW1faWVlZSB4IGEgPVxuICAgIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgICBlbHNlIGlmIHggPSAodW5zYWZlX2dldCBhIGkpIHRoZW4gdHJ1ZVxuICAgICAgZWxzZSBsb29wIChpICsgMSlcbiAgICBpblxuICAgIGxvb3AgMFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgZmluZF9vcHQgcCBhID1cbiAgICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgICBlbHNlXG4gICAgICAgIGxldCB4ID0gdW5zYWZlX2dldCBhIGkgaW5cbiAgICAgICAgaWYgcCB4IHRoZW4gU29tZSB4XG4gICAgICAgIGVsc2UgbG9vcCAoaSArIDEpXG4gICAgaW5cbiAgICBsb29wIDBcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGZpbmRfaW5kZXggcCBhID1cbiAgICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgYSBpKSB0aGVuIFNvbWUgaVxuICAgICAgZWxzZSBsb29wIChpICsgMSkgaW5cbiAgICBsb29wIDBcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGZpbmRfbWFwIGYgYSA9XG4gICAgbGV0IG4gPSBsZW5ndGggYSBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPSBuIHRoZW4gTm9uZVxuICAgICAgZWxzZVxuICAgICAgICBtYXRjaCBmICh1bnNhZmVfZ2V0IGEgaSkgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gbG9vcCAoaSArIDEpXG4gICAgICAgIHwgU29tZSBfIGFzIHIgLT4gclxuICAgIGluXG4gICAgbG9vcCAwXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBmaW5kX21hcGkgZiBhID1cbiAgICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgICBlbHNlXG4gICAgICAgIG1hdGNoIGYgaSAodW5zYWZlX2dldCBhIGkpIHdpdGhcbiAgICAgICAgfCBOb25lIC0+IGxvb3AgKGkgKyAxKVxuICAgICAgICB8IFNvbWUgXyBhcyByIC0+IHJcbiAgICBpblxuICAgIGxvb3AgMFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBleGNlcHRpb24gQm90dG9tIG9mIGludFxuICBsZXQgc29ydCBjbXAgYSA9XG4gICAgbGV0IG1heHNvbiBsIGkgPVxuICAgICAgbGV0IGkzMSA9IGkraStpKzEgaW5cbiAgICAgIGxldCB4ID0gcmVmIGkzMSBpblxuICAgICAgaWYgaTMxKzIgPCBsIHRoZW4gYmVnaW5cbiAgICAgICAgaWYgY21wIChnZXQgYSBpMzEpIChnZXQgYSAoaTMxKzEpKSA8IDAgdGhlbiB4IDo9IGkzMSsxO1xuICAgICAgICBpZiBjbXAgKGdldCBhICF4KSAoZ2V0IGEgKGkzMSsyKSkgPCAwIHRoZW4geCA6PSBpMzErMjtcbiAgICAgICAgIXhcbiAgICAgIGVuZCBlbHNlXG4gICAgICAgIGlmIGkzMSsxIDwgbCAmJiBjbXAgKGdldCBhIGkzMSkgKGdldCBhIChpMzErMSkpIDwgMFxuICAgICAgICB0aGVuIGkzMSsxXG4gICAgICAgIGVsc2UgaWYgaTMxIDwgbCB0aGVuIGkzMSBlbHNlIHJhaXNlIChCb3R0b20gaSlcbiAgICBpblxuICAgIGxldCByZWMgdHJpY2tsZWRvd24gbCBpIGUgPVxuICAgICAgbGV0IGogPSBtYXhzb24gbCBpIGluXG4gICAgICBpZiBjbXAgKGdldCBhIGopIGUgPiAwIHRoZW4gYmVnaW5cbiAgICAgICAgc2V0IGEgaSAoZ2V0IGEgaik7XG4gICAgICAgIHRyaWNrbGVkb3duIGwgaiBlO1xuICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgc2V0IGEgaSBlO1xuICAgICAgZW5kO1xuICAgIGluXG4gICAgbGV0IHRyaWNrbGUgbCBpIGUgPSB0cnkgdHJpY2tsZWRvd24gbCBpIGUgd2l0aCBCb3R0b20gaSAtPiBzZXQgYSBpIGUgaW5cbiAgICBsZXQgcmVjIGJ1YmJsZWRvd24gbCBpID1cbiAgICAgIGxldCBqID0gbWF4c29uIGwgaSBpblxuICAgICAgc2V0IGEgaSAoZ2V0IGEgaik7XG4gICAgICBidWJibGVkb3duIGwgalxuICAgIGluXG4gICAgbGV0IGJ1YmJsZSBsIGkgPSB0cnkgYnViYmxlZG93biBsIGkgd2l0aCBCb3R0b20gaSAtPiBpIGluXG4gICAgbGV0IHJlYyB0cmlja2xldXAgaSBlID1cbiAgICAgIGxldCBmYXRoZXIgPSAoaSAtIDEpIC8gMyBpblxuICAgICAgYXNzZXJ0IChpIDw+IGZhdGhlcik7XG4gICAgICBpZiBjbXAgKGdldCBhIGZhdGhlcikgZSA8IDAgdGhlbiBiZWdpblxuICAgICAgICBzZXQgYSBpIChnZXQgYSBmYXRoZXIpO1xuICAgICAgICBpZiBmYXRoZXIgPiAwIHRoZW4gdHJpY2tsZXVwIGZhdGhlciBlIGVsc2Ugc2V0IGEgMCBlO1xuICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgc2V0IGEgaSBlO1xuICAgICAgZW5kO1xuICAgIGluXG4gICAgbGV0IGwgPSBsZW5ndGggYSBpblxuICAgIGZvciBpID0gKGwgKyAxKSAvIDMgLSAxIGRvd250byAwIGRvIHRyaWNrbGUgbCBpIChnZXQgYSBpKTsgZG9uZTtcbiAgICBmb3IgaSA9IGwgLSAxIGRvd250byAyIGRvXG4gICAgICBsZXQgZSA9IChnZXQgYSBpKSBpblxuICAgICAgc2V0IGEgaSAoZ2V0IGEgMCk7XG4gICAgICB0cmlja2xldXAgKGJ1YmJsZSBpIDApIGU7XG4gICAgZG9uZTtcbiAgICBpZiBsID4gMSB0aGVuIChsZXQgZSA9IChnZXQgYSAxKSBpbiBzZXQgYSAxIChnZXQgYSAwKTsgc2V0IGEgMCBlKVxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCwgZXhjZXB0IGZvciB0aGUgY2FsbCB0byBbY3JlYXRlXSAqKVxuICBsZXQgY3V0b2ZmID0gNVxuICBsZXQgc3RhYmxlX3NvcnQgY21wIGEgPVxuICAgIGxldCBtZXJnZSBzcmMxb2ZzIHNyYzFsZW4gc3JjMiBzcmMyb2ZzIHNyYzJsZW4gZHN0IGRzdG9mcyA9XG4gICAgICBsZXQgc3JjMXIgPSBzcmMxb2ZzICsgc3JjMWxlbiBhbmQgc3JjMnIgPSBzcmMyb2ZzICsgc3JjMmxlbiBpblxuICAgICAgbGV0IHJlYyBsb29wIGkxIHMxIGkyIHMyIGQgPVxuICAgICAgICBpZiBjbXAgczEgczIgPD0gMCB0aGVuIGJlZ2luXG4gICAgICAgICAgc2V0IGRzdCBkIHMxO1xuICAgICAgICAgIGxldCBpMSA9IGkxICsgMSBpblxuICAgICAgICAgIGlmIGkxIDwgc3JjMXIgdGhlblxuICAgICAgICAgICAgbG9vcCBpMSAoZ2V0IGEgaTEpIGkyIHMyIChkICsgMSlcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBibGl0IHNyYzIgaTIgZHN0IChkICsgMSkgKHNyYzJyIC0gaTIpXG4gICAgICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgICAgc2V0IGRzdCBkIHMyO1xuICAgICAgICAgIGxldCBpMiA9IGkyICsgMSBpblxuICAgICAgICAgIGlmIGkyIDwgc3JjMnIgdGhlblxuICAgICAgICAgICAgbG9vcCBpMSBzMSBpMiAoZ2V0IHNyYzIgaTIpIChkICsgMSlcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBibGl0IGEgaTEgZHN0IChkICsgMSkgKHNyYzFyIC0gaTEpXG4gICAgICAgIGVuZFxuICAgICAgaW4gbG9vcCBzcmMxb2ZzIChnZXQgYSBzcmMxb2ZzKSBzcmMyb2ZzIChnZXQgc3JjMiBzcmMyb2ZzKSBkc3RvZnM7XG4gICAgaW5cbiAgICBsZXQgaXNvcnR0byBzcmNvZnMgZHN0IGRzdG9mcyBsZW4gPVxuICAgICAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICAgICAgbGV0IGUgPSAoZ2V0IGEgKHNyY29mcyArIGkpKSBpblxuICAgICAgICBsZXQgaiA9IHJlZiAoZHN0b2ZzICsgaSAtIDEpIGluXG4gICAgICAgIHdoaWxlICghaiA+PSBkc3RvZnMgJiYgY21wIChnZXQgZHN0ICFqKSBlID4gMCkgZG9cbiAgICAgICAgICBzZXQgZHN0ICghaiArIDEpIChnZXQgZHN0ICFqKTtcbiAgICAgICAgICBkZWNyIGo7XG4gICAgICAgIGRvbmU7XG4gICAgICAgIHNldCBkc3QgKCFqICsgMSkgZTtcbiAgICAgIGRvbmU7XG4gICAgaW5cbiAgICBsZXQgcmVjIHNvcnR0byBzcmNvZnMgZHN0IGRzdG9mcyBsZW4gPVxuICAgICAgaWYgbGVuIDw9IGN1dG9mZiB0aGVuIGlzb3J0dG8gc3Jjb2ZzIGRzdCBkc3RvZnMgbGVuIGVsc2UgYmVnaW5cbiAgICAgICAgbGV0IGwxID0gbGVuIC8gMiBpblxuICAgICAgICBsZXQgbDIgPSBsZW4gLSBsMSBpblxuICAgICAgICBzb3J0dG8gKHNyY29mcyArIGwxKSBkc3QgKGRzdG9mcyArIGwxKSBsMjtcbiAgICAgICAgc29ydHRvIHNyY29mcyBhIChzcmNvZnMgKyBsMikgbDE7XG4gICAgICAgIG1lcmdlIChzcmNvZnMgKyBsMikgbDEgZHN0IChkc3RvZnMgKyBsMSkgbDIgZHN0IGRzdG9mcztcbiAgICAgIGVuZDtcbiAgICBpblxuICAgIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgICBpZiBsIDw9IGN1dG9mZiB0aGVuIGlzb3J0dG8gMCBhIDAgbCBlbHNlIGJlZ2luXG4gICAgICBsZXQgbDEgPSBsIC8gMiBpblxuICAgICAgbGV0IGwyID0gbCAtIGwxIGluXG4gICAgICBsZXQgdCA9IGNyZWF0ZSBsMiBpblxuICAgICAgc29ydHRvIGwxIHQgMCBsMjtcbiAgICAgIHNvcnR0byAwIGEgbDIgbDE7XG4gICAgICBtZXJnZSBsMiBsMSB0IDAgbDIgYSAwO1xuICAgIGVuZFxuXG4gIGxldCBmYXN0X3NvcnQgPSBzdGFibGVfc29ydFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgc2h1ZmZsZSB+cmFuZCBhID0gKCogRmlzaGVyLVlhdGVzICopXG4gICAgZm9yIGkgPSBsZW5ndGggYSAtIDEgZG93bnRvIDEgZG9cbiAgICAgIGxldCBqID0gcmFuZCAoaSArIDEpIGluXG4gICAgICBsZXQgdiA9IHVuc2FmZV9nZXQgYSBpIGluXG4gICAgICB1bnNhZmVfc2V0IGEgaSAoZ2V0IGEgaik7XG4gICAgICB1bnNhZmVfc2V0IGEgaiB2XG4gICAgZG9uZVxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgdG9fc2VxIGEgPVxuICAgIGxldCByZWMgYXV4IGkgKCkgPVxuICAgICAgaWYgaSA8IGxlbmd0aCBhXG4gICAgICB0aGVuXG4gICAgICAgIGxldCB4ID0gdW5zYWZlX2dldCBhIGkgaW5cbiAgICAgICAgU2VxLkNvbnMgKHgsIGF1eCAoaSsxKSlcbiAgICAgIGVsc2UgU2VxLk5pbFxuICAgIGluXG4gICAgYXV4IDBcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IHRvX3NlcWkgYSA9XG4gICAgbGV0IHJlYyBhdXggaSAoKSA9XG4gICAgICBpZiBpIDwgbGVuZ3RoIGFcbiAgICAgIHRoZW5cbiAgICAgICAgbGV0IHggPSB1bnNhZmVfZ2V0IGEgaSBpblxuICAgICAgICBTZXEuQ29ucyAoKGkseCksIGF1eCAoaSsxKSlcbiAgICAgIGVsc2UgU2VxLk5pbFxuICAgIGluXG4gICAgYXV4IDBcblxuICAoKiBtb3N0bHkgZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBvZl9yZXZfbGlzdCBsID1cbiAgICBsZXQgbGVuID0gTGlzdC5sZW5ndGggbCBpblxuICAgIGxldCBhID0gY3JlYXRlIGxlbiBpblxuICAgIGxldCByZWMgZmlsbCBpID0gZnVuY3Rpb25cbiAgICAgICAgW10gLT4gYVxuICAgICAgfCBoZDo6dGwgLT4gdW5zYWZlX3NldCBhIGkgaGQ7IGZpbGwgKGktMSkgdGxcbiAgICBpblxuICAgIGZpbGwgKGxlbi0xKSBsXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBvZl9zZXEgaSA9XG4gICAgbGV0IGwgPSBTZXEuZm9sZF9sZWZ0IChmdW4gYWNjIHggLT4geDo6YWNjKSBbXSBpIGluXG4gICAgb2ZfcmV2X2xpc3QgbFxuXG5cbiAgbGV0IG1hcF90b19hcnJheSBmIGEgPVxuICAgIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgICBpZiBsID0gMCB0aGVuIFt8IHxdIGVsc2UgYmVnaW5cbiAgICAgIGxldCByID0gQXJyYXkubWFrZSBsIChmICh1bnNhZmVfZ2V0IGEgMCkpIGluXG4gICAgICBmb3IgaSA9IDEgdG8gbCAtIDEgZG9cbiAgICAgICAgQXJyYXkudW5zYWZlX3NldCByIGkgKGYgKHVuc2FmZV9nZXQgYSBpKSlcbiAgICAgIGRvbmU7XG4gICAgICByXG4gICAgZW5kXG5cbiAgbGV0IG1hcF9mcm9tX2FycmF5IGYgYSA9XG4gICAgbGV0IGwgPSBBcnJheS5sZW5ndGggYSBpblxuICAgIGxldCByID0gY3JlYXRlIGwgaW5cbiAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgciBpIChmIChBcnJheS51bnNhZmVfZ2V0IGEgaSkpXG4gICAgZG9uZTtcbiAgICByXG5cbmVuZFxuXG5tb2R1bGUgQXJyYXlMYWJlbHMgPSBBcnJheVxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2NoZWNrX2JvdW5kIiwiY2FtbF9mbG9hdF9jb21wYXJlIiwiY2FtbF9mbG9hdGFycmF5X2JsaXQiLCJjYW1sX2Zsb2F0YXJyYXlfY3JlYXRlIiwiY2FtbF9oYXNoIiwiY2FtbF9tYWtlX3ZlY3QiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX25leHRhZnRlcl9mbG9hdCIsImNhbWxfc2lnbmJpdF9mbG9hdCIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfU2VxIiwiU3RkbGliX0xpc3QiLCJBc3NlcnRfZmFpbHVyZSIsIlN0ZGxpYiIsImluZmluaXR5IiwibmVnX2luZmluaXR5IiwibmFuIiwiaXNfZmluaXRlIiwieCIsImlzX2luZmluaXRlIiwiaXNfbmFuIiwibWF4X2Zsb2F0IiwibWluX2Zsb2F0IiwiZXBzaWxvbiIsIm9mX3N0cmluZ19vcHQiLCJ0b19zdHJpbmciLCJpc19pbnRlZ2VyIiwic3VjYyIsInByZWQiLCJlcXVhbCIsInkiLCJtaW4iLCJtYXgiLCJtaW5fbWF4IiwibWluX251bSIsIm1heF9udW0iLCJtaW5fbWF4X251bSIsInNlZWRlZF9oYXNoIiwic2VlZCIsImhhc2giLCJ1bnNhZmVfZmlsbCIsImEiLCJvZnMiLCJsZW4iLCJ2IiwiaSIsImNoZWNrIiwibXNnIiwibWFrZSIsIm4iLCJyZXN1bHQiLCJpbml0IiwibCIsInJlcyIsIm1ha2VfbWF0cml4Iiwic3giLCJzeSIsImluaXRfbWF0cml4Iiwicm93IiwiYXBwZW5kIiwiYTIiLCJsMSIsImwyIiwiY3N0X2Zsb2F0X21sIiwiY29uY2F0IiwiYWNjIiwicGFyYW0iLCJ0bCIsImhkIiwiaGxlbiIsInN1YiIsImNvcHkiLCJmaWxsIiwiYmxpdCIsInNyYyIsInNvZnMiLCJkc3QiLCJkb2ZzIiwiY3N0X0Zsb2F0X2FycmF5X2JsaXQiLCJ0b19saXN0Iiwib2ZfbGlzdCIsInQiLCJoIiwiaXRlciIsIml0ZXIyIiwiYiIsIm1hcCIsInIiLCJtYXBfaW5wbGFjZSIsIm1hcDIiLCJsYSIsImxiIiwiaXRlcmkiLCJtYXBpIiwibWFwaV9pbnBsYWNlIiwiZm9sZF9sZWZ0IiwiZm9sZF9yaWdodCIsImV4aXN0cyIsInAiLCJmb3JfYWxsIiwibWVtIiwibWVtX2llZWUiLCJmaW5kX29wdCIsImZpbmRfaW5kZXgiLCJmaW5kX21hcCIsImZpbmRfbWFwaSIsIkJvdHRvbSIsInNvcnQiLCJjbXAiLCJtYXhzb24iLCJpMzEiLCJlIiwiaiIsImV4biIsImZhdGhlciIsInN0YWJsZV9zb3J0IiwibWVyZ2UiLCJzcmMxb2ZzIiwic3JjMWxlbiIsInNyYzIiLCJzcmMyb2ZzIiwic3JjMmxlbiIsImRzdG9mcyIsInNyYzFyIiwic3JjMnIiLCJzMiIsInMxIiwiaTEiLCJpMiIsImQiLCJpc29ydHRvIiwic3Jjb2ZzIiwic29ydHRvIiwic2h1ZmZsZSIsInJhbmQiLCJ0b19zZXEiLCJhdXgiLCJ0b19zZXFpIiwib2Zfc2VxIiwibWFwX3RvX2FycmF5IiwibWFwX2Zyb21fYXJyYXkiLCJTdGRsaWJfRmxvYXQiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxxQkFBQTtBQUFBLElBQUFDLHVCQUFBO0FBQUEsSUFBQUMseUJBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLHVCQUFBO0FBQUEsSUFBQUMscUJBQUE7QUFBQSxJQUFBQyxzQkFBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FBQUFBLElBQUE7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QUFBQTtBQUFBLFNBQUExQyxJQUFBO0FBQUE7QUFBQSxNQUNpQjtBQUFBLGNBQTBCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUUzQztBQUFBLEdBQUM7QUFBQTtBQUFBLElBQUFnRztBQUFBQSxNQXJrQnVEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkRyQzVEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdDcUM0RDtBQUFBO0FBQUEsRURyQzVEIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTU5OTMsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvaW50MzIubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIE1vZHVsZSBbSW50MzJdOiAzMi1iaXQgaW50ZWdlcnMgKilcblxuZXh0ZXJuYWwgbmVnIDogaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9uZWdcIlxuZXh0ZXJuYWwgYWRkIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9hZGRcIlxuZXh0ZXJuYWwgc3ViIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9zdWJcIlxuZXh0ZXJuYWwgbXVsIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9tdWxcIlxuZXh0ZXJuYWwgZGl2IDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9kaXZcIlxuZXh0ZXJuYWwgcmVtIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9tb2RcIlxuZXh0ZXJuYWwgbG9nYW5kIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9hbmRcIlxuZXh0ZXJuYWwgbG9nb3IgOiBpbnQzMiAtPiBpbnQzMiAtPiBpbnQzMiA9IFwiJWludDMyX29yXCJcbmV4dGVybmFsIGxvZ3hvciA6IGludDMyIC0+IGludDMyIC0+IGludDMyID0gXCIlaW50MzJfeG9yXCJcbmV4dGVybmFsIHNoaWZ0X2xlZnQgOiBpbnQzMiAtPiBpbnQgLT4gaW50MzIgPSBcIiVpbnQzMl9sc2xcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHQgOiBpbnQzMiAtPiBpbnQgLT4gaW50MzIgPSBcIiVpbnQzMl9hc3JcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHRfbG9naWNhbCA6IGludDMyIC0+IGludCAtPiBpbnQzMiA9IFwiJWludDMyX2xzclwiXG5leHRlcm5hbCBvZl9pbnQgOiBpbnQgLT4gaW50MzIgPSBcIiVpbnQzMl9vZl9pbnRcIlxuZXh0ZXJuYWwgdG9faW50IDogaW50MzIgLT4gaW50ID0gXCIlaW50MzJfdG9faW50XCJcbmV4dGVybmFsIG9mX2Zsb2F0IDogZmxvYXQgLT4gaW50MzJcbiAgPSBcImNhbWxfaW50MzJfb2ZfZmxvYXRcIiBcImNhbWxfaW50MzJfb2ZfZmxvYXRfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB0b19mbG9hdCA6IGludDMyIC0+IGZsb2F0XG4gID0gXCJjYW1sX2ludDMyX3RvX2Zsb2F0XCIgXCJjYW1sX2ludDMyX3RvX2Zsb2F0X3VuYm94ZWRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYml0c19vZl9mbG9hdCA6IGZsb2F0IC0+IGludDMyXG4gID0gXCJjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXRcIiBcImNhbWxfaW50MzJfYml0c19vZl9mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZsb2F0X29mX2JpdHMgOiBpbnQzMiAtPiBmbG9hdFxuICA9IFwiY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzXCIgXCJjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHNfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5cbmxldCB6ZXJvID0gMGxcbmxldCBvbmUgPSAxbFxubGV0IG1pbnVzX29uZSA9IC0xbFxubGV0IHN1Y2MgbiA9IGFkZCBuIDFsXG5sZXQgcHJlZCBuID0gc3ViIG4gMWxcbmxldCBhYnMgbiA9IGlmIG4gPj0gMGwgdGhlbiBuIGVsc2UgbmVnIG5cbmxldCBtaW5faW50ID0gMHg4MDAwMDAwMGxcbmxldCBtYXhfaW50ID0gMHg3RkZGRkZGRmxcbmxldCBsb2dub3QgbiA9IGxvZ3hvciBuICgtMWwpXG5cbmxldCB1bnNpZ25lZF90b19pbnQgPVxuICBtYXRjaCBTeXMud29yZF9zaXplIHdpdGhcbiAgfCAzMiAtPlxuICAgICAgbGV0IG1heF9pbnQgPSBvZl9pbnQgU3RkbGliLm1heF9pbnQgaW5cbiAgICAgIGZ1biBuIC0+XG4gICAgICAgIGlmIG4gPj0gMGwgJiYgbiA8PSBtYXhfaW50IHRoZW5cbiAgICAgICAgICBTb21lICh0b19pbnQgbilcbiAgICAgICAgZWxzZVxuICAgICAgICAgIE5vbmVcbiAgfCA2NCAtPlxuICAgICAgKCogU28gdGhhdCBpdCBjb21waWxlcyBpbiAzMi1iaXQgKilcbiAgICAgIGxldCBtYXNrID0gMHhGRkZGIGxzbCAxNiBsb3IgMHhGRkZGIGluXG4gICAgICBmdW4gbiAtPiBTb21lICh0b19pbnQgbiBsYW5kIG1hc2spXG4gIHwgXyAtPlxuICAgICAgYXNzZXJ0IGZhbHNlXG5cbmV4dGVybmFsIGZvcm1hdCA6IHN0cmluZyAtPiBpbnQzMiAtPiBzdHJpbmcgPSBcImNhbWxfaW50MzJfZm9ybWF0XCJcbmxldCB0b19zdHJpbmcgbiA9IGZvcm1hdCBcIiVkXCIgblxuXG5leHRlcm5hbCBvZl9zdHJpbmcgOiBzdHJpbmcgLT4gaW50MzIgPSBcImNhbWxfaW50MzJfb2Zfc3RyaW5nXCJcblxubGV0IG9mX3N0cmluZ19vcHQgcyA9XG4gIHRyeSBTb21lIChvZl9zdHJpbmcgcylcbiAgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZVxuXG50eXBlIHQgPSBpbnQzMlxuXG5sZXQgY29tcGFyZSAoeDogdCkgKHk6IHQpID0gU3RkbGliLmNvbXBhcmUgeCB5XG5sZXQgZXF1YWwgKHg6IHQpICh5OiB0KSA9IHggPSB5XG5cbmxldCB1bnNpZ25lZF9jb21wYXJlIG4gbSA9XG4gIGNvbXBhcmUgKHN1YiBuIG1pbl9pbnQpIChzdWIgbSBtaW5faW50KVxuXG5sZXQgdW5zaWduZWRfbHQgbiBtID1cbiAgc3ViIG4gbWluX2ludCA8IHN1YiBtIG1pbl9pbnRcblxubGV0IG1pbiB4IHkgOiB0ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmxldCBtYXggeCB5IDogdCA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG5cbigqIFVuc2lnbmVkIGRpdmlzaW9uIGZyb20gc2lnbmVkIGRpdmlzaW9uIG9mIHRoZSBzYW1lIGJpdG5lc3MuXG4gICBTZWUgV2FycmVuIEpyLiwgSGVucnkgUy4gKDIwMTMpLiBIYWNrZXIncyBEZWxpZ2h0ICgyIGVkLiksIFNlYyA5LTMuXG4qKVxubGV0IHVuc2lnbmVkX2RpdiBuIGQgPVxuICBpZiBkIDwgemVybyB0aGVuXG4gICAgaWYgdW5zaWduZWRfbHQgbiBkIHRoZW4gemVybyBlbHNlIG9uZVxuICBlbHNlXG4gICAgbGV0IHEgPSBzaGlmdF9sZWZ0IChkaXYgKHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgbiAxKSBkKSAxIGluXG4gICAgbGV0IHIgPSBzdWIgbiAobXVsIHEgZCkgaW5cbiAgICBpZiB1bnNpZ25lZF9sdCByIGQgdGhlbiBxIGVsc2Ugc3VjYyBxXG5cbmxldCB1bnNpZ25lZF9yZW0gbiBkID1cbiAgc3ViIG4gKG11bCAodW5zaWduZWRfZGl2IG4gZCkgZClcblxuZXh0ZXJuYWwgc2VlZGVkX2hhc2hfcGFyYW0gOlxuICBpbnQgLT4gaW50IC0+IGludCAtPiAnYSAtPiBpbnQgPSBcImNhbWxfaGFzaFwiIFtAQG5vYWxsb2NdXG5sZXQgc2VlZGVkX2hhc2ggc2VlZCB4ID0gc2VlZGVkX2hhc2hfcGFyYW0gMTAgMTAwIHNlZWQgeFxubGV0IGhhc2ggeCA9IHNlZWRlZF9oYXNoX3BhcmFtIDEwIDEwMCAwIHhcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9ncmVhdGVyZXF1YWwiLCJjYW1sX2hhc2giLCJjYW1sX2ludF9jb21wYXJlIiwiY2FtbF9sZXNzZXF1YWwiLCJjYW1sX2xlc3N0aGFuIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9tdWwiLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWIiLCJTdGRsaWJfU3lzIiwiQXNzZXJ0X2ZhaWx1cmUiLCJzdWNjIiwibiIsInByZWQiLCJhYnMiLCJsb2dub3QiLCJtYXRjaCIsIm1heF9pbnQiLCJ1bnNpZ25lZF90b19pbnQiLCJ0b19zdHJpbmciLCJvZl9zdHJpbmdfb3B0IiwicyIsImV4biIsImVxdWFsIiwidW5zaWduZWRfY29tcGFyZSIsIm0iLCJ5IiwieCIsInVuc2lnbmVkX2x0IiwibWluIiwibWF4IiwiemVybyIsIm9uZSIsInVuc2lnbmVkX2RpdiIsImQiLCJxIiwiciIsInVuc2lnbmVkX3JlbSIsInNlZWRlZF9oYXNoIiwic2VlZCIsImhhc2giLCJTdGRsaWJfSW50MzIiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsb0JBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsOEJBQUE7QUFBQSxJQUFBQyxXQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLFlBQUFDLEtBQUFDLEdDK0NxQjtBQUFBLFlBQUFDLEtBQUFELEdBQ0E7QUFBQSxZQUFBRSxJQUFBRixHQUNOLDRDQUF5QjtBQUFBLFlBQUFHLE9BQUFILEdBR1g7QUFBQSxPQUFBSSxRRHBEN0I7QUFBQTtBQUFBO0FBQUEsS0FBQUMsVUN5RG9CO0FBQUEsS0FBQUM7QUFBQUEsT0FDZCxTQUFBTjtBQUFBQSxRQUNLLDhCQUFXO0FBQUEsU0FDWjtBQUFBLFFBRUE7QUFBQSxPQUFJO0FBQUE7QUFBQSxJRDlEZDtBQUFBLEtDb0VNO0FBQUE7QUFBQSxRQUFBTSxrQkFGQSxTQUFBTixHQUFTLG1CQUF5QjtBQUFBO0FBQUEsWUFBQU8sVUFBQVAsR0FLdEIsdUNBQWE7QUFBQSxZQUFBUSxjQUFBQztBQUFBQSxJQUs3QixZQUFTO0FBQUEsVUFBQUM7QUFBQUEsU0FBQUEsTUQ1RVg7QUFBQSw4QkM2RW9CO0FBQUEsS0Q3RXBCO0FBQUE7QUFBQSxHQzZFd0I7QUFBQSxPQUFBQyxRRDdFeEI7QUFBQSxZQUFBQyxpQkFBQVosR0FBQWE7QUFBQUEsUUFBQUMsSUNxRjBCLG9CQUFBQyxJQUFoQjtBQUFBLElBSmtCLDZCQUlhO0FBQUE7QUFBQSxZQUFBQyxZQUFBaEIsR0FBQWE7QUFBQUEsSUFHdkMsNERBQTZCO0FBQUE7QUFBQSxZQUFBSSxJQUFBRixHQUFBRCxHQUVWLG1DQUFvQjtBQUFBLFlBQUFJLElBQUFILEdBQUFELEdBQ3BCLHNDQUFvQjtBQUFBLE9BQUFLLE9EM0Z6QyxHQUFBQyxNQUFBO0FBQUEsWUFBQUMsYUFBQXJCLEdBQUFzQjtBQUFBQSxJQ2lHSyx3QkFDRSxxQ0FJa0M7QUFBQSxRQUFBQyxJQUZsQix1Q0FBQUMsSUFDTDtBQUFBLElBQ1gsd0NBQWtDO0FBQUE7QUFBQSxZQUFBQyxhQUFBekIsR0FBQXNCO0FBQUFBLElBRzVCLFdBQUwsU0FBSywwQkFBcUI7QUFBQTtBQUFBLFlBQUFJLFlBQUFDLE1BQUFaLEdBSVQsa0NBQStCO0FBQUEsWUFBQWEsS0FBQWIsR0FDM0MsK0JBQTRCO0FBQUE7QUFBQSxJQUFBYztBQUFBQSxNRDlHekMiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoxNjA5MSwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9pbnQ2NC5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogTW9kdWxlIFtJbnQ2NF06IDY0LWJpdCBpbnRlZ2VycyAqKVxuXG5leHRlcm5hbCBuZWcgOiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X25lZ1wiXG5leHRlcm5hbCBhZGQgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X2FkZFwiXG5leHRlcm5hbCBzdWIgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X3N1YlwiXG5leHRlcm5hbCBtdWwgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X211bFwiXG5leHRlcm5hbCBkaXYgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X2RpdlwiXG5leHRlcm5hbCByZW0gOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X21vZFwiXG5leHRlcm5hbCBsb2dhbmQgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X2FuZFwiXG5leHRlcm5hbCBsb2dvciA6IGludDY0IC0+IGludDY0IC0+IGludDY0ID0gXCIlaW50NjRfb3JcIlxuZXh0ZXJuYWwgbG9neG9yIDogaW50NjQgLT4gaW50NjQgLT4gaW50NjQgPSBcIiVpbnQ2NF94b3JcIlxuZXh0ZXJuYWwgc2hpZnRfbGVmdCA6IGludDY0IC0+IGludCAtPiBpbnQ2NCA9IFwiJWludDY0X2xzbFwiXG5leHRlcm5hbCBzaGlmdF9yaWdodCA6IGludDY0IC0+IGludCAtPiBpbnQ2NCA9IFwiJWludDY0X2FzclwiXG5leHRlcm5hbCBzaGlmdF9yaWdodF9sb2dpY2FsIDogaW50NjQgLT4gaW50IC0+IGludDY0ID0gXCIlaW50NjRfbHNyXCJcbmV4dGVybmFsIG9mX2ludCA6IGludCAtPiBpbnQ2NCA9IFwiJWludDY0X29mX2ludFwiXG5leHRlcm5hbCB0b19pbnQgOiBpbnQ2NCAtPiBpbnQgPSBcIiVpbnQ2NF90b19pbnRcIlxuZXh0ZXJuYWwgb2ZfZmxvYXQgOiBmbG9hdCAtPiBpbnQ2NFxuICA9IFwiY2FtbF9pbnQ2NF9vZl9mbG9hdFwiIFwiY2FtbF9pbnQ2NF9vZl9mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRvX2Zsb2F0IDogaW50NjQgLT4gZmxvYXRcbiAgPSBcImNhbWxfaW50NjRfdG9fZmxvYXRcIiBcImNhbWxfaW50NjRfdG9fZmxvYXRfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBvZl9pbnQzMiA6IGludDMyIC0+IGludDY0ID0gXCIlaW50NjRfb2ZfaW50MzJcIlxuZXh0ZXJuYWwgdG9faW50MzIgOiBpbnQ2NCAtPiBpbnQzMiA9IFwiJWludDY0X3RvX2ludDMyXCJcbmV4dGVybmFsIG9mX25hdGl2ZWludCA6IG5hdGl2ZWludCAtPiBpbnQ2NCA9IFwiJWludDY0X29mX25hdGl2ZWludFwiXG5leHRlcm5hbCB0b19uYXRpdmVpbnQgOiBpbnQ2NCAtPiBuYXRpdmVpbnQgPSBcIiVpbnQ2NF90b19uYXRpdmVpbnRcIlxuXG5sZXQgemVybyA9IDBMXG5sZXQgb25lID0gMUxcbmxldCBtaW51c19vbmUgPSAtMUxcbmxldCBzdWNjIG4gPSBhZGQgbiAxTFxubGV0IHByZWQgbiA9IHN1YiBuIDFMXG5sZXQgYWJzIG4gPSBpZiBuID49IDBMIHRoZW4gbiBlbHNlIG5lZyBuXG5sZXQgbWluX2ludCA9IDB4ODAwMDAwMDAwMDAwMDAwMExcbmxldCBtYXhfaW50ID0gMHg3RkZGRkZGRkZGRkZGRkZGTFxubGV0IGxvZ25vdCBuID0gbG9neG9yIG4gKC0xTClcblxubGV0IHVuc2lnbmVkX3RvX2ludCA9XG4gIGxldCBtYXhfaW50ID0gb2ZfaW50IFN0ZGxpYi5tYXhfaW50IGluXG4gIGZ1biBuIC0+XG4gICAgaWYgbiA+PSAwTCAmJiBuIDw9IG1heF9pbnQgdGhlblxuICAgICAgU29tZSAodG9faW50IG4pXG4gICAgZWxzZVxuICAgICAgTm9uZVxuXG5leHRlcm5hbCBmb3JtYXQgOiBzdHJpbmcgLT4gaW50NjQgLT4gc3RyaW5nID0gXCJjYW1sX2ludDY0X2Zvcm1hdFwiXG5sZXQgdG9fc3RyaW5nIG4gPSBmb3JtYXQgXCIlZFwiIG5cblxuZXh0ZXJuYWwgb2Zfc3RyaW5nIDogc3RyaW5nIC0+IGludDY0ID0gXCJjYW1sX2ludDY0X29mX3N0cmluZ1wiXG5cbmxldCBvZl9zdHJpbmdfb3B0IHMgPVxuICB0cnkgU29tZSAob2Zfc3RyaW5nIHMpXG4gIHdpdGggRmFpbHVyZSBfIC0+IE5vbmVcblxuZXh0ZXJuYWwgYml0c19vZl9mbG9hdCA6IGZsb2F0IC0+IGludDY0XG4gID0gXCJjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXRcIiBcImNhbWxfaW50NjRfYml0c19vZl9mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZsb2F0X29mX2JpdHMgOiBpbnQ2NCAtPiBmbG9hdFxuICA9IFwiY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzXCIgXCJjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHNfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5cbnR5cGUgdCA9IGludDY0XG5cbmxldCBjb21wYXJlICh4OiB0KSAoeTogdCkgPSBTdGRsaWIuY29tcGFyZSB4IHlcbmxldCBlcXVhbCAoeDogdCkgKHk6IHQpID0geCA9IHlcblxubGV0IHVuc2lnbmVkX2NvbXBhcmUgbiBtID1cbiAgY29tcGFyZSAoc3ViIG4gbWluX2ludCkgKHN1YiBtIG1pbl9pbnQpXG5cbmxldCB1bnNpZ25lZF9sdCBuIG0gPVxuICBzdWIgbiBtaW5faW50IDwgc3ViIG0gbWluX2ludFxuXG5sZXQgbWluIHggeSA6IHQgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxubGV0IG1heCB4IHkgOiB0ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcblxuKCogVW5zaWduZWQgZGl2aXNpb24gZnJvbSBzaWduZWQgZGl2aXNpb24gb2YgdGhlIHNhbWUgYml0bmVzcy5cbiAgIFNlZSBXYXJyZW4gSnIuLCBIZW5yeSBTLiAoMjAxMykuIEhhY2tlcidzIERlbGlnaHQgKDIgZWQuKSwgU2VjIDktMy5cbiopXG5sZXQgdW5zaWduZWRfZGl2IG4gZCA9XG4gIGlmIGQgPCB6ZXJvIHRoZW5cbiAgICBpZiB1bnNpZ25lZF9sdCBuIGQgdGhlbiB6ZXJvIGVsc2Ugb25lXG4gIGVsc2VcbiAgICBsZXQgcSA9IHNoaWZ0X2xlZnQgKGRpdiAoc2hpZnRfcmlnaHRfbG9naWNhbCBuIDEpIGQpIDEgaW5cbiAgICBsZXQgciA9IHN1YiBuIChtdWwgcSBkKSBpblxuICAgIGlmIHVuc2lnbmVkX2x0IHIgZCB0aGVuIHEgZWxzZSBzdWNjIHFcblxubGV0IHVuc2lnbmVkX3JlbSBuIGQgPVxuICBzdWIgbiAobXVsICh1bnNpZ25lZF9kaXYgbiBkKSBkKVxuXG5leHRlcm5hbCBzZWVkZWRfaGFzaF9wYXJhbSA6XG4gIGludCAtPiBpbnQgLT4gaW50IC0+ICdhIC0+IGludCA9IFwiY2FtbF9oYXNoXCIgW0BAbm9hbGxvY11cbmxldCBzZWVkZWRfaGFzaCBzZWVkIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgc2VlZCB4XG5sZXQgaGFzaCB4ID0gc2VlZGVkX2hhc2hfcGFyYW0gMTAgMTAwIDAgeFxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2dyZWF0ZXJlcXVhbCIsImNhbWxfaGFzaCIsImNhbWxfaW50NjRfYWRkIiwiY2FtbF9pbnQ2NF9jb21wYXJlIiwiY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGkiLCJjYW1sX2ludDY0X211bCIsImNhbWxfaW50NjRfc3ViIiwiY2FtbF9sZXNzZXF1YWwiLCJjYW1sX2xlc3N0aGFuIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsInplcm8iLCJvbmUiLCJtaW51c19vbmUiLCJtaW5faW50IiwibWF4X2ludCIsIlN0ZGxpYiIsInN1Y2MiLCJuIiwicHJlZCIsImFicyIsImxvZ25vdCIsInVuc2lnbmVkX3RvX2ludCIsInRvX3N0cmluZyIsIm9mX3N0cmluZ19vcHQiLCJzIiwiZXhuIiwiY29tcGFyZSIsIngiLCJ5IiwiZXF1YWwiLCJ1bnNpZ25lZF9jb21wYXJlIiwibSIsInVuc2lnbmVkX2x0IiwibWluIiwibWF4IiwidW5zaWduZWRfZGl2IiwiZCIsInEiLCJyIiwidW5zaWduZWRfcmVtIiwic2VlZGVkX2hhc2giLCJzZWVkIiwiaGFzaCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLFlBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLHFCQUFBO0FBQUEsSUFBQUMsNkJBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQTtBQUFBLElBQUFDLE9BQUE7QUFBQSxJQUFBQyxNQUFBO0FBQUEsSUFBQUMsWUFBQTtBQUFBLElBQUFDLFVBQUE7QUFBQSxJQUFBQyxVQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLEtBQUFDLEdDNkNhLDJCQUFRO0FBQUEsWUFBQUMsS0FBQUQsR0FDUiwyQkFBUTtBQUFBLFlBQUFFLElBQUFGO0FBQUFBLElBQ04scUNBQW9CLHlCQUFLO0FBQUE7QUFBQSxZQUFBRyxPQUFBSCxHQUd6QixtQ0FBYztBQUFBO0FBQUEsSUFBQUgsWUFHYjtBQUFBLFFBQ2Q7QUFBQSxZQUFBTyxnQkFBQUo7QUFBQUEsSUFDSyw4QkFBVztBQUFBLEtBQ1o7QUFBQSxJQUVBO0FBQUEsR0FBSTtBQUFBLFlBQUFLLFVBQUFMLEdBR1EseUNBQWE7QUFBQSxZQUFBTSxjQUFBQztBQUFBQSxJQUs3QixZQUFTO0FBQUEsVUFBQUM7QUFBQUEsU0FBQUEsTURsRVg7QUFBQSw4QkNtRW9CO0FBQUEsS0RuRXBCO0FBQUE7QUFBQSxHQ21Fd0I7QUFBQSxZQUFBQyxRQUFBQyxHQUFBQyxHQVdJLCtCQUFrQjtBQUFBLE9BQUFDLFFBeEI1QztBQUFBLFlBQUFDLGlCQUFBYixHQUFBYztBQUFBQSxRQUFBSCxJQTRCd0IsNEJBQUFELElBQWhCO0FBQUEsSUFKa0IsK0JBSWE7QUFBQTtBQUFBLFlBQUFLLFlBQUFmLEdBQUFjO0FBQUFBLElBR3ZDO0FBQUEseUNBQWdCLDJCQUFhO0FBQUE7QUFBQSxZQUFBRSxJQUFBTixHQUFBQyxHQUVWLG1DQUFvQjtBQUFBLFlBQUFNLElBQUFQLEdBQUFDLEdBQ3BCLHNDQUFvQjtBQUFBLFlBQUFPLGFBQUFsQixHQUFBbUI7QUFBQUEsSUFNcEMsMkJBQ0UscUNBSWtDO0FBQUE7QUFBQSxLQUFBQztBQUFBQSxPQUY3QjtBQUFBLFNBQVc7QUFBQSxXQUFLO0FBQUE7QUFBQSxLQUFBQyxJQUNoQixrQkFBTTtBQUFBLElBQ1gsK0JBdERNLG9CQXNENEI7QUFBQTtBQUFBLFlBQUFDLGFBQUF0QixHQUFBbUI7QUFBQUEsSUFHNUIsT0FBWCxrQkFBTSxlQUFLLHVCQUFxQjtBQUFBO0FBQUEsWUFBQUksWUFBQUMsTUFBQWQsR0FJVCxrQ0FBK0I7QUFBQSxZQUFBZSxLQUFBZixHQUMzQywrQkFBNEI7QUFBQSxHQXJEdkM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVEdERGIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTYxOTksImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvbmF0aXZlaW50Lm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBNb2R1bGUgW05hdGl2ZWludF06IHByb2Nlc3Nvci1uYXRpdmUgaW50ZWdlcnMgKilcblxuZXh0ZXJuYWwgbmVnOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X25lZ1wiXG5leHRlcm5hbCBhZGQ6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X2FkZFwiXG5leHRlcm5hbCBzdWI6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X3N1YlwiXG5leHRlcm5hbCBtdWw6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X211bFwiXG5leHRlcm5hbCBkaXY6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X2RpdlwiXG5leHRlcm5hbCByZW06IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X21vZFwiXG5leHRlcm5hbCBsb2dhbmQ6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X2FuZFwiXG5leHRlcm5hbCBsb2dvcjogbmF0aXZlaW50IC0+IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfb3JcIlxuZXh0ZXJuYWwgbG9neG9yOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF94b3JcIlxuZXh0ZXJuYWwgc2hpZnRfbGVmdDogbmF0aXZlaW50IC0+IGludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfbHNsXCJcbmV4dGVybmFsIHNoaWZ0X3JpZ2h0OiBuYXRpdmVpbnQgLT4gaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9hc3JcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHRfbG9naWNhbDogbmF0aXZlaW50IC0+IGludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfbHNyXCJcbmV4dGVybmFsIG9mX2ludDogaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9vZl9pbnRcIlxuZXh0ZXJuYWwgdG9faW50OiBuYXRpdmVpbnQgLT4gaW50ID0gXCIlbmF0aXZlaW50X3RvX2ludFwiXG5leHRlcm5hbCBvZl9mbG9hdCA6IGZsb2F0IC0+IG5hdGl2ZWludFxuICA9IFwiY2FtbF9uYXRpdmVpbnRfb2ZfZmxvYXRcIiBcImNhbWxfbmF0aXZlaW50X29mX2Zsb2F0X3VuYm94ZWRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdG9fZmxvYXQgOiBuYXRpdmVpbnQgLT4gZmxvYXRcbiAgPSBcImNhbWxfbmF0aXZlaW50X3RvX2Zsb2F0XCIgXCJjYW1sX25hdGl2ZWludF90b19mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIG9mX2ludDMyOiBpbnQzMiAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfb2ZfaW50MzJcIlxuZXh0ZXJuYWwgdG9faW50MzI6IG5hdGl2ZWludCAtPiBpbnQzMiA9IFwiJW5hdGl2ZWludF90b19pbnQzMlwiXG5cbmxldCB6ZXJvID0gMG5cbmxldCBvbmUgPSAxblxubGV0IG1pbnVzX29uZSA9IC0xblxubGV0IHN1Y2MgbiA9IGFkZCBuIDFuXG5sZXQgcHJlZCBuID0gc3ViIG4gMW5cbmxldCBhYnMgbiA9IGlmIG4gPj0gMG4gdGhlbiBuIGVsc2UgbmVnIG5cbmxldCBzaXplID0gU3lzLndvcmRfc2l6ZVxubGV0IG1pbl9pbnQgPSBzaGlmdF9sZWZ0IDFuIChzaXplIC0gMSlcbmxldCBtYXhfaW50ID0gc3ViIG1pbl9pbnQgMW5cbmxldCBsb2dub3QgbiA9IGxvZ3hvciBuICgtMW4pXG5cbmxldCB1bnNpZ25lZF90b19pbnQgPVxuICBsZXQgbWF4X2ludCA9IG9mX2ludCBTdGRsaWIubWF4X2ludCBpblxuICBmdW4gbiAtPlxuICAgIGlmIG4gPj0gMG4gJiYgbiA8PSBtYXhfaW50IHRoZW5cbiAgICAgIFNvbWUgKHRvX2ludCBuKVxuICAgIGVsc2VcbiAgICAgIE5vbmVcblxuZXh0ZXJuYWwgZm9ybWF0IDogc3RyaW5nIC0+IG5hdGl2ZWludCAtPiBzdHJpbmcgPSBcImNhbWxfbmF0aXZlaW50X2Zvcm1hdFwiXG5sZXQgdG9fc3RyaW5nIG4gPSBmb3JtYXQgXCIlZFwiIG5cblxuZXh0ZXJuYWwgb2Zfc3RyaW5nOiBzdHJpbmcgLT4gbmF0aXZlaW50ID0gXCJjYW1sX25hdGl2ZWludF9vZl9zdHJpbmdcIlxuXG5sZXQgb2Zfc3RyaW5nX29wdCBzID1cbiAgdHJ5IFNvbWUgKG9mX3N0cmluZyBzKVxuICB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG5cbnR5cGUgdCA9IG5hdGl2ZWludFxuXG5sZXQgY29tcGFyZSAoeDogdCkgKHk6IHQpID0gU3RkbGliLmNvbXBhcmUgeCB5XG5sZXQgZXF1YWwgKHg6IHQpICh5OiB0KSA9IGNvbXBhcmUgeCB5ID0gMFxuXG5sZXQgdW5zaWduZWRfY29tcGFyZSBuIG0gPVxuICBjb21wYXJlIChzdWIgbiBtaW5faW50KSAoc3ViIG0gbWluX2ludClcblxubGV0IHVuc2lnbmVkX2x0IG4gbSA9XG4gIHN1YiBuIG1pbl9pbnQgPCBzdWIgbSBtaW5faW50XG5cbmxldCBtaW4geCB5IDogdCA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5sZXQgbWF4IHggeSA6IHQgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuXG4oKiBVbnNpZ25lZCBkaXZpc2lvbiBmcm9tIHNpZ25lZCBkaXZpc2lvbiBvZiB0aGUgc2FtZSBiaXRuZXNzLlxuICAgU2VlIFdhcnJlbiBKci4sIEhlbnJ5IFMuICgyMDEzKS4gSGFja2VyJ3MgRGVsaWdodCAoMiBlZC4pLCBTZWMgOS0zLlxuKilcbmxldCB1bnNpZ25lZF9kaXYgbiBkID1cbiAgaWYgZCA8IHplcm8gdGhlblxuICAgIGlmIHVuc2lnbmVkX2x0IG4gZCB0aGVuIHplcm8gZWxzZSBvbmVcbiAgZWxzZVxuICAgIGxldCBxID0gc2hpZnRfbGVmdCAoZGl2IChzaGlmdF9yaWdodF9sb2dpY2FsIG4gMSkgZCkgMSBpblxuICAgIGxldCByID0gc3ViIG4gKG11bCBxIGQpIGluXG4gICAgaWYgdW5zaWduZWRfbHQgciBkIHRoZW4gcSBlbHNlIHN1Y2MgcVxuXG5sZXQgdW5zaWduZWRfcmVtIG4gZCA9XG4gIHN1YiBuIChtdWwgKHVuc2lnbmVkX2RpdiBuIGQpIGQpXG5cbmV4dGVybmFsIHNlZWRlZF9oYXNoX3BhcmFtIDpcbiAgaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gaW50ID0gXCJjYW1sX2hhc2hcIiBbQEBub2FsbG9jXVxubGV0IHNlZWRlZF9oYXNoIHNlZWQgeCA9IHNlZWRlZF9oYXNoX3BhcmFtIDEwIDEwMCBzZWVkIHhcbmxldCBoYXNoIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgMCB4XG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfZ3JlYXRlcmVxdWFsIiwiY2FtbF9oYXNoIiwiY2FtbF9pbnRfY29tcGFyZSIsImNhbWxfbGVzc2VxdWFsIiwiY2FtbF9sZXNzdGhhbiIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfbXVsIiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImdsb2JhbF9kYXRhIiwiU3RkbGliIiwiU3RkbGliX1N5cyIsInN1Y2MiLCJuIiwicHJlZCIsImFicyIsInNpemUiLCJtaW5faW50IiwibWF4X2ludCIsImxvZ25vdCIsInVuc2lnbmVkX3RvX2ludCIsInRvX3N0cmluZyIsIm9mX3N0cmluZ19vcHQiLCJzIiwiZXhuIiwiZXF1YWwiLCJ4IiwieSIsInVuc2lnbmVkX2NvbXBhcmUiLCJtIiwidW5zaWduZWRfbHQiLCJtaW4iLCJtYXgiLCJ6ZXJvIiwib25lIiwidW5zaWduZWRfZGl2IiwiZCIsInEiLCJyIiwidW5zaWduZWRfcmVtIiwic2VlZGVkX2hhc2giLCJzZWVkIiwiaGFzaCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLFlBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLFdBQUE7QUFBQSxJQUFBQyxzQkFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsYUFBQTtBQUFBLFlBQUFDLEtBQUFDLEdDMkNxQjtBQUFBLFlBQUFDLEtBQUFELEdBQ0E7QUFBQSxZQUFBRSxJQUFBRixHQUNOLDRDQUF5QjtBQUFBO0FBQUEsSUFBQUcsT0Q3Q3hDO0FBQUEsSUFBQUMsVUMrQ2M7QUFBQSxJQUFBQyxVQUNBO0FBQUEsWUFBQUMsT0FBQU4sR0FDZTtBQUFBLE9BQUFLLFlBR2I7QUFBQSxZQUFBRSxnQkFBQVA7QUFBQUEsSUFFVCw4QkFBVyw4QkFDWjtBQUFBLElBRUE7QUFBQSxHQUFJO0FBQUEsWUFBQVEsVUFBQVIsR0FHUSx1Q0FBYTtBQUFBLFlBQUFTLGNBQUFDO0FBQUFBLElBSzdCLFlBQVM7QUFBQSxVQUFBQztBQUFBQSxTQUFBQSxNRGpFWDtBQUFBLDhCQ2tFb0I7QUFBQSxLRGxFcEI7QUFBQTtBQUFBLEdDa0V3QjtBQUFBLFlBQUFDLE1BQUFDLEdBQUFDLEdBSUksMkNBQ1MsQ0FBSTtBQUFBLFlBQUFDLGlCQUFBZixHQUFBZ0I7QUFBQUEsUUFBQUYsSUFHZixpQkFBQUQsSUFBaEI7QUFBQSxJQUprQiw2QkFJYTtBQUFBO0FBQUEsWUFBQUksWUFBQWpCLEdBQUFnQjtBQUFBQSxJQUd2QyxzREFBNkI7QUFBQTtBQUFBLFlBQUFFLElBQUFMLEdBQUFDLEdBRVYsbUNBQW9CO0FBQUEsWUFBQUssSUFBQU4sR0FBQUMsR0FDcEIsc0NBQW9CO0FBQUEsT0FBQU0sT0RoRnpDLEdBQUFDLE1BQUE7QUFBQSxZQUFBQyxhQUFBdEIsR0FBQXVCO0FBQUFBLElDc0ZLLHdCQUNFLHFDQUlrQztBQUFBLFFBQUFDLElBRmxCLHVDQUFBQyxJQUNMO0FBQUEsSUFDWCx3Q0FBa0M7QUFBQTtBQUFBLFlBQUFDLGFBQUExQixHQUFBdUI7QUFBQUEsSUFHNUIsV0FBTCxTQUFLLDBCQUFxQjtBQUFBO0FBQUEsWUFBQUksWUFBQUMsTUFBQWYsR0FJVCxrQ0FBK0I7QUFBQSxZQUFBZ0IsS0FBQWhCLEdBQzNDLCtCQUE0QjtBQUFBLEdBOUN2QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFRHJERiIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjE2MjkwLCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2J1ZmZlci5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgIFBpZXJyZSBXZWlzIGFuZCBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTkgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogRXh0ZW5zaWJsZSBidWZmZXJzICopXG5cbigqIFRoZSBbaW5uZXJfYnVmZmVyXSB0eXBlIGVuc3VyZXMgdGhhdCB0aGUgW2xlbmd0aF0gYW5kIFtidWZmZXJdIGZpZWxkcyBhcmVcbiAgIGFsd2F5cyBzeW5jaHJvbml6ZWQsIFtsZW5ndGggPSBCeXRlcy5sZW5ndGggYnVmZmVyXSwgZXZlbiBpbiBwcmVzZW5jZVxuICAgb2YgZGF0YSByYWNlcy5cbiopXG50eXBlIGlubmVyX2J1ZmZlciA9IHtcbiAgYnVmZmVyOiBieXRlcztcbiAgbGVuZ3RoOiBpbnQ7XG59XG5cbnR5cGUgdCA9XG4ge211dGFibGUgaW5uZXIgOiBpbm5lcl9idWZmZXI7XG4gIG11dGFibGUgcG9zaXRpb24gOiBpbnQ7XG4gIGluaXRpYWxfYnVmZmVyIDogYnl0ZXN9XG4oKiBJbnZhcmlhbnRzOiBhbGwgcGFydHMgb2YgdGhlIGNvZGUgcHJlc2VydmUgdGhlIGludmFyaWFudHMgdGhhdDpcbiAgIC0gW2lubmVyLmxlbmd0aCA9IEJ5dGVzLmxlbmd0aCBpbm5lci5idWZmZXJdXG4gICBJbiBhYnNlbmNlIG9mIGRhdGEgcmFjZXMsIHdlIGFsc28gaGF2ZVxuICAgLSBbMCA8PSBiLnBvc2l0aW9uIDw9IGIuaW5uZXIubGVuZ3RoXVxuXG4gICBOb3RlIGluIHBhcnRpY3VsYXIgdGhhdCBbYi5wb3NpdGlvbiA9IGIuaW5uZXIubGVuZ3RoXSBpcyBsZWdhbCxcbiAgIGl0IG1lYW5zIHRoYXQgdGhlIGJ1ZmZlciBpcyBmdWxsIGFuZCB3aWxsIGhhdmUgdG8gYmUgZXh0ZW5kZWRcbiAgIGJlZm9yZSBhbnkgZnVydGhlciBhZGRpdGlvbi4gKilcblxubGV0IGNyZWF0ZSBuID1cbiBsZXQgbiA9IGlmIG4gPCAxIHRoZW4gMSBlbHNlIG4gaW5cbiBsZXQgbiA9IGlmIG4gPiBTeXMubWF4X3N0cmluZ19sZW5ndGggdGhlbiBTeXMubWF4X3N0cmluZ19sZW5ndGggZWxzZSBuIGluXG4gbGV0IHMgPSBCeXRlcy5jcmVhdGUgbiBpblxuIHsgaW5uZXIgPSB7IGJ1ZmZlciA9IHM7IGxlbmd0aCA9IG59OyBwb3NpdGlvbiA9IDA7IGluaXRpYWxfYnVmZmVyID0gc31cblxubGV0IGNvbnRlbnRzIGIgPSBCeXRlcy5zdWJfc3RyaW5nIGIuaW5uZXIuYnVmZmVyIDAgYi5wb3NpdGlvblxubGV0IHRvX2J5dGVzIGIgPSBCeXRlcy5zdWIgYi5pbm5lci5idWZmZXIgMCBiLnBvc2l0aW9uXG5cbmxldCBzdWIgYiBvZnMgbGVuID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IGIucG9zaXRpb24gLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkJ1ZmZlci5zdWJcIlxuICBlbHNlIEJ5dGVzLnN1Yl9zdHJpbmcgYi5pbm5lci5idWZmZXIgb2ZzIGxlblxuXG5cbmxldCBibGl0IHNyYyBzcmNvZmYgZHN0IGRzdG9mZiBsZW4gPVxuICBpZiBsZW4gPCAwIHx8IHNyY29mZiA8IDAgfHwgc3Jjb2ZmID4gc3JjLnBvc2l0aW9uIC0gbGVuXG4gICAgICAgICAgICAgfHwgZHN0b2ZmIDwgMCB8fCBkc3RvZmYgPiAoQnl0ZXMubGVuZ3RoIGRzdCkgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkJ1ZmZlci5ibGl0XCJcbiAgZWxzZVxuICAgIEJ5dGVzLmJsaXQgc3JjLmlubmVyLmJ1ZmZlciBzcmNvZmYgZHN0IGRzdG9mZiBsZW5cblxuXG5sZXQgbnRoIGIgb2ZzID1cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2J1ZmZlcjtsZW5ndGh9ID0gYi5pbm5lciBpblxuICBpZiBvZnMgPCAwIHx8IG9mcyA+PSBwb3NpdGlvbiB8fCBwb3NpdGlvbiA+IGxlbmd0aCB0aGVuXG4gICBpbnZhbGlkX2FyZyBcIkJ1ZmZlci5udGhcIlxuICBlbHNlIEJ5dGVzLnVuc2FmZV9nZXQgYnVmZmVyIG9mc1xuXG5cbmxldCBsZW5ndGggYiA9IGIucG9zaXRpb25cblxubGV0IGNsZWFyIGIgPSBiLnBvc2l0aW9uIDwtIDBcblxubGV0IHJlc2V0IGIgPVxuICBiLnBvc2l0aW9uIDwtIDA7XG4gIGxldCBpbm5lciA9XG4gICAgeyBidWZmZXIgPSBiLmluaXRpYWxfYnVmZmVyOyBsZW5ndGggPSBCeXRlcy5sZW5ndGggYi5pbml0aWFsX2J1ZmZlciB9XG4gIGluXG4gIGIuaW5uZXIgPC0gaW5uZXJcblxuKCogW3Jlc2l6ZSBiIG1vcmVdIGVuc3VyZXMgdGhhdCBbYi5wb3NpdGlvbiArIG1vcmUgPD0gYi5pbm5lci5sZW5ndGhdIGhvbGRzXG4gICBieSBkeW5hbWljYWxseSBleHRlbmRpbmcgW2IuaW5uZXJdIGlmIG5lY2Vzc2FyeSAtLSBhbmQgdGh1c1xuICAgaW5jcmVhc2luZyBbYi5pbm5lci5sZW5ndGhdLlxuKilcbmxldCByZXNpemUgYiBtb3JlID1cbiAgbGV0IG9sZF9wb3MgPSBiLnBvc2l0aW9uIGluXG4gIGxldCBvbGRfbGVuID0gYi5pbm5lci5sZW5ndGggaW5cbiAgbGV0IG5ld19sZW4gPSByZWYgb2xkX2xlbiBpblxuICB3aGlsZSBvbGRfcG9zICsgbW9yZSA+ICFuZXdfbGVuIGRvIG5ld19sZW4gOj0gMiAqICFuZXdfbGVuIGRvbmU7XG4gIGlmICFuZXdfbGVuID4gU3lzLm1heF9zdHJpbmdfbGVuZ3RoIHRoZW4gYmVnaW5cbiAgICBpZiBvbGRfcG9zICsgbW9yZSA8PSBTeXMubWF4X3N0cmluZ19sZW5ndGhcbiAgICB0aGVuIG5ld19sZW4gOj0gU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG4gICAgZWxzZSBmYWlsd2l0aCBcIkJ1ZmZlci5hZGQ6IGNhbm5vdCBncm93IGJ1ZmZlclwiXG4gIGVuZDtcbiAgbGV0IG5ld19idWZmZXIgPSBCeXRlcy5jcmVhdGUgIW5ld19sZW4gaW5cbiAgKCogUFIjNjE0ODogbGV0J3Mga2VlcCB1c2luZyBbYmxpdF0gcmF0aGVyIHRoYW4gW3Vuc2FmZV9ibGl0XSBpblxuICAgICB0aGlzIHRyaWNreSBmdW5jdGlvbiB0aGF0IGlzIHNsb3cgYW55d2F5LiAqKVxuICBCeXRlcy5ibGl0IGIuaW5uZXIuYnVmZmVyIDAgbmV3X2J1ZmZlciAwIGIucG9zaXRpb247XG4gIGIuaW5uZXIgPC0geyBidWZmZXIgPSBuZXdfYnVmZmVyOyBsZW5ndGggPSAhbmV3X2xlbiB9XG5cbigqIE5vdGU6XG4gICAgU29tZSBvZiB0aGUgZnVuY3Rpb25zIGJlbG93IGhhdmUgYSBmYXN0IHBhdGggd2hlbiB0aGUgaW5uZXJcbiAgYnVmZmVyIGRvZXNuJ3QgbmVlZCB0byBiZSBleHRlbmRlZC5cbiAgICBJbiB0aGlzIGNhc2UsIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSB1bnNhZmUgYWNjZXNzZXMgb24gdGhlXG4gIGNvbnRlbnRzIG9mIHRoZSBbaW5uZXJdIGZpZWxkIHNpbmNlIGl0cyBmaWVsZHMgYXJlIGltbXV0YWJsZS5cbiAgSW4gcHJlc2VuY2Ugb2YgZGF0YSByYWNlcywgd2UgbWF5IGFjY2VzcyB0aGUgd3JvbmcgaW5uZXIgYnVmZmVyLCBidXQgd2VcbiAgd2lsbCB1c2UgdGhpcyBidWZmZXIgc2FmZWx5LlxuICBBcyBzb29uIGFzIHdlIG5lZWQgdG8gcmVzaXplIHRoZSBidWZmZXIsIHdlIGZhbGwgYmFjayB0byBzYWZlIGFjY2Vzc2VzLlxuKilcblxubGV0IGFkZF9jaGFyIGIgYyA9XG4gIGxldCBwb3MgPSBiLnBvc2l0aW9uIGluXG4gIGxldCB7YnVmZmVyO2xlbmd0aH0gPSBiLmlubmVyIGluXG4gIGlmIHBvcyA+PSBsZW5ndGggdGhlbiAoXG4gICAgcmVzaXplIGIgMTtcbiAgICBCeXRlcy5zZXQgYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiBjXG4gICkgZWxzZVxuICAgIEJ5dGVzLnVuc2FmZV9zZXQgYnVmZmVyIHBvcyBjO1xuICBiLnBvc2l0aW9uIDwtIHBvcyArIDFcblxubGV0IHVjaGFyX3V0Zl84X2J5dGVfbGVuZ3RoX21heCA9IDRcbmxldCB1Y2hhcl91dGZfMTZfYnl0ZV9sZW5ndGhfbWF4ID0gNFxuXG5sZXQgcmVjIGFkZF91dGZfOF91Y2hhciBiIHUgPVxuICBsZXQgcG9zID0gYi5wb3NpdGlvbiBpblxuICBpZiBwb3MgPj0gYi5pbm5lci5sZW5ndGggdGhlbiByZXNpemUgYiB1Y2hhcl91dGZfOF9ieXRlX2xlbmd0aF9tYXg7XG4gIGxldCBuID0gQnl0ZXMuc2V0X3V0Zl84X3VjaGFyIGIuaW5uZXIuYnVmZmVyIHBvcyB1IGluXG4gIGlmIG4gPSAwXG4gIHRoZW4gKHJlc2l6ZSBiIHVjaGFyX3V0Zl84X2J5dGVfbGVuZ3RoX21heDsgYWRkX3V0Zl84X3VjaGFyIGIgdSlcbiAgZWxzZSAoYi5wb3NpdGlvbiA8LSBwb3MgKyBuKVxuXG5sZXQgcmVjIGFkZF91dGZfMTZiZV91Y2hhciBiIHUgPVxuICBsZXQgcG9zID0gYi5wb3NpdGlvbiBpblxuICBpZiBwb3MgPj0gYi5pbm5lci5sZW5ndGggdGhlbiByZXNpemUgYiB1Y2hhcl91dGZfMTZfYnl0ZV9sZW5ndGhfbWF4O1xuICBsZXQgbiA9IEJ5dGVzLnNldF91dGZfMTZiZV91Y2hhciBiLmlubmVyLmJ1ZmZlciBwb3MgdSBpblxuICBpZiBuID0gMFxuICB0aGVuIChyZXNpemUgYiB1Y2hhcl91dGZfMTZfYnl0ZV9sZW5ndGhfbWF4OyBhZGRfdXRmXzE2YmVfdWNoYXIgYiB1KVxuICBlbHNlIChiLnBvc2l0aW9uIDwtIHBvcyArIG4pXG5cbmxldCByZWMgYWRkX3V0Zl8xNmxlX3VjaGFyIGIgdSA9XG4gIGxldCBwb3MgPSBiLnBvc2l0aW9uIGluXG4gIGlmIHBvcyA+PSBiLmlubmVyLmxlbmd0aCB0aGVuIHJlc2l6ZSBiIHVjaGFyX3V0Zl8xNl9ieXRlX2xlbmd0aF9tYXg7XG4gIGxldCBuID0gQnl0ZXMuc2V0X3V0Zl8xNmxlX3VjaGFyIGIuaW5uZXIuYnVmZmVyIHBvcyB1IGluXG4gIGlmIG4gPSAwXG4gIHRoZW4gKHJlc2l6ZSBiIHVjaGFyX3V0Zl8xNl9ieXRlX2xlbmd0aF9tYXg7IGFkZF91dGZfMTZsZV91Y2hhciBiIHUpXG4gIGVsc2UgKGIucG9zaXRpb24gPC0gcG9zICsgbilcblxubGV0IGFkZF9zdWJzdHJpbmcgYiBzIG9mZnNldCBsZW4gPVxuICBpZiBvZmZzZXQgPCAwIHx8IGxlbiA8IDAgfHwgb2Zmc2V0ID4gU3RyaW5nLmxlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJCdWZmZXIuYWRkX3N1YnN0cmluZy9hZGRfc3ViYnl0ZXNcIjtcbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2J1ZmZlcjtsZW5ndGh9ID0gYi5pbm5lciBpblxuICBsZXQgbmV3X3Bvc2l0aW9uID0gcG9zaXRpb24gKyBsZW4gaW5cbiAgaWYgbmV3X3Bvc2l0aW9uID4gbGVuZ3RoIHRoZW4gKFxuICAgIHJlc2l6ZSBiIGxlbjtcbiAgICBCeXRlcy5ibGl0X3N0cmluZyBzIG9mZnNldCBiLmlubmVyLmJ1ZmZlciBiLnBvc2l0aW9uIGxlblxuICApIGVsc2VcbiAgICBCeXRlcy51bnNhZmVfYmxpdF9zdHJpbmcgcyBvZmZzZXQgYnVmZmVyIHBvc2l0aW9uIGxlbjtcbiAgYi5wb3NpdGlvbiA8LSBuZXdfcG9zaXRpb25cblxubGV0IGFkZF9zdWJieXRlcyBiIHMgb2Zmc2V0IGxlbiA9XG4gIGFkZF9zdWJzdHJpbmcgYiAoQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBzKSBvZmZzZXQgbGVuXG5cbmxldCBhZGRfc3RyaW5nIGIgcyA9XG4gIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIHMgaW5cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2J1ZmZlcjsgbGVuZ3RofSA9IGIuaW5uZXIgaW5cbiAgbGV0IG5ld19wb3NpdGlvbiA9IHBvc2l0aW9uICsgbGVuIGluXG4gIGlmIG5ld19wb3NpdGlvbiA+IGxlbmd0aCB0aGVuIChcbiAgICByZXNpemUgYiBsZW47XG4gICAgQnl0ZXMuYmxpdF9zdHJpbmcgcyAwIGIuaW5uZXIuYnVmZmVyIGIucG9zaXRpb24gbGVuO1xuICApIGVsc2VcbiAgICBCeXRlcy51bnNhZmVfYmxpdF9zdHJpbmcgcyAwIGJ1ZmZlciBwb3NpdGlvbiBsZW47XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfYnl0ZXMgYiBzID0gYWRkX3N0cmluZyBiIChCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHMpXG5cbmxldCBhZGRfYnVmZmVyIGIgYnMgPVxuICBhZGRfc3ViYnl0ZXMgYiBicy5pbm5lci5idWZmZXIgMCBicy5wb3NpdGlvblxuXG4oKiB0aGlzIChwcml2YXRlKSBmdW5jdGlvbiBjb3VsZCBtb3ZlIGludG8gdGhlIHN0YW5kYXJkIGxpYnJhcnkgKilcbmxldCByZWFsbHlfaW5wdXRfdXBfdG8gaWMgYnVmIG9mcyBsZW4gPVxuICBsZXQgcmVjIGxvb3AgaWMgYnVmIH5hbHJlYWR5X3JlYWQgfm9mcyB+dG9fcmVhZCA9XG4gICAgaWYgdG9fcmVhZCA9IDAgdGhlbiBhbHJlYWR5X3JlYWRcbiAgICBlbHNlIGJlZ2luXG4gICAgICBsZXQgciA9IGlucHV0IGljIGJ1ZiBvZnMgdG9fcmVhZCBpblxuICAgICAgaWYgciA9IDAgdGhlbiBhbHJlYWR5X3JlYWRcbiAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgbGV0IGFscmVhZHlfcmVhZCA9IGFscmVhZHlfcmVhZCArIHIgaW5cbiAgICAgICAgbGV0IG9mcyA9IG9mcyArIHIgaW5cbiAgICAgICAgbGV0IHRvX3JlYWQgPSB0b19yZWFkIC0gciBpblxuICAgICAgICBsb29wIGljIGJ1ZiB+YWxyZWFkeV9yZWFkIH5vZnMgfnRvX3JlYWRcbiAgICAgIGVuZFxuICAgIGVuZFxuICBpbiBsb29wIGljIGJ1ZiB+YWxyZWFkeV9yZWFkOjAgfm9mcyB+dG9fcmVhZDpsZW5cblxuXG5sZXQgdW5zYWZlX2FkZF9jaGFubmVsX3VwX3RvIGIgaWMgbGVuID1cbiAgaWYgYi5wb3NpdGlvbiArIGxlbiA+IGIuaW5uZXIubGVuZ3RoIHRoZW4gcmVzaXplIGIgbGVuO1xuICBsZXQgbiA9IHJlYWxseV9pbnB1dF91cF90byBpYyBiLmlubmVyLmJ1ZmZlciBiLnBvc2l0aW9uIGxlbiBpblxuICBiLnBvc2l0aW9uIDwtIGIucG9zaXRpb24gKyBuO1xuICBuXG5cbmxldCBhZGRfY2hhbm5lbCBiIGljIGxlbiA9XG4gIGlmIGxlbiA8IDAgfHwgbGVuID4gU3lzLm1heF9zdHJpbmdfbGVuZ3RoIHRoZW4gICAoKiBQUiM1MDA0ICopXG4gICAgaW52YWxpZF9hcmcgXCJCdWZmZXIuYWRkX2NoYW5uZWxcIjtcbiAgbGV0IG4gPSB1bnNhZmVfYWRkX2NoYW5uZWxfdXBfdG8gYiBpYyBsZW4gaW5cbiAgKCogSXQgaXMgaW50ZW50aW9uYWwgdGhhdCBhIGNvbnN1bWVyIGNhdGNoaW5nIEVuZF9vZl9maWxlXG4gICAgIHdpbGwgc2VlIHRoZSBkYXRhIHdyaXR0ZW4gKHNlZSAjNjcxOSwgIzcxMzYpLiAqKVxuICBpZiBuIDwgbGVuIHRoZW4gcmFpc2UgRW5kX29mX2ZpbGU7XG4gICgpXG5cbmxldCBvdXRwdXRfYnVmZmVyIG9jIGIgPVxuICBvdXRwdXQgb2MgYi5pbm5lci5idWZmZXIgMCBiLnBvc2l0aW9uXG5cbmxldCBjbG9zaW5nID0gZnVuY3Rpb25cbiAgfCAnKCcgLT4gJyknXG4gIHwgJ3snIC0+ICd9J1xuICB8IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbigqIG9wZW5pbmcgYW5kIGNsb3Npbmc6IG9wZW4gYW5kIGNsb3NlIGNoYXJhY3RlcnMsIHR5cGljYWxseSAoIGFuZCApXG4gICBrOiBiYWxhbmNlIG9mIG9wZW5pbmcgYW5kIGNsb3NpbmcgY2hhcnNcbiAgIHM6IHRoZSBzdHJpbmcgd2hlcmUgd2UgYXJlIHNlYXJjaGluZ1xuICAgc3RhcnQ6IHRoZSBpbmRleCB3aGVyZSB3ZSBzdGFydCB0aGUgc2VhcmNoLiAqKVxubGV0IGFkdmFuY2VfdG9fY2xvc2luZyBvcGVuaW5nIGNsb3NpbmcgayBzIHN0YXJ0ID1cbiAgbGV0IHJlYyBhZHZhbmNlIGsgaSBsaW0gPVxuICAgIGlmIGkgPj0gbGltIHRoZW4gcmFpc2UgTm90X2ZvdW5kIGVsc2VcbiAgICBpZiBzLltpXSA9IG9wZW5pbmcgdGhlbiBhZHZhbmNlIChrICsgMSkgKGkgKyAxKSBsaW0gZWxzZVxuICAgIGlmIHMuW2ldID0gY2xvc2luZyB0aGVuXG4gICAgICBpZiBrID0gMCB0aGVuIGkgZWxzZSBhZHZhbmNlIChrIC0gMSkgKGkgKyAxKSBsaW1cbiAgICBlbHNlIGFkdmFuY2UgayAoaSArIDEpIGxpbSBpblxuICBhZHZhbmNlIGsgc3RhcnQgKFN0cmluZy5sZW5ndGggcylcblxubGV0IGFkdmFuY2VfdG9fbm9uX2FscGhhIHMgc3RhcnQgPVxuICBsZXQgcmVjIGFkdmFuY2UgaSBsaW0gPVxuICAgIGlmIGkgPj0gbGltIHRoZW4gbGltIGVsc2VcbiAgICBtYXRjaCBzLltpXSB3aXRoXG4gICAgfCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICcwJyAuLiAnOScgfCAnXycgLT4gYWR2YW5jZSAoaSArIDEpIGxpbVxuICAgIHwgXyAtPiBpIGluXG4gIGFkdmFuY2Ugc3RhcnQgKFN0cmluZy5sZW5ndGggcylcblxuKCogV2UgYXJlIGp1c3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhbiBpZGVudCBpbiBzLCBzdGFydGluZyBhdCBzdGFydC4gKilcbmxldCBmaW5kX2lkZW50IHMgc3RhcnQgbGltID1cbiAgaWYgc3RhcnQgPj0gbGltIHRoZW4gcmFpc2UgTm90X2ZvdW5kIGVsc2VcbiAgbWF0Y2ggcy5bc3RhcnRdIHdpdGhcbiAgKCogUGFyZW50aGVzaXplZCBpZGVudCA/ICopXG4gIHwgJygnIHwgJ3snIGFzIGMgLT5cbiAgICAgbGV0IG5ld19zdGFydCA9IHN0YXJ0ICsgMSBpblxuICAgICBsZXQgc3RvcCA9IGFkdmFuY2VfdG9fY2xvc2luZyBjIChjbG9zaW5nIGMpIDAgcyBuZXdfc3RhcnQgaW5cbiAgICAgU3RyaW5nLnN1YiBzIG5ld19zdGFydCAoc3RvcCAtIHN0YXJ0IC0gMSksIHN0b3AgKyAxXG4gICgqIFJlZ3VsYXIgaWRlbnQgKilcbiAgfCBfIC0+XG4gICAgIGxldCBzdG9wID0gYWR2YW5jZV90b19ub25fYWxwaGEgcyBzdGFydCBpblxuICAgICBpZiBzdG9wID0gc3RhcnQgdGhlbiByYWlzZSBOb3RfZm91bmQgZWxzZVxuICAgICBTdHJpbmcuc3ViIHMgc3RhcnQgKHN0b3AgLSBzdGFydCksIHN0b3BcblxuKCogU3Vic3RpdHV0ZSAkaWRlbnQsICQoaWRlbnQpLCBvciAke2lkZW50fSBpbiBzLFxuICAgIGFjY29yZGluZyB0byB0aGUgZnVuY3Rpb24gbWFwcGluZyBmLiAqKVxubGV0IGFkZF9zdWJzdGl0dXRlIGIgZiBzID1cbiAgbGV0IGxpbSA9IFN0cmluZy5sZW5ndGggcyBpblxuICBsZXQgcmVjIHN1YnN0IHByZXZpb3VzIGkgPVxuICAgIGlmIGkgPCBsaW0gdGhlbiBiZWdpblxuICAgICAgbWF0Y2ggcy5baV0gd2l0aFxuICAgICAgfCAnJCcgYXMgY3VycmVudCB3aGVuIHByZXZpb3VzID0gJ1xcXFwnIC0+XG4gICAgICAgICBhZGRfY2hhciBiIGN1cnJlbnQ7XG4gICAgICAgICBzdWJzdCAnICcgKGkgKyAxKVxuICAgICAgfCAnJCcgLT5cbiAgICAgICAgIGxldCBqID0gaSArIDEgaW5cbiAgICAgICAgIGJlZ2luIG1hdGNoIGZpbmRfaWRlbnQgcyBqIGxpbSB3aXRoXG4gICAgICAgICB8IGlkZW50LCBuZXh0X2kgLT5cbiAgICAgICAgICAgYWRkX3N0cmluZyBiIChmIGlkZW50KTtcbiAgICAgICAgICAgc3Vic3QgJyAnIG5leHRfaVxuICAgICAgICAgfCBleGNlcHRpb24gTm90X2ZvdW5kIC0+XG4gICAgICAgICAgIGFkZF9jaGFyIGIgJyQnO1xuICAgICAgICAgICBzdWJzdCAnICcgalxuICAgICAgICAgZW5kXG4gICAgICB8IGN1cnJlbnQgLT5cbiAgICAgICAgIGlmIHByZXZpb3VzID0gJ1xcXFwnIHRoZW4gYWRkX2NoYXIgYiBwcmV2aW91cztcbiAgICAgICAgIGlmIGN1cnJlbnQgPD4gJ1xcXFwnIHRoZW4gYWRkX2NoYXIgYiBjdXJyZW50O1xuICAgICAgICAgc3Vic3QgY3VycmVudCAoaSArIDEpXG4gICAgZW5kIGVsc2VcbiAgICBpZiBwcmV2aW91cyA9ICdcXFxcJyB0aGVuIGFkZF9jaGFyIGIgcHJldmlvdXMgaW5cbiAgc3Vic3QgJyAnIDBcblxubGV0IHRydW5jYXRlIGIgbGVuID1cbiAgICBpZiBsZW4gPCAwIHx8IGxlbiA+IGxlbmd0aCBiIHRoZW5cbiAgICAgIGludmFsaWRfYXJnIFwiQnVmZmVyLnRydW5jYXRlXCJcbiAgICBlbHNlXG4gICAgICBiLnBvc2l0aW9uIDwtIGxlblxuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIGIgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICAoKiBOb3RlIHRoYXQgYi5wb3NpdGlvbiBpcyBub3QgYSBjb25zdGFudCBhbmQgY2Fubm90IGJlIGxpZnRlZCBvdXQgb2YgYXV4ICopXG4gICAgaWYgaSA+PSBiLnBvc2l0aW9uIHRoZW4gU2VxLk5pbFxuICAgIGVsc2VcbiAgICAgIGxldCB4ID0gQnl0ZXMuZ2V0IGIuaW5uZXIuYnVmZmVyIGkgaW5cbiAgICAgIFNlcS5Db25zICh4LCBhdXggKGkrMSkpXG4gIGluXG4gIGF1eCAwXG5cbmxldCB0b19zZXFpIGIgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICAoKiBOb3RlIHRoYXQgYi5wb3NpdGlvbiBpcyBub3QgYSBjb25zdGFudCBhbmQgY2Fubm90IGJlIGxpZnRlZCBvdXQgb2YgYXV4ICopXG4gICAgaWYgaSA+PSBiLnBvc2l0aW9uIHRoZW4gU2VxLk5pbFxuICAgIGVsc2VcbiAgICAgIGxldCB4ID0gQnl0ZXMuZ2V0IGIuaW5uZXIuYnVmZmVyIGkgaW5cbiAgICAgIFNlcS5Db25zICgoaSx4KSwgYXV4IChpKzEpKVxuICBpblxuICBhdXggMFxuXG5sZXQgYWRkX3NlcSBiIHNlcSA9IFNlcS5pdGVyIChhZGRfY2hhciBiKSBzZXFcblxubGV0IG9mX3NlcSBpID1cbiAgbGV0IGIgPSBjcmVhdGUgMzIgaW5cbiAgYWRkX3NlcSBiIGk7XG4gIGJcblxuKCoqIHs2IEJpbmFyeSBlbmNvZGluZyBvZiBpbnRlZ2Vyc30gKilcblxuZXh0ZXJuYWwgdW5zYWZlX3NldF9pbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCIlYnl0ZXNfdW5zYWZlX3NldFwiXG5leHRlcm5hbCB1bnNhZmVfc2V0X2ludDE2IDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQxNnVcIlxuZXh0ZXJuYWwgdW5zYWZlX3NldF9pbnQzMiA6IGJ5dGVzIC0+IGludCAtPiBpbnQzMiAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQzMnVcIlxuZXh0ZXJuYWwgdW5zYWZlX3NldF9pbnQ2NCA6IGJ5dGVzIC0+IGludCAtPiBpbnQ2NCAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQ2NHVcIlxuZXh0ZXJuYWwgc2V0X2ludDggOiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXQgPSBcIiVieXRlc19zYWZlX3NldFwiXG5leHRlcm5hbCBzZXRfaW50MTYgOiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXQgPSBcIiVjYW1sX2J5dGVzX3NldDE2XCJcbmV4dGVybmFsIHNldF9pbnQzMiA6IGJ5dGVzIC0+IGludCAtPiBpbnQzMiAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQzMlwiXG5leHRlcm5hbCBzZXRfaW50NjQgOiBieXRlcyAtPiBpbnQgLT4gaW50NjQgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0NjRcIlxuXG5leHRlcm5hbCBzd2FwMTYgOiBpbnQgLT4gaW50ID0gXCIlYnN3YXAxNlwiXG5leHRlcm5hbCBzd2FwMzIgOiBpbnQzMiAtPiBpbnQzMiA9IFwiJWJzd2FwX2ludDMyXCJcbmV4dGVybmFsIHN3YXA2NCA6IGludDY0IC0+IGludDY0ID0gXCIlYnN3YXBfaW50NjRcIlxuXG5cbmxldCBhZGRfaW50OCBiIHggPVxuICBsZXQgcG9zaXRpb24gPSBiLnBvc2l0aW9uIGluXG4gIGxldCB7bGVuZ3RoOyBidWZmZXJ9ID0gYi5pbm5lciBpblxuICBsZXQgbmV3X3Bvc2l0aW9uID0gcG9zaXRpb24gKyAxIGluXG4gIGlmIG5ld19wb3NpdGlvbiA+IGxlbmd0aCB0aGVuIChcbiAgICByZXNpemUgYiAxO1xuICAgIHNldF9pbnQ4IGIuaW5uZXIuYnVmZmVyIGIucG9zaXRpb24geFxuICApIGVsc2VcbiAgICB1bnNhZmVfc2V0X2ludDggYnVmZmVyIHBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50MTZfbmUgYiB4ID1cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2xlbmd0aDsgYnVmZmVyfSA9IGIuaW5uZXIgaW5cbiAgbGV0IG5ld19wb3NpdGlvbiA9IHBvc2l0aW9uICsgMiBpblxuICBpZiBuZXdfcG9zaXRpb24gPiBsZW5ndGggdGhlbiAoXG4gICAgcmVzaXplIGIgMjtcbiAgICBzZXRfaW50MTYgYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiB4XG4gICkgZWxzZVxuICAgIHVuc2FmZV9zZXRfaW50MTYgYnVmZmVyIHBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50MzJfbmUgYiB4ID1cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2xlbmd0aDsgYnVmZmVyfSA9IGIuaW5uZXIgaW5cbiAgbGV0IG5ld19wb3NpdGlvbiA9IHBvc2l0aW9uICsgNCBpblxuICBpZiBuZXdfcG9zaXRpb24gPiBsZW5ndGggdGhlbiAoXG4gICAgcmVzaXplIGIgNDtcbiAgICBzZXRfaW50MzIgYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiB4XG4gICkgZWxzZVxuICAgIHVuc2FmZV9zZXRfaW50MzIgYnVmZmVyIHBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50NjRfbmUgYiB4ID1cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2xlbmd0aDsgYnVmZmVyfSA9IGIuaW5uZXIgaW5cbiAgbGV0IG5ld19wb3NpdGlvbiA9IHBvc2l0aW9uICsgOCBpblxuICBpZiBuZXdfcG9zaXRpb24gPiBsZW5ndGggdGhlbiAoXG4gICAgcmVzaXplIGIgODtcbiAgICBzZXRfaW50NjQgYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiB4XG4gICkgZWxzZVxuICAgIHVuc2FmZV9zZXRfaW50NjQgYnVmZmVyIHBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50MTZfbGUgYiB4ID1cbiAgYWRkX2ludDE2X25lIGIgKGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDE2IHggZWxzZSB4KVxuXG5sZXQgYWRkX2ludDE2X2JlIGIgeCA9XG4gIGFkZF9pbnQxNl9uZSBiIChpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHggZWxzZSBzd2FwMTYgeClcblxubGV0IGFkZF9pbnQzMl9sZSBiIHggPVxuICBhZGRfaW50MzJfbmUgYiAoaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzd2FwMzIgeCBlbHNlIHgpXG5cbmxldCBhZGRfaW50MzJfYmUgYiB4ID1cbiAgYWRkX2ludDMyX25lIGIgKGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4geCBlbHNlIHN3YXAzMiB4KVxuXG5sZXQgYWRkX2ludDY0X2xlIGIgeCA9XG4gIGFkZF9pbnQ2NF9uZSBiIChpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXA2NCB4IGVsc2UgeClcblxubGV0IGFkZF9pbnQ2NF9iZSBiIHggPVxuICBhZGRfaW50NjRfbmUgYiAoaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiB4IGVsc2Ugc3dhcDY0IHgpXG5cbmxldCBhZGRfdWludDggPSBhZGRfaW50OFxubGV0IGFkZF91aW50MTZfbmUgPSBhZGRfaW50MTZfbmVcbmxldCBhZGRfdWludDE2X2xlID0gYWRkX2ludDE2X2xlXG5sZXQgYWRkX3VpbnQxNl9iZSA9IGFkZF9pbnQxNl9iZVxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2JsaXRfc3RyaW5nIiwiY2FtbF9ic3dhcDE2IiwiY2FtbF9ieXRlc19nZXQiLCJjYW1sX2J5dGVzX3NldCIsImNhbWxfYnl0ZXNfc2V0MTYiLCJjYW1sX2J5dGVzX3NldDMyIiwiY2FtbF9ieXRlc19zZXQ2NCIsImNhbWxfYnl0ZXNfdW5zYWZlX3NldCIsImNhbWxfY3JlYXRlX2J5dGVzIiwiY2FtbF9pbnQzMl9ic3dhcCIsImNhbWxfaW50NjRfYnN3YXAiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX21sX2J5dGVzX2xlbmd0aCIsImNhbWxfbWxfc3RyaW5nX2xlbmd0aCIsImNhbWxfc3RyaW5nX2dldCIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfQnl0ZXMiLCJTdGRsaWJfU3lzIiwiU3RkbGliX1NlcSIsIlN0ZGxpYiIsIlN0ZGxpYl9TdHJpbmciLCJBc3NlcnRfZmFpbHVyZSIsImR1bW15IiwiY3JlYXRlIiwibiIsInMiLCJjb250ZW50cyIsImIiLCJ0b19ieXRlcyIsInN1YiIsIm9mcyIsImxlbiIsImJsaXQiLCJzcmMiLCJzcmNvZmYiLCJkc3QiLCJkc3RvZmYiLCJudGgiLCJwb3NpdGlvbiIsIm1hdGNoIiwibGVuZ3RoIiwiYnVmZmVyIiwiY2xlYXIiLCJyZXNldCIsImlubmVyIiwicmVzaXplIiwibW9yZSIsIm9sZF9wb3MiLCJvbGRfbGVuIiwibmV3X2xlbiIsIm5ld19idWZmZXIiLCJhZGRfY2hhciIsImMiLCJwb3MiLCJhZGRfdXRmXzhfdWNoYXIiLCJ1IiwidWNoYXJfdXRmXzhfYnl0ZV9sZW5ndGhfbWF4IiwidWNoYXJfdXRmXzE2X2J5dGVfbGVuZ3RoX21heCIsImFkZF91dGZfMTZiZV91Y2hhciIsImFkZF91dGZfMTZsZV91Y2hhciIsImFkZF9zdWJzdHJpbmciLCJvZmZzZXQiLCJuZXdfcG9zaXRpb24iLCJhZGRfc3ViYnl0ZXMiLCJhZGRfc3RyaW5nIiwiYWRkX2J5dGVzIiwiYWRkX2J1ZmZlciIsImJzIiwiYWRkX2NoYW5uZWwiLCJpYyIsInRvX3JlYWQiLCJidWYiLCJhbHJlYWR5X3JlYWQiLCJyIiwib3V0cHV0X2J1ZmZlciIsIm9jIiwiYWRkX3N1YnN0aXR1dGUiLCJsaW0iLCJwcmV2aW91cyIsImkiLCJzdGFydCIsIm9wZW5pbmciLCJzdG9wIiwidmFsIiwibmV3X3N0YXJ0IiwiY2xvc2luZyIsImsiLCJleG4iLCJuZXh0X2kiLCJpZGVudCIsInRydW5jYXRlIiwidG9fc2VxIiwiYXV4IiwicGFyYW0iLCJ4IiwidG9fc2VxaSIsImFkZF9zZXEiLCJzZXEiLCJvZl9zZXEiLCJhZGRfaW50OCIsImFkZF9pbnQxNl9uZSIsImFkZF9pbnQzMl9uZSIsImFkZF9pbnQ2NF9uZSIsImFkZF9pbnQxNl9sZSIsImFkZF9pbnQxNl9iZSIsImFkZF9pbnQzMl9sZSIsImFkZF9pbnQzMl9iZSIsImFkZF9pbnQ2NF9sZSIsImFkZF9pbnQ2NF9iZSJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLHVCQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxhQUFBO0FBQUEsSUFBQUMsYUFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFD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IjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvbXV0ZXgubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgWGF2aWVyIExlcm95IGFuZCBQYXNjYWwgQ3VvcSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk1IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgdFxuZXh0ZXJuYWwgY3JlYXRlOiB1bml0IC0+IHQgPSBcImNhbWxfbWxfbXV0ZXhfbmV3XCJcbmV4dGVybmFsIGxvY2s6IHQgLT4gdW5pdCA9IFwiY2FtbF9tbF9tdXRleF9sb2NrXCJcbmV4dGVybmFsIHRyeV9sb2NrOiB0IC0+IGJvb2wgPSBcImNhbWxfbWxfbXV0ZXhfdHJ5X2xvY2tcIlxuZXh0ZXJuYWwgdW5sb2NrOiB0IC0+IHVuaXQgPSBcImNhbWxfbWxfbXV0ZXhfdW5sb2NrXCJcblxuKCogcHJpdmF0ZSByZS1leHBvcnQgKilcbmV4dGVybmFsIHJlcmFpc2UgOiBleG4gLT4gJ2EgPSBcIiVyZXJhaXNlXCJcblxuKCogY2Fubm90IGlubGluZSwgb3RoZXJ3aXNlIGZsYW1iZGEgbWlnaHQgbW92ZSBjb2RlIGFyb3VuZC4gKilcbmxldFtAaW5saW5lIG5ldmVyXSBwcm90ZWN0IG0gZiA9XG4gIGxvY2sgbTtcbiAgbWF0Y2ggZigpIHdpdGhcbiAgfCB4IC0+XG4gICAgdW5sb2NrIG07IHhcbiAgfCBleGNlcHRpb24gZSAtPlxuICAgICgqIE5PVEU6IFt1bmxvY2tdIGRvZXMgbm90IHBvbGwgZm9yIGFzeW5jaHJvbm91cyBleGNlcHRpb25zICopXG4gICAgdW5sb2NrIG07XG4gICAgcmVyYWlzZSBlXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfbWxfbXV0ZXhfbG9jayIsImNhbWxfbWxfbXV0ZXhfdW5sb2NrIiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJwcm90ZWN0IiwibSIsIngiLCJlIiwiU3RkbGliX011dGV4Il0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMscUJBQUE7QUFBQSxJQUFBQyx1QkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFFBQUFDLEdBQUFIO0FBQUFBLElDMEJFO0FBQUEsSUFBTSxRQUFBSSxJQUNBO0FBQUEsVUFBQUM7QUFBQUEsU0FBQUEsSUQzQlI7QUFBQSxLQ2dDSTtBQUFBLEtBQVE7QUFBQTtBQUFBLElBSFI7QUFBQSxJQUFRO0FBQUEsR0FJQztBQUFBO0FBQUEsSUFBQUM7QUFBQUEsTURqQ2IiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoxNjgxNywiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSJdLCJuYW1lcyI6WyJydW50aW1lIiwiU3RkbGliX0NvbmRpdGlvbiJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQztBQUFBQSxNQUFBIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTY4MzUsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvZG9tYWluLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICBLQyBTaXZhcmFtYWtyaXNobmFuLCBJbmRpYW4gSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIE1hZHJhcyAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgIFN0ZXBoZW4gRG9sYW4sIFVuaXZlcnNpdHkgb2YgQ2FtYnJpZGdlICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgVG9tIEtlbGx5LCBPQ2FtbCBMYWJzIENvbnN1bHRhbmN5ICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxOSBJbmRpYW4gSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIE1hZHJhcyAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAyMSBPQ2FtbCBMYWJzIENvbnN1bHRhbmN5IEx0ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5tb2R1bGUgUmF3ID0gc3RydWN0XG4gICgqIExvdy1sZXZlbCBwcmltaXRpdmVzIHByb3ZpZGVkIGJ5IHRoZSBydW50aW1lICopXG4gIHR5cGUgdCA9IHByaXZhdGUgaW50XG5cbiAgKCogVGhlIGxheW91dHMgb2YgW3N0YXRlXSBhbmQgW3Rlcm1fc3luY10gYXJlIGhhcmQtY29kZWQgaW5cbiAgICAgW3J1bnRpbWUvZG9tYWluLmNdICopXG5cbiAgdHlwZSAnYSBzdGF0ZSA9XG4gICAgfCBSdW5uaW5nXG4gICAgfCBGaW5pc2hlZCBvZiAoJ2EsIGV4bikgcmVzdWx0IFtAd2FybmluZyBcIi11bnVzZWQtY29uc3RydWN0b3JcIl1cblxuICB0eXBlICdhIHRlcm1fc3luYyA9IHtcbiAgICAoKiBwcm90ZWN0ZWQgYnkgW211dF0gKilcbiAgICBtdXRhYmxlIHN0YXRlIDogJ2Egc3RhdGUgW0B3YXJuaW5nIFwiLXVudXNlZC1maWVsZFwiXSA7XG4gICAgbXV0IDogTXV0ZXgudCA7XG4gICAgY29uZCA6IENvbmRpdGlvbi50IDtcbiAgfVxuXG4gIGV4dGVybmFsIHNwYXduIDogKHVuaXQgLT4gJ2EpIC0+ICdhIHRlcm1fc3luYyAtPiB0XG4gICAgPSBcImNhbWxfZG9tYWluX3NwYXduXCJcbiAgZXh0ZXJuYWwgc2VsZiA6IHVuaXQgLT4gdFxuICAgID0gXCJjYW1sX21sX2RvbWFpbl9pZFwiIFtAQG5vYWxsb2NdXG4gIGV4dGVybmFsIGNwdV9yZWxheCA6IHVuaXQgLT4gdW5pdFxuICAgID0gXCJjYW1sX21sX2RvbWFpbl9jcHVfcmVsYXhcIlxuICBleHRlcm5hbCBnZXRfcmVjb21tZW5kZWRfZG9tYWluX2NvdW50OiB1bml0IC0+IGludFxuICAgID0gXCJjYW1sX3JlY29tbWVuZGVkX2RvbWFpbl9jb3VudFwiIFtAQG5vYWxsb2NdXG5lbmRcblxubGV0IGNwdV9yZWxheCAoKSA9IFJhdy5jcHVfcmVsYXggKClcblxudHlwZSBpZCA9IFJhdy50XG5cbnR5cGUgJ2EgdCA9IHtcbiAgZG9tYWluIDogUmF3LnQ7XG4gIHRlcm1fc3luYyA6ICdhIFJhdy50ZXJtX3N5bmM7XG59XG5cbm1vZHVsZSBETFMgPSBzdHJ1Y3RcblxuICBtb2R1bGUgT2JqX29wdCA6IHNpZ1xuICAgIHR5cGUgdFxuICAgIHZhbCBub25lIDogdFxuICAgIHZhbCBzb21lIDogJ2EgLT4gdFxuICAgIHZhbCBpc19zb21lIDogdCAtPiBib29sXG5cbiAgICAoKiogW3Vuc2FmZV9nZXQgb2JqXSBtYXkgb25seSBiZSBjYWxsZWQgc2FmZWx5XG4gICAgICAgIGlmIFtpc19zb21lXSBpcyB0cnVlLlxuXG4gICAgICAgIFt1bnNhZmVfZ2V0IChzb21lIHYpXSBpcyBlcXVpdmFsZW50IHRvXG4gICAgICAgIFtPYmoub2JqIChPYmoucmVwciB2KV0uICopXG4gICAgdmFsIHVuc2FmZV9nZXQgOiB0IC0+ICdhXG4gIGVuZCA9IHN0cnVjdFxuICAgIHR5cGUgdCA9IE9iai50XG4gICAgbGV0IG5vbmUgPSBPYmoucmVwciAocmVmIDApXG4gICAgbGV0IHNvbWUgdiA9IE9iai5yZXByIHZcbiAgICBsZXQgaXNfc29tZSBvYmogPSAob2JqICE9IG5vbmUpXG4gICAgbGV0IHVuc2FmZV9nZXQgb2JqID0gT2JqLm9iaiBvYmpcbiAgZW5kXG5cbiAgdHlwZSBkbHNfc3RhdGUgPSBPYmpfb3B0LnQgYXJyYXlcblxuICBleHRlcm5hbCBnZXRfZGxzX3N0YXRlIDogdW5pdCAtPiBkbHNfc3RhdGUgPSBcIiVkbHNfZ2V0XCJcblxuICBleHRlcm5hbCBzZXRfZGxzX3N0YXRlIDogZGxzX3N0YXRlIC0+IHVuaXQgPVxuICAgIFwiY2FtbF9kb21haW5fZGxzX3NldFwiIFtAQG5vYWxsb2NdXG5cbiAgZXh0ZXJuYWwgY29tcGFyZV9hbmRfc2V0X2Rsc19zdGF0ZSA6IGRsc19zdGF0ZSAtPiBkbHNfc3RhdGUgLT4gYm9vbCA9XG4gICAgXCJjYW1sX2RvbWFpbl9kbHNfY29tcGFyZV9hbmRfc2V0XCIgW0BAbm9hbGxvY11cblxuICBsZXQgY3JlYXRlX2RscyAoKSA9XG4gICAgbGV0IHN0ID0gQXJyYXkubWFrZSA4IE9ial9vcHQubm9uZSBpblxuICAgIHNldF9kbHNfc3RhdGUgc3RcblxuICBsZXQgXyA9IGNyZWF0ZV9kbHMgKClcblxuICB0eXBlICdhIGtleSA9IGludCAqICh1bml0IC0+ICdhKVxuXG4gIGxldCBrZXlfY291bnRlciA9IEF0b21pYy5tYWtlIDBcblxuICB0eXBlIGtleV9pbml0aWFsaXplciA9XG4gICAgS0k6ICdhIGtleSAqICgnYSAtPiAnYSkgLT4ga2V5X2luaXRpYWxpemVyXG5cbiAgbGV0IHBhcmVudF9rZXlzID0gQXRvbWljLm1ha2UgKFtdIDoga2V5X2luaXRpYWxpemVyIGxpc3QpXG5cbiAgbGV0IHJlYyBhZGRfcGFyZW50X2tleSBraSA9XG4gICAgbGV0IGwgPSBBdG9taWMuZ2V0IHBhcmVudF9rZXlzIGluXG4gICAgaWYgbm90IChBdG9taWMuY29tcGFyZV9hbmRfc2V0IHBhcmVudF9rZXlzIGwgKGtpIDo6IGwpKVxuICAgIHRoZW4gYWRkX3BhcmVudF9rZXkga2lcblxuICBsZXQgbmV3X2tleSA/c3BsaXRfZnJvbV9wYXJlbnQgaW5pdF9vcnBoYW4gPVxuICAgIGxldCBpZHggPSBBdG9taWMuZmV0Y2hfYW5kX2FkZCBrZXlfY291bnRlciAxIGluXG4gICAgbGV0IGsgPSAoaWR4LCBpbml0X29ycGhhbikgaW5cbiAgICBiZWdpbiBtYXRjaCBzcGxpdF9mcm9tX3BhcmVudCB3aXRoXG4gICAgfCBOb25lIC0+ICgpXG4gICAgfCBTb21lIHNwbGl0IC0+IGFkZF9wYXJlbnRfa2V5IChLSShrLCBzcGxpdCkpXG4gICAgZW5kO1xuICAgIGtcblxuICAoKiBJZiBuZWNlc3NhcnksIGdyb3cgdGhlIGN1cnJlbnQgZG9tYWluJ3MgbG9jYWwgc3RhdGUgYXJyYXkgc3VjaCB0aGF0IFtpZHhdXG4gICAqIGlzIGEgdmFsaWQgaW5kZXggaW4gdGhlIGFycmF5LiAqKVxuICBsZXQgcmVjIG1heWJlX2dyb3cgaWR4ID1cbiAgICBsZXQgc3QgPSBnZXRfZGxzX3N0YXRlICgpIGluXG4gICAgbGV0IHN6ID0gQXJyYXkubGVuZ3RoIHN0IGluXG4gICAgaWYgaWR4IDwgc3ogdGhlbiBzdFxuICAgIGVsc2UgYmVnaW5cbiAgICAgIGxldCByZWMgY29tcHV0ZV9uZXdfc2l6ZSBzID1cbiAgICAgICAgaWYgaWR4IDwgcyB0aGVuIHMgZWxzZSBjb21wdXRlX25ld19zaXplICgyICogcylcbiAgICAgIGluXG4gICAgICBsZXQgbmV3X3N6ID0gY29tcHV0ZV9uZXdfc2l6ZSBzeiBpblxuICAgICAgbGV0IG5ld19zdCA9IEFycmF5Lm1ha2UgbmV3X3N6IE9ial9vcHQubm9uZSBpblxuICAgICAgQXJyYXkuYmxpdCBzdCAwIG5ld19zdCAwIHN6O1xuICAgICAgKCogV2Ugd2FudCBhIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc2FmZSB3aXRoIHJlc3BlY3QgdG9cbiAgICAgICAgIHNpbmdsZS1kb21haW4gbXVsdGktdGhyZWFkaW5nOiByZXRyeSBpZiB0aGUgRExTIHN0YXRlIGhhc1xuICAgICAgICAgY2hhbmdlZCB1bmRlciBvdXIgZmVldC5cbiAgICAgICAgIE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIHJldHJpZXMgd2lsbCBiZSB2ZXJ5IHNtYWxsIGluXG4gICAgICAgICBjb250ZW5kZWQgc2NlbmFyaW9zLCBhcyB0aGUgYXJyYXkgb25seSBncm93cywgd2l0aFxuICAgICAgICAgZXhwb25lbnRpYWwgcmVzaXppbmcuICopXG4gICAgICBpZiBjb21wYXJlX2FuZF9zZXRfZGxzX3N0YXRlIHN0IG5ld19zdFxuICAgICAgdGhlbiBuZXdfc3RcbiAgICAgIGVsc2UgbWF5YmVfZ3JvdyBpZHhcbiAgICBlbmRcblxuICBsZXQgc2V0ICh0eXBlIGEpIChpZHgsIF9pbml0KSAoeCA6IGEpID1cbiAgICBsZXQgc3QgPSBtYXliZV9ncm93IGlkeCBpblxuICAgICgqIFtTeXMub3BhcXVlX2lkZW50aXR5XSBlbnN1cmVzIHRoYXQgZmxhbWJkYSBkb2VzIG5vdCBsb29rIGF0IHRoZSB0eXBlIG9mXG4gICAgICogW3hdLCB3aGljaCBtYXkgYmUgYSBbZmxvYXRdIGFuZCBjb25jbHVkZSB0aGF0IHRoZSBbc3RdIGlzIGEgZmxvYXQgYXJyYXkuXG4gICAgICogV2UgZG8gbm90IHdhbnQgT0NhbWwncyBmbG9hdCBhcnJheSBvcHRpbWlzYXRpb24ga2lja2luZyBpbiBoZXJlLiAqKVxuICAgIHN0LihpZHgpIDwtIE9ial9vcHQuc29tZSAoU3lzLm9wYXF1ZV9pZGVudGl0eSB4KVxuXG5cbiAgbGV0W0BpbmxpbmUgbmV2ZXJdIGFycmF5X2NvbXBhcmVfYW5kX3NldCBhIGkgb2xkdmFsIG5ld3ZhbCA9XG4gICAgKCogTm90ZTogd2UgY2Fubm90IHVzZSBbQHBvbGwgZXJyb3JdIGR1ZSB0byB0aGVcbiAgICAgICBhbGxvY2F0aW9ucyBvbiBhLihpKSBpbiB0aGUgRG91YmxlX2FycmF5IGNhc2UuICopXG4gICAgbGV0IGN1cnZhbCA9IGEuKGkpIGluXG4gICAgaWYgY3VydmFsID09IG9sZHZhbCB0aGVuIChcbiAgICAgIEFycmF5LnVuc2FmZV9zZXQgYSBpIG5ld3ZhbDtcbiAgICAgIHRydWVcbiAgICApIGVsc2UgZmFsc2VcblxuICBsZXQgZ2V0ICh0eXBlIGEpICgoaWR4LCBpbml0KSA6IGEga2V5KSA6IGEgPVxuICAgIGxldCBzdCA9IG1heWJlX2dyb3cgaWR4IGluXG4gICAgbGV0IG9iaiA9IHN0LihpZHgpIGluXG4gICAgaWYgT2JqX29wdC5pc19zb21lIG9ialxuICAgIHRoZW4gKE9ial9vcHQudW5zYWZlX2dldCBvYmogOiBhKVxuICAgIGVsc2UgYmVnaW5cbiAgICAgIGxldCB2IDogYSA9IGluaXQgKCkgaW5cbiAgICAgIGxldCBuZXdfb2JqID0gT2JqX29wdC5zb21lIChTeXMub3BhcXVlX2lkZW50aXR5IHYpIGluXG4gICAgICAoKiBBdCB0aGlzIHBvaW50LCBbc3RdIG9yIFtzdC4oaWR4KV0gbWF5IGhhdmUgYmVlbiBjaGFuZ2VkXG4gICAgICAgICBieSBhbm90aGVyIHRocmVhZCBvbiB0aGUgc2FtZSBkb21haW4uXG5cbiAgICAgICAgIElmIFtzdF0gY2hhbmdlZCwgaXQgd2FzIHJlc2l6ZWQgaW50byBhIGxhcmdlciB2YWx1ZSxcbiAgICAgICAgIHdlIGNhbiBqdXN0IHJldXNlIHRoZSBuZXcgdmFsdWUuXG5cbiAgICAgICAgIElmIFtzdC4oaWR4KV0gY2hhbmdlZCwgd2UgZHJvcCB0aGUgY3VycmVudCB2YWx1ZSB0byBhdm9pZFxuICAgICAgICAgbGV0dGluZyBvdGhlciB0aHJlYWRzIG9ic2VydmUgYSAncmV2ZXJ0JyB0aGF0IGZvcmdldHNcbiAgICAgICAgIHByZXZpb3VzIG1vZGlmaWNhdGlvbnMuICopXG4gICAgICBsZXQgc3QgPSBnZXRfZGxzX3N0YXRlICgpIGluXG4gICAgICBpZiBhcnJheV9jb21wYXJlX2FuZF9zZXQgc3QgaWR4IG9iaiBuZXdfb2JqXG4gICAgICB0aGVuIHZcbiAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgKCogaWYgc3QuKGlkeCkgY2hhbmdlZCwgc29tZW9uZSBtdXN0IGhhdmUgaW5pdGlhbGl6ZWRcbiAgICAgICAgICAgdGhlIGtleSBpbiB0aGUgbWVhbnRpbWUuICopXG4gICAgICAgIGxldCB1cGRhdGVkX29iaiA9IHN0LihpZHgpIGluXG4gICAgICAgIGlmIE9ial9vcHQuaXNfc29tZSB1cGRhdGVkX29ialxuICAgICAgICB0aGVuIChPYmpfb3B0LnVuc2FmZV9nZXQgdXBkYXRlZF9vYmogOiBhKVxuICAgICAgICBlbHNlIGFzc2VydCBmYWxzZVxuICAgICAgZW5kXG4gICAgZW5kXG5cbiAgdHlwZSBrZXlfdmFsdWUgPSBLViA6ICdhIGtleSAqICdhIC0+IGtleV92YWx1ZVxuXG4gIGxldCBnZXRfaW5pdGlhbF9rZXlzICgpIDoga2V5X3ZhbHVlIGxpc3QgPVxuICAgIExpc3QubWFwXG4gICAgICAoZnVuIChLSSAoaywgc3BsaXQpKSAtPiBLViAoaywgKHNwbGl0IChnZXQgaykpKSlcbiAgICAgIChBdG9taWMuZ2V0IHBhcmVudF9rZXlzKVxuXG4gIGxldCBzZXRfaW5pdGlhbF9rZXlzIChsOiBrZXlfdmFsdWUgbGlzdCkgPVxuICAgIExpc3QuaXRlciAoZnVuIChLViAoaywgdikpIC0+IHNldCBrIHYpIGxcbmVuZFxuXG4oKioqKioqKiogSWRlbnRpdHkgKioqKioqKioqKilcblxubGV0IGdldF9pZCB7IGRvbWFpbjsgXyB9ID0gZG9tYWluXG5cbmxldCBzZWxmICgpID0gUmF3LnNlbGYgKClcblxubGV0IGlzX21haW5fZG9tYWluICgpID0gKHNlbGYgKCkgOj4gaW50KSA9IDBcblxuKCoqKioqKioqIENhbGxiYWNrcyAqKioqKioqKioqKVxuXG4oKiBmaXJzdCBzcGF3biwgZG9tYWluIHN0YXJ0dXAgYW5kIGF0IGV4aXQgZnVuY3Rpb25hbGl0eSAqKVxubGV0IGZpcnN0X2RvbWFpbl9zcGF3bmVkID0gQXRvbWljLm1ha2UgZmFsc2VcblxubGV0IGZpcnN0X3NwYXduX2Z1bmN0aW9uID0gcmVmIChmdW4gKCkgLT4gKCkpXG5cbmxldCBiZWZvcmVfZmlyc3Rfc3Bhd24gZiA9XG4gIGlmIEF0b21pYy5nZXQgZmlyc3RfZG9tYWluX3NwYXduZWQgdGhlblxuICAgIHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IFwiZmlyc3QgZG9tYWluIGFscmVhZHkgc3Bhd25lZFwiKVxuICBlbHNlIGJlZ2luXG4gICAgbGV0IG9sZF9mID0gIWZpcnN0X3NwYXduX2Z1bmN0aW9uIGluXG4gICAgbGV0IG5ld19mICgpID0gb2xkX2YgKCk7IGYgKCkgaW5cbiAgICBmaXJzdF9zcGF3bl9mdW5jdGlvbiA6PSBuZXdfZlxuICBlbmRcblxubGV0IGRvX2JlZm9yZV9maXJzdF9zcGF3biAoKSA9XG4gIGlmIG5vdCAoQXRvbWljLmdldCBmaXJzdF9kb21haW5fc3Bhd25lZCkgdGhlbiBiZWdpblxuICAgIEF0b21pYy5zZXQgZmlyc3RfZG9tYWluX3NwYXduZWQgdHJ1ZTtcbiAgICAhZmlyc3Rfc3Bhd25fZnVuY3Rpb24oKTtcbiAgICAoKiBSZWxlYXNlIHRoZSBvbGQgZnVuY3Rpb24gKilcbiAgICBmaXJzdF9zcGF3bl9mdW5jdGlvbiA6PSAoZnVuICgpIC0+ICgpKVxuICBlbmRcblxubGV0IGF0X2V4aXRfa2V5ID0gRExTLm5ld19rZXkgKGZ1biAoKSAtPiAoZnVuICgpIC0+ICgpKSlcblxubGV0IGF0X2V4aXQgZiA9XG4gIGxldCBvbGRfZXhpdCA6IHVuaXQgLT4gdW5pdCA9IERMUy5nZXQgYXRfZXhpdF9rZXkgaW5cbiAgbGV0IG5ld19leGl0ICgpID1cbiAgICBmICgpOyBvbGRfZXhpdCAoKVxuICBpblxuICBETFMuc2V0IGF0X2V4aXRfa2V5IG5ld19leGl0XG5cbmxldCBkb19hdF9leGl0ICgpID1cbiAgbGV0IGYgOiB1bml0IC0+IHVuaXQgPSBETFMuZ2V0IGF0X2V4aXRfa2V5IGluXG4gIGYgKClcblxubGV0IF8gPSBTdGRsaWIuZG9fZG9tYWluX2xvY2FsX2F0X2V4aXQgOj0gZG9fYXRfZXhpdFxuXG4oKioqKioqKiBDcmVhdGlvbiBhbmQgVGVybWluYXRpb24gKioqKioqKiopXG5cbmxldCBzcGF3biBmID1cbiAgZG9fYmVmb3JlX2ZpcnN0X3NwYXduICgpO1xuICBsZXQgcGsgPSBETFMuZ2V0X2luaXRpYWxfa2V5cyAoKSBpblxuXG4gICgqIFt0ZXJtX3N5bmNdIGlzIHVzZWQgdG8gc3luY2hyb25pemUgd2l0aCB0aGUgam9pbmluZyBkb21haW5zICopXG4gIGxldCB0ZXJtX3N5bmMgPVxuICAgIFJhdy57IHN0YXRlID0gUnVubmluZyA7XG4gICAgICAgICAgbXV0ID0gTXV0ZXguY3JlYXRlICgpIDtcbiAgICAgICAgICBjb25kID0gQ29uZGl0aW9uLmNyZWF0ZSAoKSB9XG4gIGluXG5cbiAgbGV0IGJvZHkgKCkgPVxuICAgIG1hdGNoXG4gICAgICBETFMuY3JlYXRlX2RscyAoKTtcbiAgICAgIERMUy5zZXRfaW5pdGlhbF9rZXlzIHBrO1xuICAgICAgbGV0IHJlcyA9IGYgKCkgaW5cbiAgICAgIHJlc1xuICAgIHdpdGhcbiAgICAoKiBSdW4gdGhlIFthdF9leGl0XSBjYWxsYmFja3Mgd2hlbiB0aGUgZG9tYWluIGNvbXB1dGF0aW9uIGVpdGhlclxuICAgICAgIHRlcm1pbmF0ZXMgbm9ybWFsbHkgb3IgZXhjZXB0aW9uYWxseS4gKilcbiAgICB8IHJlcyAtPlxuICAgICAgICAoKiBJZiB0aGUgZG9tYWluIGNvbXB1dGF0aW9uIHRlcm1pbmF0ZWQgbm9ybWFsbHksIGJ1dCB0aGVcbiAgICAgICAgICAgW2F0X2V4aXRdIGNhbGxiYWNrcyByYWlzZWQgYW4gZXhjZXB0aW9uLCB0aGVuIHJldHVybiB0aGVcbiAgICAgICAgICAgZXhjZXB0aW9uLiAqKVxuICAgICAgICBkb19hdF9leGl0ICgpO1xuICAgICAgICByZXNcbiAgICB8IGV4Y2VwdGlvbiBleG4gLT5cbiAgICAgICAgKCogSWYgYm90aCB0aGUgZG9tYWluIGNvbXB1dGF0aW9uIGFuZCB0aGUgW2F0X2V4aXRdIGNhbGxiYWNrc1xuICAgICAgICAgICByYWlzZSBleGNlcHRpb25zLCB0aGVuIGlnbm9yZSB0aGUgZXhjZXB0aW9uIGZyb20gdGhlXG4gICAgICAgICAgIFthdF9leGl0XSBjYWxsYmFja3MgYW5kIHJldHVybiB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uLiAqKVxuICAgICAgICAodHJ5IGRvX2F0X2V4aXQgKCkgd2l0aCBfIC0+ICgpKTtcbiAgICAgICAgcmFpc2UgZXhuXG4gIGluXG4gIGxldCBkb21haW4gPSBSYXcuc3Bhd24gYm9keSB0ZXJtX3N5bmMgaW5cbiAgeyBkb21haW4gOyB0ZXJtX3N5bmMgfVxuXG5sZXQgam9pbiB7IHRlcm1fc3luYyA7IF8gfSA9XG4gIGxldCBvcGVuIFJhdyBpblxuICBsZXQgcmVjIGxvb3AgKCkgPVxuICAgIG1hdGNoIHRlcm1fc3luYy5zdGF0ZSB3aXRoXG4gICAgfCBSdW5uaW5nIC0+XG4gICAgICAgIENvbmRpdGlvbi53YWl0IHRlcm1fc3luYy5jb25kIHRlcm1fc3luYy5tdXQ7XG4gICAgICAgIGxvb3AgKClcbiAgICB8IEZpbmlzaGVkIHJlcyAtPlxuICAgICAgICByZXNcbiAgaW5cbiAgbWF0Y2ggTXV0ZXgucHJvdGVjdCB0ZXJtX3N5bmMubXV0IGxvb3Agd2l0aFxuICB8IE9rIHggLT4geFxuICB8IEVycm9yIGV4IC0+IHJhaXNlIGV4XG5cbmxldCByZWNvbW1lbmRlZF9kb21haW5fY291bnQgPSBSYXcuZ2V0X3JlY29tbWVuZGVkX2RvbWFpbl9jb3VudFxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2NoZWNrX2JvdW5kIiwiY2FtbF9kb21haW5fZGxzX2dldCIsImNhbWxfbWFrZV92ZWN0IiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9tbF9kb21haW5faWQiLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImR1bW15IiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfQ29uZGl0aW9uIiwiU3RkbGliX011dGV4IiwiU3RkbGliX0F0b21pYyIsIlN0ZGxpYiIsIlN0ZGxpYl9BcnJheSIsIlN0ZGxpYl9MaXN0IiwiQXNzZXJ0X2ZhaWx1cmUiLCJjcHVfcmVsYXgiLCJwYXJhbSIsIm5vbmUiLCJjcmVhdGVfZGxzIiwic3QiLCJrZXlfY291bnRlciIsInBhcmVudF9rZXlzIiwibmV3X2tleSIsInNwbGl0X2Zyb21fcGFyZW50IiwiaW5pdF9vcnBoYW4iLCJpZHgiLCJrIiwic3BsaXQiLCJraSIsImwiLCJtYXliZV9ncm93Iiwic3oiLCJuZXdfc3oiLCJuZXdfc3QiLCJzIiwic2V0IiwieCIsImdldCIsImluaXQiLCJvbGR2YWwiLCJuZXdfb2JqIiwiY3VydmFsIiwidXBkYXRlZF9vYmoiLCJzZXRfaW5pdGlhbF9rZXlzIiwidiIsImdldF9pZCIsImRvbWFpbiIsInNlbGYiLCJpc19tYWluX2RvbWFpbiIsImZpcnN0X2RvbWFpbl9zcGF3bmVkIiwiZmlyc3Rfc3Bhd25fZnVuY3Rpb24iLCJiZWZvcmVfZmlyc3Rfc3Bhd24iLCJvbGRfZiIsIm5ld19mIiwiYXRfZXhpdF9rZXkiLCJhdF9leGl0Iiwib2xkX2V4aXQiLCJuZXdfZXhpdCIsImRvX2F0X2V4aXQiLCJzcGF3biIsInBrIiwidGVybV9zeW5jIiwiYm9keSIsInJlcyIsImV4biIsImpvaW4iLCJsb29wIiwibWF0Y2giLCJleCIsInJlY29tbWVuZGVkX2RvbWFpbl9jb3VudCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLG9CQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxRQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsU0FBQTtB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bUMsWUFERDtBQUFBLGFBQUFDLEtBQUE5QztBQUFBQSxLQUtaLElBQ0UsZUFDQSwwQkFBQStDLE1BQ1U7QUFBQSxXQUFBQztBQUFBQSxVQUFBQSxNRHRRaEI7QUFBQSxVQ3FSYSxxQkFBQUE7QUFBQUEsTUFDTDtBQUFBO0FBQUEsS0FQQTtBQUFBLEtBQWE7QUFBQSxJQU9KO0FBQUEsUUFBQWxCLFNBRUY7QUFBQSxJQUNiO0FBQUEsR0FBc0I7QUFBQSxZQUFBbUIsS0FBQWpEO0FBQUFBLFFBQUE2QyxZQUVmO0FBQUEsYUFBQUssS0FBQWxEO0FBQUFBLEtBR0w7QUFBQSxVQUFBbUQsUUFBQTtBQUFBLG9CQUFBSixNQUFBLFVBS0k7QUFBQSxNQUhBO0FBQUE7QUFBQSxJQUdHO0FBQUEsUUFBQUksUUFFSDtBQUFBLElBQWdDLHVCQUFBL0IsSUFBQSxVQUM1QjtBQUFBLFFBQUFnQyxLQUQ0QjtBQUFBO0FBQUEsR0FFaEI7QUFBQSxPQUFBQywyQkFqRWdDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUR0T3hEIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTcwMzEsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvY2FtbGludGVybmFsRm9ybWF0Lm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgIEJlbm9pdCBWYXVnb24sIEVOU1RBICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5vcGVuIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljc1xuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAoKiBUb29scyB0byBtYW5pcHVsYXRlIHNjYW5uaW5nIHNldCBvZiBjaGFycyAoc2VlICVbLi4uXSkgKilcblxudHlwZSBtdXRhYmxlX2NoYXJfc2V0ID0gYnl0ZXNcblxuKCogQ3JlYXRlIGEgZnJlc2gsIGVtcHR5LCBtdXRhYmxlIGNoYXIgc2V0LiAqKVxubGV0IGNyZWF0ZV9jaGFyX3NldCAoKSA9IEJ5dGVzLm1ha2UgMzIgJ1xcMDAwJ1xuXG4oKiBBZGQgYSBjaGFyIGluIGEgbXV0YWJsZSBjaGFyIHNldC4gKilcbmxldCBhZGRfaW5fY2hhcl9zZXQgY2hhcl9zZXQgYyA9XG4gIGxldCBpbmQgPSBpbnRfb2ZfY2hhciBjIGluXG4gIGxldCBzdHJfaW5kID0gaW5kIGxzciAzIGFuZCBtYXNrID0gMSBsc2wgKGluZCBsYW5kIDBiMTExKSBpblxuICBCeXRlcy5zZXQgY2hhcl9zZXQgc3RyX2luZFxuICAgIChjaGFyX29mX2ludCAoaW50X29mX2NoYXIgKEJ5dGVzLmdldCBjaGFyX3NldCBzdHJfaW5kKSBsb3IgbWFzaykpXG5cbmxldCBmcmVlemVfY2hhcl9zZXQgY2hhcl9zZXQgPVxuICBCeXRlcy50b19zdHJpbmcgY2hhcl9zZXRcblxuKCogQ29tcHV0ZSB0aGUgY29tcGxlbWVudCBvZiBhIGNoYXIgc2V0LiAqKVxubGV0IHJldl9jaGFyX3NldCBjaGFyX3NldCA9XG4gIGxldCBjaGFyX3NldCcgPSBjcmVhdGVfY2hhcl9zZXQgKCkgaW5cbiAgZm9yIGkgPSAwIHRvIDMxIGRvXG4gICAgQnl0ZXMuc2V0IGNoYXJfc2V0JyBpXG4gICAgICAoY2hhcl9vZl9pbnQgKGludF9vZl9jaGFyIChTdHJpbmcuZ2V0IGNoYXJfc2V0IGkpIGx4b3IgMHhGRikpO1xuICBkb25lO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIGNoYXJfc2V0J1xuXG4oKiBSZXR1cm4gdHJ1ZSBpZiBhIGBjJyBpcyBpbiBgY2hhcl9zZXQnLiAqKVxubGV0IGlzX2luX2NoYXJfc2V0IGNoYXJfc2V0IGMgPVxuICBsZXQgaW5kID0gaW50X29mX2NoYXIgYyBpblxuICBsZXQgc3RyX2luZCA9IGluZCBsc3IgMyBhbmQgbWFzayA9IDEgbHNsIChpbmQgbGFuZCAwYjExMSkgaW5cbiAgKGludF9vZl9jaGFyIChTdHJpbmcuZ2V0IGNoYXJfc2V0IHN0cl9pbmQpIGxhbmQgbWFzaykgPD4gMFxuXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgKCogSWdub3JlZCBwYXJhbSBjb252ZXJzaW9uICopXG5cbigqIEdBRFQgdXNlZCB0byBhYnN0cmFjdCBhbiBleGlzdGVudGlhbCB0eXBlIHBhcmFtZXRlci4gKilcbigqIFNlZSBwYXJhbV9mb3JtYXRfb2ZfaWdub3JlZF9mb3JtYXQuICopXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBwYXJhbV9mb3JtYXRfZWJiID0gUGFyYW1fZm9ybWF0X0VCQiA6XG4gICAgKCd4IC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBwYXJhbV9mb3JtYXRfZWJiXG5cbigqIENvbXB1dGUgYSBwYWRkaW5nIGFzc29jaWF0ZWQgdG8gYSBwYWRfb3B0aW9uIChzZWUgXCIlXzQyZFwiKS4gKilcbmxldCBwYWRfb2ZfcGFkX29wdCBwYWRfb3B0ID0gbWF0Y2ggcGFkX29wdCB3aXRoXG4gIHwgTm9uZSAtPiBOb19wYWRkaW5nXG4gIHwgU29tZSB3aWR0aCAtPiBMaXRfcGFkZGluZyAoUmlnaHQsIHdpZHRoKVxuXG4oKiBDb21wdXRlIGEgcHJlY2lzaW9uIGFzc29jaWF0ZWQgdG8gYSBwcmVjX29wdGlvbiAoc2VlIFwiJV8uNDJmXCIpLiAqKVxubGV0IHByZWNfb2ZfcHJlY19vcHQgcHJlY19vcHQgPSBtYXRjaCBwcmVjX29wdCB3aXRoXG4gIHwgTm9uZSAtPiBOb19wcmVjaXNpb25cbiAgfCBTb21lIG5kZWMgLT4gTGl0X3ByZWNpc2lvbiBuZGVjXG5cbigqIFR1cm4gYW4gaWdub3JlZCBwYXJhbSBpbnRvIGl0cyBlcXVpdmFsZW50IG5vdC1pZ25vcmVkIGZvcm1hdCBub2RlLiAqKVxuKCogVXNlZCBmb3IgZm9ybWF0IHByZXR0eS1wcmludGluZyBhbmQgU2NhbmYuICopXG5sZXQgcGFyYW1fZm9ybWF0X29mX2lnbm9yZWRfZm9ybWF0IDogdHlwZSBhIGIgYyBkIGUgZiB4IHkgLlxuICAgIChhLCBiLCBjLCBkLCB5LCB4KSBpZ25vcmVkIC0+ICh4LCBiLCBjLCB5LCBlLCBmKSBmbXQgLT5cbiAgICAgIChhLCBiLCBjLCBkLCBlLCBmKSBwYXJhbV9mb3JtYXRfZWJiID1cbmZ1biBpZ24gZm10IC0+IG1hdGNoIGlnbiB3aXRoXG4gIHwgSWdub3JlZF9jaGFyIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoQ2hhciBmbXQpXG4gIHwgSWdub3JlZF9jYW1sX2NoYXIgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChDYW1sX2NoYXIgZm10KVxuICB8IElnbm9yZWRfc3RyaW5nIHBhZF9vcHQgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChTdHJpbmcgKHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIGZtdCkpXG4gIHwgSWdub3JlZF9jYW1sX3N0cmluZyBwYWRfb3B0IC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoQ2FtbF9zdHJpbmcgKHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIGZtdCkpXG4gIHwgSWdub3JlZF9pbnQgKGljb252LCBwYWRfb3B0KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkIgKEludCAoaWNvbnYsIHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIE5vX3ByZWNpc2lvbiwgZm10KSlcbiAgfCBJZ25vcmVkX2ludDMyIChpY29udiwgcGFkX29wdCkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCXG4gICAgICAoSW50MzIgKGljb252LCBwYWRfb2ZfcGFkX29wdCBwYWRfb3B0LCBOb19wcmVjaXNpb24sIGZtdCkpXG4gIHwgSWdub3JlZF9uYXRpdmVpbnQgKGljb252LCBwYWRfb3B0KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkJcbiAgICAgIChOYXRpdmVpbnQgKGljb252LCBwYWRfb2ZfcGFkX29wdCBwYWRfb3B0LCBOb19wcmVjaXNpb24sIGZtdCkpXG4gIHwgSWdub3JlZF9pbnQ2NCAoaWNvbnYsIHBhZF9vcHQpIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQlxuICAgICAgKEludDY0IChpY29udiwgcGFkX29mX3BhZF9vcHQgcGFkX29wdCwgTm9fcHJlY2lzaW9uLCBmbXQpKVxuICB8IElnbm9yZWRfZmxvYXQgKHBhZF9vcHQsIHByZWNfb3B0KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkJcbiAgICAgIChGbG9hdCAoKEZsb2F0X2ZsYWdfLCBGbG9hdF9mKSxcbiAgICAgICAgICAgICAgcGFkX29mX3BhZF9vcHQgcGFkX29wdCwgcHJlY19vZl9wcmVjX29wdCBwcmVjX29wdCwgZm10KSlcbiAgfCBJZ25vcmVkX2Jvb2wgcGFkX29wdCAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkIgKEJvb2wgKHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIGZtdCkpXG4gIHwgSWdub3JlZF9mb3JtYXRfYXJnIChwYWRfb3B0LCBmbXR0eSkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChGb3JtYXRfYXJnIChwYWRfb3B0LCBmbXR0eSwgZm10KSlcbiAgfCBJZ25vcmVkX2Zvcm1hdF9zdWJzdCAocGFkX29wdCwgZm10dHkpIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQlxuICAgICAgKEZvcm1hdF9zdWJzdCAocGFkX29wdCwgZm10dHksIGZtdCkpXG4gIHwgSWdub3JlZF9yZWFkZXIgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChSZWFkZXIgZm10KVxuICB8IElnbm9yZWRfc2Nhbl9jaGFyX3NldCAod2lkdGhfb3B0LCBjaGFyX3NldCkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCBmbXQpKVxuICB8IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciBjb3VudGVyIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgZm10KSlcbiAgfCBJZ25vcmVkX3NjYW5fbmV4dF9jaGFyIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoU2Nhbl9uZXh0X2NoYXIgZm10KVxuXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBUeXBlcyAqKVxuXG50eXBlICgnYiwgJ2MpIGFjY19mb3JtYXR0aW5nX2dlbiA9XG4gIHwgQWNjX29wZW5fdGFnIG9mICgnYiwgJ2MpIGFjY1xuICB8IEFjY19vcGVuX2JveCBvZiAoJ2IsICdjKSBhY2NcblxuKCogUmV2ZXJzZWQgbGlzdCBvZiBwcmludGluZyBhdG9tcy4gKilcbigqIFVzZWQgdG8gYWNjdW11bGF0ZSBwcmludGYgYXJndW1lbnRzLiAqKVxuYW5kICgnYiwgJ2MpIGFjYyA9XG4gIHwgQWNjX2Zvcm1hdHRpbmdfbGl0IG9mICgnYiwgJ2MpIGFjYyAqIGZvcm1hdHRpbmdfbGl0XG4gICAgICAoKiBTcGVjaWFsIGZtdHRpbmcgKGJveCkgKilcbiAgfCBBY2NfZm9ybWF0dGluZ19nZW4gb2YgKCdiLCAnYykgYWNjICogKCdiLCAnYykgYWNjX2Zvcm1hdHRpbmdfZ2VuXG4gICAgICAoKiBTcGVjaWFsIGZtdHRpbmcgKGJveCkgKilcbiAgfCBBY2Nfc3RyaW5nX2xpdGVyYWwgb2YgKCdiLCAnYykgYWNjICogc3RyaW5nICAgICAoKiBMaXRlcmFsIHN0cmluZyAqKVxuICB8IEFjY19jaGFyX2xpdGVyYWwgICBvZiAoJ2IsICdjKSBhY2MgKiBjaGFyICAgICAgICgqIExpdGVyYWwgY2hhciAqKVxuICB8IEFjY19kYXRhX3N0cmluZyAgICBvZiAoJ2IsICdjKSBhY2MgKiBzdHJpbmcgICAgICgqIEdlbmVyYXRlZCBzdHJpbmcgKilcbiAgfCBBY2NfZGF0YV9jaGFyICAgICAgb2YgKCdiLCAnYykgYWNjICogY2hhciAgICAgICAoKiBHZW5lcmF0ZWQgY2hhciAqKVxuICB8IEFjY19kZWxheSAgICAgICAgICBvZiAoJ2IsICdjKSBhY2MgKiAoJ2IgLT4gJ2MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBEZWxheWVkIHByaW50aW5nICglYSwgJXQpICopXG4gIHwgQWNjX2ZsdXNoICAgICAgICAgIG9mICgnYiwgJ2MpIGFjYyAgICAgICAgICAgICAgKCogRmx1c2ggKilcbiAgfCBBY2NfaW52YWxpZF9hcmcgICAgb2YgKCdiLCAnYykgYWNjICogc3RyaW5nXG4gICAgICAoKiBSYWlzZSBJbnZhbGlkX2FyZ3VtZW50IG1zZyAqKVxuICB8IEVuZF9vZl9hY2NcblxuKCogTGlzdCBvZiBoZXRlcm9nZW5lb3VzIHZhbHVlcy4gKilcbigqIFVzZWQgdG8gYWNjdW11bGF0ZSBzY2FuZiBjYWxsYmFjayBhcmd1bWVudHMuICopXG50eXBlICgnYSwgJ2IpIGhldGVyX2xpc3QgPVxuICB8IENvbnMgOiAnYyAqICgnYSwgJ2IpIGhldGVyX2xpc3QgLT4gKCdjIC0+ICdhLCAnYikgaGV0ZXJfbGlzdFxuICB8IE5pbCA6ICgnYiwgJ2IpIGhldGVyX2xpc3RcblxuKCogRXhpc3RlbnRpYWwgQmxhY2sgQm94ZXMuICopXG4oKiBVc2VkIHRvIGFic3RyYWN0IHNvbWUgZXhpc3RlbnRpYWwgdHlwZSBwYXJhbWV0ZXJzLiAqKVxuXG4oKiBHQURUIHR5cGUgYXNzb2NpYXRpbmcgYSBwYWRkaW5nIGFuZCBhbiBmbXR0eS4gKilcbigqIFNlZSB0aGUgdHlwZV9wYWRkaW5nIGZ1bmN0aW9uLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgcGFkZGluZ19mbXR0eV9lYmIgPSBQYWRkaW5nX2ZtdHR5X0VCQiA6XG4gICAgICgneCwgJ3kpIHBhZGRpbmcgKiAoJ3ksICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHkgLT5cbiAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIHBhZGRpbmdfZm10dHlfZWJiXG5cbigqIEdBRFQgdHlwZSBhc3NvY2lhdGluZyBhIHBhZGRpbmcsIGEgcHJlY2lzaW9uIGFuZCBhbiBmbXR0eS4gKilcbigqIFNlZSB0aGUgdHlwZV9wYWRwcmVjIGZ1bmN0aW9uLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgcGFkcHJlY19mbXR0eV9lYmIgPSBQYWRwcmVjX2ZtdHR5X0VCQiA6XG4gICAgICgneCwgJ3kpIHBhZGRpbmcgKiAoJ3ksICd6KSBwcmVjaXNpb24gKiAoJ3osICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHkgLT5cbiAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIHBhZHByZWNfZm10dHlfZWJiXG5cbigqIEdBRFQgdHlwZSBhc3NvY2lhdGluZyBhIHBhZGRpbmcgYW5kIGFuIGZtdC4gKilcbigqIFNlZSBtYWtlX3BhZGRpbmdfZm10X2ViYiBhbmQgcGFyc2VfZm9ybWF0IGZ1bmN0aW9ucy4gKilcbnR5cGUgKCdhLCAnYiwgJ2MsICdlLCAnZikgcGFkZGluZ19mbXRfZWJiID0gUGFkZGluZ19mbXRfRUJCIDpcbiAgICAgKF8sICd4IC0+ICdhKSBwYWRkaW5nICpcbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAoJ3gsICdiLCAnYywgJ2UsICdmKSBwYWRkaW5nX2ZtdF9lYmJcblxuKCogR0FEVCB0eXBlIGFzc29jaWF0aW5nIGEgcHJlY2lzaW9uIGFuZCBhbiBmbXQuICopXG4oKiBTZWUgbWFrZV9wcmVjaXNpb25fZm10X2ViYiBhbmQgcGFyc2VfZm9ybWF0IGZ1bmN0aW9ucy4gKilcbnR5cGUgKCdhLCAnYiwgJ2MsICdlLCAnZikgcHJlY2lzaW9uX2ZtdF9lYmIgPSBQcmVjaXNpb25fZm10X0VCQiA6XG4gICAgIChfLCAneCAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAoJ3gsICdiLCAnYywgJ2UsICdmKSBwcmVjaXNpb25fZm10X2ViYlxuXG4oKiBHQURUIHR5cGUgYXNzb2NpYXRpbmcgYSBwYWRkaW5nLCBhIHByZWNpc2lvbiBhbmQgYW4gZm10LiAqKVxuKCogU2VlIG1ha2VfcGFkcHJlY19mbXRfZWJiIGFuZCBwYXJzZV9mb3JtYXQgZnVuY3Rpb25zLiAqKVxudHlwZSAoJ3AsICdiLCAnYywgJ2UsICdmKSBwYWRwcmVjX2ZtdF9lYmIgPSBQYWRwcmVjX2ZtdF9FQkIgOlxuICAgICAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCAncCAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAoJ3AsICdiLCAnYywgJ2UsICdmKSBwYWRwcmVjX2ZtdF9lYmJcblxuKCogQWJzdHJhY3QgdGhlICdhIGFuZCAnZCBwYXJhbWV0ZXJzIG9mIGFuIGZtdC4gKilcbigqIE91dHB1dCB0eXBlIG9mIHRoZSBmb3JtYXQgcGFyc2luZyBmdW5jdGlvbi4gKilcbnR5cGUgKCdiLCAnYywgJ2UsICdmKSBmbXRfZWJiID0gRm10X0VCQiA6XG4gICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgKCdiLCAnYywgJ2UsICdmKSBmbXRfZWJiXG5cbigqIEdBRFQgdHlwZSBhc3NvY2lhdGluZyBhbiBmbXR0eSBhbmQgYW4gZm10LiAqKVxuKCogU2VlIHRoZSB0eXBlX2Zvcm1hdF9nZW4gZnVuY3Rpb24uICopXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRfZm10dHlfZWJiID0gRm10X2ZtdHR5X0VCQiA6XG4gICAgICgnYSwgJ2IsICdjLCAnZCwgJ3ksICd4KSBmbXQgKlxuICAgICAoJ3gsICdiLCAnYywgJ3ksICdlLCAnZikgZm10dHkgLT5cbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdF9mbXR0eV9lYmJcblxuKCogR0FEVCB0eXBlIGFzc29jaWF0aW5nIGFuIGZtdHR5IGFuZCBhbiBmbXQuICopXG4oKiBTZWUgdGhlIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIGZ1bmN0aW9uLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHlfZm10X2ViYiA9IEZtdHR5X2ZtdF9FQkIgOlxuICAgICAoJ2EsICdiLCAnYywgJ2QsICd5LCAneCkgZm10dHkgKlxuICAgICAoJ3gsICdiLCAnYywgJ3ksICdlLCAnZikgZm10X2ZtdHR5X2ViYiAtPlxuICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHlfZm10X2ViYlxuXG4oKiBBYnN0cmFjdCBhbGwgZm10dHkgdHlwZSBwYXJhbWV0ZXJzLiAqKVxuKCogVXNlZCB0byBjb21wYXJlIGZvcm1hdCB0eXBlcy4gKilcbnR5cGUgZm10dHlfZWJiID0gRm10dHlfRUJCIDogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5IC0+IGZtdHR5X2ViYlxuXG4oKiBBYnN0cmFjdCBhbGwgcGFkZGluZyB0eXBlIHBhcmFtZXRlcnMuICopXG4oKiBVc2VkIHRvIGNvbXBhcmUgcGFkZGluZ3MuICopXG50eXBlIHBhZGRpbmdfZWJiID0gUGFkZGluZ19FQkIgOiAoJ2EsICdiKSBwYWRkaW5nIC0+IHBhZGRpbmdfZWJiXG5cbigqIEFic3RyYWN0IGFsbCBwcmVjaXNpb24gdHlwZSBwYXJhbWV0ZXJzLiAqKVxuKCogVXNlZCB0byBjb21wYXJlIHByZWNpc2lvbnMuICopXG50eXBlIHByZWNpc2lvbl9lYmIgPSBQcmVjaXNpb25fRUJCIDogKCdhLCAnYikgcHJlY2lzaW9uIC0+IHByZWNpc2lvbl9lYmJcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBDb25zdGFudHMgKilcblxuKCogRGVmYXVsdCBwcmVjaXNpb24gZm9yIGZsb2F0IHByaW50aW5nLiAqKVxubGV0IGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252ID1cbiAgbWF0Y2ggc25kIGZjb252IHdpdGhcbiAgfCBGbG9hdF9mIHwgRmxvYXRfZSB8IEZsb2F0X0UgfCBGbG9hdF9nIHwgRmxvYXRfRyB8IEZsb2F0X2ggfCBGbG9hdF9IXG4gIHwgRmxvYXRfQ0YgLT4gLTZcbiAgKCogRm9yICVoICVIIGFuZCAlI0YgZm9ybWF0cywgYSBuZWdhdGl2ZSBwcmVjaXNpb24gbWVhbnMgXCJhcyBtYW55IGRpZ2l0cyBhc1xuICAgICBuZWNlc3NhcnlcIi4gIEZvciB0aGUgb3RoZXIgRlAgZm9ybWF0cywgd2UgdGFrZSB0aGUgYWJzb2x1dGUgdmFsdWVcbiAgICAgb2YgdGhlIHByZWNpc2lvbiwgaGVuY2UgNiBkaWdpdHMgYnkgZGVmYXVsdC4gKilcbiAgfCBGbG9hdF9GIC0+IDEyXG4gICgqIERlZmF1bHQgcHJlY2lzaW9uIGZvciBPQ2FtbCBmbG9hdCBwcmludGluZyAoJUYpLiAqKVxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEV4dGVybmFscyAqKVxuXG5leHRlcm5hbCBmb3JtYXRfZmxvYXQ6IHN0cmluZyAtPiBmbG9hdCAtPiBzdHJpbmdcbiAgPSBcImNhbWxfZm9ybWF0X2Zsb2F0XCJcbmV4dGVybmFsIGZvcm1hdF9pbnQ6IHN0cmluZyAtPiBpbnQgLT4gc3RyaW5nXG4gID0gXCJjYW1sX2Zvcm1hdF9pbnRcIlxuZXh0ZXJuYWwgZm9ybWF0X2ludDMyOiBzdHJpbmcgLT4gaW50MzIgLT4gc3RyaW5nXG4gID0gXCJjYW1sX2ludDMyX2Zvcm1hdFwiXG5leHRlcm5hbCBmb3JtYXRfbmF0aXZlaW50OiBzdHJpbmcgLT4gbmF0aXZlaW50IC0+IHN0cmluZ1xuICA9IFwiY2FtbF9uYXRpdmVpbnRfZm9ybWF0XCJcbmV4dGVybmFsIGZvcm1hdF9pbnQ2NDogc3RyaW5nIC0+IGludDY0IC0+IHN0cmluZ1xuICA9IFwiY2FtbF9pbnQ2NF9mb3JtYXRcIlxuZXh0ZXJuYWwgaGV4c3RyaW5nX29mX2Zsb2F0OiBmbG9hdCAtPiBpbnQgLT4gY2hhciAtPiBzdHJpbmdcbiAgPSBcImNhbWxfaGV4c3RyaW5nX29mX2Zsb2F0XCJcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICgqIFRvb2xzIHRvIHByZXR0eS1wcmludCBmb3JtYXRzICopXG5cbigqIFR5cGUgb2YgZXh0ZW5zaWJsZSBjaGFyYWN0ZXIgYnVmZmVycy4gKilcbnR5cGUgYnVmZmVyID0ge1xuICBtdXRhYmxlIGluZCA6IGludDtcbiAgbXV0YWJsZSBieXRlcyA6IGJ5dGVzO1xufVxuXG4oKiBDcmVhdGUgYSBmcmVzaCBidWZmZXIuICopXG5sZXQgYnVmZmVyX2NyZWF0ZSBpbml0X3NpemUgPSB7IGluZCA9IDA7IGJ5dGVzID0gQnl0ZXMuY3JlYXRlIGluaXRfc2l6ZSB9XG5cbigqIENoZWNrIHNpemUgb2YgdGhlIGJ1ZmZlciBhbmQgZ3JvdyBpdCBpZiBuZWVkZWQuICopXG5sZXQgYnVmZmVyX2NoZWNrX3NpemUgYnVmIG92ZXJoZWFkID1cbiAgbGV0IGxlbiA9IEJ5dGVzLmxlbmd0aCBidWYuYnl0ZXMgaW5cbiAgbGV0IG1pbl9sZW4gPSBidWYuaW5kICsgb3ZlcmhlYWQgaW5cbiAgaWYgbWluX2xlbiA+IGxlbiB0aGVuIChcbiAgICBsZXQgbmV3X2xlbiA9IEludC5tYXggKGxlbiAqIDIpIG1pbl9sZW4gaW5cbiAgICBsZXQgbmV3X3N0ciA9IEJ5dGVzLmNyZWF0ZSBuZXdfbGVuIGluXG4gICAgQnl0ZXMuYmxpdCBidWYuYnl0ZXMgMCBuZXdfc3RyIDAgbGVuO1xuICAgIGJ1Zi5ieXRlcyA8LSBuZXdfc3RyO1xuICApXG5cbigqIEFkZCB0aGUgY2hhcmFjdGVyIGBjJyB0byB0aGUgYnVmZmVyIGBidWYnLiAqKVxubGV0IGJ1ZmZlcl9hZGRfY2hhciBidWYgYyA9XG4gIGJ1ZmZlcl9jaGVja19zaXplIGJ1ZiAxO1xuICBCeXRlcy5zZXQgYnVmLmJ5dGVzIGJ1Zi5pbmQgYztcbiAgYnVmLmluZCA8LSBidWYuaW5kICsgMVxuXG4oKiBBZGQgdGhlIHN0cmluZyBgcycgdG8gdGhlIGJ1ZmZlciBgYnVmJy4gKilcbmxldCBidWZmZXJfYWRkX3N0cmluZyBidWYgcyA9XG4gIGxldCBzdHJfbGVuID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gIGJ1ZmZlcl9jaGVja19zaXplIGJ1ZiBzdHJfbGVuO1xuICBTdHJpbmcuYmxpdCBzIDAgYnVmLmJ5dGVzIGJ1Zi5pbmQgc3RyX2xlbjtcbiAgYnVmLmluZCA8LSBidWYuaW5kICsgc3RyX2xlblxuXG4oKiBHZXQgdGhlIGNvbnRlbnQgb2YgdGhlIGJ1ZmZlci4gKilcbmxldCBidWZmZXJfY29udGVudHMgYnVmID1cbiAgQnl0ZXMuc3ViX3N0cmluZyBidWYuYnl0ZXMgMCBidWYuaW5kXG5cbigqKiopXG5cbigqIENvbnZlcnQgYW4gaW50ZWdlciBjb252ZXJzaW9uIHRvIGNoYXIuICopXG5sZXQgY2hhcl9vZl9pY29udiBpY29udiA9IG1hdGNoIGljb252IHdpdGhcbiAgfCBJbnRfZCB8IEludF9wZCB8IEludF9zZCB8IEludF9DZCAtPiAnZCcgfCBJbnRfaSB8IEludF9waSB8IEludF9zaVxuICB8IEludF9DaSAtPiAnaScgfCBJbnRfeCB8IEludF9DeCAtPiAneCcgfCBJbnRfWCB8IEludF9DWCAtPiAnWCcgfCBJbnRfb1xuICB8IEludF9DbyAtPiAnbycgfCBJbnRfdSB8IEludF9DdSAtPiAndSdcblxuKCogQ29udmVydCBhIGZsb2F0IGNvbnZlcnNpb24gdG8gY2hhci4gKilcbigqIGBjRicgd2lsbCBiZSAnRicgZm9yIGRpc3BsYXlpbmcgZm9ybWF0IGFuZCAnZycgdG8gY2FsbCBsaWJjIHByaW50ZiAqKVxubGV0IGNoYXJfb2ZfZmNvbnYgPyhjRj0nRicpIGZjb252ID0gbWF0Y2ggc25kIGZjb252IHdpdGhcbiAgfCBGbG9hdF9mIC0+ICdmJyB8IEZsb2F0X2UgLT4gJ2UnXG4gIHwgRmxvYXRfRSAtPiAnRScgfCBGbG9hdF9nIC0+ICdnJ1xuICB8IEZsb2F0X0cgLT4gJ0cnIHwgRmxvYXRfRiAtPiBjRlxuICB8IEZsb2F0X2ggLT4gJ2gnIHwgRmxvYXRfSCAtPiAnSCdcbiAgfCBGbG9hdF9DRiAtPiAnRidcblxuXG4oKiBDb252ZXJ0IGEgc2Nhbm5pbmcgY291bnRlciB0byBjaGFyLiAqKVxubGV0IGNoYXJfb2ZfY291bnRlciBjb3VudGVyID0gbWF0Y2ggY291bnRlciB3aXRoXG4gIHwgTGluZV9jb3VudGVyICAtPiAnbCdcbiAgfCBDaGFyX2NvdW50ZXIgIC0+ICduJ1xuICB8IFRva2VuX2NvdW50ZXIgLT4gJ04nXG5cbigqKiopXG5cbigqIFByaW50IGEgY2hhcl9zZXQgaW4gYSBidWZmZXIgd2l0aCB0aGUgT0NhbWwgZm9ybWF0IGxleGljYWwgY29udmVudGlvbi4gKilcbmxldCBicHJpbnRfY2hhcl9zZXQgYnVmIGNoYXJfc2V0ID1cbiAgbGV0IHJlYyBwcmludF9zdGFydCBzZXQgPVxuICAgIGxldCBpc19hbG9uZSBjID1cbiAgICAgIGxldCBiZWZvcmUsIGFmdGVyID0gQ2hhci4oY2hyIChjb2RlIGMgLSAxKSwgY2hyIChjb2RlIGMgKyAxKSkgaW5cbiAgICAgIGlzX2luX2NoYXJfc2V0IHNldCBjXG4gICAgICAmJiBub3QgKGlzX2luX2NoYXJfc2V0IHNldCBiZWZvcmUgJiYgaXNfaW5fY2hhcl9zZXQgc2V0IGFmdGVyKSBpblxuICAgIGlmIGlzX2Fsb25lICddJyB0aGVuIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ10nO1xuICAgIHByaW50X291dCBzZXQgMTtcbiAgICBpZiBpc19hbG9uZSAnLScgdGhlbiBidWZmZXJfYWRkX2NoYXIgYnVmICctJztcbiAgYW5kIHByaW50X291dCBzZXQgaSA9XG4gICAgaWYgaSA8IDI1NiB0aGVuXG4gICAgICBpZiBpc19pbl9jaGFyX3NldCBzZXQgKGNoYXJfb2ZfaW50IGkpIHRoZW4gcHJpbnRfZmlyc3Qgc2V0IGlcbiAgICAgIGVsc2UgcHJpbnRfb3V0IHNldCAoaSArIDEpXG4gIGFuZCBwcmludF9maXJzdCBzZXQgaSA9XG4gICAgbWF0Y2ggY2hhcl9vZl9pbnQgaSB3aXRoXG4gICAgfCAnXFwyNTUnIC0+IHByaW50X2NoYXIgYnVmIDI1NTtcbiAgICB8ICddJyB8ICctJyAtPiBwcmludF9vdXQgc2V0IChpICsgMSk7XG4gICAgfCBfIC0+IHByaW50X3NlY29uZCBzZXQgKGkgKyAxKTtcbiAgYW5kIHByaW50X3NlY29uZCBzZXQgaSA9XG4gICAgaWYgaXNfaW5fY2hhcl9zZXQgc2V0IChjaGFyX29mX2ludCBpKSB0aGVuXG4gICAgICBtYXRjaCBjaGFyX29mX2ludCBpIHdpdGhcbiAgICAgIHwgJ1xcMjU1JyAtPlxuICAgICAgICBwcmludF9jaGFyIGJ1ZiAyNTQ7XG4gICAgICAgIHByaW50X2NoYXIgYnVmIDI1NTtcbiAgICAgIHwgJ10nIHwgJy0nIHdoZW4gbm90IChpc19pbl9jaGFyX3NldCBzZXQgKGNoYXJfb2ZfaW50IChpICsgMSkpKSAtPlxuICAgICAgICBwcmludF9jaGFyIGJ1ZiAoaSAtIDEpO1xuICAgICAgICBwcmludF9vdXQgc2V0IChpICsgMSk7XG4gICAgICB8IF8gd2hlbiBub3QgKGlzX2luX2NoYXJfc2V0IHNldCAoY2hhcl9vZl9pbnQgKGkgKyAxKSkpIC0+XG4gICAgICAgIHByaW50X2NoYXIgYnVmIChpIC0gMSk7XG4gICAgICAgIHByaW50X2NoYXIgYnVmIGk7XG4gICAgICAgIHByaW50X291dCBzZXQgKGkgKyAyKTtcbiAgICAgIHwgXyAtPlxuICAgICAgICBwcmludF9pbiBzZXQgKGkgLSAxKSAoaSArIDIpO1xuICAgIGVsc2UgKFxuICAgICAgcHJpbnRfY2hhciBidWYgKGkgLSAxKTtcbiAgICAgIHByaW50X291dCBzZXQgKGkgKyAxKTtcbiAgICApXG4gIGFuZCBwcmludF9pbiBzZXQgaSBqID1cbiAgICBpZiBqID0gMjU2IHx8IG5vdCAoaXNfaW5fY2hhcl9zZXQgc2V0IChjaGFyX29mX2ludCBqKSkgdGhlbiAoXG4gICAgICBwcmludF9jaGFyIGJ1ZiBpO1xuICAgICAgcHJpbnRfY2hhciBidWYgKGludF9vZl9jaGFyICctJyk7XG4gICAgICBwcmludF9jaGFyIGJ1ZiAoaiAtIDEpO1xuICAgICAgaWYgaiA8IDI1NiB0aGVuIHByaW50X291dCBzZXQgKGogKyAxKTtcbiAgICApIGVsc2VcbiAgICAgIHByaW50X2luIHNldCBpIChqICsgMSk7XG4gIGFuZCBwcmludF9jaGFyIGJ1ZiBpID0gbWF0Y2ggY2hhcl9vZl9pbnQgaSB3aXRoXG4gICAgfCAnJScgLT4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnO1xuICAgIHwgJ0AnIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBidWZmZXJfYWRkX2NoYXIgYnVmICdAJztcbiAgICB8IGMgICAtPiBidWZmZXJfYWRkX2NoYXIgYnVmIGM7XG4gIGluXG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ1snO1xuICBwcmludF9zdGFydCAoXG4gICAgaWYgaXNfaW5fY2hhcl9zZXQgY2hhcl9zZXQgJ1xcMDAwJ1xuICAgIHRoZW4gKCBidWZmZXJfYWRkX2NoYXIgYnVmICdeJzsgcmV2X2NoYXJfc2V0IGNoYXJfc2V0IClcbiAgICBlbHNlIGNoYXJfc2V0XG4gICk7XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ10nXG5cbigqKiopXG5cbigqIFByaW50IGEgcGFkdHkgaW4gYSBidWZmZXIgd2l0aCB0aGUgZm9ybWF0LWxpa2Ugc3ludGF4LiAqKVxubGV0IGJwcmludF9wYWR0eSBidWYgcGFkdHkgPSBtYXRjaCBwYWR0eSB3aXRoXG4gIHwgTGVmdCAgLT4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnLSdcbiAgfCBSaWdodCAtPiAoKVxuICB8IFplcm9zIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJzAnXG5cbigqIFByaW50IHRoZSAnXycgb2YgYW4gaWdub3JlZCBmbGFnIGlmIG5lZWRlZC4gKilcbmxldCBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZyA9XG4gIGlmIGlnbl9mbGFnIHRoZW4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnXydcblxuKCoqKilcblxubGV0IGJwcmludF9wYWRfb3B0IGJ1ZiBwYWRfb3B0ID0gbWF0Y2ggcGFkX29wdCB3aXRoXG4gIHwgTm9uZSAtPiAoKVxuICB8IFNvbWUgd2lkdGggLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIChJbnQudG9fc3RyaW5nIHdpZHRoKVxuXG4oKioqKVxuXG4oKiBQcmludCBwYWRkaW5nIGluIGEgYnVmZmVyIHdpdGggdGhlIGZvcm1hdC1saWtlIHN5bnRheC4gKilcbmxldCBicHJpbnRfcGFkZGluZyA6IHR5cGUgYSBiIC4gYnVmZmVyIC0+IChhLCBiKSBwYWRkaW5nIC0+IHVuaXQgPVxuZnVuIGJ1ZiBwYWQgLT4gbWF0Y2ggcGFkIHdpdGhcbiAgfCBOb19wYWRkaW5nIC0+ICgpXG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCBuKSAtPlxuICAgIGJwcmludF9wYWR0eSBidWYgcGFkdHk7XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIChJbnQudG9fc3RyaW5nIG4pO1xuICB8IEFyZ19wYWRkaW5nIHBhZHR5IC0+XG4gICAgYnByaW50X3BhZHR5IGJ1ZiBwYWR0eTtcbiAgICBidWZmZXJfYWRkX2NoYXIgYnVmICcqJ1xuXG4oKiBQcmludCBwcmVjaXNpb24gaW4gYSBidWZmZXIgd2l0aCB0aGUgZm9ybWF0LWxpa2Ugc3ludGF4LiAqKVxubGV0IGJwcmludF9wcmVjaXNpb24gOiB0eXBlIGEgYiAuIGJ1ZmZlciAtPiAoYSwgYikgcHJlY2lzaW9uIC0+IHVuaXQgPVxuICBmdW4gYnVmIHByZWMgLT4gbWF0Y2ggcHJlYyB3aXRoXG4gIHwgTm9fcHJlY2lzaW9uIC0+ICgpXG4gIHwgTGl0X3ByZWNpc2lvbiBuIC0+XG4gICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnLic7XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIChJbnQudG9fc3RyaW5nIG4pO1xuICB8IEFyZ19wcmVjaXNpb24gLT5cbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIuKlwiXG5cbigqKiopXG5cbigqIFByaW50IHRoZSBvcHRpb25hbCAnKycsICcgJyBvciAnIycgYXNzb2NpYXRlZCB0byBhbiBpbnQgY29udmVyc2lvbi4gKilcbmxldCBicHJpbnRfaWNvbnZfZmxhZyBidWYgaWNvbnYgPSBtYXRjaCBpY29udiB3aXRoXG4gIHwgSW50X3BkIHwgSW50X3BpIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJysnXG4gIHwgSW50X3NkIHwgSW50X3NpIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyAnXG4gIHwgSW50X0N4IHwgSW50X0NYIHwgSW50X0NvIHwgSW50X0NkIHwgSW50X0NpIHwgSW50X0N1IC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICcjJ1xuICB8IEludF9kIHwgSW50X2kgfCBJbnRfeCB8IEludF9YIHwgSW50X28gfCBJbnRfdSAtPiAoKVxuXG4oKiBQcmludCBhbiBjb21wbGV0ZSBpbnQgZm9ybWF0IGluIGEgYnVmZmVyIChleDogXCIlMy4qZFwiKS4gKilcbmxldCBicHJpbnRfaW50X2ZtdCBidWYgaWduX2ZsYWcgaWNvbnYgcGFkIHByZWMgPVxuICBidWZmZXJfYWRkX2NoYXIgYnVmICclJztcbiAgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gIGJwcmludF9pY29udl9mbGFnIGJ1ZiBpY29udjtcbiAgYnByaW50X3BhZGRpbmcgYnVmIHBhZDtcbiAgYnByaW50X3ByZWNpc2lvbiBidWYgcHJlYztcbiAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAoY2hhcl9vZl9pY29udiBpY29udilcblxuKCogUHJpbnQgYSBjb21wbGV0ZSBpbnQzMiwgbmF0aXZlaW50IG9yIGludDY0IGZvcm1hdCBpbiBhIGJ1ZmZlci4gKilcbmxldCBicHJpbnRfYWx0aW50X2ZtdCBidWYgaWduX2ZsYWcgaWNvbnYgcGFkIHByZWMgYyA9XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnO1xuICBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgYnByaW50X2ljb252X2ZsYWcgYnVmIGljb252O1xuICBicHJpbnRfcGFkZGluZyBidWYgcGFkO1xuICBicHJpbnRfcHJlY2lzaW9uIGJ1ZiBwcmVjO1xuICBidWZmZXJfYWRkX2NoYXIgYnVmIGM7XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgKGNoYXJfb2ZfaWNvbnYgaWNvbnYpXG5cbigqKiopXG5cbigqIFByaW50IHRoZSBvcHRpb25hbCAnKycsICcgJyBhbmQvb3IgJyMnIGFzc29jaWF0ZWQgdG8gYSBmbG9hdCBjb252ZXJzaW9uLiAqKVxubGV0IGJwcmludF9mY29udl9mbGFnIGJ1ZiBmY29udiA9XG4gIGJlZ2luIG1hdGNoIGZzdCBmY29udiB3aXRoXG4gIHwgRmxvYXRfZmxhZ19wIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJysnXG4gIHwgRmxvYXRfZmxhZ19zIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyAnXG4gIHwgRmxvYXRfZmxhZ18gLT4gKCkgZW5kO1xuICBtYXRjaCBzbmQgZmNvbnYgd2l0aFxuICB8IEZsb2F0X0NGIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyMnXG4gIHwgRmxvYXRfZiB8IEZsb2F0X2UgfCBGbG9hdF9FIHwgRmxvYXRfZyB8IEZsb2F0X0dcbiAgfCBGbG9hdF9GIHwgRmxvYXRfaCB8IEZsb2F0X0ggLT4gKClcblxuKCogUHJpbnQgYSBjb21wbGV0ZSBmbG9hdCBmb3JtYXQgaW4gYSBidWZmZXIgKGV4OiBcIiUrKi4zZlwiKS4gKilcbmxldCBicHJpbnRfZmxvYXRfZm10IGJ1ZiBpZ25fZmxhZyBmY29udiBwYWQgcHJlYyA9XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnO1xuICBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgYnByaW50X2Zjb252X2ZsYWcgYnVmIGZjb252O1xuICBicHJpbnRfcGFkZGluZyBidWYgcGFkO1xuICBicHJpbnRfcHJlY2lzaW9uIGJ1ZiBwcmVjO1xuICBidWZmZXJfYWRkX2NoYXIgYnVmIChjaGFyX29mX2Zjb252IGZjb252KVxuXG4oKiBDb21wdXRlIHRoZSBsaXRlcmFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIEZvcm1hdHRpbmdfbGl0LiAqKVxuKCogVXNlZCBieSBQcmludGYgYW5kIFNjYW5mIHdoZXJlIGZvcm1hdHRpbmcgaXMgbm90IGludGVycHJldGVkLiAqKVxubGV0IHN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCBmb3JtYXR0aW5nX2xpdCA9IG1hdGNoIGZvcm1hdHRpbmdfbGl0IHdpdGhcbiAgfCBDbG9zZV9ib3ggICAgICAgICAgICAtPiBcIkBdXCJcbiAgfCBDbG9zZV90YWcgICAgICAgICAgICAtPiBcIkB9XCJcbiAgfCBCcmVhayAoc3RyLCBfLCBfKSAgICAtPiBzdHJcbiAgfCBGRmx1c2ggICAgICAgICAgICAgICAtPiBcIkA/XCJcbiAgfCBGb3JjZV9uZXdsaW5lICAgICAgICAtPiBcIkBcXG5cIlxuICB8IEZsdXNoX25ld2xpbmUgICAgICAgIC0+IFwiQC5cIlxuICB8IE1hZ2ljX3NpemUgKHN0ciwgXykgIC0+IHN0clxuICB8IEVzY2FwZWRfYXQgICAgICAgICAgIC0+IFwiQEBcIlxuICB8IEVzY2FwZWRfcGVyY2VudCAgICAgIC0+IFwiQCVcIlxuICB8IFNjYW5faW5kaWMgYyAtPiBcIkBcIiBeIChTdHJpbmcubWFrZSAxIGMpXG5cbigqKiopXG5cbigqIFByaW50IGEgbGl0ZXJhbCBjaGFyIGluIGEgYnVmZmVyLCBlc2NhcGUgJyUnIGJ5IFwiJSVcIi4gKilcbmxldCBicHJpbnRfY2hhcl9saXRlcmFsIGJ1ZiBjaHIgPSBtYXRjaCBjaHIgd2l0aFxuICB8ICclJyAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlJVwiXG4gIHwgXyAtPiBidWZmZXJfYWRkX2NoYXIgYnVmIGNoclxuXG4oKiBQcmludCBhIGxpdGVyYWwgc3RyaW5nIGluIGEgYnVmZmVyLCBlc2NhcGUgYWxsICclJyBieSBcIiUlXCIuICopXG5sZXQgYnByaW50X3N0cmluZ19saXRlcmFsIGJ1ZiBzdHIgPVxuICBmb3IgaSA9IDAgdG8gU3RyaW5nLmxlbmd0aCBzdHIgLSAxIGRvXG4gICAgYnByaW50X2NoYXJfbGl0ZXJhbCBidWYgc3RyLltpXVxuICBkb25lXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdCBwcmV0dHktcHJpbnRpbmcgKilcblxuKCogUHJpbnQgYSBjb21wbGV0ZSBmb3JtYXQgdHlwZSAoYW4gZm10dHkpIGluIGEgYnVmZmVyLiAqKVxubGV0IHJlYyBicHJpbnRfZm10dHkgOiB0eXBlIGEgYiBjIGQgZSBmIGcgaCBpIGogayBsIC5cbiAgICBidWZmZXIgLT4gKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpIGZtdHR5X3JlbCAtPiB1bml0ID1cbmZ1biBidWYgZm10dHkgLT4gbWF0Y2ggZm10dHkgd2l0aFxuICB8IENoYXJfdHkgcmVzdCAgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVjXCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgU3RyaW5nX3R5IHJlc3QgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJXNcIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBJbnRfdHkgcmVzdCAgICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlaVwiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IEludDMyX3R5IHJlc3QgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVsaVwiOyBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJW5pXCI7IGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBJbnQ2NF90eSByZXN0ICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlTGlcIjsgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IEZsb2F0X3R5IHJlc3QgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVmXCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgQm9vbF90eSByZXN0ICAgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJUJcIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBBbHBoYV90eSByZXN0ICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlYVwiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IFRoZXRhX3R5IHJlc3QgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiV0XCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgQW55X3R5IHJlc3QgICAgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJT9cIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBSZWFkZXJfdHkgcmVzdCAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlclwiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuXG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgcmVzdCAtPlxuICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVfclwiO1xuICAgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcblxuICB8IEZvcm1hdF9hcmdfdHkgKHN1Yl9mbXR0eSwgcmVzdCkgLT5cbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIle1wiOyBicHJpbnRfZm10dHkgYnVmIHN1Yl9mbXR0eTtcbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlfVwiOyBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgRm9ybWF0X3N1YnN0X3R5IChzdWJfZm10dHksIF8sIHJlc3QpIC0+XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJShcIjsgYnByaW50X2ZtdHR5IGJ1ZiBzdWJfZm10dHk7XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJSlcIjsgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuXG4gIHwgRW5kX29mX2ZtdHR5IC0+ICgpXG5cbigqKiopXG5cbmxldCByZWMgaW50X29mX2N1c3RvbV9hcml0eSA6IHR5cGUgYSBiIGMgLlxuICAoYSwgYiwgYykgY3VzdG9tX2FyaXR5IC0+IGludCA9XG4gIGZ1bmN0aW9uXG4gIHwgQ3VzdG9tX3plcm8gLT4gMFxuICB8IEN1c3RvbV9zdWNjIHggLT4gMSArIGludF9vZl9jdXN0b21fYXJpdHkgeFxuXG4oKiBQcmludCBhIGNvbXBsZXRlIGZvcm1hdCBpbiBhIGJ1ZmZlci4gKilcbmxldCBicHJpbnRfZm10IGJ1ZiBmbXQgPVxuICBsZXQgcmVjIGZtdGl0ZXIgOiB0eXBlIGEgYiBjIGQgZSBmIC5cbiAgICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT4gYm9vbCAtPiB1bml0ID1cbiAgZnVuIGZtdCBpZ25fZmxhZyAtPiBtYXRjaCBmbXQgd2l0aFxuICAgIHwgU3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkZGluZyBidWYgcGFkOyBidWZmZXJfYWRkX2NoYXIgYnVmICdzJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IENhbWxfc3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkZGluZyBidWYgcGFkOyBidWZmZXJfYWRkX2NoYXIgYnVmICdTJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcblxuICAgIHwgSW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2ludF9mbXQgYnVmIGlnbl9mbGFnIGljb252IHBhZCBwcmVjO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgSW50MzIgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgICBicHJpbnRfYWx0aW50X2ZtdCBidWYgaWduX2ZsYWcgaWNvbnYgcGFkIHByZWMgJ2wnO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgTmF0aXZlaW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2FsdGludF9mbXQgYnVmIGlnbl9mbGFnIGljb252IHBhZCBwcmVjICduJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEludDY0IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2FsdGludF9mbXQgYnVmIGlnbl9mbGFnIGljb252IHBhZCBwcmVjICdMJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEZsb2F0IChmY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2Zsb2F0X2ZtdCBidWYgaWduX2ZsYWcgZmNvbnYgcGFkIHByZWM7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG5cbiAgICB8IENoYXIgcmVzdCAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnYyc7IGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IENhbWxfY2hhciByZXN0IC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICdDJzsgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgQm9vbCAocGFkLCByZXN0KSAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnByaW50X3BhZGRpbmcgYnVmIHBhZDsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnQic7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBBbHBoYSByZXN0IC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICdhJzsgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgVGhldGEgcmVzdCAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAndCc7IGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEN1c3RvbSAoYXJpdHksIF8sIHJlc3QpIC0+XG4gICAgICBmb3IgX2kgPSAxIHRvIGludF9vZl9jdXN0b21fYXJpdHkgYXJpdHkgZG9cbiAgICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICc/JztcbiAgICAgIGRvbmU7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBSZWFkZXIgcmVzdCAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAncic7IGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEZsdXNoIHJlc3QgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiUhXCI7XG4gICAgICBmbXRpdGVyIHJlc3QgaWduX2ZsYWc7XG5cbiAgICB8IFN0cmluZ19saXRlcmFsIChzdHIsIHJlc3QpIC0+XG4gICAgICBicHJpbnRfc3RyaW5nX2xpdGVyYWwgYnVmIHN0cjtcbiAgICAgIGZtdGl0ZXIgcmVzdCBpZ25fZmxhZztcbiAgICB8IENoYXJfbGl0ZXJhbCAoY2hyLCByZXN0KSAtPlxuICAgICAgYnByaW50X2NoYXJfbGl0ZXJhbCBidWYgY2hyO1xuICAgICAgZm10aXRlciByZXN0IGlnbl9mbGFnO1xuXG4gICAgfCBGb3JtYXRfYXJnIChwYWRfb3B0LCBmbXR0eSwgcmVzdCkgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJwcmludF9wYWRfb3B0IGJ1ZiBwYWRfb3B0OyBidWZmZXJfYWRkX2NoYXIgYnVmICd7JztcbiAgICAgIGJwcmludF9mbXR0eSBidWYgZm10dHk7IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBidWZmZXJfYWRkX2NoYXIgYnVmICd9JztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEZvcm1hdF9zdWJzdCAocGFkX29wdCwgZm10dHksIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkX29wdCBidWYgcGFkX29wdDsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnKCc7XG4gICAgICBicHJpbnRfZm10dHkgYnVmIGZtdHR5OyBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnKSc7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG5cbiAgICB8IFNjYW5fY2hhcl9zZXQgKHdpZHRoX29wdCwgY2hhcl9zZXQsIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkX29wdCBidWYgd2lkdGhfb3B0OyBicHJpbnRfY2hhcl9zZXQgYnVmIGNoYXJfc2V0O1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgcmVzdCkgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgKGNoYXJfb2ZfY291bnRlciBjb3VudGVyKTtcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IFNjYW5fbmV4dF9jaGFyIHJlc3QgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJwcmludF9zdHJpbmdfbGl0ZXJhbCBidWYgXCIwY1wiOyBmbXRpdGVyIHJlc3QgZmFsc2U7XG5cbiAgICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCkgLT5cbiAgICAgIGxldCBQYXJhbV9mb3JtYXRfRUJCIGZtdCcgPSBwYXJhbV9mb3JtYXRfb2ZfaWdub3JlZF9mb3JtYXQgaWduIHJlc3QgaW5cbiAgICAgIGZtdGl0ZXIgZm10JyB0cnVlO1xuXG4gICAgfCBGb3JtYXR0aW5nX2xpdCAoZm10aW5nX2xpdCwgcmVzdCkgLT5cbiAgICAgIGJwcmludF9zdHJpbmdfbGl0ZXJhbCBidWYgKHN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCBmbXRpbmdfbGl0KTtcbiAgICAgIGZtdGl0ZXIgcmVzdCBpZ25fZmxhZztcbiAgICB8IEZvcm1hdHRpbmdfZ2VuIChmbXRpbmdfZ2VuLCByZXN0KSAtPlxuICAgICAgYmVnaW4gbWF0Y2ggZm10aW5nX2dlbiB3aXRoXG4gICAgICB8IE9wZW5fdGFnIChGb3JtYXQgKF8sIHN0cikpIC0+XG4gICAgICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIkB7XCI7IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBzdHJcbiAgICAgIHwgT3Blbl9ib3ggKEZvcm1hdCAoXywgc3RyKSkgLT5cbiAgICAgICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiQFtcIjsgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIHN0clxuICAgICAgZW5kO1xuICAgICAgZm10aXRlciByZXN0IGlnbl9mbGFnO1xuXG4gICAgfCBFbmRfb2ZfZm9ybWF0IC0+ICgpXG5cbiAgaW4gZm10aXRlciBmbXQgZmFsc2VcblxuKCoqKilcblxuKCogQ29udmVydCBhIGZvcm1hdCB0byBzdHJpbmcuICopXG5sZXQgc3RyaW5nX29mX2ZtdCBmbXQgPVxuICBsZXQgYnVmID0gYnVmZmVyX2NyZWF0ZSAxNiBpblxuICBicHJpbnRfZm10IGJ1ZiBmbXQ7XG4gIGJ1ZmZlcl9jb250ZW50cyBidWZcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCogVHlwZSBleHRyYWN0aW9uICopXG5cbnR5cGUgKF8sIF8pIGVxID0gUmVmbCA6ICgnYSwgJ2EpIGVxXG5cbigqIEludmFyaWFudDogdGhpcyBmdW5jdGlvbiBpcyB0aGUgaWRlbnRpdHkgb24gdmFsdWVzLlxuXG4gICBJbiBwYXJ0aWN1bGFyLCBpZiAodHkxLCB0eTIpIGhhdmUgZXF1YWwgdmFsdWVzLCB0aGVuXG4gICAodHJhbnMgKHN5bW0gdHkxKSB0eTIpIHJlc3BlY3RzIHRoZSAndHJhbnMnIHByZWNvbmRpdGlvbi4gKilcbmxldCByZWMgc3ltbSA6IHR5cGUgYTEgYjEgYzEgZDEgZTEgZjEgYTIgYjIgYzIgZDIgZTIgZjIgLlxuICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEsXG4gICAgYTIsIGIyLCBjMiwgZDIsIGUyLCBmMikgZm10dHlfcmVsXG4tPiAoYTIsIGIyLCBjMiwgZDIsIGUyLCBmMixcbiAgICBhMSwgYjEsIGMxLCBkMSwgZTEsIGYxKSBmbXR0eV9yZWxcbj0gZnVuY3Rpb25cbiAgfCBDaGFyX3R5IHJlc3QgLT4gQ2hhcl90eSAoc3ltbSByZXN0KVxuICB8IEludF90eSByZXN0IC0+IEludF90eSAoc3ltbSByZXN0KVxuICB8IEludDMyX3R5IHJlc3QgLT4gSW50MzJfdHkgKHN5bW0gcmVzdClcbiAgfCBJbnQ2NF90eSByZXN0IC0+IEludDY0X3R5IChzeW1tIHJlc3QpXG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgLT4gTmF0aXZlaW50X3R5IChzeW1tIHJlc3QpXG4gIHwgRmxvYXRfdHkgcmVzdCAtPiBGbG9hdF90eSAoc3ltbSByZXN0KVxuICB8IEJvb2xfdHkgcmVzdCAtPiBCb29sX3R5IChzeW1tIHJlc3QpXG4gIHwgU3RyaW5nX3R5IHJlc3QgLT4gU3RyaW5nX3R5IChzeW1tIHJlc3QpXG4gIHwgVGhldGFfdHkgcmVzdCAtPiBUaGV0YV90eSAoc3ltbSByZXN0KVxuICB8IEFscGhhX3R5IHJlc3QgLT4gQWxwaGFfdHkgKHN5bW0gcmVzdClcbiAgfCBBbnlfdHkgcmVzdCAtPiBBbnlfdHkgKHN5bW0gcmVzdClcbiAgfCBSZWFkZXJfdHkgcmVzdCAtPiBSZWFkZXJfdHkgKHN5bW0gcmVzdClcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSByZXN0IC0+IElnbm9yZWRfcmVhZGVyX3R5IChzeW1tIHJlc3QpXG4gIHwgRm9ybWF0X2FyZ190eSAodHksIHJlc3QpIC0+XG4gICAgRm9ybWF0X2FyZ190eSAodHksIHN5bW0gcmVzdClcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgdHkyLCByZXN0KSAtPlxuICAgIEZvcm1hdF9zdWJzdF90eSAodHkyLCB0eTEsIHN5bW0gcmVzdClcbiAgfCBFbmRfb2ZfZm10dHkgLT4gRW5kX29mX2ZtdHR5XG5cbmxldCByZWMgZm10dHlfcmVsX2RldCA6IHR5cGUgYTEgYiBjIGQxIGUxIGYxIGEyIGQyIGUyIGYyIC5cbiAgKGExLCBiLCBjLCBkMSwgZTEsIGYxLFxuICAgYTIsIGIsIGMsIGQyLCBlMiwgZjIpIGZtdHR5X3JlbCAtPlxuICAgICgoZjEsIGYyKSBlcSAtPiAoYTEsIGEyKSBlcSlcbiAgKiAoKGExLCBhMikgZXEgLT4gKGYxLCBmMikgZXEpXG4gICogKChlMSwgZTIpIGVxIC0+IChkMSwgZDIpIGVxKVxuICAqICgoZDEsIGQyKSBlcSAtPiAoZTEsIGUyKSBlcSlcbj0gZnVuY3Rpb25cbiAgfCBFbmRfb2ZfZm10dHkgLT5cbiAgICAoZnVuIFJlZmwgLT4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gUmVmbClcbiAgfCBDaGFyX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgU3RyaW5nX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgSW50X3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgSW50MzJfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBJbnQ2NF90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IE5hdGl2ZWludF90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IEZsb2F0X3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgQm9vbF90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuXG4gIHwgVGhldGFfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBBbHBoYV90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IEFueV90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IFJlYWRlcl90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGVkIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZGUgUmVmbCBpbiBSZWZsKVxuICB8IElnbm9yZWRfcmVhZGVyX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZWQgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBkZSBSZWZsIGluIFJlZmwpXG4gIHwgRm9ybWF0X2FyZ190eSAoX3R5LCByZXN0KSAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgdHkyLCByZXN0KSAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIGxldCB0eSA9IHRyYW5zIChzeW1tIHR5MSkgdHkyIGluXG4gICAgbGV0IGFnLCBnYSwgZGosIGpkID0gZm10dHlfcmVsX2RldCB0eSBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gbGV0IFJlZmwgPSBhZyBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGdhIFJlZmwgaW4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGVkIFJlZmwgaW4gbGV0IFJlZmwgPSBkaiBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGpkIFJlZmwgaW4gbGV0IFJlZmwgPSBkZSBSZWZsIGluIFJlZmwpXG5cbigqIFByZWNvbmRpdGlvbjogd2UgYXNzdW1lIHRoYXQgdGhlIHR3byBmbXR0eV9yZWwgYXJndW1lbnRzIGhhdmUgZXF1YWxcbiAgIHZhbHVlcyAoYXQgcG9zc2libHkgZGlzdGluY3QgdHlwZXMpOyB0aGlzIGludmFyaWFudCBjb21lcyBmcm9tIHRoZSB3YXlcbiAgIGZtdHR5X3JlbCB3aXRuZXNzZXMgYXJlIHByb2R1Y2VkIGJ5IHRoZSB0eXBlLWNoZWNrZXJcblxuICAgVGhlIGNvZGUgYmVsb3cgdXNlcyAoYXNzZXJ0IGZhbHNlKSB3aGVuIHRoaXMgYXNzdW1wdGlvbiBpcyBicm9rZW4uIFRoZVxuICAgY29kZSBwYXR0ZXJuIGlzIHRoZSBmb2xsb3dpbmc6XG5cbiAgICAgfCBGb28geCwgRm9vIHkgLT5cbiAgICAgICAoKiBjYXNlIHdoZXJlIGluZGVlZCBib3RoIHZhbHVlc1xuICAgICAgICAgIHN0YXJ0IHdpdGggY29uc3RydWN0b3IgRm9vICopXG4gICAgIHwgRm9vIF8sIF9cbiAgICAgfCBfLCBGb28gXyAtPlxuICAgICAgICgqIGRpZmZlcmVudCBoZWFkIGNvbnN0cnVjdG9yczogYnJva2VuIHByZWNvbmRpdGlvbiAqKVxuICAgICAgIGFzc2VydCBmYWxzZVxuKilcbmFuZCB0cmFucyA6IHR5cGVcbiAgYTEgYjEgYzEgZDEgZTEgZjFcbiAgYTIgYjIgYzIgZDIgZTIgZjJcbiAgYTMgYjMgYzMgZDMgZTMgZjNcbi5cbiAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxLFxuICAgIGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdHR5X3JlbFxuLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIsXG4gICAgYTMsIGIzLCBjMywgZDMsIGUzLCBmMykgZm10dHlfcmVsXG4tPiAoYTEsIGIxLCBjMSwgZDEsIGUxLCBmMSxcbiAgICBhMywgYjMsIGMzLCBkMywgZTMsIGYzKSBmbXR0eV9yZWxcbj0gZnVuIHR5MSB0eTIgLT4gbWF0Y2ggdHkxLCB0eTIgd2l0aFxuICB8IENoYXJfdHkgcmVzdDEsIENoYXJfdHkgcmVzdDIgLT4gQ2hhcl90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgU3RyaW5nX3R5IHJlc3QxLCBTdHJpbmdfdHkgcmVzdDIgLT4gU3RyaW5nX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBCb29sX3R5IHJlc3QxLCBCb29sX3R5IHJlc3QyIC0+IEJvb2xfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEludF90eSByZXN0MSwgSW50X3R5IHJlc3QyIC0+IEludF90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgSW50MzJfdHkgcmVzdDEsIEludDMyX3R5IHJlc3QyIC0+IEludDMyX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBJbnQ2NF90eSByZXN0MSwgSW50NjRfdHkgcmVzdDIgLT4gSW50NjRfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IE5hdGl2ZWludF90eSByZXN0MSwgTmF0aXZlaW50X3R5IHJlc3QyIC0+IE5hdGl2ZWludF90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgRmxvYXRfdHkgcmVzdDEsIEZsb2F0X3R5IHJlc3QyIC0+IEZsb2F0X3R5ICh0cmFucyByZXN0MSByZXN0MilcblxuICB8IEFscGhhX3R5IHJlc3QxLCBBbHBoYV90eSByZXN0MiAtPiBBbHBoYV90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgQWxwaGFfdHkgXywgXyAtPiBhc3NlcnQgZmFsc2VcbiAgfCBfLCBBbHBoYV90eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgVGhldGFfdHkgcmVzdDEsIFRoZXRhX3R5IHJlc3QyIC0+IFRoZXRhX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBUaGV0YV90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIFRoZXRhX3R5IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbiAgfCBBbnlfdHkgcmVzdDEsIEFueV90eSByZXN0MiAtPiBBbnlfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEFueV90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIEFueV90eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgUmVhZGVyX3R5IHJlc3QxLCBSZWFkZXJfdHkgcmVzdDIgLT4gUmVhZGVyX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBSZWFkZXJfdHkgXywgXyAtPiBhc3NlcnQgZmFsc2VcbiAgfCBfLCBSZWFkZXJfdHkgXyAtPiBhc3NlcnQgZmFsc2VcblxuICB8IElnbm9yZWRfcmVhZGVyX3R5IHJlc3QxLCBJZ25vcmVkX3JlYWRlcl90eSByZXN0MiAtPlxuICAgIElnbm9yZWRfcmVhZGVyX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIElnbm9yZWRfcmVhZGVyX3R5IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbiAgfCBGb3JtYXRfYXJnX3R5ICh0eTEsIHJlc3QxKSwgRm9ybWF0X2FyZ190eSAodHkyLCByZXN0MikgLT5cbiAgICBGb3JtYXRfYXJnX3R5ICh0cmFucyB0eTEgdHkyLCB0cmFucyByZXN0MSByZXN0MilcbiAgfCBGb3JtYXRfYXJnX3R5IF8sIF8gLT4gYXNzZXJ0IGZhbHNlXG4gIHwgXywgRm9ybWF0X2FyZ190eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgRm9ybWF0X3N1YnN0X3R5ICh0eTExLCB0eTEyLCByZXN0MSksXG4gICAgRm9ybWF0X3N1YnN0X3R5ICh0eTIxLCB0eTIyLCByZXN0MikgLT5cbiAgICBsZXQgdHkgPSB0cmFucyAoc3ltbSB0eTEyKSB0eTIxIGluXG4gICAgbGV0IF8sIGYyLCBfLCBmNCA9IGZtdHR5X3JlbF9kZXQgdHkgaW5cbiAgICBsZXQgUmVmbCA9IGYyIFJlZmwgaW5cbiAgICBsZXQgUmVmbCA9IGY0IFJlZmwgaW5cbiAgICBGb3JtYXRfc3Vic3RfdHkgKHR5MTEsIHR5MjIsIHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEZvcm1hdF9zdWJzdF90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIEZvcm1hdF9zdWJzdF90eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgRW5kX29mX2ZtdHR5LCBFbmRfb2ZfZm10dHkgLT4gRW5kX29mX2ZtdHR5XG4gIHwgRW5kX29mX2ZtdHR5LCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIEVuZF9vZl9mbXR0eSAtPiBhc3NlcnQgZmFsc2VcblxubGV0IHJlYyBmbXR0eV9vZl9mb3JtYXR0aW5nX2dlbiA6IHR5cGUgYSBiIGMgZCBlIGYgLlxuICAoYSwgYiwgYywgZCwgZSwgZikgZm9ybWF0dGluZ19nZW4gLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgPVxuZnVuIGZvcm1hdHRpbmdfZ2VuIC0+IG1hdGNoIGZvcm1hdHRpbmdfZ2VuIHdpdGhcbiAgfCBPcGVuX3RhZyAoRm9ybWF0IChmbXQsIF8pKSAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgT3Blbl9ib3ggKEZvcm1hdCAoZm10LCBfKSkgLT4gZm10dHlfb2ZfZm10IGZtdFxuXG4oKiBFeHRyYWN0IHRoZSB0eXBlIHJlcHJlc2VudGF0aW9uIChhbiBmbXR0eSkgb2YgYSBmb3JtYXQuICopXG5hbmQgZm10dHlfb2ZfZm10IDogdHlwZSBhIGIgYyBkIGUgZiAuXG4gIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5ID1cbmZ1biBmbXR0eSAtPiBtYXRjaCBmbXR0eSB3aXRoXG4gIHwgU3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgKFN0cmluZ190eSAoZm10dHlfb2ZfZm10IHJlc3QpKVxuICB8IENhbWxfc3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgKFN0cmluZ190eSAoZm10dHlfb2ZfZm10IHJlc3QpKVxuXG4gIHwgSW50IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IHR5X3Jlc3QgPSBmbXR0eV9vZl9mbXQgcmVzdCBpblxuICAgIGxldCBwcmVjX3R5ID0gZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IHByZWMgKEludF90eSB0eV9yZXN0KSBpblxuICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIHByZWNfdHlcbiAgfCBJbnQzMiAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIGxldCB0eV9yZXN0ID0gZm10dHlfb2ZfZm10IHJlc3QgaW5cbiAgICBsZXQgcHJlY190eSA9IGZtdHR5X29mX3ByZWNpc2lvbl9mbXR0eSBwcmVjIChJbnQzMl90eSB0eV9yZXN0KSBpblxuICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIHByZWNfdHlcbiAgfCBOYXRpdmVpbnQgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBsZXQgdHlfcmVzdCA9IGZtdHR5X29mX2ZtdCByZXN0IGluXG4gICAgbGV0IHByZWNfdHkgPSBmbXR0eV9vZl9wcmVjaXNpb25fZm10dHkgcHJlYyAoTmF0aXZlaW50X3R5IHR5X3Jlc3QpIGluXG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgcHJlY190eVxuICB8IEludDY0IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IHR5X3Jlc3QgPSBmbXR0eV9vZl9mbXQgcmVzdCBpblxuICAgIGxldCBwcmVjX3R5ID0gZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IHByZWMgKEludDY0X3R5IHR5X3Jlc3QpIGluXG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgcHJlY190eVxuICB8IEZsb2F0IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IHR5X3Jlc3QgPSBmbXR0eV9vZl9mbXQgcmVzdCBpblxuICAgIGxldCBwcmVjX3R5ID0gZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IHByZWMgKEZsb2F0X3R5IHR5X3Jlc3QpIGluXG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgcHJlY190eVxuXG4gIHwgQ2hhciByZXN0ICAgICAgICAgICAgICAgICAgLT4gQ2hhcl90eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgQ2FtbF9jaGFyIHJlc3QgICAgICAgICAgICAgLT4gQ2hhcl90eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgQm9vbCAocGFkLCByZXN0KSAgICAgICAgICAgLT5cbiAgICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIChCb29sX3R5IChmbXR0eV9vZl9mbXQgcmVzdCkpXG4gIHwgQWxwaGEgcmVzdCAgICAgICAgICAgICAgICAgLT4gQWxwaGFfdHkgKGZtdHR5X29mX2ZtdCByZXN0KVxuICB8IFRoZXRhIHJlc3QgICAgICAgICAgICAgICAgIC0+IFRoZXRhX3R5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBDdXN0b20gKGFyaXR5LCBfLCByZXN0KSAgICAtPiBmbXR0eV9vZl9jdXN0b20gYXJpdHkgKGZtdHR5X29mX2ZtdCByZXN0KVxuICB8IFJlYWRlciByZXN0ICAgICAgICAgICAgICAgIC0+IFJlYWRlcl90eSAoZm10dHlfb2ZfZm10IHJlc3QpXG5cbiAgfCBGb3JtYXRfYXJnIChfLCB0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfYXJnX3R5ICh0eSwgZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgRm9ybWF0X3N1YnN0IChfLCB0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfc3Vic3RfdHkgKHR5LCB0eSwgZm10dHlfb2ZfZm10IHJlc3QpXG5cbiAgfCBGbHVzaCByZXN0ICAgICAgICAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgcmVzdFxuICB8IFN0cmluZ19saXRlcmFsIChfLCByZXN0KSAgIC0+IGZtdHR5X29mX2ZtdCByZXN0XG4gIHwgQ2hhcl9saXRlcmFsIChfLCByZXN0KSAgICAgLT4gZm10dHlfb2ZfZm10IHJlc3RcblxuICB8IFNjYW5fY2hhcl9zZXQgKF8sIF8sIHJlc3QpIC0+IFN0cmluZ190eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgU2Nhbl9nZXRfY291bnRlciAoXywgcmVzdCkgLT4gSW50X3R5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBTY2FuX25leHRfY2hhciByZXN0ICAgICAgICAtPiBDaGFyX3R5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpICAtPiBmbXR0eV9vZl9pZ25vcmVkX2Zvcm1hdCBpZ24gcmVzdFxuICB8IEZvcm1hdHRpbmdfbGl0IChfLCByZXN0KSAgIC0+IGZtdHR5X29mX2ZtdCByZXN0XG4gIHwgRm9ybWF0dGluZ19nZW4gKGZtdGluZ19nZW4sIHJlc3QpICAtPlxuICAgIGNvbmNhdF9mbXR0eSAoZm10dHlfb2ZfZm9ybWF0dGluZ19nZW4gZm10aW5nX2dlbikgKGZtdHR5X29mX2ZtdCByZXN0KVxuXG4gIHwgRW5kX29mX2Zvcm1hdCAgICAgICAgICAgICAgLT4gRW5kX29mX2ZtdHR5XG5cbmFuZCBmbXR0eV9vZl9jdXN0b20gOiB0eXBlIHggeSBhIGIgYyBkIGUgZiAuXG4gIChhLCB4LCB5KSBjdXN0b21fYXJpdHkgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+XG4gICh5LCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG5mdW4gYXJpdHkgZm10dHkgLT4gbWF0Y2ggYXJpdHkgd2l0aFxuICB8IEN1c3RvbV96ZXJvIC0+IGZtdHR5XG4gIHwgQ3VzdG9tX3N1Y2MgYXJpdHkgLT4gQW55X3R5IChmbXR0eV9vZl9jdXN0b20gYXJpdHkgZm10dHkpXG5cbigqIEV4dHJhY3QgdGhlIGZtdHR5IG9mIGFuIGlnbm9yZWQgcGFyYW1ldGVyIGZvbGxvd2VkIGJ5IHRoZSByZXN0IG9mXG4gICB0aGUgZm9ybWF0LiAqKVxuYW5kIGZtdHR5X29mX2lnbm9yZWRfZm9ybWF0IDogdHlwZSB4IHkgYSBiIGMgZCBlIGYgLlxuICAgIChhLCBiLCBjLCBkLCB5LCB4KSBpZ25vcmVkIC0+XG4gICAgKHgsIGIsIGMsIHksIGUsIGYpIGZtdCAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG5mdW4gaWduIGZtdCAtPiBtYXRjaCBpZ24gd2l0aFxuICB8IElnbm9yZWRfY2hhciAgICAgICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfY2FtbF9jaGFyICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfc3RyaW5nIF8gICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfY2FtbF9zdHJpbmcgXyAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfaW50IChfLCBfKSAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfaW50MzIgKF8sIF8pICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfbmF0aXZlaW50IChfLCBfKSAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfaW50NjQgKF8sIF8pICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfZmxvYXQgKF8sIF8pICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfYm9vbCBfICAgICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfZm9ybWF0X2FyZyBfICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfZm9ybWF0X3N1YnN0IChfLCBmbXR0eSkgLT4gY29uY2F0X2ZtdHR5IGZtdHR5IChmbXR0eV9vZl9mbXQgZm10KVxuICB8IElnbm9yZWRfcmVhZGVyICAgICAgICAgICAgICAgICAgLT4gSWdub3JlZF9yZWFkZXJfdHkgKGZtdHR5X29mX2ZtdCBmbXQpXG4gIHwgSWdub3JlZF9zY2FuX2NoYXJfc2V0IF8gICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIF8gICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9zY2FuX25leHRfY2hhciAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG5cbigqIEFkZCBhbiBJbnRfdHkgbm9kZSBpZiBwYWRkaW5nIGlzIHRha2VuIGFzIGFuIGV4dHJhIGFyZ3VtZW50IChleDogXCIlKnNcIikuICopXG5hbmQgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSA6IHR5cGUgeCBhIGIgYyBkIGUgZiAuXG4gICAgKHgsIGEpIHBhZGRpbmcgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+ICh4LCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG4gIGZ1biBwYWQgZm10dHkgLT4gbWF0Y2ggcGFkIHdpdGhcbiAgICB8IE5vX3BhZGRpbmcgICAgLT4gZm10dHlcbiAgICB8IExpdF9wYWRkaW5nIF8gLT4gZm10dHlcbiAgICB8IEFyZ19wYWRkaW5nIF8gLT4gSW50X3R5IGZtdHR5XG5cbigqIEFkZCBhbiBJbnRfdHkgbm9kZSBpZiBwcmVjaXNpb24gaXMgdGFrZW4gYXMgYW4gZXh0cmEgYXJndW1lbnQgKGV4OiBcIiUuKmZcIikuKilcbmFuZCBmbXR0eV9vZl9wcmVjaXNpb25fZm10dHkgOiB0eXBlIHggYSBiIGMgZCBlIGYgLlxuICAgICh4LCBhKSBwcmVjaXNpb24gLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+ICh4LCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG4gIGZ1biBwcmVjIGZtdHR5IC0+IG1hdGNoIHByZWMgd2l0aFxuICAgIHwgTm9fcHJlY2lzaW9uICAgIC0+IGZtdHR5XG4gICAgfCBMaXRfcHJlY2lzaW9uIF8gLT4gZm10dHlcbiAgICB8IEFyZ19wcmVjaXNpb24gICAtPiBJbnRfdHkgZm10dHlcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBGb3JtYXQgdHlwaW5nICopXG5cbigqIEV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhIGZvcm1hdCBkb2VzIG5vdCBtYXRjaCBhIGdpdmVuIGZvcm1hdCB0eXBlLiAqKVxuZXhjZXB0aW9uIFR5cGVfbWlzbWF0Y2hcblxuKCogVHlwZSBhIHBhZGRpbmcuICopXG4oKiBUYWtlIGFuIEludF90eSBmcm9tIHRoZSBmbXR0eSBpZiB0aGUgaW50ZWdlciBzaG91bGQgYmUga2VwdCBhcyBhcmd1bWVudC4gKilcbigqIFJhaXNlIFR5cGVfbWlzbWF0Y2ggaW4gY2FzZSBvZiB0eXBlIG1pc21hdGNoLiAqKVxubGV0IHR5cGVfcGFkZGluZyA6IHR5cGUgYSBiIGMgZCBlIGYgeCB5IC5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgLT5cbiAgICAgIChhLCBiLCBjLCBkLCBlLCBmKSBwYWRkaW5nX2ZtdHR5X2ViYiA9XG5mdW4gcGFkIGZtdHR5IC0+IG1hdGNoIHBhZCwgZm10dHkgd2l0aFxuICB8IE5vX3BhZGRpbmcsIF8gLT4gUGFkZGluZ19mbXR0eV9FQkIgKE5vX3BhZGRpbmcsIGZtdHR5KVxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgdyksIF8gLT4gUGFkZGluZ19mbXR0eV9FQkIgKExpdF9wYWRkaW5nIChwYWR0eSx3KSxmbXR0eSlcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgSW50X3R5IHJlc3QgLT4gUGFkZGluZ19mbXR0eV9FQkIgKEFyZ19wYWRkaW5nIHBhZHR5LHJlc3QpXG4gIHwgXyAtPiByYWlzZSBUeXBlX21pc21hdGNoXG5cbigqIENvbnZlcnQgYSAodXBhZGRpbmcsIHVwcmVjaXNpb24pIHRvIGEgKHBhZGRpbmcsIHByZWNpc2lvbikuICopXG4oKiBUYWtlIG9uZSBvciB0d28gSW50X3R5IGZyb20gdGhlIGZtdHR5IGlmIG5lZWRlZC4gKilcbigqIFJhaXNlIFR5cGVfbWlzbWF0Y2ggaW4gY2FzZSBvZiB0eXBlIG1pc21hdGNoLiAqKVxubGV0IHR5cGVfcGFkcHJlYyA6IHR5cGUgYSBiIGMgZCBlIGYgeCB5IHogLlxuICAoeCwgeSkgcGFkZGluZyAtPiAoeSwgeikgcHJlY2lzaW9uIC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBwYWRwcmVjX2ZtdHR5X2ViYiA9XG5mdW4gcGFkIHByZWMgZm10dHkgLT4gbWF0Y2ggcHJlYywgdHlwZV9wYWRkaW5nIHBhZCBmbXR0eSB3aXRoXG4gIHwgTm9fcHJlY2lzaW9uLCBQYWRkaW5nX2ZtdHR5X0VCQiAocGFkLCByZXN0KSAtPlxuICAgIFBhZHByZWNfZm10dHlfRUJCIChwYWQsIE5vX3ByZWNpc2lvbiwgcmVzdClcbiAgfCBMaXRfcHJlY2lzaW9uIHAsIFBhZGRpbmdfZm10dHlfRUJCIChwYWQsIHJlc3QpIC0+XG4gICAgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgTGl0X3ByZWNpc2lvbiBwLCByZXN0KVxuICB8IEFyZ19wcmVjaXNpb24sIFBhZGRpbmdfZm10dHlfRUJCIChwYWQsIEludF90eSByZXN0KSAtPlxuICAgIFBhZHByZWNfZm10dHlfRUJCIChwYWQsIEFyZ19wcmVjaXNpb24sIHJlc3QpXG4gIHwgXywgUGFkZGluZ19mbXR0eV9FQkIgKF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcblxuKCogVHlwZSBhIGZvcm1hdCBhY2NvcmRpbmcgdG8gYW4gZm10dHkuICopXG4oKiBJZiB0eXBpbmcgc3VjY2VlZCwgZ2VuZXJhdGUgYSBjb3B5IG9mIHRoZSBmb3JtYXQgd2l0aCB0aGUgc2FtZVxuICAgIHR5cGUgcGFyYW1ldGVycyBhcyB0aGUgZm10dHkuICopXG4oKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluIGNhc2Ugb2YgdHlwZSBtaXNtYXRjaC4gKilcbmxldCByZWMgdHlwZV9mb3JtYXQgOlxuICB0eXBlIGExIGIxIGMxIGQxIGUxIGYxXG4gICAgICAgYTIgYjIgYzIgZDIgZTIgZjIgIC5cbiAgICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEpIGZtdFxuICAtPiAoYTIsIGIyLCBjMiwgZDIsIGUyLCBmMikgZm10dHlcbiAgLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdFxuPSBmdW4gZm10IGZtdHR5IC0+IG1hdGNoIHR5cGVfZm9ybWF0X2dlbiBmbXQgZm10dHkgd2l0aFxuICB8IEZtdF9mbXR0eV9FQkIgKGZtdCcsIEVuZF9vZl9mbXR0eSkgLT4gZm10J1xuICB8IF8gLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuXG5hbmQgdHlwZV9mb3JtYXRfZ2VuIDpcbiAgdHlwZSBhMSBiMSBjMSBkMSBlMSBmMVxuICAgICAgIGEyIGIyIGMyIGQyIGUyIGYyICAuXG4gICAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxKSBmbXRcbiAgLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdHR5XG4gIC0+IChhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXRfZm10dHlfZWJiXG49IGZ1biBmbXQgZm10dHkgLT4gbWF0Y2ggZm10LCBmbXR0eSB3aXRoXG4gIHwgQ2hhciBmbXRfcmVzdCwgQ2hhcl90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKENoYXIgZm10JywgZm10dHknKVxuICB8IENhbWxfY2hhciBmbXRfcmVzdCwgQ2hhcl90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKENhbWxfY2hhciBmbXQnLCBmbXR0eScpXG4gIHwgU3RyaW5nIChwYWQsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRkaW5nIHBhZCBmbXR0eSB3aXRoXG4gICAgfCBQYWRkaW5nX2ZtdHR5X0VCQiAocGFkLCBTdHJpbmdfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKFN0cmluZyAocGFkLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkZGluZ19mbXR0eV9FQkIgKF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IENhbWxfc3RyaW5nIChwYWQsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRkaW5nIHBhZCBmbXR0eSB3aXRoXG4gICAgfCBQYWRkaW5nX2ZtdHR5X0VCQiAocGFkLCBTdHJpbmdfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKENhbWxfc3RyaW5nIChwYWQsIGZtdCcpLCBmbXR0eScpXG4gICAgfCBQYWRkaW5nX2ZtdHR5X0VCQiAoXywgXykgLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG4gIHwgSW50IChpY29udiwgcGFkLCBwcmVjLCBmbXRfcmVzdCksIF8gLT4gKFxuICAgIG1hdGNoIHR5cGVfcGFkcHJlYyBwYWQgcHJlYyBmbXR0eSB3aXRoXG4gICAgfCBQYWRwcmVjX2ZtdHR5X0VCQiAocGFkLCBwcmVjLCBJbnRfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEludCAoaWNvbnYsIHBhZCwgcHJlYywgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChfLCBfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBJbnQzMiAoaWNvbnYsIHBhZCwgcHJlYywgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZHByZWMgcGFkIHByZWMgZm10dHkgd2l0aFxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgcHJlYywgSW50MzJfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEludDMyIChpY29udiwgcGFkLCBwcmVjLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKF8sIF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IE5hdGl2ZWludCAoaWNvbnYsIHBhZCwgcHJlYywgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZHByZWMgcGFkIHByZWMgZm10dHkgd2l0aFxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgcHJlYywgTmF0aXZlaW50X3R5IGZtdHR5X3Jlc3QpIC0+XG4gICAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChOYXRpdmVpbnQgKGljb252LCBwYWQsIHByZWMsIGZtdCcpLCBmbXR0eScpXG4gICAgfCBQYWRwcmVjX2ZtdHR5X0VCQiAoXywgXywgXykgLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG4gIHwgSW50NjQgKGljb252LCBwYWQsIHByZWMsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRwcmVjIHBhZCBwcmVjIGZtdHR5IHdpdGhcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChwYWQsIHByZWMsIEludDY0X3R5IGZtdHR5X3Jlc3QpIC0+XG4gICAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChfLCBfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBGbG9hdCAoZmNvbnYsIHBhZCwgcHJlYywgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZHByZWMgcGFkIHByZWMgZm10dHkgd2l0aFxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgcHJlYywgRmxvYXRfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEZsb2F0IChmY29udiwgcGFkLCBwcmVjLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKF8sIF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IEJvb2wgKHBhZCwgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZGRpbmcgcGFkIGZtdHR5IHdpdGhcbiAgICB8IFBhZGRpbmdfZm10dHlfRUJCIChwYWQsIEJvb2xfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEJvb2wgKHBhZCwgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZGRpbmdfZm10dHlfRUJCIChfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBGbHVzaCBmbXRfcmVzdCwgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChGbHVzaCBmbXQnLCBmbXR0eScpXG5cbiAgfCBTdHJpbmdfbGl0ZXJhbCAoc3RyLCBmbXRfcmVzdCksIGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoU3RyaW5nX2xpdGVyYWwgKHN0ciwgZm10JyksIGZtdHR5JylcbiAgfCBDaGFyX2xpdGVyYWwgKGNociwgZm10X3Jlc3QpLCBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKENoYXJfbGl0ZXJhbCAoY2hyLCBmbXQnKSwgZm10dHknKVxuXG4gIHwgRm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5LCBmbXRfcmVzdCksXG4gICAgRm9ybWF0X2FyZ190eSAoc3ViX2ZtdHR5JywgZm10dHlfcmVzdCkgLT5cbiAgICBpZiBGbXR0eV9FQkIgc3ViX2ZtdHR5IDw+IEZtdHR5X0VCQiBzdWJfZm10dHknIHRoZW4gcmFpc2UgVHlwZV9taXNtYXRjaDtcbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoRm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5JywgZm10JyksIGZtdHR5JylcbiAgfCBGb3JtYXRfc3Vic3QgKHBhZF9vcHQsIHN1Yl9mbXR0eSwgZm10X3Jlc3QpLFxuICAgIEZvcm1hdF9zdWJzdF90eSAoc3ViX2ZtdHR5MSwgX3N1Yl9mbXR0eTIsIGZtdHR5X3Jlc3QpIC0+XG4gICAgaWYgRm10dHlfRUJCIChlcmFzZV9yZWwgc3ViX2ZtdHR5KSA8PiBGbXR0eV9FQkIgKGVyYXNlX3JlbCBzdWJfZm10dHkxKSB0aGVuXG4gICAgICByYWlzZSBUeXBlX21pc21hdGNoO1xuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID1cbiAgICAgIHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCAoZXJhc2VfcmVsIGZtdHR5X3Jlc3QpXG4gICAgaW5cbiAgICBGbXRfZm10dHlfRUJCIChGb3JtYXRfc3Vic3QgKHBhZF9vcHQsIHN1Yl9mbXR0eTEsIGZtdCcpLCBmbXR0eScpXG4gICgqIFByaW50ZiBhbmQgRm9ybWF0IHNwZWNpZmljIGNvbnN0cnVjdG9yczogKilcbiAgfCBBbHBoYSBmbXRfcmVzdCwgQWxwaGFfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChBbHBoYSBmbXQnLCBmbXR0eScpXG4gIHwgVGhldGEgZm10X3Jlc3QsIFRoZXRhX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoVGhldGEgZm10JywgZm10dHknKVxuXG4gICgqIEZvcm1hdCBzcGVjaWZpYyBjb25zdHJ1Y3RvcnM6ICopXG4gIHwgRm9ybWF0dGluZ19saXQgKGZvcm1hdHRpbmdfbGl0LCBmbXRfcmVzdCksIGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoRm9ybWF0dGluZ19saXQgKGZvcm1hdHRpbmdfbGl0LCBmbXQnKSwgZm10dHknKVxuICB8IEZvcm1hdHRpbmdfZ2VuIChmb3JtYXR0aW5nX2dlbiwgZm10X3Jlc3QpLCBmbXR0eV9yZXN0IC0+XG4gICAgdHlwZV9mb3JtYXR0aW5nX2dlbiBmb3JtYXR0aW5nX2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0XG5cbiAgKCogU2NhbmYgc3BlY2lmaWMgY29uc3RydWN0b3JzOiAqKVxuICB8IFJlYWRlciBmbXRfcmVzdCwgUmVhZGVyX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoUmVhZGVyIGZtdCcsIGZtdHR5JylcbiAgfCBTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCBmbXRfcmVzdCksIFN0cmluZ190eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKFNjYW5fY2hhcl9zZXQgKHdpZHRoX29wdCwgY2hhcl9zZXQsIGZtdCcpLCBmbXR0eScpXG4gIHwgU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgZm10X3Jlc3QpLCBJbnRfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCBmbXQnKSwgZm10dHknKVxuICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCksIGZtdHR5X3Jlc3QgLT5cbiAgICB0eXBlX2lnbm9yZWRfcGFyYW0gaWduIHJlc3QgZm10dHlfcmVzdFxuXG4gIHwgRW5kX29mX2Zvcm1hdCwgZm10dHlfcmVzdCAtPiBGbXRfZm10dHlfRUJCIChFbmRfb2ZfZm9ybWF0LCBmbXR0eV9yZXN0KVxuXG4gIHwgXyAtPiByYWlzZSBUeXBlX21pc21hdGNoXG5cbmFuZCB0eXBlX2Zvcm1hdHRpbmdfZ2VuIDogdHlwZSBhMSBhMyBiMSBiMyBjMSBjMyBkMSBkMyBlMSBlMiBlMyBmMSBmMiBmMyAuXG4gICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEpIGZvcm1hdHRpbmdfZ2VuIC0+XG4gICAgKGYxLCBiMSwgYzEsIGUxLCBlMiwgZjIpIGZtdCAtPlxuICAgIChhMywgYjMsIGMzLCBkMywgZTMsIGYzKSBmbXR0eSAtPlxuICAgIChhMywgYjMsIGMzLCBkMywgZTMsIGYzKSBmbXRfZm10dHlfZWJiID1cbmZ1biBmb3JtYXR0aW5nX2dlbiBmbXQwIGZtdHR5MCAtPiBtYXRjaCBmb3JtYXR0aW5nX2dlbiB3aXRoXG4gIHwgT3Blbl90YWcgKEZvcm1hdCAoZm10MSwgc3RyKSkgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10MiwgZm10dHkyKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXQxIGZtdHR5MCBpblxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQzLCBmbXR0eTMpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdDAgZm10dHkyIGluXG4gICAgRm10X2ZtdHR5X0VCQiAoRm9ybWF0dGluZ19nZW4gKE9wZW5fdGFnIChGb3JtYXQgKGZtdDIsIHN0cikpLCBmbXQzKSwgZm10dHkzKVxuICB8IE9wZW5fYm94IChGb3JtYXQgKGZtdDEsIHN0cikpIC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdDIsIGZtdHR5MikgPSB0eXBlX2Zvcm1hdF9nZW4gZm10MSBmbXR0eTAgaW5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10MywgZm10dHkzKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXQwIGZtdHR5MiBpblxuICAgIEZtdF9mbXR0eV9FQkIgKEZvcm1hdHRpbmdfZ2VuIChPcGVuX2JveCAoRm9ybWF0IChmbXQyLCBzdHIpKSwgZm10MyksIGZtdHR5MylcblxuKCogVHlwZSBhbiBJZ25vcmVkX3BhcmFtIG5vZGUgYWNjb3JkaW5nIHRvIGFuIGZtdHR5LiAqKVxuYW5kIHR5cGVfaWdub3JlZF9wYXJhbSA6IHR5cGUgcCBxIHggeSB6IHQgdSB2IGEgYiBjIGQgZSBmIC5cbiAgICAoeCwgeSwgeiwgdCwgcSwgcCkgaWdub3JlZCAtPlxuICAgIChwLCB5LCB6LCBxLCB1LCB2KSBmbXQgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10X2ZtdHR5X2ViYiA9XG5mdW4gaWduIGZtdCBmbXR0eSAtPiBtYXRjaCBpZ24gd2l0aFxuICB8IElnbm9yZWRfY2hhciAgICAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfY2FtbF9jaGFyICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc3RyaW5nIF8gICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfY2FtbF9zdHJpbmcgXyAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfaW50IF8gICAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfaW50MzIgXyAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfbmF0aXZlaW50IF8gICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfaW50NjQgXyAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfZmxvYXQgXyAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfYm9vbCBfICAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc2Nhbl9jaGFyX3NldCBfICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciBfIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc2Nhbl9uZXh0X2NoYXIgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfZm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5KSAtPlxuICAgIHR5cGVfaWdub3JlZF9wYXJhbV9vbmUgKElnbm9yZWRfZm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5KSkgZm10IGZtdHR5XG4gIHwgSWdub3JlZF9mb3JtYXRfc3Vic3QgKHBhZF9vcHQsIHN1Yl9mbXR0eSkgLT5cbiAgICBsZXQgRm10dHlfZm10X0VCQiAoc3ViX2ZtdHR5JywgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSkgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5IGZtdCBmbXR0eSBpblxuICAgIEZtdF9mbXR0eV9FQkIgKElnbm9yZWRfcGFyYW0gKElnbm9yZWRfZm9ybWF0X3N1YnN0IChwYWRfb3B0LCBzdWJfZm10dHknKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQnKSxcbiAgICAgICAgICAgICAgICAgICBmbXR0eScpXG4gIHwgSWdub3JlZF9yZWFkZXIgLT4gKFxuICAgIG1hdGNoIGZtdHR5IHdpdGhcbiAgICB8IElnbm9yZWRfcmVhZGVyX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChJZ25vcmVkX3BhcmFtIChJZ25vcmVkX3JlYWRlciwgZm10JyksIGZtdHR5JylcbiAgICB8IF8gLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG5cbmFuZCB0eXBlX2lnbm9yZWRfcGFyYW1fb25lIDogdHlwZSBhMSBhMiBiMSBiMiBjMSBjMiBkMSBkMiBlMSBlMiBmMSBmMiAuXG4gICAgKGEyLCBiMiwgYzIsIGQyLCBkMiwgYTIpIGlnbm9yZWQgLT5cbiAgICAoYTEsIGIxLCBjMSwgZDEsIGUxLCBmMSkgZm10IC0+XG4gICAgKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdHR5IC0+XG4gICAgKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdF9mbXR0eV9lYmJcbj0gZnVuIGlnbiBmbXQgZm10dHkgLT5cbiAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10IGZtdHR5IGluXG4gIEZtdF9mbXR0eV9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbiwgZm10JyksIGZtdHR5JylcblxuKCogVHlwaW5nIG9mIHRoZSBjb21wbGV4IGNhc2U6IFwiJV8oLi4uJSlcIi4gKilcbmFuZCB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiA6IHR5cGUgdyB4IHkgeiBwIHMgdCB1IGEgYiBjIGQgZSBmIC5cbiAgICAodywgeCwgeSwgeiwgcywgcCkgZm10dHkgLT5cbiAgICAocCwgeCwgeSwgcywgdCwgdSkgZm10IC0+XG4gICAgKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eV9mbXRfZWJiID1cbmZ1biBzdWJfZm10dHkgZm10IGZtdHR5IC0+IG1hdGNoIHN1Yl9mbXR0eSwgZm10dHkgd2l0aFxuICB8IENoYXJfdHkgc3ViX2ZtdHR5X3Jlc3QsIENoYXJfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoQ2hhcl90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgU3RyaW5nX3R5IHN1Yl9mbXR0eV9yZXN0LCBTdHJpbmdfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoU3RyaW5nX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBJbnRfdHkgc3ViX2ZtdHR5X3Jlc3QsIEludF90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChJbnRfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IEludDMyX3R5IHN1Yl9mbXR0eV9yZXN0LCBJbnQzMl90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChJbnQzMl90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgTmF0aXZlaW50X3R5IHN1Yl9mbXR0eV9yZXN0LCBOYXRpdmVpbnRfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoTmF0aXZlaW50X3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBJbnQ2NF90eSBzdWJfZm10dHlfcmVzdCwgSW50NjRfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoSW50NjRfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IEZsb2F0X3R5IHN1Yl9mbXR0eV9yZXN0LCBGbG9hdF90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChGbG9hdF90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgQm9vbF90eSBzdWJfZm10dHlfcmVzdCwgQm9vbF90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChCb29sX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBBbHBoYV90eSBzdWJfZm10dHlfcmVzdCwgQWxwaGFfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoQWxwaGFfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IFRoZXRhX3R5IHN1Yl9mbXR0eV9yZXN0LCBUaGV0YV90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChUaGV0YV90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgUmVhZGVyX3R5IHN1Yl9mbXR0eV9yZXN0LCBSZWFkZXJfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoUmVhZGVyX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSBzdWJfZm10dHlfcmVzdCwgSWdub3JlZF9yZWFkZXJfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoSWdub3JlZF9yZWFkZXJfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuXG4gIHwgRm9ybWF0X2FyZ190eSAoc3ViMl9mbXR0eSwgc3ViX2ZtdHR5X3Jlc3QpLFxuICAgIEZvcm1hdF9hcmdfdHkgKHN1YjJfZm10dHknLCBmbXR0eV9yZXN0KSAtPlxuICAgIGlmIEZtdHR5X0VCQiBzdWIyX2ZtdHR5IDw+IEZtdHR5X0VCQiBzdWIyX2ZtdHR5JyB0aGVuIHJhaXNlIFR5cGVfbWlzbWF0Y2g7XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChGb3JtYXRfYXJnX3R5IChzdWIyX2ZtdHR5Jywgc3ViX2ZtdHR5X3Jlc3QnKSwgZm10JylcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHN1YjFfZm10dHksICBzdWIyX2ZtdHR5LCAgc3ViX2ZtdHR5X3Jlc3QpLFxuICAgIEZvcm1hdF9zdWJzdF90eSAoc3ViMV9mbXR0eScsIHN1YjJfZm10dHknLCBmbXR0eV9yZXN0KSAtPlxuICAgICgqIFRPRE8gZGVmaW5lIEZtdHR5X3JlbF9FQkIgdG8gcmVtb3ZlIHRob3NlIGVyYXNlX3JlbCAqKVxuICAgIGlmIEZtdHR5X0VCQiAoZXJhc2VfcmVsIHN1YjFfZm10dHkpIDw+IEZtdHR5X0VCQiAoZXJhc2VfcmVsIHN1YjFfZm10dHknKVxuICAgIHRoZW4gcmFpc2UgVHlwZV9taXNtYXRjaDtcbiAgICBpZiBGbXR0eV9FQkIgKGVyYXNlX3JlbCBzdWIyX2ZtdHR5KSA8PiBGbXR0eV9FQkIgKGVyYXNlX3JlbCBzdWIyX2ZtdHR5JylcbiAgICB0aGVuIHJhaXNlIFR5cGVfbWlzbWF0Y2g7XG4gICAgbGV0IHN1Yl9mbXR0eScgPSB0cmFucyAoc3ltbSBzdWIxX2ZtdHR5Jykgc3ViMl9mbXR0eScgaW5cbiAgICBsZXQgXywgZjIsIF8sIGY0ID0gZm10dHlfcmVsX2RldCBzdWJfZm10dHknIGluXG4gICAgbGV0IFJlZmwgPSBmMiBSZWZsIGluXG4gICAgbGV0IFJlZmwgPSBmNCBSZWZsIGluXG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gKGVyYXNlX3JlbCBzdWJfZm10dHlfcmVzdCkgZm10IGZtdHR5X3Jlc3RcbiAgICBpblxuICAgIEZtdHR5X2ZtdF9FQkIgKEZvcm1hdF9zdWJzdF90eSAoc3ViMV9mbXR0eScsIHN1YjJfZm10dHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltbSBzdWJfZm10dHlfcmVzdCcpLFxuICAgICAgICAgICAgICAgICAgIGZtdCcpXG4gIHwgRW5kX29mX2ZtdHR5LCBmbXR0eSAtPlxuICAgIEZtdHR5X2ZtdF9FQkIgKEVuZF9vZl9mbXR0eSwgdHlwZV9mb3JtYXRfZ2VuIGZtdCBmbXR0eSlcbiAgfCBfIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcblxuKCogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBgcmVjYXN0YCBpcyBhIGJpdCBkaXNhcHBvaW50aW5nLiBUaGVcbiAgIGludmFyaWFudCBwcm92aWRlZCBieSB0aGUgdHlwZSBhcmUgdmVyeSBzdHJvbmc6IHRoZSBpbnB1dCBmb3JtYXQnc1xuICAgdHlwZSBpcyBpbiByZWxhdGlvbiB0byB0aGUgb3V0cHV0IHR5cGUncyBhcyB3aXRuZXNzZWQgYnkgdGhlXG4gICBmbXR0eV9yZWwgYXJndW1lbnQuIE9uZSB3b3VsZCBhdCBmaXJzdCBleHBlY3QgdGhpcyBmdW5jdGlvbiB0byBiZVxuICAgdG90YWwsIGFuZCBpbXBsZW1lbnRhYmxlIGJ5IGV4aGF1c3RpdmUgcGF0dGVybiBtYXRjaGluZy4gSW5zdGVhZCxcbiAgIHdlIHJldXNlIHRoZSBoaWdobHkgcGFydGlhbCBhbmQgbXVjaCBsZXNzIHdlbGwtZGVmaW5lZCBmdW5jdGlvblxuICAgYHR5cGVfZm9ybWF0YCB0aGF0IGhhcyBsb3N0IGFsbCBrbm93bGVkZ2Ugb2YgdGhlIGNvcnJlc3BvbmRlbmNlXG4gICBiZXR3ZWVuIHRoZSBhcmd1bWVudCdzIHR5cGVzLlxuXG4gICBCZXNpZGVzIHRoZSBmYWN0IHRoYXQgdGhpcyBmdW5jdGlvbiByZXVzZXMgYSBsb3Qgb2YgdGhlXG4gICBgdHlwZV9mb3JtYXRgIGxvZ2ljIChlZy46IHNlZWluZyBJbnRfdHkgaW4gdGhlIGZtdHR5IHBhcmFtZXRlciBkb2VzXG4gICBub3QgbGV0IHlvdSBtYXRjaCBvbiBJbnQgb25seSwgYXMgeW91IG1heSBpbiBmYWN0IGhhdmUgRmxvYXRcbiAgIChBcmdfcGFkZGluZywgLi4uKSAoXCIlLipkXCIpIGJlZ2lubmluZyB3aXRoIGFuIEludF90eSksIGl0IGlzIGFsc29cbiAgIGEgcGFydGlhbCBmdW5jdGlvbiwgYmVjYXVzZSB0aGUgdHlwaW5nIGluZm9ybWF0aW9uIGluIGEgZm9ybWF0IGlzXG4gICBub3QgcXVpdGUgZW5vdWdoIHRvIHJlY29uc3RydWN0IGl0IHVuYW1iaWd1b3VzbHkuIEZvciBleGFtcGxlLCB0aGVcbiAgIGZvcm1hdCB0eXBlcyBvZiBcIiVkJV9yXCIgYW5kIFwiJV9yJWRcIiBoYXZlIHRoZSBzYW1lIGZvcm1hdDZcbiAgIHBhcmFtZXRlcnMsIGJ1dCB0aGV5IGFyZSBub3QgYXQgYWxsIGV4Y2hhbmdlYWJsZSwgYW5kIHB1dHRpbmcgb25lXG4gICBpbiBwbGFjZSBvZiB0aGUgb3RoZXIgbXVzdCByZXN1bHQgaW4gYSBkeW5hbWljIGZhaWx1cmUuXG5cbiAgIEdpdmVuIHRoYXQ6XG4gICAtIHdlJ2QgaGF2ZSB0byBkdXBsaWNhdGUgYSBsb3Qgb2Ygbm9uLXRyaXZpYWwgdHlwaW5nIGxvZ2ljIGZyb20gdHlwZV9mb3JtYXRcbiAgIC0gdGhpcyB3b3VsZG4ndCBldmVuIGVsaW1pbmF0ZSAoYWxsKSB0aGUgZHluYW1pYyBmYWlsdXJlc1xuICAgd2UgZGVjaWRlZCB0byBqdXN0IHJldXNlIHR5cGVfZm9ybWF0IGRpcmVjdGx5IGZvciBub3cuXG4qKVxubGV0IHJlY2FzdCA6XG4gIHR5cGUgYTEgYjEgYzEgZDEgZTEgZjFcbiAgICAgICBhMiBiMiBjMiBkMiBlMiBmMlxuICAuXG4gICAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxKSBmbXRcbiAgLT4gKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEsXG4gICAgICBhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXR0eV9yZWxcbiAgLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdFxuPSBmdW4gZm10IGZtdHR5IC0+XG4gIHR5cGVfZm9ybWF0IGZtdCAoZXJhc2VfcmVsIChzeW1tIGZtdHR5KSlcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogUHJpbnRpbmcgdG9vbHMgKilcblxuKCogQWRkIHBhZGRpbmcgc3BhY2VzIGFyb3VuZCBhIHN0cmluZy4gKilcbmxldCBmaXhfcGFkZGluZyBwYWR0eSB3aWR0aCBzdHIgPVxuICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgbGV0IHdpZHRoLCBwYWR0eSA9XG4gICAgYWJzIHdpZHRoLFxuICAgICgqIHdoaWxlIGxpdGVyYWwgcGFkZGluZyB3aWR0aHMgYXJlIGFsd2F5cyBub24tbmVnYXRpdmUsXG4gICAgICAgZHluYW1pY2FsbHktc2V0IHdpZHRocyAoQXJnX3BhZGRpbmcsIGVnLiAlKmQpIG1heSBiZSBuZWdhdGl2ZTtcbiAgICAgICB3ZSBpbnRlcnByZXQgdGhvc2UgYXMgc3BlY2lmeWluZyBhIHBhZGRpbmctdG8tdGhlLWxlZnQ7IHRoaXNcbiAgICAgICBtZWFucyB0aGF0ICcwJyBtYXkgZ2V0IGRyb3BwZWQgZXZlbiBpZiBpdCB3YXMgZXhwbGljaXRseSBzZXQsXG4gICAgICAgYnV0OlxuICAgICAgIC0gdGhpcyBpcyB3aGF0IHRoZSBsZWdhY3kgaW1wbGVtZW50YXRpb24gZG9lcywgYW5kXG4gICAgICAgICB3ZSBwcmVzZXJ2ZSBjb21wYXRpYmlsaXR5IGlmIHBvc3NpYmxlXG4gICAgICAgLSB3ZSBjb3VsZCBvbmx5IHNpZ25hbCB0aGlzIGlzc3VlIGJ5IGZhaWxpbmcgYXQgcnVudGltZSxcbiAgICAgICAgIHdoaWNoIGlzIG5vdCB2ZXJ5IG5pY2UuLi4gKilcbiAgICBpZiB3aWR0aCA8IDAgdGhlbiBMZWZ0IGVsc2UgcGFkdHkgaW5cbiAgaWYgd2lkdGggPD0gbGVuIHRoZW4gc3RyIGVsc2VcbiAgICBsZXQgcmVzID0gQnl0ZXMubWFrZSB3aWR0aCAoaWYgcGFkdHkgPSBaZXJvcyB0aGVuICcwJyBlbHNlICcgJykgaW5cbiAgICBiZWdpbiBtYXRjaCBwYWR0eSB3aXRoXG4gICAgfCBMZWZ0ICAtPiBTdHJpbmcuYmxpdCBzdHIgMCByZXMgMCBsZW5cbiAgICB8IFJpZ2h0IC0+IFN0cmluZy5ibGl0IHN0ciAwIHJlcyAod2lkdGggLSBsZW4pIGxlblxuICAgIHwgWmVyb3Mgd2hlbiBsZW4gPiAwICYmIChzdHIuWzBdID0gJysnIHx8IHN0ci5bMF0gPSAnLScgfHwgc3RyLlswXSA9ICcgJykgLT5cbiAgICAgIEJ5dGVzLnNldCByZXMgMCBzdHIuWzBdO1xuICAgICAgU3RyaW5nLmJsaXQgc3RyIDEgcmVzICh3aWR0aCAtIGxlbiArIDEpIChsZW4gLSAxKVxuICAgIHwgWmVyb3Mgd2hlbiBsZW4gPiAxICYmIHN0ci5bMF0gPSAnMCcgJiYgKHN0ci5bMV0gPSAneCcgfHwgc3RyLlsxXSA9ICdYJykgLT5cbiAgICAgIEJ5dGVzLnNldCByZXMgMSBzdHIuWzFdO1xuICAgICAgU3RyaW5nLmJsaXQgc3RyIDIgcmVzICh3aWR0aCAtIGxlbiArIDIpIChsZW4gLSAyKVxuICAgIHwgWmVyb3MgLT5cbiAgICAgIFN0cmluZy5ibGl0IHN0ciAwIHJlcyAod2lkdGggLSBsZW4pIGxlblxuICAgIGVuZDtcbiAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc1xuXG4oKiBBZGQgJzAnIHBhZGRpbmcgdG8gaW50LCBpbnQzMiwgbmF0aXZlaW50IG9yIGludDY0IHN0cmluZyByZXByZXNlbnRhdGlvbi4gKilcbmxldCBmaXhfaW50X3ByZWNpc2lvbiBwcmVjIHN0ciA9XG4gIGxldCBwcmVjID0gYWJzIHByZWMgaW5cbiAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggc3RyIGluXG4gIG1hdGNoIHN0ci5bMF0gd2l0aFxuICB8ICgnKycgfCAnLScgfCAnICcpIGFzIGMgd2hlbiBwcmVjICsgMSA+IGxlbiAtPlxuICAgIGxldCByZXMgPSBCeXRlcy5tYWtlIChwcmVjICsgMSkgJzAnIGluXG4gICAgQnl0ZXMuc2V0IHJlcyAwIGM7XG4gICAgU3RyaW5nLmJsaXQgc3RyIDEgcmVzIChwcmVjIC0gbGVuICsgMikgKGxlbiAtIDEpO1xuICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzXG4gIHwgJzAnIHdoZW4gcHJlYyArIDIgPiBsZW4gJiYgbGVuID4gMSAmJiAoc3RyLlsxXSA9ICd4JyB8fCBzdHIuWzFdID0gJ1gnKSAtPlxuICAgIGxldCByZXMgPSBCeXRlcy5tYWtlIChwcmVjICsgMikgJzAnIGluXG4gICAgQnl0ZXMuc2V0IHJlcyAxIHN0ci5bMV07XG4gICAgU3RyaW5nLmJsaXQgc3RyIDIgcmVzIChwcmVjIC0gbGVuICsgNCkgKGxlbiAtIDIpO1xuICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzXG4gIHwgJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIHdoZW4gcHJlYyA+IGxlbiAtPlxuICAgIGxldCByZXMgPSBCeXRlcy5tYWtlIHByZWMgJzAnIGluXG4gICAgU3RyaW5nLmJsaXQgc3RyIDAgcmVzIChwcmVjIC0gbGVuKSBsZW47XG4gICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyByZXNcbiAgfCBfIC0+XG4gICAgc3RyXG5cbigqIEVzY2FwZSBhIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIE9DYW1sIGxleGluZyBjb252ZW50aW9uLiAqKVxubGV0IHN0cmluZ190b19jYW1sX3N0cmluZyBzdHIgPVxuICBsZXQgc3RyID0gU3RyaW5nLmVzY2FwZWQgc3RyIGluXG4gIGxldCBsID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgbGV0IHJlcyA9IEJ5dGVzLm1ha2UgKGwgKyAyKSAnXFxcIicgaW5cbiAgU3RyaW5nLnVuc2FmZV9ibGl0IHN0ciAwIHJlcyAxIGw7XG4gIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzXG5cbigqIEdlbmVyYXRlIHRoZSBmb3JtYXRfaW50L2ludDMyL25hdGl2ZWludC9pbnQ2NCBmaXJzdCBhcmd1bWVudFxuICAgZnJvbSBhbiBpbnRfY29udi4gKilcbmxldCBmb3JtYXRfb2ZfaWNvbnYgPSBmdW5jdGlvblxuICB8IEludF9kIHwgSW50X0NkIC0+IFwiJWRcIiB8IEludF9wZCAtPiBcIiUrZFwiIHwgSW50X3NkIC0+IFwiJSBkXCJcbiAgfCBJbnRfaSB8IEludF9DaSAtPiBcIiVpXCIgfCBJbnRfcGkgLT4gXCIlK2lcIiB8IEludF9zaSAtPiBcIiUgaVwiXG4gIHwgSW50X3ggLT4gXCIleFwiIHwgSW50X0N4IC0+IFwiJSN4XCJcbiAgfCBJbnRfWCAtPiBcIiVYXCIgfCBJbnRfQ1ggLT4gXCIlI1hcIlxuICB8IEludF9vIC0+IFwiJW9cIiB8IEludF9DbyAtPiBcIiUjb1wiXG4gIHwgSW50X3UgfCBJbnRfQ3UgLT4gXCIldVwiXG5cbmxldCBmb3JtYXRfb2ZfaWNvbnZMID0gZnVuY3Rpb25cbiAgfCBJbnRfZCB8IEludF9DZCAtPiBcIiVMZFwiIHwgSW50X3BkIC0+IFwiJStMZFwiIHwgSW50X3NkIC0+IFwiJSBMZFwiXG4gIHwgSW50X2kgfCBJbnRfQ2kgLT4gXCIlTGlcIiB8IEludF9waSAtPiBcIiUrTGlcIiB8IEludF9zaSAtPiBcIiUgTGlcIlxuICB8IEludF94IC0+IFwiJUx4XCIgfCBJbnRfQ3ggLT4gXCIlI0x4XCJcbiAgfCBJbnRfWCAtPiBcIiVMWFwiIHwgSW50X0NYIC0+IFwiJSNMWFwiXG4gIHwgSW50X28gLT4gXCIlTG9cIiB8IEludF9DbyAtPiBcIiUjTG9cIlxuICB8IEludF91IHwgSW50X0N1IC0+IFwiJUx1XCJcblxubGV0IGZvcm1hdF9vZl9pY29udmwgPSBmdW5jdGlvblxuICB8IEludF9kIHwgSW50X0NkIC0+IFwiJWxkXCIgfCBJbnRfcGQgLT4gXCIlK2xkXCIgfCBJbnRfc2QgLT4gXCIlIGxkXCJcbiAgfCBJbnRfaSB8IEludF9DaSAtPiBcIiVsaVwiIHwgSW50X3BpIC0+IFwiJStsaVwiIHwgSW50X3NpIC0+IFwiJSBsaVwiXG4gIHwgSW50X3ggLT4gXCIlbHhcIiB8IEludF9DeCAtPiBcIiUjbHhcIlxuICB8IEludF9YIC0+IFwiJWxYXCIgfCBJbnRfQ1ggLT4gXCIlI2xYXCJcbiAgfCBJbnRfbyAtPiBcIiVsb1wiIHwgSW50X0NvIC0+IFwiJSNsb1wiXG4gIHwgSW50X3UgfCBJbnRfQ3UgLT4gXCIlbHVcIlxuXG5sZXQgZm9ybWF0X29mX2ljb252biA9IGZ1bmN0aW9uXG4gIHwgSW50X2QgfCBJbnRfQ2QgLT4gXCIlbmRcIiB8IEludF9wZCAtPiBcIiUrbmRcIiB8IEludF9zZCAtPiBcIiUgbmRcIlxuICB8IEludF9pIHwgSW50X0NpIC0+IFwiJW5pXCIgfCBJbnRfcGkgLT4gXCIlK25pXCIgfCBJbnRfc2kgLT4gXCIlIG5pXCJcbiAgfCBJbnRfeCAtPiBcIiVueFwiIHwgSW50X0N4IC0+IFwiJSNueFwiXG4gIHwgSW50X1ggLT4gXCIlblhcIiB8IEludF9DWCAtPiBcIiUjblhcIlxuICB8IEludF9vIC0+IFwiJW5vXCIgfCBJbnRfQ28gLT4gXCIlI25vXCJcbiAgfCBJbnRfdSB8IEludF9DdSAtPiBcIiVudVwiXG5cbigqIEdlbmVyYXRlIHRoZSBmb3JtYXRfZmxvYXQgZmlyc3QgYXJndW1lbnQgZnJvbSBhIGZsb2F0X2NvbnYuICopXG5sZXQgZm9ybWF0X29mX2Zjb252IGZjb252IHByZWMgPVxuICAgIGxldCBwcmVjID0gYWJzIHByZWMgaW5cbiAgICBsZXQgc3ltYiA9IGNoYXJfb2ZfZmNvbnYgfmNGOidnJyBmY29udiBpblxuICAgIGxldCBidWYgPSBidWZmZXJfY3JlYXRlIDE2IGluXG4gICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7XG4gICAgYnByaW50X2Zjb252X2ZsYWcgYnVmIGZjb252O1xuICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJy4nO1xuICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiAoSW50LnRvX3N0cmluZyBwcmVjKTtcbiAgICBidWZmZXJfYWRkX2NoYXIgYnVmIHN5bWI7XG4gICAgYnVmZmVyX2NvbnRlbnRzIGJ1ZlxuXG5sZXQgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgcyA9XG4gIG1hdGNoIGljb252IHdpdGhcbiAgfCBJbnRfQ2QgfCBJbnRfQ2kgfCBJbnRfQ3UgLT5cbiAgICBsZXQgZGlnaXRzID1cbiAgICAgIGxldCBuID0gcmVmIDAgaW5cbiAgICAgIGZvciBpID0gMCB0byBTdHJpbmcubGVuZ3RoIHMgLSAxIGRvXG4gICAgICAgIG1hdGNoIFN0cmluZy51bnNhZmVfZ2V0IHMgaSB3aXRoXG4gICAgICAgIHwgJzAnLi4nOScgLT4gaW5jciBuXG4gICAgICAgIHwgXyAtPiAoKVxuICAgICAgZG9uZTtcbiAgICAgICFuXG4gICAgaW5cbiAgICBsZXQgYnVmID0gQnl0ZXMuY3JlYXRlIChTdHJpbmcubGVuZ3RoIHMgKyAoZGlnaXRzIC0gMSkgLyAzKSBpblxuICAgIGxldCBwb3MgPSByZWYgMCBpblxuICAgIGxldCBwdXQgYyA9IEJ5dGVzLnNldCBidWYgIXBvcyBjOyBpbmNyIHBvcyBpblxuICAgIGxldCBsZWZ0ID0gcmVmICgoZGlnaXRzIC0gMSkgbW9kIDMgKyAxKSBpblxuICAgIGZvciBpID0gMCB0byBTdHJpbmcubGVuZ3RoIHMgLSAxIGRvXG4gICAgICBtYXRjaCBTdHJpbmcudW5zYWZlX2dldCBzIGkgd2l0aFxuICAgICAgfCAnMCcuLic5JyBhcyBjIC0+XG4gICAgICAgICAgaWYgIWxlZnQgPSAwIHRoZW4gKHB1dCAnXyc7IGxlZnQgOj0gMyk7IGRlY3IgbGVmdDsgcHV0IGNcbiAgICAgIHwgYyAtPiBwdXQgY1xuICAgIGRvbmU7XG4gICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBidWZcbiAgfCBfIC0+IHNcblxuKCogQ29udmVydCBhbiBpbnRlZ2VyIHRvIGEgc3RyaW5nIGFjY29yZGluZyB0byBhIGNvbnZlcnNpb24uICopXG5sZXQgY29udmVydF9pbnQgaWNvbnYgbiA9XG4gIHRyYW5zZm9ybV9pbnRfYWx0IGljb252IChmb3JtYXRfaW50IChmb3JtYXRfb2ZfaWNvbnYgaWNvbnYpIG4pXG5sZXQgY29udmVydF9pbnQzMiBpY29udiBuID1cbiAgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgKGZvcm1hdF9pbnQzMiAoZm9ybWF0X29mX2ljb252bCBpY29udikgbilcbmxldCBjb252ZXJ0X25hdGl2ZWludCBpY29udiBuID1cbiAgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgKGZvcm1hdF9uYXRpdmVpbnQgKGZvcm1hdF9vZl9pY29udm4gaWNvbnYpIG4pXG5sZXQgY29udmVydF9pbnQ2NCBpY29udiBuID1cbiAgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgKGZvcm1hdF9pbnQ2NCAoZm9ybWF0X29mX2ljb252TCBpY29udikgbilcblxuKCogQ29udmVydCBhIGZsb2F0IHRvIHN0cmluZy4gKilcbigqIEZpeCBzcGVjaWFsIGNhc2Ugb2YgXCJPQ2FtbCBmbG9hdCBmb3JtYXRcIi4gKilcbmxldCBjb252ZXJ0X2Zsb2F0IGZjb252IHByZWMgeCA9XG4gIGxldCBoZXggKCkgPVxuICAgIGxldCBzaWduID1cbiAgICAgIG1hdGNoIGZzdCBmY29udiB3aXRoXG4gICAgICB8IEZsb2F0X2ZsYWdfcCAtPiAnKydcbiAgICAgIHwgRmxvYXRfZmxhZ19zIC0+ICcgJ1xuICAgICAgfCBfIC0+ICctJyBpblxuICAgIGhleHN0cmluZ19vZl9mbG9hdCB4IHByZWMgc2lnbiBpblxuICBsZXQgYWRkX2RvdF9pZl9uZWVkZWQgc3RyID1cbiAgICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgICBsZXQgcmVjIGlzX3ZhbGlkIGkgPVxuICAgICAgaWYgaSA9IGxlbiB0aGVuIGZhbHNlIGVsc2VcbiAgICAgICAgbWF0Y2ggc3RyLltpXSB3aXRoXG4gICAgICAgIHwgJy4nIHwgJ2UnIHwgJ0UnIC0+IHRydWVcbiAgICAgICAgfCBfIC0+IGlzX3ZhbGlkIChpICsgMSkgaW5cbiAgICBpZiBpc192YWxpZCAwIHRoZW4gc3RyIGVsc2Ugc3RyIF4gXCIuXCIgaW5cbiAgbGV0IGNhbWxfc3BlY2lhbF92YWwgc3RyID0gbWF0Y2ggY2xhc3NpZnlfZmxvYXQgeCB3aXRoXG4gICAgfCBGUF9ub3JtYWwgfCBGUF9zdWJub3JtYWwgfCBGUF96ZXJvIC0+IHN0clxuICAgIHwgRlBfaW5maW5pdGUgLT4gaWYgeCA8IDAuMCB0aGVuIFwibmVnX2luZmluaXR5XCIgZWxzZSBcImluZmluaXR5XCJcbiAgICB8IEZQX25hbiAtPiBcIm5hblwiIGluXG4gIG1hdGNoIHNuZCBmY29udiB3aXRoXG4gIHwgRmxvYXRfaCAtPiBoZXggKClcbiAgfCBGbG9hdF9IIC0+IFN0cmluZy51cHBlcmNhc2VfYXNjaWkgKGhleCAoKSlcbiAgfCBGbG9hdF9DRiAtPiBjYW1sX3NwZWNpYWxfdmFsIChoZXggKCkpXG4gIHwgRmxvYXRfRiAtPlxuICAgIGxldCBzdHIgPSBmb3JtYXRfZmxvYXQgKGZvcm1hdF9vZl9mY29udiBmY29udiBwcmVjKSB4IGluXG4gICAgY2FtbF9zcGVjaWFsX3ZhbCAoYWRkX2RvdF9pZl9uZWVkZWQgc3RyKVxuICB8IEZsb2F0X2YgfCBGbG9hdF9lIHwgRmxvYXRfRSB8IEZsb2F0X2cgfCBGbG9hdF9HIC0+XG4gICAgZm9ybWF0X2Zsb2F0IChmb3JtYXRfb2ZfZmNvbnYgZmNvbnYgcHJlYykgeFxuXG4oKiBDb252ZXJ0IGEgY2hhciB0byBhIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIE9DYW1sIGxleGljYWwgY29udmVudGlvbi4gKilcbmxldCBmb3JtYXRfY2FtbF9jaGFyIGMgPVxuICBsZXQgc3RyID0gQ2hhci5lc2NhcGVkIGMgaW5cbiAgbGV0IGwgPSBTdHJpbmcubGVuZ3RoIHN0ciBpblxuICBsZXQgcmVzID0gQnl0ZXMubWFrZSAobCArIDIpICdcXCcnIGluXG4gIFN0cmluZy51bnNhZmVfYmxpdCBzdHIgMCByZXMgMSBsO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc1xuXG4oKiBDb252ZXJ0IGEgZm9ybWF0IHR5cGUgdG8gc3RyaW5nICopXG5sZXQgc3RyaW5nX29mX2ZtdHR5IGZtdHR5ID1cbiAgbGV0IGJ1ZiA9IGJ1ZmZlcl9jcmVhdGUgMTYgaW5cbiAgYnByaW50X2ZtdHR5IGJ1ZiBmbXR0eTtcbiAgYnVmZmVyX2NvbnRlbnRzIGJ1ZlxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgKCogR2VuZXJpYyBwcmludGluZyBmdW5jdGlvbiAqKVxuXG4oKiBNYWtlIGEgZ2VuZXJpYyBwcmludGluZyBmdW5jdGlvbi4gKilcbigqIFVzZWQgdG8gZ2VuZXJhdGUgUHJpbnRmIGFuZCBGb3JtYXQgcHJpbnRpbmcgZnVuY3Rpb25zLiAqKVxuKCogUGFyYW1ldGVyczpcbiAgICAgazogYSBjb250aW51YXRpb24gZmluYWxseSBhcHBsaWVkIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGFuZCB0aGUgYWNjdW11bGF0b3IuXG4gICAgIG86IHRoZSBvdXRwdXQgc3RyZWFtIChzZWUgaywgJWEgYW5kICV0KS5cbiAgICAgYWNjOiByZXYgbGlzdCBvZiBwcmludGluZyBlbnRpdGllcyAoc3RyaW5nLCBjaGFyLCBmbHVzaCwgZm9ybWF0dGluZywgLi4uKS5cbiAgICAgZm10OiB0aGUgZm9ybWF0LiAqKVxubGV0IHJlYyBtYWtlX3ByaW50ZiA6IHR5cGUgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+IGEgPVxuZnVuIGsgYWNjIGZtdCAtPiBtYXRjaCBmbXQgd2l0aFxuICB8IENoYXIgcmVzdCAtPlxuICAgIGZ1biBjIC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX2NoYXIgKGFjYywgYykgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgbmV3X2FjYyByZXN0XG4gIHwgQ2FtbF9jaGFyIHJlc3QgLT5cbiAgICBmdW4gYyAtPlxuICAgICAgbGV0IG5ld19hY2MgPSBBY2NfZGF0YV9zdHJpbmcgKGFjYywgZm9ybWF0X2NhbWxfY2hhciBjKSBpblxuICAgICAgbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBTdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBtYWtlX3BhZGRpbmcgayBhY2MgcmVzdCBwYWQgKGZ1biBzdHIgLT4gc3RyKVxuICB8IENhbWxfc3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgbWFrZV9wYWRkaW5nIGsgYWNjIHJlc3QgcGFkIHN0cmluZ190b19jYW1sX3N0cmluZ1xuICB8IEludCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBtYWtlX2ludF9wYWRkaW5nX3ByZWNpc2lvbiBrIGFjYyByZXN0IHBhZCBwcmVjIGNvbnZlcnRfaW50IGljb252XG4gIHwgSW50MzIgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbWFrZV9pbnRfcGFkZGluZ19wcmVjaXNpb24gayBhY2MgcmVzdCBwYWQgcHJlYyBjb252ZXJ0X2ludDMyIGljb252XG4gIHwgTmF0aXZlaW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIG1ha2VfaW50X3BhZGRpbmdfcHJlY2lzaW9uIGsgYWNjIHJlc3QgcGFkIHByZWMgY29udmVydF9uYXRpdmVpbnQgaWNvbnZcbiAgfCBJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBtYWtlX2ludF9wYWRkaW5nX3ByZWNpc2lvbiBrIGFjYyByZXN0IHBhZCBwcmVjIGNvbnZlcnRfaW50NjQgaWNvbnZcbiAgfCBGbG9hdCAoZmNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBtYWtlX2Zsb2F0X3BhZGRpbmdfcHJlY2lzaW9uIGsgYWNjIHJlc3QgcGFkIHByZWMgZmNvbnZcbiAgfCBCb29sIChwYWQsIHJlc3QpIC0+XG4gICAgbWFrZV9wYWRkaW5nIGsgYWNjIHJlc3QgcGFkIHN0cmluZ19vZl9ib29sXG4gIHwgQWxwaGEgcmVzdCAtPlxuICAgIGZ1biBmIHggLT4gbWFrZV9wcmludGYgayAoQWNjX2RlbGF5IChhY2MsIGZ1biBvIC0+IGYgbyB4KSkgcmVzdFxuICB8IFRoZXRhIHJlc3QgLT5cbiAgICBmdW4gZiAtPiBtYWtlX3ByaW50ZiBrIChBY2NfZGVsYXkgKGFjYywgZikpIHJlc3RcbiAgfCBDdXN0b20gKGFyaXR5LCBmLCByZXN0KSAtPlxuICAgIG1ha2VfY3VzdG9tIGsgYWNjIHJlc3QgYXJpdHkgKGYgKCkpXG4gIHwgUmVhZGVyIF8gLT5cbiAgICAoKiBUaGlzIGNhc2UgaXMgaW1wb3NzaWJsZSwgYnkgdHlwaW5nIG9mIGZvcm1hdHMuICopXG4gICAgKCogSW5kZWVkLCBzaW5jZSBwcmludGYgYW5kIGNvLiB0YWtlIGEgZm9ybWF0NCBhcyBhcmd1bWVudCwgdGhlICdkIGFuZCAnZVxuICAgICAgIHR5cGUgcGFyYW1ldGVycyBvZiBmbXQgYXJlIG9idmlvdXNseSBlcXVhbHMuIFRoZSBSZWFkZXIgaXMgdGhlXG4gICAgICAgb25seSBjb25zdHJ1Y3RvciB3aGljaCB0b3VjaCAnZCBhbmQgJ2UgdHlwZSBwYXJhbWV0ZXJzIG9mIHRoZSBmb3JtYXRcbiAgICAgICB0eXBlLCBpdCBhZGRzIGFuICgtPikgdG8gdGhlICdkIHBhcmFtZXRlcnMuIENvbnNlcXVlbnRseSwgYSBmb3JtYXQ0XG4gICAgICAgY2Fubm90IGNvbnRhaW4gYSBSZWFkZXIgbm9kZSwgZXhjZXB0IGluIHRoZSBzdWItZm9ybWF0IGFzc29jaWF0ZWQgdG9cbiAgICAgICBhbiAley4uLiV9LiBJdCdzIG5vdCBhIHByb2JsZW0gYmVjYXVzZSBtYWtlX3ByaW50ZiBkbyBub3QgY2FsbFxuICAgICAgIGl0c2VsZiByZWN1cnNpdmVseSBvbiB0aGUgc3ViLWZvcm1hdCBhc3NvY2lhdGVkIHRvICV7Li4uJX0uICopXG4gICAgYXNzZXJ0IGZhbHNlXG4gIHwgRmx1c2ggcmVzdCAtPlxuICAgIG1ha2VfcHJpbnRmIGsgKEFjY19mbHVzaCBhY2MpIHJlc3RcblxuICB8IFN0cmluZ19saXRlcmFsIChzdHIsIHJlc3QpIC0+XG4gICAgbWFrZV9wcmludGYgayAoQWNjX3N0cmluZ19saXRlcmFsIChhY2MsIHN0cikpIHJlc3RcbiAgfCBDaGFyX2xpdGVyYWwgKGNociwgcmVzdCkgLT5cbiAgICBtYWtlX3ByaW50ZiBrIChBY2NfY2hhcl9saXRlcmFsIChhY2MsIGNocikpIHJlc3RcblxuICB8IEZvcm1hdF9hcmcgKF8sIHN1Yl9mbXR0eSwgcmVzdCkgLT5cbiAgICBsZXQgdHkgPSBzdHJpbmdfb2ZfZm10dHkgc3ViX2ZtdHR5IGluXG4gICAgKGZ1biBzdHIgLT5cbiAgICAgIGlnbm9yZSBzdHI7XG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgdHkpKSByZXN0KVxuICB8IEZvcm1hdF9zdWJzdCAoXywgZm10dHksIHJlc3QpIC0+XG4gICAgZnVuIChGb3JtYXQgKGZtdCwgXykpIC0+IG1ha2VfcHJpbnRmIGsgYWNjXG4gICAgICAoY29uY2F0X2ZtdCAocmVjYXN0IGZtdCBmbXR0eSkgcmVzdClcblxuICB8IFNjYW5fY2hhcl9zZXQgKF8sIF8sIHJlc3QpIC0+XG4gICAgbGV0IG5ld19hY2MgPSBBY2NfaW52YWxpZF9hcmcgKGFjYywgXCJQcmludGY6IGJhZCBjb252ZXJzaW9uICVbXCIpIGluXG4gICAgZnVuIF8gLT4gbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBTY2FuX2dldF9jb3VudGVyIChfLCByZXN0KSAtPlxuICAgICgqIFRoaXMgY2FzZSBzaG91bGQgYmUgcmVmdXNlZCBmb3IgUHJpbnRmLiAqKVxuICAgICgqIEFjY2VwdGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAqKVxuICAgICgqIEludGVycHJldCAlbCwgJW4gYW5kICVMIGFzICV1LiAqKVxuICAgIGZ1biBuIC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX3N0cmluZyAoYWNjLCBmb3JtYXRfaW50IFwiJXVcIiBuKSBpblxuICAgICAgbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBTY2FuX25leHRfY2hhciByZXN0IC0+XG4gICAgZnVuIGMgLT5cbiAgICAgIGxldCBuZXdfYWNjID0gQWNjX2RhdGFfY2hhciAoYWNjLCBjKSBpblxuICAgICAgbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpIC0+XG4gICAgbWFrZV9pZ25vcmVkX3BhcmFtIGsgYWNjIGlnbiByZXN0XG5cbiAgfCBGb3JtYXR0aW5nX2xpdCAoZm10aW5nX2xpdCwgcmVzdCkgLT5cbiAgICBtYWtlX3ByaW50ZiBrIChBY2NfZm9ybWF0dGluZ19saXQgKGFjYywgZm10aW5nX2xpdCkpIHJlc3RcbiAgfCBGb3JtYXR0aW5nX2dlbiAoT3Blbl90YWcgKEZvcm1hdCAoZm10JywgXykpLCByZXN0KSAtPlxuICAgIGxldCBrJyBrYWNjID1cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19mb3JtYXR0aW5nX2dlbiAoYWNjLCBBY2Nfb3Blbl90YWcga2FjYykpIHJlc3QgaW5cbiAgICBtYWtlX3ByaW50ZiBrJyBFbmRfb2ZfYWNjIGZtdCdcbiAgfCBGb3JtYXR0aW5nX2dlbiAoT3Blbl9ib3ggKEZvcm1hdCAoZm10JywgXykpLCByZXN0KSAtPlxuICAgIGxldCBrJyBrYWNjID1cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19mb3JtYXR0aW5nX2dlbiAoYWNjLCBBY2Nfb3Blbl9ib3gga2FjYykpIHJlc3QgaW5cbiAgICBtYWtlX3ByaW50ZiBrJyBFbmRfb2ZfYWNjIGZtdCdcblxuICB8IEVuZF9vZl9mb3JtYXQgLT5cbiAgICBrIGFjY1xuXG4oKiBEZWxheSB0aGUgZXJyb3IgKEludmFsaWRfYXJndW1lbnQgXCJQcmludGY6IGJhZCBjb252ZXJzaW9uICVfXCIpLiAqKVxuKCogR2VuZXJhdGUgZnVuY3Rpb25zIHRvIHRha2UgcmVtYWluaW5nIGFyZ3VtZW50cyAoYWZ0ZXIgdGhlIFwiJV9cIikuICopXG5hbmQgbWFrZV9pZ25vcmVkX3BhcmFtIDogdHlwZSB4IHkgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgeSwgeCkgaWdub3JlZCAtPlxuICAgICh4LCBiLCBjLCB5LCBlLCBmKSBmbXQgLT4gYSA9XG5mdW4gayBhY2MgaWduIGZtdCAtPiBtYXRjaCBpZ24gd2l0aFxuICB8IElnbm9yZWRfY2hhciAgICAgICAgICAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2NhbWxfY2hhciAgICAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9zdHJpbmcgXyAgICAgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfY2FtbF9zdHJpbmcgXyAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2ludCAoXywgXykgICAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9pbnQzMiAoXywgXykgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfbmF0aXZlaW50IChfLCBfKSAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2ludDY0IChfLCBfKSAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9mbG9hdCAoXywgXykgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfYm9vbCBfICAgICAgICAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2Zvcm1hdF9hcmcgXyAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9mb3JtYXRfc3Vic3QgKF8sIGZtdHR5KSAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgZm10dHkgZm10XG4gIHwgSWdub3JlZF9yZWFkZXIgICAgICAgICAgICAgICAgICAtPiBhc3NlcnQgZmFsc2VcbiAgfCBJZ25vcmVkX3NjYW5fY2hhcl9zZXQgXyAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIF8gICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfc2Nhbl9uZXh0X2NoYXIgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcblxuXG4oKiBTcGVjaWFsIGNhc2Ugb2YgcHJpbnRmIFwiJV8oXCIuICopXG5hbmQgbWFrZV9mcm9tX2ZtdHR5IDogdHlwZSB4IHkgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgeSwgeCkgZm10dHkgLT5cbiAgICAoeCwgYiwgYywgeSwgZSwgZikgZm10IC0+IGEgPVxuZnVuIGsgYWNjIGZtdHR5IGZtdCAtPiBtYXRjaCBmbXR0eSB3aXRoXG4gIHwgQ2hhcl90eSByZXN0ICAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgU3RyaW5nX3R5IHJlc3QgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgSW50X3R5IHJlc3QgICAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgSW50MzJfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgSW50NjRfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgRmxvYXRfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgQm9vbF90eSByZXN0ICAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgQWxwaGFfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBUaGV0YV90eSByZXN0ICAgICAgICAgICAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBBbnlfdHkgcmVzdCAgICAgICAgICAgICAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBSZWFkZXJfdHkgXyAgICAgICAgICAgICAtPiBhc3NlcnQgZmFsc2VcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSBfICAgICAtPiBhc3NlcnQgZmFsc2VcbiAgfCBGb3JtYXRfYXJnX3R5IChfLCByZXN0KSAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBFbmRfb2ZfZm10dHkgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTIsIHJlc3QpIC0+XG4gICAgbGV0IHR5ID0gdHJhbnMgKHN5bW0gdHkxKSB0eTIgaW5cbiAgICBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgKGNvbmNhdF9mbXR0eSB0eSByZXN0KSBmbXRcblxuKCogSW5zZXJ0IGFuIEFjY19pbnZhbGlkX2FyZyBpbiB0aGUgYWNjdW11bGF0b3IgYW5kIGNvbnRpbnVlIHRvIGdlbmVyYXRlXG4gICBjbG9zdXJlcyB0byBnZXQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMuICopXG5hbmQgbWFrZV9pbnZhbGlkX2FyZyA6IHR5cGUgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+IGEgPVxuZnVuIGsgYWNjIGZtdCAtPlxuICBtYWtlX3ByaW50ZiBrIChBY2NfaW52YWxpZF9hcmcgKGFjYywgXCJQcmludGY6IGJhZCBjb252ZXJzaW9uICVfXCIpKSBmbXRcblxuKCogRml4IHBhZGRpbmcsIHRha2UgaXQgYXMgYW4gZXh0cmEgaW50ZWdlciBhcmd1bWVudCBpZiBuZWVkZWQuICopXG5hbmQgbWFrZV9wYWRkaW5nIDogdHlwZSB4IHogYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgKHgsIHogLT4gYSkgcGFkZGluZyAtPiAoeiAtPiBzdHJpbmcpIC0+IHggPVxuICBmdW4gayBhY2MgZm10IHBhZCB0cmFucyAtPiBtYXRjaCBwYWQgd2l0aFxuICB8IE5vX3BhZGRpbmcgLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IG5ld19hY2MgPSBBY2NfZGF0YV9zdHJpbmcgKGFjYywgdHJhbnMgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgbmV3X2FjYyBmbXRcbiAgfCBMaXRfcGFkZGluZyAocGFkdHksIHdpZHRoKSAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX3N0cmluZyAoYWNjLCBmaXhfcGFkZGluZyBwYWR0eSB3aWR0aCAodHJhbnMgeCkpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIG5ld19hY2MgZm10XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHkgLT5cbiAgICBmdW4gdyB4IC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX3N0cmluZyAoYWNjLCBmaXhfcGFkZGluZyBwYWR0eSB3ICh0cmFucyB4KSkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgbmV3X2FjYyBmbXRcblxuKCogRml4IHBhZGRpbmcgYW5kIHByZWNpc2lvbiBmb3IgaW50LCBpbnQzMiwgbmF0aXZlaW50IG9yIGludDY0LiAqKVxuKCogVGFrZSBvbmUgb3IgdHdvIGV4dHJhIGludGVnZXIgYXJndW1lbnRzIGlmIG5lZWRlZC4gKilcbmFuZCBtYWtlX2ludF9wYWRkaW5nX3ByZWNpc2lvbiA6IHR5cGUgeCB5IHogYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgKHgsIHkpIHBhZGRpbmcgLT4gKHksIHogLT4gYSkgcHJlY2lzaW9uIC0+IChpbnRfY29udiAtPiB6IC0+IHN0cmluZykgLT5cbiAgICBpbnRfY29udiAtPiB4ID1cbiAgZnVuIGsgYWNjIGZtdCBwYWQgcHJlYyB0cmFucyBpY29udiAtPiBtYXRjaCBwYWQsIHByZWMgd2l0aFxuICB8IE5vX3BhZGRpbmcsIE5vX3ByZWNpc2lvbiAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gdHJhbnMgaWNvbnYgeCBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IE5vX3BhZGRpbmcsIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X2ludF9wcmVjaXNpb24gcCAodHJhbnMgaWNvbnYgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBOb19wYWRkaW5nLCBBcmdfcHJlY2lzaW9uIC0+XG4gICAgZnVuIHAgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9pbnRfcHJlY2lzaW9uIHAgKHRyYW5zIGljb252IHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3KSwgTm9fcHJlY2lzaW9uIC0+XG4gICAgZnVuIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3ICh0cmFucyBpY29udiB4KSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgdyksIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoZml4X2ludF9wcmVjaXNpb24gcCAodHJhbnMgaWNvbnYgeCkpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3KSwgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGZ1biBwIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChmaXhfaW50X3ByZWNpc2lvbiBwICh0cmFucyBpY29udiB4KSkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgTm9fcHJlY2lzaW9uIC0+XG4gICAgZnVuIHcgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgKHRyYW5zIGljb252IHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHksIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB3IHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChmaXhfaW50X3ByZWNpc2lvbiBwICh0cmFucyBpY29udiB4KSkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGZ1biB3IHAgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgKGZpeF9pbnRfcHJlY2lzaW9uIHAgKHRyYW5zIGljb252IHgpKSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuXG4oKiBDb252ZXJ0IGEgZmxvYXQsIGZpeCBwYWRkaW5nIGFuZCBwcmVjaXNpb24gaWYgbmVlZGVkLiAqKVxuKCogVGFrZSB0aGUgZmxvYXQgYXJndW1lbnQgYW5kIG9uZSBvciB0d28gZXh0cmEgaW50ZWdlciBhcmd1bWVudHMgaWYgbmVlZGVkLiAqKVxuYW5kIG1ha2VfZmxvYXRfcGFkZGluZ19wcmVjaXNpb24gOiB0eXBlIHggeSBhIGIgYyBkIGUgZiAuXG4gICAgKChiLCBjKSBhY2MgLT4gZikgLT4gKGIsIGMpIGFjYyAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoeSwgZmxvYXQgLT4gYSkgcHJlY2lzaW9uIC0+IGZsb2F0X2NvbnYgLT4geCA9XG4gIGZ1biBrIGFjYyBmbXQgcGFkIHByZWMgZmNvbnYgLT4gbWF0Y2ggcGFkLCBwcmVjIHdpdGhcbiAgfCBOb19wYWRkaW5nLCBOb19wcmVjaXNpb24gLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IHN0ciA9IGNvbnZlcnRfZmxvYXQgZmNvbnYgKGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252KSB4IGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTm9fcGFkZGluZywgTGl0X3ByZWNpc2lvbiBwIC0+XG4gICAgZnVuIHggLT5cbiAgICAgIGxldCBzdHIgPSBjb252ZXJ0X2Zsb2F0IGZjb252IHAgeCBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IE5vX3BhZGRpbmcsIEFyZ19wcmVjaXNpb24gLT5cbiAgICBmdW4gcCB4IC0+XG4gICAgICBsZXQgc3RyID0gY29udmVydF9mbG9hdCBmY29udiBwIHggaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBMaXRfcGFkZGluZyAocGFkdHksIHcpLCBOb19wcmVjaXNpb24gLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IHN0ciA9IGNvbnZlcnRfZmxvYXQgZmNvbnYgKGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252KSB4IGluXG4gICAgICBsZXQgc3RyJyA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgc3RyIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyJykpIGZtdFxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgdyksIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoY29udmVydF9mbG9hdCBmY29udiBwIHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3KSwgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGZ1biBwIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChjb252ZXJ0X2Zsb2F0IGZjb252IHAgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgTm9fcHJlY2lzaW9uIC0+XG4gICAgZnVuIHcgeCAtPlxuICAgICAgbGV0IHN0ciA9IGNvbnZlcnRfZmxvYXQgZmNvbnYgKGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252KSB4IGluXG4gICAgICBsZXQgc3RyJyA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgc3RyIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyJykpIGZtdFxuICB8IEFyZ19wYWRkaW5nIHBhZHR5LCBMaXRfcHJlY2lzaW9uIHAgLT5cbiAgICBmdW4gdyB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoY29udmVydF9mbG9hdCBmY29udiBwIHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHksIEFyZ19wcmVjaXNpb24gLT5cbiAgICBmdW4gdyBwIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChjb252ZXJ0X2Zsb2F0IGZjb252IHAgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbmFuZCBtYWtlX2N1c3RvbSA6IHR5cGUgeCB5IGEgYiBjIGQgZSBmIC5cbiAgKChiLCBjKSBhY2MgLT4gZikgLT4gKGIsIGMpIGFjYyAtPlxuICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gIChhLCB4LCB5KSBjdXN0b21fYXJpdHkgLT4geCAtPiB5ID1cbiAgZnVuIGsgYWNjIHJlc3QgYXJpdHkgZiAtPiBtYXRjaCBhcml0eSB3aXRoXG4gIHwgQ3VzdG9tX3plcm8gLT4gbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIGYpKSByZXN0XG4gIHwgQ3VzdG9tX3N1Y2MgYXJpdHkgLT5cbiAgICBmdW4geCAtPlxuICAgICAgbWFrZV9jdXN0b20gayBhY2MgcmVzdCBhcml0eSAoZiB4KVxuXG5sZXQgY29uc3QgeCBfID0geFxuXG5sZXQgcmVjIG1ha2VfaXByaW50ZiA6IHR5cGUgYSBiIGMgZCBlIGYgc3RhdGUuXG4gIChzdGF0ZSAtPiBmKSAtPiBzdGF0ZSAtPiAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+IGEgPVxuICBmdW4gayBvIGZtdCAtPiBtYXRjaCBmbXQgd2l0aFxuICAgIHwgQ2hhciByZXN0IC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpXG4gICAgfCBDYW1sX2NoYXIgcmVzdCAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU3RyaW5nIChOb19wYWRkaW5nLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU3RyaW5nIChMaXRfcGFkZGluZyBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU3RyaW5nIChBcmdfcGFkZGluZyBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdCkpXG4gICAgfCBDYW1sX3N0cmluZyAoTm9fcGFkZGluZywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IENhbWxfc3RyaW5nIChMaXRfcGFkZGluZyBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgQ2FtbF9zdHJpbmcgKEFyZ19wYWRkaW5nIF8sIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KSlcbiAgICB8IEludCAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgICBmbl9vZl9wYWRkaW5nX3ByZWNpc2lvbiBrIG8gcmVzdCBwYWQgcHJlY1xuICAgIHwgSW50MzIgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICAgICAgZm5fb2ZfcGFkZGluZ19wcmVjaXNpb24gayBvIHJlc3QgcGFkIHByZWNcbiAgICB8IE5hdGl2ZWludCAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgICBmbl9vZl9wYWRkaW5nX3ByZWNpc2lvbiBrIG8gcmVzdCBwYWQgcHJlY1xuICAgIHwgSW50NjQgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICAgICAgZm5fb2ZfcGFkZGluZ19wcmVjaXNpb24gayBvIHJlc3QgcGFkIHByZWNcbiAgICB8IEZsb2F0IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgICAgIGZuX29mX3BhZGRpbmdfcHJlY2lzaW9uIGsgbyByZXN0IHBhZCBwcmVjXG4gICAgfCBCb29sIChOb19wYWRkaW5nLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgQm9vbCAoTGl0X3BhZGRpbmcgXywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IEJvb2wgKEFyZ19wYWRkaW5nIF8sIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KSlcbiAgICB8IEFscGhhIHJlc3QgLT5cbiAgICAgICAgY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpKVxuICAgIHwgVGhldGEgcmVzdCAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgQ3VzdG9tIChhcml0eSwgXywgcmVzdCkgLT5cbiAgICAgICAgZm5fb2ZfY3VzdG9tX2FyaXR5IGsgbyByZXN0IGFyaXR5XG4gICAgfCBSZWFkZXIgXyAtPlxuICAgICAgICAoKiBUaGlzIGNhc2UgaXMgaW1wb3NzaWJsZSwgYnkgdHlwaW5nIG9mIGZvcm1hdHMuICBTZWUgdGhlXG4gICAgICAgICAgIG5vdGUgaW4gdGhlIGNvcnJlc3BvbmRpbmcgY2FzZSBmb3IgbWFrZV9wcmludGYuICopXG4gICAgICAgIGFzc2VydCBmYWxzZVxuICAgIHwgRmx1c2ggcmVzdCAtPlxuICAgICAgICBtYWtlX2lwcmludGYgayBvIHJlc3RcbiAgICB8IFN0cmluZ19saXRlcmFsIChfLCByZXN0KSAtPlxuICAgICAgICBtYWtlX2lwcmludGYgayBvIHJlc3RcbiAgICB8IENoYXJfbGl0ZXJhbCAoXywgcmVzdCkgLT5cbiAgICAgICAgbWFrZV9pcHJpbnRmIGsgbyByZXN0XG4gICAgfCBGb3JtYXRfYXJnIChfLCBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgRm9ybWF0X3N1YnN0IChfLCBmbXR0eSwgcmVzdCkgLT5cbiAgICAgICAgZnVuIChGb3JtYXQgKGZtdCwgXykpIC0+XG4gICAgICAgICAgbWFrZV9pcHJpbnRmIGsgb1xuICAgICAgICAgICAgKGNvbmNhdF9mbXQgKHJlY2FzdCBmbXQgZm10dHkpIHJlc3QpXG4gICAgfCBTY2FuX2NoYXJfc2V0IChfLCBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU2Nhbl9nZXRfY291bnRlciAoXywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IFNjYW5fbmV4dF9jaGFyIHJlc3QgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCkgLT5cbiAgICAgICAgbWFrZV9pZ25vcmVkX3BhcmFtIChmdW4gXyAtPiBrIG8pIChFbmRfb2ZfYWNjKSBpZ24gcmVzdFxuICAgIHwgRm9ybWF0dGluZ19saXQgKF8sIHJlc3QpIC0+XG4gICAgICAgIG1ha2VfaXByaW50ZiBrIG8gcmVzdFxuICAgIHwgRm9ybWF0dGluZ19nZW4gKE9wZW5fdGFnIChGb3JtYXQgKGZtdCcsIF8pKSwgcmVzdCkgLT5cbiAgICAgICAgbWFrZV9pcHJpbnRmIChmdW4ga29jIC0+IG1ha2VfaXByaW50ZiBrIGtvYyByZXN0KSBvIGZtdCdcbiAgICB8IEZvcm1hdHRpbmdfZ2VuIChPcGVuX2JveCAoRm9ybWF0IChmbXQnLCBfKSksIHJlc3QpIC0+XG4gICAgICAgIG1ha2VfaXByaW50ZiAoZnVuIGtvYyAtPiBtYWtlX2lwcmludGYgayBrb2MgcmVzdCkgbyBmbXQnXG4gICAgfCBFbmRfb2ZfZm9ybWF0IC0+XG4gICAgICAgIGsgb1xuYW5kIGZuX29mX3BhZGRpbmdfcHJlY2lzaW9uIDpcbiAgdHlwZSB4IHkgeiBhIGIgYyBkIGUgZiBzdGF0ZS5cbiAgKHN0YXRlIC0+IGYpIC0+IHN0YXRlIC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT5cbiAgKHgsIHkpIHBhZGRpbmcgLT4gKHksIHogLT4gYSkgcHJlY2lzaW9uIC0+IHggPVxuICBmdW4gayBvIGZtdCBwYWQgcHJlYyAtPiBtYXRjaCBwYWQsIHByZWMgd2l0aFxuICAgIHwgTm9fcGFkZGluZyAgICwgTm9fcHJlY2lzaW9uICAgIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdClcbiAgICB8IE5vX3BhZGRpbmcgICAsIExpdF9wcmVjaXNpb24gXyAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyBmbXQpXG4gICAgfCBOb19wYWRkaW5nICAgLCBBcmdfcHJlY2lzaW9uICAgLT5cbiAgICAgICAgY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdCkpXG4gICAgfCBMaXRfcGFkZGluZyBfLCBOb19wcmVjaXNpb24gICAgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KVxuICAgIHwgTGl0X3BhZGRpbmcgXywgTGl0X3ByZWNpc2lvbiBfIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdClcbiAgICB8IExpdF9wYWRkaW5nIF8sIEFyZ19wcmVjaXNpb24gICAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KSlcbiAgICB8IEFyZ19wYWRkaW5nIF8sIE5vX3ByZWNpc2lvbiAgICAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KSlcbiAgICB8IEFyZ19wYWRkaW5nIF8sIExpdF9wcmVjaXNpb24gXyAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KSlcbiAgICB8IEFyZ19wYWRkaW5nIF8sIEFyZ19wcmVjaXNpb24gICAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdCkpKVxuYW5kIGZuX29mX2N1c3RvbV9hcml0eSA6IHR5cGUgeCB5IGEgYiBjIGQgZSBmIHN0YXRlLlxuICAoc3RhdGUgLT4gZikgLT5cbiAgc3RhdGUgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdCAtPiAoYSwgeCwgeSkgY3VzdG9tX2FyaXR5IC0+IHkgPVxuICBmdW4gayBvIGZtdCAtPiBmdW5jdGlvblxuICAgIHwgQ3VzdG9tX3plcm8gLT5cbiAgICAgICAgbWFrZV9pcHJpbnRmIGsgbyBmbXRcbiAgICB8IEN1c3RvbV9zdWNjIGFyaXR5IC0+XG4gICAgICAgIGNvbnN0IChmbl9vZl9jdXN0b21fYXJpdHkgayBvIGZtdCBhcml0eSlcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQ29udGludWF0aW9ucyBmb3IgbWFrZV9wcmludGYgKilcblxuKCogUmVjdXJzaXZlbHkgb3V0cHV0IGFuIFwiYWNjdW11bGF0b3JcIiBjb250YWluaW5nIGEgcmV2ZXJzZWQgbGlzdCBvZlxuICAgcHJpbnRpbmcgZW50aXRpZXMgKHN0cmluZywgY2hhciwgZmx1cywgLi4uKSBpbiBhbiBvdXRwdXRfc3RyZWFtLiAqKVxuKCogVXNlZCBhcyBhIGNvbnRpbnVhdGlvbiBvZiBtYWtlX3ByaW50Zi4gKilcbmxldCByZWMgb3V0cHV0X2FjYyBvIGFjYyA9IG1hdGNoIGFjYyB3aXRoXG4gIHwgQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBmbXRpbmdfbGl0KSAtPlxuICAgIGxldCBzID0gc3RyaW5nX29mX2Zvcm1hdHRpbmdfbGl0IGZtdGluZ19saXQgaW5cbiAgICBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIHM7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl90YWcgYWNjJykgLT5cbiAgICBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIFwiQHtcIjsgb3V0cHV0X2FjYyBvIGFjYyc7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl9ib3ggYWNjJykgLT5cbiAgICBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIFwiQFtcIjsgb3V0cHV0X2FjYyBvIGFjYyc7XG4gIHwgQWNjX3N0cmluZ19saXRlcmFsIChwLCBzKVxuICB8IEFjY19kYXRhX3N0cmluZyAocCwgcykgICAtPiBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIHNcbiAgfCBBY2NfY2hhcl9saXRlcmFsIChwLCBjKVxuICB8IEFjY19kYXRhX2NoYXIgKHAsIGMpICAgICAtPiBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X2NoYXIgbyBjXG4gIHwgQWNjX2RlbGF5IChwLCBmKSAgICAgICAgIC0+IG91dHB1dF9hY2MgbyBwOyBmIG9cbiAgfCBBY2NfZmx1c2ggcCAgICAgICAgICAgICAgLT4gb3V0cHV0X2FjYyBvIHA7IGZsdXNoIG9cbiAgfCBBY2NfaW52YWxpZF9hcmcgKHAsIG1zZykgLT4gb3V0cHV0X2FjYyBvIHA7IGludmFsaWRfYXJnIG1zZztcbiAgfCBFbmRfb2ZfYWNjICAgICAgICAgICAgICAgLT4gKClcblxuKCogUmVjdXJzaXZlbHkgb3V0cHV0IGFuIFwiYWNjdW11bGF0b3JcIiBjb250YWluaW5nIGEgcmV2ZXJzZWQgbGlzdCBvZlxuICAgcHJpbnRpbmcgZW50aXRpZXMgKHN0cmluZywgY2hhciwgZmx1cywgLi4uKSBpbiBhIGJ1ZmZlci4gKilcbigqIFVzZWQgYXMgYSBjb250aW51YXRpb24gb2YgbWFrZV9wcmludGYuICopXG5sZXQgcmVjIGJ1ZnB1dF9hY2MgYiBhY2MgPSBtYXRjaCBhY2Mgd2l0aFxuICB8IEFjY19mb3JtYXR0aW5nX2xpdCAocCwgZm10aW5nX2xpdCkgLT5cbiAgICBsZXQgcyA9IHN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCBmbXRpbmdfbGl0IGluXG4gICAgYnVmcHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgcztcbiAgfCBBY2NfZm9ybWF0dGluZ19nZW4gKHAsIEFjY19vcGVuX3RhZyBhY2MnKSAtPlxuICAgIGJ1ZnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIFwiQHtcIjsgYnVmcHV0X2FjYyBiIGFjYyc7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl9ib3ggYWNjJykgLT5cbiAgICBidWZwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiBcIkBbXCI7IGJ1ZnB1dF9hY2MgYiBhY2MnO1xuICB8IEFjY19zdHJpbmdfbGl0ZXJhbCAocCwgcylcbiAgfCBBY2NfZGF0YV9zdHJpbmcgKHAsIHMpICAgLT4gYnVmcHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgc1xuICB8IEFjY19jaGFyX2xpdGVyYWwgKHAsIGMpXG4gIHwgQWNjX2RhdGFfY2hhciAocCwgYykgICAgIC0+IGJ1ZnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX2NoYXIgYiBjXG4gIHwgQWNjX2RlbGF5IChwLCBmKSAgICAgICAgIC0+IGJ1ZnB1dF9hY2MgYiBwOyBmIGJcbiAgfCBBY2NfZmx1c2ggcCAgICAgICAgICAgICAgLT4gYnVmcHV0X2FjYyBiIHA7XG4gIHwgQWNjX2ludmFsaWRfYXJnIChwLCBtc2cpIC0+IGJ1ZnB1dF9hY2MgYiBwOyBpbnZhbGlkX2FyZyBtc2c7XG4gIHwgRW5kX29mX2FjYyAgICAgICAgICAgICAgIC0+ICgpXG5cbigqIFJlY3Vyc2l2ZWx5IG91dHB1dCBhbiBcImFjY3VtdWxhdG9yXCIgY29udGFpbmluZyBhIHJldmVyc2VkIGxpc3Qgb2ZcbiAgIHByaW50aW5nIGVudGl0aWVzIChzdHJpbmcsIGNoYXIsIGZsdXMsIC4uLikgaW4gYSBidWZmZXIuICopXG4oKiBEaWZmZXIgZnJvbSBidWZwdXRfYWNjIGJ5IHRoZSBpbnRlcnByZXRhdGlvbiBvZiAlYSBhbmQgJXQuICopXG4oKiBVc2VkIGFzIGEgY29udGludWF0aW9uIG9mIG1ha2VfcHJpbnRmLiAqKVxubGV0IHJlYyBzdHJwdXRfYWNjIGIgYWNjID0gbWF0Y2ggYWNjIHdpdGhcbiAgfCBBY2NfZm9ybWF0dGluZ19saXQgKHAsIGZtdGluZ19saXQpIC0+XG4gICAgbGV0IHMgPSBzdHJpbmdfb2ZfZm9ybWF0dGluZ19saXQgZm10aW5nX2xpdCBpblxuICAgIHN0cnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIHM7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl90YWcgYWNjJykgLT5cbiAgICBzdHJwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiBcIkB7XCI7IHN0cnB1dF9hY2MgYiBhY2MnO1xuICB8IEFjY19mb3JtYXR0aW5nX2dlbiAocCwgQWNjX29wZW5fYm94IGFjYycpIC0+XG4gICAgc3RycHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgXCJAW1wiOyBzdHJwdXRfYWNjIGIgYWNjJztcbiAgfCBBY2Nfc3RyaW5nX2xpdGVyYWwgKHAsIHMpXG4gIHwgQWNjX2RhdGFfc3RyaW5nIChwLCBzKSAgIC0+IHN0cnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIHNcbiAgfCBBY2NfY2hhcl9saXRlcmFsIChwLCBjKVxuICB8IEFjY19kYXRhX2NoYXIgKHAsIGMpICAgICAtPiBzdHJwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9jaGFyIGIgY1xuICB8IEFjY19kZWxheSAocCwgZikgICAgICAgICAtPiBzdHJwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiAoZiAoKSlcbiAgfCBBY2NfZmx1c2ggcCAgICAgICAgICAgICAgLT4gc3RycHV0X2FjYyBiIHA7XG4gIHwgQWNjX2ludmFsaWRfYXJnIChwLCBtc2cpIC0+IHN0cnB1dF9hY2MgYiBwOyBpbnZhbGlkX2FyZyBtc2c7XG4gIHwgRW5kX29mX2FjYyAgICAgICAgICAgICAgIC0+ICgpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICgqIEVycm9yIG1hbmFnZW1lbnQgKilcblxuKCogUmFpc2UgW0ZhaWx1cmVdIHdpdGggYSBwcmV0dHktcHJpbnRlZCBlcnJvciBtZXNzYWdlLiAqKVxubGV0IGZhaWx3aXRoX21lc3NhZ2UgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBsZXQgYnVmID0gQnVmZmVyLmNyZWF0ZSAyNTYgaW5cbiAgbGV0IGsgYWNjID0gc3RycHV0X2FjYyBidWYgYWNjOyBmYWlsd2l0aCAoQnVmZmVyLmNvbnRlbnRzIGJ1ZikgaW5cbiAgbWFrZV9wcmludGYgayBFbmRfb2ZfYWNjIGZtdFxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdHRpbmcgdG9vbHMgKilcblxuKCogQ29udmVydCBhIHN0cmluZyB0byBhbiBvcGVuIGJsb2NrIGRlc2NyaXB0aW9uIChpbmRlbnQsIGJsb2NrX3R5cGUpICopXG5sZXQgb3Blbl9ib3hfb2Zfc3RyaW5nIHN0ciA9XG4gIGlmIHN0ciA9IFwiXCIgdGhlbiAoMCwgUHBfYm94KSBlbHNlXG4gICAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggc3RyIGluXG4gICAgbGV0IGludmFsaWRfYm94ICgpID0gZmFpbHdpdGhfbWVzc2FnZSBcImludmFsaWQgYm94IGRlc2NyaXB0aW9uICVTXCIgc3RyIGluXG4gICAgbGV0IHJlYyBwYXJzZV9zcGFjZXMgaSA9XG4gICAgICBpZiBpID0gbGVuIHRoZW4gaSBlbHNlXG4gICAgICAgIG1hdGNoIHN0ci5baV0gd2l0aFxuICAgICAgICB8ICcgJyB8ICdcXHQnIC0+IHBhcnNlX3NwYWNlcyAoaSArIDEpXG4gICAgICAgIHwgXyAtPiBpXG4gICAgYW5kIHBhcnNlX2x3b3JkIGkgaiA9XG4gICAgICBpZiBqID0gbGVuIHRoZW4gaiBlbHNlXG4gICAgICAgIG1hdGNoIHN0ci5bal0gd2l0aFxuICAgICAgICB8ICdhJyAuLiAneicgLT4gcGFyc2VfbHdvcmQgaSAoaiArIDEpXG4gICAgICAgIHwgXyAtPiBqXG4gICAgYW5kIHBhcnNlX2ludCBpIGogPVxuICAgICAgaWYgaiA9IGxlbiB0aGVuIGogZWxzZVxuICAgICAgICBtYXRjaCBzdHIuW2pdIHdpdGhcbiAgICAgICAgfCAnMCcgLi4gJzknIHwgJy0nIC0+IHBhcnNlX2ludCBpIChqICsgMSlcbiAgICAgICAgfCBfIC0+IGogaW5cbiAgICBsZXQgd3N0YXJ0ID0gcGFyc2Vfc3BhY2VzIDAgaW5cbiAgICBsZXQgd2VuZCA9IHBhcnNlX2x3b3JkIHdzdGFydCB3c3RhcnQgaW5cbiAgICBsZXQgYm94X25hbWUgPSBTdHJpbmcuc3ViIHN0ciB3c3RhcnQgKHdlbmQgLSB3c3RhcnQpIGluXG4gICAgbGV0IG5zdGFydCA9IHBhcnNlX3NwYWNlcyB3ZW5kIGluXG4gICAgbGV0IG5lbmQgPSBwYXJzZV9pbnQgbnN0YXJ0IG5zdGFydCBpblxuICAgIGxldCBpbmRlbnQgPVxuICAgICAgaWYgbnN0YXJ0ID0gbmVuZCB0aGVuIDAgZWxzZVxuICAgICAgICB0cnkgaW50X29mX3N0cmluZyAoU3RyaW5nLnN1YiBzdHIgbnN0YXJ0IChuZW5kIC0gbnN0YXJ0KSlcbiAgICAgICAgd2l0aCBGYWlsdXJlIF8gLT4gaW52YWxpZF9ib3ggKCkgaW5cbiAgICBsZXQgZXhwX2VuZCA9IHBhcnNlX3NwYWNlcyBuZW5kIGluXG4gICAgaWYgZXhwX2VuZCA8PiBsZW4gdGhlbiBpbnZhbGlkX2JveCAoKTtcbiAgICBsZXQgYm94X3R5cGUgPSBtYXRjaCBib3hfbmFtZSB3aXRoXG4gICAgICB8IFwiXCIgfCBcImJcIiAtPiBQcF9ib3hcbiAgICAgIHwgXCJoXCIgICAgICAtPiBQcF9oYm94XG4gICAgICB8IFwidlwiICAgICAgLT4gUHBfdmJveFxuICAgICAgfCBcImh2XCIgICAgIC0+IFBwX2h2Ym94XG4gICAgICB8IFwiaG92XCIgICAgLT4gUHBfaG92Ym94XG4gICAgICB8IF8gICAgICAgIC0+IGludmFsaWRfYm94ICgpIGluXG4gICAgKGluZGVudCwgYm94X3R5cGUpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogUGFyc2luZyB0b29scyAqKVxuXG4oKiBDcmVhdGUgYSBwYWRkaW5nX2ZtdF9lYmIgZnJvbSBhIHBhZGRpbmcgYW5kIGEgZm9ybWF0LiAqKVxuKCogQ29weSB0aGUgcGFkZGluZyB0byBkaXNqb2luIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgYXJndW1lbnQgYW5kIHJlc3VsdC4gKilcbmxldCBtYWtlX3BhZGRpbmdfZm10X2ViYiA6IHR5cGUgeCB5IC5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoXywgXywgXywgXywgXywgXykgZm10IC0+XG4gICAgICAoXywgXywgXywgXywgXykgcGFkZGluZ19mbXRfZWJiID1cbmZ1biBwYWQgZm10IC0+IG1hdGNoIHBhZCB3aXRoXG4gIHwgTm9fcGFkZGluZyAgICAgICAgIC0+IFBhZGRpbmdfZm10X0VCQiAoTm9fcGFkZGluZywgZm10KVxuICB8IExpdF9wYWRkaW5nIChzLCB3KSAtPiBQYWRkaW5nX2ZtdF9FQkIgKExpdF9wYWRkaW5nIChzLCB3KSwgZm10KVxuICB8IEFyZ19wYWRkaW5nIHMgICAgICAtPiBQYWRkaW5nX2ZtdF9FQkIgKEFyZ19wYWRkaW5nIHMsIGZtdClcblxuKCogQ3JlYXRlIGEgcHJlY2lzaW9uX2ZtdF9lYmIgZnJvbSBhIHByZWNpc2lvbiBhbmQgYSBmb3JtYXQuICopXG4oKiBDb3B5IHRoZSBwcmVjaXNpb24gdG8gZGlzam9pbiB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIGFyZ3VtZW50IGFuZCByZXN1bHQuICopXG5sZXQgbWFrZV9wcmVjaXNpb25fZm10X2ViYiA6IHR5cGUgeCB5IC5cbiAgICAoeCwgeSkgcHJlY2lzaW9uIC0+IChfLCBfLCBfLCBfLCBfLCBfKSBmbXQgLT5cbiAgICAgIChfLCBfLCBfLCBfLCBfKSBwcmVjaXNpb25fZm10X2ViYiA9XG5mdW4gcHJlYyBmbXQgLT4gbWF0Y2ggcHJlYyB3aXRoXG4gIHwgTm9fcHJlY2lzaW9uICAgIC0+IFByZWNpc2lvbl9mbXRfRUJCIChOb19wcmVjaXNpb24sIGZtdClcbiAgfCBMaXRfcHJlY2lzaW9uIHAgLT4gUHJlY2lzaW9uX2ZtdF9FQkIgKExpdF9wcmVjaXNpb24gcCwgZm10KVxuICB8IEFyZ19wcmVjaXNpb24gICAtPiBQcmVjaXNpb25fZm10X0VCQiAoQXJnX3ByZWNpc2lvbiwgZm10KVxuXG4oKiBDcmVhdGUgYSBwYWRwcmVjX2ZtdF9lYmIgZnJvbSBhIHBhZGRpbmcsIGEgcHJlY2lzaW9uIGFuZCBhIGZvcm1hdC4gKilcbigqIENvcHkgdGhlIHBhZGRpbmcgYW5kIHRoZSBwcmVjaXNpb24gdG8gZGlzam9pbiB0eXBlIHBhcmFtZXRlcnMgb2YgYXJndW1lbnRzXG4gICBhbmQgcmVzdWx0LiAqKVxubGV0IG1ha2VfcGFkcHJlY19mbXRfZWJiIDogdHlwZSB4IHkgeiB0IC5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoeiwgdCkgcHJlY2lzaW9uIC0+XG4gICAgKF8sIF8sIF8sIF8sIF8sIF8pIGZtdCAtPlxuICAgIChfLCBfLCBfLCBfLCBfKSBwYWRwcmVjX2ZtdF9lYmIgPVxuZnVuIHBhZCBwcmVjIGZtdCAtPlxuICBsZXQgUHJlY2lzaW9uX2ZtdF9FQkIgKHByZWMsIGZtdCcpID0gbWFrZV9wcmVjaXNpb25fZm10X2ViYiBwcmVjIGZtdCBpblxuICBtYXRjaCBwYWQgd2l0aFxuICB8IE5vX3BhZGRpbmcgICAgICAgICAtPiBQYWRwcmVjX2ZtdF9FQkIgKE5vX3BhZGRpbmcsIHByZWMsIGZtdCcpXG4gIHwgTGl0X3BhZGRpbmcgKHMsIHcpIC0+IFBhZHByZWNfZm10X0VCQiAoTGl0X3BhZGRpbmcgKHMsIHcpLCBwcmVjLCBmbXQnKVxuICB8IEFyZ19wYWRkaW5nIHMgICAgICAtPiBQYWRwcmVjX2ZtdF9FQkIgKEFyZ19wYWRkaW5nIHMsIHByZWMsIGZtdCcpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdCBwYXJzaW5nICopXG5cbigqIFBhcnNlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIGZvcm1hdCBhbmQgY3JlYXRlIGEgZm10X2ViYi4gKilcbigqIFJhaXNlIFtGYWlsdXJlXSBpbiBjYXNlIG9mIGludmFsaWQgZm9ybWF0LiAqKVxubGV0IGZtdF9lYmJfb2Zfc3RyaW5nID9sZWdhY3lfYmVoYXZpb3Igc3RyID1cbiAgKCogUGFyYW1ldGVycyBuYW1pbmcgY29udmVudGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuICAoKiAgIC0gbGl0X3N0YXJ0OiBzdGFydCBvZiB0aGUgbGl0ZXJhbCBzZXF1ZW5jZS4gICAgICAgICAgICAgICAgICAgICopXG4gICgqICAgLSBzdHJfaW5kOiBjdXJyZW50IGluZGV4IGluIHRoZSBzdHJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgKilcbiAgKCogICAtIGVuZF9pbmQ6IGVuZCBvZiB0aGUgY3VycmVudCAoc3ViLSlmb3JtYXQuICAgICAgICAgICAgICAgICAgICAqKVxuICAoKiAgIC0gcGN0X2luZDogaW5kZXggb2YgdGhlICclJyBpbiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAgICAgICopXG4gICgqICAgLSB6ZXJvOiAgaXMgdGhlICcwJyBmbGFnIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgKilcbiAgKCogICAtIG1pbnVzOiBpcyB0aGUgJy0nIGZsYWcgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAqKVxuICAoKiAgIC0gcGx1czogIGlzIHRoZSAnKycgZmxhZyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IG1pY3JvLWZvcm1hdC4gICopXG4gICgqICAgLSBoYXNoOiAgaXMgdGhlICcjJyBmbGFnIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgKilcbiAgKCogICAtIHNwYWNlOiBpcyB0aGUgJyAnIGZsYWcgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAqKVxuICAoKiAgIC0gaWduOiAgIGlzIHRoZSAnXycgZmxhZyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IG1pY3JvLWZvcm1hdC4gICopXG4gICgqICAgLSBwYWQ6IHBhZGRpbmcgb2YgdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgKilcbiAgKCogICAtIHByZWM6IHByZWNpc2lvbiBvZiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAgICAgICAgICAgICAgICAqKVxuICAoKiAgIC0gc3ltYjogY2hhciByZXByZXNlbnRpbmcgdGhlIGNvbnZlcnNpb24gKCdjJywgJ3MnLCAnZCcsIC4uLikuICopXG4gICgqICAgLSBjaGFyX3NldDogc2V0IG9mIGNoYXJhY3RlcnMgYXMgYml0bWFwIChzZWUgc2NhbmYgJVsuLi5dKS4gICAgKilcblxuICBsZXQgbGVnYWN5X2JlaGF2aW9yID0gbWF0Y2ggbGVnYWN5X2JlaGF2aW9yIHdpdGhcbiAgICB8IFNvbWUgZmxhZyAtPiBmbGFnXG4gICAgfCBOb25lIC0+IHRydWVcbiAgKCogIFdoZW4gdGhpcyBmbGFnIGlzIGVuYWJsZWQsIHRoZSBmb3JtYXQgcGFyc2VyIHRyaWVzIHRvIGJlaGF2ZSBhc1xuICAgICAgdGhlIDw0LjAyIGltcGxlbWVudGF0aW9ucywgaW4gcGFydGljdWxhciBpdCBpZ25vcmVzIG1vc3QgYmVuaWduXG4gICAgICBub25zZW5zaWNhbCBmb3JtYXRzLiBXaGVuIHRoZSBmbGFnIGlzIGRpc2FibGVkLCBpdCB3aWxsIHJlamVjdCBhbnlcbiAgICAgIGZvcm1hdCB0aGF0IGlzIG5vdCBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWNhdGlvbi5cblxuICAgICAgQSB0eXBpY2FsIGV4YW1wbGUgd291bGQgYmUgXCIlKyBkXCI6IHNwZWNpZnlpbmcgYm90aCAnKycgKGlmIHRoZVxuICAgICAgbnVtYmVyIGlzIHBvc2l0aXZlLCBwYWQgd2l0aCBhICcrJyB0byBnZXQgdGhlIHNhbWUgd2lkdGggYXNcbiAgICAgIG5lZ2F0aXZlIG51bWJlcnMpIGFuZCAnICcgKGlmIHRoZSBudW1iZXIgaXMgcG9zaXRpdmUsIHBhZCB3aXRoXG4gICAgICBhIHNwYWNlKSBkb2VzIG5vdCBtYWtlIHNlbnNlLCBidXQgdGhlIGxlZ2FjeSAoPCA0LjAyKVxuICAgICAgaW1wbGVtZW50YXRpb24gd2FzIGhhcHB5IHRvIGp1c3QgaWdub3JlIHRoZSBzcGFjZS5cbiAgKilcbiAgaW5cblxuICAoKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhIGZyaWVuZGx5IGVycm9yIG1lc3NhZ2UuICopXG4gIGxldCBpbnZhbGlkX2Zvcm1hdF9tZXNzYWdlIHN0cl9pbmQgbXNnID1cbiAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCAlc1wiXG4gICAgICBzdHIgc3RyX2luZCBtc2dcbiAgaW5cblxuICAoKiBVc2VkIHdoZW4gdGhlIGVuZCBvZiB0aGUgZm9ybWF0IChvciB0aGUgY3VycmVudCBzdWItZm9ybWF0KSB3YXMgZW5jb3VudGVyZWRcbiAgICAgIHVuZXhwZWN0ZWRseS4gKilcbiAgbGV0IHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kID1cbiAgICBpbnZhbGlkX2Zvcm1hdF9tZXNzYWdlIGVuZF9pbmRcbiAgICAgIFwidW5leHBlY3RlZCBlbmQgb2YgZm9ybWF0XCJcbiAgaW5cblxuICAoKiBVc2VkIGZvciAlMGM6IG5vIG90aGVyIHdpZHRocyBhcmUgaW1wbGVtZW50ZWQgKilcbiAgbGV0IGludmFsaWRfbm9ubnVsbF9jaGFyX3dpZHRoIHN0cl9pbmQgPVxuICAgIGludmFsaWRfZm9ybWF0X21lc3NhZ2Ugc3RyX2luZFxuICAgICAgXCJub24temVybyB3aWR0aHMgYXJlIHVuc3VwcG9ydGVkIGZvciAlYyBjb252ZXJzaW9uc1wiXG4gIGluXG4gICgqIFJhaXNlIFtGYWlsdXJlXSB3aXRoIGEgZnJpZW5kbHkgZXJyb3IgbWVzc2FnZSBhYm91dCBhbiBvcHRpb24gZGVwZW5kZW5jeVxuICAgICBwcm9ibGVtLiAqKVxuICBsZXQgaW52YWxpZF9mb3JtYXRfd2l0aG91dCBzdHJfaW5kIGMgcyA9XG4gICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogYXQgY2hhcmFjdGVyIG51bWJlciAlZCwgJyVjJyB3aXRob3V0ICVzXCJcbiAgICAgIHN0ciBzdHJfaW5kIGMgc1xuICBpblxuXG4gICgqIFJhaXNlIFtGYWlsdXJlXSB3aXRoIGEgZnJpZW5kbHkgZXJyb3IgbWVzc2FnZSBhYm91dCBhbiB1bmV4cGVjdGVkXG4gICAgIGNoYXJhY3Rlci4gKilcbiAgbGV0IGV4cGVjdGVkX2NoYXJhY3RlciBzdHJfaW5kIGV4cGVjdGVkIHJlYWQgPVxuICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogYXQgY2hhcmFjdGVyIG51bWJlciAlZCwgJXMgZXhwZWN0ZWQsIHJlYWQgJUNcIlxuICAgICAgc3RyIHN0cl9pbmQgZXhwZWN0ZWQgcmVhZFxuICBpblxuXG4gICgqIFBhcnNlIHRoZSBzdHJpbmcgZnJvbSBiZWdfaW5kIChpbmNsdWRlZCkgdG8gZW5kX2luZCAoZXhjbHVkZWQpLiAqKVxuICBsZXQgcmVjIHBhcnNlIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIGJlZ19pbmQgZW5kX2luZCAtPiBwYXJzZV9saXRlcmFsIGJlZ19pbmQgYmVnX2luZCBlbmRfaW5kXG5cbiAgKCogUmVhZCBsaXRlcmFsIGNoYXJhY3RlcnMgdXAgdG8gJyUnIG9yICdAJyBzcGVjaWFsIGNoYXJhY3RlcnMuICopXG4gIGFuZCBwYXJzZV9saXRlcmFsIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBsaXRfc3RhcnQgc3RyX2luZCBlbmRfaW5kIC0+XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiBhZGRfbGl0ZXJhbCBsaXRfc3RhcnQgc3RyX2luZCBFbmRfb2ZfZm9ybWF0IGVsc2VcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgfCAnJScgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZV9mb3JtYXQgc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICAgIGFkZF9saXRlcmFsIGxpdF9zdGFydCBzdHJfaW5kIGZtdF9yZXN0XG4gICAgICB8ICdAJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlX2FmdGVyX2F0IChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBhZGRfbGl0ZXJhbCBsaXRfc3RhcnQgc3RyX2luZCBmbXRfcmVzdFxuICAgICAgfCBfIC0+XG4gICAgICAgIHBhcnNlX2xpdGVyYWwgbGl0X3N0YXJ0IChzdHJfaW5kICsgMSkgZW5kX2luZFxuXG4gICgqIFBhcnNlIGEgZm9ybWF0IGFmdGVyICclJyAqKVxuICBhbmQgcGFyc2VfZm9ybWF0IDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHBjdF9pbmQgZW5kX2luZCAtPiBwYXJzZV9pZ24gcGN0X2luZCAocGN0X2luZCArIDEpIGVuZF9pbmRcblxuICBhbmQgcGFyc2VfaWduIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCAtPlxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICB8ICdfJyAtPiBwYXJzZV9mbGFncyBwY3RfaW5kIChzdHJfaW5kKzEpIGVuZF9pbmQgdHJ1ZVxuICAgICAgfCBfIC0+IHBhcnNlX2ZsYWdzIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIGZhbHNlXG5cbiAgYW5kIHBhcnNlX2ZsYWdzIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IGludCAtPiBib29sIC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiXG4gID1cbiAgZnVuIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIGlnbiAtPlxuICAgIGxldCB6ZXJvID0gcmVmIGZhbHNlIGFuZCBtaW51cyA9IHJlZiBmYWxzZVxuICAgIGFuZCBwbHVzID0gcmVmIGZhbHNlIGFuZCBzcGFjZSA9IHJlZiBmYWxzZVxuICAgIGFuZCBoYXNoID0gcmVmIGZhbHNlIGluXG4gICAgbGV0IHNldF9mbGFnIHN0cl9pbmQgZmxhZyA9XG4gICAgICAoKiBpbiBsZWdhY3kgbW9kZSwgZHVwbGljYXRlIGZsYWdzIGFyZSBhY2NlcHRlZCAqKVxuICAgICAgaWYgIWZsYWcgJiYgbm90IGxlZ2FjeV9iZWhhdmlvciB0aGVuXG4gICAgICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCBkdXBsaWNhdGUgZmxhZyAlQ1wiXG4gICAgICAgICAgc3RyIHN0cl9pbmQgc3RyLltzdHJfaW5kXTtcbiAgICAgIGZsYWcgOj0gdHJ1ZTtcbiAgICBpblxuICAgIGxldCByZWMgcmVhZF9mbGFncyBzdHJfaW5kID1cbiAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBiZWdpbiBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJzAnIC0+IHNldF9mbGFnIHN0cl9pbmQgemVybzsgIHJlYWRfZmxhZ3MgKHN0cl9pbmQgKyAxKVxuICAgICAgfCAnLScgLT4gc2V0X2ZsYWcgc3RyX2luZCBtaW51czsgcmVhZF9mbGFncyAoc3RyX2luZCArIDEpXG4gICAgICB8ICcrJyAtPiBzZXRfZmxhZyBzdHJfaW5kIHBsdXM7ICByZWFkX2ZsYWdzIChzdHJfaW5kICsgMSlcbiAgICAgIHwgJyMnIC0+IHNldF9mbGFnIHN0cl9pbmQgaGFzaDsgcmVhZF9mbGFncyAoc3RyX2luZCArIDEpXG4gICAgICB8ICcgJyAtPiBzZXRfZmxhZyBzdHJfaW5kIHNwYWNlOyByZWFkX2ZsYWdzIChzdHJfaW5kICsgMSlcbiAgICAgIHwgXyAtPlxuICAgICAgICBwYXJzZV9wYWRkaW5nIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kXG4gICAgICAgICAgIXplcm8gIW1pbnVzICFwbHVzICFoYXNoICFzcGFjZSBpZ25cbiAgICAgIGVuZFxuICAgIGluXG4gICAgcmVhZF9mbGFncyBzdHJfaW5kXG5cbiAgKCogVHJ5IHRvIHJlYWQgYSBkaWdpdGFsIG9yIGEgJyonIHBhZGRpbmcuICopXG4gIGFuZCBwYXJzZV9wYWRkaW5nIDogdHlwZSBlIGYgLlxuICAgICAgaW50IC0+IGludCAtPiBpbnQgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT5cbiAgICAgICAgKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgemVybyBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduIC0+XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICBsZXQgcGFkdHkgPSBtYXRjaCB6ZXJvLCBtaW51cyB3aXRoXG4gICAgICB8IGZhbHNlLCBmYWxzZSAtPiBSaWdodFxuICAgICAgfCBmYWxzZSwgdHJ1ZSAgLT4gTGVmdFxuICAgICAgfCAgdHJ1ZSwgZmFsc2UgLT4gWmVyb3NcbiAgICAgIHwgIHRydWUsIHRydWUgIC0+XG4gICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIExlZnRcbiAgICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgJy0nIFwiMFwiIGluXG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIC0+XG4gICAgICBsZXQgbmV3X2luZCwgd2lkdGggPSBwYXJzZV9wb3NpdGl2ZSBzdHJfaW5kIGVuZF9pbmQgMCBpblxuICAgICAgcGFyc2VfYWZ0ZXJfcGFkZGluZyBwY3RfaW5kIG5ld19pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduXG4gICAgICAgIChMaXRfcGFkZGluZyAocGFkdHksIHdpZHRoKSlcbiAgICB8ICcqJyAtPlxuICAgICAgcGFyc2VfYWZ0ZXJfcGFkZGluZyBwY3RfaW5kIChzdHJfaW5kICsgMSkgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2VcbiAgICAgICAgaWduIChBcmdfcGFkZGluZyBwYWR0eSlcbiAgICB8IF8gLT5cbiAgICAgIGJlZ2luIG1hdGNoIHBhZHR5IHdpdGhcbiAgICAgIHwgTGVmdCAgLT5cbiAgICAgICAgaWYgbm90IGxlZ2FjeV9iZWhhdmlvciB0aGVuXG4gICAgICAgICAgaW52YWxpZF9mb3JtYXRfd2l0aG91dCAoc3RyX2luZCAtIDEpICctJyBcInBhZGRpbmdcIjtcbiAgICAgICAgcGFyc2VfYWZ0ZXJfcGFkZGluZyBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduXG4gICAgICAgICAgTm9fcGFkZGluZ1xuICAgICAgfCBaZXJvcyAtPlxuICAgICAgICAgKCogYSAnMCcgcGFkZGluZyBpbmRpY2F0aW9uIG5vdCBmb2xsb3dlZCBieSBhbnl0aGluZyBzaG91bGRcbiAgICAgICAgICAgYmUgaW50ZXJwcmV0ZWQgYXMgYSBSaWdodCBwYWRkaW5nIG9mIHdpZHRoIDAuIFRoaXMgaXMgdXNlZFxuICAgICAgICAgICBieSBzY2FubmluZyBjb252ZXJzaW9ucyAlMHMgYW5kICUwYyAqKVxuICAgICAgICBwYXJzZV9hZnRlcl9wYWRkaW5nIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ25cbiAgICAgICAgICAoTGl0X3BhZGRpbmcgKFJpZ2h0LCAwKSlcbiAgICAgIHwgUmlnaHQgLT5cbiAgICAgICAgcGFyc2VfYWZ0ZXJfcGFkZGluZyBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduXG4gICAgICAgICAgTm9fcGFkZGluZ1xuICAgICAgZW5kXG5cbiAgKCogSXMgcHJlY2lzaW9uIGRlZmluZWQ/ICopXG4gIGFuZCBwYXJzZV9hZnRlcl9wYWRkaW5nIDogdHlwZSB4IGUgZiAuXG4gICAgICBpbnQgLT4gaW50IC0+IGludCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT5cbiAgICAgICAgKHgsIF8pIHBhZGRpbmcgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnbiBwYWQgLT5cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgIHwgJy4nIC0+XG4gICAgICBwYXJzZV9wcmVjaXNpb24gcGN0X2luZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnblxuICAgICAgICBwYWRcbiAgICB8IHN5bWIgLT5cbiAgICAgIHBhcnNlX2NvbnZlcnNpb24gcGN0X2luZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgcGx1cyBoYXNoIHNwYWNlIGlnbiBwYWRcbiAgICAgICAgTm9fcHJlY2lzaW9uIHBhZCBzeW1iXG5cbiAgKCogUmVhZCB0aGUgZGlnaXRhbCBvciAnKicgcHJlY2lzaW9uLiAqKVxuICBhbmQgcGFyc2VfcHJlY2lzaW9uIDogdHlwZSB4IGUgZiAuXG4gICAgICBpbnQgLT4gaW50IC0+IGludCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT5cbiAgICAgICAgKHgsIF8pIHBhZGRpbmcgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnbiBwYWQgLT5cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIGxldCBwYXJzZV9saXRlcmFsIG1pbnVzIHN0cl9pbmQgPVxuICAgICAgbGV0IG5ld19pbmQsIHByZWMgPSBwYXJzZV9wb3NpdGl2ZSBzdHJfaW5kIGVuZF9pbmQgMCBpblxuICAgICAgcGFyc2VfYWZ0ZXJfcHJlY2lzaW9uIHBjdF9pbmQgbmV3X2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ25cbiAgICAgICAgcGFkIChMaXRfcHJlY2lzaW9uIHByZWMpIGluXG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIC0+IHBhcnNlX2xpdGVyYWwgbWludXMgc3RyX2luZFxuICAgIHwgKCcrJyB8ICctJykgYXMgc3ltYiB3aGVuIGxlZ2FjeV9iZWhhdmlvciAtPlxuICAgICAgKCogTGVnYWN5IG1vZGUgd291bGQgYWNjZXB0IGFuZCBpZ25vcmUgJysnIG9yICctJyBiZWZvcmUgdGhlXG4gICAgICAgICBpbnRlZ2VyIGRlc2NyaWJpbmcgdGhlIGRlc2lyZWQgcHJlY2lzaW9uOyBub3RlIHRoYXQgdGhpc1xuICAgICAgICAgY2Fubm90IGhhcHBlbiBmb3IgcGFkZGluZyB3aWR0aCwgYXMgJysnIGFuZCAnLScgYWxyZWFkeSBoYXZlXG4gICAgICAgICBhIHNlbWFudGljcyB0aGVyZS5cblxuICAgICAgICAgVGhhdCBzYWlkLCB0aGUgaWRlYSAoc3VwcG9ydGVkIGJ5IHRoaXMgdHdlYWspIHRoYXQgd2lkdGggYW5kXG4gICAgICAgICBwcmVjaXNpb24gbGl0ZXJhbHMgYXJlIFwiaW50ZWdlciBsaXRlcmFsc1wiIGluIHRoZSBPQ2FtbCBzZW5zZSBpc1xuICAgICAgICAgc3RpbGwgYmxhdGFudGx5IHdyb25nLCBhcyAxMjNfNDU2IG9yIDB4RkYgYXJlIHJlamVjdGVkLiAqKVxuICAgICAgcGFyc2VfbGl0ZXJhbCAobWludXMgfHwgc3ltYiA9ICctJykgKHN0cl9pbmQgKyAxKVxuICAgIHwgJyonIC0+XG4gICAgICBwYXJzZV9hZnRlcl9wcmVjaXNpb24gcGN0X2luZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlXG4gICAgICAgIGlnbiBwYWQgQXJnX3ByZWNpc2lvblxuICAgIHwgXyAtPlxuICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW5cbiAgICAgICAgKCogbm90ZSB0aGF0IGxlZ2FjeSBpbXBsZW1lbnRhdGlvbiBkaWQgbm90IGlnbm9yZSAnLicgd2l0aG91dFxuICAgICAgICAgICBhIG51bWJlciAoYXMgaXQgZG9lcyBmb3IgcGFkZGluZyBpbmRpY2F0aW9ucyksIGJ1dFxuICAgICAgICAgICBpbnRlcnByZXRzIGl0IGFzICcuMCcgKilcbiAgICAgICAgcGFyc2VfYWZ0ZXJfcHJlY2lzaW9uIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ25cbiAgICAgICAgICBwYWQgKExpdF9wcmVjaXNpb24gMClcbiAgICAgIGVsc2VcbiAgICAgICAgaW52YWxpZF9mb3JtYXRfd2l0aG91dCAoc3RyX2luZCAtIDEpICcuJyBcInByZWNpc2lvblwiXG5cbiAgKCogVHJ5IHRvIHJlYWQgdGhlIGNvbnZlcnNpb24uICopXG4gIGFuZCBwYXJzZV9hZnRlcl9wcmVjaXNpb24gOiB0eXBlIHggeSB6IHQgZSBmIC5cbiAgICAgIGludCAtPiBpbnQgLT4gaW50IC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPlxuICAgICAgICAoeCwgeSkgcGFkZGluZyAtPiAoeiwgdCkgcHJlY2lzaW9uIC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ24gcGFkIHByZWMgLT5cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIGxldCBwYXJzZV9jb252ICh0eXBlIHUpICh0eXBlIHYpIChwYWRwcmVjIDogKHUsIHYpIHBhZGRpbmcpID1cbiAgICAgIHBhcnNlX2NvbnZlcnNpb24gcGN0X2luZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgcGx1cyBoYXNoIHNwYWNlIGlnbiBwYWRcbiAgICAgICAgcHJlYyBwYWRwcmVjIHN0ci5bc3RyX2luZF0gaW5cbiAgICAoKiBpbiBsZWdhY3kgbW9kZSwgc29tZSBmb3JtYXRzICglcyBhbmQgJVMpIGFjY2VwdCBhIHdlaXJkIG1peCBvZlxuICAgICAgIHBhZGRpbmcgYW5kIHByZWNpc2lvbiwgd2hpY2ggaXMgbWVyZ2VkIGFzIGEgc2luZ2xlIHBhZGRpbmdcbiAgICAgICBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIGluICUuMTBzIHRoZSBwcmVjaXNpb24gaXMgaW1wbGljaXRseVxuICAgICAgIHVuZGVyc3Rvb2QgYXMgcGFkZGluZyAlMTBzLCBidXQgdGhlIGxlZnQtcGFkZGluZyBjb21wb25lbnQgbWF5XG4gICAgICAgYmUgc3BlY2lmaWVkIGVpdGhlciBhcyBhIGxlZnQgcGFkZGluZyBvciBhIG5lZ2F0aXZlIHByZWNpc2lvbjpcbiAgICAgICAlLS4zcyBhbmQgJS4tM3MgYXJlIGVxdWl2YWxlbnQgdG8gJS0zcyAqKVxuICAgIG1hdGNoIHBhZCB3aXRoXG4gICAgfCBOb19wYWRkaW5nIC0+IChcbiAgICAgIG1hdGNoIG1pbnVzLCBwcmVjIHdpdGhcbiAgICAgICAgfCBfLCBOb19wcmVjaXNpb24gLT4gcGFyc2VfY29udiBOb19wYWRkaW5nXG4gICAgICAgIHwgZmFsc2UsIExpdF9wcmVjaXNpb24gbiAtPiBwYXJzZV9jb252IChMaXRfcGFkZGluZyAoUmlnaHQsIG4pKVxuICAgICAgICB8IHRydWUsIExpdF9wcmVjaXNpb24gbiAtPiBwYXJzZV9jb252IChMaXRfcGFkZGluZyAoTGVmdCwgbikpXG4gICAgICAgIHwgZmFsc2UsIEFyZ19wcmVjaXNpb24gLT4gcGFyc2VfY29udiAoQXJnX3BhZGRpbmcgUmlnaHQpXG4gICAgICAgIHwgdHJ1ZSwgQXJnX3ByZWNpc2lvbiAtPiBwYXJzZV9jb252IChBcmdfcGFkZGluZyBMZWZ0KVxuICAgIClcbiAgICB8IHBhZCAtPiBwYXJzZV9jb252IHBhZFxuXG4gICgqIENhc2UgYW5hbHlzaXMgb24gY29udmVyc2lvbi4gKilcbiAgYW5kIHBhcnNlX2NvbnZlcnNpb24gOiB0eXBlIHggeSB6IHQgdSB2IGUgZiAuXG4gICAgICBpbnQgLT4gaW50IC0+IGludCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+ICh4LCB5KSBwYWRkaW5nIC0+XG4gICAgICAgICh6LCB0KSBwcmVjaXNpb24gLT4gKHUsIHYpIHBhZGRpbmcgLT4gY2hhciAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBwbHVzIGhhc2ggc3BhY2UgaWduIHBhZCBwcmVjIHBhZHByZWMgc3ltYiAtPlxuICAgICgqIEZsYWdzIHVzZWQgdG8gY2hlY2sgb3B0aW9uIHVzYWdlcy9jb21wYXRpYmlsaXRpZXMuICopXG4gICAgbGV0IHBsdXNfdXNlZCAgPSByZWYgZmFsc2UgYW5kIGhhc2hfdXNlZCA9IHJlZiBmYWxzZVxuICAgIGFuZCBzcGFjZV91c2VkID0gcmVmIGZhbHNlIGFuZCBpZ25fdXNlZCAgID0gcmVmIGZhbHNlXG4gICAgYW5kIHBhZF91c2VkICAgPSByZWYgZmFsc2UgYW5kIHByZWNfdXNlZCAgPSByZWYgZmFsc2UgaW5cblxuICAgICgqIEFjY2VzcyB0byBvcHRpb25zLCB1cGRhdGUgZmxhZ3MuICopXG4gICAgbGV0IGdldF9wbHVzICAgICgpID0gcGx1c191c2VkICA6PSB0cnVlOyBwbHVzXG4gICAgYW5kIGdldF9oYXNoICAgKCkgPSBoYXNoX3VzZWQgOj0gdHJ1ZTsgaGFzaFxuICAgIGFuZCBnZXRfc3BhY2UgICAoKSA9IHNwYWNlX3VzZWQgOj0gdHJ1ZTsgc3BhY2VcbiAgICBhbmQgZ2V0X2lnbiAgICAgKCkgPSBpZ25fdXNlZCAgIDo9IHRydWU7IGlnblxuICAgIGFuZCBnZXRfcGFkICAgICAoKSA9IHBhZF91c2VkICAgOj0gdHJ1ZTsgcGFkXG4gICAgYW5kIGdldF9wcmVjICAgICgpID0gcHJlY191c2VkICA6PSB0cnVlOyBwcmVjXG4gICAgYW5kIGdldF9wYWRwcmVjICgpID0gcGFkX3VzZWQgICA6PSB0cnVlOyBwYWRwcmVjIGluXG5cbiAgICBsZXQgZ2V0X2ludF9wYWQgKCkgOiAoeCx5KSBwYWRkaW5nID1cbiAgICAgICgqICU1LjNkIGlzIGFjY2VwdGVkIGFuZCBtZWFuaW5nZnVsOiBwYWQgdG8gbGVuZ3RoIDUgd2l0aFxuICAgICAgICAgc3BhY2VzLCBidXQgZmlyc3QgcGFkIHdpdGggemVyb3MgdXB0byBsZW5ndGggMyAoMC1wYWRkaW5nXG4gICAgICAgICBpcyB0aGUgaW50ZXJwcmV0YXRpb24gb2YgXCJwcmVjaXNpb25cIiBmb3IgaW50ZWdlciBmb3JtYXRzKS5cblxuICAgICAgICAgJTA1LjNkIGlzIHJlZHVuZGFudDogcGFkIHRvIGxlbmd0aCA1ICp3aXRoIHplcm9zKiwgYnV0XG4gICAgICAgICBmaXJzdCBwYWQgd2l0aCB6ZXJvcy4uLiBUbyBhZGQgaW5zdWx0IHRvIHRoZSBpbmp1cnksIHRoZVxuICAgICAgICAgbGVnYWN5IGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIDAtcGFkZGluZyBpbmRpY2F0aW9uIGFuZFxuICAgICAgICAgZG9lcyB0aGUgNSBwYWRkaW5nIHdpdGggc3BhY2VzIGluc3RlYWQuIFdlIHJldXNlIHRoaXNcbiAgICAgICAgIGludGVycHJldGF0aW9uIGZvciBjb21wYXRpYmlsaXR5LCBidXQgc3RhdGljYWxseSByZWplY3QgdGhpc1xuICAgICAgICAgZm9ybWF0IHdoZW4gdGhlIGxlZ2FjeSBtb2RlIGlzIGRpc2FibGVkLCB0byBwcm90ZWN0IHN0cmljdFxuICAgICAgICAgdXNlcnMgZnJvbSB0aGlzIGNvcm5lciBjYXNlLiAqKVxuICAgICAgIG1hdGNoIGdldF9wYWQgKCksIGdldF9wcmVjICgpIHdpdGhcbiAgICAgICAgIHwgcGFkLCBOb19wcmVjaXNpb24gLT4gcGFkXG4gICAgICAgICB8IE5vX3BhZGRpbmcsIF8gICAgIC0+IE5vX3BhZGRpbmdcbiAgICAgICAgIHwgTGl0X3BhZGRpbmcgKFplcm9zLCBuKSwgXyAtPlxuICAgICAgICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiBMaXRfcGFkZGluZyAoUmlnaHQsIG4pXG4gICAgICAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICcwJyBcInByZWNpc2lvblwiXG4gICAgICAgICB8IEFyZ19wYWRkaW5nIFplcm9zLCBfIC0+XG4gICAgICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIEFyZ19wYWRkaW5nIFJpZ2h0XG4gICAgICAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICcwJyBcInByZWNpc2lvblwiXG4gICAgICAgICB8IExpdF9wYWRkaW5nIF8gYXMgcGFkLCBfIC0+IHBhZFxuICAgICAgICAgfCBBcmdfcGFkZGluZyBfIGFzIHBhZCwgXyAtPiBwYWQgaW5cblxuICAgICgqIENoZWNrIHRoYXQgcGFkdHkgPD4gWmVyb3MuICopXG4gICAgbGV0IGNoZWNrX25vXzAgc3ltYiAodHlwZSBhIGIpIChwYWQgOiAoYSwgYikgcGFkZGluZykgOiAoYSxiKSBwYWRkaW5nID1cbiAgICAgIG1hdGNoIHBhZCB3aXRoXG4gICAgICB8IE5vX3BhZGRpbmcgLT4gcGFkXG4gICAgICB8IExpdF9wYWRkaW5nICgoTGVmdCB8IFJpZ2h0KSwgXykgLT4gcGFkXG4gICAgICB8IEFyZ19wYWRkaW5nIChMZWZ0IHwgUmlnaHQpIC0+IHBhZFxuICAgICAgfCBMaXRfcGFkZGluZyAoWmVyb3MsIHdpZHRoKSAtPlxuICAgICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiBMaXRfcGFkZGluZyAoUmlnaHQsIHdpZHRoKVxuICAgICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiMFwiXG4gICAgICB8IEFyZ19wYWRkaW5nIFplcm9zIC0+XG4gICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIEFyZ19wYWRkaW5nIFJpZ2h0XG4gICAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCIwXCJcbiAgICBpblxuXG4gICAgKCogR2V0IHBhZGRpbmcgYXMgYSBwYWRfb3B0aW9uIChzZWUgXCIlX1wiLCBcIiV7XCIsIFwiJShcIiBhbmQgXCIlW1wiKS5cbiAgICAgICAobm8gbmVlZCBmb3IgbGVnYWN5IG1vZGUgdHdlYWtpbmcsIHRob3NlIHdlcmUgcmVqZWN0ZWQgYnkgdGhlXG4gICAgICAgbGVnYWN5IHBhcnNlciBhcyB3ZWxsKSAqKVxuICAgIGxldCBvcHRfb2ZfcGFkIGMgKHR5cGUgYSkgKHR5cGUgYikgKHBhZCA6IChhLCBiKSBwYWRkaW5nKSA9IG1hdGNoIHBhZCB3aXRoXG4gICAgICB8IE5vX3BhZGRpbmcgLT4gTm9uZVxuICAgICAgfCBMaXRfcGFkZGluZyAoUmlnaHQsIHdpZHRoKSAtPiBTb21lIHdpZHRoXG4gICAgICB8IExpdF9wYWRkaW5nIChaZXJvcywgd2lkdGgpIC0+XG4gICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIFNvbWUgd2lkdGhcbiAgICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgYyBcIicwJ1wiXG4gICAgICB8IExpdF9wYWRkaW5nIChMZWZ0LCB3aWR0aCkgLT5cbiAgICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gU29tZSB3aWR0aFxuICAgICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBjIFwiJy0nXCJcbiAgICAgIHwgQXJnX3BhZGRpbmcgXyAtPiBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgYyBcIicqJ1wiXG4gICAgaW5cbiAgICBsZXQgZ2V0X3BhZF9vcHQgYyA9IG9wdF9vZl9wYWQgYyAoZ2V0X3BhZCAoKSkgaW5cbiAgICBsZXQgZ2V0X3BhZHByZWNfb3B0IGMgPSBvcHRfb2ZfcGFkIGMgKGdldF9wYWRwcmVjICgpKSBpblxuXG4gICAgKCogR2V0IHByZWNpc2lvbiBhcyBhIHByZWNfb3B0aW9uIChzZWUgXCIlX2ZcIikuXG4gICAgICAgKG5vIG5lZWQgZm9yIGxlZ2FjeSBtb2RlIHR3ZWFraW5nLCB0aG9zZSB3ZXJlIHJlamVjdGVkIGJ5IHRoZVxuICAgICAgIGxlZ2FjeSBwYXJzZXIgYXMgd2VsbCkgKilcbiAgICBsZXQgZ2V0X3ByZWNfb3B0ICgpID0gbWF0Y2ggZ2V0X3ByZWMgKCkgd2l0aFxuICAgICAgfCBOb19wcmVjaXNpb24gICAgICAgLT4gTm9uZVxuICAgICAgfCBMaXRfcHJlY2lzaW9uIG5kZWMgLT4gU29tZSBuZGVjXG4gICAgICB8IEFyZ19wcmVjaXNpb24gICAgICAtPiBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgJ18nIFwiJyonXCJcbiAgICBpblxuXG4gICAgbGV0IGZtdF9yZXN1bHQgPSBtYXRjaCBzeW1iIHdpdGhcbiAgICB8ICcsJyAtPlxuICAgICAgcGFyc2Ugc3RyX2luZCBlbmRfaW5kXG4gICAgfCAnYycgLT5cbiAgICAgIGxldCBjaGFyX2Zvcm1hdCBmbXRfcmVzdCA9ICgqICVjICopXG4gICAgICAgIGlmIGdldF9pZ24gKClcbiAgICAgICAgdGhlbiBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChJZ25vcmVkX2NoYXIsIGZtdF9yZXN0KSlcbiAgICAgICAgZWxzZSBGbXRfRUJCIChDaGFyIGZtdF9yZXN0KVxuICAgICAgaW5cbiAgICAgIGxldCBzY2FuX2Zvcm1hdCBmbXRfcmVzdCA9ICgqICUwYyAqKVxuICAgICAgICBpZiBnZXRfaWduICgpXG4gICAgICAgIHRoZW4gRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoSWdub3JlZF9zY2FuX25leHRfY2hhciwgZm10X3Jlc3QpKVxuICAgICAgICBlbHNlIEZtdF9FQkIgKFNjYW5fbmV4dF9jaGFyIGZtdF9yZXN0KVxuICAgICAgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBiZWdpbiBtYXRjaCBnZXRfcGFkX29wdCAnYycgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gY2hhcl9mb3JtYXQgZm10X3Jlc3RcbiAgICAgICAgfCBTb21lIDAgLT4gc2Nhbl9mb3JtYXQgZm10X3Jlc3RcbiAgICAgICAgfCBTb21lIF9uIC0+XG4gICAgICAgICAgIGlmIG5vdCBsZWdhY3lfYmVoYXZpb3JcbiAgICAgICAgICAgdGhlbiBpbnZhbGlkX25vbm51bGxfY2hhcl93aWR0aCBzdHJfaW5kXG4gICAgICAgICAgIGVsc2UgKCogbGVnYWN5IGlnbm9yZXMgJWMgd2lkdGhzICopIGNoYXJfZm9ybWF0IGZtdF9yZXN0XG4gICAgICBlbmRcbiAgICB8ICdDJyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlbiBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChJZ25vcmVkX2NhbWxfY2hhcixmbXRfcmVzdCkpXG4gICAgICBlbHNlIEZtdF9FQkIgKENhbWxfY2hhciBmbXRfcmVzdClcbiAgICB8ICdzJyAtPlxuICAgICAgbGV0IHBhZCA9IGNoZWNrX25vXzAgc3ltYiAoZ2V0X3BhZHByZWMgKCkpIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9zdHJpbmcgKGdldF9wYWRwcmVjX29wdCAnXycpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IFBhZGRpbmdfZm10X0VCQiAocGFkJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRkaW5nX2ZtdF9lYmIgcGFkIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKFN0cmluZyAocGFkJywgZm10X3Jlc3QnKSlcbiAgICB8ICdTJyAtPlxuICAgICAgbGV0IHBhZCA9IGNoZWNrX25vXzAgc3ltYiAoZ2V0X3BhZHByZWMgKCkpIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9jYW1sX3N0cmluZyAoZ2V0X3BhZHByZWNfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkZGluZ19mbXRfRUJCIChwYWQnLCBmbXRfcmVzdCcpID1cbiAgICAgICAgICBtYWtlX3BhZGRpbmdfZm10X2ViYiBwYWQgZm10X3Jlc3QgaW5cbiAgICAgICAgRm10X0VCQiAoQ2FtbF9zdHJpbmcgKHBhZCcsIGZtdF9yZXN0JykpXG4gICAgfCAnZCcgfCAnaScgfCAneCcgfCAnWCcgfCAnbycgfCAndScgLT5cbiAgICAgIGxldCBpY29udiA9IGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCBzdHJfaW5kIChnZXRfcGx1cyAoKSkgKGdldF9oYXNoICgpKVxuICAgICAgICAoZ2V0X3NwYWNlICgpKSBzeW1iIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9pbnQgKGljb252LCBnZXRfcGFkX29wdCAnXycpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IFBhZHByZWNfZm10X0VCQiAocGFkJywgcHJlYycsIGZtdF9yZXN0JykgPVxuICAgICAgICAgIG1ha2VfcGFkcHJlY19mbXRfZWJiIChnZXRfaW50X3BhZCAoKSkgKGdldF9wcmVjICgpKSBmbXRfcmVzdCBpblxuICAgICAgICBGbXRfRUJCIChJbnQgKGljb252LCBwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSlcbiAgICB8ICdOJyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGxldCBjb3VudGVyID0gVG9rZW5fY291bnRlciBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIGNvdW50ZXIgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBGbXRfRUJCIChTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCBmbXRfcmVzdCkpXG4gICAgfCAnbCcgfCAnbicgfCAnTCcgd2hlbiBzdHJfaW5kPWVuZF9pbmQgfHwgbm90IChpc19pbnRfYmFzZSBzdHIuW3N0cl9pbmRdKSAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGxldCBjb3VudGVyID0gY291bnRlcl9vZl9jaGFyIHN5bWIgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciBjb3VudGVyIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgRm10X0VCQiAoU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgZm10X3Jlc3QpKVxuICAgIHwgJ2wnIC0+XG4gICAgICBsZXQgaWNvbnYgPVxuICAgICAgICBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgKHN0cl9pbmQgKyAxKSAoZ2V0X3BsdXMgKCkpIChnZXRfaGFzaCAoKSlcbiAgICAgICAgICAoZ2V0X3NwYWNlICgpKSBzdHIuW3N0cl9pbmRdIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9pbnQzMiAoaWNvbnYsIGdldF9wYWRfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkcHJlY19mbXRfRUJCIChwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRwcmVjX2ZtdF9lYmIgKGdldF9pbnRfcGFkICgpKSAoZ2V0X3ByZWMgKCkpIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKEludDMyIChpY29udiwgcGFkJywgcHJlYycsIGZtdF9yZXN0JykpXG4gICAgfCAnbicgLT5cbiAgICAgIGxldCBpY29udiA9XG4gICAgICAgIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCAoc3RyX2luZCArIDEpIChnZXRfcGx1cyAoKSlcbiAgICAgICAgICAoZ2V0X2hhc2ggKCkpIChnZXRfc3BhY2UgKCkpIHN0ci5bc3RyX2luZF0gaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX25hdGl2ZWludCAoaWNvbnYsIGdldF9wYWRfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkcHJlY19mbXRfRUJCIChwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRwcmVjX2ZtdF9lYmIgKGdldF9pbnRfcGFkICgpKSAoZ2V0X3ByZWMgKCkpIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKE5hdGl2ZWludCAoaWNvbnYsIHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpKVxuICAgIHwgJ0wnIC0+XG4gICAgICBsZXQgaWNvbnYgPVxuICAgICAgICBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgKHN0cl9pbmQgKyAxKSAoZ2V0X3BsdXMgKCkpIChnZXRfaGFzaCAoKSlcbiAgICAgICAgICAoZ2V0X3NwYWNlICgpKSBzdHIuW3N0cl9pbmRdIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9pbnQ2NCAoaWNvbnYsIGdldF9wYWRfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkcHJlY19mbXRfRUJCIChwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRwcmVjX2ZtdF9lYmIgKGdldF9pbnRfcGFkICgpKSAoZ2V0X3ByZWMgKCkpIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKEludDY0IChpY29udiwgcGFkJywgcHJlYycsIGZtdF9yZXN0JykpXG4gICAgfCAnZicgfCAnZScgfCAnRScgfCAnZycgfCAnRycgfCAnRicgfCAnaCcgfCAnSCcgLT5cbiAgICAgIGxldCBmY29udiA9XG4gICAgICAgIGNvbXB1dGVfZmxvYXRfY29udiBwY3RfaW5kIHN0cl9pbmRcbiAgICAgICAgICAoZ2V0X3BsdXMgKCkpIChnZXRfaGFzaCAoKSkgKGdldF9zcGFjZSAoKSkgc3ltYiBpblxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfZmxvYXQgKGdldF9wYWRfb3B0ICdfJywgZ2V0X3ByZWNfb3B0ICgpKSBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIGxldCBQYWRwcmVjX2ZtdF9FQkIgKHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpID1cbiAgICAgICAgICBtYWtlX3BhZHByZWNfZm10X2ViYiAoZ2V0X3BhZCAoKSkgKGdldF9wcmVjICgpKSBmbXRfcmVzdCBpblxuICAgICAgICBGbXRfRUJCIChGbG9hdCAoZmNvbnYsIHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpKVxuICAgIHwgJ2InIHwgJ0InIC0+XG4gICAgICBsZXQgcGFkID0gY2hlY2tfbm9fMCBzeW1iIChnZXRfcGFkcHJlYyAoKSkgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX2Jvb2wgKGdldF9wYWRwcmVjX29wdCAnXycpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IFBhZGRpbmdfZm10X0VCQiAocGFkJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRkaW5nX2ZtdF9lYmIgcGFkIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKEJvb2wgKHBhZCcsIGZtdF9yZXN0JykpXG4gICAgfCAnYScgLT5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBGbXRfRUJCIChBbHBoYSBmbXRfcmVzdClcbiAgICB8ICd0JyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKFRoZXRhIGZtdF9yZXN0KVxuICAgIHwgJ3InIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKElnbm9yZWRfcmVhZGVyLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlIEZtdF9FQkIgKFJlYWRlciBmbXRfcmVzdClcbiAgICB8ICchJyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKEZsdXNoIGZtdF9yZXN0KVxuICAgIHwgKCclJyB8ICdAJykgYXMgYyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKENoYXJfbGl0ZXJhbCAoYywgZm10X3Jlc3QpKVxuICAgIHwgJ3snIC0+XG4gICAgICBsZXQgc3ViX2VuZCA9IHNlYXJjaF9zdWJmb3JtYXRfZW5kIHN0cl9pbmQgZW5kX2luZCAnfScgaW5cbiAgICAgIGxldCBGbXRfRUJCIHN1Yl9mbXQgPSBwYXJzZSBzdHJfaW5kIHN1Yl9lbmQgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN1Yl9lbmQgKyAyKSBlbmRfaW5kIGluXG4gICAgICBsZXQgc3ViX2ZtdHR5ID0gZm10dHlfb2ZfZm10IHN1Yl9mbXQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfZm9ybWF0X2FyZyAoZ2V0X3BhZF9vcHQgJ18nLCBzdWJfZm10dHkpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgRm10X0VCQiAoRm9ybWF0X2FyZyAoZ2V0X3BhZF9vcHQgJ3snLCBzdWJfZm10dHksIGZtdF9yZXN0KSlcbiAgICB8ICcoJyAtPlxuICAgICAgbGV0IHN1Yl9lbmQgPSBzZWFyY2hfc3ViZm9ybWF0X2VuZCBzdHJfaW5kIGVuZF9pbmQgJyknIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdWJfZW5kICsgMikgZW5kX2luZCBpblxuICAgICAgbGV0IEZtdF9FQkIgc3ViX2ZtdCA9IHBhcnNlIHN0cl9pbmQgc3ViX2VuZCBpblxuICAgICAgbGV0IHN1Yl9mbXR0eSA9IGZtdHR5X29mX2ZtdCBzdWJfZm10IGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX2Zvcm1hdF9zdWJzdCAoZ2V0X3BhZF9vcHQgJ18nLCBzdWJfZm10dHkpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgRm10X0VCQiAoRm9ybWF0X3N1YnN0IChnZXRfcGFkX29wdCAnKCcsIHN1Yl9mbXR0eSwgZm10X3Jlc3QpKVxuICAgIHwgJ1snIC0+XG4gICAgICBsZXQgbmV4dF9pbmQsIGNoYXJfc2V0ID0gcGFyc2VfY2hhcl9zZXQgc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIG5leHRfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfc2Nhbl9jaGFyX3NldCAoZ2V0X3BhZF9vcHQgJ18nLCBjaGFyX3NldCkgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBGbXRfRUJCIChTY2FuX2NoYXJfc2V0IChnZXRfcGFkX29wdCAnWycsIGNoYXJfc2V0LCBmbXRfcmVzdCkpXG4gICAgfCAnLScgfCAnKycgfCAnIycgfCAnICcgfCAnXycgLT5cbiAgICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogYXQgY2hhcmFjdGVyIG51bWJlciAlZCwgXFxcbiAgICAgICAgIGZsYWcgJUMgaXMgb25seSBhbGxvd2VkIGFmdGVyIHRoZSAnJSUnLCBiZWZvcmUgcGFkZGluZyBhbmQgcHJlY2lzaW9uXCJcbiAgICAgICAgc3RyIHBjdF9pbmQgc3ltYlxuICAgIHwgXyAtPlxuICAgICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCBcXFxuICAgICAgICAgaW52YWxpZCBjb252ZXJzaW9uIFxcXCIlJSVjXFxcIlwiIHN0ciAoc3RyX2luZCAtIDEpIHN5bWJcbiAgICBpblxuICAgICgqIENoZWNrIGZvciB1bnVzZWQgb3B0aW9ucywgYW5kIHJlamVjdCB0aGVtIGFzIGluY29tcGF0aWJsZS5cblxuICAgICAgIFN1Y2ggY2hlY2tzIG5lZWQgdG8gYmUgZGlzYWJsZWQgaW4gbGVnYWN5IG1vZGUsIGFzIHRoZSBsZWdhY3lcbiAgICAgICBwYXJzZXIgc2lsZW50bHkgaWdub3JlZCBpbmNvbXBhdGlibGUgZmxhZ3MuICopXG4gICAgaWYgbm90IGxlZ2FjeV9iZWhhdmlvciB0aGVuIGJlZ2luXG4gICAgaWYgbm90ICFwbHVzX3VzZWQgJiYgcGx1cyB0aGVuXG4gICAgICBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcIicrJ1wiO1xuICAgIGlmIG5vdCAhaGFzaF91c2VkICYmIGhhc2ggdGhlblxuICAgICAgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInIydcIjtcbiAgICBpZiBub3QgIXNwYWNlX3VzZWQgJiYgc3BhY2UgdGhlblxuICAgICAgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInICdcIjtcbiAgICBpZiBub3QgIXBhZF91c2VkICAmJiBQYWRkaW5nX0VCQiBwYWQgPD4gUGFkZGluZ19FQkIgTm9fcGFkZGluZyB0aGVuXG4gICAgICBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcImBwYWRkaW5nJ1wiO1xuICAgIGlmIG5vdCAhcHJlY191c2VkICYmIFByZWNpc2lvbl9FQkIgcHJlYyA8PiBQcmVjaXNpb25fRUJCIE5vX3ByZWNpc2lvbiB0aGVuXG4gICAgICBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgKGlmIGlnbiB0aGVuICdfJyBlbHNlIHN5bWIpXG4gICAgICAgIFwiYHByZWNpc2lvbidcIjtcbiAgICBpZiBpZ24gJiYgcGx1cyB0aGVuIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCAnXycgXCInKydcIjtcbiAgICBlbmQ7XG4gICAgKCogdGhpcyBsYXN0IHRlc3QgbXVzdCBub3QgYmUgZGlzYWJsZWQgaW4gbGVnYWN5IG1vZGUsXG4gICAgICAgYXMgaWdub3JpbmcgaXQgd291bGQgdHlwaWNhbGx5IHJlc3VsdCBpbiBhIGRpZmZlcmVudCB0eXBpbmdcbiAgICAgICB0aGFuIHdoYXQgdGhlIGxlZ2FjeSBwYXJzZXIgdXNlZCAqKVxuICAgIGlmIG5vdCAhaWduX3VzZWQgJiYgaWduIHRoZW5cbiAgICAgIGJlZ2luIG1hdGNoIHN5bWIgd2l0aFxuICAgICAgICAoKiBhcmd1bWVudC1sZXNzIGZvcm1hdHMgY2FuIHNhZmVseSBiZSBpZ25vcmVkIGluIGxlZ2FjeSBtb2RlICopXG4gICAgICAgIHwgKCdAJyB8ICclJyB8ICchJyB8ICcsJykgd2hlbiBsZWdhY3lfYmVoYXZpb3IgLT4gKClcbiAgICAgICAgfCBfIC0+XG4gICAgICAgICAgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInXydcIlxuICAgICAgZW5kO1xuICAgIGZtdF9yZXN1bHRcblxuICAoKiBQYXJzZSBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIChhZnRlciAnQCcpLiAqKVxuICBhbmQgcGFyc2VfYWZ0ZXJfYXQgOiB0eXBlIGUgZiAuIGludCAtPiBpbnQgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gc3RyX2luZCBlbmRfaW5kIC0+XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiBGbXRfRUJCIChDaGFyX2xpdGVyYWwgKCdAJywgRW5kX29mX2Zvcm1hdCkpXG4gICAgZWxzZVxuICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICB8ICdbJyAtPlxuICAgICAgICBwYXJzZV90YWcgZmFsc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG4gICAgICB8ICddJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoQ2xvc2VfYm94LCBmbXRfcmVzdCkpXG4gICAgICB8ICd7JyAtPlxuICAgICAgICBwYXJzZV90YWcgdHJ1ZSAoc3RyX2luZCArIDEpIGVuZF9pbmRcbiAgICAgIHwgJ30nIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChDbG9zZV90YWcsIGZtdF9yZXN0KSlcbiAgICAgIHwgJywnIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChCcmVhayAoXCJALFwiLCAwLCAwKSwgZm10X3Jlc3QpKVxuICAgICAgfCAnICcgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEJyZWFrIChcIkAgXCIsIDEsIDApLCBmbXRfcmVzdCkpXG4gICAgICB8ICc7JyAtPlxuICAgICAgICBwYXJzZV9nb29kX2JyZWFrIChzdHJfaW5kICsgMSkgZW5kX2luZFxuICAgICAgfCAnPycgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEZGbHVzaCwgZm10X3Jlc3QpKVxuICAgICAgfCAnXFxuJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoRm9yY2VfbmV3bGluZSwgZm10X3Jlc3QpKVxuICAgICAgfCAnLicgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEZsdXNoX25ld2xpbmUsIGZtdF9yZXN0KSlcbiAgICAgIHwgJzwnIC0+XG4gICAgICAgIHBhcnNlX21hZ2ljX3NpemUgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG4gICAgICB8ICdAJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoRXNjYXBlZF9hdCwgZm10X3Jlc3QpKVxuICAgICAgfCAnJScgd2hlbiBzdHJfaW5kICsgMSA8IGVuZF9pbmQgJiYgc3RyLltzdHJfaW5kICsgMV0gPSAnJScgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDIpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEVzY2FwZWRfcGVyY2VudCwgZm10X3Jlc3QpKVxuICAgICAgfCAnJScgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoQ2hhcl9saXRlcmFsICgnQCcsIGZtdF9yZXN0KSlcbiAgICAgIHwgYyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoU2Nhbl9pbmRpYyBjLCBmbXRfcmVzdCkpXG5cbiAgKCogVHJ5IHRvIHJlYWQgdGhlIG9wdGlvbmFsIDxuYW1lPiBhZnRlciBcIkB7XCIgb3IgXCJAW1wiLiAqKVxuICBhbmQgcGFyc2VfdGFnIDogdHlwZSBlIGYgLiBib29sIC0+IGludCAtPiBpbnQgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gaXNfb3Blbl90YWcgc3RyX2luZCBlbmRfaW5kIC0+XG4gICAgdHJ5XG4gICAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHJhaXNlIE5vdF9mb3VuZDtcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgfCAnPCcgLT5cbiAgICAgICAgbGV0IGluZCA9IFN0cmluZy5pbmRleF9mcm9tIHN0ciAoc3RyX2luZCArIDEpICc+JyBpblxuICAgICAgICBpZiBpbmQgPj0gZW5kX2luZCB0aGVuIHJhaXNlIE5vdF9mb3VuZDtcbiAgICAgICAgbGV0IHN1Yl9zdHIgPSBTdHJpbmcuc3ViIHN0ciBzdHJfaW5kIChpbmQgLSBzdHJfaW5kICsgMSkgaW5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBsZXQgRm10X0VCQiBzdWJfZm10ID0gcGFyc2Ugc3RyX2luZCAoaW5kICsgMSkgaW5cbiAgICAgICAgbGV0IHN1Yl9mb3JtYXQgPSBGb3JtYXQgKHN1Yl9mbXQsIHN1Yl9zdHIpIGluXG4gICAgICAgIGxldCBmb3JtYXR0aW5nID1cbiAgICAgICAgICBpZiBpc19vcGVuX3RhZyB0aGVuIE9wZW5fdGFnIHN1Yl9mb3JtYXQgZWxzZSBPcGVuX2JveCBzdWJfZm9ybWF0IGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfZ2VuIChmb3JtYXR0aW5nLCBmbXRfcmVzdCkpXG4gICAgICB8IF8gLT5cbiAgICAgICAgcmFpc2UgTm90X2ZvdW5kXG4gICAgd2l0aCBOb3RfZm91bmQgLT5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBsZXQgc3ViX2Zvcm1hdCA9IEZvcm1hdCAoRW5kX29mX2Zvcm1hdCwgXCJcIikgaW5cbiAgICAgIGxldCBmb3JtYXR0aW5nID1cbiAgICAgICAgaWYgaXNfb3Blbl90YWcgdGhlbiBPcGVuX3RhZyBzdWJfZm9ybWF0IGVsc2UgT3Blbl9ib3ggc3ViX2Zvcm1hdCBpblxuICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19nZW4gKGZvcm1hdHRpbmcsIGZtdF9yZXN0KSlcblxuICAoKiBUcnkgdG8gcmVhZCB0aGUgb3B0aW9uYWwgPHdpZHRoIG9mZnNldD4gYWZ0ZXIgXCJAO1wiLiAqKVxuICBhbmQgcGFyc2VfZ29vZF9icmVhayA6IHR5cGUgZSBmIC4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBzdHJfaW5kIGVuZF9pbmQgLT5cbiAgICBsZXQgbmV4dF9pbmQsIGZvcm1hdHRpbmdfbGl0ID1cbiAgICAgIHRyeVxuICAgICAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB8fCBzdHIuW3N0cl9pbmRdIDw+ICc8JyB0aGVuIHJhaXNlIE5vdF9mb3VuZDtcbiAgICAgICAgbGV0IHN0cl9pbmRfMSA9IHBhcnNlX3NwYWNlcyAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXzFdIHdpdGhcbiAgICAgICAgfCAnMCcgLi4gJzknIHwgJy0nIC0+IChcbiAgICAgICAgICBsZXQgc3RyX2luZF8yLCB3aWR0aCA9IHBhcnNlX2ludGVnZXIgc3RyX2luZF8xIGVuZF9pbmQgaW5cbiAgICAgICAgICAgIGxldCBzdHJfaW5kXzMgPSBwYXJzZV9zcGFjZXMgc3RyX2luZF8yIGVuZF9pbmQgaW5cbiAgICAgICAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF8zXSB3aXRoXG4gICAgICAgICAgICAgIHwgJz4nIC0+XG4gICAgICAgICAgICAgICAgbGV0IHMgPSBTdHJpbmcuc3ViIHN0ciAoc3RyX2luZC0yKSAoc3RyX2luZF8zLXN0cl9pbmQrMykgaW5cbiAgICAgICAgICAgICAgICBzdHJfaW5kXzMgKyAxLCBCcmVhayAocywgd2lkdGgsIDApXG4gICAgICAgICAgICAgIHwgJzAnIC4uICc5JyB8ICctJyAtPlxuICAgICAgICAgICAgICAgIGxldCBzdHJfaW5kXzQsIG9mZnNldCA9IHBhcnNlX2ludGVnZXIgc3RyX2luZF8zIGVuZF9pbmQgaW5cbiAgICAgICAgICAgICAgICBsZXQgc3RyX2luZF81ID0gcGFyc2Vfc3BhY2VzIHN0cl9pbmRfNCBlbmRfaW5kIGluXG4gICAgICAgICAgICAgICAgaWYgc3RyLltzdHJfaW5kXzVdIDw+ICc+JyB0aGVuIHJhaXNlIE5vdF9mb3VuZDtcbiAgICAgICAgICAgICAgICBsZXQgcyA9IFN0cmluZy5zdWIgc3RyIChzdHJfaW5kLTIpIChzdHJfaW5kXzUtc3RyX2luZCszKSBpblxuICAgICAgICAgICAgICAgIHN0cl9pbmRfNSArIDEsIEJyZWFrIChzLCB3aWR0aCwgb2Zmc2V0KVxuICAgICAgICAgICAgICB8IF8gLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICAgIClcbiAgICAgICAgfCBfIC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgd2l0aCBOb3RfZm91bmQgfCBGYWlsdXJlIF8gLT5cbiAgICAgICAgc3RyX2luZCwgQnJlYWsgKFwiQDtcIiwgMSwgMClcbiAgICBpblxuICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgbmV4dF9pbmQgZW5kX2luZCBpblxuICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChmb3JtYXR0aW5nX2xpdCwgZm10X3Jlc3QpKVxuXG4gICgqIFBhcnNlIHRoZSBzaXplIGluIGEgPG4+LiAqKVxuICBhbmQgcGFyc2VfbWFnaWNfc2l6ZSA6IHR5cGUgZSBmIC4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBzdHJfaW5kIGVuZF9pbmQgLT5cbiAgICBtYXRjaFxuICAgICAgdHJ5XG4gICAgICAgIGxldCBzdHJfaW5kXzEgPSBwYXJzZV9zcGFjZXMgc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF8xXSB3aXRoXG4gICAgICAgIHwgJzAnIC4uICc5JyB8ICctJyAtPlxuICAgICAgICAgIGxldCBzdHJfaW5kXzIsIHNpemUgPSBwYXJzZV9pbnRlZ2VyIHN0cl9pbmRfMSBlbmRfaW5kIGluXG4gICAgICAgICAgbGV0IHN0cl9pbmRfMyA9IHBhcnNlX3NwYWNlcyBzdHJfaW5kXzIgZW5kX2luZCBpblxuICAgICAgICAgIGlmIHN0ci5bc3RyX2luZF8zXSA8PiAnPicgdGhlbiByYWlzZSBOb3RfZm91bmQ7XG4gICAgICAgICAgbGV0IHMgPSBTdHJpbmcuc3ViIHN0ciAoc3RyX2luZCAtIDIpIChzdHJfaW5kXzMgLSBzdHJfaW5kICsgMykgaW5cbiAgICAgICAgICBTb21lIChzdHJfaW5kXzMgKyAxLCBNYWdpY19zaXplIChzLCBzaXplKSlcbiAgICAgICAgfCBfIC0+IE5vbmVcbiAgICAgIHdpdGggTm90X2ZvdW5kIHwgRmFpbHVyZSBfIC0+XG4gICAgICAgIE5vbmVcbiAgICB3aXRoXG4gICAgfCBTb21lIChuZXh0X2luZCwgZm9ybWF0dGluZ19saXQpIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIG5leHRfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChmb3JtYXR0aW5nX2xpdCwgZm10X3Jlc3QpKVxuICAgIHwgTm9uZSAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChTY2FuX2luZGljICc8JywgZm10X3Jlc3QpKVxuXG4gICgqIFBhcnNlIGFuZCBjb25zdHJ1Y3QgYSBjaGFyIHNldC4gKilcbiAgYW5kIHBhcnNlX2NoYXJfc2V0IHN0cl9pbmQgZW5kX2luZCA9XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcblxuICAgIGxldCBjaGFyX3NldCA9IGNyZWF0ZV9jaGFyX3NldCAoKSBpblxuICAgIGxldCBhZGRfY2hhciBjID1cbiAgICAgIGFkZF9pbl9jaGFyX3NldCBjaGFyX3NldCBjO1xuICAgIGluXG4gICAgbGV0IGFkZF9yYW5nZSBjIGMnID1cbiAgICAgIGZvciBpID0gaW50X29mX2NoYXIgYyB0byBpbnRfb2ZfY2hhciBjJyBkb1xuICAgICAgICBhZGRfaW5fY2hhcl9zZXQgY2hhcl9zZXQgKGNoYXJfb2ZfaW50IGkpO1xuICAgICAgZG9uZTtcbiAgICBpblxuXG4gICAgbGV0IGZhaWxfc2luZ2xlX3BlcmNlbnQgc3RyX2luZCA9XG4gICAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6ICclJScgYWxvbmUgaXMgbm90IGFjY2VwdGVkIGluIGNoYXJhY3RlciBzZXRzLCBcXFxuICAgICAgICAgdXNlICUlJSUgaW5zdGVhZCBhdCBwb3NpdGlvbiAlZC5cIiBzdHIgc3RyX2luZFxuICAgIGluXG5cbiAgICAoKiBQYXJzZSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGEgY2hhciBzZXQuICopXG4gICAgbGV0IHJlYyBwYXJzZV9jaGFyX3NldF9zdGFydCBzdHJfaW5kIGVuZF9pbmQgPVxuICAgICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgIGxldCBjID0gc3RyLltzdHJfaW5kXSBpblxuICAgICAgcGFyc2VfY2hhcl9zZXRfYWZ0ZXJfY2hhciAoc3RyX2luZCArIDEpIGVuZF9pbmQgY1xuXG4gICAgKCogUGFyc2UgdGhlIGNvbnRlbnQgb2YgYSBjaGFyIHNldCB1bnRpbCB0aGUgZmlyc3QgJ10nLiAqKVxuICAgIGFuZCBwYXJzZV9jaGFyX3NldF9jb250ZW50IHN0cl9pbmQgZW5kX2luZCA9XG4gICAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICB8ICddJyAtPlxuICAgICAgICBzdHJfaW5kICsgMVxuICAgICAgfCAnLScgLT5cbiAgICAgICAgYWRkX2NoYXIgJy0nO1xuICAgICAgICBwYXJzZV9jaGFyX3NldF9jb250ZW50IChzdHJfaW5kICsgMSkgZW5kX2luZFxuICAgICAgfCBjIC0+XG4gICAgICAgIHBhcnNlX2NoYXJfc2V0X2FmdGVyX2NoYXIgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGNcblxuICAgICgqIFRlc3QgZm9yIHJhbmdlIGluIGNoYXIgc2V0LiAqKVxuICAgIGFuZCBwYXJzZV9jaGFyX3NldF9hZnRlcl9jaGFyIHN0cl9pbmQgZW5kX2luZCBjID1cbiAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJ10nIC0+XG4gICAgICAgIGFkZF9jaGFyIGM7XG4gICAgICAgIHN0cl9pbmQgKyAxXG4gICAgICB8ICctJyAtPlxuICAgICAgICBwYXJzZV9jaGFyX3NldF9hZnRlcl9taW51cyAoc3RyX2luZCArIDEpIGVuZF9pbmQgY1xuICAgICAgfCAoJyUnIHwgJ0AnKSBhcyBjJyB3aGVuIGMgPSAnJScgLT5cbiAgICAgICAgYWRkX2NoYXIgYyc7XG4gICAgICAgIHBhcnNlX2NoYXJfc2V0X2NvbnRlbnQgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG4gICAgICB8IGMnIC0+XG4gICAgICAgIGlmIGMgPSAnJScgdGhlbiBmYWlsX3NpbmdsZV9wZXJjZW50IHN0cl9pbmQ7XG4gICAgICAgICgqIG5vdGUgdGhhdCAnQCcgYWxvbmUgaXMgYWNjZXB0ZWQsIGFzIGRvbmUgYnkgdGhlIGxlZ2FjeVxuICAgICAgICAgICBpbXBsZW1lbnRhdGlvbjsgdGhlIGRvY3VtZW50YXRpb24gc3BlY2lmaWNhbGx5IHJlcXVpcmVzICVAXG4gICAgICAgICAgIHNvIHdlIGNvdWxkIHdhcm4gb24gdGhhdCAqKVxuICAgICAgICBhZGRfY2hhciBjO1xuICAgICAgICBwYXJzZV9jaGFyX3NldF9hZnRlcl9jaGFyIChzdHJfaW5kICsgMSkgZW5kX2luZCBjJ1xuXG4gICAgKCogTWFuYWdlIHJhbmdlIGluIGNoYXIgc2V0IChleGNlcHQgaWYgdGhlICctJyB0aGUgbGFzdCBjaGFyIGJlZm9yZSAnXScpICopXG4gICAgYW5kIHBhcnNlX2NoYXJfc2V0X2FmdGVyX21pbnVzIHN0cl9pbmQgZW5kX2luZCBjID1cbiAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJ10nIC0+XG4gICAgICAgIGFkZF9jaGFyIGM7XG4gICAgICAgIGFkZF9jaGFyICctJztcbiAgICAgICAgc3RyX2luZCArIDFcbiAgICAgIHwgJyUnIC0+XG4gICAgICAgIGlmIHN0cl9pbmQgKyAxID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgICBiZWdpbiBtYXRjaCBzdHIuW3N0cl9pbmQgKyAxXSB3aXRoXG4gICAgICAgICAgfCAoJyUnIHwgJ0AnKSBhcyBjJyAtPlxuICAgICAgICAgICAgYWRkX3JhbmdlIGMgYyc7XG4gICAgICAgICAgICBwYXJzZV9jaGFyX3NldF9jb250ZW50IChzdHJfaW5kICsgMikgZW5kX2luZFxuICAgICAgICAgIHwgXyAtPiBmYWlsX3NpbmdsZV9wZXJjZW50IHN0cl9pbmRcbiAgICAgICAgZW5kXG4gICAgICB8IGMnIC0+XG4gICAgICAgIGFkZF9yYW5nZSBjIGMnO1xuICAgICAgICBwYXJzZV9jaGFyX3NldF9jb250ZW50IChzdHJfaW5kICsgMSkgZW5kX2luZFxuICAgIGluXG4gICAgbGV0IHN0cl9pbmQsIHJldmVyc2UgPVxuICAgICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgICB8ICdeJyAtPiBzdHJfaW5kICsgMSwgdHJ1ZVxuICAgICAgICB8IF8gLT4gc3RyX2luZCwgZmFsc2UgaW5cbiAgICBsZXQgbmV4dF9pbmQgPSBwYXJzZV9jaGFyX3NldF9zdGFydCBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICBsZXQgY2hhcl9zZXQgPSBmcmVlemVfY2hhcl9zZXQgY2hhcl9zZXQgaW5cbiAgICBuZXh0X2luZCwgKGlmIHJldmVyc2UgdGhlbiByZXZfY2hhcl9zZXQgY2hhcl9zZXQgZWxzZSBjaGFyX3NldClcblxuICAoKiBDb25zdW1lIGFsbCBuZXh0IHNwYWNlcywgcmFpc2UgYW4gRmFpbHVyZSBpZiBlbmRfaW5kIGlzIHJlYWNoZWQuICopXG4gIGFuZCBwYXJzZV9zcGFjZXMgc3RyX2luZCBlbmRfaW5kID1cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIGlmIHN0ci5bc3RyX2luZF0gPSAnICcgdGhlbiBwYXJzZV9zcGFjZXMgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGVsc2Ugc3RyX2luZFxuXG4gICgqIFJlYWQgYSBwb3NpdGl2ZSBpbnRlZ2VyIGZyb20gdGhlIHN0cmluZywgcmFpc2UgYSBGYWlsdXJlIGlmIGVuZF9pbmQgaXNcbiAgICAgcmVhY2hlZC4gKilcbiAgYW5kIHBhcnNlX3Bvc2l0aXZlIHN0cl9pbmQgZW5kX2luZCBhY2MgPVxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIGFzIGMgLT5cbiAgICAgIGxldCBuZXdfYWNjID0gYWNjICogMTAgKyAoaW50X29mX2NoYXIgYyAtIGludF9vZl9jaGFyICcwJykgaW5cbiAgICAgIGlmIG5ld19hY2MgPiBTeXMubWF4X3N0cmluZ19sZW5ndGggdGhlblxuICAgICAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogaW50ZWdlciAlZCBpcyBncmVhdGVyIHRoYW4gdGhlIGxpbWl0ICVkXCJcbiAgICAgICAgICBzdHIgbmV3X2FjYyBTeXMubWF4X3N0cmluZ19sZW5ndGhcbiAgICAgIGVsc2VcbiAgICAgICAgcGFyc2VfcG9zaXRpdmUgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIG5ld19hY2NcbiAgICB8IF8gLT4gc3RyX2luZCwgYWNjXG5cbiAgKCogUmVhZCBhIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGludGVnZXIgZnJvbSB0aGUgc3RyaW5nLCByYWlzZSBhIEZhaWx1cmVcbiAgICAgaWYgZW5kX2luZCBpcyByZWFjaGVkLiAqKVxuICBhbmQgcGFyc2VfaW50ZWdlciBzdHJfaW5kIGVuZF9pbmQgPVxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIC0+IHBhcnNlX3Bvc2l0aXZlIHN0cl9pbmQgZW5kX2luZCAwXG4gICAgfCAnLScgLT4gKFxuICAgICAgaWYgc3RyX2luZCArIDEgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBtYXRjaCBzdHIuW3N0cl9pbmQgKyAxXSB3aXRoXG4gICAgICB8ICcwJyAuLiAnOScgLT5cbiAgICAgICAgbGV0IG5leHRfaW5kLCBuID0gcGFyc2VfcG9zaXRpdmUgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIDAgaW5cbiAgICAgICAgbmV4dF9pbmQsIC1uXG4gICAgICB8IGMgLT5cbiAgICAgICAgZXhwZWN0ZWRfY2hhcmFjdGVyIChzdHJfaW5kICsgMSkgXCJkaWdpdFwiIGNcbiAgICApXG4gICAgfCBfIC0+IGFzc2VydCBmYWxzZVxuXG4gICgqIEFkZCBhIGxpdGVyYWwgdG8gYSBmb3JtYXQgZnJvbSBhIGxpdGVyYWwgY2hhcmFjdGVyIHN1Yi1zZXF1ZW5jZS4gKilcbiAgYW5kIGFkZF9saXRlcmFsIDogdHlwZSBhIGQgZSBmIC5cbiAgICAgIGludCAtPiBpbnQgLT4gKGEsIF8sIF8sIGQsIGUsIGYpIGZtdCAtPlxuICAgICAgKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gbGl0X3N0YXJ0IHN0cl9pbmQgZm10IC0+IG1hdGNoIHN0cl9pbmQgLSBsaXRfc3RhcnQgd2l0aFxuICAgIHwgMCAgICAtPiBGbXRfRUJCIGZtdFxuICAgIHwgMSAgICAtPiBGbXRfRUJCIChDaGFyX2xpdGVyYWwgKHN0ci5bbGl0X3N0YXJ0XSwgZm10KSlcbiAgICB8IHNpemUgLT4gRm10X0VCQiAoU3RyaW5nX2xpdGVyYWwgKFN0cmluZy5zdWIgc3RyIGxpdF9zdGFydCBzaXplLCBmbXQpKVxuXG4gICgqIFNlYXJjaCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHN1Yi1mb3JtYXRcbiAgICAgKGkuZS4gdGhlIGNvcnJlc3BvbmRpbmcgXCIlfVwiIG9yIFwiJSlcIikgKilcbiAgYW5kIHNlYXJjaF9zdWJmb3JtYXRfZW5kIHN0cl9pbmQgZW5kX2luZCBjID1cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuXG4gICAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6IHVuY2xvc2VkIHN1Yi1mb3JtYXQsIFxcXG4gICAgICAgICBleHBlY3RlZCBcXFwiJSUlY1xcXCIgYXQgY2hhcmFjdGVyIG51bWJlciAlZFwiIHN0ciBjIGVuZF9pbmQ7XG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnJScgLT5cbiAgICAgIGlmIHN0cl9pbmQgKyAxID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgaWYgc3RyLltzdHJfaW5kICsgMV0gPSBjIHRoZW4gKCogRW5kIG9mIGZvcm1hdCBmb3VuZCAqKSBzdHJfaW5kIGVsc2VcbiAgICAgICAgYmVnaW4gbWF0Y2ggc3RyLltzdHJfaW5kICsgMV0gd2l0aFxuICAgICAgICB8ICdfJyAtPlxuICAgICAgICAgICgqIFNlYXJjaCBmb3IgXCIlXyhcIiBvciBcIiVfe1wiLiAqKVxuICAgICAgICAgIGlmIHN0cl9pbmQgKyAyID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgICAgIGJlZ2luIG1hdGNoIHN0ci5bc3RyX2luZCArIDJdIHdpdGhcbiAgICAgICAgICB8ICd7JyAtPlxuICAgICAgICAgICAgbGV0IHN1Yl9lbmQgPSBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3RyX2luZCArIDMpIGVuZF9pbmQgJ30nIGluXG4gICAgICAgICAgICBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3ViX2VuZCArIDIpIGVuZF9pbmQgY1xuICAgICAgICAgIHwgJygnIC0+XG4gICAgICAgICAgICBsZXQgc3ViX2VuZCA9IHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdHJfaW5kICsgMykgZW5kX2luZCAnKScgaW5cbiAgICAgICAgICAgIHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdWJfZW5kICsgMikgZW5kX2luZCBjXG4gICAgICAgICAgfCBfIC0+IHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdHJfaW5kICsgMykgZW5kX2luZCBjXG4gICAgICAgICAgZW5kXG4gICAgICAgIHwgJ3snIC0+XG4gICAgICAgICAgKCogJXsuLi4lfSBzdWItZm9ybWF0IGZvdW5kLiAqKVxuICAgICAgICAgIGxldCBzdWJfZW5kID0gc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN0cl9pbmQgKyAyKSBlbmRfaW5kICd9JyBpblxuICAgICAgICAgIHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdWJfZW5kICsgMikgZW5kX2luZCBjXG4gICAgICAgIHwgJygnIC0+XG4gICAgICAgICAgKCogJSguLi4lKSBzdWItZm9ybWF0IGZvdW5kLiAqKVxuICAgICAgICAgIGxldCBzdWJfZW5kID0gc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN0cl9pbmQgKyAyKSBlbmRfaW5kICcpJyBpblxuICAgICAgICAgIHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdWJfZW5kICsgMikgZW5kX2luZCBjXG4gICAgICAgIHwgJ30nIC0+XG4gICAgICAgICAgKCogRXJyb3I6ICUoLi4uJX0uICopXG4gICAgICAgICAgZXhwZWN0ZWRfY2hhcmFjdGVyIChzdHJfaW5kICsgMSkgXCJjaGFyYWN0ZXIgJyknXCIgJ30nXG4gICAgICAgIHwgJyknIC0+XG4gICAgICAgICAgKCogRXJyb3I6ICV7Li4uJSkuICopXG4gICAgICAgICAgZXhwZWN0ZWRfY2hhcmFjdGVyIChzdHJfaW5kICsgMSkgXCJjaGFyYWN0ZXIgJ30nXCIgJyknXG4gICAgICAgIHwgXyAtPlxuICAgICAgICAgIHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdHJfaW5kICsgMikgZW5kX2luZCBjXG4gICAgICAgIGVuZFxuICAgIHwgXyAtPiBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgY1xuXG4gICgqIENoZWNrIGlmIHN5bWIgaXMgYSB2YWxpZCBpbnQgY29udmVyc2lvbiBhZnRlciBcIiVsXCIsIFwiJW5cIiBvciBcIiVMXCIgKilcbiAgYW5kIGlzX2ludF9iYXNlIHN5bWIgPSBtYXRjaCBzeW1iIHdpdGhcbiAgICB8ICdkJyB8ICdpJyB8ICd4JyB8ICdYJyB8ICdvJyB8ICd1JyAtPiB0cnVlXG4gICAgfCBfIC0+IGZhbHNlXG5cbiAgKCogQ29udmVydCBhIGNoYXIgKGwsIG4gb3IgTCkgdG8gaXRzIGFzc29jaWF0ZWQgY291bnRlci4gKilcbiAgYW5kIGNvdW50ZXJfb2ZfY2hhciBzeW1iID0gbWF0Y2ggc3ltYiB3aXRoXG4gICAgfCAnbCcgLT4gTGluZV9jb3VudGVyICB8ICduJyAtPiBDaGFyX2NvdW50ZXJcbiAgICB8ICdMJyAtPiBUb2tlbl9jb3VudGVyIHwgXyAtPiBhc3NlcnQgZmFsc2VcblxuICAoKiBDb252ZXJ0IChwbHVzLCBzeW1iKSB0byBpdHMgYXNzb2NpYXRlZCBpbnRfY29udi4gKilcbiAgYW5kIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCBzdHJfaW5kIHBsdXMgaGFzaCBzcGFjZSBzeW1iID1cbiAgICBtYXRjaCBwbHVzLCBoYXNoLCBzcGFjZSwgc3ltYiB3aXRoXG4gICAgfCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAnZCcgLT4gSW50X2QgIHwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgJ2knIC0+IEludF9pXG4gICAgfCBmYWxzZSwgZmFsc2UsICB0cnVlLCAnZCcgLT4gSW50X3NkIHwgZmFsc2UsIGZhbHNlLCAgdHJ1ZSwgJ2knIC0+IEludF9zaVxuICAgIHwgIHRydWUsIGZhbHNlLCBmYWxzZSwgJ2QnIC0+IEludF9wZCB8ICB0cnVlLCBmYWxzZSwgZmFsc2UsICdpJyAtPiBJbnRfcGlcbiAgICB8IGZhbHNlLCBmYWxzZSwgZmFsc2UsICd4JyAtPiBJbnRfeCAgfCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAnWCcgLT4gSW50X1hcbiAgICB8IGZhbHNlLCAgdHJ1ZSwgZmFsc2UsICd4JyAtPiBJbnRfQ3ggfCBmYWxzZSwgIHRydWUsIGZhbHNlLCAnWCcgLT4gSW50X0NYXG4gICAgfCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAnbycgLT4gSW50X29cbiAgICB8IGZhbHNlLCAgdHJ1ZSwgZmFsc2UsICdvJyAtPiBJbnRfQ29cbiAgICB8IGZhbHNlLCBmYWxzZSwgZmFsc2UsICd1JyAtPiBJbnRfdVxuICAgIHwgZmFsc2UsICB0cnVlLCBmYWxzZSwgJ2QnIC0+IEludF9DZFxuICAgIHwgZmFsc2UsICB0cnVlLCBmYWxzZSwgJ2knIC0+IEludF9DaVxuICAgIHwgZmFsc2UsICB0cnVlLCBmYWxzZSwgJ3UnIC0+IEludF9DdVxuICAgIHwgXywgdHJ1ZSwgXywgJ3gnIHdoZW4gbGVnYWN5X2JlaGF2aW9yIC0+IEludF9DeFxuICAgIHwgXywgdHJ1ZSwgXywgJ1gnIHdoZW4gbGVnYWN5X2JlaGF2aW9yIC0+IEludF9DWFxuICAgIHwgXywgdHJ1ZSwgXywgJ28nIHdoZW4gbGVnYWN5X2JlaGF2aW9yIC0+IEludF9Db1xuICAgIHwgXywgdHJ1ZSwgXywgKCdkJyB8ICdpJyB8ICd1JykgLT5cbiAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuICgqIGlnbm9yZSAqKVxuICAgICAgICBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgc3RyX2luZCBwbHVzIGZhbHNlIHNwYWNlIHN5bWJcbiAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInIydcIlxuICAgIHwgdHJ1ZSwgXywgdHJ1ZSwgXyAtPlxuICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW5cbiAgICAgICAgKCogcGx1cyBhbmQgc3BhY2U6IGxlZ2FjeSBpbXBsZW1lbnRhdGlvbiBwcmVmZXJzIHBsdXMgKilcbiAgICAgICAgY29tcHV0ZV9pbnRfY29udiBwY3RfaW5kIHN0cl9pbmQgcGx1cyBoYXNoIGZhbHNlIHN5bWJcbiAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICcgJyBcIicrJ1wiXG4gICAgfCBmYWxzZSwgXywgdHJ1ZSwgXyAgICAtPlxuICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gKCogaWdub3JlICopXG4gICAgICAgIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCBzdHJfaW5kIHBsdXMgaGFzaCBmYWxzZSBzeW1iXG4gICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiJyAnXCJcbiAgICB8IHRydWUsIF8sIGZhbHNlLCBfICAgIC0+XG4gICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiAoKiBpZ25vcmUgKilcbiAgICAgICAgY29tcHV0ZV9pbnRfY29udiBwY3RfaW5kIHN0cl9pbmQgZmFsc2UgaGFzaCBzcGFjZSBzeW1iXG4gICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiJysnXCJcbiAgICB8IGZhbHNlLCBfLCBmYWxzZSwgXyAtPiBhc3NlcnQgZmFsc2VcblxuICAoKiBDb252ZXJ0IChwbHVzLCBzcGFjZSwgc3ltYikgdG8gaXRzIGFzc29jaWF0ZWQgZmxvYXRfY29udi4gKilcbiAgYW5kIGNvbXB1dGVfZmxvYXRfY29udiBwY3RfaW5kIHN0cl9pbmQgcGx1cyBoYXNoIHNwYWNlIHN5bWIgPVxuICAgIGxldCBmbGFnID0gbWF0Y2ggcGx1cywgc3BhY2Ugd2l0aFxuICAgIHwgZmFsc2UsIGZhbHNlIC0+IEZsb2F0X2ZsYWdfXG4gICAgfCBmYWxzZSwgIHRydWUgLT4gRmxvYXRfZmxhZ19zXG4gICAgfCAgdHJ1ZSwgZmFsc2UgLT4gRmxvYXRfZmxhZ19wXG4gICAgfCAgdHJ1ZSwgIHRydWUgLT5cbiAgICAgICgqIHBsdXMgYW5kIHNwYWNlOiBsZWdhY3kgaW1wbGVtZW50YXRpb24gcHJlZmVycyBwbHVzICopXG4gICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiBGbG9hdF9mbGFnX3BcbiAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICcgJyBcIicrJ1wiIGluXG4gICAgbGV0IGtpbmQgPSBtYXRjaCBoYXNoLCBzeW1iIHdpdGhcbiAgICB8IF8sICdmJyAtPiBGbG9hdF9mXG4gICAgfCBfLCAnZScgLT4gRmxvYXRfZVxuICAgIHwgXywgJ0UnIC0+IEZsb2F0X0VcbiAgICB8IF8sICdnJyAtPiBGbG9hdF9nXG4gICAgfCBfLCAnRycgLT4gRmxvYXRfR1xuICAgIHwgXywgJ2gnIC0+IEZsb2F0X2hcbiAgICB8IF8sICdIJyAtPiBGbG9hdF9IXG4gICAgfCBmYWxzZSwgJ0YnIC0+IEZsb2F0X0ZcbiAgICB8IHRydWUsICdGJyAtPiBGbG9hdF9DRlxuICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgaW5cbiAgICBmbGFnLCBraW5kXG5cbiAgKCogUmFpc2UgW0ZhaWx1cmVdIHdpdGggYSBmcmllbmRseSBlcnJvciBtZXNzYWdlIGFib3V0IGluY29tcGF0aWJsZSBvcHRpb25zLiopXG4gIGFuZCBpbmNvbXBhdGlibGVfZmxhZyA6IHR5cGUgYSAuIGludCAtPiBpbnQgLT4gY2hhciAtPiBzdHJpbmcgLT4gYSA9XG4gICAgZnVuIHBjdF9pbmQgc3RyX2luZCBzeW1iIG9wdGlvbiAtPlxuICAgICAgbGV0IHN1YmZtdCA9IFN0cmluZy5zdWIgc3RyIHBjdF9pbmQgKHN0cl9pbmQgLSBwY3RfaW5kKSBpblxuICAgICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCBcXFxuICAgICAgICAgJXMgaXMgaW5jb21wYXRpYmxlIHdpdGggJyVjJyBpbiBzdWItZm9ybWF0ICVTXCJcbiAgICAgICAgc3RyIHBjdF9pbmQgb3B0aW9uIHN5bWIgc3ViZm10XG5cbiAgaW4gcGFyc2UgMCAoU3RyaW5nLmxlbmd0aCBzdHIpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAoKiBHdWFyZGVkIHN0cmluZyB0byBmb3JtYXQgY29udmVyc2lvbnMgKilcblxuKCogQ29udmVydCBhIHN0cmluZyB0byBhIGZvcm1hdCBhY2NvcmRpbmcgdG8gYW4gZm10dHkuICopXG4oKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluIGNhc2Ugb2YgdHlwZSBtaXNtYXRjaC4gKilcbmxldCBmb3JtYXRfb2Zfc3RyaW5nX2ZtdHR5IHN0ciBmbXR0eSA9XG4gIGxldCBGbXRfRUJCIGZtdCA9IGZtdF9lYmJfb2Zfc3RyaW5nIHN0ciBpblxuICB0cnkgRm9ybWF0ICh0eXBlX2Zvcm1hdCBmbXQgZm10dHksIHN0cilcbiAgd2l0aCBUeXBlX21pc21hdGNoIC0+XG4gICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgXCJiYWQgaW5wdXQ6IGZvcm1hdCB0eXBlIG1pc21hdGNoIGJldHdlZW4gJVMgYW5kICVTXCJcbiAgICAgIHN0ciAoc3RyaW5nX29mX2ZtdHR5IGZtdHR5KVxuXG4oKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgZm9ybWF0IGNvbXBhdGlibGUgd2l0aCBhbiBvdGhlciBmb3JtYXQuICopXG4oKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluIGNhc2Ugb2YgdHlwZSBtaXNtYXRjaC4gKilcbmxldCBmb3JtYXRfb2Zfc3RyaW5nX2Zvcm1hdCBzdHIgKEZvcm1hdCAoZm10Jywgc3RyJykpID1cbiAgbGV0IEZtdF9FQkIgZm10ID0gZm10X2ViYl9vZl9zdHJpbmcgc3RyIGluXG4gIHRyeSBGb3JtYXQgKHR5cGVfZm9ybWF0IGZtdCAoZm10dHlfb2ZfZm10IGZtdCcpLCBzdHIpXG4gIHdpdGggVHlwZV9taXNtYXRjaCAtPlxuICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgIFwiYmFkIGlucHV0OiBmb3JtYXQgdHlwZSBtaXNtYXRjaCBiZXR3ZWVuICVTIGFuZCAlU1wiIHN0ciBzdHInXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfYmxpdF9zdHJpbmciLCJjYW1sX2J5dGVzX3NldCIsImNhbWxfY3JlYXRlX2J5dGVzIiwiY2FtbF9mb3JtYXRfZmxvYXQiLCJjYW1sX2Zvcm1hdF9pbnQiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX21sX3N0cmluZ19sZW5ndGgiLCJjYW1sX25vdGVxdWFsIiwiY2FtbF9zdHJpbmdfZ2V0IiwiY2FtbF9zdHJpbmdfdW5zYWZlX2dldCIsImNhbWxfdHJhbXBvbGluZSIsImNhbWxfdHJhbXBvbGluZV9yZXR1cm4iLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImNhbWxfY2FsbDMiLCJhMiIsImNhbWxfY2FsbDQiLCJhMyIsImNhbWxfY2FsbDUiLCJhNCIsImR1bW15IiwiZ2xvYmFsX2RhdGEiLCJBc3NlcnRfZmFpbHVyZSIsIkNhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcyIsIlN0ZGxpYiIsIlN0ZGxpYl9CdWZmZXIiLCJTdGRsaWJfU3RyaW5nIiwiU3RkbGliX1N5cyIsIlN0ZGxpYl9DaGFyIiwiU3RkbGliX0J5dGVzIiwiU3RkbGliX0ludCIsImNyZWF0ZV9jaGFyX3NldCIsInBhcmFtIiwiYWRkX2luX2NoYXJfc2V0IiwiY2hhcl9zZXQiLCJjIiwic3RyX2luZCIsIm1hc2siLCJmcmVlemVfY2hhcl9zZXQiLCJyZXZfY2hhcl9zZXQiLCJpIiwiaXNfaW5fY2hhcl9zZXQiLCJwYWRfb2ZfcGFkX29wdCIsInBhZF9vcHQiLCJ3aWR0aCIsInBhcmFtX2Zvcm1hdF9vZl9pZ25vcmVkX2Zvcm1hdCIsImlnbiIsImZtdCIsImljb252IiwicHJlY19vcHQiLCJuZGVjIiwiZm10dHkiLCJ3aWR0aF9vcHQiLCJjb3VudGVyIiwiZGVmYXVsdF9mbG9hdF9wcmVjaXNpb24iLCJmY29udiIsImJ1ZmZlcl9jcmVhdGUiLCJpbml0X3NpemUiLCJidWZmZXJfY2hlY2tfc2l6ZSIsImJ1ZiIsIm92ZXJoZWFkIiwibGVuIiwibWluX2xlbiIsIm5ld19sZW4iLCJuZXdfc3RyIiwiYnVmZmVyX2FkZF9jaGFyIiwiYnVmZmVyX2FkZF9zdHJpbmciLCJzIiwic3RyX2xlbiIsImJ1ZmZlcl9jb250ZW50cyIsImNoYXJfb2ZfaWNvbnYiLCJjaGFyX29mX2Zjb252Iiwib3B0IiwiY0YiLCJicHJpbnRfY2hhcl9zZXQiLCJwcmludF9jaGFyIiwic2V0IiwiaXNfYWxvbmUiLCJhZnRlciIsImJlZm9yZSIsInN3aXRjaGVyIiwiaiIsImJwcmludF9wYWR0eSIsInBhZHR5IiwiYnByaW50X2lnbm9yZWRfZmxhZyIsImlnbl9mbGFnIiwiYnByaW50X3BhZF9vcHQiLCJicHJpbnRfcGFkZGluZyIsInBhZCIsIm4iLCJicHJpbnRfcHJlY2lzaW9uIiwicHJlYyIsImJwcmludF9pY29udl9mbGFnIiwiYnByaW50X2FsdGludF9mbXQiLCJicHJpbnRfZmNvbnZfZmxhZyIsInN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCIsImZvcm1hdHRpbmdfbGl0Iiwic3RyIiwiYnByaW50X2NoYXJfbGl0ZXJhbCIsImNociIsImJwcmludF9zdHJpbmdfbGl0ZXJhbCIsImNzdF9MaSIsImNzdF9pIiwiY3N0X2xpIiwiY3N0X25pIiwiYnByaW50X2ZtdHR5Iiwic3ViX2ZtdHR5IiwiaW50X29mX2N1c3RvbV9hcml0eSIsIngiLCJjc3QiLCJzdHJpbmdfb2ZfZm10IiwiZm10aXRlciIsInJlc3QiLCJmbXRpbmdfbGl0IiwiZm10aW5nX2dlbiIsImFyaXR5Iiwic3ltbSIsInR5IiwidHkyIiwidHkxIiwiZm10dHlfcmVsX2RldCIsIm1hdGNoIiwiZGUiLCJhZiIsImpkIiwiZ2EiLCJjc3RfY2FtbGludGVybmFsRm9ybWF0X21sIiwidHJhbnMiLCJyZXN0MSIsInJlc3QyIiwidHkxMiIsInR5MTEiLCJ0eTIyIiwidHkyMSIsImY0IiwiZjIiLCJmbXR0eV9vZl9mbXQiLCJ0eV9yZXN0IiwicHJlY190eSIsImZvcm1hdHRpbmdfZ2VuIiwiZm10dHlfb2ZfY3VzdG9tIiwiZm10dHlfb2ZfcGFkZGluZ19mbXR0eSIsImZtdHR5X29mX3ByZWNpc2lvbl9mbXR0eSIsIlR5cGVfbWlzbWF0Y2giLCJ0eXBlX3BhZGRpbmciLCJ3IiwidHlwZV9wYWRwcmVjIiwicCIsInR5cGVfZm9ybWF0IiwidHlwZV9mb3JtYXRfZ2VuIiwiZm10dHkwIiwiZm10dHlfcmVzdCIsImZtdF9yZXN0Iiwic3ViX2ZtdHR5MSIsImZtdDEiLCJmbXR0eTIiLCJmbXQyIiwiZm10dHkzIiwiZm10MyIsInR5cGVfaWdub3JlZF9wYXJhbV9vbmUiLCJ0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGkiLCJzdWJfZm10dHlfcmVzdCIsInN1YjJfZm10dHkiLCJzdWIxX2ZtdHR5IiwicmVjYXN0IiwiZml4X3BhZGRpbmciLCJyZXMiLCJmaXhfaW50X3ByZWNpc2lvbiIsInN0cmluZ190b19jYW1sX3N0cmluZyIsImwiLCJmb3JtYXRfb2ZfZmNvbnYiLCJzeW1iIiwidHJhbnNmb3JtX2ludF9hbHQiLCJwb3MiLCJwdXQiLCJsZWZ0IiwiY3N0X3UiLCJjb252ZXJ0X2ludCIsImNvbnZlcnRfaW50MzIiLCJjb252ZXJ0X25hdGl2ZWludCIsImNvbnZlcnRfaW50NjQiLCJjb252ZXJ0X2Zsb2F0IiwiaGV4Iiwic2lnbiIsImNhbWxfc3BlY2lhbF92YWwiLCJzdHJpbmdfb2ZfZm10dHkiLCJtYWtlX3ByaW50ZiIsImsiLCJhY2MiLCJrYWNjIiwibmV3X2FjYyIsIm8iLCJtYWtlX2lnbm9yZWRfcGFyYW0iLCJtYWtlX2Zyb21fZm10dHkiLCJtYWtlX2ludmFsaWRfYXJnIiwibWFrZV9wYWRkaW5nIiwibWFrZV9pbnRfcGFkZGluZ19wcmVjaXNpb24iLCJtYWtlX2N1c3RvbSIsIm1ha2VfaXByaW50ZiIsImtvYyIsImZuX29mX2N1c3RvbV9hcml0eSIsIm91dHB1dF9hY2MiLCJtc2ciLCJidWZwdXRfYWNjIiwiYiIsInN0cnB1dF9hY2MiLCJmYWlsd2l0aF9tZXNzYWdlIiwib3Blbl9ib3hfb2Zfc3RyaW5nIiwiaW52YWxpZF9ib3giLCJwYXJzZV9zcGFjZXMiLCJ3c3RhcnQiLCJ3ZW5kIiwiYm94X25hbWUiLCJuc3RhcnQiLCJuZW5kIiwiaW5kZW50IiwiZXhuIiwiZXhwX2VuZCIsImJveF90eXBlIiwibWFrZV9wYWRkaW5nX2ZtdF9lYmIiLCJtYWtlX3BhZHByZWNfZm10X2ViYiIsImNzdF9hdF9jaGFyYWN0ZXJfbnVtYmVyIiwiY3N0X2ludmFsaWRfZm9ybWF0Iiwic3ViX2Zvcm1hdCIsImZtdF9lYmJfb2Zfc3RyaW5nIiwibGVnYWN5X2JlaGF2aW9yIiwiZmxhZyIsImludmFsaWRfZm9ybWF0X21lc3NhZ2UiLCJpbnZhbGlkX2Zvcm1hdF93aXRob3V0IiwiZXhwZWN0ZWRfY2hhcmFjdGVyIiwiZXhwZWN0ZWQiLCJyZWFkIiwiY3N0X3VuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCIsInBhcnNlIiwibGl0X3N0YXJ0IiwiZW5kX2luZCIsImNzdF8wIiwicGFyc2VfZmxhZ3MiLCJwY3RfaW5kIiwic2V0X2ZsYWciLCJ6ZXJvIiwibWludXMiLCJwbHVzIiwic3BhY2UiLCJoYXNoIiwibmV3X2luZCIsImNzdF9wcmVjaXNpb24iLCJwYXJzZV9hZnRlcl9wYWRkaW5nIiwicGFyc2VfbGl0ZXJhbCIsInBhcnNlX2FmdGVyX3ByZWNpc2lvbiIsInBhcnNlX2NvbnYiLCJwYWRwcmVjIiwicGFyc2VfY29udmVyc2lvbiIsInBsdXNfdXNlZCIsImdldF9wbHVzIiwiaGFzaF91c2VkIiwiZ2V0X2hhc2giLCJzcGFjZV91c2VkIiwiZ2V0X3NwYWNlIiwiaWduX3VzZWQiLCJnZXRfaWduIiwicGFkX3VzZWQiLCJnZXRfcGFkIiwicHJlY191c2VkIiwiZ2V0X3ByZWMiLCJnZXRfcGFkcHJlYyIsImdldF9pbnRfcGFkIiwiY2hlY2tfbm9fMCIsIm9wdF9vZl9wYWQiLCJnZXRfcGFkX29wdCIsImdldF9wYWRwcmVjX29wdCIsImZtdF9yZXN1bHQiLCJzdWJfZW5kIiwic3ViX2ZtdCIsImlnbm9yZWQiLCJuZXh0X2luZCIsImNoYXJfZm9ybWF0Iiwia2luZCIsInBhcnNlX2FmdGVyX2F0Iiwic3RyX2luZF8xIiwic3RyX2luZF8yIiwic3RyX2luZF8zIiwib2Zmc2V0Iiwic3RyX2luZF80Iiwic3RyX2luZF81Iiwic2l6ZSIsInBhcnNlX3RhZyIsImlzX29wZW5fdGFnIiwiaW5kIiwic3ViX3N0ciIsImZvcm1hdHRpbmciLCJwYXJzZV9jaGFyX3NldCIsImFkZF9yYW5nZSIsImZhaWxfc2luZ2xlX3BlcmNlbnQiLCJwYXJzZV9jaGFyX3NldF9jb250ZW50IiwicGFyc2VfY2hhcl9zZXRfYWZ0ZXJfY2hhciIsInJldmVyc2UiLCJwYXJzZV9wb3NpdGl2ZSIsInBhcnNlX2ludGVnZXIiLCJhZGRfbGl0ZXJhbCIsInNlYXJjaF9zdWJmb3JtYXRfZW5kIiwiY29tcHV0ZV9pbnRfY29udiIsImluY29tcGF0aWJsZV9mbGFnIiwib3B0aW9uIiwic3ViZm10IiwiY3N0X2FuZCIsImNzdF9iYWRfaW5wdXRfZm9ybWF0X3R5cGVfbWlzbSIsImZvcm1hdF9vZl9zdHJpbmdfZm10dHkiLCJmb3JtYXRfb2Zfc3RyaW5nX2Zvcm1hdCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsb0JBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsSUFBQUMsOEJBQUE7QUFBQSxJQUFBQyx3QkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsa0JBQUE7QUFBQSxJQUFBQyx5QkFBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsSUFBQUMseUJBQUE7QUFBQSxJQUFBQyxzQkFBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FB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MjE4ODUsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvcHJpbnRmLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBYYXZpZXIgTGVyb3kgYW5kIFBpZXJyZSBXZWlzLCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5vcGVuIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljc1xub3BlbiBDYW1saW50ZXJuYWxGb3JtYXRcblxubGV0IGtmcHJpbnRmIGsgbyAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIG1ha2VfcHJpbnRmIChmdW4gYWNjIC0+IG91dHB1dF9hY2MgbyBhY2M7IGsgbykgRW5kX29mX2FjYyBmbXRcbmxldCBrYnByaW50ZiBrIGIgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBtYWtlX3ByaW50ZiAoZnVuIGFjYyAtPiBidWZwdXRfYWNjIGIgYWNjOyBrIGIpIEVuZF9vZl9hY2MgZm10XG5sZXQgaWtmcHJpbnRmIGsgb2MgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBtYWtlX2lwcmludGYgayBvYyBmbXRcbmxldCBpa2JwcmludGYgPSBpa2ZwcmludGZcblxubGV0IGZwcmludGYgb2MgZm10ID0ga2ZwcmludGYgaWdub3JlIG9jIGZtdFxubGV0IGJwcmludGYgYiBmbXQgPSBrYnByaW50ZiBpZ25vcmUgYiBmbXRcbmxldCBpZnByaW50ZiBvYyBmbXQgPSBpa2ZwcmludGYgaWdub3JlIG9jIGZtdFxubGV0IGlicHJpbnRmIGIgZm10ID0gaWticHJpbnRmIGlnbm9yZSBiIGZtdFxubGV0IHByaW50ZiBmbXQgPSBmcHJpbnRmIHN0ZG91dCBmbXRcbmxldCBlcHJpbnRmIGZtdCA9IGZwcmludGYgc3RkZXJyIGZtdFxuXG5sZXQga3NwcmludGYgayAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIGxldCBrJyBhY2MgPVxuICAgIGxldCBidWYgPSBCdWZmZXIuY3JlYXRlIDY0IGluXG4gICAgc3RycHV0X2FjYyBidWYgYWNjO1xuICAgIGsgKEJ1ZmZlci5jb250ZW50cyBidWYpIGluXG4gIG1ha2VfcHJpbnRmIGsnIEVuZF9vZl9hY2MgZm10XG5cbmxldCBzcHJpbnRmIGZtdCA9IGtzcHJpbnRmIChmdW4gcyAtPiBzKSBmbXRcblxubGV0IGtwcmludGYgPSBrc3ByaW50ZlxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfQnVmZmVyIiwiQ2FtbGludGVybmFsRm9ybWF0IiwiU3RkbGliIiwia2ZwcmludGYiLCJrIiwibyIsInBhcmFtIiwiZm10IiwiYWNjIiwia2JwcmludGYiLCJiIiwiaWtmcHJpbnRmIiwib2MiLCJmcHJpbnRmIiwiYnByaW50ZiIsImlmcHJpbnRmIiwiaWJwcmludGYiLCJwcmludGYiLCJlcHJpbnRmIiwia3NwcmludGYiLCJidWYiLCJzcHJpbnRmIiwicyJdLCJtYXBwaW5ncyI6Ik9BQUFBLFVBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxxQkFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxZQUFBQyxTQUFBQyxHQUFBQyxHQUFBQztBQUFBQSxRQUFBQyxNQ2tCYTtBQUFBLElBQ1g7QUFBQTtBQUFBLHNCQUFBQztBQUFBQSxjQUF3QjtBQUFBLGNBQWdCLHVCQUFLO0FBQUE7QUFBQTtBQUFBLGlCQUFnQjtBQUFBO0FBQUEsWUFBQUMsU0FBQUwsR0FBQU0sR0FBQUo7QUFBQUEsUUFBQUMsTUFDbEQ7QUFBQSxJQUNYO0FBQUE7QUFBQSxzQkFBQUM7QUFBQUEsY0FBd0I7QUFBQSxjQUFnQix1QkFBSztBQUFBO0FBQUE7QUFBQSxpQkFBZ0I7QUFBQTtBQUFBLFlBQUFHLFVBQUFQLEdBQUFRLElBQUFOO0FBQUFBLFFBQUFDLE1BQ2pEO0FBQUEsSUFDWixtREFBcUI7QUFBQTtBQUFBLFlBQUFNLFFBQUFELElBQUFMO0FBQUFBLElBR0YsNEJEMUJyQixvQkMwQjJDO0FBQUE7QUFBQSxZQUFBTyxRQUFBSixHQUFBSCxLQUN2Qiw0QkQzQnBCLG1CQzJCeUM7QUFBQSxZQUFBUSxTQUFBSCxJQUFBTDtBQUFBQSxJQUNuQiw2QkQ1QnRCLG9CQzRCNkM7QUFBQTtBQUFBLFlBQUFTLFNBQUFOLEdBQUFIO0FBQUFBLElBQ3hCLDZCRDdCckIsbUJDNkIyQztBQUFBO0FBQUEsWUFBQVUsT0FBQVYsS0FDMUIsK0JBQWtCO0FBQUEsWUFBQVcsUUFBQVgsS0FDakIsK0JBQWtCO0FBQUEsWUFBQVksU0FBQWYsR0FBQUU7QUFBQUEsUUFBQUMsTUFFdkI7QUFBQSxhQUFBSCxJQUFBSTtBQUFBQSxTQUFBWSxNQUVDO0FBQUEsS0FDVjtBQUFBLEtBQ0UsT0FBcUIsY0FBckIsaUNBQXFCO0FBQUE7QUFBQSxJQUN6QixvREFBNkI7QUFBQTtBQUFBLFlBQUFDLFFBQUFkLEtBRWIseUJBQUFlLEdBQW1CLFNBQUMsT0FBSztBQUFBLEdEeEMzQyIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjIxOTcxLCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL3ByaW50ZXhjLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5vcGVuIFByaW50ZlxuXG50eXBlIHQgPSBleG4gPSAuLlxuXG5sZXQgcHJpbnRlcnMgPSBBdG9taWMubWFrZSBbXVxuXG5sZXQgbG9jZm10ID0gZm9ybWF0X29mX3N0cmluZyBcIkZpbGUgXFxcIiVzXFxcIiwgbGluZSAlZCwgY2hhcmFjdGVycyAlZC0lZDogJXNcIlxuXG5sZXQgZmllbGQgeCBpID1cbiAgbGV0IGYgPSBPYmouZmllbGQgeCBpIGluXG4gIGlmIG5vdCAoT2JqLmlzX2Jsb2NrIGYpIHRoZW5cbiAgICBzcHJpbnRmIFwiJWRcIiAoT2JqLm1hZ2ljIGYgOiBpbnQpICAgICAgICAgICAoKiBjYW4gYWxzbyBiZSBhIGNoYXIgKilcbiAgZWxzZSBpZiBPYmoudGFnIGYgPSBPYmouc3RyaW5nX3RhZyB0aGVuXG4gICAgc3ByaW50ZiBcIiVTXCIgKE9iai5tYWdpYyBmIDogc3RyaW5nKVxuICBlbHNlIGlmIE9iai50YWcgZiA9IE9iai5kb3VibGVfdGFnIHRoZW5cbiAgICBzdHJpbmdfb2ZfZmxvYXQgKE9iai5tYWdpYyBmIDogZmxvYXQpXG4gIGVsc2VcbiAgICBcIl9cIlxuXG5sZXQgcmVjIG90aGVyX2ZpZWxkcyB4IGkgPVxuICBpZiBpID49IE9iai5zaXplIHggdGhlbiBcIlwiXG4gIGVsc2Ugc3ByaW50ZiBcIiwgJXMlc1wiIChmaWVsZCB4IGkpIChvdGhlcl9maWVsZHMgeCAoaSsxKSlcblxubGV0IGZpZWxkcyB4ID1cbiAgbWF0Y2ggT2JqLnNpemUgeCB3aXRoXG4gIHwgMCAtPiBcIlwiXG4gIHwgMSAtPiBcIlwiXG4gIHwgMiAtPiBzcHJpbnRmIFwiKCVzKVwiIChmaWVsZCB4IDEpXG4gIHwgXyAtPiBzcHJpbnRmIFwiKCVzJXMpXCIgKGZpZWxkIHggMSkgKG90aGVyX2ZpZWxkcyB4IDIpXG5cbmxldCB1c2VfcHJpbnRlcnMgeCA9XG4gIGxldCByZWMgY29udiA9IGZ1bmN0aW9uXG4gICAgfCBoZCA6OiB0bCAtPlxuICAgICAgICAobWF0Y2ggaGQgeCB3aXRoXG4gICAgICAgICB8IE5vbmUgfCBleGNlcHRpb24gXyAtPiBjb252IHRsXG4gICAgICAgICB8IFNvbWUgcyAtPiBTb21lIHMpXG4gICAgfCBbXSAtPiBOb25lIGluXG4gIGNvbnYgKEF0b21pYy5nZXQgcHJpbnRlcnMpXG5cbmxldCBkZXN0cnVjdF9leHRfY29uc3RydWN0b3IgeCA9XG4gIGlmIE9iai50YWcgeCA8PiAwIHRoZW5cbiAgICAoKE9iai5tYWdpYyAoT2JqLmZpZWxkIHggMCkgOiBzdHJpbmcpLCBOb25lKVxuICBlbHNlXG4gICAgbGV0IGNvbnN0cnVjdG9yID1cbiAgICAgIChPYmoubWFnaWMgKE9iai5maWVsZCAoT2JqLmZpZWxkIHggMCkgMCkgOiBzdHJpbmcpIGluXG4gICAgKGNvbnN0cnVjdG9yLCBTb21lIChmaWVsZHMgeCkpXG5cbmxldCBzdHJpbmdfb2ZfZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIHQgPVxuICBsZXQgY29uc3RydWN0b3IsIGZpZWxkc19vcHQgPSBkZXN0cnVjdF9leHRfY29uc3RydWN0b3IgdCBpblxuICBtYXRjaCBmaWVsZHNfb3B0IHdpdGhcbiAgfCBOb25lIC0+IGNvbnN0cnVjdG9yXG4gIHwgU29tZSBmIC0+IGNvbnN0cnVjdG9yIF4gZlxuXG5sZXQgdG9fc3RyaW5nX2RlZmF1bHQgPSBmdW5jdGlvblxuICB8IE91dF9vZl9tZW1vcnkgLT4gXCJPdXQgb2YgbWVtb3J5XCJcbiAgfCBTdGFja19vdmVyZmxvdyAtPiBcIlN0YWNrIG92ZXJmbG93XCJcbiAgfCBNYXRjaF9mYWlsdXJlKGZpbGUsIGxpbmUsIGNoYXIpIC0+XG4gICAgICBzcHJpbnRmIGxvY2ZtdCBmaWxlIGxpbmUgY2hhciAoY2hhcis1KSBcIlBhdHRlcm4gbWF0Y2hpbmcgZmFpbGVkXCJcbiAgfCBBc3NlcnRfZmFpbHVyZShmaWxlLCBsaW5lLCBjaGFyKSAtPlxuICAgICAgc3ByaW50ZiBsb2NmbXQgZmlsZSBsaW5lIGNoYXIgKGNoYXIrNikgXCJBc3NlcnRpb24gZmFpbGVkXCJcbiAgfCBVbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZShmaWxlLCBsaW5lLCBjaGFyKSAtPlxuICAgICAgc3ByaW50ZiBsb2NmbXQgZmlsZSBsaW5lIGNoYXIgKGNoYXIrNikgXCJVbmRlZmluZWQgcmVjdXJzaXZlIG1vZHVsZVwiXG4gIHwgeCAtPlxuICAgICAgc3RyaW5nX29mX2V4dGVuc2lvbl9jb25zdHJ1Y3RvciAoT2JqLnJlcHIgeClcblxubGV0IHRvX3N0cmluZyBlID1cbiAgbWF0Y2ggdXNlX3ByaW50ZXJzIGUgd2l0aFxuICB8IFNvbWUgcyAtPiBzXG4gIHwgTm9uZSAtPiB0b19zdHJpbmdfZGVmYXVsdCBlXG5cbmxldCBwcmludCBmY3QgYXJnID1cbiAgdHJ5XG4gICAgZmN0IGFyZ1xuICB3aXRoIHggLT5cbiAgICBlcHJpbnRmIFwiVW5jYXVnaHQgZXhjZXB0aW9uOiAlc1xcblwiICh0b19zdHJpbmcgeCk7XG4gICAgZmx1c2ggc3RkZXJyO1xuICAgIHJhaXNlIHhcblxubGV0IGNhdGNoIGZjdCBhcmcgPVxuICB0cnlcbiAgICBmY3QgYXJnXG4gIHdpdGggeCAtPlxuICAgIGZsdXNoIHN0ZG91dDtcbiAgICBlcHJpbnRmIFwiVW5jYXVnaHQgZXhjZXB0aW9uOiAlc1xcblwiICh0b19zdHJpbmcgeCk7XG4gICAgZXhpdCAyXG5cbnR5cGUgcmF3X2JhY2t0cmFjZV9zbG90XG50eXBlIHJhd19iYWNrdHJhY2VfZW50cnkgPSBwcml2YXRlIGludFxudHlwZSByYXdfYmFja3RyYWNlID0gcmF3X2JhY2t0cmFjZV9lbnRyeSBhcnJheVxuXG5sZXQgcmF3X2JhY2t0cmFjZV9lbnRyaWVzIGJ0ID0gYnRcblxuZXh0ZXJuYWwgZ2V0X3Jhd19iYWNrdHJhY2U6XG4gIHVuaXQgLT4gcmF3X2JhY2t0cmFjZSA9IFwiY2FtbF9nZXRfZXhjZXB0aW9uX3Jhd19iYWNrdHJhY2VcIlxuXG5leHRlcm5hbCByYWlzZV93aXRoX2JhY2t0cmFjZTogZXhuIC0+IHJhd19iYWNrdHJhY2UgLT4gJ2FcbiAgPSBcIiVyYWlzZV93aXRoX2JhY2t0cmFjZVwiXG5cbigqIERpc2FibGUgd2FybmluZyAzNzogdmFsdWVzIGFyZSBjb25zdHJ1Y3RlZCBpbiB0aGUgcnVudGltZSAqKVxudHlwZVtAd2FybmluZyBcIi0zN1wiXSBiYWNrdHJhY2Vfc2xvdCA9XG4gIHwgS25vd25fbG9jYXRpb24gb2Yge1xuICAgICAgaXNfcmFpc2UgICA6IGJvb2w7XG4gICAgICBmaWxlbmFtZSAgIDogc3RyaW5nO1xuICAgICAgc3RhcnRfbG51bSA6IGludDtcbiAgICAgIHN0YXJ0X2NoYXIgOiBpbnQ7XG4gICAgICBlbmRfb2Zmc2V0IDogaW50OyAoKiBSZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2Ygc3RhcnRfbG51bSAqKVxuICAgICAgZW5kX2xudW0gICA6IGludDtcbiAgICAgIGVuZF9jaGFyICAgOiBpbnQ7ICgqIFJlbGF0aXZlIHRvIGJlZ2lubmluZyBvZiBlbmRfbG51bSBsaW5lICopXG4gICAgICBpc19pbmxpbmUgIDogYm9vbDtcbiAgICAgIGRlZm5hbWUgICAgOiBzdHJpbmc7XG4gICAgfVxuICB8IFVua25vd25fbG9jYXRpb24gb2Yge1xuICAgICAgaXNfcmFpc2UgOiBib29sXG4gICAgfVxuXG5leHRlcm5hbCBjb252ZXJ0X3Jhd19iYWNrdHJhY2Vfc2xvdDpcbiAgcmF3X2JhY2t0cmFjZV9zbG90IC0+IGJhY2t0cmFjZV9zbG90ID0gXCJjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZV9zbG90XCJcblxuZXh0ZXJuYWwgY29udmVydF9yYXdfYmFja3RyYWNlOlxuICByYXdfYmFja3RyYWNlIC0+IGJhY2t0cmFjZV9zbG90IGFycmF5ID0gXCJjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZVwiXG5cbmxldCBjb252ZXJ0X3Jhd19iYWNrdHJhY2UgYnQgPVxuICB0cnkgU29tZSAoY29udmVydF9yYXdfYmFja3RyYWNlIGJ0KVxuICB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG5cbmxldCBmb3JtYXRfYmFja3RyYWNlX3Nsb3QgcG9zIHNsb3QgPVxuICBsZXQgaW5mbyBpc19yYWlzZSA9XG4gICAgaWYgaXNfcmFpc2UgdGhlblxuICAgICAgaWYgcG9zID0gMCB0aGVuIFwiUmFpc2VkIGF0XCIgZWxzZSBcIlJlLXJhaXNlZCBhdFwiXG4gICAgZWxzZVxuICAgICAgaWYgcG9zID0gMCB0aGVuIFwiUmFpc2VkIGJ5IHByaW1pdGl2ZSBvcGVyYXRpb24gYXRcIiBlbHNlIFwiQ2FsbGVkIGZyb21cIlxuICBpblxuICBtYXRjaCBzbG90IHdpdGhcbiAgfCBVbmtub3duX2xvY2F0aW9uIGwgLT5cbiAgICAgIGlmIGwuaXNfcmFpc2UgdGhlblxuICAgICAgICAoKiBjb21waWxlci1pbnNlcnRlZCByZS1yYWlzZSwgc2tpcHBlZCAqKSBOb25lXG4gICAgICBlbHNlXG4gICAgICAgIFNvbWUgKHNwcmludGYgXCIlcyB1bmtub3duIGxvY2F0aW9uXCIgKGluZm8gZmFsc2UpKVxuICB8IEtub3duX2xvY2F0aW9uIGwgLT5cbiAgICAgIGxldCBsaW5lcyA9XG4gICAgICAgIGlmIGwuc3RhcnRfbG51bSA9IGwuZW5kX2xudW0gdGhlblxuICAgICAgICAgIFByaW50Zi5zcHJpbnRmIFwiICVkXCIgbC5zdGFydF9sbnVtXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBQcmludGYuc3ByaW50ZiBcInMgJWQtJWRcIiBsLnN0YXJ0X2xudW0gbC5lbmRfbG51bVxuICAgICAgaW5cbiAgICAgIFNvbWUgKHNwcmludGYgXCIlcyAlcyBpbiBmaWxlIFxcXCIlc1xcXCIlcywgbGluZSVzLCBjaGFyYWN0ZXJzICVkLSVkXCJcbiAgICAgICAgICAgICAgKGluZm8gbC5pc19yYWlzZSkgbC5kZWZuYW1lIGwuZmlsZW5hbWVcbiAgICAgICAgICAgICAgKGlmIGwuaXNfaW5saW5lIHRoZW4gXCIgKGlubGluZWQpXCIgZWxzZSBcIlwiKVxuICAgICAgICAgICAgICBsaW5lcyBsLnN0YXJ0X2NoYXIgbC5lbmRfY2hhcilcblxubGV0IHByaW50X2V4Y2VwdGlvbl9iYWNrdHJhY2Ugb3V0Y2hhbiBiYWNrdHJhY2UgPVxuICBtYXRjaCBiYWNrdHJhY2Ugd2l0aFxuICB8IE5vbmUgLT5cbiAgICAgIGZwcmludGYgb3V0Y2hhblxuICAgICAgICBcIihQcm9ncmFtIG5vdCBsaW5rZWQgd2l0aCAtZywgY2Fubm90IHByaW50IHN0YWNrIGJhY2t0cmFjZSlcXG5cIlxuICB8IFNvbWUgYSAtPlxuICAgICAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCBhIC0gMSBkb1xuICAgICAgICBtYXRjaCBmb3JtYXRfYmFja3RyYWNlX3Nsb3QgaSBhLihpKSB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+ICgpXG4gICAgICAgICAgfCBTb21lIHN0ciAtPiBmcHJpbnRmIG91dGNoYW4gXCIlc1xcblwiIHN0clxuICAgICAgZG9uZVxuXG5sZXQgcHJpbnRfcmF3X2JhY2t0cmFjZSBvdXRjaGFuIHJhd19iYWNrdHJhY2UgPVxuICBwcmludF9leGNlcHRpb25fYmFja3RyYWNlIG91dGNoYW4gKGNvbnZlcnRfcmF3X2JhY2t0cmFjZSByYXdfYmFja3RyYWNlKVxuXG4oKiBjb25mdXNpbmdseSBuYW1lZDogcHJpbnRzIHRoZSBnbG9iYWwgY3VycmVudCBiYWNrdHJhY2UgKilcbmxldCBwcmludF9iYWNrdHJhY2Ugb3V0Y2hhbiA9XG4gIHByaW50X3Jhd19iYWNrdHJhY2Ugb3V0Y2hhbiAoZ2V0X3Jhd19iYWNrdHJhY2UgKCkpXG5cbmxldCBiYWNrdHJhY2VfdG9fc3RyaW5nIGJhY2t0cmFjZSA9XG4gIG1hdGNoIGJhY2t0cmFjZSB3aXRoXG4gIHwgTm9uZSAtPlxuICAgICBcIihQcm9ncmFtIG5vdCBsaW5rZWQgd2l0aCAtZywgY2Fubm90IHByaW50IHN0YWNrIGJhY2t0cmFjZSlcXG5cIlxuICB8IFNvbWUgYSAtPlxuICAgICAgbGV0IGIgPSBCdWZmZXIuY3JlYXRlIDEwMjQgaW5cbiAgICAgIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggYSAtIDEgZG9cbiAgICAgICAgbWF0Y2ggZm9ybWF0X2JhY2t0cmFjZV9zbG90IGkgYS4oaSkgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiAoKVxuICAgICAgICAgIHwgU29tZSBzdHIgLT4gYnByaW50ZiBiIFwiJXNcXG5cIiBzdHJcbiAgICAgIGRvbmU7XG4gICAgICBCdWZmZXIuY29udGVudHMgYlxuXG5sZXQgcmF3X2JhY2t0cmFjZV90b19zdHJpbmcgcmF3X2JhY2t0cmFjZSA9XG4gIGJhY2t0cmFjZV90b19zdHJpbmcgKGNvbnZlcnRfcmF3X2JhY2t0cmFjZSByYXdfYmFja3RyYWNlKVxuXG5sZXQgYmFja3RyYWNlX3Nsb3RfaXNfcmFpc2UgPSBmdW5jdGlvblxuICB8IEtub3duX2xvY2F0aW9uIGwgLT4gbC5pc19yYWlzZVxuICB8IFVua25vd25fbG9jYXRpb24gbCAtPiBsLmlzX3JhaXNlXG5cbmxldCBiYWNrdHJhY2Vfc2xvdF9pc19pbmxpbmUgPSBmdW5jdGlvblxuICB8IEtub3duX2xvY2F0aW9uIGwgLT4gbC5pc19pbmxpbmVcbiAgfCBVbmtub3duX2xvY2F0aW9uIF8gLT4gZmFsc2VcblxudHlwZSBsb2NhdGlvbiA9IHtcbiAgZmlsZW5hbWUgOiBzdHJpbmc7XG4gIGxpbmVfbnVtYmVyIDogaW50O1xuICBzdGFydF9jaGFyIDogaW50O1xuICBlbmRfY2hhciA6IGludDtcbiAgZW5kX2xpbmUgOiBpbnQ7XG4gIGVuZF9jb2wgOiBpbnQ7XG59XG5cbmxldCBiYWNrdHJhY2Vfc2xvdF9sb2NhdGlvbiA9IGZ1bmN0aW9uXG4gIHwgVW5rbm93bl9sb2NhdGlvbiBfIC0+IE5vbmVcbiAgfCBLbm93bl9sb2NhdGlvbiBsIC0+XG4gICAgU29tZSB7XG4gICAgICBmaWxlbmFtZSAgICA9IGwuZmlsZW5hbWU7XG4gICAgICBsaW5lX251bWJlciA9IGwuc3RhcnRfbG51bTtcbiAgICAgIHN0YXJ0X2NoYXIgID0gbC5zdGFydF9jaGFyO1xuICAgICAgZW5kX2NoYXIgICAgPSBsLmVuZF9vZmZzZXQ7XG4gICAgICBlbmRfbGluZSAgICA9IGwuZW5kX2xudW07XG4gICAgICBlbmRfY29sICAgICA9IGwuZW5kX2NoYXI7XG4gICAgfVxuXG5sZXQgYmFja3RyYWNlX3Nsb3RfZGVmbmFtZSA9IGZ1bmN0aW9uXG4gIHwgVW5rbm93bl9sb2NhdGlvbiBfXG4gIHwgS25vd25fbG9jYXRpb24geyBkZWZuYW1lID0gXCJcIiB9IC0+IE5vbmVcbiAgfCBLbm93bl9sb2NhdGlvbiBsIC0+IFNvbWUgbC5kZWZuYW1lXG5cbmxldCBiYWNrdHJhY2Vfc2xvdHMgcmF3X2JhY2t0cmFjZSA9XG4gICgqIFRoZSBkb2N1bWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gZ3VhcmFudGVlcyB0aGF0IFNvbWUgaXNcbiAgICAgcmV0dXJuZWQgb25seSBpZiBhIHBhcnQgb2YgdGhlIHRyYWNlIGlzIHVzYWJsZS4gVGhpcyBnaXZlcyB1c1xuICAgICBhIGJpdCBtb3JlIHdvcmsgdGhhbiBqdXN0IGNvbnZlcnRfcmF3X2JhY2t0cmFjZSwgYnV0IGl0IG1ha2VzIHRoZVxuICAgICBBUEkgbW9yZSB1c2VyLWZyaWVuZGx5IC0tIG90aGVyd2lzZSBtb3N0IHVzZXJzIHdvdWxkIGhhdmUgdG9cbiAgICAgcmVpbXBsZW1lbnQgdGhlIFwiUHJvZ3JhbSBub3QgbGlua2VkIHdpdGggLWcsIHNvcnJ5XCIgbG9naWNcbiAgICAgdGhlbXNlbHZlcy4gKilcbiAgbWF0Y2ggY29udmVydF9yYXdfYmFja3RyYWNlIHJhd19iYWNrdHJhY2Ugd2l0aFxuICAgIHwgTm9uZSAtPiBOb25lXG4gICAgfCBTb21lIGJhY2t0cmFjZSAtPlxuICAgICAgbGV0IHVzYWJsZV9zbG90ID0gZnVuY3Rpb25cbiAgICAgICAgfCBVbmtub3duX2xvY2F0aW9uIF8gLT4gZmFsc2VcbiAgICAgICAgfCBLbm93bl9sb2NhdGlvbiBfIC0+IHRydWUgaW5cbiAgICAgIGxldCByZWMgZXhpc3RzX3VzYWJsZSA9IGZ1bmN0aW9uXG4gICAgICAgIHwgKC0xKSAtPiBmYWxzZVxuICAgICAgICB8IGkgLT4gdXNhYmxlX3Nsb3QgYmFja3RyYWNlLihpKSB8fCBleGlzdHNfdXNhYmxlIChpIC0gMSkgaW5cbiAgICAgIGlmIGV4aXN0c191c2FibGUgKEFycmF5Lmxlbmd0aCBiYWNrdHJhY2UgLSAxKVxuICAgICAgdGhlbiBTb21lIGJhY2t0cmFjZVxuICAgICAgZWxzZSBOb25lXG5cbmxldCBiYWNrdHJhY2Vfc2xvdHNfb2ZfcmF3X2VudHJ5IGVudHJ5ID1cbiAgYmFja3RyYWNlX3Nsb3RzIFt8IGVudHJ5IHxdXG5cbm1vZHVsZSBTbG90ID0gc3RydWN0XG4gIHR5cGUgdCA9IGJhY2t0cmFjZV9zbG90XG4gIGxldCBmb3JtYXQgPSBmb3JtYXRfYmFja3RyYWNlX3Nsb3RcbiAgbGV0IGlzX3JhaXNlID0gYmFja3RyYWNlX3Nsb3RfaXNfcmFpc2VcbiAgbGV0IGlzX2lubGluZSA9IGJhY2t0cmFjZV9zbG90X2lzX2lubGluZVxuICBsZXQgbG9jYXRpb24gPSBiYWNrdHJhY2Vfc2xvdF9sb2NhdGlvblxuICBsZXQgbmFtZSA9IGJhY2t0cmFjZV9zbG90X2RlZm5hbWVcbmVuZFxuXG5sZXQgcmF3X2JhY2t0cmFjZV9sZW5ndGggYnQgPSBBcnJheS5sZW5ndGggYnRcblxuZXh0ZXJuYWwgZ2V0X3Jhd19iYWNrdHJhY2Vfc2xvdCA6XG4gIHJhd19iYWNrdHJhY2UgLT4gaW50IC0+IHJhd19iYWNrdHJhY2Vfc2xvdCA9IFwiY2FtbF9yYXdfYmFja3RyYWNlX3Nsb3RcIlxuXG5leHRlcm5hbCBnZXRfcmF3X2JhY2t0cmFjZV9uZXh0X3Nsb3QgOlxuICByYXdfYmFja3RyYWNlX3Nsb3QgLT4gcmF3X2JhY2t0cmFjZV9zbG90IG9wdGlvblxuICA9IFwiY2FtbF9yYXdfYmFja3RyYWNlX25leHRfc2xvdFwiXG5cbigqIGNvbmZ1c2luZ2x5IG5hbWVkOlxuICAgcmV0dXJucyB0aGUgKnN0cmluZyogY29ycmVzcG9uZGluZyB0byB0aGUgZ2xvYmFsIGN1cnJlbnQgYmFja3RyYWNlICopXG5sZXQgZ2V0X2JhY2t0cmFjZSAoKSA9IHJhd19iYWNrdHJhY2VfdG9fc3RyaW5nIChnZXRfcmF3X2JhY2t0cmFjZSAoKSlcblxuZXh0ZXJuYWwgcmVjb3JkX2JhY2t0cmFjZTogYm9vbCAtPiB1bml0ID0gXCJjYW1sX3JlY29yZF9iYWNrdHJhY2VcIlxuZXh0ZXJuYWwgYmFja3RyYWNlX3N0YXR1czogdW5pdCAtPiBib29sID0gXCJjYW1sX2JhY2t0cmFjZV9zdGF0dXNcIlxuXG5sZXQgcmVjIHJlZ2lzdGVyX3ByaW50ZXIgZm4gPVxuICBsZXQgb2xkX3ByaW50ZXJzID0gQXRvbWljLmdldCBwcmludGVycyBpblxuICBsZXQgbmV3X3ByaW50ZXJzID0gZm4gOjogb2xkX3ByaW50ZXJzIGluXG4gIGxldCBzdWNjZXNzID0gQXRvbWljLmNvbXBhcmVfYW5kX3NldCBwcmludGVycyBvbGRfcHJpbnRlcnMgbmV3X3ByaW50ZXJzIGluXG4gIGlmIG5vdCBzdWNjZXNzIHRoZW4gcmVnaXN0ZXJfcHJpbnRlciBmblxuXG5leHRlcm5hbCBnZXRfY2FsbHN0YWNrOiBpbnQgLT4gcmF3X2JhY2t0cmFjZSA9IFwiY2FtbF9nZXRfY3VycmVudF9jYWxsc3RhY2tcIlxuXG5sZXQgZXhuX3Nsb3QgeCA9XG4gIGxldCB4ID0gT2JqLnJlcHIgeCBpblxuICBpZiBPYmoudGFnIHggPSAwIHRoZW4gT2JqLmZpZWxkIHggMCBlbHNlIHhcblxubGV0IGV4bl9zbG90X2lkIHggPVxuICBsZXQgc2xvdCA9IGV4bl9zbG90IHggaW5cbiAgKE9iai5vYmogKE9iai5maWVsZCBzbG90IDEpIDogaW50KVxuXG5sZXQgZXhuX3Nsb3RfbmFtZSB4ID1cbiAgbGV0IHNsb3QgPSBleG5fc2xvdCB4IGluXG4gIChPYmoub2JqIChPYmouZmllbGQgc2xvdCAwKSA6IHN0cmluZylcblxuZXh0ZXJuYWwgZ2V0X2RlYnVnX2luZm9fc3RhdHVzIDogdW5pdCAtPiBpbnQgPSBcImNhbWxfbWxfZGVidWdfaW5mb19zdGF0dXNcIlxuXG4oKiBEZXNjcmlwdGlvbnMgZm9yIGVycm9ycyBpbiBzdGFydHVwLmguIFNlZSBhbHNvIGJhY2t0cmFjZS5jICopXG5sZXQgZXJyb3JzID0gW3wgXCJcIjtcbiAgKCogRklMRV9OT1RfRk9VTkQgKilcbiAgXCIoQ2Fubm90IHByaW50IGxvY2F0aW9uczpcXG4gXFxcbiAgICAgIGJ5dGVjb2RlIGV4ZWN1dGFibGUgcHJvZ3JhbSBmaWxlIG5vdCBmb3VuZClcIjtcbiAgKCogQkFEX0JZVEVDT0RFICopXG4gIFwiKENhbm5vdCBwcmludCBsb2NhdGlvbnM6XFxuIFxcXG4gICAgICBieXRlY29kZSBleGVjdXRhYmxlIHByb2dyYW0gZmlsZSBhcHBlYXJzIHRvIGJlIGNvcnJ1cHQpXCI7XG4gICgqIFdST05HX01BR0lDICopXG4gIFwiKENhbm5vdCBwcmludCBsb2NhdGlvbnM6XFxuIFxcXG4gICAgICBieXRlY29kZSBleGVjdXRhYmxlIHByb2dyYW0gZmlsZSBoYXMgd3JvbmcgbWFnaWMgbnVtYmVyKVwiO1xuICAoKiBOT19GRFMgKilcbiAgXCIoQ2Fubm90IHByaW50IGxvY2F0aW9uczpcXG4gXFxcbiAgICAgIGJ5dGVjb2RlIGV4ZWN1dGFibGUgcHJvZ3JhbSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQ7XFxuIFxcXG4gICAgICAtLSB0b28gbWFueSBvcGVuIGZpbGVzLiBUcnkgcnVubmluZyB3aXRoIE9DQU1MUlVOUEFSQU09Yj0yKVwiXG58XVxuXG5sZXQgZGVmYXVsdF91bmNhdWdodF9leGNlcHRpb25faGFuZGxlciBleG4gcmF3X2JhY2t0cmFjZSA9XG4gIGVwcmludGYgXCJGYXRhbCBlcnJvcjogZXhjZXB0aW9uICVzXFxuXCIgKHRvX3N0cmluZyBleG4pO1xuICBwcmludF9yYXdfYmFja3RyYWNlIHN0ZGVyciByYXdfYmFja3RyYWNlO1xuICBsZXQgc3RhdHVzID0gZ2V0X2RlYnVnX2luZm9fc3RhdHVzICgpIGluXG4gIGlmIHN0YXR1cyA8IDAgdGhlblxuICAgIHByZXJyX2VuZGxpbmUgZXJyb3JzLihhYnMgc3RhdHVzKTtcbiAgZmx1c2ggc3RkZXJyXG5cbmxldCB1bmNhdWdodF9leGNlcHRpb25faGFuZGxlciA9IHJlZiBkZWZhdWx0X3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyXG5cbmxldCBzZXRfdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIgZm4gPSB1bmNhdWdodF9leGNlcHRpb25faGFuZGxlciA6PSBmblxuXG5sZXQgZW1wdHlfYmFja3RyYWNlIDogcmF3X2JhY2t0cmFjZSA9IFt8IHxdXG5cbmxldCB0cnlfZ2V0X3Jhd19iYWNrdHJhY2UgKCkgPVxuICB0cnlcbiAgICBnZXRfcmF3X2JhY2t0cmFjZSAoKVxuICB3aXRoIF8gKCogT3V0X29mX21lbW9yeT8gKikgLT5cbiAgICBlbXB0eV9iYWNrdHJhY2VcblxubGV0IGhhbmRsZV91bmNhdWdodF9leGNlcHRpb24nIGV4biBkZWJ1Z2dlcl9pbl91c2UgPVxuICB0cnlcbiAgICAoKiBHZXQgdGhlIGJhY2t0cmFjZSBub3csIGluIGNhc2Ugb25lIG9mIHRoZSBbYXRfZXhpdF0gZnVuY3Rpb25cbiAgICAgICBkZXN0cm95cyBpdC4gKilcbiAgICBsZXQgcmF3X2JhY2t0cmFjZSA9XG4gICAgICBpZiBkZWJ1Z2dlcl9pbl91c2UgKCogU2FtZSB0ZXN0IGFzIGluIFtydW50aW1lL3ByaW50ZXhjLmNdICopIHRoZW5cbiAgICAgICAgZW1wdHlfYmFja3RyYWNlXG4gICAgICBlbHNlXG4gICAgICAgIHRyeV9nZXRfcmF3X2JhY2t0cmFjZSAoKVxuICAgIGluXG4gICAgKHRyeSBTdGRsaWIuZG9fYXRfZXhpdCAoKSB3aXRoIF8gLT4gKCkpO1xuICAgIHRyeVxuICAgICAgIXVuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyIGV4biByYXdfYmFja3RyYWNlXG4gICAgd2l0aCBleG4nIC0+XG4gICAgICBsZXQgcmF3X2JhY2t0cmFjZScgPSB0cnlfZ2V0X3Jhd19iYWNrdHJhY2UgKCkgaW5cbiAgICAgIGVwcmludGYgXCJGYXRhbCBlcnJvcjogZXhjZXB0aW9uICVzXFxuXCIgKHRvX3N0cmluZyBleG4pO1xuICAgICAgcHJpbnRfcmF3X2JhY2t0cmFjZSBzdGRlcnIgcmF3X2JhY2t0cmFjZTtcbiAgICAgIGVwcmludGYgXCJGYXRhbCBlcnJvciBpbiB1bmNhdWdodCBleGNlcHRpb24gaGFuZGxlcjogZXhjZXB0aW9uICVzXFxuXCJcbiAgICAgICAgKHRvX3N0cmluZyBleG4nKTtcbiAgICAgIHByaW50X3Jhd19iYWNrdHJhY2Ugc3RkZXJyIHJhd19iYWNrdHJhY2UnO1xuICAgICAgZmx1c2ggc3RkZXJyXG4gIHdpdGhcbiAgICB8IE91dF9vZl9tZW1vcnkgLT5cbiAgICAgICAgcHJlcnJfZW5kbGluZVxuICAgICAgICAgIFwiRmF0YWwgZXJyb3I6IG91dCBvZiBtZW1vcnkgaW4gdW5jYXVnaHQgZXhjZXB0aW9uIGhhbmRsZXJcIlxuXG4oKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBbY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb25dIGluXG4gICBbcnVudGltZS9wcmludGV4Yy5jXSB3aGljaCBleHBlY3RzIG5vIGV4Y2VwdGlvbiBpcyByYWlzZWQuICopXG5sZXQgaGFuZGxlX3VuY2F1Z2h0X2V4Y2VwdGlvbiBleG4gZGVidWdnZXJfaW5fdXNlID1cbiAgdHJ5XG4gICAgaGFuZGxlX3VuY2F1Z2h0X2V4Y2VwdGlvbicgZXhuIGRlYnVnZ2VyX2luX3VzZVxuICB3aXRoIF8gLT5cbiAgICAoKiBUaGVyZSBpcyBub3QgbXVjaCB3ZSBjYW4gZG8gYXQgdGhpcyBwb2ludCAqKVxuICAgICgpXG5cbmV4dGVybmFsIHJlZ2lzdGVyX25hbWVkX3ZhbHVlIDogc3RyaW5nIC0+ICdhIC0+IHVuaXRcbiAgPSBcImNhbWxfcmVnaXN0ZXJfbmFtZWRfdmFsdWVcIlxuXG5sZXQgKCkgPVxuICByZWdpc3Rlcl9uYW1lZF92YWx1ZSBcIlByaW50ZXhjLmhhbmRsZV91bmNhdWdodF9leGNlcHRpb25cIlxuICAgIGhhbmRsZV91bmNhdWdodF9leGNlcHRpb25cbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9jaGVja19ib3VuZCIsImNhbWxfZ2V0X2V4Y2VwdGlvbl9yYXdfYmFja3RyYSIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfb2JqX3RhZyIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiY2FtbF9jYWxsNSIsImEyIiwiYTMiLCJhNCIsImNhbWxfY2FsbDciLCJhNSIsImE2IiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfUHJpbnRmIiwiU3RkbGliX0F0b21pYyIsIlN0ZGxpYiIsIlN0ZGxpYl9CdWZmZXIiLCJTdGRsaWJfT2JqIiwicHJpbnRlcnMiLCJmaWVsZCIsIngiLCJpIiwiY3N0Iiwib3RoZXJfZmllbGRzIiwidXNlX3ByaW50ZXJzIiwicGFyYW0iLCJ0bCIsImhkIiwidmFsIiwicyIsInN0cmluZ19vZl9leHRlbnNpb25fY29uc3RydWN0byIsInQiLCJjb25zdHJ1Y3RvciIsIm1hdGNoIiwiZmllbGRzX29wdCIsImNzdF9jaGFyYWN0ZXJzIiwibG9jZm10IiwidG9fc3RyaW5nX2RlZmF1bHQiLCJjaGFyIiwibGluZSIsImZpbGUiLCJ0b19zdHJpbmciLCJlIiwiY3N0X1VuY2F1Z2h0X2V4Y2VwdGlvbiIsImNzdF9VbmNhdWdodF9leGNlcHRpb25fcyIsInByaW50IiwiZmN0IiwiYXJnIiwiY2F0Y2gkIiwicmF3X2JhY2t0cmFjZV9lbnRyaWVzIiwiYnQiLCJjb252ZXJ0X3Jhd19iYWNrdHJhY2UiLCJmb3JtYXRfYmFja3RyYWNlX3Nsb3QiLCJwb3MiLCJzbG90IiwiaW5mbyIsImlzX3JhaXNlIiwibGluZXMiLCJjc3RfcyIsImNzdF9Qcm9ncmFtX25vdF9saW5rZWRfd2l0aF9nXyIsInByaW50X3Jhd19iYWNrdHJhY2UiLCJvdXRjaGFuIiwicmF3X2JhY2t0cmFjZSIsImJhY2t0cmFjZSIsImEiLCJzdHIiLCJwcmludF9iYWNrdHJhY2UiLCJyYXdfYmFja3RyYWNlX3RvX3N0cmluZyIsImIiLCJiYWNrdHJhY2Vfc2xvdF9pc19yYWlzZSIsImJhY2t0cmFjZV9zbG90X2lzX2lubGluZSIsImJhY2t0cmFjZV9zbG90X2xvY2F0aW9uIiwiYmFja3RyYWNlX3Nsb3RfZGVmbmFtZSIsImJhY2t0cmFjZV9zbG90cyIsImJhY2t0cmFjZV9zbG90c19vZl9yYXdfZW50cnkiLCJlbnRyeSIsInJhd19iYWNrdHJhY2VfbGVuZ3RoIiwiZ2V0X2JhY2t0cmFjZSIsInJlZ2lzdGVyX3ByaW50ZXIiLCJmbiIsIm9sZF9wcmludGVycyIsIm5ld19wcmludGVycyIsInN1Y2Nlc3MiLCJleG5fc2xvdCIsImV4bl9zbG90X2lkIiwiZXhuX3Nsb3RfbmFtZSIsImVycm9ycyIsImNzdF9GYXRhbF9lcnJvcl9leGNlcHRpb24iLCJjc3RfRmF0YWxfZXJyb3JfZXhjZXB0aW9uX3MiLCJkZWZhdWx0X3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW4iLCJleG4iLCJzdGF0dXMiLCJ1bmNhdWdodF9leGNlcHRpb25faGFuZGxlciIsInNldF91bmNhdWdodF9leGNlcHRpb25faGFuZGxlciIsImVtcHR5X2JhY2t0cmFjZSIsImhhbmRsZV91bmNhdWdodF9leGNlcHRpb24iLCJkZWJ1Z2dlcl9pbl91c2UiLCJTdGRsaWJfUHJpbnRleGMiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxpQ0FBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFdBQUFGLEdBQUFDLElBQUFFO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQyxXQUFBSixHQUFBQyxJQUFBRSxJ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QUFBQSxZQW1Cd0M7QUFBQSxPQUF0QztBQUFBLE9BQ0E7QUFBQSxlQUVFO0FBQUEsT0FERjtBQUFBLE9BRUE7QUFBQSxlQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUEsV0FBQTRCO0FBQUFBLFVBQUFBLE1EeldOO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0M0V1E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBQUFBLEtBVUo7QUFBQSxHQUFFO0FBQUEsR0FNSjtBQUFBO0FBQUE7QUFBQSxJQUFBTztBQUFBQSxNQUMyQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVEN1g3QiIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjIyNDUzLCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2Z1bi5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBPQ2FtbCBwcm9ncmFtbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTggSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuZXh0ZXJuYWwgaWQgOiAnYSAtPiAnYSA9IFwiJWlkZW50aXR5XCJcbmxldCBjb25zdCBjIF8gPSBjXG5sZXQgY29tcG9zZSBmIGcgeCA9IGYgKGcgeClcbmxldCBmbGlwIGYgeCB5ID0gZiB5IHhcbmxldCBuZWdhdGUgcCB2ID0gbm90IChwIHYpXG5cbmV4Y2VwdGlvbiBGaW5hbGx5X3JhaXNlZCBvZiBleG5cblxubGV0ICgpID0gUHJpbnRleGMucmVnaXN0ZXJfcHJpbnRlciBAQCBmdW5jdGlvblxufCBGaW5hbGx5X3JhaXNlZCBleG4gLT4gU29tZSAoXCJGdW4uRmluYWxseV9yYWlzZWQ6IFwiIF4gUHJpbnRleGMudG9fc3RyaW5nIGV4bilcbnwgXyAtPiBOb25lXG5cbmxldCBwcm90ZWN0IH4oZmluYWxseSA6IHVuaXQgLT4gdW5pdCkgd29yayA9XG4gIGxldCBmaW5hbGx5X25vX2V4biAoKSA9XG4gICAgdHJ5IGZpbmFsbHkgKCkgd2l0aCBlIC0+XG4gICAgICBsZXQgYnQgPSBQcmludGV4Yy5nZXRfcmF3X2JhY2t0cmFjZSAoKSBpblxuICAgICAgUHJpbnRleGMucmFpc2Vfd2l0aF9iYWNrdHJhY2UgKEZpbmFsbHlfcmFpc2VkIGUpIGJ0XG4gIGluXG4gIG1hdGNoIHdvcmsgKCkgd2l0aFxuICB8IHJlc3VsdCAtPiBmaW5hbGx5X25vX2V4biAoKSA7IHJlc3VsdFxuICB8IGV4Y2VwdGlvbiB3b3JrX2V4biAtPlxuICAgICAgbGV0IHdvcmtfYnQgPSBQcmludGV4Yy5nZXRfcmF3X2JhY2t0cmFjZSAoKSBpblxuICAgICAgZmluYWxseV9ub19leG4gKCkgO1xuICAgICAgUHJpbnRleGMucmFpc2Vfd2l0aF9iYWNrdHJhY2Ugd29ya19leG4gd29ya19idFxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX3Jlc3RvcmVfcmF3X2JhY2t0cmFjZSIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfUHJpbnRleGMiLCJTdGRsaWIiLCJjb25zdCQiLCJjIiwicGFyYW0iLCJjb21wb3NlIiwiZyIsIngiLCJmbGlwIiwieSIsIm5lZ2F0ZSIsInAiLCJ2IiwiRmluYWxseV9yYWlzZWQiLCJleG4iLCJkdW1teSIsInByb3RlY3QiLCJmaW5hbGx5JCIsIndvcmsiLCJmaW5hbGx5X25vX2V4biIsImUiLCJidCIsInJlc3VsdCIsIndvcmtfZXhuIiwid29ya19idCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLDZCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLFlBQUFDLE9BQUFDLEdBQUFDLE9DZ0JnQixTQUFDO0FBQUEsWUFBQUMsUUFBQVYsR0FBQVcsR0FBQUMsR0FDSyxPQUFLLGNBQUwsaUJBQUs7QUFBQSxZQUFBQyxLQUFBYixHQUFBWSxHQUFBRSxHQUNWLDBCQUFLO0FBQUEsWUFBQUMsT0FBQUMsR0FBQUMsR0FDRCwyQkFBSztBQUFBO0FBQUEsSUFBQUM7QUFBQUEsTURuQjFCO0FBQUEsR0N1QlM7QUFBQTtBQUFBLGNBQUFUO0FBQUFBLE1BQTZCLGdDQUUvQjtBQUFBLFVBQUFVLE1BRitCLGNBQ2lCO0FBQUEsTUFBMUIsNERBQWlEO0FBQUEsS0FDbkU7QUFBQSxPQUFBQyxRQUFBO0FBQUEsWUFBQUMsUUFBQUMsVUFBQUM7QUFBQUEsYUFBQUMsZUFBQWY7QUFBQUEsS0FJUCxJQUFJO0FBQUEsV0FBQWdCO0FBQUFBO0FBQUFBLE9BQUFBLElEN0JSO0FBQUEsT0FBQUMsS0M4QmU7QUFBQSxPQUFBUCxNQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBbUQ7QUFBQSxJQUV2RCxRQUFBUSxTQUFNO0FBQUEsVUFBQUM7QUFBQUE7QUFBQUEsTUFBQUEsV0RqQ1I7QUFBQSxNQUFBQyxVQ29Db0I7QUFBQSxLQUNkO0FBQUEsS0FBaUI7QUFBQTtBQUFBO0FBQUEsSUFIVDtBQUFBLElBQWlCO0FBQUEsR0FJcUI7QUFBQSxHQWJ6QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUR6QlgiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoyMjUyNCwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9pbl9jaGFubmVsLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAyMSBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIHQgPSBpbl9jaGFubmVsXG5cbnR5cGUgb3Blbl9mbGFnID0gU3RkbGliLm9wZW5fZmxhZyA9XG4gIHwgT3Blbl9yZG9ubHlcbiAgfCBPcGVuX3dyb25seVxuICB8IE9wZW5fYXBwZW5kXG4gIHwgT3Blbl9jcmVhdFxuICB8IE9wZW5fdHJ1bmNcbiAgfCBPcGVuX2V4Y2xcbiAgfCBPcGVuX2JpbmFyeVxuICB8IE9wZW5fdGV4dFxuICB8IE9wZW5fbm9uYmxvY2tcblxubGV0IHN0ZGluID0gU3RkbGliLnN0ZGluXG5sZXQgb3Blbl9iaW4gPSBTdGRsaWIub3Blbl9pbl9iaW5cbmxldCBvcGVuX3RleHQgPSBTdGRsaWIub3Blbl9pblxubGV0IG9wZW5fZ2VuID0gU3RkbGliLm9wZW5faW5fZ2VuXG5cbmxldCB3aXRoX29wZW4gb3BlbmZ1biBzIGYgPVxuICBsZXQgaWMgPSBvcGVuZnVuIHMgaW5cbiAgRnVuLnByb3RlY3QgfmZpbmFsbHk6KGZ1biAoKSAtPiBTdGRsaWIuY2xvc2VfaW5fbm9lcnIgaWMpXG4gICAgKGZ1biAoKSAtPiBmIGljKVxuXG5sZXQgd2l0aF9vcGVuX2JpbiBzIGYgPVxuICB3aXRoX29wZW4gU3RkbGliLm9wZW5faW5fYmluIHMgZlxuXG5sZXQgd2l0aF9vcGVuX3RleHQgcyBmID1cbiAgd2l0aF9vcGVuIFN0ZGxpYi5vcGVuX2luIHMgZlxuXG5sZXQgd2l0aF9vcGVuX2dlbiBmbGFncyBwZXJtIHMgZiA9XG4gIHdpdGhfb3BlbiAoU3RkbGliLm9wZW5faW5fZ2VuIGZsYWdzIHBlcm0pIHMgZlxuXG5sZXQgc2VlayA9IFN0ZGxpYi5MYXJnZUZpbGUuc2Vla19pblxubGV0IHBvcyA9IFN0ZGxpYi5MYXJnZUZpbGUucG9zX2luXG5sZXQgbGVuZ3RoID0gU3RkbGliLkxhcmdlRmlsZS5pbl9jaGFubmVsX2xlbmd0aFxubGV0IGNsb3NlID0gU3RkbGliLmNsb3NlX2luXG5sZXQgY2xvc2Vfbm9lcnIgPSBTdGRsaWIuY2xvc2VfaW5fbm9lcnJcblxubGV0IGlucHV0X2NoYXIgaWMgPVxuICBtYXRjaCBTdGRsaWIuaW5wdXRfY2hhciBpYyB3aXRoXG4gIHwgYyAtPiBTb21lIGNcbiAgfCBleGNlcHRpb24gRW5kX29mX2ZpbGUgLT4gTm9uZVxuXG5sZXQgaW5wdXRfYnl0ZSBpYyA9XG4gIG1hdGNoIFN0ZGxpYi5pbnB1dF9ieXRlIGljIHdpdGhcbiAgfCBuIC0+IFNvbWUgblxuICB8IGV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSAtPiBOb25lXG5cbmxldCBpbnB1dF9saW5lIGljID1cbiAgbWF0Y2ggU3RkbGliLmlucHV0X2xpbmUgaWMgd2l0aFxuICB8IHMgLT4gU29tZSBzXG4gIHwgZXhjZXB0aW9uIEVuZF9vZl9maWxlIC0+IE5vbmVcblxubGV0IGlucHV0ID0gU3RkbGliLmlucHV0XG5cbmV4dGVybmFsIHVuc2FmZV9pbnB1dF9iaWdhcnJheSA6XG4gIHQgLT4gXyBCaWdhcnJheS5BcnJheTEudCAtPiBpbnQgLT4gaW50IC0+IGludFxuICA9IFwiY2FtbF9tbF9pbnB1dF9iaWdhcnJheVwiXG5cbmxldCBpbnB1dF9iaWdhcnJheSBpYyBidWYgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBCaWdhcnJheS5BcnJheTEuZGltIGJ1ZiAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiaW5wdXRfYmlnYXJyYXlcIlxuICBlbHNlIHVuc2FmZV9pbnB1dF9iaWdhcnJheSBpYyBidWYgb2ZzIGxlblxuXG5sZXQgcmVhbGx5X2lucHV0IGljIGJ1ZiBwb3MgbGVuID1cbiAgbWF0Y2ggU3RkbGliLnJlYWxseV9pbnB1dCBpYyBidWYgcG9zIGxlbiB3aXRoXG4gIHwgKCkgLT4gU29tZSAoKVxuICB8IGV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSAtPiBOb25lXG5cbmxldCByZWMgdW5zYWZlX3JlYWxseV9pbnB1dF9iaWdhcnJheSBpYyBidWYgb2ZzIGxlbiA9XG4gIGlmIGxlbiA8PSAwIHRoZW4gU29tZSAoKSBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSB1bnNhZmVfaW5wdXRfYmlnYXJyYXkgaWMgYnVmIG9mcyBsZW4gaW5cbiAgICBpZiByID0gMFxuICAgIHRoZW4gTm9uZVxuICAgIGVsc2UgdW5zYWZlX3JlYWxseV9pbnB1dF9iaWdhcnJheSBpYyBidWYgKG9mcyArIHIpIChsZW4gLSByKVxuICBlbmRcblxubGV0IHJlYWxseV9pbnB1dF9iaWdhcnJheSBpYyBidWYgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBCaWdhcnJheS5BcnJheTEuZGltIGJ1ZiAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwicmVhbGx5X2lucHV0X2JpZ2FycmF5XCJcbiAgZWxzZSB1bnNhZmVfcmVhbGx5X2lucHV0X2JpZ2FycmF5IGljIGJ1ZiBvZnMgbGVuXG5cbmxldCByZWFsbHlfaW5wdXRfc3RyaW5nIGljIGxlbiA9XG4gIG1hdGNoIFN0ZGxpYi5yZWFsbHlfaW5wdXRfc3RyaW5nIGljIGxlbiB3aXRoXG4gIHwgcyAtPiBTb21lIHNcbiAgfCBleGNlcHRpb24gRW5kX29mX2ZpbGUgLT4gTm9uZVxuXG4oKiBSZWFkIHVwIHRvIFtsZW5dIGJ5dGVzIGludG8gW2J1Zl0sIHN0YXJ0aW5nIGF0IFtvZnNdLiBSZXR1cm4gdG90YWwgYnl0ZXNcbiAgIHJlYWQuICopXG5sZXQgcmVhZF91cHRvIGljIGJ1ZiBvZnMgbGVuID1cbiAgbGV0IHJlYyBsb29wIG9mcyBsZW4gPVxuICAgIGlmIGxlbiA9IDAgdGhlbiBvZnNcbiAgICBlbHNlIGJlZ2luXG4gICAgICBsZXQgciA9IFN0ZGxpYi5pbnB1dCBpYyBidWYgb2ZzIGxlbiBpblxuICAgICAgaWYgciA9IDAgdGhlblxuICAgICAgICBvZnNcbiAgICAgIGVsc2VcbiAgICAgICAgbG9vcCAob2ZzICsgcikgKGxlbiAtIHIpXG4gICAgZW5kXG4gIGluXG4gIGxvb3Agb2ZzIGxlbiAtIG9mc1xuXG4oKiBCZXN0IGVmZm9ydCBhdHRlbXB0IHRvIHJldHVybiBhIGJ1ZmZlciB3aXRoID49IChvZnMgKyBuKSBieXRlcyBvZiBzdG9yYWdlLFxuICAgYW5kIHN1Y2ggdGhhdCBpdCBjb2luY2lkZXMgd2l0aCBbYnVmXSBhdCBpbmRpY2VzIDwgW29mc10uXG5cbiAgIFRoZSByZXR1cm5lZCBidWZmZXIgaXMgZXF1YWwgdG8gW2J1Zl0gaXRzZWxmIGlmIGl0IGFscmVhZHkgaGFzIHN1ZmZpY2llbnRcbiAgIGZyZWUgc3BhY2UuXG5cbiAgIFRoZSByZXR1cm5lZCBidWZmZXIgbWF5IGhhdmUgKmZld2VyKiB0aGFuIFtvZnMgKyBuXSBieXRlcyBvZiBzdG9yYWdlIGlmIHRoaXNcbiAgIG51bWJlciBpcyA+IFtTeXMubWF4X3N0cmluZ19sZW5ndGhdLiBIb3dldmVyIHRoZSByZXR1cm5lZCBidWZmZXIgd2lsbFxuICAgKmFsd2F5cyogaGF2ZSA+IFtvZnNdIGJ5dGVzIG9mIHN0b3JhZ2UuIEluIHRoZSBsaW1pdGluZyBjYXNlIHdoZW4gW29mcyA9IGxlblxuICAgPSBTeXMubWF4X3N0cmluZ19sZW5ndGhdIChzbyB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXNpemUgdGhlIGJ1ZmZlciBhdFxuICAgYWxsKSwgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZC4gKilcblxubGV0IGVuc3VyZSBidWYgb2ZzIG4gPVxuICBsZXQgbGVuID0gQnl0ZXMubGVuZ3RoIGJ1ZiBpblxuICBpZiBsZW4gPj0gb2ZzICsgbiB0aGVuIGJ1ZlxuICBlbHNlIGJlZ2luXG4gICAgbGV0IG5ld19sZW4gPSByZWYgbGVuIGluXG4gICAgd2hpbGUgIW5ld19sZW4gPCBvZnMgKyBuIGRvXG4gICAgICBuZXdfbGVuIDo9IDIgKiAhbmV3X2xlbiArIDFcbiAgICBkb25lO1xuICAgIGxldCBuZXdfbGVuID0gIW5ld19sZW4gaW5cbiAgICBsZXQgbmV3X2xlbiA9XG4gICAgICBpZiBuZXdfbGVuIDw9IFN5cy5tYXhfc3RyaW5nX2xlbmd0aCB0aGVuXG4gICAgICAgIG5ld19sZW5cbiAgICAgIGVsc2UgaWYgb2ZzIDwgU3lzLm1heF9zdHJpbmdfbGVuZ3RoIHRoZW5cbiAgICAgICAgU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG4gICAgICBlbHNlXG4gICAgICAgIGZhaWx3aXRoIFwiSW5fY2hhbm5lbC5pbnB1dF9hbGw6IGNoYW5uZWwgY29udGVudCBcXFxuICAgICAgICAgICAgICAgICAgaXMgbGFyZ2VyIHRoYW4gbWF4aW11bSBzdHJpbmcgbGVuZ3RoXCJcbiAgICBpblxuICAgIGxldCBuZXdfYnVmID0gQnl0ZXMuY3JlYXRlIG5ld19sZW4gaW5cbiAgICBCeXRlcy5ibGl0IGJ1ZiAwIG5ld19idWYgMCBvZnM7XG4gICAgbmV3X2J1ZlxuICBlbmRcblxubGV0IGlucHV0X2FsbCBpYyA9XG4gIGxldCBjaHVua19zaXplID0gNjU1MzYgaW4gKCogSU9fQlVGRkVSX1NJWkUgKilcbiAgbGV0IGluaXRpYWxfc2l6ZSA9XG4gICAgdHJ5XG4gICAgICBTdGRsaWIuaW5fY2hhbm5lbF9sZW5ndGggaWMgLSBTdGRsaWIucG9zX2luIGljXG4gICAgd2l0aCBTeXNfZXJyb3IgXyAtPlxuICAgICAgLTFcbiAgaW5cbiAgbGV0IGluaXRpYWxfc2l6ZSA9IGlmIGluaXRpYWxfc2l6ZSA8IDAgdGhlbiBjaHVua19zaXplIGVsc2UgaW5pdGlhbF9zaXplIGluXG4gIGxldCBpbml0aWFsX3NpemUgPVxuICAgIGlmIGluaXRpYWxfc2l6ZSA8PSBTeXMubWF4X3N0cmluZ19sZW5ndGggdGhlblxuICAgICAgaW5pdGlhbF9zaXplXG4gICAgZWxzZVxuICAgICAgU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG4gIGluXG4gIGxldCBidWYgPSBCeXRlcy5jcmVhdGUgaW5pdGlhbF9zaXplIGluXG4gIGxldCBucmVhZCA9IHJlYWRfdXB0byBpYyBidWYgMCBpbml0aWFsX3NpemUgaW5cbiAgaWYgbnJlYWQgPCBpbml0aWFsX3NpemUgdGhlbiAoKiBFT0YgcmVhY2hlZCwgYnVmZmVyIHBhcnRpYWxseSBmaWxsZWQgKilcbiAgICBCeXRlcy5zdWJfc3RyaW5nIGJ1ZiAwIG5yZWFkXG4gIGVsc2UgYmVnaW4gKCogbnJlYWQgPSBpbml0aWFsX3NpemUsIG1heWJlIEVPRiByZWFjaGVkICopXG4gICAgbWF0Y2ggU3RkbGliLmlucHV0X2NoYXIgaWMgd2l0aFxuICAgIHwgZXhjZXB0aW9uIEVuZF9vZl9maWxlIC0+XG4gICAgICAgICgqIEVPRiByZWFjaGVkLCBidWZmZXIgaXMgY29tcGxldGVseSBmaWxsZWQgKilcbiAgICAgICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBidWZcbiAgICB8IGMgLT5cbiAgICAgICAgKCogRU9GIG5vdCByZWFjaGVkICopXG4gICAgICAgIGxldCByZWMgbG9vcCBidWYgb2ZzID1cbiAgICAgICAgICBsZXQgYnVmID0gZW5zdXJlIGJ1ZiBvZnMgY2h1bmtfc2l6ZSBpblxuICAgICAgICAgIGxldCByZW0gPSBCeXRlcy5sZW5ndGggYnVmIC0gb2ZzIGluXG4gICAgICAgICAgKCogW3JlbV0gY2FuIGJlIDwgW2NodW5rX3NpemVdIGlmIGJ1ZmZlciBzaXplIGNsb3NlIHRvXG4gICAgICAgICAgICAgW1N5cy5tYXhfc3RyaW5nX2xlbmd0aF0gKilcbiAgICAgICAgICBsZXQgciA9IHJlYWRfdXB0byBpYyBidWYgb2ZzIHJlbSBpblxuICAgICAgICAgIGlmIHIgPCByZW0gdGhlbiAoKiBFT0YgcmVhY2hlZCAqKVxuICAgICAgICAgICAgQnl0ZXMuc3ViX3N0cmluZyBidWYgMCAob2ZzICsgcilcbiAgICAgICAgICBlbHNlICgqIHIgPSByZW0gKilcbiAgICAgICAgICAgIGxvb3AgYnVmIChvZnMgKyByZW0pXG4gICAgICAgIGluXG4gICAgICAgIGxldCBidWYgPSBlbnN1cmUgYnVmIG5yZWFkIChjaHVua19zaXplICsgMSkgaW5cbiAgICAgICAgQnl0ZXMuc2V0IGJ1ZiBucmVhZCBjO1xuICAgICAgICBsb29wIGJ1ZiAobnJlYWQgKyAxKVxuICBlbmRcblxubGV0IFtAdGFpbF9tb2RfY29uc10gcmVjIGlucHV0X2xpbmVzIGljID1cbiAgbWF0Y2ggU3RkbGliLmlucHV0X2xpbmUgaWMgd2l0aFxuICB8IGxpbmUgLT4gbGluZSA6OiBpbnB1dF9saW5lcyBpY1xuICB8IGV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSAtPiBbXVxuXG5sZXQgcmVjIGZvbGRfbGluZXMgZiBhY2N1IGljID1cbiAgbWF0Y2ggU3RkbGliLmlucHV0X2xpbmUgaWMgd2l0aFxuICB8IGxpbmUgLT4gZm9sZF9saW5lcyBmIChmIGFjY3UgbGluZSkgaWNcbiAgfCBleGNlcHRpb24gRW5kX29mX2ZpbGUgLT4gYWNjdVxuXG5sZXQgc2V0X2JpbmFyeV9tb2RlID0gU3RkbGliLnNldF9iaW5hcnlfbW9kZV9pblxuXG5leHRlcm5hbCBpc19iaW5hcnlfbW9kZSA6IGluX2NoYW5uZWwgLT4gYm9vbCA9IFwiY2FtbF9tbF9pc19iaW5hcnlfbW9kZVwiXG5cbmV4dGVybmFsIGlzYXR0eSA6IHQgLT4gYm9vbCA9IFwiY2FtbF9zeXNfaXNhdHR5XCJcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9iYV9kaW1fMSIsImNhbWxfY3JlYXRlX2J5dGVzIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9tbF9ieXRlc19sZW5ndGgiLCJjYW1sX21sX2lucHV0X2JpZ2FycmF5IiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJjYW1sX2NhbGwyIiwiYTEiLCJnbG9iYWxfZGF0YSIsIlN0ZGxpYiIsIlN0ZGxpYl9CeXRlcyIsIlN0ZGxpYl9TeXMiLCJTdGRsaWJfRnVuIiwic3RkaW4iLCJvcGVuX2JpbiIsIm9wZW5fdGV4dCIsIm9wZW5fZ2VuIiwid2l0aF9vcGVuIiwib3BlbmZ1biIsInMiLCJpYyIsInBhcmFtIiwid2l0aF9vcGVuX2JpbiIsIndpdGhfb3Blbl90ZXh0Iiwid2l0aF9vcGVuX2dlbiIsImZsYWdzIiwicGVybSIsInNlZWsiLCJwb3MiLCJsZW5ndGgiLCJjbG9zZSIsImNsb3NlX25vZXJyIiwiaW5wdXRfY2hhciIsImMiLCJleG4iLCJpbnB1dF9ieXRlIiwibiIsImlucHV0X2xpbmUiLCJpbnB1dCIsImlucHV0X2JpZ2FycmF5IiwiYnVmIiwib2ZzIiwibGVuIiwicmVhbGx5X2lucHV0IiwicmVhbGx5X2lucHV0X2JpZ2FycmF5IiwiciIsInJlYWxseV9pbnB1dF9zdHJpbmciLCJyZWFkX3VwdG8iLCJlbnN1cmUiLCJuZXdfbGVuIiwibmV3X2J1ZiIsImlucHV0X2FsbCIsImluaXRpYWxfc2l6ZSIsImNodW5rX3NpemUiLCJucmVhZCIsInJlbSIsImlucHV0X2xpbmVzIiwibGluZSIsImJsb2NrIiwiZHN0Iiwib2Zmc2V0IiwiZm9sZF9saW5lcyIsImFjY3UiLCJzZXRfYmluYXJ5X21vZGUiLCJTdGRsaWJfSW5fY2hhbm5lbCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLG9CQUFBO0FB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QUEsUUFBQXdCLFFDb01ZLGtCQUFBQyxNQUFRLE9BQUFDLFNBQUE7QUFBQTtBQUFBLEtBRGxCLFFBQUFILFNBQU07QUFBQSxXQUFBdkI7QUFBQUEsVUFBQUEsUURuTVI7QUFBQTtBQUFBLE1DcU02QjtBQUFBLE1BREs7QUFBQTtBQUFBLFNBQUF5QixRQUF0QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FDbUI7QUFBQSxZQUFBRSxXQUFBekQsR0FBQTBELFFBQUExQztBQUFBQSxRQUFBMEMsT0FHN0I7QUFBQTtBQUFBLGFBQUFMLE9BQU07QUFBQSxXQUFBdkI7QUFBQUEsVUFBQUEsTUR4TVI7QUFBQSw2QkMwTTZCO0FBQUEsTUQxTTdCO0FBQUE7QUFBQSxTQUFBNEIsU0N5TXlCO0FBQUEsS0FBYTtBQUFBO0FBQUEsR0FDTDtBQUFBO0FBQUEsSUFBQUMsa0JEMU1qQztBQUFBLElBQUFDO0FBQUFBLE1BQUEiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoyMjc5MSwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9kaWdlc3QubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIFV0aWxpdHkgZnVuY3Rpb25zICopXG5cbmxldCBoZXhfb2Zfc3RyaW5nIGQgPVxuICBsZXQgY2hhcl9oZXggbiA9XG4gICAgQ2hhci5jaHIgKGlmIG4gPCAxMCB0aGVuIENoYXIuY29kZSAnMCcgKyBuXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIENoYXIuY29kZSAnYScgKyBuIC0gMTApIGluXG4gIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIGQgaW5cbiAgbGV0IHJlc3VsdCA9IEJ5dGVzLmNyZWF0ZSAobGVuICogMikgaW5cbiAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICBsZXQgeCA9IENoYXIuY29kZSBkLltpXSBpblxuICAgIEJ5dGVzLnVuc2FmZV9zZXQgcmVzdWx0IChpKjIpIChjaGFyX2hleCAoeCBsc3IgNCkpO1xuICAgIEJ5dGVzLnVuc2FmZV9zZXQgcmVzdWx0IChpKjIrMSkgKGNoYXJfaGV4ICh4IGxhbmQgMHgwZikpO1xuICBkb25lO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc3VsdFxuXG5sZXQgc3RyaW5nX29mX2hleCBzID1cbiAgbGV0IGRpZ2l0IGMgPVxuICAgIG1hdGNoIGMgd2l0aFxuICAgIHwgJzAnLi4nOScgLT4gQ2hhci5jb2RlIGMgLSBDaGFyLmNvZGUgJzAnXG4gICAgfCAnQScuLidGJyAtPiBDaGFyLmNvZGUgYyAtIENoYXIuY29kZSAnQScgKyAxMFxuICAgIHwgJ2EnLi4nZicgLT4gQ2hhci5jb2RlIGMgLSBDaGFyLmNvZGUgJ2EnICsgMTBcbiAgICB8IF8gLT4gaW52YWxpZF9hcmcgXCJEaWdlc3Qub2ZfaGV4XCIgaW5cbiAgbGV0IGJ5dGUgaSA9IGRpZ2l0IHMuW2ldIGxzbCA0ICsgZGlnaXQgcy5baSsxXSBpblxuICBTdHJpbmcuaW5pdCAoU3RyaW5nLmxlbmd0aCBzIC8gMikgKGZ1biBpIC0+IENoYXIuY2hyIChieXRlICgyICogaSkpKVxuXG4oKiBHZW5lcmljIGludGVyZmFjZSAqKVxuXG5tb2R1bGUgdHlwZSBTID0gc2lnXG4gIHR5cGUgdCA9IHN0cmluZ1xuICB2YWwgaGFzaF9sZW5ndGggOiBpbnRcbiAgdmFsIGNvbXBhcmUgOiB0IC0+IHQgLT4gaW50XG4gIHZhbCBlcXVhbCA6IHQgLT4gdCAtPiBib29sXG4gIHZhbCBzdHJpbmcgOiBzdHJpbmcgLT4gdFxuICB2YWwgYnl0ZXMgOiBieXRlcyAtPiB0XG4gIHZhbCBzdWJzdHJpbmcgOiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB0XG4gIHZhbCBzdWJieXRlcyA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdFxuICB2YWwgY2hhbm5lbCA6IGluX2NoYW5uZWwgLT4gaW50IC0+IHRcbiAgdmFsIGZpbGUgOiBzdHJpbmcgLT4gdFxuICB2YWwgb3V0cHV0IDogb3V0X2NoYW5uZWwgLT4gdCAtPiB1bml0XG4gIHZhbCBpbnB1dCA6IGluX2NoYW5uZWwgLT4gdFxuICB2YWwgdG9faGV4IDogdCAtPiBzdHJpbmdcbiAgdmFsIG9mX2hleCA6IHN0cmluZyAtPiB0XG5lbmRcblxuKCogQkxBS0UyIGhhc2hpbmcsIHBhcmFtZXRlcml6ZWQgYnkgaGFzaCBzaXplICopXG5cbm1vZHVsZSBCTEFLRTIgKFg6IHNpZyB2YWwgaGFzaF9sZW5ndGggOiBpbnQgZW5kKSA6IFMgPSBzdHJ1Y3RcblxuICB0eXBlIHQgPSBzdHJpbmdcblxuICBsZXQgaGFzaF9sZW5ndGggPVxuICAgIGlmIFguaGFzaF9sZW5ndGggPCAxIHx8IFguaGFzaF9sZW5ndGggPiA2NFxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJEaWdlc3QuQkxBS0UyOiB3cm9uZyBoYXNoIHNpemVcIjtcbiAgICBYLmhhc2hfbGVuZ3RoXG5cbiAgbGV0IGNvbXBhcmUgPSBTdHJpbmcuY29tcGFyZVxuICBsZXQgZXF1YWwgPSBTdHJpbmcuZXF1YWxcblxuICB0eXBlIHN0YXRlXG5cbiAgZXh0ZXJuYWwgY3JlYXRlX2dlbjogaW50IC0+IHN0cmluZyAtPiBzdGF0ZSA9IFwiY2FtbF9ibGFrZTJfY3JlYXRlXCJcbiAgZXh0ZXJuYWwgdXBkYXRlOiBzdGF0ZSAtPiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCJjYW1sX2JsYWtlMl91cGRhdGVcIlxuICBleHRlcm5hbCBmaW5hbDogc3RhdGUgLT4gaW50IC0+IHQgPSBcImNhbWxfYmxha2UyX2ZpbmFsXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3N0cmluZzogaW50IC0+IHN0cmluZyAtPiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB0XG4gICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9ibGFrZTJfc3RyaW5nXCJcblxuICBsZXQgY3JlYXRlICgpID0gY3JlYXRlX2dlbiBoYXNoX2xlbmd0aCBcIlwiXG5cbiAgbGV0IHN0cmluZyBzdHIgPVxuICAgIHVuc2FmZV9zdHJpbmcgaGFzaF9sZW5ndGggXCJcIiBzdHIgMCAoU3RyaW5nLmxlbmd0aCBzdHIpXG5cbiAgbGV0IGJ5dGVzIGIgPVxuICAgIHN0cmluZyAoQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBiKVxuXG4gIGxldCBzdWJzdHJpbmcgc3RyIG9mcyBsZW4gPVxuICAgIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBTdHJpbmcubGVuZ3RoIHN0ciAtIGxlblxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJEaWdlc3Quc3Vic3RyaW5nXCI7XG4gICAgdW5zYWZlX3N0cmluZyBoYXNoX2xlbmd0aCBcIlwiIHN0ciBvZnMgbGVuXG5cbiAgbGV0IHN1YmJ5dGVzIGIgb2ZzIGxlbiA9XG4gICAgc3Vic3RyaW5nIChCeXRlcy51bnNhZmVfdG9fc3RyaW5nIGIpIG9mcyBsZW5cblxuICBsZXQgY2hhbm5lbCBpYyB0b3JlYWQgPVxuICAgIGxldCBidWZfc2l6ZSA9IDQwOTYgaW5cbiAgICBsZXQgYnVmID0gQnl0ZXMuY3JlYXRlIGJ1Zl9zaXplIGluXG4gICAgbGV0IGN0eCA9IGNyZWF0ZSAoKSBpblxuICAgIGlmIHRvcmVhZCA8IDAgdGhlbiBiZWdpblxuICAgICAgbGV0IHJlYyBkb19yZWFkICgpID1cbiAgICAgICAgbGV0IG4gPSBJbl9jaGFubmVsLmlucHV0IGljIGJ1ZiAwIGJ1Zl9zaXplIGluXG4gICAgICAgIGlmIG4gPSAwXG4gICAgICAgIHRoZW4gZmluYWwgY3R4IGhhc2hfbGVuZ3RoXG4gICAgICAgIGVsc2UgKHVwZGF0ZSBjdHggKEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgYnVmKSAwIG47IGRvX3JlYWQgKCkpXG4gICAgICBpbiBkb19yZWFkICgpXG4gICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgIGxldCByZWMgZG9fcmVhZCB0b3JlYWQgPVxuICAgICAgICBpZiB0b3JlYWQgPSAwIHRoZW4gZmluYWwgY3R4IGhhc2hfbGVuZ3RoIGVsc2UgYmVnaW5cbiAgICAgICAgICBsZXQgbiA9IEluX2NoYW5uZWwuaW5wdXQgaWMgYnVmIDAgKEludC5taW4gYnVmX3NpemUgdG9yZWFkKSBpblxuICAgICAgICAgIGlmIG4gPSAwXG4gICAgICAgICAgdGhlbiByYWlzZSBFbmRfb2ZfZmlsZVxuICAgICAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgICAgIHVwZGF0ZSBjdHggKEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgYnVmKSAwIG47XG4gICAgICAgICAgICBkb19yZWFkICh0b3JlYWQgLSBuKVxuICAgICAgICAgIGVuZFxuICAgICAgICBlbmRcbiAgICAgIGluIGRvX3JlYWQgdG9yZWFkXG4gICAgZW5kXG5cbiAgbGV0IGZpbGUgZmlsZW5hbWUgPVxuICAgIEluX2NoYW5uZWwud2l0aF9vcGVuX2JpbiBmaWxlbmFtZSAoZnVuIGljIC0+IGNoYW5uZWwgaWMgKC0xKSlcblxuICBsZXQgb3V0cHV0IGNoYW4gZGlnZXN0ID0gb3V0cHV0X3N0cmluZyBjaGFuIGRpZ2VzdFxuXG4gIGxldCBpbnB1dCBjaGFuID0gcmVhbGx5X2lucHV0X3N0cmluZyBjaGFuIGhhc2hfbGVuZ3RoXG5cbiAgbGV0IHRvX2hleCBkID1cbiAgICBpZiBTdHJpbmcubGVuZ3RoIGQgPD4gaGFzaF9sZW5ndGggdGhlbiBpbnZhbGlkX2FyZyBcIkRpZ2VzdC50b19oZXhcIjtcbiAgICBoZXhfb2Zfc3RyaW5nIGRcblxuICBsZXQgb2ZfaGV4IHMgPVxuICAgIGlmIFN0cmluZy5sZW5ndGggcyA8PiBoYXNoX2xlbmd0aCAqIDIgdGhlbiBpbnZhbGlkX2FyZyBcIkRpZ2VzdC5vZl9oZXhcIjtcbiAgICBzdHJpbmdfb2ZfaGV4IHNcblxuZW5kXG5cbm1vZHVsZSBCTEFLRTEyOCA9IEJMQUtFMihzdHJ1Y3QgbGV0IGhhc2hfbGVuZ3RoID0gMTYgZW5kKVxubW9kdWxlIEJMQUtFMjU2ID0gQkxBS0UyKHN0cnVjdCBsZXQgaGFzaF9sZW5ndGggPSAzMiBlbmQpXG5tb2R1bGUgQkxBS0U1MTIgPSBCTEFLRTIoc3RydWN0IGxldCBoYXNoX2xlbmd0aCA9IDY0IGVuZClcblxuKCogTUQ1IGhhc2hpbmcgKilcblxubW9kdWxlIE1ENSA9IHN0cnVjdFxuXG4gIHR5cGUgdCA9IHN0cmluZ1xuXG4gIGxldCBoYXNoX2xlbmd0aCA9IDE2XG5cbiAgbGV0IGNvbXBhcmUgPSBTdHJpbmcuY29tcGFyZVxuICBsZXQgZXF1YWwgPSBTdHJpbmcuZXF1YWxcblxuICBleHRlcm5hbCB1bnNhZmVfc3RyaW5nOiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB0ID0gXCJjYW1sX21kNV9zdHJpbmdcIlxuICBleHRlcm5hbCBjaGFubmVsOiBpbl9jaGFubmVsIC0+IGludCAtPiB0ID0gXCJjYW1sX21kNV9jaGFuXCJcblxuICBsZXQgc3RyaW5nIHN0ciA9XG4gICAgdW5zYWZlX3N0cmluZyBzdHIgMCAoU3RyaW5nLmxlbmd0aCBzdHIpXG5cbiAgbGV0IGJ5dGVzIGIgPSBzdHJpbmcgKEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgYilcblxuICBsZXQgc3Vic3RyaW5nIHN0ciBvZnMgbGVuID1cbiAgICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gU3RyaW5nLmxlbmd0aCBzdHIgLSBsZW5cbiAgICB0aGVuIGludmFsaWRfYXJnIFwiRGlnZXN0LnN1YnN0cmluZ1wiXG4gICAgZWxzZSB1bnNhZmVfc3RyaW5nIHN0ciBvZnMgbGVuXG5cbiAgbGV0IHN1YmJ5dGVzIGIgb2ZzIGxlbiA9IHN1YnN0cmluZyAoQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBiKSBvZnMgbGVuXG5cbiAgbGV0IGZpbGUgZmlsZW5hbWUgPVxuICAgIEluX2NoYW5uZWwud2l0aF9vcGVuX2JpbiBmaWxlbmFtZSAoZnVuIGljIC0+IGNoYW5uZWwgaWMgKC0xKSlcblxuICBsZXQgb3V0cHV0IGNoYW4gZGlnZXN0ID0gb3V0cHV0X3N0cmluZyBjaGFuIGRpZ2VzdFxuXG4gIGxldCBpbnB1dCBjaGFuID0gcmVhbGx5X2lucHV0X3N0cmluZyBjaGFuIDE2XG5cbiAgbGV0IHRvX2hleCBkID1cbiAgICBpZiBTdHJpbmcubGVuZ3RoIGQgPD4gMTYgdGhlbiBpbnZhbGlkX2FyZyBcIkRpZ2VzdC50b19oZXhcIjtcbiAgICBoZXhfb2Zfc3RyaW5nIGRcblxuICBsZXQgb2ZfaGV4IHMgPVxuICAgIGlmIFN0cmluZy5sZW5ndGggcyA8PiAzMiB0aGVuIGludmFsaWRfYXJnIFwiRGlnZXN0LmZyb21faGV4XCI7XG4gICAgc3RyaW5nX29mX2hleCBzXG5cbmVuZFxuXG4oKiBEZWZhdWx0IGV4cG9ydGVkIGltcGxlbWVudGF0aW9uIGlzIE1ENSAqKVxuXG5pbmNsdWRlIE1ENVxuXG5sZXQgZnJvbV9oZXggPSBvZl9oZXhcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9ibGFrZTJfZmluYWwiLCJjYW1sX2JsYWtlMl9zdHJpbmciLCJjYW1sX2JsYWtlMl91cGRhdGUiLCJjYW1sX2J5dGVzX3Vuc2FmZV9zZXQiLCJjYW1sX2NyZWF0ZV9ieXRlcyIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfbWQ1X2NoYW4iLCJjYW1sX21kNV9zdHJpbmciLCJjYW1sX21sX3N0cmluZ19sZW5ndGgiLCJjYW1sX3N0cmluZ19nZXQiLCJnbG9iYWxfZGF0YSIsIlN0ZGxpYiIsIlN0ZGxpYl9Jbl9jaGFubmVsIiwiU3RkbGliX0J5dGVzIiwiU3RkbGliX0ludCIsIlN0ZGxpYl9TdHJpbmciLCJTdGRsaWJfQ2hhciIsImhleF9vZl9zdHJpbmciLCJkIiwiY2hhcl9oZXgiLCJuIiwibGVuIiwicmVzdWx0IiwiaSIsIngiLCJjc3RfRGlnZXN0X29mX2hleCIsInN0cmluZ19vZl9oZXgiLCJzIiwiZGlnaXQiLCJjIiwiY3N0X0RpZ2VzdF9zdWJzdHJpbmciLCJjc3RfRGlnZXN0X3RvX2hleCIsIkJMQUtFMiIsIlgiLCJoYXNoX2xlbmd0aCIsImNvbXBhcmUiLCJlcXVhbCIsImNzdCIsInN0cmluZyIsInN0ciIsImJ5dGVzIiwiYiIsInN1YnN0cmluZyIsIm9mcyIsInN1YmJ5dGVzIiwiY2hhbm5lbCIsImljIiwidG9yZWFkIiwiYnVmIiwiY3R4IiwiYnVmX3NpemUiLCJmaWxlIiwiZmlsZW5hbWUiLCJvdXRwdXQiLCJjaGFuIiwiZGlnZXN0IiwiaW5wdXQiLCJ0b19oZXgiLCJvZl9oZXgiLCJCTEFLRTEyOCIsIkJMQUtFMjU2IiwiQkxBS0U1MTIiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsb0JBQUE7QUFBQSxJQUFBQyxxQkFBQTtBQUFBLElBQUFDLHFCQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLHdCQUFBO0FBQUEsSUFBQUMsa0JBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLG9CQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxZQUFBQyxjQUFBQztBQUFBQSxhQUFBQyxTQUFBQztBQUFBQSxTQUFBLElDbUJJO0FBQUEsd0NBQ2dEO0FBQUE7QUFBQTtBQUFBLEtBQUFDLE1BQ2xEO0FBQUEsS0FBQUMsU0FDYTtBQUFBLFNBQ2I7QUFBQTtBQUFBLFNBQUFDLElBQUE7QUFBQTtBQUFBLFVBQUFDLElBQ29CO0FBQUEsTUFDZ0MseUNBQXBCO0FBQUEsTUFDMEIsbURBQXhCO0FBQUEsY0FBd0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElB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O0FBQUFBLElBRzFDO0FBQUEsS0FBOEI7QUFBQSxJQUM5Qix1QkFBZTtBQUFBO0FBQUEsWUFBQXdDLE9BQUEvQjtBQUFBQSxJQUdmO0FBQUEsS0FBOEI7QUFBQSxJQUM5Qix1QkFBZTtBQUFBO0FBQUEsR0R0TG5CIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MjMwMTYsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvYmlnYXJyYXkubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgTWFudWVsIFNlcnJhbm8gZXQgWGF2aWVyIExlcm95LCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDAwIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIE1vZHVsZSBbQmlnYXJyYXldOiBsYXJnZSwgbXVsdGktZGltZW5zaW9uYWwsIG51bWVyaWNhbCBhcnJheXMgKilcblxuKCogVGhlc2UgdHlwZXMgaW4gbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgdGFibGVzIGluXG4gICAuLi90eXBpbmcvdHlwZW9wdC5tbCAqKVxuXG50eXBlIGZsb2F0MTZfZWx0ID0gRmxvYXQxNl9lbHRcbnR5cGUgZmxvYXQzMl9lbHQgPSBGbG9hdDMyX2VsdFxudHlwZSBmbG9hdDY0X2VsdCA9IEZsb2F0NjRfZWx0XG50eXBlIGludDhfc2lnbmVkX2VsdCA9IEludDhfc2lnbmVkX2VsdFxudHlwZSBpbnQ4X3Vuc2lnbmVkX2VsdCA9IEludDhfdW5zaWduZWRfZWx0XG50eXBlIGludDE2X3NpZ25lZF9lbHQgPSBJbnQxNl9zaWduZWRfZWx0XG50eXBlIGludDE2X3Vuc2lnbmVkX2VsdCA9IEludDE2X3Vuc2lnbmVkX2VsdFxudHlwZSBpbnQzMl9lbHQgPSBJbnQzMl9lbHRcbnR5cGUgaW50NjRfZWx0ID0gSW50NjRfZWx0XG50eXBlIGludF9lbHQgPSBJbnRfZWx0XG50eXBlIG5hdGl2ZWludF9lbHQgPSBOYXRpdmVpbnRfZWx0XG50eXBlIGNvbXBsZXgzMl9lbHQgPSBDb21wbGV4MzJfZWx0XG50eXBlIGNvbXBsZXg2NF9lbHQgPSBDb21wbGV4NjRfZWx0XG5cbigqIEtlZXAgdGhlIG9yZGVyIG9mIHRoZXNlIGNvbnN0cnVjdG9ycyBpbiBzeW5jIHdpdGggdGhlIGNhbWxfYmFfa2luZFxuICAgZW51bWVyYXRpb24gaW4gYmlnYXJyYXkuaCAqKVxuXG50eXBlICgnYSwgJ2IpIGtpbmQgPVxuICB8IEZsb2F0MzIgOiAoZmxvYXQsIGZsb2F0MzJfZWx0KSBraW5kXG4gIHwgRmxvYXQ2NCA6IChmbG9hdCwgZmxvYXQ2NF9lbHQpIGtpbmRcbiAgfCBJbnQ4X3NpZ25lZCA6IChpbnQsIGludDhfc2lnbmVkX2VsdCkga2luZFxuICB8IEludDhfdW5zaWduZWQgOiAoaW50LCBpbnQ4X3Vuc2lnbmVkX2VsdCkga2luZFxuICB8IEludDE2X3NpZ25lZCA6IChpbnQsIGludDE2X3NpZ25lZF9lbHQpIGtpbmRcbiAgfCBJbnQxNl91bnNpZ25lZCA6IChpbnQsIGludDE2X3Vuc2lnbmVkX2VsdCkga2luZFxuICB8IEludDMyIDogKGludDMyLCBpbnQzMl9lbHQpIGtpbmRcbiAgfCBJbnQ2NCA6IChpbnQ2NCwgaW50NjRfZWx0KSBraW5kXG4gIHwgSW50IDogKGludCwgaW50X2VsdCkga2luZFxuICB8IE5hdGl2ZWludCA6IChuYXRpdmVpbnQsIG5hdGl2ZWludF9lbHQpIGtpbmRcbiAgfCBDb21wbGV4MzIgOiAoQ29tcGxleC50LCBjb21wbGV4MzJfZWx0KSBraW5kXG4gIHwgQ29tcGxleDY0IDogKENvbXBsZXgudCwgY29tcGxleDY0X2VsdCkga2luZFxuICB8IENoYXIgOiAoY2hhciwgaW50OF91bnNpZ25lZF9lbHQpIGtpbmRcbiAgfCBGbG9hdDE2IDogKGZsb2F0LCBmbG9hdDE2X2VsdCkga2luZFxuXG50eXBlIGNfbGF5b3V0ID0gQ19sYXlvdXRfdHlwXG50eXBlIGZvcnRyYW5fbGF5b3V0ID0gRm9ydHJhbl9sYXlvdXRfdHlwICgqKilcblxudHlwZSAnYSBsYXlvdXQgPVxuICAgIENfbGF5b3V0OiBjX2xheW91dCBsYXlvdXRcbiAgfCBGb3J0cmFuX2xheW91dDogZm9ydHJhbl9sYXlvdXQgbGF5b3V0XG5cbmxldCBmbG9hdDE2ID0gRmxvYXQxNlxubGV0IGZsb2F0MzIgPSBGbG9hdDMyXG5sZXQgZmxvYXQ2NCA9IEZsb2F0NjRcbmxldCBpbnQ4X3NpZ25lZCA9IEludDhfc2lnbmVkXG5sZXQgaW50OF91bnNpZ25lZCA9IEludDhfdW5zaWduZWRcbmxldCBpbnQxNl9zaWduZWQgPSBJbnQxNl9zaWduZWRcbmxldCBpbnQxNl91bnNpZ25lZCA9IEludDE2X3Vuc2lnbmVkXG5sZXQgaW50MzIgPSBJbnQzMlxubGV0IGludDY0ID0gSW50NjRcbmxldCBpbnQgPSBJbnRcbmxldCBuYXRpdmVpbnQgPSBOYXRpdmVpbnRcbmxldCBjb21wbGV4MzIgPSBDb21wbGV4MzJcbmxldCBjb21wbGV4NjQgPSBDb21wbGV4NjRcbmxldCBjaGFyID0gQ2hhclxuXG5sZXQga2luZF9zaXplX2luX2J5dGVzIDogdHlwZSBhIGIuIChhLCBiKSBraW5kIC0+IGludCA9IGZ1bmN0aW9uXG4gIHwgRmxvYXQxNiAtPiAyXG4gIHwgRmxvYXQzMiAtPiA0XG4gIHwgRmxvYXQ2NCAtPiA4XG4gIHwgSW50OF9zaWduZWQgLT4gMVxuICB8IEludDhfdW5zaWduZWQgLT4gMVxuICB8IEludDE2X3NpZ25lZCAtPiAyXG4gIHwgSW50MTZfdW5zaWduZWQgLT4gMlxuICB8IEludDMyIC0+IDRcbiAgfCBJbnQ2NCAtPiA4XG4gIHwgSW50IC0+IFN5cy53b3JkX3NpemUgLyA4XG4gIHwgTmF0aXZlaW50IC0+IFN5cy53b3JkX3NpemUgLyA4XG4gIHwgQ29tcGxleDMyIC0+IDhcbiAgfCBDb21wbGV4NjQgLT4gMTZcbiAgfCBDaGFyIC0+IDFcblxuKCogS2VlcCB0aG9zZSBjb25zdGFudHMgaW4gc3luYyB3aXRoIHRoZSBjYW1sX2JhX2xheW91dCBlbnVtZXJhdGlvblxuICAgaW4gYmlnYXJyYXkuaCAqKVxuXG5sZXQgY19sYXlvdXQgPSBDX2xheW91dFxubGV0IGZvcnRyYW5fbGF5b3V0ID0gRm9ydHJhbl9sYXlvdXRcblxubW9kdWxlIEdlbmFycmF5ID0gc3RydWN0XG4gIHR5cGUgKCEnYSwgISdiLCAhJ2MpIHRcbiAgZXh0ZXJuYWwgY3JlYXRlOiAoJ2EsICdiKSBraW5kIC0+ICdjIGxheW91dCAtPiBpbnQgYXJyYXkgLT4gKCdhLCAnYiwgJ2MpIHRcbiAgICAgPSBcImNhbWxfYmFfY3JlYXRlXCJcbiAgZXh0ZXJuYWwgZ2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgYXJyYXkgLT4gJ2FcbiAgICAgPSBcImNhbWxfYmFfZ2V0X2dlbmVyaWNcIlxuICBleHRlcm5hbCBzZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCBhcnJheSAtPiAnYSAtPiB1bml0XG4gICAgID0gXCJjYW1sX2JhX3NldF9nZW5lcmljXCJcblxuICBsZXQgcmVjIGNsb29wIGFyciBpZHggZiBjb2wgbWF4ID1cbiAgICBpZiBjb2wgPSBBcnJheS5sZW5ndGggaWR4IHRoZW4gc2V0IGFyciBpZHggKGYgaWR4KVxuICAgIGVsc2UgZm9yIGogPSAwIHRvIHByZWQgbWF4Lihjb2wpIGRvXG4gICAgICAgICAgIGlkeC4oY29sKSA8LSBqO1xuICAgICAgICAgICBjbG9vcCBhcnIgaWR4IGYgKHN1Y2MgY29sKSBtYXhcbiAgICAgICAgIGRvbmVcbiAgbGV0IHJlYyBmbG9vcCBhcnIgaWR4IGYgY29sIG1heCA9XG4gICAgaWYgY29sIDwgMCB0aGVuIHNldCBhcnIgaWR4IChmIGlkeClcbiAgICBlbHNlIGZvciBqID0gMSB0byBtYXguKGNvbCkgZG9cbiAgICAgICAgICAgaWR4Lihjb2wpIDwtIGo7XG4gICAgICAgICAgIGZsb29wIGFyciBpZHggZiAocHJlZCBjb2wpIG1heFxuICAgICAgICAgZG9uZVxuICBsZXQgaW5pdCAodHlwZSB0KSBraW5kIChsYXlvdXQgOiB0IGxheW91dCkgZGltcyBmID1cbiAgICBsZXQgYXJyID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbXMgaW5cbiAgICBsZXQgZGxlbiA9IEFycmF5Lmxlbmd0aCBkaW1zIGluXG4gICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICB8IENfbGF5b3V0IC0+IGNsb29wIGFyciAoQXJyYXkubWFrZSBkbGVuIDApIGYgMCBkaW1zOyBhcnJcbiAgICB8IEZvcnRyYW5fbGF5b3V0IC0+IGZsb29wIGFyciAoQXJyYXkubWFrZSBkbGVuIDEpIGYgKHByZWQgZGxlbikgZGltczsgYXJyXG5cbiAgZXh0ZXJuYWwgbnVtX2RpbXM6ICgnYSwgJ2IsICdjKSB0IC0+IGludCA9IFwiY2FtbF9iYV9udW1fZGltc1wiXG4gIGV4dGVybmFsIG50aF9kaW06ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgPSBcImNhbWxfYmFfZGltXCJcbiAgbGV0IGRpbXMgYSA9XG4gICAgbGV0IG4gPSBudW1fZGltcyBhIGluXG4gICAgbGV0IGQgPSBBcnJheS5tYWtlIG4gMCBpblxuICAgIGZvciBpID0gMCB0byBuLTEgZG8gZC4oaSkgPC0gbnRoX2RpbSBhIGkgZG9uZTtcbiAgICBkXG5cbiAgZXh0ZXJuYWwga2luZDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYikga2luZCA9IFwiY2FtbF9iYV9raW5kXCJcbiAgZXh0ZXJuYWwgbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnYyBsYXlvdXQgPSBcImNhbWxfYmFfbGF5b3V0XCJcbiAgZXh0ZXJuYWwgY2hhbmdlX2xheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2QgbGF5b3V0IC0+ICgnYSwgJ2IsICdkKSB0XG4gICAgID0gXCJjYW1sX2JhX2NoYW5nZV9sYXlvdXRcIlxuXG4gIGxldCBzaXplX2luX2J5dGVzIGFyciA9XG4gICAgKGtpbmRfc2l6ZV9pbl9ieXRlcyAoa2luZCBhcnIpKSAqIChBcnJheS5mb2xkX2xlZnQgKCAqICkgMSAoZGltcyBhcnIpKVxuXG4gIGV4dGVybmFsIHN1Yl9sZWZ0OiAoJ2EsICdiLCBjX2xheW91dCkgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsIGNfbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3N1YlwiXG4gIGV4dGVybmFsIHN1Yl9yaWdodDogKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHQgLT4gaW50IC0+IGludCAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2EsICdiLCBmb3J0cmFuX2xheW91dCkgdFxuICAgICA9IFwiY2FtbF9iYV9zdWJcIlxuICBleHRlcm5hbCBzbGljZV9sZWZ0OiAoJ2EsICdiLCBjX2xheW91dCkgdCAtPiBpbnQgYXJyYXkgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCdhLCAnYiwgY19sYXlvdXQpIHRcbiAgICAgPSBcImNhbWxfYmFfc2xpY2VcIlxuICBleHRlcm5hbCBzbGljZV9yaWdodDogKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHQgLT4gaW50IGFycmF5IC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3NsaWNlXCJcbiAgZXh0ZXJuYWwgYmxpdDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYiwgJ2MpIHQgLT4gdW5pdFxuICAgICA9IFwiY2FtbF9iYV9ibGl0XCJcbiAgZXh0ZXJuYWwgZmlsbDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2EgLT4gdW5pdCA9IFwiY2FtbF9iYV9maWxsXCJcbmVuZFxuXG5tb2R1bGUgQXJyYXkwID0gc3RydWN0XG4gIHR5cGUgKCEnYSwgISdiLCAhJ2MpIHQgPSAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICBsZXQgY3JlYXRlIGtpbmQgbGF5b3V0ID1cbiAgICBHZW5hcnJheS5jcmVhdGUga2luZCBsYXlvdXQgW3x8XVxuICBsZXQgZ2V0IGFyciA9IEdlbmFycmF5LmdldCBhcnIgW3x8XVxuICBsZXQgc2V0IGFyciA9IEdlbmFycmF5LnNldCBhcnIgW3x8XVxuICBleHRlcm5hbCBraW5kOiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiKSBraW5kID0gXCJjYW1sX2JhX2tpbmRcIlxuICBleHRlcm5hbCBsYXlvdXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICdjIGxheW91dCA9IFwiY2FtbF9iYV9sYXlvdXRcIlxuXG4gIGV4dGVybmFsIGNoYW5nZV9sYXlvdXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICdkIGxheW91dCAtPiAoJ2EsICdiLCAnZCkgdFxuICAgID0gXCJjYW1sX2JhX2NoYW5nZV9sYXlvdXRcIlxuXG4gIGxldCBzaXplX2luX2J5dGVzIGFyciA9IGtpbmRfc2l6ZV9pbl9ieXRlcyAoa2luZCBhcnIpXG5cbiAgZXh0ZXJuYWwgYmxpdDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYiwgJ2MpIHQgLT4gdW5pdCA9IFwiY2FtbF9iYV9ibGl0XCJcbiAgZXh0ZXJuYWwgZmlsbDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2EgLT4gdW5pdCA9IFwiY2FtbF9iYV9maWxsXCJcblxuICBsZXQgb2ZfdmFsdWUga2luZCBsYXlvdXQgdiA9XG4gICAgbGV0IGEgPSBjcmVhdGUga2luZCBsYXlvdXQgaW5cbiAgICBzZXQgYSB2O1xuICAgIGFcbiAgbGV0IGluaXQgPSBvZl92YWx1ZVxuZW5kXG5cbm1vZHVsZSBBcnJheTEgPSBzdHJ1Y3RcbiAgdHlwZSAoISdhLCAhJ2IsICEnYykgdCA9ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gIGxldCBjcmVhdGUga2luZCBsYXlvdXQgZGltID1cbiAgICBHZW5hcnJheS5jcmVhdGUga2luZCBsYXlvdXQgW3xkaW18XVxuICBleHRlcm5hbCBnZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiAnYSA9IFwiJWNhbWxfYmFfcmVmXzFcIlxuICBleHRlcm5hbCBzZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCIlY2FtbF9iYV9zZXRfMVwiXG4gIGV4dGVybmFsIHVuc2FmZV9nZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiAnYSA9IFwiJWNhbWxfYmFfdW5zYWZlX3JlZl8xXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3NldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+ICdhIC0+IHVuaXRcbiAgICAgPSBcIiVjYW1sX2JhX3Vuc2FmZV9zZXRfMVwiXG4gIGV4dGVybmFsIGRpbTogKCdhLCAnYiwgJ2MpIHQgLT4gaW50ID0gXCIlY2FtbF9iYV9kaW1fMVwiXG4gIGV4dGVybmFsIGtpbmQ6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IpIGtpbmQgPSBcImNhbWxfYmFfa2luZFwiXG4gIGV4dGVybmFsIGxheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2MgbGF5b3V0ID0gXCJjYW1sX2JhX2xheW91dFwiXG5cbiAgZXh0ZXJuYWwgY2hhbmdlX2xheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2QgbGF5b3V0IC0+ICgnYSwgJ2IsICdkKSB0XG4gICAgPSBcImNhbWxfYmFfY2hhbmdlX2xheW91dFwiXG5cbiAgbGV0IHNpemVfaW5fYnl0ZXMgYXJyID1cbiAgICAoa2luZF9zaXplX2luX2J5dGVzIChraW5kIGFycikpICogKGRpbSBhcnIpXG5cbiAgZXh0ZXJuYWwgc3ViOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsICdjKSB0ID0gXCJjYW1sX2JhX3N1YlwiXG4gIGxldCBzbGljZSAodHlwZSB0KSAoYSA6IChfLCBfLCB0KSBHZW5hcnJheS50KSBuID1cbiAgICBtYXRjaCBsYXlvdXQgYSB3aXRoXG4gICAgfCBDX2xheW91dCAtPiAoR2VuYXJyYXkuc2xpY2VfbGVmdCBhIFt8bnxdIDogKF8sIF8sIHQpIEdlbmFycmF5LnQpXG4gICAgfCBGb3J0cmFuX2xheW91dCAtPiAoR2VuYXJyYXkuc2xpY2VfcmlnaHQgYSBbfG58XTogKF8sIF8sIHQpIEdlbmFycmF5LnQpXG4gIGV4dGVybmFsIGJsaXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IsICdjKSB0IC0+IHVuaXQgPSBcImNhbWxfYmFfYmxpdFwiXG4gIGV4dGVybmFsIGZpbGw6ICgnYSwgJ2IsICdjKSB0IC0+ICdhIC0+IHVuaXQgPSBcImNhbWxfYmFfZmlsbFwiXG4gIGxldCBjX2luaXQgYXJyIGRpbSBmID1cbiAgICBmb3IgaSA9IDAgdG8gcHJlZCBkaW0gZG8gdW5zYWZlX3NldCBhcnIgaSAoZiBpKSBkb25lXG4gIGxldCBmb3J0cmFuX2luaXQgYXJyIGRpbSBmID1cbiAgICBmb3IgaSA9IDEgdG8gZGltIGRvIHVuc2FmZV9zZXQgYXJyIGkgKGYgaSkgZG9uZVxuICBsZXQgaW5pdCAodHlwZSB0KSBraW5kIChsYXlvdXQgOiB0IGxheW91dCkgZGltIGYgPVxuICAgIGxldCBhcnIgPSBjcmVhdGUga2luZCBsYXlvdXQgZGltIGluXG4gICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICB8IENfbGF5b3V0IC0+IGNfaW5pdCBhcnIgZGltIGY7IGFyclxuICAgIHwgRm9ydHJhbl9sYXlvdXQgLT4gZm9ydHJhbl9pbml0IGFyciBkaW0gZjsgYXJyXG4gIGxldCBvZl9hcnJheSAodHlwZSB0KSBraW5kIChsYXlvdXQ6IHQgbGF5b3V0KSBkYXRhID1cbiAgICBsZXQgYmEgPSBjcmVhdGUga2luZCBsYXlvdXQgKEFycmF5Lmxlbmd0aCBkYXRhKSBpblxuICAgIGxldCBvZnMgPVxuICAgICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICAgICAgQ19sYXlvdXQgLT4gMFxuICAgICAgfCBGb3J0cmFuX2xheW91dCAtPiAxXG4gICAgaW5cbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGRhdGEgLSAxIGRvIHVuc2FmZV9zZXQgYmEgKGkgKyBvZnMpIGRhdGEuKGkpIGRvbmU7XG4gICAgYmFcbmVuZFxuXG5tb2R1bGUgQXJyYXkyID0gc3RydWN0XG4gIHR5cGUgKCEnYSwgISdiLCAhJ2MpIHQgPSAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICBsZXQgY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiA9XG4gICAgR2VuYXJyYXkuY3JlYXRlIGtpbmQgbGF5b3V0IFt8ZGltMTsgZGltMnxdXG4gIGV4dGVybmFsIGdldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiAnYSA9IFwiJWNhbWxfYmFfcmVmXzJcIlxuICBleHRlcm5hbCBzZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9IFwiJWNhbWxfYmFfc2V0XzJcIlxuICBleHRlcm5hbCB1bnNhZmVfZ2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+ICdhXG4gICAgID0gXCIlY2FtbF9iYV91bnNhZmVfcmVmXzJcIlxuICBleHRlcm5hbCB1bnNhZmVfc2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+ICdhIC0+IHVuaXRcbiAgICAgPSBcIiVjYW1sX2JhX3Vuc2FmZV9zZXRfMlwiXG4gIGV4dGVybmFsIGRpbTE6ICgnYSwgJ2IsICdjKSB0IC0+IGludCA9IFwiJWNhbWxfYmFfZGltXzFcIlxuICBleHRlcm5hbCBkaW0yOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgPSBcIiVjYW1sX2JhX2RpbV8yXCJcbiAgZXh0ZXJuYWwga2luZDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYikga2luZCA9IFwiY2FtbF9iYV9raW5kXCJcbiAgZXh0ZXJuYWwgbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnYyBsYXlvdXQgPSBcImNhbWxfYmFfbGF5b3V0XCJcblxuICBleHRlcm5hbCBjaGFuZ2VfbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnZCBsYXlvdXQgLT4gKCdhLCAnYiwgJ2QpIHRcbiAgICA9IFwiY2FtbF9iYV9jaGFuZ2VfbGF5b3V0XCJcblxuICBsZXQgc2l6ZV9pbl9ieXRlcyBhcnIgPVxuICAgIChraW5kX3NpemVfaW5fYnl0ZXMgKGtpbmQgYXJyKSkgKiAoZGltMSBhcnIpICogKGRpbTIgYXJyKVxuXG4gIGV4dGVybmFsIHN1Yl9sZWZ0OiAoJ2EsICdiLCBjX2xheW91dCkgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsIGNfbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3N1YlwiXG4gIGV4dGVybmFsIHN1Yl9yaWdodDpcbiAgICAoJ2EsICdiLCBmb3J0cmFuX2xheW91dCkgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3N1YlwiXG4gIGxldCBzbGljZV9sZWZ0IGEgbiA9IEdlbmFycmF5LnNsaWNlX2xlZnQgYSBbfG58XVxuICBsZXQgc2xpY2VfcmlnaHQgYSBuID0gR2VuYXJyYXkuc2xpY2VfcmlnaHQgYSBbfG58XVxuICBleHRlcm5hbCBibGl0OiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiLCAnYykgdCAtPiB1bml0ID0gXCJjYW1sX2JhX2JsaXRcIlxuICBleHRlcm5hbCBmaWxsOiAoJ2EsICdiLCAnYykgdCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2JhX2ZpbGxcIlxuICBsZXQgY19pbml0IGFyciBkaW0xIGRpbTIgZiA9XG4gICAgZm9yIGkgPSAwIHRvIHByZWQgZGltMSBkb1xuICAgICAgZm9yIGogPSAwIHRvIHByZWQgZGltMiBkb1xuICAgICAgICB1bnNhZmVfc2V0IGFyciBpIGogKGYgaSBqKVxuICAgICAgZG9uZVxuICAgIGRvbmVcbiAgbGV0IGZvcnRyYW5faW5pdCBhcnIgZGltMSBkaW0yIGYgPVxuICAgIGZvciBqID0gMSB0byBkaW0yIGRvXG4gICAgICBmb3IgaSA9IDEgdG8gZGltMSBkb1xuICAgICAgICB1bnNhZmVfc2V0IGFyciBpIGogKGYgaSBqKVxuICAgICAgZG9uZVxuICAgIGRvbmVcbiAgbGV0IGluaXQgKHR5cGUgdCkga2luZCAobGF5b3V0IDogdCBsYXlvdXQpIGRpbTEgZGltMiBmID1cbiAgICBsZXQgYXJyID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBpblxuICAgIG1hdGNoIGxheW91dCB3aXRoXG4gICAgfCBDX2xheW91dCAtPiBjX2luaXQgYXJyIGRpbTEgZGltMiBmOyBhcnJcbiAgICB8IEZvcnRyYW5fbGF5b3V0IC0+IGZvcnRyYW5faW5pdCBhcnIgZGltMSBkaW0yIGY7IGFyclxuICBsZXQgb2ZfYXJyYXkgKHR5cGUgdCkga2luZCAobGF5b3V0OiB0IGxheW91dCkgZGF0YSA9XG4gICAgbGV0IGRpbTEgPSBBcnJheS5sZW5ndGggZGF0YSBpblxuICAgIGxldCBkaW0yID0gaWYgZGltMSA9IDAgdGhlbiAwIGVsc2UgQXJyYXkubGVuZ3RoIGRhdGEuKDApIGluXG4gICAgbGV0IGJhID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBpblxuICAgIGxldCBvZnMgPVxuICAgICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICAgICAgQ19sYXlvdXQgLT4gMFxuICAgICAgfCBGb3J0cmFuX2xheW91dCAtPiAxXG4gICAgaW5cbiAgICBmb3IgaSA9IDAgdG8gZGltMSAtIDEgZG9cbiAgICAgIGxldCByb3cgPSBkYXRhLihpKSBpblxuICAgICAgaWYgQXJyYXkubGVuZ3RoIHJvdyA8PiBkaW0yIHRoZW5cbiAgICAgICAgaW52YWxpZF9hcmcoXCJCaWdhcnJheS5BcnJheTIub2ZfYXJyYXk6IG5vbi1yZWN0YW5ndWxhciBkYXRhXCIpO1xuICAgICAgZm9yIGogPSAwIHRvIGRpbTIgLSAxIGRvXG4gICAgICAgIHVuc2FmZV9zZXQgYmEgKGkgKyBvZnMpIChqICsgb2ZzKSByb3cuKGopXG4gICAgICBkb25lXG4gICAgZG9uZTtcbiAgICBiYVxuZW5kXG5cbm1vZHVsZSBBcnJheTMgPSBzdHJ1Y3RcbiAgdHlwZSAoISdhLCAhJ2IsICEnYykgdCA9ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gIGxldCBjcmVhdGUga2luZCBsYXlvdXQgZGltMSBkaW0yIGRpbTMgPVxuICAgIEdlbmFycmF5LmNyZWF0ZSBraW5kIGxheW91dCBbfGRpbTE7IGRpbTI7IGRpbTN8XVxuICBleHRlcm5hbCBnZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgLT4gaW50IC0+ICdhID0gXCIlY2FtbF9iYV9yZWZfM1wiXG4gIGV4dGVybmFsIHNldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gdW5pdFxuICAgICA9IFwiJWNhbWxfYmFfc2V0XzNcIlxuICBleHRlcm5hbCB1bnNhZmVfZ2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiAnYVxuICAgICA9IFwiJWNhbWxfYmFfdW5zYWZlX3JlZl8zXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3NldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gdW5pdFxuICAgICA9IFwiJWNhbWxfYmFfdW5zYWZlX3NldF8zXCJcbiAgZXh0ZXJuYWwgZGltMTogKCdhLCAnYiwgJ2MpIHQgLT4gaW50ID0gXCIlY2FtbF9iYV9kaW1fMVwiXG4gIGV4dGVybmFsIGRpbTI6ICgnYSwgJ2IsICdjKSB0IC0+IGludCA9IFwiJWNhbWxfYmFfZGltXzJcIlxuICBleHRlcm5hbCBkaW0zOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgPSBcIiVjYW1sX2JhX2RpbV8zXCJcbiAgZXh0ZXJuYWwga2luZDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYikga2luZCA9IFwiY2FtbF9iYV9raW5kXCJcbiAgZXh0ZXJuYWwgbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnYyBsYXlvdXQgPSBcImNhbWxfYmFfbGF5b3V0XCJcblxuICBleHRlcm5hbCBjaGFuZ2VfbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnZCBsYXlvdXQgLT4gKCdhLCAnYiwgJ2QpIHRcbiAgICA9IFwiY2FtbF9iYV9jaGFuZ2VfbGF5b3V0XCJcblxuICBsZXQgc2l6ZV9pbl9ieXRlcyBhcnIgPVxuICAgIChraW5kX3NpemVfaW5fYnl0ZXMgKGtpbmQgYXJyKSkgKiAoZGltMSBhcnIpICogKGRpbTIgYXJyKSAqIChkaW0zIGFycilcblxuICBleHRlcm5hbCBzdWJfbGVmdDogKCdhLCAnYiwgY19sYXlvdXQpIHQgLT4gaW50IC0+IGludCAtPiAoJ2EsICdiLCBjX2xheW91dCkgdFxuICAgICA9IFwiY2FtbF9iYV9zdWJcIlxuICBleHRlcm5hbCBzdWJfcmlnaHQ6XG4gICAgICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0IC0+IGludCAtPiBpbnQgLT4gKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHRcbiAgICAgPSBcImNhbWxfYmFfc3ViXCJcbiAgbGV0IHNsaWNlX2xlZnRfMSBhIG4gbSA9IEdlbmFycmF5LnNsaWNlX2xlZnQgYSBbfG47IG18XVxuICBsZXQgc2xpY2VfcmlnaHRfMSBhIG4gbSA9IEdlbmFycmF5LnNsaWNlX3JpZ2h0IGEgW3xuOyBtfF1cbiAgbGV0IHNsaWNlX2xlZnRfMiBhIG4gPSBHZW5hcnJheS5zbGljZV9sZWZ0IGEgW3xufF1cbiAgbGV0IHNsaWNlX3JpZ2h0XzIgYSBuID0gR2VuYXJyYXkuc2xpY2VfcmlnaHQgYSBbfG58XVxuICBleHRlcm5hbCBibGl0OiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiLCAnYykgdCAtPiB1bml0ID0gXCJjYW1sX2JhX2JsaXRcIlxuICBleHRlcm5hbCBmaWxsOiAoJ2EsICdiLCAnYykgdCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2JhX2ZpbGxcIlxuICBsZXQgY19pbml0IGFyciBkaW0xIGRpbTIgZGltMyBmID1cbiAgICBmb3IgaSA9IDAgdG8gcHJlZCBkaW0xIGRvXG4gICAgICBmb3IgaiA9IDAgdG8gcHJlZCBkaW0yIGRvXG4gICAgICAgIGZvciBrID0gMCB0byBwcmVkIGRpbTMgZG9cbiAgICAgICAgICB1bnNhZmVfc2V0IGFyciBpIGogayAoZiBpIGogaylcbiAgICAgICAgZG9uZVxuICAgICAgZG9uZVxuICAgIGRvbmVcbiAgbGV0IGZvcnRyYW5faW5pdCBhcnIgZGltMSBkaW0yIGRpbTMgZiA9XG4gICAgZm9yIGsgPSAxIHRvIGRpbTMgZG9cbiAgICAgIGZvciBqID0gMSB0byBkaW0yIGRvXG4gICAgICAgIGZvciBpID0gMSB0byBkaW0xIGRvXG4gICAgICAgICAgdW5zYWZlX3NldCBhcnIgaSBqIGsgKGYgaSBqIGspXG4gICAgICAgIGRvbmVcbiAgICAgIGRvbmVcbiAgICBkb25lXG4gIGxldCBpbml0ICh0eXBlIHQpIGtpbmQgKGxheW91dCA6IHQgbGF5b3V0KSBkaW0xIGRpbTIgZGltMyBmID1cbiAgICBsZXQgYXJyID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBkaW0zIGluXG4gICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICB8IENfbGF5b3V0IC0+IGNfaW5pdCBhcnIgZGltMSBkaW0yIGRpbTMgZjsgYXJyXG4gICAgfCBGb3J0cmFuX2xheW91dCAtPiBmb3J0cmFuX2luaXQgYXJyIGRpbTEgZGltMiBkaW0zIGY7IGFyclxuICBsZXQgb2ZfYXJyYXkgKHR5cGUgdCkga2luZCAobGF5b3V0OiB0IGxheW91dCkgZGF0YSA9XG4gICAgbGV0IGRpbTEgPSBBcnJheS5sZW5ndGggZGF0YSBpblxuICAgIGxldCBkaW0yID0gaWYgZGltMSA9IDAgdGhlbiAwIGVsc2UgQXJyYXkubGVuZ3RoIGRhdGEuKDApIGluXG4gICAgbGV0IGRpbTMgPSBpZiBkaW0yID0gMCB0aGVuIDAgZWxzZSBBcnJheS5sZW5ndGggZGF0YS4oMCkuKDApIGluXG4gICAgbGV0IGJhID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBkaW0zIGluXG4gICAgbGV0IG9mcyA9XG4gICAgICBtYXRjaCBsYXlvdXQgd2l0aFxuICAgICAgICBDX2xheW91dCAtPiAwXG4gICAgICB8IEZvcnRyYW5fbGF5b3V0IC0+IDFcbiAgICBpblxuICAgIGZvciBpID0gMCB0byBkaW0xIC0gMSBkb1xuICAgICAgbGV0IHJvdyA9IGRhdGEuKGkpIGluXG4gICAgICBpZiBBcnJheS5sZW5ndGggcm93IDw+IGRpbTIgdGhlblxuICAgICAgICBpbnZhbGlkX2FyZyhcIkJpZ2FycmF5LkFycmF5My5vZl9hcnJheTogbm9uLWN1YmljIGRhdGFcIik7XG4gICAgICBmb3IgaiA9IDAgdG8gZGltMiAtIDEgZG9cbiAgICAgICAgbGV0IGNvbCA9IHJvdy4oaikgaW5cbiAgICAgICAgaWYgQXJyYXkubGVuZ3RoIGNvbCA8PiBkaW0zIHRoZW5cbiAgICAgICAgICBpbnZhbGlkX2FyZyhcIkJpZ2FycmF5LkFycmF5My5vZl9hcnJheTogbm9uLWN1YmljIGRhdGFcIik7XG4gICAgICAgIGZvciBrID0gMCB0byBkaW0zIC0gMSBkb1xuICAgICAgICAgIHVuc2FmZV9zZXQgYmEgKGkgKyBvZnMpIChqICsgb2ZzKSAoayArIG9mcykgY29sLihrKVxuICAgICAgICBkb25lXG4gICAgICBkb25lXG4gICAgZG9uZTtcbiAgICBiYVxuZW5kXG5cbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MDogKCdhLCAnYiwgJ2MpIEFycmF5MC50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MTogKCdhLCAnYiwgJ2MpIEFycmF5MS50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MjogKCdhLCAnYiwgJ2MpIEFycmF5Mi50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MzogKCdhLCAnYiwgJ2MpIEFycmF5My50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmxldCBhcnJheTBfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAwIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkwX29mX2dlbmFycmF5XCJcbmxldCBhcnJheTFfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAxIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkxX29mX2dlbmFycmF5XCJcbmxldCBhcnJheTJfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAyIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkyX29mX2dlbmFycmF5XCJcbmxldCBhcnJheTNfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAzIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkzX29mX2dlbmFycmF5XCJcblxuZXh0ZXJuYWwgcmVzaGFwZTpcbiAgICgnYSwgJ2IsICdjKSBHZW5hcnJheS50IC0+IGludCBhcnJheSAtPiAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICAgPSBcImNhbWxfYmFfcmVzaGFwZVwiXG5sZXQgcmVzaGFwZV8wIGEgPSByZXNoYXBlIGEgW3x8XVxubGV0IHJlc2hhcGVfMSBhIGRpbTEgPSByZXNoYXBlIGEgW3xkaW0xfF1cbmxldCByZXNoYXBlXzIgYSBkaW0xIGRpbTIgPSByZXNoYXBlIGEgW3xkaW0xO2RpbTJ8XVxubGV0IHJlc2hhcGVfMyBhIGRpbTEgZGltMiBkaW0zID0gcmVzaGFwZSBhIFt8ZGltMTtkaW0yO2RpbTN8XVxuXG4oKiBGb3JjZSBjYW1sX2JhX2dldF97MSwyLDMsTn0gdG8gYmUgbGlua2VkIGluLCBzaW5jZSB3ZSBkb24ndCByZWZlclxuICAgdG8gdGhvc2UgcHJpbWl0aXZlcyBkaXJlY3RseSBpbiB0aGlzIGZpbGUgKilcblxubGV0IF8gPVxuICBsZXQgXyA9IEdlbmFycmF5LmdldCBpblxuICBsZXQgXyA9IEFycmF5MS5nZXQgaW5cbiAgbGV0IF8gPSBBcnJheTIuZ2V0IGluXG4gIGxldCBfID0gQXJyYXkzLmdldCBpblxuICAoKVxuXG5bQEBAb2NhbWwud2FybmluZyBcIi0zMlwiXVxuZXh0ZXJuYWwgZ2V0MTogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2JhX2dldF8xXCJcbmV4dGVybmFsIGdldDI6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9iYV9nZXRfMlwiXG5leHRlcm5hbCBnZXQzOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfYmFfZ2V0XzNcIlxuZXh0ZXJuYWwgc2V0MTogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2JhX3NldF8xXCJcbmV4dGVybmFsIHNldDI6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9iYV9zZXRfMlwiXG5leHRlcm5hbCBzZXQzOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfYmFfc2V0XzNcIlxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2JhX2NoYW5nZV9sYXlvdXQiLCJjYW1sX2JhX2NyZWF0ZSIsImNhbWxfYmFfZGltXzEiLCJjYW1sX2JhX2RpbV8yIiwiY2FtbF9iYV9raW5kIiwiY2FtbF9iYV9udW1fZGltcyIsImNhbWxfYmFfcmVzaGFwZSIsImNhbWxfYmFfc2V0XzEiLCJjYW1sX2JhX3NldF8yIiwiY2FtbF9iYV9zZXRfMyIsImNhbWxfYmFfc2V0X2dlbmVyaWMiLCJjYW1sX2JhX3NsaWNlIiwiY2FtbF9jaGVja19ib3VuZCIsImNhbWxfbWFrZV92ZWN0IiwiY2FtbF9tdWwiLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiY2FtbF9jYWxsMyIsImEyIiwiZHVtbXkiLCJnbG9iYWxfZGF0YSIsIlN0ZGxpYiIsIlN0ZGxpYl9BcnJheSIsIlN0ZGxpYl9TeXMiLCJraW5kX3NpemVfaW5fYnl0ZXMiLCJwYXJhbSIsImNsb29wIiwiYXJyIiwiaWR4IiwiY29sIiwibWF4IiwiaiIsImZsb29wIiwiaW5pdCIsImtpbmQiLCJsYXlvdXQiLCJkaW1zIiwiZGxlbiIsImEiLCJuIiwiZCIsImkiLCJzaXplX2luX2J5dGVzIiwiY3JlYXRlIiwiZ2V0Iiwic2V0Iiwib2ZfdmFsdWUiLCJ2IiwiZGltIiwic2xpY2UiLCJvZl9hcnJheSIsImRhdGEiLCJiYSIsIm9mcyIsImRpbTEiLCJkaW0yIiwic2xpY2VfbGVmdCIsInNsaWNlX3JpZ2h0Iiwicm93IiwiZGltMyIsInNsaWNlX2xlZnRfMSIsIm0iLCJzbGljZV9yaWdodF8xIiwic2xpY2VfbGVmdF8yIiwic2xpY2VfcmlnaHRfMiIsImsiLCJjc3RfQmlnYXJyYXlfQXJyYXkzX29mX2FycmF5X24iLCJhcnJheTBfb2ZfZ2VuYXJyYXkiLCJhcnJheTFfb2ZfZ2VuYXJyYXkiLCJhcnJheTJfb2ZfZ2VuYXJyYXkiLCJhcnJheTNfb2ZfZ2VuYXJyYXkiLCJyZXNoYXBlXzAiLCJyZXNoYXBlXzEiLCJyZXNoYXBlXzIiLCJyZXNoYXBlXzMiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsV0FBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQyxXQUFBRixHQUFBQyxJQUFBRTtBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUosR0FBQUMsSUFBQUUsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsUUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxZQUFBQyxtQkFBQUM7QUFBQUEsSUMyRUk7QUFBQTtBQUFBLE9BYWE7QUFBQTtBQUFBO0FBQUEsT0FiYjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FjUztBQUFBLFlBQUFDLE1BQUFDLEtBQUFDLEtBQUFmLEdBQUFnQixLQUFBQztBQUFBQSxJQWtCVDtBQUFBLEtBQStCLDhCQUFZO0FBQUEsS0FBTztBQUFBO0FBQUEsWUFDM0I7QUFBQSxJQUFTO0FBQUEsU0FBQUMsSUFBQTtBQUFBO0FBQUEsTUFDekI7QUFBQSxNQUNBO0FBQUEsY0FBOEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQzVCO0FBQUEsWUFBQUMsTUFBQUwsS0FBQUMsS0FBQWYsR0FBQWdCLEtBQUFDO0FBQUFBLElBRVQsWUFBZ0IsOEJBQVkscUJBQU87QUFBQSxZQUNqQjtBQUFBLElBQVM7QUFBQSxTQUFBQyxJQUFBO0FBQUE7QUFBQSxNQUNwQjtBQUFBLE1BQ0E7QUFBQSxjQUE4QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FDNUI7QUFBQSxZQUFBRSxLQUFBQyxNQUFBQyxRQUFBQyxNQUFBdkI7QUFBQUEsUUFBQWMsTUFFQyxvQ0FBQVUsT0FDVjtBQUFBLElBQ0E7QUFBQSxlQUVvQjtBQUFBLHFCQUFVO0FBQUE7QUFBQSxlQURoQixXQUFVLDBDQUNpRDtBQUFBO0FBQUEsWUFBQUQsS0FBQUU7QUFBQUEsUUFBQUMsSUFLakUscUJBQUFDLElBQ0EsMEJBQ1I7QUFBQTtBQUFBLFNBQUFDLElBQUE7QUFBQTtBQUFBLGNBQTZCO0FBQUEsTUFBVDtBQUFBLGNBQW9CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUN4QztBQUFBLEdBQUM7QUFBQSxZQUFBQyxjQUFBZjtBQUFBQSxRQUFBLElBUTBELGVBQXpCO0FBQUEsSUFBZCxPQUFXLFNBQS9CLG1CQUFvQixzQkFBa0Q7QUFBQTtBQUFBLFlBQUFnQixPQUFBVCxNQUFBQyxRQXFCdEUsd0NBQWdDO0FBQUEsWUFBQVMsSUFBQWpCLEtBQ3BCLDRDQUFxQjtBQUFBLFlBQUFrQixJQUFBbEI7QUFBQUEsUUFBQSxJQUNyQjtBQUFBLHVCRGxLaEIsdUNDa0tnQjtBQUFBLEdBQXFCO0FBQUEsWUFBQWUsZ0JBQUFmO0FBQUFBLElBT1EsT0FBVSxtQkFBVixrQkFBVTtBQUFBO0FBQUEsWUFBQW1CLFNBQUFaLE1BQUFDLFFBQUFZO0FBQUFBLFFBQUFULElBTTNDO0FBQUEsSUFDUjtBQUFBLElBQU87QUFBQSxHQUNOO0FBQUEsWUFBQUssU0FBQVQsTUFBQUMsUUFBQWE7QUFBQUEsSUFPRCw2Q0FBbUM7QUFBQTtBQUFBLFlBQUFOLGdCQUFBZjtBQUFBQSxRQUFBLElBY0Q7QUFBQSxJQUFkLE9BQVcsU0FBL0IsbUJBQW9CLHNCQUF1QjtBQUFBO0FBQUEsWUFBQXNCLE1BQUFYLEdBQUFDO0FBQUFBLElBSXJDO0FBQUEsY0FFZTtBQUFBLGNBRE4sd0JBQ3lEO0FBQUE7QUFBQSxZQUFBTixPQUFBQyxNQUFBQyxRQUFBYSxLQUFBbkM7QUFBQUEsUUFBQWMsTUFROUQ7QUFBQSxJQUNWO0FBQUEsS0FIQTtBQUFBLFVBQUFjLE1BQUE7QUFBQTtBQUFBLE9BQW9CLHdCQUFpQjtBQUFBLGVBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBS0E7QUFBQTtBQUFBLFlBUDFDO0FBQUE7QUFBQSxTQUFBQSxJQUFBO0FBQUE7QUFBQSxNQUF5QixzQkFBaUI7QUFBQSxjQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQU1qQjtBQUFBLEdBQ2lCO0FBQUEsWUFBQVMsU0FBQWhCLE1BQUFDLFFBQUFnQjtBQUFBQTtBQUFBQSxLQUFBQyxLQUV0QztBQUFBLEtBQUFDLE1BQ1Q7QUFBQSxTQUtBO0FBQUE7QUFBQSxTQUFBWixJQUFBO0FBQUE7QUFBQSxNQUFzQywrQkFBd0I7QUFBQSxjQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUN0RTtBQUFBLEdBQUU7QUFBQSxZQUFBRSxTQUFBVCxNQUFBQyxRQUFBbUIsTUFBQUM7QUFBQUEsSUFNRixvREFBMEM7QUFBQTtBQUFBLFlBQUFiLGdCQUFBZjtBQUFBQSxRQUFBLElBZ0JLLHdCQUFiO0FBQUEsSUFBZCxPQUFXLGtCQUEvQixtQkFBb0IsMEJBQXFDO0FBQUE7QUFBQSxZQUFBNkIsV0FBQWxCLEdBQUFDLEdBT3RDLCtCQUEyQjtBQUFBLFlBQUFrQixZQUFBbkIsR0FBQUMsR0FDMUIsK0JBQTRCO0FBQUEsWUFBQU4sT0FBQUMsTUFBQUMsUUFBQW1CLE1BQUFDLE1BQUExQztBQUFBQSxRQUFBYyxNQWdCdEM7QUFBQSxJQUNWO0FBQUEsS0FQQTtBQUFBLFVBQUFJLE1BQUE7QUFBQTtBQUFBLE9BQ0U7QUFBQSxZQUFBVSxNQUFBO0FBQUE7QUFBQSxTQUNFLDZCQUFtQjtBQUFBLGlCQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxlQUQ1QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FROEM7QUFBQTtBQUFBLFlBZmhEO0FBQUE7QUFBQSxTQUFBQSxJQUFBO0FBQUE7QUFBQSxjQUNFO0FBQUE7QUFBQSxXQUFBVixJQUFBO0FBQUE7QUFBQSxRQUNFLHlCQUFtQjtBQUFBLGdCQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxjQUQ1QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFha0M7QUFBQSxHQUNpQjtBQUFBLFlBQUFtQixXQUFBaEIsTUFBQUMsUUFBQWdCO0FBQUFBO0FBQUFBLEtBQUFHLE9BRXJEO0FBQUEsS0FBQUMsT0FDQSxpQkFBZ0Q7QUFBQSxLQUFBSCxLQUN2QztBQUFBLEtBQUFDLE1BQ1Q7QUFBQSxTQUtBO0FBQUE7QUFBQSxTQUFBWixJQUFBO0FBQUE7QUFBQSxVQUFBaUIsTUFDWTtBQUFBLE1BQ1Y7QUFBQSxPQUNFO0FBQUEsY0FDRjtBQUFBO0FBQUEsV0FBQTNCLElBQUE7QUFBQTtBQUFBLFFBQ0U7QUFBQSx3Q0FBa0M7QUFBQSxnQkFBTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FEM0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUY7QUFBQSxHQUFFO0FBQUEsWUFBQVksU0FBQVQsTUFBQUMsUUFBQW1CLE1BQUFDLE1BQUFJO0FBQUFBLElBTUYsMERBQWdEO0FBQUE7QUFBQSxZQUFBakIsZ0JBQUFmO0FBQUFBO0FBQUFBLEtBQUEsSUFrQlk7QUFBQSxTQUFiO0FBQUEsU0FBYjtBQUFBLElBQWQsT0FBVztBQUFBLCtCQUEvQixtQkFBb0I7QUFBQSxlQUFrRDtBQUFBO0FBQUEsWUFBQWlDLGFBQUF0QixHQUFBQyxHQUFBc0IsR0FPL0Msa0NBQThCO0FBQUEsWUFBQUMsY0FBQXhCLEdBQUFDLEdBQUFzQixHQUM3QixrQ0FBK0I7QUFBQSxZQUFBRSxhQUFBekIsR0FBQUMsR0FDbEMsK0JBQTJCO0FBQUEsWUFBQXlCLGNBQUExQixHQUFBQyxHQUMxQiwrQkFBNEI7QUFBQSxZQUFBTixPQUFBQyxNQUFBQyxRQUFBbUIsTUFBQUMsTUFBQUksTUFBQTlDO0FBQUFBLFFBQUFjLE1Bb0J4QztBQUFBLElBQ1Y7QUFBQSxLQVRBO0FBQUEsVUFBQXNDLE1BQUE7QUFBQTtBQUFBLE9BQ0U7QUFBQSxZQUFBbEMsTUFBQTtBQUFBO0FBQUEsU0FDRTtBQUFBLGNBQUFVLE1BQUE7QUFBQTtBQUFBLFdBQ0Usa0NBQXFCO0FBQUEsbUJBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQURoQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUFERjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FVbUQ7QUFBQTtBQUFBLFlBbkJyRDtBQUFBO0FBQUEsU0FBQUEsSUFBQTtBQUFBO0FBQUEsY0FDRTtBQUFBO0FBQUEsV0FBQVYsSUFBQTtBQUFBO0FBQUEsZ0JBQ0U7QUFBQTtBQUFBLGFBQUFrQyxJQUFBO0FBQUE7QUFBQSxVQUNFLDRCQUFxQjtBQUFBLGtCQUFTO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxnQkFEaEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGNBREY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBaUJ1QztBQUFBLEdBQ2lCO0FBQUEsWUFBQWYsV0FBQWhCLE1BQUFDLFFBQUFnQjtBQUFBQTtBQUFBQSxLQUFBRyxPQUUxRDtBQUFBLEtBQUFDLE9BQ0EsaUJBQWdEO0FBQUEsS0FBQUk7QUFBQUEsT0FDaEQ7QUFBQTtBQUFBLFVBQWdEO0FBQUEsS0FBQVAsS0FDdkM7QUFBQSxLQUFBQyxNQUNUO0FBQUEsU0FLQTtBQUFBO0FBQUEsU0FBQVosSUFBQTtBQUFBO0FBQUE7QUFBQSxPQUFBaUIsTUFDWTtBQUFBLE9BQUFRO0FBQUFBLFNEeFdoQjtBQUFBLE1DeVdNO0FBQUEsT0FDRTtBQUFBLGNBQ0Y7QUFBQTtBQUFBLFdBQUFuQyxJQUFBO0FBQUE7QUFBQSxZQUFBRixNQUNZO0FBQUEsUUFDVjtBQUFBLFNBQ0U7QUFBQSxnQkFDRjtBQUFBO0FBQUEsYUFBQW9DLElBQUE7QUFBQTtBQUFBLFVBQ0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQTRDO0FBQUEsa0JBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGdCQURyRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FKRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFTRjtBQUFBLEdBQUU7QUFBQSxZQUFBRSxtQkFBQTdCO0FBQUFBLElBWUQ7QUFBQTtBQUFBLGNBQ0UsbURBQXlDO0FBQUE7QUFBQSxZQUFBOEIsbUJBQUE5QjtBQUFBQSxJQUUzQztBQUFBO0FBQUEsY0FDRSxtREFBeUM7QUFBQTtBQUFBLFlBQUErQixtQkFBQS9CO0FBQUFBLElBRTNDO0FBQUE7QUFBQSxjQUNFLG1EQUF5QztBQUFBO0FBQUEsWUFBQWdDLG1CQUFBaEM7QUFBQUEsSUFFM0M7QUFBQTtBQUFBLGNBQ0UsbURBQXlDO0FBQUE7QUFBQSxZQUFBaUMsVUFBQWpDLEdBSzlCLDhCQUFjO0FBQUEsWUFBQWtDLFVBQUFsQyxHQUFBZ0IsTUFDVCxvQ0FBa0I7QUFBQSxZQUFBbUIsVUFBQW5DLEdBQUFnQixNQUFBQztBQUFBQSxJQUNiLDBDQUF1QjtBQUFBO0FBQUEsWUFBQW1CLFVBQUFwQyxHQUFBZ0IsTUFBQUMsTUFBQUk7QUFBQUEsSUFDbEIsZ0RBQTRCO0FBQUE7QUFBQSxHQVUzRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUQ1WkYiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoyMzUxNCwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9yYW5kb20ubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgUGFyYSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICopXG4oKiAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDYW1iaXVtLCBDb2xsZWdlIGRlIEZyYW5jZSBhbmQgSW5yaWEgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIFBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvciAqKVxuXG5leHRlcm5hbCByYW5kb21fc2VlZDogdW5pdCAtPiBpbnQgYXJyYXkgPSBcImNhbWxfc3lzX3JhbmRvbV9zZWVkXCJcblxubW9kdWxlIFN0YXRlID0gc3RydWN0XG5cbiAgb3BlbiBCaWdhcnJheVxuXG4gIHR5cGUgdCA9IChpbnQ2NCwgaW50NjRfZWx0LCBjX2xheW91dCkgQXJyYXkxLnRcblxuICBleHRlcm5hbCBuZXh0OiB0IC0+IChpbnQ2NFtAdW5ib3hlZF0pXG4gICAgICA9IFwiY2FtbF9seG1fbmV4dFwiIFwiY2FtbF9seG1fbmV4dF91bmJveGVkXCIgW0BAbm9hbGxvY11cblxuICBsZXQgY3JlYXRlICgpIDogdCA9XG4gICAgQXJyYXkxLmNyZWF0ZSBJbnQ2NCBDX2xheW91dCA0XG5cbiAgbGV0IHNldCBzIGkxIGkyIGkzIGk0ID1cbiAgICBBcnJheTEudW5zYWZlX3NldCBzIDAgKEludDY0LmxvZ29yIGkxIDFMKTsgKCogbXVzdCBiZSBvZGQgKilcbiAgICBBcnJheTEudW5zYWZlX3NldCBzIDEgaTI7XG4gICAgQXJyYXkxLnVuc2FmZV9zZXQgcyAyIChpZiBpMyA8PiAwTCB0aGVuIGkzIGVsc2UgMUwpOyAoKiBtdXN0IG5vdCBiZSAwICopXG4gICAgQXJyYXkxLnVuc2FmZV9zZXQgcyAzIChpZiBpNCA8PiAwTCB0aGVuIGk0IGVsc2UgMkwpICgqIG11c3Qgbm90IGJlIDAgKilcblxuICBsZXQgbWsgaTEgaTIgaTMgaTQgPVxuICAgIGxldCBzID0gY3JlYXRlICgpIGluXG4gICAgc2V0IHMgaTEgaTIgaTMgaTQ7IHNcblxuICBsZXQgc2VyaWFsaXphdGlvbl9wcmVmaXggPVxuICAgIFwibHhtMTpcIlxuICAgICgqIFwibHhtXCIgZGVub3RlcyB0aGUgYWxnb3JpdGhtIGN1cnJlbnRseSBpbiB1c2UsIGFuZCAnMScgaXNcbiAgICAgICBhIHZlcnNpb24gbnVtYmVyLiBXZSBzaG91bGQgdXBkYXRlIHRoaXMgcHJlZml4IGlmIHdlIGNoYW5nZVxuICAgICAgIHRoZSBSYW5kb20gYWxnb3JpdGhtIG9yIHRoZSBzZXJpYWxpemF0aW9uIGZvcm1hdCwgc28gdGhhdCB1c2Vyc1xuICAgICAgIGdldCBhIGNsZWFuIGVycm9yIGluc3RlYWQgb2YgYmVsaWV2aW5nIHRoYXQgdGhleSBmYWl0aGZ1bGx5XG4gICAgICAgcmVwcm9kdWNlIHRoZWlyIHByZXZpb3VzIHN0YXRlIGFuZCBpbiBmYWN0IGdldCBhIGRpZmZlcmVudFxuICAgICAgIHN0cmVhbS5cblxuICAgICAgIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBjb25zdHJhaW50IHRvIGtlZXAgdGhlIHNhbWVcbiAgICAgICBcIjxuYW1lPjx2ZXI+OjxkYXRhPlwiIGZvcm1hdCBvciBtZXNzYWdlIHNpemUgaW4gZnV0dXJlIHZlcnNpb25zLFxuICAgICAgIHdlIGNvdWxkIGNoYW5nZSB0aGUgZm9ybWF0IGNvbXBsZXRlbHkgaWYgd2Ugd2FudGVkIGFzIGxvbmdcbiAgICAgICBhcyB0aGVyZSBpcyBubyBjb25mdXNpb24gcG9zc2libGUgd2l0aCB0aGUgcHJldmlvdXMgZm9ybWF0cy4gKilcblxuICBsZXQgc2VyaWFsaXphdGlvbl9wcmVmaXhfbGVuID1cbiAgICBTdHJpbmcubGVuZ3RoIHNlcmlhbGl6YXRpb25fcHJlZml4XG5cbiAgbGV0IHRvX2JpbmFyeV9zdHJpbmcgcyA9XG4gICAgbGV0IHByZWZpeCA9IHNlcmlhbGl6YXRpb25fcHJlZml4IGluXG4gICAgbGV0IHByZWZsZW4gPSBzZXJpYWxpemF0aW9uX3ByZWZpeF9sZW4gaW5cbiAgICBsZXQgYnVmID0gQnl0ZXMuY3JlYXRlIChwcmVmbGVuICsgNCAqIDgpIGluXG4gICAgQnl0ZXMuYmxpdF9zdHJpbmcgcHJlZml4IDAgYnVmIDAgcHJlZmxlbjtcbiAgICBmb3IgaSA9IDAgdG8gMyBkb1xuICAgICAgQnl0ZXMuc2V0X2ludDY0X2xlIGJ1ZiAocHJlZmxlbiArIGkgKiA4KSAoQXJyYXkxLmdldCBzIGkpXG4gICAgZG9uZTtcbiAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIGJ1ZlxuXG4gIGxldCBvZl9iaW5hcnlfc3RyaW5nIGJ1ZiA9XG4gICAgbGV0IHByZWZpeCA9IHNlcmlhbGl6YXRpb25fcHJlZml4IGluXG4gICAgbGV0IHByZWZsZW4gPSBzZXJpYWxpemF0aW9uX3ByZWZpeF9sZW4gaW5cbiAgICBpZiBTdHJpbmcubGVuZ3RoIGJ1ZiA8PiBwcmVmbGVuICsgNCAqIDhcbiAgICAgICB8fCBub3QgKFN0cmluZy5zdGFydHNfd2l0aCB+cHJlZml4IGJ1ZilcbiAgICB0aGVuXG4gICAgICBmYWlsd2l0aFxuICAgICAgICAoXCJSYW5kb20uU3RhdGUub2ZfYmluYXJ5X3N0cmluZzogZXhwZWN0ZWQgYSBmb3JtYXQgXFxcbiAgICAgICAgICBjb21wYXRpYmxlIHdpdGggT0NhbWwgXCIgXiBTeXMub2NhbWxfdmVyc2lvbik7XG4gICAgbGV0IGkxID0gU3RyaW5nLmdldF9pbnQ2NF9sZSBidWYgKHByZWZsZW4gKyAwICogOCkgaW5cbiAgICBsZXQgaTIgPSBTdHJpbmcuZ2V0X2ludDY0X2xlIGJ1ZiAocHJlZmxlbiArIDEgKiA4KSBpblxuICAgIGxldCBpMyA9IFN0cmluZy5nZXRfaW50NjRfbGUgYnVmIChwcmVmbGVuICsgMiAqIDgpIGluXG4gICAgbGV0IGk0ID0gU3RyaW5nLmdldF9pbnQ2NF9sZSBidWYgKHByZWZsZW4gKyAzICogOCkgaW5cbiAgICBtayBpMSBpMiBpMyBpNFxuXG4gIGxldCBhc3NpZ24gKGRzdDogdCkgKHNyYzogdCkgPVxuICAgIEFycmF5MS5ibGl0IHNyYyBkc3RcblxuICBsZXQgY29weSBzID1cbiAgICBsZXQgcycgPSBjcmVhdGUoKSBpbiBhc3NpZ24gcycgczsgcydcblxuICAoKiBUaGUgc2VlZCBpcyBhbiBhcnJheSBvZiBpbnRlZ2Vycy4gIEl0IGNhbiBiZSBqdXN0IG9uZSBpbnRlZ2VyLFxuICAgICBidXQgaXQgY2FuIGFsc28gYmUgMTIgb3IgbW9yZSBieXRlcy4gIFRvIGhpZGUgdGhlIGRpZmZlcmVuY2UsXG4gICAgIHdlIHNlcmlhbGl6ZSB0aGUgYXJyYXkgYXMgYSBzZXF1ZW5jZSBvZiBieXRlcywgdGhlbiBoYXNoIHRoZVxuICAgICBzZXF1ZW5jZSB3aXRoIE1ENSAoRGlnZXN0LmJ5dGVzKS4gIE1ENSBnaXZlcyBvbmx5IDEyOCBiaXRzIHdoaWxlXG4gICAgIHdlIG5lZWQgMjU2IGJpdHMsIHNvIHdlIGhhc2ggdHdpY2Ugd2l0aCBkaWZmZXJlbnQgc3VmZml4ZXMuICopXG4gIGxldCByZWluaXQgcyBzZWVkID1cbiAgICBsZXQgbiA9IEFycmF5Lmxlbmd0aCBzZWVkIGluXG4gICAgbGV0IGIgPSBCeXRlcy5jcmVhdGUgKG4gKiA4ICsgMSkgaW5cbiAgICBmb3IgaSA9IDAgdG8gbi0xIGRvXG4gICAgICBCeXRlcy5zZXRfaW50NjRfbGUgYiAoaSAqIDgpIChJbnQ2NC5vZl9pbnQgc2VlZC4oaSkpXG4gICAgZG9uZTtcbiAgICBCeXRlcy5zZXQgYiAobiAqIDgpICdcXHgwMSc7XG4gICAgbGV0IGQxID0gRGlnZXN0LmJ5dGVzIGIgaW5cbiAgICBCeXRlcy5zZXQgYiAobiAqIDgpICdcXHgwMic7XG4gICAgbGV0IGQyID0gRGlnZXN0LmJ5dGVzIGIgaW5cbiAgICBzZXQgcyAoU3RyaW5nLmdldF9pbnQ2NF9sZSBkMSAwKVxuICAgICAgICAgIChTdHJpbmcuZ2V0X2ludDY0X2xlIGQxIDgpXG4gICAgICAgICAgKFN0cmluZy5nZXRfaW50NjRfbGUgZDIgMClcbiAgICAgICAgICAoU3RyaW5nLmdldF9pbnQ2NF9sZSBkMiA4KVxuXG4gIGxldCBtYWtlIHNlZWQgPVxuICAgIGxldCBzID0gY3JlYXRlKCkgaW4gcmVpbml0IHMgc2VlZDsgc1xuXG4gIGxldCBtYWtlX3NlbGZfaW5pdCAoKSA9XG4gICAgbWFrZSAocmFuZG9tX3NlZWQgKCkpXG5cbiAgbGV0IG1pbl9pbnQzMSA9IC0weDQwMDBfMDAwMFxuICAgICAgKCogPSAtMnteMzB9LCB3aGljaCBpcyBbbWluX2ludF0gZm9yIDMxLWJpdCBpbnRlZ2VycyAqKVxuICBsZXQgbWF4X2ludDMxID0gMHgzRkZGX0ZGRkZcbiAgICAgICgqID0gIDJ7XjMwfS0xLCB3aGljaCBpcyBbbWF4X2ludF0gZm9yIDMxLWJpdCBpbnRlZ2VycyAqKVxuICAoKiBhdm9pZCBpbnRlZ2VyIGxpdGVyYWxzIGZvciB0aGVzZSwgMzItYml0IE9DYW1sIHdvdWxkIHJlamVjdCB0aGVtOiAqKVxuICBsZXQgbWluX2ludDMyID0gLSgxIGxzbCAzMSlcbiAgICAgICgqID0gLTB4ODAwMF8wMDAwIG9uIHBsYXRmb3JtcyB3aGVyZSBbU3lzLmludF9zaXplID49IDMyXSAqKVxuICBsZXQgbWF4X2ludDMyID0gKDEgbHNsIDMxKSAtIDFcbiAgICAgICgqID0gIDB4N0ZGRl9GRkZGIG9uIHBsYXRmb3JtcyB3aGVyZSBbU3lzLmludF9zaXplID49IDMyXSAqKVxuXG4gICgqIFJldHVybiAzMCByYW5kb20gYml0cyBhcyBhbiBpbnRlZ2VyIDAgPD0geCA8IDJeMzAgKilcbiAgbGV0IGJpdHMgcyA9XG4gICAgSW50NjQudG9faW50IChuZXh0IHMpIGxhbmQgbWF4X2ludDMxXG5cbiAgKCogUmV0dXJuIGFuIGludGVnZXIgYmV0d2VlbiAwIChpbmNsdWRlZCkgYW5kIFtuXSAoZXhjbHVkZWQpLlxuICAgICBbYm91bmRdIG1heSBiZSBhbnkgcG9zaXRpdmUgW2ludF0uICBbbWFza10gbXVzdCBiZSBvZiB0aGUgZm9ybSBbMnteaX0tMV1cbiAgICAgYW5kIGdyZWF0ZXIgb3IgZXF1YWwgdG8gW25dLiAgTGFyZ2VyIHZhbHVlcyBvZiBbbWFza10gbWFrZSB0aGUgZnVuY3Rpb25cbiAgICAgcnVuIGZhc3RlciAoZmV3ZXIgc2FtcGxlcyBhcmUgcmVqZWN0ZWQpLiAgU21hbGxlciB2YWx1ZXMgb2YgW21hc2tdXG4gICAgIGFyZSB1c2FibGUgb24gYSB3aWRlciByYW5nZSBvZiBPQ2FtbCBpbXBsZW1lbnRhdGlvbnMuICAqKVxuICBsZXQgcmVjIGludF9hdXggcyBuIG1hc2sgPVxuICAgICgqIFdlIHN0YXJ0IGJ5IGRyYXdpbmcgYSBub24tbmVnYXRpdmUgaW50ZWdlciBpbiB0aGUgWyBbMCwgbWFza10gXSByYW5nZSAqKVxuICAgIGxldCByID0gSW50NjQudG9faW50IChuZXh0IHMpIGxhbmQgbWFzayBpblxuICAgIGxldCB2ID0gciBtb2QgbiBpblxuICAgICgqIEZvciB1bmlmb3JtIGRpc3RyaWJ1dGlvbiBvZiB0aGUgcmVzdWx0IGJldHdlZW4gMCBpbmNsdWRlZCBhbmQgW25dXG4gICAgICogZXhjbHVkZWQsIHRoZSByYW5kb20gbnVtYmVyIFtyXSBtdXN0IGhhdmUgYmVlbiBkcmF3biB1bmlmb3JtbHkgaW5cbiAgICAgKiBhbiBpbnRlcnZhbCB3aG9zZSBsZW5ndGggaXMgYSBtdWx0aXBsZSBvZiBbbl0uIFRvIGFjaGlldmUgdGhpcyxcbiAgICAgKiB3ZSB1c2UgcmVqZWN0aW9uIHNhbXBsaW5nIG9uIHRoZSBncmVhdGVzdCBpbnRlcnZhbCBbIFswLCBrKm4tMV0gXVxuICAgICAqIHRoYXQgZml0cyBpbiBbIFswLCBtYXNrXSBdLiAgVGhhdCBpcywgd2UgcmVqZWN0IHRoZVxuICAgICAqIHNhbXBsZSBpZiBpdCBmYWxscyBvdXRzaWRlIG9mIHRoaXMgaW50ZXJ2YWwsIGFuZCBkcmF3IGFnYWluLlxuICAgICAqIFRoaXMgaXMgd2hhdCB0aGUgdGVzdCBiZWxvdyBkb2VzLCB3aGlsZSBjYXJlZnVseSBhdm9pZGluZ1xuICAgICAqIG92ZXJmbG93cyBhbmQgc3BhcmluZyBhIGRpdmlzaW9uIFttYXNrIC8gbl0uICopXG4gICAgaWYgciAtIHYgPiBtYXNrIC0gbiArIDEgdGhlbiBpbnRfYXV4IHMgbiBtYXNrIGVsc2UgdlxuXG4gICgqIFJldHVybiBhbiBpbnRlZ2VyIGJldHdlZW4gMCAoaW5jbHVkZWQpIGFuZCBbYm91bmRdIChleGNsdWRlZCkuXG4gICAgIFRoZSBib3VuZCBtdXN0IGZpdCBpbiAzMS1iaXQgc2lnbmVkIGludGVnZXJzLlxuICAgICBUaGlzIGZ1bmN0aW9uIHlpZWxkcyB0aGUgc2FtZSBvdXRwdXQgcmVnYXJkbGVzcyBvZiB0aGUgaW50ZWdlciBzaXplLiAqKVxuICBsZXQgaW50IHMgYm91bmQgPVxuICAgIGlmIGJvdW5kID4gbWF4X2ludDMxIHx8IGJvdW5kIDw9IDBcbiAgICB0aGVuIGludmFsaWRfYXJnIFwiUmFuZG9tLmludFwiXG4gICAgZWxzZSBpbnRfYXV4IHMgYm91bmQgbWF4X2ludDMxXG5cbiAgKCogUmV0dXJuIGFuIGludGVnZXIgYmV0d2VlbiAwIChpbmNsdWRlZCkgYW5kIFtib3VuZF0gKGV4Y2x1ZGVkKS5cbiAgICAgW2JvdW5kXSBtYXkgYmUgYW55IHBvc2l0aXZlIFtpbnRdLiAqKVxuICBsZXQgZnVsbF9pbnQgcyBib3VuZCA9XG4gICAgaWYgYm91bmQgPD0gMCB0aGVuXG4gICAgICBpbnZhbGlkX2FyZyBcIlJhbmRvbS5mdWxsX2ludFwiXG4gICAgKCogV2hlbiB0aGUgYm91bmQgZml0cyBpbiAzMS1iaXQgc2lnbmVkIGludGVnZXJzLCB3ZSB1c2UgdGhlIHNhbWUgbWFza1xuICAgICAgIGFzIGluIGZ1bmN0aW9uIFtpbnRdIHNvIGFzIHRvIHlpZWxkIHRoZSBzYW1lIG91dHB1dCBvbiBhbGwgcGxhdGZvcm1zXG4gICAgICAgc3VwcG9ydGVkIGJ5IE9DYW1sICgzMi1iaXQgT0NhbWwsIDY0LWJpdCBPQ2FtbCwgYW5kIEphdmFTY3JpcHQpLlxuICAgICAgIFdoZW4gdGhlIGJvdW5kIGZpdHMgaW4gMzItYml0IHNpZ25lZCBpbnRlZ2Vycywgd2UgdXNlIFttYXhfaW50MzJdXG4gICAgICAgYXMgdGhlIG1hc2sgc28gYXMgdG8geWllbGQgdGhlIHNhbWUgb3V0cHV0IG9uIGFsbCBwbGF0Zm9ybXMgd2hlcmVcbiAgICAgICBbU3lzLmludF9zaXplID49IDMyXSAoaS5lLiBKYXZhU2NyaXB0IGFuZCA2NC1iaXQgT0NhbWwpLiAqKVxuICAgIGVsc2VcbiAgICAgIGludF9hdXggcyBib3VuZFxuICAgICAgICAoaWYgYm91bmQgPD0gbWF4X2ludDMxIHRoZW4gbWF4X2ludDMxXG4gICAgICAgICBlbHNlIGlmIGJvdW5kIDw9IG1heF9pbnQzMiB0aGVuIG1heF9pbnQzMlxuICAgICAgICAgZWxzZSBtYXhfaW50KVxuXG4gICgqIFJldHVybiBhbiBpbnRlZ2VyIGJldHdlZW4gW21pbl0gKGluY2x1ZGVkKSBhbmQgW21heF0gKGluY2x1ZGVkKS5cbiAgICAgVGhlIFtuYml0c10gcGFyYW1ldGVyIGlzIHRoZSBzaXplIGluIGJpdHMgb2YgdGhlIHNpZ25lZCBpbnRlZ2Vyc1xuICAgICB3ZSBkcmF3IGZyb20gW3NdLlxuICAgICBXZSBtdXN0IGhhdmUgWy0ye15uYml0cyAtIDF9IDw9IG1pbiA8PSBtYXggPCAye15uYml0cyAtIDF9XS5cbiAgICAgTW9yZW92ZXIsIGZvciB0aGUgaXRlcmF0aW9uIHRvIGNvbnZlcmdlIHF1aWNrbHksIHRoZSBpbnRlcnZhbFxuICAgICBbW21pbiwgbWF4XV0gc2hvdWxkIGhhdmUgd2lkdGggYXQgbGVhc3QgWzJ7Xm5iaXRzIC0gMX1dLlxuICAgICBBcyB0aGUgd2lkdGggYXBwcm9hY2hlcyB0aGlzIGxvd2VyIGxpbWl0LCB0aGUgYXZlcmFnZSBudW1iZXIgb2ZcbiAgICAgZHJhd3MgYXBwcm9hY2hlcyAyLCB3aXRoIGEgcXVpdGUgaGlnaCBzdGFuZGFyZCBkZXZpYXRpb24gKDIgKyBlcHNpbG9uKS4gKilcbiAgbGV0IHJlYyBpbnRfaW5fbGFyZ2VfcmFuZ2UgcyB+bWluIH5tYXggfm5iaXRzID1cbiAgICBsZXQgZHJvcCA9IFN5cy5pbnRfc2l6ZSAtIG5iaXRzIGluXG4gICAgKCogVGhlIGJpdHNoaWZ0cyByZXBsaWNhdGUgdGhlIFtuYml0c10tdGggYml0IChzaWduIGJpdCkgdG8gaGlnaGVyIGJpdHM6ICopXG4gICAgbGV0IHIgPSAoKEludDY0LnRvX2ludCAobmV4dCBzKSkgbHNsIGRyb3ApIGFzciBkcm9wIGluXG4gICAgaWYgciA8IG1pbiB8fCByID4gbWF4IHRoZW4gaW50X2luX2xhcmdlX3JhbmdlIHMgfm1pbiB+bWF4IH5uYml0cyBlbHNlIHJcblxuICAoKiBSZXR1cm4gYW4gaW50ZWdlciBiZXR3ZWVuIFttaW5dIChpbmNsdWRlZCkgYW5kIFttYXhdIChpbmNsdWRlZCkuXG4gICAgIFttYXNrXSBpcyBhcyBkZXNjcmliZWQgZm9yIFtpbnRfYXV4XS5cbiAgICAgW25iaXRzXSBpcyBhcyBkZXNjcmliZWQgZm9yIFtpbnRfaW5fbGFyZ2VfcmFuZ2VdLiAqKVxuICBsZXQgaW50X2luX3JhbmdlX2F1eCBzIH5taW4gfm1heCB+bWFzayB+bmJpdHMgPVxuICAgIGxldCBzcGFuID0gbWF4IC0gbWluICsgMSBpblxuICAgIGlmIHNwYW4gPD0gbWFzayAoKiBbc3Bhbl0gaXMgc21hbGwgZW5vdWdoICopXG4gICAgJiYgc3BhbiA+IDAgICAgICgqIG5vIG92ZXJmbG93IG9jY3VycmVkIHdoZW4gY29tcHV0aW5nIFtzcGFuXSAqKVxuICAgIHRoZW5cbiAgICAgICgqIEp1c3QgZHJhdyBhIG51bWJlciBpbiBbWzAsIHNwYW4pXSBhbmQgc2hpZnQgaXQgYnkgW21pbl0uICopXG4gICAgICBtaW4gKyBpbnRfYXV4IHMgc3BhbiBtYXNrXG4gICAgZWxzZVxuICAgICAgKCogU3BhbiB0b28gbGFyZ2UsIHVzZSB0aGUgYWx0ZXJuYXRpdmUgZHJhd2luZyBtZXRob2QuICopXG4gICAgICBpbnRfaW5fbGFyZ2VfcmFuZ2UgcyB+bWluIH5tYXggfm5iaXRzXG5cbiAgKCogUmV0dXJuIGFuIGludGVnZXIgYmV0d2VlbiBbbWluXSAoaW5jbHVkZWQpIGFuZCBbbWF4XSAoaW5jbHVkZWQpLlxuICAgICBXZSBtdXN0IGhhdmUgW21pbiA8PSBtYXhdLiAqKVxuICBsZXQgaW50X2luX3JhbmdlIHMgfm1pbiB+bWF4ID1cbiAgICBpZiBtaW4gPiBtYXggdGhlblxuICAgICAgaW52YWxpZF9hcmcgXCJSYW5kb20uaW50X2luX3JhbmdlXCI7XG4gICAgKCogV2hlbiBib3RoIGJvdW5kcyBmaXQgaW4gMzEtYml0IHNpZ25lZCBpbnRlZ2Vycywgd2UgdXNlIHBhcmFtZXRlcnNcbiAgICAgICBbbWFza10gYW5kIFtuYml0c10gYXBwcm9wcmlhdGUgZm9yIDMxLWJpdCBpbnRlZ2Vycywgc28gYXMgdG9cbiAgICAgICB5aWVsZCB0aGUgc2FtZSBvdXRwdXQgb24gYWxsIHBsYXRmb3JtcyBzdXBwb3J0ZWQgYnkgT0NhbWwuXG4gICAgICAgV2hlbiBib3RoIGJvdW5kcyBmaXQgaW4gMzItYml0IHNpZ25lZCBpbnRlZ2Vycywgd2UgdXNlIHBhcmFtZXRlcnNcbiAgICAgICBbbWFza10gYW5kIFtuYml0c10gYXBwcm9wcmlhdGUgZm9yIDMyLWJpdCBpbnRlZ2Vycywgc28gYXMgdG9cbiAgICAgICB5aWVsZCB0aGUgc2FtZSBvdXRwdXQgb24gSmF2YVNjcmlwdCBhbmQgb24gNjQtYml0IE9DYW1sLiAqKVxuICAgIGlmIG1pbiA+PSBtaW5faW50MzEgJiYgbWF4IDw9IG1heF9pbnQzMSB0aGVuXG4gICAgICBpbnRfaW5fcmFuZ2VfYXV4IHMgfm1pbiB+bWF4IH5tYXNrOm1heF9pbnQzMSB+bmJpdHM6MzFcbiAgICBlbHNlIGlmIG1pbiA+PSBtaW5faW50MzIgJiYgbWF4IDw9IG1heF9pbnQzMiB0aGVuXG4gICAgICBpbnRfaW5fcmFuZ2VfYXV4IHMgfm1pbiB+bWF4IH5tYXNrOm1heF9pbnQzMiB+bmJpdHM6MzJcbiAgICBlbHNlXG4gICAgICBpbnRfaW5fcmFuZ2VfYXV4IHMgfm1pbiB+bWF4IH5tYXNrOm1heF9pbnQgfm5iaXRzOlN5cy5pbnRfc2l6ZVxuXG4gICgqIFJldHVybiAzMiByYW5kb20gYml0cyBhcyBhbiBbaW50MzJdICopXG4gIGxldCBiaXRzMzIgcyA9XG4gICAgSW50NjQudG9faW50MzIgKG5leHQgcylcblxuICAoKiBSZXR1cm4gYW4gW2ludDMyXSBiZXR3ZWVuIDAgKGluY2x1ZGVkKSBhbmQgW2JvdW5kXSAoZXhjbHVkZWQpLiAqKVxuICBsZXQgcmVjIGludDMyYXV4IHMgbiA9XG4gICAgbGV0IHIgPSBJbnQzMi5zaGlmdF9yaWdodF9sb2dpY2FsIChiaXRzMzIgcykgMSBpblxuICAgIGxldCB2ID0gSW50MzIucmVtIHIgbiBpblxuICAgICgqIEV4cGxhbmF0aW9uIG9mIHRoaXMgdGVzdDogc2VlIGNvbW1lbnQgaW4gW2ludF9hdXhdLiAqKVxuICAgIGlmIEludDMyLihzdWIgciB2ID4gYWRkIChzdWIgbWF4X2ludCBuKSAxbClcbiAgICB0aGVuIGludDMyYXV4IHMgblxuICAgIGVsc2UgdlxuXG4gIGxldCBpbnQzMiBzIGJvdW5kID1cbiAgICBpZiBib3VuZCA8PSAwbFxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJSYW5kb20uaW50MzJcIlxuICAgIGVsc2UgaW50MzJhdXggcyBib3VuZFxuXG4gICgqIFJldHVybiBhbiBbaW50MzJdIGJldHdlZW4gW21pbl0gKGluY2x1ZGVkKSBhbmQgW21heF0gKGluY2x1ZGVkKS5cbiAgICAgV2UgbXVzdCBoYXZlIFttaW4gPD0gbWF4XS4gKilcbiAgbGV0IHJlYyBpbnQzMl9pbl9yYW5nZV9hdXggcyB+bWluIH5tYXggPVxuICAgIGxldCByID0gSW50NjQudG9faW50MzIgKG5leHQgcykgaW5cbiAgICBpZiByIDwgbWluIHx8IHIgPiBtYXggdGhlbiBpbnQzMl9pbl9yYW5nZV9hdXggcyB+bWluIH5tYXggZWxzZSByXG5cbiAgbGV0IGludDMyX2luX3JhbmdlIHMgfm1pbiB+bWF4ID1cbiAgICBpZiBtaW4gPiBtYXggdGhlblxuICAgICAgaW52YWxpZF9hcmcgXCJSYW5kb20uaW50MzJfaW5fcmFuZ2VcIlxuICAgIGVsc2VcbiAgICAgIGxldCBzcGFuID0gSW50MzIuc3VjYyAoSW50MzIuc3ViIG1heCBtaW4pIGluXG4gICAgICAoKiBFeHBsYW5hdGlvbiBvZiB0aGlzIHRlc3Q6IHNlZSBjb21tZW50IGluIFtpbnRfaW5fcmFuZ2VfYXV4XS4gKilcbiAgICAgIGlmIHNwYW4gPD0gSW50MzIuemVybyB0aGVuXG4gICAgICAgIGludDMyX2luX3JhbmdlX2F1eCBzIH5taW4gfm1heFxuICAgICAgZWxzZVxuICAgICAgICBJbnQzMi5hZGQgbWluIChpbnQzMmF1eCBzIHNwYW4pXG5cbiAgKCogUmV0dXJuIDY0IHJhbmRvbSBiaXRzIGFzIGFuIFtpbnQ2NF0gKilcbiAgbGV0IGJpdHM2NCBzID1cbiAgICBuZXh0IHNcblxuICAoKiBSZXR1cm4gYW4gW2ludDY0XSBiZXR3ZWVuIDAgKGluY2x1ZGVkKSBhbmQgW2JvdW5kXSAoZXhjbHVkZWQpLiAqKVxuICBsZXQgcmVjIGludDY0YXV4IHMgbiA9XG4gICAgbGV0IHIgPSBJbnQ2NC5zaGlmdF9yaWdodF9sb2dpY2FsIChiaXRzNjQgcykgMSBpblxuICAgIGxldCB2ID0gSW50NjQucmVtIHIgbiBpblxuICAgICgqIEV4cGxhbmF0aW9uIG9mIHRoaXMgdGVzdDogc2VlIGNvbW1lbnQgaW4gW2ludF9hdXhdLiAqKVxuICAgIGlmIEludDY0LihzdWIgciB2ID4gYWRkIChzdWIgbWF4X2ludCBuKSAxTClcbiAgICB0aGVuIGludDY0YXV4IHMgblxuICAgIGVsc2UgdlxuXG4gIGxldCBpbnQ2NCBzIGJvdW5kID1cbiAgICBpZiBib3VuZCA8PSAwTFxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJSYW5kb20uaW50NjRcIlxuICAgIGVsc2UgaW50NjRhdXggcyBib3VuZFxuXG4gICgqIFJldHVybiBhbiBbaW50NjRdIGJldHdlZW4gW21pbl0gKGluY2x1ZGVkKSBhbmQgW21heF0gKGluY2x1ZGVkKS5cbiAgICAgV2UgbXVzdCBoYXZlIFttaW4gPD0gbWF4XS4gKilcbiAgbGV0IHJlYyBpbnQ2NF9pbl9yYW5nZV9hdXggcyB+bWluIH5tYXggPVxuICAgIGxldCByID0gbmV4dCBzIGluXG4gICAgaWYgciA8IG1pbiB8fCByID4gbWF4IHRoZW4gaW50NjRfaW5fcmFuZ2VfYXV4IHMgfm1pbiB+bWF4IGVsc2UgclxuXG4gIGxldCBpbnQ2NF9pbl9yYW5nZSBzIH5taW4gfm1heCA9XG4gICAgaWYgbWluID4gbWF4IHRoZW5cbiAgICAgIGludmFsaWRfYXJnIFwiUmFuZG9tLmludDY0X2luX3JhbmdlXCJcbiAgICBlbHNlXG4gICAgICBsZXQgc3BhbiA9IEludDY0LnN1Y2MgKEludDY0LnN1YiBtYXggbWluKSBpblxuICAgICAgKCogRXhwbGFuYXRpb24gb2YgdGhpcyB0ZXN0OiBzZWUgY29tbWVudCBpbiBbaW50X2luX3JhbmdlX2F1eF0uICopXG4gICAgICBpZiBzcGFuIDw9IEludDY0Lnplcm8gdGhlblxuICAgICAgICBpbnQ2NF9pbl9yYW5nZV9hdXggcyB+bWluIH5tYXhcbiAgICAgIGVsc2VcbiAgICAgICAgSW50NjQuYWRkIG1pbiAoaW50NjRhdXggcyBzcGFuKVxuXG4gICgqIFJldHVybiAzMiBvciA2NCByYW5kb20gYml0cyBhcyBhIFtuYXRpdmVpbnRdICopXG4gIGxldCBuYXRpdmViaXRzID1cbiAgICBpZiBOYXRpdmVpbnQuc2l6ZSA9IDMyXG4gICAgdGhlbiBmdW4gcyAtPiBOYXRpdmVpbnQub2ZfaW50MzIgKGJpdHMzMiBzKVxuICAgIGVsc2UgZnVuIHMgLT4gSW50NjQudG9fbmF0aXZlaW50IChiaXRzNjQgcylcblxuICAoKiBSZXR1cm4gYSBbbmF0aXZlaW50XSBiZXR3ZWVuIDAgKGluY2x1ZGVkKSBhbmQgW2JvdW5kXSAoZXhjbHVkZWQpLiAqKVxuICBsZXQgbmF0aXZlaW50ID1cbiAgICBpZiBOYXRpdmVpbnQuc2l6ZSA9IDMyXG4gICAgdGhlbiBmdW4gcyBib3VuZCAtPiBOYXRpdmVpbnQub2ZfaW50MzIgKGludDMyIHMgKE5hdGl2ZWludC50b19pbnQzMiBib3VuZCkpXG4gICAgZWxzZSBmdW4gcyBib3VuZCAtPiBJbnQ2NC50b19uYXRpdmVpbnQgKGludDY0IHMgKEludDY0Lm9mX25hdGl2ZWludCBib3VuZCkpXG5cbiAgKCogUmV0dXJuIGEgW25hdGl2ZWludF0gYmV0d2VlbiBbbWluXSAoaW5jbHVkZWQpIGFuZCBbbWF4XSAoaW5jbHVkZWQpLiAqKVxuICBsZXQgbmF0aXZlaW50X2luX3JhbmdlID1cbiAgICBpZiBOYXRpdmVpbnQuc2l6ZSA9IDMyXG4gICAgdGhlbiBmdW4gcyB+bWluIH5tYXggLT5cbiAgICAgIE5hdGl2ZWludC5vZl9pbnQzMiAoaW50MzJfaW5fcmFuZ2Ugc1xuICAgICAgICB+bWluOihOYXRpdmVpbnQudG9faW50MzIgbWluKSB+bWF4OihOYXRpdmVpbnQudG9faW50MzIgbWF4KSlcbiAgICBlbHNlIGZ1biBzIH5taW4gfm1heCAtPlxuICAgICAgSW50NjQudG9fbmF0aXZlaW50IChpbnQ2NF9pbl9yYW5nZSBzXG4gICAgICAgIH5taW46KEludDY0Lm9mX25hdGl2ZWludCBtaW4pIH5tYXg6KEludDY0Lm9mX25hdGl2ZWludCBtYXgpKVxuXG4gICgqIFJldHVybiBhIGZsb2F0IDAgPCB4IDwgMSB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgYW1vbmcgdGhlXG4gICAgIG11bHRpcGxlcyBvZiAyXi01MyAqKVxuICBsZXQgcmVjIHJhd2Zsb2F0IHMgPVxuICAgIGxldCBiID0gbmV4dCBzIGluXG4gICAgbGV0IG4gPSBJbnQ2NC5zaGlmdF9yaWdodF9sb2dpY2FsIGIgMTEgaW5cbiAgICBpZiBuIDw+IDBMIHRoZW4gSW50NjQudG9fZmxvYXQgbiAqLiAweDEucC01MyBlbHNlIHJhd2Zsb2F0IHNcblxuICAoKiBSZXR1cm4gYSBmbG9hdCBiZXR3ZWVuIDAgYW5kIFtib3VuZF0gKilcbiAgbGV0IGZsb2F0IHMgYm91bmQgPSByYXdmbG9hdCBzICouIGJvdW5kXG5cbiAgKCogUmV0dXJuIGEgcmFuZG9tIEJvb2xlYW4gKilcbiAgbGV0IGJvb2wgcyA9IG5leHQgcyA8IDBMXG5cbiAgKCogU3BsaXQgYSBuZXcgUFJORyBvZmYgdGhlIGdpdmVuIFBSTkcgKilcbiAgbGV0IHNwbGl0IHMgPVxuICAgIGxldCBpMSA9IGJpdHM2NCBzIGluIGxldCBpMiA9IGJpdHM2NCBzIGluXG4gICAgbGV0IGkzID0gYml0czY0IHMgaW4gbGV0IGk0ID0gYml0czY0IHMgaW5cbiAgICBtayBpMSBpMiBpMyBpNFxuZW5kXG5cbmxldCBta19kZWZhdWx0ICgpID1cbiAgKCogVGhpcyBpcyB0aGUgc3RhdGUgb2J0YWluZWQgd2l0aCBbU3RhdGUubWFrZSBbfCAzMTQxNTkyNjUgfF1dLiAqKVxuICBTdGF0ZS5tayAoLTYxOTY4NzQyODk1Njc3MDUwOTdMKVxuICAgICAgICAgICA1ODY1NzMyNDk4MzM3MTMxODlMXG4gICAgICAgICAgICgtODU5MTI2ODgwMzg2NTA0MzQwN0wpXG4gICAgICAgICAgIDYzODg2MTM1OTU4NDk3NzIwNDRMXG5cbmxldCByYW5kb21fa2V5ID1cbiAgRG9tYWluLkRMUy5uZXdfa2V5IH5zcGxpdF9mcm9tX3BhcmVudDpTdGF0ZS5zcGxpdCBta19kZWZhdWx0XG5cbmxldCBiaXRzICgpID0gU3RhdGUuYml0cyAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSlcbmxldCBpbnQgYm91bmQgPSBTdGF0ZS5pbnQgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpIGJvdW5kXG5sZXQgZnVsbF9pbnQgYm91bmQgPSBTdGF0ZS5mdWxsX2ludCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgYm91bmRcbmxldCBpbnRfaW5fcmFuZ2Ugfm1pbiB+bWF4ID1cbiAgU3RhdGUuaW50X2luX3JhbmdlIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSB+bWluIH5tYXhcbmxldCBpbnQzMiBib3VuZCA9IFN0YXRlLmludDMyIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSBib3VuZFxubGV0IGludDMyX2luX3JhbmdlIH5taW4gfm1heCA9XG4gIFN0YXRlLmludDMyX2luX3JhbmdlIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSB+bWluIH5tYXhcbmxldCBuYXRpdmVpbnQgYm91bmQgPSBTdGF0ZS5uYXRpdmVpbnQgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpIGJvdW5kXG5sZXQgbmF0aXZlaW50X2luX3JhbmdlIH5taW4gfm1heCA9XG4gIFN0YXRlLm5hdGl2ZWludF9pbl9yYW5nZSAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgfm1pbiB+bWF4XG5sZXQgaW50NjQgYm91bmQgPSBTdGF0ZS5pbnQ2NCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgYm91bmRcbmxldCBpbnQ2NF9pbl9yYW5nZSB+bWluIH5tYXggPVxuICBTdGF0ZS5pbnQ2NF9pbl9yYW5nZSAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgfm1pbiB+bWF4XG5sZXQgZmxvYXQgc2NhbGUgPSBTdGF0ZS5mbG9hdCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgc2NhbGVcbmxldCBib29sICgpID0gU3RhdGUuYm9vbCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSlcbmxldCBiaXRzMzIgKCkgPSBTdGF0ZS5iaXRzMzIgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpXG5sZXQgYml0czY0ICgpID0gU3RhdGUuYml0czY0IChEb21haW4uRExTLmdldCByYW5kb21fa2V5KVxubGV0IG5hdGl2ZWJpdHMgKCkgPSBTdGF0ZS5uYXRpdmViaXRzIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KVxuXG5sZXQgZnVsbF9pbml0IHNlZWQgPSBTdGF0ZS5yZWluaXQgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpIHNlZWRcbmxldCBpbml0IHNlZWQgPSBmdWxsX2luaXQgW3wgc2VlZCB8XVxubGV0IHNlbGZfaW5pdCAoKSA9IGZ1bGxfaW5pdCAocmFuZG9tX3NlZWQoKSlcblxuKCogU3BsaXR0aW5nICopXG5cbmxldCBzcGxpdCAoKSA9IFN0YXRlLnNwbGl0IChEb21haW4uRExTLmdldCByYW5kb21fa2V5KVxuXG4oKiBNYW5pcHVsYXRpbmcgdGhlIGN1cnJlbnQgc3RhdGUuICopXG5cbmxldCBnZXRfc3RhdGUgKCkgPSBTdGF0ZS5jb3B5IChEb21haW4uRExTLmdldCByYW5kb21fa2V5KVxubGV0IHNldF9zdGF0ZSBzID0gU3RhdGUuYXNzaWduIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSBzXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfYmFfYmxpdCIsImNhbWxfYmFfc2V0XzEiLCJjYW1sX2J5dGVzX3NldCIsImNhbWxfY3JlYXRlX2J5dGVzIiwiY2FtbF9ncmVhdGVydGhhbiIsImNhbWxfaW50NjRfYWRkIiwiY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGkiLCJjYW1sX2ludDY0X29mX2ludDMyIiwiY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lIiwiY2FtbF9pbnQ2NF9zdWIiLCJjYW1sX2ludDY0X3RvX2ludDMyIiwiY2FtbF9sZXNzZXF1YWwiLCJjYW1sX2xlc3N0aGFuIiwiY2FtbF9seG1fbmV4dCIsImNhbWxfbW9kIiwiY2FtbF9ub3RlcXVhbCIsImNhbWxfc3lzX3JhbmRvbV9zZWVkIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImNhbWxfY2FsbDMiLCJhMiIsImdsb2JhbF9kYXRhIiwiU3RkbGliX0RvbWFpbiIsIlN0ZGxpYl9TeXMiLCJTdGRsaWJfSW50MzIiLCJTdGRsaWJfSW50NjQiLCJTdGRsaWIiLCJTdGRsaWJfQnl0ZXMiLCJTdGRsaWJfRGlnZXN0IiwiU3RkbGliX1N0cmluZyIsIlN0ZGxpYl9CaWdhcnJheSIsIlN0ZGxpYl9OYXRpdmVpbnQiLCJjcmVhdGUiLCJwYXJhbSIsInNldCIsInMiLCJpMSIsImkyIiwiaTMiLCJpNCIsIm1rIiwic2VyaWFsaXphdGlvbl9wcmVmaXgiLCJ0b19iaW5hcnlfc3RyaW5nIiwiYnVmIiwiaSIsIm9mX2JpbmFyeV9zdHJpbmciLCJjb3B5Iiwic3JjIiwiZHN0IiwicmVpbml0Iiwic2VlZCIsIm4iLCJiIiwiZDEiLCJkMiIsIm1ha2UiLCJtYWtlX3NlbGZfaW5pdCIsImJpdHMiLCJpbnRfYXV4IiwibWFzayIsInIiLCJ2IiwibWF4X2ludDMxIiwiaW50IiwiYm91bmQiLCJtYXhfaW50MzIiLCJmdWxsX2ludCIsImludF9pbl9yYW5nZV9hdXgiLCJtaW4iLCJtYXgiLCJuYml0cyIsInNwYW4iLCJkcm9wIiwiaW50X2luX3JhbmdlIiwiYml0czMyIiwiaW50MzJhdXgiLCJpbnQzMiIsImludDMyX2luX3JhbmdlIiwiaW50NjRhdXgiLCJpbnQ2NCIsImludDY0X2luX3JhbmdlIiwibmF0aXZlYml0cyIsIm5hdGl2ZWludCIsIm5hdGl2ZWludF9pbl9yYW5nZSIsImZsb2F0IiwiYm9vbCIsInNwbGl0IiwibWtfZGVmYXVsdCIsInJhbmRvbV9rZXkiLCJzY2FsZSIsImJpdHM2NCIsImZ1bGxfaW5pdCIsImluaXQiLCJzZWxmX2luaXQiLCJnZXRfc3RhdGUiLCJzZXRfc3RhdGUiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyw2QkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsSUFBQUMsaUNBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsV0FBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsdUJBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFdBQUFKLEdBQUFDLElBQUFFLElBQUFFO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsT0FBQUMsT0M4Qkksa0RB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QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRURwVjlEIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MjM5MDgsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvaGFzaHRibC5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogSGFzaCB0YWJsZXMgKilcblxuKCogV2UgZG8gZHluYW1pYyBoYXNoaW5nLCBhbmQgcmVzaXplIHRoZSB0YWJsZSBhbmQgcmVoYXNoIHRoZSBlbGVtZW50c1xuICAgd2hlbiB0aGUgbG9hZCBmYWN0b3IgYmVjb21lcyB0b28gaGlnaC4gKilcblxudHlwZSAoJ2EsICdiKSB0ID1cbiAgeyBtdXRhYmxlIHNpemU6IGludDsgICAgICAgICAgICAgICAgICAgICAgICAoKiBudW1iZXIgb2YgZW50cmllcyAqKVxuICAgIG11dGFibGUgZGF0YTogKCdhLCAnYikgYnVja2V0bGlzdCBhcnJheTsgICgqIHRoZSBidWNrZXRzICopXG4gICAgc2VlZDogaW50OyAgICAgICAgICAgICAgICAgICAgICAgICgqIGZvciByYW5kb21pemF0aW9uICopXG4gICAgbXV0YWJsZSBpbml0aWFsX3NpemU6IGludDsgICAgICAgICAgICAgICAgKCogaW5pdGlhbCBhcnJheSBzaXplICopXG4gIH1cblxuYW5kICgnYSwgJ2IpIGJ1Y2tldGxpc3QgPVxuICAgIEVtcHR5XG4gIHwgQ29ucyBvZiB7IG11dGFibGUga2V5OiAnYTtcbiAgICAgICAgICAgICAgbXV0YWJsZSBkYXRhOiAnYjtcbiAgICAgICAgICAgICAgbXV0YWJsZSBuZXh0OiAoJ2EsICdiKSBidWNrZXRsaXN0IH1cblxuKCogVGhlIHNpZ24gb2YgaW5pdGlhbF9zaXplIGVuY29kZXMgdGhlIGZhY3QgdGhhdCBhIHRyYXZlcnNhbCBpc1xuICAgb25nb2luZyBvciBub3QuXG5cbiAgIFRoaXMgZGlzYWJsZXMgdGhlIGVmZmljaWVudCBpbiBwbGFjZSBpbXBsZW1lbnRhdGlvbiBvZiByZXNpemluZy5cbiopXG5cbmxldCBvbmdvaW5nX3RyYXZlcnNhbCBoID1cbiAgT2JqLnNpemUgKE9iai5yZXByIGgpIDwgNCAoKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGhhc2ggdGFibGVzICopXG4gIHx8IGguaW5pdGlhbF9zaXplIDwgMFxuXG5sZXQgZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoID1cbiAgaC5pbml0aWFsX3NpemUgPC0gLSBoLmluaXRpYWxfc2l6ZVxuXG4oKiBUbyBwaWNrIHJhbmRvbSBzZWVkcyBpZiByZXF1ZXN0ZWQgKilcblxubGV0IHJhbmRvbWl6ZWRfZGVmYXVsdCA9XG4gIGxldCBwYXJhbXMgPVxuICAgIHRyeSBTeXMuZ2V0ZW52IFwiT0NBTUxSVU5QQVJBTVwiIHdpdGggTm90X2ZvdW5kIC0+XG4gICAgdHJ5IFN5cy5nZXRlbnYgXCJDQU1MUlVOUEFSQU1cIiB3aXRoIE5vdF9mb3VuZCAtPiBcIlwiIGluXG4gIFN0cmluZy5jb250YWlucyBwYXJhbXMgJ1InXG5cbmxldCByYW5kb21pemVkID0gQXRvbWljLm1ha2UgcmFuZG9taXplZF9kZWZhdWx0XG5cbmxldCByYW5kb21pemUgKCkgPSBBdG9taWMuc2V0IHJhbmRvbWl6ZWQgdHJ1ZVxubGV0IGlzX3JhbmRvbWl6ZWQgKCkgPSBBdG9taWMuZ2V0IHJhbmRvbWl6ZWRcblxubGV0IHBybmdfa2V5ID0gRG9tYWluLkRMUy5uZXdfa2V5IFJhbmRvbS5TdGF0ZS5tYWtlX3NlbGZfaW5pdFxuXG4oKiBGdW5jdGlvbnMgd2hpY2ggYXBwZWFyIGJlZm9yZSB0aGUgZnVuY3RvcmlhbCBpbnRlcmZhY2UgbXVzdCBlaXRoZXIgYmVcbiAgIGluZGVwZW5kZW50IG9mIHRoZSBoYXNoIGZ1bmN0aW9uIG9yIHRha2UgaXQgYXMgYSBwYXJhbWV0ZXIgKHNlZSAjMjIwMiBhbmRcbiAgIGNvZGUgYmVsb3cgdGhlIGZ1bmN0b3IgZGVmaW5pdGlvbnMuICopXG5cbigqIENyZWF0aW5nIGEgZnJlc2gsIGVtcHR5IHRhYmxlICopXG5cbmxldCByZWMgcG93ZXJfMl9hYm92ZSB4IG4gPVxuICBpZiB4ID49IG4gdGhlbiB4XG4gIGVsc2UgaWYgeCAqIDIgPiBTeXMubWF4X2FycmF5X2xlbmd0aCB0aGVuIHhcbiAgZWxzZSBwb3dlcl8yX2Fib3ZlICh4ICogMikgblxuXG5sZXQgY3JlYXRlID8ocmFuZG9tID0gQXRvbWljLmdldCByYW5kb21pemVkKSBpbml0aWFsX3NpemUgPVxuICBsZXQgcyA9IHBvd2VyXzJfYWJvdmUgMTYgaW5pdGlhbF9zaXplIGluXG4gIGxldCBzZWVkID1cbiAgICBpZiByYW5kb20gdGhlbiBSYW5kb20uU3RhdGUuYml0cyAoRG9tYWluLkRMUy5nZXQgcHJuZ19rZXkpIGVsc2UgMFxuICBpblxuICB7IGluaXRpYWxfc2l6ZSA9IHM7IHNpemUgPSAwOyBzZWVkID0gc2VlZDsgZGF0YSA9IEFycmF5Lm1ha2UgcyBFbXB0eSB9XG5cbmxldCBjbGVhciBoID1cbiAgaWYgaC5zaXplID4gMCB0aGVuIGJlZ2luXG4gICAgaC5zaXplIDwtIDA7XG4gICAgQXJyYXkuZmlsbCBoLmRhdGEgMCAoQXJyYXkubGVuZ3RoIGguZGF0YSkgRW1wdHlcbiAgZW5kXG5cbmxldCByZXNldCBoID1cbiAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCBoLmRhdGEgaW5cbiAgaWYgT2JqLnNpemUgKE9iai5yZXByIGgpIDwgNCAoKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGhhc2ggdGFibGVzICopXG4gICAgfHwgbGVuID0gYWJzIGguaW5pdGlhbF9zaXplIHRoZW5cbiAgICBjbGVhciBoXG4gIGVsc2UgYmVnaW5cbiAgICBoLnNpemUgPC0gMDtcbiAgICBoLmRhdGEgPC0gQXJyYXkubWFrZSAoYWJzIGguaW5pdGlhbF9zaXplKSBFbXB0eVxuICBlbmRcblxubGV0IGNvcHlfYnVja2V0bGlzdCA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT4gRW1wdHlcbiAgfCBDb25zIHtrZXk7IGRhdGE7IG5leHR9IC0+XG4gICAgICBsZXQgcmVjIGxvb3AgcHJlYyA9IGZ1bmN0aW9uXG4gICAgICAgIHwgRW1wdHkgLT4gKClcbiAgICAgICAgfCBDb25zIHtrZXk7IGRhdGE7IG5leHR9IC0+XG4gICAgICAgICAgICBsZXQgciA9IENvbnMge2tleTsgZGF0YTsgbmV4dH0gaW5cbiAgICAgICAgICAgIGJlZ2luIG1hdGNoIHByZWMgd2l0aFxuICAgICAgICAgICAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgICAgICAgICAgIHwgQ29ucyBwcmVjIC0+ICBwcmVjLm5leHQgPC0gclxuICAgICAgICAgICAgZW5kO1xuICAgICAgICAgICAgbG9vcCByIG5leHRcbiAgICAgIGluXG4gICAgICBsZXQgciA9IENvbnMge2tleTsgZGF0YTsgbmV4dH0gaW5cbiAgICAgIGxvb3AgciBuZXh0O1xuICAgICAgclxuXG5sZXQgY29weSBoID0geyBoIHdpdGggZGF0YSA9IEFycmF5Lm1hcCBjb3B5X2J1Y2tldGxpc3QgaC5kYXRhIH1cblxubGV0IGxlbmd0aCBoID0gaC5zaXplXG5cbmxldCBpbnNlcnRfYWxsX2J1Y2tldHMgaW5kZXhmdW4gaW5wbGFjZSBvZGF0YSBuZGF0YSA9XG4gIGxldCBuc2l6ZSA9IEFycmF5Lmxlbmd0aCBuZGF0YSBpblxuICBsZXQgbmRhdGFfdGFpbCA9IEFycmF5Lm1ha2UgbnNpemUgRW1wdHkgaW5cbiAgbGV0IHJlYyBpbnNlcnRfYnVja2V0ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+ICgpXG4gICAgfCBDb25zIHtrZXk7IGRhdGE7IG5leHR9IGFzIGNlbGwgLT5cbiAgICAgICAgbGV0IGNlbGwgPVxuICAgICAgICAgIGlmIGlucGxhY2UgdGhlbiBjZWxsXG4gICAgICAgICAgZWxzZSBDb25zIHtrZXk7IGRhdGE7IG5leHQgPSBFbXB0eX1cbiAgICAgICAgaW5cbiAgICAgICAgbGV0IG5pZHggPSBpbmRleGZ1biBrZXkgaW5cbiAgICAgICAgYmVnaW4gbWF0Y2ggbmRhdGFfdGFpbC4obmlkeCkgd2l0aFxuICAgICAgICB8IEVtcHR5IC0+IG5kYXRhLihuaWR4KSA8LSBjZWxsO1xuICAgICAgICB8IENvbnMgdGFpbCAtPiB0YWlsLm5leHQgPC0gY2VsbDtcbiAgICAgICAgZW5kO1xuICAgICAgICBuZGF0YV90YWlsLihuaWR4KSA8LSBjZWxsO1xuICAgICAgICBpbnNlcnRfYnVja2V0IG5leHRcbiAgaW5cbiAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCBvZGF0YSAtIDEgZG9cbiAgICBpbnNlcnRfYnVja2V0IG9kYXRhLihpKVxuICBkb25lO1xuICBpZiBpbnBsYWNlIHRoZW5cbiAgICBmb3IgaSA9IDAgdG8gbnNpemUgLSAxIGRvXG4gICAgICBtYXRjaCBuZGF0YV90YWlsLihpKSB3aXRoXG4gICAgICB8IEVtcHR5IC0+ICgpXG4gICAgICB8IENvbnMgdGFpbCAtPiB0YWlsLm5leHQgPC0gRW1wdHlcbiAgICBkb25lXG5cbmxldCByZXNpemUgaW5kZXhmdW4gaCA9XG4gIGxldCBvZGF0YSA9IGguZGF0YSBpblxuICBsZXQgb3NpemUgPSBBcnJheS5sZW5ndGggb2RhdGEgaW5cbiAgbGV0IG5zaXplID0gb3NpemUgKiAyIGluXG4gIGlmIG5zaXplIDwgU3lzLm1heF9hcnJheV9sZW5ndGggdGhlbiBiZWdpblxuICAgIGxldCBuZGF0YSA9IEFycmF5Lm1ha2UgbnNpemUgRW1wdHkgaW5cbiAgICBsZXQgaW5wbGFjZSA9IG5vdCAob25nb2luZ190cmF2ZXJzYWwgaCkgaW5cbiAgICBoLmRhdGEgPC0gbmRhdGE7ICAgICAgICAgICgqIHNvIHRoYXQgaW5kZXhmdW4gc2VlcyB0aGUgbmV3IGJ1Y2tldCBjb3VudCAqKVxuICAgIGluc2VydF9hbGxfYnVja2V0cyAoaW5kZXhmdW4gaCkgaW5wbGFjZSBvZGF0YSBuZGF0YVxuICBlbmRcblxubGV0IGl0ZXIgZiBoID1cbiAgbGV0IHJlYyBkb19idWNrZXQgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT5cbiAgICAgICAgKClcbiAgICB8IENvbnN7a2V5OyBkYXRhOyBuZXh0fSAtPlxuICAgICAgICBmIGtleSBkYXRhOyBkb19idWNrZXQgbmV4dCBpblxuICBsZXQgb2xkX3RyYXYgPSBvbmdvaW5nX3RyYXZlcnNhbCBoIGluXG4gIGlmIG5vdCBvbGRfdHJhdiB0aGVuIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgdHJ5XG4gICAgbGV0IGQgPSBoLmRhdGEgaW5cbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGQgLSAxIGRvXG4gICAgICBkb19idWNrZXQgZC4oaSlcbiAgICBkb25lO1xuICAgIGlmIG5vdCBvbGRfdHJhdiB0aGVuIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgd2l0aCBleG4gd2hlbiBub3Qgb2xkX3RyYXYgLT5cbiAgICBmbGlwX29uZ29pbmdfdHJhdmVyc2FsIGg7XG4gICAgcmFpc2UgZXhuXG5cbmxldCByZWMgZmlsdGVyX21hcF9pbnBsYWNlX2J1Y2tldCBmIGggaSBwcmVjID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPlxuICAgICAgYmVnaW4gbWF0Y2ggcHJlYyB3aXRoXG4gICAgICB8IEVtcHR5IC0+IGguZGF0YS4oaSkgPC0gRW1wdHlcbiAgICAgIHwgQ29ucyBjIC0+IGMubmV4dCA8LSBFbXB0eVxuICAgICAgZW5kXG4gIHwgKENvbnMgKHtrZXk7IGRhdGE7IG5leHR9IGFzIGMpKSBhcyBzbG90IC0+XG4gICAgICBiZWdpbiBtYXRjaCBmIGtleSBkYXRhIHdpdGhcbiAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgIGguc2l6ZSA8LSBoLnNpemUgLSAxO1xuICAgICAgICAgIGZpbHRlcl9tYXBfaW5wbGFjZV9idWNrZXQgZiBoIGkgcHJlYyBuZXh0XG4gICAgICB8IFNvbWUgZGF0YSAtPlxuICAgICAgICAgIGJlZ2luIG1hdGNoIHByZWMgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgLT4gaC5kYXRhLihpKSA8LSBzbG90XG4gICAgICAgICAgfCBDb25zIGMgLT4gYy5uZXh0IDwtIHNsb3RcbiAgICAgICAgICBlbmQ7XG4gICAgICAgICAgYy5kYXRhIDwtIGRhdGE7XG4gICAgICAgICAgZmlsdGVyX21hcF9pbnBsYWNlX2J1Y2tldCBmIGggaSBzbG90IG5leHRcbiAgICAgIGVuZFxuXG5sZXQgZmlsdGVyX21hcF9pbnBsYWNlIGYgaCA9XG4gIGxldCBkID0gaC5kYXRhIGluXG4gIGxldCBvbGRfdHJhdiA9IG9uZ29pbmdfdHJhdmVyc2FsIGggaW5cbiAgaWYgbm90IG9sZF90cmF2IHRoZW4gZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICB0cnlcbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGQgLSAxIGRvXG4gICAgICBmaWx0ZXJfbWFwX2lucGxhY2VfYnVja2V0IGYgaCBpIEVtcHR5IGguZGF0YS4oaSlcbiAgICBkb25lO1xuICAgIGlmIG5vdCBvbGRfdHJhdiB0aGVuIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaFxuICB3aXRoIGV4biB3aGVuIG5vdCBvbGRfdHJhdiAtPlxuICAgIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgICByYWlzZSBleG5cblxubGV0IGZvbGQgZiBoIGluaXQgPVxuICBsZXQgcmVjIGRvX2J1Y2tldCBiIGFjY3UgPVxuICAgIG1hdGNoIGIgd2l0aFxuICAgICAgRW1wdHkgLT5cbiAgICAgICAgYWNjdVxuICAgIHwgQ29uc3trZXk7IGRhdGE7IG5leHR9IC0+XG4gICAgICAgIGRvX2J1Y2tldCBuZXh0IChmIGtleSBkYXRhIGFjY3UpIGluXG4gIGxldCBvbGRfdHJhdiA9IG9uZ29pbmdfdHJhdmVyc2FsIGggaW5cbiAgaWYgbm90IG9sZF90cmF2IHRoZW4gZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICB0cnlcbiAgICBsZXQgZCA9IGguZGF0YSBpblxuICAgIGxldCBhY2N1ID0gcmVmIGluaXQgaW5cbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGQgLSAxIGRvXG4gICAgICBhY2N1IDo9IGRvX2J1Y2tldCBkLihpKSAhYWNjdVxuICAgIGRvbmU7XG4gICAgaWYgbm90IG9sZF90cmF2IHRoZW4gZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICAgICFhY2N1XG4gIHdpdGggZXhuIHdoZW4gbm90IG9sZF90cmF2IC0+XG4gICAgZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICAgIHJhaXNlIGV4blxuXG50eXBlIHN0YXRpc3RpY3MgPSB7XG4gIG51bV9iaW5kaW5nczogaW50O1xuICBudW1fYnVja2V0czogaW50O1xuICBtYXhfYnVja2V0X2xlbmd0aDogaW50O1xuICBidWNrZXRfaGlzdG9ncmFtOiBpbnQgYXJyYXlcbn1cblxubGV0IHJlYyBidWNrZXRfbGVuZ3RoIGFjY3UgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+IGFjY3VcbiAgfCBDb25ze25leHR9IC0+IGJ1Y2tldF9sZW5ndGggKGFjY3UgKyAxKSBuZXh0XG5cbmxldCBzdGF0cyBoID1cbiAgbGV0IG1ibCA9XG4gICAgQXJyYXkuZm9sZF9sZWZ0IChmdW4gbSBiIC0+IEludC5tYXggbSAoYnVja2V0X2xlbmd0aCAwIGIpKSAwIGguZGF0YSBpblxuICBsZXQgaGlzdG8gPSBBcnJheS5tYWtlIChtYmwgKyAxKSAwIGluXG4gIEFycmF5Lml0ZXJcbiAgICAoZnVuIGIgLT5cbiAgICAgIGxldCBsID0gYnVja2V0X2xlbmd0aCAwIGIgaW5cbiAgICAgIGhpc3RvLihsKSA8LSBoaXN0by4obCkgKyAxKVxuICAgIGguZGF0YTtcbiAgeyBudW1fYmluZGluZ3MgPSBoLnNpemU7XG4gICAgbnVtX2J1Y2tldHMgPSBBcnJheS5sZW5ndGggaC5kYXRhO1xuICAgIG1heF9idWNrZXRfbGVuZ3RoID0gbWJsO1xuICAgIGJ1Y2tldF9oaXN0b2dyYW0gPSBoaXN0byB9XG5cbigqKiB7MSBJdGVyYXRvcnN9ICopXG5cbmxldCB0b19zZXEgdGJsID1cbiAgKCogY2FwdHVyZSBjdXJyZW50IGFycmF5LCBzbyB0aGF0IGV2ZW4gaWYgdGhlIHRhYmxlIGlzIHJlc2l6ZWQgd2VcbiAgICAga2VlcCBpdGVyYXRpbmcgb24gdGhlIHNhbWUgYXJyYXkgKilcbiAgbGV0IHRibF9kYXRhID0gdGJsLmRhdGEgaW5cbiAgKCogc3RhdGU6IGluZGV4ICogbmV4dCBidWNrZXQgdG8gdHJhdmVyc2UgKilcbiAgbGV0IHJlYyBhdXggaSBidWNrICgpID0gbWF0Y2ggYnVjayB3aXRoXG4gICAgfCBFbXB0eSAtPlxuICAgICAgICBpZiBpID0gQXJyYXkubGVuZ3RoIHRibF9kYXRhXG4gICAgICAgIHRoZW4gU2VxLk5pbFxuICAgICAgICBlbHNlIGF1eChpKzEpIHRibF9kYXRhLihpKSAoKVxuICAgIHwgQ29ucyB7a2V5OyBkYXRhOyBuZXh0fSAtPlxuICAgICAgICBTZXEuQ29ucyAoKGtleSwgZGF0YSksIGF1eCBpIG5leHQpXG4gIGluXG4gIGF1eCAwIEVtcHR5XG5cbmxldCB0b19zZXFfa2V5cyBtID0gU2VxLm1hcCBmc3QgKHRvX3NlcSBtKVxuXG5sZXQgdG9fc2VxX3ZhbHVlcyBtID0gU2VxLm1hcCBzbmQgKHRvX3NlcSBtKVxuXG4oKiBGdW5jdG9yaWFsIGludGVyZmFjZSAqKVxuXG5tb2R1bGUgdHlwZSBIYXNoZWRUeXBlID1cbiAgc2lnXG4gICAgdHlwZSB0XG4gICAgdmFsIGVxdWFsOiB0IC0+IHQgLT4gYm9vbFxuICAgIHZhbCBoYXNoOiB0IC0+IGludFxuICBlbmRcblxubW9kdWxlIHR5cGUgU2VlZGVkSGFzaGVkVHlwZSA9XG4gIHNpZ1xuICAgIHR5cGUgdFxuICAgIHZhbCBlcXVhbDogdCAtPiB0IC0+IGJvb2xcbiAgICB2YWwgc2VlZGVkX2hhc2g6IGludCAtPiB0IC0+IGludFxuICBlbmRcblxubW9kdWxlIHR5cGUgUyA9XG4gIHNpZ1xuICAgIHR5cGUga2V5XG4gICAgdHlwZSAhJ2EgdFxuICAgIHZhbCBjcmVhdGU6IGludCAtPiAnYSB0XG4gICAgdmFsIGNsZWFyIDogJ2EgdCAtPiB1bml0XG4gICAgdmFsIHJlc2V0IDogJ2EgdCAtPiB1bml0XG4gICAgdmFsIGNvcHk6ICdhIHQgLT4gJ2EgdFxuICAgIHZhbCBhZGQ6ICdhIHQgLT4ga2V5IC0+ICdhIC0+IHVuaXRcbiAgICB2YWwgcmVtb3ZlOiAnYSB0IC0+IGtleSAtPiB1bml0XG4gICAgdmFsIGZpbmQ6ICdhIHQgLT4ga2V5IC0+ICdhXG4gICAgdmFsIGZpbmRfb3B0OiAnYSB0IC0+IGtleSAtPiAnYSBvcHRpb25cbiAgICB2YWwgZmluZF9hbGw6ICdhIHQgLT4ga2V5IC0+ICdhIGxpc3RcbiAgICB2YWwgcmVwbGFjZSA6ICdhIHQgLT4ga2V5IC0+ICdhIC0+IHVuaXRcbiAgICB2YWwgbWVtIDogJ2EgdCAtPiBrZXkgLT4gYm9vbFxuICAgIHZhbCBpdGVyOiAoa2V5IC0+ICdhIC0+IHVuaXQpIC0+ICdhIHQgLT4gdW5pdFxuICAgIHZhbCBmaWx0ZXJfbWFwX2lucGxhY2U6IChrZXkgLT4gJ2EgLT4gJ2Egb3B0aW9uKSAtPiAnYSB0IC0+IHVuaXRcbiAgICB2YWwgZm9sZDogKGtleSAtPiAnYSAtPiAnYiAtPiAnYikgLT4gJ2EgdCAtPiAnYiAtPiAnYlxuICAgIHZhbCBsZW5ndGg6ICdhIHQgLT4gaW50XG4gICAgdmFsIHN0YXRzOiAnYSB0IC0+IHN0YXRpc3RpY3NcbiAgICB2YWwgdG9fc2VxIDogJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50XG4gICAgdmFsIHRvX3NlcV9rZXlzIDogXyB0IC0+IGtleSBTZXEudFxuICAgIHZhbCB0b19zZXFfdmFsdWVzIDogJ2EgdCAtPiAnYSBTZXEudFxuICAgIHZhbCBhZGRfc2VxIDogJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50IC0+IHVuaXRcbiAgICB2YWwgcmVwbGFjZV9zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnQgLT4gdW5pdFxuICAgIHZhbCBvZl9zZXEgOiAoa2V5ICogJ2EpIFNlcS50IC0+ICdhIHRcbiAgZW5kXG5cbm1vZHVsZSB0eXBlIFNlZWRlZFMgPVxuICBzaWdcbiAgICB0eXBlIGtleVxuICAgIHR5cGUgISdhIHRcbiAgICB2YWwgY3JlYXRlIDogP3JhbmRvbTpib29sIC0+IGludCAtPiAnYSB0XG4gICAgdmFsIGNsZWFyIDogJ2EgdCAtPiB1bml0XG4gICAgdmFsIHJlc2V0IDogJ2EgdCAtPiB1bml0XG4gICAgdmFsIGNvcHkgOiAnYSB0IC0+ICdhIHRcbiAgICB2YWwgYWRkIDogJ2EgdCAtPiBrZXkgLT4gJ2EgLT4gdW5pdFxuICAgIHZhbCByZW1vdmUgOiAnYSB0IC0+IGtleSAtPiB1bml0XG4gICAgdmFsIGZpbmQgOiAnYSB0IC0+IGtleSAtPiAnYVxuICAgIHZhbCBmaW5kX29wdDogJ2EgdCAtPiBrZXkgLT4gJ2Egb3B0aW9uXG4gICAgdmFsIGZpbmRfYWxsIDogJ2EgdCAtPiBrZXkgLT4gJ2EgbGlzdFxuICAgIHZhbCByZXBsYWNlIDogJ2EgdCAtPiBrZXkgLT4gJ2EgLT4gdW5pdFxuICAgIHZhbCBtZW0gOiAnYSB0IC0+IGtleSAtPiBib29sXG4gICAgdmFsIGl0ZXIgOiAoa2V5IC0+ICdhIC0+IHVuaXQpIC0+ICdhIHQgLT4gdW5pdFxuICAgIHZhbCBmaWx0ZXJfbWFwX2lucGxhY2U6IChrZXkgLT4gJ2EgLT4gJ2Egb3B0aW9uKSAtPiAnYSB0IC0+IHVuaXRcbiAgICB2YWwgZm9sZCA6IChrZXkgLT4gJ2EgLT4gJ2IgLT4gJ2IpIC0+ICdhIHQgLT4gJ2IgLT4gJ2JcbiAgICB2YWwgbGVuZ3RoIDogJ2EgdCAtPiBpbnRcbiAgICB2YWwgc3RhdHM6ICdhIHQgLT4gc3RhdGlzdGljc1xuICAgIHZhbCB0b19zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnRcbiAgICB2YWwgdG9fc2VxX2tleXMgOiBfIHQgLT4ga2V5IFNlcS50XG4gICAgdmFsIHRvX3NlcV92YWx1ZXMgOiAnYSB0IC0+ICdhIFNlcS50XG4gICAgdmFsIGFkZF9zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnQgLT4gdW5pdFxuICAgIHZhbCByZXBsYWNlX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudCAtPiB1bml0XG4gICAgdmFsIG9mX3NlcSA6IChrZXkgKiAnYSkgU2VxLnQgLT4gJ2EgdFxuICBlbmRcblxubW9kdWxlIE1ha2VTZWVkZWQoSDogU2VlZGVkSGFzaGVkVHlwZSk6IChTZWVkZWRTIHdpdGggdHlwZSBrZXkgPSBILnQpID1cbiAgc3RydWN0XG4gICAgdHlwZSBrZXkgPSBILnRcbiAgICB0eXBlICdhIGhhc2h0YmwgPSAoa2V5LCAnYSkgdFxuICAgIHR5cGUgJ2EgdCA9ICdhIGhhc2h0YmxcbiAgICBsZXQgY3JlYXRlID0gY3JlYXRlXG4gICAgbGV0IGNsZWFyID0gY2xlYXJcbiAgICBsZXQgcmVzZXQgPSByZXNldFxuICAgIGxldCBjb3B5ID0gY29weVxuXG4gICAgbGV0IGtleV9pbmRleCBoIGtleSA9XG4gICAgICAoSC5zZWVkZWRfaGFzaCBoLnNlZWQga2V5KSBsYW5kIChBcnJheS5sZW5ndGggaC5kYXRhIC0gMSlcblxuICAgIGxldCBhZGQgaCBrZXkgZGF0YSA9XG4gICAgICBsZXQgaSA9IGtleV9pbmRleCBoIGtleSBpblxuICAgICAgbGV0IGJ1Y2tldCA9IENvbnN7a2V5OyBkYXRhOyBuZXh0PWguZGF0YS4oaSl9IGluXG4gICAgICBoLmRhdGEuKGkpIDwtIGJ1Y2tldDtcbiAgICAgIGguc2l6ZSA8LSBoLnNpemUgKyAxO1xuICAgICAgaWYgaC5zaXplID4gQXJyYXkubGVuZ3RoIGguZGF0YSBsc2wgMSB0aGVuIHJlc2l6ZSBrZXlfaW5kZXggaFxuXG4gICAgbGV0IHJlYyByZW1vdmVfYnVja2V0IGggaSBrZXkgcHJlYyA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgKClcbiAgICAgIHwgKENvbnMge2tleT1rOyBuZXh0fSkgYXMgYyAtPlxuICAgICAgICAgIGlmIEguZXF1YWwgayBrZXlcbiAgICAgICAgICB0aGVuIGJlZ2luXG4gICAgICAgICAgICBoLnNpemUgPC0gaC5zaXplIC0gMTtcbiAgICAgICAgICAgIG1hdGNoIHByZWMgd2l0aFxuICAgICAgICAgICAgfCBFbXB0eSAtPiBoLmRhdGEuKGkpIDwtIG5leHRcbiAgICAgICAgICAgIHwgQ29ucyBjIC0+IGMubmV4dCA8LSBuZXh0XG4gICAgICAgICAgZW5kXG4gICAgICAgICAgZWxzZSByZW1vdmVfYnVja2V0IGggaSBrZXkgYyBuZXh0XG5cbiAgICBsZXQgcmVtb3ZlIGgga2V5ID1cbiAgICAgIGxldCBpID0ga2V5X2luZGV4IGgga2V5IGluXG4gICAgICByZW1vdmVfYnVja2V0IGggaSBrZXkgRW1wdHkgaC5kYXRhLihpKVxuXG4gICAgbGV0IHJlYyBmaW5kX3JlYyBrZXkgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgIHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBDb25ze2tleT1rOyBkYXRhOyBuZXh0fSAtPlxuICAgICAgICAgIGlmIEguZXF1YWwga2V5IGsgdGhlbiBkYXRhIGVsc2UgZmluZF9yZWMga2V5IG5leHRcblxuICAgIGxldCBmaW5kIGgga2V5ID1cbiAgICAgIG1hdGNoIGguZGF0YS4oa2V5X2luZGV4IGgga2V5KSB3aXRoXG4gICAgICB8IEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBDb25ze2tleT1rMTsgZGF0YT1kMTsgbmV4dD1uZXh0MX0gLT5cbiAgICAgICAgICBpZiBILmVxdWFsIGtleSBrMSB0aGVuIGQxIGVsc2VcbiAgICAgICAgICBtYXRjaCBuZXh0MSB3aXRoXG4gICAgICAgICAgfCBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgICAgICB8IENvbnN7a2V5PWsyOyBkYXRhPWQyOyBuZXh0PW5leHQyfSAtPlxuICAgICAgICAgICAgICBpZiBILmVxdWFsIGtleSBrMiB0aGVuIGQyIGVsc2VcbiAgICAgICAgICAgICAgbWF0Y2ggbmV4dDIgd2l0aFxuICAgICAgICAgICAgICB8IEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgICAgICAgICB8IENvbnN7a2V5PWszOyBkYXRhPWQzOyBuZXh0PW5leHQzfSAtPlxuICAgICAgICAgICAgICAgICAgaWYgSC5lcXVhbCBrZXkgazMgdGhlbiBkMyBlbHNlIGZpbmRfcmVjIGtleSBuZXh0M1xuXG4gICAgbGV0IHJlYyBmaW5kX3JlY19vcHQga2V5ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICBOb25lXG4gICAgICB8IENvbnN7a2V5PWs7IGRhdGE7IG5leHR9IC0+XG4gICAgICAgICAgaWYgSC5lcXVhbCBrZXkgayB0aGVuIFNvbWUgZGF0YSBlbHNlIGZpbmRfcmVjX29wdCBrZXkgbmV4dFxuXG4gICAgbGV0IGZpbmRfb3B0IGgga2V5ID1cbiAgICAgIG1hdGNoIGguZGF0YS4oa2V5X2luZGV4IGgga2V5KSB3aXRoXG4gICAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICAgIHwgQ29uc3trZXk9azE7IGRhdGE9ZDE7IG5leHQ9bmV4dDF9IC0+XG4gICAgICAgICAgaWYgSC5lcXVhbCBrZXkgazEgdGhlbiBTb21lIGQxIGVsc2VcbiAgICAgICAgICBtYXRjaCBuZXh0MSB3aXRoXG4gICAgICAgICAgfCBFbXB0eSAtPiBOb25lXG4gICAgICAgICAgfCBDb25ze2tleT1rMjsgZGF0YT1kMjsgbmV4dD1uZXh0Mn0gLT5cbiAgICAgICAgICAgICAgaWYgSC5lcXVhbCBrZXkgazIgdGhlbiBTb21lIGQyIGVsc2VcbiAgICAgICAgICAgICAgbWF0Y2ggbmV4dDIgd2l0aFxuICAgICAgICAgICAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICAgICAgICAgICAgfCBDb25ze2tleT1rMzsgZGF0YT1kMzsgbmV4dD1uZXh0M30gLT5cbiAgICAgICAgICAgICAgICAgIGlmIEguZXF1YWwga2V5IGszIHRoZW4gU29tZSBkMyBlbHNlIGZpbmRfcmVjX29wdCBrZXkgbmV4dDNcblxuICAgIGxldCBmaW5kX2FsbCBoIGtleSA9XG4gICAgICBsZXRbQHRhaWxfbW9kX2NvbnNdIHJlYyBmaW5kX2luX2J1Y2tldCA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgW11cbiAgICAgIHwgQ29uc3trZXk9azsgZGF0YT1kOyBuZXh0fSAtPlxuICAgICAgICAgIGlmIEguZXF1YWwgayBrZXlcbiAgICAgICAgICB0aGVuIGQgOjogZmluZF9pbl9idWNrZXQgbmV4dFxuICAgICAgICAgIGVsc2UgZmluZF9pbl9idWNrZXQgbmV4dCBpblxuICAgICAgZmluZF9pbl9idWNrZXQgaC5kYXRhLihrZXlfaW5kZXggaCBrZXkpXG5cbiAgICBsZXQgcmVjIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICB0cnVlXG4gICAgICB8IENvbnMgKHtrZXk9azsgbmV4dH0gYXMgc2xvdCkgLT5cbiAgICAgICAgICBpZiBILmVxdWFsIGsga2V5XG4gICAgICAgICAgdGhlbiAoc2xvdC5rZXkgPC0ga2V5OyBzbG90LmRhdGEgPC0gZGF0YTsgZmFsc2UpXG4gICAgICAgICAgZWxzZSByZXBsYWNlX2J1Y2tldCBrZXkgZGF0YSBuZXh0XG5cbiAgICBsZXQgcmVwbGFjZSBoIGtleSBkYXRhID1cbiAgICAgIGxldCBpID0ga2V5X2luZGV4IGgga2V5IGluXG4gICAgICBsZXQgbCA9IGguZGF0YS4oaSkgaW5cbiAgICAgIGlmIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhIGwgdGhlbiBiZWdpblxuICAgICAgICBoLmRhdGEuKGkpIDwtIENvbnN7a2V5OyBkYXRhOyBuZXh0PWx9O1xuICAgICAgICBoLnNpemUgPC0gaC5zaXplICsgMTtcbiAgICAgICAgaWYgaC5zaXplID4gQXJyYXkubGVuZ3RoIGguZGF0YSBsc2wgMSB0aGVuIHJlc2l6ZSBrZXlfaW5kZXggaFxuICAgICAgZW5kXG5cbiAgICBsZXQgcmVjIG1lbV9pbl9idWNrZXQga2V5ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICBmYWxzZVxuICAgICAgfCBDb25ze2tleT1rOyBuZXh0fSAtPlxuICAgICAgICAgIEguZXF1YWwgayBrZXkgfHwgbWVtX2luX2J1Y2tldCBrZXkgbmV4dFxuXG4gICAgbGV0IG1lbSBoIGtleSA9XG4gICAgICBtZW1faW5fYnVja2V0IGtleSBoLmRhdGEuKGtleV9pbmRleCBoIGtleSlcblxuICAgIGxldCBhZGRfc2VxIHRibCBpID1cbiAgICAgIFNlcS5pdGVyIChmdW4gKGssdikgLT4gYWRkIHRibCBrIHYpIGlcblxuICAgIGxldCByZXBsYWNlX3NlcSB0YmwgaSA9XG4gICAgICBTZXEuaXRlciAoZnVuIChrLHYpIC0+IHJlcGxhY2UgdGJsIGsgdikgaVxuXG4gICAgbGV0IG9mX3NlcSBpID1cbiAgICAgIGxldCB0YmwgPSBjcmVhdGUgMTYgaW5cbiAgICAgIHJlcGxhY2Vfc2VxIHRibCBpO1xuICAgICAgdGJsXG5cbiAgICBsZXQgaXRlciA9IGl0ZXJcbiAgICBsZXQgZmlsdGVyX21hcF9pbnBsYWNlID0gZmlsdGVyX21hcF9pbnBsYWNlXG4gICAgbGV0IGZvbGQgPSBmb2xkXG4gICAgbGV0IGxlbmd0aCA9IGxlbmd0aFxuICAgIGxldCBzdGF0cyA9IHN0YXRzXG4gICAgbGV0IHRvX3NlcSA9IHRvX3NlcVxuICAgIGxldCB0b19zZXFfa2V5cyA9IHRvX3NlcV9rZXlzXG4gICAgbGV0IHRvX3NlcV92YWx1ZXMgPSB0b19zZXFfdmFsdWVzXG4gIGVuZFxuXG5tb2R1bGUgTWFrZShIOiBIYXNoZWRUeXBlKTogKFMgd2l0aCB0eXBlIGtleSA9IEgudCkgPVxuICBzdHJ1Y3RcbiAgICBpbmNsdWRlIE1ha2VTZWVkZWQoc3RydWN0XG4gICAgICAgIHR5cGUgdCA9IEgudFxuICAgICAgICBsZXQgZXF1YWwgPSBILmVxdWFsXG4gICAgICAgIGxldCBzZWVkZWRfaGFzaCAoX3NlZWQ6IGludCkgeCA9IEguaGFzaCB4XG4gICAgICBlbmQpXG4gICAgbGV0IGNyZWF0ZSBzeiA9IGNyZWF0ZSB+cmFuZG9tOmZhbHNlIHN6XG4gICAgbGV0IG9mX3NlcSBpID1cbiAgICAgIGxldCB0YmwgPSBjcmVhdGUgMTYgaW5cbiAgICAgIHJlcGxhY2Vfc2VxIHRibCBpO1xuICAgICAgdGJsXG4gIGVuZFxuXG4oKiBQb2x5bW9ycGhpYyBoYXNoIGZ1bmN0aW9uLWJhc2VkIHRhYmxlcyAqKVxuKCogQ29kZSBpbmNsdWRlZCBiZWxvdyB0aGUgZnVuY3RvcmlhbCBpbnRlcmZhY2UgdG8gZ3VhcmQgYWdhaW5zdCBhY2NpZGVudGFsXG4gICB1c2UgLSBzZWUgIzIyMDIgKilcblxuZXh0ZXJuYWwgc2VlZGVkX2hhc2hfcGFyYW0gOlxuICBpbnQgLT4gaW50IC0+IGludCAtPiAnYSAtPiBpbnQgPSBcImNhbWxfaGFzaFwiIFtAQG5vYWxsb2NdXG5cbmxldCBoYXNoIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgMCB4XG5sZXQgaGFzaF9wYXJhbSBuMSBuMiB4ID0gc2VlZGVkX2hhc2hfcGFyYW0gbjEgbjIgMCB4XG5sZXQgc2VlZGVkX2hhc2ggc2VlZCB4ID0gc2VlZGVkX2hhc2hfcGFyYW0gMTAgMTAwIHNlZWQgeFxuXG5sZXQga2V5X2luZGV4IGgga2V5ID1cbiAgaWYgT2JqLnNpemUgKE9iai5yZXByIGgpID49IDRcbiAgdGhlbiAoc2VlZGVkX2hhc2hfcGFyYW0gMTAgMTAwIGguc2VlZCBrZXkpIGxhbmQgKEFycmF5Lmxlbmd0aCBoLmRhdGEgLSAxKVxuICBlbHNlIGludmFsaWRfYXJnIFwiSGFzaHRibDogdW5zdXBwb3J0ZWQgaGFzaCB0YWJsZSBmb3JtYXRcIlxuXG5sZXQgYWRkIGgga2V5IGRhdGEgPVxuICBsZXQgaSA9IGtleV9pbmRleCBoIGtleSBpblxuICBsZXQgYnVja2V0ID0gQ29uc3trZXk7IGRhdGE7IG5leHQ9aC5kYXRhLihpKX0gaW5cbiAgaC5kYXRhLihpKSA8LSBidWNrZXQ7XG4gIGguc2l6ZSA8LSBoLnNpemUgKyAxO1xuICBpZiBoLnNpemUgPiBBcnJheS5sZW5ndGggaC5kYXRhIGxzbCAxIHRoZW4gcmVzaXplIGtleV9pbmRleCBoXG5cbmxldCByZWMgcmVtb3ZlX2J1Y2tldCBoIGkga2V5IHByZWMgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+XG4gICAgICAoKVxuICB8IChDb25zIHtrZXk9azsgbmV4dH0pIGFzIGMgLT5cbiAgICAgIGlmIGNvbXBhcmUgayBrZXkgPSAwXG4gICAgICB0aGVuIGJlZ2luXG4gICAgICAgIGguc2l6ZSA8LSBoLnNpemUgLSAxO1xuICAgICAgICBtYXRjaCBwcmVjIHdpdGhcbiAgICAgICAgfCBFbXB0eSAtPiBoLmRhdGEuKGkpIDwtIG5leHRcbiAgICAgICAgfCBDb25zIGMgLT4gYy5uZXh0IDwtIG5leHRcbiAgICAgIGVuZFxuICAgICAgZWxzZSByZW1vdmVfYnVja2V0IGggaSBrZXkgYyBuZXh0XG5cbmxldCByZW1vdmUgaCBrZXkgPVxuICBsZXQgaSA9IGtleV9pbmRleCBoIGtleSBpblxuICByZW1vdmVfYnVja2V0IGggaSBrZXkgRW1wdHkgaC5kYXRhLihpKVxuXG5sZXQgcmVjIGZpbmRfcmVjIGtleSA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT5cbiAgICAgIHJhaXNlIE5vdF9mb3VuZFxuICB8IENvbnN7a2V5PWs7IGRhdGE7IG5leHR9IC0+XG4gICAgICBpZiBjb21wYXJlIGtleSBrID0gMCB0aGVuIGRhdGEgZWxzZSBmaW5kX3JlYyBrZXkgbmV4dFxuXG5sZXQgZmluZCBoIGtleSA9XG4gIG1hdGNoIGguZGF0YS4oa2V5X2luZGV4IGgga2V5KSB3aXRoXG4gIHwgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gIHwgQ29uc3trZXk9azE7IGRhdGE9ZDE7IG5leHQ9bmV4dDF9IC0+XG4gICAgICBpZiBjb21wYXJlIGtleSBrMSA9IDAgdGhlbiBkMSBlbHNlXG4gICAgICBtYXRjaCBuZXh0MSB3aXRoXG4gICAgICB8IEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBDb25ze2tleT1rMjsgZGF0YT1kMjsgbmV4dD1uZXh0Mn0gLT5cbiAgICAgICAgICBpZiBjb21wYXJlIGtleSBrMiA9IDAgdGhlbiBkMiBlbHNlXG4gICAgICAgICAgbWF0Y2ggbmV4dDIgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICAgICAgfCBDb25ze2tleT1rMzsgZGF0YT1kMzsgbmV4dD1uZXh0M30gLT5cbiAgICAgICAgICAgICAgaWYgY29tcGFyZSBrZXkgazMgPSAwIHRoZW4gZDMgZWxzZSBmaW5kX3JlYyBrZXkgbmV4dDNcblxubGV0IHJlYyBmaW5kX3JlY19vcHQga2V5ID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPlxuICAgICAgTm9uZVxuICB8IENvbnN7a2V5PWs7IGRhdGE7IG5leHR9IC0+XG4gICAgICBpZiBjb21wYXJlIGtleSBrID0gMCB0aGVuIFNvbWUgZGF0YSBlbHNlIGZpbmRfcmVjX29wdCBrZXkgbmV4dFxuXG5sZXQgZmluZF9vcHQgaCBrZXkgPVxuICBtYXRjaCBoLmRhdGEuKGtleV9pbmRleCBoIGtleSkgd2l0aFxuICB8IEVtcHR5IC0+IE5vbmVcbiAgfCBDb25ze2tleT1rMTsgZGF0YT1kMTsgbmV4dD1uZXh0MX0gLT5cbiAgICAgIGlmIGNvbXBhcmUga2V5IGsxID0gMCB0aGVuIFNvbWUgZDEgZWxzZVxuICAgICAgbWF0Y2ggbmV4dDEgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBOb25lXG4gICAgICB8IENvbnN7a2V5PWsyOyBkYXRhPWQyOyBuZXh0PW5leHQyfSAtPlxuICAgICAgICAgIGlmIGNvbXBhcmUga2V5IGsyID0gMCB0aGVuIFNvbWUgZDIgZWxzZVxuICAgICAgICAgIG1hdGNoIG5leHQyIHdpdGhcbiAgICAgICAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICAgICAgICB8IENvbnN7a2V5PWszOyBkYXRhPWQzOyBuZXh0PW5leHQzfSAtPlxuICAgICAgICAgICAgICBpZiBjb21wYXJlIGtleSBrMyA9IDAgdGhlbiBTb21lIGQzIGVsc2UgZmluZF9yZWNfb3B0IGtleSBuZXh0M1xuXG5sZXQgZmluZF9hbGwgaCBrZXkgPVxuICBsZXRbQHRhaWxfbW9kX2NvbnNdIHJlYyBmaW5kX2luX2J1Y2tldCA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT5cbiAgICAgIFtdXG4gIHwgQ29uc3trZXk9azsgZGF0YTsgbmV4dH0gLT5cbiAgICAgIGlmIGNvbXBhcmUgayBrZXkgPSAwXG4gICAgICB0aGVuIGRhdGEgOjogZmluZF9pbl9idWNrZXQgbmV4dFxuICAgICAgZWxzZSBmaW5kX2luX2J1Y2tldCBuZXh0IGluXG4gIGZpbmRfaW5fYnVja2V0IGguZGF0YS4oa2V5X2luZGV4IGgga2V5KVxuXG5sZXQgcmVjIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPlxuICAgICAgdHJ1ZVxuICB8IENvbnMgKHtrZXk9azsgbmV4dH0gYXMgc2xvdCkgLT5cbiAgICAgIGlmIGNvbXBhcmUgayBrZXkgPSAwXG4gICAgICB0aGVuIChzbG90LmtleSA8LSBrZXk7IHNsb3QuZGF0YSA8LSBkYXRhOyBmYWxzZSlcbiAgICAgIGVsc2UgcmVwbGFjZV9idWNrZXQga2V5IGRhdGEgbmV4dFxuXG5sZXQgcmVwbGFjZSBoIGtleSBkYXRhID1cbiAgbGV0IGkgPSBrZXlfaW5kZXggaCBrZXkgaW5cbiAgbGV0IGwgPSBoLmRhdGEuKGkpIGluXG4gIGlmIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhIGwgdGhlbiBiZWdpblxuICAgIGguZGF0YS4oaSkgPC0gQ29uc3trZXk7IGRhdGE7IG5leHQ9bH07XG4gICAgaC5zaXplIDwtIGguc2l6ZSArIDE7XG4gICAgaWYgaC5zaXplID4gQXJyYXkubGVuZ3RoIGguZGF0YSBsc2wgMSB0aGVuIHJlc2l6ZSBrZXlfaW5kZXggaFxuICBlbmRcblxubGV0IHJlYyBtZW1faW5fYnVja2V0IGtleSA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT5cbiAgICAgIGZhbHNlXG4gIHwgQ29uc3trZXk9azsgbmV4dH0gLT5cbiAgICAgIGNvbXBhcmUgayBrZXkgPSAwIHx8IG1lbV9pbl9idWNrZXQga2V5IG5leHRcblxubGV0IG1lbSBoIGtleSA9XG4gIG1lbV9pbl9idWNrZXQga2V5IGguZGF0YS4oa2V5X2luZGV4IGgga2V5KVxuXG5sZXQgYWRkX3NlcSB0YmwgaSA9XG4gIFNlcS5pdGVyIChmdW4gKGssdikgLT4gYWRkIHRibCBrIHYpIGlcblxubGV0IHJlcGxhY2Vfc2VxIHRibCBpID1cbiAgU2VxLml0ZXIgKGZ1biAoayx2KSAtPiByZXBsYWNlIHRibCBrIHYpIGlcblxubGV0IG9mX3NlcSBpID1cbiAgbGV0IHRibCA9IGNyZWF0ZSAxNiBpblxuICByZXBsYWNlX3NlcSB0YmwgaTtcbiAgdGJsXG5cbmxldCByZWJ1aWxkID8ocmFuZG9tID0gQXRvbWljLmdldCByYW5kb21pemVkKSBoID1cbiAgbGV0IHMgPSBwb3dlcl8yX2Fib3ZlIDE2IChBcnJheS5sZW5ndGggaC5kYXRhKSBpblxuICBsZXQgc2VlZCA9XG4gICAgaWYgcmFuZG9tIHRoZW4gUmFuZG9tLlN0YXRlLmJpdHMgKERvbWFpbi5ETFMuZ2V0IHBybmdfa2V5KVxuICAgIGVsc2UgaWYgT2JqLnNpemUgKE9iai5yZXByIGgpID49IDQgdGhlbiBoLnNlZWRcbiAgICBlbHNlIDAgaW5cbiAgbGV0IGgnID0ge1xuICAgIHNpemUgPSBoLnNpemU7XG4gICAgZGF0YSA9IEFycmF5Lm1ha2UgcyBFbXB0eTtcbiAgICBzZWVkID0gc2VlZDtcbiAgICBpbml0aWFsX3NpemUgPSBpZiBPYmouc2l6ZSAoT2JqLnJlcHIgaCkgPj0gNCB0aGVuIGguaW5pdGlhbF9zaXplIGVsc2Ugc1xuICB9IGluXG4gIGluc2VydF9hbGxfYnVja2V0cyAoa2V5X2luZGV4IGgnKSBmYWxzZSBoLmRhdGEgaCcuZGF0YTtcbiAgaCdcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9jaGVja19ib3VuZCIsImNhbWxfY29tcGFyZSIsImNhbWxfaGFzaCIsImNhbWxfbWFrZV92ZWN0IiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9zeXNfZ2V0ZW52IiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJjYW1sX2NhbGwyIiwiYTEiLCJjYW1sX2NhbGwzIiwiYTIiLCJnbG9iYWxfZGF0YSIsIlN0ZGxpYl9TeXMiLCJTdGRsaWIiLCJTdGRsaWJfQXRvbWljIiwiU3RkbGliX0RvbWFpbiIsIlN0ZGxpYl9SYW5kb20iLCJTdGRsaWJfU2VxIiwiU3RkbGliX0ludCIsIlN0ZGxpYl9BcnJheSIsIlN0ZGxpYl9TdHJpbmciLCJvbmdvaW5nX3RyYXZlcnNhbCIsImgiLCJmbGlwX29uZ29pbmdfdHJhdmVyc2FsIiwicGFyYW1zIiwiZXhuIiwicmFuZG9taXplZF9kZWZhdWx0IiwicmFuZG9taXplZCIsInJhbmRvbWl6ZSIsInBhcmFtIiwiaXNfcmFuZG9taXplZCIsInBybmdfa2V5IiwicG93ZXJfMl9hYm92ZSIsIngiLCJuIiwiY3JlYXRlIiwib3B0IiwiaW5pdGlhbF9zaXplIiwicmFuZG9tIiwicyIsInNlZWQiLCJjbGVhciIsInJlc2V0IiwibGVuIiwiY29weV9idWNrZXRsaXN0Iiwia2V5IiwiZGF0YSIsIm5leHQiLCJwcmVjIiwiY29weSIsImxlbmd0aCIsImluc2VydF9hbGxfYnVja2V0cyIsImluZGV4ZnVuIiwiaW5wbGFjZSIsIm9kYXRhIiwibmRhdGEiLCJuc2l6ZSIsIm5kYXRhX3RhaWwiLCJpIiwiY2VsbCIsIm5pZHgiLCJtYXRjaCIsInJlc2l6ZSIsIm9zaXplIiwiaXRlciIsIm9sZF90cmF2IiwiZCIsImZpbHRlcl9tYXBfaW5wbGFjZSIsInNsb3QiLCJmb2xkIiwiaW5pdCIsImFjY3UiLCJiIiwiYnVja2V0X2xlbmd0aCIsInN0YXRzIiwibWJsIiwibSIsImhpc3RvIiwibCIsInRvX3NlcSIsInRibCIsInRibF9kYXRhIiwiYXV4IiwiYnVjayIsInRvX3NlcV9rZXlzIiwidG9fc2VxX3ZhbHVlcyIsIk1ha2VTZWVkZWQiLCJIIiwia2V5X2luZGV4IiwiYWRkIiwiYnVja2V0IiwicmVtb3ZlIiwiayIsImZpbmQiLCJrMSIsImQxIiwibmV4dDEiLCJrMiIsImQyIiwibmV4dDIiLCJrMyIsImQzIiwibmV4dDMiLCJmaW5kX29wdCIsImZpbmRfYWxsIiwiYmxvY2siLCJkc3QiLCJvZmZzZXQiLCJyZXBsYWNlIiwibWVtIiwiYWRkX3NlcSIsInYiLCJyZXBsYWNlX3NlcSIsIm9mX3NlcSIsIk1ha2UiLCJlcXVhbCIsInNlZWRlZF9oYXNoIiwiaW5jbHVkZSIsInN6IiwiaGFzaCIsImhhc2hfcGFyYW0iLCJuMSIsIm4yIiwicmVidWlsZCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFdBQUFKLEdBQUFDLElBQUFFLElBQUFFO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxhQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFD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QUFBO0FBQUEsU0FFUDtBQUFBLEtBQUFsQixNQUVTO0FBQUEsSUFJVDtBQUFBLGtCQUFtQjtBQUFBLElBQW1DO0FBQUEsR0FDcEQ7QUFBQSxHQTlqQnlEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVEM0Q3RCIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjI0NzIyLCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2NhbGxiYWNrLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBSZWdpc3RlcmluZyBPQ2FtbCB2YWx1ZXMgd2l0aCB0aGUgQyBydW50aW1lIGZvciBsYXRlciBjYWxsYmFja3MgKilcblxuZXh0ZXJuYWwgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgOiBzdHJpbmcgLT4gT2JqLnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfcmVnaXN0ZXJfbmFtZWRfdmFsdWVcIlxuXG5sZXQgcmVnaXN0ZXIgbmFtZSB2ID1cbiAgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgbmFtZSAoT2JqLnJlcHIgdilcblxubGV0IHJlZ2lzdGVyX2V4Y2VwdGlvbiBuYW1lIChleG4gOiBleG4pID1cbiAgbGV0IGV4biA9IE9iai5yZXByIGV4biBpblxuICBsZXQgc2xvdCA9IGlmIE9iai50YWcgZXhuID0gT2JqLm9iamVjdF90YWcgdGhlbiBleG4gZWxzZSBPYmouZmllbGQgZXhuIDAgaW5cbiAgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgbmFtZSBzbG90XG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfcmVnaXN0ZXJfbmFtZWRfdmFsdWUiLCJTdGRsaWJfT2JqIiwicmVnaXN0ZXJfZXhjZXB0aW9uIiwibmFtZSIsImV4biIsInNsb3QiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsNEJBQUE7QUFBQSxJQUFBQyxhQUFBO0FBQUEsWUFBQUMsbUJBQUFDLE1BQUFDO0FBQUFBO0FBQUFBLEtBQUEsSUN5QmdCO0FBQUEsS0FBQUMsT0FBQTtBQUFBLElBQ2QsNENBQThCO0FBQUE7QUFBQSxHRDFCaEMiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoyNDc0NSwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiIuc3gub2Jqcy9qc29vL2RlZmF1bHQvc3guY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi93b3Jrc3BhY2Vfcm9vdC9saWIvc3hfdHlwZXMubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKiogQ29yZSB0eXBlcyBmb3IgdGhlIFNYIGxhbmd1YWdlLlxuXG4gICAgVGhlIFt2YWx1ZV0gc3VtIHR5cGUgcmVwcmVzZW50cyBldmVyeSBwb3NzaWJsZSBTWCBydW50aW1lIHZhbHVlLlxuICAgIE9DYW1sJ3MgYWxnZWJyYWljIHR5cGVzIG1ha2UgdGhlIENFSyBtYWNoaW5lJ3MgZnJhbWUgZGlzcGF0Y2ggYVxuICAgIHBhdHRlcm4gbWF0Y2gg4oCUIGV4YWN0bHkgd2hhdCB0aGUgc3BlYyBkZXNjcmliZXMuICopXG5cbigqKiB7MSBTeW1ib2wgaW50ZXJuaW5nfSAqKVxuXG4oKiogTWFwIHN5bWJvbCBuYW1lcyB0byBzbWFsbCBpbnRlZ2VycyBmb3IgTygxKSBlbnYgbG9va3Vwcy5cbiAgICBUaGUgaW50ZXJuIHRhYmxlIGlzIHBvcHVsYXRlZCBvbmNlIHBlciB1bmlxdWUgc3ltYm9sIG5hbWU7XG4gICAgYWxsIHN1YnNlcXVlbnQgZW52IG9wZXJhdGlvbnMgdXNlIHRoZSBpbnRlZ2VyIGtleS4gKilcblxubGV0IHN5bV90b19pZCA6IChzdHJpbmcsIGludCkgSGFzaHRibC50ID0gSGFzaHRibC5jcmVhdGUgNTEyXG5sZXQgaWRfdG9fc3ltIDogKGludCwgc3RyaW5nKSBIYXNodGJsLnQgPSBIYXNodGJsLmNyZWF0ZSA1MTJcbmxldCBzeW1fbmV4dCAgPSByZWYgMFxuXG5sZXQgaW50ZXJuIHMgPVxuICBtYXRjaCBIYXNodGJsLmZpbmRfb3B0IHN5bV90b19pZCBzIHdpdGhcbiAgfCBTb21lIGlkIC0+IGlkXG4gIHwgTm9uZSAtPlxuICAgIGxldCBpZCA9ICFzeW1fbmV4dCBpblxuICAgIGluY3Igc3ltX25leHQ7XG4gICAgSGFzaHRibC5yZXBsYWNlIHN5bV90b19pZCBzIGlkO1xuICAgIEhhc2h0YmwucmVwbGFjZSBpZF90b19zeW0gaWQgcztcbiAgICBpZFxuXG5sZXQgdW5pbnRlcm4gaWQgPVxuICBtYXRjaCBIYXNodGJsLmZpbmRfb3B0IGlkX3RvX3N5bSBpZCB3aXRoXG4gIHwgU29tZSBzIC0+IHNcbiAgfCBOb25lIC0+IFwiPHN5bTpcIiBeIHN0cmluZ19vZl9pbnQgaWQgXiBcIj5cIlxuXG5cbigqKiB7MSBFbnZpcm9ubWVudH0gKilcblxuKCoqIExleGljYWwgc2NvcGUgY2hhaW4uICBFYWNoIGZyYW1lIGhvbGRzIGEgbXV0YWJsZSBiaW5kaW5nIHRhYmxlXG4gICAga2V5ZWQgYnkgaW50ZXJuZWQgc3ltYm9sIElEcyBmb3IgZmFzdCBsb29rdXAuICopXG50eXBlIGVudiA9IHtcbiAgYmluZGluZ3MgOiAoaW50LCB2YWx1ZSkgSGFzaHRibC50O1xuICBwYXJlbnQgICA6IGVudiBvcHRpb247XG59XG5cbigqKiB7MSBWYWx1ZXN9ICopXG5cbmFuZCB2YWx1ZSA9XG4gIHwgTmlsXG4gIHwgQm9vbCAgIG9mIGJvb2xcbiAgfCBOdW1iZXIgb2YgZmxvYXRcbiAgfCBTdHJpbmcgb2Ygc3RyaW5nXG4gIHwgU3ltYm9sIG9mIHN0cmluZ1xuICB8IEtleXdvcmQgb2Ygc3RyaW5nXG4gIHwgTGlzdCAgIG9mIHZhbHVlIGxpc3RcbiAgfCBEaWN0ICAgb2YgZGljdFxuICB8IExhbWJkYSBvZiBsYW1iZGFcbiAgfCBDb21wb25lbnQgb2YgY29tcG9uZW50XG4gIHwgSXNsYW5kIG9mIGlzbGFuZFxuICB8IE1hY3JvICBvZiBtYWNyb1xuICB8IFRodW5rICBvZiB2YWx1ZSAqIGVudlxuICB8IENvbnRpbnVhdGlvbiBvZiAodmFsdWUgLT4gdmFsdWUpICogZGljdCBvcHRpb25cbiAgfCBOYXRpdmVGbiBvZiBzdHJpbmcgKiAodmFsdWUgbGlzdCAtPiB2YWx1ZSlcbiAgfCBTaWduYWwgb2Ygc2lnbmFsXG4gIHwgUmF3SFRNTCBvZiBzdHJpbmdcbiAgfCBTcHJlYWQgb2YgKHN0cmluZyAqIHZhbHVlKSBsaXN0XG4gIHwgU3hFeHByIG9mIHN0cmluZyAgKCoqIE9wYXF1ZSBTWCB3aXJlLWZvcm1hdCBzdHJpbmcg4oCUIGFzZXIgb3V0cHV0LiAqKVxuICB8IEVudiBvZiBlbnYgICgqKiBGaXJzdC1jbGFzcyBlbnZpcm9ubWVudCDigJQgdXNlZCBieSBDRUsgbWFjaGluZSBzdGF0ZSBkaWN0cy4gKilcbiAgfCBMaXN0UmVmIG9mIHZhbHVlIGxpc3QgcmVmICAoKiogTXV0YWJsZSBsaXN0IOKAlCBKUy1zdHlsZSBhcnJheSBmb3IgYXBwZW5kISAqKVxuICB8IENla1N0YXRlIG9mIGNla19zdGF0ZSAgKCoqIE9wdGltaXplZCBDRUsgbWFjaGluZSBzdGF0ZSDigJQgYXZvaWRzIERpY3QgYWxsb2NhdGlvbi4gKilcbiAgfCBDZWtGcmFtZSBvZiBjZWtfZnJhbWUgICgqKiBPcHRpbWl6ZWQgQ0VLIGNvbnRpbnVhdGlvbiBmcmFtZS4gKilcbiAgfCBWbUNsb3N1cmUgb2Ygdm1fY2xvc3VyZSAgKCoqIFZNLWNvbXBpbGVkIGNsb3N1cmUg4oCUIGNhbGxhYmxlIHdpdGhpbiB0aGUgVk0gd2l0aG91dCBhbGxvY2F0aW5nIGEgbmV3IFZNLiAqKVxuXG4oKiogQ0VLIG1hY2hpbmUgc3RhdGUg4oCUIHJlY29yZCBpbnN0ZWFkIG9mIERpY3QgZm9yIHBlcmZvcm1hbmNlLlxuICAgIDUgZmllbGRzIMOXIDU1SyBzdGVwcy9zZWMgPSAyNzVLIEhhc2h0YmwgYWxsb2NhdGlvbnMvc2VjIGVsaW1pbmF0ZWQuICopXG5hbmQgY2VrX3N0YXRlID0ge1xuICBjc19jb250cm9sIDogdmFsdWU7XG4gIGNzX2VudiAgICAgOiB2YWx1ZTtcbiAgY3Nfa29udCAgICA6IHZhbHVlO1xuICBjc19waGFzZSAgIDogc3RyaW5nO1xuICBjc192YWx1ZSAgIDogdmFsdWU7XG59XG5cbigqKiBDRUsgY29udGludWF0aW9uIGZyYW1lIOKAlCB0YWdnZWQgcmVjb3JkIGNvdmVyaW5nIGFsbCAyOSBmcmFtZSB0eXBlcy5cbiAgICBGaWVsZHMgYXJlIG5hbWVkIGdlbmVyaWNhbGx5OyBub3QgYWxsIGFyZSB1c2VkIGJ5IGV2ZXJ5IGZyYW1lIHR5cGUuXG4gICAgRWxpbWluYXRlcyB+MTAwSyBIYXNodGJsIGFsbG9jYXRpb25zIHBlciBwYWdlIHJlbmRlci4gKilcbmFuZCBjZWtfZnJhbWUgPSB7XG4gIGNmX3R5cGUgICAgICA6IHN0cmluZzsgICAgICAgICgqIGZyYW1lIHR5cGUgdGFnOiBcImlmXCIsIFwibGV0XCIsIFwiY2FsbFwiLCBldGMuICopXG4gIGNmX2VudiAgICAgICA6IHZhbHVlOyAgICAgICAgICgqIGVudmlyb25tZW50IOKAlCBldmVyeSBmcmFtZSBoYXMgdGhpcyAqKVxuICBjZl9uYW1lICAgICAgOiB2YWx1ZTsgICAgICAgICAoKiBsZXQvZGVmaW5lL3NldC9zY29wZTogYmluZGluZyBuYW1lICopXG4gIGNmX2JvZHkgICAgICA6IHZhbHVlOyAgICAgICAgICgqIHdoZW4vbGV0OiBib2R5IGV4cHIgKilcbiAgY2ZfcmVtYWluaW5nIDogdmFsdWU7ICAgICAgICAgKCogYmVnaW4vY29uZC9tYXAvZXRjOiByZW1haW5pbmcgZXhwcnMgKilcbiAgY2ZfZiAgICAgICAgIDogdmFsdWU7ICAgICAgICAgKCogY2FsbC9tYXAvZmlsdGVyL2V0YzogZnVuY3Rpb24gKilcbiAgY2ZfYXJncyAgICAgIDogdmFsdWU7ICAgICAgICAgKCogY2FsbDogcmF3IGFyZ3M7IGFyZzogZXZhbGVkIGFyZ3MgKilcbiAgY2ZfcmVzdWx0cyAgIDogdmFsdWU7ICAgICAgICAgKCogbWFwL2ZpbHRlci9kaWN0OiBhY2N1bXVsYXRlZCByZXN1bHRzICopXG4gIGNmX2V4dHJhICAgICA6IHZhbHVlOyAgICAgICAgICgqIGV4dHJhIGZpZWxkOiBzY2hlbWUsIGluZGV4ZWQsIHZhbHVlLCBwaGFzZSwgZXRjLiAqKVxuICBjZl9leHRyYTIgICAgOiB2YWx1ZTsgICAgICAgICAoKiBzZWNvbmQgZXh0cmE6IGVtaXR0ZWQsIGV0Yy4gKilcbn1cblxuKCoqIE11dGFibGUgc3RyaW5nLWtleWVkIHRhYmxlIChTWCBkaWN0cyBzdXBwb3J0IFtkaWN0LXNldCFdKS4gKilcbmFuZCBkaWN0ID0gKHN0cmluZywgdmFsdWUpIEhhc2h0YmwudFxuXG5hbmQgbGFtYmRhID0ge1xuICBsX3BhcmFtcyAgOiBzdHJpbmcgbGlzdDtcbiAgbF9ib2R5ICAgIDogdmFsdWU7XG4gIGxfY2xvc3VyZSA6IGVudjtcbiAgbXV0YWJsZSBsX25hbWUgOiBzdHJpbmcgb3B0aW9uO1xuICBtdXRhYmxlIGxfY29tcGlsZWQgOiB2bV9jbG9zdXJlIG9wdGlvbjsgICgqKiBMYXp5IEpJVCBjYWNoZSAqKVxufVxuXG5hbmQgY29tcG9uZW50ID0ge1xuICBjX25hbWUgICAgICAgICA6IHN0cmluZztcbiAgY19wYXJhbXMgICAgICAgOiBzdHJpbmcgbGlzdDtcbiAgY19oYXNfY2hpbGRyZW4gOiBib29sO1xuICBjX2JvZHkgICAgICAgICA6IHZhbHVlO1xuICBjX2Nsb3N1cmUgICAgICA6IGVudjtcbiAgY19hZmZpbml0eSAgICAgOiBzdHJpbmc7ICAoKiogXCJhdXRvXCIgfCBcImNsaWVudFwiIHwgXCJzZXJ2ZXJcIiAqKVxuICBtdXRhYmxlIGNfY29tcGlsZWQgOiB2bV9jbG9zdXJlIG9wdGlvbjsgICgqKiBMYXp5IEpJVCBjYWNoZSAqKVxufVxuXG5hbmQgaXNsYW5kID0ge1xuICBpX25hbWUgICAgICAgICA6IHN0cmluZztcbiAgaV9wYXJhbXMgICAgICAgOiBzdHJpbmcgbGlzdDtcbiAgaV9oYXNfY2hpbGRyZW4gOiBib29sO1xuICBpX2JvZHkgICAgICAgICA6IHZhbHVlO1xuICBpX2Nsb3N1cmUgICAgICA6IGVudjtcbn1cblxuYW5kIG1hY3JvID0ge1xuICBtX3BhcmFtcyAgICAgOiBzdHJpbmcgbGlzdDtcbiAgbV9yZXN0X3BhcmFtIDogc3RyaW5nIG9wdGlvbjtcbiAgbV9ib2R5ICAgICAgIDogdmFsdWU7XG4gIG1fY2xvc3VyZSAgICA6IGVudjtcbiAgbV9uYW1lICAgICAgIDogc3RyaW5nIG9wdGlvbjtcbn1cblxuYW5kIHNpZ25hbCA9IHtcbiAgbXV0YWJsZSBzX3ZhbHVlICAgICAgIDogdmFsdWU7XG4gIG11dGFibGUgc19zdWJzY3JpYmVycyA6ICh1bml0IC0+IHVuaXQpIGxpc3Q7XG4gIG11dGFibGUgc19kZXBzICAgICAgICA6IHNpZ25hbCBsaXN0O1xufVxuXG4oKiogezEgQnl0ZWNvZGUgVk0gdHlwZXN9XG5cbiAgICBEZWZpbmVkIGhlcmUgKG5vdCBpbiBzeF92bS5tbCkgYmVjYXVzZSBbdm1fY29kZS5jb25zdGFudHNdIHJlZmVyZW5jZXNcbiAgICBbdmFsdWVdIGFuZCBbbGFtYmRhLmxfY29tcGlsZWRdIHJlZmVyZW5jZXMgW3ZtX2Nsb3N1cmVdIOKAlCBtdXR1YWxcbiAgICByZWN1cnNpb24gcmVxdWlyZXMgYWxsIHR5cGVzIGluIG9uZSBbYW5kXSBjaGFpbi4gKilcblxuKCoqIENvbXBpbGVkIGZ1bmN0aW9uIGJvZHkg4oCUIGJ5dGVjb2RlICsgY29uc3RhbnQgcG9vbC4gKilcbmFuZCB2bV9jb2RlID0ge1xuICB2Y19hcml0eSAgICAgOiBpbnQ7XG4gIHZjX2xvY2FscyAgICA6IGludDtcbiAgdmNfYnl0ZWNvZGUgIDogaW50IGFycmF5O1xuICB2Y19jb25zdGFudHMgOiB2YWx1ZSBhcnJheTtcbn1cblxuKCoqIFVwdmFsdWUgY2VsbCDigJQgc2hhcmVkIG11dGFibGUgcmVmZXJlbmNlIHRvIGEgY2FwdHVyZWQgdmFyaWFibGUuICopXG5hbmQgdm1fdXB2YWx1ZV9jZWxsID0ge1xuICBtdXRhYmxlIHV2X3ZhbHVlIDogdmFsdWU7XG59XG5cbigqKiBDbG9zdXJlIOKAlCBjb21waWxlZCBjb2RlICsgY2FwdHVyZWQgdXB2YWx1ZXMgKyBsaXZlIGVudiByZWZlcmVuY2UuICopXG5hbmQgdm1fY2xvc3VyZSA9IHtcbiAgdm1fY29kZSAgICAgOiB2bV9jb2RlO1xuICB2bV91cHZhbHVlcyA6IHZtX3VwdmFsdWVfY2VsbCBhcnJheTtcbiAgdm1fbmFtZSAgICAgOiBzdHJpbmcgb3B0aW9uO1xuICB2bV9lbnZfcmVmICA6IChzdHJpbmcsIHZhbHVlKSBIYXNodGJsLnQ7XG4gIHZtX2Nsb3N1cmVfZW52IDogZW52IG9wdGlvbjsgICgqKiBPcmlnaW5hbCBjbG9zdXJlIGVudiBmb3IgaW5uZXIgZnVuY3Rpb25zICopXG59XG5cblxuKCoqIHsxIEZvcndhcmQgcmVmIGZvciBjYWxsaW5nIFZNIGNsb3N1cmVzIGZyb20gb3V0c2lkZSB0aGUgVk19ICopXG5cbmxldCBfdm1fY2FsbF9jbG9zdXJlX3JlZiA6ICh2bV9jbG9zdXJlIC0+IHZhbHVlIGxpc3QgLT4gdmFsdWUpIHJlZiA9XG4gIHJlZiAoZnVuIF8gXyAtPiByYWlzZSAoRmFpbHVyZSBcIlZNIGNhbGxfY2xvc3VyZSBub3QgaW5pdGlhbGl6ZWRcIikpXG5cblxuKCoqIHsxIEVycm9yc30gKilcblxuZXhjZXB0aW9uIEV2YWxfZXJyb3Igb2Ygc3RyaW5nXG5leGNlcHRpb24gUGFyc2VfZXJyb3Igb2Ygc3RyaW5nXG5cblxuKCoqIHsxIEVudmlyb25tZW50IG9wZXJhdGlvbnN9ICopXG5cbmxldCBtYWtlX2VudiAoKSA9XG4gIHsgYmluZGluZ3MgPSBIYXNodGJsLmNyZWF0ZSAxNjsgcGFyZW50ID0gTm9uZSB9XG5cbmxldCBlbnZfZXh0ZW5kIHBhcmVudCA9XG4gIHsgYmluZGluZ3MgPSBIYXNodGJsLmNyZWF0ZSAxNjsgcGFyZW50ID0gU29tZSBwYXJlbnQgfVxuXG5sZXQgZW52X2JpbmQgZW52IG5hbWUgdiA9XG4gIEhhc2h0YmwucmVwbGFjZSBlbnYuYmluZGluZ3MgKGludGVybiBuYW1lKSB2OyBOaWxcblxuKCogSW50ZXJuYWw6IHNjb3BlLWNoYWluIGxvb2t1cCB3aXRoIHByZS1pbnRlcm5lZCBJRCAqKVxubGV0IHJlYyBlbnZfaGFzX2lkIGVudiBpZCA9XG4gIEhhc2h0YmwubWVtIGVudi5iaW5kaW5ncyBpZCB8fFxuICBtYXRjaCBlbnYucGFyZW50IHdpdGggU29tZSBwIC0+IGVudl9oYXNfaWQgcCBpZCB8IE5vbmUgLT4gZmFsc2VcblxubGV0IGVudl9oYXMgZW52IG5hbWUgPSBlbnZfaGFzX2lkIGVudiAoaW50ZXJuIG5hbWUpXG5cbmxldCByZWMgZW52X2dldF9pZCBlbnYgaWQgbmFtZSA9XG4gIG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgZW52LmJpbmRpbmdzIGlkIHdpdGhcbiAgfCBTb21lIHYgLT4gdlxuICB8IE5vbmUgLT5cbiAgICBtYXRjaCBlbnYucGFyZW50IHdpdGhcbiAgICB8IFNvbWUgcCAtPiBlbnZfZ2V0X2lkIHAgaWQgbmFtZVxuICAgIHwgTm9uZSAtPlxuICAgICAgcmFpc2UgKEV2YWxfZXJyb3IgKFwiVW5kZWZpbmVkIHN5bWJvbDogXCIgXiBuYW1lKSlcblxubGV0IGVudl9nZXQgZW52IG5hbWUgPSBlbnZfZ2V0X2lkIGVudiAoaW50ZXJuIG5hbWUpIG5hbWVcblxubGV0IHJlYyBlbnZfc2V0X2lkIGVudiBpZCB2ID1cbiAgaWYgSGFzaHRibC5tZW0gZW52LmJpbmRpbmdzIGlkIHRoZW5cbiAgICAoSGFzaHRibC5yZXBsYWNlIGVudi5iaW5kaW5ncyBpZCB2OyBOaWwpXG4gIGVsc2VcbiAgICBtYXRjaCBlbnYucGFyZW50IHdpdGhcbiAgICB8IFNvbWUgcCAtPiBlbnZfc2V0X2lkIHAgaWQgdlxuICAgIHwgTm9uZSAtPiBIYXNodGJsLnJlcGxhY2UgZW52LmJpbmRpbmdzIGlkIHY7IE5pbFxuXG5sZXQgZW52X3NldCBlbnYgbmFtZSB2ID0gZW52X3NldF9pZCBlbnYgKGludGVybiBuYW1lKSB2XG5cbmxldCBlbnZfbWVyZ2UgYmFzZSBvdmVybGF5ID1cbiAgaWYgYmFzZSA9PSBvdmVybGF5IHRoZW5cbiAgICB7IGJpbmRpbmdzID0gSGFzaHRibC5jcmVhdGUgMTY7IHBhcmVudCA9IFNvbWUgYmFzZSB9XG4gIGVsc2UgYmVnaW5cbiAgICBsZXQgcmVjIGlzX2Rlc2NlbmRhbnQgZSBkZXB0aCA9XG4gICAgICBpZiBkZXB0aCA+IDEwMCB0aGVuIGZhbHNlXG4gICAgICBlbHNlIGlmIGUgPT0gYmFzZSB0aGVuIHRydWVcbiAgICAgIGVsc2UgbWF0Y2ggZS5wYXJlbnQgd2l0aCBTb21lIHAgLT4gaXNfZGVzY2VuZGFudCBwIChkZXB0aCArIDEpIHwgTm9uZSAtPiBmYWxzZVxuICAgIGluXG4gICAgaWYgaXNfZGVzY2VuZGFudCBvdmVybGF5IDAgdGhlblxuICAgICAgeyBiaW5kaW5ncyA9IEhhc2h0YmwuY3JlYXRlIDE2OyBwYXJlbnQgPSBTb21lIGJhc2UgfVxuICAgIGVsc2UgYmVnaW5cbiAgICAgIGxldCBlID0geyBiaW5kaW5ncyA9IEhhc2h0YmwuY3JlYXRlIDE2OyBwYXJlbnQgPSBTb21lIGJhc2UgfSBpblxuICAgICAgSGFzaHRibC5pdGVyIChmdW4gaWQgdiAtPlxuICAgICAgICBpZiBub3QgKGVudl9oYXNfaWQgYmFzZSBpZCkgdGhlbiBIYXNodGJsLnJlcGxhY2UgZS5iaW5kaW5ncyBpZCB2XG4gICAgICApIG92ZXJsYXkuYmluZGluZ3M7XG4gICAgICBlXG4gICAgZW5kXG4gIGVuZFxuXG5cbigqKiB7MSBWYWx1ZSBleHRyYWN0aW9uIGhlbHBlcnN9ICopXG5cbmxldCB2YWx1ZV90b19zdHJpbmcgPSBmdW5jdGlvblxuICB8IFN0cmluZyBzIC0+IHMgfCBTeW1ib2wgcyAtPiBzIHwgS2V5d29yZCBrIC0+IGtcbiAgfCBOdW1iZXIgbiAtPiBpZiBGbG9hdC5pc19pbnRlZ2VyIG4gdGhlbiBzdHJpbmdfb2ZfaW50IChpbnRfb2ZfZmxvYXQgbikgZWxzZSBQcmludGYuc3ByaW50ZiBcIiVnXCIgblxuICB8IEJvb2wgdHJ1ZSAtPiBcInRydWVcIiB8IEJvb2wgZmFsc2UgLT4gXCJmYWxzZVwiXG4gIHwgTmlsIC0+IFwiXCIgfCBfIC0+IFwiPHZhbHVlPlwiXG5cbmxldCB2YWx1ZV90b19zdHJpbmdfbGlzdCA9IGZ1bmN0aW9uXG4gIHwgTGlzdCBpdGVtcyB8IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0gLT4gTGlzdC5tYXAgdmFsdWVfdG9fc3RyaW5nIGl0ZW1zXG4gIHwgXyAtPiBbXVxuXG5sZXQgdmFsdWVfdG9fYm9vbCA9IGZ1bmN0aW9uXG4gIHwgQm9vbCBiIC0+IGIgfCBOaWwgLT4gZmFsc2UgfCBfIC0+IHRydWVcblxubGV0IHZhbHVlX3RvX3N0cmluZ19vcHQgPSBmdW5jdGlvblxuICB8IFN0cmluZyBzIC0+IFNvbWUgcyB8IFN5bWJvbCBzIC0+IFNvbWUgcyB8IE5pbCAtPiBOb25lIHwgXyAtPiBOb25lXG5cblxuKCoqIHsxIENvbnN0cnVjdG9ycyDigJQgYWNjZXB0IFt2YWx1ZV0gYXJncyBmcm9tIHRyYW5zcGlsZWQgY29kZX0gKilcblxubGV0IHVud3JhcF9lbnZfdmFsID0gZnVuY3Rpb25cbiAgfCBFbnYgZSAtPiBlXG4gIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm1ha2VfbGFtYmRhOiBleHBlY3RlZCBlbnYgZm9yIGNsb3N1cmVcIilcblxubGV0IG1ha2VfbGFtYmRhIHBhcmFtcyBib2R5IGNsb3N1cmUgPVxuICBsZXQgcHMgPSBtYXRjaCBwYXJhbXMgd2l0aFxuICAgIHwgTGlzdCBpdGVtcyAtPiBMaXN0Lm1hcCB2YWx1ZV90b19zdHJpbmcgaXRlbXNcbiAgICB8IF8gLT4gdmFsdWVfdG9fc3RyaW5nX2xpc3QgcGFyYW1zXG4gIGluXG4gIExhbWJkYSB7IGxfcGFyYW1zID0gcHM7IGxfYm9keSA9IGJvZHk7IGxfY2xvc3VyZSA9IHVud3JhcF9lbnZfdmFsIGNsb3N1cmU7IGxfbmFtZSA9IE5vbmU7IGxfY29tcGlsZWQgPSBOb25lIH1cblxubGV0IG1ha2VfY29tcG9uZW50IG5hbWUgcGFyYW1zIGhhc19jaGlsZHJlbiBib2R5IGNsb3N1cmUgYWZmaW5pdHkgPVxuICBsZXQgbiA9IHZhbHVlX3RvX3N0cmluZyBuYW1lIGluXG4gIGxldCBwcyA9IHZhbHVlX3RvX3N0cmluZ19saXN0IHBhcmFtcyBpblxuICBsZXQgaGMgPSB2YWx1ZV90b19ib29sIGhhc19jaGlsZHJlbiBpblxuICBsZXQgYWZmID0gbWF0Y2ggYWZmaW5pdHkgd2l0aCBTdHJpbmcgcyAtPiBzIHwgXyAtPiBcImF1dG9cIiBpblxuICBDb21wb25lbnQge1xuICAgIGNfbmFtZSA9IG47IGNfcGFyYW1zID0gcHM7IGNfaGFzX2NoaWxkcmVuID0gaGM7XG4gICAgY19ib2R5ID0gYm9keTsgY19jbG9zdXJlID0gdW53cmFwX2Vudl92YWwgY2xvc3VyZTsgY19hZmZpbml0eSA9IGFmZjtcbiAgICBjX2NvbXBpbGVkID0gTm9uZTtcbiAgfVxuXG5sZXQgbWFrZV9pc2xhbmQgbmFtZSBwYXJhbXMgaGFzX2NoaWxkcmVuIGJvZHkgY2xvc3VyZSA9XG4gIGxldCBuID0gdmFsdWVfdG9fc3RyaW5nIG5hbWUgaW5cbiAgbGV0IHBzID0gdmFsdWVfdG9fc3RyaW5nX2xpc3QgcGFyYW1zIGluXG4gIGxldCBoYyA9IHZhbHVlX3RvX2Jvb2wgaGFzX2NoaWxkcmVuIGluXG4gIElzbGFuZCB7XG4gICAgaV9uYW1lID0gbjsgaV9wYXJhbXMgPSBwczsgaV9oYXNfY2hpbGRyZW4gPSBoYztcbiAgICBpX2JvZHkgPSBib2R5OyBpX2Nsb3N1cmUgPSB1bndyYXBfZW52X3ZhbCBjbG9zdXJlO1xuICB9XG5cbmxldCBtYWtlX21hY3JvIHBhcmFtcyByZXN0X3BhcmFtIGJvZHkgY2xvc3VyZSBuYW1lID1cbiAgbGV0IHBzID0gdmFsdWVfdG9fc3RyaW5nX2xpc3QgcGFyYW1zIGluXG4gIGxldCBycCA9IHZhbHVlX3RvX3N0cmluZ19vcHQgcmVzdF9wYXJhbSBpblxuICBsZXQgbiA9IHZhbHVlX3RvX3N0cmluZ19vcHQgbmFtZSBpblxuICBNYWNybyB7XG4gICAgbV9wYXJhbXMgPSBwczsgbV9yZXN0X3BhcmFtID0gcnA7XG4gICAgbV9ib2R5ID0gYm9keTsgbV9jbG9zdXJlID0gdW53cmFwX2Vudl92YWwgY2xvc3VyZTsgbV9uYW1lID0gbjtcbiAgfVxuXG5sZXQgbWFrZV90aHVuayBleHByIGVudiA9IFRodW5rIChleHByLCB1bndyYXBfZW52X3ZhbCBlbnYpXG5cbmxldCBtYWtlX3N5bWJvbCBuYW1lID0gU3ltYm9sICh2YWx1ZV90b19zdHJpbmcgbmFtZSlcbmxldCBtYWtlX2tleXdvcmQgbmFtZSA9IEtleXdvcmQgKHZhbHVlX3RvX3N0cmluZyBuYW1lKVxuXG5cbigqKiB7MSBUeXBlIGluc3BlY3Rpb259ICopXG5cbmxldCB0eXBlX29mID0gZnVuY3Rpb25cbiAgfCBOaWwgICAgICAgICAgICAtPiBcIm5pbFwiXG4gIHwgQm9vbCBfICAgICAgICAgLT4gXCJib29sZWFuXCJcbiAgfCBOdW1iZXIgXyAgICAgICAtPiBcIm51bWJlclwiXG4gIHwgU3RyaW5nIF8gICAgICAgLT4gXCJzdHJpbmdcIlxuICB8IFN5bWJvbCBfICAgICAgIC0+IFwic3ltYm9sXCJcbiAgfCBLZXl3b3JkIF8gICAgICAtPiBcImtleXdvcmRcIlxuICB8IExpc3QgXyB8IExpc3RSZWYgXyAtPiBcImxpc3RcIlxuICB8IERpY3QgXyAgICAgICAgIC0+IFwiZGljdFwiXG4gIHwgTGFtYmRhIF8gICAgICAgLT4gXCJsYW1iZGFcIlxuICB8IENvbXBvbmVudCBfICAgIC0+IFwiY29tcG9uZW50XCJcbiAgfCBJc2xhbmQgXyAgICAgICAtPiBcImlzbGFuZFwiXG4gIHwgTWFjcm8gXyAgICAgICAgLT4gXCJtYWNyb1wiXG4gIHwgVGh1bmsgXyAgICAgICAgLT4gXCJ0aHVua1wiXG4gIHwgQ29udGludWF0aW9uIChfLCBfKSAtPiBcImNvbnRpbnVhdGlvblwiXG4gIHwgTmF0aXZlRm4gXyAgICAgLT4gXCJmdW5jdGlvblwiXG4gIHwgU2lnbmFsIF8gICAgICAgLT4gXCJzaWduYWxcIlxuICB8IFJhd0hUTUwgXyAgICAgIC0+IFwicmF3LWh0bWxcIlxuICB8IFNwcmVhZCBfICAgICAgIC0+IFwic3ByZWFkXCJcbiAgfCBTeEV4cHIgXyAgICAgICAtPiBcInN4LWV4cHJcIlxuICB8IEVudiBfICAgICAgICAgIC0+IFwiZW52XCJcbiAgfCBDZWtTdGF0ZSBfICAgICAtPiBcImRpY3RcIiAgKCogQ0VLIHN0YXRlIGJlaGF2ZXMgYXMgYSBkaWN0IGZvciB0eXBlIGNoZWNrcyAqKVxuICB8IENla0ZyYW1lIF8gICAgIC0+IFwiZGljdFwiXG4gIHwgVm1DbG9zdXJlIF8gICAgLT4gXCJmdW5jdGlvblwiXG5cbmxldCBpc19uaWwgPSBmdW5jdGlvbiBOaWwgLT4gdHJ1ZSB8IF8gLT4gZmFsc2VcbmxldCBpc19sYW1iZGEgPSBmdW5jdGlvbiBMYW1iZGEgXyAtPiB0cnVlIHwgXyAtPiBmYWxzZVxubGV0IGlzX2NvbXBvbmVudCA9IGZ1bmN0aW9uIENvbXBvbmVudCBfIC0+IHRydWUgfCBfIC0+IGZhbHNlXG5sZXQgaXNfaXNsYW5kID0gZnVuY3Rpb24gSXNsYW5kIF8gLT4gdHJ1ZSB8IF8gLT4gZmFsc2VcbmxldCBpc19tYWNybyA9IGZ1bmN0aW9uIE1hY3JvIF8gLT4gdHJ1ZSB8IF8gLT4gZmFsc2VcbmxldCBpc190aHVuayA9IGZ1bmN0aW9uIFRodW5rIF8gLT4gdHJ1ZSB8IF8gLT4gZmFsc2VcbmxldCBpc19zaWduYWwgPSBmdW5jdGlvblxuICB8IFNpZ25hbCBfIC0+IHRydWVcbiAgfCBEaWN0IGQgLT4gSGFzaHRibC5tZW0gZCBcIl9fc2lnbmFsXCJcbiAgfCBfIC0+IGZhbHNlXG5cbmxldCBpc19jYWxsYWJsZSA9IGZ1bmN0aW9uXG4gIHwgTGFtYmRhIF8gfCBOYXRpdmVGbiBfIHwgQ29udGludWF0aW9uIChfLCBfKSB8IFZtQ2xvc3VyZSBfIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG5cblxuKCoqIHsxIFRydXRoaW5lc3N9ICopXG5cbigqKiBTWCB0cnV0aGluZXNzOiBldmVyeXRoaW5nIGlzIHRydXRoeSBleGNlcHQgW05pbF0gYW5kIFtCb29sIGZhbHNlXS4gKilcbmxldCBzeF90cnV0aHkgPSBmdW5jdGlvblxuICB8IE5pbCB8IEJvb2wgZmFsc2UgLT4gZmFsc2VcbiAgfCBfIC0+IHRydWVcblxuXG4oKiogezEgQWNjZXNzb3JzfSAqKVxuXG5sZXQgc3ltYm9sX25hbWUgPSBmdW5jdGlvblxuICB8IFN5bWJvbCBzIC0+IFN0cmluZyBzXG4gIHwgdiAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJFeHBlY3RlZCBzeW1ib2wsIGdvdCBcIiBeIHR5cGVfb2YgdikpXG5cbmxldCBrZXl3b3JkX25hbWUgPSBmdW5jdGlvblxuICB8IEtleXdvcmQgayAtPiBTdHJpbmcga1xuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQga2V5d29yZCwgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IGxhbWJkYV9wYXJhbXMgPSBmdW5jdGlvblxuICB8IExhbWJkYSBsIC0+IExpc3QgKExpc3QubWFwIChmdW4gcyAtPiBTdHJpbmcgcykgbC5sX3BhcmFtcylcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIGxhbWJkYSwgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IGxhbWJkYV9ib2R5ID0gZnVuY3Rpb25cbiAgfCBMYW1iZGEgbCAtPiBsLmxfYm9keVxuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQgbGFtYmRhLCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5sZXQgbGFtYmRhX2Nsb3N1cmUgPSBmdW5jdGlvblxuICB8IExhbWJkYSBsIC0+IEVudiBsLmxfY2xvc3VyZVxuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQgbGFtYmRhLCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5sZXQgbGFtYmRhX25hbWUgPSBmdW5jdGlvblxuICB8IExhbWJkYSBsIC0+IChtYXRjaCBsLmxfbmFtZSB3aXRoIFNvbWUgbiAtPiBTdHJpbmcgbiB8IE5vbmUgLT4gTmlsKVxuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQgbGFtYmRhLCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5sZXQgc2V0X2xhbWJkYV9uYW1lIGwgbiA9IG1hdGNoIGwgd2l0aFxuICB8IExhbWJkYSBsIC0+IGwubF9uYW1lIDwtIFNvbWUgbjsgTmlsXG4gIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInNldC1sYW1iZGEtbmFtZSE6IG5vdCBhIGxhbWJkYVwiKVxuXG5sZXQgY29tcG9uZW50X25hbWUgPSBmdW5jdGlvblxuICB8IENvbXBvbmVudCBjIC0+IFN0cmluZyBjLmNfbmFtZVxuICB8IElzbGFuZCBpIC0+IFN0cmluZyBpLmlfbmFtZVxuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQgY29tcG9uZW50LCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5sZXQgY29tcG9uZW50X3BhcmFtcyA9IGZ1bmN0aW9uXG4gIHwgQ29tcG9uZW50IGMgLT4gTGlzdCAoTGlzdC5tYXAgKGZ1biBzIC0+IFN0cmluZyBzKSBjLmNfcGFyYW1zKVxuICB8IElzbGFuZCBpIC0+IExpc3QgKExpc3QubWFwIChmdW4gcyAtPiBTdHJpbmcgcykgaS5pX3BhcmFtcylcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIGNvbXBvbmVudCwgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IGNvbXBvbmVudF9ib2R5ID0gZnVuY3Rpb25cbiAgfCBDb21wb25lbnQgYyAtPiBjLmNfYm9keVxuICB8IElzbGFuZCBpIC0+IGkuaV9ib2R5XG4gIHwgdiAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJFeHBlY3RlZCBjb21wb25lbnQsIGdvdCBcIiBeIHR5cGVfb2YgdikpXG5cbmxldCBjb21wb25lbnRfY2xvc3VyZSA9IGZ1bmN0aW9uXG4gIHwgQ29tcG9uZW50IGMgLT4gRW52IGMuY19jbG9zdXJlXG4gIHwgSXNsYW5kIGkgLT4gRW52IGkuaV9jbG9zdXJlXG4gIHwgdiAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJFeHBlY3RlZCBjb21wb25lbnQsIGdvdCBcIiBeIHR5cGVfb2YgdikpXG5cbmxldCBjb21wb25lbnRfaGFzX2NoaWxkcmVuID0gZnVuY3Rpb25cbiAgfCBDb21wb25lbnQgYyAtPiBCb29sIGMuY19oYXNfY2hpbGRyZW5cbiAgfCBJc2xhbmQgaSAtPiBCb29sIGkuaV9oYXNfY2hpbGRyZW5cbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIGNvbXBvbmVudCwgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IGNvbXBvbmVudF9hZmZpbml0eSA9IGZ1bmN0aW9uXG4gIHwgQ29tcG9uZW50IGMgLT4gU3RyaW5nIGMuY19hZmZpbml0eVxuICB8IElzbGFuZCBfIC0+IFN0cmluZyBcImNsaWVudFwiXG4gIHwgXyAtPiBTdHJpbmcgXCJhdXRvXCJcblxubGV0IG1hY3JvX3BhcmFtcyA9IGZ1bmN0aW9uXG4gIHwgTWFjcm8gbSAtPiBMaXN0IChMaXN0Lm1hcCAoZnVuIHMgLT4gU3RyaW5nIHMpIG0ubV9wYXJhbXMpXG4gIHwgdiAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJFeHBlY3RlZCBtYWNybywgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IG1hY3JvX3Jlc3RfcGFyYW0gPSBmdW5jdGlvblxuICB8IE1hY3JvIG0gLT4gKG1hdGNoIG0ubV9yZXN0X3BhcmFtIHdpdGggU29tZSBzIC0+IFN0cmluZyBzIHwgTm9uZSAtPiBOaWwpXG4gIHwgdiAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJFeHBlY3RlZCBtYWNybywgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IG1hY3JvX2JvZHkgPSBmdW5jdGlvblxuICB8IE1hY3JvIG0gLT4gbS5tX2JvZHlcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIG1hY3JvLCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5sZXQgbWFjcm9fY2xvc3VyZSA9IGZ1bmN0aW9uXG4gIHwgTWFjcm8gbSAtPiBFbnYgbS5tX2Nsb3N1cmVcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIG1hY3JvLCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5sZXQgdGh1bmtfZXhwciA9IGZ1bmN0aW9uXG4gIHwgVGh1bmsgKGUsIF8pIC0+IGVcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIHRodW5rLCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5sZXQgdGh1bmtfZW52ID0gZnVuY3Rpb25cbiAgfCBUaHVuayAoXywgZSkgLT4gRW52IGVcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIHRodW5rLCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5cbigqKiB7MSBEaWN0IG9wZXJhdGlvbnN9ICopXG5cbmxldCBtYWtlX2RpY3QgKCkgOiBkaWN0ID0gSGFzaHRibC5jcmVhdGUgOFxuXG5sZXQgZGljdF9nZXQgKGQgOiBkaWN0KSBrZXkgPVxuICBtYXRjaCBIYXNodGJsLmZpbmRfb3B0IGQga2V5IHdpdGggU29tZSB2IC0+IHYgfCBOb25lIC0+IE5pbFxuXG5sZXQgZGljdF9oYXMgKGQgOiBkaWN0KSBrZXkgPSBIYXNodGJsLm1lbSBkIGtleVxuXG5sZXQgZGljdF9zZXQgKGQgOiBkaWN0KSBrZXkgdiA9IEhhc2h0YmwucmVwbGFjZSBkIGtleSB2XG5cbmxldCBkaWN0X2RlbGV0ZSAoZCA6IGRpY3QpIGtleSA9IEhhc2h0YmwucmVtb3ZlIGQga2V5XG5cbmxldCBkaWN0X2tleXMgKGQgOiBkaWN0KSA9XG4gIEhhc2h0YmwuZm9sZCAoZnVuIGsgXyBhY2MgLT4gU3RyaW5nIGsgOjogYWNjKSBkIFtdXG5cbmxldCBkaWN0X3ZhbHMgKGQgOiBkaWN0KSA9XG4gIEhhc2h0YmwuZm9sZCAoZnVuIF8gdiBhY2MgLT4gdiA6OiBhY2MpIGQgW11cblxuXG4oKiogezEgVmFsdWUgZGlzcGxheX0gKilcblxubGV0IHJlYyBpbnNwZWN0ID0gZnVuY3Rpb25cbiAgfCBOaWwgLT4gXCJuaWxcIlxuICB8IEJvb2wgdHJ1ZSAtPiBcInRydWVcIlxuICB8IEJvb2wgZmFsc2UgLT4gXCJmYWxzZVwiXG4gIHwgTnVtYmVyIG4gLT5cbiAgICBpZiBGbG9hdC5pc19pbnRlZ2VyIG4gdGhlbiBQcmludGYuc3ByaW50ZiBcIiVkXCIgKGludF9vZl9mbG9hdCBuKVxuICAgIGVsc2UgUHJpbnRmLnNwcmludGYgXCIlZ1wiIG5cbiAgfCBTdHJpbmcgcyAtPlxuICAgIGxldCBidWYgPSBCdWZmZXIuY3JlYXRlIChTdHJpbmcubGVuZ3RoIHMgKyAyKSBpblxuICAgIEJ1ZmZlci5hZGRfY2hhciBidWYgJ1wiJztcbiAgICBTdHJpbmcuaXRlciAoZnVuY3Rpb25cbiAgICAgIHwgJ1wiJyAgLT4gQnVmZmVyLmFkZF9zdHJpbmcgYnVmIFwiXFxcXFxcXCJcIlxuICAgICAgfCAnXFxcXCcgLT4gQnVmZmVyLmFkZF9zdHJpbmcgYnVmIFwiXFxcXFxcXFxcIlxuICAgICAgfCAnXFxuJyAtPiBCdWZmZXIuYWRkX3N0cmluZyBidWYgXCJcXFxcblwiXG4gICAgICB8ICdcXHInIC0+IEJ1ZmZlci5hZGRfc3RyaW5nIGJ1ZiBcIlxcXFxyXCJcbiAgICAgIHwgJ1xcdCcgLT4gQnVmZmVyLmFkZF9zdHJpbmcgYnVmIFwiXFxcXHRcIlxuICAgICAgfCBjICAgIC0+IEJ1ZmZlci5hZGRfY2hhciBidWYgYykgcztcbiAgICBCdWZmZXIuYWRkX2NoYXIgYnVmICdcIic7XG4gICAgQnVmZmVyLmNvbnRlbnRzIGJ1ZlxuICB8IFN5bWJvbCBzIC0+IHNcbiAgfCBLZXl3b3JkIGsgLT4gXCI6XCIgXiBrXG4gIHwgTGlzdCBpdGVtcyB8IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0gLT5cbiAgICBcIihcIiBeIFN0cmluZy5jb25jYXQgXCIgXCIgKExpc3QubWFwIGluc3BlY3QgaXRlbXMpIF4gXCIpXCJcbiAgfCBEaWN0IGQgLT5cbiAgICBsZXQgcGFpcnMgPSBIYXNodGJsLmZvbGQgKGZ1biBrIHYgYWNjIC0+XG4gICAgICAoUHJpbnRmLnNwcmludGYgXCI6JXMgJXNcIiBrIChpbnNwZWN0IHYpKSA6OiBhY2MpIGQgW10gaW5cbiAgICBcIntcIiBeIFN0cmluZy5jb25jYXQgXCIgXCIgcGFpcnMgXiBcIn1cIlxuICB8IExhbWJkYSBsIC0+XG4gICAgbGV0IHRhZyA9IG1hdGNoIGwubF9uYW1lIHdpdGggU29tZSBuIC0+IG4gfCBOb25lIC0+IFwibGFtYmRhXCIgaW5cbiAgICBQcmludGYuc3ByaW50ZiBcIjwlcyglcyk+XCIgdGFnIChTdHJpbmcuY29uY2F0IFwiLCBcIiBsLmxfcGFyYW1zKVxuICB8IENvbXBvbmVudCBjIC0+XG4gICAgUHJpbnRmLnNwcmludGYgXCI8Q29tcG9uZW50IH4lcyglcyk+XCIgYy5jX25hbWUgKFN0cmluZy5jb25jYXQgXCIsIFwiIGMuY19wYXJhbXMpXG4gIHwgSXNsYW5kIGkgLT5cbiAgICBQcmludGYuc3ByaW50ZiBcIjxJc2xhbmQgfiVzKCVzKT5cIiBpLmlfbmFtZSAoU3RyaW5nLmNvbmNhdCBcIiwgXCIgaS5pX3BhcmFtcylcbiAgfCBNYWNybyBtIC0+XG4gICAgbGV0IHRhZyA9IG1hdGNoIG0ubV9uYW1lIHdpdGggU29tZSBuIC0+IG4gfCBOb25lIC0+IFwibWFjcm9cIiBpblxuICAgIFByaW50Zi5zcHJpbnRmIFwiPCVzKCVzKT5cIiB0YWcgKFN0cmluZy5jb25jYXQgXCIsIFwiIG0ubV9wYXJhbXMpXG4gIHwgVGh1bmsgXyAtPiBcIjx0aHVuaz5cIlxuICB8IENvbnRpbnVhdGlvbiAoXywgXykgLT4gXCI8Y29udGludWF0aW9uPlwiXG4gIHwgTmF0aXZlRm4gKG5hbWUsIF8pIC0+IFByaW50Zi5zcHJpbnRmIFwiPG5hdGl2ZTolcz5cIiBuYW1lXG4gIHwgU2lnbmFsIF8gLT4gXCI8c2lnbmFsPlwiXG4gIHwgUmF3SFRNTCBzIC0+IFByaW50Zi5zcHJpbnRmIFwiPHJhdy1odG1sOiVkIGNoYXJzPlwiIChTdHJpbmcubGVuZ3RoIHMpXG4gIHwgU3ByZWFkIF8gLT4gXCI8c3ByZWFkPlwiXG4gIHwgU3hFeHByIHMgLT4gUHJpbnRmLnNwcmludGYgXCI8c3gtZXhwcjolZCBjaGFycz5cIiAoU3RyaW5nLmxlbmd0aCBzKVxuICB8IEVudiBfIC0+IFwiPGVudj5cIlxuICB8IENla1N0YXRlIF8gLT4gXCI8Y2VrLXN0YXRlPlwiXG4gIHwgQ2VrRnJhbWUgZiAtPiBQcmludGYuc3ByaW50ZiBcIjxmcmFtZTolcz5cIiBmLmNmX3R5cGVcbiAgfCBWbUNsb3N1cmUgY2wgLT4gUHJpbnRmLnNwcmludGYgXCI8dm06JXM+XCIgKG1hdGNoIGNsLnZtX25hbWUgd2l0aCBTb21lIG4gLT4gbiB8IE5vbmUgLT4gXCJhbm9uXCIpXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfZnJlc2hfb29faWQiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX21sX3N0cmluZ19sZW5ndGgiLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfSGFzaHRibCIsIlN0ZGxpYiIsIlN0ZGxpYl9QcmludGYiLCJTdGRsaWJfQnVmZmVyIiwiU3RkbGliX0Zsb2F0IiwiU3RkbGliX1N0cmluZyIsIlN0ZGxpYl9MaXN0Iiwic3ltX3RvX2lkIiwiaWRfdG9fc3ltIiwic3ltX25leHQiLCJpbnRlcm4iLCJzIiwibWF0Y2giLCJpZCIsInVuaW50ZXJuIiwidm1fY2FsbF9jbG9zdXJlX3JlZiIsInBhcmFtIiwiRXZhbF9lcnJvciIsIlBhcnNlX2Vycm9yIiwibWFrZV9lbnYiLCJlbnZfZXh0ZW5kIiwicGFyZW50IiwiZW52X2JpbmQiLCJlbnYiLCJuYW1lIiwidiIsImVudl9oYXNfaWQiLCJlbnZfaGFzIiwiZW52X2dldF9pZCIsImVudl9nZXQiLCJlbnZfc2V0X2lkIiwiZW52X3NldCIsImVudl9tZXJnZSIsImJhc2UiLCJvdmVybGF5IiwiZSIsImRlcHRoIiwicCIsImNzdF9nIiwiY3N0X2ZhbHNlIiwiY3N0X3RydWUiLCJ2YWx1ZV90b19zdHJpbmciLCJuIiwidmFsdWVfdG9fc3RyaW5nX2xpc3QiLCJpdGVtcyIsInZhbHVlX3RvX2Jvb2wiLCJiIiwidmFsdWVfdG9fc3RyaW5nX29wdCIsInVud3JhcF9lbnZfdmFsIiwibWFrZV9sYW1iZGEiLCJwYXJhbXMiLCJib2R5IiwiY2xvc3VyZSIsInBzIiwiY3N0X2F1dG8iLCJtYWtlX2NvbXBvbmVudCIsImhhc19jaGlsZHJlbiIsImFmZmluaXR5IiwiaGMiLCJhZmYiLCJtYWtlX2lzbGFuZCIsIm1ha2VfbWFjcm8iLCJyZXN0X3BhcmFtIiwicnAiLCJtYWtlX3RodW5rIiwiZXhwciIsIm1ha2Vfc3ltYm9sIiwibWFrZV9rZXl3b3JkIiwiY3N0X2xhbWJkYSIsImNzdF9tYWNybyIsImNzdF9uaWwiLCJ0eXBlX29mIiwiY3N0X2RpY3QiLCJjc3RfZnVuY3Rpb24iLCJpc19uaWwiLCJpc19sYW1iZGEiLCJpc19jb21wb25lbnQiLCJpc19pc2xhbmQiLCJpc19tYWNybyIsImlzX3RodW5rIiwiaXNfc2lnbmFsIiwiZCIsImlzX2NhbGxhYmxlIiwic3hfdHJ1dGh5Iiwic3ltYm9sX25hbWUiLCJrZXl3b3JkX25hbWUiLCJrIiwiY3N0X0V4cGVjdGVkX2xhbWJkYV9nb3QiLCJsYW1iZGFfcGFyYW1zIiwibCIsImxhbWJkYV9ib2R5IiwibGFtYmRhX2Nsb3N1cmUiLCJsYW1iZGFfbmFtZSIsInNldF9sYW1iZGFfbmFtZSIsImNzdF9FeHBlY3RlZF9jb21wb25lbnRfZ290IiwiY29tcG9uZW50X25hbWUiLCJjIiwiY29tcG9uZW50X3BhcmFtcyIsImkiLCJjb21wb25lbnRfYm9keSIsImNvbXBvbmVudF9jbG9zdXJlIiwiY29tcG9uZW50X2hhc19jaGlsZHJlbiIsImNvbXBvbmVudF9hZmZpbml0eSIsImNzdF9FeHBlY3RlZF9tYWNyb19nb3QiLCJtYWNyb19wYXJhbXMiLCJtIiwibWFjcm9fcmVzdF9wYXJhbSIsIm1hY3JvX2JvZHkiLCJtYWNyb19jbG9zdXJlIiwiY3N0X0V4cGVjdGVkX3RodW5rX2dvdCIsInRodW5rX2V4cHIiLCJ0aHVua19lbnYiLCJtYWtlX2RpY3QiLCJkaWN0X2dldCIsImtleSIsImRpY3RfaGFzIiwiZGljdF9zZXQiLCJkaWN0X2RlbGV0ZSIsImRpY3Rfa2V5cyIsImFjYyIsImRpY3RfdmFscyIsImNzdF9jaGFycyIsImNzdCIsImNzdF9zX3MiLCJpbnNwZWN0IiwiYnVmIiwicGFpcnMiLCJ0YWciLCJjbCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFB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LDJFQUlpRjtBQUFBO0FBQUEsT0FIcEY7QUFBQTtBQUFBLFdBQUFpQyxRQTVDSztBQUFBO0FBQUEsT0E2Q0E7QUFBQTtBQUFBLFdBQUFqRCxNQTdDQSxjQThDQTtBQUFBLDJEQUMrRTtBQUFBO0FBQUEsV0FBQXFJLEtBL0MvRSxVQUFBcEgsVUErQ0U7QUFBQSx1QkFBQThCLE1BQUEsWUFBQUEsTUFBMEQsY0FBQUEsTUFBMUQ7QUFBQSw2REFBNkU7QUFBQTtBQUFBO0FBQUEsU0F6QnJFO0FBQUEsU0FBbEI7QUFBQTtBQUFBLElBQWdELG9DQXlCdUM7QUFBQTtBQUFBLEdBbGZyQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFRGI1RCIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjI1NTEyLCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6Ii5zeC5vYmpzL2pzb28vZGVmYXVsdC9zeC5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3dvcmtzcGFjZV9yb290L2xpYi9zeF9wcmltaXRpdmVzLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqIEJ1aWx0LWluIHByaW1pdGl2ZSBmdW5jdGlvbnMgKH44MCBwdXJlIGZ1bmN0aW9ucykuXG5cbiAgICBSZWdpc3RlcmVkIGluIGEgZ2xvYmFsIHRhYmxlOyB0aGUgZXZhbHVhdG9yIGNoZWNrcyB0aGlzIHRhYmxlXG4gICAgd2hlbiBhIHN5bWJvbCBpc24ndCBmb3VuZCBpbiB0aGUgbGV4aWNhbCBlbnZpcm9ubWVudC4gKilcblxub3BlbiBTeF90eXBlc1xuXG5sZXQgcHJpbWl0aXZlcyA6IChzdHJpbmcsIHZhbHVlIGxpc3QgLT4gdmFsdWUpIEhhc2h0YmwudCA9IEhhc2h0YmwuY3JlYXRlIDEyOFxuXG4oKiogRm9yd2FyZCByZWZzIGZvciBjYWxsaW5nIFNYIGZ1bmN0aW9ucyBmcm9tIHByaW1pdGl2ZXMgKGJyZWFrcyBjeWNsZSkuICopXG5sZXQgX3N4X2NhbGxfZm4gOiAodmFsdWUgLT4gdmFsdWUgbGlzdCAtPiB2YWx1ZSkgcmVmID1cbiAgcmVmIChmdW4gXyBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic3hfY2FsbCBub3QgaW5pdGlhbGl6ZWRcIikpXG5sZXQgX3N4X3RyYW1wb2xpbmVfZm4gOiAodmFsdWUgLT4gdmFsdWUpIHJlZiA9XG4gIHJlZiAoZnVuIHYgLT4gdilcblxubGV0IHJlZ2lzdGVyIG5hbWUgZm4gPSBIYXNodGJsLnJlcGxhY2UgcHJpbWl0aXZlcyBuYW1lIGZuXG5cbmxldCBpc19wcmltaXRpdmUgbmFtZSA9IEhhc2h0YmwubWVtIHByaW1pdGl2ZXMgbmFtZVxuXG5sZXQgZ2V0X3ByaW1pdGl2ZSBuYW1lID1cbiAgbWF0Y2ggSGFzaHRibC5maW5kX29wdCBwcmltaXRpdmVzIG5hbWUgd2l0aFxuICB8IFNvbWUgZm4gLT4gTmF0aXZlRm4gKG5hbWUsIGZuKVxuICB8IE5vbmUgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiVW5rbm93biBwcmltaXRpdmU6IFwiIF4gbmFtZSkpXG5cbigqIC0tLSBIZWxwZXJzIC0tLSAqKVxuXG4oKiBUcmFtcG9saW5lIGhvb2sg4oCUIHNldCBieSBzeF9yZWYgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gdG8gYnJlYWsgY2lyY3VsYXIgZGVwICopXG5sZXQgdHJhbXBvbGluZV9ob29rIDogKHZhbHVlIC0+IHZhbHVlKSByZWYgPSByZWYgKGZ1biB2IC0+IHYpXG5cbmxldCByZWMgYXNfbnVtYmVyID0gZnVuY3Rpb25cbiAgfCBOdW1iZXIgbiAtPiBuXG4gIHwgQm9vbCB0cnVlIC0+IDEuMFxuICB8IEJvb2wgZmFsc2UgLT4gMC4wXG4gIHwgTmlsIC0+IDAuMFxuICB8IFN0cmluZyBzIC0+IChtYXRjaCBmbG9hdF9vZl9zdHJpbmdfb3B0IHMgd2l0aCBTb21lIG4gLT4gbiB8IE5vbmUgLT4gRmxvYXQubmFuKVxuICB8IFRodW5rIF8gYXMgdCAtPlxuICAgICgqIFRyYW1wb2xpbmUgdGh1bmtzIOKAlCB0aGV5IHNob3VsZG4ndCBsZWFrIGJ1dCBzb21ldGltZXMgZG8gKilcbiAgICBhc19udW1iZXIgKCF0cmFtcG9saW5lX2hvb2sgdClcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIG51bWJlciwgZ290IFwiIF4gdHlwZV9vZiB2IF4gXCI6IFwiIF4gKG1hdGNoIHYgd2l0aCBEaWN0IGQgLT4gKG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgZCBcIl9fc2lnbmFsXCIgd2l0aCBTb21lIF8gLT4gXCJzaWduYWx7dmFsdWU9XCIgXiAobWF0Y2ggSGFzaHRibC5maW5kX29wdCBkIFwidmFsdWVcIiB3aXRoIFNvbWUgdicgLT4gdmFsdWVfdG9fc3RyaW5nIHYnIHwgTm9uZSAtPiBcIj9cIikgXiBcIn1cIiB8IE5vbmUgLT4gXCJkaWN0XCIpIHwgXyAtPiBcIlwiKSkpXG5cbmxldCBhc19zdHJpbmcgPSBmdW5jdGlvblxuICB8IFN0cmluZyBzIC0+IHNcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIHN0cmluZywgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IHJlYyBhc19saXN0ID0gZnVuY3Rpb25cbiAgfCBMaXN0IGwgLT4gbFxuICB8IExpc3RSZWYgciAtPiAhclxuICB8IE5pbCAtPiBbXVxuICB8IFRodW5rIF8gYXMgdCAtPiBhc19saXN0ICghX3N4X3RyYW1wb2xpbmVfZm4gdClcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIGxpc3QsIGdvdCBcIiBeIHR5cGVfb2YgdikpXG5cbmxldCBhc19ib29sID0gZnVuY3Rpb25cbiAgfCBCb29sIGIgLT4gYlxuICB8IHYgLT4gc3hfdHJ1dGh5IHZcblxubGV0IHJlYyB0b19zdHJpbmcgPSBmdW5jdGlvblxuICB8IFN0cmluZyBzIC0+IHNcbiAgfCBOdW1iZXIgbiAtPlxuICAgIGlmIEZsb2F0LmlzX2ludGVnZXIgbiB0aGVuIHN0cmluZ19vZl9pbnQgKGludF9vZl9mbG9hdCBuKVxuICAgIGVsc2UgUHJpbnRmLnNwcmludGYgXCIlZ1wiIG5cbiAgfCBCb29sIHRydWUgLT4gXCJ0cnVlXCJcbiAgfCBCb29sIGZhbHNlIC0+IFwiZmFsc2VcIlxuICB8IE5pbCAtPiBcIlwiXG4gIHwgU3ltYm9sIHMgLT4gc1xuICB8IEtleXdvcmQgayAtPiBrXG4gIHwgVGh1bmsgXyBhcyB0IC0+IHRvX3N0cmluZyAoIXRyYW1wb2xpbmVfaG9vayB0KVxuICB8IHYgLT4gaW5zcGVjdCB2XG5cbmxldCAoKSA9XG4gICgqID09PSBBcml0aG1ldGljID09PSAqKVxuICByZWdpc3RlciBcIitcIiAoZnVuIGFyZ3MgLT5cbiAgICBOdW1iZXIgKExpc3QuZm9sZF9sZWZ0IChmdW4gYWNjIGEgLT4gYWNjICsuIGFzX251bWJlciBhKSAwLjAgYXJncykpO1xuICByZWdpc3RlciBcIi1cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtdIC0+IE51bWJlciAwLjBcbiAgICB8IFthXSAtPiBOdW1iZXIgKC0uIChhc19udW1iZXIgYSkpXG4gICAgfCBhIDo6IHJlc3QgLT4gTnVtYmVyIChMaXN0LmZvbGRfbGVmdCAoZnVuIGFjYyB4IC0+IGFjYyAtLiBhc19udW1iZXIgeCkgKGFzX251bWJlciBhKSByZXN0KSk7XG4gIHJlZ2lzdGVyIFwiKlwiIChmdW4gYXJncyAtPlxuICAgIE51bWJlciAoTGlzdC5mb2xkX2xlZnQgKGZ1biBhY2MgYSAtPiBhY2MgKi4gYXNfbnVtYmVyIGEpIDEuMCBhcmdzKSk7XG4gIHJlZ2lzdGVyIFwiL1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2E7IGJdIC0+IE51bWJlciAoYXNfbnVtYmVyIGEgLy4gYXNfbnVtYmVyIGIpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiLzogZXhwZWN0ZWQgMiBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCJtb2RcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFthOyBiXSAtPiBOdW1iZXIgKEZsb2F0LnJlbSAoYXNfbnVtYmVyIGEpIChhc19udW1iZXIgYikpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibW9kOiBleHBlY3RlZCAyIGFyZ3NcIikpO1xuICByZWdpc3RlciBcImluY1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gTnVtYmVyIChhc19udW1iZXIgYSArLiAxLjApIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImluYzogMSBhcmdcIikpO1xuICByZWdpc3RlciBcImRlY1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gTnVtYmVyIChhc19udW1iZXIgYSAtLiAxLjApIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImRlYzogMSBhcmdcIikpO1xuICByZWdpc3RlciBcImFic1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gTnVtYmVyIChGbG9hdC5hYnMgKGFzX251bWJlciBhKSkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiYWJzOiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwiZmxvb3JcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IE51bWJlciAoZmxvb3IgKGFzX251bWJlciBhKSlcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJmbG9vcjogMSBhcmdcIikpO1xuICByZWdpc3RlciBcImNlaWxcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IE51bWJlciAoY2VpbCAoYXNfbnVtYmVyIGEpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImNlaWw6IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJyb3VuZFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2FdIC0+IE51bWJlciAoRmxvYXQucm91bmQgKGFzX251bWJlciBhKSlcbiAgICB8IFthOyBiXSAtPlxuICAgICAgbGV0IG4gPSBhc19udW1iZXIgYSBhbmQgcGxhY2VzID0gaW50X29mX2Zsb2F0IChhc19udW1iZXIgYikgaW5cbiAgICAgIGxldCBmYWN0b3IgPSAxMC4wICoqIGZsb2F0X29mX2ludCBwbGFjZXMgaW5cbiAgICAgIE51bWJlciAoRmxvYXQucm91bmQgKG4gKi4gZmFjdG9yKSAvLiBmYWN0b3IpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwicm91bmQ6IDEtMiBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCJtaW5cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtdIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibWluOiBhdCBsZWFzdCAxIGFyZ1wiKVxuICAgIHwgXyAtPiBOdW1iZXIgKExpc3QuZm9sZF9sZWZ0IChmdW4gYWNjIGEgLT4gRmxvYXQubWluIGFjYyAoYXNfbnVtYmVyIGEpKSBGbG9hdC5pbmZpbml0eSBhcmdzKSk7XG4gIHJlZ2lzdGVyIFwibWF4XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbXSAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm1heDogYXQgbGVhc3QgMSBhcmdcIilcbiAgICB8IF8gLT4gTnVtYmVyIChMaXN0LmZvbGRfbGVmdCAoZnVuIGFjYyBhIC0+IEZsb2F0Lm1heCBhY2MgKGFzX251bWJlciBhKSkgRmxvYXQubmVnX2luZmluaXR5IGFyZ3MpKTtcbiAgcmVnaXN0ZXIgXCJzcXJ0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFthXSAtPiBOdW1iZXIgKEZsb2F0LnNxcnQgKGFzX251bWJlciBhKSkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic3FydDogMSBhcmdcIikpO1xuICByZWdpc3RlciBcInBvd1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYTsgYl0gLT4gTnVtYmVyIChhc19udW1iZXIgYSAqKiBhc19udW1iZXIgYilcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJwb3c6IDIgYXJnc1wiKSk7XG4gIHJlZ2lzdGVyIFwiY2xhbXBcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFt4OyBsbzsgaGldIC0+XG4gICAgICBsZXQgeCA9IGFzX251bWJlciB4IGFuZCBsbyA9IGFzX251bWJlciBsbyBhbmQgaGkgPSBhc19udW1iZXIgaGkgaW5cbiAgICAgIE51bWJlciAoRmxvYXQubWF4IGxvIChGbG9hdC5taW4gaGkgeCkpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiY2xhbXA6IDMgYXJnc1wiKSk7XG4gIHJlZ2lzdGVyIFwicGFyc2UtaW50XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIHNdIC0+IChtYXRjaCBpbnRfb2Zfc3RyaW5nX29wdCBzIHdpdGggU29tZSBuIC0+IE51bWJlciAoZmxvYXRfb2ZfaW50IG4pIHwgTm9uZSAtPiBOaWwpXG4gICAgfCBbU3RyaW5nIHM7IGRlZmF1bHRfdmFsXSAtPlxuICAgICAgKG1hdGNoIGludF9vZl9zdHJpbmdfb3B0IHMgd2l0aCBTb21lIG4gLT4gTnVtYmVyIChmbG9hdF9vZl9pbnQgbikgfCBOb25lIC0+IGRlZmF1bHRfdmFsKVxuICAgIHwgW051bWJlciBuXSB8IFtOdW1iZXIgbjsgX10gLT4gTnVtYmVyIChmbG9hdF9vZl9pbnQgKGludF9vZl9mbG9hdCBuKSlcbiAgICB8IFtfOyBkZWZhdWx0X3ZhbF0gLT4gZGVmYXVsdF92YWxcbiAgICB8IF8gLT4gTmlsKTtcbiAgcmVnaXN0ZXIgXCJwYXJzZS1mbG9hdFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBzXSAtPiAobWF0Y2ggZmxvYXRfb2Zfc3RyaW5nX29wdCBzIHdpdGggU29tZSBuIC0+IE51bWJlciBuIHwgTm9uZSAtPiBOaWwpXG4gICAgfCBbTnVtYmVyIG5dIC0+IE51bWJlciBuXG4gICAgfCBfIC0+IE5pbCk7XG5cbiAgKCogPT09IENvbXBhcmlzb24gPT09ICopXG4gICgqIFNhZmUgZXF1YWxpdHk6IHBoeXNpY2FsIGVxdWFsaXR5IGZvciBwb3RlbnRpYWxseS1jaXJjdWxhciB0eXBlc1xuICAgICAoRGljdCwgTGFtYmRhLCBDb21wb25lbnQsIElzbGFuZCwgU2lnbmFsLCBOYXRpdmVGbiksXG4gICAgIHN0cnVjdHVyYWwgZXF1YWxpdHkgZm9yIGFjeWNsaWMgdHlwZXMgKE51bWJlciwgU3RyaW5nLCBCb29sLCBldGMuKS5cbiAgICAgTGlzdHMgYXJlIGNvbXBhcmVkIGVsZW1lbnQtd2lzZSByZWN1cnNpdmVseSB3aXRoIHRoZSBzYW1lIHNhZmV0eS4gKilcbiAgbGV0IHJlYyBzYWZlX2VxIGEgYiA9XG4gICAgaWYgYSA9PSBiIHRoZW4gdHJ1ZSAgKCogcGh5c2ljYWwgZXF1YWxpdHkgZmFzdCBwYXRoICopXG4gICAgZWxzZSBtYXRjaCBhLCBiIHdpdGhcbiAgICB8IE51bWJlciB4LCBOdW1iZXIgeSAtPiB4ID0geVxuICAgIHwgU3RyaW5nIHgsIFN0cmluZyB5IC0+IHggPSB5XG4gICAgfCBCb29sIHgsIEJvb2wgeSAtPiB4ID0geVxuICAgIHwgTmlsLCBOaWwgLT4gdHJ1ZVxuICAgIHwgU3ltYm9sIHgsIFN5bWJvbCB5IC0+IHggPSB5XG4gICAgfCBLZXl3b3JkIHgsIEtleXdvcmQgeSAtPiB4ID0geVxuICAgIHwgKExpc3QgbGEgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsYSB9KSxcbiAgICAgIChMaXN0IGxiIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gbGIgfSkgLT5cbiAgICAgIExpc3QubGVuZ3RoIGxhID0gTGlzdC5sZW5ndGggbGIgJiZcbiAgICAgIExpc3QuZm9yX2FsbDIgc2FmZV9lcSBsYSBsYlxuICAgICgqIERpY3Q6IGNoZWNrIF9faG9zdF9oYW5kbGUgZm9yIERPTSBub2RlIGlkZW50aXR5ICopXG4gICAgfCBEaWN0IGEsIERpY3QgYiAtPlxuICAgICAgKG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgYSBcIl9faG9zdF9oYW5kbGVcIiwgSGFzaHRibC5maW5kX29wdCBiIFwiX19ob3N0X2hhbmRsZVwiIHdpdGhcbiAgICAgICB8IFNvbWUgKE51bWJlciBoYSksIFNvbWUgKE51bWJlciBoYikgLT4gaGEgPSBoYlxuICAgICAgIHwgXyAtPiBmYWxzZSlcbiAgICAoKiBMYW1iZGEvQ29tcG9uZW50L0lzbGFuZC9TaWduYWwvTmF0aXZlRm46IHBoeXNpY2FsIG9ubHkgKilcbiAgICB8IF8gLT4gZmFsc2VcbiAgaW5cbiAgcmVnaXN0ZXIgXCI9XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbYTsgYl0gLT4gQm9vbCAoc2FmZV9lcSBhIGIpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiPTogMiBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCIhPVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2E7IGJdIC0+IEJvb2wgKG5vdCAoc2FmZV9lcSBhIGIpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIiE9OiAyIGFyZ3NcIikpO1xuICByZWdpc3RlciBcIjxcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgYTsgU3RyaW5nIGJdIC0+IEJvb2wgKGEgPCBiKVxuICAgIHwgW2E7IGJdIC0+IEJvb2wgKGFzX251bWJlciBhIDwgYXNfbnVtYmVyIGIpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiPDogMiBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCI+XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIGE7IFN0cmluZyBiXSAtPiBCb29sIChhID4gYilcbiAgICB8IFthOyBiXSAtPiBCb29sIChhc19udW1iZXIgYSA+IGFzX251bWJlciBiKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIj46IDIgYXJnc1wiKSk7XG4gIHJlZ2lzdGVyIFwiPD1cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgYTsgU3RyaW5nIGJdIC0+IEJvb2wgKGEgPD0gYilcbiAgICB8IFthOyBiXSAtPiBCb29sIChhc19udW1iZXIgYSA8PSBhc19udW1iZXIgYilcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCI8PTogMiBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCI+PVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBhOyBTdHJpbmcgYl0gLT4gQm9vbCAoYSA+PSBiKVxuICAgIHwgW2E7IGJdIC0+IEJvb2wgKGFzX251bWJlciBhID49IGFzX251bWJlciBiKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIj49OiAyIGFyZ3NcIikpO1xuXG4gICgqID09PSBMb2dpYyA9PT0gKilcbiAgcmVnaXN0ZXIgXCJub3RcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IEJvb2wgKG5vdCAoc3hfdHJ1dGh5IGEpKSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJub3Q6IDEgYXJnXCIpKTtcblxuICAoKiA9PT0gUHJlZGljYXRlcyA9PT0gKilcbiAgcmVnaXN0ZXIgXCJuaWw/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFthXSAtPiBCb29sIChpc19uaWwgYSkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibmlsPzogMSBhcmdcIikpO1xuICByZWdpc3RlciBcIm51bWJlcj9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW051bWJlciBfXSAtPiBCb29sIHRydWUgfCBbX10gLT4gQm9vbCBmYWxzZSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJudW1iZXI/OiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwic3RyaW5nP1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbU3RyaW5nIF9dIC0+IEJvb2wgdHJ1ZSB8IFtfXSAtPiBCb29sIGZhbHNlIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInN0cmluZz86IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJib29sZWFuP1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbQm9vbCBfXSAtPiBCb29sIHRydWUgfCBbX10gLT4gQm9vbCBmYWxzZSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJib29sZWFuPzogMSBhcmdcIikpO1xuICByZWdpc3RlciBcImxpc3Q/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtMaXN0IF9dIHwgW0xpc3RSZWYgX10gLT4gQm9vbCB0cnVlIHwgW19dIC0+IEJvb2wgZmFsc2UgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibGlzdD86IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJkaWN0P1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbRGljdCBfXSAtPiBCb29sIHRydWUgfCBbX10gLT4gQm9vbCBmYWxzZSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJkaWN0PzogMSBhcmdcIikpO1xuICByZWdpc3RlciBcInN5bWJvbD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW1N5bWJvbCBfXSAtPiBCb29sIHRydWUgfCBbX10gLT4gQm9vbCBmYWxzZSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzeW1ib2w/OiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwia2V5d29yZD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW0tleXdvcmQgX10gLT4gQm9vbCB0cnVlIHwgW19dIC0+IEJvb2wgZmFsc2UgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwia2V5d29yZD86IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJlbXB0eT9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0IFtdXSB8IFtMaXN0UmVmIHsgY29udGVudHMgPSBbXSB9XSAtPiBCb29sIHRydWVcbiAgICB8IFtMaXN0IF9dIHwgW0xpc3RSZWYgX10gLT4gQm9vbCBmYWxzZVxuICAgIHwgW1N0cmluZyBcIlwiXSAtPiBCb29sIHRydWUgfCBbU3RyaW5nIF9dIC0+IEJvb2wgZmFsc2VcbiAgICB8IFtEaWN0IGRdIC0+IEJvb2wgKEhhc2h0YmwubGVuZ3RoIGQgPSAwKVxuICAgIHwgW05pbF0gLT4gQm9vbCB0cnVlXG4gICAgfCBbX10gLT4gQm9vbCBmYWxzZVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImVtcHR5PzogMSBhcmdcIikpO1xuICByZWdpc3RlciBcIm9kZD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IEJvb2wgKGludF9vZl9mbG9hdCAoYXNfbnVtYmVyIGEpIG1vZCAyIDw+IDApIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm9kZD86IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJldmVuP1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gQm9vbCAoaW50X29mX2Zsb2F0IChhc19udW1iZXIgYSkgbW9kIDIgPSAwKSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJldmVuPzogMSBhcmdcIikpO1xuICByZWdpc3RlciBcInplcm8/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFthXSAtPiBCb29sIChhc19udW1iZXIgYSA9IDAuMCkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiemVybz86IDEgYXJnXCIpKTtcblxuICAoKiA9PT0gU3RyaW5ncyA9PT0gKilcbiAgcmVnaXN0ZXIgXCJzdHJcIiAoZnVuIGFyZ3MgLT4gU3RyaW5nIChTdHJpbmcuY29uY2F0IFwiXCIgKExpc3QubWFwIHRvX3N0cmluZyBhcmdzKSkpO1xuICByZWdpc3RlciBcInVwcGVyXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFthXSAtPiBTdHJpbmcgKFN0cmluZy51cHBlcmNhc2VfYXNjaWkgKGFzX3N0cmluZyBhKSkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwidXBwZXI6IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJ1cGNhc2VcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IFN0cmluZyAoU3RyaW5nLnVwcGVyY2FzZV9hc2NpaSAoYXNfc3RyaW5nIGEpKSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJ1cGNhc2U6IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJsb3dlclwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gU3RyaW5nIChTdHJpbmcubG93ZXJjYXNlX2FzY2lpIChhc19zdHJpbmcgYSkpIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImxvd2VyOiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwiZG93bmNhc2VcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IFN0cmluZyAoU3RyaW5nLmxvd2VyY2FzZV9hc2NpaSAoYXNfc3RyaW5nIGEpKSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJkb3duY2FzZTogMSBhcmdcIikpO1xuICByZWdpc3RlciBcInRyaW1cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IFN0cmluZyAoU3RyaW5nLnRyaW0gKGFzX3N0cmluZyBhKSkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwidHJpbTogMSBhcmdcIikpO1xuICByZWdpc3RlciBcInN0cmluZy1sZW5ndGhcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IE51bWJlciAoZmxvYXRfb2ZfaW50IChTdHJpbmcubGVuZ3RoIChhc19zdHJpbmcgYSkpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInN0cmluZy1sZW5ndGg6IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJzdHJpbmctY29udGFpbnM/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIGhheXN0YWNrOyBTdHJpbmcgbmVlZGxlXSAtPlxuICAgICAgbGV0IHJlYyBmaW5kIGkgPVxuICAgICAgICBpZiBpICsgU3RyaW5nLmxlbmd0aCBuZWVkbGUgPiBTdHJpbmcubGVuZ3RoIGhheXN0YWNrIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBpZiBTdHJpbmcuc3ViIGhheXN0YWNrIGkgKFN0cmluZy5sZW5ndGggbmVlZGxlKSA9IG5lZWRsZSB0aGVuIHRydWVcbiAgICAgICAgZWxzZSBmaW5kIChpICsgMSlcbiAgICAgIGluIEJvb2wgKGZpbmQgMClcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzdHJpbmctY29udGFpbnM/OiAyIHN0cmluZyBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCJzdGFydHMtd2l0aD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgczsgU3RyaW5nIHByZWZpeF0gLT5cbiAgICAgIEJvb2wgKFN0cmluZy5sZW5ndGggcyA+PSBTdHJpbmcubGVuZ3RoIHByZWZpeCAmJlxuICAgICAgICAgICAgU3RyaW5nLnN1YiBzIDAgKFN0cmluZy5sZW5ndGggcHJlZml4KSA9IHByZWZpeClcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzdGFydHMtd2l0aD86IDIgc3RyaW5nIGFyZ3NcIikpO1xuICByZWdpc3RlciBcImVuZHMtd2l0aD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgczsgU3RyaW5nIHN1ZmZpeF0gLT5cbiAgICAgIGxldCBzbCA9IFN0cmluZy5sZW5ndGggcyBhbmQgeGwgPSBTdHJpbmcubGVuZ3RoIHN1ZmZpeCBpblxuICAgICAgQm9vbCAoc2wgPj0geGwgJiYgU3RyaW5nLnN1YiBzIChzbCAtIHhsKSB4bCA9IHN1ZmZpeClcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJlbmRzLXdpdGg/OiAyIHN0cmluZyBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCJpbmRleC1vZlwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBoYXlzdGFjazsgU3RyaW5nIG5lZWRsZV0gLT5cbiAgICAgIGxldCBubCA9IFN0cmluZy5sZW5ndGggbmVlZGxlIGFuZCBobCA9IFN0cmluZy5sZW5ndGggaGF5c3RhY2sgaW5cbiAgICAgIGxldCByZWMgZmluZCBpID1cbiAgICAgICAgaWYgaSArIG5sID4gaGwgdGhlbiBOdW1iZXIgKC0xLjApXG4gICAgICAgIGVsc2UgaWYgU3RyaW5nLnN1YiBoYXlzdGFjayBpIG5sID0gbmVlZGxlIHRoZW4gTnVtYmVyIChmbG9hdF9vZl9pbnQgaSlcbiAgICAgICAgZWxzZSBmaW5kIChpICsgMSlcbiAgICAgIGluIGZpbmQgMFxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImluZGV4LW9mOiAyIHN0cmluZyBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCJzdWJzdHJpbmdcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgczsgTnVtYmVyIHN0YXJ0OyBOdW1iZXIgZW5kX10gLT5cbiAgICAgIGxldCBpID0gaW50X29mX2Zsb2F0IHN0YXJ0IGFuZCBqID0gaW50X29mX2Zsb2F0IGVuZF8gaW5cbiAgICAgIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIHMgaW5cbiAgICAgIGxldCBpID0gbWF4IDAgKG1pbiBpIGxlbikgYW5kIGogPSBtYXggMCAobWluIGogbGVuKSBpblxuICAgICAgU3RyaW5nIChTdHJpbmcuc3ViIHMgaSAobWF4IDAgKGogLSBpKSkpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic3Vic3RyaW5nOiAzIGFyZ3NcIikpO1xuICByZWdpc3RlciBcInN1YnN0clwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBzOyBOdW1iZXIgc3RhcnQ7IE51bWJlciBsZW5dIC0+XG4gICAgICBsZXQgaSA9IGludF9vZl9mbG9hdCBzdGFydCBhbmQgbiA9IGludF9vZl9mbG9hdCBsZW4gaW5cbiAgICAgIGxldCBzbCA9IFN0cmluZy5sZW5ndGggcyBpblxuICAgICAgbGV0IGkgPSBtYXggMCAobWluIGkgc2wpIGluXG4gICAgICBsZXQgbiA9IG1heCAwIChtaW4gbiAoc2wgLSBpKSkgaW5cbiAgICAgIFN0cmluZyAoU3RyaW5nLnN1YiBzIGkgbilcbiAgICB8IFtTdHJpbmcgczsgTnVtYmVyIHN0YXJ0XSAtPlxuICAgICAgbGV0IGkgPSBpbnRfb2ZfZmxvYXQgc3RhcnQgaW5cbiAgICAgIGxldCBzbCA9IFN0cmluZy5sZW5ndGggcyBpblxuICAgICAgbGV0IGkgPSBtYXggMCAobWluIGkgc2wpIGluXG4gICAgICBTdHJpbmcgKFN0cmluZy5zdWIgcyBpIChzbCAtIGkpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInN1YnN0cjogMi0zIGFyZ3NcIikpO1xuICByZWdpc3RlciBcInNwbGl0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIHM7IFN0cmluZyBzZXBdIC0+XG4gICAgICBMaXN0IChMaXN0Lm1hcCAoZnVuIHAgLT4gU3RyaW5nIHApIChTdHJpbmcuc3BsaXRfb25fY2hhciBzZXAuWzBdIHMpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInNwbGl0OiAyIGFyZ3NcIikpO1xuICByZWdpc3RlciBcImpvaW5cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgc2VwOyAoTGlzdCBpdGVtcyB8IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0pXSAtPlxuICAgICAgU3RyaW5nIChTdHJpbmcuY29uY2F0IHNlcCAoTGlzdC5tYXAgdG9fc3RyaW5nIGl0ZW1zKSlcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJqb2luOiAyIGFyZ3NcIikpO1xuICByZWdpc3RlciBcInJlcGxhY2VcIiAoZnVuIGFyZ3MgLT5cbiAgICBsZXQgdG9fc3RyID0gZnVuY3Rpb25cbiAgICAgIHwgU3RyaW5nIHMgLT4gcyB8IFN4RXhwciBzIC0+IHMgfCBSYXdIVE1MIHMgLT4gc1xuICAgICAgfCBLZXl3b3JkIGsgLT4gayB8IFN5bWJvbCBzIC0+IHNcbiAgICAgIHwgTmlsIC0+IFwiXCIgfCBCb29sIHRydWUgLT4gXCJ0cnVlXCIgfCBCb29sIGZhbHNlIC0+IFwiZmFsc2VcIlxuICAgICAgfCBOdW1iZXIgbiAtPiBpZiBGbG9hdC5pc19pbnRlZ2VyIG4gdGhlbiBzdHJpbmdfb2ZfaW50IChpbnRfb2ZfZmxvYXQgbikgZWxzZSBQcmludGYuc3ByaW50ZiBcIiVnXCIgblxuICAgICAgfCBUaHVuayBfIGFzIHQgLT4gKG1hdGNoICFfc3hfdHJhbXBvbGluZV9mbiB0IHdpdGggU3RyaW5nIHMgLT4gcyB8IHYgLT4gdG9fc3RyaW5nIHYpXG4gICAgICB8IHYgLT4gdG9fc3RyaW5nIHZcbiAgICBpblxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW3M7IG9sZF9zOyBuZXdfc10gLT5cbiAgICAgIGxldCBzID0gdG9fc3RyIHMgYW5kIG9sZF9zID0gdG9fc3RyIG9sZF9zIGFuZCBuZXdfcyA9IHRvX3N0ciBuZXdfcyBpblxuICAgICAgbGV0IG9sID0gU3RyaW5nLmxlbmd0aCBvbGRfcyBpblxuICAgICAgaWYgb2wgPSAwIHRoZW4gU3RyaW5nIHNcbiAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgbGV0IGJ1ZiA9IEJ1ZmZlci5jcmVhdGUgKFN0cmluZy5sZW5ndGggcykgaW5cbiAgICAgICAgbGV0IHJlYyBnbyBpID1cbiAgICAgICAgICBpZiBpID49IFN0cmluZy5sZW5ndGggcyB0aGVuICgpXG4gICAgICAgICAgZWxzZSBpZiBpICsgb2wgPD0gU3RyaW5nLmxlbmd0aCBzICYmIFN0cmluZy5zdWIgcyBpIG9sID0gb2xkX3MgdGhlbiBiZWdpblxuICAgICAgICAgICAgQnVmZmVyLmFkZF9zdHJpbmcgYnVmIG5ld19zO1xuICAgICAgICAgICAgZ28gKGkgKyBvbClcbiAgICAgICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICAgICAgQnVmZmVyLmFkZF9jaGFyIGJ1ZiBzLltpXTtcbiAgICAgICAgICAgIGdvIChpICsgMSlcbiAgICAgICAgICBlbmRcbiAgICAgICAgaW4gZ28gMDtcbiAgICAgICAgU3RyaW5nIChCdWZmZXIuY29udGVudHMgYnVmKVxuICAgICAgZW5kXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwicmVwbGFjZTogMyBzdHJpbmcgYXJnc1wiKSk7XG4gIHJlZ2lzdGVyIFwiY2hhci1mcm9tLWNvZGVcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtOdW1iZXIgbl0gLT5cbiAgICAgIGxldCBidWYgPSBCdWZmZXIuY3JlYXRlIDQgaW5cbiAgICAgIEJ1ZmZlci5hZGRfdXRmXzhfdWNoYXIgYnVmIChVY2hhci5vZl9pbnQgKGludF9vZl9mbG9hdCBuKSk7XG4gICAgICBTdHJpbmcgKEJ1ZmZlci5jb250ZW50cyBidWYpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiY2hhci1mcm9tLWNvZGU6IDEgYXJnXCIpKTtcblxuICAoKiA9PT0gQ29sbGVjdGlvbnMgPT09ICopXG4gIHJlZ2lzdGVyIFwibGlzdFwiIChmdW4gYXJncyAtPiBMaXN0UmVmIChyZWYgYXJncykpO1xuICByZWdpc3RlciBcImxlblwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0xpc3QgbF0gfCBbTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9XSAtPiBOdW1iZXIgKGZsb2F0X29mX2ludCAoTGlzdC5sZW5ndGggbCkpXG4gICAgfCBbU3RyaW5nIHNdIC0+IE51bWJlciAoZmxvYXRfb2ZfaW50IChTdHJpbmcubGVuZ3RoIHMpKVxuICAgIHwgW0RpY3QgZF0gLT4gTnVtYmVyIChmbG9hdF9vZl9pbnQgKEhhc2h0YmwubGVuZ3RoIGQpKVxuICAgIHwgW05pbF0gfCBbQm9vbCBmYWxzZV0gLT4gTnVtYmVyIDAuMFxuICAgIHwgW0Jvb2wgdHJ1ZV0gLT4gTnVtYmVyIDEuMFxuICAgIHwgW051bWJlciBfXSAtPiBOdW1iZXIgMS4wXG4gICAgfCBbUmF3SFRNTCBzXSAtPiBOdW1iZXIgKGZsb2F0X29mX2ludCAoU3RyaW5nLmxlbmd0aCBzKSlcbiAgICB8IFtTeEV4cHIgc10gLT4gTnVtYmVyIChmbG9hdF9vZl9pbnQgKFN0cmluZy5sZW5ndGggcykpXG4gICAgfCBbU3ByZWFkIHBhaXJzXSAtPiBOdW1iZXIgKGZsb2F0X29mX2ludCAoTGlzdC5sZW5ndGggcGFpcnMpKVxuICAgIHwgW0NvbXBvbmVudCBfXSB8IFtJc2xhbmQgX10gfCBbTGFtYmRhIF9dIHwgW05hdGl2ZUZuIF9dXG4gICAgfCBbTWFjcm8gX10gfCBbVGh1bmsgX10gfCBbS2V5d29yZCBfXSB8IFtTeW1ib2wgX10gLT4gTnVtYmVyIDAuMFxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciAoUHJpbnRmLnNwcmludGYgXCJsZW46ICVkIGFyZ3NcIlxuICAgICAgICAoTGlzdC5sZW5ndGggYXJncykpKSk7XG4gIHJlZ2lzdGVyIFwiZmlyc3RcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0ICh4IDo6IF8pXSB8IFtMaXN0UmVmIHsgY29udGVudHMgPSB4IDo6IF8gfV0gLT4geFxuICAgIHwgW0xpc3QgW11dIHwgW0xpc3RSZWYgeyBjb250ZW50cyA9IFtdIH1dIC0+IE5pbCB8IFtOaWxdIC0+IE5pbFxuICAgIHwgW3hdIC0+IHJhaXNlIChFdmFsX2Vycm9yIChcImZpcnN0OiBleHBlY3RlZCBsaXN0LCBnb3QgXCIgXiBpbnNwZWN0IHgpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImZpcnN0OiAxIGxpc3QgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJyZXN0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTGlzdCAoXyA6OiB4cyldIHwgW0xpc3RSZWYgeyBjb250ZW50cyA9IF8gOjogeHMgfV0gLT4gTGlzdCB4c1xuICAgIHwgW0xpc3QgW11dIHwgW0xpc3RSZWYgeyBjb250ZW50cyA9IFtdIH1dIC0+IExpc3QgW10gfCBbTmlsXSAtPiBMaXN0IFtdXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwicmVzdDogMSBsaXN0IGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwibGFzdFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0xpc3QgbF0gfCBbTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9XSAtPlxuICAgICAgKG1hdGNoIExpc3QucmV2IGwgd2l0aCB4IDo6IF8gLT4geCB8IFtdIC0+IE5pbClcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJsYXN0OiAxIGxpc3QgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJpbml0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTGlzdCBsXSB8IFtMaXN0UmVmIHsgY29udGVudHMgPSBsIH1dIC0+XG4gICAgICAobWF0Y2ggTGlzdC5yZXYgbCB3aXRoIF8gOjogcmVzdCAtPiBMaXN0IChMaXN0LnJldiByZXN0KSB8IFtdIC0+IExpc3QgW10pXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiaW5pdDogMSBsaXN0IGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwibnRoXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTGlzdCBsOyBOdW1iZXIgbl0gfCBbTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9OyBOdW1iZXIgbl0gLT5cbiAgICAgICh0cnkgTGlzdC5udGggbCAoaW50X29mX2Zsb2F0IG4pIHdpdGggXyAtPiBOaWwpXG4gICAgfCBbU3RyaW5nIHM7IE51bWJlciBuXSAtPlxuICAgICAgbGV0IGkgPSBpbnRfb2ZfZmxvYXQgbiBpblxuICAgICAgaWYgaSA+PSAwICYmIGkgPCBTdHJpbmcubGVuZ3RoIHMgdGhlbiBTdHJpbmcgKFN0cmluZy5tYWtlIDEgcy5baV0pXG4gICAgICBlbHNlIE5pbFxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm50aDogbGlzdC9zdHJpbmcgYW5kIG51bWJlclwiKSk7XG4gIHJlZ2lzdGVyIFwiY29uc1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW3g7IExpc3QgbF0gfCBbeDsgTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9XSAtPiBMaXN0ICh4IDo6IGwpXG4gICAgfCBbeDsgTmlsXSAtPiBMaXN0IFt4XVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImNvbnM6IHZhbHVlIGFuZCBsaXN0XCIpKTtcbiAgcmVnaXN0ZXIgXCJhcHBlbmRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0IGxhIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gbGEgfTsgTGlzdCBsYiB8IExpc3RSZWYgeyBjb250ZW50cyA9IGxiIH1dIC0+XG4gICAgICBMaXN0IChsYSBAIGxiKVxuICAgIHwgW0xpc3QgbGEgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsYSB9OyBOaWxdIC0+IExpc3QgbGFcbiAgICB8IFtOaWw7IExpc3QgbGIgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsYiB9XSAtPiBMaXN0IGxiXG4gICAgfCBbTGlzdCBsYSB8IExpc3RSZWYgeyBjb250ZW50cyA9IGxhIH07IHZdIC0+IExpc3QgKGxhIEAgW3ZdKVxuICAgIHwgW3Y7IExpc3QgbGIgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsYiB9XSAtPiBMaXN0IChbdl0gQCBsYilcbiAgICB8IF8gLT5cbiAgICAgIGxldCBhbGwgPSBMaXN0LmNvbmNhdF9tYXAgYXNfbGlzdCBhcmdzIGluXG4gICAgICBMaXN0IGFsbCk7XG4gIHJlZ2lzdGVyIFwicmV2ZXJzZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0xpc3QgbF0gfCBbTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9XSAtPiBMaXN0IChMaXN0LnJldiBsKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInJldmVyc2U6IDEgbGlzdFwiKSk7XG4gIHJlZ2lzdGVyIFwiZmxhdHRlblwiIChmdW4gYXJncyAtPlxuICAgIGxldCByZWMgZmxhdCA9IGZ1bmN0aW9uXG4gICAgICB8IExpc3QgaXRlbXMgfCBMaXN0UmVmIHsgY29udGVudHMgPSBpdGVtcyB9IC0+IExpc3QuY29uY2F0X21hcCBmbGF0IGl0ZW1zXG4gICAgICB8IHggLT4gW3hdXG4gICAgaW5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0IGxdIHwgW0xpc3RSZWYgeyBjb250ZW50cyA9IGwgfV0gLT4gTGlzdCAoTGlzdC5jb25jYXRfbWFwIGZsYXQgbClcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJmbGF0dGVuOiAxIGxpc3RcIikpO1xuICByZWdpc3RlciBcImNvbmNhdFwiIChmdW4gYXJncyAtPiBMaXN0IChMaXN0LmNvbmNhdF9tYXAgYXNfbGlzdCBhcmdzKSk7XG4gIHJlZ2lzdGVyIFwiY29udGFpbnM/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTGlzdCBsOyBpdGVtXSB8IFtMaXN0UmVmIHsgY29udGVudHMgPSBsIH07IGl0ZW1dIC0+XG4gICAgICAoKiBQaHlzaWNhbCBlcXVhbGl0eSBmaXJzdCAoaGFuZGxlcyBzaWduYWxzL2RpY3RzL2Nsb3N1cmVzIHNhZmVseSksXG4gICAgICAgICBzdHJ1Y3R1cmFsIGZhbGxiYWNrIG9ubHkgZm9yIGFjeWNsaWMgdHlwZXMgKHN0cmluZy9udW1iZXIvYm9vbC9uaWwvc3ltYm9sL2tleXdvcmQpICopXG4gICAgICBsZXQgc2FmZV9lcSBhIGIgPVxuICAgICAgICBhID09IGIgfHxcbiAgICAgICAgKG1hdGNoIGEsIGIgd2l0aFxuICAgICAgICAgfCBOdW1iZXIgeCwgTnVtYmVyIHkgLT4geCA9IHlcbiAgICAgICAgIHwgU3RyaW5nIHgsIFN0cmluZyB5IC0+IHggPSB5XG4gICAgICAgICB8IEJvb2wgeCwgQm9vbCB5IC0+IHggPSB5XG4gICAgICAgICB8IE5pbCwgTmlsIC0+IHRydWVcbiAgICAgICAgIHwgU3ltYm9sIHgsIFN5bWJvbCB5IC0+IHggPSB5XG4gICAgICAgICB8IEtleXdvcmQgeCwgS2V5d29yZCB5IC0+IHggPSB5XG4gICAgICAgICB8IERpY3QgYSwgRGljdCBiIC0+XG4gICAgICAgICAgIChtYXRjaCBIYXNodGJsLmZpbmRfb3B0IGEgXCJfX2hvc3RfaGFuZGxlXCIsIEhhc2h0YmwuZmluZF9vcHQgYiBcIl9faG9zdF9oYW5kbGVcIiB3aXRoXG4gICAgICAgICAgICB8IFNvbWUgKE51bWJlciBoYSksIFNvbWUgKE51bWJlciBoYikgLT4gaGEgPSBoYlxuICAgICAgICAgICAgfCBfIC0+IGZhbHNlKVxuICAgICAgICAgfCBfIC0+IGZhbHNlKVxuICAgICAgaW5cbiAgICAgIEJvb2wgKExpc3QuZXhpc3RzIChmdW4geCAtPiBzYWZlX2VxIHggaXRlbSkgbClcbiAgICB8IFtTdHJpbmcgczsgU3RyaW5nIHN1Yl0gLT5cbiAgICAgIGxldCByZWMgZmluZCBpID1cbiAgICAgICAgaWYgaSArIFN0cmluZy5sZW5ndGggc3ViID4gU3RyaW5nLmxlbmd0aCBzIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBpZiBTdHJpbmcuc3ViIHMgaSAoU3RyaW5nLmxlbmd0aCBzdWIpID0gc3ViIHRoZW4gdHJ1ZVxuICAgICAgICBlbHNlIGZpbmQgKGkgKyAxKVxuICAgICAgaW4gQm9vbCAoZmluZCAwKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImNvbnRhaW5zPzogMiBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCJyYW5nZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW051bWJlciBzdG9wXSAtPlxuICAgICAgbGV0IG4gPSBpbnRfb2ZfZmxvYXQgc3RvcCBpblxuICAgICAgTGlzdCAoTGlzdC5pbml0IChtYXggMCBuKSAoZnVuIGkgLT4gTnVtYmVyIChmbG9hdF9vZl9pbnQgaSkpKVxuICAgIHwgW051bWJlciBzdGFydDsgTnVtYmVyIHN0b3BdIC0+XG4gICAgICBsZXQgcyA9IGludF9vZl9mbG9hdCBzdGFydCBhbmQgZSA9IGludF9vZl9mbG9hdCBzdG9wIGluXG4gICAgICBsZXQgbGVuID0gbWF4IDAgKGUgLSBzKSBpblxuICAgICAgTGlzdCAoTGlzdC5pbml0IGxlbiAoZnVuIGkgLT4gTnVtYmVyIChmbG9hdF9vZl9pbnQgKHMgKyBpKSkpKVxuICAgIHwgW051bWJlciBzdGFydDsgTnVtYmVyIHN0b3A7IE51bWJlciBzdGVwXSAtPlxuICAgICAgbGV0IHMgPSBzdGFydCBhbmQgZSA9IHN0b3AgYW5kIHN0ID0gc3RlcCBpblxuICAgICAgaWYgc3QgPSAwLjAgdGhlbiBMaXN0IFtdXG4gICAgICBlbHNlXG4gICAgICAgIGxldCBpdGVtcyA9IHJlZiBbXSBpblxuICAgICAgICBsZXQgaSA9IHJlZiBzIGluXG4gICAgICAgIGlmIHN0ID4gMC4wIHRoZW5cbiAgICAgICAgICAod2hpbGUgIWkgPCBlIGRvIGl0ZW1zIDo9IE51bWJlciAhaSA6OiAhaXRlbXM7IGkgOj0gIWkgKy4gc3QgZG9uZSlcbiAgICAgICAgZWxzZVxuICAgICAgICAgICh3aGlsZSAhaSA+IGUgZG8gaXRlbXMgOj0gTnVtYmVyICFpIDo6ICFpdGVtczsgaSA6PSAhaSArLiBzdCBkb25lKTtcbiAgICAgICAgTGlzdCAoTGlzdC5yZXYgIWl0ZW1zKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInJhbmdlOiAxLTMgYXJnc1wiKSk7XG4gIHJlZ2lzdGVyIFwic2xpY2VcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFsoTGlzdCBsIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9KTsgTnVtYmVyIHN0YXJ0XSAtPlxuICAgICAgbGV0IGkgPSBtYXggMCAoaW50X29mX2Zsb2F0IHN0YXJ0KSBpblxuICAgICAgbGV0IHJlYyBkcm9wIG4gPSBmdW5jdGlvbiBfIDo6IHhzIHdoZW4gbiA+IDAgLT4gZHJvcCAobi0xKSB4cyB8IGwgLT4gbCBpblxuICAgICAgTGlzdCAoZHJvcCBpIGwpXG4gICAgfCBbKExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSk7IE51bWJlciBzdGFydDsgTnVtYmVyIGVuZF9dIC0+XG4gICAgICBsZXQgaSA9IG1heCAwIChpbnRfb2ZfZmxvYXQgc3RhcnQpIGFuZCBqID0gaW50X29mX2Zsb2F0IGVuZF8gaW5cbiAgICAgIGxldCBsZW4gPSBMaXN0Lmxlbmd0aCBsIGluXG4gICAgICBsZXQgaiA9IG1pbiBqIGxlbiBpblxuICAgICAgbGV0IHJlYyB0YWtlX3JhbmdlIGlkeCA9IGZ1bmN0aW9uXG4gICAgICAgIHwgW10gLT4gW11cbiAgICAgICAgfCB4IDo6IHhzIC0+XG4gICAgICAgICAgaWYgaWR4ID49IGogdGhlbiBbXVxuICAgICAgICAgIGVsc2UgaWYgaWR4ID49IGkgdGhlbiB4IDo6IHRha2VfcmFuZ2UgKGlkeCsxKSB4c1xuICAgICAgICAgIGVsc2UgdGFrZV9yYW5nZSAoaWR4KzEpIHhzXG4gICAgICBpbiBMaXN0ICh0YWtlX3JhbmdlIDAgbClcbiAgICB8IFtTdHJpbmcgczsgTnVtYmVyIHN0YXJ0XSAtPlxuICAgICAgbGV0IGkgPSBtYXggMCAoaW50X29mX2Zsb2F0IHN0YXJ0KSBpblxuICAgICAgU3RyaW5nIChTdHJpbmcuc3ViIHMgaSAobWF4IDAgKFN0cmluZy5sZW5ndGggcyAtIGkpKSlcbiAgICB8IFtTdHJpbmcgczsgTnVtYmVyIHN0YXJ0OyBOdW1iZXIgZW5kX10gLT5cbiAgICAgIGxldCBpID0gbWF4IDAgKGludF9vZl9mbG9hdCBzdGFydCkgYW5kIGogPSBpbnRfb2ZfZmxvYXQgZW5kXyBpblxuICAgICAgbGV0IHNsID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gICAgICBsZXQgaiA9IG1pbiBqIHNsIGluXG4gICAgICBTdHJpbmcgKFN0cmluZy5zdWIgcyBpIChtYXggMCAoaiAtIGkpKSlcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzbGljZTogMi0zIGFyZ3NcIikpO1xuICByZWdpc3RlciBcInNvcnRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0IGxdIHwgW0xpc3RSZWYgeyBjb250ZW50cyA9IGwgfV0gLT4gTGlzdCAoTGlzdC5zb3J0IGNvbXBhcmUgbClcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzb3J0OiAxIGxpc3RcIikpO1xuICByZWdpc3RlciBcInppcFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2E7IGJdIC0+XG4gICAgICBsZXQgbGEgPSBhc19saXN0IGEgYW5kIGxiID0gYXNfbGlzdCBiIGluXG4gICAgICBsZXQgcmVjIGdvIGwxIGwyIGFjYyA9IG1hdGNoIGwxLCBsMiB3aXRoXG4gICAgICAgIHwgeCA6OiB4cywgeSA6OiB5cyAtPiBnbyB4cyB5cyAoTGlzdCBbeDsgeV0gOjogYWNjKVxuICAgICAgICB8IF8gLT4gTGlzdC5yZXYgYWNjXG4gICAgICBpbiBMaXN0IChnbyBsYSBsYiBbXSlcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJ6aXA6IDIgbGlzdHNcIikpO1xuICByZWdpc3RlciBcInppcC1wYWlyc1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW3ZdIC0+XG4gICAgICBsZXQgbCA9IGFzX2xpc3QgdiBpblxuICAgICAgbGV0IHJlYyBnbyA9IGZ1bmN0aW9uXG4gICAgICAgIHwgYSA6OiBiIDo6IHJlc3QgLT4gTGlzdCBbYTsgYl0gOjogZ28gcmVzdFxuICAgICAgICB8IF8gLT4gW11cbiAgICAgIGluIExpc3QgKGdvIGwpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiemlwLXBhaXJzOiAxIGxpc3RcIikpO1xuICByZWdpc3RlciBcInRha2VcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFsoTGlzdCBsIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9KTsgTnVtYmVyIG5dIC0+XG4gICAgICBsZXQgcmVjIHRha2VfbiBpID0gZnVuY3Rpb25cbiAgICAgICAgfCB4IDo6IHhzIHdoZW4gaSA+IDAgLT4geCA6OiB0YWtlX24gKGktMSkgeHNcbiAgICAgICAgfCBfIC0+IFtdXG4gICAgICBpbiBMaXN0ICh0YWtlX24gKGludF9vZl9mbG9hdCBuKSBsKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInRha2U6IGxpc3QgYW5kIG51bWJlclwiKSk7XG4gIHJlZ2lzdGVyIFwiZHJvcFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgWyhMaXN0IGwgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsIH0pOyBOdW1iZXIgbl0gLT5cbiAgICAgIGxldCByZWMgZHJvcF9uIGkgPSBmdW5jdGlvblxuICAgICAgICB8IF8gOjogeHMgd2hlbiBpID4gMCAtPiBkcm9wX24gKGktMSkgeHNcbiAgICAgICAgfCBsIC0+IGxcbiAgICAgIGluIExpc3QgKGRyb3BfbiAoaW50X29mX2Zsb2F0IG4pIGwpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZHJvcDogbGlzdCBhbmQgbnVtYmVyXCIpKTtcbiAgcmVnaXN0ZXIgXCJjaHVuay1ldmVyeVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgWyhMaXN0IGwgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsIH0pOyBOdW1iZXIgbl0gLT5cbiAgICAgIGxldCBzaXplID0gaW50X29mX2Zsb2F0IG4gaW5cbiAgICAgIGxldCByZWMgZ28gPSBmdW5jdGlvblxuICAgICAgICB8IFtdIC0+IFtdXG4gICAgICAgIHwgbCAtPlxuICAgICAgICAgIGxldCByZWMgdGFrZV9uIGkgPSBmdW5jdGlvblxuICAgICAgICAgICAgfCB4IDo6IHhzIHdoZW4gaSA+IDAgLT4geCA6OiB0YWtlX24gKGktMSkgeHNcbiAgICAgICAgICAgIHwgXyAtPiBbXVxuICAgICAgICAgIGluXG4gICAgICAgICAgbGV0IHJlYyBkcm9wX24gaSA9IGZ1bmN0aW9uXG4gICAgICAgICAgICB8IF8gOjogeHMgd2hlbiBpID4gMCAtPiBkcm9wX24gKGktMSkgeHNcbiAgICAgICAgICAgIHwgbCAtPiBsXG4gICAgICAgICAgaW5cbiAgICAgICAgICBMaXN0ICh0YWtlX24gc2l6ZSBsKSA6OiBnbyAoZHJvcF9uIHNpemUgbClcbiAgICAgIGluIExpc3QgKGdvIGwpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiY2h1bmstZXZlcnk6IGxpc3QgYW5kIG51bWJlclwiKSk7XG4gIHJlZ2lzdGVyIFwidW5pcXVlXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbKExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSldIC0+XG4gICAgICBsZXQgc2VlbiA9IEhhc2h0YmwuY3JlYXRlIDE2IGluXG4gICAgICBsZXQgcmVzdWx0ID0gTGlzdC5maWx0ZXIgKGZ1biB4IC0+XG4gICAgICAgIGxldCBrZXkgPSBpbnNwZWN0IHggaW5cbiAgICAgICAgaWYgSGFzaHRibC5tZW0gc2VlbiBrZXkgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIChIYXNodGJsLnJlcGxhY2Ugc2VlbiBrZXkgdHJ1ZTsgdHJ1ZSlcbiAgICAgICkgbCBpblxuICAgICAgTGlzdCByZXN1bHRcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJ1bmlxdWU6IDEgbGlzdFwiKSk7XG5cbiAgKCogPT09IERpY3QgPT09ICopXG4gIHJlZ2lzdGVyIFwiZGljdFwiIChmdW4gYXJncyAtPlxuICAgIGxldCBkID0gbWFrZV9kaWN0ICgpIGluXG4gICAgbGV0IHJlYyBnbyA9IGZ1bmN0aW9uXG4gICAgICB8IFtdIC0+IERpY3QgZFxuICAgICAgfCBLZXl3b3JkIGsgOjogdiA6OiByZXN0IC0+IGRpY3Rfc2V0IGQgayB2OyBnbyByZXN0XG4gICAgICB8IFN0cmluZyBrIDo6IHYgOjogcmVzdCAtPiBkaWN0X3NldCBkIGsgdjsgZ28gcmVzdFxuICAgICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZGljdDogcGFpcnMgb2Yga2V5IHZhbHVlXCIpXG4gICAgaW4gZ28gYXJncyk7XG4gIHJlZ2lzdGVyIFwiZ2V0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbRGljdCBkOyBTdHJpbmcga10gLT4gZGljdF9nZXQgZCBrXG4gICAgfCBbRGljdCBkOyBLZXl3b3JkIGtdIC0+IGRpY3RfZ2V0IGQga1xuICAgIHwgW0xpc3QgbDsgTnVtYmVyIG5dIHwgW0xpc3RSZWYgeyBjb250ZW50cyA9IGwgfTsgTnVtYmVyIG5dIC0+XG4gICAgICAodHJ5IExpc3QubnRoIGwgKGludF9vZl9mbG9hdCBuKSB3aXRoIF8gLT4gTmlsKVxuICAgIHwgW05pbDsgX10gLT4gTmlsICAoKiBuaWwuYW55dGhpbmcg4oaSIG5pbCAqKVxuICAgIHwgW187IF9dIC0+IE5pbCAgICAoKiB0eXBlIG1pc21hdGNoIOKGkiBuaWwgKG1hdGNoZXMgSlMvUHl0aG9uIGJlaGF2aW9yKSAqKVxuICAgIHwgXyAtPiBOaWwpO1xuICByZWdpc3RlciBcImhhcy1rZXk/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbRGljdCBkOyBTdHJpbmcga10gLT4gQm9vbCAoZGljdF9oYXMgZCBrKVxuICAgIHwgW0RpY3QgZDsgS2V5d29yZCBrXSAtPiBCb29sIChkaWN0X2hhcyBkIGspXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiaGFzLWtleT86IGRpY3QgYW5kIGtleVwiKSk7XG4gIHJlZ2lzdGVyIFwiYXNzb2NcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IERpY3QgZCA6OiByZXN0IC0+XG4gICAgICBsZXQgZDIgPSBIYXNodGJsLmNvcHkgZCBpblxuICAgICAgbGV0IHJlYyBnbyA9IGZ1bmN0aW9uXG4gICAgICAgIHwgW10gLT4gRGljdCBkMlxuICAgICAgICB8IFN0cmluZyBrIDo6IHYgOjogcmVzdCAtPiBIYXNodGJsLnJlcGxhY2UgZDIgayB2OyBnbyByZXN0XG4gICAgICAgIHwgS2V5d29yZCBrIDo6IHYgOjogcmVzdCAtPiBIYXNodGJsLnJlcGxhY2UgZDIgayB2OyBnbyByZXN0XG4gICAgICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImFzc29jOiBwYWlyc1wiKVxuICAgICAgaW4gZ28gcmVzdFxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImFzc29jOiBkaWN0ICsgcGFpcnNcIikpO1xuICByZWdpc3RlciBcImRpc3NvY1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgRGljdCBkIDo6IGtleXMgLT5cbiAgICAgIGxldCBkMiA9IEhhc2h0YmwuY29weSBkIGluXG4gICAgICBMaXN0Lml0ZXIgKGZ1biBrIC0+IEhhc2h0YmwucmVtb3ZlIGQyICh0b19zdHJpbmcgaykpIGtleXM7XG4gICAgICBEaWN0IGQyXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZGlzc29jOiBkaWN0ICsga2V5c1wiKSk7XG4gIHJlZ2lzdGVyIFwibWVyZ2VcIiAoZnVuIGFyZ3MgLT5cbiAgICBsZXQgZCA9IG1ha2VfZGljdCAoKSBpblxuICAgIExpc3QuaXRlciAoZnVuY3Rpb25cbiAgICAgIHwgRGljdCBzcmMgLT4gSGFzaHRibC5pdGVyIChmdW4gayB2IC0+IEhhc2h0YmwucmVwbGFjZSBkIGsgdikgc3JjXG4gICAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJtZXJnZTogYWxsIGFyZ3MgbXVzdCBiZSBkaWN0c1wiKVxuICAgICkgYXJncztcbiAgICBEaWN0IGQpO1xuICByZWdpc3RlciBcImtleXNcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW0RpY3QgZF0gLT4gTGlzdCAoZGljdF9rZXlzIGQpIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImtleXM6IDEgZGljdFwiKSk7XG4gIHJlZ2lzdGVyIFwidmFsc1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbRGljdCBkXSAtPiBMaXN0IChkaWN0X3ZhbHMgZCkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwidmFsczogMSBkaWN0XCIpKTtcbiAgcmVnaXN0ZXIgXCJtdXRhYmxlLWxpc3RcIiAoZnVuIF9hcmdzIC0+IExpc3RSZWYgKHJlZiBbXSkpO1xuICByZWdpc3RlciBcInNldC1udGghXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTGlzdFJlZiByOyBOdW1iZXIgbjsgdl0gLT5cbiAgICAgIGxldCBpID0gaW50X29mX2Zsb2F0IG4gaW5cbiAgICAgIGxldCBsID0gIXIgaW5cbiAgICAgIHIgOj0gTGlzdC5tYXBpIChmdW4gaiB4IC0+IGlmIGogPSBpIHRoZW4gdiBlbHNlIHgpIGw7XG4gICAgICBOaWxcbiAgICB8IFtMaXN0IF87IF87IF9dIC0+XG4gICAgICByYWlzZSAoRXZhbF9lcnJvciBcInNldC1udGghOiBsaXN0IGlzIGltbXV0YWJsZSwgdXNlIExpc3RSZWZcIilcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzZXQtbnRoITogZXhwZWN0ZWQgKGxpc3QgaWR4IHZhbClcIikpO1xuICByZWdpc3RlciBcImRpY3Qtc2V0IVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0RpY3QgZDsgU3RyaW5nIGs7IHZdIC0+IGRpY3Rfc2V0IGQgayB2OyB2XG4gICAgfCBbRGljdCBkOyBLZXl3b3JkIGs7IHZdIC0+IGRpY3Rfc2V0IGQgayB2OyB2XG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZGljdC1zZXQhOiBkaWN0IGtleSB2YWxcIikpO1xuICByZWdpc3RlciBcImRpY3QtZ2V0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbRGljdCBkOyBTdHJpbmcga10gLT4gZGljdF9nZXQgZCBrXG4gICAgfCBbRGljdCBkOyBLZXl3b3JkIGtdIC0+IGRpY3RfZ2V0IGQga1xuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImRpY3QtZ2V0OiBkaWN0IGFuZCBrZXlcIikpO1xuICByZWdpc3RlciBcImRpY3QtaGFzP1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0RpY3QgZDsgU3RyaW5nIGtdIC0+IEJvb2wgKGRpY3RfaGFzIGQgaylcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJkaWN0LWhhcz86IGRpY3QgYW5kIGtleVwiKSk7XG4gIHJlZ2lzdGVyIFwiZGljdC1kZWxldGUhXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbRGljdCBkOyBTdHJpbmcga10gLT4gZGljdF9kZWxldGUgZCBrOyBOaWxcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJkaWN0LWRlbGV0ZSE6IGRpY3QgYW5kIGtleVwiKSk7XG5cbiAgKCogPT09IE1pc2MgPT09ICopXG4gIHJlZ2lzdGVyIFwidHlwZS1vZlwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gU3RyaW5nICh0eXBlX29mIGEpIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInR5cGUtb2Y6IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJpbnNwZWN0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFthXSAtPiBTdHJpbmcgKGluc3BlY3QgYSkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiaW5zcGVjdDogMSBhcmdcIikpO1xuICByZWdpc3RlciBcInNlcmlhbGl6ZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2FdIC0+IFN0cmluZyAoaW5zcGVjdCBhKSAgKCogdXNlZCBmb3IgZGVkdXAga2V5cyBpbiBjb21waWxlciAqKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInNlcmlhbGl6ZTogMSBhcmdcIikpO1xuICByZWdpc3RlciBcIm1ha2Utc3ltYm9sXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIHNdIC0+IFN5bWJvbCBzXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibWFrZS1zeW1ib2w6IGV4cGVjdGVkIHN0cmluZ1wiKSk7XG4gIHJlZ2lzdGVyIFwiZXJyb3JcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW1N0cmluZyBtc2ddIC0+IHJhaXNlIChFdmFsX2Vycm9yIG1zZylcbiAgICB8IFthXSAtPiByYWlzZSAoRXZhbF9lcnJvciAodG9fc3RyaW5nIGEpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImVycm9yOiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwiYXBwbHlcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtOYXRpdmVGbiAoXywgZik7IChMaXN0IGEgfCBMaXN0UmVmIHsgY29udGVudHMgPSBhIH0pXSAtPiBmIGFcbiAgICB8IFtOYXRpdmVGbiAoXywgZik7IE5pbF0gLT4gZiBbXVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImFwcGx5OiBmdW5jdGlvbiBhbmQgbGlzdFwiKSk7XG4gIHJlZ2lzdGVyIFwiaWRlbnRpY2FsP1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYTsgYl0gLT4gQm9vbCAoYSA9PSBiKSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJpZGVudGljYWw/OiAyIGFyZ3NcIikpO1xuICByZWdpc3RlciBcIm1ha2Utc3ByZWFkXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbRGljdCBkXSAtPlxuICAgICAgbGV0IHBhaXJzID0gSGFzaHRibC5mb2xkIChmdW4gayB2IGFjYyAtPiAoaywgdikgOjogYWNjKSBkIFtdIGluXG4gICAgICBTcHJlYWQgcGFpcnNcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJtYWtlLXNwcmVhZDogMSBkaWN0XCIpKTtcbiAgcmVnaXN0ZXIgXCJzcHJlYWQ/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtTcHJlYWQgX10gLT4gQm9vbCB0cnVlIHwgW19dIC0+IEJvb2wgZmFsc2VcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzcHJlYWQ/OiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwic3ByZWFkLWF0dHJzXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3ByZWFkIHBhaXJzXSAtPlxuICAgICAgbGV0IGQgPSBtYWtlX2RpY3QgKCkgaW5cbiAgICAgIExpc3QuaXRlciAoZnVuIChrLCB2KSAtPiBkaWN0X3NldCBkIGsgdikgcGFpcnM7XG4gICAgICBEaWN0IGRcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzcHJlYWQtYXR0cnM6IDEgc3ByZWFkXCIpKTtcblxuICAoKiBIaWdoZXItb3JkZXIgZm9ybXMgYXMgY2FsbGFibGUgcHJpbWl0aXZlcyDigJQgdXNlZCBieSB0aGUgVk0uXG4gICAgIFRoZSBDRUsgbWFjaGluZSBoYW5kbGVzIHRoZXNlIGFzIHNwZWNpYWwgZm9ybXMgd2l0aCBkZWRpY2F0ZWQgZnJhbWVzO1xuICAgICB0aGUgVk0gbmVlZHMgdGhlbSBhcyBwbGFpbiBjYWxsYWJsZSB2YWx1ZXMuICopXG4gICgqIENhbGwgYW55IFNYIGNhbGxhYmxlIOKAlCBoYW5kbGVzIE5hdGl2ZUZuLCBMYW1iZGEgKHZpYSB0cmFtcG9saW5lKSwgVk0gY2xvc3VyZXMgKilcbiAgbGV0IGNhbGxfYW55IGYgYXJncyA9XG4gICAgbWF0Y2ggZiB3aXRoXG4gICAgfCBOYXRpdmVGbiAoXywgZm4pIC0+IGZuIGFyZ3NcbiAgICB8IF8gLT4gIV9zeF90cmFtcG9saW5lX2ZuICghX3N4X2NhbGxfZm4gZiBhcmdzKVxuICBpblxuICByZWdpc3RlciBcIm1hcFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2Y7IChMaXN0IGl0ZW1zIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gaXRlbXMgfSldIC0+XG4gICAgICBMaXN0IChMaXN0Lm1hcCAoZnVuIHggLT4gY2FsbF9hbnkgZiBbeF0pIGl0ZW1zKVxuICAgIHwgW187IE5pbF0gLT4gTGlzdCBbXVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm1hcDogZXhwZWN0ZWQgKGZuIGxpc3QpXCIpKTtcbiAgcmVnaXN0ZXIgXCJtYXAtaW5kZXhlZFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2Y7IChMaXN0IGl0ZW1zIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gaXRlbXMgfSldIC0+XG4gICAgICBMaXN0IChMaXN0Lm1hcGkgKGZ1biBpIHggLT4gY2FsbF9hbnkgZiBbTnVtYmVyIChmbG9hdF9vZl9pbnQgaSk7IHhdKSBpdGVtcylcbiAgICB8IFtfOyBOaWxdIC0+IExpc3QgW11cbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJtYXAtaW5kZXhlZDogZXhwZWN0ZWQgKGZuIGxpc3QpXCIpKTtcbiAgcmVnaXN0ZXIgXCJmaWx0ZXJcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtmOyAoTGlzdCBpdGVtcyB8IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0pXSAtPlxuICAgICAgTGlzdCAoTGlzdC5maWx0ZXIgKGZ1biB4IC0+IHN4X3RydXRoeSAoY2FsbF9hbnkgZiBbeF0pKSBpdGVtcylcbiAgICB8IFtfOyBOaWxdIC0+IExpc3QgW11cbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJmaWx0ZXI6IGV4cGVjdGVkIChmbiBsaXN0KVwiKSk7XG4gIHJlZ2lzdGVyIFwiZm9yLWVhY2hcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtmOyAoTGlzdCBpdGVtcyB8IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0pXSAtPlxuICAgICAgTGlzdC5pdGVyIChmdW4geCAtPiBpZ25vcmUgKGNhbGxfYW55IGYgW3hdKSkgaXRlbXM7IE5pbFxuICAgIHwgW187IE5pbF0gLT4gTmlsICAoKiBuaWwgY29sbGVjdGlvbiA9IG5vLW9wICopXG4gICAgfCBfIC0+XG4gICAgICBsZXQgdHlwZXMgPSBTdHJpbmcuY29uY2F0IFwiLCBcIiAoTGlzdC5tYXAgKGZ1biB2IC0+IHR5cGVfb2YgdikgYXJncykgaW5cbiAgICAgIHJhaXNlIChFdmFsX2Vycm9yIChQcmludGYuc3ByaW50ZiBcImZvci1lYWNoOiBleHBlY3RlZCAoZm4gbGlzdCksIGdvdCAoJXMpICVkIGFyZ3NcIiB0eXBlcyAoTGlzdC5sZW5ndGggYXJncykpKSk7XG4gIHJlZ2lzdGVyIFwicmVkdWNlXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbZjsgaW5pdDsgKExpc3QgaXRlbXMgfCBMaXN0UmVmIHsgY29udGVudHMgPSBpdGVtcyB9KV0gLT5cbiAgICAgIExpc3QuZm9sZF9sZWZ0IChmdW4gYWNjIHggLT4gY2FsbF9hbnkgZiBbYWNjOyB4XSkgaW5pdCBpdGVtc1xuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInJlZHVjZTogZXhwZWN0ZWQgKGZuIGluaXQgbGlzdClcIikpO1xuICByZWdpc3RlciBcInNvbWVcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtmOyAoTGlzdCBpdGVtcyB8IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0pXSAtPlxuICAgICAgKHRyeSBMaXN0LmZpbmQgKGZ1biB4IC0+IHN4X3RydXRoeSAoY2FsbF9hbnkgZiBbeF0pKSBpdGVtc1xuICAgICAgIHdpdGggTm90X2ZvdW5kIC0+IEJvb2wgZmFsc2UpXG4gICAgfCBbXzsgTmlsXSAtPiBCb29sIGZhbHNlXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic29tZTogZXhwZWN0ZWQgKGZuIGxpc3QpXCIpKTtcbiAgcmVnaXN0ZXIgXCJldmVyeT9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtmOyAoTGlzdCBpdGVtcyB8IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0pXSAtPlxuICAgICAgQm9vbCAoTGlzdC5mb3JfYWxsIChmdW4geCAtPiBzeF90cnV0aHkgKGNhbGxfYW55IGYgW3hdKSkgaXRlbXMpXG4gICAgfCBbXzsgTmlsXSAtPiBCb29sIHRydWVcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJldmVyeT86IGV4cGVjdGVkIChmbiBsaXN0KVwiKSk7XG5cbiAgKCogLS0tLSBWTSBzdGFjayBwcmltaXRpdmVzICh2bS5zeCBwbGF0Zm9ybSBpbnRlcmZhY2UpIC0tLS0gKilcbiAgcmVnaXN0ZXIgXCJtYWtlLXZtLXN0YWNrXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTnVtYmVyIG5dIC0+IExpc3RSZWYgKHJlZiAoTGlzdC5pbml0IChpbnRfb2ZfZmxvYXQgbikgKGZ1biBfIC0+IE5pbCkpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm1ha2Utdm0tc3RhY2s6IGV4cGVjdGVkIChzaXplKVwiKSk7XG4gIHJlZ2lzdGVyIFwidm0tc3RhY2stZ2V0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTGlzdFJlZiByOyBOdW1iZXIgbl0gLT4gTGlzdC5udGggIXIgKGludF9vZl9mbG9hdCBuKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInZtLXN0YWNrLWdldDogZXhwZWN0ZWQgKHN0YWNrIGlkeClcIikpO1xuICByZWdpc3RlciBcInZtLXN0YWNrLXNldCFcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0UmVmIHI7IE51bWJlciBuOyB2XSAtPlxuICAgICAgbGV0IGkgPSBpbnRfb2ZfZmxvYXQgbiBpblxuICAgICAgciA6PSBMaXN0Lm1hcGkgKGZ1biBqIHggLT4gaWYgaiA9IGkgdGhlbiB2IGVsc2UgeCkgIXI7IE5pbFxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInZtLXN0YWNrLXNldCE6IGV4cGVjdGVkIChzdGFjayBpZHggdmFsKVwiKSk7XG4gIHJlZ2lzdGVyIFwidm0tc3RhY2stbGVuZ3RoXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTGlzdFJlZiByXSAtPiBOdW1iZXIgKGZsb2F0X29mX2ludCAoTGlzdC5sZW5ndGggIXIpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInZtLXN0YWNrLWxlbmd0aDogZXhwZWN0ZWQgKHN0YWNrKVwiKSk7XG4gIHJlZ2lzdGVyIFwidm0tc3RhY2stY29weSFcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0UmVmIHNyYzsgTGlzdFJlZiBkc3Q7IE51bWJlciBuXSAtPlxuICAgICAgbGV0IGNvdW50ID0gaW50X29mX2Zsb2F0IG4gaW5cbiAgICAgIGxldCBzcmNfaXRlbXMgPSAhc3JjIGluXG4gICAgICBkc3QgOj0gTGlzdC5tYXBpIChmdW4gaSB4IC0+IGlmIGkgPCBjb3VudCB0aGVuIExpc3QubnRoIHNyY19pdGVtcyBpIGVsc2UgeCkgIWRzdDsgTmlsXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwidm0tc3RhY2stY29weSE6IGV4cGVjdGVkIChzcmMgZHN0IGNvdW50KVwiKSk7XG4gIHJlZ2lzdGVyIFwicHJpbWl0aXZlP1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBuYW1lXSAtPiBCb29sIChIYXNodGJsLm1lbSBwcmltaXRpdmVzIG5hbWUpXG4gICAgfCBfIC0+IEJvb2wgZmFsc2UpO1xuXG4gICgqIFNjb3BlIHN0YWNrIHByaW1pdGl2ZXMgYXJlIHJlZ2lzdGVyZWQgYnkgc3hfc2VydmVyLm1sIC8gcnVuX3Rlc3RzLm1sXG4gICAgIGJlY2F1c2UgdGhleSB1c2UgYSBzaGFyZWQgc2NvcGUgc3RhY2tzIHRhYmxlIHdpdGggY29sbGVjdCEvY29sbGVjdGVkLiAqKVxuXG4gICgqIC0tLS0gUHJlZGljYXRlcyBuZWVkZWQgYnkgYWRhcHRlci1odG1sLnN4IC0tLS0gKilcbiAgcmVnaXN0ZXIgXCJsYW1iZGE/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtMYW1iZGEgX10gLT4gQm9vbCB0cnVlIHwgXyAtPiBCb29sIGZhbHNlKTtcbiAgcmVnaXN0ZXIgXCJpc2xhbmQ/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtJc2xhbmQgX10gLT4gQm9vbCB0cnVlIHwgXyAtPiBCb29sIGZhbHNlKTtcbiAgcmVnaXN0ZXIgXCJpcy1lbHNlLWNsYXVzZT9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtLZXl3b3JkIFwiZWxzZVwiXSAtPiBCb29sIHRydWVcbiAgICB8IFtCb29sIHRydWVdIC0+IEJvb2wgdHJ1ZVxuICAgIHwgXyAtPiBCb29sIGZhbHNlKTtcbiAgcmVnaXN0ZXIgXCJjb25kLXNjaGVtZT9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0IGNsYXVzZXNdIC0+XG4gICAgICBCb29sIChMaXN0LmZvcl9hbGwgKGZ1biBjIC0+XG4gICAgICAgIG1hdGNoIGMgd2l0aFxuICAgICAgICB8IExpc3QgbCAtPiBMaXN0Lmxlbmd0aCBsID0gMlxuICAgICAgICB8IF8gLT4gZmFsc2UpIGNsYXVzZXMpXG4gICAgfCBfIC0+IEJvb2wgZmFsc2UpO1xuICByZWdpc3RlciBcImNvbXBvbmVudD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW0NvbXBvbmVudCBfXSAtPiBCb29sIHRydWUgfCBbSXNsYW5kIF9dIC0+IEJvb2wgdHJ1ZSB8IF8gLT4gQm9vbCBmYWxzZSk7XG4gIHJlZ2lzdGVyIFwibGFtYmRhLWNsb3N1cmVcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW0xhbWJkYSBsXSAtPiBFbnYgbC5sX2Nsb3N1cmUgfCBfIC0+IE5pbCk7XG4gIHJlZ2lzdGVyIFwiY29tcG9uZW50LWNsb3N1cmVcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtDb21wb25lbnQgY10gLT4gRW52IGMuY19jbG9zdXJlXG4gICAgfCBbSXNsYW5kIGldIC0+IEVudiBpLmlfY2xvc3VyZVxuICAgIHwgXyAtPiBOaWwpO1xuICByZWdpc3RlciBcImNvbXBvbmVudC1oYXMtY2hpbGRyZW4/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbQ29tcG9uZW50IGNdIC0+IEJvb2wgYy5jX2hhc19jaGlsZHJlblxuICAgIHwgW0lzbGFuZCBpXSAtPiBCb29sIGkuaV9oYXNfY2hpbGRyZW5cbiAgICB8IF8gLT4gQm9vbCBmYWxzZSk7XG4gIHJlZ2lzdGVyIFwiY29tcG9uZW50LW5hbWVcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtDb21wb25lbnQgY10gLT4gU3RyaW5nIGMuY19uYW1lXG4gICAgfCBbSXNsYW5kIGldIC0+IFN0cmluZyBpLmlfbmFtZVxuICAgIHwgXyAtPiBOaWwpO1xuICByZWdpc3RlciBcImNvbXBvbmVudC1wYXJhbXNcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtDb21wb25lbnQgY10gLT4gTGlzdCAoTGlzdC5tYXAgKGZ1biBzIC0+IFN0cmluZyBzKSBjLmNfcGFyYW1zKVxuICAgIHwgW0lzbGFuZCBpXSAtPiBMaXN0IChMaXN0Lm1hcCAoZnVuIHMgLT4gU3RyaW5nIHMpIGkuaV9wYXJhbXMpXG4gICAgfCBfIC0+IExpc3QgW10pO1xuICByZWdpc3RlciBcImNvbXBvbmVudC1ib2R5XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbQ29tcG9uZW50IGNdIC0+IGMuY19ib2R5XG4gICAgfCBbSXNsYW5kIGldIC0+IGkuaV9ib2R5XG4gICAgfCBfIC0+IE5pbCk7XG4gIHJlZ2lzdGVyIFwibWFjcm8/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtNYWNybyBfXSAtPiBCb29sIHRydWUgfCBfIC0+IEJvb2wgZmFsc2UpO1xuICByZWdpc3RlciBcImZvci1lYWNoLWluZGV4ZWRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtmOyAoTGlzdCBpdGVtcyB8IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0pXSAtPlxuICAgICAgTGlzdC5pdGVyaSAoZnVuIGkgeCAtPiBpZ25vcmUgKGNhbGxfYW55IGYgW051bWJlciAoZmxvYXRfb2ZfaW50IGkpOyB4XSkpIGl0ZW1zOyBOaWxcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJmb3ItZWFjaC1pbmRleGVkOiBleHBlY3RlZCAoZm4gbGlzdClcIikpO1xuICByZWdpc3RlciBcImxhbWJkYS1wYXJhbXNcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMYW1iZGEgbF0gLT4gTGlzdCAoTGlzdC5tYXAgKGZ1biBzIC0+IFN0cmluZyBzKSBsLmxfcGFyYW1zKVxuICAgIHwgXyAtPiBMaXN0IFtdKTtcbiAgcmVnaXN0ZXIgXCJsYW1iZGEtYm9keVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbTGFtYmRhIGxdIC0+IGwubF9ib2R5IHwgXyAtPiBOaWwpO1xuICAoKiBleHBhbmQtbWFjcm8gaXMgcmVnaXN0ZXJlZCBsYXRlciBieSBydW5fdGVzdHMubWwgLyBzeF9zZXJ2ZXIubWxcbiAgICAgYmVjYXVzZSBpdCBuZWVkcyBldmFsX2V4cHIgd2hpY2ggY3JlYXRlcyBhIGRlcGVuZGVuY3kgY3ljbGUgKik7XG4gIHJlZ2lzdGVyIFwiZW1wdHktZGljdD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtEaWN0IGRdIC0+IEJvb2wgKEhhc2h0YmwubGVuZ3RoIGQgPSAwKVxuICAgIHwgXyAtPiBCb29sIHRydWUpO1xuICByZWdpc3RlciBcIm1ha2UtcmF3LWh0bWxcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW1N0cmluZyBzXSAtPiBSYXdIVE1MIHMgfCBfIC0+IE5pbCk7XG4gIHJlZ2lzdGVyIFwicmF3LWh0bWwtY29udGVudFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbUmF3SFRNTCBzXSAtPiBTdHJpbmcgcyB8IF8gLT4gU3RyaW5nIFwiXCIpO1xuICByZWdpc3RlciBcImdldC1wcmltaXRpdmVcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgbmFtZV0gLT5cbiAgICAgIChtYXRjaCBIYXNodGJsLmZpbmRfb3B0IHByaW1pdGl2ZXMgbmFtZSB3aXRoXG4gICAgICAgfCBTb21lIGZuIC0+IE5hdGl2ZUZuIChuYW1lLCBmbilcbiAgICAgICB8IE5vbmUgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiVk0gdW5kZWZpbmVkOiBcIiBeIG5hbWUpKSlcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJnZXQtcHJpbWl0aXZlOiBleHBlY3RlZCAobmFtZSlcIikpO1xuICByZWdpc3RlciBcImNhbGwtcHJpbWl0aXZlXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIG5hbWU7IChMaXN0IGEgfCBMaXN0UmVmIHsgY29udGVudHMgPSBhIH0pXSAtPlxuICAgICAgKG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgcHJpbWl0aXZlcyBuYW1lIHdpdGhcbiAgICAgICB8IFNvbWUgZm4gLT4gZm4gYVxuICAgICAgIHwgTm9uZSAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJWTSB1bmRlZmluZWQ6IFwiIF4gbmFtZSkpKVxuICAgIHwgW1N0cmluZyBuYW1lOyBOaWxdIC0+XG4gICAgICAobWF0Y2ggSGFzaHRibC5maW5kX29wdCBwcmltaXRpdmVzIG5hbWUgd2l0aFxuICAgICAgIHwgU29tZSBmbiAtPiBmbiBbXVxuICAgICAgIHwgTm9uZSAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJWTSB1bmRlZmluZWQ6IFwiIF4gbmFtZSkpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImNhbGwtcHJpbWl0aXZlOiBleHBlY3RlZCAobmFtZSBhcmdzLWxpc3QpXCIpKTtcbiAgKClcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9tbF9zdHJpbmdfbGVuZ3RoIiwiY2FtbF9yb3VuZF9mbG9hdCIsImNhbWxfc3RyaW5nX2dldCIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfSGFzaHRibCIsIlN4X3R5cGVzIiwiU3RkbGliIiwiU3RkbGliX0Zsb2F0IiwiU3RkbGliX1ByaW50ZiIsIlN0ZGxpYl9MaXN0IiwiU3RkbGliX1N0cmluZyIsIlN0ZGxpYl9CdWZmZXIiLCJTdGRsaWJfVWNoYXIiLCJwcmltaXRpdmVzIiwic3hfY2FsbF9mbiIsInBhcmFtIiwic3hfdHJhbXBvbGluZV9mbiIsInYiLCJyZWdpc3RlciIsIm5hbWUiLCJmbiIsImlzX3ByaW1pdGl2ZSIsImdldF9wcmltaXRpdmUiLCJtYXRjaCIsInRyYW1wb2xpbmVfaG9vayIsImNzdCIsImNzdF9kaWN0IiwiYXNfbnVtYmVyIiwidCIsIm4iLCJzIiwiZCIsImFzX3N0cmluZyIsImFzX2xpc3QiLCJsIiwiciIsImFzX2Jvb2wiLCJiIiwiY3N0X2ciLCJjc3RfZmFsc2UiLCJjc3RfdHJ1ZSIsInRvX3N0cmluZyIsImFyZ3MiLCJhY2MiLCJhIiwicmVzdCIsIngiLCJwbGFjZXMiLCJmYWN0b3IiLCJoaSIsImxvIiwiZGVmYXVsdF92YWwiLCJjc3RfaG9zdF9oYW5kbGUiLCJzYWZlX2VxIiwieSIsImxhIiwiaGIiLCJoYSIsImxiIiwibmVlZGxlIiwiaGF5c3RhY2siLCJpIiwicHJlZml4Iiwic3VmZml4Iiwic2wiLCJ4bCIsIm5sIiwiaGwiLCJlbmQiLCJzdGFydCIsImoiLCJsZW4iLCJzZXAiLCJwIiwiaXRlbXMiLCJ0b19zdHIiLCJuZXdfcyIsIm9sZF9zIiwib2wiLCJidWYiLCJjc3RfYXJncyIsInBhaXJzIiwieHMiLCJleG4iLCJhbGwiLCJmbGF0Iiwic3ViIiwiaXRlbSIsInN0b3AiLCJlIiwic3RlcCIsInRha2VfcmFuZ2UiLCJpZHgiLCJsMSIsImwyIiwieXMiLCJnbyIsInRha2VfbiIsInNpemUiLCJzZWVuIiwicmVzdWx0Iiwia2V5IiwiayIsImQyIiwia2V5cyIsInNyYyIsIm1zZyIsImNhbGxfYW55IiwidHlwZXMiLCJpbml0IiwiZHN0IiwiY291bnQiLCJzcmNfaXRlbXMiLCJjbGF1c2VzIiwiYyIsImNzdF9WTV91bmRlZmluZWQiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsOEJBQUE7QUFBQSxJQUFBQyx3QkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsa0JBQUE7QUFBQSxJQUFBQyxzQkFBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQyxXQUFBRixHQUFBQyxJQUFBRTtBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyxXQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGFDTzJEO0FBQUEsSUFBQUM7QUFBQUEsTUFBa0I7QUFBQSxtQkFBQUM7QUFBQUEsUUFJM0Q7QUFBQTtBQUFBLE9BQTRDO0FBQUEsSUFBQUMsbUJBSmUsYUFBQUMsR0FNN0QsU0FBQztBQUFBLFlBQUFDLFNBQUFDLE1BQUFDO0FBQUFBLElBRU0sMERBQWtDO0FBQUE7QUFBQSxZQUFBQyxhQUFBRjtBQUFBQSxJQUVqQyxxREFBMkI7QUFBQTtBQUFBLFlBQUFHLGNBQUFIO0FBQUFBLFFBQUFJLFFBRzNDO0FBQUEsSUFBZ0MsY0FBQUgsS0FBQSxVQUN6QjtBQUFBLFlBQ2U7QUFBQSxJQUE4QjtBQUFBLEdBQUM7QUFBQTtBQUFBLElBQUFJLGtCQWZnQixhQUFB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QUFBcUYsbUJEOTBCNUQ7QUFBQSxHQyswQkU7QUFBQTtBQUFBLGNBQUF6RTtBQUFBQSxNQUNFO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0FBQXZCLE9BQUE7QUFBQSxTQUFBSSxRQUVTO0FBQUEsUUFBZ0MsY0FBQUgsS0FBQSxVQUN6QjtBQUFBLGdCQUNlO0FBQUEsUUFBeUI7QUFBQTtBQUFBO0FBQUEsTUFDakQ7QUFBQTtBQUFBLEtBQW1EO0FBQUEsR0FDNUQ7QUFBQTtBQUFBLGNBQUFzQjtBQUFBQTtBQUFBQSxNQUFBO0FBQUEsZUFDRTtBQUFBO0FBQUE7QUFBQTtBQUFBLHVCQUFBdkIsT0FBQTtBQUFBO0FBQUE7QUFBQSxlQUFBSSxRQU1TO0FBQUEsV0FBZ0MsY0FBQUgsS0FBQSxVQUN6Qix3QkFFcUQ7QUFBQSxtQkFEdEM7QUFBQSxXQUF5QjtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBUnhEO0FBQUE7QUFBQSxpQkFBQXdCLElBQUE7QUFBQTtBQUFBLGlCQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUFBQXJCLFVBRVM7QUFBQSxXQUFnQyxnQkFBQUgsT0FBQSxZQUN6QiwwQkFNcUQ7QUFBQSxtQkFMdEM7QUFBQSxXQUF5QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUtqRDtBQUFBO0FBQUE7QUFBQSxLQUE4RDtBQUFBLEdBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVEaDJCMUUiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoyODc5OSwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiIuc3gub2Jqcy9qc29vL2RlZmF1bHQvc3guY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi93b3Jrc3BhY2Vfcm9vdC9saWIvc3hfcnVudGltZS5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKiBSdW50aW1lIGhlbHBlcnMgZm9yIHRyYW5zcGlsZWQgY29kZS5cblxuICAgIFRoZXNlIGJyaWRnZSB0aGUgZ2FwIGJldHdlZW4gdGhlIHRyYW5zcGlsZXIncyBvdXRwdXQgYW5kIHRoZVxuICAgIGZvdW5kYXRpb24gdHlwZXMvcHJpbWl0aXZlcy4gVGhlIHRyYW5zcGlsZWQgZXZhbHVhdG9yIGNhbGxzIHRoZXNlXG4gICAgZnVuY3Rpb25zIGRpcmVjdGx5LiAqKVxuXG5vcGVuIFN4X3R5cGVzXG5cbigqKiBDYWxsIGEgcmVnaXN0ZXJlZCBwcmltaXRpdmUgYnkgbmFtZS4gKilcbmxldCBwcmltX2NhbGwgbmFtZSBhcmdzID1cbiAgbWF0Y2ggSGFzaHRibC5maW5kX29wdCBTeF9wcmltaXRpdmVzLnByaW1pdGl2ZXMgbmFtZSB3aXRoXG4gIHwgU29tZSBmIC0+IGYgYXJnc1xuICB8IE5vbmUgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiVW5rbm93biBwcmltaXRpdmU6IFwiIF4gbmFtZSkpXG5cbigqKiBDb252ZXJ0IGFueSBTWCB2YWx1ZSB0byBhbiBPQ2FtbCBzdHJpbmcgKGludGVybmFsKS4gKilcbmxldCB2YWx1ZV90b19zdHIgPSBmdW5jdGlvblxuICB8IFN0cmluZyBzIC0+IHNcbiAgfCBOdW1iZXIgbiAtPlxuICAgIGlmIEZsb2F0LmlzX2ludGVnZXIgbiB0aGVuIHN0cmluZ19vZl9pbnQgKGludF9vZl9mbG9hdCBuKVxuICAgIGVsc2UgUHJpbnRmLnNwcmludGYgXCIlZ1wiIG5cbiAgfCBCb29sIHRydWUgLT4gXCJ0cnVlXCJcbiAgfCBCb29sIGZhbHNlIC0+IFwiZmFsc2VcIlxuICB8IE5pbCAtPiBcIlwiXG4gIHwgU3ltYm9sIHMgLT4gc1xuICB8IEtleXdvcmQgayAtPiBrXG4gIHwgdiAtPiBpbnNwZWN0IHZcblxuKCoqIHN4X3RvX3N0cmluZyByZXR1cm5zIGEgdmFsdWUgKFN0cmluZykgZm9yIHRyYW5zcGlsZWQgY29kZS4gKilcbmxldCBzeF90b19zdHJpbmcgdiA9IFN0cmluZyAodmFsdWVfdG9fc3RyIHYpXG5cbigqKiBTdHJpbmcgY29uY2F0ZW5hdGlvbiBoZWxwZXIg4oCUIFtzeF9zdHJdIHRha2VzIGEgbGlzdCBvZiB2YWx1ZXMuICopXG5sZXQgc3hfc3RyIGFyZ3MgPVxuICBTdHJpbmcuY29uY2F0IFwiXCIgKExpc3QubWFwIHZhbHVlX3RvX3N0ciBhcmdzKVxuXG4oKiogQ29udmVydCBhIHZhbHVlIHRvIGEgbGlzdC4gKilcbmxldCBzeF90b19saXN0ID0gZnVuY3Rpb25cbiAgfCBMaXN0IGwgLT4gbFxuICB8IExpc3RSZWYgciAtPiAhclxuICB8IE5pbCAtPiBbXVxuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQgbGlzdCwgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxuKCoqIENhbGwgYW4gU1ggY2FsbGFibGUgKGxhbWJkYSwgbmF0aXZlIGZuLCBjb250aW51YXRpb24pLiAqKVxubGV0IHN4X2NhbGwgZiBhcmdzID1cbiAgbWF0Y2ggZiB3aXRoXG4gIHwgTmF0aXZlRm4gKF8sIGZuKSAtPiBmbiBhcmdzXG4gIHwgVm1DbG9zdXJlIGNsIC0+ICFTeF90eXBlcy5fdm1fY2FsbF9jbG9zdXJlX3JlZiBjbCBhcmdzXG4gIHwgTGFtYmRhIGwgLT5cbiAgICBsZXQgbG9jYWwgPSBTeF90eXBlcy5lbnZfZXh0ZW5kIGwubF9jbG9zdXJlIGluXG4gICAgTGlzdC5pdGVyMiAoZnVuIHAgYSAtPiBpZ25vcmUgKFN4X3R5cGVzLmVudl9iaW5kIGxvY2FsIHAgYSkpIGwubF9wYXJhbXMgYXJncztcbiAgICBUaHVuayAobC5sX2JvZHksIGxvY2FsKVxuICB8IENvbnRpbnVhdGlvbiAoaywgXykgLT5cbiAgICBrIChtYXRjaCBhcmdzIHdpdGggeCA6OiBfIC0+IHggfCBbXSAtPiBOaWwpXG4gIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJOb3QgY2FsbGFibGU6IFwiIF4gaW5zcGVjdCBmKSlcblxuKCogSW5pdGlhbGl6ZSBmb3J3YXJkIHJlZiBzbyBwcmltaXRpdmVzIGNhbiBjYWxsIFNYIGZ1bmN0aW9ucyAqKVxubGV0ICgpID0gU3hfcHJpbWl0aXZlcy5fc3hfY2FsbF9mbiA6PSBzeF9jYWxsXG4oKiBUcmFtcG9saW5lIHJlZiBpcyBzZXQgYnkgc3hfcmVmLm1sIGFmdGVyIGl0J3MgbG9hZGVkICopXG5cbigqKiBBcHBseSBhIGZ1bmN0aW9uIHRvIGEgbGlzdCBvZiBhcmdzLiAqKVxubGV0IHN4X2FwcGx5IGYgYXJnc19saXN0ID1cbiAgc3hfY2FsbCBmIChzeF90b19saXN0IGFyZ3NfbGlzdClcblxuKCoqIE11dGFibGUgYXBwZW5kIOKAlCBhZGQgaXRlbSB0byBhIGxpc3QgcmVmIG9yIGFjY3VtdWxhdG9yLlxuICAgIEluIHRyYW5zcGlsZWQgY29kZSwgbGlzdHMgdGhhdCBnZXQgYXBwZW5kZWQgdG8gYXJlIG11dGFibGUgcmVmcy4gKilcbmxldCBzeF9hcHBlbmRfYiBsc3QgaXRlbSA9XG4gIG1hdGNoIGxzdCB3aXRoXG4gIHwgTGlzdCBpdGVtcyAtPiBMaXN0IChpdGVtcyBAIFtpdGVtXSlcbiAgfCBMaXN0UmVmIHIgLT4gciA6PSAhciBAIFtpdGVtXTsgbHN0ICAoKiBtdXRhdGUgaW4gcGxhY2UsIHJldHVybiBzYW1lIHJlZiAqKVxuICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiYXBwZW5kITogZXhwZWN0ZWQgbGlzdCwgZ290IFwiIF4gdHlwZV9vZiBsc3QpKVxuXG4oKiogTXV0YWJsZSBkaWN0LXNldCDigJQgc2V0IGtleSBpbiBkaWN0LCByZXR1cm4gdmFsdWUuICopXG5sZXQgc3hfZGljdF9zZXRfYiBkIGsgdiA9XG4gIG1hdGNoIGQsIGsgd2l0aFxuICB8IERpY3QgdGJsLCBTdHJpbmcga2V5IC0+IEhhc2h0YmwucmVwbGFjZSB0Ymwga2V5IHY7IHZcbiAgfCBEaWN0IHRibCwgS2V5d29yZCBrZXkgLT4gSGFzaHRibC5yZXBsYWNlIHRibCBrZXkgdjsgdlxuICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJkaWN0LXNldCE6IGV4cGVjdGVkIGRpY3QgYW5kIHN0cmluZyBrZXlcIilcblxuKCoqIEdldCBmcm9tIGRpY3Qgb3IgbGlzdC4gKilcbmxldCBnZXRfdmFsIGNvbnRhaW5lciBrZXkgPVxuICBtYXRjaCBjb250YWluZXIsIGtleSB3aXRoXG4gIHwgQ2VrU3RhdGUgcywgU3RyaW5nIGsgLT5cbiAgICAobWF0Y2ggayB3aXRoXG4gICAgIHwgXCJjb250cm9sXCIgLT4gcy5jc19jb250cm9sIHwgXCJlbnZcIiAtPiBzLmNzX2VudlxuICAgICB8IFwia29udFwiIC0+IHMuY3Nfa29udCB8IFwicGhhc2VcIiAtPiBTdHJpbmcgcy5jc19waGFzZVxuICAgICB8IFwidmFsdWVcIiAtPiBzLmNzX3ZhbHVlIHwgXyAtPiBOaWwpXG4gIHwgQ2VrRnJhbWUgZiwgU3RyaW5nIGsgLT5cbiAgICAobWF0Y2ggayB3aXRoXG4gICAgIHwgXCJ0eXBlXCIgLT4gU3RyaW5nIGYuY2ZfdHlwZSB8IFwiZW52XCIgLT4gZi5jZl9lbnZcbiAgICAgfCBcIm5hbWVcIiAtPiBmLmNmX25hbWUgfCBcImJvZHlcIiAtPiBmLmNmX2JvZHlcbiAgICAgfCBcInJlbWFpbmluZ1wiIC0+IGYuY2ZfcmVtYWluaW5nIHwgXCJmXCIgLT4gZi5jZl9mXG4gICAgIHwgXCJhcmdzXCIgLT4gZi5jZl9hcmdzIHwgXCJldmFsZWRcIiAtPiBmLmNmX2FyZ3NcbiAgICAgfCBcInJlc3VsdHNcIiAtPiBmLmNmX3Jlc3VsdHMgfCBcInJhdy1hcmdzXCIgLT4gZi5jZl9yZXN1bHRzXG4gICAgIHwgXCJ0aGVuXCIgLT4gZi5jZl9ib2R5IHwgXCJlbHNlXCIgLT4gZi5jZl9uYW1lXG4gICAgIHwgXCJoby10eXBlXCIgLT4gZi5jZl9leHRyYSB8IFwic2NoZW1lXCIgLT4gZi5jZl9leHRyYVxuICAgICB8IFwiaW5kZXhlZFwiIC0+IGYuY2ZfZXh0cmEgfCBcInZhbHVlXCIgLT4gZi5jZl9leHRyYVxuICAgICB8IFwicGhhc2VcIiAtPiBmLmNmX2V4dHJhIHwgXCJoYXMtZWZmZWN0c1wiIC0+IGYuY2ZfZXh0cmFcbiAgICAgfCBcIm1hdGNoLXZhbFwiIC0+IGYuY2ZfZXh0cmEgfCBcImN1cnJlbnQtaXRlbVwiIC0+IGYuY2ZfZXh0cmFcbiAgICAgfCBcInVwZGF0ZS1mblwiIC0+IGYuY2ZfZXh0cmEgfCBcImhlYWQtbmFtZVwiIC0+IGYuY2ZfZXh0cmFcbiAgICAgfCBcImVtaXR0ZWRcIiAtPiBmLmNmX2V4dHJhMiB8IFwiZWZmZWN0LWxpc3RcIiAtPiBmLmNmX2V4dHJhMlxuICAgICB8IFwiZmlyc3QtcmVuZGVyXCIgLT4gZi5jZl9leHRyYTJcbiAgICAgfCBfIC0+IE5pbClcbiAgfCBEaWN0IGQsIFN0cmluZyBrIC0+IGRpY3RfZ2V0IGQga1xuICB8IERpY3QgZCwgS2V5d29yZCBrIC0+IGRpY3RfZ2V0IGQga1xuICB8IChMaXN0IGwgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsIH0pLCBOdW1iZXIgbiAtPlxuICAgICh0cnkgTGlzdC5udGggbCAoaW50X29mX2Zsb2F0IG4pIHdpdGggXyAtPiBOaWwpXG4gIHwgTmlsLCBfIC0+IE5pbCAgKCogbmlsLmFueXRoaW5nIOKGkiBuaWwgKilcbiAgfCBfLCBfIC0+IE5pbCAgICAoKiB0eXBlIG1pc21hdGNoIOKGkiBuaWwgKG1hdGNoZXMgSlMvUHl0aG9uIGJlaGF2aW9yKSAqKVxuXG4oKiogUmVnaXN0ZXIgZ2V0IGFzIGEgcHJpbWl0aXZlIG92ZXJyaWRlIOKAlCB0cmFuc3BpbGVkIGNvZGUgY2FsbHMgKGdldCBkIGspLiAqKVxubGV0ICgpID1cbiAgU3hfcHJpbWl0aXZlcy5yZWdpc3RlciBcImdldFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2M7IGtdIC0+IGdldF92YWwgYyBrXG4gICAgfCBbYzsgazsgZGVmYXVsdF0gLT5cbiAgICAgICh0cnlcbiAgICAgICAgbGV0IHYgPSBnZXRfdmFsIGMgayBpblxuICAgICAgICBpZiB2ID0gTmlsIHRoZW4gZGVmYXVsdCBlbHNlIHZcbiAgICAgIHdpdGggXyAtPiBkZWZhdWx0KVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImdldDogMi0zIGFyZ3NcIikpXG5cblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuKCogUHJpbWl0aXZlIGFsaWFzZXMg4oCUIHRvcC1sZXZlbCBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRyYW5zcGlsZWQgY29kZSAgICAgICAqKVxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuXG4oKiogVGhlIHRyYW5zcGlsZWQgZXZhbHVhdG9yIGNhbGxzIHByaW1pdGl2ZXMgZGlyZWN0bHkgYnkgdGhlaXIgbWFuZ2xlZFxuICAgIE9DYW1sIG5hbWUuIFRoZXNlIGFsaWFzZXMgZGVsZWdhdGUgdG8gdGhlIHByaW1pdGl2ZXMgdGFibGUgc28gdGhlXG4gICAgdHJhbnNwaWxlZCBjb2RlIGNvbXBpbGVzIHdpdGhvdXQgbmVlZGluZyBbcHJpbV9jYWxsXSBldmVyeXdoZXJlLiAqKVxuXG5sZXQgX3ByaW0gbmFtZSA9IG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgU3hfcHJpbWl0aXZlcy5wcmltaXRpdmVzIG5hbWUgd2l0aFxuICB8IFNvbWUgZiAtPiBmIHwgTm9uZSAtPiAoZnVuIF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiTWlzc2luZyBwcmltOiBcIiBeIG5hbWUpKSlcblxuKCogQ29sbGVjdGlvbiBvcHMgKilcbmxldCBmaXJzdCBhcmdzID0gX3ByaW0gXCJmaXJzdFwiIFthcmdzXVxubGV0IHJlc3QgYXJncyA9IF9wcmltIFwicmVzdFwiIFthcmdzXVxubGV0IGxhc3QgYXJncyA9IF9wcmltIFwibGFzdFwiIFthcmdzXVxubGV0IG50aCBjb2xsIGkgPSBfcHJpbSBcIm50aFwiIFtjb2xsOyBpXVxubGV0IGNvbnMgeCBsID0gX3ByaW0gXCJjb25zXCIgW3g7IGxdXG5sZXQgYXBwZW5kIGEgYiA9IF9wcmltIFwiYXBwZW5kXCIgW2E7IGJdXG5sZXQgcmV2ZXJzZSBsID0gX3ByaW0gXCJyZXZlcnNlXCIgW2xdXG5sZXQgZmxhdHRlbiBsID0gX3ByaW0gXCJmbGF0dGVuXCIgW2xdXG5sZXQgY29uY2F0IGEgYiA9IF9wcmltIFwiY29uY2F0XCIgW2E7IGJdXG5sZXQgc2xpY2UgYSBiID0gX3ByaW0gXCJzbGljZVwiIFthOyBiXVxubGV0IGxlbiBhID0gX3ByaW0gXCJsZW5cIiBbYV1cbmxldCBnZXQgYSBiID0gZ2V0X3ZhbCBhIGJcbmxldCBzb3J0JyBhID0gX3ByaW0gXCJzb3J0XCIgW2FdXG5sZXQgcmFuZ2UnIGEgPSBfcHJpbSBcInJhbmdlXCIgW2FdXG5sZXQgdW5pcXVlIGEgPSBfcHJpbSBcInVuaXF1ZVwiIFthXVxubGV0IHppcCBhIGIgPSBfcHJpbSBcInppcFwiIFthOyBiXVxubGV0IHppcF9wYWlycyBhID0gX3ByaW0gXCJ6aXAtcGFpcnNcIiBbYV1cbmxldCB0YWtlIGEgYiA9IF9wcmltIFwidGFrZVwiIFthOyBiXVxubGV0IGRyb3AgYSBiID0gX3ByaW0gXCJkcm9wXCIgW2E7IGJdXG5sZXQgY2h1bmtfZXZlcnkgYSBiID0gX3ByaW0gXCJjaHVuay1ldmVyeVwiIFthOyBiXVxuXG4oKiBQcmVkaWNhdGVzICopXG5sZXQgZW1wdHlfcCBhID0gX3ByaW0gXCJlbXB0eT9cIiBbYV1cbmxldCBuaWxfcCBhID0gX3ByaW0gXCJuaWw/XCIgW2FdXG5sZXQgbnVtYmVyX3AgYSA9IF9wcmltIFwibnVtYmVyP1wiIFthXVxubGV0IHN0cmluZ19wIGEgPSBfcHJpbSBcInN0cmluZz9cIiBbYV1cbmxldCBib29sZWFuX3AgYSA9IF9wcmltIFwiYm9vbGVhbj9cIiBbYV1cbmxldCBsaXN0X3AgYSA9IF9wcmltIFwibGlzdD9cIiBbYV1cbmxldCBkaWN0X3AgYSA9IF9wcmltIFwiZGljdD9cIiBbYV1cbmxldCBzeW1ib2xfcCBhID0gX3ByaW0gXCJzeW1ib2w/XCIgW2FdXG5sZXQga2V5d29yZF9wIGEgPSBfcHJpbSBcImtleXdvcmQ/XCIgW2FdXG5sZXQgY29udGFpbnNfcCBhIGIgPSBfcHJpbSBcImNvbnRhaW5zP1wiIFthOyBiXVxubGV0IGhhc19rZXlfcCBhIGIgPSBfcHJpbSBcImhhcy1rZXk/XCIgW2E7IGJdXG5sZXQgc3RhcnRzX3dpdGhfcCBhIGIgPSBfcHJpbSBcInN0YXJ0cy13aXRoP1wiIFthOyBiXVxubGV0IGVuZHNfd2l0aF9wIGEgYiA9IF9wcmltIFwiZW5kcy13aXRoP1wiIFthOyBiXVxubGV0IHN0cmluZ19jb250YWluc19wIGEgYiA9IF9wcmltIFwic3RyaW5nLWNvbnRhaW5zP1wiIFthOyBiXVxubGV0IG9kZF9wIGEgPSBfcHJpbSBcIm9kZD9cIiBbYV1cbmxldCBldmVuX3AgYSA9IF9wcmltIFwiZXZlbj9cIiBbYV1cbmxldCB6ZXJvX3AgYSA9IF9wcmltIFwiemVybz9cIiBbYV1cblxuKCogU3RyaW5nIG9wcyAqKVxubGV0IHN0cicgYXJncyA9IFN0cmluZyAoc3hfc3RyIGFyZ3MpXG5sZXQgdXBwZXIgYSA9IF9wcmltIFwidXBwZXJcIiBbYV1cbmxldCB1cGNhc2UgYSA9IF9wcmltIFwidXBjYXNlXCIgW2FdXG5sZXQgbG93ZXIgYSA9IF9wcmltIFwibG93ZXJcIiBbYV1cbmxldCBkb3duY2FzZSBhID0gX3ByaW0gXCJkb3duY2FzZVwiIFthXVxubGV0IHRyaW0gYSA9IF9wcmltIFwidHJpbVwiIFthXVxubGV0IHNwbGl0IGEgYiA9IF9wcmltIFwic3BsaXRcIiBbYTsgYl1cbmxldCBqb2luIGEgYiA9IF9wcmltIFwiam9pblwiIFthOyBiXVxubGV0IHJlcGxhY2UgYSBiIGMgPSBfcHJpbSBcInJlcGxhY2VcIiBbYTsgYjsgY11cbmxldCBpbmRleF9vZiBhIGIgPSBfcHJpbSBcImluZGV4LW9mXCIgW2E7IGJdXG5sZXQgc3Vic3RyaW5nIGEgYiBjID0gX3ByaW0gXCJzdWJzdHJpbmdcIiBbYTsgYjsgY11cbmxldCBzdHJpbmdfbGVuZ3RoIGEgPSBfcHJpbSBcInN0cmluZy1sZW5ndGhcIiBbYV1cbmxldCBjaGFyX2Zyb21fY29kZSBhID0gX3ByaW0gXCJjaGFyLWZyb20tY29kZVwiIFthXVxuXG4oKiBEaWN0IG9wcyAqKVxubGV0IGFzc29jIGQgayB2ID0gX3ByaW0gXCJhc3NvY1wiIFtkOyBrOyB2XVxubGV0IGRpc3NvYyBkIGsgPSBfcHJpbSBcImRpc3NvY1wiIFtkOyBrXVxubGV0IG1lcmdlJyBhIGIgPSBfcHJpbSBcIm1lcmdlXCIgW2E7IGJdXG5sZXQga2V5cyBhID0gX3ByaW0gXCJrZXlzXCIgW2FdXG5sZXQgdmFscyBhID0gX3ByaW0gXCJ2YWxzXCIgW2FdXG5sZXQgZGljdF9zZXQgYSBiIGMgPSBfcHJpbSBcImRpY3Qtc2V0IVwiIFthOyBiOyBjXVxubGV0IGRpY3RfZ2V0IGEgYiA9IF9wcmltIFwiZGljdC1nZXRcIiBbYTsgYl1cbmxldCBkaWN0X2hhc19wIGEgYiA9IF9wcmltIFwiZGljdC1oYXM/XCIgW2E7IGJdXG5sZXQgZGljdF9kZWxldGUgYSBiID0gX3ByaW0gXCJkaWN0LWRlbGV0ZSFcIiBbYTsgYl1cblxuKCogTWF0aCAqKVxubGV0IGFicycgYSA9IF9wcmltIFwiYWJzXCIgW2FdXG5sZXQgc3FydCcgYSA9IF9wcmltIFwic3FydFwiIFthXVxubGV0IHBvdycgYSBiID0gX3ByaW0gXCJwb3dcIiBbYTsgYl1cbmxldCBmbG9vcicgYSA9IF9wcmltIFwiZmxvb3JcIiBbYV1cbmxldCBjZWlsJyBhID0gX3ByaW0gXCJjZWlsXCIgW2FdXG5sZXQgcm91bmQnIGEgPSBfcHJpbSBcInJvdW5kXCIgW2FdXG5sZXQgbWluJyBhIGIgPSBfcHJpbSBcIm1pblwiIFthOyBiXVxubGV0IG1heCcgYSBiID0gX3ByaW0gXCJtYXhcIiBbYTsgYl1cbmxldCBjbGFtcCBhIGIgYyA9IF9wcmltIFwiY2xhbXBcIiBbYTsgYjsgY11cbmxldCBwYXJzZV9pbnQgYSA9IF9wcmltIFwicGFyc2UtaW50XCIgW2FdXG5sZXQgcGFyc2VfZmxvYXQgYSA9IF9wcmltIFwicGFyc2UtZmxvYXRcIiBbYV1cblxuKCogTWlzYyAqKVxubGV0IGVycm9yIG1zZyA9IHJhaXNlIChFdmFsX2Vycm9yICh2YWx1ZV90b19zdHIgbXNnKSlcblxuKCogaW5zcGVjdCB3cmFwcGVyIOKAlCByZXR1cm5zIFN0cmluZyB2YWx1ZSBpbnN0ZWFkIG9mIE9DYW1sIHN0cmluZyAqKVxubGV0IGluc3BlY3QgdiA9IFN0cmluZyAoU3hfdHlwZXMuaW5zcGVjdCB2KVxubGV0IGFwcGx5JyBmIGFyZ3MgPSBzeF9hcHBseSBmIGFyZ3NcbmxldCBpZGVudGljYWxfcCBhIGIgPSBfcHJpbSBcImlkZW50aWNhbD9cIiBbYTsgYl1cbmxldCBfaXNfc3ByZWFkX3ByaW0gYSA9IF9wcmltIFwic3ByZWFkP1wiIFthXVxubGV0IHNwcmVhZF9hdHRycyBhID0gX3ByaW0gXCJzcHJlYWQtYXR0cnNcIiBbYV1cbmxldCBtYWtlX3NwcmVhZCBhID0gX3ByaW0gXCJtYWtlLXNwcmVhZFwiIFthXVxuXG4oKiBTY29wZSBwcmltaXRpdmVzIOKAlCBkZWxlZ2F0ZSB0byBzeF9yZWYucHkncyBzaGFyZWQgc2NvcGUgc3RhY2tzICopXG5sZXQgc3hfY29sbGVjdCBhIGIgPSBwcmltX2NhbGwgXCJjb2xsZWN0IVwiIFthOyBiXVxubGV0IHN4X2NvbGxlY3RlZCBhID0gcHJpbV9jYWxsIFwiY29sbGVjdGVkXCIgW2FdXG5sZXQgc3hfY2xlYXJfY29sbGVjdGVkIGEgPSBwcmltX2NhbGwgXCJjbGVhci1jb2xsZWN0ZWQhXCIgW2FdXG5sZXQgc3hfZW1pdCBhIGIgPSBwcmltX2NhbGwgXCJlbWl0IVwiIFthOyBiXVxubGV0IHN4X2VtaXR0ZWQgYSA9IHByaW1fY2FsbCBcImVtaXR0ZWRcIiBbYV1cbmxldCBzeF9jb250ZXh0IGEgYiA9IHByaW1fY2FsbCBcImNvbnRleHRcIiBbYTsgYl1cblxuKCogVHJhbXBvbGluZSDigJQgZm9yd2FyZC1kZWNsYXJlZCBpbiBzeF9yZWYubWwsIGRlbGVnYXRlcyB0byBDRUsgZXZhbF9leHByICopXG4oKiBUaGlzIGlzIGEgc3R1YjsgdGhlIHJlYWwgdHJhbXBvbGluZSBpcyB3aXJlZCB1cCBpbiBzeF9yZWYubWwgYWZ0ZXIgZXZhbF9leHByIGlzIGRlZmluZWQgKilcbmxldCB0cmFtcG9saW5lIHYgPSB2XG5cbigqIFZhbHVlLXJldHVybmluZyB0eXBlIHByZWRpY2F0ZXMg4oCUIHRoZSB0cmFuc3BpbGVkIGNvZGUgcGFzc2VzIHRoZXNlIHRocm91Z2hcbiAgIHN4X3RydXRoeSwgc28gdGhleSBuZWVkIHRvIHJldHVybiBCb29sLCBub3QgT0NhbWwgYm9vbC4gKilcbigqIHR5cGVfb2YgcmV0dXJucyB2YWx1ZSwgbm90IHN0cmluZyAqKVxubGV0IHR5cGVfb2YgdiA9IFN0cmluZyAoU3hfdHlwZXMudHlwZV9vZiB2KVxuXG4oKiBFbnYgb3BlcmF0aW9ucyDigJQgYWNjZXB0IEVudi13cmFwcGVkIHZhbHVlcyBhbmQgdmFsdWUga2V5cy5cbiAgIFRoZSB0cmFuc3BpbGVkIENFSyBtYWNoaW5lIHN0b3JlcyBlbnZzIGluIGRpY3RzIGFzIEVudiB2YWx1ZXMuICopXG5sZXQgdW53cmFwX2VudiA9IGZ1bmN0aW9uXG4gIHwgRW52IGUgLT4gZVxuICB8IERpY3QgZCAtPlxuICAgICgqIERpY3QgdXNlZCBhcyBlbnYg4oCUIHdyYXAgaXQuIE5lZWRlZCBieSBhZGFwdGVyLWh0bWwuc3ggd2hpY2hcbiAgICAgICBwYXNzZXMgZGljdHMgYXMgZW52IGFyZ3MgKGUuZy4gZW1wdHkge30gYXMgY2FsbGVyIGVudikuICopXG4gICAgbGV0IGUgPSBTeF90eXBlcy5tYWtlX2VudiAoKSBpblxuICAgIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAtPiBpZ25vcmUgKFN4X3R5cGVzLmVudl9iaW5kIGUgayB2KSkgZDtcbiAgICBlXG4gIHwgTmlsIC0+XG4gICAgU3hfdHlwZXMubWFrZV9lbnYgKClcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIGVudiwgZ290IFwiIF4gU3hfdHlwZXMudHlwZV9vZiB2KSlcblxubGV0IGVudl9oYXMgZSBuYW1lID0gQm9vbCAoU3hfdHlwZXMuZW52X2hhcyAodW53cmFwX2VudiBlKSAodmFsdWVfdG9fc3RyIG5hbWUpKVxubGV0IGVudl9nZXQgZSBuYW1lID0gU3hfdHlwZXMuZW52X2dldCAodW53cmFwX2VudiBlKSAodmFsdWVfdG9fc3RyIG5hbWUpXG5sZXQgZW52X2JpbmQgZSBuYW1lIHYgPSBTeF90eXBlcy5lbnZfYmluZCAodW53cmFwX2VudiBlKSAodmFsdWVfdG9fc3RyIG5hbWUpIHZcbmxldCBlbnZfc2V0IGUgbmFtZSB2ID0gU3hfdHlwZXMuZW52X3NldCAodW53cmFwX2VudiBlKSAodmFsdWVfdG9fc3RyIG5hbWUpIHZcblxubGV0IG1ha2VfZW52ICgpID0gRW52IChTeF90eXBlcy5tYWtlX2VudiAoKSlcbmxldCBlbnZfZXh0ZW5kIGUgPSBFbnYgKFN4X3R5cGVzLmVudl9leHRlbmQgKHVud3JhcF9lbnYgZSkpXG5sZXQgZW52X21lcmdlIGEgYiA9IEVudiAoU3hfdHlwZXMuZW52X21lcmdlICh1bndyYXBfZW52IGEpICh1bndyYXBfZW52IGIpKVxuXG4oKiBzZXRfbGFtYmRhX25hbWUgd3JhcHBlciDigJQgYWNjZXB0cyB2YWx1ZSwgZXh0cmFjdHMgc3RyaW5nICopXG5sZXQgc2V0X2xhbWJkYV9uYW1lIGwgbiA9IFN4X3R5cGVzLnNldF9sYW1iZGFfbmFtZSBsICh2YWx1ZV90b19zdHIgbilcblxubGV0IGlzX25pbCB2ID0gQm9vbCAoU3hfdHlwZXMuaXNfbmlsIHYpXG5sZXQgaXNfdGh1bmsgdiA9IEJvb2wgKFN4X3R5cGVzLmlzX3RodW5rIHYpXG5sZXQgaXNfbGFtYmRhIHYgPSBCb29sIChTeF90eXBlcy5pc19sYW1iZGEgdilcbmxldCBpc19jb21wb25lbnQgdiA9IEJvb2wgKFN4X3R5cGVzLmlzX2NvbXBvbmVudCB2KVxubGV0IGlzX2lzbGFuZCB2ID0gQm9vbCAoU3hfdHlwZXMuaXNfaXNsYW5kIHYpXG5sZXQgaXNfbWFjcm8gdiA9IEJvb2wgKFN4X3R5cGVzLmlzX21hY3JvIHYpXG5sZXQgaXNfc2lnbmFsIHYgPSBCb29sIChTeF90eXBlcy5pc19zaWduYWwgdilcbmxldCBpc19jYWxsYWJsZSB2ID0gQm9vbCAoU3hfdHlwZXMuaXNfY2FsbGFibGUgdilcbmxldCBpc19pZGVudGljYWwgYSBiID0gQm9vbCAoYSA9PSBiKVxubGV0IGlzX3ByaW1pdGl2ZSBuYW1lID0gQm9vbCAoU3hfcHJpbWl0aXZlcy5pc19wcmltaXRpdmUgKHZhbHVlX3RvX3N0ciBuYW1lKSlcbmxldCBnZXRfcHJpbWl0aXZlIG5hbWUgPSBTeF9wcmltaXRpdmVzLmdldF9wcmltaXRpdmUgKHZhbHVlX3RvX3N0ciBuYW1lKVxubGV0IGlzX3NwcmVhZCB2ID0gbWF0Y2ggdiB3aXRoIFNwcmVhZCBfIC0+IEJvb2wgdHJ1ZSB8IF8gLT4gQm9vbCBmYWxzZVxuXG4oKiBTdHVicyBmb3IgZnVuY3Rpb25zIGRlZmluZWQgaW4gc3hfcmVmLm1sIOKAlCByZXNvbHZlZCBhdCBsaW5rIHRpbWUgKilcbigqIFRoZXNlIGFyZSBmb3J3YXJkLWRlY2xhcmVkIGhlcmU7IHN4X3JlZi5tbCBkZWZpbmVzIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb25zICopXG5cbigqIHN0cmlwLXByZWZpeCAqKVxuKCogU3R1YnMgZm9yIGV2YWx1YXRvciBmdW5jdGlvbnMg4oCUIGRlZmluZWQgaW4gc3hfcmVmLm1sIGJ1dFxuICAgc29tZXRpbWVzIHJlZmVyZW5jZWQgYmVmb3JlIHRoZWlyIGRlZmluaXRpb24gdmlhIGZvcndhcmQgY2FsbHMuXG4gICBUaGVzZSBnZXQgb3ZlcnJpZGRlbiBieSB0aGUgYWN0dWFsIHRyYW5zcGlsZWQgZGVmaW5pdGlvbnMuICopXG5cbmxldCBtYXBfaW5kZXhlZCBmbiBjb2xsID1cbiAgTGlzdCAoTGlzdC5tYXBpIChmdW4gaSB4IC0+IHN4X2NhbGwgZm4gW051bWJlciAoZmxvYXRfb2ZfaW50IGkpOyB4XSkgKHN4X3RvX2xpc3QgY29sbCkpXG5cbmxldCBtYXBfZGljdCBmbiBkID1cbiAgbWF0Y2ggZCB3aXRoXG4gIHwgRGljdCB0YmwgLT5cbiAgICBsZXQgcmVzdWx0ID0gSGFzaHRibC5jcmVhdGUgKEhhc2h0YmwubGVuZ3RoIHRibCkgaW5cbiAgICBIYXNodGJsLml0ZXIgKGZ1biBrIHYgLT4gSGFzaHRibC5yZXBsYWNlIHJlc3VsdCBrIChzeF9jYWxsIGZuIFtTdHJpbmcgazsgdl0pKSB0Ymw7XG4gICAgRGljdCByZXN1bHRcbiAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibWFwLWRpY3Q6IGV4cGVjdGVkIGRpY3RcIilcblxubGV0IGZvcl9lYWNoIGZuIGNvbGwgPVxuICBMaXN0Lml0ZXIgKGZ1biB4IC0+IGlnbm9yZSAoc3hfY2FsbCBmbiBbeF0pKSAoc3hfdG9fbGlzdCBjb2xsKTtcbiAgTmlsXG5cbmxldCBmb3JfZWFjaF9pbmRleGVkIGZuIGNvbGwgPVxuICBMaXN0Lml0ZXJpIChmdW4gaSB4IC0+IGlnbm9yZSAoc3hfY2FsbCBmbiBbTnVtYmVyIChmbG9hdF9vZl9pbnQgaSk7IHhdKSkgKHN4X3RvX2xpc3QgY29sbCk7XG4gIE5pbFxuXG4oKiBDb250aW51YXRpb24gc3VwcG9ydCAqKVxubGV0IGNvbnRpbnVhdGlvbl9wIHYgPSBtYXRjaCB2IHdpdGggQ29udGludWF0aW9uIChfLCBfKSAtPiBCb29sIHRydWUgfCBfIC0+IEJvb2wgZmFsc2VcblxubGV0IG1ha2VfY2VrX2NvbnRpbnVhdGlvbiBjYXB0dXJlZCByZXN0X2tvbnQgPVxuICBsZXQgZGF0YSA9IEhhc2h0YmwuY3JlYXRlIDIgaW5cbiAgSGFzaHRibC5yZXBsYWNlIGRhdGEgXCJjYXB0dXJlZFwiIGNhcHR1cmVkO1xuICBIYXNodGJsLnJlcGxhY2UgZGF0YSBcInJlc3Qta29udFwiIHJlc3Rfa29udDtcbiAgQ29udGludWF0aW9uICgoZnVuIHYgLT4gdiksIFNvbWUgZGF0YSlcblxubGV0IGNvbnRpbnVhdGlvbl9kYXRhIHYgPSBtYXRjaCB2IHdpdGhcbiAgfCBDb250aW51YXRpb24gKF8sIFNvbWUgZCkgLT4gRGljdCBkXG4gIHwgQ29udGludWF0aW9uIChfLCBOb25lKSAtPiBEaWN0IChIYXNodGJsLmNyZWF0ZSAwKVxuICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJub3QgYSBjb250aW51YXRpb25cIilcblxuKCogRHluYW1pYyB3aW5kIOKAlCBzaW1wbGlmaWVkIGZvciBPQ2FtbCAobm8gYXN5bmMpICopXG5sZXQgZHluYW1pY193aW5kX2NhbGwgYmVmb3JlIGJvZHkgYWZ0ZXIgX2VudiA9XG4gIGlnbm9yZSAoc3hfY2FsbCBiZWZvcmUgW10pO1xuICBsZXQgcmVzdWx0ID0gc3hfY2FsbCBib2R5IFtdIGluXG4gIGlnbm9yZSAoc3hfY2FsbCBhZnRlciBbXSk7XG4gIHJlc3VsdFxuXG4oKiBTY29wZSBzdGFjayDigJQgYWxsIGRlbGVnYXRlZCB0byBwcmltaXRpdmVzIHJlZ2lzdGVyZWQgaW4gc3hfc2VydmVyLm1sICopXG5sZXQgc2NvcGVfcHVzaCBuYW1lIHZhbHVlID0gcHJpbV9jYWxsIFwic2NvcGUtcHVzaCFcIiBbbmFtZTsgdmFsdWVdXG5sZXQgc2NvcGVfcG9wIG5hbWUgPSBwcmltX2NhbGwgXCJzY29wZS1wb3AhXCIgW25hbWVdXG5sZXQgc2NvcGVfcGVlayBuYW1lID0gcHJpbV9jYWxsIFwic2NvcGUtcGVla1wiIFtuYW1lXVxubGV0IHNjb3BlX2VtaXQgbmFtZSB2YWx1ZSA9IHByaW1fY2FsbCBcInNjb3BlLWVtaXQhXCIgW25hbWU7IHZhbHVlXVxubGV0IHByb3ZpZGVfcHVzaCBuYW1lIHZhbHVlID0gcHJpbV9jYWxsIFwic2NvcGUtcHVzaCFcIiBbbmFtZTsgdmFsdWVdXG5sZXQgcHJvdmlkZV9wb3AgbmFtZSA9IHByaW1fY2FsbCBcInNjb3BlLXBvcCFcIiBbbmFtZV1cblxuKCogQ3VzdG9tIHNwZWNpYWwgZm9ybXMgcmVnaXN0cnkg4oCUIG11dGFibGUgZGljdCAqKVxubGV0IGN1c3RvbV9zcGVjaWFsX2Zvcm1zID0gRGljdCAoSGFzaHRibC5jcmVhdGUgNClcblxuKCogcmVnaXN0ZXItc3BlY2lhbC1mb3JtISDigJQgYWRkIGEgaGFuZGxlciB0byB0aGUgY3VzdG9tIHJlZ2lzdHJ5ICopXG5sZXQgcmVnaXN0ZXJfc3BlY2lhbF9mb3JtIG5hbWUgaGFuZGxlciA9XG4gIChtYXRjaCBjdXN0b21fc3BlY2lhbF9mb3JtcyB3aXRoXG4gICB8IERpY3QgdGJsIC0+IEhhc2h0YmwucmVwbGFjZSB0YmwgKHZhbHVlX3RvX3N0ciBuYW1lKSBoYW5kbGVyOyBoYW5kbGVyXG4gICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJjdXN0b21fc3BlY2lhbF9mb3JtcyBub3QgYSBkaWN0XCIpKVxuXG4oKiBSZW5kZXIgY2hlY2svZm4gaG9va3Mg4oCUIG5pbCBieSBkZWZhdWx0LCBzZXQgYnkgcGxhdGZvcm0gaWYgbmVlZGVkICopXG5sZXQgcmVuZGVyX2NoZWNrID0gTmlsXG5sZXQgcmVuZGVyX2ZuID0gTmlsXG5cbigqIGlzLWVsc2UtY2xhdXNlPyDigJQgY2hlY2sgaWYgYSBjb25kL2Nhc2UgdGVzdCBpcyBhbiBlbHNlIG1hcmtlciAqKVxubGV0IGlzX2Vsc2VfY2xhdXNlIHYgPVxuICBtYXRjaCB2IHdpdGhcbiAgfCBLZXl3b3JkIGsgLT4gQm9vbCAoayA9IFwiZWxzZVwiIHx8IGsgPSBcImRlZmF1bHRcIilcbiAgfCBTeW1ib2wgcyAtPiBCb29sIChzID0gXCJlbHNlXCIgfHwgcyA9IFwiZGVmYXVsdFwiKVxuICB8IEJvb2wgdHJ1ZSAtPiBCb29sIHRydWVcbiAgfCBfIC0+IEJvb2wgZmFsc2VcblxuKCogU2lnbmFsIGFjY2Vzc29ycyAqKVxubGV0IHNpZ25hbF92YWx1ZSBzID0gbWF0Y2ggcyB3aXRoXG4gIHwgU2lnbmFsIHNpZycgLT4gc2lnJy5zX3ZhbHVlXG4gIHwgRGljdCBkIC0+IChtYXRjaCBIYXNodGJsLmZpbmRfb3B0IGQgXCJ2YWx1ZVwiIHdpdGggU29tZSB2IC0+IHYgfCBOb25lIC0+IE5pbClcbiAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibm90IGEgc2lnbmFsXCIpXG5sZXQgc2lnbmFsX3NldF92YWx1ZSBzIHYgPSBtYXRjaCBzIHdpdGggU2lnbmFsIHNpZycgLT4gc2lnJy5zX3ZhbHVlIDwtIHY7IHYgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibm90IGEgc2lnbmFsXCIpXG5sZXQgc2lnbmFsX3N1YnNjcmliZXJzIHMgPSBtYXRjaCBzIHdpdGggU2lnbmFsIHNpZycgLT4gTGlzdCAoTGlzdC5tYXAgKGZ1biBfIC0+IE5pbCkgc2lnJy5zX3N1YnNjcmliZXJzKSB8IF8gLT4gTGlzdCBbXVxubGV0IHNpZ25hbF9hZGRfc3ViX2IgcyBmID1cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgRGljdCBkIC0+XG4gICAgKG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgZCBcInN1YnNjcmliZXJzXCIgd2l0aFxuICAgICB8IFNvbWUgKExpc3RSZWYgcikgLT4gciA6PSAhciBAIFtmXTsgTmlsXG4gICAgIHwgU29tZSAoTGlzdCBpdGVtcykgLT4gSGFzaHRibC5yZXBsYWNlIGQgXCJzdWJzY3JpYmVyc1wiIChMaXN0UmVmIChyZWYgKGl0ZW1zIEAgW2ZdKSkpOyBOaWxcbiAgICAgfCBfIC0+IEhhc2h0YmwucmVwbGFjZSBkIFwic3Vic2NyaWJlcnNcIiAoTGlzdFJlZiAocmVmIFtmXSkpOyBOaWwpXG4gIHwgXyAtPiBOaWxcblxubGV0IHNpZ25hbF9yZW1vdmVfc3ViX2IgcyBmID1cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgRGljdCBkIC0+XG4gICAgKG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgZCBcInN1YnNjcmliZXJzXCIgd2l0aFxuICAgICB8IFNvbWUgKExpc3RSZWYgcikgLT4gciA6PSBMaXN0LmZpbHRlciAoZnVuIHggLT4geCAhPSBmKSAhcjsgTmlsXG4gICAgIHwgU29tZSAoTGlzdCBpdGVtcykgLT4gSGFzaHRibC5yZXBsYWNlIGQgXCJzdWJzY3JpYmVyc1wiIChMaXN0IChMaXN0LmZpbHRlciAoZnVuIHggLT4geCAhPSBmKSBpdGVtcykpOyBOaWxcbiAgICAgfCBfIC0+IE5pbClcbiAgfCBfIC0+IE5pbFxuXG5sZXQgc2lnbmFsX2RlcHMgcyA9XG4gIG1hdGNoIHMgd2l0aFxuICB8IERpY3QgZCAtPiAobWF0Y2ggSGFzaHRibC5maW5kX29wdCBkIFwiZGVwc1wiIHdpdGggU29tZSB2IC0+IHYgfCBOb25lIC0+IExpc3QgW10pXG4gIHwgXyAtPiBMaXN0IFtdXG5cbmxldCBzaWduYWxfc2V0X2RlcHMgcyBkID1cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgRGljdCB0YmwgLT4gSGFzaHRibC5yZXBsYWNlIHRibCBcImRlcHNcIiBkOyBOaWxcbiAgfCBfIC0+IE5pbFxuXG5sZXQgbm90aWZ5X3N1YnNjcmliZXJzIHMgPVxuICBsZXQgc3VicyA9IG1hdGNoIHMgd2l0aFxuICAgIHwgRGljdCBkIC0+IChtYXRjaCBIYXNodGJsLmZpbmRfb3B0IGQgXCJzdWJzY3JpYmVyc1wiIHdpdGhcbiAgICAgICB8IFNvbWUgKExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0pIHwgU29tZSAoTGlzdCBpdGVtcykgLT4gaXRlbXNcbiAgICAgICB8IF8gLT4gW10pXG4gICAgfCBfIC0+IFtdXG4gIGluXG4gIExpc3QuaXRlciAoZnVuIGYgLT4gaWdub3JlIChzeF9jYWxsIGYgW10pKSBzdWJzO1xuICBOaWxcblxubGV0IGZsdXNoX3N1YnNjcmliZXJzIF9zID0gTmlsXG5sZXQgZGlzcG9zZV9jb21wdXRlZCBfcyA9IE5pbFxuXG4oKiBJc2xhbmQgc2NvcGUgc3R1YnMg4oCUIGFjY2VwdCBib3RoIGJhcmUgT0NhbWwgZm5zIGFuZCBOYXRpdmVGbiB2YWx1ZXNcbiAgIGZyb20gdHJhbnNwaWxlZCBjb2RlIChOYXRpdmVGbiB3cmFwcGluZyBmb3IgdmFsdWUtc3RvcmFibGUgbGFtYmRhcykuICopXG5sZXQgd2l0aF9pc2xhbmRfc2NvcGUgX3JlZ2lzdGVyX2ZuIGJvZHlfZm4gPVxuICBtYXRjaCBib2R5X2ZuIHdpdGhcbiAgfCBOYXRpdmVGbiAoXywgZikgLT4gZiBbXVxuICB8IF8gLT4gTmlsXG5sZXQgcmVnaXN0ZXJfaW5fc2NvcGUgX2Rpc3Bvc2VfZm4gPSBOaWxcblxuKCogQ29tcG9uZW50IHR5cGUgYW5ub3RhdGlvbiBzdHViICopXG5sZXQgY29tcG9uZW50X3NldF9wYXJhbV90eXBlc19iIF9jb21wIF90eXBlcyA9IE5pbFxuXG4oKiBQYXJzZSBrZXl3b3JkIGFyZ3MgZnJvbSBhIGNhbGwg4oCUIHRoaXMgaXMgZGVmaW5lZCBpbiBldmFsdWF0b3Iuc3gsXG4gICB0aGUgdHJhbnNwaWxlZCB2ZXJzaW9uIHdpbGwgb3ZlcnJpZGUgdGhpcyBzdHViLiAqKVxuKCogRm9yd2FyZC1yZWZlcmVuY2Ugc3R1YnMgZm9yIGV2YWx1YXRvciBmdW5jdGlvbnMgdXNlZCBiZWZvcmUgZGVmaW5pdGlvbiAqKVxubGV0IHBhcnNlX2NvbXBfcGFyYW1zIF9wYXJhbXMgPSBMaXN0IFtMaXN0IFtdOyBOaWw7IEJvb2wgZmFsc2VdXG5sZXQgcGFyc2VfbWFjcm9fcGFyYW1zIF9wYXJhbXMgPSBMaXN0IFtMaXN0IFtdOyBOaWxdXG5cbmxldCBwYXJzZV9rZXl3b3JkX2FyZ3MgX3Jhd19hcmdzIF9lbnYgPVxuICAoKiBTdHViIOKAlCB0aGUgcmVhbCBpbXBsZW1lbnRhdGlvbiBpcyB0cmFuc3BpbGVkIGZyb20gZXZhbHVhdG9yLnN4ICopXG4gIExpc3QgW0RpY3QgKEhhc2h0YmwuY3JlYXRlIDApOyBMaXN0IFtdXVxuXG4oKiBNYWtlIGhhbmRsZXIvcXVlcnkvYWN0aW9uL3BhZ2UgZGVmIHN0dWJzICopXG5sZXQgbWFrZV9oYW5kbGVyX2RlZiBuYW1lIHBhcmFtcyBib2R5IF9lbnYgPSBEaWN0IChsZXQgZCA9IEhhc2h0YmwuY3JlYXRlIDQgaW4gSGFzaHRibC5yZXBsYWNlIGQgXCJ0eXBlXCIgKFN0cmluZyBcImhhbmRsZXJcIik7IEhhc2h0YmwucmVwbGFjZSBkIFwibmFtZVwiIG5hbWU7IEhhc2h0YmwucmVwbGFjZSBkIFwicGFyYW1zXCIgcGFyYW1zOyBIYXNodGJsLnJlcGxhY2UgZCBcImJvZHlcIiBib2R5OyBkKVxubGV0IG1ha2VfcXVlcnlfZGVmIG5hbWUgcGFyYW1zIGJvZHkgX2VudiA9IG1ha2VfaGFuZGxlcl9kZWYgbmFtZSBwYXJhbXMgYm9keSBfZW52XG5sZXQgbWFrZV9hY3Rpb25fZGVmIG5hbWUgcGFyYW1zIGJvZHkgX2VudiA9IG1ha2VfaGFuZGxlcl9kZWYgbmFtZSBwYXJhbXMgYm9keSBfZW52XG5sZXQgbWFrZV9wYWdlX2RlZiBuYW1lIF9vcHRzID0gRGljdCAobGV0IGQgPSBIYXNodGJsLmNyZWF0ZSA0IGluIEhhc2h0YmwucmVwbGFjZSBkIFwidHlwZVwiIChTdHJpbmcgXCJwYWdlXCIpOyBIYXNodGJsLnJlcGxhY2UgZCBcIm5hbWVcIiBuYW1lOyBkKVxuXG4oKiBzZi1kZWYqIHN0dWJzIOKAlCBwbGF0Zm9ybS1zcGVjaWZpYyBkZWYtZm9ybXMsIG5vdCBpbiB0aGUgU1ggc3BlYyAqKVxubGV0IHNmX2RlZmhhbmRsZXIgYXJncyBlbnYgPVxuICBsZXQgbmFtZSA9IGZpcnN0IGFyZ3MgaW4gbGV0IHJlc3RfYXJncyA9IHJlc3QgYXJncyBpblxuICBtYWtlX2hhbmRsZXJfZGVmIG5hbWUgKGZpcnN0IHJlc3RfYXJncykgKG50aCByZXN0X2FyZ3MgKE51bWJlciAxLjApKSBlbnZcbmxldCBzZl9kZWZxdWVyeSBhcmdzIGVudiA9IHNmX2RlZmhhbmRsZXIgYXJncyBlbnZcbmxldCBzZl9kZWZhY3Rpb24gYXJncyBlbnYgPSBzZl9kZWZoYW5kbGVyIGFyZ3MgZW52XG5sZXQgc2ZfZGVmcGFnZSBhcmdzIF9lbnYgPVxuICBsZXQgbmFtZSA9IGZpcnN0IGFyZ3MgaW4gbWFrZV9wYWdlX2RlZiBuYW1lIChyZXN0IGFyZ3MpXG5cbmxldCBzdHJpcF9wcmVmaXggcyBwcmVmaXggPVxuICBtYXRjaCBzLCBwcmVmaXggd2l0aFxuICB8IFN0cmluZyBzLCBTdHJpbmcgcCAtPlxuICAgIGxldCBwbCA9IFN0cmluZy5sZW5ndGggcCBpblxuICAgIGlmIFN0cmluZy5sZW5ndGggcyA+PSBwbCAmJiBTdHJpbmcuc3ViIHMgMCBwbCA9IHBcbiAgICB0aGVuIFN0cmluZyAoU3RyaW5nLnN1YiBzIHBsIChTdHJpbmcubGVuZ3RoIHMgLSBwbCkpXG4gICAgZWxzZSBTdHJpbmcgc1xuICB8IF8gLT4gc1xuXG4oKiBkZWJ1Z19sb2cg4oCUIG5vLW9wIGluIHByb2R1Y3Rpb24sIHVzZWQgYnkgQ0VLIGV2YWx1YXRvciBmb3IgY29tcG9uZW50IHdhcm5pbmdzICopXG5sZXQgZGVidWdfbG9nIF8gXyA9IE5pbFxuXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfbWxfc3RyaW5nX2xlbmd0aCIsImNhbWxfc3RyaW5nX2NvbXBhcmUiLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfU3RyaW5nIiwiU3RkbGliX0hhc2h0YmwiLCJTdGRsaWJfTGlzdCIsIlN0ZGxpYiIsIlN4X3R5cGVzIiwiU3hfcHJpbWl0aXZlcyIsIlN0ZGxpYl9GbG9hdCIsIlN0ZGxpYl9QcmludGYiLCJwcmltX2NhbGwiLCJuYW1lIiwiYXJncyIsIm1hdGNoIiwiY3N0IiwidmFsdWVfdG9fc3RyIiwidiIsIm4iLCJzIiwic3hfdG9fc3RyaW5nIiwic3hfc3RyIiwic3hfdG9fbGlzdCIsImwiLCJyIiwic3hfY2FsbCIsImxvY2FsIiwicCIsImEiLCJrIiwieCIsImZuIiwiY2wiLCJzeF9hcHBseSIsImFyZ3NfbGlzdCIsInN4X2FwcGVuZF9iIiwibHN0IiwiaXRlbSIsIml0ZW1zIiwic3hfZGljdF9zZXRfYiIsImQiLCJ0YmwiLCJrZXkiLCJjc3RfYm9keSIsImNzdF9lbHNlIiwiY3N0X2VtaXR0ZWQiLCJjc3RfbmFtZSIsImNzdF90eXBlIiwiY3N0X3ZhbHVlIiwiZ2V0X3ZhbCIsImNvbnRhaW5lciIsImNzdF9lbnYiLCJjc3RfcGhhc2UiLCJzd2l0Y2gkIiwiZXhuIiwiYyIsImRlZmF1bHQkIiwicHJpbSIsInBhcmFtIiwiZmlyc3QiLCJyZXN0IiwibGFzdCIsIm50aCIsImNvbGwiLCJpIiwiY29ucyIsImFwcGVuZCIsImIiLCJyZXZlcnNlIiwiZmxhdHRlbiIsImNvbmNhdCIsInNsaWNlIiwibGVuIiwiZ2V0Iiwic29ydCIsInJhbmdlIiwidW5pcXVlIiwiemlwIiwiemlwX3BhaXJzIiwidGFrZSIsImRyb3AiLCJjaHVua19ldmVyeSIsImVtcHR5X3AiLCJuaWxfcCIsIm51bWJlcl9wIiwic3RyaW5nX3AiLCJib29sZWFuX3AiLCJsaXN0X3AiLCJkaWN0X3AiLCJzeW1ib2xfcCIsImtleXdvcmRfcCIsImNvbnRhaW5zX3AiLCJoYXNfa2V5X3AiLCJzdGFydHNfd2l0aF9wIiwiZW5kc193aXRoX3AiLCJzdHJpbmdfY29udGFpbnNfcCIsIm9kZF9wIiwiZXZlbl9wIiwiemVyb19wIiwic3RyIiwidXBwZXIiLCJ1cGNhc2UiLCJsb3dlciIsImRvd25jYXNlIiwidHJpbSIsInNwbGl0Iiwiam9pbiIsInJlcGxhY2UiLCJpbmRleF9vZiIsInN1YnN0cmluZyIsInN0cmluZ19sZW5ndGgiLCJjaGFyX2Zyb21fY29kZSIsImFzc29jIiwiZGlzc29jIiwibWVyZ2UiLCJrZXlzIiwidmFscyIsImRpY3Rfc2V0IiwiZGljdF9nZXQiLCJkaWN0X2hhc19wIiwiZGljdF9kZWxldGUiLCJhYnMiLCJzcXJ0IiwicG93IiwiZmxvb3IiLCJjZWlsIiwicm91bmQiLCJtaW4iLCJtYXgiLCJjbGFtcCIsInBhcnNlX2ludCIsInBhcnNlX2Zsb2F0IiwiZXJyb3IiLCJtc2ciLCJpbnNwZWN0IiwiYXBwbHkiLCJpZGVudGljYWxfcCIsImlzX3NwcmVhZF9wcmltIiwic3ByZWFkX2F0dHJzIiwibWFrZV9zcHJlYWQiLCJzeF9jb2xsZWN0Iiwic3hfY29sbGVjdGVkIiwic3hfY2xlYXJfY29sbGVjdGVkIiwic3hfZW1pdCIsInN4X2VtaXR0ZWQiLCJzeF9jb250ZXh0IiwidHJhbXBvbGluZSIsInR5cGVfb2YiLCJ1bndyYXBfZW52IiwiZSIsImVudl9oYXMiLCJlbnZfZ2V0IiwiZW52X2JpbmQiLCJlbnZfc2V0IiwibWFrZV9lbnYiLCJlbnZfZXh0ZW5kIiwiZW52X21lcmdlIiwic2V0X2xhbWJkYV9uYW1lIiwiaXNfbmlsIiwiaXNfdGh1bmsiLCJpc19sYW1iZGEiLCJpc19jb21wb25lbnQiLCJpc19pc2xhbmQiLCJpc19tYWNybyIsImlzX3NpZ25hbCIsImlzX2NhbGxhYmxlIiwiaXNfaWRlbnRpY2FsIiwiaXNfcHJpbWl0aXZlIiwiZ2V0X3ByaW1pdGl2ZSIsImlzX3NwcmVhZCIsIm1hcF9pbmRleGVkIiwibWFwX2RpY3QiLCJyZXN1bHQiLCJmb3JfZWFjaCIsImZvcl9lYWNoX2luZGV4ZWQiLCJjb250aW51YXRpb25fcCIsIm1ha2VfY2VrX2NvbnRpbnVhdGlvbiIsImNhcHR1cmVkIiwicmVzdF9rb250IiwiZGF0YSIsImNvbnRpbnVhdGlvbl9kYXRhIiwiZHluYW1pY193aW5kX2NhbGwiLCJiZWZvcmUiLCJib2R5IiwiYWZ0ZXIiLCJlbnYiLCJjc3Rfc2NvcGVfcHVzaCIsInNjb3BlX3B1c2giLCJ2YWx1ZSIsImNzdF9zY29wZV9wb3AiLCJzY29wZV9wb3AiLCJzY29wZV9wZWVrIiwic2NvcGVfZW1pdCIsInByb3ZpZGVfcHVzaCIsInByb3ZpZGVfcG9wIiwiY3VzdG9tX3NwZWNpYWxfZm9ybXMiLCJyZWdpc3Rlcl9zcGVjaWFsX2Zvcm0iLCJoYW5kbGVyIiwiaXNfZWxzZV9jbGF1c2UiLCJjc3RfZGVmYXVsdCIsImNzdF9ub3RfYV9zaWduYWwiLCJzaWduYWxfdmFsdWUiLCJzaWciLCJzaWduYWxfc2V0X3ZhbHVlIiwic2lnbmFsX3N1YnNjcmliZXJzIiwiY3N0X3N1YnNjcmliZXJzIiwic2lnbmFsX2FkZF9zdWJfYiIsInNpZ25hbF9yZW1vdmVfc3ViX2IiLCJjc3RfZGVwcyIsInNpZ25hbF9kZXBzIiwic2lnbmFsX3NldF9kZXBzIiwibm90aWZ5X3N1YnNjcmliZXJzIiwic3VicyIsImZsdXNoX3N1YnNjcmliZXJzIiwiZGlzcG9zZV9jb21wdXRlZCIsIndpdGhfaXNsYW5kX3Njb3BlIiwicmVnaXN0ZXJfZm4iLCJib2R5X2ZuIiwicmVnaXN0ZXJfaW5fc2NvcGUiLCJkaXNwb3NlX2ZuIiwiY29tcG9uZW50X3NldF9wYXJhbV90eXBlc19iIiwiY29tcCIsInR5cGVzIiwicGFyc2VfY29tcF9wYXJhbXMiLCJwYXJhbXMiLCJwYXJzZV9tYWNyb19wYXJhbXMiLCJwYXJzZV9rZXl3b3JkX2FyZ3MiLCJyYXdfYXJncyIsIm1ha2VfaGFuZGxlcl9kZWYiLCJtYWtlX3F1ZXJ5X2RlZiIsIm1ha2VfYWN0aW9uX2RlZiIsIm1ha2VfcGFnZV9kZWYiLCJvcHRzIiwic2ZfZGVmaGFuZGxlciIsInJlc3RfYXJncyIsInNmX2RlZnF1ZXJ5Iiwic2ZfZGVmYWN0aW9uIiwic2ZfZGVmcGFnZSIsInN0cmlwX3ByZWZpeCIsInByZWZpeCIsInBsIiwiZGVidWdfbG9nIl0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxJQUFBQyxzQkFBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQyxXQUFBRixHQUFBQyxJQUFBRTtBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsV0FBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsWUFBQUMsVUFBQUMsTUFBQUM7QUFBQUEsUUFBQUMsUUNVUTtBQUFBLElBQThDLGNBQUFoQixJQUFBLFVBQ3hDLDBCQUMrQztBQUFBLFlBQS9CO0FBQUEsSUFBOEI7QUFBQSxHQUFDO0FBQUEsT0FBQWlCLE1EWjdEO0FBQUEsWUFBQUMsYUFB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QUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFRGhWbEQiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoyOTcyOCwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiIuc3gub2Jqcy9qc29vL2RlZmF1bHQvc3guY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi93b3Jrc3BhY2Vfcm9vdC9saWIvc3hfcmVmLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCogc3hfcmVmLm1sIOKAlCBBdXRvLWdlbmVyYXRlZCBmcm9tIFNYIHNwZWMgYnkgaG9zdHMvb2NhbWwvYm9vdHN0cmFwLnB5ICopXG4oKiBEbyBub3QgZWRpdCDigJQgcmVnZW5lcmF0ZSB3aXRoOiBweXRob24zIGhvc3RzL29jYW1sL2Jvb3RzdHJhcC5weSAqKVxuXG5bQEBAd2FybmluZyBcIi0yNi0yN1wiXVxuXG5vcGVuIFN4X3R5cGVzXG5vcGVuIFN4X3J1bnRpbWVcblxuKCogVHJhbXBvbGluZSDigJQgZm9yd2FyZCByZWYsIHJlc29sdmVkIGFmdGVyIGV2YWxfZXhwciBpcyBkZWZpbmVkLiAqKVxubGV0IHRyYW1wb2xpbmVfZm4gOiAodmFsdWUgLT4gdmFsdWUpIHJlZiA9IHJlZiAoZnVuIHYgLT4gdilcbmxldCB0cmFtcG9saW5lIHYgPSAhdHJhbXBvbGluZV9mbiB2XG5cblxuXG4oKiA9PT0gTXV0YWJsZSBzdGF0ZSBmb3Igc3RyaWN0IG1vZGUgPT09ICopXG4oKiBUaGVzZSBhcmUgZGVmaW5lZCBhcyB0b3AtbGV2ZWwgcmVmcyBiZWNhdXNlIHRoZSB0cmFuc3BpbGVyIGNhbm5vdCBoYW5kbGVcbiAgIGdsb2JhbCBzZXQhIG11dGF0aW9uIChpdCBjcmVhdGVzIGxvY2FsIHJlZnMgdGhhdCBzaGFkb3cgdGhlIGdsb2JhbCkuICopXG5sZXQgX3N0cmljdF9yZWYgPSByZWYgKEJvb2wgZmFsc2UpXG5sZXQgX3ByaW1fcGFyYW1fdHlwZXNfcmVmID0gcmVmIE5pbFxuXG4oKiBKSVQgY2FsbCBob29rIOKAlCBjZWtfY2FsbCBjaGVja3MgdGhpcyBiZWZvcmUgQ0VLIGRpc3BhdGNoIGZvciBuYW1lZFxuICAgbGFtYmRhcy4gIFJlZ2lzdGVyZWQgYnkgc3hfc2VydmVyLm1sIGFmdGVyIGNvbXBpbGVyIGxvYWRzLiAgVGVzdHNcbiAgIHJ1biB3aXRoIGhvb2sgPSBOb25lIChwdXJlIENFSywgbm8gY29tcGlsYXRpb24gZGVwZW5kZW5jeSkuICopXG5sZXQgaml0X2NhbGxfaG9vayA6ICh2YWx1ZSAtPiB2YWx1ZSBsaXN0IC0+IHZhbHVlIG9wdGlvbikgb3B0aW9uIHJlZiA9IHJlZiBOb25lXG5cblxuXG4oKiA9PT0gVHJhbnNwaWxlZCBmcm9tIGV2YWx1YXRvciAoZnJhbWVzICsgZXZhbCArIENFSykgPT09ICopXG5cbigqIG1ha2UtY2VrLXN0YXRlICopXG5sZXQgcmVjIG1ha2VfY2VrX3N0YXRlIGNvbnRyb2wgZW52IGtvbnQgPVxuICAoQ2VrU3RhdGUgeyBjc19jb250cm9sID0gY29udHJvbDsgY3NfZW52ID0gZW52OyBjc19rb250ID0ga29udDsgY3NfcGhhc2UgPSBcImV2YWxcIjsgY3NfdmFsdWUgPSBOaWwgfSlcblxuKCogbWFrZS1jZWstdmFsdWUgKilcbmFuZCBtYWtlX2Nla192YWx1ZSB2YWx1ZSBlbnYga29udCA9XG4gIChDZWtTdGF0ZSB7IGNzX2NvbnRyb2wgPSBOaWw7IGNzX2VudiA9IGVudjsgY3Nfa29udCA9IGtvbnQ7IGNzX3BoYXNlID0gXCJjb250aW51ZVwiOyBjc192YWx1ZSA9IHZhbHVlIH0pXG5cbigqIGNlay10ZXJtaW5hbD8gKilcbmFuZCBjZWtfdGVybWluYWxfcCBzdGF0ZSA9XG4gIChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyhnZXQgKHN0YXRlKSAoKFN0cmluZyBcInBoYXNlXCIpKSk7IChTdHJpbmcgXCJjb250aW51ZVwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChlbXB0eV9wICgoZ2V0IChzdGF0ZSkgKChTdHJpbmcgXCJrb250XCIpKSkpKSlcblxuKCogY2VrLWNvbnRyb2wgKilcbmFuZCBjZWtfY29udHJvbCBzID1cbiAgKGdldCAocykgKChTdHJpbmcgXCJjb250cm9sXCIpKSlcblxuKCogY2VrLWVudiAqKVxuYW5kIGNla19lbnYgcyA9XG4gIChnZXQgKHMpICgoU3RyaW5nIFwiZW52XCIpKSlcblxuKCogY2VrLWtvbnQgKilcbmFuZCBjZWtfa29udCBzID1cbiAgKGdldCAocykgKChTdHJpbmcgXCJrb250XCIpKSlcblxuKCogY2VrLXBoYXNlICopXG5hbmQgY2VrX3BoYXNlIHMgPVxuICAoZ2V0IChzKSAoKFN0cmluZyBcInBoYXNlXCIpKSlcblxuKCogY2VrLXZhbHVlICopXG5hbmQgY2VrX3ZhbHVlIHMgPVxuICAoZ2V0IChzKSAoKFN0cmluZyBcInZhbHVlXCIpKSlcblxuKCogbWFrZS1pZi1mcmFtZSAqKVxuYW5kIG1ha2VfaWZfZnJhbWUgdGhlbl9leHByIGVsc2VfZXhwciBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJpZlwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBlbHNlX2V4cHI7IGNmX2JvZHkgPSB0aGVuX2V4cHI7IGNmX3JlbWFpbmluZyA9IE5pbDsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBOaWw7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLXdoZW4tZnJhbWUgKilcbmFuZCBtYWtlX3doZW5fZnJhbWUgYm9keV9leHBycyBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJ3aGVuXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IE5pbDsgY2ZfYm9keSA9IGJvZHlfZXhwcnM7IGNmX3JlbWFpbmluZyA9IE5pbDsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBOaWw7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLWJlZ2luLWZyYW1lICopXG5hbmQgbWFrZV9iZWdpbl9mcmFtZSByZW1haW5pbmcgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwiYmVnaW5cIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBOaWw7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gTmlsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1sZXQtZnJhbWUgKilcbmFuZCBtYWtlX2xldF9mcmFtZSBuYW1lIHJlbWFpbmluZyBib2R5IGxvY2FsID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwibGV0XCI7IGNmX2VudiA9IGxvY2FsOyBjZl9uYW1lID0gbmFtZTsgY2ZfYm9keSA9IGJvZHk7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBOaWw7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLWRlZmluZS1mcmFtZSAqKVxuYW5kIG1ha2VfZGVmaW5lX2ZyYW1lIG5hbWUgZW52IGhhc19lZmZlY3RzIGVmZmVjdF9saXN0ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwiZGVmaW5lXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IG5hbWU7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IE5pbDsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBoYXNfZWZmZWN0czsgY2ZfZXh0cmEyID0gZWZmZWN0X2xpc3QgfSlcblxuKCogbWFrZS1zZXQtZnJhbWUgKilcbmFuZCBtYWtlX3NldF9mcmFtZSBuYW1lIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcInNldFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBuYW1lOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSBOaWw7IGNmX2YgPSBOaWw7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gTmlsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1hcmctZnJhbWUgKilcbmFuZCBtYWtlX2FyZ19mcmFtZSBmIGV2YWxlZCByZW1haW5pbmcgZW52IHJhd19hcmdzIGhlYWRfbmFtZSA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcImFyZ1wiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IGY7IGNmX2FyZ3MgPSBldmFsZWQ7IGNmX3Jlc3VsdHMgPSByYXdfYXJnczsgY2ZfZXh0cmEgPSAobGV0IF9vciA9IGhlYWRfbmFtZSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgTmlsKTsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtY2FsbC1mcmFtZSAqKVxuYW5kIG1ha2VfY2FsbF9mcmFtZSBmIGFyZ3MgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwiY2FsbFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IE5pbDsgY2ZfZiA9IGY7IGNmX2FyZ3MgPSBhcmdzOyBjZl9yZXN1bHRzID0gTmlsOyBjZl9leHRyYSA9IE5pbDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtY29uZC1mcmFtZSAqKVxuYW5kIG1ha2VfY29uZF9mcmFtZSByZW1haW5pbmcgZW52IHNjaGVtZV9wID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwiY29uZFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBzY2hlbWVfcDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtY2FzZS1mcmFtZSAqKVxuYW5kIG1ha2VfY2FzZV9mcmFtZSBtYXRjaF92YWwgcmVtYWluaW5nIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcImNhc2VcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBOaWw7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gbWF0Y2hfdmFsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS10aHJlYWQtZnJhbWUgKilcbmFuZCBtYWtlX3RocmVhZF9mcmFtZSByZW1haW5pbmcgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwidGhyZWFkXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IE5pbDsgY2ZfYm9keSA9IE5pbDsgY2ZfcmVtYWluaW5nID0gcmVtYWluaW5nOyBjZl9mID0gTmlsOyBjZl9hcmdzID0gTmlsOyBjZl9yZXN1bHRzID0gTmlsOyBjZl9leHRyYSA9IE5pbDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtbWFwLWZyYW1lICopXG5hbmQgbWFrZV9tYXBfZnJhbWUgZiByZW1haW5pbmcgcmVzdWx0cyBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJtYXBcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBmOyBjZl9hcmdzID0gTmlsOyBjZl9yZXN1bHRzID0gcmVzdWx0czsgY2ZfZXh0cmEgPSAoQm9vbCBmYWxzZSk7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLW1hcC1pbmRleGVkLWZyYW1lICopXG5hbmQgbWFrZV9tYXBfaW5kZXhlZF9mcmFtZSBmIHJlbWFpbmluZyByZXN1bHRzIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcIm1hcFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IGY7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSByZXN1bHRzOyBjZl9leHRyYSA9IChCb29sIHRydWUpOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1maWx0ZXItZnJhbWUgKilcbmFuZCBtYWtlX2ZpbHRlcl9mcmFtZSBmIHJlbWFpbmluZyByZXN1bHRzIGN1cnJlbnRfaXRlbSBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJmaWx0ZXJcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBmOyBjZl9hcmdzID0gTmlsOyBjZl9yZXN1bHRzID0gcmVzdWx0czsgY2ZfZXh0cmEgPSBjdXJyZW50X2l0ZW07IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLXJlZHVjZS1mcmFtZSAqKVxuYW5kIG1ha2VfcmVkdWNlX2ZyYW1lIGYgcmVtYWluaW5nIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcInJlZHVjZVwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IGY7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gTmlsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1mb3ItZWFjaC1mcmFtZSAqKVxuYW5kIG1ha2VfZm9yX2VhY2hfZnJhbWUgZiByZW1haW5pbmcgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwiZm9yLWVhY2hcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBmOyBjZl9hcmdzID0gTmlsOyBjZl9yZXN1bHRzID0gTmlsOyBjZl9leHRyYSA9IE5pbDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2Utc29tZS1mcmFtZSAqKVxuYW5kIG1ha2Vfc29tZV9mcmFtZSBmIHJlbWFpbmluZyBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJzb21lXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IE5pbDsgY2ZfYm9keSA9IE5pbDsgY2ZfcmVtYWluaW5nID0gcmVtYWluaW5nOyBjZl9mID0gZjsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBOaWw7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLWV2ZXJ5LWZyYW1lICopXG5hbmQgbWFrZV9ldmVyeV9mcmFtZSBmIHJlbWFpbmluZyBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJldmVyeVwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IGY7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gTmlsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1zY29wZS1mcmFtZSAqKVxuYW5kIG1ha2Vfc2NvcGVfZnJhbWUgbmFtZSByZW1haW5pbmcgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwic2NvcGVcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gbmFtZTsgY2ZfYm9keSA9IE5pbDsgY2ZfcmVtYWluaW5nID0gcmVtYWluaW5nOyBjZl9mID0gTmlsOyBjZl9hcmdzID0gTmlsOyBjZl9yZXN1bHRzID0gTmlsOyBjZl9leHRyYSA9IE5pbDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtcHJvdmlkZS1mcmFtZSAqKVxuYW5kIG1ha2VfcHJvdmlkZV9mcmFtZSBuYW1lIHZhbHVlIHJlbWFpbmluZyBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJwcm92aWRlXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IG5hbWU7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSB2YWx1ZTsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2Utc2NvcGUtYWNjLWZyYW1lICopXG5hbmQgbWFrZV9zY29wZV9hY2NfZnJhbWUgbmFtZSB2YWx1ZSByZW1haW5pbmcgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwic2NvcGUtYWNjXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IG5hbWU7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSAobGV0IF9vciA9IHZhbHVlIGluIGlmIHN4X3RydXRoeSBfb3IgdGhlbiBfb3IgZWxzZSBOaWwpOyBjZl9leHRyYTIgPSAoTGlzdCBbXSkgfSlcblxuKCogbWFrZS1yZXNldC1mcmFtZSAqKVxuYW5kIG1ha2VfcmVzZXRfZnJhbWUgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwicmVzZXRcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSBOaWw7IGNmX2YgPSBOaWw7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gTmlsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1kaWN0LWZyYW1lICopXG5hbmQgbWFrZV9kaWN0X2ZyYW1lIHJlbWFpbmluZyByZXN1bHRzIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcImRpY3RcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBOaWw7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSByZXN1bHRzOyBjZl9leHRyYSA9IE5pbDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtYW5kLWZyYW1lICopXG5hbmQgbWFrZV9hbmRfZnJhbWUgcmVtYWluaW5nIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcImFuZFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBOaWw7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLW9yLWZyYW1lICopXG5hbmQgbWFrZV9vcl9mcmFtZSByZW1haW5pbmcgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwib3JcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBOaWw7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gTmlsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1keW5hbWljLXdpbmQtZnJhbWUgKilcbmFuZCBtYWtlX2R5bmFtaWNfd2luZF9mcmFtZSBwaGFzZSBib2R5X3RodW5rIGFmdGVyX3RodW5rIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcImR5bmFtaWMtd2luZFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IE5pbDsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBwaGFzZTsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtcmVhY3RpdmUtcmVzZXQtZnJhbWUgKilcbmFuZCBtYWtlX3JlYWN0aXZlX3Jlc2V0X2ZyYW1lIGVudiB1cGRhdGVfZm4gZmlyc3RfcmVuZGVyX3AgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJyZWFjdGl2ZS1yZXNldFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IE5pbDsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSB1cGRhdGVfZm47IGNmX2V4dHJhMiA9IGZpcnN0X3JlbmRlcl9wIH0pXG5cbigqIG1ha2UtZGVyZWYtZnJhbWUgKilcbmFuZCBtYWtlX2RlcmVmX2ZyYW1lIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcImRlcmVmXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IE5pbDsgY2ZfYm9keSA9IE5pbDsgY2ZfcmVtYWluaW5nID0gTmlsOyBjZl9mID0gTmlsOyBjZl9hcmdzID0gTmlsOyBjZl9yZXN1bHRzID0gTmlsOyBjZl9leHRyYSA9IE5pbDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtaG8tc2V0dXAtZnJhbWUgKilcbmFuZCBtYWtlX2hvX3NldHVwX2ZyYW1lIGhvX3R5cGUgcmVtYWluaW5nX2FyZ3MgZXZhbGVkX2FyZ3MgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwiaG8tc2V0dXBcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmdfYXJnczsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IGV2YWxlZF9hcmdzOyBjZl9yZXN1bHRzID0gTmlsOyBjZl9leHRyYSA9IGhvX3R5cGU7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBmcmFtZS10eXBlICopXG5hbmQgZnJhbWVfdHlwZSBmID1cbiAgKGdldCAoZikgKChTdHJpbmcgXCJ0eXBlXCIpKSlcblxuKCoga29udC1wdXNoICopXG5hbmQga29udF9wdXNoIGZyYW1lIGtvbnQgPVxuICAoY29ucyAoZnJhbWUpIChrb250KSlcblxuKCoga29udC10b3AgKilcbmFuZCBrb250X3RvcCBrb250ID1cbiAgKGZpcnN0IChrb250KSlcblxuKCoga29udC1wb3AgKilcbmFuZCBrb250X3BvcCBrb250ID1cbiAgKHJlc3QgKGtvbnQpKVxuXG4oKiBrb250LWVtcHR5PyAqKVxuYW5kIGtvbnRfZW1wdHlfcCBrb250ID1cbiAgKGVtcHR5X3AgKGtvbnQpKVxuXG4oKiBrb250LWNhcHR1cmUtdG8tcmVzZXQgKilcbmFuZCBrb250X2NhcHR1cmVfdG9fcmVzZXQga29udCA9XG4gIChsZXQgcmVjIHNjYW4gPSAoZnVuIGsgY2FwdHVyZWQgLT4gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGspKSkgdGhlbiAocmFpc2UgKEV2YWxfZXJyb3IgKHZhbHVlX3RvX3N0ciAoU3RyaW5nIFwic2hpZnQgd2l0aG91dCBlbmNsb3NpbmcgcmVzZXRcIikpKSkgZWxzZSAobGV0IGZyYW1lID0gKGZpcnN0IChrKSkgaW4gKGlmIHN4X3RydXRoeSAoKGxldCBfb3IgPSAocHJpbV9jYWxsIFwiPVwiIFsoZnJhbWVfdHlwZSAoZnJhbWUpKTsgKFN0cmluZyBcInJlc2V0XCIpXSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChwcmltX2NhbGwgXCI9XCIgWyhmcmFtZV90eXBlIChmcmFtZSkpOyAoU3RyaW5nIFwicmVhY3RpdmUtcmVzZXRcIildKSkpIHRoZW4gKExpc3QgW2NhcHR1cmVkOyAocmVzdCAoaykpXSkgZWxzZSAoc2NhbiAoKHJlc3QgKGspKSkgKChwcmltX2NhbGwgXCJhcHBlbmRcIiBbY2FwdHVyZWQ7IChMaXN0IFtmcmFtZV0pXSkpKSkpKSkgaW4gKHNjYW4gKGtvbnQpICgoTGlzdCBbXSkpKSlcblxuKCoga29udC1maW5kLXByb3ZpZGUgKilcbmFuZCBrb250X2ZpbmRfcHJvdmlkZSBrb250IG5hbWUgPVxuICAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAoa29udCkpKSB0aGVuIE5pbCBlbHNlIChsZXQgZnJhbWUgPSAoZmlyc3QgKGtvbnQpKSBpbiAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsoZnJhbWVfdHlwZSAoZnJhbWUpKTsgKFN0cmluZyBcInByb3ZpZGVcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJuYW1lXCIpKSk7IG5hbWVdKSkpIHRoZW4gZnJhbWUgZWxzZSAoa29udF9maW5kX3Byb3ZpZGUgKChyZXN0IChrb250KSkpIChuYW1lKSkpKSlcblxuKCoga29udC1maW5kLXNjb3BlLWFjYyAqKVxuYW5kIGtvbnRfZmluZF9zY29wZV9hY2Mga29udCBuYW1lID1cbiAgKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGtvbnQpKSkgdGhlbiBOaWwgZWxzZSAobGV0IGZyYW1lID0gKGZpcnN0IChrb250KSkgaW4gKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKGZyYW1lX3R5cGUgKGZyYW1lKSk7IChTdHJpbmcgXCJzY29wZS1hY2NcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJuYW1lXCIpKSk7IG5hbWVdKSkpIHRoZW4gZnJhbWUgZWxzZSAoa29udF9maW5kX3Njb3BlX2FjYyAoKHJlc3QgKGtvbnQpKSkgKG5hbWUpKSkpKVxuXG4oKiBoYXMtcmVhY3RpdmUtcmVzZXQtZnJhbWU/ICopXG5hbmQgaGFzX3JlYWN0aXZlX3Jlc2V0X2ZyYW1lX3Aga29udCA9XG4gIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChrb250KSkpIHRoZW4gKEJvb2wgZmFsc2UpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKGZyYW1lX3R5cGUgKChmaXJzdCAoa29udCkpKSk7IChTdHJpbmcgXCJyZWFjdGl2ZS1yZXNldFwiKV0pKSB0aGVuIChCb29sIHRydWUpIGVsc2UgKGhhc19yZWFjdGl2ZV9yZXNldF9mcmFtZV9wICgocmVzdCAoa29udCkpKSkpKVxuXG4oKiBrb250LWNhcHR1cmUtdG8tcmVhY3RpdmUtcmVzZXQgKilcbmFuZCBrb250X2NhcHR1cmVfdG9fcmVhY3RpdmVfcmVzZXQga29udCA9XG4gIChsZXQgcmVjIHNjYW4gPSAoZnVuIGsgY2FwdHVyZWQgLT4gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGspKSkgdGhlbiAocmFpc2UgKEV2YWxfZXJyb3IgKHZhbHVlX3RvX3N0ciAoU3RyaW5nIFwicmVhY3RpdmUgZGVyZWYgd2l0aG91dCBlbmNsb3NpbmcgcmVhY3RpdmUtcmVzZXRcIikpKSkgZWxzZSAobGV0IGZyYW1lID0gKGZpcnN0IChrKSkgaW4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKGZyYW1lX3R5cGUgKGZyYW1lKSk7IChTdHJpbmcgXCJyZWFjdGl2ZS1yZXNldFwiKV0pKSB0aGVuIChMaXN0IFtjYXB0dXJlZDsgZnJhbWU7IChyZXN0IChrKSldKSBlbHNlIChzY2FuICgocmVzdCAoaykpKSAoKHByaW1fY2FsbCBcImFwcGVuZFwiIFtjYXB0dXJlZDsgKExpc3QgW2ZyYW1lXSldKSkpKSkpKSBpbiAoc2NhbiAoa29udCkgKChMaXN0IFtdKSkpKVxuXG4oKiAqY3VzdG9tLXNwZWNpYWwtZm9ybXMqICopXG5hbmQgY3VzdG9tX3NwZWNpYWxfZm9ybXMgPVxuICAoRGljdCAoSGFzaHRibC5jcmVhdGUgMCkpXG5cbigqIHJlZ2lzdGVyLXNwZWNpYWwtZm9ybSEgKilcbmFuZCByZWdpc3Rlcl9zcGVjaWFsX2Zvcm0gbmFtZSBoYW5kbGVyID1cbiAgKHN4X2RpY3Rfc2V0X2IgY3VzdG9tX3NwZWNpYWxfZm9ybXMgbmFtZSBoYW5kbGVyKVxuXG4oKiAqcmVuZGVyLWNoZWNrKiAqKVxuYW5kIHJlbmRlcl9jaGVjayA9XG4gIE5pbFxuXG4oKiAqcmVuZGVyLWZuKiAqKVxuYW5kIHJlbmRlcl9mbiA9XG4gIE5pbFxuXG4oKiAqc3RyaWN0KiAqKVxuYW5kIF9zdHJpY3RfID0gIV9zdHJpY3RfcmVmXG5cbigqIHNldC1zdHJpY3QhICopXG5hbmQgc2V0X3N0cmljdF9iIHZhbCcgPVxuICBfc3RyaWN0X3JlZiA6PSB2YWwnOyBOaWxcblxuKCogKnByaW0tcGFyYW0tdHlwZXMqICopXG5hbmQgX3ByaW1fcGFyYW1fdHlwZXNfID0gIV9wcmltX3BhcmFtX3R5cGVzX3JlZlxuXG4oKiBzZXQtcHJpbS1wYXJhbS10eXBlcyEgKilcbmFuZCBzZXRfcHJpbV9wYXJhbV90eXBlc19iIHR5cGVzID1cbiAgX3ByaW1fcGFyYW1fdHlwZXNfcmVmIDo9IHR5cGVzOyBOaWxcblxuKCogdmFsdWUtbWF0Y2hlcy10eXBlPyAqKVxuYW5kIHZhbHVlX21hdGNoZXNfdHlwZV9wIHZhbCcgZXhwZWN0ZWRfdHlwZSA9XG4gIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCJhbnlcIildKSkgdGhlbiAoQm9vbCB0cnVlKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCJudW1iZXJcIildKSkgdGhlbiAobnVtYmVyX3AgKHZhbCcpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCJzdHJpbmdcIildKSkgdGhlbiAoc3RyaW5nX3AgKHZhbCcpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCJib29sZWFuXCIpXSkpIHRoZW4gKGJvb2xlYW5fcCAodmFsJykpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZXhwZWN0ZWRfdHlwZTsgKFN0cmluZyBcIm5pbFwiKV0pKSB0aGVuIChpc19uaWwgKHZhbCcpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCJsaXN0XCIpXSkpIHRoZW4gKGxpc3RfcCAodmFsJykpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZXhwZWN0ZWRfdHlwZTsgKFN0cmluZyBcImRpY3RcIildKSkgdGhlbiAoZGljdF9wICh2YWwnKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtleHBlY3RlZF90eXBlOyAoU3RyaW5nIFwibGFtYmRhXCIpXSkpIHRoZW4gKGlzX2xhbWJkYSAodmFsJykpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZXhwZWN0ZWRfdHlwZTsgKFN0cmluZyBcInN5bWJvbFwiKV0pKSB0aGVuIChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICh2YWwnKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCJrZXl3b3JkXCIpXSkpIHRoZW4gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKHZhbCcpKTsgKFN0cmluZyBcImtleXdvcmRcIildKSBlbHNlIChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChzdHJpbmdfcCAoZXhwZWN0ZWRfdHlwZSkpIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCJlbmRzLXdpdGg/XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCI/XCIpXSkpKSB0aGVuIChsZXQgX29yID0gKGlzX25pbCAodmFsJykpIGluIGlmIHN4X3RydXRoeSBfb3IgdGhlbiBfb3IgZWxzZSAodmFsdWVfbWF0Y2hlc190eXBlX3AgKHZhbCcpICgocHJpbV9jYWxsIFwic2xpY2VcIiBbZXhwZWN0ZWRfdHlwZTsgKE51bWJlciAwLjApOyAocHJpbV9jYWxsIFwiLVwiIFsocHJpbV9jYWxsIFwic3RyaW5nLWxlbmd0aFwiIFtleHBlY3RlZF90eXBlXSk7IChOdW1iZXIgMS4wKV0pXSkpKSkgZWxzZSAoQm9vbCB0cnVlKSkpKSkpKSkpKSkpXG5cbigqIHN0cmljdC1jaGVjay1hcmdzICopXG5hbmQgc3RyaWN0X2NoZWNrX2FyZ3MgbmFtZSBhcmdzID1cbiAgKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gIV9zdHJpY3RfcmVmIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlICFfcHJpbV9wYXJhbV90eXBlc19yZWYpKSB0aGVuIChsZXQgc3BlYyA9IChnZXQgKCFfcHJpbV9wYXJhbV90eXBlc19yZWYpIChuYW1lKSkgaW4gKGlmIHN4X3RydXRoeSAoc3BlYykgdGhlbiAobGV0IHBvc2l0aW9uYWwgPSAoZ2V0IChzcGVjKSAoKFN0cmluZyBcInBvc2l0aW9uYWxcIikpKSBpbiBsZXQgcmVzdF90eXBlID0gKGdldCAoc3BlYykgKChTdHJpbmcgXCJyZXN0LXR5cGVcIikpKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5IChwb3NpdGlvbmFsKSB0aGVuIChMaXN0Lml0ZXIgKGZ1biBwYWlyIC0+IGlnbm9yZSAoKGxldCBpZHggPSAoZmlyc3QgKHBhaXIpKSBpbiBsZXQgcGFyYW0gPSAobnRoIChwYWlyKSAoKE51bWJlciAxLjApKSkgaW4gbGV0IHBfbmFtZSA9IChmaXJzdCAocGFyYW0pKSBpbiBsZXQgcF90eXBlID0gKG50aCAocGFyYW0pICgoTnVtYmVyIDEuMCkpKSBpbiAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPFwiIFtpZHg7IChsZW4gKGFyZ3MpKV0pKSB0aGVuIChsZXQgdmFsJyA9IChudGggKGFyZ3MpIChpZHgpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoQm9vbCAobm90IChzeF90cnV0aHkgKCh2YWx1ZV9tYXRjaGVzX3R5cGVfcCAodmFsJykgKHBfdHlwZSkpKSkpKSkgdGhlbiAocmFpc2UgKEV2YWxfZXJyb3IgKHZhbHVlX3RvX3N0ciAoU3RyaW5nIChzeF9zdHIgWyhTdHJpbmcgXCJUeXBlIGVycm9yOiBcIik7IG5hbWU7IChTdHJpbmcgXCIgZXhwZWN0ZWQgXCIpOyBwX3R5cGU7IChTdHJpbmcgXCIgZm9yIHBhcmFtIFwiKTsgcF9uYW1lOyAoU3RyaW5nIFwiLCBnb3QgXCIpOyAodHlwZV9vZiAodmFsJykpOyAoU3RyaW5nIFwiIChcIik7IChTdHJpbmcgKHN4X3N0ciBbdmFsJ10pKTsgKFN0cmluZyBcIilcIildKSkpKSkgZWxzZSBOaWwpKSBlbHNlIE5pbCkpKSkgKHN4X3RvX2xpc3QgKExpc3QgKExpc3QubWFwaSAoZnVuIGkgcCAtPiBsZXQgaSA9IE51bWJlciAoZmxvYXRfb2ZfaW50IGkpIGluIChMaXN0IFtpOyBwXSkpIChzeF90b19saXN0IHBvc2l0aW9uYWwpKSkpOyBOaWwpIGVsc2UgTmlsKSkgaW4gKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gcmVzdF90eXBlIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCI+XCIgWyhsZW4gKGFyZ3MpKTsgKGxlbiAoKGxldCBfb3IgPSBwb3NpdGlvbmFsIGluIGlmIHN4X3RydXRoeSBfb3IgdGhlbiBfb3IgZWxzZSAoTGlzdCBbXSkpKSldKSkpIHRoZW4gKExpc3QuaXRlciAoZnVuIHBhaXIgLT4gaWdub3JlICgobGV0IGlkeCA9IChmaXJzdCAocGFpcikpIGluIGxldCB2YWwnID0gKG50aCAocGFpcikgKChOdW1iZXIgMS4wKSkpIGluIChpZiBzeF90cnV0aHkgKChCb29sIChub3QgKHN4X3RydXRoeSAoKHZhbHVlX21hdGNoZXNfdHlwZV9wICh2YWwnKSAocmVzdF90eXBlKSkpKSkpKSB0aGVuIChyYWlzZSAoRXZhbF9lcnJvciAodmFsdWVfdG9fc3RyIChTdHJpbmcgKHN4X3N0ciBbKFN0cmluZyBcIlR5cGUgZXJyb3I6IFwiKTsgbmFtZTsgKFN0cmluZyBcIiBleHBlY3RlZCBcIik7IHJlc3RfdHlwZTsgKFN0cmluZyBcIiBmb3IgcmVzdCBhcmcgXCIpOyBpZHg7IChTdHJpbmcgXCIsIGdvdCBcIik7ICh0eXBlX29mICh2YWwnKSk7IChTdHJpbmcgXCIgKFwiKTsgKFN0cmluZyAoc3hfc3RyIFt2YWwnXSkpOyAoU3RyaW5nIFwiKVwiKV0pKSkpKSBlbHNlIE5pbCkpKSkgKHN4X3RvX2xpc3QgKExpc3QgKExpc3QubWFwaSAoZnVuIGkgdiAtPiBsZXQgaSA9IE51bWJlciAoZmxvYXRfb2ZfaW50IGkpIGluIChMaXN0IFtpOyB2XSkpIChzeF90b19saXN0IChwcmltX2NhbGwgXCJzbGljZVwiIFthcmdzOyAobGVuICgobGV0IF9vciA9IHBvc2l0aW9uYWwgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChMaXN0IFtdKSkpKV0pKSkpKTsgTmlsKSBlbHNlIE5pbCkpKSBlbHNlIE5pbCkpIGVsc2UgTmlsKVxuXG4oKiBiaW5kX2xhbWJkYV9wYXJhbXMg4oCUIHNoYXJlZCBoZWxwZXIgZm9yIGNhbGwtbGFtYmRhIGFuZCBDRUsgZGlzcGF0Y2guXG4gICBIYW5kbGVzICZyZXN0IHBhcmFtczogYmluZHMgcmVxdWlyZWQgcGFyYW1zLCBjb2xsZWN0cyByZXN0IGludG8gbGlzdC4gKilcbmFuZCBiaW5kX2xhbWJkYV9wYXJhbXMgZiBhcmdzIGxvY2FsID1cbiAgbGV0IHBhcmFtcyA9IGxhbWJkYV9wYXJhbXMgZiBpblxuICBsZXQgcGFyYW1fbGlzdCA9IG1hdGNoIHBhcmFtcyB3aXRoIExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSAtPiBsIHwgXyAtPiBbXSBpblxuICBsZXQgYXJnc19saXN0ID0gbWF0Y2ggYXJncyB3aXRoIExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSAtPiBsIHwgXyAtPiBbXSBpblxuICBsZXQgcmVzdF9pZHggPSByZWYgKC0xKSBpblxuICBMaXN0Lml0ZXJpIChmdW4gaSBwIC0+IG1hdGNoIHAgd2l0aCBTeW1ib2wgXCImcmVzdFwiIHwgU3RyaW5nIFwiJnJlc3RcIiAtPiByZXN0X2lkeCA6PSBpIHwgXyAtPiAoKSkgcGFyYW1fbGlzdDtcbiAgaWYgIXJlc3RfaWR4ID49IDAgdGhlbiBiZWdpblxuICAgIGxldCByZXF1aXJlZCA9IExpc3QuZmlsdGVyaSAoZnVuIGkgXyAtPiBpIDwgIXJlc3RfaWR4KSBwYXJhbV9saXN0IGluXG4gICAgbGV0IHJlc3RfbmFtZSA9IChtYXRjaCBMaXN0Lm50aF9vcHQgcGFyYW1fbGlzdCAoIXJlc3RfaWR4ICsgMSkgd2l0aFxuICAgICAgfCBTb21lIChTeW1ib2wgcyB8IFN0cmluZyBzKSAtPiBzIHwgXyAtPiBcInJlc3RcIikgaW5cbiAgICBMaXN0Lml0ZXJpIChmdW4gaSBwIC0+XG4gICAgICBsZXQgbmFtZSA9IHN4X3RvX3N0cmluZyBwIGluXG4gICAgICBsZXQgdiA9IG1hdGNoIExpc3QubnRoX29wdCBhcmdzX2xpc3QgaSB3aXRoIFNvbWUgdiAtPiB2IHwgTm9uZSAtPiBOaWwgaW5cbiAgICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgbmFtZSB2KSkgcmVxdWlyZWQ7XG4gICAgbGV0IHJlc3RfdmFscyA9IGlmICFyZXN0X2lkeCA8PSBMaXN0Lmxlbmd0aCBhcmdzX2xpc3RcbiAgICAgIHRoZW4gTGlzdCAoTGlzdC5maWx0ZXJpIChmdW4gaSBfIC0+IGkgPj0gIXJlc3RfaWR4KSBhcmdzX2xpc3QpIGVsc2UgTGlzdCBbXSBpblxuICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgKFN0cmluZyByZXN0X25hbWUpIHJlc3RfdmFscylcbiAgZW5kIGVsc2UgYmVnaW5cbiAgICBpZiBzeF90cnV0aHkgKHByaW1fY2FsbCBcIj5cIiBbbGVuIGFyZ3M7IGxlbiBwYXJhbXNdKSB0aGVuXG4gICAgICByYWlzZSAoRXZhbF9lcnJvciAodmFsdWVfdG9fc3RyIChTdHJpbmcgKHN4X3N0ciBbXG4gICAgICAgIChsZXQgX29yID0gbGFtYmRhX25hbWUgZiBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgU3RyaW5nIFwibGFtYmRhXCIpO1xuICAgICAgICBTdHJpbmcgXCIgZXhwZWN0cyBcIjsgbGVuIHBhcmFtczsgU3RyaW5nIFwiIGFyZ3MsIGdvdCBcIjsgbGVuIGFyZ3NdKSkpKTtcbiAgICBpZ25vcmUgKExpc3QuaXRlciAoZnVuIHBhaXIgLT5cbiAgICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgKHN4X3RvX3N0cmluZyAoZmlyc3QgcGFpcikpIChudGggcGFpciAoTnVtYmVyIDEuMCkpKSlcbiAgICAgIChzeF90b19saXN0IChwcmltX2NhbGwgXCJ6aXBcIiBbcGFyYW1zOyBhcmdzXSkpKTtcbiAgICBpZ25vcmUgKExpc3QuaXRlciAoZnVuIHAgLT5cbiAgICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgKHN4X3RvX3N0cmluZyBwKSBOaWwpKVxuICAgICAgKHN4X3RvX2xpc3QgKHByaW1fY2FsbCBcInNsaWNlXCIgW3BhcmFtczsgbGVuIGFyZ3NdKSkpXG4gIGVuZFxuXG4oKiBjYWxsLWxhbWJkYSDigJQgdXNlcyBzaGFyZWQgYmluZF9sYW1iZGFfcGFyYW1zIGZvciAmcmVzdCBzdXBwb3J0ICopXG5hbmQgY2FsbF9sYW1iZGEgZiBhcmdzIGNhbGxlcl9lbnYgPVxuICBsZXQgbG9jYWwgPSBlbnZfbWVyZ2UgKGxhbWJkYV9jbG9zdXJlIGYpIGNhbGxlcl9lbnYgaW5cbiAgYmluZF9sYW1iZGFfcGFyYW1zIGYgYXJncyBsb2NhbDtcbiAgbWFrZV90aHVuayAobGFtYmRhX2JvZHkgZikgbG9jYWxcblxuKCogY2FsbC1jb21wb25lbnQgKilcbmFuZCBjYWxsX2NvbXBvbmVudCBjb21wIHJhd19hcmdzIGVudiA9XG4gIChsZXQgcGFyc2VkID0gKHBhcnNlX2tleXdvcmRfYXJncyAocmF3X2FyZ3MpIChlbnYpKSBpbiBsZXQga3dhcmdzID0gKGZpcnN0IChwYXJzZWQpKSBpbiBsZXQgY2hpbGRyZW4gPSAobnRoIChwYXJzZWQpICgoTnVtYmVyIDEuMCkpKSBpbiBsZXQgbG9jYWwgPSAoZW52X21lcmdlICgoY29tcG9uZW50X2Nsb3N1cmUgKGNvbXApKSkgKGVudikpIGluIChsZXQgKCkgPSBpZ25vcmUgKChMaXN0Lml0ZXIgKGZ1biBwIC0+IGlnbm9yZSAoKGVudl9iaW5kIGxvY2FsIChzeF90b19zdHJpbmcgcCkgKGxldCBfb3IgPSAoZGljdF9nZXQgKGt3YXJncykgKHApKSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgTmlsKSkpKSAoc3hfdG9fbGlzdCAoY29tcG9uZW50X3BhcmFtcyAoY29tcCkpKTsgTmlsKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKGlmIHN4X3RydXRoeSAoKGNvbXBvbmVudF9oYXNfY2hpbGRyZW4gKGNvbXApKSkgdGhlbiAoZW52X2JpbmQgbG9jYWwgKHN4X3RvX3N0cmluZyAoU3RyaW5nIFwiY2hpbGRyZW5cIikpIGNoaWxkcmVuKSBlbHNlIE5pbCkpIGluIChtYWtlX3RodW5rICgoY29tcG9uZW50X2JvZHkgKGNvbXApKSkgKGxvY2FsKSkpKSlcblxuKCogcGFyc2Uta2V5d29yZC1hcmdzICopXG5hbmQgcGFyc2Vfa2V5d29yZF9hcmdzIHJhd19hcmdzIGVudiA9XG4gIChsZXQga3dhcmdzID0gKERpY3QgKEhhc2h0YmwuY3JlYXRlIDApKSBpbiBsZXQgY2hpbGRyZW4gPSByZWYgKChMaXN0IFtdKSkgaW4gbGV0IGkgPSAoTnVtYmVyIDAuMCkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKExpc3QuZm9sZF9sZWZ0IChmdW4gc3RhdGUgYXJnIC0+IChsZXQgaWR4ID0gKGdldCAoc3RhdGUpICgoU3RyaW5nIFwiaVwiKSkpIGluIGxldCBza2lwID0gKGdldCAoc3RhdGUpICgoU3RyaW5nIFwic2tpcFwiKSkpIGluIChpZiBzeF90cnV0aHkgKHNraXApIHRoZW4gKHByaW1fY2FsbCBcImFzc29jXCIgW3N0YXRlOyAoU3RyaW5nIFwic2tpcFwiKTsgKEJvb2wgZmFsc2UpOyAoU3RyaW5nIFwiaVwiKTsgKHByaW1fY2FsbCBcImluY1wiIFtpZHhdKV0pIGVsc2UgKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKGFyZykpOyAoU3RyaW5nIFwia2V5d29yZFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCI8XCIgWyhwcmltX2NhbGwgXCJpbmNcIiBbaWR4XSk7IChsZW4gKHJhd19hcmdzKSldKSkpIHRoZW4gKGxldCAoKSA9IGlnbm9yZSAoKHN4X2RpY3Rfc2V0X2Iga3dhcmdzIChrZXl3b3JkX25hbWUgKGFyZykpICh0cmFtcG9saW5lICgoZXZhbF9leHByICgobnRoIChyYXdfYXJncykgKChwcmltX2NhbGwgXCJpbmNcIiBbaWR4XSkpKSkgKGVudikpKSkpKSBpbiAocHJpbV9jYWxsIFwiYXNzb2NcIiBbc3RhdGU7IChTdHJpbmcgXCJza2lwXCIpOyAoQm9vbCB0cnVlKTsgKFN0cmluZyBcImlcIik7IChwcmltX2NhbGwgXCJpbmNcIiBbaWR4XSldKSkgZWxzZSAobGV0ICgpID0gaWdub3JlICgoY2hpbGRyZW4gOj0gc3hfYXBwZW5kX2IgIWNoaWxkcmVuICh0cmFtcG9saW5lICgoZXZhbF9leHByIChhcmcpIChlbnYpKSkpOyBOaWwpKSBpbiAocHJpbV9jYWxsIFwiYXNzb2NcIiBbc3RhdGU7IChTdHJpbmcgXCJpXCIpOyAocHJpbV9jYWxsIFwiaW5jXCIgW2lkeF0pXSkpKSkpKSAobGV0IF9kID0gSGFzaHRibC5jcmVhdGUgMiBpbiBIYXNodGJsLnJlcGxhY2UgX2QgKHZhbHVlX3RvX3N0ciAoU3RyaW5nIFwiaVwiKSkgKE51bWJlciAwLjApOyBIYXNodGJsLnJlcGxhY2UgX2QgKHZhbHVlX3RvX3N0ciAoU3RyaW5nIFwic2tpcFwiKSkgKEJvb2wgZmFsc2UpOyAgRGljdCBfZCkgKHN4X3RvX2xpc3QgcmF3X2FyZ3MpKSkgaW4gKExpc3QgW2t3YXJnczsgIWNoaWxkcmVuXSkpKVxuXG4oKiBjb25kLXNjaGVtZT8gKilcbmFuZCBjb25kX3NjaGVtZV9wIGNsYXVzZXMgPVxuICAoQm9vbCAoTGlzdC5mb3JfYWxsIChmdW4gYyAtPiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChjKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAoYykpOyAoTnVtYmVyIDIuMCldKSkpKSAoc3hfdG9fbGlzdCBjbGF1c2VzKSkpXG5cbigqIGlzLWVsc2UtY2xhdXNlPyAqKVxuYW5kIGlzX2Vsc2VfY2xhdXNlIHRlc3QgPVxuICAobGV0IF9vciA9IChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICh0ZXN0KSk7IChTdHJpbmcgXCJrZXl3b3JkXCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKHByaW1fY2FsbCBcIj1cIiBbKGtleXdvcmRfbmFtZSAodGVzdCkpOyAoU3RyaW5nIFwiZWxzZVwiKV0pKSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKHRlc3QpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChsZXQgX29yID0gKHByaW1fY2FsbCBcIj1cIiBbKHN5bWJvbF9uYW1lICh0ZXN0KSk7IChTdHJpbmcgXCJlbHNlXCIpXSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChwcmltX2NhbGwgXCI9XCIgWyhzeW1ib2xfbmFtZSAodGVzdCkpOyAoU3RyaW5nIFwiOmVsc2VcIildKSkpKVxuXG4oKiBzZi1uYW1lZC1sZXQgKilcbmFuZCBzZl9uYW1lZF9sZXQgYXJncyBlbnYgPVxuICAobGV0IGxvb3BfbmFtZSA9IChzeW1ib2xfbmFtZSAoKGZpcnN0IChhcmdzKSkpKSBpbiBsZXQgYmluZGluZ3MgPSAobnRoIChhcmdzKSAoKE51bWJlciAxLjApKSkgaW4gbGV0IGJvZHkgPSAocHJpbV9jYWxsIFwic2xpY2VcIiBbYXJnczsgKE51bWJlciAyLjApXSkgaW4gbGV0IHBhcmFtcyA9IHJlZiAoKExpc3QgW10pKSBpbiBsZXQgaW5pdHMgPSByZWYgKChMaXN0IFtdKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChmaXJzdCAoYmluZGluZ3MpKSkpOyAoU3RyaW5nIFwibGlzdFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCI9XCIgWyhsZW4gKChmaXJzdCAoYmluZGluZ3MpKSkpOyAoTnVtYmVyIDIuMCldKSkpIHRoZW4gKExpc3QuaXRlciAoZnVuIGJpbmRpbmcgLT4gaWdub3JlICgobGV0ICgpID0gaWdub3JlICgocGFyYW1zIDo9IHN4X2FwcGVuZF9iICFwYXJhbXMgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChmaXJzdCAoYmluZGluZykpKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSkgdGhlbiAoc3ltYm9sX25hbWUgKChmaXJzdCAoYmluZGluZykpKSkgZWxzZSAoZmlyc3QgKGJpbmRpbmcpKSk7IE5pbCkpIGluIChpbml0cyA6PSBzeF9hcHBlbmRfYiAhaW5pdHMgKG50aCAoYmluZGluZykgKChOdW1iZXIgMS4wKSkpOyBOaWwpKSkpIChzeF90b19saXN0IGJpbmRpbmdzKTsgTmlsKSBlbHNlIChMaXN0LmZvbGRfbGVmdCAoZnVuIF9hY2MgcGFpcl9pZHggLT4gKGxldCAoKSA9IGlnbm9yZSAoKHBhcmFtcyA6PSBzeF9hcHBlbmRfYiAhcGFyYW1zIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICgobnRoIChiaW5kaW5ncykgKChwcmltX2NhbGwgXCIqXCIgW3BhaXJfaWR4OyAoTnVtYmVyIDIuMCldKSkpKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSkgdGhlbiAoc3ltYm9sX25hbWUgKChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcIipcIiBbcGFpcl9pZHg7IChOdW1iZXIgMi4wKV0pKSkpKSBlbHNlIChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcIipcIiBbcGFpcl9pZHg7IChOdW1iZXIgMi4wKV0pKSkpOyBOaWwpKSBpbiAoaW5pdHMgOj0gc3hfYXBwZW5kX2IgIWluaXRzIChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcImluY1wiIFsocHJpbV9jYWxsIFwiKlwiIFtwYWlyX2lkeDsgKE51bWJlciAyLjApXSldKSkpOyBOaWwpKSkgTmlsIChzeF90b19saXN0IChwcmltX2NhbGwgXCJyYW5nZVwiIFsoTnVtYmVyIDAuMCk7IChwcmltX2NhbGwgXCIvXCIgWyhsZW4gKGJpbmRpbmdzKSk7IChOdW1iZXIgMi4wKV0pXSkpKSkpIGluIChsZXQgbG9vcF9ib2R5ID0gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAoYm9keSkpOyAoTnVtYmVyIDEuMCldKSkgdGhlbiAoZmlyc3QgKGJvZHkpKSBlbHNlIChjb25zICgobWFrZV9zeW1ib2wgKChTdHJpbmcgXCJiZWdpblwiKSkpKSAoYm9keSkpKSBpbiBsZXQgbG9vcF9mbiA9IChtYWtlX2xhbWJkYSAoIXBhcmFtcykgKGxvb3BfYm9keSkgKGVudikpIGluIChsZXQgKCkgPSBpZ25vcmUgKChzZXRfbGFtYmRhX25hbWUgbG9vcF9mbiAoc3hfdG9fc3RyaW5nIGxvb3BfbmFtZSkpKSBpbiAobGV0ICgpID0gaWdub3JlICgoZW52X2JpbmQgKGxhbWJkYV9jbG9zdXJlIChsb29wX2ZuKSkgKHN4X3RvX3N0cmluZyBsb29wX25hbWUpIGxvb3BfZm4pKSBpbiAobGV0IGluaXRfdmFscyA9IChMaXN0IChMaXN0Lm1hcCAoZnVuIGUgLT4gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKGUpIChlbnYpKSkpKSAoc3hfdG9fbGlzdCAhaW5pdHMpKSkgaW4gKGNhbGxfbGFtYmRhIChsb29wX2ZuKSAoaW5pdF92YWxzKSAoZW52KSkpKSkpKSlcblxuKCogc2YtbGFtYmRhICopXG5hbmQgc2ZfbGFtYmRhIGFyZ3MgZW52ID1cbiAgKGxldCBwYXJhbXNfZXhwciA9IChmaXJzdCAoYXJncykpIGluIGxldCBib2R5X2V4cHJzID0gKHJlc3QgKGFyZ3MpKSBpbiBsZXQgYm9keSA9IChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyhsZW4gKGJvZHlfZXhwcnMpKTsgKE51bWJlciAxLjApXSkpIHRoZW4gKGZpcnN0IChib2R5X2V4cHJzKSkgZWxzZSAoY29ucyAoKG1ha2Vfc3ltYm9sICgoU3RyaW5nIFwiYmVnaW5cIikpKSkgKGJvZHlfZXhwcnMpKSkgaW4gbGV0IHBhcmFtX25hbWVzID0gKExpc3QgKExpc3QubWFwIChmdW4gcCAtPiAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAocCkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkpIHRoZW4gKHN5bWJvbF9uYW1lIChwKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAocCkpOyAoU3RyaW5nIFwibGlzdFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyhsZW4gKHApKTsgKE51bWJlciAzLjApXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChudGggKHApICgoTnVtYmVyIDEuMCkpKSkpOyAoU3RyaW5nIFwia2V5d29yZFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCI9XCIgWyhrZXl3b3JkX25hbWUgKChudGggKHApICgoTnVtYmVyIDEuMCkpKSkpOyAoU3RyaW5nIFwiYXNcIildKSkpKSkgdGhlbiAoc3ltYm9sX25hbWUgKChmaXJzdCAocCkpKSkgZWxzZSBwKSkpIChzeF90b19saXN0IHBhcmFtc19leHByKSkpIGluIChtYWtlX2xhbWJkYSAocGFyYW1fbmFtZXMpIChib2R5KSAoZW52KSkpXG5cbigqIHNmLWRlZmNvbXAgKilcbmFuZCBzZl9kZWZjb21wIGFyZ3MgZW52ID1cbiAgKGxldCBuYW1lX3N5bSA9IChmaXJzdCAoYXJncykpIGluIGxldCBwYXJhbXNfcmF3ID0gKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpIGluIGxldCBib2R5ID0gKGxhc3QgKGFyZ3MpKSBpbiBsZXQgY29tcF9uYW1lID0gKHN0cmlwX3ByZWZpeCAoKHN5bWJvbF9uYW1lIChuYW1lX3N5bSkpKSAoKFN0cmluZyBcIn5cIikpKSBpbiBsZXQgcGFyc2VkID0gKHBhcnNlX2NvbXBfcGFyYW1zIChwYXJhbXNfcmF3KSkgaW4gbGV0IHBhcmFtcyA9IChmaXJzdCAocGFyc2VkKSkgaW4gbGV0IGhhc19jaGlsZHJlbiA9IChudGggKHBhcnNlZCkgKChOdW1iZXIgMS4wKSkpIGluIGxldCBwYXJhbV90eXBlcyA9IChudGggKHBhcnNlZCkgKChOdW1iZXIgMi4wKSkpIGluIGxldCBhZmZpbml0eSA9IChkZWZjb21wX2t3YXJnIChhcmdzKSAoKFN0cmluZyBcImFmZmluaXR5XCIpKSAoKFN0cmluZyBcImF1dG9cIikpKSBpbiAobGV0IGNvbXAgPSAobWFrZV9jb21wb25lbnQgKGNvbXBfbmFtZSkgKHBhcmFtcykgKGhhc19jaGlsZHJlbikgKGJvZHkpIChlbnYpIChhZmZpbml0eSkpIGluIGxldCBlZmZlY3RzID0gKGRlZmNvbXBfa3dhcmcgKGFyZ3MpICgoU3RyaW5nIFwiZWZmZWN0c1wiKSkgKE5pbCkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChCb29sIChub3QgKHN4X3RydXRoeSAoKGlzX25pbCAocGFyYW1fdHlwZXMpKSkpKSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgoZW1wdHlfcCAoKHByaW1fY2FsbCBcImtleXNcIiBbcGFyYW1fdHlwZXNdKSkpKSkpKSkpIHRoZW4gKGNvbXBvbmVudF9zZXRfcGFyYW1fdHlwZXNfYiAoY29tcCkgKHBhcmFtX3R5cGVzKSkgZWxzZSBOaWwpKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5ICgoQm9vbCAobm90IChzeF90cnV0aHkgKChpc19uaWwgKGVmZmVjdHMpKSkpKSkpIHRoZW4gKGxldCBlZmZlY3RfbGlzdCA9IChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChlZmZlY3RzKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkpIHRoZW4gKExpc3QgKExpc3QubWFwIChmdW4gZSAtPiAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoZSkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkpIHRoZW4gKHN5bWJvbF9uYW1lIChlKSkgZWxzZSAoU3RyaW5nIChzeF9zdHIgW2VdKSkpKSAoc3hfdG9fbGlzdCBlZmZlY3RzKSkpIGVsc2UgKExpc3QgWyhTdHJpbmcgKHN4X3N0ciBbZWZmZWN0c10pKV0pKSBpbiBsZXQgZWZmZWN0X2FubnMgPSAoaWYgc3hfdHJ1dGh5ICgoZW52X2hhcyAoZW52KSAoKFN0cmluZyBcIiplZmZlY3QtYW5ub3RhdGlvbnMqXCIpKSkpIHRoZW4gKGVudl9nZXQgKGVudikgKChTdHJpbmcgXCIqZWZmZWN0LWFubm90YXRpb25zKlwiKSkpIGVsc2UgKERpY3QgKEhhc2h0YmwuY3JlYXRlIDApKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKHN4X2RpY3Rfc2V0X2IgZWZmZWN0X2FubnMgKHN5bWJvbF9uYW1lIChuYW1lX3N5bSkpIGVmZmVjdF9saXN0KSkgaW4gKGVudl9iaW5kIGVudiAoc3hfdG9fc3RyaW5nIChTdHJpbmcgXCIqZWZmZWN0LWFubm90YXRpb25zKlwiKSkgZWZmZWN0X2FubnMpKSkgZWxzZSBOaWwpKSBpbiAobGV0ICgpID0gaWdub3JlICgoZW52X2JpbmQgZW52IChzeF90b19zdHJpbmcgKHN5bWJvbF9uYW1lIChuYW1lX3N5bSkpKSBjb21wKSkgaW4gY29tcCkpKSkpXG5cbigqIGRlZmNvbXAta3dhcmcgKilcbmFuZCBkZWZjb21wX2t3YXJnIGFyZ3Mga2V5IGRlZmF1bHQgPVxuICAobGV0IGVuZCcgPSAocHJpbV9jYWxsIFwiLVwiIFsobGVuIChhcmdzKSk7IChOdW1iZXIgMS4wKV0pIGluIGxldCByZXN1bHQnID0gcmVmIChkZWZhdWx0KSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gaSAtPiBpZ25vcmUgKChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICgobnRoIChhcmdzKSAoaSkpKSk7IChTdHJpbmcgXCJrZXl3b3JkXCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKGtleXdvcmRfbmFtZSAoKG50aCAoYXJncykgKGkpKSkpOyBrZXldKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPFwiIFsocHJpbV9jYWxsIFwiK1wiIFtpOyAoTnVtYmVyIDEuMCldKTsgZW5kJ10pKSkpIHRoZW4gKGxldCB2YWwnID0gKG50aCAoYXJncykgKChwcmltX2NhbGwgXCIrXCIgW2k7IChOdW1iZXIgMS4wKV0pKSkgaW4gKHJlc3VsdCcgOj0gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKHZhbCcpKTsgKFN0cmluZyBcImtleXdvcmRcIildKSkgdGhlbiAoa2V5d29yZF9uYW1lICh2YWwnKSkgZWxzZSB2YWwnKTsgTmlsKSkgZWxzZSBOaWwpKSkgKHN4X3RvX2xpc3QgKHByaW1fY2FsbCBcInJhbmdlXCIgWyhOdW1iZXIgMi4wKTsgZW5kJzsgKE51bWJlciAxLjApXSkpOyBOaWwpKSBpbiAhcmVzdWx0JykpXG5cbigqIHBhcnNlLWNvbXAtcGFyYW1zICopXG5hbmQgcGFyc2VfY29tcF9wYXJhbXMgcGFyYW1zX2V4cHIgPVxuICAobGV0IHBhcmFtcyA9IHJlZiAoKExpc3QgW10pKSBpbiBsZXQgcGFyYW1fdHlwZXMgPSAoRGljdCAoSGFzaHRibC5jcmVhdGUgMCkpIGluIGxldCBoYXNfY2hpbGRyZW4gPSByZWYgKChCb29sIGZhbHNlKSkgaW4gbGV0IGluX2tleSA9IHJlZiAoKEJvb2wgZmFsc2UpKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gcCAtPiBpZ25vcmUgKChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChwKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAocCkpOyAoTnVtYmVyIDMuMCldKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChwKSkpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICgobnRoIChwKSAoKE51bWJlciAxLjApKSkpKTsgKFN0cmluZyBcImtleXdvcmRcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoa2V5d29yZF9uYW1lICgobnRoIChwKSAoKE51bWJlciAxLjApKSkpKTsgKFN0cmluZyBcImFzXCIpXSkpKSkpKSB0aGVuIChsZXQgbmFtZSA9IChzeW1ib2xfbmFtZSAoKGZpcnN0IChwKSkpKSBpbiBsZXQgcHR5cGUgPSAobnRoIChwKSAoKE51bWJlciAyLjApKSkgaW4gKGxldCB0eXBlX3ZhbCA9IChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChwdHlwZSkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkpIHRoZW4gKHN5bWJvbF9uYW1lIChwdHlwZSkpIGVsc2UgcHR5cGUpIGluIChpZiBzeF90cnV0aHkgKChCb29sIChub3QgKHN4X3RydXRoeSAoIWhhc19jaGlsZHJlbikpKSkpIHRoZW4gKGxldCAoKSA9IGlnbm9yZSAoKHBhcmFtcyA6PSBzeF9hcHBlbmRfYiAhcGFyYW1zIG5hbWU7IE5pbCkpIGluIChzeF9kaWN0X3NldF9iIHBhcmFtX3R5cGVzIG5hbWUgdHlwZV92YWwpKSBlbHNlIE5pbCkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChwKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSkgdGhlbiAobGV0IG5hbWUgPSAoc3ltYm9sX25hbWUgKHApKSBpbiAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiJmtleVwiKV0pKSB0aGVuIChpbl9rZXkgOj0gKEJvb2wgdHJ1ZSk7IE5pbCkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiJnJlc3RcIildKSkgdGhlbiAoaGFzX2NoaWxkcmVuIDo9IChCb29sIHRydWUpOyBOaWwpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcIiZjaGlsZHJlblwiKV0pKSB0aGVuIChoYXNfY2hpbGRyZW4gOj0gKEJvb2wgdHJ1ZSk7IE5pbCkgZWxzZSAoaWYgc3hfdHJ1dGh5ICghaGFzX2NoaWxkcmVuKSB0aGVuIE5pbCBlbHNlIChpZiBzeF90cnV0aHkgKCFpbl9rZXkpIHRoZW4gKHBhcmFtcyA6PSBzeF9hcHBlbmRfYiAhcGFyYW1zIG5hbWU7IE5pbCkgZWxzZSAocGFyYW1zIDo9IHN4X2FwcGVuZF9iICFwYXJhbXMgbmFtZTsgTmlsKSkpKSkpKSBlbHNlIE5pbCkpKSkgKHN4X3RvX2xpc3QgcGFyYW1zX2V4cHIpOyBOaWwpKSBpbiAoTGlzdCBbIXBhcmFtczsgIWhhc19jaGlsZHJlbjsgcGFyYW1fdHlwZXNdKSkpXG5cbigqIHNmLWRlZmlzbGFuZCDigJQgbXVsdGktZXhwcmVzc2lvbiBib2RpZXMgd3JhcHBlZCBpbiAoYmVnaW4gLi4uKSAqKVxuYW5kIHNmX2RlZmlzbGFuZCBhcmdzIGVudiA9XG4gIChsZXQgbmFtZV9zeW0gPSAoZmlyc3QgKGFyZ3MpKSBpbiBsZXQgcGFyYW1zX3JhdyA9IChudGggKGFyZ3MpICgoTnVtYmVyIDEuMCkpKSBpbiBsZXQgYm9keV9leHBycyA9IChzbGljZSAoYXJncykgKChOdW1iZXIgMi4wKSkpIGluIGxldCBib2R5ID0gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAoYm9keV9leHBycykpOyAoTnVtYmVyIDEuMCldKSkgdGhlbiAoZmlyc3QgKGJvZHlfZXhwcnMpKSBlbHNlIChwcmltX2NhbGwgXCJjb25zXCIgWyhtYWtlX3N5bWJvbCAoKFN0cmluZyBcImJlZ2luXCIpKSk7IGJvZHlfZXhwcnNdKSkgaW4gbGV0IGNvbXBfbmFtZSA9IChzdHJpcF9wcmVmaXggKChzeW1ib2xfbmFtZSAobmFtZV9zeW0pKSkgKChTdHJpbmcgXCJ+XCIpKSkgaW4gbGV0IHBhcnNlZCA9IChwYXJzZV9jb21wX3BhcmFtcyAocGFyYW1zX3JhdykpIGluIGxldCBwYXJhbXMgPSAoZmlyc3QgKHBhcnNlZCkpIGluIGxldCBoYXNfY2hpbGRyZW4gPSAobnRoIChwYXJzZWQpICgoTnVtYmVyIDEuMCkpKSBpbiAobGV0IGlzbGFuZCA9IChtYWtlX2lzbGFuZCAoY29tcF9uYW1lKSAocGFyYW1zKSAoaGFzX2NoaWxkcmVuKSAoYm9keSkgKGVudikpIGluIChsZXQgKCkgPSBpZ25vcmUgKChlbnZfYmluZCBlbnYgKHN4X3RvX3N0cmluZyAoc3ltYm9sX25hbWUgKG5hbWVfc3ltKSkpIGlzbGFuZCkpIGluIGlzbGFuZCkpKVxuXG4oKiBzZi1kZWZtYWNybyAqKVxuYW5kIHNmX2RlZm1hY3JvIGFyZ3MgZW52ID1cbiAgKGxldCBuYW1lX3N5bSA9IChmaXJzdCAoYXJncykpIGluIGxldCBwYXJhbXNfcmF3ID0gKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpIGluIGxldCBib2R5ID0gKG50aCAoYXJncykgKChOdW1iZXIgMi4wKSkpIGluIGxldCBwYXJzZWQgPSAocGFyc2VfbWFjcm9fcGFyYW1zIChwYXJhbXNfcmF3KSkgaW4gbGV0IHBhcmFtcyA9IChmaXJzdCAocGFyc2VkKSkgaW4gbGV0IHJlc3RfcGFyYW0gPSAobnRoIChwYXJzZWQpICgoTnVtYmVyIDEuMCkpKSBpbiAobGV0IG1hYyA9IChtYWtlX21hY3JvIChwYXJhbXMpIChyZXN0X3BhcmFtKSAoYm9keSkgKGVudikgKChzeW1ib2xfbmFtZSAobmFtZV9zeW0pKSkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChlbnZfYmluZCBlbnYgKHN4X3RvX3N0cmluZyAoc3ltYm9sX25hbWUgKG5hbWVfc3ltKSkpIG1hYykpIGluIG1hYykpKVxuXG4oKiBwYXJzZS1tYWNyby1wYXJhbXMgKilcbmFuZCBwYXJzZV9tYWNyb19wYXJhbXMgcGFyYW1zX2V4cHIgPVxuICAobGV0IHBhcmFtcyA9IHJlZiAoKExpc3QgW10pKSBpbiBsZXQgcmVzdF9wYXJhbSA9IHJlZiAoTmlsKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5mb2xkX2xlZnQgKGZ1biBzdGF0ZSBwIC0+IChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChwKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoc3ltYm9sX25hbWUgKHApKTsgKFN0cmluZyBcIiZyZXN0XCIpXSkpKSB0aGVuIChwcmltX2NhbGwgXCJhc3NvY1wiIFtzdGF0ZTsgKFN0cmluZyBcImluLXJlc3RcIik7IChCb29sIHRydWUpXSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgoZ2V0IChzdGF0ZSkgKChTdHJpbmcgXCJpbi1yZXN0XCIpKSkpIHRoZW4gKGxldCAoKSA9IGlnbm9yZSAoKHJlc3RfcGFyYW0gOj0gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKHApKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pKSB0aGVuIChzeW1ib2xfbmFtZSAocCkpIGVsc2UgcCk7IE5pbCkpIGluIHN0YXRlKSBlbHNlIChsZXQgKCkgPSBpZ25vcmUgKChwYXJhbXMgOj0gc3hfYXBwZW5kX2IgIXBhcmFtcyAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAocCkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkpIHRoZW4gKHN5bWJvbF9uYW1lIChwKSkgZWxzZSBwKTsgTmlsKSkgaW4gc3RhdGUpKSkpIChsZXQgX2QgPSBIYXNodGJsLmNyZWF0ZSAxIGluIEhhc2h0YmwucmVwbGFjZSBfZCAodmFsdWVfdG9fc3RyIChTdHJpbmcgXCJpbi1yZXN0XCIpKSAoQm9vbCBmYWxzZSk7ICBEaWN0IF9kKSAoc3hfdG9fbGlzdCBwYXJhbXNfZXhwcikpKSBpbiAoTGlzdCBbIXBhcmFtczsgIXJlc3RfcGFyYW1dKSkpXG5cbigqIHFxLWV4cGFuZCAqKVxuYW5kIHFxX2V4cGFuZCB0ZW1wbGF0ZSBlbnYgPVxuICAoaWYgc3hfdHJ1dGh5ICgoQm9vbCAobm90IChzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICh0ZW1wbGF0ZSkpOyAoU3RyaW5nIFwibGlzdFwiKV0pKSkpKSkgdGhlbiB0ZW1wbGF0ZSBlbHNlIChpZiBzeF90cnV0aHkgKChlbXB0eV9wICh0ZW1wbGF0ZSkpKSB0aGVuIChMaXN0IFtdKSBlbHNlIChsZXQgaGVhZCA9IChmaXJzdCAodGVtcGxhdGUpKSBpbiAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoaGVhZCkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKHByaW1fY2FsbCBcIj1cIiBbKHN5bWJvbF9uYW1lIChoZWFkKSk7IChTdHJpbmcgXCJ1bnF1b3RlXCIpXSkpKSB0aGVuICh0cmFtcG9saW5lICgoZXZhbF9leHByICgobnRoICh0ZW1wbGF0ZSkgKChOdW1iZXIgMS4wKSkpKSAoZW52KSkpKSBlbHNlIChMaXN0LmZvbGRfbGVmdCAoZnVuIHJlc3VsdCcgaXRlbSAtPiAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoaXRlbSkpOyAoU3RyaW5nIFwibGlzdFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyhsZW4gKGl0ZW0pKTsgKE51bWJlciAyLjApXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChmaXJzdCAoaXRlbSkpKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoc3ltYm9sX25hbWUgKChmaXJzdCAoaXRlbSkpKSk7IChTdHJpbmcgXCJzcGxpY2UtdW5xdW90ZVwiKV0pKSkpKSB0aGVuIChsZXQgc3BsaWNlZCA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgobnRoIChpdGVtKSAoKE51bWJlciAxLjApKSkpIChlbnYpKSkpIGluIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChzcGxpY2VkKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkpIHRoZW4gKHByaW1fY2FsbCBcImNvbmNhdFwiIFtyZXN1bHQnOyBzcGxpY2VkXSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgoaXNfbmlsIChzcGxpY2VkKSkpIHRoZW4gcmVzdWx0JyBlbHNlIChwcmltX2NhbGwgXCJjb25jYXRcIiBbcmVzdWx0JzsgKExpc3QgW3NwbGljZWRdKV0pKSkpIGVsc2UgKHByaW1fY2FsbCBcImNvbmNhdFwiIFtyZXN1bHQnOyAoTGlzdCBbKHFxX2V4cGFuZCAoaXRlbSkgKGVudikpXSldKSkpIChMaXN0IFtdKSAoc3hfdG9fbGlzdCB0ZW1wbGF0ZSkpKSkpKVxuXG4oKiBzZi1sZXRyZWMgKilcbmFuZCBzZl9sZXRyZWMgYXJncyBlbnYgPVxuICAobGV0IGJpbmRpbmdzID0gKGZpcnN0IChhcmdzKSkgaW4gbGV0IGJvZHkgPSAocmVzdCAoYXJncykpIGluIGxldCBsb2NhbCA9IChlbnZfZXh0ZW5kIChlbnYpKSBpbiBsZXQgbmFtZXMgPSByZWYgKChMaXN0IFtdKSkgaW4gbGV0IHZhbF9leHBycyA9IHJlZiAoKExpc3QgW10pKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChiaW5kaW5ncykpKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAoKGZpcnN0IChiaW5kaW5ncykpKSk7IChOdW1iZXIgMi4wKV0pKSkgdGhlbiAoTGlzdC5pdGVyIChmdW4gYmluZGluZyAtPiBpZ25vcmUgKChsZXQgdm5hbWUgPSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChiaW5kaW5nKSkpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pKSB0aGVuIChzeW1ib2xfbmFtZSAoKGZpcnN0IChiaW5kaW5nKSkpKSBlbHNlIChmaXJzdCAoYmluZGluZykpKSBpbiAobGV0ICgpID0gaWdub3JlICgobmFtZXMgOj0gc3hfYXBwZW5kX2IgIW5hbWVzIHZuYW1lOyBOaWwpKSBpbiAobGV0ICgpID0gaWdub3JlICgodmFsX2V4cHJzIDo9IHN4X2FwcGVuZF9iICF2YWxfZXhwcnMgKG50aCAoYmluZGluZykgKChOdW1iZXIgMS4wKSkpOyBOaWwpKSBpbiAoZW52X2JpbmQgbG9jYWwgKHN4X3RvX3N0cmluZyB2bmFtZSkgTmlsKSkpKSkpIChzeF90b19saXN0IGJpbmRpbmdzKTsgTmlsKSBlbHNlIChMaXN0LmZvbGRfbGVmdCAoZnVuIF9hY2MgcGFpcl9pZHggLT4gKGxldCB2bmFtZSA9IChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICgobnRoIChiaW5kaW5ncykgKChwcmltX2NhbGwgXCIqXCIgW3BhaXJfaWR4OyAoTnVtYmVyIDIuMCldKSkpKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSkgdGhlbiAoc3ltYm9sX25hbWUgKChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcIipcIiBbcGFpcl9pZHg7IChOdW1iZXIgMi4wKV0pKSkpKSBlbHNlIChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcIipcIiBbcGFpcl9pZHg7IChOdW1iZXIgMi4wKV0pKSkpIGluIGxldCB2YWxfZXhwciA9IChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcImluY1wiIFsocHJpbV9jYWxsIFwiKlwiIFtwYWlyX2lkeDsgKE51bWJlciAyLjApXSldKSkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChuYW1lcyA6PSBzeF9hcHBlbmRfYiAhbmFtZXMgdm5hbWU7IE5pbCkpIGluIChsZXQgKCkgPSBpZ25vcmUgKCh2YWxfZXhwcnMgOj0gc3hfYXBwZW5kX2IgIXZhbF9leHBycyB2YWxfZXhwcjsgTmlsKSkgaW4gKGVudl9iaW5kIGxvY2FsIChzeF90b19zdHJpbmcgdm5hbWUpIE5pbCkpKSkpIE5pbCAoc3hfdG9fbGlzdCAocHJpbV9jYWxsIFwicmFuZ2VcIiBbKE51bWJlciAwLjApOyAocHJpbV9jYWxsIFwiL1wiIFsobGVuIChiaW5kaW5ncykpOyAoTnVtYmVyIDIuMCldKV0pKSkpKSBpbiAobGV0ICgpID0gaWdub3JlICgobGV0IHZhbHVlcyA9IChMaXN0IChMaXN0Lm1hcCAoZnVuIGUgLT4gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKGUpIChsb2NhbCkpKSkpIChzeF90b19saXN0ICF2YWxfZXhwcnMpKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKExpc3QuaXRlciAoZnVuIHBhaXIgLT4gaWdub3JlICgoZW52X2JpbmQgbG9jYWwgKHN4X3RvX3N0cmluZyAoZmlyc3QgKHBhaXIpKSkgKG50aCAocGFpcikgKChOdW1iZXIgMS4wKSkpKSkpIChzeF90b19saXN0IChwcmltX2NhbGwgXCJ6aXBcIiBbIW5hbWVzOyB2YWx1ZXNdKSk7IE5pbCkpIGluIChMaXN0Lml0ZXIgKGZ1biB2YWwnIC0+IGlnbm9yZSAoKGlmIHN4X3RydXRoeSAoKGlzX2xhbWJkYSAodmFsJykpKSB0aGVuIChMaXN0Lml0ZXIgKGZ1biBuIC0+IGlnbm9yZSAoKGVudl9iaW5kIChsYW1iZGFfY2xvc3VyZSAodmFsJykpIChzeF90b19zdHJpbmcgbikgKGVudl9nZXQgKGxvY2FsKSAobikpKSkpIChzeF90b19saXN0ICFuYW1lcyk7IE5pbCkgZWxzZSBOaWwpKSkgKHN4X3RvX2xpc3QgdmFsdWVzKTsgTmlsKSkpKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gZSAtPiBpZ25vcmUgKCh0cmFtcG9saW5lICgoZXZhbF9leHByIChlKSAobG9jYWwpKSkpKSkgKHN4X3RvX2xpc3QgKHByaW1fY2FsbCBcInNsaWNlXCIgW2JvZHk7IChOdW1iZXIgMC4wKTsgKHByaW1fY2FsbCBcImRlY1wiIFsobGVuIChib2R5KSldKV0pKTsgTmlsKSkgaW4gKG1ha2VfdGh1bmsgKChsYXN0IChib2R5KSkpIChsb2NhbCkpKSkpKVxuXG4oKiBzdGVwLXNmLWxldHJlYyAqKVxuYW5kIHN0ZXBfc2ZfbGV0cmVjIGFyZ3MgZW52IGtvbnQgPVxuICAobGV0IHRoayA9IChzZl9sZXRyZWMgKGFyZ3MpIChlbnYpKSBpbiAobWFrZV9jZWtfc3RhdGUgKCh0aHVua19leHByICh0aGspKSkgKCh0aHVua19lbnYgKHRoaykpKSAoa29udCkpKVxuXG4oKiBzZi1keW5hbWljLXdpbmQgKilcbmFuZCBzZl9keW5hbWljX3dpbmQgYXJncyBlbnYgPVxuICAobGV0IGJlZm9yZSA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgoZmlyc3QgKGFyZ3MpKSkgKGVudikpKSkgaW4gbGV0IGJvZHkgPSAodHJhbXBvbGluZSAoKGV2YWxfZXhwciAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSAoZW52KSkpKSBpbiBsZXQgYWZ0ZXIgPSAodHJhbXBvbGluZSAoKGV2YWxfZXhwciAoKG50aCAoYXJncykgKChOdW1iZXIgMi4wKSkpKSAoZW52KSkpKSBpbiAoZHluYW1pY193aW5kX2NhbGwgKGJlZm9yZSkgKGJvZHkpIChhZnRlcikgKGVudikpKVxuXG4oKiBzZi1zY29wZSAqKVxuYW5kIHNmX3Njb3BlIGFyZ3MgZW52ID1cbiAgKGxldCBuYW1lID0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKChmaXJzdCAoYXJncykpKSAoZW52KSkpKSBpbiBsZXQgcmVzdCA9IChwcmltX2NhbGwgXCJzbGljZVwiIFthcmdzOyAoTnVtYmVyIDEuMCldKSBpbiBsZXQgdmFsJyA9IHJlZiAoTmlsKSBpbiBsZXQgYm9keV9leHBycyA9IHJlZiAoTmlsKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPj1cIiBbKGxlbiAocmVzdCkpOyAoTnVtYmVyIDIuMCldKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChyZXN0KSkpKTsgKFN0cmluZyBcImtleXdvcmRcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoa2V5d29yZF9uYW1lICgoZmlyc3QgKHJlc3QpKSkpOyAoU3RyaW5nIFwidmFsdWVcIildKSkpKSB0aGVuIChsZXQgKCkgPSBpZ25vcmUgKCh2YWwnIDo9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgobnRoIChyZXN0KSAoKE51bWJlciAxLjApKSkpIChlbnYpKSkpOyBOaWwpKSBpbiAoYm9keV9leHBycyA6PSAocHJpbV9jYWxsIFwic2xpY2VcIiBbcmVzdDsgKE51bWJlciAyLjApXSk7IE5pbCkpIGVsc2UgKGJvZHlfZXhwcnMgOj0gcmVzdDsgTmlsKSkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChzY29wZV9wdXNoIChuYW1lKSAoIXZhbCcpKSkgaW4gKGxldCByZXN1bHQnID0gcmVmIChOaWwpIGluIChsZXQgKCkgPSBpZ25vcmUgKChMaXN0Lml0ZXIgKGZ1biBlIC0+IGlnbm9yZSAoKHJlc3VsdCcgOj0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKGUpIChlbnYpKSkpOyBOaWwpKSkgKHN4X3RvX2xpc3QgIWJvZHlfZXhwcnMpOyBOaWwpKSBpbiAobGV0ICgpID0gaWdub3JlICgoc2NvcGVfcG9wIChuYW1lKSkpIGluICFyZXN1bHQnKSkpKSkpXG5cbigqIHNmLXByb3ZpZGUgKilcbmFuZCBzZl9wcm92aWRlIGFyZ3MgZW52ID1cbiAgKGxldCBuYW1lID0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKChmaXJzdCAoYXJncykpKSAoZW52KSkpKSBpbiBsZXQgdmFsJyA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgobnRoIChhcmdzKSAoKE51bWJlciAxLjApKSkpIChlbnYpKSkpIGluIGxldCBib2R5X2V4cHJzID0gKHByaW1fY2FsbCBcInNsaWNlXCIgW2FyZ3M7IChOdW1iZXIgMi4wKV0pIGluIGxldCByZXN1bHQnID0gcmVmIChOaWwpIGluIChsZXQgKCkgPSBpZ25vcmUgKChzY29wZV9wdXNoIChuYW1lKSAodmFsJykpKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gZSAtPiBpZ25vcmUgKChyZXN1bHQnIDo9ICh0cmFtcG9saW5lICgoZXZhbF9leHByIChlKSAoZW52KSkpKTsgTmlsKSkpIChzeF90b19saXN0IGJvZHlfZXhwcnMpOyBOaWwpKSBpbiAobGV0ICgpID0gaWdub3JlICgoc2NvcGVfcG9wIChuYW1lKSkpIGluICFyZXN1bHQnKSkpKVxuXG4oKiBleHBhbmQtbWFjcm8gKilcbmFuZCBleHBhbmRfbWFjcm8gbWFjIHJhd19hcmdzIGVudiA9XG4gIChsZXQgbG9jYWwgPSAoZW52X21lcmdlICgobWFjcm9fY2xvc3VyZSAobWFjKSkpIChlbnYpKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gcGFpciAtPiBpZ25vcmUgKChlbnZfYmluZCBsb2NhbCAoc3hfdG9fc3RyaW5nIChmaXJzdCAocGFpcikpKSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPFwiIFsobnRoIChwYWlyKSAoKE51bWJlciAxLjApKSk7IChsZW4gKHJhd19hcmdzKSldKSkgdGhlbiAobnRoIChyYXdfYXJncykgKChudGggKHBhaXIpICgoTnVtYmVyIDEuMCkpKSkpIGVsc2UgTmlsKSkpKSAoc3hfdG9fbGlzdCAoTGlzdCAoTGlzdC5tYXBpIChmdW4gaSBwIC0+IGxldCBpID0gTnVtYmVyIChmbG9hdF9vZl9pbnQgaSkgaW4gKExpc3QgW3A7IGldKSkgKHN4X3RvX2xpc3QgKG1hY3JvX3BhcmFtcyAobWFjKSkpKSkpOyBOaWwpKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5ICgobWFjcm9fcmVzdF9wYXJhbSAobWFjKSkpIHRoZW4gKGVudl9iaW5kIGxvY2FsIChzeF90b19zdHJpbmcgKG1hY3JvX3Jlc3RfcGFyYW0gKG1hYykpKSAocHJpbV9jYWxsIFwic2xpY2VcIiBbcmF3X2FyZ3M7IChsZW4gKChtYWNyb19wYXJhbXMgKG1hYykpKSldKSkgZWxzZSBOaWwpKSBpbiAodHJhbXBvbGluZSAoKGV2YWxfZXhwciAoKG1hY3JvX2JvZHkgKG1hYykpKSAobG9jYWwpKSkpKSkpXG5cbigqIGNlay1ydW4g4oCUIGl0ZXJhdGl2ZSB0byBhdm9pZCBPQ2FtbCBzdGFjayBvdmVyZmxvdyBpbiBqc19vZl9vY2FtbC9XQVNNICopXG5hbmQgY2VrX3J1biBzdGF0ZSA9XG4gIGxldCBzID0gcmVmIHN0YXRlIGluXG4gIHdoaWxlIG5vdCAobWF0Y2ggY2VrX3Rlcm1pbmFsX3AgIXMgd2l0aCBCb29sIHRydWUgLT4gdHJ1ZSB8IF8gLT4gZmFsc2UpIGRvXG4gICAgcyA6PSBjZWtfc3RlcCAhc1xuICBkb25lO1xuICBjZWtfdmFsdWUgIXNcblxuKCogY2VrLXN0ZXAgKilcbmFuZCBjZWtfc3RlcCBzdGF0ZSA9XG4gIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyhjZWtfcGhhc2UgKHN0YXRlKSk7IChTdHJpbmcgXCJldmFsXCIpXSkpIHRoZW4gKHN0ZXBfZXZhbCAoc3RhdGUpKSBlbHNlIChzdGVwX2NvbnRpbnVlIChzdGF0ZSkpKVxuXG4oKiBzdGVwLWV2YWwgKilcbmFuZCBzdGVwX2V2YWwgc3RhdGUgPVxuICAobGV0IGV4cHIgPSAoY2VrX2NvbnRyb2wgKHN0YXRlKSkgaW4gbGV0IGVudiA9IChjZWtfZW52IChzdGF0ZSkpIGluIGxldCBrb250ID0gKGNla19rb250IChzdGF0ZSkpIGluIChsZXQgX21hdGNoX3ZhbCA9ICh0eXBlX29mIChleHByKSkgaW4gKGlmIF9tYXRjaF92YWwgPSAoU3RyaW5nIFwibnVtYmVyXCIpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChleHByKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIF9tYXRjaF92YWwgPSAoU3RyaW5nIFwic3RyaW5nXCIpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChleHByKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIF9tYXRjaF92YWwgPSAoU3RyaW5nIFwiYm9vbGVhblwiKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoZXhwcikgKGVudikgKGtvbnQpKSBlbHNlIChpZiBfbWF0Y2hfdmFsID0gKFN0cmluZyBcIm5pbFwiKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoTmlsKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIF9tYXRjaF92YWwgPSAoU3RyaW5nIFwic3ltYm9sXCIpIHRoZW4gKGxldCBuYW1lID0gKHN5bWJvbF9uYW1lIChleHByKSkgaW4gKGxldCB2YWwnID0gKGlmIHN4X3RydXRoeSAoKGVudl9oYXMgKGVudikgKG5hbWUpKSkgdGhlbiAoZW52X2dldCAoZW52KSAobmFtZSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKGlzX3ByaW1pdGl2ZSAobmFtZSkpKSB0aGVuIChnZXRfcHJpbWl0aXZlIChuYW1lKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwidHJ1ZVwiKV0pKSB0aGVuIChCb29sIHRydWUpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImZhbHNlXCIpXSkpIHRoZW4gKEJvb2wgZmFsc2UpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcIm5pbFwiKV0pKSB0aGVuIE5pbCBlbHNlIChyYWlzZSAoRXZhbF9lcnJvciAodmFsdWVfdG9fc3RyIChTdHJpbmcgKHN4X3N0ciBbKFN0cmluZyBcIlVuZGVmaW5lZCBzeW1ib2w6IFwiKTsgbmFtZV0pKSkpKSkpKSkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChpc19uaWwgKHZhbCcpKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwic3RhcnRzLXdpdGg/XCIgW25hbWU7IChTdHJpbmcgXCJ+XCIpXSkpKSB0aGVuIChkZWJ1Z19sb2cgKChTdHJpbmcgXCJDb21wb25lbnQgbm90IGZvdW5kOlwiKSkgKG5hbWUpKSBlbHNlIE5pbCkpIGluIChtYWtlX2Nla192YWx1ZSAodmFsJykgKGVudikgKGtvbnQpKSkpKSBlbHNlIChpZiBfbWF0Y2hfdmFsID0gKFN0cmluZyBcImtleXdvcmRcIikgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChrZXl3b3JkX25hbWUgKGV4cHIpKSkgKGVudikgKGtvbnQpKSBlbHNlIChpZiBfbWF0Y2hfdmFsID0gKFN0cmluZyBcImRpY3RcIikgdGhlbiAobGV0IGtzID0gKHByaW1fY2FsbCBcImtleXNcIiBbZXhwcl0pIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChrcykpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoKERpY3QgKEhhc2h0YmwuY3JlYXRlIDApKSkgKGVudikgKGtvbnQpKSBlbHNlIChsZXQgZmlyc3Rfa2V5ID0gKGZpcnN0IChrcykpIGluIGxldCByZW1haW5pbmdfZW50cmllcyA9IHJlZiAoKExpc3QgW10pKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gayAtPiBpZ25vcmUgKChyZW1haW5pbmdfZW50cmllcyA6PSBzeF9hcHBlbmRfYiAhcmVtYWluaW5nX2VudHJpZXMgKExpc3QgW2s7IChnZXQgKGV4cHIpIChrKSldKTsgTmlsKSkpIChzeF90b19saXN0IChyZXN0IChrcykpKTsgTmlsKSkgaW4gKG1ha2VfY2VrX3N0YXRlICgoZ2V0IChleHByKSAoZmlyc3Rfa2V5KSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9kaWN0X2ZyYW1lICghcmVtYWluaW5nX2VudHJpZXMpICgoTGlzdCBbKExpc3QgW2ZpcnN0X2tleV0pXSkpIChlbnYpKSkgKGtvbnQpKSkpKSkpKSBlbHNlIChpZiBfbWF0Y2hfdmFsID0gKFN0cmluZyBcImxpc3RcIikgdGhlbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAoZXhwcikpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoKExpc3QgW10pKSAoZW52KSAoa29udCkpIGVsc2UgKHN0ZXBfZXZhbF9saXN0IChleHByKSAoZW52KSAoa29udCkpKSBlbHNlIChtYWtlX2Nla192YWx1ZSAoZXhwcikgKGVudikgKGtvbnQpKSkpKSkpKSkpKSlcblxuKCogc3RlcC1ldmFsLWxpc3QgKilcbmFuZCBzdGVwX2V2YWxfbGlzdCBleHByIGVudiBrb250ID1cbiAgKGxldCBoZWFkID0gKGZpcnN0IChleHByKSkgaW4gbGV0IGFyZ3MgPSAocmVzdCAoZXhwcikpIGluIChpZiBzeF90cnV0aHkgKChCb29sIChub3QgKHN4X3RydXRoeSAoKGxldCBfb3IgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoaGVhZCkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChsZXQgX29yID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKGhlYWQpKTsgKFN0cmluZyBcImxhbWJkYVwiKV0pIGluIGlmIHN4X3RydXRoeSBfb3IgdGhlbiBfb3IgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoaGVhZCkpOyAoU3RyaW5nIFwibGlzdFwiKV0pKSkpKSkpKSB0aGVuIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChleHByKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoTGlzdCBbXSkpIChlbnYpIChrb250KSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoZXhwcikpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfbWFwX2ZyYW1lIChOaWwpICgocmVzdCAoZXhwcikpKSAoKExpc3QgW10pKSAoZW52KSkpIChrb250KSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoaGVhZCkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkpIHRoZW4gKGxldCBuYW1lID0gKHN5bWJvbF9uYW1lIChoZWFkKSkgaW4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImlmXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfaWYgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwid2hlblwiKV0pKSB0aGVuIChzdGVwX3NmX3doZW4gKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiY29uZFwiKV0pKSB0aGVuIChzdGVwX3NmX2NvbmQgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiY2FzZVwiKV0pKSB0aGVuIChzdGVwX3NmX2Nhc2UgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiYW5kXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfYW5kIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcIm9yXCIpXSkpIHRoZW4gKHN0ZXBfc2Zfb3IgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwibGV0XCIpXSkpIHRoZW4gKHN0ZXBfc2ZfbGV0IChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImxldCpcIildKSkgdGhlbiAoc3RlcF9zZl9sZXQgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwibGFtYmRhXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfbGFtYmRhIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImZuXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfbGFtYmRhIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImRlZmluZVwiKV0pKSB0aGVuIChzdGVwX3NmX2RlZmluZSAoYXJncykgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJkZWZjb21wXCIpXSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoc2ZfZGVmY29tcCAoYXJncykgKGVudikpKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImRlZmlzbGFuZFwiKV0pKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoKHNmX2RlZmlzbGFuZCAoYXJncykgKGVudikpKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImRlZm1hY3JvXCIpXSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoc2ZfZGVmbWFjcm8gKGFyZ3MpIChlbnYpKSkgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJiZWdpblwiKV0pKSB0aGVuIChzdGVwX3NmX2JlZ2luIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImRvXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfYmVnaW4gKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwicXVvdGVcIildKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChhcmdzKSkpIHRoZW4gTmlsIGVsc2UgKGZpcnN0IChhcmdzKSkpKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcInF1YXNpcXVvdGVcIildKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChxcV9leHBhbmQgKChmaXJzdCAoYXJncykpKSAoZW52KSkpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiLT5cIildKSkgdGhlbiAoc3RlcF9zZl90aHJlYWRfZmlyc3QgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwic2V0IVwiKV0pKSB0aGVuIChzdGVwX3NmX3NldF9iIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImxldHJlY1wiKV0pKSB0aGVuIChzdGVwX3NmX2xldHJlYyAoYXJncykgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJyZXNldFwiKV0pKSB0aGVuIChzdGVwX3NmX3Jlc2V0IChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcInNoaWZ0XCIpXSkpIHRoZW4gKHN0ZXBfc2Zfc2hpZnQgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiZGVyZWZcIildKSkgdGhlbiAoc3RlcF9zZl9kZXJlZiAoYXJncykgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJzY29wZVwiKV0pKSB0aGVuIChzdGVwX3NmX3Njb3BlIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcInByb3ZpZGVcIildKSkgdGhlbiAoc3RlcF9zZl9wcm92aWRlIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImNvbnRleHRcIildKSkgdGhlbiAoc3RlcF9zZl9jb250ZXh0IChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImVtaXQhXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfZW1pdCAoYXJncykgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJlbWl0dGVkXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfZW1pdHRlZCAoYXJncykgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJkeW5hbWljLXdpbmRcIildKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChzZl9keW5hbWljX3dpbmQgKGFyZ3MpIChlbnYpKSkgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJtYXBcIildKSkgdGhlbiAoc3RlcF9ob19tYXAgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwibWFwLWluZGV4ZWRcIildKSkgdGhlbiAoc3RlcF9ob19tYXBfaW5kZXhlZCAoYXJncykgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJmaWx0ZXJcIildKSkgdGhlbiAoc3RlcF9ob19maWx0ZXIgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwicmVkdWNlXCIpXSkpIHRoZW4gKHN0ZXBfaG9fcmVkdWNlIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcInNvbWVcIildKSkgdGhlbiAoc3RlcF9ob19zb21lIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImV2ZXJ5P1wiKV0pKSB0aGVuIChzdGVwX2hvX2V2ZXJ5IChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImZvci1lYWNoXCIpXSkpIHRoZW4gKHN0ZXBfaG9fZm9yX2VhY2ggKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiaGFzLWtleT9cIiBbY3VzdG9tX3NwZWNpYWxfZm9ybXM7IG5hbWVdKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChjZWtfY2FsbCAoKGdldCAoY3VzdG9tX3NwZWNpYWxfZm9ybXMpIChuYW1lKSkpIChMaXN0IFthcmdzOyBlbnZdKSkpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAoZW52X2hhcyAoZW52KSAobmFtZSkpIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChpc19tYWNybyAoKGVudl9nZXQgKGVudikgKG5hbWUpKSkpKSkgdGhlbiAobGV0IG1hYyA9IChlbnZfZ2V0IChlbnYpIChuYW1lKSkgaW4gKG1ha2VfY2VrX3N0YXRlICgoZXhwYW5kX21hY3JvIChtYWMpIChhcmdzKSAoZW52KSkpIChlbnYpIChrb250KSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gcmVuZGVyX2NoZWNrIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChjZWtfY2FsbCAocmVuZGVyX2NoZWNrKSAoTGlzdCBbZXhwcjsgZW52XSkpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChjZWtfY2FsbCAocmVuZGVyX2ZuKSAoTGlzdCBbZXhwcjsgZW52XSkpKSAoZW52KSAoa29udCkpIGVsc2UgKHN0ZXBfZXZhbF9jYWxsIChoZWFkKSAoYXJncykgKGVudikgKGtvbnQpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpIGVsc2UgKHN0ZXBfZXZhbF9jYWxsIChoZWFkKSAoYXJncykgKGVudikgKGtvbnQpKSkpKVxuXG4oKiBzdGVwLXNmLWlmICopXG5hbmQgc3RlcF9zZl9pZiBhcmdzIGVudiBrb250ID1cbiAgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKGFyZ3MpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX2lmX2ZyYW1lICgobnRoIChhcmdzKSAoKE51bWJlciAxLjApKSkpICgoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPlwiIFsobGVuIChhcmdzKSk7IChOdW1iZXIgMi4wKV0pKSB0aGVuIChudGggKGFyZ3MpICgoTnVtYmVyIDIuMCkpKSBlbHNlIE5pbCkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtc2Ytd2hlbiAqKVxuYW5kIHN0ZXBfc2Zfd2hlbiBhcmdzIGVudiBrb250ID1cbiAgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKGFyZ3MpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX3doZW5fZnJhbWUgKChyZXN0IChhcmdzKSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtc2YtYmVnaW4gKilcbmFuZCBzdGVwX3NmX2JlZ2luIGFyZ3MgZW52IGtvbnQgPVxuICAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAoYXJncykpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoTmlsKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAoYXJncykpOyAoTnVtYmVyIDEuMCldKSkgdGhlbiAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYXJncykpKSAoZW52KSAoa29udCkpIGVsc2UgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKGFyZ3MpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX2JlZ2luX2ZyYW1lICgocmVzdCAoYXJncykpKSAoZW52KSkpIChrb250KSkpKSkpXG5cbigqIHN0ZXAtc2YtbGV0ICopXG5hbmQgc3RlcF9zZl9sZXQgYXJncyBlbnYga29udCA9XG4gIGxldCBwYWlycyA9IHJlZiBOaWwgaW4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChmaXJzdCAoYXJncykpKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKCh0cmFtcG9saW5lICgoc2ZfbmFtZWRfbGV0IChhcmdzKSAoZW52KSkpKSkgKGVudikgKGtvbnQpKSBlbHNlIChsZXQgYmluZGluZ3MgPSAoZmlyc3QgKGFyZ3MpKSBpbiBsZXQgYm9keSA9IChyZXN0IChhcmdzKSkgaW4gbGV0IGxvY2FsID0gKGVudl9leHRlbmQgKGVudikpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChiaW5kaW5ncykpKSB0aGVuIChzdGVwX3NmX2JlZ2luIChib2R5KSAobG9jYWwpIChrb250KSkgZWxzZSAobGV0IGZpcnN0X2JpbmRpbmcgPSAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChiaW5kaW5ncykpKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAoKGZpcnN0IChiaW5kaW5ncykpKSk7IChOdW1iZXIgMi4wKV0pKSkgdGhlbiAoZmlyc3QgKGJpbmRpbmdzKSkgZWxzZSAoTGlzdCBbKGZpcnN0IChiaW5kaW5ncykpOyAobnRoIChiaW5kaW5ncykgKChOdW1iZXIgMS4wKSkpXSkpIGluIGxldCByZXN0X2JpbmRpbmdzID0gKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChmaXJzdCAoYmluZGluZ3MpKSkpOyAoU3RyaW5nIFwibGlzdFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCI9XCIgWyhsZW4gKChmaXJzdCAoYmluZGluZ3MpKSkpOyAoTnVtYmVyIDIuMCldKSkpIHRoZW4gKHJlc3QgKGJpbmRpbmdzKSkgZWxzZSAobGV0IHBhaXJzID0gcmVmICgoTGlzdCBbXSkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChMaXN0LmZvbGRfbGVmdCAoZnVuIF9hY2MgaSAtPiAocGFpcnMgOj0gc3hfYXBwZW5kX2IgIXBhaXJzIChMaXN0IFsobnRoIChiaW5kaW5ncykgKChwcmltX2NhbGwgXCIqXCIgW2k7IChOdW1iZXIgMi4wKV0pKSk7IChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcImluY1wiIFsocHJpbV9jYWxsIFwiKlwiIFtpOyAoTnVtYmVyIDIuMCldKV0pKSldKTsgTmlsKSkgTmlsIChzeF90b19saXN0IChwcmltX2NhbGwgXCJyYW5nZVwiIFsoTnVtYmVyIDEuMCk7IChwcmltX2NhbGwgXCIvXCIgWyhsZW4gKGJpbmRpbmdzKSk7IChOdW1iZXIgMi4wKV0pXSkpKSkgaW4gIXBhaXJzKSkpIGluIChsZXQgdm5hbWUgPSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChmaXJzdF9iaW5kaW5nKSkpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pKSB0aGVuIChzeW1ib2xfbmFtZSAoKGZpcnN0IChmaXJzdF9iaW5kaW5nKSkpKSBlbHNlIChmaXJzdCAoZmlyc3RfYmluZGluZykpKSBpbiAobWFrZV9jZWtfc3RhdGUgKChudGggKGZpcnN0X2JpbmRpbmcpICgoTnVtYmVyIDEuMCkpKSkgKGxvY2FsKSAoKGtvbnRfcHVzaCAoKG1ha2VfbGV0X2ZyYW1lICh2bmFtZSkgKHJlc3RfYmluZGluZ3MpIChib2R5KSAobG9jYWwpKSkgKGtvbnQpKSkpKSkpKSlcblxuKCogc3RlcC1zZi1kZWZpbmUgKilcbmFuZCBzdGVwX3NmX2RlZmluZSBhcmdzIGVudiBrb250ID1cbiAgKGxldCBuYW1lX3N5bSA9IChmaXJzdCAoYXJncykpIGluIGxldCBoYXNfZWZmZWN0cyA9IChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI+PVwiIFsobGVuIChhcmdzKSk7IChOdW1iZXIgNC4wKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICgobnRoIChhcmdzKSAoKE51bWJlciAxLjApKSkpKTsgKFN0cmluZyBcImtleXdvcmRcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoa2V5d29yZF9uYW1lICgobnRoIChhcmdzKSAoKE51bWJlciAxLjApKSkpKTsgKFN0cmluZyBcImVmZmVjdHNcIildKSkpIGluIGxldCB2YWxfaWR4ID0gKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj49XCIgWyhsZW4gKGFyZ3MpKTsgKE51bWJlciA0LjApXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChudGggKGFyZ3MpICgoTnVtYmVyIDEuMCkpKSkpOyAoU3RyaW5nIFwia2V5d29yZFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCI9XCIgWyhrZXl3b3JkX25hbWUgKChudGggKGFyZ3MpICgoTnVtYmVyIDEuMCkpKSkpOyAoU3RyaW5nIFwiZWZmZWN0c1wiKV0pKSkpIHRoZW4gKE51bWJlciAzLjApIGVsc2UgKE51bWJlciAxLjApKSBpbiBsZXQgZWZmZWN0X2xpc3QgPSAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPj1cIiBbKGxlbiAoYXJncykpOyAoTnVtYmVyIDQuMCldKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSk7IChTdHJpbmcgXCJrZXl3b3JkXCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKHByaW1fY2FsbCBcIj1cIiBbKGtleXdvcmRfbmFtZSAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSk7IChTdHJpbmcgXCJlZmZlY3RzXCIpXSkpKSkgdGhlbiAobnRoIChhcmdzKSAoKE51bWJlciAyLjApKSkgZWxzZSBOaWwpIGluIChtYWtlX2Nla19zdGF0ZSAoKG50aCAoYXJncykgKHZhbF9pZHgpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX2RlZmluZV9mcmFtZSAoKHN5bWJvbF9uYW1lIChuYW1lX3N5bSkpKSAoZW52KSAoaGFzX2VmZmVjdHMpIChlZmZlY3RfbGlzdCkpKSAoa29udCkpKSkpXG5cbigqIHN0ZXAtc2Ytc2V0ISAqKVxuYW5kIHN0ZXBfc2Zfc2V0X2IgYXJncyBlbnYga29udCA9XG4gIChtYWtlX2Nla19zdGF0ZSAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2Vfc2V0X2ZyYW1lICgoc3ltYm9sX25hbWUgKChmaXJzdCAoYXJncykpKSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtc2YtYW5kICopXG5hbmQgc3RlcF9zZl9hbmQgYXJncyBlbnYga29udCA9XG4gIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChhcmdzKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoQm9vbCB0cnVlKSkgKGVudikgKGtvbnQpKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChhcmdzKSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9hbmRfZnJhbWUgKChyZXN0IChhcmdzKSkpIChlbnYpKSkgKGtvbnQpKSkpKVxuXG4oKiBzdGVwLXNmLW9yICopXG5hbmQgc3RlcF9zZl9vciBhcmdzIGVudiBrb250ID1cbiAgKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGFyZ3MpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChCb29sIGZhbHNlKSkgKGVudikgKGtvbnQpKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChhcmdzKSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9vcl9mcmFtZSAoKHJlc3QgKGFyZ3MpKSkgKGVudikpKSAoa29udCkpKSkpXG5cbigqIHN0ZXAtc2YtY29uZCAqKVxuYW5kIHN0ZXBfc2ZfY29uZCBhcmdzIGVudiBrb250ID1cbiAgKGxldCBzY2hlbWVfcCA9IChjb25kX3NjaGVtZV9wIChhcmdzKSkgaW4gKGlmIHN4X3RydXRoeSAoc2NoZW1lX3ApIHRoZW4gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGFyZ3MpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKE5pbCkgKGVudikgKGtvbnQpKSBlbHNlIChsZXQgY2xhdXNlID0gKGZpcnN0IChhcmdzKSkgaW4gbGV0IHRlc3QgPSAoZmlyc3QgKGNsYXVzZSkpIGluIChpZiBzeF90cnV0aHkgKChpc19lbHNlX2NsYXVzZSAodGVzdCkpKSB0aGVuIChtYWtlX2Nla19zdGF0ZSAoKG50aCAoY2xhdXNlKSAoKE51bWJlciAxLjApKSkpIChlbnYpIChrb250KSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKHRlc3QpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9jb25kX2ZyYW1lIChhcmdzKSAoZW52KSAoKEJvb2wgdHJ1ZSkpKSkgKGtvbnQpKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIjxcIiBbKGxlbiAoYXJncykpOyAoTnVtYmVyIDIuMCldKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKE5pbCkgKGVudikgKGtvbnQpKSBlbHNlIChsZXQgdGVzdCA9IChmaXJzdCAoYXJncykpIGluIChpZiBzeF90cnV0aHkgKChpc19lbHNlX2NsYXVzZSAodGVzdCkpKSB0aGVuIChtYWtlX2Nla19zdGF0ZSAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSAoZW52KSAoa29udCkpIGVsc2UgKG1ha2VfY2VrX3N0YXRlICh0ZXN0KSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfY29uZF9mcmFtZSAoYXJncykgKGVudikgKChCb29sIGZhbHNlKSkpKSAoa29udCkpKSkpKSkpKVxuXG4oKiBzdGVwLXNmLWNhc2UgKilcbmFuZCBzdGVwX3NmX2Nhc2UgYXJncyBlbnYga29udCA9XG4gIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChhcmdzKSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9jYXNlX2ZyYW1lIChOaWwpICgocmVzdCAoYXJncykpKSAoZW52KSkpIChrb250KSkpKVxuXG4oKiBzdGVwLXNmLXRocmVhZC1maXJzdCAqKVxuYW5kIHN0ZXBfc2ZfdGhyZWFkX2ZpcnN0IGFyZ3MgZW52IGtvbnQgPVxuICAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYXJncykpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfdGhyZWFkX2ZyYW1lICgocmVzdCAoYXJncykpKSAoZW52KSkpIChrb250KSkpKVxuXG4oKiBzdGVwLXNmLWxhbWJkYSAqKVxuYW5kIHN0ZXBfc2ZfbGFtYmRhIGFyZ3MgZW52IGtvbnQgPVxuICAobWFrZV9jZWtfdmFsdWUgKChzZl9sYW1iZGEgKGFyZ3MpIChlbnYpKSkgKGVudikgKGtvbnQpKVxuXG4oKiBzdGVwLXNmLXNjb3BlICopXG5hbmQgc3RlcF9zZl9zY29wZSBhcmdzIGVudiBrb250ID1cbiAgKGxldCBuYW1lID0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKChmaXJzdCAoYXJncykpKSAoZW52KSkpKSBpbiBsZXQgcmVzdF9hcmdzID0gKHByaW1fY2FsbCBcInNsaWNlXCIgW2FyZ3M7IChOdW1iZXIgMS4wKV0pIGluIGxldCB2YWwnID0gcmVmIChOaWwpIGluIGxldCBib2R5ID0gcmVmIChOaWwpIGluIChsZXQgKCkgPSBpZ25vcmUgKChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI+PVwiIFsobGVuIChyZXN0X2FyZ3MpKTsgKE51bWJlciAyLjApXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChmaXJzdCAocmVzdF9hcmdzKSkpKTsgKFN0cmluZyBcImtleXdvcmRcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoa2V5d29yZF9uYW1lICgoZmlyc3QgKHJlc3RfYXJncykpKSk7IChTdHJpbmcgXCJ2YWx1ZVwiKV0pKSkpIHRoZW4gKGxldCAoKSA9IGlnbm9yZSAoKHZhbCcgOj0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKChudGggKHJlc3RfYXJncykgKChOdW1iZXIgMS4wKSkpKSAoZW52KSkpKTsgTmlsKSkgaW4gKGJvZHkgOj0gKHByaW1fY2FsbCBcInNsaWNlXCIgW3Jlc3RfYXJnczsgKE51bWJlciAyLjApXSk7IE5pbCkpIGVsc2UgKGJvZHkgOj0gcmVzdF9hcmdzOyBOaWwpKSkgaW4gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKCFib2R5KSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChOaWwpIChlbnYpIChrb250KSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoIWJvZHkpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX3Njb3BlX2FjY19mcmFtZSAobmFtZSkgKCF2YWwnKSAoKHJlc3QgKCFib2R5KSkpIChlbnYpKSkgKGtvbnQpKSkpKSkpXG5cbigqIHN0ZXAtc2YtcHJvdmlkZSAqKVxuYW5kIHN0ZXBfc2ZfcHJvdmlkZSBhcmdzIGVudiBrb250ID1cbiAgKGxldCBuYW1lID0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKChmaXJzdCAoYXJncykpKSAoZW52KSkpKSBpbiBsZXQgdmFsJyA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgobnRoIChhcmdzKSAoKE51bWJlciAxLjApKSkpIChlbnYpKSkpIGluIGxldCBib2R5ID0gKHByaW1fY2FsbCBcInNsaWNlXCIgW2FyZ3M7IChOdW1iZXIgMi4wKV0pIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChib2R5KSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChOaWwpIChlbnYpIChrb250KSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYm9keSkpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfcHJvdmlkZV9mcmFtZSAobmFtZSkgKHZhbCcpICgocmVzdCAoYm9keSkpKSAoZW52KSkpIChrb250KSkpKSkpXG5cbigqIHN0ZXAtc2YtY29udGV4dCAqKVxuYW5kIHN0ZXBfc2ZfY29udGV4dCBhcmdzIGVudiBrb250ID1cbiAgKGxldCBuYW1lID0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKChmaXJzdCAoYXJncykpKSAoZW52KSkpKSBpbiBsZXQgZGVmYXVsdF92YWwgPSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPj1cIiBbKGxlbiAoYXJncykpOyAoTnVtYmVyIDIuMCldKSkgdGhlbiAodHJhbXBvbGluZSAoKGV2YWxfZXhwciAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSAoZW52KSkpKSBlbHNlIE5pbCkgaW4gbGV0IGZyYW1lID0gKGtvbnRfZmluZF9wcm92aWRlIChrb250KSAobmFtZSkpIGluIChtYWtlX2Nla192YWx1ZSAoKGlmIHN4X3RydXRoeSAoKGlzX25pbCAoZnJhbWUpKSkgdGhlbiBkZWZhdWx0X3ZhbCBlbHNlIChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInZhbHVlXCIpKSkpKSAoZW52KSAoa29udCkpKVxuXG4oKiBzdGVwLXNmLWVtaXQgKilcbmFuZCBzdGVwX3NmX2VtaXQgYXJncyBlbnYga29udCA9XG4gIChsZXQgbmFtZSA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgoZmlyc3QgKGFyZ3MpKSkgKGVudikpKSkgaW4gbGV0IHZhbCcgPSAodHJhbXBvbGluZSAoKGV2YWxfZXhwciAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSAoZW52KSkpKSBpbiBsZXQgZnJhbWUgPSAoa29udF9maW5kX3Njb3BlX2FjYyAoa29udCkgKG5hbWUpKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5IChmcmFtZSkgdGhlbiAoc3hfZGljdF9zZXRfYiBmcmFtZSAoU3RyaW5nIFwiZW1pdHRlZFwiKSAocHJpbV9jYWxsIFwiYXBwZW5kXCIgWyhnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVtaXR0ZWRcIikpKTsgKExpc3QgW3ZhbCddKV0pKSBlbHNlIE5pbCkpIGluIChtYWtlX2Nla192YWx1ZSAoTmlsKSAoZW52KSAoa29udCkpKSlcblxuKCogc3RlcC1zZi1lbWl0dGVkICopXG5hbmQgc3RlcF9zZl9lbWl0dGVkIGFyZ3MgZW52IGtvbnQgPVxuICAobGV0IG5hbWUgPSAodHJhbXBvbGluZSAoKGV2YWxfZXhwciAoKGZpcnN0IChhcmdzKSkpIChlbnYpKSkpIGluIGxldCBmcmFtZSA9IChrb250X2ZpbmRfc2NvcGVfYWNjIChrb250KSAobmFtZSkpIGluIChtYWtlX2Nla192YWx1ZSAoKGlmIHN4X3RydXRoeSAoKGlzX25pbCAoZnJhbWUpKSkgdGhlbiAoTGlzdCBbXSkgZWxzZSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbWl0dGVkXCIpKSkpKSAoZW52KSAoa29udCkpKVxuXG4oKiBzdGVwLXNmLXJlc2V0ICopXG5hbmQgc3RlcF9zZl9yZXNldCBhcmdzIGVudiBrb250ID1cbiAgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKGFyZ3MpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX3Jlc2V0X2ZyYW1lIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtc2Ytc2hpZnQgKilcbmFuZCBzdGVwX3NmX3NoaWZ0IGFyZ3MgZW52IGtvbnQgPVxuICAobGV0IGtfbmFtZSA9IChzeW1ib2xfbmFtZSAoKGZpcnN0IChhcmdzKSkpKSBpbiBsZXQgYm9keSA9IChudGggKGFyZ3MpICgoTnVtYmVyIDEuMCkpKSBpbiBsZXQgY2FwdHVyZWRfcmVzdWx0ID0gKGtvbnRfY2FwdHVyZV90b19yZXNldCAoa29udCkpIGluIGxldCBjYXB0dXJlZCA9IChmaXJzdCAoY2FwdHVyZWRfcmVzdWx0KSkgaW4gbGV0IHJlc3Rfa29udCA9IChudGggKGNhcHR1cmVkX3Jlc3VsdCkgKChOdW1iZXIgMS4wKSkpIGluIChsZXQgayA9IChtYWtlX2Nla19jb250aW51YXRpb24gKGNhcHR1cmVkKSAocmVzdF9rb250KSkgaW4gKGxldCBzaGlmdF9lbnYgPSAoZW52X2V4dGVuZCAoZW52KSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKGVudl9iaW5kIHNoaWZ0X2VudiAoc3hfdG9fc3RyaW5nIGtfbmFtZSkgaykpIGluIChtYWtlX2Nla19zdGF0ZSAoYm9keSkgKHNoaWZ0X2VudikgKHJlc3Rfa29udCkpKSkpKVxuXG4oKiBzdGVwLXNmLWRlcmVmICopXG5hbmQgc3RlcF9zZl9kZXJlZiBhcmdzIGVudiBrb250ID1cbiAgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKGFyZ3MpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX2RlcmVmX2ZyYW1lIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIGNlay1jYWxsICopXG5hbmQgY2VrX2NhbGwgZiBhcmdzID1cbiAgKGxldCBhID0gKGlmIHN4X3RydXRoeSAoKGlzX25pbCAoYXJncykpKSB0aGVuIChMaXN0IFtdKSBlbHNlIGFyZ3MpIGluIChpZiBzeF90cnV0aHkgKChpc19uaWwgKGYpKSkgdGhlbiBOaWwgZWxzZSAoaWYgc3hfdHJ1dGh5ICgobGV0IF9vciA9IChpc19sYW1iZGEgKGYpKSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgKGlzX2NhbGxhYmxlIChmKSkpKSB0aGVuIChjZWtfcnVuICgoY29udGludWVfd2l0aF9jYWxsIChmKSAoYSkgKChtYWtlX2VudiAoKSkpIChhKSAoKExpc3QgW10pKSkpKSBlbHNlIE5pbCkpKVxuXG4oKiByZWFjdGl2ZS1zaGlmdC1kZXJlZiAqKVxuYW5kIHJlYWN0aXZlX3NoaWZ0X2RlcmVmIHNpZycgZW52IGtvbnQgPVxuICAobGV0IHNjYW5fcmVzdWx0ID0gKGtvbnRfY2FwdHVyZV90b19yZWFjdGl2ZV9yZXNldCAoa29udCkpIGluIGxldCBjYXB0dXJlZF9mcmFtZXMgPSAoZmlyc3QgKHNjYW5fcmVzdWx0KSkgaW4gbGV0IHJlc2V0X2ZyYW1lID0gKG50aCAoc2Nhbl9yZXN1bHQpICgoTnVtYmVyIDEuMCkpKSBpbiBsZXQgcmVtYWluaW5nX2tvbnQgPSAobnRoIChzY2FuX3Jlc3VsdCkgKChOdW1iZXIgMi4wKSkpIGluIGxldCB1cGRhdGVfZm4gPSAoZ2V0IChyZXNldF9mcmFtZSkgKChTdHJpbmcgXCJ1cGRhdGUtZm5cIikpKSBpbiAobGV0IHN1Yl9kaXNwb3NlcnMgPSByZWYgKChMaXN0IFtdKSkgaW4gKGxldCBzdWJzY3JpYmVyID0gKE5hdGl2ZUZuIChcIlxcMjA2XFwxODdcIiwgZnVuIF9hcmdzIC0+IChmdW4gKCkgLT4gbGV0IHN1Yl9kaXNwb3NlcnMgPSByZWYgTmlsIGluIChsZXQgKCkgPSBpZ25vcmUgKChMaXN0Lml0ZXIgKGZ1biBkIC0+IGlnbm9yZSAoKGNla19jYWxsIChkKSAoTmlsKSkpKSAoc3hfdG9fbGlzdCAhc3ViX2Rpc3Bvc2Vycyk7IE5pbCkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChzdWJfZGlzcG9zZXJzIDo9IChMaXN0IFtdKTsgTmlsKSkgaW4gKGxldCBuZXdfcmVzZXQgPSAobWFrZV9yZWFjdGl2ZV9yZXNldF9mcmFtZSAoZW52KSAodXBkYXRlX2ZuKSAoKEJvb2wgZmFsc2UpKSkgaW4gbGV0IG5ld19rb250ID0gKHByaW1fY2FsbCBcImNvbmNhdFwiIFtjYXB0dXJlZF9mcmFtZXM7IChMaXN0IFtuZXdfcmVzZXRdKTsgcmVtYWluaW5nX2tvbnRdKSBpbiAod2l0aF9pc2xhbmRfc2NvcGUgKChOYXRpdmVGbiAoXCJcXDIwNlxcMTg3XCIsIGZ1biBfYXJncyAtPiBtYXRjaCBfYXJncyB3aXRoIFtkXSAtPiAoZnVuIGQgLT4gbGV0IHN1Yl9kaXNwb3NlcnMgPSByZWYgTmlsIGluIChzdWJfZGlzcG9zZXJzIDo9IHN4X2FwcGVuZF9iICFzdWJfZGlzcG9zZXJzIGQ7IE5pbCkpIGQgfCBfIC0+IE5pbCkpKSAoKE5hdGl2ZUZuIChcIlxcMjA2XFwxODdcIiwgZnVuIF9hcmdzIC0+IChmdW4gKCkgLT4gKGNla19ydW4gKChtYWtlX2Nla192YWx1ZSAoKHNpZ25hbF92YWx1ZSAoc2lnJykpKSAoZW52KSAobmV3X2tvbnQpKSkpKSAoKSkpKSkpKSkpICgpKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKHNpZ25hbF9hZGRfc3ViX2IgKHNpZycpIChzdWJzY3JpYmVyKSkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChyZWdpc3Rlcl9pbl9zY29wZSAoKE5hdGl2ZUZuIChcIlxcMjA2XFwxODdcIiwgZnVuIF9hcmdzIC0+IChmdW4gKCkgLT4gKGxldCAoKSA9IGlnbm9yZSAoKHNpZ25hbF9yZW1vdmVfc3ViX2IgKHNpZycpIChzdWJzY3JpYmVyKSkpIGluIChMaXN0Lml0ZXIgKGZ1biBkIC0+IGlnbm9yZSAoKGNla19jYWxsIChkKSAoTmlsKSkpKSAoc3hfdG9fbGlzdCAhc3ViX2Rpc3Bvc2Vycyk7IE5pbCkpKSAoKSkpKSkpIGluIChsZXQgaW5pdGlhbF9rb250ID0gKHByaW1fY2FsbCBcImNvbmNhdFwiIFtjYXB0dXJlZF9mcmFtZXM7IChMaXN0IFtyZXNldF9mcmFtZV0pOyByZW1haW5pbmdfa29udF0pIGluIChtYWtlX2Nla192YWx1ZSAoKHNpZ25hbF92YWx1ZSAoc2lnJykpKSAoZW52KSAoaW5pdGlhbF9rb250KSkpKSkpKSlcblxuKCogc3RlcC1ldmFsLWNhbGwgKilcbmFuZCBzdGVwX2V2YWxfY2FsbCBoZWFkIGFyZ3MgZW52IGtvbnQgPVxuICAobGV0IGhuYW1lID0gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKGhlYWQpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pKSB0aGVuIChzeW1ib2xfbmFtZSAoaGVhZCkpIGVsc2UgTmlsKSBpbiAobWFrZV9jZWtfc3RhdGUgKGhlYWQpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9hcmdfZnJhbWUgKE5pbCkgKChMaXN0IFtdKSkgKGFyZ3MpIChlbnYpIChhcmdzKSAoaG5hbWUpKSkgKGtvbnQpKSkpKVxuXG4oKiBoby1mb3JtLW5hbWU/ICopXG5hbmQgaG9fZm9ybV9uYW1lX3AgbmFtZSA9XG4gIChsZXQgX29yID0gKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcIm1hcFwiKV0pIGluIGlmIHN4X3RydXRoeSBfb3IgdGhlbiBfb3IgZWxzZSAobGV0IF9vciA9IChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJtYXAtaW5kZXhlZFwiKV0pIGluIGlmIHN4X3RydXRoeSBfb3IgdGhlbiBfb3IgZWxzZSAobGV0IF9vciA9IChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJmaWx0ZXJcIildKSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgKGxldCBfb3IgPSAocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwicmVkdWNlXCIpXSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChsZXQgX29yID0gKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcInNvbWVcIildKSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgKGxldCBfb3IgPSAocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiZXZlcnk/XCIpXSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJmb3ItZWFjaFwiKV0pKSkpKSkpXG5cbigqIGhvLWZuPyAqKVxuYW5kIGhvX2ZuX3AgdiA9XG4gIChsZXQgX29yID0gKGlzX2NhbGxhYmxlICh2KSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChpc19sYW1iZGEgKHYpKSlcblxuKCogaG8tc3dhcC1hcmdzICopXG5hbmQgaG9fc3dhcF9hcmdzIGhvX3R5cGUgZXZhbGVkID1cbiAgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbaG9fdHlwZTsgKFN0cmluZyBcInJlZHVjZVwiKV0pKSB0aGVuIChsZXQgYSA9IChmaXJzdCAoZXZhbGVkKSkgaW4gbGV0IGIgPSAobnRoIChldmFsZWQpICgoTnVtYmVyIDEuMCkpKSBpbiAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAoQm9vbCAobm90IChzeF90cnV0aHkgKChob19mbl9wIChhKSkpKSkpIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChob19mbl9wIChiKSkpKSB0aGVuIChMaXN0IFtiOyAobnRoIChldmFsZWQpICgoTnVtYmVyIDIuMCkpKTsgYV0pIGVsc2UgZXZhbGVkKSkgZWxzZSAobGV0IGEgPSAoZmlyc3QgKGV2YWxlZCkpIGluIGxldCBiID0gKG50aCAoZXZhbGVkKSAoKE51bWJlciAxLjApKSkgaW4gKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgoaG9fZm5fcCAoYSkpKSkpKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAoaG9fZm5fcCAoYikpKSkgdGhlbiAoTGlzdCBbYjsgYV0pIGVsc2UgZXZhbGVkKSkpXG5cbigqIGhvLXNldHVwLWRpc3BhdGNoICopXG5hbmQgaG9fc2V0dXBfZGlzcGF0Y2ggaG9fdHlwZSBldmFsZWQgZW52IGtvbnQgPVxuICAobGV0IG9yZGVyZWQgPSAoaG9fc3dhcF9hcmdzIChob190eXBlKSAoZXZhbGVkKSkgaW4gKGxldCBmID0gKGZpcnN0IChvcmRlcmVkKSkgaW4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbaG9fdHlwZTsgKFN0cmluZyBcIm1hcFwiKV0pKSB0aGVuIChsZXQgY29sbCA9IChudGggKG9yZGVyZWQpICgoTnVtYmVyIDEuMCkpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAoY29sbCkpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoKExpc3QgW10pKSAoZW52KSAoa29udCkpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFsoZmlyc3QgKGNvbGwpKV0pKSAoZW52KSAoKExpc3QgW10pKSAoKGtvbnRfcHVzaCAoKG1ha2VfbWFwX2ZyYW1lIChmKSAoKHJlc3QgKGNvbGwpKSkgKChMaXN0IFtdKSkgKGVudikpKSAoa29udCkpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2hvX3R5cGU7IChTdHJpbmcgXCJtYXAtaW5kZXhlZFwiKV0pKSB0aGVuIChsZXQgY29sbCA9IChudGggKG9yZGVyZWQpICgoTnVtYmVyIDEuMCkpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAoY29sbCkpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoKExpc3QgW10pKSAoZW52KSAoa29udCkpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFsoTnVtYmVyIDAuMCk7IChmaXJzdCAoY29sbCkpXSkpIChlbnYpICgoTGlzdCBbXSkpICgoa29udF9wdXNoICgobWFrZV9tYXBfaW5kZXhlZF9mcmFtZSAoZikgKChyZXN0IChjb2xsKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtob190eXBlOyAoU3RyaW5nIFwiZmlsdGVyXCIpXSkpIHRoZW4gKGxldCBjb2xsID0gKG50aCAob3JkZXJlZCkgKChOdW1iZXIgMS4wKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChjb2xsKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoTGlzdCBbXSkpIChlbnYpIChrb250KSkgZWxzZSAoY29udGludWVfd2l0aF9jYWxsIChmKSAoKExpc3QgWyhmaXJzdCAoY29sbCkpXSkpIChlbnYpICgoTGlzdCBbXSkpICgoa29udF9wdXNoICgobWFrZV9maWx0ZXJfZnJhbWUgKGYpICgocmVzdCAoY29sbCkpKSAoKExpc3QgW10pKSAoKGZpcnN0IChjb2xsKSkpIChlbnYpKSkgKGtvbnQpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtob190eXBlOyAoU3RyaW5nIFwicmVkdWNlXCIpXSkpIHRoZW4gKGxldCBpbml0ID0gKG50aCAob3JkZXJlZCkgKChOdW1iZXIgMS4wKSkpIGluIGxldCBjb2xsID0gKG50aCAob3JkZXJlZCkgKChOdW1iZXIgMi4wKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChjb2xsKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChpbml0KSAoZW52KSAoa29udCkpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFtpbml0OyAoZmlyc3QgKGNvbGwpKV0pKSAoZW52KSAoKExpc3QgW10pKSAoKGtvbnRfcHVzaCAoKG1ha2VfcmVkdWNlX2ZyYW1lIChmKSAoKHJlc3QgKGNvbGwpKSkgKGVudikpKSAoa29udCkpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2hvX3R5cGU7IChTdHJpbmcgXCJzb21lXCIpXSkpIHRoZW4gKGxldCBjb2xsID0gKG50aCAob3JkZXJlZCkgKChOdW1iZXIgMS4wKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChjb2xsKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoQm9vbCBmYWxzZSkpIChlbnYpIChrb250KSkgZWxzZSAoY29udGludWVfd2l0aF9jYWxsIChmKSAoKExpc3QgWyhmaXJzdCAoY29sbCkpXSkpIChlbnYpICgoTGlzdCBbXSkpICgoa29udF9wdXNoICgobWFrZV9zb21lX2ZyYW1lIChmKSAoKHJlc3QgKGNvbGwpKSkgKGVudikpKSAoa29udCkpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2hvX3R5cGU7IChTdHJpbmcgXCJldmVyeVwiKV0pKSB0aGVuIChsZXQgY29sbCA9IChudGggKG9yZGVyZWQpICgoTnVtYmVyIDEuMCkpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAoY29sbCkpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoKEJvb2wgdHJ1ZSkpIChlbnYpIChrb250KSkgZWxzZSAoY29udGludWVfd2l0aF9jYWxsIChmKSAoKExpc3QgWyhmaXJzdCAoY29sbCkpXSkpIChlbnYpICgoTGlzdCBbXSkpICgoa29udF9wdXNoICgobWFrZV9ldmVyeV9mcmFtZSAoZikgKChyZXN0IChjb2xsKSkpIChlbnYpKSkgKGtvbnQpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtob190eXBlOyAoU3RyaW5nIFwiZm9yLWVhY2hcIildKSkgdGhlbiAobGV0IGNvbGwgPSAobnRoIChvcmRlcmVkKSAoKE51bWJlciAxLjApKSkgaW4gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGNvbGwpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKE5pbCkgKGVudikgKGtvbnQpKSBlbHNlIChjb250aW51ZV93aXRoX2NhbGwgKGYpICgoTGlzdCBbKGZpcnN0IChjb2xsKSldKSkgKGVudikgKChMaXN0IFtdKSkgKChrb250X3B1c2ggKChtYWtlX2Zvcl9lYWNoX2ZyYW1lIChmKSAoKHJlc3QgKGNvbGwpKSkgKGVudikpKSAoa29udCkpKSkpKSBlbHNlIChyYWlzZSAoRXZhbF9lcnJvciAodmFsdWVfdG9fc3RyIChTdHJpbmcgKHN4X3N0ciBbKFN0cmluZyBcIlVua25vd24gSE8gdHlwZTogXCIpOyBob190eXBlXSkpKSkpKSkpKSkpKSkpXG5cbigqIHN0ZXAtaG8tbWFwICopXG5hbmQgc3RlcF9ob19tYXAgYXJncyBlbnYga29udCA9XG4gIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChhcmdzKSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9ob19zZXR1cF9mcmFtZSAoKFN0cmluZyBcIm1hcFwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtaG8tbWFwLWluZGV4ZWQgKilcbmFuZCBzdGVwX2hvX21hcF9pbmRleGVkIGFyZ3MgZW52IGtvbnQgPVxuICAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYXJncykpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfaG9fc2V0dXBfZnJhbWUgKChTdHJpbmcgXCJtYXAtaW5kZXhlZFwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtaG8tZmlsdGVyICopXG5hbmQgc3RlcF9ob19maWx0ZXIgYXJncyBlbnYga29udCA9XG4gIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChhcmdzKSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9ob19zZXR1cF9mcmFtZSAoKFN0cmluZyBcImZpbHRlclwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtaG8tcmVkdWNlICopXG5hbmQgc3RlcF9ob19yZWR1Y2UgYXJncyBlbnYga29udCA9XG4gIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChhcmdzKSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9ob19zZXR1cF9mcmFtZSAoKFN0cmluZyBcInJlZHVjZVwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtaG8tc29tZSAqKVxuYW5kIHN0ZXBfaG9fc29tZSBhcmdzIGVudiBrb250ID1cbiAgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKGFyZ3MpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX2hvX3NldHVwX2ZyYW1lICgoU3RyaW5nIFwic29tZVwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtaG8tZXZlcnkgKilcbmFuZCBzdGVwX2hvX2V2ZXJ5IGFyZ3MgZW52IGtvbnQgPVxuICAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYXJncykpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfaG9fc2V0dXBfZnJhbWUgKChTdHJpbmcgXCJldmVyeVwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtaG8tZm9yLWVhY2ggKilcbmFuZCBzdGVwX2hvX2Zvcl9lYWNoIGFyZ3MgZW52IGtvbnQgPVxuICAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYXJncykpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfaG9fc2V0dXBfZnJhbWUgKChTdHJpbmcgXCJmb3ItZWFjaFwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtY29udGludWUgKilcbmFuZCBzdGVwX2NvbnRpbnVlIHN0YXRlID1cbiAgKGxldCB2YWx1ZSA9IChjZWtfdmFsdWUgKHN0YXRlKSkgaW4gbGV0IGVudiA9IChjZWtfZW52IChzdGF0ZSkpIGluIGxldCBrb250ID0gKGNla19rb250IChzdGF0ZSkpIGluIChpZiBzeF90cnV0aHkgKChrb250X2VtcHR5X3AgKGtvbnQpKSkgdGhlbiBzdGF0ZSBlbHNlIChsZXQgZnJhbWUgPSAoa29udF90b3AgKGtvbnQpKSBpbiBsZXQgcmVzdF9rID0gKGtvbnRfcG9wIChrb250KSkgaW4gbGV0IGZ0ID0gKGZyYW1lX3R5cGUgKGZyYW1lKSkgaW4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJpZlwiKV0pKSB0aGVuIChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IHZhbHVlIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChCb29sIChub3QgKHN4X3RydXRoeSAoKGlzX25pbCAodmFsdWUpKSkpKSkpKSB0aGVuIChtYWtlX2Nla19zdGF0ZSAoKGdldCAoZnJhbWUpICgoU3RyaW5nIFwidGhlblwiKSkpKSAoKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkpIChyZXN0X2spKSBlbHNlIChpZiBzeF90cnV0aHkgKChpc19uaWwgKChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVsc2VcIikpKSkpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoTmlsKSAoZW52KSAocmVzdF9rKSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVsc2VcIikpKSkgKChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpKSAocmVzdF9rKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2Z0OyAoU3RyaW5nIFwid2hlblwiKV0pKSB0aGVuIChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IHZhbHVlIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChCb29sIChub3QgKHN4X3RydXRoeSAoKGlzX25pbCAodmFsdWUpKSkpKSkpKSB0aGVuIChsZXQgYm9keSA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImJvZHlcIikpKSBpbiBsZXQgZmVudiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChib2R5KSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChOaWwpIChmZW52KSAocmVzdF9rKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsobGVuIChib2R5KSk7IChOdW1iZXIgMS4wKV0pKSB0aGVuIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChib2R5KSkpIChmZW52KSAocmVzdF9rKSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYm9keSkpKSAoZmVudikgKChrb250X3B1c2ggKChtYWtlX2JlZ2luX2ZyYW1lICgocmVzdCAoYm9keSkpKSAoZmVudikpKSAocmVzdF9rKSkpKSkpKSBlbHNlIChtYWtlX2Nla192YWx1ZSAoTmlsKSAoZW52KSAocmVzdF9rKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJiZWdpblwiKV0pKSB0aGVuIChsZXQgcmVtYWluaW5nID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmVtYWluaW5nXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyhsZW4gKHJlbWFpbmluZykpOyAoTnVtYmVyIDEuMCldKSkgdGhlbiAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAocmVtYWluaW5nKSkpIChmZW52KSAocmVzdF9rKSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAocmVtYWluaW5nKSkpIChmZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfYmVnaW5fZnJhbWUgKChyZXN0IChyZW1haW5pbmcpKSkgKGZlbnYpKSkgKHJlc3RfaykpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcImxldFwiKV0pKSB0aGVuIChsZXQgbmFtZSA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcIm5hbWVcIikpKSBpbiBsZXQgcmVtYWluaW5nID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmVtYWluaW5nXCIpKSkgaW4gbGV0IGJvZHkgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJib2R5XCIpKSkgaW4gbGV0IGxvY2FsID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKGVudl9iaW5kIGxvY2FsIChzeF90b19zdHJpbmcgbmFtZSkgdmFsdWUpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKHN0ZXBfc2ZfYmVnaW4gKGJvZHkpIChsb2NhbCkgKHJlc3RfaykpIGVsc2UgKGxldCBuZXh0X2JpbmRpbmcgPSAoZmlyc3QgKHJlbWFpbmluZykpIGluIGxldCB2bmFtZSA9IChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICgoZmlyc3QgKG5leHRfYmluZGluZykpKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSkgdGhlbiAoc3ltYm9sX25hbWUgKChmaXJzdCAobmV4dF9iaW5kaW5nKSkpKSBlbHNlIChmaXJzdCAobmV4dF9iaW5kaW5nKSkpIGluIChtYWtlX2Nla19zdGF0ZSAoKG50aCAobmV4dF9iaW5kaW5nKSAoKE51bWJlciAxLjApKSkpIChsb2NhbCkgKChrb250X3B1c2ggKChtYWtlX2xldF9mcmFtZSAodm5hbWUpICgocmVzdCAocmVtYWluaW5nKSkpIChib2R5KSAobG9jYWwpKSkgKHJlc3RfaykpKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJkZWZpbmVcIildKSkgdGhlbiAobGV0IG5hbWUgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJuYW1lXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiBsZXQgaGFzX2VmZmVjdHMgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJoYXMtZWZmZWN0c1wiKSkpIGluIGxldCBlZmZlY3RfbGlzdCA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVmZmVjdC1saXN0XCIpKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKGlzX2xhbWJkYSAodmFsdWUpKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAoaXNfbmlsICgobGFtYmRhX25hbWUgKHZhbHVlKSkpKSkpIHRoZW4gKHNldF9sYW1iZGFfbmFtZSB2YWx1ZSAoc3hfdG9fc3RyaW5nIG5hbWUpKSBlbHNlIE5pbCkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChlbnZfYmluZCBmZW52IChzeF90b19zdHJpbmcgbmFtZSkgdmFsdWUpKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5IChoYXNfZWZmZWN0cykgdGhlbiAobGV0IGVmZmVjdF9uYW1lcyA9IChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChlZmZlY3RfbGlzdCkpOyAoU3RyaW5nIFwibGlzdFwiKV0pKSB0aGVuIChMaXN0IChMaXN0Lm1hcCAoZnVuIGUgLT4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKGUpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pKSB0aGVuIChzeW1ib2xfbmFtZSAoZSkpIGVsc2UgKFN0cmluZyAoc3hfc3RyIFtlXSkpKSkgKHN4X3RvX2xpc3QgZWZmZWN0X2xpc3QpKSkgZWxzZSAoTGlzdCBbKFN0cmluZyAoc3hfc3RyIFtlZmZlY3RfbGlzdF0pKV0pKSBpbiBsZXQgZWZmZWN0X2FubnMgPSAoaWYgc3hfdHJ1dGh5ICgoZW52X2hhcyAoZmVudikgKChTdHJpbmcgXCIqZWZmZWN0LWFubm90YXRpb25zKlwiKSkpKSB0aGVuIChlbnZfZ2V0IChmZW52KSAoKFN0cmluZyBcIiplZmZlY3QtYW5ub3RhdGlvbnMqXCIpKSkgZWxzZSAoRGljdCAoSGFzaHRibC5jcmVhdGUgMCkpKSBpbiAobGV0ICgpID0gaWdub3JlICgoc3hfZGljdF9zZXRfYiBlZmZlY3RfYW5ucyBuYW1lIGVmZmVjdF9uYW1lcykpIGluIChlbnZfYmluZCBmZW52IChzeF90b19zdHJpbmcgKFN0cmluZyBcIiplZmZlY3QtYW5ub3RhdGlvbnMqXCIpKSBlZmZlY3RfYW5ucykpKSBlbHNlIE5pbCkpIGluIChtYWtlX2Nla192YWx1ZSAodmFsdWUpIChmZW52KSAocmVzdF9rKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJzZXRcIildKSkgdGhlbiAobGV0IG5hbWUgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJuYW1lXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAobGV0ICgpID0gaWdub3JlICgoZW52X3NldCBmZW52IChzeF90b19zdHJpbmcgbmFtZSkgdmFsdWUpKSBpbiAobWFrZV9jZWtfdmFsdWUgKHZhbHVlKSAoZW52KSAocmVzdF9rKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2Z0OyAoU3RyaW5nIFwiYW5kXCIpXSkpIHRoZW4gKGlmIHN4X3RydXRoeSAoKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICh2YWx1ZSkpKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGVudikgKHJlc3RfaykpIGVsc2UgKGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGVudikgKHJlc3RfaykpIGVsc2UgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKHJlbWFpbmluZykpKSAoKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkpICgoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsobGVuIChyZW1haW5pbmcpKTsgKE51bWJlciAxLjApXSkpIHRoZW4gcmVzdF9rIGVsc2UgKGtvbnRfcHVzaCAoKG1ha2VfYW5kX2ZyYW1lICgocmVzdCAocmVtYWluaW5nKSkpICgoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSkpKSAocmVzdF9rKSkpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcIm9yXCIpXSkpIHRoZW4gKGlmIHN4X3RydXRoeSAodmFsdWUpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGVudikgKHJlc3RfaykpIGVsc2UgKGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoQm9vbCBmYWxzZSkpIChlbnYpIChyZXN0X2spKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChyZW1haW5pbmcpKSkgKChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpKSAoKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAocmVtYWluaW5nKSk7IChOdW1iZXIgMS4wKV0pKSB0aGVuIHJlc3RfayBlbHNlIChrb250X3B1c2ggKChtYWtlX29yX2ZyYW1lICgocmVzdCAocmVtYWluaW5nKSkpICgoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSkpKSAocmVzdF9rKSkpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcImNvbmRcIildKSkgdGhlbiAobGV0IHJlbWFpbmluZyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlbWFpbmluZ1wiKSkpIGluIGxldCBmZW52ID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gbGV0IHNjaGVtZV9wID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwic2NoZW1lXCIpKSkgaW4gKGlmIHN4X3RydXRoeSAoc2NoZW1lX3ApIHRoZW4gKGlmIHN4X3RydXRoeSAodmFsdWUpIHRoZW4gKG1ha2VfY2VrX3N0YXRlICgobnRoICgoZmlyc3QgKHJlbWFpbmluZykpKSAoKE51bWJlciAxLjApKSkpIChmZW52KSAocmVzdF9rKSkgZWxzZSAobGV0IG5leHRfY2xhdXNlcyA9IChyZXN0IChyZW1haW5pbmcpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAobmV4dF9jbGF1c2VzKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChOaWwpIChmZW52KSAocmVzdF9rKSkgZWxzZSAobGV0IG5leHRfY2xhdXNlID0gKGZpcnN0IChuZXh0X2NsYXVzZXMpKSBpbiBsZXQgbmV4dF90ZXN0ID0gKGZpcnN0IChuZXh0X2NsYXVzZSkpIGluIChpZiBzeF90cnV0aHkgKChpc19lbHNlX2NsYXVzZSAobmV4dF90ZXN0KSkpIHRoZW4gKG1ha2VfY2VrX3N0YXRlICgobnRoIChuZXh0X2NsYXVzZSkgKChOdW1iZXIgMS4wKSkpKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKG1ha2VfY2VrX3N0YXRlIChuZXh0X3Rlc3QpIChmZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfY29uZF9mcmFtZSAobmV4dF9jbGF1c2VzKSAoZmVudikgKChCb29sIHRydWUpKSkpIChyZXN0X2spKSkpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICh2YWx1ZSkgdGhlbiAobWFrZV9jZWtfc3RhdGUgKChudGggKHJlbWFpbmluZykgKChOdW1iZXIgMS4wKSkpKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGxldCBuZXh0ID0gKHByaW1fY2FsbCBcInNsaWNlXCIgW3JlbWFpbmluZzsgKE51bWJlciAyLjApXSkgaW4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIjxcIiBbKGxlbiAobmV4dCkpOyAoTnVtYmVyIDIuMCldKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKE5pbCkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChsZXQgbmV4dF90ZXN0ID0gKGZpcnN0IChuZXh0KSkgaW4gKGlmIHN4X3RydXRoeSAoKGlzX2Vsc2VfY2xhdXNlIChuZXh0X3Rlc3QpKSkgdGhlbiAobWFrZV9jZWtfc3RhdGUgKChudGggKG5leHQpICgoTnVtYmVyIDEuMCkpKSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAobmV4dF90ZXN0KSAoZmVudikgKChrb250X3B1c2ggKChtYWtlX2NvbmRfZnJhbWUgKG5leHQpIChmZW52KSAoKEJvb2wgZmFsc2UpKSkpIChyZXN0X2spKSkpKSkpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2Z0OyAoU3RyaW5nIFwiY2FzZVwiKV0pKSB0aGVuIChsZXQgbWF0Y2hfdmFsID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwibWF0Y2gtdmFsXCIpKSkgaW4gbGV0IHJlbWFpbmluZyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlbWFpbmluZ1wiKSkpIGluIGxldCBmZW52ID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gKGlmIHN4X3RydXRoeSAoKGlzX25pbCAobWF0Y2hfdmFsKSkpIHRoZW4gKHNmX2Nhc2Vfc3RlcF9sb29wICh2YWx1ZSkgKHJlbWFpbmluZykgKGZlbnYpIChyZXN0X2spKSBlbHNlIChzZl9jYXNlX3N0ZXBfbG9vcCAobWF0Y2hfdmFsKSAocmVtYWluaW5nKSAoZmVudikgKHJlc3RfaykpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcInRocmVhZFwiKV0pKSB0aGVuIChsZXQgcmVtYWluaW5nID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmVtYWluaW5nXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChsZXQgZm9ybSA9IChmaXJzdCAocmVtYWluaW5nKSkgaW4gbGV0IHJlc3RfZm9ybXMgPSAocmVzdCAocmVtYWluaW5nKSkgaW4gbGV0IG5ld19rb250ID0gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKChyZXN0IChyZW1haW5pbmcpKSkpKSB0aGVuIHJlc3RfayBlbHNlIChrb250X3B1c2ggKChtYWtlX3RocmVhZF9mcmFtZSAoKHJlc3QgKHJlbWFpbmluZykpKSAoZmVudikpKSAocmVzdF9rKSkpIGluIChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChmb3JtKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgoZW1wdHlfcCAoZm9ybSkpKSkpKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChmb3JtKSkpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChob19mb3JtX25hbWVfcCAoKHN5bWJvbF9uYW1lICgoZmlyc3QgKGZvcm0pKSkpKSkpKSkpIHRoZW4gKG1ha2VfY2VrX3N0YXRlICgoY29ucyAoKGZpcnN0IChmb3JtKSkpICgoY29ucyAoKExpc3QgWyhTeW1ib2wgXCJxdW90ZVwiKTsgdmFsdWVdKSkgKChyZXN0IChmb3JtKSkpKSkpKSAoZmVudikgKG5ld19rb250KSkgZWxzZSAobGV0IHJlc3VsdCcgPSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoZm9ybSkpOyAoU3RyaW5nIFwibGlzdFwiKV0pKSB0aGVuIChsZXQgZiA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgoZmlyc3QgKGZvcm0pKSkgKGZlbnYpKSkpIGluIGxldCByYXJncyA9IChMaXN0IChMaXN0Lm1hcCAoZnVuIGEgLT4gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKGEpIChmZW52KSkpKSkgKHN4X3RvX2xpc3QgKHJlc3QgKGZvcm0pKSkpKSBpbiBsZXQgYWxsX2FyZ3MgPSAoY29ucyAodmFsdWUpIChyYXJncykpIGluIChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChpc19jYWxsYWJsZSAoZikpIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChCb29sIChub3QgKHN4X3RydXRoeSAoKGlzX2xhbWJkYSAoZikpKSkpKSkpIHRoZW4gKHN4X2FwcGx5IGYgYWxsX2FyZ3MpIGVsc2UgKGlmIHN4X3RydXRoeSAoKGlzX2xhbWJkYSAoZikpKSB0aGVuICh0cmFtcG9saW5lICgoY2FsbF9sYW1iZGEgKGYpIChhbGxfYXJncykgKGZlbnYpKSkpIGVsc2UgKHJhaXNlIChFdmFsX2Vycm9yICh2YWx1ZV90b19zdHIgKFN0cmluZyAoc3hfc3RyIFsoU3RyaW5nIFwiLT4gZm9ybSBub3QgY2FsbGFibGU6IFwiKTsgKGluc3BlY3QgKGYpKV0pKSkpKSkpKSBlbHNlIChsZXQgZiA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByIChmb3JtKSAoZmVudikpKSkgaW4gKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKGlzX2NhbGxhYmxlIChmKSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgoaXNfbGFtYmRhIChmKSkpKSkpKSkgdGhlbiAoY2VrX2NhbGwgKGYpIChMaXN0IFt2YWx1ZV0pKSBlbHNlIChpZiBzeF90cnV0aHkgKChpc19sYW1iZGEgKGYpKSkgdGhlbiAodHJhbXBvbGluZSAoKGNhbGxfbGFtYmRhIChmKSAoKExpc3QgW3ZhbHVlXSkpIChmZW52KSkpKSBlbHNlIChyYWlzZSAoRXZhbF9lcnJvciAodmFsdWVfdG9fc3RyIChTdHJpbmcgKHN4X3N0ciBbKFN0cmluZyBcIi0+IGZvcm0gbm90IGNhbGxhYmxlOiBcIik7IChpbnNwZWN0IChmKSldKSkpKSkpKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZXN0X2Zvcm1zKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChyZXN1bHQnKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKG1ha2VfY2VrX3ZhbHVlIChyZXN1bHQnKSAoZmVudikgKChrb250X3B1c2ggKChtYWtlX3RocmVhZF9mcmFtZSAocmVzdF9mb3JtcykgKGZlbnYpKSkgKHJlc3RfaykpKSkpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcImFyZ1wiKV0pKSB0aGVuIChsZXQgZiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImZcIikpKSBpbiBsZXQgZXZhbGVkID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZXZhbGVkXCIpKSkgaW4gbGV0IHJlbWFpbmluZyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlbWFpbmluZ1wiKSkpIGluIGxldCBmZW52ID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gbGV0IHJhd19hcmdzID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmF3LWFyZ3NcIikpKSBpbiBsZXQgaG5hbWUgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJoZWFkLW5hbWVcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoaXNfbmlsIChmKSkpIHRoZW4gKGxldCAoKSA9IGlnbm9yZSAoKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gIV9zdHJpY3RfcmVmIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIGhuYW1lKSkgdGhlbiAoc3RyaWN0X2NoZWNrX2FyZ3MgKGhuYW1lKSAoKExpc3QgW10pKSkgZWxzZSBOaWwpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKGNvbnRpbnVlX3dpdGhfY2FsbCAodmFsdWUpICgoTGlzdCBbXSkpIChmZW52KSAocmF3X2FyZ3MpIChyZXN0X2spKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChyZW1haW5pbmcpKSkgKGZlbnYpICgoa29udF9wdXNoICgobWFrZV9hcmdfZnJhbWUgKHZhbHVlKSAoKExpc3QgW10pKSAoKHJlc3QgKHJlbWFpbmluZykpKSAoZmVudikgKHJhd19hcmdzKSAoaG5hbWUpKSkgKHJlc3RfaykpKSkpKSBlbHNlIChsZXQgbmV3X2V2YWxlZCA9IChwcmltX2NhbGwgXCJhcHBlbmRcIiBbZXZhbGVkOyAoTGlzdCBbdmFsdWVdKV0pIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAhX3N0cmljdF9yZWYgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgaG5hbWUpKSB0aGVuIChzdHJpY3RfY2hlY2tfYXJncyAoaG5hbWUpIChuZXdfZXZhbGVkKSkgZWxzZSBOaWwpKSBpbiAoY29udGludWVfd2l0aF9jYWxsIChmKSAobmV3X2V2YWxlZCkgKGZlbnYpIChyYXdfYXJncykgKHJlc3RfaykpKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChyZW1haW5pbmcpKSkgKGZlbnYpICgoa29udF9wdXNoICgobWFrZV9hcmdfZnJhbWUgKGYpIChuZXdfZXZhbGVkKSAoKHJlc3QgKHJlbWFpbmluZykpKSAoZmVudikgKHJhd19hcmdzKSAoaG5hbWUpKSkgKHJlc3RfaykpKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJkaWN0XCIpXSkpIHRoZW4gKGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiBsZXQgcmVzdWx0cyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlc3VsdHNcIikpKSBpbiBsZXQgZmVudiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpIGluIChsZXQgbGFzdF9yZXN1bHQgPSAobGFzdCAocmVzdWx0cykpIGluIGxldCBjb21wbGV0ZWQgPSAocHJpbV9jYWxsIFwiYXBwZW5kXCIgWyhwcmltX2NhbGwgXCJzbGljZVwiIFtyZXN1bHRzOyAoTnVtYmVyIDAuMCk7IChwcmltX2NhbGwgXCJkZWNcIiBbKGxlbiAocmVzdWx0cykpXSldKTsgKExpc3QgWyhMaXN0IFsoZmlyc3QgKGxhc3RfcmVzdWx0KSk7IHZhbHVlXSldKV0pIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobGV0IGQgPSAoRGljdCAoSGFzaHRibC5jcmVhdGUgMCkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChMaXN0Lml0ZXIgKGZ1biBwYWlyIC0+IGlnbm9yZSAoKHN4X2RpY3Rfc2V0X2IgZCAoZmlyc3QgKHBhaXIpKSAobnRoIChwYWlyKSAoKE51bWJlciAxLjApKSkpKSkgKHN4X3RvX2xpc3QgY29tcGxldGVkKTsgTmlsKSkgaW4gKG1ha2VfY2VrX3ZhbHVlIChkKSAoZmVudikgKHJlc3RfaykpKSkgZWxzZSAobGV0IG5leHRfZW50cnkgPSAoZmlyc3QgKHJlbWFpbmluZykpIGluIChtYWtlX2Nla19zdGF0ZSAoKG50aCAobmV4dF9lbnRyeSkgKChOdW1iZXIgMS4wKSkpKSAoZmVudikgKChrb250X3B1c2ggKChtYWtlX2RpY3RfZnJhbWUgKChyZXN0IChyZW1haW5pbmcpKSkgKChwcmltX2NhbGwgXCJhcHBlbmRcIiBbY29tcGxldGVkOyAoTGlzdCBbKExpc3QgWyhmaXJzdCAobmV4dF9lbnRyeSkpXSldKV0pKSAoZmVudikpKSAocmVzdF9rKSkpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcImhvLXNldHVwXCIpXSkpIHRoZW4gKGxldCBob190eXBlID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiaG8tdHlwZVwiKSkpIGluIGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiBsZXQgZXZhbGVkID0gKHByaW1fY2FsbCBcImFwcGVuZFwiIFsoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJldmFsZWRcIikpKTsgKExpc3QgW3ZhbHVlXSldKSBpbiBsZXQgZmVudiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAoaG9fc2V0dXBfZGlzcGF0Y2ggKGhvX3R5cGUpIChldmFsZWQpIChmZW52KSAocmVzdF9rKSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAocmVtYWluaW5nKSkpIChmZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfaG9fc2V0dXBfZnJhbWUgKGhvX3R5cGUpICgocmVzdCAocmVtYWluaW5nKSkpIChldmFsZWQpIChmZW52KSkpIChyZXN0X2spKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcInJlc2V0XCIpXSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGVudikgKHJlc3RfaykpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJkZXJlZlwiKV0pKSB0aGVuIChsZXQgdmFsJyA9IHZhbHVlIGluIGxldCBmZW52ID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gKGlmIHN4X3RydXRoeSAoKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgoaXNfc2lnbmFsICh2YWwnKSkpKSkpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAodmFsJykgKGZlbnYpIChyZXN0X2spKSBlbHNlIChpZiBzeF90cnV0aHkgKChoYXNfcmVhY3RpdmVfcmVzZXRfZnJhbWVfcCAocmVzdF9rKSkpIHRoZW4gKHJlYWN0aXZlX3NoaWZ0X2RlcmVmICh2YWwnKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGxldCAoKSA9IGlnbm9yZSAoKGxldCBjdHggPSAoc3hfY29udGV4dCAoKFN0cmluZyBcInN4LXJlYWN0aXZlXCIpKSAoTmlsKSkgaW4gKGlmIHN4X3RydXRoeSAoY3R4KSB0aGVuIChsZXQgZGVwX2xpc3QgPSByZWYgKChnZXQgKGN0eCkgKChTdHJpbmcgXCJkZXBzXCIpKSkpIGluIGxldCBub3RpZnlfZm4gPSAoZ2V0IChjdHgpICgoU3RyaW5nIFwibm90aWZ5XCIpKSkgaW4gKGlmIHN4X3RydXRoeSAoKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiY29udGFpbnM/XCIgWyFkZXBfbGlzdDsgdmFsJ10pKSkpKSkgdGhlbiAobGV0ICgpID0gaWdub3JlICgoZGVwX2xpc3QgOj0gc3hfYXBwZW5kX2IgIWRlcF9saXN0IHZhbCc7IE5pbCkpIGluIChzaWduYWxfYWRkX3N1Yl9iICh2YWwnKSAobm90aWZ5X2ZuKSkpIGVsc2UgTmlsKSkgZWxzZSBOaWwpKSkgaW4gKG1ha2VfY2VrX3ZhbHVlICgoc2lnbmFsX3ZhbHVlICh2YWwnKSkpIChmZW52KSAocmVzdF9rKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJyZWFjdGl2ZS1yZXNldFwiKV0pKSB0aGVuIChsZXQgdXBkYXRlX2ZuID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwidXBkYXRlLWZuXCIpKSkgaW4gbGV0IGZpcnN0X3AgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJmaXJzdC1yZW5kZXJcIikpKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSB1cGRhdGVfZm4gaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKEJvb2wgKG5vdCAoc3hfdHJ1dGh5IChmaXJzdF9wKSkpKSkpIHRoZW4gKGNla19jYWxsICh1cGRhdGVfZm4pICgoTGlzdCBbdmFsdWVdKSkpIGVsc2UgTmlsKSkgaW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGVudikgKHJlc3RfaykpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcInNjb3BlXCIpXSkpIHRoZW4gKGxldCBuYW1lID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwibmFtZVwiKSkpIGluIGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiBsZXQgZmVudiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobGV0ICgpID0gaWdub3JlICgoc2NvcGVfcG9wIChuYW1lKSkpIGluIChtYWtlX2Nla192YWx1ZSAodmFsdWUpIChmZW52KSAocmVzdF9rKSkpIGVsc2UgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKHJlbWFpbmluZykpKSAoZmVudikgKChrb250X3B1c2ggKChtYWtlX3Njb3BlX2ZyYW1lIChuYW1lKSAoKHJlc3QgKHJlbWFpbmluZykpKSAoZmVudikpKSAocmVzdF9rKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJwcm92aWRlXCIpXSkpIHRoZW4gKGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiBsZXQgZmVudiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKHZhbHVlKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKHJlbWFpbmluZykpKSAoZmVudikgKChrb250X3B1c2ggKChtYWtlX3Byb3ZpZGVfZnJhbWUgKChnZXQgKGZyYW1lKSAoKFN0cmluZyBcIm5hbWVcIikpKSkgKChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInZhbHVlXCIpKSkpICgocmVzdCAocmVtYWluaW5nKSkpIChmZW52KSkpIChyZXN0X2spKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcInNjb3BlLWFjY1wiKV0pKSB0aGVuIChsZXQgcmVtYWluaW5nID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmVtYWluaW5nXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChyZW1haW5pbmcpKSkgKGZlbnYpICgoa29udF9wdXNoICgobGV0IG5ld19mcmFtZSA9IChtYWtlX3Njb3BlX2FjY19mcmFtZSAoKGdldCAoZnJhbWUpICgoU3RyaW5nIFwibmFtZVwiKSkpKSAoKGdldCAoZnJhbWUpICgoU3RyaW5nIFwidmFsdWVcIikpKSkgKChyZXN0IChyZW1haW5pbmcpKSkgKGZlbnYpKSBpbiAobGV0ICgpID0gaWdub3JlICgoc3hfZGljdF9zZXRfYiBuZXdfZnJhbWUgKFN0cmluZyBcImVtaXR0ZWRcIikgKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW1pdHRlZFwiKSkpKSkgaW4gbmV3X2ZyYW1lKSkpIChyZXN0X2spKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcIm1hcFwiKV0pKSB0aGVuIChsZXQgZiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImZcIikpKSBpbiBsZXQgcmVtYWluaW5nID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmVtYWluaW5nXCIpKSkgaW4gbGV0IHJlc3VsdHMgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZXN1bHRzXCIpKSkgaW4gbGV0IGluZGV4ZWQgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJpbmRleGVkXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAobGV0IG5ld19yZXN1bHRzID0gKHByaW1fY2FsbCBcImFwcGVuZFwiIFtyZXN1bHRzOyAoTGlzdCBbdmFsdWVdKV0pIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKG5ld19yZXN1bHRzKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGxldCBjYWxsX2FyZ3MgPSAoaWYgc3hfdHJ1dGh5IChpbmRleGVkKSB0aGVuIChMaXN0IFsobGVuIChuZXdfcmVzdWx0cykpOyAoZmlyc3QgKHJlbWFpbmluZykpXSkgZWxzZSAoTGlzdCBbKGZpcnN0IChyZW1haW5pbmcpKV0pKSBpbiBsZXQgbmV4dF9mcmFtZSA9IChpZiBzeF90cnV0aHkgKGluZGV4ZWQpIHRoZW4gKG1ha2VfbWFwX2luZGV4ZWRfZnJhbWUgKGYpICgocmVzdCAocmVtYWluaW5nKSkpIChuZXdfcmVzdWx0cykgKGZlbnYpKSBlbHNlIChtYWtlX21hcF9mcmFtZSAoZikgKChyZXN0IChyZW1haW5pbmcpKSkgKG5ld19yZXN1bHRzKSAoZmVudikpKSBpbiAoY29udGludWVfd2l0aF9jYWxsIChmKSAoY2FsbF9hcmdzKSAoZmVudikgKChMaXN0IFtdKSkgKChrb250X3B1c2ggKG5leHRfZnJhbWUpIChyZXN0X2spKSkpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2Z0OyAoU3RyaW5nIFwiZmlsdGVyXCIpXSkpIHRoZW4gKGxldCBmID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZlwiKSkpIGluIGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiBsZXQgcmVzdWx0cyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlc3VsdHNcIikpKSBpbiBsZXQgY3VycmVudF9pdGVtID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiY3VycmVudC1pdGVtXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAobGV0IG5ld19yZXN1bHRzID0gKGlmIHN4X3RydXRoeSAodmFsdWUpIHRoZW4gKHByaW1fY2FsbCBcImFwcGVuZFwiIFtyZXN1bHRzOyAoTGlzdCBbY3VycmVudF9pdGVtXSldKSBlbHNlIHJlc3VsdHMpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKG5ld19yZXN1bHRzKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFsoZmlyc3QgKHJlbWFpbmluZykpXSkpIChmZW52KSAoKExpc3QgW10pKSAoKGtvbnRfcHVzaCAoKG1ha2VfZmlsdGVyX2ZyYW1lIChmKSAoKHJlc3QgKHJlbWFpbmluZykpKSAobmV3X3Jlc3VsdHMpICgoZmlyc3QgKHJlbWFpbmluZykpKSAoZmVudikpKSAocmVzdF9rKSkpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2Z0OyAoU3RyaW5nIFwicmVkdWNlXCIpXSkpIHRoZW4gKGxldCBmID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZlwiKSkpIGluIGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiBsZXQgZmVudiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKHZhbHVlKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFt2YWx1ZTsgKGZpcnN0IChyZW1haW5pbmcpKV0pKSAoZmVudikgKChMaXN0IFtdKSkgKChrb250X3B1c2ggKChtYWtlX3JlZHVjZV9mcmFtZSAoZikgKChyZXN0IChyZW1haW5pbmcpKSkgKGZlbnYpKSkgKHJlc3RfaykpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2Z0OyAoU3RyaW5nIFwiZm9yLWVhY2hcIildKSkgdGhlbiAobGV0IGYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJmXCIpKSkgaW4gbGV0IHJlbWFpbmluZyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlbWFpbmluZ1wiKSkpIGluIGxldCBmZW52ID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKHJlbWFpbmluZykpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoTmlsKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFsoZmlyc3QgKHJlbWFpbmluZykpXSkpIChmZW52KSAoKExpc3QgW10pKSAoKGtvbnRfcHVzaCAoKG1ha2VfZm9yX2VhY2hfZnJhbWUgKGYpICgocmVzdCAocmVtYWluaW5nKSkpIChmZW52KSkpIChyZXN0X2spKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcInNvbWVcIildKSkgdGhlbiAobGV0IGYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJmXCIpKSkgaW4gbGV0IHJlbWFpbmluZyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlbWFpbmluZ1wiKSkpIGluIGxldCBmZW52ID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gKGlmIHN4X3RydXRoeSAodmFsdWUpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChCb29sIGZhbHNlKSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChjb250aW51ZV93aXRoX2NhbGwgKGYpICgoTGlzdCBbKGZpcnN0IChyZW1haW5pbmcpKV0pKSAoZmVudikgKChMaXN0IFtdKSkgKChrb250X3B1c2ggKChtYWtlX3NvbWVfZnJhbWUgKGYpICgocmVzdCAocmVtYWluaW5nKSkpIChmZW52KSkpIChyZXN0X2spKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJldmVyeVwiKV0pKSB0aGVuIChsZXQgZiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImZcIikpKSBpbiBsZXQgcmVtYWluaW5nID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmVtYWluaW5nXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoQm9vbCAobm90IChzeF90cnV0aHkgKHZhbHVlKSkpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChCb29sIGZhbHNlKSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChCb29sIHRydWUpKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFsoZmlyc3QgKHJlbWFpbmluZykpXSkpIChmZW52KSAoKExpc3QgW10pKSAoKGtvbnRfcHVzaCAoKG1ha2VfZXZlcnlfZnJhbWUgKGYpICgocmVzdCAocmVtYWluaW5nKSkpIChmZW52KSkpIChyZXN0X2spKSkpKSkpIGVsc2UgKHJhaXNlIChFdmFsX2Vycm9yICh2YWx1ZV90b19zdHIgKFN0cmluZyAoc3hfc3RyIFsoU3RyaW5nIFwiVW5rbm93biBmcmFtZSB0eXBlOiBcIik7IGZ0XSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSlcblxuKCogY29udGludWUtd2l0aC1jYWxsICopXG5hbmQgY29udGludWVfd2l0aF9jYWxsIGYgYXJncyBlbnYgcmF3X2FyZ3Mga29udCA9XG4gIChpZiBzeF90cnV0aHkgKChjb250aW51YXRpb25fcCAoZikpKSB0aGVuIChsZXQgYXJnID0gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGFyZ3MpKSkgdGhlbiBOaWwgZWxzZSAoZmlyc3QgKGFyZ3MpKSkgaW4gbGV0IGNvbnRfZGF0YSA9IChjb250aW51YXRpb25fZGF0YSAoZikpIGluIChsZXQgY2FwdHVyZWQgPSAoZ2V0IChjb250X2RhdGEpICgoU3RyaW5nIFwiY2FwdHVyZWRcIikpKSBpbiAobGV0IHJlc3VsdCcgPSAoY2VrX3J1biAoKG1ha2VfY2VrX3ZhbHVlIChhcmcpIChlbnYpIChjYXB0dXJlZCkpKSkgaW4gKG1ha2VfY2VrX3ZhbHVlIChyZXN1bHQnKSAoZW52KSAoa29udCkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKGlzX2NhbGxhYmxlIChmKSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgoaXNfbGFtYmRhIChmKSkpKSkpIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChsZXQgX2FuZCA9IChCb29sIChub3QgKHN4X3RydXRoeSAoKGlzX2NvbXBvbmVudCAoZikpKSkpKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAoQm9vbCAobm90IChzeF90cnV0aHkgKChpc19pc2xhbmQgKGYpKSkpKSkpKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoc3hfYXBwbHkgZiBhcmdzKSkgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChpc19sYW1iZGEgKGYpKSkgdGhlbiAobGV0IGxvY2FsID0gKGVudl9tZXJnZSAoKGxhbWJkYV9jbG9zdXJlIChmKSkpIChlbnYpKSBpbiBsZXQgKCkgPSBiaW5kX2xhbWJkYV9wYXJhbXMgZiBhcmdzIGxvY2FsIGluIChtYXRjaCAhaml0X2NhbGxfaG9vaywgZiB3aXRoIHwgU29tZSBob29rLCBMYW1iZGEgbCB3aGVuIGwubF9uYW1lIDw+IE5vbmUgLT4gbGV0IGFyZ3NfbGlzdCA9IG1hdGNoIGFyZ3Mgd2l0aCBMaXN0IGEgfCBMaXN0UmVmIHsgY29udGVudHMgPSBhIH0gLT4gYSB8IF8gLT4gW10gaW4gKG1hdGNoIGhvb2sgZiBhcmdzX2xpc3Qgd2l0aCBTb21lIHJlc3VsdCAtPiBtYWtlX2Nla192YWx1ZSByZXN1bHQgbG9jYWwga29udCB8IE5vbmUgLT4gbWFrZV9jZWtfc3RhdGUgKGxhbWJkYV9ib2R5IGYpIGxvY2FsIGtvbnQpIHwgXyAtPiBtYWtlX2Nla19zdGF0ZSAoKGxhbWJkYV9ib2R5IChmKSkpIChsb2NhbCkgKGtvbnQpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgobGV0IF9vciA9IChpc19jb21wb25lbnQgKGYpKSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgKGlzX2lzbGFuZCAoZikpKSkgdGhlbiAobGV0IHBhcnNlZCA9IChwYXJzZV9rZXl3b3JkX2FyZ3MgKHJhd19hcmdzKSAoZW52KSkgaW4gbGV0IGt3YXJncyA9IChmaXJzdCAocGFyc2VkKSkgaW4gbGV0IGNoaWxkcmVuID0gKG50aCAocGFyc2VkKSAoKE51bWJlciAxLjApKSkgaW4gbGV0IGxvY2FsID0gKGVudl9tZXJnZSAoKGNvbXBvbmVudF9jbG9zdXJlIChmKSkpIChlbnYpKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gcCAtPiBpZ25vcmUgKChlbnZfYmluZCBsb2NhbCAoc3hfdG9fc3RyaW5nIHApIChsZXQgX29yID0gKGRpY3RfZ2V0IChrd2FyZ3MpIChwKSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIE5pbCkpKSkgKHN4X3RvX2xpc3QgKGNvbXBvbmVudF9wYXJhbXMgKGYpKSk7IE5pbCkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChpZiBzeF90cnV0aHkgKChjb21wb25lbnRfaGFzX2NoaWxkcmVuIChmKSkpIHRoZW4gKGVudl9iaW5kIGxvY2FsIChzeF90b19zdHJpbmcgKFN0cmluZyBcImNoaWxkcmVuXCIpKSBjaGlsZHJlbikgZWxzZSBOaWwpKSBpbiAobWFrZV9jZWtfc3RhdGUgKChjb21wb25lbnRfYm9keSAoZikpKSAobG9jYWwpIChrb250KSkpKSkgZWxzZSAocmFpc2UgKEV2YWxfZXJyb3IgKHZhbHVlX3RvX3N0ciAoU3RyaW5nIChzeF9zdHIgWyhTdHJpbmcgXCJOb3QgY2FsbGFibGU6IFwiKTsgKGluc3BlY3QgKGYpKV0pKSkpKSkpKSlcblxuKCogc2YtY2FzZS1zdGVwLWxvb3AgKilcbmFuZCBzZl9jYXNlX3N0ZXBfbG9vcCBtYXRjaF92YWwgY2xhdXNlcyBlbnYga29udCA9XG4gIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI8XCIgWyhsZW4gKGNsYXVzZXMpKTsgKE51bWJlciAyLjApXSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChOaWwpIChlbnYpIChrb250KSkgZWxzZSAobGV0IHRlc3QgPSAoZmlyc3QgKGNsYXVzZXMpKSBpbiBsZXQgYm9keSA9IChudGggKGNsYXVzZXMpICgoTnVtYmVyIDEuMCkpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoaXNfZWxzZV9jbGF1c2UgKHRlc3QpKSkgdGhlbiAobWFrZV9jZWtfc3RhdGUgKGJvZHkpIChlbnYpIChrb250KSkgZWxzZSAobGV0IHRlc3RfdmFsID0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKHRlc3QpIChlbnYpKSkpIGluIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW21hdGNoX3ZhbDsgdGVzdF92YWxdKSkgdGhlbiAobWFrZV9jZWtfc3RhdGUgKGJvZHkpIChlbnYpIChrb250KSkgZWxzZSAoc2ZfY2FzZV9zdGVwX2xvb3AgKG1hdGNoX3ZhbCkgKChwcmltX2NhbGwgXCJzbGljZVwiIFtjbGF1c2VzOyAoTnVtYmVyIDIuMCldKSkgKGVudikgKGtvbnQpKSkpKSkpXG5cbigqIGV2YWwtZXhwci1jZWsgKilcbmFuZCBldmFsX2V4cHJfY2VrIGV4cHIgZW52ID1cbiAgKGNla19ydW4gKChtYWtlX2Nla19zdGF0ZSAoZXhwcikgKGVudikgKChMaXN0IFtdKSkpKSlcblxuKCogdHJhbXBvbGluZS1jZWsgKilcbmFuZCB0cmFtcG9saW5lX2NlayB2YWwnID1cbiAgKGlmIHN4X3RydXRoeSAoKGlzX3RodW5rICh2YWwnKSkpIHRoZW4gKGV2YWxfZXhwcl9jZWsgKCh0aHVua19leHByICh2YWwnKSkpICgodGh1bmtfZW52ICh2YWwnKSkpKSBlbHNlIHZhbCcpXG5cbigqIGV2YWwtZXhwciAqKVxuYW5kIGV2YWxfZXhwciBleHByIGVudiA9XG4gIChjZWtfcnVuICgobWFrZV9jZWtfc3RhdGUgKGV4cHIpIChlbnYpICgoTGlzdCBbXSkpKSkpXG5cblxuKCogV2lyZSB1cCB0cmFtcG9saW5lIHRvIHJlc29sdmUgdGh1bmtzIHZpYSB0aGUgQ0VLIG1hY2hpbmUgKilcbmxldCAoKSA9IHRyYW1wb2xpbmVfZm4gOj0gKGZ1biB2IC0+XG4gIG1hdGNoIHYgd2l0aFxuICB8IFRodW5rIChleHByLCBlbnYpIC0+IGV2YWxfZXhwciBleHByIChFbnYgZW52KVxuICB8IF8gLT4gdilcblxuKCogV2lyZSB1cCB0aGUgcHJpbWl0aXZlcyB0cmFtcG9saW5lIHNvIGNhbGxfYW55IGluIEhPIGZvcm1zIHJlc29sdmVzIFRodW5rcyAqKVxubGV0ICgpID0gU3hfcHJpbWl0aXZlcy5fc3hfdHJhbXBvbGluZV9mbiA6PSAhdHJhbXBvbGluZV9mblxuXG4oKiBXaXJlIHVwIGFzX251bWJlciB0cmFtcG9saW5lIHNvIGFyaXRobWV0aWMgb24gbGVha2VkIHRodW5rcyBhdXRvLXJlc29sdmVzICopXG5sZXQgKCkgPSBTeF9wcmltaXRpdmVzLnRyYW1wb2xpbmVfaG9vayA6PSAhdHJhbXBvbGluZV9mblxuXG4oKiBPdmVycmlkZSByZWN1cnNpdmUgY2VrX3J1biB3aXRoIGl0ZXJhdGl2ZSBsb29wICopXG5sZXQgY2VrX3J1bl9pdGVyYXRpdmUgc3RhdGUgPVxuICBsZXQgcyA9IHJlZiBzdGF0ZSBpblxuICB3aGlsZSBub3QgKG1hdGNoIGNla190ZXJtaW5hbF9wICFzIHdpdGggQm9vbCB0cnVlIC0+IHRydWUgfCBfIC0+IGZhbHNlKSBkb1xuICAgIHMgOj0gY2VrX3N0ZXAgIXNcbiAgZG9uZTtcbiAgY2VrX3ZhbHVlICFzXG5cblxuXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfZXF1YWwiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiZ2xvYmFsX2RhdGEiLCJTeF9ydW50aW1lIiwiU3hfdHlwZXMiLCJTdGRsaWJfTGlzdCIsIlN0ZGxpYl9IYXNodGJsIiwiU3hfcHJpbWl0aXZlcyIsInRyYW1wb2xpbmVfZm4iLCJ2IiwidHJhbXBvbGluZSIsInN0cmljdF9yZWYiLCJzdHJpY3QiLCJwcmltX3BhcmFtX3R5cGVzX3JlZiIsInByaW1fcGFyYW1fdHlwZXMiLCJjc3RfZXZhbCIsIm1ha2VfY2VrX3N0YXRlIiwiY29udHJvbCIsImVudiIsImtvbnQiLCJjc3RfY29udGludWUiLCJtYWtlX2Nla192YWx1ZSIsInZhbHVlIiwiY3N0IiwiY3N0X2tvbnQiLCJjc3RfcGhhc2UiLCJjZWtfdGVybWluYWxfcCIsInN0YXRlIiwiYW5kIiwiY2VrX2NvbnRyb2wiLCJzIiwiY3N0X2VudiIsImNla19lbnYiLCJjZWtfa29udCIsImNla19waGFzZSIsImNzdF92YWx1ZSIsImNla192YWx1ZSIsImNzdF9pZiIsIm1ha2VfaWZfZnJhbWUiLCJ0aGVuX2V4cHIiLCJlbHNlX2V4cHIiLCJjc3Rfd2hlbiIsIm1ha2Vfd2hlbl9mcmFtZSIsImJvZHlfZXhwcnMiLCJjc3RfYmVnaW4iLCJtYWtlX2JlZ2luX2ZyYW1lIiwicmVtYWluaW5nIiwiY3N0X2xldCIsIm1ha2VfbGV0X2ZyYW1lIiwibmFtZSIsImJvZHkiLCJsb2NhbCIsImNzdF9kZWZpbmUiLCJtYWtlX2RlZmluZV9mcmFtZSIsImhhc19lZmZlY3RzIiwiZWZmZWN0X2xpc3QiLCJjc3Rfc2V0IiwibWFrZV9zZXRfZnJhbWUiLCJjc3RfYXJnIiwibWFrZV9hcmdfZnJhbWUiLCJldmFsZWQiLCJyYXdfYXJncyIsImhlYWRfbmFtZSIsIm1ha2VfY2FsbF9mcmFtZSIsImFyZ3MiLCJjc3RfY29uZCIsIm1ha2VfY29uZF9mcmFtZSIsInNjaGVtZV9wIiwiY3N0X2Nhc2UiLCJtYWtlX2Nhc2VfZnJhbWUiLCJtYXRjaF92YWwiLCJjc3RfdGhyZWFkIiwibWFrZV90aHJlYWRfZnJhbWUiLCJjc3RfbWFwIiwibWFrZV9tYXBfZnJhbWUiLCJyZXN1bHRzIiwibWFrZV9tYXBfaW5kZXhlZF9mcmFtZSIsImNzdF9maWx0ZXIiLCJtYWtlX2ZpbHRlcl9mcmFtZSIsImN1cnJlbnRfaXRlbSIsImNzdF9yZWR1Y2UiLCJtYWtlX3JlZHVjZV9mcmFtZSIsImNzdF9mb3JfZWFjaCIsIm1ha2VfZm9yX2VhY2hfZnJhbWUiLCJjc3Rfc29tZSIsIm1ha2Vfc29tZV9mcmFtZSIsImNzdF9ldmVyeSIsIm1ha2VfZXZlcnlfZnJhbWUiLCJjc3Rfc2NvcGUiLCJtYWtlX3Njb3BlX2ZyYW1lIiwiY3N0X3Byb3ZpZGUiLCJtYWtlX3Byb3ZpZGVfZnJhbWUiLCJjc3Rfc2NvcGVfYWNjIiwibWFrZV9zY29wZV9hY2NfZnJhbWUiLCJjc3RfcmVzZXQiLCJtYWtlX3Jlc2V0X2ZyYW1lIiwiY3N0X2RpY3QiLCJtYWtlX2RpY3RfZnJhbWUiLCJjc3RfYW5kIiwibWFrZV9hbmRfZnJhbWUiLCJjc3Rfb3IiLCJtYWtlX29yX2ZyYW1lIiwiY3N0X2R5bmFtaWNfd2luZCIsIm1ha2VfZHluYW1pY193aW5kX2ZyYW1lIiwicGhhc2UiLCJib2R5X3RodW5rIiwiYWZ0ZXJfdGh1bmsiLCJjc3RfcmVhY3RpdmVfcmVzZXQiLCJtYWtlX3JlYWN0aXZlX3Jlc2V0X2ZyYW1lIiwidXBkYXRlX2ZuIiwiZmlyc3RfcmVuZGVyX3AiLCJjc3RfZGVyZWYiLCJtYWtlX2RlcmVmX2ZyYW1lIiwiY3N0X2hvX3NldHVwIiwibWFrZV9ob19zZXR1cF9mcmFtZSIsImhvX3R5cGUiLCJyZW1haW5pbmdfYXJncyIsImV2YWxlZF9hcmdzIiwiZnJhbWVfdHlwZSIsImtvbnRfcHVzaCIsImZyYW1lIiwia29udF90b3AiLCJrb250X3BvcCIsImtvbnRfZW1wdHlfcCIsImNzdF9hcHBlbmQiLCJjYXB0dXJlZCIsImtvbnRfY2FwdHVyZV90b19yZXNldCIsImsiLCJvciIsImNzdF9uYW1lIiwia29udF9maW5kX3Byb3ZpZGUiLCJrb250X2ZpbmRfc2NvcGVfYWNjIiwiaGFzX3JlYWN0aXZlX3Jlc2V0X2ZyYW1lX3AiLCJrb250X2NhcHR1cmVfdG9fcmVhY3RpdmVfcmVzZXQiLCJjdXN0b21fc3BlY2lhbF9mb3JtcyIsInJlZ2lzdGVyX3NwZWNpYWxfZm9ybSIsImhhbmRsZXIiLCJzZXRfc3RyaWN0X2IiLCJ2YWwiLCJzZXRfcHJpbV9wYXJhbV90eXBlc19iIiwidHlwZXMiLCJjc3RfYm9vbGVhbiIsImNzdF9rZXl3b3JkIiwiY3N0X2xhbWJkYSIsImNzdF9saXN0IiwiY3N0X25pbCIsImNzdF9udW1iZXIiLCJjc3Rfc2xpY2UiLCJjc3Rfc3RyaW5nIiwiY3N0X3N5bWJvbCIsInZhbHVlX21hdGNoZXNfdHlwZV9wIiwiZXhwZWN0ZWRfdHlwZSIsImNzdF9leHBlY3RlZCIsImNzdF9nb3QiLCJjc3RfVHlwZV9lcnJvciIsInN0cmljdF9jaGVja19hcmdzIiwic3BlYyIsInBvc2l0aW9uYWwiLCJyZXN0X3R5cGUiLCJpIiwicCIsInBhaXIiLCJpZHgiLCJwYXJhbSIsInBfbmFtZSIsInBfdHlwZSIsImNzdF9yZXN0IiwiY3N0X3ppcCIsImJpbmRfbGFtYmRhX3BhcmFtcyIsInBhcmFtcyIsInBhcmFtX2xpc3QiLCJhcmdzX2xpc3QiLCJyZXN0X2lkeCIsInJlcXVpcmVkIiwibWF0Y2giLCJyZXN0X25hbWUiLCJyZXN0X3ZhbHMiLCJjYWxsX2xhbWJkYSIsImNhbGxlcl9lbnYiLCJjc3RfY2hpbGRyZW4iLCJjYWxsX2NvbXBvbmVudCIsImNvbXAiLCJwYXJzZWQiLCJrd2FyZ3MiLCJjaGlsZHJlbiIsImNzdF9hc3NvYyIsImNzdF9pIiwiY3N0X2luYyIsImNzdF9za2lwIiwicGFyc2Vfa2V5d29yZF9hcmdzIiwiZCIsImFyZyIsInNraXAiLCJjb25kX3NjaGVtZV9wIiwiY2xhdXNlcyIsImMiLCJjc3RfZWxzZSIsImlzX2Vsc2VfY2xhdXNlIiwidGVzdCIsImNzdF9yYW5nZSIsInNmX25hbWVkX2xldCIsImxvb3BfbmFtZSIsImJpbmRpbmdzIiwiaW5pdHMiLCJiaW5kaW5nIiwiYWNjIiwicGFpcl9pZHgiLCJsb29wX2JvZHkiLCJsb29wX2ZuIiwiaW5pdF92YWxzIiwiZSIsImNzdF9hcyIsInNmX2xhbWJkYSIsInBhcmFtc19leHByIiwicGFyYW1fbmFtZXMiLCJjc3RfZWZmZWN0X2Fubm90YXRpb25zIiwiY3N0X2VmZmVjdHMiLCJjc3Rfa2V5cyIsInNmX2RlZmNvbXAiLCJuYW1lX3N5bSIsInBhcmFtc19yYXciLCJjb21wX25hbWUiLCJoYXNfY2hpbGRyZW4iLCJwYXJhbV90eXBlcyIsImFmZmluaXR5IiwiZWZmZWN0cyIsImVmZmVjdF9hbm5zIiwiZGVmY29tcF9rd2FyZyIsImtleSIsImRlZmF1bHQkIiwiZW5kIiwicmVzdWx0IiwicGFyc2VfY29tcF9wYXJhbXMiLCJpbl9rZXkiLCJwdHlwZSIsInR5cGVfdmFsIiwic2ZfZGVmaXNsYW5kIiwiaXNsYW5kIiwic2ZfZGVmbWFjcm8iLCJyZXN0X3BhcmFtIiwibWFjIiwiY3N0X2luX3Jlc3QiLCJwYXJzZV9tYWNyb19wYXJhbXMiLCJjc3RfY29uY2F0IiwicXFfZXhwYW5kIiwidGVtcGxhdGUiLCJoZWFkIiwiaXRlbSIsInNwbGljZWQiLCJjc3RfZGVjIiwic2ZfbGV0cmVjIiwibmFtZXMiLCJ2YWxfZXhwcnMiLCJ2bmFtZSIsInZhbF9leHByIiwidmFsdWVzIiwibiIsInN0ZXBfc2ZfbGV0cmVjIiwidGhrIiwic2ZfZHluYW1pY193aW5kIiwiYmVmb3JlIiwiYWZ0ZXIiLCJzZl9zY29wZSIsInJlc3QiLCJzZl9wcm92aWRlIiwiZXhwYW5kX21hY3JvIiwiY2VrX3J1biIsImNla19zdGVwIiwic3RlcF9ldmFsIiwiZXhwciIsImtzIiwiZmlyc3Rfa2V5IiwicmVtYWluaW5nX2VudHJpZXMiLCJjc3RfZW1pdHRlZCIsImNzdF9tYXBfaW5kZXhlZCIsImNzdF9xdW90ZSIsInJlbmRlcl9jaGVjayIsInJlbmRlcl9mbiIsInN0ZXBfZXZhbF9saXN0Iiwic3RlcF9zZl9pZiIsInN0ZXBfc2Zfd2hlbiIsInN0ZXBfc2ZfYmVnaW4iLCJzdGVwX3NmX2xldCIsImZpcnN0X2JpbmRpbmciLCJyZXN0X2JpbmRpbmdzIiwicGFpcnMiLCJzdGVwX3NmX2RlZmluZSIsInZhbF9pZHgiLCJzdGVwX3NmX3NldF9iIiwic3RlcF9zZl9hbmQiLCJzdGVwX3NmX29yIiwic3RlcF9zZl9jb25kIiwiY2xhdXNlIiwic3RlcF9zZl9jYXNlIiwic3RlcF9zZl90aHJlYWRfZmlyc3QiLCJzdGVwX3NmX2xhbWJkYSIsInN0ZXBfc2Zfc2NvcGUiLCJyZXN0X2FyZ3MiLCJzdGVwX3NmX3Byb3ZpZGUiLCJzdGVwX3NmX2NvbnRleHQiLCJkZWZhdWx0X3ZhbCIsInN0ZXBfc2ZfZW1pdCIsInN0ZXBfc2ZfZW1pdHRlZCIsInN0ZXBfc2ZfcmVzZXQiLCJzdGVwX3NmX3NoaWZ0Iiwia19uYW1lIiwiY2FwdHVyZWRfcmVzdWx0IiwicmVzdF9rb250Iiwic2hpZnRfZW52Iiwic3RlcF9zZl9kZXJlZiIsImNla19jYWxsIiwiYSIsImNzdF91cGRhdGVfZm4iLCJyZWFjdGl2ZV9zaGlmdF9kZXJlZiIsInNpZyIsInNjYW5fcmVzdWx0IiwiY2FwdHVyZWRfZnJhbWVzIiwicmVzZXRfZnJhbWUiLCJyZW1haW5pbmdfa29udCIsInN1YnNjcmliZXIiLCJuZXdfcmVzZXQiLCJuZXdfa29udCIsImluaXRpYWxfa29udCIsInN0ZXBfZXZhbF9jYWxsIiwiaG5hbWUiLCJob19mb3JtX25hbWVfcCIsImhvX2ZuX3AiLCJob19zd2FwX2FyZ3MiLCJiIiwiaG9fc2V0dXBfZGlzcGF0Y2giLCJvcmRlcmVkIiwiY29sbCIsImluaXQiLCJzdGVwX2hvX21hcCIsInN0ZXBfaG9fbWFwX2luZGV4ZWQiLCJzdGVwX2hvX2ZpbHRlciIsInN0ZXBfaG9fcmVkdWNlIiwic3RlcF9ob19zb21lIiwic3RlcF9ob19ldmVyeSIsInN0ZXBfaG9fZm9yX2VhY2giLCJjc3RfZm9ybV9ub3RfY2FsbGFibGUiLCJjc3RfYm9keSIsImNzdF9ldmFsZWQiLCJjc3RfZiIsImNzdF9yZW1haW5pbmciLCJjc3RfcmVzdWx0cyIsInN0ZXBfY29udGludWUiLCJyZXN0X2siLCJmdCIsImZlbnYiLCJuZXh0X2JpbmRpbmciLCJlZmZlY3RfbmFtZXMiLCJuZXh0IiwibmV4dF90ZXN0IiwibmV4dF9jbGF1c2VzIiwibmV4dF9jbGF1c2UiLCJmb3JtIiwicmVzdF9mb3JtcyIsInJhcmdzIiwiYWxsX2FyZ3MiLCJuZXdfZXZhbGVkIiwibGFzdF9yZXN1bHQiLCJjb21wbGV0ZWQiLCJuZXh0X2VudHJ5IiwiY3R4IiwiZGVwX2xpc3QiLCJub3RpZnlfZm4iLCJmaXJzdF9wIiwibmV3X2ZyYW1lIiwiaW5kZXhlZCIsIm5ld19yZXN1bHRzIiwiY2FsbF9hcmdzIiwibmV4dF9mcmFtZSIsImppdF9jYWxsX2hvb2siLCJjb250aW51ZV93aXRoX2NhbGwiLCJjb250X2RhdGEiLCJsIiwiaG9vayIsInNmX2Nhc2Vfc3RlcF9sb29wIiwidGVzdF92YWwiLCJldmFsX2V4cHJfY2VrIiwidHJhbXBvbGluZV9jZWsiLCJldmFsX2V4cHIiLCJjZWtfcnVuX2l0ZXJhdGl2ZSJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxhQUFBO0FBQUEsSUFBQUMsOEJBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxXQUFBO0FBQUEs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O0FBQUEsR0FFSztBQUFBLEdBN1ZZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUQzTjFCIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MzM4MzMsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLnN4Lm9ianMvanNvby9kZWZhdWx0L3N4LmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvd29ya3NwYWNlX3Jvb3QvbGliL3N4X3ZtLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqIFNYIGJ5dGVjb2RlIFZNIOKAlCBzdGFjay1iYXNlZCBpbnRlcnByZXRlci5cblxuICAgIEV4ZWN1dGVzIGJ5dGVjb2RlIHByb2R1Y2VkIGJ5IGNvbXBpbGVyLnN4LlxuICAgIERlc2lnbmVkIGZvciBzcGVlZDogYXJyYXktYmFzZWQgc3RhY2ssIGRpcmVjdCBkaXNwYXRjaCxcbiAgICBubyBhbGxvY2F0aW9uIHBlciBzdGVwICh1bmxpa2UgdGhlIENFSyBtYWNoaW5lKS5cblxuICAgIFRoaXMgaXMgdGhlIHBsYXRmb3JtLW5hdGl2ZSBleGVjdXRpb24gZW5naW5lLiBUaGUgc2FtZSBieXRlY29kZVxuICAgIHJ1bnMgb24gYWxsIHBsYXRmb3JtcyAoT0NhbWwsIEpTLCBXQVNNKS5cblxuICAgIFZNIHR5cGVzICh2bV9jb2RlLCB2bV91cHZhbHVlX2NlbGwsIHZtX2Nsb3N1cmUpIGFyZSBkZWZpbmVkIGluXG4gICAgc3hfdHlwZXMubWwgdG8gc2hhcmUgdGhlIG11dHVhbCByZWN1cnNpb24gYmxvY2sgd2l0aCBbdmFsdWVdLiAqKVxuXG5vcGVuIFN4X3R5cGVzXG5cbigqKiBDYWxsIGZyYW1lIOKAlCBvbmUgcGVyIGZ1bmN0aW9uIGludm9jYXRpb24uICopXG50eXBlIGZyYW1lID0ge1xuICBjbG9zdXJlICAgOiB2bV9jbG9zdXJlO1xuICBtdXRhYmxlIGlwIDogaW50O1xuICBiYXNlICAgICAgOiBpbnQ7ICAoKiBiYXNlIGluZGV4IGluIHZhbHVlIHN0YWNrIGZvciBsb2NhbHMgKilcbiAgbG9jYWxfY2VsbHMgOiAoaW50LCB2bV91cHZhbHVlX2NlbGwpIEhhc2h0YmwudDsgICgqIHNsb3Qg4oaSIHNoYXJlZCBjZWxsIGZvciBjYXB0dXJlZCBsb2NhbHMgKilcbn1cblxuKCoqIFZNIHN0YXRlLiAqKVxudHlwZSB2bSA9IHtcbiAgbXV0YWJsZSBzdGFjayAgOiB2YWx1ZSBhcnJheTtcbiAgbXV0YWJsZSBzcCAgICAgOiBpbnQ7XG4gIG11dGFibGUgZnJhbWVzIDogZnJhbWUgbGlzdDtcbiAgZ2xvYmFscyAgICAgICAgOiAoc3RyaW5nLCB2YWx1ZSkgSGFzaHRibC50OyAgKCogbGl2ZSByZWZlcmVuY2UgdG8ga2VybmVsIGVudiAqKVxufVxuXG4oKiogRm9yd2FyZCByZWZlcmVuY2UgZm9yIEpJVCBjb21waWxhdGlvbiDigJQgc2V0IGFmdGVyIGRlZmluaXRpb24uICopXG5sZXQgaml0X2NvbXBpbGVfcmVmIDogKGxhbWJkYSAtPiAoc3RyaW5nLCB2YWx1ZSkgSGFzaHRibC50IC0+IHZtX2Nsb3N1cmUgb3B0aW9uKSByZWYgPVxuICByZWYgKGZ1biBfIF8gLT4gTm9uZSlcblxuKCoqIFNlbnRpbmVsIGNsb3N1cmUgaW5kaWNhdGluZyBKSVQgY29tcGlsYXRpb24gd2FzIGF0dGVtcHRlZCBhbmQgZmFpbGVkLlxuICAgIFByZXZlbnRzIHJldHJ5aW5nIGNvbXBpbGF0aW9uIG9uIGV2ZXJ5IGNhbGwuICopXG5sZXQgaml0X2ZhaWxlZF9zZW50aW5lbCA9IHtcbiAgdm1fY29kZSA9IHsgdmNfYXJpdHkgPSAtMTsgdmNfbG9jYWxzID0gMDsgdmNfYnl0ZWNvZGUgPSBbfHxdOyB2Y19jb25zdGFudHMgPSBbfHxdIH07XG4gIHZtX3VwdmFsdWVzID0gW3x8XTsgdm1fbmFtZSA9IFNvbWUgXCJfX2ppdF9mYWlsZWRfX1wiOyB2bV9lbnZfcmVmID0gSGFzaHRibC5jcmVhdGUgMDsgdm1fY2xvc3VyZV9lbnYgPSBOb25lXG59XG5cbmxldCBpc19qaXRfZmFpbGVkIGNsID0gY2wudm1fY29kZS52Y19hcml0eSA9IC0xXG5cbmxldCBjcmVhdGUgZ2xvYmFscyA9XG4gIHsgc3RhY2sgPSBBcnJheS5tYWtlIDQwOTYgTmlsOyBzcCA9IDA7IGZyYW1lcyA9IFtdOyBnbG9iYWxzIH1cblxuKCoqIFN0YWNrIG9wcyDigJQgaW5saW5lZCBmb3Igc3BlZWQuICopXG5sZXQgcHVzaCB2bSB2ID1cbiAgaWYgdm0uc3AgPj0gQXJyYXkubGVuZ3RoIHZtLnN0YWNrIHRoZW4gYmVnaW5cbiAgICBsZXQgbnMgPSBBcnJheS5tYWtlICh2bS5zcCAqIDIpIE5pbCBpblxuICAgIEFycmF5LmJsaXQgdm0uc3RhY2sgMCBucyAwIHZtLnNwO1xuICAgIHZtLnN0YWNrIDwtIG5zXG4gIGVuZDtcbiAgdm0uc3RhY2suKHZtLnNwKSA8LSB2O1xuICB2bS5zcCA8LSB2bS5zcCArIDFcblxubGV0W0BpbmxpbmVdIHBvcCB2bSA9XG4gIHZtLnNwIDwtIHZtLnNwIC0gMTtcbiAgdm0uc3RhY2suKHZtLnNwKVxuXG5sZXRbQGlubGluZV0gcGVlayB2bSA9IHZtLnN0YWNrLih2bS5zcCAtIDEpXG5cbigqKiBSZWFkIG9wZXJhbmRzLiAqKVxubGV0W0BpbmxpbmVdIHJlYWRfdTggZiA9XG4gIGxldCB2ID0gZi5jbG9zdXJlLnZtX2NvZGUudmNfYnl0ZWNvZGUuKGYuaXApIGluXG4gIGYuaXAgPC0gZi5pcCArIDE7IHZcblxubGV0W0BpbmxpbmVdIHJlYWRfdTE2IGYgPVxuICBsZXQgbG8gPSBmLmNsb3N1cmUudm1fY29kZS52Y19ieXRlY29kZS4oZi5pcCkgaW5cbiAgbGV0IGhpID0gZi5jbG9zdXJlLnZtX2NvZGUudmNfYnl0ZWNvZGUuKGYuaXAgKyAxKSBpblxuICBmLmlwIDwtIGYuaXAgKyAyO1xuICBsbyBsb3IgKGhpIGxzbCA4KVxuXG5sZXRbQGlubGluZV0gcmVhZF9pMTYgZiA9XG4gIGxldCB2ID0gcmVhZF91MTYgZiBpblxuICBpZiB2ID49IDMyNzY4IHRoZW4gdiAtIDY1NTM2IGVsc2UgdlxuXG4oKiogV3JhcCBhIFZNIGNsb3N1cmUgYXMgYW4gU1ggdmFsdWUgKE5hdGl2ZUZuKS4gKilcbmxldCBjbG9zdXJlX3RvX3ZhbHVlIGNsID1cbiAgTmF0aXZlRm4gKFwidm06XCIgXiAobWF0Y2ggY2wudm1fbmFtZSB3aXRoIFNvbWUgbiAtPiBuIHwgTm9uZSAtPiBcImFub25cIiksXG4gICAgZnVuIGFyZ3MgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiVk1fQ0xPU1VSRV9DQUxMOlwiIF4gU3RyaW5nLmNvbmNhdCBcIixcIiAoTGlzdC5tYXAgU3hfcnVudGltZS52YWx1ZV90b19zdHIgYXJncykpKSlcbiAgKCogUGxhY2Vob2xkZXIg4oCUIGFjdHVhbCBjYWxscyBnbyB0aHJvdWdoIHZtX2NhbGwgYmVsb3cgKilcblxubGV0IF92bV9pbnNuX2NvdW50ID0gcmVmIDBcbmxldCBfdm1fY2FsbF9jb3VudCA9IHJlZiAwXG5sZXQgX3ZtX2Nla19jb3VudCA9IHJlZiAwXG5sZXQgdm1fcmVzZXRfY291bnRlcnMgKCkgPSBfdm1faW5zbl9jb3VudCA6PSAwOyBfdm1fY2FsbF9jb3VudCA6PSAwOyBfdm1fY2VrX2NvdW50IDo9IDBcbmxldCB2bV9yZXBvcnRfY291bnRlcnMgKCkgPVxuICBQcmludGYuZXByaW50ZiBcIlt2bS1wZXJmXSBpbnNucz0lZCBjYWxscz0lZCBjZWtfZmFsbGJhY2tzPSVkXFxuJSFcIlxuICAgICFfdm1faW5zbl9jb3VudCAhX3ZtX2NhbGxfY291bnQgIV92bV9jZWtfY291bnRcblxuKCoqIFB1c2ggYSBWTSBjbG9zdXJlIGZyYW1lIG9udG8gdGhlIGN1cnJlbnQgVk0g4oCUIG5vIG5ldyBWTSBhbGxvY2F0aW9uLlxuICAgIFRoaXMgaXMgdGhlIGZhc3QgcGF0aCBmb3IgaW50cmEtVk0gY2xvc3VyZSBjYWxscy4gKilcbmxldCBwdXNoX2Nsb3N1cmVfZnJhbWUgdm0gY2wgYXJncyA9XG4gIGxldCBmcmFtZSA9IHsgY2xvc3VyZSA9IGNsOyBpcCA9IDA7IGJhc2UgPSB2bS5zcDsgbG9jYWxfY2VsbHMgPSBIYXNodGJsLmNyZWF0ZSA0IH0gaW5cbiAgTGlzdC5pdGVyIChmdW4gYSAtPiBwdXNoIHZtIGEpIGFyZ3M7XG4gIGZvciBfID0gTGlzdC5sZW5ndGggYXJncyB0byBjbC52bV9jb2RlLnZjX2xvY2FscyAtIDEgZG8gcHVzaCB2bSBOaWwgZG9uZTtcbiAgdm0uZnJhbWVzIDwtIGZyYW1lIDo6IHZtLmZyYW1lc1xuXG4oKiogQ29udmVydCBjb21waWxlciBvdXRwdXQgKFNYIGRpY3QpIHRvIGEgdm1fY29kZSBvYmplY3QuICopXG5sZXQgY29kZV9mcm9tX3ZhbHVlIHYgPVxuICBtYXRjaCB2IHdpdGhcbiAgfCBEaWN0IGQgLT5cbiAgICBsZXQgYmNfbGlzdCA9IG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgZCBcImJ5dGVjb2RlXCIgd2l0aFxuICAgICAgfCBTb21lIChMaXN0IGwgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsIH0pIC0+XG4gICAgICAgIEFycmF5Lm9mX2xpc3QgKExpc3QubWFwIChmdW4geCAtPiBtYXRjaCB4IHdpdGggTnVtYmVyIG4gLT4gaW50X29mX2Zsb2F0IG4gfCBfIC0+IDApIGwpXG4gICAgICB8IF8gLT4gW3x8XVxuICAgIGluXG4gICAgbGV0IGVudHJpZXMgPSBtYXRjaCBIYXNodGJsLmZpbmRfb3B0IGQgXCJjb25zdGFudHNcIiB3aXRoXG4gICAgICB8IFNvbWUgKExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSkgLT4gQXJyYXkub2ZfbGlzdCBsXG4gICAgICB8IF8gLT4gW3x8XVxuICAgIGluXG4gICAgbGV0IGNvbnN0YW50cyA9IEFycmF5Lm1hcCAoZnVuIGVudHJ5IC0+XG4gICAgICBtYXRjaCBlbnRyeSB3aXRoXG4gICAgICB8IERpY3QgZWQgd2hlbiBIYXNodGJsLm1lbSBlZCBcImJ5dGVjb2RlXCIgLT4gZW50cnkgICgqIG5lc3RlZCBjb2RlIOKAlCBjb252ZXJ0IGxhemlseSAqKVxuICAgICAgfCBfIC0+IGVudHJ5XG4gICAgKSBlbnRyaWVzIGluXG4gICAgbGV0IGFyaXR5ID0gbWF0Y2ggSGFzaHRibC5maW5kX29wdCBkIFwiYXJpdHlcIiB3aXRoXG4gICAgICB8IFNvbWUgKE51bWJlciBuKSAtPiBpbnRfb2ZfZmxvYXQgbiB8IF8gLT4gMFxuICAgIGluXG4gICAgeyB2Y19hcml0eSA9IGFyaXR5OyB2Y19sb2NhbHMgPSBhcml0eSArIDE2OyB2Y19ieXRlY29kZSA9IGJjX2xpc3Q7IHZjX2NvbnN0YW50cyA9IGNvbnN0YW50cyB9XG4gIHwgXyAtPiB7IHZjX2FyaXR5ID0gMDsgdmNfbG9jYWxzID0gMTY7IHZjX2J5dGVjb2RlID0gW3x8XTsgdmNfY29uc3RhbnRzID0gW3x8XSB9XG5cbigqKiBFeGVjdXRlIGEgY2xvc3VyZSB3aXRoIGFyZ3VtZW50cyDigJQgY3JlYXRlcyBhIGZyZXNoIFZNLlxuICAgIFVzZWQgZm9yIGVudHJ5IHBvaW50czogSklUIExhbWJkYSBjYWxscywgbW9kdWxlIGV4ZWN1dGlvbiwgY3Jvc3MtYm91bmRhcnkuICopXG5sZXQgcmVjIGNhbGxfY2xvc3VyZSBjbCBhcmdzIGdsb2JhbHMgPVxuICBpbmNyIF92bV9jYWxsX2NvdW50O1xuICBsZXQgdm0gPSBjcmVhdGUgZ2xvYmFscyBpblxuICBwdXNoX2Nsb3N1cmVfZnJhbWUgdm0gY2wgYXJncztcbiAgKHRyeSBydW4gdm0gd2l0aCBlIC0+IHJhaXNlIGUpO1xuICBwb3Agdm1cblxuKCoqIENhbGwgYSB2YWx1ZSBhcyBhIGZ1bmN0aW9uIOKAlCBkaXNwYXRjaCBieSB0eXBlLlxuICAgIFZtQ2xvc3VyZTogcHVzaGVzIGZyYW1lIG9uIGN1cnJlbnQgVk0gKGZhc3QgaW50cmEtVk0gcGF0aCkuXG4gICAgTGFtYmRhOiB0cmllcyBKSVQgdGhlbiBmYWxscyBiYWNrIHRvIENFSy5cbiAgICBOYXRpdmVGbjogY2FsbHMgZGlyZWN0bHkuICopXG5hbmQgdm1fY2FsbCB2bSBmIGFyZ3MgPVxuICBtYXRjaCBmIHdpdGhcbiAgfCBWbUNsb3N1cmUgY2wgLT5cbiAgICAoKiBGYXN0IHBhdGg6IHB1c2ggZnJhbWUgb24gY3VycmVudCBWTSDigJQgbm8gYWxsb2NhdGlvbiwgZW5hYmxlcyBUQ08gKilcbiAgICBwdXNoX2Nsb3N1cmVfZnJhbWUgdm0gY2wgYXJnc1xuICB8IE5hdGl2ZUZuIChfbmFtZSwgZm4pIC0+XG4gICAgbGV0IHJlc3VsdCA9IGZuIGFyZ3MgaW5cbiAgICBwdXNoIHZtIHJlc3VsdFxuICB8IExhbWJkYSBsIC0+XG4gICAgKG1hdGNoIGwubF9jb21waWxlZCB3aXRoXG4gICAgIHwgU29tZSBjbCB3aGVuIG5vdCAoaXNfaml0X2ZhaWxlZCBjbCkgLT5cbiAgICAgICAoKiBDYWNoZWQgYnl0ZWNvZGUg4oCUIHJ1biBvbiBWTSB1c2luZyB0aGUgY2xvc3VyZSdzIGNhcHR1cmVkIGVudixcbiAgICAgICAgICBub3QgdGhlIGNhbGxlcidzIGdsb2JhbHMuIENsb3N1cmUgdmFycyB3ZXJlIG1lcmdlZCBhdCBjb21waWxlIHRpbWUuICopXG4gICAgICAgKHRyeSBwdXNoIHZtIChjYWxsX2Nsb3N1cmUgY2wgYXJncyBjbC52bV9lbnZfcmVmKVxuICAgICAgICB3aXRoIF8gLT4gcHVzaCB2bSAoU3hfcmVmLmNla19jYWxsIGYgKExpc3QgYXJncykpKVxuICAgICB8IFNvbWUgXyAtPlxuICAgICAgICgqIENvbXBpbGUgZmFpbGVkIOKAlCBDRUsgKilcbiAgICAgICBwdXNoIHZtIChTeF9yZWYuY2VrX2NhbGwgZiAoTGlzdCBhcmdzKSlcbiAgICAgfCBOb25lIC0+XG4gICAgICAgaWYgbC5sX25hbWUgPD4gTm9uZVxuICAgICAgIHRoZW4gYmVnaW5cbiAgICAgICAgICgqIFByZS1tYXJrIGJlZm9yZSBjb21waWxlIGF0dGVtcHQgdG8gcHJldmVudCByZS1lbnRyYW5jeSAqKVxuICAgICAgICAgbC5sX2NvbXBpbGVkIDwtIFNvbWUgaml0X2ZhaWxlZF9zZW50aW5lbDtcbiAgICAgICAgIG1hdGNoICFqaXRfY29tcGlsZV9yZWYgbCB2bS5nbG9iYWxzIHdpdGhcbiAgICAgICAgIHwgU29tZSBjbCAtPlxuICAgICAgICAgICBsLmxfY29tcGlsZWQgPC0gU29tZSBjbDtcbiAgICAgICAgICAgKHRyeSBwdXNoIHZtIChjYWxsX2Nsb3N1cmUgY2wgYXJncyBjbC52bV9lbnZfcmVmKVxuICAgICAgICAgICAgd2l0aCBfIC0+XG4gICAgICAgICAgICAgIGwubF9jb21waWxlZCA8LSBTb21lIGppdF9mYWlsZWRfc2VudGluZWw7XG4gICAgICAgICAgICAgIHB1c2ggdm0gKFN4X3JlZi5jZWtfY2FsbCBmIChMaXN0IGFyZ3MpKSlcbiAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICBwdXNoIHZtIChTeF9yZWYuY2VrX2NhbGwgZiAoTGlzdCBhcmdzKSlcbiAgICAgICBlbmRcbiAgICAgICBlbHNlXG4gICAgICAgICBwdXNoIHZtIChTeF9yZWYuY2VrX2NhbGwgZiAoTGlzdCBhcmdzKSkpXG4gIHwgQ29tcG9uZW50IF8gfCBJc2xhbmQgXyAtPlxuICAgICgqIENvbXBvbmVudHMgdXNlIGtleXdvcmQtYXJnIHBhcnNpbmcg4oCUIENFSyBoYW5kbGVzIHRoaXMgKilcbiAgICBpbmNyIF92bV9jZWtfY291bnQ7XG4gICAgbGV0IHJlc3VsdCA9IFN4X3JlZi5jZWtfY2FsbCBmIChMaXN0IGFyZ3MpIGluXG4gICAgcHVzaCB2bSByZXN1bHRcbiAgfCBfIC0+XG4gICAgcmFpc2UgKEV2YWxfZXJyb3IgKFwiVk06IG5vdCBjYWxsYWJsZTogXCIgXiBTeF9ydW50aW1lLnZhbHVlX3RvX3N0ciBmKSlcblxuKCoqIE1haW4gZXhlY3V0aW9uIGxvb3Ag4oCUIGl0ZXJhdGl2ZSAobm8gT0NhbWwgc3RhY2sgZ3Jvd3RoKS5cbiAgICBWbUNsb3N1cmUgY2FsbHMgcHVzaCBmcmFtZXM7IHRoZSBsb29wIHBpY2tzIHRoZW0gdXAuXG4gICAgT1BfVEFJTF9DQUxMICsgVm1DbG9zdXJlID0gdHJ1ZSBUQ086IGRyb3AgZnJhbWUsIHB1c2ggbmV3LCBsb29wLiAqKVxuYW5kIHJ1biB2bSA9XG4gIHdoaWxlIHZtLmZyYW1lcyA8PiBbXSBkb1xuICAgIG1hdGNoIHZtLmZyYW1lcyB3aXRoXG4gICAgfCBbXSAtPiAoKSAgKCogZ3VhcmQgaGFuZGxlZCBieSB3aGlsZSBjb25kaXRpb24gKilcbiAgICB8IGZyYW1lIDo6IHJlc3RfZnJhbWVzIC0+XG4gICAgICBsZXQgYmMgPSBmcmFtZS5jbG9zdXJlLnZtX2NvZGUudmNfYnl0ZWNvZGUgaW5cbiAgICAgIGxldCBjb25zdHMgPSBmcmFtZS5jbG9zdXJlLnZtX2NvZGUudmNfY29uc3RhbnRzIGluXG4gICAgICBpZiBmcmFtZS5pcCA+PSBBcnJheS5sZW5ndGggYmMgdGhlblxuICAgICAgICB2bS5mcmFtZXMgPC0gW10gICgqIGJ5dGVjb2RlIGV4aGF1c3RlZCDigJQgc3RvcCAqKVxuICAgICAgZWxzZSBiZWdpblxuICAgICAgICBsZXQgc2F2ZWRfaXAgPSBmcmFtZS5pcCBpblxuICAgICAgICBsZXQgb3AgPSBiYy4oZnJhbWUuaXApIGluXG4gICAgICAgIGZyYW1lLmlwIDwtIGZyYW1lLmlwICsgMTtcbiAgICAgICAgKHRyeSBtYXRjaCBvcCB3aXRoXG4gICAgICAgICgqIC0tLS0gQ29uc3RhbnRzIC0tLS0gKilcbiAgICAgICAgfCAxICgqIE9QX0NPTlNUICopIC0+XG4gICAgICAgICAgbGV0IGlkeCA9IHJlYWRfdTE2IGZyYW1lIGluXG4gICAgICAgICAgaWYgaWR4ID49IEFycmF5Lmxlbmd0aCBjb25zdHMgdGhlblxuICAgICAgICAgICAgcmFpc2UgKEV2YWxfZXJyb3IgKFByaW50Zi5zcHJpbnRmIFwiVk06IENPTlNUIGluZGV4ICVkIG91dCBvZiBib3VuZHMgKHBvb2wgc2l6ZSAlZClcIlxuICAgICAgICAgICAgICBpZHggKEFycmF5Lmxlbmd0aCBjb25zdHMpKSk7XG4gICAgICAgICAgcHVzaCB2bSBjb25zdHMuKGlkeClcbiAgICAgICAgfCAyICgqIE9QX05JTCAqKSAgIC0+IHB1c2ggdm0gTmlsXG4gICAgICAgIHwgMyAoKiBPUF9UUlVFICopICAtPiBwdXNoIHZtIChCb29sIHRydWUpXG4gICAgICAgIHwgNCAoKiBPUF9GQUxTRSAqKSAtPiBwdXNoIHZtIChCb29sIGZhbHNlKVxuICAgICAgICB8IDUgKCogT1BfUE9QICopICAgLT4gaWdub3JlIChwb3Agdm0pXG4gICAgICAgIHwgNiAoKiBPUF9EVVAgKikgICAtPiBwdXNoIHZtIChwZWVrIHZtKVxuXG4gICAgICAgICgqIC0tLS0gVmFyaWFibGUgYWNjZXNzIC0tLS0gKilcbiAgICAgICAgfCAxNiAoKiBPUF9MT0NBTF9HRVQgKikgLT5cbiAgICAgICAgICBsZXQgc2xvdCA9IHJlYWRfdTggZnJhbWUgaW5cbiAgICAgICAgICBsZXQgdiA9IG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgZnJhbWUubG9jYWxfY2VsbHMgc2xvdCB3aXRoXG4gICAgICAgICAgICB8IFNvbWUgY2VsbCAtPiBjZWxsLnV2X3ZhbHVlXG4gICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgbGV0IGlkeCA9IGZyYW1lLmJhc2UgKyBzbG90IGluXG4gICAgICAgICAgICAgIGlmIGlkeCA+PSB2bS5zcCB0aGVuXG4gICAgICAgICAgICAgICAgcmFpc2UgKEV2YWxfZXJyb3IgKFByaW50Zi5zcHJpbnRmXG4gICAgICAgICAgICAgICAgICBcIlZNOiBMT0NBTF9HRVQgc2xvdD0lZCBiYXNlPSVkIHNwPSVkIG91dCBvZiBib3VuZHNcIiBzbG90IGZyYW1lLmJhc2Ugdm0uc3ApKTtcbiAgICAgICAgICAgICAgdm0uc3RhY2suKGlkeClcbiAgICAgICAgICBpblxuICAgICAgICAgIHB1c2ggdm0gdlxuICAgICAgICB8IDE3ICgqIE9QX0xPQ0FMX1NFVCAqKSAtPlxuICAgICAgICAgIGxldCBzbG90ID0gcmVhZF91OCBmcmFtZSBpblxuICAgICAgICAgIGxldCB2ID0gcGVlayB2bSBpblxuICAgICAgICAgICgqIFdyaXRlIHRvIHNoYXJlZCBjZWxsIGlmIGNhcHR1cmVkLCBlbHNlIHRvIHN0YWNrICopXG4gICAgICAgICAgKG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgZnJhbWUubG9jYWxfY2VsbHMgc2xvdCB3aXRoXG4gICAgICAgICAgIHwgU29tZSBjZWxsIC0+IGNlbGwudXZfdmFsdWUgPC0gdlxuICAgICAgICAgICB8IE5vbmUgLT4gdm0uc3RhY2suKGZyYW1lLmJhc2UgKyBzbG90KSA8LSB2KVxuICAgICAgICB8IDE4ICgqIE9QX1VQVkFMVUVfR0VUICopIC0+XG4gICAgICAgICAgbGV0IGlkeCA9IHJlYWRfdTggZnJhbWUgaW5cbiAgICAgICAgICBpZiBpZHggPj0gQXJyYXkubGVuZ3RoIGZyYW1lLmNsb3N1cmUudm1fdXB2YWx1ZXMgdGhlblxuICAgICAgICAgICAgcmFpc2UgKEV2YWxfZXJyb3IgKFByaW50Zi5zcHJpbnRmXG4gICAgICAgICAgICAgIFwiVk06IFVQVkFMVUVfR0VUIGlkeD0lZCBvdXQgb2YgYm91bmRzIChoYXZlICVkKVwiIGlkeFxuICAgICAgICAgICAgICAoQXJyYXkubGVuZ3RoIGZyYW1lLmNsb3N1cmUudm1fdXB2YWx1ZXMpKSk7XG4gICAgICAgICAgcHVzaCB2bSBmcmFtZS5jbG9zdXJlLnZtX3VwdmFsdWVzLihpZHgpLnV2X3ZhbHVlXG4gICAgICAgIHwgMTkgKCogT1BfVVBWQUxVRV9TRVQgKikgLT5cbiAgICAgICAgICBsZXQgaWR4ID0gcmVhZF91OCBmcmFtZSBpblxuICAgICAgICAgIGZyYW1lLmNsb3N1cmUudm1fdXB2YWx1ZXMuKGlkeCkudXZfdmFsdWUgPC0gcGVlayB2bVxuICAgICAgICB8IDIwICgqIE9QX0dMT0JBTF9HRVQgKikgLT5cbiAgICAgICAgICBsZXQgaWR4ID0gcmVhZF91MTYgZnJhbWUgaW5cbiAgICAgICAgICBsZXQgbmFtZSA9IG1hdGNoIGNvbnN0cy4oaWR4KSB3aXRoIFN0cmluZyBzIC0+IHMgfCBfIC0+IFwiXCIgaW5cbiAgICAgICAgICBsZXQgdiA9IHRyeSBIYXNodGJsLmZpbmQgdm0uZ2xvYmFscyBuYW1lIHdpdGggTm90X2ZvdW5kIC0+XG4gICAgICAgICAgICAoKiBXYWxrIHRoZSBjbG9zdXJlIGVudiBjaGFpbiBmb3IgaW5uZXIgZnVuY3Rpb25zICopXG4gICAgICAgICAgICBsZXQgaWQgPSBTeF90eXBlcy5pbnRlcm4gbmFtZSBpblxuICAgICAgICAgICAgbGV0IHJlYyBlbnZfbG9va3VwIGUgPVxuICAgICAgICAgICAgICB0cnkgSGFzaHRibC5maW5kIGUuYmluZGluZ3MgaWRcbiAgICAgICAgICAgICAgd2l0aCBOb3RfZm91bmQgLT5cbiAgICAgICAgICAgICAgICBtYXRjaCBlLnBhcmVudCB3aXRoIFNvbWUgcCAtPiBlbnZfbG9va3VwIHAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICB0cnkgU3hfcHJpbWl0aXZlcy5nZXRfcHJpbWl0aXZlIG5hbWVcbiAgICAgICAgICAgICAgICAgIHdpdGggXyAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJWTSB1bmRlZmluZWQ6IFwiIF4gbmFtZSkpXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgbWF0Y2ggZnJhbWUuY2xvc3VyZS52bV9jbG9zdXJlX2VudiB3aXRoXG4gICAgICAgICAgICB8IFNvbWUgZW52IC0+IGVudl9sb29rdXAgZW52XG4gICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgdHJ5IFN4X3ByaW1pdGl2ZXMuZ2V0X3ByaW1pdGl2ZSBuYW1lXG4gICAgICAgICAgICAgIHdpdGggXyAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJWTSB1bmRlZmluZWQ6IFwiIF4gbmFtZSkpXG4gICAgICAgICAgaW5cbiAgICAgICAgICBwdXNoIHZtIHZcbiAgICAgICAgfCAyMSAoKiBPUF9HTE9CQUxfU0VUICopIC0+XG4gICAgICAgICAgbGV0IGlkeCA9IHJlYWRfdTE2IGZyYW1lIGluXG4gICAgICAgICAgbGV0IG5hbWUgPSBtYXRjaCBjb25zdHMuKGlkeCkgd2l0aCBTdHJpbmcgcyAtPiBzIHwgXyAtPiBcIlwiIGluXG4gICAgICAgICAgKCogV3JpdGUgdG8gY2xvc3VyZSBlbnYgaWYgdGhlIG5hbWUgZXhpc3RzIHRoZXJlIChtdXRhYmxlIGNsb3N1cmUgdmFycykgKilcbiAgICAgICAgICBsZXQgd3JpdHRlbiA9IG1hdGNoIGZyYW1lLmNsb3N1cmUudm1fY2xvc3VyZV9lbnYgd2l0aFxuICAgICAgICAgICAgfCBTb21lIGVudiAtPlxuICAgICAgICAgICAgICBsZXQgaWQgPSBTeF90eXBlcy5pbnRlcm4gbmFtZSBpblxuICAgICAgICAgICAgICBsZXQgcmVjIGZpbmRfZW52IGUgPVxuICAgICAgICAgICAgICAgIGlmIEhhc2h0YmwubWVtIGUuYmluZGluZ3MgaWQgdGhlblxuICAgICAgICAgICAgICAgICAgKEhhc2h0YmwucmVwbGFjZSBlLmJpbmRpbmdzIGlkIChwZWVrIHZtKTsgdHJ1ZSlcbiAgICAgICAgICAgICAgICBlbHNlIG1hdGNoIGUucGFyZW50IHdpdGggU29tZSBwIC0+IGZpbmRfZW52IHAgfCBOb25lIC0+IGZhbHNlXG4gICAgICAgICAgICAgIGluIGZpbmRfZW52IGVudlxuICAgICAgICAgICAgfCBOb25lIC0+IGZhbHNlXG4gICAgICAgICAgaW5cbiAgICAgICAgICBpZiBub3Qgd3JpdHRlbiB0aGVuIEhhc2h0YmwucmVwbGFjZSB2bS5nbG9iYWxzIG5hbWUgKHBlZWsgdm0pXG5cbiAgICAgICAgKCogLS0tLSBDb250cm9sIGZsb3cgLS0tLSAqKVxuICAgICAgICB8IDMyICgqIE9QX0pVTVAgKikgLT5cbiAgICAgICAgICBsZXQgb2Zmc2V0ID0gcmVhZF9pMTYgZnJhbWUgaW5cbiAgICAgICAgICBmcmFtZS5pcCA8LSBmcmFtZS5pcCArIG9mZnNldFxuICAgICAgICB8IDMzICgqIE9QX0pVTVBfSUZfRkFMU0UgKikgLT5cbiAgICAgICAgICBsZXQgb2Zmc2V0ID0gcmVhZF9pMTYgZnJhbWUgaW5cbiAgICAgICAgICBsZXQgdiA9IHBvcCB2bSBpblxuICAgICAgICAgIGlmIG5vdCAoc3hfdHJ1dGh5IHYpIHRoZW4gZnJhbWUuaXAgPC0gZnJhbWUuaXAgKyBvZmZzZXRcbiAgICAgICAgfCAzNCAoKiBPUF9KVU1QX0lGX1RSVUUgKikgLT5cbiAgICAgICAgICBsZXQgb2Zmc2V0ID0gcmVhZF9pMTYgZnJhbWUgaW5cbiAgICAgICAgICBsZXQgdiA9IHBvcCB2bSBpblxuICAgICAgICAgIGlmIHN4X3RydXRoeSB2IHRoZW4gZnJhbWUuaXAgPC0gZnJhbWUuaXAgKyBvZmZzZXRcblxuICAgICAgICAoKiAtLS0tIEZ1bmN0aW9uIGNhbGxzIC0tLS0gKilcbiAgICAgICAgfCA0OCAoKiBPUF9DQUxMICopIC0+XG4gICAgICAgICAgbGV0IGFyZ2MgPSByZWFkX3U4IGZyYW1lIGluXG4gICAgICAgICAgbGV0IGFyZ3MgPSBBcnJheS5pbml0IGFyZ2MgKGZ1biBfIC0+IHBvcCB2bSkgaW5cbiAgICAgICAgICBsZXQgZiA9IHBvcCB2bSBpblxuICAgICAgICAgIGxldCBhcmdzX2xpc3QgPSBMaXN0LnJldiAoQXJyYXkudG9fbGlzdCBhcmdzKSBpblxuICAgICAgICAgIHZtX2NhbGwgdm0gZiBhcmdzX2xpc3RcbiAgICAgICAgICAoKiBMb29wIGNvbnRpbnVlcyDigJQgaWYgVm1DbG9zdXJlLCBuZXcgZnJhbWUgcnVucyBuZXh0IGl0ZXJhdGlvbiAqKVxuICAgICAgICB8IDQ5ICgqIE9QX1RBSUxfQ0FMTCAqKSAtPlxuICAgICAgICAgIGxldCBhcmdjID0gcmVhZF91OCBmcmFtZSBpblxuICAgICAgICAgIGxldCBhcmdzID0gQXJyYXkuaW5pdCBhcmdjIChmdW4gXyAtPiBwb3Agdm0pIGluXG4gICAgICAgICAgbGV0IGYgPSBwb3Agdm0gaW5cbiAgICAgICAgICBsZXQgYXJnc19saXN0ID0gTGlzdC5yZXYgKEFycmF5LnRvX2xpc3QgYXJncykgaW5cbiAgICAgICAgICAoKiBEcm9wIGN1cnJlbnQgZnJhbWUsIHJldXNlIHN0YWNrIHNwYWNlIOKAlCB0cnVlIFRDTyBmb3IgVm1DbG9zdXJlICopXG4gICAgICAgICAgdm0uZnJhbWVzIDwtIHJlc3RfZnJhbWVzO1xuICAgICAgICAgIHZtLnNwIDwtIGZyYW1lLmJhc2U7XG4gICAgICAgICAgdm1fY2FsbCB2bSBmIGFyZ3NfbGlzdFxuICAgICAgICB8IDUwICgqIE9QX1JFVFVSTiAqKSAtPlxuICAgICAgICAgIGxldCByZXN1bHQgPSBwb3Agdm0gaW5cbiAgICAgICAgICB2bS5mcmFtZXMgPC0gcmVzdF9mcmFtZXM7XG4gICAgICAgICAgdm0uc3AgPC0gZnJhbWUuYmFzZTtcbiAgICAgICAgICBwdXNoIHZtIHJlc3VsdFxuICAgICAgICAgICgqIExvb3AgY29udGludWVzIHdpdGggY2FsbGVyIGZyYW1lICopXG4gICAgICAgIHwgNTEgKCogT1BfQ0xPU1VSRSAqKSAtPlxuICAgICAgICAgIGxldCBpZHggPSByZWFkX3UxNiBmcmFtZSBpblxuICAgICAgICAgIGlmIGlkeCA+PSBBcnJheS5sZW5ndGggY29uc3RzIHRoZW5cbiAgICAgICAgICAgIHJhaXNlIChFdmFsX2Vycm9yIChQcmludGYuc3ByaW50ZiBcIlZNOiBDTE9TVVJFIGlkeCAlZCA+PSBjb25zdHMgJWRcIiBpZHggKEFycmF5Lmxlbmd0aCBjb25zdHMpKSk7XG4gICAgICAgICAgbGV0IGNvZGVfdmFsID0gY29uc3RzLihpZHgpIGluXG4gICAgICAgICAgbGV0IGNvZGUgPSBjb2RlX2Zyb21fdmFsdWUgY29kZV92YWwgaW5cbiAgICAgICAgICAoKiBSZWFkIHVwdmFsdWUgZGVzY3JpcHRvcnMgZnJvbSBieXRlY29kZSAqKVxuICAgICAgICAgIGxldCB1dl9jb3VudCA9IG1hdGNoIGNvZGVfdmFsIHdpdGhcbiAgICAgICAgICAgIHwgRGljdCBkIC0+IChtYXRjaCBIYXNodGJsLmZpbmRfb3B0IGQgXCJ1cHZhbHVlLWNvdW50XCIgd2l0aFxuICAgICAgICAgICAgICAgIHwgU29tZSAoTnVtYmVyIG4pIC0+IGludF9vZl9mbG9hdCBuIHwgXyAtPiAwKVxuICAgICAgICAgICAgfCBfIC0+IDBcbiAgICAgICAgICBpblxuICAgICAgICAgIGxldCB1cHZhbHVlcyA9IEFycmF5LmluaXQgdXZfY291bnQgKGZ1biBfIC0+XG4gICAgICAgICAgICBsZXQgaXNfbG9jYWwgPSByZWFkX3U4IGZyYW1lIGluXG4gICAgICAgICAgICBsZXQgaW5kZXggPSByZWFkX3U4IGZyYW1lIGluXG4gICAgICAgICAgICBpZiBpc19sb2NhbCA9IDEgdGhlbiBiZWdpblxuICAgICAgICAgICAgICAoKiBDYXB0dXJlIGZyb20gZW5jbG9zaW5nIGZyYW1lJ3MgbG9jYWwgc2xvdC5cbiAgICAgICAgICAgICAgICAgQ3JlYXRlIGEgc2hhcmVkIGNlbGwg4oCUIGJvdGggcGFyZW50IGFuZCBjbG9zdXJlXG4gICAgICAgICAgICAgICAgIHJlYWQvd3JpdGUgdGhyb3VnaCB0aGlzIGNlbGwuICopXG4gICAgICAgICAgICAgIGxldCBjZWxsID0gbWF0Y2ggSGFzaHRibC5maW5kX29wdCBmcmFtZS5sb2NhbF9jZWxscyBpbmRleCB3aXRoXG4gICAgICAgICAgICAgICAgfCBTb21lIGV4aXN0aW5nIC0+IGV4aXN0aW5nICAoKiByZXVzZSBleGlzdGluZyBjZWxsICopXG4gICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICBsZXQgYyA9IHsgdXZfdmFsdWUgPSB2bS5zdGFjay4oZnJhbWUuYmFzZSArIGluZGV4KSB9IGluXG4gICAgICAgICAgICAgICAgICBIYXNodGJsLnJlcGxhY2UgZnJhbWUubG9jYWxfY2VsbHMgaW5kZXggYztcbiAgICAgICAgICAgICAgICAgIGNcbiAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgY2VsbFxuICAgICAgICAgICAgZW5kIGVsc2VcbiAgICAgICAgICAgICAgKCogQ2FwdHVyZSBmcm9tIGVuY2xvc2luZyBmcmFtZSdzIHVwdmFsdWUg4oCUIGFscmVhZHkgYSBzaGFyZWQgY2VsbCAqKVxuICAgICAgICAgICAgICBmcmFtZS5jbG9zdXJlLnZtX3VwdmFsdWVzLihpbmRleClcbiAgICAgICAgICApIGluXG4gICAgICAgICAgbGV0IGNsID0geyB2bV9jb2RlID0gY29kZTsgdm1fdXB2YWx1ZXMgPSB1cHZhbHVlczsgdm1fbmFtZSA9IE5vbmU7XG4gICAgICAgICAgICAgICAgICAgICB2bV9lbnZfcmVmID0gdm0uZ2xvYmFsczsgdm1fY2xvc3VyZV9lbnYgPSBOb25lIH0gaW5cbiAgICAgICAgICBwdXNoIHZtIChWbUNsb3N1cmUgY2wpXG4gICAgICAgIHwgNTIgKCogT1BfQ0FMTF9QUklNICopIC0+XG4gICAgICAgICAgbGV0IGlkeCA9IHJlYWRfdTE2IGZyYW1lIGluXG4gICAgICAgICAgbGV0IGFyZ2MgPSByZWFkX3U4IGZyYW1lIGluXG4gICAgICAgICAgbGV0IG5hbWUgPSBtYXRjaCBjb25zdHMuKGlkeCkgd2l0aCBTdHJpbmcgcyAtPiBzIHwgXyAtPiBcIlwiIGluXG4gICAgICAgICAgbGV0IGFyZ3MgPSBMaXN0LmluaXQgYXJnYyAoZnVuIF8gLT4gcG9wIHZtKSB8PiBMaXN0LnJldiBpblxuICAgICAgICAgICgqIFJlc29sdmUgdGh1bmtzIOKAlCB0aGUgQ0VLIGV2YWx1YXRvciBkb2VzIHRoaXMgYXV0b21hdGljYWxseVxuICAgICAgICAgICAgIHZpYSB0cmFtcG9saW5lLCBidXQgdGhlIFZNIG11c3QgZG8gaXQgZXhwbGljaXRseSBiZWZvcmVcbiAgICAgICAgICAgICBwYXNzaW5nIGFyZ3MgdG8gcHJpbWl0aXZlcy4gKilcbiAgICAgICAgICBsZXQgYXJncyA9IExpc3QubWFwIChmdW4gdiAtPlxuICAgICAgICAgICAgbWF0Y2ggdiB3aXRoXG4gICAgICAgICAgICB8IFRodW5rIF8gLT4gIVN4X3ByaW1pdGl2ZXMuX3N4X3RyYW1wb2xpbmVfZm4gdlxuICAgICAgICAgICAgfCBfIC0+IHYpIGFyZ3MgaW5cbiAgICAgICAgICBsZXQgcmVzdWx0ID1cbiAgICAgICAgICAgIHRyeVxuICAgICAgICAgICAgICAoKiBDaGVjayBwcmltaXRpdmVzIEZJUlNUIChuYXRpdmUgaW1wbGVtZW50YXRpb25zIG9mIG1hcC9maWx0ZXIvZXRjLiksXG4gICAgICAgICAgICAgICAgIHRoZW4gZ2xvYmFscyAod2hpY2ggbWF5IGhhdmUgaG9fdmlhX2NlayB3cmFwcGVycyB0aGF0IHJvdXRlXG4gICAgICAgICAgICAgICAgIHRocm91Z2ggdGhlIENFSyDigJQgdGhlc2UgY2FuJ3QgY2FsbCBWTSBjbG9zdXJlcykuICopXG4gICAgICAgICAgICAgIGxldCBmbl92YWwgPSB0cnkgU3hfcHJpbWl0aXZlcy5nZXRfcHJpbWl0aXZlIG5hbWUgd2l0aCBfIC0+XG4gICAgICAgICAgICAgICAgdHJ5IEhhc2h0YmwuZmluZCB2bS5nbG9iYWxzIG5hbWUgd2l0aCBOb3RfZm91bmQgLT5cbiAgICAgICAgICAgICAgICAgIHJhaXNlIChFdmFsX2Vycm9yIChcIlZNOiB1bmtub3duIHByaW1pdGl2ZSBcIiBeIG5hbWUpKVxuICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAobWF0Y2ggZm5fdmFsIHdpdGhcbiAgICAgICAgICAgICAgIHwgTmF0aXZlRm4gKF8sIGZuKSAtPiBmbiBhcmdzXG4gICAgICAgICAgICAgICB8IF8gLT4gTmlsKVxuICAgICAgICAgICAgd2l0aCBFdmFsX2Vycm9yIG1zZyAtPlxuICAgICAgICAgICAgICByYWlzZSAoRXZhbF9lcnJvciAoUHJpbnRmLnNwcmludGYgXCIlcyAoaW4gQ0FMTF9QUklNIFxcXCIlc1xcXCIgd2l0aCAlZCBhcmdzKVwiXG4gICAgICAgICAgICAgICAgbXNnIG5hbWUgYXJnYykpXG4gICAgICAgICAgaW5cbiAgICAgICAgICBwdXNoIHZtIHJlc3VsdFxuXG4gICAgICAgICgqIC0tLS0gQ29sbGVjdGlvbnMgLS0tLSAqKVxuICAgICAgICB8IDY0ICgqIE9QX0xJU1QgKikgLT5cbiAgICAgICAgICBsZXQgY291bnQgPSByZWFkX3UxNiBmcmFtZSBpblxuICAgICAgICAgIGxldCBpdGVtcyA9IExpc3QuaW5pdCBjb3VudCAoZnVuIF8gLT4gcG9wIHZtKSB8PiBMaXN0LnJldiBpblxuICAgICAgICAgIHB1c2ggdm0gKExpc3QgaXRlbXMpXG4gICAgICAgIHwgNjUgKCogT1BfRElDVCAqKSAtPlxuICAgICAgICAgIGxldCBjb3VudCA9IHJlYWRfdTE2IGZyYW1lIGluXG4gICAgICAgICAgbGV0IGQgPSBIYXNodGJsLmNyZWF0ZSBjb3VudCBpblxuICAgICAgICAgIGZvciBfID0gMSB0byBjb3VudCBkb1xuICAgICAgICAgICAgbGV0IHYgPSBwb3Agdm0gaW5cbiAgICAgICAgICAgIGxldCBrID0gcG9wIHZtIGluXG4gICAgICAgICAgICBsZXQga2V5ID0gbWF0Y2ggayB3aXRoIFN0cmluZyBzIC0+IHMgfCBLZXl3b3JkIHMgLT4gcyB8IF8gLT4gU3hfcnVudGltZS52YWx1ZV90b19zdHIgayBpblxuICAgICAgICAgICAgSGFzaHRibC5yZXBsYWNlIGQga2V5IHZcbiAgICAgICAgICBkb25lO1xuICAgICAgICAgIHB1c2ggdm0gKERpY3QgZClcblxuICAgICAgICAoKiAtLS0tIFN0cmluZyBvcHMgLS0tLSAqKVxuICAgICAgICB8IDE0NCAoKiBPUF9TVFJfQ09OQ0FUICopIC0+XG4gICAgICAgICAgbGV0IGNvdW50ID0gcmVhZF91OCBmcmFtZSBpblxuICAgICAgICAgIGxldCBwYXJ0cyA9IExpc3QuaW5pdCBjb3VudCAoZnVuIF8gLT4gcG9wIHZtKSB8PiBMaXN0LnJldiBpblxuICAgICAgICAgIGxldCBzID0gU3RyaW5nLmNvbmNhdCBcIlwiIChMaXN0Lm1hcCBTeF9ydW50aW1lLnZhbHVlX3RvX3N0ciBwYXJ0cykgaW5cbiAgICAgICAgICBwdXNoIHZtIChTdHJpbmcgcylcblxuICAgICAgICAoKiAtLS0tIERlZmluZSAtLS0tICopXG4gICAgICAgIHwgMTI4ICgqIE9QX0RFRklORSAqKSAtPlxuICAgICAgICAgIGxldCBpZHggPSByZWFkX3UxNiBmcmFtZSBpblxuICAgICAgICAgIGxldCBuYW1lID0gbWF0Y2ggY29uc3RzLihpZHgpIHdpdGggU3RyaW5nIHMgLT4gcyB8IF8gLT4gXCJcIiBpblxuICAgICAgICAgIGxldCB2ID0gcGVlayB2bSBpblxuICAgICAgICAgIEhhc2h0YmwucmVwbGFjZSB2bS5nbG9iYWxzIG5hbWUgdlxuXG4gICAgICAgICgqIC0tLS0gSW5saW5lIHByaW1pdGl2ZXMgLS0tLVxuICAgICAgICAgICBGYXN0IHBhdGggZm9yIGNvbW1vbiB0eXBlczsgZmFsbGJhY2sgdG8gYWN0dWFsIHByaW1pdGl2ZVxuICAgICAgICAgICBmb3IgZWRnZSBjYXNlcyAodHlwZSBjb2VyY2lvbiwgdGh1bmtzLCBSYXdIVE1MLCBldGMuKVxuICAgICAgICAgICB0byBndWFyYW50ZWUgYmVoYXZpb3JhbCBwYXJpdHkgd2l0aCBDQUxMX1BSSU0uICopXG4gICAgICAgIHwgMTYwICgqIE9QX0FERCAqKSAtPlxuICAgICAgICAgIGxldCBiID0gcG9wIHZtIGFuZCBhID0gcG9wIHZtIGluXG4gICAgICAgICAgcHVzaCB2bSAobWF0Y2ggYSwgYiB3aXRoXG4gICAgICAgICAgICB8IE51bWJlciB4LCBOdW1iZXIgeSAtPiBOdW1iZXIgKHggKy4geSlcbiAgICAgICAgICAgIHwgXyAtPiAoSGFzaHRibC5maW5kIFN4X3ByaW1pdGl2ZXMucHJpbWl0aXZlcyBcIitcIikgW2E7IGJdKVxuICAgICAgICB8IDE2MSAoKiBPUF9TVUIgKikgLT5cbiAgICAgICAgICBsZXQgYiA9IHBvcCB2bSBhbmQgYSA9IHBvcCB2bSBpblxuICAgICAgICAgIHB1c2ggdm0gKG1hdGNoIGEsIGIgd2l0aFxuICAgICAgICAgICAgfCBOdW1iZXIgeCwgTnVtYmVyIHkgLT4gTnVtYmVyICh4IC0uIHkpXG4gICAgICAgICAgICB8IF8gLT4gKEhhc2h0YmwuZmluZCBTeF9wcmltaXRpdmVzLnByaW1pdGl2ZXMgXCItXCIpIFthOyBiXSlcbiAgICAgICAgfCAxNjIgKCogT1BfTVVMICopIC0+XG4gICAgICAgICAgbGV0IGIgPSBwb3Agdm0gYW5kIGEgPSBwb3Agdm0gaW5cbiAgICAgICAgICBwdXNoIHZtIChtYXRjaCBhLCBiIHdpdGhcbiAgICAgICAgICAgIHwgTnVtYmVyIHgsIE51bWJlciB5IC0+IE51bWJlciAoeCAqLiB5KVxuICAgICAgICAgICAgfCBfIC0+IChIYXNodGJsLmZpbmQgU3hfcHJpbWl0aXZlcy5wcmltaXRpdmVzIFwiKlwiKSBbYTsgYl0pXG4gICAgICAgIHwgMTYzICgqIE9QX0RJViAqKSAtPlxuICAgICAgICAgIGxldCBiID0gcG9wIHZtIGFuZCBhID0gcG9wIHZtIGluXG4gICAgICAgICAgcHVzaCB2bSAobWF0Y2ggYSwgYiB3aXRoXG4gICAgICAgICAgICB8IE51bWJlciB4LCBOdW1iZXIgeSAtPiBOdW1iZXIgKHggLy4geSlcbiAgICAgICAgICAgIHwgXyAtPiAoSGFzaHRibC5maW5kIFN4X3ByaW1pdGl2ZXMucHJpbWl0aXZlcyBcIi9cIikgW2E7IGJdKVxuICAgICAgICB8IDE2NCAoKiBPUF9FUSAqKSAtPlxuICAgICAgICAgIGxldCBiID0gcG9wIHZtIGFuZCBhID0gcG9wIHZtIGluXG4gICAgICAgICAgbGV0IHJlYyBub3JtID0gZnVuY3Rpb25cbiAgICAgICAgICAgIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9IC0+IExpc3QgKExpc3QubWFwIG5vcm0gbClcbiAgICAgICAgICAgIHwgTGlzdCBsIC0+IExpc3QgKExpc3QubWFwIG5vcm0gbCkgfCB2IC0+IHYgaW5cbiAgICAgICAgICBwdXNoIHZtIChCb29sIChub3JtIGEgPSBub3JtIGIpKVxuICAgICAgICB8IDE2NSAoKiBPUF9MVCAqKSAtPlxuICAgICAgICAgIGxldCBiID0gcG9wIHZtIGFuZCBhID0gcG9wIHZtIGluXG4gICAgICAgICAgcHVzaCB2bSAobWF0Y2ggYSwgYiB3aXRoXG4gICAgICAgICAgICB8IE51bWJlciB4LCBOdW1iZXIgeSAtPiBCb29sICh4IDwgeSlcbiAgICAgICAgICAgIHwgU3RyaW5nIHgsIFN0cmluZyB5IC0+IEJvb2wgKHggPCB5KVxuICAgICAgICAgICAgfCBfIC0+IChIYXNodGJsLmZpbmQgU3hfcHJpbWl0aXZlcy5wcmltaXRpdmVzIFwiPFwiKSBbYTsgYl0pXG4gICAgICAgIHwgMTY2ICgqIE9QX0dUICopIC0+XG4gICAgICAgICAgbGV0IGIgPSBwb3Agdm0gYW5kIGEgPSBwb3Agdm0gaW5cbiAgICAgICAgICBwdXNoIHZtIChtYXRjaCBhLCBiIHdpdGhcbiAgICAgICAgICAgIHwgTnVtYmVyIHgsIE51bWJlciB5IC0+IEJvb2wgKHggPiB5KVxuICAgICAgICAgICAgfCBTdHJpbmcgeCwgU3RyaW5nIHkgLT4gQm9vbCAoeCA+IHkpXG4gICAgICAgICAgICB8IF8gLT4gKEhhc2h0YmwuZmluZCBTeF9wcmltaXRpdmVzLnByaW1pdGl2ZXMgXCI+XCIpIFthOyBiXSlcbiAgICAgICAgfCAxNjcgKCogT1BfTk9UICopIC0+XG4gICAgICAgICAgbGV0IHYgPSBwb3Agdm0gaW5cbiAgICAgICAgICBwdXNoIHZtIChCb29sIChub3QgKHN4X3RydXRoeSB2KSkpXG4gICAgICAgIHwgMTY4ICgqIE9QX0xFTiAqKSAtPlxuICAgICAgICAgIGxldCB2ID0gcG9wIHZtIGluXG4gICAgICAgICAgcHVzaCB2bSAobWF0Y2ggdiB3aXRoXG4gICAgICAgICAgICB8IExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSAtPiBOdW1iZXIgKGZsb2F0X29mX2ludCAoTGlzdC5sZW5ndGggbCkpXG4gICAgICAgICAgICB8IFN0cmluZyBzIC0+IE51bWJlciAoZmxvYXRfb2ZfaW50IChTdHJpbmcubGVuZ3RoIHMpKVxuICAgICAgICAgICAgfCBEaWN0IGQgLT4gTnVtYmVyIChmbG9hdF9vZl9pbnQgKEhhc2h0YmwubGVuZ3RoIGQpKVxuICAgICAgICAgICAgfCBOaWwgLT4gTnVtYmVyIDAuMFxuICAgICAgICAgICAgfCBfIC0+IChIYXNodGJsLmZpbmQgU3hfcHJpbWl0aXZlcy5wcmltaXRpdmVzIFwibGVuXCIpIFt2XSlcbiAgICAgICAgfCAxNjkgKCogT1BfRklSU1QgKikgLT5cbiAgICAgICAgICBsZXQgdiA9IHBvcCB2bSBpblxuICAgICAgICAgIHB1c2ggdm0gKG1hdGNoIHYgd2l0aFxuICAgICAgICAgICAgfCBMaXN0ICh4IDo6IF8pIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0geCA6OiBfIH0gLT4geFxuICAgICAgICAgICAgfCBMaXN0IFtdIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gW10gfSB8IE5pbCAtPiBOaWxcbiAgICAgICAgICAgIHwgXyAtPiAoSGFzaHRibC5maW5kIFN4X3ByaW1pdGl2ZXMucHJpbWl0aXZlcyBcImZpcnN0XCIpIFt2XSlcbiAgICAgICAgfCAxNzAgKCogT1BfUkVTVCAqKSAtPlxuICAgICAgICAgIGxldCB2ID0gcG9wIHZtIGluXG4gICAgICAgICAgcHVzaCB2bSAobWF0Y2ggdiB3aXRoXG4gICAgICAgICAgICB8IExpc3QgKF8gOjogeHMpIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gXyA6OiB4cyB9IC0+IExpc3QgeHNcbiAgICAgICAgICAgIHwgTGlzdCBbXSB8IExpc3RSZWYgeyBjb250ZW50cyA9IFtdIH0gfCBOaWwgLT4gTGlzdCBbXVxuICAgICAgICAgICAgfCBfIC0+IChIYXNodGJsLmZpbmQgU3hfcHJpbWl0aXZlcy5wcmltaXRpdmVzIFwicmVzdFwiKSBbdl0pXG4gICAgICAgIHwgMTcxICgqIE9QX05USCAqKSAtPlxuICAgICAgICAgIGxldCBuID0gcG9wIHZtIGFuZCBjb2xsID0gcG9wIHZtIGluXG4gICAgICAgICAgcHVzaCB2bSAobWF0Y2ggY29sbCwgbiB3aXRoXG4gICAgICAgICAgICB8IChMaXN0IGwgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsIH0pLCBOdW1iZXIgZiAtPlxuICAgICAgICAgICAgICAodHJ5IExpc3QubnRoIGwgKGludF9vZl9mbG9hdCBmKSB3aXRoIF8gLT4gTmlsKVxuICAgICAgICAgICAgfCBTdHJpbmcgcywgTnVtYmVyIGYgLT5cbiAgICAgICAgICAgICAgbGV0IGkgPSBpbnRfb2ZfZmxvYXQgZiBpblxuICAgICAgICAgICAgICBpZiBpID49IDAgJiYgaSA8IFN0cmluZy5sZW5ndGggcyB0aGVuIFN0cmluZyAoU3RyaW5nLm1ha2UgMSBzLltpXSlcbiAgICAgICAgICAgICAgZWxzZSBOaWxcbiAgICAgICAgICAgIHwgXyAtPiAoSGFzaHRibC5maW5kIFN4X3ByaW1pdGl2ZXMucHJpbWl0aXZlcyBcIm50aFwiKSBbY29sbDsgbl0pXG4gICAgICAgIHwgMTcyICgqIE9QX0NPTlMgKikgLT5cbiAgICAgICAgICBsZXQgY29sbCA9IHBvcCB2bSBhbmQgeCA9IHBvcCB2bSBpblxuICAgICAgICAgIHB1c2ggdm0gKG1hdGNoIGNvbGwgd2l0aFxuICAgICAgICAgICAgfCBMaXN0IGwgLT4gTGlzdCAoeCA6OiBsKVxuICAgICAgICAgICAgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsIH0gLT4gTGlzdCAoeCA6OiBsKVxuICAgICAgICAgICAgfCBOaWwgLT4gTGlzdCBbeF1cbiAgICAgICAgICAgIHwgXyAtPiAoSGFzaHRibC5maW5kIFN4X3ByaW1pdGl2ZXMucHJpbWl0aXZlcyBcImNvbnNcIikgW3g7IGNvbGxdKVxuICAgICAgICB8IDE3MyAoKiBPUF9ORUcgKikgLT5cbiAgICAgICAgICBsZXQgdiA9IHBvcCB2bSBpblxuICAgICAgICAgIHB1c2ggdm0gKG1hdGNoIHYgd2l0aFxuICAgICAgICAgICAgfCBOdW1iZXIgeCAtPiBOdW1iZXIgKC0ueClcbiAgICAgICAgICAgIHwgXyAtPiAoSGFzaHRibC5maW5kIFN4X3ByaW1pdGl2ZXMucHJpbWl0aXZlcyBcIi1cIikgW3ZdKVxuICAgICAgICB8IDE3NCAoKiBPUF9JTkMgKikgLT5cbiAgICAgICAgICBsZXQgdiA9IHBvcCB2bSBpblxuICAgICAgICAgIHB1c2ggdm0gKG1hdGNoIHYgd2l0aFxuICAgICAgICAgICAgfCBOdW1iZXIgeCAtPiBOdW1iZXIgKHggKy4gMS4wKVxuICAgICAgICAgICAgfCBfIC0+IChIYXNodGJsLmZpbmQgU3hfcHJpbWl0aXZlcy5wcmltaXRpdmVzIFwiaW5jXCIpIFt2XSlcbiAgICAgICAgfCAxNzUgKCogT1BfREVDICopIC0+XG4gICAgICAgICAgbGV0IHYgPSBwb3Agdm0gaW5cbiAgICAgICAgICBwdXNoIHZtIChtYXRjaCB2IHdpdGhcbiAgICAgICAgICAgIHwgTnVtYmVyIHggLT4gTnVtYmVyICh4IC0uIDEuMClcbiAgICAgICAgICAgIHwgXyAtPiAoSGFzaHRibC5maW5kIFN4X3ByaW1pdGl2ZXMucHJpbWl0aXZlcyBcImRlY1wiKSBbdl0pXG5cbiAgICAgICAgfCBvcGNvZGUgLT5cbiAgICAgICAgICByYWlzZSAoRXZhbF9lcnJvciAoUHJpbnRmLnNwcmludGYgXCJWTTogdW5rbm93biBvcGNvZGUgJWQgYXQgaXA9JWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSAoZnJhbWUuaXAgLSAxKSkpXG4gICAgICAgIHdpdGggSW52YWxpZF9hcmd1bWVudCBtc2cgLT5cbiAgICAgICAgICBsZXQgZm5fbmFtZSA9IG1hdGNoIGZyYW1lLmNsb3N1cmUudm1fbmFtZSB3aXRoIFNvbWUgbiAtPiBuIHwgTm9uZSAtPiBcIj9cIiBpblxuICAgICAgICAgIHJhaXNlIChFdmFsX2Vycm9yIChQcmludGYuc3ByaW50ZlxuICAgICAgICAgICAgXCJWTTogJXMgYXQgaXA9JWQgb3A9JWQgaW4gJXMgKGJhc2U9JWQgc3A9JWQgYmNfbGVuPSVkIGNvbnN0cz0lZClcIlxuICAgICAgICAgICAgbXNnIHNhdmVkX2lwIG9wIGZuX25hbWUgZnJhbWUuYmFzZSB2bS5zcFxuICAgICAgICAgICAgKEFycmF5Lmxlbmd0aCBiYykgKEFycmF5Lmxlbmd0aCBjb25zdHMpKSkpXG4gICAgICBlbmRcbiAgZG9uZVxuXG4oKiogRXhlY3V0ZSBhIGNvbXBpbGVkIG1vZHVsZSAodG9wLWxldmVsIGJ5dGVjb2RlKS4gKilcbmxldCBleGVjdXRlX21vZHVsZSBjb2RlIGdsb2JhbHMgPVxuICBsZXQgY2wgPSB7IHZtX2NvZGUgPSBjb2RlOyB2bV91cHZhbHVlcyA9IFt8fF07IHZtX25hbWUgPSBTb21lIFwibW9kdWxlXCI7IHZtX2Vudl9yZWYgPSBnbG9iYWxzOyB2bV9jbG9zdXJlX2VudiA9IE5vbmUgfSBpblxuICBsZXQgdm0gPSBjcmVhdGUgZ2xvYmFscyBpblxuICBsZXQgZnJhbWUgPSB7IGNsb3N1cmUgPSBjbDsgaXAgPSAwOyBiYXNlID0gMDsgbG9jYWxfY2VsbHMgPSBIYXNodGJsLmNyZWF0ZSA0IH0gaW5cbiAgZm9yIF8gPSAwIHRvIGNvZGUudmNfbG9jYWxzIC0gMSBkbyBwdXNoIHZtIE5pbCBkb25lO1xuICB2bS5mcmFtZXMgPC0gW2ZyYW1lXTtcbiAgcnVuIHZtO1xuICBwb3Agdm1cblxuXG4oKiogezEgTGF6eSBKSVQgY29tcGlsYXRpb259ICopXG5cbigqKiBDb21waWxlIGEgbGFtYmRhIG9yIGNvbXBvbmVudCBib2R5IHRvIGJ5dGVjb2RlIHVzaW5nIHRoZSBTWCBjb21waWxlci5cbiAgICBJbnZva2VzIFtjb21waWxlXSBmcm9tIHNwZWMvY29tcGlsZXIuc3ggdmlhIHRoZSBDRUsgbWFjaGluZS5cbiAgICBSZXR1cm5zIGEgW3ZtX2Nsb3N1cmVdIHJlYWR5IGZvciBleGVjdXRpb24sIG9yIFtOb25lXSBvbiBmYWlsdXJlXG4gICAgKHNhZmUgZmFsbGJhY2sgdG8gQ0VLIGludGVycHJldGF0aW9uKS5cblxuICAgIFRoZSBjb21waWxhdGlvbiBjb3N0IGlzIGEgc2luZ2xlIENFSyBldmFsdWF0aW9uIG9mIHRoZSBjb21waWxlciDigJRcbiAgICBtaWNyb3NlY29uZHMgcGVyIGZ1bmN0aW9uLiBUaGUgcmVzdWx0IGlzIGNhY2hlZCBpbiB0aGUgbGFtYmRhL2NvbXBvbmVudFxuICAgIHJlY29yZCBzbyBzdWJzZXF1ZW50IGNhbGxzIGdvIHN0cmFpZ2h0IHRvIHRoZSBWTS4gKilcbmxldCBqaXRfY29tcGlsZV9sYW1iZGEgKGwgOiBsYW1iZGEpIGdsb2JhbHMgPVxuICBsZXQgZm5fbmFtZSA9IG1hdGNoIGwubF9uYW1lIHdpdGggU29tZSBuIC0+IG4gfCBOb25lIC0+IFwiPGFub24+XCIgaW5cbiAgdHJ5XG4gICAgbGV0IGNvbXBpbGVfZm4gPSB0cnkgSGFzaHRibC5maW5kIGdsb2JhbHMgXCJjb21waWxlXCJcbiAgICAgIHdpdGggTm90X2ZvdW5kIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiSklUOiBjb21waWxlciBub3QgbG9hZGVkXCIpIGluXG4gICAgKCogUmVjb25zdHJ1Y3QgdGhlIChmbiAocGFyYW1zKSBib2R5KSBmb3JtIHNvIHRoZSBjb21waWxlciBwcm9kdWNlc1xuICAgICAgIGEgcHJvcGVyIGNsb3N1cmUuIGwubF9ib2R5IGlzIHRoZSBpbm5lciBib2R5OyB3ZSBuZWVkIHRoZSBmdWxsXG4gICAgICAgZnVuY3Rpb24gZm9ybSB3aXRoIHBhcmFtcyBzbyB0aGUgY29tcGlsZWQgY29kZSBiaW5kcyB0aGVtLiAqKVxuICAgIGxldCBwYXJhbV9zeW1zID0gTGlzdCAoTGlzdC5tYXAgKGZ1biBzIC0+IFN5bWJvbCBzKSBsLmxfcGFyYW1zKSBpblxuICAgIGxldCBmbl9leHByID0gTGlzdCBbU3ltYm9sIFwiZm5cIjsgcGFyYW1fc3ltczsgbC5sX2JvZHldIGluXG4gICAgbGV0IHF1b3RlZCA9IExpc3QgW1N5bWJvbCBcInF1b3RlXCI7IGZuX2V4cHJdIGluXG4gICAgbGV0IHJlc3VsdCA9IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QgW2NvbXBpbGVfZm47IHF1b3RlZF0pIChFbnYgKG1ha2VfZW52ICgpKSkgaW5cbiAgICAoKiBJZiB0aGUgbGFtYmRhIGhhcyBjbG9zdXJlLWNhcHR1cmVkIHZhcmlhYmxlcywgbWVyZ2UgdGhlbSBpbnRvIGdsb2JhbHNcbiAgICAgICBzbyB0aGUgVk0gY2FuIGZpbmQgdGhlbSB2aWEgR0xPQkFMX0dFVC4gVGhlIGNvbXBpbGVyIGRvZXNuJ3Qga25vd1xuICAgICAgIGFib3V0IHRoZSBlbmNsb3Npbmcgc2NvcGUsIHNvIGNsb3N1cmUgdmFycyBnZXQgY29tcGlsZWQgYXMgZ2xvYmFscy4gKilcbiAgICBsZXQgZWZmZWN0aXZlX2dsb2JhbHMgPVxuICAgICAgbGV0IGNsb3N1cmUgPSBsLmxfY2xvc3VyZSBpblxuICAgICAgaWYgSGFzaHRibC5sZW5ndGggY2xvc3VyZS5iaW5kaW5ncyA9IDAgJiYgY2xvc3VyZS5wYXJlbnQgPSBOb25lIHRoZW5cbiAgICAgICAgZ2xvYmFscyAgKCogbm8gY2xvc3VyZSB2YXJzIOKAlCB1c2UgZ2xvYmFscyBkaXJlY3RseSAqKVxuICAgICAgZWxzZSBiZWdpblxuICAgICAgICAoKiBNZXJnZTogY2xvc3VyZSBiaW5kaW5ncyBsYXllcmVkIG9uIHRvcCBvZiBnbG9iYWxzLlxuICAgICAgICAgICBVc2UgYSBzaGFsbG93IGNvcHkgc28gd2UgZG9uJ3QgcG9sbHV0ZSB0aGUgcmVhbCBnbG9iYWxzLiAqKVxuICAgICAgICBsZXQgbWVyZ2VkID0gSGFzaHRibC5jb3B5IGdsb2JhbHMgaW5cbiAgICAgICAgbGV0IHJlYyBpbmplY3QgZW52ID1cbiAgICAgICAgICBIYXNodGJsLml0ZXIgKGZ1biBpZCB2IC0+IEhhc2h0YmwucmVwbGFjZSBtZXJnZWQgKFN4X3R5cGVzLnVuaW50ZXJuIGlkKSB2KSBlbnYuYmluZGluZ3M7XG4gICAgICAgICAgbWF0Y2ggZW52LnBhcmVudCB3aXRoIFNvbWUgcCAtPiBpbmplY3QgcCB8IE5vbmUgLT4gKClcbiAgICAgICAgaW5cbiAgICAgICAgaW5qZWN0IGNsb3N1cmU7XG4gICAgICAgIGxldCBuID0gSGFzaHRibC5sZW5ndGggbWVyZ2VkIC0gSGFzaHRibC5sZW5ndGggZ2xvYmFscyBpblxuICAgICAgICBpZiBuID4gMCB0aGVuXG4gICAgICAgICAgUHJpbnRmLmVwcmludGYgXCJbaml0XSAlczogaW5qZWN0ZWQgJWQgY2xvc3VyZSBiaW5kaW5nc1xcbiUhXCIgZm5fbmFtZSBuO1xuICAgICAgICBtZXJnZWRcbiAgICAgIGVuZFxuICAgIGluXG4gICAgKG1hdGNoIHJlc3VsdCB3aXRoXG4gICAgfCBEaWN0IGQgd2hlbiBIYXNodGJsLm1lbSBkIFwiYnl0ZWNvZGVcIiAtPlxuICAgICAgbGV0IG91dGVyX2NvZGUgPSBjb2RlX2Zyb21fdmFsdWUgcmVzdWx0IGluXG4gICAgICBsZXQgYmMgPSBvdXRlcl9jb2RlLnZjX2J5dGVjb2RlIGluXG4gICAgICBpZiBBcnJheS5sZW5ndGggYmMgPj0gNCAmJiBiYy4oMCkgPSA1MSAoKiBPUF9DTE9TVVJFICopIHRoZW4gYmVnaW5cbiAgICAgICAgbGV0IGlkeCA9IGJjLigxKSBsb3IgKGJjLigyKSBsc2wgOCkgaW5cbiAgICAgICAgaWYgaWR4IDwgQXJyYXkubGVuZ3RoIG91dGVyX2NvZGUudmNfY29uc3RhbnRzIHRoZW5cbiAgICAgICAgICBsZXQgaW5uZXJfdmFsID0gb3V0ZXJfY29kZS52Y19jb25zdGFudHMuKGlkeCkgaW5cbiAgICAgICAgICBsZXQgY29kZSA9IGNvZGVfZnJvbV92YWx1ZSBpbm5lcl92YWwgaW5cbiAgICAgICAgICBTb21lIHsgdm1fY29kZSA9IGNvZGU7IHZtX3VwdmFsdWVzID0gW3x8XTtcbiAgICAgICAgICAgICAgICAgdm1fbmFtZSA9IGwubF9uYW1lOyB2bV9lbnZfcmVmID0gZWZmZWN0aXZlX2dsb2JhbHM7IHZtX2Nsb3N1cmVfZW52ID0gU29tZSBsLmxfY2xvc3VyZSB9XG4gICAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgICBQcmludGYuZXByaW50ZiBcIltqaXRdIEZBSUwgJXM6IGNsb3N1cmUgaW5kZXggJWQgb3V0IG9mIGJvdW5kcyAocG9vbD0lZClcXG4lIVwiXG4gICAgICAgICAgICBmbl9uYW1lIGlkeCAoQXJyYXkubGVuZ3RoIG91dGVyX2NvZGUudmNfY29uc3RhbnRzKTtcblxuICAgICAgICAgIE5vbmVcbiAgICAgICAgZW5kXG4gICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICAoKiBOb3QgYSBjbG9zdXJlIOKAlCBjb25zdGFudCBleHByZXNzaW9uLCBhbGlhcywgb3Igc2ltcGxlIGNvbXB1dGF0aW9uLlxuICAgICAgICAgICBFeGVjdXRlIHRoZSBieXRlY29kZSBhcyBhIG1vZHVsZSB0byBnZXQgdGhlIHZhbHVlLCB0aGVuIHdyYXBcbiAgICAgICAgICAgYXMgYSBOYXRpdmVGbiBpZiBpdCdzIGNhbGxhYmxlIChzbyB0aGUgQ0VLIGNhbiBkaXNwYXRjaCB0byBpdCkuICopXG4gICAgICAgICh0cnlcbiAgICAgICAgICBsZXQgdmFsdWUgPSBleGVjdXRlX21vZHVsZSBvdXRlcl9jb2RlIGdsb2JhbHMgaW5cbiAgICAgICAgICBQcmludGYuZXByaW50ZiBcIltqaXRdIFJFU09MVkVEICVzOiAlcyAoYmNbMF09JWQpXFxuJSFcIlxuICAgICAgICAgICAgZm5fbmFtZSAodHlwZV9vZiB2YWx1ZSkgKGlmIEFycmF5Lmxlbmd0aCBiYyA+IDAgdGhlbiBiYy4oMCkgZWxzZSAtMSk7XG4gICAgICAgICAgKCogSWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzIGEgTmF0aXZlRm4sIHdlIGNhbid0IHdyYXAgaXQgYXMgYVxuICAgICAgICAgICAgIHZtX2Nsb3N1cmUg4oCUIGp1c3QgbGV0IHRoZSBDRUsgaGFuZGxlIGl0IGRpcmVjdGx5LiBSZXR1cm4gTm9uZVxuICAgICAgICAgICAgIHNvIHRoZSBsYW1iZGEgZmFsbHMgdGhyb3VnaCB0byBDRUssIHdoaWNoIHdpbGwgZmluZCB0aGVcbiAgICAgICAgICAgICByZXNvbHZlZCB2YWx1ZSBpbiB0aGUgZW52IG9uIG5leHQgbG9va3VwLiAqKVxuICAgICAgICAgIE5vbmVcbiAgICAgICAgd2l0aCBfIC0+XG4gICAgICAgICAgUHJpbnRmLmVwcmludGYgXCJbaml0XSBTS0lQICVzOiBub24tY2xvc3VyZSBleGVjdXRpb24gZmFpbGVkIChiY1swXT0lZCwgbGVuPSVkKVxcbiUhXCJcbiAgICAgICAgICAgIGZuX25hbWUgKGlmIEFycmF5Lmxlbmd0aCBiYyA+IDAgdGhlbiBiYy4oMCkgZWxzZSAtMSkgKEFycmF5Lmxlbmd0aCBiYyk7XG4gICAgICAgICAgTm9uZSlcbiAgICAgIGVuZFxuICAgIHwgXyAtPlxuICAgICAgUHJpbnRmLmVwcmludGYgXCJbaml0XSBGQUlMICVzOiBjb21waWxlciByZXR1cm5lZCAlc1xcbiUhXCIgZm5fbmFtZSAodHlwZV9vZiByZXN1bHQpO1xuICAgICAgTm9uZSlcbiAgd2l0aCBlIC0+XG4gICAgUHJpbnRmLmVwcmludGYgXCJbaml0XSBGQUlMICVzOiAlc1xcbiUhXCIgZm5fbmFtZSAoUHJpbnRleGMudG9fc3RyaW5nIGUpO1xuICAgIE5vbmVcblxuKCogV2lyZSB1cCBmb3J3YXJkIHJlZmVyZW5jZXMgKilcbmxldCAoKSA9IGppdF9jb21waWxlX3JlZiA6PSBqaXRfY29tcGlsZV9sYW1iZGFcbmxldCAoKSA9IF92bV9jYWxsX2Nsb3N1cmVfcmVmIDo9IChmdW4gY2wgYXJncyAtPiBjYWxsX2Nsb3N1cmUgY2wgYXJncyBjbC52bV9lbnZfcmVmKVxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2NoZWNrX2JvdW5kIiwiY2FtbF9tYWtlX3ZlY3QiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX21sX3N0cmluZ19sZW5ndGgiLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImNhbWxfY2FsbDMiLCJhMiIsImNhbWxfY2FsbDgiLCJhMyIsImE0IiwiYTUiLCJhNiIsImE3IiwiZ2xvYmFsX2RhdGEiLCJTeF9yZWYiLCJTeF9ydW50aW1lIiwiU3RkbGliIiwiU3hfdHlwZXMiLCJTeF9wcmltaXRpdmVzIiwiU3RkbGliX0hhc2h0YmwiLCJTdGRsaWJfTGlzdCIsIlN0ZGxpYl9TdHJpbmciLCJTdGRsaWJfUHJpbnRmIiwiU3RkbGliX0FycmF5IiwiU3RkbGliX1ByaW50ZXhjIiwiaml0X2NvbXBpbGVfcmVmIiwicGFyYW0iLCJqaXRfZmFpbGVkX3NlbnRpbmVsIiwiaXNfaml0X2ZhaWxlZCIsImNsIiwiY3JlYXRlIiwiZ2xvYmFscyIsInB1c2giLCJ2bSIsInYiLCJucyIsInBvcCIsInBlZWsiLCJyZWFkX3U4IiwicmVhZF91MTYiLCJsbyIsImhpIiwicmVhZF9pMTYiLCJjbG9zdXJlX3RvX3ZhbHVlIiwibWF0Y2giLCJhcmdzIiwibiIsInZtX2luc25fY291bnQiLCJ2bV9jYWxsX2NvdW50Iiwidm1fY2VrX2NvdW50Iiwidm1fcmVzZXRfY291bnRlcnMiLCJ2bV9yZXBvcnRfY291bnRlcnMiLCJwdXNoX2Nsb3N1cmVfZnJhbWUiLCJmcmFtZSIsImEiLCJmb3IkIiwiY3N0X2J5dGVjb2RlIiwiY29kZV9mcm9tX3ZhbHVlIiwiZCIsImwiLCJ4IiwiYmNfbGlzdCIsImVudHJpZXMiLCJjb25zdGFudHMiLCJlbnRyeSIsImVkIiwiYXJpdHkiLCJjYWxsX2Nsb3N1cmUiLCJlIiwidm1fY2FsbCIsImV4biIsImZuIiwicmVzdWx0IiwiY3N0X2F0X2lwIiwiY3N0X3NwIiwicnVuIiwicmVzdF9mcmFtZXMiLCJiYyIsImNvbnN0cyIsInNhdmVkX2lwIiwib3AiLCJjc3QiLCJzd2l0Y2hlciIsImlkeCIsIm5hbWUiLCJzIiwiY291bnQiLCJwYXJ0cyIsImIiLCJ5Iiwibm9ybSIsInhzIiwiY29sbCIsImkiLCJzbG90IiwiY2VsbCIsImlkIiwiY3N0X1ZNX3VuZGVmaW5lZCIsImVudiIsInAiLCJ3cml0dGVuIiwib2Zmc2V0IiwiYXJnYyIsImFyZ3NfbGlzdCIsImNvZGVfdmFsIiwiY29kZSIsInV2X2NvdW50IiwidXB2YWx1ZXMiLCJpc19sb2NhbCIsImluZGV4IiwiZXhpc3RpbmciLCJjIiwiZm5fdmFsIiwibXNnIiwiaXRlbXMiLCJrIiwia2V5IiwiZm5fbmFtZSIsImV4ZWN1dGVfbW9kdWxlIiwiY3N0X2ppdF9GQUlMIiwiaml0X2NvbXBpbGVfbGFtYmRhIiwiY29tcGlsZV9mbiIsInBhcmFtX3N5bXMiLCJmbl9leHByIiwiY2xvc3VyZSIsImVmZmVjdGl2ZV9nbG9iYWxzIiwibWVyZ2VkIiwib3V0ZXJfY29kZSIsImlubmVyX3ZhbCIsInZhbHVlIl0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLHdCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFdBQUFKLEdBQUFDLElBQUFFLElBQUFFO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQyxXQUFBTixHQUFBQyxJQUFBRSxJQUFBRSxJQUFBRSxJQUFBQyxJQUFB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Q2tCO0FBQUEsV0FBQXZCLE9BQ0w7QUFBQSxlQUNYO0FBQUE7QUFBQTtBQUFBLGlCQUdBO0FBQUE7QUFBQSxpQkFDb0Q7QUFBQTtBQUFBO0FBQUEsUUFJL0M7QUFBQTtBQUFBLFVBQUF3QixRQUtPO0FBQUEsY0FDWixvQkFDdUQ7QUFBQSxjQUE3QztBQUFBLFNBRFY7QUFBQTtBQUFBO0FBQUE7QUFBQSxjQUFBM0Q7QUFBQUE7QUFBQUEsVUFBQSxJQVFBO0FBQUEsa0NBQ3VDO0FBQUEsU0FEdkM7QUFBQSxpQkFDd0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGNBSVg7QUFBQSxNQUFqRTtBQUFBLGNBQWlGO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUFBQUY7QUFBQUEsU0FBQUEsSUQ5bEJ2Riw4QkNpbUJtRDtBQUFBLEtBQS9DO0FBQUEsS0FBcUU7QUFBQTtBQUFBO0FBQUEsR0EzakJXO0FBQUEsNkJBQUF2QyxJQUFBZ0IsTUFna0JuQyxvQ0FBa0M7QUFBQSxHQWhrQkM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFRHRDcEYiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjozNTE4OSwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiIuc3gub2Jqcy9qc29vL2RlZmF1bHQvc3guY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi93b3Jrc3BhY2Vfcm9vdC9saWIvc3hfc2NvcGUubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKiogU2NvcGUgc3RhY2tzIOKAlCBkeW5hbWljIHNjb3BlIGZvciByZW5kZXItdGltZSBlZmZlY3RzLlxuXG4gICAgUHJvdmlkZXMgc2NvcGUtcHVzaCEvcG9wIS9wZWVrLCBjb2xsZWN0IS9jb2xsZWN0ZWQvY2xlYXItY29sbGVjdGVkISxcbiAgICBzY29wZS1lbWl0IS9lbWl0dGVkL3Njb3BlLWVtaXR0ZWQsIGNvbnRleHQsIGFuZCBjb29raWUgYWNjZXNzLlxuXG4gICAgQWxsIGZ1bmN0aW9ucyBhcmUgcmVnaXN0ZXJlZCBhcyBwcmltaXRpdmVzIHNvIGJvdGggdGhlIENFSyBldmFsdWF0b3JcbiAgICBhbmQgdGhlIEpJVCBWTSBjYW4gZmluZCB0aGVtIGluIHRoZSBzYW1lIHBsYWNlLiAqKVxuXG5vcGVuIFN4X3R5cGVzXG5cbigqKiBUaGUgc2hhcmVkIHNjb3BlIHN0YWNrcyBoYXNodGFibGUuIEVhY2gga2V5IG1hcHMgdG8gYSBzdGFjayBvZiB2YWx1ZXMuXG4gICAgVXNlZCBieSBhc2VyIGZvciBzcHJlYWQvcHJvdmlkZS9lbWl0IHBhdHRlcm5zLCBDU1NYIGNvbGxlY3QvZmx1c2gsIGV0Yy4gKilcbmxldCBzY29wZV9zdGFja3MgOiAoc3RyaW5nLCB2YWx1ZSBsaXN0KSBIYXNodGJsLnQgPSBIYXNodGJsLmNyZWF0ZSA4XG5cbigqKiBSZXF1ZXN0IGNvb2tpZXMg4oCUIHNldCBieSB0aGUgUHl0aG9uIGJyaWRnZSBiZWZvcmUgZWFjaCByZW5kZXIuXG4gICAgZ2V0LWNvb2tpZSByZWFkcyBmcm9tIGhlcmU7IHNldC1jb29raWUgaXMgYSBuby1vcCBvbiB0aGUgc2VydmVyLiAqKVxubGV0IHJlcXVlc3RfY29va2llcyA6IChzdHJpbmcsIHN0cmluZykgSGFzaHRibC50ID0gSGFzaHRibC5jcmVhdGUgOFxuXG4oKiogQ2xlYXIgYWxsIHNjb3BlIHN0YWNrcy4gQ2FsbGVkIGJldHdlZW4gcmVxdWVzdHMgaWYgbmVlZGVkLiAqKVxubGV0IGNsZWFyX2FsbCAoKSA9IEhhc2h0YmwuY2xlYXIgc2NvcGVfc3RhY2tzXG5cbmxldCAoKSA9XG4gIGxldCByZWdpc3RlciA9IFN4X3ByaW1pdGl2ZXMucmVnaXN0ZXIgaW5cblxuICAoKiAtLS0gQ29va2llcyAtLS0gKilcblxuICByZWdpc3RlciBcImdldC1jb29raWVcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgbmFtZV0gLT5cbiAgICAgIChtYXRjaCBIYXNodGJsLmZpbmRfb3B0IHJlcXVlc3RfY29va2llcyBuYW1lIHdpdGhcbiAgICAgICB8IFNvbWUgdiAtPiBTdHJpbmcgdlxuICAgICAgIHwgTm9uZSAtPiBOaWwpXG4gICAgfCBfIC0+IE5pbCk7XG5cbiAgcmVnaXN0ZXIgXCJzZXQtY29va2llXCIgKGZ1biBfYXJncyAtPiBOaWwpO1xuXG4gICgqIC0tLSBDb3JlIHNjb3BlIHN0YWNrIG9wZXJhdGlvbnMgLS0tICopXG5cbiAgcmVnaXN0ZXIgXCJzY29wZS1wdXNoIVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBuYW1lOyB2YWx1ZV0gLT5cbiAgICAgIGxldCBzdGFjayA9IHRyeSBIYXNodGJsLmZpbmQgc2NvcGVfc3RhY2tzIG5hbWUgd2l0aCBOb3RfZm91bmQgLT4gW10gaW5cbiAgICAgIEhhc2h0YmwucmVwbGFjZSBzY29wZV9zdGFja3MgbmFtZSAodmFsdWUgOjogc3RhY2spOyBOaWxcbiAgICB8IF8gLT4gTmlsKTtcblxuICByZWdpc3RlciBcInNjb3BlLXBvcCFcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgbmFtZV0gLT5cbiAgICAgIGxldCBzdGFjayA9IHRyeSBIYXNodGJsLmZpbmQgc2NvcGVfc3RhY2tzIG5hbWUgd2l0aCBOb3RfZm91bmQgLT4gW10gaW5cbiAgICAgIChtYXRjaCBzdGFjayB3aXRoIF8gOjogcmVzdCAtPiBIYXNodGJsLnJlcGxhY2Ugc2NvcGVfc3RhY2tzIG5hbWUgcmVzdCB8IFtdIC0+ICgpKTsgTmlsXG4gICAgfCBfIC0+IE5pbCk7XG5cbiAgcmVnaXN0ZXIgXCJzY29wZS1wZWVrXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIG5hbWVdIC0+XG4gICAgICBsZXQgc3RhY2sgPSB0cnkgSGFzaHRibC5maW5kIHNjb3BlX3N0YWNrcyBuYW1lIHdpdGggTm90X2ZvdW5kIC0+IFtdIGluXG4gICAgICAobWF0Y2ggc3RhY2sgd2l0aCB2IDo6IF8gLT4gdiB8IFtdIC0+IE5pbClcbiAgICB8IF8gLT4gTmlsKTtcblxuICAoKiAtLS0gQ29udGV4dCAoc2NvcGUgbG9va3VwIHdpdGggb3B0aW9uYWwgZGVmYXVsdCkgLS0tICopXG5cbiAgcmVnaXN0ZXIgXCJjb250ZXh0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIG5hbWVdIHwgW1N0cmluZyBuYW1lOyBfXSAtPlxuICAgICAgbGV0IHN0YWNrID0gdHJ5IEhhc2h0YmwuZmluZCBzY29wZV9zdGFja3MgbmFtZSB3aXRoIE5vdF9mb3VuZCAtPiBbXSBpblxuICAgICAgKG1hdGNoIHN0YWNrLCBhcmdzIHdpdGhcbiAgICAgICB8IHYgOjogXywgXyAtPiB2XG4gICAgICAgfCBbXSwgW187IGRlZmF1bHRfdmFsXSAtPiBkZWZhdWx0X3ZhbFxuICAgICAgIHwgW10sIF8gLT4gTmlsKVxuICAgIHwgXyAtPiBOaWwpO1xuXG4gICgqIC0tLSBDb2xsZWN0IC8gY29sbGVjdGVkIC8gY2xlYXItY29sbGVjdGVkISAtLS0gKilcblxuICByZWdpc3RlciBcImNvbGxlY3QhXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIG5hbWU7IHZhbHVlXSAtPlxuICAgICAgbGV0IHN0YWNrID0gdHJ5IEhhc2h0YmwuZmluZCBzY29wZV9zdGFja3MgbmFtZSB3aXRoIE5vdF9mb3VuZCAtPiBbXSBpblxuICAgICAgKG1hdGNoIHN0YWNrIHdpdGhcbiAgICAgICB8IExpc3QgaXRlbXMgOjogcmVzdCAtPlxuICAgICAgICAgaWYgbm90IChMaXN0Lm1lbSB2YWx1ZSBpdGVtcykgdGhlblxuICAgICAgICAgICBIYXNodGJsLnJlcGxhY2Ugc2NvcGVfc3RhY2tzIG5hbWUgKExpc3QgKGl0ZW1zIEAgW3ZhbHVlXSkgOjogcmVzdClcbiAgICAgICB8IFtdIC0+XG4gICAgICAgICBIYXNodGJsLnJlcGxhY2Ugc2NvcGVfc3RhY2tzIG5hbWUgW0xpc3QgW3ZhbHVlXV1cbiAgICAgICB8IF8gOjogXyAtPiAoKSk7XG4gICAgICBOaWxcbiAgICB8IF8gLT4gTmlsKTtcblxuICByZWdpc3RlciBcImNvbGxlY3RlZFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBuYW1lXSAtPlxuICAgICAgbGV0IHN0YWNrID0gdHJ5IEhhc2h0YmwuZmluZCBzY29wZV9zdGFja3MgbmFtZSB3aXRoIE5vdF9mb3VuZCAtPiBbXSBpblxuICAgICAgKG1hdGNoIHN0YWNrIHdpdGggTGlzdCBpdGVtcyA6OiBfIC0+IExpc3QgaXRlbXMgfCBfIC0+IExpc3QgW10pXG4gICAgfCBfIC0+IExpc3QgW10pO1xuXG4gIHJlZ2lzdGVyIFwiY2xlYXItY29sbGVjdGVkIVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBuYW1lXSAtPlxuICAgICAgbGV0IHN0YWNrID0gdHJ5IEhhc2h0YmwuZmluZCBzY29wZV9zdGFja3MgbmFtZSB3aXRoIE5vdF9mb3VuZCAtPiBbXSBpblxuICAgICAgKG1hdGNoIHN0YWNrIHdpdGhcbiAgICAgICB8IF8gOjogcmVzdCAtPiBIYXNodGJsLnJlcGxhY2Ugc2NvcGVfc3RhY2tzIG5hbWUgKExpc3QgW10gOjogcmVzdClcbiAgICAgICB8IFtdIC0+IEhhc2h0YmwucmVwbGFjZSBzY29wZV9zdGFja3MgbmFtZSBbTGlzdCBbXV0pO1xuICAgICAgTmlsXG4gICAgfCBfIC0+IE5pbCk7XG5cbiAgKCogLS0tIEVtaXQgLyBlbWl0dGVkIChmb3Igc3ByZWFkIGF0dHJzIGluIGFkYXB0ZXItaHRtbC5zeCkgLS0tICopXG5cbiAgcmVnaXN0ZXIgXCJzY29wZS1lbWl0IVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBuYW1lOyB2YWx1ZV0gLT5cbiAgICAgIGxldCBzdGFjayA9IHRyeSBIYXNodGJsLmZpbmQgc2NvcGVfc3RhY2tzIG5hbWUgd2l0aCBOb3RfZm91bmQgLT4gW10gaW5cbiAgICAgIChtYXRjaCBzdGFjayB3aXRoXG4gICAgICAgfCBMaXN0IGl0ZW1zIDo6IHJlc3QgLT5cbiAgICAgICAgIEhhc2h0YmwucmVwbGFjZSBzY29wZV9zdGFja3MgbmFtZSAoTGlzdCAoaXRlbXMgQCBbdmFsdWVdKSA6OiByZXN0KVxuICAgICAgIHwgTmlsIDo6IHJlc3QgLT5cbiAgICAgICAgIEhhc2h0YmwucmVwbGFjZSBzY29wZV9zdGFja3MgbmFtZSAoTGlzdCBbdmFsdWVdIDo6IHJlc3QpXG4gICAgICAgfCBbXSAtPlxuICAgICAgICAgSGFzaHRibC5yZXBsYWNlIHNjb3BlX3N0YWNrcyBuYW1lIFtMaXN0IFt2YWx1ZV1dXG4gICAgICAgfCBfIDo6IF8gLT4gKCkpO1xuICAgICAgTmlsXG4gICAgfCBfIC0+IE5pbCk7XG5cbiAgcmVnaXN0ZXIgXCJlbWl0IVwiIChmdW4gYXJncyAtPlxuICAgICgqIEFsaWFzIGZvciBzY29wZS1lbWl0ISAqKVxuICAgIG1hdGNoIFN4X3ByaW1pdGl2ZXMuZ2V0X3ByaW1pdGl2ZSBcInNjb3BlLWVtaXQhXCIgd2l0aFxuICAgIHwgTmF0aXZlRm4gKF8sIGZuKSAtPiBmbiBhcmdzIHwgXyAtPiBOaWwpO1xuXG4gIHJlZ2lzdGVyIFwiZW1pdHRlZFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBuYW1lXSAtPlxuICAgICAgbGV0IHN0YWNrID0gdHJ5IEhhc2h0YmwuZmluZCBzY29wZV9zdGFja3MgbmFtZSB3aXRoIE5vdF9mb3VuZCAtPiBbXSBpblxuICAgICAgKG1hdGNoIHN0YWNrIHdpdGggTGlzdCBpdGVtcyA6OiBfIC0+IExpc3QgaXRlbXMgfCBfIC0+IExpc3QgW10pXG4gICAgfCBfIC0+IExpc3QgW10pO1xuXG4gIHJlZ2lzdGVyIFwic2NvcGUtZW1pdHRlZFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIFN4X3ByaW1pdGl2ZXMuZ2V0X3ByaW1pdGl2ZSBcImVtaXR0ZWRcIiB3aXRoXG4gICAgfCBOYXRpdmVGbiAoXywgZm4pIC0+IGZuIGFyZ3MgfCBfIC0+IExpc3QgW10pO1xuXG4gIHJlZ2lzdGVyIFwic2NvcGUtY29sbGVjdGVkXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggU3hfcHJpbWl0aXZlcy5nZXRfcHJpbWl0aXZlIFwiY29sbGVjdGVkXCIgd2l0aFxuICAgIHwgTmF0aXZlRm4gKF8sIGZuKSAtPiBmbiBhcmdzIHwgXyAtPiBMaXN0IFtdKTtcblxuICByZWdpc3RlciBcInNjb3BlLWNsZWFyLWNvbGxlY3RlZCFcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBTeF9wcmltaXRpdmVzLmdldF9wcmltaXRpdmUgXCJjbGVhci1jb2xsZWN0ZWQhXCIgd2l0aFxuICAgIHwgTmF0aXZlRm4gKF8sIGZuKSAtPiBmbiBhcmdzIHwgXyAtPiBOaWwpO1xuXG4gICgqIC0tLSBQcm92aWRlIGFsaWFzZXMgLS0tICopXG5cbiAgcmVnaXN0ZXIgXCJwcm92aWRlLXB1c2ghXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggU3hfcHJpbWl0aXZlcy5nZXRfcHJpbWl0aXZlIFwic2NvcGUtcHVzaCFcIiB3aXRoXG4gICAgfCBOYXRpdmVGbiAoXywgZm4pIC0+IGZuIGFyZ3MgfCBfIC0+IE5pbCk7XG5cbiAgcmVnaXN0ZXIgXCJwcm92aWRlLXBvcCFcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBTeF9wcmltaXRpdmVzLmdldF9wcmltaXRpdmUgXCJzY29wZS1wb3AhXCIgd2l0aFxuICAgIHwgTmF0aXZlRm4gKF8sIGZuKSAtPiBmbiBhcmdzIHwgXyAtPiBOaWwpXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiZ2xvYmFsX2RhdGEiLCJTeF9wcmltaXRpdmVzIiwiU3RkbGliX0hhc2h0YmwiLCJTdGRsaWIiLCJTdGRsaWJfTGlzdCIsInNjb3BlX3N0YWNrcyIsInJlcXVlc3RfY29va2llcyIsImNsZWFyX2FsbCIsInBhcmFtIiwicmVnaXN0ZXIiLCJhcmdzIiwibmFtZSIsIm1hdGNoIiwidiIsImNzdF9zY29wZV9wdXNoIiwidmFsdWUiLCJzdGFjayIsImV4biIsImNzdF9zY29wZV9wb3AiLCJyZXN0IiwiZGVmYXVsdF92YWwiLCJpdGVtcyIsImNzdF9jb2xsZWN0ZWQiLCJjc3RfY2xlYXJfY29sbGVjdGVkIiwiY3N0X3Njb3BlX2VtaXQiLCJmbiIsImNzdF9lbWl0dGVkIl0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsZUNZb0Q7QUFBQSxJQUFBQyxrQkFJRDtBQUFBLFlBQUFDLFVBQUFDO0FBQUFBLElBR2hDLGlEQUEwQjtBQUFBO0FBQUEsT0FBQUMsV0FIc0I7QUFBQSxHQVVqRTtBQUFBO0FBQUEsY0FBQUM7QUFBQUEsTUFDRTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBQUFDLE9BQUE7QUFBQSxTQUFBQyxRQUVTO0FBQUEsUUFBcUMsWUFFakM7QUFBQSxZQUFBQyxJQUZpQztBQUFBLFFBQy9CO0FBQUE7QUFBQTtBQUFBLE1BRVI7QUFBQSxLQUFHO0FBQUEsR0FFWixnQ0FBQUgsTUFBb0MsU0FBRztBQUFBLE9BQUFJLGlCRGxDekM7QUFBQSxHQ3NDRTtBQUFBO0FBQUEsY0FB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QUFBLFFBQWtCO0FBQUE7QUFBQTtBQUFBLE1BQ2xEO0FBQUEsS0FBTztBQUFBLFdBQUM7QUFBQSxHQUVqQjtBQUFBO0FBQUEsY0FBQVg7QUFBQUEsVUFBQUUsUUFDUTtBQUFBLE1BQXFDLHFEQUFBYSxLQUFBLFVBQ3JCLDJCQUFzQjtBQUFBO0FBQUEsTUFBUDtBQUFBLEtBQU87QUFBQSxXQUFDO0FBQUEsR0FFL0M7QUFBQTtBQUFBLGNBQUFmO0FBQUFBLFVBQUFFLFFBQ1E7QUFBQSxNQUF1QyxxREFBQWEsS0FBQSxVQUN2QiwyQkFBc0I7QUFBQTtBQUFBLE1BQVA7QUFBQSxLQUFPO0FBQUEsR0FFOUM7QUFBQTtBQUFBLGNBQUFmO0FBQUFBLFVBQUFFLFFBQ1E7QUFBQSxNQUE4QyxxREFBQWEsS0FBQSxVQUM5QiwyQkFBa0I7QUFBQTtBQUFBLE1BQUg7QUFBQSxLQUFHO0FBQUEsR0FJMUM7QUFBQTtBQUFBLGNBQUFmO0FBQUFBLFVBQUFFLFFBQ1E7QUFBQSxNQUF5QyxxREFBQWEsS0FBQSxVQUN6QiwyQkFBa0I7QUFBQTtBQUFBLE1BQUg7QUFBQSxLQUFHO0FBQUEsR0FFMUM7QUFBQTtBQUFBLGNBQUFmO0FBQUFBLFVBQUFFLFFBQ1E7QUFBQSxNQUF3QyxxREFBQWEsS0FBQSxVQUN4QiwyQkFBa0I7QUFBQTtBQUFBLE1BQUg7QUFBQSxLQUFHO0FBQUEsR0FBQztBQUFBO0FBQUE7QUFBQSxFRHpKN0MiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjozNTU0NiwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiIuc3gub2Jqcy9qc29vL2RlZmF1bHQvc3guY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi93b3Jrc3BhY2Vfcm9vdC9saWIvc3hfcGFyc2VyLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqIFMtZXhwcmVzc2lvbiBwYXJzZXIuXG5cbiAgICBSZWN1cnNpdmUgZGVzY2VudCBvdmVyIGEgc3RyaW5nLCBwcm9kdWNpbmcgW1N4X3R5cGVzLnZhbHVlIGxpc3RdLlxuICAgIFN1cHBvcnRzOiBsaXN0cywgZGljdHMsIHN5bWJvbHMsIGtleXdvcmRzLCBzdHJpbmdzICh3aXRoIGVzY2FwZXMpLFxuICAgIG51bWJlcnMsIGJvb2xlYW5zLCBuaWwsIGNvbW1lbnRzLCBxdW90ZS9xdWFzaXF1b3RlL3VucXVvdGUgc3VnYXIuICopXG5cbm9wZW4gU3hfdHlwZXNcblxudHlwZSBzdGF0ZSA9IHtcbiAgc3JjIDogc3RyaW5nO1xuICBsZW4gOiBpbnQ7XG4gIG11dGFibGUgcG9zIDogaW50O1xufVxuXG5sZXQgbWFrZV9zdGF0ZSBzcmMgPSB7IHNyYzsgbGVuID0gU3RyaW5nLmxlbmd0aCBzcmM7IHBvcyA9IDAgfVxuXG5sZXQgcGVlayBzID0gaWYgcy5wb3MgPCBzLmxlbiB0aGVuIFNvbWUgcy5zcmMuW3MucG9zXSBlbHNlIE5vbmVcbmxldCBhZHZhbmNlIHMgPSBzLnBvcyA8LSBzLnBvcyArIDFcbmxldCBhdF9lbmQgcyA9IHMucG9zID49IHMubGVuXG5cbmxldCBza2lwX3doaXRlc3BhY2VfYW5kX2NvbW1lbnRzIHMgPVxuICBsZXQgcmVjIGdvICgpID1cbiAgICBpZiBhdF9lbmQgcyB0aGVuICgpXG4gICAgZWxzZSBtYXRjaCBzLnNyYy5bcy5wb3NdIHdpdGhcbiAgICB8ICcgJyB8ICdcXHQnIHwgJ1xcbicgfCAnXFxyJyAtPiBhZHZhbmNlIHM7IGdvICgpXG4gICAgfCAnOycgLT5cbiAgICAgIHdoaWxlIHMucG9zIDwgcy5sZW4gJiYgcy5zcmMuW3MucG9zXSA8PiAnXFxuJyBkbyBhZHZhbmNlIHMgZG9uZTtcbiAgICAgIGlmIHMucG9zIDwgcy5sZW4gdGhlbiBhZHZhbmNlIHM7XG4gICAgICBnbyAoKVxuICAgIHwgXyAtPiAoKVxuICBpbiBnbyAoKVxuXG4oKiBDaGFyYWN0ZXIgY2xhc3NpZmljYXRpb24g4oCUIG1hdGNoZXMgc3BlYy9wYXJzZXIuc3ggaWRlbnQtc3RhcnQvaWRlbnQtY2hhci5cbiAgIGlkZW50LXN0YXJ0OiBhLXogQS1aIF8gfiAqICsgLSA+IDwgPSAvICEgPyAmXG4gICBpZGVudC1jaGFyOiAgaWRlbnQtc3RhcnQgcGx1cyAwLTkgLiA6IC8gIyAsICopXG5sZXQgaXNfaWRlbnRfc3RhcnQgPSBmdW5jdGlvblxuICB8ICdhJy4uJ3onIHwgJ0EnLi4nWicgfCAnXycgfCAnficgfCAnKicgfCAnKycgfCAnLSdcbiAgfCAnPicgfCAnPCcgfCAnPScgfCAnLycgfCAnIScgfCAnPycgfCAnJicgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2VcblxubGV0IGlzX2lkZW50X2NoYXIgPSBmdW5jdGlvblxuICB8IGMgd2hlbiBpc19pZGVudF9zdGFydCBjIC0+IHRydWVcbiAgfCAnMCcuLic5JyB8ICcuJyB8ICc6JyB8ICcjJyB8ICcsJyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuXG4oKiBTeW1ib2wgcmVhZGluZyB1c2VzIGlkZW50X2NoYXI7IGZpcnN0IGNoYXIgbXVzdCBiZSBpZGVudF9zdGFydCBvciBkaWdpdC9jb2xvbiAqKVxubGV0IGlzX3N5bWJvbF9jaGFyID0gaXNfaWRlbnRfY2hhclxuXG5sZXQgcmVhZF9zdHJpbmcgcyA9XG4gICgqIHMucG9zIGlzIG9uIHRoZSBvcGVuaW5nIHF1b3RlICopXG4gIGFkdmFuY2UgcztcbiAgbGV0IGJ1ZiA9IEJ1ZmZlci5jcmVhdGUgNjQgaW5cbiAgbGV0IHJlYyBnbyAoKSA9XG4gICAgaWYgYXRfZW5kIHMgdGhlbiByYWlzZSAoUGFyc2VfZXJyb3IgXCJVbnRlcm1pbmF0ZWQgc3RyaW5nXCIpO1xuICAgIGxldCBjID0gcy5zcmMuW3MucG9zXSBpblxuICAgIGFkdmFuY2UgcztcbiAgICBpZiBjID0gJ1wiJyB0aGVuIEJ1ZmZlci5jb250ZW50cyBidWZcbiAgICBlbHNlIGlmIGMgPSAnXFxcXCcgdGhlbiBiZWdpblxuICAgICAgaWYgYXRfZW5kIHMgdGhlbiByYWlzZSAoUGFyc2VfZXJyb3IgXCJVbnRlcm1pbmF0ZWQgc3RyaW5nIGVzY2FwZVwiKTtcbiAgICAgIGxldCBlc2MgPSBzLnNyYy5bcy5wb3NdIGluXG4gICAgICBhZHZhbmNlIHM7XG4gICAgICAobWF0Y2ggZXNjIHdpdGhcbiAgICAgICB8ICduJyAtPiBCdWZmZXIuYWRkX2NoYXIgYnVmICdcXG4nXG4gICAgICAgfCAndCcgLT4gQnVmZmVyLmFkZF9jaGFyIGJ1ZiAnXFx0J1xuICAgICAgIHwgJ3InIC0+IEJ1ZmZlci5hZGRfY2hhciBidWYgJ1xccidcbiAgICAgICB8ICdcIicgLT4gQnVmZmVyLmFkZF9jaGFyIGJ1ZiAnXCInXG4gICAgICAgfCAnXFxcXCcgLT4gQnVmZmVyLmFkZF9jaGFyIGJ1ZiAnXFxcXCdcbiAgICAgICB8ICd1JyAtPlxuICAgICAgICAgKCogXFx1WFhYWCDigJQgcmVhZCA0IGhleCBkaWdpdHMsIGVuY29kZSBhcyBVVEYtOCAqKVxuICAgICAgICAgaWYgcy5wb3MgKyA0ID4gcy5sZW4gdGhlbiByYWlzZSAoUGFyc2VfZXJyb3IgXCJJbmNvbXBsZXRlIFxcXFx1IGVzY2FwZVwiKTtcbiAgICAgICAgIGxldCBoZXggPSBTdHJpbmcuc3ViIHMuc3JjIHMucG9zIDQgaW5cbiAgICAgICAgIHMucG9zIDwtIHMucG9zICsgNDtcbiAgICAgICAgIGxldCBjb2RlID0gaW50X29mX3N0cmluZyAoXCIweFwiIF4gaGV4KSBpblxuICAgICAgICAgbGV0IHVidWYgPSBCdWZmZXIuY3JlYXRlIDQgaW5cbiAgICAgICAgIEJ1ZmZlci5hZGRfdXRmXzhfdWNoYXIgdWJ1ZiAoVWNoYXIub2ZfaW50IGNvZGUpO1xuICAgICAgICAgQnVmZmVyLmFkZF9zdHJpbmcgYnVmIChCdWZmZXIuY29udGVudHMgdWJ1ZilcbiAgICAgICB8ICdgJyAtPiBCdWZmZXIuYWRkX2NoYXIgYnVmICdgJ1xuICAgICAgIHwgXyAtPiBCdWZmZXIuYWRkX2NoYXIgYnVmICdcXFxcJzsgQnVmZmVyLmFkZF9jaGFyIGJ1ZiBlc2MpO1xuICAgICAgZ28gKClcbiAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgQnVmZmVyLmFkZF9jaGFyIGJ1ZiBjO1xuICAgICAgZ28gKClcbiAgICBlbmRcbiAgaW4gZ28gKClcblxubGV0IHJlYWRfc3ltYm9sIHMgPVxuICBsZXQgc3RhcnQgPSBzLnBvcyBpblxuICB3aGlsZSBzLnBvcyA8IHMubGVuICYmIGlzX3N5bWJvbF9jaGFyIHMuc3JjLltzLnBvc10gZG8gYWR2YW5jZSBzIGRvbmU7XG4gIFN0cmluZy5zdWIgcy5zcmMgc3RhcnQgKHMucG9zIC0gc3RhcnQpXG5cbmxldCB0cnlfbnVtYmVyIHN0ciA9XG4gIG1hdGNoIGZsb2F0X29mX3N0cmluZ19vcHQgc3RyIHdpdGhcbiAgfCBTb21lIG4gLT4gU29tZSAoTnVtYmVyIG4pXG4gIHwgTm9uZSAtPiBOb25lXG5cbmxldCByZWMgcmVhZF92YWx1ZSBzIDogdmFsdWUgPVxuICBza2lwX3doaXRlc3BhY2VfYW5kX2NvbW1lbnRzIHM7XG4gIGlmIGF0X2VuZCBzIHRoZW4gYmVnaW5cbiAgICBsZXQgbGluZSA9IHJlZiAxIGluXG4gICAgU3RyaW5nLml0ZXIgKGZ1biBjIC0+IGlmIGMgPSAnXFxuJyB0aGVuIGluY3IgbGluZSkgcy5zcmM7XG4gICAgcmFpc2UgKFBhcnNlX2Vycm9yIChQcmludGYuc3ByaW50ZiBcIlVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IGF0IGxpbmUgJWQgKHBvcyAlZClcIiAhbGluZSBzLnBvcykpXG4gIGVuZDtcbiAgbWF0Y2ggcy5zcmMuW3MucG9zXSB3aXRoXG4gIHwgJygnIC0+IHJlYWRfbGlzdCBzICcpJ1xuICB8ICdbJyAtPiByZWFkX2xpc3QgcyAnXSdcbiAgfCAneycgLT4gcmVhZF9kaWN0IHNcbiAgfCAnXCInIC0+IFN0cmluZyAocmVhZF9zdHJpbmcgcylcbiAgfCAnXFwnJyAtPiBhZHZhbmNlIHM7IExpc3QgW1N5bWJvbCBcInF1b3RlXCI7IHJlYWRfdmFsdWUgc11cbiAgfCAnYCcgLT4gYWR2YW5jZSBzOyBMaXN0IFtTeW1ib2wgXCJxdWFzaXF1b3RlXCI7IHJlYWRfdmFsdWUgc11cbiAgfCAnIycgd2hlbiBzLnBvcyArIDEgPCBzLmxlbiAmJiBzLnNyYy5bcy5wb3MgKyAxXSA9ICc7JyAtPlxuICAgICgqIERhdHVtIGNvbW1lbnQ6ICM7IGRpc2NhcmRzIG5leHQgZXhwcmVzc2lvbiAqKVxuICAgIGFkdmFuY2UgczsgYWR2YW5jZSBzO1xuICAgIGlnbm9yZSAocmVhZF92YWx1ZSBzKTtcbiAgICByZWFkX3ZhbHVlIHNcbiAgfCAnIycgd2hlbiBzLnBvcyArIDEgPCBzLmxlbiAmJiBzLnNyYy5bcy5wb3MgKyAxXSA9ICdcXCcnIC0+XG4gICAgKCogUXVvdGUgc2hvcnRoYW5kOiAjJ2V4cHIgLT4gKHF1b3RlIGV4cHIpICopXG4gICAgYWR2YW5jZSBzOyBhZHZhbmNlIHM7XG4gICAgTGlzdCBbU3ltYm9sIFwicXVvdGVcIjsgcmVhZF92YWx1ZSBzXVxuICB8ICcjJyB3aGVuIHMucG9zICsgMSA8IHMubGVuICYmIHMuc3JjLltzLnBvcyArIDFdID0gJ3wnIC0+XG4gICAgKCogUmF3IHN0cmluZzogI3wuLi58ICDigJQgZW5kcyBhdCBuZXh0IHwgKilcbiAgICBhZHZhbmNlIHM7IGFkdmFuY2UgcztcbiAgICBsZXQgYnVmID0gQnVmZmVyLmNyZWF0ZSA2NCBpblxuICAgIGxldCByZWMgZ28gKCkgPVxuICAgICAgaWYgYXRfZW5kIHMgdGhlbiByYWlzZSAoUGFyc2VfZXJyb3IgXCJVbnRlcm1pbmF0ZWQgcmF3IHN0cmluZ1wiKTtcbiAgICAgIGxldCBjID0gcy5zcmMuW3MucG9zXSBpblxuICAgICAgYWR2YW5jZSBzO1xuICAgICAgaWYgYyA9ICd8JyB0aGVuXG4gICAgICAgIFN0cmluZyAoQnVmZmVyLmNvbnRlbnRzIGJ1ZilcbiAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgQnVmZmVyLmFkZF9jaGFyIGJ1ZiBjO1xuICAgICAgICBnbyAoKVxuICAgICAgZW5kXG4gICAgaW4gZ28gKClcbiAgfCAnLCcgLT5cbiAgICAoKiBVbnF1b3RlIC8gc3BsaWNlLXVucXVvdGUg4oCUIG1hdGNoZXMgc3BlYzogLCBhbHdheXMgdHJpZ2dlcnMgdW5xdW90ZSAqKVxuICAgIGFkdmFuY2UgcztcbiAgICBpZiBzLnBvcyA8IHMubGVuICYmIHMuc3JjLltzLnBvc10gPSAnQCcgdGhlbiBiZWdpblxuICAgICAgYWR2YW5jZSBzO1xuICAgICAgTGlzdCBbU3ltYm9sIFwic3BsaWNlLXVucXVvdGVcIjsgcmVhZF92YWx1ZSBzXVxuICAgIGVuZCBlbHNlXG4gICAgICBMaXN0IFtTeW1ib2wgXCJ1bnF1b3RlXCI7IHJlYWRfdmFsdWUgc11cbiAgfCBfIC0+XG4gICAgYmVnaW5cbiAgICAgICgqIFN5bWJvbCwga2V5d29yZCwgbnVtYmVyLCBvciBib29sZWFuICopXG4gICAgICBsZXQgdG9rZW4gPSByZWFkX3N5bWJvbCBzIGluXG4gICAgICBpZiB0b2tlbiA9IFwiXCIgdGhlbiBiZWdpblxuICAgICAgICBsZXQgbGluZSA9IHJlZiAxIGFuZCBjb2wgPSByZWYgMSBpblxuICAgICAgICBmb3IgaSA9IDAgdG8gcy5wb3MgLSAxIGRvXG4gICAgICAgICAgaWYgcy5zcmMuW2ldID0gJ1xcbicgdGhlbiAoaW5jciBsaW5lOyBjb2wgOj0gMSkgZWxzZSBpbmNyIGNvbFxuICAgICAgICBkb25lO1xuICAgICAgICByYWlzZSAoUGFyc2VfZXJyb3IgKFByaW50Zi5zcHJpbnRmIFwiVW5leHBlY3RlZCBjaGFyOiAlYyBhdCBsaW5lICVkIGNvbCAlZCAocG9zICVkKVwiXG4gICAgICAgICAgcy5zcmMuW3MucG9zXSAhbGluZSAhY29sIHMucG9zKSlcbiAgICAgIGVuZDtcbiAgICAgIG1hdGNoIHRva2VuIHdpdGhcbiAgICAgIHwgXCJ0cnVlXCIgLT4gQm9vbCB0cnVlXG4gICAgICB8IFwiZmFsc2VcIiAtPiBCb29sIGZhbHNlXG4gICAgICB8IFwibmlsXCIgLT4gTmlsXG4gICAgICB8IF8gd2hlbiB0b2tlbi5bMF0gPSAnOicgLT5cbiAgICAgICAgS2V5d29yZCAoU3RyaW5nLnN1YiB0b2tlbiAxIChTdHJpbmcubGVuZ3RoIHRva2VuIC0gMSkpXG4gICAgICB8IF8gLT5cbiAgICAgICAgbWF0Y2ggdHJ5X251bWJlciB0b2tlbiB3aXRoXG4gICAgICAgIHwgU29tZSBuIC0+IG5cbiAgICAgICAgfCBOb25lIC0+IFN5bWJvbCB0b2tlblxuICAgIGVuZFxuXG5hbmQgcmVhZF9saXN0IHMgY2xvc2VfY2hhciA9XG4gIGFkdmFuY2UgczsgKCogc2tpcCBvcGVuaW5nIHBhcmVuL2JyYWNrZXQgKilcbiAgbGV0IGl0ZW1zID0gcmVmIFtdIGluXG4gIGxldCByZWMgZ28gKCkgPVxuICAgIHNraXBfd2hpdGVzcGFjZV9hbmRfY29tbWVudHMgcztcbiAgICBpZiBhdF9lbmQgcyB0aGVuIHJhaXNlIChQYXJzZV9lcnJvciBcIlVudGVybWluYXRlZCBsaXN0XCIpO1xuICAgIGlmIHMuc3JjLltzLnBvc10gPSBjbG9zZV9jaGFyIHRoZW4gYmVnaW5cbiAgICAgIGFkdmFuY2UgcztcbiAgICAgIExpc3QgKExpc3QucmV2ICFpdGVtcylcbiAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgaXRlbXMgOj0gcmVhZF92YWx1ZSBzIDo6ICFpdGVtcztcbiAgICAgIGdvICgpXG4gICAgZW5kXG4gIGluIGdvICgpXG5cbmFuZCByZWFkX2RpY3QgcyA9XG4gIGFkdmFuY2UgczsgKCogc2tpcCB7ICopXG4gIGxldCBkID0gbWFrZV9kaWN0ICgpIGluXG4gIGxldCByZWMgZ28gKCkgPVxuICAgIHNraXBfd2hpdGVzcGFjZV9hbmRfY29tbWVudHMgcztcbiAgICBpZiBhdF9lbmQgcyB0aGVuIHJhaXNlIChQYXJzZV9lcnJvciBcIlVudGVybWluYXRlZCBkaWN0XCIpO1xuICAgIGlmIHMuc3JjLltzLnBvc10gPSAnfScgdGhlbiBiZWdpblxuICAgICAgYWR2YW5jZSBzO1xuICAgICAgRGljdCBkXG4gICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgIGxldCBrZXkgPSByZWFkX3ZhbHVlIHMgaW5cbiAgICAgIGxldCBrZXlfc3RyID0gbWF0Y2gga2V5IHdpdGhcbiAgICAgICAgfCBLZXl3b3JkIGsgLT4ga1xuICAgICAgICB8IFN0cmluZyBrIC0+IGtcbiAgICAgICAgfCBTeW1ib2wgayAtPiBrXG4gICAgICAgIHwgXyAtPiByYWlzZSAoUGFyc2VfZXJyb3IgXCJEaWN0IGtleSBtdXN0IGJlIGtleXdvcmQsIHN0cmluZywgb3Igc3ltYm9sXCIpXG4gICAgICBpblxuICAgICAgbGV0IHYgPSByZWFkX3ZhbHVlIHMgaW5cbiAgICAgIGRpY3Rfc2V0IGQga2V5X3N0ciB2O1xuICAgICAgZ28gKClcbiAgICBlbmRcbiAgaW4gZ28gKClcblxuXG4oKiogUGFyc2UgYSBzdHJpbmcgaW50byBhIGxpc3Qgb2YgU1ggdmFsdWVzLiAqKVxubGV0IHBhcnNlX2FsbCBzcmMgPVxuICBsZXQgcyA9IG1ha2Vfc3RhdGUgc3JjIGluXG4gIGxldCByZXN1bHRzID0gcmVmIFtdIGluXG4gIGxldCByZWMgZ28gKCkgPVxuICAgIHNraXBfd2hpdGVzcGFjZV9hbmRfY29tbWVudHMgcztcbiAgICBpZiBhdF9lbmQgcyB0aGVuIExpc3QucmV2ICFyZXN1bHRzXG4gICAgZWxzZSBiZWdpblxuICAgICAgcmVzdWx0cyA6PSByZWFkX3ZhbHVlIHMgOjogIXJlc3VsdHM7XG4gICAgICBnbyAoKVxuICAgIGVuZFxuICBpbiBnbyAoKVxuXG4oKiogUGFyc2UgYSBmaWxlIGludG8gYSBsaXN0IG9mIFNYIHZhbHVlcy4gKilcbmxldCBwYXJzZV9maWxlIHBhdGggPVxuICBsZXQgaWMgPSBvcGVuX2luIHBhdGggaW5cbiAgbGV0IG4gPSBpbl9jaGFubmVsX2xlbmd0aCBpYyBpblxuICBsZXQgc3JjID0gcmVhbGx5X2lucHV0X3N0cmluZyBpYyBuIGluXG4gIGNsb3NlX2luIGljO1xuICBwYXJzZV9hbGwgc3JjXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfbWxfc3RyaW5nX2xlbmd0aCIsImNhbWxfc3RyaW5nX2dldCIsImNhbWxfY2FsbDIiLCJmIiwiYTAiLCJhMSIsImNhbWxfY2FsbDQiLCJhMiIsImEzIiwiZ2xvYmFsX2RhdGEiLCJTeF90eXBlcyIsIlN0ZGxpYl9CdWZmZXIiLCJTdGRsaWJfU3RyaW5nIiwiU3RkbGliX1ByaW50ZiIsIlN0ZGxpYl9MaXN0IiwiU3RkbGliIiwiU3RkbGliX1VjaGFyIiwibWFrZV9zdGF0ZSIsInNyYyIsInBlZWsiLCJzIiwiYWR2YW5jZSIsImF0X2VuZCIsInNraXBfd2hpdGVzcGFjZV9hbmRfY29tbWVudHMiLCJtYXRjaCIsImlzX2lkZW50X3N0YXJ0IiwicGFyYW0iLCJpc19pZGVudF9jaGFyIiwiYyIsInJlYWRfc3RyaW5nIiwiYnVmIiwiZXNjIiwiaGV4IiwiY29kZSIsInVidWYiLCJyZWFkX3N5bWJvbCIsInN0YXJ0IiwidHJ5X251bWJlciIsInN0ciIsIm4iLCJjc3RfcG9zIiwiY3N0X3F1b3RlIiwicmVhZF92YWx1ZSIsInRva2VuIiwiY29sIiwibGluZSIsImkiLCJyZWFkX2xpc3QiLCJjbG9zZV9jaGFyIiwiaXRlbXMiLCJyZWFkX2RpY3QiLCJkIiwia2V5Iiwia2V5X3N0ciIsInYiLCJwYXJzZV9hbGwiLCJyZXN1bHRzIiwicGFyc2VfZmlsZSIsInBhdGgiLCJpYyJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLHdCQUFBO0FBQUEsSUFBQUMsa0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQyxJQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUgsR0FBQUMsSUFBQUMsSUFBQUUsSUFBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLFdBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxZQUFBQyxXQUFBQyxLQ2NxQiwrQ0FB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QUFBLFVBRGlCO0FBQUEsS0FDYztBQUFBO0FBQUEsUUFBQUEsT0F0RHRCO0FBQUEsSUFFZjtBQUFBO0FBQUEsZUFBQWpCO0FBQUFBLFdBQUEsSUFBc0I7QUFBQTtBQUFBLE1BQTBCO0FBQUE7QUFBQTtBQUFBLFNBQzdCO0FBQUE7QUFBQTtBQUFBLElBQTBFO0FBQUEsR0ErRDFGO0FBQUEsWUFBQW1CLFVBQUEzQixHQUFBNEI7QUFBQUEsSUFHTDtBQUFBLFFBQUFDLFFBR0U7QUFBQTtBQUFBO0FBQUEsS0FDRztBQUFBLE1BQWM7QUFBQTtBQUFBLEtBQ2Q7QUFBQSxNQUNEO0FBQUEsTUFDSyw2Q0FBaUI7QUFBQTtBQUFBLEtBR3RCLFlBRFM7QUFBQTtBQUFBLEdBR0w7QUFBQSxZQUFBQyxVQUFBOUI7QUFBQUEsSUFHUjtBQUFBLFFBQUErQixJQUNRO0FBQUEsSUFFTjtBQUFBO0FBQUEsS0FDRztBQUFBLE1BQWM7QUFBQTtBQUFBLEtBQ2Qsd0NBQ0QsWUFBUztBQUFBLFNBQUFDLE1BR0M7QUFBQSxLQUNWO0FBQUEsVUFBQUMsVUFBQSxRQUFBQyxJQU1RO0FBQUEsTUFDUjtBQUFBO0FBQUE7QUFBQSxLQUhTO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FNTDtBQUFBLFlBQUFDLFVBQUFyQztBQUFBQSxRQUFBRSxJQUtBLGlCQUFBb0MsVUFHTjtBQUFBO0FBQUE7QUFBQSxLQUNHLGNBQWMsMENBS1g7QUFBQSxLQUZKLGNBRFc7QUFBQTtBQUFBLEdBR1A7QUFBQSxZQUFBQyxXQUFBQztBQUFBQTtBQUFBQSxLQUFBQyxLQUlDO0FBQUEsS0FBQXBCLElBQ0Q7QUFBQSxLQUFBckIsTUFDRTtBQUFBLElBQ1Y7QUFBQSxJQUFXLHFCQUNFO0FBQUE7QUFBQSxHRC9OZiIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjM1OTQ4LCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6Ii5zeC5vYmpzL2pzb28vZGVmYXVsdC9zeC5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3dvcmtzcGFjZV9yb290L2xpYi9zeF9yZW5kZXIubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKiogSFRNTCByZW5kZXJlciBmb3IgU1ggdmFsdWVzLlxuXG4gICAgRXh0cmFjdGVkIGZyb20gcnVuX3Rlc3RzLm1sIOKAlCByZW5kZXJzIGFuIFNYIGV4cHJlc3Npb24gdHJlZSB0byBhblxuICAgIEhUTUwgc3RyaW5nLCBleHBhbmRpbmcgY29tcG9uZW50cyBhbmQgbWFjcm9zIGFsb25nIHRoZSB3YXkuXG5cbiAgICBEZXBlbmRzIG9uIFtTeF9yZWYuZXZhbF9leHByXSBmb3IgZXZhbHVhdGluZyBzdWItZXhwcmVzc2lvbnNcbiAgICBkdXJpbmcgcmVuZGVyaW5nIChrZXl3b3JkIGFyZyB2YWx1ZXMsIGNvbmRpdGlvbmFscywgZXRjLikuICopXG5cbm9wZW4gU3hfdHlwZXNcblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuKCogVGFnIC8gYXR0cmlidXRlIHJlZ2lzdHJpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcblxubGV0IGh0bWxfdGFncyA9IFtcbiAgXCJodG1sXCI7IFwiaGVhZFwiOyBcImJvZHlcIjsgXCJ0aXRsZVwiOyBcIm1ldGFcIjsgXCJsaW5rXCI7IFwic2NyaXB0XCI7IFwic3R5bGVcIjsgXCJub3NjcmlwdFwiO1xuICBcImhlYWRlclwiOyBcIm5hdlwiOyBcIm1haW5cIjsgXCJzZWN0aW9uXCI7IFwiYXJ0aWNsZVwiOyBcImFzaWRlXCI7IFwiZm9vdGVyXCI7XG4gIFwiaDFcIjsgXCJoMlwiOyBcImgzXCI7IFwiaDRcIjsgXCJoNVwiOyBcImg2XCI7IFwiaGdyb3VwXCI7XG4gIFwiZGl2XCI7IFwicFwiOyBcImJsb2NrcXVvdGVcIjsgXCJwcmVcIjsgXCJmaWd1cmVcIjsgXCJmaWdjYXB0aW9uXCI7IFwiYWRkcmVzc1wiOyBcImhyXCI7XG4gIFwidWxcIjsgXCJvbFwiOyBcImxpXCI7IFwiZGxcIjsgXCJkdFwiOyBcImRkXCI7IFwibWVudVwiO1xuICBcImFcIjsgXCJzcGFuXCI7IFwiZW1cIjsgXCJzdHJvbmdcIjsgXCJzbWFsbFwiOyBcImJcIjsgXCJpXCI7IFwidVwiOyBcInNcIjsgXCJzdWJcIjsgXCJzdXBcIjtcbiAgXCJtYXJrXCI7IFwiZGVsXCI7IFwiaW5zXCI7IFwicVwiOyBcImNpdGVcIjsgXCJkZm5cIjsgXCJhYmJyXCI7IFwiY29kZVwiOyBcInZhclwiOyBcInNhbXBcIjtcbiAgXCJrYmRcIjsgXCJkYXRhXCI7IFwidGltZVwiOyBcInJ1YnlcIjsgXCJydFwiOyBcInJwXCI7IFwiYmRpXCI7IFwiYmRvXCI7IFwid2JyXCI7IFwiYnJcIjtcbiAgXCJ0YWJsZVwiOyBcInRoZWFkXCI7IFwidGJvZHlcIjsgXCJ0Zm9vdFwiOyBcInRyXCI7IFwidGhcIjsgXCJ0ZFwiOyBcImNhcHRpb25cIjsgXCJjb2xncm91cFwiOyBcImNvbFwiO1xuICBcImZvcm1cIjsgXCJpbnB1dFwiOyBcInRleHRhcmVhXCI7IFwic2VsZWN0XCI7IFwib3B0aW9uXCI7IFwib3B0Z3JvdXBcIjsgXCJidXR0b25cIjsgXCJsYWJlbFwiO1xuICBcImZpZWxkc2V0XCI7IFwibGVnZW5kXCI7IFwiZGF0YWxpc3RcIjsgXCJvdXRwdXRcIjsgXCJwcm9ncmVzc1wiOyBcIm1ldGVyXCI7XG4gIFwiZGV0YWlsc1wiOyBcInN1bW1hcnlcIjsgXCJkaWFsb2dcIjtcbiAgXCJpbWdcIjsgXCJ2aWRlb1wiOyBcImF1ZGlvXCI7IFwic291cmNlXCI7IFwicGljdHVyZVwiOyBcImNhbnZhc1wiOyBcImlmcmFtZVwiOyBcImVtYmVkXCI7IFwib2JqZWN0XCI7IFwicGFyYW1cIjtcbiAgXCJzdmdcIjsgXCJwYXRoXCI7IFwiY2lyY2xlXCI7IFwicmVjdFwiOyBcImxpbmVcIjsgXCJwb2x5bGluZVwiOyBcInBvbHlnb25cIjsgXCJlbGxpcHNlXCI7XG4gIFwiZ1wiOyBcImRlZnNcIjsgXCJ1c2VcIjsgXCJ0ZXh0XCI7IFwidHNwYW5cIjsgXCJjbGlwUGF0aFwiOyBcIm1hc2tcIjsgXCJwYXR0ZXJuXCI7XG4gIFwibGluZWFyR3JhZGllbnRcIjsgXCJyYWRpYWxHcmFkaWVudFwiOyBcInN0b3BcIjsgXCJmaWx0ZXJcIjsgXCJmZUJsZW5kXCI7IFwiZmVGbG9vZFwiO1xuICBcImZlR2F1c3NpYW5CbHVyXCI7IFwiZmVPZmZzZXRcIjsgXCJmZU1lcmdlXCI7IFwiZmVNZXJnZU5vZGVcIjsgXCJmZUNvbXBvc2l0ZVwiO1xuICBcInRlbXBsYXRlXCI7IFwic2xvdFwiO1xuXVxuXG5sZXQgdm9pZF9lbGVtZW50cyA9IFtcbiAgXCJhcmVhXCI7IFwiYmFzZVwiOyBcImJyXCI7IFwiY29sXCI7IFwiZW1iZWRcIjsgXCJoclwiOyBcImltZ1wiOyBcImlucHV0XCI7XG4gIFwibGlua1wiOyBcIm1ldGFcIjsgXCJwYXJhbVwiOyBcInNvdXJjZVwiOyBcInRyYWNrXCI7IFwid2JyXCJcbl1cblxubGV0IGJvb2xlYW5fYXR0cnMgPSBbXG4gIFwiYXN5bmNcIjsgXCJhdXRvZm9jdXNcIjsgXCJhdXRvcGxheVwiOyBcImNoZWNrZWRcIjsgXCJjb250cm9sc1wiOyBcImRlZmF1bHRcIjtcbiAgXCJkZWZlclwiOyBcImRpc2FibGVkXCI7IFwiZm9ybW5vdmFsaWRhdGVcIjsgXCJoaWRkZW5cIjsgXCJpbmVydFwiOyBcImlzbWFwXCI7XG4gIFwibG9vcFwiOyBcIm11bHRpcGxlXCI7IFwibXV0ZWRcIjsgXCJub21vZHVsZVwiOyBcIm5vdmFsaWRhdGVcIjsgXCJvcGVuXCI7XG4gIFwicGxheXNpbmxpbmVcIjsgXCJyZWFkb25seVwiOyBcInJlcXVpcmVkXCI7IFwicmV2ZXJzZWRcIjsgXCJzZWxlY3RlZFwiXG5dXG5cbmxldCBpc19odG1sX3RhZyBuYW1lID0gTGlzdC5tZW0gbmFtZSBodG1sX3RhZ3NcbmxldCBpc192b2lkIG5hbWUgPSBMaXN0Lm1lbSBuYW1lIHZvaWRfZWxlbWVudHNcbmxldCBpc19ib29sZWFuX2F0dHIgbmFtZSA9IExpc3QubWVtIG5hbWUgYm9vbGVhbl9hdHRyc1xuXG5cbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcbigqIEhUTUwgZXNjYXBpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICopXG5cbmxldCBlc2NhcGVfaHRtbCBzID1cbiAgbGV0IGJ1ZiA9IEJ1ZmZlci5jcmVhdGUgKFN0cmluZy5sZW5ndGggcykgaW5cbiAgU3RyaW5nLml0ZXIgKGZ1bmN0aW9uXG4gICAgfCAnJicgLT4gQnVmZmVyLmFkZF9zdHJpbmcgYnVmIFwiJmFtcDtcIlxuICAgIHwgJzwnIC0+IEJ1ZmZlci5hZGRfc3RyaW5nIGJ1ZiBcIiZsdDtcIlxuICAgIHwgJz4nIC0+IEJ1ZmZlci5hZGRfc3RyaW5nIGJ1ZiBcIiZndDtcIlxuICAgIHwgJ1wiJyAtPiBCdWZmZXIuYWRkX3N0cmluZyBidWYgXCImcXVvdDtcIlxuICAgIHwgYyAtPiBCdWZmZXIuYWRkX2NoYXIgYnVmIGMpIHM7XG4gIEJ1ZmZlci5jb250ZW50cyBidWZcblxuXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICopXG4oKiBBdHRyaWJ1dGUgcmVuZGVyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuXG5sZXQgcmVuZGVyX2F0dHJzIGF0dHJzID1cbiAgbGV0IGJ1ZiA9IEJ1ZmZlci5jcmVhdGUgNjQgaW5cbiAgSGFzaHRibC5pdGVyIChmdW4gayB2IC0+XG4gICAgaWYgaXNfYm9vbGVhbl9hdHRyIGsgdGhlbiBiZWdpblxuICAgICAgaWYgc3hfdHJ1dGh5IHYgdGhlbiBiZWdpblxuICAgICAgICBCdWZmZXIuYWRkX2NoYXIgYnVmICcgJztcbiAgICAgICAgQnVmZmVyLmFkZF9zdHJpbmcgYnVmIGtcbiAgICAgIGVuZFxuICAgIGVuZCBlbHNlIGlmIG5vdCAoaXNfbmlsIHYpIHRoZW4gYmVnaW5cbiAgICAgIEJ1ZmZlci5hZGRfY2hhciBidWYgJyAnO1xuICAgICAgQnVmZmVyLmFkZF9zdHJpbmcgYnVmIGs7XG4gICAgICBCdWZmZXIuYWRkX3N0cmluZyBidWYgXCI9XFxcIlwiO1xuICAgICAgQnVmZmVyLmFkZF9zdHJpbmcgYnVmIChlc2NhcGVfaHRtbCAodmFsdWVfdG9fc3RyaW5nIHYpKTtcbiAgICAgIEJ1ZmZlci5hZGRfY2hhciBidWYgJ1wiJ1xuICAgIGVuZCkgYXR0cnM7XG4gIEJ1ZmZlci5jb250ZW50cyBidWZcblxuXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICopXG4oKiBIVE1MIHJlbmRlcmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuXG4oKiBGb3J3YXJkIHJlZiDigJQgcmVzb2x2ZWQgYXQgc2V0dXAgdGltZSAqKVxubGV0IHJlbmRlcl90b19odG1sX3JlZiA6ICh2YWx1ZSAtPiBlbnYgLT4gc3RyaW5nKSByZWYgPVxuICByZWYgKGZ1biBfZXhwciBfZW52IC0+IFwiXCIpXG5cbmxldCByZW5kZXJfdG9faHRtbCBleHByIGVudiA9ICFyZW5kZXJfdG9faHRtbF9yZWYgZXhwciBlbnZcblxubGV0IHJlbmRlcl9jaGlsZHJlbiBjaGlsZHJlbiBlbnYgPVxuICBTdHJpbmcuY29uY2F0IFwiXCIgKExpc3QubWFwIChmdW4gYyAtPiByZW5kZXJfdG9faHRtbCBjIGVudikgY2hpbGRyZW4pXG5cbigqKiBQYXJzZSBrZXl3b3JkIGF0dHJzIGFuZCBwb3NpdGlvbmFsIGNoaWxkcmVuIGZyb20gYW4gZWxlbWVudCBjYWxsJ3MgYXJncy5cbiAgICBBdHRycyBhcmUgZXZhbHVhdGVkOyBjaGlsZHJlbiBhcmUgcmV0dXJuZWQgVU5FVkFMVUFURUQgZm9yIHJlbmRlciBkaXNwYXRjaC4gKilcbmxldCBwYXJzZV9lbGVtZW50X2FyZ3MgYXJncyBlbnYgPVxuICBsZXQgYXR0cnMgPSBIYXNodGJsLmNyZWF0ZSA4IGluXG4gIGxldCBjaGlsZHJlbiA9IHJlZiBbXSBpblxuICBsZXQgc2tpcCA9IHJlZiBmYWxzZSBpblxuICBsZXQgbGVuID0gTGlzdC5sZW5ndGggYXJncyBpblxuICBMaXN0Lml0ZXJpIChmdW4gaWR4IGFyZyAtPlxuICAgIGlmICFza2lwIHRoZW4gc2tpcCA6PSBmYWxzZVxuICAgIGVsc2UgbWF0Y2ggYXJnIHdpdGhcbiAgICB8IEtleXdvcmQgayB3aGVuIGlkeCArIDEgPCBsZW4gLT5cbiAgICAgIGxldCB2ID0gU3hfcmVmLmV2YWxfZXhwciAoTGlzdC5udGggYXJncyAoaWR4ICsgMSkpIChFbnYgZW52KSBpblxuICAgICAgSGFzaHRibC5yZXBsYWNlIGF0dHJzIGsgdjtcbiAgICAgIHNraXAgOj0gdHJ1ZVxuICAgIHwgU3ByZWFkIHBhaXJzIC0+XG4gICAgICBMaXN0Lml0ZXIgKGZ1biAoaywgdikgLT4gSGFzaHRibC5yZXBsYWNlIGF0dHJzIGsgdikgcGFpcnNcbiAgICB8IF8gLT5cbiAgICAgIGNoaWxkcmVuIDo9IGFyZyA6OiAhY2hpbGRyZW5cbiAgKSBhcmdzO1xuICAoYXR0cnMsIExpc3QucmV2ICFjaGlsZHJlbilcblxubGV0IHJlbmRlcl9odG1sX2VsZW1lbnQgdGFnIGFyZ3MgZW52ID1cbiAgbGV0IChhdHRycywgY2hpbGRyZW4pID0gcGFyc2VfZWxlbWVudF9hcmdzIGFyZ3MgZW52IGluXG4gIGxldCBhdHRyX3N0ciA9IHJlbmRlcl9hdHRycyBhdHRycyBpblxuICBpZiBpc192b2lkIHRhZyB0aGVuXG4gICAgXCI8XCIgXiB0YWcgXiBhdHRyX3N0ciBeIFwiIC8+XCJcbiAgZWxzZVxuICAgIGxldCBjb250ZW50ID0gU3RyaW5nLmNvbmNhdCBcIlwiXG4gICAgICAoTGlzdC5tYXAgKGZ1biBjIC0+IHJlbmRlcl90b19odG1sIGMgZW52KSBjaGlsZHJlbikgaW5cbiAgICBcIjxcIiBeIHRhZyBeIGF0dHJfc3RyIF4gXCI+XCIgXiBjb250ZW50IF4gXCI8L1wiIF4gdGFnIF4gXCI+XCJcblxubGV0IHJlbmRlcl9jb21wb25lbnQgY29tcCBhcmdzIGVudiA9XG4gIG1hdGNoIGNvbXAgd2l0aFxuICB8IENvbXBvbmVudCBjIC0+XG4gICAgbGV0IGt3YXJncyA9IEhhc2h0YmwuY3JlYXRlIDggaW5cbiAgICBsZXQgY2hpbGRyZW5fZXhwcnMgPSByZWYgW10gaW5cbiAgICBsZXQgc2tpcCA9IHJlZiBmYWxzZSBpblxuICAgIGxldCBsZW4gPSBMaXN0Lmxlbmd0aCBhcmdzIGluXG4gICAgTGlzdC5pdGVyaSAoZnVuIGlkeCBhcmcgLT5cbiAgICAgIGlmICFza2lwIHRoZW4gc2tpcCA6PSBmYWxzZVxuICAgICAgZWxzZSBtYXRjaCBhcmcgd2l0aFxuICAgICAgfCBLZXl3b3JkIGsgd2hlbiBpZHggKyAxIDwgbGVuIC0+XG4gICAgICAgIGxldCB2ID0gU3hfcmVmLmV2YWxfZXhwciAoTGlzdC5udGggYXJncyAoaWR4ICsgMSkpIChFbnYgZW52KSBpblxuICAgICAgICBIYXNodGJsLnJlcGxhY2Uga3dhcmdzIGsgdjtcbiAgICAgICAgc2tpcCA6PSB0cnVlXG4gICAgICB8IF8gLT5cbiAgICAgICAgY2hpbGRyZW5fZXhwcnMgOj0gYXJnIDo6ICFjaGlsZHJlbl9leHByc1xuICAgICkgYXJncztcbiAgICBsZXQgY2hpbGRyZW4gPSBMaXN0LnJldiAhY2hpbGRyZW5fZXhwcnMgaW5cbiAgICBsZXQgbG9jYWwgPSBlbnZfbWVyZ2UgYy5jX2Nsb3N1cmUgZW52IGluXG4gICAgTGlzdC5pdGVyIChmdW4gcCAtPlxuICAgICAgbGV0IHYgPSBtYXRjaCBIYXNodGJsLmZpbmRfb3B0IGt3YXJncyBwIHdpdGggU29tZSB2IC0+IHYgfCBOb25lIC0+IE5pbCBpblxuICAgICAgaWdub3JlIChlbnZfYmluZCBsb2NhbCBwIHYpXG4gICAgKSBjLmNfcGFyYW1zO1xuICAgIGlmIGMuY19oYXNfY2hpbGRyZW4gdGhlbiBiZWdpblxuICAgICAgbGV0IHJlbmRlcmVkX2NoaWxkcmVuID0gU3RyaW5nLmNvbmNhdCBcIlwiXG4gICAgICAgIChMaXN0Lm1hcCAoZnVuIGMgLT4gcmVuZGVyX3RvX2h0bWwgYyBlbnYpIGNoaWxkcmVuKSBpblxuICAgICAgaWdub3JlIChlbnZfYmluZCBsb2NhbCBcImNoaWxkcmVuXCIgKFJhd0hUTUwgcmVuZGVyZWRfY2hpbGRyZW4pKVxuICAgIGVuZDtcbiAgICByZW5kZXJfdG9faHRtbCBjLmNfYm9keSBsb2NhbFxuICB8IF8gLT4gXCJcIlxuXG5sZXQgZXhwYW5kX21hY3JvIChtIDogbWFjcm8pIGFyZ3MgX2VudiA9XG4gIGxldCBsb2NhbCA9IGVudl9leHRlbmQgbS5tX2Nsb3N1cmUgaW5cbiAgbGV0IHBhcmFtcyA9IG0ubV9wYXJhbXMgaW5cbiAgbGV0IHJlYyBiaW5kX3BhcmFtcyBwcyBhcycgPVxuICAgIG1hdGNoIHBzLCBhcycgd2l0aFxuICAgIHwgW10sIHJlc3QgLT5cbiAgICAgIChtYXRjaCBtLm1fcmVzdF9wYXJhbSB3aXRoXG4gICAgICAgfCBTb21lIHJwIC0+IGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgcnAgKExpc3QgcmVzdCkpXG4gICAgICAgfCBOb25lIC0+ICgpKVxuICAgIHwgcCA6OiBwc19yZXN0LCBhIDo6IGFzX3Jlc3QgLT5cbiAgICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgcCBhKTtcbiAgICAgIGJpbmRfcGFyYW1zIHBzX3Jlc3QgYXNfcmVzdFxuICAgIHwgXyA6OiBfLCBbXSAtPlxuICAgICAgTGlzdC5pdGVyIChmdW4gcCAtPiBpZ25vcmUgKGVudl9iaW5kIGxvY2FsIHAgTmlsKSkgKExpc3QucmV2IHBzKVxuICBpblxuICBiaW5kX3BhcmFtcyBwYXJhbXMgYXJncztcbiAgU3hfcmVmLmV2YWxfZXhwciBtLm1fYm9keSAoRW52IGxvY2FsKVxuXG5sZXQgcmVjIGRvX3JlbmRlcl90b19odG1sIChleHByIDogdmFsdWUpIChlbnYgOiBlbnYpIDogc3RyaW5nID1cbiAgbWF0Y2ggZXhwciB3aXRoXG4gIHwgTmlsIC0+IFwiXCJcbiAgfCBCb29sIHRydWUgLT4gXCJ0cnVlXCJcbiAgfCBCb29sIGZhbHNlIC0+IFwiZmFsc2VcIlxuICB8IE51bWJlciBuIC0+XG4gICAgaWYgRmxvYXQuaXNfaW50ZWdlciBuIHRoZW4gc3RyaW5nX29mX2ludCAoaW50X29mX2Zsb2F0IG4pXG4gICAgZWxzZSBQcmludGYuc3ByaW50ZiBcIiVnXCIgblxuICB8IFN0cmluZyBzIC0+IGVzY2FwZV9odG1sIHNcbiAgfCBLZXl3b3JkIGsgLT4gZXNjYXBlX2h0bWwga1xuICB8IFJhd0hUTUwgcyAtPiBzXG4gIHwgU3ltYm9sIHMgLT5cbiAgICBsZXQgdiA9IFN4X3JlZi5ldmFsX2V4cHIgKFN5bWJvbCBzKSAoRW52IGVudikgaW5cbiAgICBkb19yZW5kZXJfdG9faHRtbCB2IGVudlxuICB8IExpc3QgW10gfCBMaXN0UmVmIHsgY29udGVudHMgPSBbXSB9IC0+IFwiXCJcbiAgfCBMaXN0IChoZWFkIDo6IGFyZ3MpIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gaGVhZCA6OiBhcmdzIH0gLT5cbiAgICByZW5kZXJfbGlzdF90b19odG1sIGhlYWQgYXJncyBlbnZcbiAgfCBfIC0+XG4gICAgbGV0IHYgPSBTeF9yZWYuZXZhbF9leHByIGV4cHIgKEVudiBlbnYpIGluXG4gICAgZG9fcmVuZGVyX3RvX2h0bWwgdiBlbnZcblxuYW5kIHJlbmRlcl9saXN0X3RvX2h0bWwgaGVhZCBhcmdzIGVudiA9XG4gIG1hdGNoIGhlYWQgd2l0aFxuICB8IFN5bWJvbCBcIjw+XCIgLT5cbiAgICByZW5kZXJfY2hpbGRyZW4gYXJncyBlbnZcbiAgfCBTeW1ib2wgXCJyYXchXCIgLT5cbiAgICAoKiBJbmplY3QgcHJlLXJlbmRlcmVkIEhUTUwgd2l0aG91dCBlc2NhcGluZyAqKVxuICAgIGxldCB2ID0gU3hfcmVmLmV2YWxfZXhwciAoTGlzdC5oZCBhcmdzKSAoRW52IGVudikgaW5cbiAgICAobWF0Y2ggdiB3aXRoXG4gICAgIHwgU3RyaW5nIHMgfCBSYXdIVE1MIHMgLT4gc1xuICAgICB8IF8gLT4gdmFsdWVfdG9fc3RyaW5nIHYpXG4gIHwgU3ltYm9sIHRhZyB3aGVuIGlzX2h0bWxfdGFnIHRhZyAtPlxuICAgIHJlbmRlcl9odG1sX2VsZW1lbnQgdGFnIGFyZ3MgZW52XG4gIHwgU3ltYm9sIFwiaWZcIiAtPlxuICAgIGxldCBjb25kX3ZhbCA9IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QuaGQgYXJncykgKEVudiBlbnYpIGluXG4gICAgaWYgc3hfdHJ1dGh5IGNvbmRfdmFsIHRoZW5cbiAgICAgIChpZiBMaXN0Lmxlbmd0aCBhcmdzID4gMSB0aGVuIGRvX3JlbmRlcl90b19odG1sIChMaXN0Lm50aCBhcmdzIDEpIGVudiBlbHNlIFwiXCIpXG4gICAgZWxzZVxuICAgICAgKGlmIExpc3QubGVuZ3RoIGFyZ3MgPiAyIHRoZW4gZG9fcmVuZGVyX3RvX2h0bWwgKExpc3QubnRoIGFyZ3MgMikgZW52IGVsc2UgXCJcIilcbiAgfCBTeW1ib2wgXCJ3aGVuXCIgLT5cbiAgICBsZXQgY29uZF92YWwgPSBTeF9yZWYuZXZhbF9leHByIChMaXN0LmhkIGFyZ3MpIChFbnYgZW52KSBpblxuICAgIGlmIHN4X3RydXRoeSBjb25kX3ZhbCB0aGVuXG4gICAgICBTdHJpbmcuY29uY2F0IFwiXCIgKExpc3QubWFwIChmdW4gZSAtPiBkb19yZW5kZXJfdG9faHRtbCBlIGVudikgKExpc3QudGwgYXJncykpXG4gICAgZWxzZSBcIlwiXG4gIHwgU3ltYm9sIFwiY29uZFwiIC0+XG4gICAgcmVuZGVyX2NvbmQgYXJncyBlbnZcbiAgfCBTeW1ib2wgXCJjYXNlXCIgLT5cbiAgICBsZXQgdiA9IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QgKGhlYWQgOjogYXJncykpIChFbnYgZW52KSBpblxuICAgIGRvX3JlbmRlcl90b19odG1sIHYgZW52XG4gIHwgU3ltYm9sIChcImxldFwiIHwgXCJsZXQqXCIpIC0+XG4gICAgcmVuZGVyX2xldCBhcmdzIGVudlxuICB8IFN5bWJvbCAoXCJiZWdpblwiIHwgXCJkb1wiKSAtPlxuICAgIGxldCByZWMgZ28gPSBmdW5jdGlvblxuICAgICAgfCBbXSAtPiBcIlwiXG4gICAgICB8IFtsYXN0XSAtPiBkb19yZW5kZXJfdG9faHRtbCBsYXN0IGVudlxuICAgICAgfCBlIDo6IHJlc3QgLT5cbiAgICAgICAgaWdub3JlIChTeF9yZWYuZXZhbF9leHByIGUgKEVudiBlbnYpKTtcbiAgICAgICAgZ28gcmVzdFxuICAgIGluIGdvIGFyZ3NcbiAgfCBTeW1ib2wgKFwiZGVmaW5lXCIgfCBcImRlZmNvbXBcIiB8IFwiZGVmbWFjcm9cIiB8IFwiZGVmaXNsYW5kXCIpIC0+XG4gICAgaWdub3JlIChTeF9yZWYuZXZhbF9leHByIChMaXN0IChoZWFkIDo6IGFyZ3MpKSAoRW52IGVudikpO1xuICAgIFwiXCJcbiAgfCBTeW1ib2wgXCJtYXBcIiAtPlxuICAgIHJlbmRlcl9tYXAgYXJncyBlbnYgZmFsc2VcbiAgfCBTeW1ib2wgXCJtYXAtaW5kZXhlZFwiIC0+XG4gICAgcmVuZGVyX21hcCBhcmdzIGVudiB0cnVlXG4gIHwgU3ltYm9sIFwiZmlsdGVyXCIgLT5cbiAgICBsZXQgdiA9IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QgKGhlYWQgOjogYXJncykpIChFbnYgZW52KSBpblxuICAgIGRvX3JlbmRlcl90b19odG1sIHYgZW52XG4gIHwgU3ltYm9sIFwiZm9yLWVhY2hcIiAtPlxuICAgIHJlbmRlcl9mb3JfZWFjaCBhcmdzIGVudlxuICB8IFN5bWJvbCBuYW1lIC0+XG4gICAgKHRyeVxuICAgICAgbGV0IHYgPSBlbnZfZ2V0IGVudiBuYW1lIGluXG4gICAgICAobWF0Y2ggdiB3aXRoXG4gICAgICAgfCBDb21wb25lbnQgYyB3aGVuIGMuY19hZmZpbml0eSA9IFwiY2xpZW50XCIgLT4gXCJcIiAgKCogc2tpcCBjbGllbnQtb25seSAqKVxuICAgICAgIHwgQ29tcG9uZW50IF8gLT4gcmVuZGVyX2NvbXBvbmVudCB2IGFyZ3MgZW52XG4gICAgICAgfCBJc2xhbmQgX2kgLT5cbiAgICAgICAgICgqIElzbGFuZHM6IFNTUiB2aWEgdGhlIFNYIHJlbmRlci10by1odG1sIGZyb20gYWRhcHRlci1odG1sLnN4LlxuICAgICAgICAgICAgSXQgaGFuZGxlcyBkZXJlZi9zaWduYWwvY29tcHV0ZWQgdGhyb3VnaCB0aGUgQ0VLIGNvcnJlY3RseSxcbiAgICAgICAgICAgIGFuZCByZW5kZXJzIGlzbGFuZCBib2RpZXMgd2l0aCBoeWRyYXRpb24gbWFya2Vycy4gKilcbiAgICAgICAgICh0cnlcbiAgICAgICAgICAgbGV0IGNhbGxfZXhwciA9IExpc3QgKFN5bWJvbCBuYW1lIDo6IGFyZ3MpIGluXG4gICAgICAgICAgIGxldCBxdW90ZWQgPSBMaXN0IFtTeW1ib2wgXCJxdW90ZVwiOyBjYWxsX2V4cHJdIGluXG4gICAgICAgICAgIGxldCByZW5kZXJfY2FsbCA9IExpc3QgW1N5bWJvbCBcInJlbmRlci10by1odG1sXCI7IHF1b3RlZDsgRW52IGVudl0gaW5cbiAgICAgICAgICAgbGV0IHJlc3VsdCA9IFN4X3JlZi5ldmFsX2V4cHIgcmVuZGVyX2NhbGwgKEVudiBlbnYpIGluXG4gICAgICAgICAgIChtYXRjaCByZXN1bHQgd2l0aFxuICAgICAgICAgICAgfCBTdHJpbmcgcyB8IFJhd0hUTUwgcyAtPiBzXG4gICAgICAgICAgICB8IF8gLT4gdmFsdWVfdG9fc3RyaW5nIHJlc3VsdClcbiAgICAgICAgIHdpdGggZSAtPlxuICAgICAgICAgICBQcmludGYuZXByaW50ZiBcIltzc3ItaXNsYW5kXSB+JXMgRkFJTEVEOiAlc1xcbiVzXFxuJSFcIiBfaS5pX25hbWUgKFByaW50ZXhjLnRvX3N0cmluZyBlKSAoUHJpbnRleGMuZ2V0X2JhY2t0cmFjZSAoKSk7XG4gICAgICAgICAgIFwiXCIpXG4gICAgICAgfCBNYWNybyBtIC0+XG4gICAgICAgICBsZXQgZXhwYW5kZWQgPSBleHBhbmRfbWFjcm8gbSBhcmdzIGVudiBpblxuICAgICAgICAgZG9fcmVuZGVyX3RvX2h0bWwgZXhwYW5kZWQgZW52XG4gICAgICAgfCBfIC0+XG4gICAgICAgICBsZXQgcmVzdWx0ID0gU3hfcmVmLmV2YWxfZXhwciAoTGlzdCAoaGVhZCA6OiBhcmdzKSkgKEVudiBlbnYpIGluXG4gICAgICAgICBkb19yZW5kZXJfdG9faHRtbCByZXN1bHQgZW52KVxuICAgIHdpdGggRXZhbF9lcnJvciBfIC0+XG4gICAgICBsZXQgcmVzdWx0ID0gU3hfcmVmLmV2YWxfZXhwciAoTGlzdCAoaGVhZCA6OiBhcmdzKSkgKEVudiBlbnYpIGluXG4gICAgICBkb19yZW5kZXJfdG9faHRtbCByZXN1bHQgZW52KVxuICB8IF8gLT5cbiAgICBsZXQgcmVzdWx0ID0gU3hfcmVmLmV2YWxfZXhwciAoTGlzdCAoaGVhZCA6OiBhcmdzKSkgKEVudiBlbnYpIGluXG4gICAgZG9fcmVuZGVyX3RvX2h0bWwgcmVzdWx0IGVudlxuXG5hbmQgcmVuZGVyX2NvbmQgYXJncyBlbnYgPVxuICBsZXQgYXNfbGlzdCA9IGZ1bmN0aW9uIExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSAtPiBTb21lIGwgfCBfIC0+IE5vbmUgaW5cbiAgbGV0IGlzX3NjaGVtZSA9IExpc3QuZm9yX2FsbCAoZnVuIGEgLT4gbWF0Y2ggYXNfbGlzdCBhIHdpdGhcbiAgICB8IFNvbWUgaXRlbXMgd2hlbiBMaXN0Lmxlbmd0aCBpdGVtcyA9IDIgLT4gdHJ1ZVxuICAgIHwgXyAtPiBmYWxzZSkgYXJnc1xuICBpblxuICBpZiBpc19zY2hlbWUgdGhlbiBiZWdpblxuICAgIGxldCByZWMgZ28gPSBmdW5jdGlvblxuICAgICAgfCBbXSAtPiBcIlwiXG4gICAgICB8IGNsYXVzZSA6OiByZXN0IC0+XG4gICAgICAgIChtYXRjaCBhc19saXN0IGNsYXVzZSB3aXRoXG4gICAgICAgICB8IFNvbWUgW3Rlc3Q7IGJvZHldIC0+XG4gICAgICAgICAgIGxldCBpc19lbHNlID0gbWF0Y2ggdGVzdCB3aXRoXG4gICAgICAgICAgICAgfCBLZXl3b3JkIFwiZWxzZVwiIC0+IHRydWVcbiAgICAgICAgICAgICB8IFN5bWJvbCBcImVsc2VcIiB8IFN5bWJvbCBcIjplbHNlXCIgLT4gdHJ1ZVxuICAgICAgICAgICAgIHwgXyAtPiBmYWxzZVxuICAgICAgICAgICBpblxuICAgICAgICAgICBpZiBpc19lbHNlIHRoZW4gZG9fcmVuZGVyX3RvX2h0bWwgYm9keSBlbnZcbiAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgIGxldCB2ID0gU3hfcmVmLmV2YWxfZXhwciB0ZXN0IChFbnYgZW52KSBpblxuICAgICAgICAgICAgIGlmIHN4X3RydXRoeSB2IHRoZW4gZG9fcmVuZGVyX3RvX2h0bWwgYm9keSBlbnZcbiAgICAgICAgICAgICBlbHNlIGdvIHJlc3RcbiAgICAgICAgIHwgXyAtPiBcIlwiKVxuICAgIGluIGdvIGFyZ3NcbiAgZW5kIGVsc2UgYmVnaW5cbiAgICBsZXQgcmVjIGdvID0gZnVuY3Rpb25cbiAgICAgIHwgW10gLT4gXCJcIlxuICAgICAgfCBbX10gLT4gXCJcIlxuICAgICAgfCB0ZXN0IDo6IGJvZHkgOjogcmVzdCAtPlxuICAgICAgICBsZXQgaXNfZWxzZSA9IG1hdGNoIHRlc3Qgd2l0aFxuICAgICAgICAgIHwgS2V5d29yZCBcImVsc2VcIiAtPiB0cnVlXG4gICAgICAgICAgfCBTeW1ib2wgXCJlbHNlXCIgfCBTeW1ib2wgXCI6ZWxzZVwiIC0+IHRydWVcbiAgICAgICAgICB8IF8gLT4gZmFsc2VcbiAgICAgICAgaW5cbiAgICAgICAgaWYgaXNfZWxzZSB0aGVuIGRvX3JlbmRlcl90b19odG1sIGJvZHkgZW52XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBsZXQgdiA9IFN4X3JlZi5ldmFsX2V4cHIgdGVzdCAoRW52IGVudikgaW5cbiAgICAgICAgICBpZiBzeF90cnV0aHkgdiB0aGVuIGRvX3JlbmRlcl90b19odG1sIGJvZHkgZW52XG4gICAgICAgICAgZWxzZSBnbyByZXN0XG4gICAgaW4gZ28gYXJnc1xuICBlbmRcblxuYW5kIHJlbmRlcl9sZXQgYXJncyBlbnYgPVxuICBsZXQgYXNfbGlzdCA9IGZ1bmN0aW9uIExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSAtPiBTb21lIGwgfCBfIC0+IE5vbmUgaW5cbiAgbGV0IGJpbmRpbmdzX2V4cHIgPSBMaXN0LmhkIGFyZ3MgaW5cbiAgbGV0IGJvZHkgPSBMaXN0LnRsIGFyZ3MgaW5cbiAgbGV0IGxvY2FsID0gZW52X2V4dGVuZCBlbnYgaW5cbiAgbGV0IGJpbmRpbmdzID0gbWF0Y2ggYXNfbGlzdCBiaW5kaW5nc19leHByIHdpdGggU29tZSBsIC0+IGwgfCBOb25lIC0+IFtdIGluXG4gIGxldCBpc19zY2hlbWUgPSBtYXRjaCBiaW5kaW5ncyB3aXRoXG4gICAgfCAoTGlzdCBfIDo6IF8pIHwgKExpc3RSZWYgXyA6OiBfKSAtPiB0cnVlXG4gICAgfCBfIC0+IGZhbHNlXG4gIGluXG4gIGlmIGlzX3NjaGVtZSB0aGVuXG4gICAgTGlzdC5pdGVyIChmdW4gYiAtPlxuICAgICAgbWF0Y2ggYXNfbGlzdCBiIHdpdGhcbiAgICAgIHwgU29tZSBbU3ltYm9sIG5hbWU7IGV4cHJdIHwgU29tZSBbU3RyaW5nIG5hbWU7IGV4cHJdIC0+XG4gICAgICAgIGxldCB2ID0gU3hfcmVmLmV2YWxfZXhwciBleHByIChFbnYgbG9jYWwpIGluXG4gICAgICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgbmFtZSB2KVxuICAgICAgfCBfIC0+ICgpXG4gICAgKSBiaW5kaW5nc1xuICBlbHNlIGJlZ2luXG4gICAgbGV0IHJlYyBnbyA9IGZ1bmN0aW9uXG4gICAgICB8IFtdIC0+ICgpXG4gICAgICB8IChTeW1ib2wgbmFtZSkgOjogZXhwciA6OiByZXN0IHwgKFN0cmluZyBuYW1lKSA6OiBleHByIDo6IHJlc3QgLT5cbiAgICAgICAgbGV0IHYgPSBTeF9yZWYuZXZhbF9leHByIGV4cHIgKEVudiBsb2NhbCkgaW5cbiAgICAgICAgaWdub3JlIChlbnZfYmluZCBsb2NhbCBuYW1lIHYpO1xuICAgICAgICBnbyByZXN0XG4gICAgICB8IF8gLT4gKClcbiAgICBpbiBnbyBiaW5kaW5nc1xuICBlbmQ7XG4gIGxldCByZWMgcmVuZGVyX2JvZHkgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gXCJcIlxuICAgIHwgW2xhc3RdIC0+IGRvX3JlbmRlcl90b19odG1sIGxhc3QgbG9jYWxcbiAgICB8IGUgOjogcmVzdCAtPlxuICAgICAgaWdub3JlIChTeF9yZWYuZXZhbF9leHByIGUgKEVudiBsb2NhbCkpO1xuICAgICAgcmVuZGVyX2JvZHkgcmVzdFxuICBpbiByZW5kZXJfYm9keSBib2R5XG5cbmFuZCByZW5kZXJfbWFwIGFyZ3MgZW52IGluZGV4ZWQgPVxuICBsZXQgKGZuX3ZhbCwgY29sbF92YWwpID0gbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbYTsgYl0gLT5cbiAgICAgIGxldCB2YSA9IFN4X3JlZi5ldmFsX2V4cHIgYSAoRW52IGVudikgaW5cbiAgICAgIGxldCB2YiA9IFN4X3JlZi5ldmFsX2V4cHIgYiAoRW52IGVudikgaW5cbiAgICAgIChtYXRjaCB2YSwgdmIgd2l0aFxuICAgICAgIHwgKExhbWJkYSBfIHwgTmF0aXZlRm4gXyksIF8gLT4gKHZhLCB2YilcbiAgICAgICB8IF8sIChMYW1iZGEgXyB8IE5hdGl2ZUZuIF8pIC0+ICh2YiwgdmEpXG4gICAgICAgfCBfIC0+ICh2YSwgdmIpKVxuICAgIHwgXyAtPiAoTmlsLCBOaWwpXG4gIGluXG4gIGxldCBpdGVtcyA9IG1hdGNoIGNvbGxfdmFsIHdpdGggTGlzdCBsIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9IC0+IGwgfCBfIC0+IFtdIGluXG4gIFN0cmluZy5jb25jYXQgXCJcIiAoTGlzdC5tYXBpIChmdW4gaSBpdGVtIC0+XG4gICAgbGV0IGNhbGxfYXJncyA9IGlmIGluZGV4ZWQgdGhlbiBbTnVtYmVyIChmbG9hdF9vZl9pbnQgaSk7IGl0ZW1dIGVsc2UgW2l0ZW1dIGluXG4gICAgbWF0Y2ggZm5fdmFsIHdpdGhcbiAgICB8IExhbWJkYSBsIC0+XG4gICAgICBsZXQgbG9jYWwgPSBlbnZfZXh0ZW5kIGwubF9jbG9zdXJlIGluXG4gICAgICBMaXN0Lml0ZXIyIChmdW4gcCBhIC0+IGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgcCBhKSlcbiAgICAgICAgbC5sX3BhcmFtcyBjYWxsX2FyZ3M7XG4gICAgICBkb19yZW5kZXJfdG9faHRtbCBsLmxfYm9keSBsb2NhbFxuICAgIHwgXyAtPlxuICAgICAgbGV0IHJlc3VsdCA9IFN4X3J1bnRpbWUuc3hfY2FsbCBmbl92YWwgY2FsbF9hcmdzIGluXG4gICAgICBkb19yZW5kZXJfdG9faHRtbCByZXN1bHQgZW52XG4gICkgaXRlbXMpXG5cbmFuZCByZW5kZXJfZm9yX2VhY2ggYXJncyBlbnYgPVxuICBsZXQgKGZuX3ZhbCwgY29sbF92YWwpID0gbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbYTsgYl0gLT5cbiAgICAgIGxldCB2YSA9IFN4X3JlZi5ldmFsX2V4cHIgYSAoRW52IGVudikgaW5cbiAgICAgIGxldCB2YiA9IFN4X3JlZi5ldmFsX2V4cHIgYiAoRW52IGVudikgaW5cbiAgICAgIChtYXRjaCB2YSwgdmIgd2l0aFxuICAgICAgIHwgKExhbWJkYSBfIHwgTmF0aXZlRm4gXyksIF8gLT4gKHZhLCB2YilcbiAgICAgICB8IF8sIChMYW1iZGEgXyB8IE5hdGl2ZUZuIF8pIC0+ICh2YiwgdmEpXG4gICAgICAgfCBfIC0+ICh2YSwgdmIpKVxuICAgIHwgXyAtPiAoTmlsLCBOaWwpXG4gIGluXG4gIGxldCBpdGVtcyA9IG1hdGNoIGNvbGxfdmFsIHdpdGggTGlzdCBsIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9IC0+IGwgfCBfIC0+IFtdIGluXG4gIFN0cmluZy5jb25jYXQgXCJcIiAoTGlzdC5tYXAgKGZ1biBpdGVtIC0+XG4gICAgbWF0Y2ggZm5fdmFsIHdpdGhcbiAgICB8IExhbWJkYSBsIC0+XG4gICAgICBsZXQgbG9jYWwgPSBlbnZfZXh0ZW5kIGwubF9jbG9zdXJlIGluXG4gICAgICBMaXN0Lml0ZXIyIChmdW4gcCBhIC0+IGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgcCBhKSlcbiAgICAgICAgbC5sX3BhcmFtcyBbaXRlbV07XG4gICAgICBkb19yZW5kZXJfdG9faHRtbCBsLmxfYm9keSBsb2NhbFxuICAgIHwgXyAtPlxuICAgICAgbGV0IHJlc3VsdCA9IFN4X3J1bnRpbWUuc3hfY2FsbCBmbl92YWwgW2l0ZW1dIGluXG4gICAgICBkb19yZW5kZXJfdG9faHRtbCByZXN1bHQgZW52XG4gICkgaXRlbXMpXG5cblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuKCogU2V0dXAg4oCUIGJpbmQgcmVuZGVyIHByaW1pdGl2ZXMgaW4gYW4gZW52IGFuZCB3aXJlIHVwIHRoZSByZWYgICAgICAgICAgICAqKVxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuXG5sZXQgc2V0dXBfcmVuZGVyX2VudiBlbnYgPVxuICByZW5kZXJfdG9faHRtbF9yZWYgOj0gZG9fcmVuZGVyX3RvX2h0bWw7XG5cbiAgbGV0IGJpbmQgbmFtZSBmbiA9XG4gICAgaWdub3JlIChlbnZfYmluZCBlbnYgbmFtZSAoTmF0aXZlRm4gKG5hbWUsIGZuKSkpXG4gIGluXG5cbiAgYmluZCBcInJlbmRlci1odG1sXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIHNyY10gLT5cbiAgICAgIGxldCBleHBycyA9IFN4X3BhcnNlci5wYXJzZV9hbGwgc3JjIGluXG4gICAgICBsZXQgZXhwciA9IG1hdGNoIGV4cHJzIHdpdGhcbiAgICAgICAgfCBbZV0gLT4gZVxuICAgICAgICB8IFtdIC0+IE5pbFxuICAgICAgICB8IF8gLT4gTGlzdCAoU3ltYm9sIFwiZG9cIiA6OiBleHBycylcbiAgICAgIGluXG4gICAgICBTdHJpbmcgKHJlbmRlcl90b19odG1sIGV4cHIgZW52KVxuICAgIHwgW2V4cHJdIC0+XG4gICAgICBTdHJpbmcgKHJlbmRlcl90b19odG1sIGV4cHIgZW52KVxuICAgIHwgW2V4cHI7IEVudiBlXSAtPlxuICAgICAgU3RyaW5nIChyZW5kZXJfdG9faHRtbCBleHByIGUpXG4gICAgfCBfIC0+IFN0cmluZyBcIlwiKTtcblxuICBiaW5kIFwicmVuZGVyLXRvLWh0bWxcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgc3JjXSAtPlxuICAgICAgbGV0IGV4cHJzID0gU3hfcGFyc2VyLnBhcnNlX2FsbCBzcmMgaW5cbiAgICAgIGxldCBleHByID0gbWF0Y2ggZXhwcnMgd2l0aFxuICAgICAgICB8IFtlXSAtPiBlXG4gICAgICAgIHwgW10gLT4gTmlsXG4gICAgICAgIHwgXyAtPiBMaXN0IChTeW1ib2wgXCJkb1wiIDo6IGV4cHJzKVxuICAgICAgaW5cbiAgICAgIFN0cmluZyAocmVuZGVyX3RvX2h0bWwgZXhwciBlbnYpXG4gICAgfCBbZXhwcl0gLT5cbiAgICAgIFN0cmluZyAocmVuZGVyX3RvX2h0bWwgZXhwciBlbnYpXG4gICAgfCBbZXhwcjsgRW52IGVdIC0+XG4gICAgICBTdHJpbmcgKHJlbmRlcl90b19odG1sIGV4cHIgZSlcbiAgICB8IF8gLT4gU3RyaW5nIFwiXCIpXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfbGlzdF9vZl9qc19hcnJheSIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfdHJhbXBvbGluZSIsImNhbWxfdHJhbXBvbGluZV9yZXR1cm4iLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImNhbWxfY2FsbDMiLCJhMiIsImdsb2JhbF9kYXRhIiwiY3N0X2JyIiwiY3N0X2NvbCIsImNzdF9lbWJlZCIsImNzdF9maWx0ZXIiLCJjc3RfaHIiLCJjc3RfaW1nIiwiY3N0X2lucHV0IiwiY3N0X2xpbmsiLCJjc3RfbWV0YSIsImNzdF9wYXJhbSIsImNzdF9zb3VyY2UiLCJjc3Rfd2JyIiwiaHRtbF90YWdzIiwidm9pZF9lbGVtZW50cyIsImJvb2xlYW5fYXR0cnMiLCJTeF9yZWYiLCJTdGRsaWJfRmxvYXQiLCJTdGRsaWIiLCJTdGRsaWJfUHJpbnRmIiwiU3RkbGliX0xpc3QiLCJTeF90eXBlcyIsIlN0ZGxpYl9TdHJpbmciLCJTdGRsaWJfUHJpbnRleGMiLCJTeF9ydW50aW1lIiwiU3hfcGFyc2VyIiwiU3RkbGliX0hhc2h0YmwiLCJTdGRsaWJfQnVmZmVyIiwiaXNfaHRtbF90YWciLCJuYW1lIiwiaXNfdm9pZCIsImlzX2Jvb2xlYW5fYXR0ciIsImVzY2FwZV9odG1sIiwicyIsImJ1ZiIsImMiLCJyZW5kZXJfYXR0cnMiLCJhdHRycyIsImsiLCJ2IiwiY3N0IiwicmVuZGVyX3RvX2h0bWxfcmVmIiwiZXhwciIsImVudiIsInJlbmRlcl90b19odG1sIiwicmVuZGVyX2NoaWxkcmVuIiwiY2hpbGRyZW4iLCJwYXJzZV9lbGVtZW50X2FyZ3MiLCJhcmdzIiwibGVuIiwic2tpcCIsImlkeCIsImFyZyIsInBhaXJzIiwicGFyYW0iLCJyZW5kZXJfaHRtbF9lbGVtZW50IiwidGFnIiwibWF0Y2giLCJhdHRyX3N0ciIsImNvbnRlbnQiLCJyZW5kZXJfY29tcG9uZW50IiwiY29tcCIsImt3YXJncyIsImNoaWxkcmVuX2V4cHJzIiwibG9jYWwiLCJwIiwicmVuZGVyZWRfY2hpbGRyZW4iLCJleHBhbmRfbWFjcm8iLCJtIiwicGFyYW1zIiwicHMiLCJhcyIsInJwIiwicHNfcmVzdCIsImFzX3Jlc3QiLCJhIiwiZG9fcmVuZGVyX3RvX2h0bWwiLCJjb3VudGVyIiwibiIsImhlYWQiLCJjc3RfZG8iLCJjc3RfcmVuZGVyX3RvX2h0bWwiLCJyZW5kZXJfbGlzdF90b19odG1sIiwic3dpdGNoJCIsImNvbmRfdmFsIiwiZSIsImxhc3QiLCJyZXN0IiwiaSIsImNhbGxfZXhwciIsInJlbmRlcl9jYWxsIiwicmVzdWx0IiwiZXhwYW5kZWQiLCJleG4iLCJyZW5kZXJfY29uZCIsImFzX2xpc3QiLCJsIiwiaXNfc2NoZW1lIiwiaXRlbXMiLCJjc3RfZWxzZSIsImNsYXVzZSIsImJvZHkiLCJ0ZXN0IiwiaXNfZWxzZSIsInJlbmRlcl9sZXQiLCJiaW5kaW5nc19leHByIiwiYmluZGluZ3MiLCJiIiwicmVuZGVyX21hcCIsImluZGV4ZWQiLCJ2YSIsInZiIiwiY29sbF92YWwiLCJmbl92YWwiLCJpdGVtIiwiY2FsbF9hcmdzIiwicmVuZGVyX2Zvcl9lYWNoIiwic2V0dXBfcmVuZGVyX2VudiIsImJpbmQiLCJmbiIsInNyYyIsImV4cHJzIl0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLHdCQUFBO0FBQUEsSUFBQUMsOEJBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLHlCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFdBQUFKLEdBQUFDLElBQUFFLElBQUFFO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsVUFBQTtBQUFBLElBQUFDLFlBQUE7QUFBQSxJQUFBQyxhQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLFVBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsV0FBQTtBQUFBLElBQUFDLFdBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsYUFBQTtBQUFBLElBQUFDLFVBQUE7QUFBQSxJQUFBQztBQUFBQSxNQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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QUFBQUEsSUNvYUU7QUFBQSxhQUFBMkUsS0FBQXpGLE1BQUEwRjtBQUFBQSxLQUdTO0FBQUEsS0FBeUM7QUFBQTtBQUFBLElBR2xEO0FBQUE7QUFBQSxlQUFBdkU7QUFBQUEsT0FDRTtBQUFBLFlBQUFOLE9BQUE7QUFBQTtBQUFBLGFBQUE4RSxNQUFBLFNBQUFDLFFBRWM7QUFBQSxTQUNaO0FBQUE7QUFBQSxlQUFBL0UsU0FHUztBQUFBO0FBQUEsZUFBQTJDLE1BSFQsVUFBQTNDLFNBQ1c7QUFBQTtBQUFBLGNBQUFBLFNBQ0Q7QUFBQSxTQUdILHVDQUF5QjtBQUFBO0FBQUEsWUFBQWUsUUFSbEM7QUFBQSxvQkFVUyxxQ0FBeUI7QUFBQSxnQkFWbEM7QUFBQTtBQUFBLGFBQUE0QixNQUFBO0FBQUEsU0FZUyxxQ0FBdUI7QUFBQTtBQUFBO0FBQUEsT0FDekI7QUFBQSxNQUFTO0FBQUEsSUFBQztBQUFBO0FBQUEsc0JBQUFyQztBQUFBQSxjQUdqQjtBQUFBLG1CQUFBTixPQUFBO0FBQUE7QUFBQSxvQkFBQThFLE1BQUEsU0FBQUMsUUFFYztBQUFBLGdCQUNaO0FBQUE7QUFBQSxzQkFBQS9FLFNBR1M7QUFBQTtBQUFBLHNCQUFBMkMsTUFIVCxVQUFBM0MsU0FDVztBQUFBO0FBQUEscUJBQUFBLFNBQ0Q7QUFBQSxnQkFHSCx1Q0FBeUI7QUFBQTtBQUFBLG1CQUFBZSxRQVJsQztBQUFBLDJCQVVTLHFDQUF5QjtBQUFBLHVCQVZsQztBQUFBLDBFQUFBNEIsSUFBQSxNQVlTLG1DQUF1QjtBQUFBO0FBQUEsY0FDekI7QUFBQSxhQUFTLEVBQUM7QUFBQTtBQUFBLEdEeGNyQiIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjM3MDE3LCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6Impzb29fcnVudGltZS5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIl0sIm5hbWVzIjpbInJ1bnRpbWUiXSwibWFwcGluZ3MiOiJPQUFBQSxVQUFBIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MzcwMzAsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvb19ydW50aW1lLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvanNfb2Zfb2NhbWwtY29tcGlsZXIvcnVudGltZS9qc29vX3J1bnRpbWUubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxuXG5tb2R1bGUgSnMgPSBzdHJ1Y3RcbiAgdHlwZSB0XG5cbiAgdHlwZSAnYSBqc19hcnJheSA9IHRcblxuICB0eXBlICgnYSwgJ2IpIG1ldGhfY2FsbGJhY2sgPSB0XG5cbiAgZXh0ZXJuYWwgc3RyaW5nIDogc3RyaW5nIC0+IHQgPSBcImNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXCJcblxuICBleHRlcm5hbCB0b19zdHJpbmcgOiB0IC0+IHN0cmluZyA9IFwiY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcIlxuXG4gIGV4dGVybmFsIGJ5dGVzdHJpbmcgOiBzdHJpbmcgLT4gdCA9IFwiY2FtbF9qc2J5dGVzX29mX3N0cmluZ1wiXG5cbiAgZXh0ZXJuYWwgdG9fYnl0ZXN0cmluZyA6IHQgLT4gc3RyaW5nID0gXCJjYW1sX3N0cmluZ19vZl9qc2J5dGVzXCJcblxuICBleHRlcm5hbCBib29sIDogYm9vbCAtPiB0ID0gXCJjYW1sX2pzX2Zyb21fYm9vbFwiXG5cbiAgZXh0ZXJuYWwgdG9fYm9vbCA6IHQgLT4gYm9vbCA9IFwiY2FtbF9qc190b19ib29sXCJcblxuICBleHRlcm5hbCBhcnJheSA6ICdhIGFycmF5IC0+IHQgPSBcImNhbWxfanNfZnJvbV9hcnJheVwiXG5cbiAgZXh0ZXJuYWwgdG9fYXJyYXkgOiB0IC0+ICdhIGFycmF5ID0gXCJjYW1sX2pzX3RvX2FycmF5XCJcblxuICBleHRlcm5hbCBudW1iZXJfb2ZfZmxvYXQgOiBmbG9hdCAtPiB0ID0gXCJjYW1sX2pzX2Zyb21fZmxvYXRcIlxuXG4gIGV4dGVybmFsIGZsb2F0X29mX251bWJlciA6IHQgLT4gZmxvYXQgPSBcImNhbWxfanNfdG9fZmxvYXRcIlxuXG4gIGV4dGVybmFsIG51bWJlcl9vZl9pbnQzMiA6IGludDMyIC0+IHQgPSBcImNhbWxfanNfZnJvbV9pbnQzMlwiXG5cbiAgZXh0ZXJuYWwgaW50MzJfb2ZfbnVtYmVyIDogdCAtPiBpbnQzMiA9IFwiY2FtbF9qc190b19pbnQzMlwiXG5cbiAgZXh0ZXJuYWwgbnVtYmVyX29mX25hdGl2ZWludCA6IG5hdGl2ZWludCAtPiB0ID0gXCJjYW1sX2pzX2Zyb21fbmF0aXZlaW50XCJcblxuICBleHRlcm5hbCBuYXRpdmVpbnRfb2ZfbnVtYmVyIDogdCAtPiBuYXRpdmVpbnQgPSBcImNhbWxfanNfdG9fbmF0aXZlaW50XCJcblxuICBleHRlcm5hbCB0eXBlb2YgOiB0IC0+IHQgPSBcImNhbWxfanNfdHlwZW9mXCJcblxuICBleHRlcm5hbCBpbnN0YW5jZW9mIDogdCAtPiB0IC0+IGJvb2wgPSBcImNhbWxfanNfaW5zdGFuY2VvZlwiXG5cbiAgZXh0ZXJuYWwgZGVidWdnZXIgOiB1bml0IC0+IHVuaXQgPSBcImRlYnVnZ2VyXCJcblxuICBleHRlcm5hbCBnZXQgOiB0IC0+IHQgLT4gdCA9IFwiY2FtbF9qc19nZXRcIlxuXG4gIGV4dGVybmFsIHNldCA6IHQgLT4gdCAtPiB0IC0+IHVuaXQgPSBcImNhbWxfanNfc2V0XCJcblxuICBleHRlcm5hbCBkZWxldGUgOiB0IC0+IHQgLT4gdW5pdCA9IFwiY2FtbF9qc19kZWxldGVcIlxuXG4gIGV4dGVybmFsIGNhbGwgOiB0IC0+IHQgLT4gdCBhcnJheSAtPiB0ID0gXCJjYW1sX2pzX2NhbGxcIlxuXG4gIGV4dGVybmFsIGZ1bl9jYWxsIDogdCAtPiB0IGFycmF5IC0+IHQgPSBcImNhbWxfanNfZnVuX2NhbGxcIlxuXG4gIGV4dGVybmFsIG1ldGhfY2FsbCA6IHQgLT4gc3RyaW5nIC0+IHQgYXJyYXkgLT4gdCA9IFwiY2FtbF9qc19tZXRoX2NhbGxcIlxuXG4gIGV4dGVybmFsIG5ld19vYmogOiB0IC0+IHQgYXJyYXkgLT4gdCA9IFwiY2FtbF9qc19uZXdcIlxuXG4gIGV4dGVybmFsIG5ld19vYmpfYXJyIDogdCAtPiB0IGpzX2FycmF5IC0+IHQgPSBcImNhbWxfb2pzX25ld19hcnJcIlxuXG4gIGV4dGVybmFsIG9iaiA6IChzdHJpbmcgKiB0KSBhcnJheSAtPiB0ID0gXCJjYW1sX2pzX29iamVjdFwiXG5cbiAgZXh0ZXJuYWwgZXF1YWxzIDogdCAtPiB0IC0+IGJvb2wgPSBcImNhbWxfanNfZXF1YWxzXCJcblxuICBleHRlcm5hbCBzdHJpY3RfZXF1YWxzIDogdCAtPiB0IC0+IGJvb2wgPSBcImNhbWxfanNfc3RyaWN0X2VxdWFsc1wiXG5cbiAgZXh0ZXJuYWwgcHVyZV9leHByIDogKHVuaXQgLT4gJ2EpIC0+ICdhID0gXCJjYW1sX2pzX3B1cmVfZXhwclwiXG5cbiAgZXh0ZXJuYWwgZXZhbF9zdHJpbmcgOiBzdHJpbmcgLT4gJ2EgPSBcImNhbWxfanNfZXZhbF9zdHJpbmdcIlxuXG4gIGV4dGVybmFsIGpzX2V4cHIgOiBzdHJpbmcgLT4gJ2EgPSBcImNhbWxfanNfZXhwclwiXG5cbiAgZXh0ZXJuYWwgcHVyZV9qc19leHByIDogc3RyaW5nIC0+ICdhID0gXCJjYW1sX3B1cmVfanNfZXhwclwiXG5cbiAgZXh0ZXJuYWwgY2FsbGJhY2sgOiAoJ2IgLT4gJ2EpIC0+ICgnYiwgJ2EpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX2NhbGxiYWNrX3Vuc2FmZVwiXG5cbiAgZXh0ZXJuYWwgY2FsbGJhY2tfd2l0aF9hcmd1bWVudHMgOlxuICAgICh0IGpzX2FycmF5IC0+ICdiKSAtPiAoJ2MsIHQganNfYXJyYXkgLT4gJ2IpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX2NhbGxiYWNrX2FyZ3VtZW50c1wiXG5cbiAgZXh0ZXJuYWwgY2FsbGJhY2tfd2l0aF9hcml0eSA6IGludCAtPiAoJ2EgLT4gJ2IpIC0+ICgnYywgJ2EgLT4gJ2IpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX2NhbGxiYWNrX3N0cmljdFwiXG5cbiAgZXh0ZXJuYWwgbWV0aF9jYWxsYmFjayA6ICgnYiAtPiAnYSkgLT4gKCdiLCAnYSkgbWV0aF9jYWxsYmFja1xuICAgID0gXCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja191bnNhZmVcIlxuXG4gIGV4dGVybmFsIG1ldGhfY2FsbGJhY2tfd2l0aF9hcml0eSA6IGludCAtPiAoJ2IgLT4gJ2EpIC0+ICgnYiwgJ2EpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfc3RyaWN0XCJcblxuICBleHRlcm5hbCBtZXRoX2NhbGxiYWNrX3dpdGhfYXJndW1lbnRzIDpcbiAgICAoJ2IgLT4gdCBqc19hcnJheSAtPiAnYSkgLT4gKCdiLCB0IGpzX2FycmF5IC0+ICdhKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX2FyZ3VtZW50c1wiXG5cbiAgZXh0ZXJuYWwgd3JhcF9jYWxsYmFjayA6ICgnYSAtPiAnYikgLT4gKCdjLCAnYSAtPiAnYikgbWV0aF9jYWxsYmFja1xuICAgID0gXCJjYW1sX2pzX3dyYXBfY2FsbGJhY2tcIlxuXG4gIGV4dGVybmFsIHdyYXBfbWV0aF9jYWxsYmFjayA6ICgnYSAtPiAnYikgLT4gKCdhLCAnYikgbWV0aF9jYWxsYmFja1xuICAgID0gXCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja1wiXG5cbiAgZXh0ZXJuYWwgcnVudGltZV92YWx1ZSA6IHN0cmluZyAtPiAnYSA9IFwiY2FtbF9qc29vX3J1bnRpbWVfdmFsdWVcIlxuICAoKiogW3J1bnRpbWVfdmFsdWUgXCJGT09cIl0gcmV0dXJucyB0aGUgSmF2YVNjcmlwdCB2YWx1ZSBGT08gcHJvdmlkZWQgYnkgdGhlIEphdmFTY3JpcHQgcnVudGltZSAod2l0aCAnLy9Qcm92aWRlczogRk9PJykuIFRoZSBzdHJpbmcgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyBsaXRlcmFsLiAqKVxuXG4gIGV4dGVybmFsIGN1c3RvbV9pZGVudGlmaWVyIDogT2JqLnQgLT4gc3RyaW5nID0gXCJjYW1sX2N1c3RvbV9pZGVudGlmaWVyXCJcbmVuZFxuXG5tb2R1bGUgU3lzID0gc3RydWN0XG4gIHR5cGUgJ2EgY2FsbGJhY2sgPSAnYVxuXG4gIGV4dGVybmFsIGNyZWF0ZV9maWxlIDogbmFtZTpzdHJpbmcgLT4gY29udGVudDpzdHJpbmcgLT4gdW5pdCA9IFwiY2FtbF9jcmVhdGVfZmlsZVwiXG5cbiAgZXh0ZXJuYWwgcmVhZF9maWxlIDogbmFtZTpzdHJpbmcgLT4gc3RyaW5nID0gXCJjYW1sX3JlYWRfZmlsZV9jb250ZW50XCJcblxuICBleHRlcm5hbCBzZXRfY2hhbm5lbF9vdXRwdXQnIDogb3V0X2NoYW5uZWwgLT4gKGpzX3N0cmluZzpKcy50IC0+IHVuaXQpIGNhbGxiYWNrIC0+IHVuaXRcbiAgICA9IFwiY2FtbF9tbF9zZXRfY2hhbm5lbF9vdXRwdXRcIlxuXG4gIGV4dGVybmFsIHNldF9jaGFubmVsX2lucHV0JyA6IGluX2NoYW5uZWwgLT4gKHVuaXQgLT4gc3RyaW5nKSBjYWxsYmFjayAtPiB1bml0XG4gICAgPSBcImNhbWxfbWxfc2V0X2NoYW5uZWxfcmVmaWxsXCJcblxuICBleHRlcm5hbCBtb3VudF9wb2ludCA6IHVuaXQgLT4gc3RyaW5nIGxpc3QgPSBcImNhbWxfbGlzdF9tb3VudF9wb2ludFwiXG5cbiAgZXh0ZXJuYWwgbW91bnRfYXV0b2xvYWQgOiBzdHJpbmcgLT4gKHN0cmluZyAtPiBzdHJpbmcgLT4gc3RyaW5nIG9wdGlvbikgY2FsbGJhY2sgLT4gdW5pdFxuICAgID0gXCJjYW1sX21vdW50X2F1dG9sb2FkXCJcblxuICBleHRlcm5hbCB1bm1vdW50IDogc3RyaW5nIC0+IHVuaXQgPSBcImNhbWxfdW5tb3VudFwiXG5cbiAgdHlwZSByZWRpcmVjdGlvblxuXG4gIGV4dGVybmFsIHJlZGlyZWN0X2NoYW5uZWwgOiBvdXRfY2hhbm5lbCAtPiBpbnRvOm91dF9jaGFubmVsIC0+IHJlZGlyZWN0aW9uXG4gICAgPSBcImNhbWxfbWxfY2hhbm5lbF9yZWRpcmVjdFwiXG5cbiAgZXh0ZXJuYWwgcmVzdG9yZV9jaGFubmVsIDogb3V0X2NoYW5uZWwgLT4gcmVkaXJlY3Rpb24gLT4gdW5pdFxuICAgID0gXCJjYW1sX21sX2NoYW5uZWxfcmVzdG9yZVwiXG5cbiAgbW9kdWxlIENvbmZpZyA9IHN0cnVjdFxuICAgIGV4dGVybmFsIHVzZV9qc19zdHJpbmcgOiB1bml0IC0+IGJvb2wgPSBcImNhbWxfanNvb19mbGFnc191c2VfanNfc3RyaW5nXCJcblxuICAgIHR5cGUgZWZmZWN0c19iYWNrZW5kID1cbiAgICAgIFsgYERpc2FibGVkXG4gICAgICB8IGBDcHNcbiAgICAgIHwgYERvdWJsZV90cmFuc2xhdGlvblxuICAgICAgXVxuXG4gICAgZXh0ZXJuYWwgZWZmZWN0c18gOiB1bml0IC0+IHN0cmluZyA9IFwiY2FtbF9qc29vX2ZsYWdzX2VmZmVjdHNcIlxuXG4gICAgbGV0IGVmZmVjdHMgKCkgPVxuICAgICAgbWF0Y2ggZWZmZWN0c18gKCkgd2l0aFxuICAgICAgfCBcImRpc2FibGVkXCIgLT4gYERpc2FibGVkXG4gICAgICB8IFwiY3BzXCIgLT4gYENwc1xuICAgICAgfCBcImRvdWJsZS10cmFuc2xhdGlvblwiIC0+IGBEb3VibGVfdHJhbnNsYXRpb25cbiAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2VcbiAgZW5kXG5cbiAgbGV0IHZlcnNpb24gPSBSdW50aW1lX3ZlcnNpb24uc1xuXG4gIGxldCBnaXRfdmVyc2lvbiA9IFJ1bnRpbWVfdmVyc2lvbi5naXRfdmVyc2lvblxuZW5kXG5cbm1vZHVsZSBFcnJvciA6IHNpZ1xuICB0eXBlIHRcblxuICB2YWwgcmFpc2VfIDogdCAtPiAnYVxuXG4gIHZhbCBhdHRhY2hfanNfYmFja3RyYWNlIDogZXhuIC0+IGZvcmNlOmJvb2wgLT4gZXhuXG4gICgqKiBBdHRhY2ggYSBKYXZhU2NyaXB0IGVycm9yIHRvIGFuIE9DYW1sIGV4Y2VwdGlvbi4gIGlmIFtmb3JjZSA9IGZhbHNlXSBhbmQgYVxuICAgIEphdmFTY3JpcHQgZXJyb3IgaXMgYWxyZWFkeSBhdHRhY2hlZCwgaXQgd2lsbCBkbyBub3RoaW5nLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB0b1xuICAgIHN0b3JlIGFuZCByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBKYXZhU2NyaXB0IHN0YWNrIHRyYWNlcy5cblxuICAgIEF0dGFjaGluZyBKYXZhU2NyaXB0IGVycm9ycyB3aWxsIGhhcHBlbiBhdXRvbWF0aWNhbGx5IHdoZW4gY29tcGlsaW5nIHdpdGhcbiAgICBbLS1lbmFibGUgd2l0aC1qcy1lcnJvcl0uICopXG5cbiAgdmFsIG9mX2V4biA6IGV4biAtPiB0IG9wdGlvblxuICAoKiogRXh0cmFjdCBhIEphdmFTY3JpcHQgZXJyb3IgYXR0YWNoZWQgdG8gYW4gT0NhbWwgZXhjZXB0aW9uLCBpZiBhbnkuICBUaGlzIGlzIHVzZWZ1bCB0b1xuICAgICAgaW5zcGVjdCBhbiBldmVudHVhbCBzdGFjayB0cmFjZSwgZXNwZWNpYWxseSB3aGVuIHNvdXJjZW1hcCBpcyBlbmFibGVkLiAqKVxuXG4gIGV4Y2VwdGlvbiBFeG4gb2YgdFxuICAoKiogVGhlIFtFcnJvcl0gZXhjZXB0aW9uIHdyYXAgamF2YXNjcmlwdCBleGNlcHRpb25zIHdoZW4gY2F1Z2h0IGJ5IE9DYW1sIGNvZGUuXG4gICAgICBJbiBjYXNlIHRoZSBqYXZhc2NyaXB0IGV4Y2VwdGlvbiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgamF2YXNjcmlwdCBbRXJyb3JdLFxuICAgICAgaXQgd2lsbCBiZSBzZXJpYWxpemVkIGFuZCB3cmFwcGVkIGludG8gYSBbRmFpbHVyZV0gZXhjZXB0aW9uLlxuICAqKVxuZW5kID0gc3RydWN0XG4gIHR5cGUgdFxuXG4gIGV4Y2VwdGlvbiBFeG4gb2YgdFxuXG4gIGxldCBfID0gQ2FsbGJhY2sucmVnaXN0ZXJfZXhjZXB0aW9uIFwianNFcnJvclwiIChFeG4gKE9iai5tYWdpYyBbfHxdKSlcblxuICBleHRlcm5hbCByYWlzZV8gOiB0IC0+ICdhID0gXCJjYW1sX3Rocm93X2pzX2V4Y2VwdGlvblwiXG5cbiAgZXh0ZXJuYWwgb2ZfZXhuIDogZXhuIC0+IHQgb3B0aW9uID0gXCJjYW1sX2pzX2Vycm9yX29wdGlvbl9vZl9leGNlcHRpb25cIlxuXG4gIGV4dGVybmFsIGF0dGFjaF9qc19iYWNrdHJhY2UgOiBleG4gLT4gZm9yY2U6Ym9vbCAtPiBleG4gPSBcImNhbWxfZXhuX3dpdGhfanNfYmFja3RyYWNlXCJcbmVuZFxuXG5bQEBAb2NhbWwud2FybmluZyBcIi0zMi02MFwiXVxuXG5tb2R1bGUgRm9yX2NvbXBhdGliaWxpdHlfb25seSA9IHN0cnVjdFxuICAoKiBBZGQgcHJpbWl0aXZlcyBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLiBFeGlzdGluZyB1c2VycyBtaWdodFxuICAgICBkZXBlbmQgb24gaXQgKGUuZy4gZ2VuX2pzX2FwaSksIHdlIGRvbid0IHdhbnQgdGhlIG9jYW1sIGNvbXBpbGVyXG4gICAgIHRvIGNvbXBsYWluIGFib3V0IHRoZXNlIG1pc3NpbmcgcHJpbWl0aXZlcy4gKilcblxuICBleHRlcm5hbCBjYW1sX2pzX2Zyb21fc3RyaW5nIDogc3RyaW5nIC0+IEpzLnQgPSBcImNhbWxfanNfZnJvbV9zdHJpbmdcIlxuXG4gIGV4dGVybmFsIGNhbWxfanNfdG9fYnl0ZV9zdHJpbmcgOiBKcy50IC0+IHN0cmluZyA9IFwiY2FtbF9qc190b19ieXRlX3N0cmluZ1wiXG5cbiAgZXh0ZXJuYWwgY2FtbF9qc190b19zdHJpbmcgOiBKcy50IC0+IHN0cmluZyA9IFwiY2FtbF9qc190b19zdHJpbmdcIlxuXG4gIGV4dGVybmFsIGNhbWxfbGlzdF9vZl9qc19hcnJheSA6ICdhIEpzLmpzX2FycmF5IC0+ICdhIGxpc3QgPSBcImNhbWxfbGlzdF9vZl9qc19hcnJheVwiXG5cbiAgZXh0ZXJuYWwgY2FtbF9saXN0X3RvX2pzX2FycmF5IDogJ2EgbGlzdCAtPiAnYSBKcy5qc19hcnJheSA9IFwiY2FtbF9saXN0X3RvX2pzX2FycmF5XCJcblxuICBleHRlcm5hbCB2YXJpYWJsZSA6IHN0cmluZyAtPiAnYSA9IFwiY2FtbF9qc192YXJcIlxuXG4gIGV4dGVybmFsIGNhbWxfc3RyaW5nX29mX2FycmF5IDogJ2EgYXJyYXkgLT4gc3RyaW5nID0gXCJjYW1sX3N0cmluZ19vZl9hcnJheVwiXG5lbmRcblxubW9kdWxlIFR5cGVkX2FycmF5ID0gc3RydWN0XG4gIHR5cGUgKCdhLCAnYikgdHlwZWRBcnJheSA9IEpzLnRcblxuICB0eXBlIGFycmF5QnVmZmVyID0gSnMudFxuXG4gIHR5cGUgdWludDhBcnJheSA9IEpzLnRcblxuICBleHRlcm5hbCBraW5kIDogKCdhLCAnYikgdHlwZWRBcnJheSAtPiAoJ2EsICdiKSBCaWdhcnJheS5raW5kXG4gICAgPSBcImNhbWxfYmFfa2luZF9vZl90eXBlZF9hcnJheVwiXG5cbiAgZXh0ZXJuYWwgZnJvbV9nZW5hcnJheSA6XG4gICAgKCdhLCAnYiwgQmlnYXJyYXkuY19sYXlvdXQpIEJpZ2FycmF5LkdlbmFycmF5LnQgLT4gKCdhLCAnYikgdHlwZWRBcnJheVxuICAgID0gXCJjYW1sX2JhX3RvX3R5cGVkX2FycmF5XCJcblxuICBleHRlcm5hbCB0b19nZW5hcnJheSA6XG4gICAgKCdhLCAnYikgdHlwZWRBcnJheSAtPiAoJ2EsICdiLCBCaWdhcnJheS5jX2xheW91dCkgQmlnYXJyYXkuR2VuYXJyYXkudFxuICAgID0gXCJjYW1sX2JhX2Zyb21fdHlwZWRfYXJyYXlcIlxuXG4gIG1vZHVsZSBCaWdzdHJpbmcgPSBzdHJ1Y3RcbiAgICB0eXBlIHQgPSAoY2hhciwgQmlnYXJyYXkuaW50OF91bnNpZ25lZF9lbHQsIEJpZ2FycmF5LmNfbGF5b3V0KSBCaWdhcnJheS5BcnJheTEudFxuXG4gICAgZXh0ZXJuYWwgdG9fYXJyYXlCdWZmZXIgOiB0IC0+IGFycmF5QnVmZmVyID0gXCJiaWdzdHJpbmdfdG9fYXJyYXlfYnVmZmVyXCJcblxuICAgIGV4dGVybmFsIHRvX3VpbnQ4QXJyYXkgOiB0IC0+IHVpbnQ4QXJyYXkgPSBcImJpZ3N0cmluZ190b190eXBlZF9hcnJheVwiXG5cbiAgICBleHRlcm5hbCBvZl9hcnJheUJ1ZmZlciA6IGFycmF5QnVmZmVyIC0+IHQgPSBcImJpZ3N0cmluZ19vZl9hcnJheV9idWZmZXJcIlxuXG4gICAgZXh0ZXJuYWwgb2ZfdWludDhBcnJheSA6IHVpbnQ4QXJyYXkgLT4gdCA9IFwiYmlnc3RyaW5nX29mX3R5cGVkX2FycmF5XCJcbiAgZW5kXG5cbiAgZXh0ZXJuYWwgc3RyaW5nX29mX3VpbnQ4QXJyYXkgOiB1aW50OEFycmF5IC0+IHN0cmluZyA9IFwiY2FtbF9zdHJpbmdfb2ZfdWludDhfYXJyYXlcIlxuXG4gIGV4dGVybmFsIGJ5dGVzX29mX3VpbnQ4QXJyYXkgOiB1aW50OEFycmF5IC0+IGJ5dGVzID0gXCJjYW1sX2J5dGVzX29mX3VpbnQ4X2FycmF5XCJcblxuICBleHRlcm5hbCB1aW50OEFycmF5X29mX2J5dGVzIDogYnl0ZXMgLT4gdWludDhBcnJheSA9IFwiY2FtbF91aW50OF9hcnJheV9vZl9ieXRlc1wiXG5lbmRcblxubW9kdWxlIEludDY0ID0gc3RydWN0XG4gIGV4dGVybmFsIGNyZWF0ZV9pbnQ2NF9sb19taV9oaSA6IGludCAtPiBpbnQgLT4gaW50IC0+IEludDY0LnRcbiAgICA9IFwiY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGlcIlxuZW5kXG5cbm1vZHVsZSBFZmZlY3QgOiBzaWdcbiAgZXh0ZXJuYWwgYXNzdW1lX25vX3BlcmZvcm0gOiAodW5pdCAtPiAnYSkgLT4gJ2EgPSBcImNhbWxfYXNzdW1lX25vX3BlcmZvcm1cIlxuICAoKiogUGFzc2luZyBhIGZ1bmN0aW9uIFtmXSBhcyBhcmd1bWVudCBvZiBgYXNzdW1lX25vX3BlcmZvcm1gIGd1YXJhbnRlZXMgdGhhdCxcbiAgICAgIHdoZW4gY29tcGlsaW5nIHdpdGggYC0tZWZmZWN0cz1kb3VibGUtdHJhbnNsYXRpb25gLCB0aGUgZGlyZWN0LXN0eWxlXG4gICAgICB2ZXJzaW9uIG9mIFtmXSBpcyBjYWxsZWQsIHdoaWNoIGlzIGZhc3RlciB0aGFuIHRoZSBDUFMgdmVyc2lvbi4gQXMgYVxuICAgICAgY29uc2VxdWVuY2UsIHBlcmZvcm1pbmcgYW4gZWZmZWN0IGluIGEgdHJhbnNpdGl2ZSBjYWxsZWUgb2YgW2ZdIHdpbGxcbiAgICAgIHJhaXNlIGBFZmZlY3QuVW5oYW5kbGVkYCwgcmVnYXJkbGVzcyBvZiBhbnkgZWZmZWN0IGhhbmRsZXJzIGluc3RhbGxlZFxuICAgICAgYmVmb3JlIHRoZSBjYWxsIHRvIGBhc3N1bWVfbm9fcGVyZm9ybWAsIHVubGVzcyBhIG5ldyBlZmZlY3QgaGFuZGxlciB3YXNcbiAgICAgIGluc3RhbGxlZCBpbiB0aGUgbWVhbnRpbWUuXG5cbiAgICAgIFRoaXMgYmVoYXZpb3VyIGlzIHRoZSBzYW1lIHdoZW4gZG91YmxlIHRyYW5zbGF0aW9uIGlzIGRpc2FibGVkLiAqKVxuZW5kID0gc3RydWN0XG4gIGV4dGVybmFsIGFzc3VtZV9ub19wZXJmb3JtIDogKHVuaXQgLT4gJ2EpIC0+ICdhID0gXCJjYW1sX2Fzc3VtZV9ub19wZXJmb3JtXCJcbmVuZFxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJnbG9iYWxfZGF0YSIsIkFzc2VydF9mYWlsdXJlIiwiSnNvb19ydW50aW1lX1J1bnRpbWVfdmVyc2lvbiIsIlN0ZGxpYl9DYWxsYmFjayIsImVmZmVjdHMiLCJwYXJhbSIsIm1hdGNoIiwidmVyc2lvbiIsImdpdF92ZXJzaW9uIiwiRXhuIiwiRXJyb3IiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsOEJBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQywrQkFBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUE7QUFBQSxZQUFBQyxRQUFBQztBQUFBQSxRQUFBQyxRQ2lLWTtBQUFBLElBQVcsb0JBRU47QUFBQSxJQUZNLHlCQUNEO0FBQUEsSUFEQztBQUFBLEtBSVY7QUFBQSxJQURtQjtBQUFBLEdBQ1A7QUFBQTtBQUFBLElBQUFDLFVEckt6QjtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxNQUFBO0FBQUEsR0N3TVU7QUFBQTtBQUFBLElBQUFDO0FBQUFBLE1BQTREO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFRHhNdEUiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjozNzA3OCwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJqc19vZl9vY2FtbC5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL2pzX29mX29jYW1sL2ltcG9ydC5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqIEpzX29mX29jYW1sXG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxuXG5tb2R1bGUgUG9seSA9IHN0cnVjdFxuICBleHRlcm5hbCAoIDwgKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVsZXNzdGhhblwiXG5cbiAgZXh0ZXJuYWwgKCA8PSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWxlc3NlcXVhbFwiXG5cbiAgZXh0ZXJuYWwgKCA8PiApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJW5vdGVxdWFsXCJcblxuICBleHRlcm5hbCAoID0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVlcXVhbFwiXG5cbiAgZXh0ZXJuYWwgKCA+ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZ3JlYXRlcnRoYW5cIlxuXG4gIGV4dGVybmFsICggPj0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVncmVhdGVyZXF1YWxcIlxuXG4gIGV4dGVybmFsIGNvbXBhcmUgOiAnYSAtPiAnYSAtPiBpbnQgPSBcIiVjb21wYXJlXCJcblxuICBleHRlcm5hbCBlcXVhbCA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVlcXVhbFwiXG5lbmRcblxubW9kdWxlIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgPSBzdHJ1Y3RcbiAgZXh0ZXJuYWwgKCA8ICkgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVsZXNzdGhhblwiXG5cbiAgZXh0ZXJuYWwgKCA8PSApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlbGVzc2VxdWFsXCJcblxuICBleHRlcm5hbCAoIDw+ICkgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVub3RlcXVhbFwiXG5cbiAgZXh0ZXJuYWwgKCA9ICkgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVlcXVhbFwiXG5cbiAgZXh0ZXJuYWwgKCA+ICkgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVncmVhdGVydGhhblwiXG5cbiAgZXh0ZXJuYWwgKCA+PSApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlZ3JlYXRlcmVxdWFsXCJcblxuICBleHRlcm5hbCBjb21wYXJlIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVjb21wYXJlXCJcblxuICBleHRlcm5hbCBlcXVhbCA6IGludCAtPiBpbnQgLT4gYm9vbCA9IFwiJWVxdWFsXCJcblxuICBsZXQgbWF4ICh4IDogaW50KSB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcblxuICBsZXQgbWluICh4IDogaW50KSB5ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmVuZFxuXG5tb2R1bGUgU3RyaW5nID0gc3RydWN0XG4gIGluY2x1ZGUgU3RyaW5nXG5cbiAgbGV0IGVxdWFsICh4IDogc3RyaW5nKSAoeSA6IHN0cmluZykgPSBQb2x5LmVxdWFsIHggeVxuZW5kXG5cbm1vZHVsZSBDaGFyID0gc3RydWN0XG4gIGluY2x1ZGUgQ2hhclxuXG4gIGxldCBlcXVhbCAoeCA6IGNoYXIpICh5IDogY2hhcikgPSBQb2x5LmVxdWFsIHggeVxuZW5kXG5cbmluY2x1ZGUgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJnbG9iYWxfZGF0YSIsIlN0ZGxpYl9TdHJpbmciLCJTdGRsaWJfQ2hhciIsIm1heCIsIngiLCJ5IiwibWluIiwibWFrZSIsImluaXQiLCJlbXB0eSIsIm9mX2J5dGVzIiwidG9fYnl0ZXMiLCJibGl0IiwiY29uY2F0IiwiY2F0IiwiY29tcGFyZSIsInN0YXJ0c193aXRoIiwiZW5kc193aXRoIiwiY29udGFpbnNfZnJvbSIsInJjb250YWluc19mcm9tIiwiY29udGFpbnMiLCJzdWIiLCJzcGxpdF9vbl9jaGFyIiwibWFwIiwibWFwaSIsImZvbGRfbGVmdCIsImZvbGRfcmlnaHQiLCJmb3JfYWxsIiwiZXhpc3RzIiwidHJpbSIsImVzY2FwZWQiLCJ1cHBlcmNhc2VfYXNjaWkiLCJsb3dlcmNhc2VfYXNjaWkiLCJjYXBpdGFsaXplX2FzY2lpIiwidW5jYXBpdGFsaXplX2FzY2lpIiwiaXRlciIsIml0ZXJpIiwiaW5kZXhfZnJvbSIsImluZGV4X2Zyb21fb3B0IiwicmluZGV4X2Zyb20iLCJyaW5kZXhfZnJvbV9vcHQiLCJpbmRleCIsImluZGV4X29wdCIsInJpbmRleCIsInJpbmRleF9vcHQiLCJ0b19zZXEiLCJ0b19zZXFpIiwib2Zfc2VxIiwiZ2V0X3V0Zl84X3VjaGFyIiwiaXNfdmFsaWRfdXRmXzgiLCJnZXRfdXRmXzE2YmVfdWNoYXIiLCJpc192YWxpZF91dGZfMTZiZSIsImdldF91dGZfMTZsZV91Y2hhciIsImlzX3ZhbGlkX3V0Zl8xNmxlIiwiZ2V0X3VpbnQ4IiwiZ2V0X2ludDgiLCJnZXRfdWludDE2X25lIiwiZ2V0X3VpbnQxNl9iZSIsImdldF91aW50MTZfbGUiLCJnZXRfaW50MTZfbmUiLCJnZXRfaW50MTZfYmUiLCJnZXRfaW50MTZfbGUiLCJnZXRfaW50MzJfbmUiLCJoYXNoIiwic2VlZGVkX2hhc2giLCJnZXRfaW50MzJfYmUiLCJnZXRfaW50MzJfbGUiLCJnZXRfaW50NjRfbmUiLCJnZXRfaW50NjRfYmUiLCJnZXRfaW50NjRfbGUiLCJlcXVhbCIsImNociJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsWUFBQUMsSUFBQUMsR0FBQUMsR0NxRHdCLHFCQUF1QjtBQUFBLFlBQUFDLElBQUFGLEdBQUFDLEdBRXZCLHFCQUF1QjtBQUFBO0FBQUEsSUFBQUUsT0R2RC9DO0FBQUEsSUFBQUMsT0FBQTtBQUFBLElBQUFDLFFBQUE7QUFBQSxJQUFBQyxXQUFBO0FBQUEsSUFBQUMsV0FBQTtBQUFBLElBQUFDLE9BQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsTUFBQTtBQUFBLElBQUFDLFVBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsWUFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyxXQUFBO0FBQUEsSUFBQUMsTUFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsTUFBQTtBQUFBLElBQUFDLE9BQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsYUFBQTtBQUFBLElBQUFDLFVBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsT0FBQTtBQUFBLElBQUFDLFVBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxxQkFBQTtBQUFBLElBQUFDLE9BQUE7QUFBQSxJQUFBQyxRQUFBO0FBQUEsSUFBQUMsYUFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsSUFBQUMsUUFBQTtBQUFBLElBQUFDLFlBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsYUFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxVQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyxxQkFBQTtBQUFBLElBQUFDLG9CQUFBO0FBQUEsSUFBQUMscUJBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLFlBQUE7QUFBQSxJQUFBQyxXQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLE9BQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxRQUFBO0FBQUEsSUFBQUMsTUFBQTtBQUFBLElBQUF6QyxZQUFBO0FBQUEsSUFBQUUsb0JBQUE7QUFBQSxJQUFBRCxvQkFBQTtBQUFBLElBQUFoQixZQUFBO0FBQUEsSUFBQWlELGdCQUFBO0FBQUEsSUFBQUQsU0FBQTtBQUFBLFlBQUFPLFFBQUFsRSxHQUFBQyxHQ21Fb0MsdUJBQWM7QUFBQSxHRG5FbEQiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjozNzI1MCwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJqc19vZl9vY2FtbC5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL2pzX29mX29jYW1sL2pzLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuICogTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5vcGVuISBJbXBvcnRcblxuKCogVGhpcyBsb2NhbCBtb2R1bGUgW0pzXSBpcyBuZWVkZWQgc28gdGhhdCB0aGUgcHB4X2pzIGV4dGVuc2lvbiB3b3JrIHdpdGhpbiB0aGF0IGZpbGUuICopXG5tb2R1bGUgSnMgPSBzdHJ1Y3RcbiAgdHlwZSArJ2EgdFxuXG4gIHR5cGUgKC0nYSwgKydiKSBtZXRoX2NhbGxiYWNrXG5cbiAgbW9kdWxlIFVuc2FmZSA9IHN0cnVjdFxuICAgIHR5cGUgdG9wXG5cbiAgICB0eXBlIGFueSA9IHRvcCB0XG5cbiAgICB0eXBlIGFueV9qc19hcnJheSA9IGFueVxuXG4gICAgZXh0ZXJuYWwgaW5qZWN0IDogJ2EgLT4gYW55ID0gXCIlaWRlbnRpdHlcIlxuXG4gICAgZXh0ZXJuYWwgY29lcmNlIDogXyB0IC0+IF8gdCA9IFwiJWlkZW50aXR5XCJcblxuICAgIGV4dGVybmFsIGdldCA6ICdhIC0+ICdiIC0+ICdjID0gXCJjYW1sX2pzX2dldFwiXG5cbiAgICBleHRlcm5hbCBzZXQgOiAnYSAtPiAnYiAtPiAnYyAtPiB1bml0ID0gXCJjYW1sX2pzX3NldFwiXG5cbiAgICBleHRlcm5hbCBkZWxldGUgOiAnYSAtPiAnYiAtPiB1bml0ID0gXCJjYW1sX2pzX2RlbGV0ZVwiXG5cbiAgICBleHRlcm5hbCBjYWxsIDogJ2EgLT4gJ2IgLT4gYW55IGFycmF5IC0+ICdjID0gXCJjYW1sX2pzX2NhbGxcIlxuXG4gICAgZXh0ZXJuYWwgZnVuX2NhbGwgOiAnYSAtPiBhbnkgYXJyYXkgLT4gJ2IgPSBcImNhbWxfanNfZnVuX2NhbGxcIlxuXG4gICAgZXh0ZXJuYWwgbWV0aF9jYWxsIDogJ2EgLT4gc3RyaW5nIC0+IGFueSBhcnJheSAtPiAnYiA9IFwiY2FtbF9qc19tZXRoX2NhbGxcIlxuXG4gICAgZXh0ZXJuYWwgbmV3X29iaiA6ICdhIC0+IGFueSBhcnJheSAtPiAnYiA9IFwiY2FtbF9qc19uZXdcIlxuXG4gICAgZXh0ZXJuYWwgbmV3X29ial9hcnIgOiAnYSAtPiBhbnlfanNfYXJyYXkgLT4gJ2IgPSBcImNhbWxfb2pzX25ld19hcnJcIlxuXG4gICAgZXh0ZXJuYWwgb2JqIDogKHN0cmluZyAqIGFueSkgYXJyYXkgLT4gJ2EgPSBcImNhbWxfanNfb2JqZWN0XCJcblxuICAgIGV4dGVybmFsIGVxdWFscyA6ICdhIC0+ICdiIC0+IGJvb2wgPSBcImNhbWxfanNfZXF1YWxzXCJcblxuICAgIGV4dGVybmFsIHN0cmljdF9lcXVhbHMgOiAnYSAtPiAnYiAtPiBib29sID0gXCJjYW1sX2pzX3N0cmljdF9lcXVhbHNcIlxuXG4gICAgZXh0ZXJuYWwgcHVyZV9leHByIDogKHVuaXQgLT4gJ2EpIC0+ICdhID0gXCJjYW1sX2pzX3B1cmVfZXhwclwiXG5cbiAgICBleHRlcm5hbCBldmFsX3N0cmluZyA6IHN0cmluZyAtPiAnYSA9IFwiY2FtbF9qc19ldmFsX3N0cmluZ1wiXG5cbiAgICBleHRlcm5hbCBqc19leHByIDogc3RyaW5nIC0+ICdhID0gXCJjYW1sX2pzX2V4cHJcIlxuXG4gICAgZXh0ZXJuYWwgcHVyZV9qc19leHByIDogc3RyaW5nIC0+ICdhID0gXCJjYW1sX3B1cmVfanNfZXhwclwiXG5cbiAgICBsZXQgZ2xvYmFsID0gcHVyZV9qc19leHByIFwiZ2xvYmFsVGhpc1wiXG5cbiAgICBleHRlcm5hbCBjYWxsYmFjayA6ICgnYSAtPiAnYikgLT4gKCdjLCAnYSAtPiAnYikgbWV0aF9jYWxsYmFja1xuICAgICAgPSBcImNhbWxfanNfd3JhcF9jYWxsYmFja191bnNhZmVcIlxuXG4gICAgZXh0ZXJuYWwgY2FsbGJhY2tfd2l0aF9hcmd1bWVudHMgOlxuICAgICAgKGFueV9qc19hcnJheSAtPiAnYikgLT4gKCdjLCBhbnlfanNfYXJyYXkgLT4gJ2IpIG1ldGhfY2FsbGJhY2tcbiAgICAgID0gXCJjYW1sX2pzX3dyYXBfY2FsbGJhY2tfYXJndW1lbnRzXCJcblxuICAgIGV4dGVybmFsIGNhbGxiYWNrX3dpdGhfYXJpdHkgOiBpbnQgLT4gKCdhIC0+ICdiKSAtPiAoJ2MsICdhIC0+ICdiKSBtZXRoX2NhbGxiYWNrXG4gICAgICA9IFwiY2FtbF9qc193cmFwX2NhbGxiYWNrX3N0cmljdFwiXG5cbiAgICBleHRlcm5hbCBtZXRoX2NhbGxiYWNrIDogKCdiIC0+ICdhKSAtPiAoJ2IsICdhKSBtZXRoX2NhbGxiYWNrXG4gICAgICA9IFwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfdW5zYWZlXCJcblxuICAgIGV4dGVybmFsIG1ldGhfY2FsbGJhY2tfd2l0aF9hcml0eSA6IGludCAtPiAoJ2IgLT4gJ2EpIC0+ICgnYiwgJ2EpIG1ldGhfY2FsbGJhY2tcbiAgICAgID0gXCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19zdHJpY3RcIlxuXG4gICAgZXh0ZXJuYWwgbWV0aF9jYWxsYmFja193aXRoX2FyZ3VtZW50cyA6XG4gICAgICAoJ2IgLT4gYW55X2pzX2FycmF5IC0+ICdhKSAtPiAoJ2IsIGFueV9qc19hcnJheSAtPiAnYSkgbWV0aF9jYWxsYmFja1xuICAgICAgPSBcImNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX2FyZ3VtZW50c1wiXG5cbiAgICBleHRlcm5hbCBydW50aW1lX3ZhbHVlIDogc3RyaW5nIC0+ICdhID0gXCJjYW1sX2pzb29fcnVudGltZV92YWx1ZVwiXG5cbiAgICAoKiBERVBSRUNBVEVEICopXG4gICAgZXh0ZXJuYWwgdmFyaWFibGUgOiBzdHJpbmcgLT4gJ2EgPSBcImNhbWxfanNfdmFyXCJcbiAgZW5kXG5cbiAgKCoqKiopXG5cbiAgdHlwZSAnYSBvcHQgPSAnYVxuXG4gIHR5cGUgJ2Egb3B0ZGVmID0gJ2FcblxuICBleHRlcm5hbCBkZWJ1Z2dlciA6IHVuaXQgLT4gdW5pdCA9IFwiZGVidWdnZXJcIlxuXG4gIGxldCBudWxsIDogJ2Egb3B0ID0gVW5zYWZlLnB1cmVfanNfZXhwciBcIm51bGxcIlxuXG4gIGV4dGVybmFsIHNvbWUgOiAnYSAtPiAnYSBvcHQgPSBcIiVpZGVudGl0eVwiXG5cbiAgbGV0IHVuZGVmaW5lZCA6ICdhIG9wdGRlZiA9IFVuc2FmZS5wdXJlX2pzX2V4cHIgXCJ1bmRlZmluZWRcIlxuXG4gIGV4dGVybmFsIGRlZiA6ICdhIC0+ICdhIG9wdGRlZiA9IFwiJWlkZW50aXR5XCJcblxuICBtb2R1bGUgdHlwZSBPUFQgPSBzaWdcbiAgICB0eXBlICdhIHRcblxuICAgIHZhbCBlbXB0eSA6ICdhIHRcblxuICAgIHZhbCByZXR1cm4gOiAnYSAtPiAnYSB0XG5cbiAgICB2YWwgbWFwIDogJ2EgdCAtPiAoJ2EgLT4gJ2IpIC0+ICdiIHRcblxuICAgIHZhbCBiaW5kIDogJ2EgdCAtPiAoJ2EgLT4gJ2IgdCkgLT4gJ2IgdFxuXG4gICAgdmFsIHRlc3QgOiAnYSB0IC0+IGJvb2xcblxuICAgIHZhbCBpdGVyIDogJ2EgdCAtPiAoJ2EgLT4gdW5pdCkgLT4gdW5pdFxuXG4gICAgdmFsIGNhc2UgOiAnYSB0IC0+ICh1bml0IC0+ICdiKSAtPiAoJ2EgLT4gJ2IpIC0+ICdiXG5cbiAgICB2YWwgZ2V0IDogJ2EgdCAtPiAodW5pdCAtPiAnYSkgLT4gJ2FcblxuICAgIHZhbCBvcHRpb24gOiAnYSBvcHRpb24gLT4gJ2EgdFxuXG4gICAgdmFsIHRvX29wdGlvbiA6ICdhIHQgLT4gJ2Egb3B0aW9uXG5cbiAgICBleHRlcm5hbCBlcXVhbHMgOiBfIHQgLT4gXyB0IC0+IGJvb2wgPSBcImNhbWxfanNfZXF1YWxzXCJcblxuICAgIGV4dGVybmFsIHN0cmljdF9lcXVhbHMgOiBfIHQgLT4gXyB0IC0+IGJvb2wgPSBcImNhbWxfanNfc3RyaWN0X2VxdWFsc1wiXG4gIGVuZFxuXG4gIG1vZHVsZSBPcHQgOiBPUFQgd2l0aCB0eXBlICdhIHQgPSAnYSBvcHQgPSBzdHJ1Y3RcbiAgICB0eXBlICdhIHQgPSAnYSBvcHRcblxuICAgIGxldCBlbXB0eSA9IG51bGxcblxuICAgIGxldCByZXR1cm4gPSBzb21lXG5cbiAgICBleHRlcm5hbCBlcXVhbHMgOiBfIHQgLT4gXyB0IC0+IGJvb2wgPSBcImNhbWxfanNfZXF1YWxzXCJcblxuICAgIGV4dGVybmFsIHN0cmljdF9lcXVhbHMgOiBfIHQgLT4gXyB0IC0+IGJvb2wgPSBcImNhbWxfanNfc3RyaWN0X2VxdWFsc1wiXG5cbiAgICBsZXQgbWFwIHggZiA9IGlmIGVxdWFscyB4IG51bGwgdGhlbiBudWxsIGVsc2UgcmV0dXJuIChmIHgpXG5cbiAgICBsZXQgYmluZCB4IGYgPSBpZiBlcXVhbHMgeCBudWxsIHRoZW4gbnVsbCBlbHNlIGYgeFxuXG4gICAgbGV0IHRlc3QgeCA9IG5vdCAoZXF1YWxzIHggbnVsbClcblxuICAgIGxldCBpdGVyIHggZiA9IGlmIG5vdCAoZXF1YWxzIHggbnVsbCkgdGhlbiBmIHhcblxuICAgIGxldCBjYXNlIHggZiBnID0gaWYgZXF1YWxzIHggbnVsbCB0aGVuIGYgKCkgZWxzZSBnIHhcblxuICAgIGxldCBnZXQgeCBmID0gaWYgZXF1YWxzIHggbnVsbCB0aGVuIGYgKCkgZWxzZSB4XG5cbiAgICBsZXQgb3B0aW9uIHggPVxuICAgICAgbWF0Y2ggeCB3aXRoXG4gICAgICB8IE5vbmUgLT4gZW1wdHlcbiAgICAgIHwgU29tZSB4IC0+IHJldHVybiB4XG5cbiAgICBsZXQgdG9fb3B0aW9uIHggPSBjYXNlIHggKGZ1biAoKSAtPiBOb25lKSAoZnVuIHggLT4gU29tZSB4KVxuICBlbmRcblxuICBtb2R1bGUgT3B0ZGVmIDogT1BUIHdpdGggdHlwZSAnYSB0ID0gJ2Egb3B0ZGVmID0gc3RydWN0XG4gICAgdHlwZSAnYSB0ID0gJ2Egb3B0ZGVmXG5cbiAgICBsZXQgZW1wdHkgPSB1bmRlZmluZWRcblxuICAgIGxldCByZXR1cm4gPSBkZWZcblxuICAgIGV4dGVybmFsIGVxdWFscyA6IF8gdCAtPiBfIHQgLT4gYm9vbCA9IFwiY2FtbF9qc19lcXVhbHNcIlxuXG4gICAgZXh0ZXJuYWwgc3RyaWN0X2VxdWFscyA6IF8gdCAtPiBfIHQgLT4gYm9vbCA9IFwiY2FtbF9qc19zdHJpY3RfZXF1YWxzXCJcblxuICAgIGxldCBtYXAgeCBmID0gaWYgc3RyaWN0X2VxdWFscyB4IHVuZGVmaW5lZCB0aGVuIHVuZGVmaW5lZCBlbHNlIHJldHVybiAoZiB4KVxuXG4gICAgbGV0IGJpbmQgeCBmID0gaWYgc3RyaWN0X2VxdWFscyB4IHVuZGVmaW5lZCB0aGVuIHVuZGVmaW5lZCBlbHNlIGYgeFxuXG4gICAgbGV0IHRlc3QgeCA9IG5vdCAoc3RyaWN0X2VxdWFscyB4IHVuZGVmaW5lZClcblxuICAgIGxldCBpdGVyIHggZiA9IGlmIG5vdCAoc3RyaWN0X2VxdWFscyB4IHVuZGVmaW5lZCkgdGhlbiBmIHhcblxuICAgIGxldCBjYXNlIHggZiBnID0gaWYgc3RyaWN0X2VxdWFscyB4IHVuZGVmaW5lZCB0aGVuIGYgKCkgZWxzZSBnIHhcblxuICAgIGxldCBnZXQgeCBmID0gaWYgc3RyaWN0X2VxdWFscyB4IHVuZGVmaW5lZCB0aGVuIGYgKCkgZWxzZSB4XG5cbiAgICBsZXQgb3B0aW9uIHggPVxuICAgICAgbWF0Y2ggeCB3aXRoXG4gICAgICB8IE5vbmUgLT4gZW1wdHlcbiAgICAgIHwgU29tZSB4IC0+IHJldHVybiB4XG5cbiAgICBsZXQgdG9fb3B0aW9uIHggPSBjYXNlIHggKGZ1biAoKSAtPiBOb25lKSAoZnVuIHggLT4gU29tZSB4KVxuICBlbmRcblxuICAoKioqKilcblxuICBsZXQgY29lcmNlIHggZiBnID0gT3B0LmdldCAoZiB4KSAoZnVuICgpIC0+IGcgeClcblxuICBsZXQgY29lcmNlX29wdCB4IGYgZyA9IE9wdC5nZXQgKE9wdC5iaW5kIHggZikgKGZ1biAoKSAtPiBnIHgpXG5cbiAgKCoqKiopXG5cbiAgdHlwZSArJ2EgbWV0aFxuXG4gIHR5cGUgKydhIGdlbl9wcm9wXG5cbiAgdHlwZSAnYSByZWFkb25seV9wcm9wID0gPCBnZXQgOiAnYSA+IGdlbl9wcm9wXG5cbiAgdHlwZSAnYSB3cml0ZW9ubHlfcHJvcCA9IDwgc2V0IDogJ2EgLT4gdW5pdCA+IGdlbl9wcm9wXG5cbiAgdHlwZSAnYSBwcm9wID0gPCBnZXQgOiAnYSA7IHNldCA6ICdhIC0+IHVuaXQgPiBnZW5fcHJvcFxuXG4gIHR5cGUgJ2Egb3B0ZGVmX3Byb3AgPSA8IGdldCA6ICdhIG9wdGRlZiA7IHNldCA6ICdhIC0+IHVuaXQgPiBnZW5fcHJvcFxuXG4gIHR5cGUgKydhIGNvbnN0clxuXG4gICgqKioqKVxuXG4gIHR5cGUgJ2EgY2FsbGJhY2sgPSAodW5pdCwgJ2EpIG1ldGhfY2FsbGJhY2tcblxuICBleHRlcm5hbCB3cmFwX2NhbGxiYWNrIDogKCdhIC0+ICdiKSAtPiAoJ2MsICdhIC0+ICdiKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9jYWxsYmFja1wiXG5cbiAgZXh0ZXJuYWwgd3JhcF9tZXRoX2NhbGxiYWNrIDogKCdhIC0+ICdiKSAtPiAoJ2EsICdiKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrXCJcblxuICAoKioqKilcblxuICBleHRlcm5hbCBlcXVhbHMgOiBfIHQgLT4gXyB0IC0+IGJvb2wgPSBcImNhbWxfanNfZXF1YWxzXCJcblxuICBleHRlcm5hbCBzdHJpY3RfZXF1YWxzIDogXyB0IC0+IF8gdCAtPiBib29sID0gXCJjYW1sX2pzX3N0cmljdF9lcXVhbHNcIlxuXG4gICgqKioqKVxuXG4gIGxldCBfdHJ1ZSA9IFVuc2FmZS5wdXJlX2pzX2V4cHIgXCJ0cnVlXCJcblxuICBsZXQgX2ZhbHNlID0gVW5zYWZlLnB1cmVfanNfZXhwciBcImZhbHNlXCJcblxuICB0eXBlIG1hdGNoX3Jlc3VsdF9oYW5kbGVcblxuICB0eXBlIHN0cmluZ19hcnJheVxuXG4gIGNsYXNzIHR5cGUgbnVtYmVyID0gb2JqZWN0XG4gICAgbWV0aG9kIHRvU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvU3RyaW5nX3JhZGl4IDogaW50IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0xvY2FsZVN0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0ZpeGVkIDogaW50IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0V4cG9uZW50aWFsIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvRXhwb25lbnRpYWxfZGlnaXRzIDogaW50IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b1ByZWNpc2lvbiA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG4gIGVuZFxuXG4gIGFuZCBqc19zdHJpbmcgPSBvYmplY3RcbiAgICBtZXRob2QgdG9TdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdmFsdWVPZiA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBjaGFyQXQgOiBpbnQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIGNoYXJDb2RlQXQgOiBpbnQgLT4gbnVtYmVyIHQgbWV0aFxuXG4gICAgbWV0aG9kIGNvZGVQb2ludEF0IDogaW50IC0+IG51bWJlciB0IG9wdGRlZiBtZXRoXG5cbiAgICAoKiBUaGlzIG1heSByZXR1cm4gTmFOLi4uICopXG4gICAgbWV0aG9kIGNvbmNhdCA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBjb25jYXRfMiA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBjb25jYXRfMyA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBjb25jYXRfNCA6XG4gICAgICBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgaW5kZXhPZiA6IGpzX3N0cmluZyB0IC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgaW5kZXhPZl9mcm9tIDoganNfc3RyaW5nIHQgLT4gaW50IC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgbGFzdEluZGV4T2YgOiBqc19zdHJpbmcgdCAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGxhc3RJbmRleE9mX2Zyb20gOiBqc19zdHJpbmcgdCAtPiBpbnQgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCBsb2NhbGVDb21wYXJlIDoganNfc3RyaW5nIHQgLT4gbnVtYmVyIHQgbWV0aFxuXG4gICAgbWV0aG9kIF9tYXRjaCA6IHJlZ0V4cCB0IC0+IG1hdGNoX3Jlc3VsdF9oYW5kbGUgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIG5vcm1hbGl6ZSA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBub3JtYWxpemVfZm9ybSA6IG5vcm1hbGl6YXRpb24gdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgcmVwbGFjZSA6IHJlZ0V4cCB0IC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCByZXBsYWNlX3N0cmluZyA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBzZWFyY2ggOiByZWdFeHAgdCAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIHNsaWNlIDogaW50IC0+IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2Qgc2xpY2VfZW5kIDogaW50IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBzcGxpdCA6IGpzX3N0cmluZyB0IC0+IHN0cmluZ19hcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCBzcGxpdF9saW1pdGVkIDoganNfc3RyaW5nIHQgLT4gaW50IC0+IHN0cmluZ19hcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCBzcGxpdF9yZWdFeHAgOiByZWdFeHAgdCAtPiBzdHJpbmdfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2Qgc3BsaXRfcmVnRXhwTGltaXRlZCA6IHJlZ0V4cCB0IC0+IGludCAtPiBzdHJpbmdfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2Qgc3Vic3RyaW5nIDogaW50IC0+IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2Qgc3Vic3RyaW5nX3RvRW5kIDogaW50IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0xvd2VyQ2FzZSA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0xvY2FsZUxvd2VyQ2FzZSA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b1VwcGVyQ2FzZSA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0xvY2FsZVVwcGVyQ2FzZSA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0cmltIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIGxlbmd0aCA6IGludCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4gIGFuZCByZWdFeHAgPSBvYmplY3RcbiAgICBtZXRob2QgZXhlYyA6IGpzX3N0cmluZyB0IC0+IG1hdGNoX3Jlc3VsdF9oYW5kbGUgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIHRlc3QgOiBqc19zdHJpbmcgdCAtPiBib29sIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHNvdXJjZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBnbG9iYWwgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGlnbm9yZUNhc2UgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG11bHRpbGluZSA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbGFzdEluZGV4IDogaW50IHByb3BcbiAgZW5kXG5cbiAgYW5kIG5vcm1hbGl6YXRpb24gPSBqc19zdHJpbmdcblxuICB0eXBlIG51bWJlcl90ID0gbnVtYmVyIHRcblxuICAoKiBzdHJpbmcgaXMgdXNlZCBieSBwcHhfanMsIGl0IG5lZWRzIHRvIGNvbWUgYmVmb3JlIGFueSB1c2Ugb2YgdGhlXG4gICAgIG5ldyBzeW50YXggaW4gdGhpcyBmaWxlICopXG4gIGV4dGVybmFsIHN0cmluZyA6IHN0cmluZyAtPiBqc19zdHJpbmcgdCA9IFwiY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcIlxuXG4gIGV4dGVybmFsIHRvX3N0cmluZyA6IGpzX3N0cmluZyB0IC0+IHN0cmluZyA9IFwiY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcIlxuXG4gIGxldCBuZmMgPSBzdHJpbmcgXCJORkNcIlxuXG4gIGxldCBuZmQgPSBzdHJpbmcgXCJORkRcIlxuXG4gIGxldCBuZmtjID0gc3RyaW5nIFwiTkZLQ1wiXG5cbiAgbGV0IG5ma2QgPSBzdHJpbmcgXCJORktEXCJcbmVuZFxuXG5pbmNsdWRlIEpzXG5cbmNsYXNzIHR5cGUgc3RyaW5nX2NvbnN0ciA9IG9iamVjdFxuICBtZXRob2QgZnJvbUNoYXJDb2RlIDogaW50IC0+IGpzX3N0cmluZyB0IG1ldGhcbmVuZFxuXG5sZXQgc3RyaW5nX2NvbnN0ciA9IFVuc2FmZS5nbG9iYWwjIy5fU3RyaW5nXG5cbmxldCByZWdFeHAgPSBVbnNhZmUuZ2xvYmFsIyMuX1JlZ0V4cFxuXG5sZXQgcmVnRXhwX2NvcHkgPSByZWdFeHBcblxubGV0IHJlZ0V4cF93aXRoRmxhZ3MgPSByZWdFeHBcblxuY2xhc3MgdHlwZSBbJ2FdIGpzX2FycmF5ID0gb2JqZWN0XG4gIG1ldGhvZCB0b1N0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICBtZXRob2QgdG9Mb2NhbGVTdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgbWV0aG9kIGNvbmNhdCA6ICdhIGpzX2FycmF5IHQgLT4gJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgbWV0aG9kIGpvaW4gOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgbWV0aG9kIHBvcCA6ICdhIG9wdGRlZiBtZXRoXG5cbiAgbWV0aG9kIHB1c2ggOiAnYSAtPiBpbnQgbWV0aFxuXG4gIG1ldGhvZCBwdXNoXzIgOiAnYSAtPiAnYSAtPiBpbnQgbWV0aFxuXG4gIG1ldGhvZCBwdXNoXzMgOiAnYSAtPiAnYSAtPiAnYSAtPiBpbnQgbWV0aFxuXG4gIG1ldGhvZCBwdXNoXzQgOiAnYSAtPiAnYSAtPiAnYSAtPiAnYSAtPiBpbnQgbWV0aFxuXG4gIG1ldGhvZCByZXZlcnNlIDogJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgbWV0aG9kIHNoaWZ0IDogJ2Egb3B0ZGVmIG1ldGhcblxuICBtZXRob2Qgc2xpY2UgOiBpbnQgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gIG1ldGhvZCBzbGljZV9lbmQgOiBpbnQgLT4gJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgbWV0aG9kIHNvcnQgOiAoJ2EgLT4gJ2EgLT4gbnVtYmVyX3QpIGNhbGxiYWNrIC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gIG1ldGhvZCBzb3J0X2FzU3RyaW5ncyA6ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gIG1ldGhvZCBzcGxpY2UgOiBpbnQgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gIG1ldGhvZCBzcGxpY2VfMSA6IGludCAtPiBpbnQgLT4gJ2EgLT4gJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgbWV0aG9kIHNwbGljZV8yIDogaW50IC0+IGludCAtPiAnYSAtPiAnYSAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICBtZXRob2Qgc3BsaWNlXzMgOiBpbnQgLT4gaW50IC0+ICdhIC0+ICdhIC0+ICdhIC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gIG1ldGhvZCBzcGxpY2VfNCA6IGludCAtPiBpbnQgLT4gJ2EgLT4gJ2EgLT4gJ2EgLT4gJ2EgLT4gJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgbWV0aG9kIHVuc2hpZnQgOiAnYSAtPiBpbnQgbWV0aFxuXG4gIG1ldGhvZCB1bnNoaWZ0XzIgOiAnYSAtPiAnYSAtPiBpbnQgbWV0aFxuXG4gIG1ldGhvZCB1bnNoaWZ0XzMgOiAnYSAtPiAnYSAtPiAnYSAtPiBpbnQgbWV0aFxuXG4gIG1ldGhvZCB1bnNoaWZ0XzQgOiAnYSAtPiAnYSAtPiAnYSAtPiAnYSAtPiBpbnQgbWV0aFxuXG4gIG1ldGhvZCBzb21lIDogKCdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+IGJvb2wgdCkgY2FsbGJhY2sgLT4gYm9vbCB0IG1ldGhcblxuICBtZXRob2QgZXZlcnkgOiAoJ2EgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgLT4gYm9vbCB0KSBjYWxsYmFjayAtPiBib29sIHQgbWV0aFxuXG4gIG1ldGhvZCBmb3JFYWNoIDogKCdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+IHVuaXQpIGNhbGxiYWNrIC0+IHVuaXQgbWV0aFxuXG4gIG1ldGhvZCBtYXAgOiAoJ2EgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgLT4gJ2IpIGNhbGxiYWNrIC0+ICdiIGpzX2FycmF5IHQgbWV0aFxuXG4gIG1ldGhvZCBmaWx0ZXIgOiAoJ2EgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgLT4gYm9vbCB0KSBjYWxsYmFjayAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICBtZXRob2QgcmVkdWNlX2luaXQgOiAoJ2IgLT4gJ2EgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgLT4gJ2IpIGNhbGxiYWNrIC0+ICdiIC0+ICdiIG1ldGhcblxuICBtZXRob2QgcmVkdWNlIDogKCdhIC0+ICdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+ICdhKSBjYWxsYmFjayAtPiAnYSBtZXRoXG5cbiAgbWV0aG9kIHJlZHVjZVJpZ2h0X2luaXQgOlxuICAgICgnYiAtPiAnYSAtPiBpbnQgLT4gJ2EganNfYXJyYXkgdCAtPiAnYikgY2FsbGJhY2sgLT4gJ2IgLT4gJ2IgbWV0aFxuXG4gIG1ldGhvZCByZWR1Y2VSaWdodCA6ICgnYSAtPiAnYSAtPiBpbnQgLT4gJ2EganNfYXJyYXkgdCAtPiAnYSkgY2FsbGJhY2sgLT4gJ2EgbWV0aFxuXG4gIG1ldGhvZCBsZW5ndGggOiBpbnQgcHJvcFxuZW5kXG5cbmxldCBvYmplY3RfY29uc3RydWN0b3IgPSBVbnNhZmUuZ2xvYmFsIyMuX09iamVjdFxuXG5sZXQgb2JqZWN0X2tleXMgbyA6IGpzX3N0cmluZyB0IGpzX2FycmF5IHQgPSBvYmplY3RfY29uc3RydWN0b3IjI2tleXMgb1xuXG5sZXQgYXJyYXlfY29uc3RydWN0b3IgPSBVbnNhZmUuZ2xvYmFsIyMuX0FycmF5XG5cbmxldCBhcnJheV9lbXB0eSA9IGFycmF5X2NvbnN0cnVjdG9yXG5cbmxldCBhcnJheV9sZW5ndGggPSBhcnJheV9jb25zdHJ1Y3RvclxuXG5sZXQgYXJyYXlfZ2V0IDogJ2EgI2pzX2FycmF5IHQgLT4gaW50IC0+ICdhIG9wdGRlZiA9IFVuc2FmZS5nZXRcblxubGV0IGFycmF5X3NldCA6ICdhICNqc19hcnJheSB0IC0+IGludCAtPiAnYSAtPiB1bml0ID0gVW5zYWZlLnNldFxuXG5sZXQgYXJyYXlfbWFwX3BvbHkgOlxuICAgICdhICNqc19hcnJheSB0IC0+ICgnYSAtPiBpbnQgLT4gJ2EgI2pzX2FycmF5IHQgLT4gJ2IpIGNhbGxiYWNrIC0+ICdiICNqc19hcnJheSB0ID1cbiBmdW4gYSBjYiAtPiAoVW5zYWZlLmNvZXJjZSBhKSMjbWFwIGNiXG5cbmxldCBhcnJheV9tYXAgZiBhID0gYXJyYXlfbWFwX3BvbHkgYSAod3JhcF9jYWxsYmFjayAoZnVuIHggX2lkeCBfIC0+IGYgeCkpXG5cbmxldCBhcnJheV9tYXBpIGYgYSA9IGFycmF5X21hcF9wb2x5IGEgKHdyYXBfY2FsbGJhY2sgKGZ1biB4IGlkeCBfIC0+IGYgaWR4IHgpKVxuXG5jbGFzcyB0eXBlIG1hdGNoX3Jlc3VsdCA9IG9iamVjdFxuICBpbmhlcml0IFtqc19zdHJpbmcgdF0ganNfYXJyYXlcblxuICBtZXRob2QgaW5kZXggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gIG1ldGhvZCBpbnB1dCA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcbmVuZFxuXG5sZXQgc3RyX2FycmF5IDogc3RyaW5nX2FycmF5IHQgLT4ganNfc3RyaW5nIHQganNfYXJyYXkgdCA9IFVuc2FmZS5jb2VyY2VcblxubGV0IG1hdGNoX3Jlc3VsdCA6IG1hdGNoX3Jlc3VsdF9oYW5kbGUgdCAtPiBtYXRjaF9yZXN1bHQgdCA9IFVuc2FmZS5jb2VyY2VcblxuY2xhc3MgdHlwZSBkYXRlID0gb2JqZWN0XG4gIG1ldGhvZCB0b1N0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICBtZXRob2QgdG9EYXRlU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gIG1ldGhvZCB0b1RpbWVTdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgbWV0aG9kIHRvTG9jYWxlU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gIG1ldGhvZCB0b0xvY2FsZURhdGVTdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgbWV0aG9kIHRvTG9jYWxlVGltZVN0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICBtZXRob2QgdmFsdWVPZiA6IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgZ2V0VGltZSA6IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgZ2V0RnVsbFllYXIgOiBpbnQgbWV0aFxuXG4gIG1ldGhvZCBnZXRVVENGdWxsWWVhciA6IGludCBtZXRoXG5cbiAgbWV0aG9kIGdldE1vbnRoIDogaW50IG1ldGhcblxuICBtZXRob2QgZ2V0VVRDTW9udGggOiBpbnQgbWV0aFxuXG4gIG1ldGhvZCBnZXREYXRlIDogaW50IG1ldGhcblxuICBtZXRob2QgZ2V0VVRDRGF0ZSA6IGludCBtZXRoXG5cbiAgbWV0aG9kIGdldERheSA6IGludCBtZXRoXG5cbiAgbWV0aG9kIGdldFVUQ0RheSA6IGludCBtZXRoXG5cbiAgbWV0aG9kIGdldEhvdXJzIDogaW50IG1ldGhcblxuICBtZXRob2QgZ2V0VVRDSG91cnMgOiBpbnQgbWV0aFxuXG4gIG1ldGhvZCBnZXRNaW51dGVzIDogaW50IG1ldGhcblxuICBtZXRob2QgZ2V0VVRDTWludXRlcyA6IGludCBtZXRoXG5cbiAgbWV0aG9kIGdldFNlY29uZHMgOiBpbnQgbWV0aFxuXG4gIG1ldGhvZCBnZXRVVENTZWNvbmRzIDogaW50IG1ldGhcblxuICBtZXRob2QgZ2V0TWlsbGlzZWNvbmRzIDogaW50IG1ldGhcblxuICBtZXRob2QgZ2V0VVRDTWlsbGlzZWNvbmRzIDogaW50IG1ldGhcblxuICBtZXRob2QgZ2V0VGltZXpvbmVPZmZzZXQgOiBpbnQgbWV0aFxuXG4gIG1ldGhvZCBzZXRUaW1lIDogbnVtYmVyX3QgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBzZXRGdWxsWWVhciA6IGludCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIHNldFVUQ0Z1bGxZZWFyIDogaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc2V0TW9udGggOiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBzZXRVVENNb250aCA6IGludCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIHNldERhdGUgOiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBzZXRVVENEYXRlIDogaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc2V0SG91cnMgOiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBzZXRVVENIb3VycyA6IGludCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIHNldE1pbnV0ZXMgOiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBzZXRVVENNaW51dGVzIDogaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc2V0U2Vjb25kcyA6IGludCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIHNldFVUQ1NlY29uZHMgOiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBzZXRNaWxsaXNlY29uZHMgOiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBzZXRVVENNaWxsaXNlY29uZHMgOiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCB0b1VUQ1N0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICBtZXRob2QgdG9JU09TdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgbWV0aG9kIHRvSlNPTiA6ICdhIC0+IGpzX3N0cmluZyB0IG1ldGhcbmVuZFxuXG5jbGFzcyB0eXBlIGRhdGVfY29uc3RyID0gb2JqZWN0XG4gIG1ldGhvZCBwYXJzZSA6IGpzX3N0cmluZyB0IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgX1VUQ19tb250aCA6IGludCAtPiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBfVVRDX2RheSA6IGludCAtPiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBfVVRDX2hvdXIgOiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBfVVRDX21pbiA6IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBfVVRDX3NlYyA6IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgX1VUQ19tcyA6IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIG5vdyA6IG51bWJlcl90IG1ldGhcbmVuZFxuXG5sZXQgZGF0ZV9jb25zdHIgPSBVbnNhZmUuZ2xvYmFsIyMuX0RhdGVcblxubGV0IGRhdGUgOiBkYXRlX2NvbnN0ciB0ID0gZGF0ZV9jb25zdHJcblxubGV0IGRhdGVfbm93IDogZGF0ZSB0IGNvbnN0ciA9IGRhdGVfY29uc3RyXG5cbmxldCBkYXRlX2Zyb21UaW1lVmFsdWUgOiAobnVtYmVyX3QgLT4gZGF0ZSB0KSBjb25zdHIgPSBkYXRlX2NvbnN0clxuXG5sZXQgZGF0ZV9tb250aCA6IChpbnQgLT4gaW50IC0+IGRhdGUgdCkgY29uc3RyID0gZGF0ZV9jb25zdHJcblxubGV0IGRhdGVfZGF5IDogKGludCAtPiBpbnQgLT4gaW50IC0+IGRhdGUgdCkgY29uc3RyID0gZGF0ZV9jb25zdHJcblxubGV0IGRhdGVfaG91ciA6IChpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gZGF0ZSB0KSBjb25zdHIgPSBkYXRlX2NvbnN0clxuXG5sZXQgZGF0ZV9taW4gOiAoaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBkYXRlIHQpIGNvbnN0ciA9IGRhdGVfY29uc3RyXG5cbmxldCBkYXRlX3NlYyA6IChpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBkYXRlIHQpIGNvbnN0ciA9IGRhdGVfY29uc3RyXG5cbmxldCBkYXRlX21zIDogKGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBkYXRlIHQpIGNvbnN0ciA9XG4gIGRhdGVfY29uc3RyXG5cbmNsYXNzIHR5cGUgbWF0aCA9IG9iamVjdFxuICBtZXRob2QgX0UgOiBudW1iZXJfdCByZWFkb25seV9wcm9wXG5cbiAgbWV0aG9kIF9MTjIgOiBudW1iZXJfdCByZWFkb25seV9wcm9wXG5cbiAgbWV0aG9kIF9MTjEwIDogbnVtYmVyX3QgcmVhZG9ubHlfcHJvcFxuXG4gIG1ldGhvZCBfTE9HMkUgOiBudW1iZXJfdCByZWFkb25seV9wcm9wXG5cbiAgbWV0aG9kIF9MT0cxMEUgOiBudW1iZXJfdCByZWFkb25seV9wcm9wXG5cbiAgbWV0aG9kIF9QSSA6IG51bWJlcl90IHJlYWRvbmx5X3Byb3BcblxuICBtZXRob2QgX1NRUlQxXzJfIDogbnVtYmVyX3QgcmVhZG9ubHlfcHJvcFxuXG4gIG1ldGhvZCBfU1FSVDIgOiBudW1iZXJfdCByZWFkb25seV9wcm9wXG5cbiAgbWV0aG9kIGFicyA6IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgYWNvcyA6IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgYXNpbiA6IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgYXRhbiA6IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgYXRhbjIgOiBudW1iZXJfdCAtPiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIGNlaWwgOiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIGNvcyA6IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgZXhwIDogbnVtYmVyX3QgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBmbG9vciA6IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgbG9nIDogbnVtYmVyX3QgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBtYXggOiBudW1iZXJfdCAtPiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIG1heF8zIDogbnVtYmVyX3QgLT4gbnVtYmVyX3QgLT4gbnVtYmVyX3QgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBtYXhfNCA6IG51bWJlcl90IC0+IG51bWJlcl90IC0+IG51bWJlcl90IC0+IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgbWluIDogbnVtYmVyX3QgLT4gbnVtYmVyX3QgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBtaW5fMyA6IG51bWJlcl90IC0+IG51bWJlcl90IC0+IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgbWluXzQgOiBudW1iZXJfdCAtPiBudW1iZXJfdCAtPiBudW1iZXJfdCAtPiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIHBvdyA6IG51bWJlcl90IC0+IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgcmFuZG9tIDogbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCByb3VuZCA6IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc2luIDogbnVtYmVyX3QgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBzcXJ0IDogbnVtYmVyX3QgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCB0YW4gOiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5lbmRcblxubGV0IG1hdGggPSBVbnNhZmUuZ2xvYmFsIyMuX01hdGhcblxuY2xhc3MgdHlwZSBlcnJvciA9IG9iamVjdFxuICBtZXRob2QgbmFtZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICBtZXRob2QgbWVzc2FnZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICBtZXRob2Qgc3RhY2sgOiBqc19zdHJpbmcgdCBvcHRkZWYgcHJvcFxuXG4gIG1ldGhvZCB0b1N0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcbmVuZFxuXG5sZXQgZXJyb3JfY29uc3RyID0gVW5zYWZlLmdsb2JhbCMjLl9FcnJvclxuXG5tb2R1bGUgSnNfZXJyb3IgPSBzdHJ1Y3RcbiAgdHlwZSBlcnJvcl90ID0gZXJyb3IgdFxuXG4gIGluY2x1ZGUgSnNvb19ydW50aW1lLkVycm9yXG5cbiAgZXh0ZXJuYWwgb2ZfZXJyb3IgOiBlcnJvcl90IC0+IHQgPSBcIiVpZGVudGl0eVwiXG5cbiAgZXh0ZXJuYWwgdG9fZXJyb3IgOiB0IC0+IGVycm9yX3QgPSBcIiVpZGVudGl0eVwiXG5cbiAgbGV0IG5hbWUgZSA9IHRvX3N0cmluZyAodG9fZXJyb3IgZSkjIy5uYW1lXG5cbiAgbGV0IG1lc3NhZ2UgZSA9IHRvX3N0cmluZyAodG9fZXJyb3IgZSkjIy5tZXNzYWdlXG5cbiAgbGV0IHN0YWNrIChlIDogdCkgOiBzdHJpbmcgb3B0aW9uID1cbiAgICBPcHQudG9fb3B0aW9uIChPcHQubWFwICh0b19lcnJvciBlKSMjLnN0YWNrIHRvX3N0cmluZylcblxuICBsZXQgdG9fc3RyaW5nIGUgPSB0b19zdHJpbmcgKHRvX2Vycm9yIGUpIyN0b1N0cmluZ1xuZW5kXG5cbm1vZHVsZSBNYWdpYyA9IHN0cnVjdFxuICBtb2R1bGUgdHlwZSBUID0gc2lnXG4gICAgZXhjZXB0aW9uIEVycm9yIG9mIGVycm9yIHRcbiAgZW5kXG5cbiAgdHlwZSAoJ2EsICdiKSBlcSA9IEVxIDogKCdhLCAnYSkgZXFcblxuICBsZXQgKGVxIDogKGVycm9yIHQsIEpzX2Vycm9yLnQpIGVxKSA9IE9iai5tYWdpYyBFcVxuXG4gIGxldCBtID1cbiAgICBtYXRjaCBlcSB3aXRoXG4gICAgfCBFcSAtPlxuICAgICAgICAobW9kdWxlIHN0cnVjdFxuICAgICAgICAgIGV4Y2VwdGlvbiBFcnJvciA9IEpzX2Vycm9yLkV4blxuICAgICAgICBlbmQgOiBUKVxuXG4gIG1vZHVsZSBFcnJvciA9ICh2YWwgbSA6IFQpXG5lbmRcblxuaW5jbHVkZSBNYWdpYy5FcnJvclxuXG5sZXQgcmFpc2VfanNfZXJyb3IgZSA9IEpzX2Vycm9yLnJhaXNlXyAoSnNfZXJyb3Iub2ZfZXJyb3IgZSlcblxubGV0IHN0cmluZ19vZl9lcnJvciBlID0gSnNfZXJyb3IudG9fc3RyaW5nIChKc19lcnJvci5vZl9lcnJvciBlKVxuXG5sZXQgZXhuX3dpdGhfanNfYmFja3RyYWNlID0gSnNfZXJyb3IuYXR0YWNoX2pzX2JhY2t0cmFjZVxuXG5leHRlcm5hbCBqc19lcnJvcl9vZl9leG4gOiBleG4gLT4gZXJyb3IgdCBvcHQgPSBcImNhbWxfanNfZXJyb3Jfb2ZfZXhjZXB0aW9uXCJcblxuY2xhc3MgdHlwZSBqc29uID0gb2JqZWN0XG4gIG1ldGhvZCBwYXJzZSA6IGpzX3N0cmluZyB0IC0+ICdhIG1ldGhcblxuICBtZXRob2Qgc3RyaW5naWZ5IDogJ2EgLT4ganNfc3RyaW5nIHQgbWV0aFxuZW5kXG5cbmxldCBfSlNPTiA6IGpzb24gdCA9IFVuc2FmZS5nbG9iYWwjIy5fSlNPTlxuXG5sZXQgZGVjb2RlVVJJIChzIDoganNfc3RyaW5nIHQpIDoganNfc3RyaW5nIHQgPVxuICBVbnNhZmUuZnVuX2NhbGwgVW5zYWZlLmdsb2JhbCMjLmRlY29kZVVSSSBbfCBVbnNhZmUuaW5qZWN0IHMgfF1cblxubGV0IGRlY29kZVVSSUNvbXBvbmVudCAocyA6IGpzX3N0cmluZyB0KSA6IGpzX3N0cmluZyB0ID1cbiAgVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5kZWNvZGVVUklDb21wb25lbnQgW3wgVW5zYWZlLmluamVjdCBzIHxdXG5cbmxldCBlbmNvZGVVUkkgKHMgOiBqc19zdHJpbmcgdCkgOiBqc19zdHJpbmcgdCA9XG4gIFVuc2FmZS5mdW5fY2FsbCBVbnNhZmUuZ2xvYmFsIyMuZW5jb2RlVVJJIFt8IFVuc2FmZS5pbmplY3QgcyB8XVxuXG5sZXQgZW5jb2RlVVJJQ29tcG9uZW50IChzIDoganNfc3RyaW5nIHQpIDoganNfc3RyaW5nIHQgPVxuICBVbnNhZmUuZnVuX2NhbGwgVW5zYWZlLmdsb2JhbCMjLmVuY29kZVVSSUNvbXBvbmVudCBbfCBVbnNhZmUuaW5qZWN0IHMgfF1cblxubGV0IGVzY2FwZSAocyA6IGpzX3N0cmluZyB0KSA6IGpzX3N0cmluZyB0ID1cbiAgVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5lc2NhcGUgW3wgVW5zYWZlLmluamVjdCBzIHxdXG5cbmxldCB1bmVzY2FwZSAocyA6IGpzX3N0cmluZyB0KSA6IGpzX3N0cmluZyB0ID1cbiAgVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy51bmVzY2FwZSBbfCBVbnNhZmUuaW5qZWN0IHMgfF1cblxuZXh0ZXJuYWwgYm9vbCA6IGJvb2wgLT4gYm9vbCB0ID0gXCJjYW1sX2pzX2Zyb21fYm9vbFwiXG5cbmV4dGVybmFsIHRvX2Jvb2wgOiBib29sIHQgLT4gYm9vbCA9IFwiY2FtbF9qc190b19ib29sXCJcblxuZXh0ZXJuYWwgYXJyYXkgOiAnYSBhcnJheSAtPiAnYSBqc19hcnJheSB0ID0gXCJjYW1sX2pzX2Zyb21fYXJyYXlcIlxuXG5leHRlcm5hbCB0b19hcnJheSA6ICdhIGpzX2FycmF5IHQgLT4gJ2EgYXJyYXkgPSBcImNhbWxfanNfdG9fYXJyYXlcIlxuXG5leHRlcm5hbCBieXRlc3RyaW5nIDogc3RyaW5nIC0+IGpzX3N0cmluZyB0ID0gXCJjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXCJcblxuZXh0ZXJuYWwgdG9fYnl0ZXN0cmluZyA6IGpzX3N0cmluZyB0IC0+IHN0cmluZyA9IFwiY2FtbF9zdHJpbmdfb2ZfanNieXRlc1wiXG5cbmV4dGVybmFsIGZsb2F0IDogZmxvYXQgLT4gbnVtYmVyX3QgPSBcImNhbWxfanNfZnJvbV9mbG9hdFwiXG5cbmV4dGVybmFsIHRvX2Zsb2F0IDogbnVtYmVyX3QgLT4gZmxvYXQgPSBcImNhbWxfanNfdG9fZmxvYXRcIlxuXG5leHRlcm5hbCBudW1iZXJfb2ZfZmxvYXQgOiBmbG9hdCAtPiBudW1iZXIgdCA9IFwiY2FtbF9qc19mcm9tX2Zsb2F0XCJcblxuZXh0ZXJuYWwgZmxvYXRfb2ZfbnVtYmVyIDogbnVtYmVyIHQgLT4gZmxvYXQgPSBcImNhbWxfanNfdG9fZmxvYXRcIlxuXG5leHRlcm5hbCBpbnQzMiA6IGludDMyIC0+IG51bWJlcl90ID0gXCJjYW1sX2pzX2Zyb21faW50MzJcIlxuXG5leHRlcm5hbCB0b19pbnQzMiA6IG51bWJlcl90IC0+IGludDMyID0gXCJjYW1sX2pzX3RvX2ludDMyXCJcblxuZXh0ZXJuYWwgbmF0aXZlaW50IDogbmF0aXZlaW50IC0+IG51bWJlcl90ID0gXCJjYW1sX2pzX2Zyb21fbmF0aXZlaW50XCJcblxuZXh0ZXJuYWwgdG9fbmF0aXZlaW50IDogbnVtYmVyX3QgLT4gbmF0aXZlaW50ID0gXCJjYW1sX2pzX3RvX25hdGl2ZWludFwiXG5cbmV4dGVybmFsIHR5cGVvZiA6IF8gdCAtPiBqc19zdHJpbmcgdCA9IFwiY2FtbF9qc190eXBlb2ZcIlxuXG5leHRlcm5hbCBpbnN0YW5jZW9mIDogXyB0IC0+IF8gY29uc3RyIC0+IGJvb2wgPSBcImNhbWxfanNfaW5zdGFuY2VvZlwiXG5cbmxldCBpc05hTiAoaSA6ICdhKSA6IGJvb2wgPVxuICB0b19ib29sIChVbnNhZmUuZnVuX2NhbGwgVW5zYWZlLmdsb2JhbCMjLmlzTmFOIFt8IFVuc2FmZS5pbmplY3QgaSB8XSlcblxubGV0IHBhcnNlSW50IChzIDoganNfc3RyaW5nIHQpIDogaW50ID1cbiAgbGV0IHMgPSBVbnNhZmUuZnVuX2NhbGwgVW5zYWZlLmdsb2JhbCMjLnBhcnNlSW50IFt8IFVuc2FmZS5pbmplY3QgcyB8XSBpblxuICBpZiBpc05hTiBzIHRoZW4gZmFpbHdpdGggXCJwYXJzZUludFwiIGVsc2Ugc1xuXG5sZXQgcGFyc2VGbG9hdCAocyA6IGpzX3N0cmluZyB0KSA6IG51bWJlcl90ID1cbiAgbGV0IHMgPSBVbnNhZmUuZnVuX2NhbGwgVW5zYWZlLmdsb2JhbCMjLnBhcnNlRmxvYXQgW3wgVW5zYWZlLmluamVjdCBzIHxdIGluXG4gIGlmIGlzTmFOIHMgdGhlbiBmYWlsd2l0aCBcInBhcnNlRmxvYXRcIiBlbHNlIHNcblxubGV0IF8gPVxuICBQcmludGV4Yy5yZWdpc3Rlcl9wcmludGVyIChmdW4gZSAtPlxuICAgICAgaWYgaW5zdGFuY2VvZiAoT2JqLm1hZ2ljIGUgOiA8IC4uID4gdCkgZXJyb3JfY29uc3RyXG4gICAgICB0aGVuXG4gICAgICAgIGxldCBlID0gSnNfZXJyb3Iub2ZfZXJyb3IgKE9iai5tYWdpYyBlIDogZXJyb3IgdCkgaW5cbiAgICAgICAgU29tZSAoSnNfZXJyb3IudG9fc3RyaW5nIGUpXG4gICAgICBlbHNlXG4gICAgICAgIG1hdGNoIGUgd2l0aFxuICAgICAgICB8IEpzX2Vycm9yLkV4biBlIC0+IFNvbWUgKEpzX2Vycm9yLnRvX3N0cmluZyBlKVxuICAgICAgICB8IF8gLT4gTm9uZSlcblxubGV0IGV4cG9ydF9qcyAoZmllbGQgOiBqc19zdHJpbmcgdCkgeCA9XG4gIFVuc2FmZS5zZXRcbiAgICAoVW5zYWZlLnB1cmVfanNfZXhwciBcImpzb29fZXhwb3J0c1wiKVxuICAgIGZpZWxkXG4gICAgKGlmXG4gICAgICAgU3RyaW5nLmVxdWFsIChKcy50b19zdHJpbmcgKHR5cGVvZiAoT2JqLm1hZ2ljIHgpKSkgXCJmdW5jdGlvblwiXG4gICAgICAgKCogZnVuY3Rpb24gd2l0aCBhcml0eS9sZW5ndGggZXF1YWwgdG8gemVybyBhcmUgYWxyZWFkeSB3cmFwcGVkICopXG4gICAgICAgJiYgVW5zYWZlLmdldCAoT2JqLm1hZ2ljIHgpIChKcy5zdHJpbmcgXCJsZW5ndGhcIikgPiAwXG4gICAgIHRoZW4gT2JqLm1hZ2ljICh3cmFwX2NhbGxiYWNrIChPYmoubWFnaWMgeCkpXG4gICAgIGVsc2UgeClcblxubGV0IGV4cG9ydCBmaWVsZCB4ID0gZXhwb3J0X2pzIChzdHJpbmcgZmllbGQpIHhcblxubGV0IGV4cG9ydF9hbGwgb2JqID1cbiAgbGV0IGtleXMgPSBvYmplY3Rfa2V5cyBvYmogaW5cbiAga2V5cyMjZm9yRWFjaFxuICAgICh3cmFwX2NhbGxiYWNrIChmdW4gKGtleSA6IGpzX3N0cmluZyB0KSBfIF8gLT4gZXhwb3J0X2pzIGtleSAoVW5zYWZlLmdldCBvYmoga2V5KSkpXG5cbigqKioqKVxuXG4oKiBERVBSRUNBVEVEICopXG5cbnR5cGUgZmxvYXRfcHJvcCA9IG51bWJlcl90IHByb3BcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9qc19nZXQiLCJjYW1sX2pzX3NldCIsImNhbWxfanNfd3JhcF9jYWxsYmFjayIsImNhbWxfc3RyaW5nX29mX2pzc3RyaW5nIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImdsb2JhbF9kYXRhIiwiSnNfb2Zfb2NhbWxfSW1wb3J0IiwiU3RkbGliIiwiSnNvb19ydW50aW1lIiwiU3RkbGliX1ByaW50ZXhjIiwiZ2xvYmFsIiwibnVsbCQiLCJ1bmRlZmluZWQkIiwicmV0dXJuJCIsIm1hcCIsIngiLCJiaW5kIiwidGVzdCIsIml0ZXIiLCJjYXNlJCIsImciLCJnZXQiLCJvcHRpb24iLCJ0b19vcHRpb24iLCJjb2VyY2UiLCJjb2VyY2Vfb3B0Iiwic3RyaW5nX2NvbnN0ciIsInJlZ0V4cCIsIm9iamVjdF9jb25zdHJ1Y3RvciIsIm9iamVjdF9rZXlzIiwidDQiLCJhcnJheV9jb25zdHJ1Y3RvciIsImFycmF5X21hcCIsInQ2IiwiY2IiLCJpZHgiLCJwYXJhbSIsImFycmF5X21hcGkiLCJzdHJfYXJyYXkiLCJtYXRjaF9yZXN1bHQiLCJkYXRlX2NvbnN0ciIsIm1hdGgiLCJlcnJvcl9jb25zdHIiLCJpbmNsdWRlIiwicmFpc2UiLCJleG5fd2l0aF9qc19iYWNrdHJhY2UiLCJvZl9leG4iLCJFcnJvciIsIm5hbWUiLCJ0MTEiLCJtZXNzYWdlIiwidDEyIiwic3RhY2siLCJ0MTMiLCJ0b19zdHJpbmciLCJ0MTQiLCJyYWlzZV9qc19lcnJvciIsImUiLCJzdHJpbmdfb2ZfZXJyb3IiLCJKU09OIiwiZGVjb2RlVVJJIiwicyIsImRlY29kZVVSSUNvbXBvbmVudCIsImVuY29kZVVSSSIsImVuY29kZVVSSUNvbXBvbmVudCIsImVzY2FwZSIsInVuZXNjYXBlIiwiaXNOYU4iLCJpIiwicGFyc2VJbnQiLCJwYXJzZUZsb2F0IiwiZXhwb3J0X2pzIiwiZmllbGQiLCJleHBvcnQkIiwiZXhwb3J0X2FsbCIsIm9iaiIsImtleXMiLCJ0MjYiLCJrZXkiLCJKc19vZl9vY2FtbF9KcyJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLHdCQUFBO0FBQUEsSUFBQUMsMEJBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLHFCQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLFNDb0VpQjtBQUFBLElBQUFDLFFBb0NLO0FBQUEsSUFBQUMsYUFJUTtBQUFBLFlBQUFDLFFBQUEsR0Q1RzlCO0FBQUEsWUFBQUMsSUFBQUMsR0FBQWQsR0N1SmtDLDRCQUF1QixnQkFBSztBQUFBLFlBQUFlLEtBQUFELEdBQUFkLEdBRTNCLDRCQUFnQixnQkFBRztBQUFBLFlBQUFnQixLQUFBRixHQUVsQjtBQUFBLFlBQUFHLEtBQUFILEdBQUFkO0FBQUFBLFFBQUEsSUFFSztBQUFBLGVBQU0sb0JBQUc7QUFBQTtBQUFBLFlBQUFrQixNQUFBSixHQUFBZCxHQUFBbUI7QUFBQUEsSUFFYixvQkFBTSxtQkFBVSxnQkFBRztBQUFBO0FBQUEsWUFBQUMsSUFBQU4sR0FBQWQsR0FFdEIsb0JBQU0sb0JBQVc7QUFBQSxZQUFB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QUFBLE1BRTNCLG1CQUVPO0FBQUEsVUFBQUEsTUFGUDtBQUFBLE1BQ3lCLDBCQUFzQjtBQUFBLEtBQ3BDO0FBQUEsWUFBQWMsVUFBQUMsT0FBQXpEO0FBQUFBO0FBQUFBLEtBQUEsSUFPQztBQUFBO0FBQUEsT0FBYjtBQUFBLHlCQUdhO0FBQUE7QUFBQSxJQUNSO0FBQUE7QUFBQSxZQUFBMEQsUUFBQUQsT0FBQXpEO0FBQUFBLElBRW1CLE9BQWMsVUFBZCwwQ0FBZ0I7QUFBQTtBQUFBLFlBQUEyRCxXQUFBQztBQUFBQTtBQUFBQSxLQUFBQyxPQXRYRjtBQUFBLEtBQUFDO0FBQUFBLE9BMlh6QztBQUFBLGtCQUFBQyxLQUFBLEdBQUExQyxPQUFpRjtBQUFBLElBQUU7QUFBQTtBQUFBO0FBQUEsSUFBQTJDO0FBQUFBLE1BbEJuRTtBQUFBO0FBQUEsbUJEdnpCcEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdDdXpCb0I7QUFBQTtBQUFBLEVEdnpCcEIiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjozNzUwMywiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiIuc3hfYnJvd3Nlci5lb2Jqcy9qc29vL2R1bmVfX2V4ZV9fU3hfYnJvd3Nlci5jbW8uanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3dvcmtzcGFjZV9yb290L2Jyb3dzZXIvc3hfYnJvd3Nlci5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKiBzeF9icm93c2VyLm1sIOKAlCBPQ2FtbCBTWCBrZXJuZWwgY29tcGlsZWQgdG8gV0FTTS9KUyBmb3IgYnJvd3NlciB1c2UuXG5cbiAgICBFeHBvc2VzIHRoZSBDRUsgbWFjaGluZSwgYnl0ZWNvZGUgVk0sIHBhcnNlciwgYW5kIHByaW1pdGl2ZXMgYXMgYVxuICAgIGdsb2JhbCBbU3hLZXJuZWxdIG9iamVjdCB0aGF0IHRoZSBKUyBwbGF0Zm9ybSBsYXllciBiaW5kcyB0by5cblxuICAgIEZyZXNoIGltcGxlbWVudGF0aW9uIG9uIHRoZSBvY2FtbC12bSBicmFuY2gg4oCUIGJ1aWxkcyBvbiB0aGUgYnl0ZWNvZGVcbiAgICBWTSArIGxhenkgSklUIGluZnJhc3RydWN0dXJlLiAqKVxuXG5vcGVuIEpzX29mX29jYW1sXG5vcGVuIFN4X3R5cGVzXG5cbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuKCogT3BhcXVlIHZhbHVlIGhhbmRsZSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogTm9uLXByaW1pdGl2ZSBTWCB2YWx1ZXMgKGxhbWJkYXMsIGNvbXBvbmVudHMsIHNpZ25hbHMsIGV0Yy4pIGFyZSAgICAqKVxuKCogc3RvcmVkIGhlcmUgYW5kIHJlcHJlc2VudGVkIG9uIHRoZSBKUyBzaWRlIGFzIG9iamVjdHMgd2l0aCBhbiAgICAgICAqKVxuKCogX19zeF9oYW5kbGUgaW50ZWdlciBrZXkuICBQcmVzZXJ2ZXMgaWRlbnRpdHkgYWNyb3NzIEpT4oaUT0NhbWwuICAgICAgKilcbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuXG5sZXQgX25leHRfaGFuZGxlID0gcmVmIDBcbmxldCBfaGFuZGxlX3RhYmxlIDogKGludCwgdmFsdWUpIEhhc2h0YmwudCA9IEhhc2h0YmwuY3JlYXRlIDI1NlxuXG5sZXQgYWxsb2NfaGFuZGxlICh2IDogdmFsdWUpIDogaW50ID1cbiAgbGV0IGlkID0gIV9uZXh0X2hhbmRsZSBpblxuICBpbmNyIF9uZXh0X2hhbmRsZTtcbiAgSGFzaHRibC5yZXBsYWNlIF9oYW5kbGVfdGFibGUgaWQgdjtcbiAgaWRcblxubGV0IGdldF9oYW5kbGUgKGlkIDogaW50KSA6IHZhbHVlID1cbiAgbWF0Y2ggSGFzaHRibC5maW5kX29wdCBfaGFuZGxlX3RhYmxlIGlkIHdpdGhcbiAgfCBTb21lIHYgLT4gdlxuICB8IE5vbmUgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFByaW50Zi5zcHJpbnRmIFwiSW52YWxpZCBTWCBoYW5kbGU6ICVkXCIgaWQpKVxuXG4oKiBKUy1zaWRlIG9wYXF1ZSBob3N0IG9iamVjdCB0YWJsZS5cbiAgIEhvc3Qgb2JqZWN0cyAoRE9NIGVsZW1lbnRzLCBjb25zb2xlLCBldGMuKSBhcmUgc3RvcmVkIGhlcmUgdG8gcHJlc2VydmVcbiAgIGlkZW50aXR5IGFjcm9zcyB0aGUgT0NhbWzihpRKUyBib3VuZGFyeS4gUmVwcmVzZW50ZWQgYXMgRGljdCB3aXRoXG4gICBfX2hvc3RfaGFuZGxlIGtleSBvbiB0aGUgT0NhbWwgc2lkZS4gKilcbmxldCBfbmV4dF9ob3N0X2hhbmRsZSA9IHJlZiAwXG5sZXQgX2FsbG9jX2hvc3RfaGFuZGxlID0gSnMuVW5zYWZlLnB1cmVfanNfZXhwclxuICBcIihmdW5jdGlvbigpIHsgdmFyIHQgPSB7fTsgdmFyIG4gPSAwOyByZXR1cm4geyBwdXQ6IGZ1bmN0aW9uKG9iaikgeyB2YXIgaWQgPSBuKys7IHRbaWRdID0gb2JqOyByZXR1cm4gaWQ7IH0sIGdldDogZnVuY3Rpb24oaWQpIHsgcmV0dXJuIHRbaWRdOyB9IH07IH0pKClcIlxubGV0IGhvc3RfcHV0IChvYmogOiBKcy5VbnNhZmUuYW55KSA6IGludCA9XG4gIGxldCBpZCA9ICFfbmV4dF9ob3N0X2hhbmRsZSBpblxuICBpbmNyIF9uZXh0X2hvc3RfaGFuZGxlO1xuICBpZ25vcmUgKEpzLlVuc2FmZS5tZXRoX2NhbGwgX2FsbG9jX2hvc3RfaGFuZGxlIFwicHV0XCIgW3wgb2JqIHxdKTtcbiAgaWRcbmxldCBob3N0X2dldF9qcyAoaWQgOiBpbnQpIDogSnMuVW5zYWZlLmFueSA9XG4gIEpzLlVuc2FmZS5tZXRoX2NhbGwgX2FsbG9jX2hvc3RfaGFuZGxlIFwiZ2V0XCIgW3wgSnMuVW5zYWZlLmluamVjdCBpZCB8XVxuXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcbigqIEdsb2JhbCBlbnZpcm9ubWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuXG4oKiBGb3JjZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24g4oCUIHRoZXNlIG1vZHVsZXMgcmVnaXN0ZXIgcHJpbWl0aXZlc1xuICAgaW4gdGhlaXIgbGV0ICgpID0gLi4uIGJsb2NrcyBidXQgYXJlbid0IHJlZmVyZW5jZWQgZGlyZWN0bHkuICopXG5sZXQgKCkgPSBTeF9zY29wZS5jbGVhcl9hbGwgKClcblxubGV0IGdsb2JhbF9lbnYgPSBtYWtlX2VudiAoKVxubGV0IF9zeF9yZW5kZXJfbW9kZSA9IHJlZiBmYWxzZVxuXG5sZXQgY2FsbF9zeF9mbiAoZm4gOiB2YWx1ZSkgKGFyZ3MgOiB2YWx1ZSBsaXN0KSA6IHZhbHVlID1cbiAgU3hfcmVmLmV2YWxfZXhwciAoTGlzdCAoZm4gOjogYXJncykpIChFbnYgZ2xvYmFsX2VudilcblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICopXG4oKiBWYWx1ZSBjb252ZXJzaW9uOiBPQ2FtbCA8LT4gSlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcblxuKCoqIFRhZyBhIEpTIGZ1bmN0aW9uIHdpdGggX19zeF9oYW5kbGUgYW5kIF90eXBlIHByb3BlcnRpZXMuICopXG5sZXQgX3RhZ19mbiA9IEpzLlVuc2FmZS5wdXJlX2pzX2V4cHJcbiAgXCIoZnVuY3Rpb24oZm4sIGhhbmRsZSwgdHlwZSkgeyBmbi5fX3N4X2hhbmRsZSA9IGhhbmRsZTsgZm4uX3R5cGUgPSB0eXBlOyByZXR1cm4gZm47IH0pXCJcblxubGV0IHJlYyB2YWx1ZV90b19qcyAodiA6IHZhbHVlKSA6IEpzLlVuc2FmZS5hbnkgPVxuICBtYXRjaCB2IHdpdGhcbiAgfCBOaWwgLT4gSnMuVW5zYWZlLmluamVjdCBKcy5udWxsXG4gIHwgQm9vbCBiIC0+IEpzLlVuc2FmZS5pbmplY3QgKEpzLmJvb2wgYilcbiAgfCBOdW1iZXIgbiAtPiBKcy5VbnNhZmUuaW5qZWN0IChKcy5udW1iZXJfb2ZfZmxvYXQgbilcbiAgfCBTdHJpbmcgcyAtPiBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgcylcbiAgfCBSYXdIVE1MIHMgLT4gSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIHMpXG4gIHwgU3ltYm9sIHMgLT5cbiAgICBKcy5VbnNhZmUuaW5qZWN0IChKcy5VbnNhZmUub2JqIFt8XG4gICAgICAoXCJfdHlwZVwiLCBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgXCJzeW1ib2xcIikpO1xuICAgICAgKFwibmFtZVwiLCBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgcykpIHxdKVxuICB8IEtleXdvcmQgayAtPlxuICAgIEpzLlVuc2FmZS5pbmplY3QgKEpzLlVuc2FmZS5vYmogW3xcbiAgICAgIChcIl90eXBlXCIsIEpzLlVuc2FmZS5pbmplY3QgKEpzLnN0cmluZyBcImtleXdvcmRcIikpO1xuICAgICAgKFwibmFtZVwiLCBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgaykpIHxdKVxuICB8IExpc3QgaXRlbXMgfCBMaXN0UmVmIHsgY29udGVudHMgPSBpdGVtcyB9IC0+XG4gICAgbGV0IGFyciA9IGl0ZW1zIHw+IExpc3QubWFwIHZhbHVlX3RvX2pzIHw+IEFycmF5Lm9mX2xpc3QgaW5cbiAgICBKcy5VbnNhZmUuaW5qZWN0IChKcy5VbnNhZmUub2JqIFt8XG4gICAgICAoXCJfdHlwZVwiLCBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgXCJsaXN0XCIpKTtcbiAgICAgIChcIml0ZW1zXCIsIEpzLlVuc2FmZS5pbmplY3QgKEpzLmFycmF5IGFycikpIHxdKVxuICB8IERpY3QgZCAtPlxuICAgICgqIENoZWNrIGZvciBfX2hvc3RfaGFuZGxlIOKAlCByZXR1cm4gb3JpZ2luYWwgSlMgb2JqZWN0ICopXG4gICAgKG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgZCBcIl9faG9zdF9oYW5kbGVcIiB3aXRoXG4gICAgIHwgU29tZSAoTnVtYmVyIG4pIC0+IGhvc3RfZ2V0X2pzIChpbnRfb2ZfZmxvYXQgbilcbiAgICAgfCBfIC0+XG4gICAgICAgbGV0IG9iaiA9IEpzLlVuc2FmZS5vYmogW3x8XSBpblxuICAgICAgIEpzLlVuc2FmZS5zZXQgb2JqIChKcy5zdHJpbmcgXCJfdHlwZVwiKSAoSnMuc3RyaW5nIFwiZGljdFwiKTtcbiAgICAgICBIYXNodGJsLml0ZXIgKGZ1biBrIHYgLT5cbiAgICAgICAgIEpzLlVuc2FmZS5zZXQgb2JqIChKcy5zdHJpbmcgaykgKHZhbHVlX3RvX2pzIHYpKSBkO1xuICAgICAgIEpzLlVuc2FmZS5pbmplY3Qgb2JqKVxuICAoKiBDYWxsYWJsZSB2YWx1ZXM6IHdyYXAgYXMgSlMgZnVuY3Rpb25zIHdpdGggX19zeF9oYW5kbGUgKilcbiAgfCBMYW1iZGEgXyB8IE5hdGl2ZUZuIF8gfCBDb250aW51YXRpb24gXyB8IFZtQ2xvc3VyZSBfIC0+XG4gICAgbGV0IGhhbmRsZSA9IGFsbG9jX2hhbmRsZSB2IGluXG4gICAgbGV0IGlubmVyID0gSnMud3JhcF9jYWxsYmFjayAoZnVuIGFyZ3NfanMgLT5cbiAgICAgIHRyeVxuICAgICAgICBsZXQgYXJnID0ganNfdG9fdmFsdWUgYXJnc19qcyBpblxuICAgICAgICBsZXQgYXJncyA9IG1hdGNoIGFyZyB3aXRoIE5pbCAtPiBbXSB8IF8gLT4gW2FyZ10gaW5cbiAgICAgICAgbGV0IHJlc3VsdCA9IGNhbGxfc3hfZm4gdiBhcmdzIGluXG4gICAgICAgIHZhbHVlX3RvX2pzIHJlc3VsdFxuICAgICAgd2l0aCBFdmFsX2Vycm9yIG1zZyAtPlxuICAgICAgICBpZ25vcmUgKEpzLlVuc2FmZS5tZXRoX2NhbGxcbiAgICAgICAgICAoSnMuVW5zYWZlLmdldCBKcy5VbnNhZmUuZ2xvYmFsIChKcy5zdHJpbmcgXCJjb25zb2xlXCIpKVxuICAgICAgICAgIFwiZXJyb3JcIiBbfCBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgKFwiW3N4XSBcIiBeIG1zZykpIHxdKTtcbiAgICAgICAgSnMuVW5zYWZlLmluamVjdCBKcy5udWxsKSBpblxuICAgIEpzLlVuc2FmZS5mdW5fY2FsbCBfdGFnX2ZuIFt8XG4gICAgICBKcy5VbnNhZmUuaW5qZWN0IGlubmVyO1xuICAgICAgSnMuVW5zYWZlLmluamVjdCBoYW5kbGU7XG4gICAgICBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgKHR5cGVfb2YgdikpIHxdXG4gICgqIE5vbi1jYWxsYWJsZSBjb21wb3VuZDogdGFnZ2VkIG9iamVjdCB3aXRoIGhhbmRsZSAqKVxuICB8IF8gLT5cbiAgICBsZXQgaGFuZGxlID0gYWxsb2NfaGFuZGxlIHYgaW5cbiAgICBKcy5VbnNhZmUuaW5qZWN0IChKcy5VbnNhZmUub2JqIFt8XG4gICAgICAoXCJfdHlwZVwiLCBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgKHR5cGVfb2YgdikpKTtcbiAgICAgIChcIl9fc3hfaGFuZGxlXCIsIEpzLlVuc2FmZS5pbmplY3QgaGFuZGxlKSB8XSlcblxuYW5kIGpzX3RvX3ZhbHVlIChqcyA6IEpzLlVuc2FmZS5hbnkpIDogdmFsdWUgPVxuICBpZiBKcy5VbnNhZmUuZXF1YWxzIGpzIEpzLm51bGwgfHwgSnMuVW5zYWZlLmVxdWFscyBqcyBKcy51bmRlZmluZWQgdGhlbiBOaWxcbiAgZWxzZVxuICAgIGxldCB0eSA9IEpzLnRvX3N0cmluZyAoSnMudHlwZW9mIGpzKSBpblxuICAgIG1hdGNoIHR5IHdpdGhcbiAgICB8IFwibnVtYmVyXCIgLT4gTnVtYmVyIChKcy5mbG9hdF9vZl9udW1iZXIgKEpzLlVuc2FmZS5jb2VyY2UganMpKVxuICAgIHwgXCJib29sZWFuXCIgLT4gQm9vbCAoSnMudG9fYm9vbCAoSnMuVW5zYWZlLmNvZXJjZSBqcykpXG4gICAgfCBcInN0cmluZ1wiIC0+IFN0cmluZyAoSnMudG9fc3RyaW5nIChKcy5VbnNhZmUuY29lcmNlIGpzKSlcbiAgICB8IFwiZnVuY3Rpb25cIiAtPlxuICAgICAgbGV0IGggPSBKcy5VbnNhZmUuZ2V0IGpzIChKcy5zdHJpbmcgXCJfX3N4X2hhbmRsZVwiKSBpblxuICAgICAgaWYgbm90IChKcy5VbnNhZmUuZXF1YWxzIGggSnMudW5kZWZpbmVkKSB0aGVuXG4gICAgICAgIGdldF9oYW5kbGUgKEpzLmZsb2F0X29mX251bWJlciAoSnMuVW5zYWZlLmNvZXJjZSBoKSB8PiBpbnRfb2ZfZmxvYXQpXG4gICAgICBlbHNlXG4gICAgICAgICgqIFBsYWluIEpTIGZ1bmN0aW9uIOKAlCB3cmFwIGFzIE5hdGl2ZUZuICopXG4gICAgICAgIE5hdGl2ZUZuIChcImpzLWNhbGxiYWNrXCIsIGZ1biBhcmdzIC0+XG4gICAgICAgICAgbGV0IGpzX2FyZ3MgPSBhcmdzIHw+IExpc3QubWFwIHZhbHVlX3RvX2pzIHw+IEFycmF5Lm9mX2xpc3QgaW5cbiAgICAgICAgICBqc190b192YWx1ZSAoSnMuVW5zYWZlLmZ1bl9jYWxsIGpzIChBcnJheS5tYXAgRnVuLmlkIGpzX2FyZ3MpKSlcbiAgICB8IFwib2JqZWN0XCIgLT5cbiAgICAgIGxldCBoID0gSnMuVW5zYWZlLmdldCBqcyAoSnMuc3RyaW5nIFwiX19zeF9oYW5kbGVcIikgaW5cbiAgICAgIGlmIG5vdCAoSnMuVW5zYWZlLmVxdWFscyBoIEpzLnVuZGVmaW5lZCkgdGhlblxuICAgICAgICBnZXRfaGFuZGxlIChKcy5mbG9hdF9vZl9udW1iZXIgKEpzLlVuc2FmZS5jb2VyY2UgaCkgfD4gaW50X29mX2Zsb2F0KVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgdHlwZV9maWVsZCA9IEpzLlVuc2FmZS5nZXQganMgKEpzLnN0cmluZyBcIl90eXBlXCIpIGluXG4gICAgICAgIGlmIEpzLlVuc2FmZS5lcXVhbHMgdHlwZV9maWVsZCBKcy51bmRlZmluZWQgdGhlbiBiZWdpblxuICAgICAgICAgIGlmIEpzLnRvX2Jvb2wgKEpzLlVuc2FmZS5nbG9iYWwjIy5fQXJyYXkjI2lzQXJyYXkganMpIHRoZW4gYmVnaW5cbiAgICAgICAgICAgIGxldCBuID0gSnMuZmxvYXRfb2ZfbnVtYmVyIChKcy5VbnNhZmUuY29lcmNlIChKcy5VbnNhZmUuZ2V0IGpzIChKcy5zdHJpbmcgXCJsZW5ndGhcIikpKSB8PiBpbnRfb2ZfZmxvYXQgaW5cbiAgICAgICAgICAgIExpc3QgKExpc3QuaW5pdCBuIChmdW4gaSAtPlxuICAgICAgICAgICAgICBqc190b192YWx1ZSAoSnMuYXJyYXlfZ2V0IChKcy5VbnNhZmUuY29lcmNlIGpzKSBpIHw+IEpzLk9wdGRlZi50b19vcHRpb24gfD4gT3B0aW9uLmdldCkpKVxuICAgICAgICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgICAgICAoKiBPcGFxdWUgaG9zdCBvYmplY3Qg4oCUIHN0b3JlIGluIEpTLXNpZGUgdGFibGUsIHJldHVybiBEaWN0IHdpdGggX19ob3N0X2hhbmRsZSAqKVxuICAgICAgICAgICAgbGV0IGlkID0gaG9zdF9wdXQganMgaW5cbiAgICAgICAgICAgIGxldCBkID0gSGFzaHRibC5jcmVhdGUgMiBpblxuICAgICAgICAgICAgSGFzaHRibC5yZXBsYWNlIGQgXCJfX2hvc3RfaGFuZGxlXCIgKE51bWJlciAoZmxvYXRfb2ZfaW50IGlkKSk7XG4gICAgICAgICAgICBEaWN0IGRcbiAgICAgICAgICBlbmRcbiAgICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgICBsZXQgdGFnID0gSnMudG9fc3RyaW5nIChKcy5VbnNhZmUuY29lcmNlIHR5cGVfZmllbGQpIGluXG4gICAgICAgICAgbWF0Y2ggdGFnIHdpdGhcbiAgICAgICAgICB8IFwic3ltYm9sXCIgLT4gU3ltYm9sIChKcy50b19zdHJpbmcgKEpzLlVuc2FmZS5nZXQganMgKEpzLnN0cmluZyBcIm5hbWVcIikpKVxuICAgICAgICAgIHwgXCJrZXl3b3JkXCIgLT4gS2V5d29yZCAoSnMudG9fc3RyaW5nIChKcy5VbnNhZmUuZ2V0IGpzIChKcy5zdHJpbmcgXCJuYW1lXCIpKSlcbiAgICAgICAgICB8IFwibGlzdFwiIC0+XG4gICAgICAgICAgICBsZXQgaXRlbXNfanMgPSBKcy5VbnNhZmUuZ2V0IGpzIChKcy5zdHJpbmcgXCJpdGVtc1wiKSBpblxuICAgICAgICAgICAgbGV0IG4gPSBKcy5mbG9hdF9vZl9udW1iZXIgKEpzLlVuc2FmZS5jb2VyY2UgKEpzLlVuc2FmZS5nZXQgaXRlbXNfanMgKEpzLnN0cmluZyBcImxlbmd0aFwiKSkpIHw+IGludF9vZl9mbG9hdCBpblxuICAgICAgICAgICAgTGlzdCAoTGlzdC5pbml0IG4gKGZ1biBpIC0+XG4gICAgICAgICAgICAgIGpzX3RvX3ZhbHVlIChKcy5hcnJheV9nZXQgKEpzLlVuc2FmZS5jb2VyY2UgaXRlbXNfanMpIGkgfD4gSnMuT3B0ZGVmLnRvX29wdGlvbiB8PiBPcHRpb24uZ2V0KSkpXG4gICAgICAgICAgfCBcImRpY3RcIiAtPlxuICAgICAgICAgICAgbGV0IGQgPSBIYXNodGJsLmNyZWF0ZSA4IGluXG4gICAgICAgICAgICBsZXQga2V5cyA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fT2JqZWN0IyNrZXlzIGpzIGluXG4gICAgICAgICAgICBsZXQgbGVuID0ga2V5cyMjLmxlbmd0aCBpblxuICAgICAgICAgICAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICAgICAgICAgICAgbGV0IGsgPSBKcy50b19zdHJpbmcgKEpzLmFycmF5X2dldCBrZXlzIGkgfD4gSnMuT3B0ZGVmLnRvX29wdGlvbiB8PiBPcHRpb24uZ2V0KSBpblxuICAgICAgICAgICAgICBpZiBrIDw+IFwiX3R5cGVcIiB0aGVuXG4gICAgICAgICAgICAgICAgSGFzaHRibC5yZXBsYWNlIGQgayAoanNfdG9fdmFsdWUgKEpzLlVuc2FmZS5nZXQganMgKEpzLnN0cmluZyBrKSkpXG4gICAgICAgICAgICBkb25lO1xuICAgICAgICAgICAgRGljdCBkXG4gICAgICAgICAgfCBfIC0+IE5pbFxuICAgICAgICBlbmRcbiAgICB8IF8gLT4gTmlsXG5cbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuKCogU2lkZS1jaGFubmVsIHJldHVybiAoYnlwYXNzZXMganNfb2Zfb2NhbWwgc3RyaXBwaW5nIHByb3BlcnRpZXMpICAgICAqKVxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICopXG5cbmxldCByZXR1cm5fdmlhX3NpZGVfY2hhbm5lbCAodiA6IEpzLlVuc2FmZS5hbnkpIDogSnMuVW5zYWZlLmFueSA9XG4gIEpzLlVuc2FmZS5zZXQgSnMuVW5zYWZlLmdsb2JhbCAoSnMuc3RyaW5nIFwiX19zeFJcIikgdjsgdlxuXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcbigqIENvcmUgQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuXG5sZXQgYXBpX3BhcnNlIHNyY19qcyA9XG4gIGxldCBzcmMgPSBKcy50b19zdHJpbmcgc3JjX2pzIGluXG4gIHRyeVxuICAgIGxldCB2YWx1ZXMgPSBTeF9wYXJzZXIucGFyc2VfYWxsIHNyYyBpblxuICAgIEpzLlVuc2FmZS5pbmplY3QgKEpzLmFycmF5ICh2YWx1ZXMgfD4gTGlzdC5tYXAgdmFsdWVfdG9fanMgfD4gQXJyYXkub2ZfbGlzdCkpXG4gIHdpdGggUGFyc2VfZXJyb3IgbXNnIC0+XG4gICAgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIChcIlBhcnNlIGVycm9yOiBcIiBeIG1zZykpXG5cbmxldCBhcGlfZXZhbCBzcmNfanMgPVxuICBsZXQgc3JjID0gSnMudG9fc3RyaW5nIHNyY19qcyBpblxuICB0cnlcbiAgICBsZXQgZXhwcnMgPSBTeF9wYXJzZXIucGFyc2VfYWxsIHNyYyBpblxuICAgIGxldCBlbnYgPSBFbnYgZ2xvYmFsX2VudiBpblxuICAgIGxldCByZXN1bHQgPSBMaXN0LmZvbGRfbGVmdCAoZnVuIF9hY2MgZXhwciAtPiBTeF9yZWYuZXZhbF9leHByIGV4cHIgZW52KSBOaWwgZXhwcnMgaW5cbiAgICByZXR1cm5fdmlhX3NpZGVfY2hhbm5lbCAodmFsdWVfdG9fanMgcmVzdWx0KVxuICB3aXRoXG4gIHwgRXZhbF9lcnJvciBtc2cgLT4gSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIChcIkVycm9yOiBcIiBeIG1zZykpXG4gIHwgUGFyc2VfZXJyb3IgbXNnIC0+IEpzLlVuc2FmZS5pbmplY3QgKEpzLnN0cmluZyAoXCJQYXJzZSBlcnJvcjogXCIgXiBtc2cpKVxuXG5sZXQgYXBpX2V2YWxfZXhwciBleHByX2pzIF9lbnZfanMgPVxuICBsZXQgZXhwciA9IGpzX3RvX3ZhbHVlIGV4cHJfanMgaW5cbiAgdHJ5XG4gICAgcmV0dXJuX3ZpYV9zaWRlX2NoYW5uZWwgKHZhbHVlX3RvX2pzIChTeF9yZWYuZXZhbF9leHByIGV4cHIgKEVudiBnbG9iYWxfZW52KSkpXG4gIHdpdGggRXZhbF9lcnJvciBtc2cgLT5cbiAgICBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgKFwiRXJyb3I6IFwiIF4gbXNnKSlcblxubGV0IGFwaV9sb2FkIHNyY19qcyA9XG4gIGxldCBzcmMgPSBKcy50b19zdHJpbmcgc3JjX2pzIGluXG4gIHRyeVxuICAgIGxldCBleHBycyA9IFN4X3BhcnNlci5wYXJzZV9hbGwgc3JjIGluXG4gICAgbGV0IGVudiA9IEVudiBnbG9iYWxfZW52IGluXG4gICAgbGV0IGNvdW50ID0gcmVmIDAgaW5cbiAgICBMaXN0Lml0ZXIgKGZ1biBleHByIC0+IGlnbm9yZSAoU3hfcmVmLmV2YWxfZXhwciBleHByIGVudik7IGluY3IgY291bnQpIGV4cHJzO1xuICAgIEpzLlVuc2FmZS5pbmplY3QgIWNvdW50XG4gIHdpdGhcbiAgfCBFdmFsX2Vycm9yIG1zZyAtPiBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgKFwiRXJyb3I6IFwiIF4gbXNnKSlcbiAgfCBQYXJzZV9lcnJvciBtc2cgLT4gSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIChcIlBhcnNlIGVycm9yOiBcIiBeIG1zZykpXG5cbmxldCBhcGlfcmVuZGVyX3RvX2h0bWwgZXhwcl9qcyA9XG4gIGxldCBleHByID0ganNfdG9fdmFsdWUgZXhwcl9qcyBpblxuICBsZXQgcHJldiA9ICFfc3hfcmVuZGVyX21vZGUgaW5cbiAgX3N4X3JlbmRlcl9tb2RlIDo9IHRydWU7XG4gICh0cnlcbiAgICBsZXQgaHRtbCA9IFN4X3JlbmRlci5yZW5kZXJfdG9faHRtbCBleHByIGdsb2JhbF9lbnYgaW5cbiAgICBfc3hfcmVuZGVyX21vZGUgOj0gcHJldjtcbiAgICBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgaHRtbClcbiAgd2l0aCBFdmFsX2Vycm9yIG1zZyAtPlxuICAgIF9zeF9yZW5kZXJfbW9kZSA6PSBwcmV2O1xuICAgIEpzLlVuc2FmZS5pbmplY3QgKEpzLnN0cmluZyAoXCJFcnJvcjogXCIgXiBtc2cpKSlcblxubGV0IGFwaV9zdHJpbmdpZnkgdl9qcyA9XG4gIEpzLlVuc2FmZS5pbmplY3QgKEpzLnN0cmluZyAoaW5zcGVjdCAoanNfdG9fdmFsdWUgdl9qcykpKVxuXG5sZXQgYXBpX3R5cGVfb2Ygdl9qcyA9XG4gIEpzLlVuc2FmZS5pbmplY3QgKEpzLnN0cmluZyAodHlwZV9vZiAoanNfdG9fdmFsdWUgdl9qcykpKVxuXG5sZXQgYXBpX2luc3BlY3Qgdl9qcyA9XG4gIEpzLlVuc2FmZS5pbmplY3QgKEpzLnN0cmluZyAoaW5zcGVjdCAoanNfdG9fdmFsdWUgdl9qcykpKVxuXG5sZXQgYXBpX2VuZ2luZSAoKSA9XG4gIEpzLlVuc2FmZS5pbmplY3QgKEpzLnN0cmluZyBcIm9jYW1sLXZtLXdhc21cIilcblxubGV0IGFwaV9yZWdpc3Rlcl9uYXRpdmUgbmFtZV9qcyBjYWxsYmFja19qcyA9XG4gIGxldCBuYW1lID0gSnMudG9fc3RyaW5nIG5hbWVfanMgaW5cbiAgbGV0IG5hdGl2ZV9mbiBhcmdzID1cbiAgICBsZXQganNfYXJncyA9IGFyZ3MgfD4gTGlzdC5tYXAgdmFsdWVfdG9fanMgfD4gQXJyYXkub2ZfbGlzdCBpblxuICAgIGpzX3RvX3ZhbHVlIChKcy5VbnNhZmUuZnVuX2NhbGwgY2FsbGJhY2tfanMgW3wgSnMuVW5zYWZlLmluamVjdCAoSnMuYXJyYXkganNfYXJncykgfF0pXG4gIGluXG4gIGlnbm9yZSAoZW52X2JpbmQgZ2xvYmFsX2VudiBuYW1lIChOYXRpdmVGbiAobmFtZSwgbmF0aXZlX2ZuKSkpO1xuICBKcy5VbnNhZmUuaW5qZWN0IEpzLm51bGxcblxubGV0IGFwaV9jYWxsX2ZuIGZuX2pzIGFyZ3NfanMgPVxuICB0cnlcbiAgICBsZXQgZm4gPSBqc190b192YWx1ZSBmbl9qcyBpblxuICAgIGxldCBhcmdzID0gQXJyYXkudG9fbGlzdCAoQXJyYXkubWFwIGpzX3RvX3ZhbHVlIChKcy50b19hcnJheSAoSnMuVW5zYWZlLmNvZXJjZSBhcmdzX2pzKSkpIGluXG4gICAgcmV0dXJuX3ZpYV9zaWRlX2NoYW5uZWwgKHZhbHVlX3RvX2pzIChjYWxsX3N4X2ZuIGZuIGFyZ3MpKVxuICB3aXRoXG4gIHwgRXZhbF9lcnJvciBtc2cgLT5cbiAgICBpZ25vcmUgKEpzLlVuc2FmZS5tZXRoX2NhbGxcbiAgICAgIChKcy5VbnNhZmUuZ2V0IEpzLlVuc2FmZS5nbG9iYWwgKEpzLnN0cmluZyBcImNvbnNvbGVcIikpXG4gICAgICBcImVycm9yXCIgW3wgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIChcIltzeF0gY2FsbEZuOiBcIiBeIG1zZykpIHxdKTtcbiAgICBKcy5VbnNhZmUuaW5qZWN0IEpzLm51bGxcbiAgfCBleG4gLT5cbiAgICBpZ25vcmUgKEpzLlVuc2FmZS5tZXRoX2NhbGxcbiAgICAgIChKcy5VbnNhZmUuZ2V0IEpzLlVuc2FmZS5nbG9iYWwgKEpzLnN0cmluZyBcImNvbnNvbGVcIikpXG4gICAgICBcImVycm9yXCIgW3wgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIChcIltzeF0gY2FsbEZuOiBcIiBeIFByaW50ZXhjLnRvX3N0cmluZyBleG4pKSB8XSk7XG4gICAgSnMuVW5zYWZlLmluamVjdCBKcy5udWxsXG5cbmxldCBhcGlfaXNfY2FsbGFibGUgZm5fanMgPVxuICBpZiBKcy5VbnNhZmUuZXF1YWxzIGZuX2pzIEpzLm51bGwgfHwgSnMuVW5zYWZlLmVxdWFscyBmbl9qcyBKcy51bmRlZmluZWQgdGhlblxuICAgIEpzLlVuc2FmZS5pbmplY3QgKEpzLmJvb2wgZmFsc2UpXG4gIGVsc2VcbiAgICBsZXQgaCA9IEpzLlVuc2FmZS5nZXQgZm5fanMgKEpzLnN0cmluZyBcIl9fc3hfaGFuZGxlXCIpIGluXG4gICAgaWYgSnMuVW5zYWZlLmVxdWFscyBoIEpzLnVuZGVmaW5lZCB0aGVuIEpzLlVuc2FmZS5pbmplY3QgKEpzLmJvb2wgZmFsc2UpXG4gICAgZWxzZSBKcy5VbnNhZmUuaW5qZWN0IChKcy5ib29sIChpc19jYWxsYWJsZSAoZ2V0X2hhbmRsZSAoSnMuZmxvYXRfb2ZfbnVtYmVyIChKcy5VbnNhZmUuY29lcmNlIGgpIHw+IGludF9vZl9mbG9hdCkpKSlcblxubGV0IGFwaV9mbl9hcml0eSBmbl9qcyA9XG4gIGxldCBoID0gSnMuVW5zYWZlLmdldCBmbl9qcyAoSnMuc3RyaW5nIFwiX19zeF9oYW5kbGVcIikgaW5cbiAgaWYgSnMuVW5zYWZlLmVxdWFscyBoIEpzLnVuZGVmaW5lZCB0aGVuIEpzLlVuc2FmZS5pbmplY3QgKEpzLm51bWJlcl9vZl9mbG9hdCAoLTEuMCkpXG4gIGVsc2VcbiAgICBsZXQgdiA9IGdldF9oYW5kbGUgKEpzLmZsb2F0X29mX251bWJlciAoSnMuVW5zYWZlLmNvZXJjZSBoKSB8PiBpbnRfb2ZfZmxvYXQpIGluXG4gICAgbWF0Y2ggdiB3aXRoXG4gICAgfCBMYW1iZGEgbCAtPiBKcy5VbnNhZmUuaW5qZWN0IChKcy5udW1iZXJfb2ZfZmxvYXQgKGZsb2F0X29mX2ludCAoTGlzdC5sZW5ndGggbC5sX3BhcmFtcykpKVxuICAgIHwgXyAtPiBKcy5VbnNhZmUuaW5qZWN0IChKcy5udW1iZXJfb2ZfZmxvYXQgKC0xLjApKVxuXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcbigqIFBsYXRmb3JtIGJpbmRpbmdzIChyZWdpc3RlcmVkIGluIGdsb2JhbCBlbnYpICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuXG5sZXQgKCkgPVxuICBsZXQgYmluZCBuYW1lIGZuID0gaWdub3JlIChlbnZfYmluZCBnbG9iYWxfZW52IG5hbWUgKE5hdGl2ZUZuIChuYW1lLCBmbikpKSBpblxuXG4gICgqIC0tLSBFdmFsdWF0aW9uIC0tLSAqKVxuICBiaW5kIFwiY2VrLWV2YWxcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgc10gLT4gbGV0IGUgPSBTeF9wYXJzZXIucGFyc2VfYWxsIHMgaW4gKG1hdGNoIGUgd2l0aCBoIDo6IF8gLT4gU3hfcmVmLmV2YWxfZXhwciBoIChFbnYgZ2xvYmFsX2VudikgfCBbXSAtPiBOaWwpXG4gICAgfCBbZXhwcl0gLT4gU3hfcmVmLmV2YWxfZXhwciBleHByIChFbnYgZ2xvYmFsX2VudilcbiAgICB8IFtleHByOyBlbnZfdmFsXSAtPiBTeF9yZWYuZXZhbF9leHByIGV4cHIgZW52X3ZhbFxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImNlay1ldmFsOiBleHBlY3RlZCAxLTIgYXJnc1wiKSk7XG5cbiAgYmluZCBcImV2YWwtZXhwci1jZWtcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtleHByOyBlXSAtPiBTeF9yZWYuZXZhbF9leHByIGV4cHIgZVxuICAgIHwgW2V4cHJdIC0+IFN4X3JlZi5ldmFsX2V4cHIgZXhwciAoRW52IGdsb2JhbF9lbnYpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZXZhbC1leHByLWNlazogZXhwZWN0ZWQgMS0yIGFyZ3NcIikpO1xuXG4gIGJpbmQgXCJjZWstY2FsbFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2Y7IE5pbF0gLT4gU3hfcmVmLmV2YWxfZXhwciAoTGlzdCBbZl0pIChFbnYgZ2xvYmFsX2VudilcbiAgICB8IFtmOyBMaXN0IGFsXSAtPiBTeF9yZWYuZXZhbF9leHByIChMaXN0IChmIDo6IGFsKSkgKEVudiBnbG9iYWxfZW52KVxuICAgIHwgW2Y7IGFdIC0+IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QgW2Y7IGFdKSAoRW52IGdsb2JhbF9lbnYpXG4gICAgfCBbZl0gLT4gU3hfcmVmLmV2YWxfZXhwciAoTGlzdCBbZl0pIChFbnYgZ2xvYmFsX2VudilcbiAgICB8IGYgOjogcmVzdCAtPiBTeF9yZWYuZXZhbF9leHByIChMaXN0IChmIDo6IHJlc3QpKSAoRW52IGdsb2JhbF9lbnYpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiY2VrLWNhbGw6IGV4cGVjdGVkIGZ1bmN0aW9uIGFuZCBhcmdzXCIpKTtcblxuICBiaW5kIFwic3gtcGFyc2VcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgc3JjXSAtPiBMaXN0IChTeF9wYXJzZXIucGFyc2VfYWxsIHNyYylcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzeC1wYXJzZTogZXhwZWN0ZWQgc3RyaW5nXCIpKTtcblxuICBiaW5kIFwic3gtc2VyaWFsaXplXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbdl0gLT4gU3RyaW5nIChpbnNwZWN0IHYpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic3gtc2VyaWFsaXplOiBleHBlY3RlZCAxIGFyZ1wiKSk7XG5cbiAgKCogLS0tIEFzc2VydGlvbnMgJiBlcXVhbGl0eSAtLS0gKilcbiAgbGV0IHJlYyBkZWVwX2VxdWFsIGEgYiA9XG4gICAgbWF0Y2ggYSwgYiB3aXRoXG4gICAgfCBOaWwsIE5pbCAtPiB0cnVlIHwgQm9vbCBhLCBCb29sIGIgLT4gYSA9IGJcbiAgICB8IE51bWJlciBhLCBOdW1iZXIgYiAtPiBhID0gYiB8IFN0cmluZyBhLCBTdHJpbmcgYiAtPiBhID0gYlxuICAgIHwgU3ltYm9sIGEsIFN5bWJvbCBiIC0+IGEgPSBiIHwgS2V5d29yZCBhLCBLZXl3b3JkIGIgLT4gYSA9IGJcbiAgICB8IChMaXN0IGEgfCBMaXN0UmVmIHsgY29udGVudHMgPSBhIH0pLCAoTGlzdCBiIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gYiB9KSAtPlxuICAgICAgTGlzdC5sZW5ndGggYSA9IExpc3QubGVuZ3RoIGIgJiYgTGlzdC5mb3JfYWxsMiBkZWVwX2VxdWFsIGEgYlxuICAgIHwgRGljdCBhLCBEaWN0IGIgLT5cbiAgICAgIGxldCBrYSA9IEhhc2h0YmwuZm9sZCAoZnVuIGsgXyBhY2MgLT4gayA6OiBhY2MpIGEgW10gaW5cbiAgICAgIGxldCBrYiA9IEhhc2h0YmwuZm9sZCAoZnVuIGsgXyBhY2MgLT4gayA6OiBhY2MpIGIgW10gaW5cbiAgICAgIExpc3QubGVuZ3RoIGthID0gTGlzdC5sZW5ndGgga2IgJiZcbiAgICAgIExpc3QuZm9yX2FsbCAoZnVuIGsgLT4gSGFzaHRibC5tZW0gYiBrICYmXG4gICAgICAgIGRlZXBfZXF1YWwgKEhhc2h0YmwuZmluZCBhIGspIChIYXNodGJsLmZpbmQgYiBrKSkga2FcbiAgICB8IF8gLT4gZmFsc2VcbiAgaW5cbiAgYmluZCBcImVxdWFsP1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW2E7IGJdIC0+IEJvb2wgKGRlZXBfZXF1YWwgYSBiKSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJlcXVhbD86IDIgYXJnc1wiKSk7XG4gIGJpbmQgXCJhc3NlcnRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtjb25kXSAtPiBpZiBub3QgKHN4X3RydXRoeSBjb25kKSB0aGVuIHJhaXNlIChFdmFsX2Vycm9yIFwiQXNzZXJ0aW9uIGZhaWxlZFwiKTsgQm9vbCB0cnVlXG4gICAgfCBbY29uZDsgbXNnXSAtPiBpZiBub3QgKHN4X3RydXRoeSBjb25kKSB0aGVuIHJhaXNlIChFdmFsX2Vycm9yIChcIkFzc2VydGlvbjogXCIgXiB2YWx1ZV90b19zdHJpbmcgbXNnKSk7IEJvb2wgdHJ1ZVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImFzc2VydDogMS0yIGFyZ3NcIikpO1xuXG4gIGJpbmQgXCJ0cnktY2FsbFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW3RodW5rXSAtPlxuICAgICAgKHRyeSBpZ25vcmUgKFN4X3JlZi5ldmFsX2V4cHIgKExpc3QgW3RodW5rXSkgKEVudiBnbG9iYWxfZW52KSk7XG4gICAgICAgIGxldCBkID0gSGFzaHRibC5jcmVhdGUgMiBpbiBIYXNodGJsLnJlcGxhY2UgZCBcIm9rXCIgKEJvb2wgdHJ1ZSk7IERpY3QgZFxuICAgICAgd2l0aCBFdmFsX2Vycm9yIG1zZyAtPlxuICAgICAgICBsZXQgZCA9IEhhc2h0YmwuY3JlYXRlIDIgaW4gSGFzaHRibC5yZXBsYWNlIGQgXCJva1wiIChCb29sIGZhbHNlKTsgSGFzaHRibC5yZXBsYWNlIGQgXCJlcnJvclwiIChTdHJpbmcgbXNnKTsgRGljdCBkKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInRyeS1jYWxsOiAxIGFyZ1wiKSk7XG5cbiAgKCogLS0tIExpc3QgbXV0YXRpb24gLS0tICopXG4gIGJpbmQgXCJhcHBlbmQhXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTGlzdFJlZiByOyB2XSAtPiByIDo9ICFyIEAgW3ZdOyBMaXN0UmVmIHJcbiAgICB8IFtMaXN0IGl0ZW1zOyB2XSAtPiBMaXN0IChpdGVtcyBAIFt2XSlcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJhcHBlbmQhOiBsaXN0IGFuZCB2YWx1ZVwiKSk7XG5cbiAgKCogLS0tIEVudmlyb25tZW50IG9wcyAtLS0gKilcbiAgKCogVXNlIHVud3JhcF9lbnYgZm9yIG5pbC9kaWN0IHRvbGVyYW5jZSwgbWF0Y2hpbmcgdGhlIHNlcnZlciBrZXJuZWwgKilcbiAgbGV0IHV3ID0gU3hfcnVudGltZS51bndyYXBfZW52IGluXG4gIGJpbmQgXCJtYWtlLWVudlwiIChmdW4gXyAtPiBFbnYgKG1ha2VfZW52ICgpKSk7XG4gIGJpbmQgXCJnbG9iYWwtZW52XCIgKGZ1biBfIC0+IEVudiBnbG9iYWxfZW52KTtcbiAgYmluZCBcImVudi1oYXM/XCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbZTsgU3RyaW5nIGtdIHwgW2U7IEtleXdvcmQga10gLT4gQm9vbCAoZW52X2hhcyAodXcgZSkgaykgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZW52LWhhcz9cIikpO1xuICBiaW5kIFwiZW52LWdldFwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW2U7IFN0cmluZyBrXSB8IFtlOyBLZXl3b3JkIGtdIC0+IGVudl9nZXQgKHV3IGUpIGsgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZW52LWdldFwiKSk7XG4gIGJpbmQgXCJlbnYtYmluZCFcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtlOyBTdHJpbmcgazsgdl0gfCBbZTsgS2V5d29yZCBrOyB2XSAtPiBlbnZfYmluZCAodXcgZSkgayB2IHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImVudi1iaW5kIVwiKSk7XG4gIGJpbmQgXCJlbnYtc2V0IVwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW2U7IFN0cmluZyBrOyB2XSB8IFtlOyBLZXl3b3JkIGs7IHZdIC0+IGVudl9zZXQgKHV3IGUpIGsgdiB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJlbnYtc2V0IVwiKSk7XG4gIGJpbmQgXCJlbnYtZXh0ZW5kXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbZV0gLT4gRW52IChlbnZfZXh0ZW5kICh1dyBlKSkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZW52LWV4dGVuZFwiKSk7XG4gIGJpbmQgXCJlbnYtbWVyZ2VcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFthOyBiXSAtPiBTeF9ydW50aW1lLmVudl9tZXJnZSBhIGIgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZW52LW1lcmdlXCIpKTtcblxuICAoKiAtLS0gVHlwZSBjb25zdHJ1Y3RvcnMgLS0tICopXG4gIGJpbmQgXCJtYWtlLXN5bWJvbFwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW1N0cmluZyBzXSAtPiBTeW1ib2wgcyB8IFt2XSAtPiBTeW1ib2wgKHZhbHVlX3RvX3N0cmluZyB2KSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJtYWtlLXN5bWJvbFwiKSk7XG4gIGJpbmQgXCJtYWtlLWtleXdvcmRcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtTdHJpbmcgc10gLT4gS2V5d29yZCBzIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm1ha2Uta2V5d29yZFwiKSk7XG4gIGJpbmQgXCJrZXl3b3JkLW5hbWVcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtLZXl3b3JkIGtdIC0+IFN0cmluZyBrIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImtleXdvcmQtbmFtZVwiKSk7XG4gIGJpbmQgXCJzeW1ib2wtbmFtZVwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW1N5bWJvbCBzXSAtPiBTdHJpbmcgcyB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzeW1ib2wtbmFtZVwiKSk7XG5cbiAgKCogLS0tIENvbXBvbmVudC9Jc2xhbmQgYWNjZXNzb3JzIChtdXN0IGhhbmRsZSBib3RoIHR5cGVzKSAtLS0gKilcbiAgYmluZCBcImNvbXBvbmVudC1uYW1lXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtDb21wb25lbnQgY10gLT4gU3RyaW5nIGMuY19uYW1lIHwgW0lzbGFuZCBpXSAtPiBTdHJpbmcgaS5pX25hbWUgfCBfIC0+IFN0cmluZyBcIlwiKTtcbiAgYmluZCBcImNvbXBvbmVudC1jbG9zdXJlXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtDb21wb25lbnQgY10gLT4gRW52IGMuY19jbG9zdXJlIHwgW0lzbGFuZCBpXSAtPiBFbnYgaS5pX2Nsb3N1cmUgfCBfIC0+IERpY3QgKEhhc2h0YmwuY3JlYXRlIDApKTtcbiAgYmluZCBcImNvbXBvbmVudC1wYXJhbXNcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtDb21wb25lbnQgY10gLT4gTGlzdCAoTGlzdC5tYXAgKGZ1biBzIC0+IFN0cmluZyBzKSBjLmNfcGFyYW1zKVxuICAgIHwgW0lzbGFuZCBpXSAtPiBMaXN0IChMaXN0Lm1hcCAoZnVuIHMgLT4gU3RyaW5nIHMpIGkuaV9wYXJhbXMpXG4gICAgfCBfIC0+IE5pbCk7XG4gIGJpbmQgXCJjb21wb25lbnQtYm9keVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbQ29tcG9uZW50IGNdIC0+IGMuY19ib2R5IHwgW0lzbGFuZCBpXSAtPiBpLmlfYm9keSB8IF8gLT4gTmlsKTtcbiAgbGV0IGhhc19jaGlsZHJlbl9pbXBsID0gTmF0aXZlRm4gKFwiY29tcG9uZW50LWhhcy1jaGlsZHJlbj9cIiwgZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW0NvbXBvbmVudCBjXSAtPiBCb29sIGMuY19oYXNfY2hpbGRyZW4gfCBbSXNsYW5kIGldIC0+IEJvb2wgaS5pX2hhc19jaGlsZHJlbiB8IF8gLT4gQm9vbCBmYWxzZSkgaW5cbiAgaWdub3JlIChlbnZfYmluZCBnbG9iYWxfZW52IFwiY29tcG9uZW50LWhhcy1jaGlsZHJlblwiIGhhc19jaGlsZHJlbl9pbXBsKTtcbiAgaWdub3JlIChlbnZfYmluZCBnbG9iYWxfZW52IFwiY29tcG9uZW50LWhhcy1jaGlsZHJlbj9cIiBoYXNfY2hpbGRyZW5faW1wbCk7XG4gIGJpbmQgXCJjb21wb25lbnQtYWZmaW5pdHlcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW0NvbXBvbmVudCBjXSAtPiBTdHJpbmcgYy5jX2FmZmluaXR5IHwgW0lzbGFuZCBfXSAtPiBTdHJpbmcgXCJjbGllbnRcIiB8IF8gLT4gU3RyaW5nIFwiYXV0b1wiKTtcbiAgYmluZCBcImNvbXBvbmVudC1wYXJhbS10eXBlc1wiIChmdW4gXyAtPiBOaWwpO1xuICBiaW5kIFwiY29tcG9uZW50LXNldC1wYXJhbS10eXBlcyFcIiAoZnVuIF8gLT4gTmlsKTtcblxuICAoKiAtLS0gQ0VLIHN0ZXBwaW5nIC0tLSAqKVxuICBiaW5kIFwibWFrZS1jZWstc3RhdGVcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtjOyBlOyBrXSAtPiBTeF9yZWYubWFrZV9jZWtfc3RhdGUgYyBlIGsgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibWFrZS1jZWstc3RhdGVcIikpO1xuICBiaW5kIFwiY2VrLXN0ZXBcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtzXSAtPiBTeF9yZWYuY2VrX3N0ZXAgcyB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJjZWstc3RlcFwiKSk7XG4gIGJpbmQgXCJjZWstcGhhc2VcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtzXSAtPiBTeF9yZWYuY2VrX3BoYXNlIHMgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiY2VrLXBoYXNlXCIpKTtcbiAgYmluZCBcImNlay12YWx1ZVwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW3NdIC0+IFN4X3JlZi5jZWtfdmFsdWUgcyB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJjZWstdmFsdWVcIikpO1xuICBiaW5kIFwiY2VrLXRlcm1pbmFsP1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW3NdIC0+IFN4X3JlZi5jZWtfdGVybWluYWxfcCBzIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImNlay10ZXJtaW5hbD9cIikpO1xuICBiaW5kIFwiY2VrLWtvbnRcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtzXSAtPiBTeF9yZWYuY2VrX2tvbnQgcyB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJjZWsta29udFwiKSk7XG4gIGJpbmQgXCJmcmFtZS10eXBlXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbZl0gLT4gU3hfcmVmLmZyYW1lX3R5cGUgZiB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJmcmFtZS10eXBlXCIpKTtcblxuICAoKiAtLS0gU3RyaWN0IG1vZGUgLS0tICopXG4gIGlnbm9yZSAoZW52X2JpbmQgZ2xvYmFsX2VudiBcIipzdHJpY3QqXCIgKEJvb2wgZmFsc2UpKTtcbiAgaWdub3JlIChlbnZfYmluZCBnbG9iYWxfZW52IFwiKnByaW0tcGFyYW0tdHlwZXMqXCIgTmlsKTtcbiAgYmluZCBcInNldC1zdHJpY3QhXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbdl0gLT4gU3hfcmVmLl9zdHJpY3RfcmVmIDo9IHY7IGlnbm9yZSAoZW52X3NldCBnbG9iYWxfZW52IFwiKnN0cmljdCpcIiB2KTsgTmlsIHwgXyAtPiBOaWwpO1xuICBiaW5kIFwic2V0LXByaW0tcGFyYW0tdHlwZXMhXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbdl0gLT4gU3hfcmVmLl9wcmltX3BhcmFtX3R5cGVzX3JlZiA6PSB2OyBpZ25vcmUgKGVudl9zZXQgZ2xvYmFsX2VudiBcIipwcmltLXBhcmFtLXR5cGVzKlwiIHYpOyBOaWwgfCBfIC0+IE5pbCk7XG4gIGJpbmQgXCJ2YWx1ZS1tYXRjaGVzLXR5cGU/XCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbdjsgdF0gLT4gU3hfcmVmLnZhbHVlX21hdGNoZXNfdHlwZV9wIHYgdCB8IF8gLT4gTmlsKTtcblxuICAoKiAtLS0gQXBwbHkgLS0tICopXG4gIGJpbmQgXCJhcHBseVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgZiA6OiByZXN0IC0+XG4gICAgICBsZXQgYWxsX2FyZ3MgPSBtYXRjaCBMaXN0LnJldiByZXN0IHdpdGggTGlzdCBsYXN0IDo6IHByZWZpeCAtPiBMaXN0LnJldiBwcmVmaXggQCBsYXN0IHwgXyAtPiByZXN0IGluXG4gICAgICBTeF9ydW50aW1lLnN4X2NhbGwgZiBhbGxfYXJnc1xuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImFwcGx5XCIpKTtcblxuICAoKiAtLS0gU2NvcGUgc3RhY2sgLS0tICopXG4gICgqIFNjb3BlIHByaW1pdGl2ZXMgKHNjb3BlLXB1c2ghLCBzY29wZS1wb3AhLCBjb250ZXh0LCBjb2xsZWN0ISwgY29sbGVjdGVkLFxuICAgICBlbWl0ISwgZW1pdHRlZCwgc2NvcGUtZW1pdCEsIHNjb3BlLWVtaXR0ZWQsIGV0Yy4pIGFyZSByZWdpc3RlcmVkIGJ5XG4gICAgIFN4X3Njb3BlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBpbiB0aGUgcHJpbWl0aXZlcyB0YWJsZS5cbiAgICAgVGhlIENFSyBldmFsdWF0b3IgZmFsbHMgdGhyb3VnaCB0byB0aGUgcHJpbWl0aXZlcyB0YWJsZSB3aGVuIGEgc3ltYm9sXG4gICAgIGlzbid0IGluIHRoZSBlbnYsIHNvIHRoZXNlIHdvcmsgYXV0b21hdGljYWxseS5cbiAgICAgT25seSBwcm92aWRlLXB1c2ghL3Byb3ZpZGUtcG9wISBuZWVkIGV4cGxpY2l0IGVudiBiaW5kaW5ncyBhcyBhbGlhc2VzLiAqKVxuICBiaW5kIFwicHJvdmlkZS1wdXNoIVwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW247IHZdIC0+IFN4X3J1bnRpbWUucHJvdmlkZV9wdXNoIG4gdiB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJwcm92aWRlLXB1c2ghXCIpKTtcbiAgYmluZCBcInByb3ZpZGUtcG9wIVwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW25dIC0+IFN4X3J1bnRpbWUucHJvdmlkZV9wb3AgbiB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJwcm92aWRlLXBvcCFcIikpO1xuXG4gICgqIC0tLSBGcmFnbWVudCAvIHJhdyBIVE1MIC0tLSAqKVxuICBiaW5kIFwiPD5cIiAoZnVuIGFyZ3MgLT5cbiAgICBSYXdIVE1MIChTdHJpbmcuY29uY2F0IFwiXCIgKExpc3QubWFwIChmdW4gYSAtPlxuICAgICAgbWF0Y2ggYSB3aXRoIFN0cmluZyBzIHwgUmF3SFRNTCBzIC0+IHMgfCBOaWwgLT4gXCJcIlxuICAgICAgfCBMaXN0IF8gLT4gU3hfcmVuZGVyLnJlbmRlcl90b19odG1sIGEgZ2xvYmFsX2VudlxuICAgICAgfCBfIC0+IHZhbHVlX3RvX3N0cmluZyBhKSBhcmdzKSkpO1xuICBiaW5kIFwicmF3IVwiIChmdW4gYXJncyAtPlxuICAgIFJhd0hUTUwgKFN0cmluZy5jb25jYXQgXCJcIiAoTGlzdC5tYXAgKGZ1biBhIC0+XG4gICAgICBtYXRjaCBhIHdpdGggU3RyaW5nIHMgfCBSYXdIVE1MIHMgLT4gcyB8IF8gLT4gdmFsdWVfdG9fc3RyaW5nIGEpIGFyZ3MpKSk7XG5cbiAgYmluZCBcImRlZmluZS1wYWdlLWhlbHBlclwiIChmdW4gXyAtPiBOaWwpO1xuXG4gICgqIC0tLSBSZW5kZXIgLS0tICopXG4gIFN4X3JlbmRlci5zZXR1cF9yZW5kZXJfZW52IGdsb2JhbF9lbnY7XG4gIGJpbmQgXCJzZXQtcmVuZGVyLWFjdGl2ZSFcIiAoZnVuIF8gLT4gTmlsKTtcbiAgYmluZCBcInJlbmRlci1hY3RpdmU/XCIgKGZ1biBfIC0+IEJvb2wgdHJ1ZSk7XG4gIGJpbmQgXCJpcy1odG1sLXRhZz9cIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtTdHJpbmcgc10gLT4gQm9vbCAoU3hfcmVuZGVyLmlzX2h0bWxfdGFnIHMpIHwgXyAtPiBCb29sIGZhbHNlKTtcblxuICAoKiAtLS0gUmVuZGVyIGNvbnN0YW50cyBuZWVkZWQgYnkgd2ViIGFkYXB0ZXJzIC0tLSAqKVxuICBsZXQgaHRtbF90YWdzID0gTGlzdCAoTGlzdC5tYXAgKGZ1biBzIC0+IFN0cmluZyBzKSBTeF9yZW5kZXIuaHRtbF90YWdzKSBpblxuICBsZXQgdm9pZF9lbGVtZW50cyA9IExpc3QgKExpc3QubWFwIChmdW4gcyAtPiBTdHJpbmcgcykgU3hfcmVuZGVyLnZvaWRfZWxlbWVudHMpIGluXG4gIGxldCBib29sZWFuX2F0dHJzID0gTGlzdCAoTGlzdC5tYXAgKGZ1biBzIC0+IFN0cmluZyBzKSBTeF9yZW5kZXIuYm9vbGVhbl9hdHRycykgaW5cbiAgaWdub3JlIChlbnZfYmluZCBnbG9iYWxfZW52IFwiSFRNTF9UQUdTXCIgaHRtbF90YWdzKTtcbiAgaWdub3JlIChlbnZfYmluZCBnbG9iYWxfZW52IFwiVk9JRF9FTEVNRU5UU1wiIHZvaWRfZWxlbWVudHMpO1xuICBpZ25vcmUgKGVudl9iaW5kIGdsb2JhbF9lbnYgXCJCT09MRUFOX0FUVFJTXCIgYm9vbGVhbl9hdHRycyk7XG5cbiAgKCogLS0tIEVycm9yIGhhbmRsaW5nIC0tLSAqKVxuICBiaW5kIFwiY2VrLXRyeVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW3RodW5rOyBoYW5kbGVyXSAtPlxuICAgICAgKHRyeSBTeF9yZWYuY2VrX2NhbGwgdGh1bmsgTmlsXG4gICAgICAgd2l0aCBFdmFsX2Vycm9yIG1zZyAtPiBTeF9yZWYuY2VrX2NhbGwgaGFuZGxlciAoTGlzdCBbU3RyaW5nIG1zZ10pKVxuICAgIHwgW3RodW5rXSAtPlxuICAgICAgKHRyeSBsZXQgciA9IFN4X3JlZi5jZWtfY2FsbCB0aHVuayBOaWwgaW5cbiAgICAgICAgTGlzdCBbU3ltYm9sIFwib2tcIjsgcl1cbiAgICAgICB3aXRoIEV2YWxfZXJyb3IgbXNnIC0+IExpc3QgW1N5bWJvbCBcImVycm9yXCI7IFN0cmluZyBtc2ddKVxuICAgIHwgXyAtPiBOaWwpO1xuXG4gICgqIC0tLSBFdmFsdWF0b3IgYnJpZGdlIGZ1bmN0aW9ucyBuZWVkZWQgYnkgc3BlYyAuc3ggZmlsZXMgLS0tICopXG4gIGJpbmQgXCJldmFsLWV4cHJcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2V4cHI7IGVdIC0+IFN4X3JlZi5ldmFsX2V4cHIgZXhwciBlIHwgW2V4cHJdIC0+IFN4X3JlZi5ldmFsX2V4cHIgZXhwciAoRW52IGdsb2JhbF9lbnYpIHwgXyAtPiBOaWwpO1xuICBiaW5kIFwidHJhbXBvbGluZVwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW3ZdIC0+ICFTeF9wcmltaXRpdmVzLl9zeF90cmFtcG9saW5lX2ZuIHYgfCBfIC0+IE5pbCk7XG4gIGJpbmQgXCJleHBhbmQtbWFjcm9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW21hYzsgcmF3OyBFbnYgZV0gLT4gU3hfcmVmLmV4cGFuZF9tYWNybyBtYWMgcmF3IChFbnYgZSkgfCBbbWFjOyByYXddIC0+IFN4X3JlZi5leHBhbmRfbWFjcm8gbWFjIHJhdyAoRW52IGdsb2JhbF9lbnYpIHwgXyAtPiBOaWwpO1xuICBiaW5kIFwiY2FsbC1sYW1iZGFcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtmbl92YWw7IGNhbGxfYXJnczsgRW52IF9lXSAtPiBTeF9yZWYuY2VrX2NhbGwgZm5fdmFsIGNhbGxfYXJnc1xuICAgIHwgW2ZuX3ZhbDsgY2FsbF9hcmdzXSAtPiBTeF9yZWYuY2VrX2NhbGwgZm5fdmFsIGNhbGxfYXJnc1xuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImNhbGwtbGFtYmRhOiBleHBlY3RlZCAoZm4gYXJncyBlbnY/KVwiKSk7XG4gIGJpbmQgXCJjZWstY2FsbFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbZjsgYV0gLT4gU3hfcmVmLmNla19jYWxsIGYgYSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJjZWstY2FsbFwiKSk7XG4gIGJpbmQgXCJjZWstZXZhbFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbZXhwcl0gLT4gU3hfcmVmLmV2YWxfZXhwciBleHByIChFbnYgZ2xvYmFsX2VudikgfCBbZXhwcjsgZV0gLT4gU3hfcmVmLmV2YWxfZXhwciBleHByIGUgfCBfIC0+IE5pbCk7XG4gIGJpbmQgXCJxcS1leHBhbmQtcnVudGltZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbdGVtcGxhdGVdIC0+IFN4X3JlZi5xcV9leHBhbmQgdGVtcGxhdGUgKEVudiBnbG9iYWxfZW52KSB8IFt0ZW1wbGF0ZTsgRW52IGVdIC0+IFN4X3JlZi5xcV9leHBhbmQgdGVtcGxhdGUgKEVudiBlKSB8IF8gLT4gTmlsKTtcblxuICAoKiAtLS0gVHlwZSBwcmVkaWNhdGVzIG5lZWRlZCBieSBhZGFwdGVycyAtLS0gKilcbiAgYmluZCBcInRodW5rP1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW1RodW5rIF9dIC0+IEJvb2wgdHJ1ZSB8IF8gLT4gQm9vbCBmYWxzZSk7XG4gIGJpbmQgXCJ0aHVuay1leHByXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbdl0gLT4gdGh1bmtfZXhwciB2IHwgXyAtPiBOaWwpO1xuICBiaW5kIFwidGh1bmstZW52XCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbdl0gLT4gdGh1bmtfZW52IHYgfCBfIC0+IE5pbCk7XG4gIGJpbmQgXCJsYW1iZGE/XCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbTGFtYmRhIF9dIC0+IEJvb2wgdHJ1ZSB8IF8gLT4gQm9vbCBmYWxzZSk7XG4gIGJpbmQgXCJtYWNybz9cIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtNYWNybyBfXSAtPiBCb29sIHRydWUgfCBfIC0+IEJvb2wgZmFsc2UpO1xuICBiaW5kIFwiaXNsYW5kP1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW0lzbGFuZCBfXSAtPiBCb29sIHRydWUgfCBfIC0+IEJvb2wgZmFsc2UpO1xuICBiaW5kIFwiY29tcG9uZW50P1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW0NvbXBvbmVudCBfXSB8IFtJc2xhbmQgX10gLT4gQm9vbCB0cnVlIHwgXyAtPiBCb29sIGZhbHNlKTtcbiAgYmluZCBcImNhbGxhYmxlP1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW05hdGl2ZUZuIF9dIHwgW0xhbWJkYSBfXSB8IFtDb21wb25lbnQgX10gfCBbSXNsYW5kIF9dIC0+IEJvb2wgdHJ1ZSB8IF8gLT4gQm9vbCBmYWxzZSk7XG4gIGJpbmQgXCJzcHJlYWQ/XCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbU3ByZWFkIF9dIC0+IEJvb2wgdHJ1ZSB8IF8gLT4gQm9vbCBmYWxzZSk7XG4gIGJpbmQgXCJjb250aW51YXRpb24/XCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbQ29udGludWF0aW9uIF9dIC0+IEJvb2wgdHJ1ZSB8IF8gLT4gQm9vbCBmYWxzZSk7XG4gIGJpbmQgXCJsYW1iZGEtcGFyYW1zXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbTGFtYmRhIGxdIC0+IExpc3QgKExpc3QubWFwIChmdW4gcyAtPiBTdHJpbmcgcykgbC5sX3BhcmFtcykgfCBfIC0+IExpc3QgW10pO1xuICBiaW5kIFwibGFtYmRhLWJvZHlcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtMYW1iZGEgbF0gLT4gbC5sX2JvZHkgfCBfIC0+IE5pbCk7XG4gIGJpbmQgXCJsYW1iZGEtY2xvc3VyZVwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW0xhbWJkYSBsXSAtPiBFbnYgbC5sX2Nsb3N1cmUgfCBfIC0+IERpY3QgKEhhc2h0YmwuY3JlYXRlIDApKTtcblxuICAoKiAtLS0gQ29yZSBvcGVyYXRpb25zIG5lZWRlZCBieSBhZGFwdGVycyAtLS0gKilcbiAgYmluZCBcInNwcmVhZC1hdHRyc1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbU3ByZWFkIHBhaXJzXSAtPiBsZXQgZCA9IEhhc2h0YmwuY3JlYXRlIDQgaW4gTGlzdC5pdGVyIChmdW4gKGssIHYpIC0+IEhhc2h0YmwucmVwbGFjZSBkIGsgdikgcGFpcnM7IERpY3QgZCB8IF8gLT4gRGljdCAoSGFzaHRibC5jcmVhdGUgMCkpO1xuICBiaW5kIFwibWFrZS1zcHJlYWRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW0RpY3QgZF0gLT4gU3ByZWFkIChIYXNodGJsLmZvbGQgKGZ1biBrIHYgYWNjIC0+IChrLCB2KSA6OiBhY2MpIGQgW10pIHwgXyAtPiBOaWwpO1xuICBiaW5kIFwibWFrZS1yYXctaHRtbFwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW1N0cmluZyBzXSAtPiBSYXdIVE1MIHMgfCBbdl0gLT4gUmF3SFRNTCAodmFsdWVfdG9fc3RyaW5nIHYpIHwgXyAtPiBOaWwpO1xuICBiaW5kIFwicmF3LWh0bWwtY29udGVudFwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW1Jhd0hUTUwgc10gLT4gU3RyaW5nIHMgfCBbU3RyaW5nIHNdIC0+IFN0cmluZyBzIHwgXyAtPiBTdHJpbmcgXCJcIik7XG4gIGJpbmQgXCJlbXB0eS1kaWN0P1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW0RpY3QgZF0gLT4gQm9vbCAoSGFzaHRibC5sZW5ndGggZCA9IDApIHwgXyAtPiBCb29sIHRydWUpO1xuICBiaW5kIFwiaWRlbnRpY2FsP1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW2E7IGJdIC0+IEJvb2wgKGEgPT0gYikgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiaWRlbnRpY2FsP1wiKSk7XG4gIGJpbmQgXCJmb3ItZWFjaC1pbmRleGVkXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbZm5fdmFsOyBMaXN0IGl0ZW1zXSB8IFtmbl92YWw7IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH1dIC0+XG4gICAgICBMaXN0Lml0ZXJpIChmdW4gaSBpdGVtIC0+XG4gICAgICAgIGlnbm9yZSAoU3hfcmVmLmV2YWxfZXhwciAoTGlzdCBbZm5fdmFsOyBOdW1iZXIgKGZsb2F0X29mX2ludCBpKTsgaXRlbV0pIChFbnYgZ2xvYmFsX2VudikpXG4gICAgICApIGl0ZW1zOyBOaWxcbiAgICB8IF8gLT4gTmlsKTtcblxuICAoKiAtLS0gU3RyaW5nL251bWJlciBoZWxwZXJzIHVzZWQgYnkgb3JjaGVzdHJhdGlvbi9icm93c2VyIC0tLSAqKVxuICBiaW5kIFwibWFrZS1zeC1leHByXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbU3RyaW5nIHNdIC0+IFN4RXhwciBzIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm1ha2Utc3gtZXhwclwiKSk7XG4gIGJpbmQgXCJzeC1leHByLXNvdXJjZVwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW1N4RXhwciBzXSAtPiBTdHJpbmcgcyB8IFtTdHJpbmcgc10gLT4gU3RyaW5nIHMgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic3gtZXhwci1zb3VyY2VcIikpO1xuICBiaW5kIFwicGFyc2UtaW50XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIHNdIC0+ICh0cnkgTnVtYmVyIChmbG9hdF9vZl9pbnQgKGludF9vZl9zdHJpbmcgcykpIHdpdGggXyAtPiBOaWwpXG4gICAgfCBbU3RyaW5nIHM7IGRlZmF1bHRfdmFsXSAtPiAodHJ5IE51bWJlciAoZmxvYXRfb2ZfaW50IChpbnRfb2Zfc3RyaW5nIHMpKSB3aXRoIF8gLT4gZGVmYXVsdF92YWwpXG4gICAgfCBbTnVtYmVyIG5dIHwgW051bWJlciBuOyBfXSAtPiBOdW1iZXIgKEZsb2F0LnJvdW5kIG4pXG4gICAgfCBbXzsgZGVmYXVsdF92YWxdIC0+IGRlZmF1bHRfdmFsIHwgXyAtPiBOaWwpO1xuICBiaW5kIFwicGFyc2UtbnVtYmVyXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbU3RyaW5nIHNdIC0+ICh0cnkgTnVtYmVyIChmbG9hdF9vZl9zdHJpbmcgcykgd2l0aCBfIC0+IE5pbCkgfCBfIC0+IE5pbCk7XG5cbiAgKCogLS0tIFNlcnZlci1vbmx5IHN0dWJzIChuby1vcHMgaW4gYnJvd3NlcikgLS0tICopXG4gIGJpbmQgXCJxdWVyeVwiIChmdW4gXyAtPiBOaWwpO1xuICBiaW5kIFwiYWN0aW9uXCIgKGZ1biBfIC0+IE5pbCk7XG4gIGJpbmQgXCJyZXF1ZXN0LWFyZ1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW187IGRdIC0+IGQgfCBfIC0+IE5pbCk7XG4gIGJpbmQgXCJyZXF1ZXN0LW1ldGhvZFwiIChmdW4gXyAtPiBTdHJpbmcgXCJHRVRcIik7XG4gIGJpbmQgXCJjdHhcIiAoZnVuIF8gLT4gTmlsKTtcbiAgYmluZCBcImhlbHBlclwiIChmdW4gXyAtPiBOaWwpO1xuICAoKVxuXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcbigqIEpJVCBjb21waWxhdGlvbiBob29rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqIE9uIGZpcnN0IGNhbGwgdG8gYSBuYW1lZCBsYW1iZGEsIHRyeSB0byBjb21waWxlIGl0IHRvIGJ5dGVjb2RlIHZpYSAgKilcbigqIGNvbXBpbGVyLnN4IChsb2FkZWQgYXMgYW4gLnN4IHBsYXRmb3JtIGZpbGUpLiBDb21waWxlZCBjbG9zdXJlcyBydW4gKilcbigqIG9uIHRoZSBieXRlY29kZSBWTTsgZmFpbHVyZXMgZmFsbCBiYWNrIHRvIHRoZSBDRUsgaW50ZXJwcmV0ZXIuICAgICAgKilcbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuXG5sZXQgX2ppdF9jb21waWxpbmcgPSByZWYgZmFsc2VcbmxldCBfaml0X2VuYWJsZWQgPSByZWYgZmFsc2VcblxubGV0ICgpID1cbiAgKCogQ29udmVydCBpbnQta2V5ZWQgZW52LmJpbmRpbmdzIHRvIHN0cmluZy1rZXllZCBIYXNodGJsIGZvciBWTSBnbG9iYWxzICopXG4gIGxldCBlbnZfdG9fdm1fZ2xvYmFscyBlbnYgPVxuICAgIGxldCBnID0gSGFzaHRibC5jcmVhdGUgKEhhc2h0YmwubGVuZ3RoIGVudi5iaW5kaW5ncykgaW5cbiAgICBIYXNodGJsLml0ZXIgKGZ1biBpZCB2IC0+IEhhc2h0YmwucmVwbGFjZSBnICh1bmludGVybiBpZCkgdikgZW52LmJpbmRpbmdzO1xuICAgIGdcbiAgaW5cbiAgU3hfcmVmLmppdF9jYWxsX2hvb2sgOj0gU29tZSAoZnVuIGYgYXJncyAtPlxuICAgIG1hdGNoIGYgd2l0aFxuICAgIHwgTGFtYmRhIGwgd2hlbiAhX2ppdF9lbmFibGVkIC0+XG4gICAgICAobWF0Y2ggbC5sX2NvbXBpbGVkIHdpdGhcbiAgICAgICB8IFNvbWUgY2wgd2hlbiBub3QgKFN4X3ZtLmlzX2ppdF9mYWlsZWQgY2wpIC0+XG4gICAgICAgICAodHJ5IFNvbWUgKFN4X3ZtLmNhbGxfY2xvc3VyZSBjbCBhcmdzIGNsLnZtX2Vudl9yZWYpXG4gICAgICAgICAgd2l0aCBfIC0+XG4gICAgICAgICAgICBsLmxfY29tcGlsZWQgPC0gU29tZSBTeF92bS5qaXRfZmFpbGVkX3NlbnRpbmVsO1xuICAgICAgICAgICAgTm9uZSlcbiAgICAgICB8IFNvbWUgXyAtPiBOb25lXG4gICAgICAgfCBOb25lIC0+XG4gICAgICAgICBpZiAhX2ppdF9jb21waWxpbmcgdGhlbiBOb25lXG4gICAgICAgICBlbHNlIGJlZ2luXG4gICAgICAgICAgIF9qaXRfY29tcGlsaW5nIDo9IHRydWU7XG4gICAgICAgICAgIGxldCBnbG9iYWxzID0gZW52X3RvX3ZtX2dsb2JhbHMgZ2xvYmFsX2VudiBpblxuICAgICAgICAgICBsZXQgY29tcGlsZWQgPSBTeF92bS5qaXRfY29tcGlsZV9sYW1iZGEgbCBnbG9iYWxzIGluXG4gICAgICAgICAgIF9qaXRfY29tcGlsaW5nIDo9IGZhbHNlO1xuICAgICAgICAgICAobWF0Y2ggY29tcGlsZWQgd2l0aFxuICAgICAgICAgICB8IFNvbWUgY2wgLT5cbiAgICAgICAgICAgICBsLmxfY29tcGlsZWQgPC0gU29tZSBjbDtcbiAgICAgICAgICAgICAodHJ5IFNvbWUgKFN4X3ZtLmNhbGxfY2xvc3VyZSBjbCBhcmdzIGNsLnZtX2Vudl9yZWYpXG4gICAgICAgICAgICAgIHdpdGggXyAtPlxuICAgICAgICAgICAgICAgIGwubF9jb21waWxlZCA8LSBTb21lIFN4X3ZtLmppdF9mYWlsZWRfc2VudGluZWw7XG4gICAgICAgICAgICAgICAgTm9uZSlcbiAgICAgICAgICAgfCBOb25lIC0+IE5vbmUpXG4gICAgICAgICBlbmQpXG4gICAgfCBfIC0+IE5vbmUpXG5cbmxldCAoKSA9IGlnbm9yZSAoZW52X2JpbmQgZ2xvYmFsX2VudiBcImVuYWJsZS1qaXQhXCIgKE5hdGl2ZUZuIChcImVuYWJsZS1qaXQhXCIsIGZ1biBfIC0+IF9qaXRfZW5hYmxlZCA6PSB0cnVlOyBOaWwpKSlcblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICopXG4oKiBSZWdpc3RlciBnbG9iYWwgU3hLZXJuZWwgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcblxubGV0ICgpID1cbiAgbGV0IHN4ID0gSnMuVW5zYWZlLm9iaiBbfHxdIGluXG4gIGxldCB3cmFwIGZuID0gSnMuVW5zYWZlLmZ1bl9jYWxsXG4gICAgKEpzLlVuc2FmZS5wdXJlX2pzX2V4cHIgXCIoZnVuY3Rpb24oZm4pIHsgcmV0dXJuIGZ1bmN0aW9uKCkgeyBnbG9iYWxUaGlzLl9fc3hSID0gdW5kZWZpbmVkOyB2YXIgciA9IGZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IHJldHVybiBnbG9iYWxUaGlzLl9fc3hSICE9PSB1bmRlZmluZWQgPyBnbG9iYWxUaGlzLl9fc3hSIDogcjsgfTsgfSlcIilcbiAgICBbfCBKcy5VbnNhZmUuaW5qZWN0IChKcy53cmFwX2NhbGxiYWNrIGZuKSB8XSBpblxuXG4gIEpzLlVuc2FmZS5zZXQgc3ggKEpzLnN0cmluZyBcInBhcnNlXCIpIChKcy53cmFwX2NhbGxiYWNrIGFwaV9wYXJzZSk7XG4gIEpzLlVuc2FmZS5zZXQgc3ggKEpzLnN0cmluZyBcInN0cmluZ2lmeVwiKSAoSnMud3JhcF9jYWxsYmFjayBhcGlfc3RyaW5naWZ5KTtcbiAgSnMuVW5zYWZlLnNldCBzeCAoSnMuc3RyaW5nIFwiZXZhbFwiKSAod3JhcCBhcGlfZXZhbCk7XG4gIEpzLlVuc2FmZS5zZXQgc3ggKEpzLnN0cmluZyBcImV2YWxFeHByXCIpICh3cmFwIGFwaV9ldmFsX2V4cHIpO1xuICBKcy5VbnNhZmUuc2V0IHN4IChKcy5zdHJpbmcgXCJyZW5kZXJUb0h0bWxcIikgKEpzLndyYXBfY2FsbGJhY2sgYXBpX3JlbmRlcl90b19odG1sKTtcbiAgSnMuVW5zYWZlLnNldCBzeCAoSnMuc3RyaW5nIFwibG9hZFwiKSAoSnMud3JhcF9jYWxsYmFjayBhcGlfbG9hZCk7XG4gIEpzLlVuc2FmZS5zZXQgc3ggKEpzLnN0cmluZyBcInR5cGVPZlwiKSAoSnMud3JhcF9jYWxsYmFjayBhcGlfdHlwZV9vZik7XG4gIEpzLlVuc2FmZS5zZXQgc3ggKEpzLnN0cmluZyBcImluc3BlY3RcIikgKEpzLndyYXBfY2FsbGJhY2sgYXBpX2luc3BlY3QpO1xuICBKcy5VbnNhZmUuc2V0IHN4IChKcy5zdHJpbmcgXCJlbmdpbmVcIikgKEpzLndyYXBfY2FsbGJhY2sgYXBpX2VuZ2luZSk7XG4gIEpzLlVuc2FmZS5zZXQgc3ggKEpzLnN0cmluZyBcInJlZ2lzdGVyTmF0aXZlXCIpIChKcy53cmFwX2NhbGxiYWNrIGFwaV9yZWdpc3Rlcl9uYXRpdmUpO1xuICBKcy5VbnNhZmUuc2V0IHN4IChKcy5zdHJpbmcgXCJsb2FkU291cmNlXCIpIChKcy53cmFwX2NhbGxiYWNrIGFwaV9sb2FkKTtcbiAgSnMuVW5zYWZlLnNldCBzeCAoSnMuc3RyaW5nIFwiY2FsbEZuXCIpICh3cmFwIGFwaV9jYWxsX2ZuKTtcbiAgSnMuVW5zYWZlLnNldCBzeCAoSnMuc3RyaW5nIFwiaXNDYWxsYWJsZVwiKSAoSnMud3JhcF9jYWxsYmFjayBhcGlfaXNfY2FsbGFibGUpO1xuICBKcy5VbnNhZmUuc2V0IHN4IChKcy5zdHJpbmcgXCJmbkFyaXR5XCIpIChKcy53cmFwX2NhbGxiYWNrIGFwaV9mbl9hcml0eSk7XG5cbiAgSnMuVW5zYWZlLnNldCBKcy5VbnNhZmUuZ2xvYmFsIChKcy5zdHJpbmcgXCJTeEtlcm5lbFwiKSBzeFxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2ludF9vZl9zdHJpbmciLCJjYW1sX2pzX2Zyb21fYXJyYXkiLCJjYW1sX2pzX3dyYXBfY2FsbGJhY2siLCJjYW1sX2pzc3RyaW5nX29mX3N0cmluZyIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfc3RyaW5nX29mX2pzc3RyaW5nIiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJnbG9iYWxfZGF0YSIsIlN4X3R5cGVzIiwiU3RkbGliIiwiSnNfb2Zfb2NhbWxfSnMiLCJTdGRsaWJfSGFzaHRibCIsIlN0ZGxpYl9MaXN0IiwiU3RkbGliX0FycmF5IiwiU3RkbGliX09wdGlvbiIsIlN4X3ZtIiwiU3hfcmVmIiwiU3hfcHJpbWl0aXZlcyIsIlN4X3JlbmRlciIsIlN0ZGxpYl9TdHJpbmciLCJTeF9ydW50aW1lIiwiU3hfcGFyc2VyIiwiU3RkbGliX1ByaW50ZXhjIiwiU3RkbGliX1ByaW50ZiIsIlN4X3Njb3BlIiwiaGFuZGxlX3RhYmxlIiwibmV4dF9oYW5kbGUiLCJhbGxvY19oYW5kbGUiLCJ2IiwiaWQiLCJnZXRfaGFuZGxlIiwibWF0Y2giLCJhbGxvY19ob3N0X2hhbmRsZSIsImdsb2JhbF9lbnYiLCJjYWxsX3N4X2ZuIiwiZm4iLCJhcmdzIiwidGFnX2ZuIiwiZHVtbXkiLCJjc3RfaG9zdF9oYW5kbGUiLCJjc3RfZGljdCIsImNzdF9rZXl3b3JkIiwiY3N0X2xpc3QiLCJjc3Rfc3ltYm9sIiwidmFsdWVfdG9fanMiLCJiIiwibiIsInMiLCJrIiwiaXRlbXMiLCJkIiwib2JqIiwiaGFuZGxlIiwiaW5uZXIiLCJhcmdzX2pzIiwiYXJnIiwicmVzdWx0IiwiZXhuIiwibXNnIiwiYXJyIiwibmV4dF9ob3N0X2hhbmRsZSIsImpzX3RvX3ZhbHVlIiwidHkiLCJoIiwianNfYXJncyIsInR5cGVfZmllbGQiLCJ0MCIsInQxIiwiaSIsInRhZyIsIml0ZW1zX2pzIiwidDMiLCJ0NCIsImtleXMiLCJsZW4iLCJyZXR1cm5fdmlhX3NpZGVfY2hhbm5lbCIsImNzdF9QYXJzZV9lcnJvciIsImFwaV9wYXJzZSIsInNyY19qcyIsInNyYyIsInZhbHVlcyIsImNzdF9FcnJvciIsImFwaV9ldmFsIiwiZXhwcnMiLCJlbnYiLCJhY2MiLCJleHByIiwiYXBpX2V2YWxfZXhwciIsImV4cHJfanMiLCJlbnZfanMiLCJhcGlfbG9hZCIsImNvdW50Iiwic3hfcmVuZGVyX21vZGUiLCJhcGlfcmVuZGVyX3RvX2h0bWwiLCJwcmV2IiwiaHRtbCIsImFwaV9zdHJpbmdpZnkiLCJ2X2pzIiwiYXBpX3R5cGVfb2YiLCJhcGlfaW5zcGVjdCIsImFwaV9lbmdpbmUiLCJwYXJhbSIsImFwaV9yZWdpc3Rlcl9uYXRpdmUiLCJuYW1lX2pzIiwiY2FsbGJhY2tfanMiLCJuYW1lIiwibmF0aXZlX2ZuIiwiYXBpX2NhbGxfZm4iLCJmbl9qcyIsImNzdF9zeF9jYWxsRm4iLCJhcGlfaXNfY2FsbGFibGUiLCJhcGlfZm5fYXJpdHkiLCJsIiwiYmluZCIsImNzdF9jZWtfZXZhbCIsImUiLCJlbnZfdmFsIiwiY3N0X2Nla19jYWxsIiwiYSIsImFsIiwicmVzdCIsImRlZXBfZXF1YWwiLCJrYSIsImtiIiwiY29uZCIsImNzdF9lcnJvciIsImNzdF9vayIsInRodW5rIiwiciIsInV3IiwiY3N0X2Vudl9oYXMiLCJjc3RfZW52X2dldCIsImNzdF9lbnZfYmluZCIsImNzdF9lbnZfc2V0IiwiY3N0X2Vudl9leHRlbmQiLCJjc3RfZW52X21lcmdlIiwiY3N0X21ha2Vfc3ltYm9sIiwiY3N0X21ha2Vfa2V5d29yZCIsImNzdF9rZXl3b3JkX25hbWUiLCJjc3Rfc3ltYm9sX25hbWUiLCJjc3QiLCJjIiwiY3N0X2NvbXBvbmVudF9oYXNfY2hpbGRyZW4iLCJoYXNfY2hpbGRyZW5faW1wbCIsImNzdF9tYWtlX2Nla19zdGF0ZSIsImNzdF9jZWtfc3RlcCIsImNzdF9jZWtfcGhhc2UiLCJjc3RfY2VrX3ZhbHVlIiwiY3N0X2Nla190ZXJtaW5hbCIsImNzdF9jZWtfa29udCIsImNzdF9mcmFtZV90eXBlIiwiY3N0X3N0cmljdCIsImNzdF9wcmltX3BhcmFtX3R5cGVzIiwidCIsImNzdF9hcHBseSIsImFsbF9hcmdzIiwicHJlZml4IiwibGFzdCIsImNzdF9wcm92aWRlX3B1c2giLCJjc3RfcHJvdmlkZV9wb3AiLCJodG1sX3RhZ3MiLCJ2b2lkX2VsZW1lbnRzIiwiYm9vbGVhbl9hdHRycyIsImhhbmRsZXIiLCJyYXciLCJtYWMiLCJjYWxsX2FyZ3MiLCJmbl92YWwiLCJ0ZW1wbGF0ZSIsInBhaXJzIiwiY3N0X2lkZW50aWNhbCIsIml0ZW0iLCJjc3RfbWFrZV9zeF9leHByIiwiY3N0X3N4X2V4cHJfc291cmNlIiwiZGVmYXVsdF92YWwiLCJqaXRfY29tcGlsaW5nIiwiaml0X2VuYWJsZWQiLCJjbCIsImdsb2JhbHMiLCJjb21waWxlZCIsImNzdF9lbmFibGVfaml0Iiwid3JhcCIsInN4Il0sIm1hcHBpbmdzIjoiSUFBQUEsVUFB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LFNBTCtCLFlBQy9CO0FBQUEsZUFBQXhILEtBRVAsc0JBQ0E7QUFBQTtBQUFBLFFBR0gscUJBQXdCO0FBQUEsUUFDbkI7QUFBQTtBQUFBLGFBaEJhO0FBQUEsU0FBQXlILFVBQWY7QUFBQSxRQUNSO0FBQUE7QUFBQSxtQkFBQXJKLElBQUFEO0FBQUFBLGVBQUEsSUFBNEM7QUFBQSxXQUFhLG1EQUFFO0FBQUE7QUFBQTtBQUFBLFlBQUF1SixXQWtCckM7QUFBQSxRQUNmO0FBQUEsUUFDQSxlQU9VO0FBQUEsWUFBQUYsT0FQVjtBQUFBLFFBRUU7QUFBQSxRQUNBLFlBQVU7QUFBQSxjQUFBeEgsS0FFUCxzQkFDQTtBQUFBO0FBQUE7QUFBQSxNQUdMO0FBQUEsS0FBSTtBQUFBLE9BQUEySCxpQkQ1bEJmO0FBQUEsR0M4bEJnQjtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUFBL0UsT0FBc0Usb0JBQXNCLFNBQUc7QUFBQSxZQUFBZ0YsS0FBQWxKO0FBQUFBLElBVXZGLE9BRlI7QUFBQSxhRHRtQmhCO0FBQUEsY0FBQTtBQUFBLHNCQUFBO0FBQUEsY0FBQSw0REFBQSxDQUFBLENBQUE7QUFBQSxZQUFBO0FBQUEsWUNzbUJnQixDQUVRLDBCQUF3QjtBQUFBO0FBQUEsT0FBQW1KLEtBSHJDO0FBQUEsR0FLNEI7QUFBQSxHQUNJO0FBQUEsR0FDTDtBQUFBLEdBQ0k7QUFBQSxHQUNJO0FBQUEsR0FDUjtBQUFBLEdBQ0U7QUFBQSxHQUNDO0FBQUEsR0FDRDtBQUFBLEdBQ1E7QUFBQSxHQUNKO0FBQUEsR0FDSjtBQUFBLEdBQ0k7QUFBQSxHQUNIO0FBQUEsR0FFdkM7QUFBQSxHQUF3RDtBQUFBO0FBQUEsRUR6bkIxRCIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjM5MjI2LCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZF9leGl0LmNtby5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvc3RkX2V4aXQubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIEVuc3VyZSB0aGF0IFthdF9leGl0XSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGV2ZXJ5IHByb2dyYW0gKilcblxubGV0IF8gPSBkb19hdF9leGl0KClcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsIlN0ZGxpYiJdLCJtYXBwaW5ncyI6Ik9BQUFBLFVBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0FBQUMsU0FBQTtBQUFBLEdDaUJRO0FBQUEsR0FBWTtBQUFBO0FBQUEsRURqQnBCIiwiaWdub3JlTGlzdCI6WzBdfX1dfQ==
|