@jpoly1219/context-extractor 0.2.5 → 0.2.7
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/src/app.js +2 -1
- package/dist/src/ocaml-utils/_build/.filesystem-clock +1 -0
- package/dist/src/ocaml-utils/_build/.lock +0 -0
- package/dist/src/ocaml-utils/_build/default/.dune/configurator +2 -0
- package/dist/src/ocaml-utils/_build/default/.dune/configurator.v2 +1 -0
- package/dist/src/ocaml-utils/_build/default/.js/default/compiler-libs.common/ocamlcommon.cma.js +160991 -0
- package/dist/src/ocaml-utils/_build/default/.js/default/js_of_ocaml/js_of_ocaml.cma.js +7195 -0
- package/dist/src/ocaml-utils/_build/default/.js/default/js_of_ocaml-compiler.runtime/jsoo_runtime.cma.js +73 -0
- package/dist/src/ocaml-utils/_build/default/.js/default/stdlib/std_exit.cmo.js +25 -0
- package/dist/src/ocaml-utils/_build/default/.js/default/stdlib/stdlib.cma.js +28451 -0
- package/dist/src/ocaml-utils/_build/default/.merlin-conf/exe-test_parser +0 -0
- package/dist/src/ocaml-utils/_build/default/.ppx/7b799aed44581cc79b02033532c5f775/_ppx.ml-gen +1 -0
- package/dist/src/ocaml-utils/_build/default/.ppx/7b799aed44581cc79b02033532c5f775/dune__exe___ppx.cmi +0 -0
- package/dist/src/ocaml-utils/_build/default/.ppx/7b799aed44581cc79b02033532c5f775/dune__exe___ppx.cmo +0 -0
- package/dist/src/ocaml-utils/_build/default/.ppx/7b799aed44581cc79b02033532c5f775/dune__exe___ppx.cmx +0 -0
- package/dist/src/ocaml-utils/_build/default/.ppx/7b799aed44581cc79b02033532c5f775/dune__exe___ppx.o +0 -0
- package/dist/src/ocaml-utils/_build/default/.ppx/7b799aed44581cc79b02033532c5f775/ppx.exe +0 -0
- package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/byte/dune__exe__Test_parser.cmi +0 -0
- package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/byte/dune__exe__Test_parser.cmo +0 -0
- package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/byte/dune__exe__Test_parser.cmt +0 -0
- package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/byte/dune__exe__Test_parser.cmti +0 -0
- package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/jsoo/dune__exe__Test_parser.cmo.js +215 -0
- package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/jsoo/test_parser.bc.runtime.js +8894 -0
- package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/native/dune__exe__Test_parser.cmx +0 -0
- package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/native/dune__exe__Test_parser.o +0 -0
- package/dist/src/ocaml-utils/_build/default/test_parser.bc-for-jsoo +0 -0
- package/dist/src/ocaml-utils/_build/default/test_parser.bc.d.ts +3 -0
- package/dist/src/ocaml-utils/_build/default/test_parser.bc.js +194658 -0
- package/dist/src/ocaml-utils/_build/default/test_parser.ml +315 -0
- package/dist/src/ocaml-utils/_build/default/test_parser.pp.ml +0 -0
- package/dist/src/ocaml-utils/_build/default/test_parser.pp.mli +1 -0
- package/dist/src/ocaml-utils/_build/log +22 -0
- package/dist/src/runner.js +10 -1
- package/dist/src/typescript-driver.js +13 -2
- package/package.json +6 -2
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
let () = Ppxlib.Driver.standalone ()
|
Binary file
|
Binary file
|
Binary file
|
package/dist/src/ocaml-utils/_build/default/.ppx/7b799aed44581cc79b02033532c5f775/dune__exe___ppx.o
ADDED
Binary file
|
Binary file
|
package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/byte/dune__exe__Test_parser.cmi
ADDED
Binary file
|
package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/byte/dune__exe__Test_parser.cmo
ADDED
Binary file
|
package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/byte/dune__exe__Test_parser.cmt
ADDED
Binary file
|
package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/byte/dune__exe__Test_parser.cmti
ADDED
Binary file
|
package/dist/src/ocaml-utils/_build/default/.test_parser.eobjs/jsoo/dune__exe__Test_parser.cmo.js
ADDED
@@ -0,0 +1,215 @@
|
|
1
|
+
// Generated by js_of_ocaml
|
2
|
+
//# buildInfo:effects=false, kind=cmo, use-js-string=true, version=5.8.2+5.8.2
|
3
|
+
|
4
|
+
//# unitInfo: Provides: Dune__exe__Test_parser
|
5
|
+
//# unitInfo: Requires: Js_of_ocaml__Js, Parse, Stdlib, Stdlib__Array, Stdlib__Lexing, Stdlib__List, Stdlib__Printf, Stdlib__String
|
6
|
+
(function
|
7
|
+
(globalThis){
|
8
|
+
"use strict";
|
9
|
+
var
|
10
|
+
runtime = globalThis.jsoo_runtime,
|
11
|
+
cst$4 = " ",
|
12
|
+
cst_Failed_to_parse_type_span$1 = "Failed to parse type span",
|
13
|
+
cst_Other_core_type = "Other core type",
|
14
|
+
cst_Ptyp_constr$1 = "Ptyp_constr",
|
15
|
+
caml_js_from_array = runtime.caml_js_from_array,
|
16
|
+
caml_js_wrap_callback = runtime.caml_js_wrap_callback;
|
17
|
+
function caml_call1(f, a0){
|
18
|
+
return (f.l >= 0 ? f.l : f.l = f.length) == 1
|
19
|
+
? f(a0)
|
20
|
+
: runtime.caml_call_gen(f, [a0]);
|
21
|
+
}
|
22
|
+
function caml_call2(f, a0, a1){
|
23
|
+
return (f.l >= 0 ? f.l : f.l = f.length) == 2
|
24
|
+
? f(a0, a1)
|
25
|
+
: runtime.caml_call_gen(f, [a0, a1]);
|
26
|
+
}
|
27
|
+
function caml_call3(f, a0, a1, a2){
|
28
|
+
return (f.l >= 0 ? f.l : f.l = f.length) == 3
|
29
|
+
? f(a0, a1, a2)
|
30
|
+
: runtime.caml_call_gen(f, [a0, a1, a2]);
|
31
|
+
}
|
32
|
+
var
|
33
|
+
global_data = runtime.caml_get_global_data(),
|
34
|
+
cst = " -> ",
|
35
|
+
cst$0 = " * ",
|
36
|
+
cst$1 = ", ",
|
37
|
+
cst$2 = cst$4,
|
38
|
+
cst$3 = cst$4,
|
39
|
+
Stdlib = global_data.Stdlib,
|
40
|
+
Stdlib_List = global_data.Stdlib__List,
|
41
|
+
Stdlib_String = global_data.Stdlib__String,
|
42
|
+
Stdlib_Printf = global_data.Stdlib__Printf,
|
43
|
+
Stdlib_Array = global_data.Stdlib__Array,
|
44
|
+
Stdlib_Lexing = global_data.Stdlib__Lexing,
|
45
|
+
Parse = global_data.Parse,
|
46
|
+
Js_of_ocaml_Js = global_data.Js_of_ocaml__Js,
|
47
|
+
cst_unknown = "unknown",
|
48
|
+
_a_ = [0, [11, cst_Other_core_type, 0], cst_Other_core_type],
|
49
|
+
_b_ = [0, cst_Other_core_type, 0],
|
50
|
+
cst_Ptyp_arrow = "Ptyp_arrow",
|
51
|
+
cst_Ptyp_tuple = "Ptyp_tuple",
|
52
|
+
cst_Ptyp_constr = cst_Ptyp_constr$1,
|
53
|
+
cst_Ptyp_constr$0 = cst_Ptyp_constr$1,
|
54
|
+
_c_ = [0, [11, cst_Other_core_type, 0], cst_Other_core_type],
|
55
|
+
cst_type_tmp = "type tmp = ",
|
56
|
+
cst_Failed_to_parse_type_span = cst_Failed_to_parse_type_span$1,
|
57
|
+
cst_Failed_to_parse_type_span$0 = cst_Failed_to_parse_type_span$1;
|
58
|
+
function string_of_type(typ){
|
59
|
+
var match = typ[1];
|
60
|
+
if(typeof match !== "number")
|
61
|
+
switch(match[0]){
|
62
|
+
case 1:
|
63
|
+
var
|
64
|
+
t2 = match[3],
|
65
|
+
t1 = match[2],
|
66
|
+
arg1 = string_of_type(t1),
|
67
|
+
arg2 = string_of_type(t2),
|
68
|
+
_r_ = caml_call2(Stdlib[28], cst, arg2);
|
69
|
+
return caml_call2(Stdlib[28], arg1, _r_);
|
70
|
+
case 2:
|
71
|
+
var
|
72
|
+
types = match[1],
|
73
|
+
type_strings = caml_call2(Stdlib_List[20], string_of_type, types);
|
74
|
+
return caml_call2(Stdlib_String[7], cst$0, type_strings);
|
75
|
+
case 3:
|
76
|
+
var _s_ = match[1][1];
|
77
|
+
if(0 === _s_[0]){
|
78
|
+
var s = _s_[1];
|
79
|
+
if(! match[2]) return s;
|
80
|
+
var
|
81
|
+
ctyp_list = match[2],
|
82
|
+
_t_ = caml_call2(Stdlib_List[20], string_of_type, ctyp_list),
|
83
|
+
args_str = caml_call1(caml_call1(Stdlib_String[7], cst$1), _t_),
|
84
|
+
_u_ = caml_call2(Stdlib[28], cst$2, s);
|
85
|
+
return caml_call2(Stdlib[28], args_str, _u_);
|
86
|
+
}
|
87
|
+
break;
|
88
|
+
}
|
89
|
+
return cst_unknown;
|
90
|
+
}
|
91
|
+
function extract_core_type(ctyp, components_only){
|
92
|
+
if(components_only){
|
93
|
+
var match = ctyp[1];
|
94
|
+
if(typeof match !== "number")
|
95
|
+
switch(match[0]){
|
96
|
+
case 1:
|
97
|
+
var
|
98
|
+
rettyp = match[3],
|
99
|
+
argtyp = match[2],
|
100
|
+
_i_ = [0, string_of_type(rettyp), 0];
|
101
|
+
return [0, cst_Ptyp_arrow, [0, string_of_type(argtyp), _i_]];
|
102
|
+
case 2:
|
103
|
+
var types = match[1];
|
104
|
+
return [0,
|
105
|
+
cst_Ptyp_tuple,
|
106
|
+
caml_call3
|
107
|
+
(Stdlib_List[27],
|
108
|
+
function(curr, acc){return [0, string_of_type(curr), acc];},
|
109
|
+
types,
|
110
|
+
0)];
|
111
|
+
case 3:
|
112
|
+
var _j_ = match[1][1];
|
113
|
+
if(0 === _j_[0]){
|
114
|
+
var _k_ = match[2], id = _j_[1];
|
115
|
+
if(! _k_) return [0, cst_Ptyp_constr$0, [0, id, 0]];
|
116
|
+
if(! _k_[2]){
|
117
|
+
var ctyps = _k_[1];
|
118
|
+
return [0, cst_Ptyp_constr, [0, string_of_type(ctyps), [0, id, 0]]];
|
119
|
+
}
|
120
|
+
}
|
121
|
+
break;
|
122
|
+
}
|
123
|
+
caml_call1(Stdlib_Printf[2], _a_);
|
124
|
+
return _b_;
|
125
|
+
}
|
126
|
+
var match$0 = ctyp[1];
|
127
|
+
if(typeof match$0 !== "number")
|
128
|
+
switch(match$0[0]){
|
129
|
+
case 1:
|
130
|
+
var
|
131
|
+
rettyp$0 = match$0[3],
|
132
|
+
_l_ = extract_core_type(rettyp$0, components_only);
|
133
|
+
return [0, string_of_type(ctyp), _l_];
|
134
|
+
case 2:
|
135
|
+
var types$0 = match$0[1];
|
136
|
+
return caml_call3
|
137
|
+
(Stdlib_List[26],
|
138
|
+
function(acc, curr){
|
139
|
+
var _q_ = extract_core_type(curr, components_only);
|
140
|
+
return caml_call2(Stdlib_List[12], _q_, acc);
|
141
|
+
},
|
142
|
+
0,
|
143
|
+
types$0);
|
144
|
+
case 3:
|
145
|
+
var _m_ = match$0[1][1];
|
146
|
+
if(0 === _m_[0]){
|
147
|
+
var _n_ = match$0[2], id$0 = _m_[1];
|
148
|
+
if(! _n_) return [0, id$0, 0];
|
149
|
+
if(! _n_[2]){
|
150
|
+
var
|
151
|
+
ctyps$0 = _n_[1],
|
152
|
+
_o_ = caml_call2(Stdlib[28], cst$3, id$0),
|
153
|
+
_p_ = string_of_type(ctyps$0);
|
154
|
+
return [0, caml_call2(Stdlib[28], _p_, _o_), 0];
|
155
|
+
}
|
156
|
+
}
|
157
|
+
break;
|
158
|
+
}
|
159
|
+
caml_call1(Stdlib_Printf[2], _c_);
|
160
|
+
return 0;
|
161
|
+
}
|
162
|
+
function parse_core_type_from_type_span(s){
|
163
|
+
var lexbuf = caml_call2(Stdlib_Lexing[3], 0, s);
|
164
|
+
try{var _g_ = [0, caml_call1(Parse[5], lexbuf)]; return _g_;}
|
165
|
+
catch(_h_){return 0;}
|
166
|
+
}
|
167
|
+
function parse_implementation_from_type(s){
|
168
|
+
var
|
169
|
+
_d_ = caml_call2(Stdlib[28], cst_type_tmp, s),
|
170
|
+
lexbuf = caml_call2(Stdlib_Lexing[3], 0, _d_);
|
171
|
+
try{var _e_ = [0, caml_call1(Parse[1], lexbuf)]; return _e_;}
|
172
|
+
catch(_f_){return 0;}
|
173
|
+
}
|
174
|
+
function js_extract_target_types(type_span){
|
175
|
+
var parsed = parse_core_type_from_type_span(type_span);
|
176
|
+
if(parsed)
|
177
|
+
var ctyp = parsed[1], extracted = extract_core_type(ctyp, 0);
|
178
|
+
else
|
179
|
+
var
|
180
|
+
parsed2 = parse_implementation_from_type(type_span),
|
181
|
+
extracted =
|
182
|
+
parsed2
|
183
|
+
? [0, type_span, 0]
|
184
|
+
: caml_call1(Stdlib[2], cst_Failed_to_parse_type_span);
|
185
|
+
return caml_js_from_array(caml_call1(Stdlib_Array[11], extracted));
|
186
|
+
}
|
187
|
+
function js_extract_component_types(type_span){
|
188
|
+
var parsed = parse_core_type_from_type_span(type_span);
|
189
|
+
if(parsed)
|
190
|
+
var ctyp = parsed[1], extracted = extract_core_type(ctyp, 1);
|
191
|
+
else
|
192
|
+
var
|
193
|
+
parsed2 = parse_implementation_from_type(type_span),
|
194
|
+
extracted =
|
195
|
+
parsed2
|
196
|
+
? [0, type_span, 0]
|
197
|
+
: caml_call1(Stdlib[2], cst_Failed_to_parse_type_span$0);
|
198
|
+
return caml_js_from_array(caml_call1(Stdlib_Array[11], extracted));
|
199
|
+
}
|
200
|
+
caml_call2
|
201
|
+
(Js_of_ocaml_Js[50],
|
202
|
+
"parse",
|
203
|
+
caml_js_wrap_callback(js_extract_target_types));
|
204
|
+
caml_call2
|
205
|
+
(Js_of_ocaml_Js[50],
|
206
|
+
"getComponents",
|
207
|
+
caml_js_wrap_callback(js_extract_component_types));
|
208
|
+
var Dune_exe_Test_parser = [0];
|
209
|
+
runtime.caml_register_global
|
210
|
+
(26, Dune_exe_Test_parser, "Dune__exe__Test_parser");
|
211
|
+
return;
|
212
|
+
}
|
213
|
+
(globalThis));
|
214
|
+
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLjAsImZpbGUiOiIudGVzdF9wYXJzZXIuZW9ianMvanNvby9kdW5lX19leGVfX1Rlc3RfcGFyc2VyLmNtby5qcyIsInNvdXJjZVJvb3QiOiIiLCJuYW1lcyI6WyJzdHJpbmdfb2ZfdHlwZSIsInR5cCIsInQyIiwidDEiLCJhcmcxIiwiYXJnMiIsInR5cGVzIiwidHlwZV9zdHJpbmdzIiwicyIsImN0eXBfbGlzdCIsImFyZ3Nfc3RyIiwiZXh0cmFjdF9jb3JlX3R5cGUiLCJjdHlwIiwiY29tcG9uZW50c19vbmx5IiwicmV0dHlwIiwiYXJndHlwIiwiY3VyciIsImFjYyIsImlkIiwiY3R5cHMiLCJyZXR0eXAkMCIsInR5cGVzJDAiLCJpZCQwIiwiY3R5cHMkMCIsInBhcnNlX2NvcmVfdHlwZV9mcm9tX3R5cGVfc3BhbiIsImxleGJ1ZiIsInBhcnNlX2ltcGxlbWVudGF0aW9uX2Zyb21fdHlwZSIsImpzX2V4dHJhY3RfdGFyZ2V0X3R5cGVzIiwidHlwZV9zcGFuIiwicGFyc2VkIiwiZXh0cmFjdGVkIiwicGFyc2VkMiIsImpzX2V4dHJhY3RfY29tcG9uZW50X3R5cGVzIl0sInNvdXJjZXMiOlsiL3dvcmtzcGFjZV9yb290L3Rlc3RfcGFyc2VyLm1sIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0c7Ozs7O0c7Ozs7O0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WUF3S1FBLGVBQWdCQztJQUN0QixZQURzQkE7Ozs7UUFHUDtTQURNQztTQUFKQztTQUNUQyxPQUhGSixlQUVXRztTQUVURSxPQUpGTCxlQUVlRTtTQUdWLE1BQUEsNEJBREhHO1FBQ0csT0FBQSx1QkFGSEQ7O1FBSWU7U0FEVkU7U0FDTEMsZUFBZSw0QkFQakJQLGdCQU1PTTtRQUVULE9BQUEsb0NBRElDOzs7O2FBRXNCQzt3QkFBZSxPQUFmQTtTQUVYO1VBRG1CQztVQUNuQixNQUFBLDRCQVhiVCxnQkFVZ0NTO1VBQzlCQyxXQUFXLFdBQXFDO1VBQ3pDLE1BQUEsOEJBSGVGO1NBR2YsT0FBQSx1QkFEUEU7Ozs7SUFFRDtHQUFTO1lBRVZDLGtCQUFtQkMsTUFBNkJDO0lBRXRELEdBRnNEQTtpQkFBN0JEOzs7OztVQUlFRTtVQUFSQztvQkFuQmJmLGVBbUJxQmM7U0FDckIsK0JBcEJBZCxlQW1CYWU7O2FBRUpUO1NBQ1Q7O2lCQUNHOzs0QkFBcUJVLE1BQUtDLEtBQU8sV0F2QnBDakIsZUF1QndCZ0IsT0FBS0MsS0FBaUM7bUJBRnJEWDs7Ozs7OEJBR2lCWTtvQkFBZ0Isa0NBQWhCQTs7ZUFDV0M7V0FDckMsZ0NBMUJBbkIsZUF5QnFDbUIsWUFEWEQ7Ozs7O0tBSTFCO0tBQUE7O2tCQWJtQk47Ozs7UUFrQkk7U0FEUFE7U0FDTyxNQWxCdkJULGtCQWlCZ0JTLFVBakJnQ1A7UUFrQmhELFdBakNBYixlQWVtQlk7O1lBbUJWUztRQUNULE9BQUE7OzBCQUNPSixLQUFJRDtrQkFDSyxVQXRCaEJMLGtCQXFCV0ssTUFyQnFDSDtrQkFzQjVDLE9BQUEsaUNBREdJO2lCQUNxRDs7aUJBSG5ESTs7OzsrQkFLaUJDO21CQUFnQixXQUFoQkE7O1VBRUQ7V0FEWUM7V0FDWixNQUFBLDhCQUZDRDtXQUV4QixNQXpDRnRCLGVBd0NxQ3VCO1VBQ3JDLFdBQUU7Ozs7O0lBRUY7SUFBQTtHQUNFO1lBc0JOQywrQkFBK0JoQjtJQUNwQixJQUFUaUIsU0FBUyxnQ0FEb0JqQjtJQUVqQyxJQUFJLGNBQUsscUJBRExpQixVQUNBO2VBQXdDO0dBQUk7WUFFOUNDLCtCQUFvQ2xCO0lBQ3RDO0tBQWdDLE1BQUEscUNBRE1BO0tBQ2xDaUIsU0FBUztJQUNiLElBQUksY0FBSyxxQkFETEEsVUFDQTtlQUE2QztHQUFJO1lBNEJuREUsd0JBQXlCQztJQXhCZCxJQUFUQyxTQVZGTCwrQkFrQ3lCSTtJQXZCM0IsR0FESUM7U0FFR2pCLE9BRkhpQixXQXlCQUMsWUF0RkVuQixrQkErRENDOztLQUVXO01BQVZtQixVQVZOTCwrQkE4QnlCRTtNQUN2QkU7UUFyQklDO2VBb0JtQkg7V0FoQmI7SUFrQmQsT0FBQSxtQkFBUyw2QkFETEU7R0FDOEI7WUFJaENFLDJCQUE0Qko7SUFoQmpCLElBQVRDLFNBeEJGTCwrQkF3QzRCSTtJQWY5QixHQURJQztTQUVHakIsT0FGSGlCLFdBaUJBQyxZQTVGRW5CLGtCQTZFQ0M7O0tBRVc7TUFBVm1CLFVBeEJOTCwrQkFvQzRCRTtNQUMxQkU7UUFiSUM7ZUFZc0JIO1dBUmhCO0lBVWQsT0FBQSxtQkFBUyw2QkFETEU7R0FDOEI7R0ErQjVCOzs7S0FBa0Isc0JBdkN0Qkg7R0F3Q0k7OztLQUEwQixzQkFsQzlCSztHQWtDSTs7OztFIiwic291cmNlc0NvbnRlbnQiOlsib3BlbiBKc19vZl9vY2FtbFxuXG4oKiBQYXJzZSBzb21lIHN0cmluZ2lmaWVkIE9DYW1sIGNvZGUuICopXG4oKiBsZXQgcGFyc2VfZnJvbV9zdHJpbmcgc3RyID0gKilcbigqICAgbGV0IGxleGJ1ZiA9IExleGluZy5mcm9tX3N0cmluZyBzdHIgaW4gKilcbigqICAgdHJ5ICopXG4oKiAgICAgbGV0IHBhcnNlZF9zdHIgPSBQYXJzZS5pbXBsZW1lbnRhdGlvbiBsZXhidWYgaW4gKilcbigqICAgICBTb21lIHBhcnNlZF9zdHIgKilcbigqICAgd2l0aCAqKVxuKCogICB8IFN5bnRheGVyci5FcnJvciBfIC0+ICopXG4oKiAgICAgICBwcmVycl9lbmRsaW5lIFwiU3ludGF4IGVycm9yIVwiOyAqKVxuKCogICAgICAgTm9uZSAqKVxuKCogICB8IF8gLT4gKilcbigqICAgICAgIHByZXJyX2VuZGxpbmUgXCJBbiBlcnJvciBvY2N1cnJlZCFcIjsgKilcbigqICAgICAgIE5vbmUgKilcbigqKilcbigqIGxldCByZWMgcHJpbnRfY29yZV90eXBlIChjb3JlX3R5cGUgOiBQYXJzZXRyZWUuY29yZV90eXBlKSBpbmRlbnQgcHJpbnRfZGVzYyA9ICopXG4oKiAgIGxldCBpbmRlbnRfc3RyID0gU3RyaW5nLm1ha2UgaW5kZW50ICcgJyBpbiAqKVxuKCogICBtYXRjaCBjb3JlX3R5cGUucHR5cF9kZXNjIHdpdGggKilcbigqICAgfCBQdHlwX3R1cGxlIGVsZW1lbnRzIC0+ICopXG4oKiAgICAgICBpZiBwcmludF9kZXNjIHRoZW4gUHJpbnRmLnByaW50ZiBcIiVzVHVwbGUgY29yZSB0eXBlczogXCIgaW5kZW50X3N0cjsgKilcbigqICAgICAgIFByaW50Zi5wcmludGYgXCIlc1xcblwiIChGb3JtYXQuYXNwcmludGYgXCIlYVwiIFBwcmludGFzdC5jb3JlX3R5cGUgY29yZV90eXBlKTsgKilcbigqICAgICAgIExpc3QuaXRlciAoZnVuIGVsIC0+IHByaW50X2NvcmVfdHlwZSBlbCAoaW5kZW50ICsgMikgZmFsc2UpIGVsZW1lbnRzOyAqKVxuKCogICAgICAgaWYgcHJpbnRfZGVzYyB0aGVuIFByaW50Zi5wcmludGYgXCJcXG5cIiAqKVxuKCogICAoKiB8IFB0eXBfY29uc3RyIChsb2MsIFtdKSAtPiAqKSAqKVxuKCogICAoKiAgICAgUHJpbnRmLnByaW50ZiBcIiVzSWRlbnRpZmllcjogJXNcXG5cIiBpbmRlbnRfc3RyICopICopXG4oKiAgICgqICAgICAgIChtYXRjaCBsb2MudHh0IHdpdGggTG9uZ2lkZW50LkxpZGVudCBsaSAtPiBsaSB8IF8gLT4gXCJPdGhlciBjb25zdHJcIikgKikgKilcbigqICAgfCBQdHlwX2NvbnN0ciAobG9jLCBjb3JlX3R5cGVzKSAtPiAqKVxuKCogICAgICAgaWYgcHJpbnRfZGVzYyB0aGVuIFByaW50Zi5wcmludGYgXCIlc0NvbnN0ciBjb3JlIHR5cGVzOiBcIiBpbmRlbnRfc3RyOyAqKVxuKCogICAgICAgTGlzdC5pdGVyICopXG4oKiAgICAgICAgIChmdW4gY3R5cCAtPiAqKVxuKCogICAgICAgICAgIHByaW50X2NvcmVfdHlwZSBjdHlwIGluZGVudCBmYWxzZTsgKilcbigqICAgICAgICAgICBQcmludGYucHJpbnRmIFwiIFwiKSAqKVxuKCogICAgICAgICBjb3JlX3R5cGVzOyAqKVxuKCogICAgICAgUHJpbnRmLnByaW50ZiBcIiVzXCIgKilcbigqICAgICAgICAgKG1hdGNoIGxvYy50eHQgd2l0aCBMb25naWRlbnQuTGlkZW50IGxpIC0+IGxpIHwgXyAtPiBcIk90aGVyIGNvbnN0clwiKTsgKilcbigqICAgICAgIGlmIHByaW50X2Rlc2MgdGhlbiBQcmludGYucHJpbnRmIFwiXFxuXCIgKilcbigqICAgfCBQdHlwX2Fycm93IChfLCB0MSwgdDIpIC0+ICopXG4oKiAgICAgICBpZiBwcmludF9kZXNjIHRoZW4gUHJpbnRmLnByaW50ZiBcIiVzQXJyb3cgY29yZSB0eXBlOiBcIiBpbmRlbnRfc3RyOyAqKVxuKCogICAgICAgcHJpbnRfY29yZV90eXBlIHQxIChpbmRlbnQgKyAyKSBmYWxzZTsgKilcbigqICAgICAgIFByaW50Zi5wcmludGYgXCIgLT4gXCI7ICopXG4oKiAgICAgICBwcmludF9jb3JlX3R5cGUgdDIgKGluZGVudCArIDIpIGZhbHNlOyAqKVxuKCogICAgICAgaWYgcHJpbnRfZGVzYyB0aGVuIFByaW50Zi5wcmludGYgXCJcXG5cIiAqKVxuKCogICB8IF8gLT4gUHJpbnRmLnByaW50ZiBcIiVzT3RoZXIgY29yZV90eXBlXFxuXCIgaW5kZW50X3N0ciAqKVxuKCoqKVxuKCogbGV0IHJlYyBwcmludF9wYXR0ZXJuIChwYXR0ZXJuIDogUGFyc2V0cmVlLnBhdHRlcm4pIGluZGVudCA9ICopXG4oKiAgIGxldCBpbmRlbnRfc3RyID0gU3RyaW5nLm1ha2UgaW5kZW50ICcgJyBpbiAqKVxuKCogICBtYXRjaCBwYXR0ZXJuLnBwYXRfZGVzYyB3aXRoICopXG4oKiAgIHwgUGFyc2V0cmVlLlBwYXRfdmFyIGxvYyAtPiBQcmludGYucHJpbnRmIFwiJXNWYXI6ICVzXFxuXCIgaW5kZW50X3N0ciBsb2MudHh0ICopXG4oKiAgIHwgUGFyc2V0cmVlLlBwYXRfdHVwbGUgcGF0cyAtPiAqKVxuKCogICAgICAgUHJpbnRmLnByaW50ZiBcIiVzVHVwbGU6XFxuXCIgaW5kZW50X3N0cjsgKilcbigqICAgICAgIExpc3QuaXRlciAoZnVuIHBhdCAtPiBwcmludF9wYXR0ZXJuIHBhdCAoaW5kZW50ICsgMikpIHBhdHMgKilcbigqICAgfCBQYXJzZXRyZWUuUHBhdF9jb25zdHJhaW50IChwYXQsIGNvcmVfdHlwZSkgLT4gKilcbigqICAgICAgIFByaW50Zi5wcmludGYgXCIlc0NvbnN0cmFpbnQ6XFxuXCIgaW5kZW50X3N0cjsgKilcbigqICAgICAgIHByaW50X3BhdHRlcm4gcGF0IChpbmRlbnQgKyAyKTsgKilcbigqICAgICAgIHByaW50X2NvcmVfdHlwZSBjb3JlX3R5cGUgKGluZGVudCArIDIpIHRydWUgKilcbigqICAgfCBfIC0+IFByaW50Zi5wcmludGYgXCIlc090aGVyIHBhdHRlcm5cXG5cIiBpbmRlbnRfc3RyICopXG4oKiopXG4oKiAoKiBQcmludCB0aGUgZXhwcmVzc2lvbiB0cmVlLiAqKSAqKVxuKCogbGV0IHJlYyBwcmludF9leHByZXNzaW9uIChleHByIDogUGFyc2V0cmVlLmV4cHJlc3Npb24pIGluZGVudCA9ICopXG4oKiAgIGxldCBpbmRlbnRfc3RyID0gU3RyaW5nLm1ha2UgaW5kZW50ICcgJyBpbiAqKVxuKCogICBtYXRjaCBleHByLnBleHBfZGVzYyB3aXRoICopXG4oKiAgIHwgUGV4cF9pZGVudCB7IHR4dCA9IExvbmdpZGVudC5MaWRlbnQgaWQ7IF8gfSAtPiAqKVxuKCogICAgICAgUHJpbnRmLnByaW50ZiBcIiVzSWRlbnRpZmllcjogJXNcXG5cIiBpbmRlbnRfc3RyIGlkICopXG4oKiAgIHwgUGV4cF9jb25zdGFudCBjb25zdCAtPiAqKVxuKCogICAgICAgUHJpbnRmLnByaW50ZiBcIiVzQ29uc3RhbnQ6ICVzXFxuXCIgaW5kZW50X3N0ciAqKVxuKCogICAgICAgICAobWF0Y2ggY29uc3Qgd2l0aCAqKVxuKCogICAgICAgICB8IFBjb25zdF9pbnRlZ2VyIChuLCBfKSAtPiBuICopXG4oKiAgICAgICAgIHwgUGNvbnN0X3N0cmluZyAocywgXywgXykgLT4gXCJcXFwiXCIgXiBzIF4gXCJcXFwiXCIgKilcbigqICAgICAgICAgfCBQY29uc3RfZmxvYXQgKGYsIF8pIC0+IGYgKilcbigqICAgICAgICAgfCBQY29uc3RfY2hhciBjIC0+IFN0cmluZy5tYWtlIDEgYykgKilcbigqICAgfCBQZXhwX2FwcGx5IChmdW5jLCBhcmdzKSAtPiAqKVxuKCogICAgICAgUHJpbnRmLnByaW50ZiBcIiVzQXBwbHk6XFxuXCIgaW5kZW50X3N0cjsgKilcbigqICAgICAgIHByaW50X2V4cHJlc3Npb24gZnVuYyAoaW5kZW50ICsgMik7ICopXG4oKiAgICAgICBMaXN0Lml0ZXIgKGZ1biAoXywgYXJnKSAtPiBwcmludF9leHByZXNzaW9uIGFyZyAoaW5kZW50ICsgMikpIGFyZ3MgKilcbigqICAgfCBQZXhwX3R1cGxlIGVsZW1lbnRzIC0+ICopXG4oKiAgICAgICBQcmludGYucHJpbnRmIFwiJXNUdXBsZTpcXG5cIiBpbmRlbnRfc3RyOyAqKVxuKCogICAgICAgTGlzdC5pdGVyIChmdW4gZWwgLT4gcHJpbnRfZXhwcmVzc2lvbiBlbCAoaW5kZW50ICsgMikpIGVsZW1lbnRzICopXG4oKiAgIHwgUGV4cF9mdW5jdGlvbiAocGFyYW1zLCByZXR0eXBlLCBfKSAtPiAoICopXG4oKiAgICAgICBQcmludGYucHJpbnRmIFwiJXNGdW5jdGlvbjpcXG5cIiBpbmRlbnRfc3RyOyAqKVxuKCogICAgICAgTGlzdC5pdGVyICopXG4oKiAgICAgICAgIChmdW4gKHBhcmFtIDogUGFyc2V0cmVlLmZ1bmN0aW9uX3BhcmFtKSAtPiAqKVxuKCogICAgICAgICAgIG1hdGNoIHBhcmFtLnBwYXJhbV9kZXNjIHdpdGggKilcbigqICAgICAgICAgICB8IFBwYXJhbV92YWwgKE5vbGFiZWwsIE5vbmUsIHBhdCkgLT4gKilcbigqICAgICAgICAgICAgICAgUHJpbnRmLnByaW50ZiBcIiVzICBQYXJhbXM6XFxuXCIgaW5kZW50X3N0cjsgKilcbigqICAgICAgICAgICAgICAgcHJpbnRfcGF0dGVybiBwYXQgKGluZGVudCArIDQpICopXG4oKiAgICAgICAgICAgfCBQcGFyYW1fbmV3dHlwZSBsb2MgLT4gKilcbigqICAgICAgICAgICAgICAgUHJpbnRmLnByaW50ZiBcIiVzTmV3dHlwZSBQYXJhbTogJXNcXG5cIiBpbmRlbnRfc3RyIGxvYy50eHQgKilcbigqICAgICAgICAgICB8IF8gLT4gUHJpbnRmLnByaW50ZiBcIiVzT3RoZXIgcGFyYW1zXFxuXCIgaW5kZW50X3N0cikgKilcbigqICAgICAgICAgcGFyYW1zOyAqKVxuKCogICAgICAgbWF0Y2ggcmV0dHlwZSB3aXRoICopXG4oKiAgICAgICB8IFNvbWUgcGNvbiAtPiAoICopXG4oKiAgICAgICAgICAgbWF0Y2ggcGNvbiB3aXRoICopXG4oKiAgICAgICAgICAgfCBQY29uc3RyYWludCByZXQgLT4gKilcbigqICAgICAgICAgICAgICAgUHJpbnRmLnByaW50ZiBcIiVzICBSZXR1cm46XFxuXCIgaW5kZW50X3N0cjsgKilcbigqICAgICAgICAgICAgICAgcHJpbnRfY29yZV90eXBlIHJldCAoaW5kZW50ICsgNCkgdHJ1ZSAqKVxuKCogICAgICAgICAgIHwgXyAtPiBQcmludGYucHJpbnRmIFwiJXNPdGhlciByZXR0eXBlXCIgaW5kZW50X3N0cikgKilcbigqICAgICAgIHwgXyAtPiBQcmludGYucHJpbnRmIFwiJXNPdGhlciB0eXBlX2NvbnN0cmFpbnRcXG5cIiBpbmRlbnRfc3RyKSAqKVxuKCogICB8IF8gLT4gUHJpbnRmLnByaW50ZiBcIiVzT3RoZXIgZXhwcmVzc2lvblxcblwiIGluZGVudF9zdHIgKilcbigqKilcbigqICgqIFByaW50IHRoZSBwYXJzZWQgc3RydWN0dXJlLiAqKSAqKVxuKCogbGV0IHByaW50X3N0cnVjdHVyZV9pdGVtIChpdGVtIDogUGFyc2V0cmVlLnN0cnVjdHVyZV9pdGVtKSBpbmRlbnQgPSAqKVxuKCogICBsZXQgaW5kZW50X3N0ciA9IFN0cmluZy5tYWtlIGluZGVudCAnICcgaW4gKilcbigqICAgbWF0Y2ggaXRlbS5wc3RyX2Rlc2Mgd2l0aCAqKVxuKCogICB8IFBzdHJfdmFsdWUgKHJlY19mbGFnLCBiaW5kaW5ncykgLT4gKilcbigqICAgICAgIFByaW50Zi5wcmludGYgXCIlc1ZhbHVlIGJpbmRpbmclczpcXG5cIiBpbmRlbnRfc3RyICopXG4oKiAgICAgICAgIChpZiByZWNfZmxhZyA9IFJlY3Vyc2l2ZSB0aGVuIFwiIChyZWN1cnNpdmUpXCIgZWxzZSBcIlwiKTsgKilcbigqICAgICAgIExpc3QuaXRlciAqKVxuKCogICAgICAgICAoZnVuICh2YiA6IFBhcnNldHJlZS52YWx1ZV9iaW5kaW5nKSAtPiAqKVxuKCogICAgICAgICAgIFByaW50Zi5wcmludGYgXCIlcyAgUGF0dGVybjogJXNcXG5cIiBpbmRlbnRfc3RyICopXG4oKiAgICAgICAgICAgICAoRm9ybWF0LmFzcHJpbnRmIFwiJWFcIiBQcHJpbnRhc3QucGF0dGVybiB2Yi5wdmJfcGF0KTsgKilcbigqICAgICAgICAgICBQcmludGYucHJpbnRmIFwiJXMgIEV4cHJlc3Npb246XFxuXCIgaW5kZW50X3N0cjsgKilcbigqICAgICAgICAgICBwcmludF9leHByZXNzaW9uIHZiLnB2Yl9leHByIChpbmRlbnQgKyA0KSkgKilcbigqICAgICAgICAgYmluZGluZ3MgKilcbigqICAgfCBQc3RyX3R5cGUgKF8sIHR5cGVfZGVjbHMpIC0+ICopXG4oKiAgICAgICBQcmludGYucHJpbnRmIFwiJXNUeXBlIGRlY2xhcmF0aW9uczpcXG5cIiBpbmRlbnRfc3RyOyAqKVxuKCogICAgICAgTGlzdC5pdGVyICopXG4oKiAgICAgICAgIChmdW4gKHRkIDogUGFyc2V0cmVlLnR5cGVfZGVjbGFyYXRpb24pIC0+ICopXG4oKiAgICAgICAgICAgUHJpbnRmLnByaW50ZiBcIiVzICBUeXBlIG5hbWU6ICVzXFxuXCIgaW5kZW50X3N0ciB0ZC5wdHlwZV9uYW1lLnR4dDsgKilcbigqICAgICAgICAgICBtYXRjaCB0ZC5wdHlwZV9raW5kIHdpdGggKilcbigqICAgICAgICAgICB8IFB0eXBlX3ZhcmlhbnQgY3Rvcl9kZWNscyAtPiAqKVxuKCogICAgICAgICAgICAgICBMaXN0Lml0ZXIgKilcbigqICAgICAgICAgICAgICAgICAoZnVuIChjdG9yIDogUGFyc2V0cmVlLmNvbnN0cnVjdG9yX2RlY2xhcmF0aW9uKSAtPiAqKVxuKCogICAgICAgICAgICAgICAgICAgUHJpbnRmLnByaW50ZiBcIiVzICBDb25zdHJ1Y3RvciBuYW1lOiAlc1wiIGluZGVudF9zdHIgKilcbigqICAgICAgICAgICAgICAgICAgICAgY3Rvci5wY2RfbmFtZS50eHQ7ICopXG4oKiAgICAgICAgICAgICAgICAgICBtYXRjaCBjdG9yLnBjZF9hcmdzIHdpdGggKilcbigqICAgICAgICAgICAgICAgICAgIHwgUGFyc2V0cmVlLlBjc3RyX3R1cGxlIGNvcmVfdHlwZXMgLT4gKilcbigqICAgICAgICAgICAgICAgICAgICAgICBpZiBMaXN0Lmxlbmd0aCBjb3JlX3R5cGVzID0gMCB0aGVuIHByaW50X3N0cmluZyBcIlxcblwiICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgTGlzdC5pdGVyICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW4gKGNvcmVfdHlwZSA6IFBhcnNldHJlZS5jb3JlX3R5cGUpIC0+ICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggY29yZV90eXBlLnB0eXBfZGVzYyB3aXRoICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQdHlwX2NvbnN0ciAoeyB0eHQgPSBMb25naWRlbnQuTGlkZW50IGlkOyBfIH0sIF8pICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludGYucHJpbnRmIFwiJXMgb2YgJXNcXG5cIiBpbmRlbnRfc3RyIGlkICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBfIC0+ICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50Zi5wcmludGYgXCIlc090aGVyIHN0cnVjdHVyZSBpdGVtXFxuXCIgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnRfc3RyKSAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlX3R5cGVzICopXG4oKiAgICAgICAgICAgICAgICAgICB8IF8gLT4gUHJpbnRmLnByaW50ZiBcIiVzT3RoZXIgc3RydWN0dXJlIGl0ZW1cXG5cIiBpbmRlbnRfc3RyKSAqKVxuKCogICAgICAgICAgICAgICAgIGN0b3JfZGVjbHMgKilcbigqICAgICAgICAgICB8IF8gLT4gUHJpbnRmLnByaW50ZiBcIiVzT3RoZXIgc3RydWN0dXJlIGl0ZW1cXG5cIiBpbmRlbnRfc3RyKSAqKVxuKCogICAgICAgICB0eXBlX2RlY2xzICopXG4oKiAgIHwgXyAtPiBQcmludGYucHJpbnRmIFwiJXNPdGhlciBzdHJ1Y3R1cmUgaXRlbVxcblwiIGluZGVudF9zdHIgKilcbigqKilcbigqICgqIFByaW50IHRoZSBzdHJ1Y3R1cmUuICopICopXG4oKiBsZXQgcHJpbnRfc3RydWN0dXJlIHN0cnVjdHVyZSA9ICopXG4oKiAgIExpc3QuaXRlciAoZnVuIGl0ZW0gLT4gcHJpbnRfc3RydWN0dXJlX2l0ZW0gaXRlbSAwKSBzdHJ1Y3R1cmUgKilcblxuKCogRnVuY3Rpb24gdG8gcHJpbnQgdGhlIHBhcnNlZCBzdHJ1Y3R1cmUgKilcbigqIGxldCBwcmludF90eXBlZGVjbF90cmVlICh0eXBlZGVjbCA6IFBhcnNldHJlZS50eXBlX2RlY2xhcmF0aW9uKSAoaW5kZW50IDogaW50KSA9ICopXG4oKiAgIGxldCBpbmRlbnRfc3RyID0gU3RyaW5nLm1ha2UgaW5kZW50ICcgJyBpbiAqKVxuKCogICBtYXRjaCB0eXBlZGVjbC5wdHlwZV9raW5kIHdpdGggKilcbigqICAgfCBQdHlwZV92YXJpYW50IGN0b3JfZGVjbHMgLT4gKilcbigqICAgICAgIHByaW50X2ludCAoTGlzdC5sZW5ndGggY3Rvcl9kZWNscyk7ICopXG4oKiAgICAgICBwcmludF9zdHJpbmcgaW5kZW50X3N0ciAqKVxuKCogICB8IF8gLT4gUHJpbnRmLnByaW50ZiBcIiVzT3RoZXIgZXhwcmVzc2lvbiB0eXBlXFxuXCIgaW5kZW50X3N0ciAqKVxuKCoqKVxuKCogbGV0IHByaW50X3R5cGVkZWNsIHR5cGVkZWNsID0gcHJpbnRfdHlwZWRlY2xfdHJlZSB0eXBlZGVjbCAwICopXG5cbigqIEZ1bmN0aW9uIHRvIHByaW50IHRoZSBwYXJzZWQgZXhwcmVzc2lvbiAqKVxuKCogbGV0IHByaW50X2V4cHJlc3Npb24gZXhwciA9IHByaW50X2V4cHJlc3Npb25fdHJlZSBleHByIDAgKilcblxuKCogbGV0IHJlYWRfZmlsZSBmaWxlbmFtZSA9ICopXG4oKiAgIGxldCBjaCA9IG9wZW5faW5fYmluIGZpbGVuYW1lIGluICopXG4oKiAgIGxldCBzID0gcmVhbGx5X2lucHV0X3N0cmluZyBjaCAoaW5fY2hhbm5lbF9sZW5ndGggY2gpIGluICopXG4oKiAgIGNsb3NlX2luIGNoOyAqKVxuKCogICBzICopXG5sZXQgcmVjIHN0cmluZ19vZl90eXBlICh0eXAgOiBQYXJzZXRyZWUuY29yZV90eXBlKSA6IHN0cmluZyA9XG4gIG1hdGNoIHR5cC5wdHlwX2Rlc2Mgd2l0aFxuICB8IFB0eXBfYXJyb3cgKF8sIHQxLCB0MikgLT5cbiAgICAgIGxldCBhcmcxID0gc3RyaW5nX29mX3R5cGUgdDEgaW5cbiAgICAgIGxldCBhcmcyID0gc3RyaW5nX29mX3R5cGUgdDIgaW5cbiAgICAgIGFyZzEgXiBcIiAtPiBcIiBeIGFyZzJcbiAgfCBQdHlwX3R1cGxlIHR5cGVzIC0+XG4gICAgICBsZXQgdHlwZV9zdHJpbmdzID0gTGlzdC5tYXAgc3RyaW5nX29mX3R5cGUgdHlwZXMgaW5cbiAgICAgIFN0cmluZy5jb25jYXQgXCIgKiBcIiB0eXBlX3N0cmluZ3NcbiAgfCBQdHlwX2NvbnN0ciAoeyB0eHQgPSBMaWRlbnQgczsgXyB9LCBbXSkgLT4gc1xuICB8IFB0eXBfY29uc3RyICh7IHR4dCA9IExpZGVudCBzOyBfIH0sIGN0eXBfbGlzdCkgLT5cbiAgICAgIGxldCBhcmdzX3N0ciA9IExpc3QubWFwIHN0cmluZ19vZl90eXBlIGN0eXBfbGlzdCB8PiBTdHJpbmcuY29uY2F0IFwiLCBcIiBpblxuICAgICAgYXJnc19zdHIgXiBcIiBcIiBeIHNcbiAgfCBfIC0+IFwidW5rbm93blwiXG5cbmxldCByZWMgZXh0cmFjdF9jb3JlX3R5cGUgKGN0eXAgOiBQYXJzZXRyZWUuY29yZV90eXBlKSAoY29tcG9uZW50c19vbmx5IDogYm9vbClcbiAgICA9XG4gIGlmIGNvbXBvbmVudHNfb25seSB0aGVuIChcbiAgICBtYXRjaCBjdHlwLnB0eXBfZGVzYyB3aXRoXG4gICAgfCBQdHlwX2Fycm93IChfLCBhcmd0eXAsIHJldHR5cCkgLT5cbiAgICAgICAgWyBcIlB0eXBfYXJyb3dcIjsgc3RyaW5nX29mX3R5cGUgYXJndHlwOyBzdHJpbmdfb2ZfdHlwZSByZXR0eXAgXVxuICAgIHwgUHR5cF90dXBsZSB0eXBlcyAtPlxuICAgICAgICBcIlB0eXBfdHVwbGVcIlxuICAgICAgICA6OiBMaXN0LmZvbGRfcmlnaHQgKGZ1biBjdXJyIGFjYyAtPiBzdHJpbmdfb2ZfdHlwZSBjdXJyIDo6IGFjYykgdHlwZXMgW11cbiAgICB8IFB0eXBfY29uc3RyICh7IHR4dCA9IExpZGVudCBpZDsgXyB9LCBbXSkgLT4gWyBcIlB0eXBfY29uc3RyXCI7IGlkIF1cbiAgICB8IFB0eXBfY29uc3RyICh7IHR4dCA9IExpZGVudCBpZDsgXyB9LCBbIGN0eXBzIF0pIC0+XG4gICAgICAgIFsgXCJQdHlwX2NvbnN0clwiOyBzdHJpbmdfb2ZfdHlwZSBjdHlwczsgaWQgXVxuICAgIHwgXyAtPlxuICAgICAgICBQcmludGYucHJpbnRmIFwiT3RoZXIgY29yZSB0eXBlXCI7XG4gICAgICAgIFsgXCJPdGhlciBjb3JlIHR5cGVcIiBdKVxuICBlbHNlXG4gICAgbWF0Y2ggY3R5cC5wdHlwX2Rlc2Mgd2l0aFxuICAgIHwgUHR5cF9hcnJvdyAoXywgXywgcmV0dHlwKSAtPlxuICAgICAgICBzdHJpbmdfb2ZfdHlwZSBjdHlwIDo6IGV4dHJhY3RfY29yZV90eXBlIHJldHR5cCBjb21wb25lbnRzX29ubHlcbiAgICB8IFB0eXBfdHVwbGUgdHlwZXMgLT5cbiAgICAgICAgTGlzdC5mb2xkX2xlZnRcbiAgICAgICAgICAoZnVuIGFjYyBjdXJyIC0+XG4gICAgICAgICAgICBMaXN0LmFwcGVuZCAoZXh0cmFjdF9jb3JlX3R5cGUgY3VyciBjb21wb25lbnRzX29ubHkpIGFjYylcbiAgICAgICAgICBbXSB0eXBlc1xuICAgIHwgUHR5cF9jb25zdHIgKHsgdHh0ID0gTGlkZW50IGlkOyBfIH0sIFtdKSAtPiBpZCA6OiBbXVxuICAgIHwgUHR5cF9jb25zdHIgKHsgdHh0ID0gTGlkZW50IGlkOyBfIH0sIFsgY3R5cHMgXSkgLT5cbiAgICAgICAgWyBzdHJpbmdfb2ZfdHlwZSBjdHlwcyBeIFwiIFwiIF4gaWQgXVxuICAgIHwgXyAtPlxuICAgICAgICBQcmludGYucHJpbnRmIFwiT3RoZXIgY29yZSB0eXBlXCI7XG4gICAgICAgIFtdXG5cbigqIFNhdmUgdGhpcyBmb3IgbGF0ZXIgd2hlbiB3ZSBhY3R1YWxseSBuZWVkIHRvIGdldCB0aGUgY29uc3RydWN0b3JzICopXG4oKiBsZXQgYW5hbHl6ZV9zdHJ1Y3R1cmUgKHN0cnVjdHVyZSA6IFBhcnNldHJlZS5zdHJ1Y3R1cmUpID0gKilcbigqIExpc3QuaXRlciAqKVxuKCogICAoZnVuIChpdGVtIDogUGFyc2V0cmVlLnN0cnVjdHVyZV9pdGVtKSAtPiAqKVxuKCogICAgIG1hdGNoIGl0ZW0ucHN0cl9kZXNjIHdpdGggKilcbigqICAgICB8IFBzdHJfdHlwZSAoXywgdHlwZV9kZWNscykgLT4gKilcbigqICAgICAgICAgTGlzdC5pdGVyICopXG4oKiAgICAgICAgICAgKGZ1biAodGQgOiBQYXJzZXRyZWUudHlwZV9kZWNsYXJhdGlvbikgLT4gKilcbigqICAgICAgICAgICAgICgqIFByaW50Zi5wcmludGYgXCJUeXBlOiAlc1xcblwiIHRkLnB0eXBlX25hbWUudHh0OyAqKSAqKVxuKCogICAgICAgICAgICAgbWF0Y2ggdGQucHR5cGVfa2luZCB3aXRoICopXG4oKiAgICAgICAgICAgICB8IFB0eXBlX3ZhcmlhbnQgY3RvcnMgLT4gKilcbigqICAgICAgICAgICAgICAgICBMaXN0Lml0ZXIgKilcbigqICAgICAgICAgICAgICAgICAgIChmdW4gKGN0b3IgOiBQYXJzZXRyZWUuY29uc3RydWN0b3JfZGVjbGFyYXRpb24pIC0+ICopXG4oKiAgICAgICAgICAgICAgICAgICAgIFByaW50Zi5wcmludGYgXCIgIENvbnN0cnVjdG9yOiAlc1xcblwiIGN0b3IucGNkX25hbWUudHh0KSAqKVxuKCogICAgICAgICAgICAgICAgICAgY3RvcnMgKilcbigqICAgICAgICAgICAgIHwgXyAtPiBQcmludGYucHJpbnRmIFwiT3RoZXIgdHlwZSBraW5kXFxuXCIpICopXG4oKiAgICAgICAgICAgdHlwZV9kZWNscyAqKVxuKCogICAgIHwgXyAtPiBQcmludGYucHJpbnRmIFwiTm90IGEgdHlwZSBkZWNsYXJhdGlvblxcblwiKSAqKVxuKCogICBzdHJ1Y3R1cmU7ICopXG5cbmxldCBwYXJzZV9jb3JlX3R5cGVfZnJvbV90eXBlX3NwYW4gcyA9XG4gIGxldCBsZXhidWYgPSBMZXhpbmcuZnJvbV9zdHJpbmcgcyBpblxuICB0cnkgU29tZSAoUGFyc2UuY29yZV90eXBlIGxleGJ1Zikgd2l0aCBfIC0+IE5vbmVcblxubGV0IHBhcnNlX2ltcGxlbWVudGF0aW9uX2Zyb21fdHlwZV9zcGFuIHMgPVxuICBsZXQgbGV4YnVmID0gTGV4aW5nLmZyb21fc3RyaW5nIChcInR5cGUgdG1wID0gXCIgXiBzKSBpblxuICB0cnkgU29tZSAoUGFyc2UuaW1wbGVtZW50YXRpb24gbGV4YnVmKSB3aXRoIF8gLT4gTm9uZVxuXG4oKiBXYWxrIHRoZSBBU1QgYW5kIGV4dHJhY11ddCB0YXJnZXQgdHlwZXMuICopXG5sZXQgZXh0cmFjdF90YXJnZXRfdHlwZXMgKHR5cGVfc3BhbiA6IHN0cmluZykgPVxuICBsZXQgcGFyc2VkID0gcGFyc2VfY29yZV90eXBlX2Zyb21fdHlwZV9zcGFuIHR5cGVfc3BhbiBpblxuICBtYXRjaCBwYXJzZWQgd2l0aFxuICB8IFNvbWUgY3R5cCAtPiBleHRyYWN0X2NvcmVfdHlwZSBjdHlwIGZhbHNlXG4gIHwgTm9uZSAtPiAoXG4gICAgICBsZXQgcGFyc2VkMiA9IHBhcnNlX2ltcGxlbWVudGF0aW9uX2Zyb21fdHlwZV9zcGFuIHR5cGVfc3BhbiBpblxuICAgICAgbWF0Y2ggcGFyc2VkMiB3aXRoXG4gICAgICAoKiB8IFNvbWUgaW1wbCAtPiBhbmFseXplX3N0cnVjdHVyZSBpbXBsICopXG4gICAgICB8IFNvbWUgXyAtPiBbIHR5cGVfc3BhbiBdXG4gICAgICB8IE5vbmUgLT4gZmFpbHdpdGggXCJGYWlsZWQgdG8gcGFyc2UgdHlwZSBzcGFuXCIpXG5cbigqIHByaW50X2VuZGxpbmUgXCJTdHJ1Y3R1cmUgcGFyc2VkIHN1Y2Nlc3NmdWxseSFcIjsgKilcbigqIGV4dHJhY3RfY29yZV90eXBlIHBhcnNlZCBmYWxzZSAqKVxuXG5sZXQgZXh0cmFjdF9jb21wb25lbnRfdHlwZXMgKHR5cGVfc3BhbiA6IHN0cmluZykgPVxuICBsZXQgcGFyc2VkID0gcGFyc2VfY29yZV90eXBlX2Zyb21fdHlwZV9zcGFuIHR5cGVfc3BhbiBpblxuICBtYXRjaCBwYXJzZWQgd2l0aFxuICB8IFNvbWUgY3R5cCAtPiBleHRyYWN0X2NvcmVfdHlwZSBjdHlwIHRydWVcbiAgfCBOb25lIC0+IChcbiAgICAgIGxldCBwYXJzZWQyID0gcGFyc2VfaW1wbGVtZW50YXRpb25fZnJvbV90eXBlX3NwYW4gdHlwZV9zcGFuIGluXG4gICAgICBtYXRjaCBwYXJzZWQyIHdpdGhcbiAgICAgICgqIHwgU29tZSBpbXBsIC0+IGFuYWx5emVfc3RydWN0dXJlIGltcGwgKilcbiAgICAgIHwgU29tZSBfIC0+IFsgdHlwZV9zcGFuIF1cbiAgICAgIHwgTm9uZSAtPiBmYWlsd2l0aCBcIkZhaWxlZCB0byBwYXJzZSB0eXBlIHNwYW5cIilcblxubGV0IGpzX2V4dHJhY3RfdGFyZ2V0X3R5cGVzICh0eXBlX3NwYW4gOiBzdHJpbmcpID1cbiAgbGV0IGV4dHJhY3RlZCA9IGV4dHJhY3RfdGFyZ2V0X3R5cGVzIHR5cGVfc3BhbiBpblxuICBKcy5hcnJheSAoQXJyYXkub2ZfbGlzdCBleHRyYWN0ZWQpXG5cbigqIFdoYXQgZG8gd2Ugd2FudD8gdG9kbyAtPiBtb2RlbCAqIGludCB3b3VsZCB5aWVsZCB0b2RvLCBtb2RlbCAqIGludCAqKVxuKCogbW9kZWwgKiBpbnQgKiBzdHJpbmcgd291bGQgeWllbGQgbW9kZWwsIGludCwgc3RyaW5nICopXG5sZXQganNfZXh0cmFjdF9jb21wb25lbnRfdHlwZXMgKHR5cGVfc3BhbiA6IHN0cmluZykgPVxuICBsZXQgZXh0cmFjdGVkID0gZXh0cmFjdF9jb21wb25lbnRfdHlwZXMgdHlwZV9zcGFuIGluXG4gIEpzLmFycmF5IChBcnJheS5vZl9saXN0IGV4dHJhY3RlZClcblxuKCogRXhhbXBsZSB1c2FnZSAqKVxuKCogbGV0ICgpID0gKilcbigqICAgKCogVE9ETzogSG93IGRvIHdlIGV4dHJhY3QgdGhpcyB0eXBlIHNwYW4gc3RyaW5nPyAqKSAqKVxuKCogICBsZXQgc3RycyA9ICopXG4oKiAgICAgWyAqKVxuKCogICAgICAgXCJ0b2RvICogdG9kbyAtPiBib29sXCI7ICopXG4oKiAgICAgICBcIm1vZGVsICogbW9kZWwgLT4gYm9vbFwiOyAqKVxuKCogICAgICAgXCJtb2RlbFwiOyAqKVxuKCogICAgICAgXCJtb2RlbCAtPiB0b2RvIGxpc3RcIjsgKilcbigqICAgICAgIFwiaW50ICogdG9kbyBsaXN0IC0+IHRvZG8gbGlzdFwiOyAqKVxuKCogICAgICAgXCJpbnQgKiB0b2RvIGxpc3QgLT4gdG9kbyBsaXN0ICogYm9vbFwiOyAqKVxuKCogICAgICAgXCJpbnQgKiB0b2RvIGxpc3QgLT4gKCh0b2RvICogYWN0aW9uKSAqIChzdHJpbmcgLT4gYm9vbCkpXCI7ICopXG4oKiAgICAgICBcImlkIGxpc3QgKiBwbGF5bGlzdF9zdGF0ZVwiOyAqKVxuKCogICAgICAgXCJQbGF5aW5nIG9mIGlkIHwgUGF1c2VkT24gb2YgaWQgfCBOb1NvbmdTZWxlY3RlZFwiOyAqKVxuKCogICAgIF0gKilcbigqICAgaW4gKilcbigqICAgKCogbGV0IHN0ciA9ICopICopXG4oKiAgICgqICAgcmVhZF9maWxlICopICopXG4oKiAgICgqICAgICBcIi9ob21lL2phY29iL3Byb2plY3RzL2NvbnRleHQtZXh0cmFjdG9yL3RhcmdldHMvb2NhbWwvdG9kby9wcmVsdWRlLm1sXCIgKikgKilcbigqICAgKCogaW4gKikgKilcbigqICAgTGlzdC5pdGVyICopXG4oKiAgICAgKGZ1biBzdHIgLT4gKilcbigqICAgICAgIExpc3QuaXRlciAqKVxuKCogICAgICAgICAoZnVuIGVsIC0+ICopXG4oKiAgICAgICAgICAgcHJpbnRfc3RyaW5nIGVsOyAqKVxuKCogICAgICAgICAgIHByaW50X2VuZGxpbmUgXCIgOyBcIikgKilcbigqICAgICAgICAgKGV4dHJhY3RfdGFyZ2V0X3R5cGVzIHN0cikpICopXG4oKiAgICAgc3RycyAqKVxuXG5sZXQgXyA9IEpzLmV4cG9ydCBcInBhcnNlXCIgKEpzLndyYXBfY2FsbGJhY2sganNfZXh0cmFjdF90YXJnZXRfdHlwZXMpXG5sZXQgXyA9IEpzLmV4cG9ydCBcImdldENvbXBvbmVudHNcIiAoSnMud3JhcF9jYWxsYmFjayBqc19leHRyYWN0X2NvbXBvbmVudF90eXBlcylcblxuKCogbWF0Y2ggcGFyc2VfZnJvbV9zdHJpbmcgc3RyIHdpdGggKilcbigqIHwgU29tZSBwYXJzZWRfc3RyIC0+ICopXG4oKiAgICAgcHJpbnRfZW5kbGluZSBcIlN0cnVjdHVyZSBwYXJzZWQgc3VjY2Vzc2Z1bGx5IVwiOyAqKVxuKCogICAgIHByaW50X3N0cnVjdHVyZSBwYXJzZWRfc3RyICopXG4oKiB8IE5vbmUgLT4gcHJpbnRfZW5kbGluZSBcIkZhaWxlZCB0byBwYXJzZSBzdHJ1Y3R1cmUuXCIgKilcbiJdfQ==
|