@markdown-next/parser 0.0.1-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 UnboundedWeb
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,150 @@
1
+ import { Root } from 'hast';
2
+ import { PluggableList } from 'unified';
3
+ import { Options } from 'rehype-mathjax/chtml';
4
+
5
+ type RenderType = 'html' | 'hast';
6
+ type ExtendsProps = 'gfm' | 'mathjax';
7
+
8
+ interface RenderProps {
9
+ customTags?: string[];
10
+ extendedGrammar?: ExtendsProps[];
11
+ /**
12
+ * Remark plugins appended before `remarkRehype` (process Markdown AST)
13
+ */
14
+ remarkPlugins?: PluggableList;
15
+ /**
16
+ * Rehype plugins appended after `rehypeRaw/rehypeSanitize` (process HTML AST)
17
+ */
18
+ rehypePlugins?: PluggableList;
19
+ /**
20
+ * MathJax config options (only effective when extendedGrammar includes 'mathjax')
21
+ * @see https://docs.mathjax.org/en/latest/options/index.html
22
+ */
23
+ mathJaxConfig?: Options;
24
+ /**
25
+ * Whether to support LaTeX syntax (using \\( and \\[ as math delimiters)
26
+ * When true, enables remarkMathDelimiters to parse LaTeX syntax
27
+ * @default false
28
+ */
29
+ supportsLaTeX?: boolean;
30
+ }
31
+
32
+ /**
33
+ * 单线程 Markdown 解析器
34
+ */
35
+ declare class Parser {
36
+ private options;
37
+ constructor(options?: RenderProps);
38
+ /**
39
+ * 解析 Markdown 到 HTML
40
+ * @param markdown Markdown 字符串
41
+ * @returns HTML 字符串
42
+ */
43
+ parseToHTML(markdown: string): Promise<string>;
44
+ /**
45
+ * 解析 Markdown 到 HAST
46
+ * @param markdown Markdown 字符串
47
+ * @returns HAST Root 节点
48
+ */
49
+ parseToHAST(markdown: string): Promise<Root>;
50
+ /**
51
+ * 批量解析 Markdown 到 HTML
52
+ * @param markdowns Markdown 字符串数组
53
+ * @returns HTML 字符串数组
54
+ */
55
+ batchParseToHTML(markdowns: string[]): Promise<string[]>;
56
+ /**
57
+ * 批量解析 Markdown 到 HAST
58
+ * @param markdowns Markdown 字符串数组
59
+ * @returns HAST Root 节点数组
60
+ */
61
+ batchParseToHAST(markdowns: string[]): Promise<Root[]>;
62
+ }
63
+ /**
64
+ * 创建单线程解析器实例
65
+ * @param options 解析器选项
66
+ * @returns Parser 实例
67
+ */
68
+ declare function createParser(options?: RenderProps): Parser;
69
+
70
+ /**
71
+ * Worker 池配置
72
+ */
73
+ interface WorkerPoolOptions extends RenderProps {
74
+ /**
75
+ * Worker 数量,默认为 CPU 核心数(最大 8)
76
+ */
77
+ workerCount?: number;
78
+ }
79
+ /**
80
+ * 多线程 Markdown 解析器(使用 Worker 池)
81
+ */
82
+ declare class ParserWorkerPool {
83
+ private options;
84
+ private workers;
85
+ private workerCount;
86
+ private initialized;
87
+ constructor(options?: WorkerPoolOptions);
88
+ /**
89
+ * 初始化 Worker 池
90
+ */
91
+ private init;
92
+ /**
93
+ * 获取空闲的 Worker
94
+ */
95
+ private getAvailableWorker;
96
+ /**
97
+ * 释放 Worker
98
+ */
99
+ private releaseWorker;
100
+ /**
101
+ * 解析 Markdown 到 HTML
102
+ * @param markdown Markdown 字符串
103
+ * @returns HTML 字符串
104
+ */
105
+ parseToHTML(markdown: string): Promise<string>;
106
+ /**
107
+ * 解析 Markdown 到 HAST
108
+ * @param markdown Markdown 字符串
109
+ * @returns HAST Root 节点
110
+ */
111
+ parseToHAST(markdown: string): Promise<Root>;
112
+ /**
113
+ * 批量解析 Markdown 到 HTML(并行处理)
114
+ * @param markdowns Markdown 字符串数组
115
+ * @returns HTML 字符串数组
116
+ */
117
+ batchParseToHTML(markdowns: string[]): Promise<string[]>;
118
+ /**
119
+ * 批量解析 Markdown 到 HAST(并行处理)
120
+ * @param markdowns Markdown 字符串数组
121
+ * @returns HAST Root 节点数组
122
+ */
123
+ batchParseToHAST(markdowns: string[]): Promise<Root[]>;
124
+ /**
125
+ * 更新所有 Worker 的选项
126
+ * @param options 新的解析器选项
127
+ */
128
+ updateOptions(options: Partial<RenderProps>): Promise<void>;
129
+ /**
130
+ * 销毁 Worker 池
131
+ */
132
+ destroy(): Promise<void>;
133
+ /**
134
+ * 获取 Worker 池信息
135
+ */
136
+ getPoolInfo(): {
137
+ workerCount: number;
138
+ maxWorkers: number;
139
+ environment: 'browser' | 'node' | 'unknown';
140
+ initialized: boolean;
141
+ };
142
+ }
143
+ /**
144
+ * 创建多线程解析器实例
145
+ * @param options 解析器选项(包含 Worker 数量)
146
+ * @returns ParserWorkerPool 实例
147
+ */
148
+ declare function createWorkerPool(options?: WorkerPoolOptions): ParserWorkerPool;
149
+
150
+ export { type ExtendsProps, Parser, type RenderProps as ParserOptions, ParserWorkerPool, type RenderType, type WorkerPoolOptions, createParser, createWorkerPool };
package/dist/index.mjs ADDED
@@ -0,0 +1,9 @@
1
+ var I=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(r,t)=>(typeof require<"u"?require:r)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});import{unified as ne}from"unified";import oe from"remark-parse";import se from"remark-gfm";import ie from"remark-rehype";import ae from"rehype-stringify";import le from"remark-math";import ce from"rehype-sanitize";import me from"rehype-raw";import{defaultSchema as b}from"rehype-sanitize";var H=["math","mrow","mi","mn","mo","mfrac","msup","msub","munder","mover","munderover","msqrt","mroot","mtext","mspace","menclose","mpadded","mphantom","mtable","mtr","mtd","mlabeledtr","maligngroup","malignmark","mstyle","merror","maction","semantics","annotation","annotation-xml"],$={math:["display","class","style","xmlns"],mrow:["class","style"],mi:["class","style","mathvariant"],mn:["class","style"],mo:["class","style","fence","separator","stretchy","symmetric","largeop","movablelimits","accent","lspace","rspace","form"],mfrac:["class","style","linethickness","numalign","denomalign","bevelled"],msup:["class","style","superscriptshift"],msub:["class","style","subscriptshift"],munder:["class","style","accentunder"],mover:["class","style","accent"],munderover:["class","style","accent","accentunder"],msqrt:["class","style"],mroot:["class","style"],mtext:["class","style","mathvariant"],mspace:["class","style","width","height","depth"],menclose:["class","style","notation"],mpadded:["class","style","width","height","depth","lspace","voffset"],mphantom:["class","style"],mtable:["class","style","align","rowalign","columnalign","groupalign","alignmentscope","columnwidth","width","rowspacing","columnspacing","rowlines","columnlines","frame","framespacing","equalrows","equalcolumns","displaystyle","side","minlabelspacing"],mtr:["class","style","rowalign","columnalign","groupalign"],mtd:["class","style","rowspan","columnspan","rowalign","columnalign","groupalign"],mlabeledtr:["class","style","rowalign","columnalign","groupalign"],maligngroup:["class","style","groupalign"],malignmark:["class","style","edge"],mstyle:["class","style","scriptlevel","displaystyle","scriptsizemultiplier","scriptminsize","infixlinebreakstyle","decimalpoint","mathvariant","mathsize","mathcolor","mathbackground"],merror:["class","style"],maction:["class","style","actiontype","selection"],semantics:["class","style"],annotation:["class","style","encoding"],"annotation-xml":["class","style","encoding"]};var x=(e=[])=>({...b,tagNames:[...b.tagNames||[],...H,...e],attributes:{...b.attributes,img:["src","alt","title","width","height","style","class"],code:[["className",/^language-./,"math-inline","math-display"]],...$,...e.reduce((r,t)=>(r[t]=["class","className","style","id","prop","src"],r),{})},protocols:{...b.protocols,src:["http","https","data","file"]}});var v=(function(e){if(e==null)return K;if(typeof e=="function")return A(e);if(typeof e=="object")return Array.isArray(e)?G(e):B(e);if(typeof e=="string")return q(e);throw new Error("Expected function, string, or object as test")});function G(e){let r=[],t=-1;for(;++t<e.length;)r[t]=v(e[t]);return A(n);function n(...i){let l=-1;for(;++l<r.length;)if(r[l].apply(this,i))return!0;return!1}}function B(e){let r=e;return A(t);function t(n){let i=n,l;for(l in e)if(i[l]!==r[l])return!1;return!0}}function q(e){return A(r);function r(t){return t&&t.type===e}}function A(e){return r;function r(t,n,i){return!!(Y(t)&&e.call(this,t,typeof n=="number"?n:void 0,i||void 0))}}function K(){return!0}function Y(e){return e!==null&&typeof e=="object"&&"type"in e}function j(e){return"\x1B[33m"+e+"\x1B[39m"}var z=[],E=!0,R=!1,W="skip";function O(e,r,t,n){let i;typeof r=="function"&&typeof t!="function"?(n=t,t=r):i=r;let l=v(i),c=n?-1:1;o(e,void 0,[])();function o(a,s,u){let d=a&&typeof a=="object"?a:{};if(typeof d.type=="string"){let m=typeof d.tagName=="string"?d.tagName:typeof d.name=="string"?d.name:void 0;Object.defineProperty(w,"name",{value:"node ("+j(a.type+(m?"<"+m+">":""))+")"})}return w;function w(){let m=z,y,h,g;if((!r||l(a,s,u[u.length-1]||void 0))&&(m=Z(t(a,u)),m[0]===R))return m;if("children"in a&&a.children){let P=a;if(P.children&&m[0]!==W)for(h=(n?P.children.length:-1)+c,g=u.concat(P);h>-1&&h<P.children.length;){let k=P.children[h];if(y=o(k,h,g)(),y[0]===R)return y;h=typeof y[1]=="number"?y[1]:h+c}}return m}}}function Z(e){return Array.isArray(e)?e:typeof e=="number"?[E,e]:e==null?z:[e]}function M(e,r,t,n){let i,l,c;typeof r=="function"&&typeof t!="function"?(l=void 0,c=r,i=t):(l=r,c=t,i=n),O(e,l,o,i);function o(a,s){let u=s[s.length-1],d=u?u.children.indexOf(a):void 0;return c(a,d,u)}}var _=(e=[])=>r=>{let t=x(e),n=new Set(t.tagNames||[]);M(r,"element",(i,l,c)=>{if(!c||l===void 0)return;let o=i.tagName;if(!n.has(o)&&/[^a-zA-Z]/.test(o)){let s=`<${o}`;if(i.properties)for(let[w,m]of Object.entries(i.properties))Array.isArray(m)?s+=` ${w}="${m.join(" ")}"`:m!=null&&(s+=` ${w}="${m}"`);let u="";if(i.children&&i.children.length>0){let w=m=>m.map(y=>{if(y.type==="text")return y.value;if(y.type==="element"){let h=y,g=`<${h.tagName}`;if(h.properties)for(let[P,k]of Object.entries(h.properties))Array.isArray(k)?g+=` ${P}="${k.join(" ")}"`:k!=null&&(g+=` ${P}="${k}"`);return g+=">",h.children&&(g+=w(h.children)),g+=`</${h.tagName}>`,g}return""}).join("");u=w(i.children)}s+=`>${u}</${o}>`;let d={type:"text",value:s};c.children[l]=d}})};import ue from"rehype-mathjax/chtml";var Q="https://cdn.jsdelivr.net/npm/mathjax@3/es5/output/chtml/fonts/woff-v2",U={chtml:{fontURL:Q}};var V=(e,r)=>{let t=0;for(let n=r-1;n>=0&&e[n]==="\\";n--)t++;return t},L=(e,r,t)=>e[r]!=="\\"||e[r+1]!==t?!1:V(e,r)%2===0,F=(e,r,t)=>{for(let n=r;n<e.length-1;n++)if(L(e,n,t))return n;return-1},D=(e,r)=>r===0||e[r-1]===`
2
+ `,ee=(e,r)=>{let t=e[r];if(t!=="`"&&t!=="~")return null;let n=0;for(let i=r;i<e.length&&e[i]===t;i++)n++;return n<3?null:{fenceChar:t,fenceLength:n}},re=(e,r)=>D(e,r)?e[r]===" "?!0:e.slice(r,r+4)===" ":!1,te=e=>{let r="",t=!1,n=null,i=0,l=!1,c=0;for(let o=0;o<e.length;){if(!t&&!l&&re(e,o)){let a=e.indexOf(`
3
+ `,o);if(a===-1)return r+e.slice(o);r+=e.slice(o,a+1),o=a+1;continue}if(!l&&D(e,o)){let a=ee(e,o);if(a){t?n===a.fenceChar&&a.fenceLength>=i&&(t=!1,n=null,i=0):(t=!0,n=a.fenceChar,i=a.fenceLength);let s=e.indexOf(`
4
+ `,o);if(s===-1)return r+e.slice(o);r+=e.slice(o,s+1),o=s+1;continue}}if(!t){if(!l&&e[o]==="`"){let a=0;for(let s=o;s<e.length&&e[s]==="`";s++)a++;l=!0,c=a,r+=e.slice(o,o+a),o+=a;continue}if(l){if(e[o]==="`"){let a=0;for(let s=o;s<e.length&&e[s]==="`";s++)a++;if(a>=c){r+=e.slice(o,o+c),o+=c,l=!1,c=0;continue}}r+=e[o],o++;continue}}if(!t&&!l){if(L(e,o,"(")){let a=F(e,o+2,")");if(a!==-1){let s=e.slice(o+2,a);r+=`$${s}$`,o=a+2;continue}}if(L(e,o,"[")){let a=F(e,o+2,"]");if(a!==-1){let s=e.slice(o+2,a),u=s.startsWith(`
5
+ `)?"":`
6
+ `,d=s.endsWith(`
7
+ `)?"":`
8
+ `;r+=`$$${u}${s}${d}$$`,o=a+2;continue}}}r+=e[o],o++}return r},J=function(){let r=this.parser||this.Parser;r&&(this.Parser=function(n,i){let l=n;if(typeof n=="string"){let c=te(n);l=c,i&&typeof i.value=="string"&&(i.value=c)}return r(l,i)},this.parser&&(this.parser=this.Parser))};var T=(e,r)=>{let{customTags:t=[],remarkPlugins:n=[],rehypePlugins:i=[],extendedGrammar:l=[],mathJaxConfig:c,supportsLaTeX:o=!1}=r,a=new Set(l),s=ne().use(oe);if(a.has("gfm")&&(s=s.use(se)),a.has("mathjax")&&(o&&(s=s.use(J)),s=s.use(le)),n.length>0&&(s=s.use(n)),s=s.use(ie,{allowDangerousHtml:!0}).use(me).use(_,t).use(ce,x(t)),a.has("mathjax")){let u=c??U;s=s.use(ue,u)}return i.length>0&&(s=s.use(i)),e==="html"?s.use(ae,{allowDangerousHtml:!0}):s};var S=class{constructor(r={}){this.options=r}async parseToHTML(r){let n=await T("html",this.options).process(r);return String(n)}async parseToHAST(r){let t=T("hast",this.options),n=t.parse(r);return await t.run(n)}async batchParseToHTML(r){let t=T("html",this.options);return Promise.all(r.map(async n=>{let i=await t.process(n);return String(i)}))}async batchParseToHAST(r){let t=T("hast",this.options);return Promise.all(r.map(async n=>{let i=t.parse(n);return await t.run(i)}))}};function fe(e={}){return new S(e)}import{wrap as pe}from"comlink";function N(){return typeof window<"u"&&typeof window.document<"u"?"browser":typeof process<"u"&&process.versions?.node?"node":"unknown"}function X(){let e=N();if(e==="browser"){let t=(typeof navigator<"u"?navigator:null)?.hardwareConcurrency||4;return Math.min(t,8)}if(e==="node")try{let t=I("os").cpus()?.length||4;return Math.min(t,8)}catch{return 4}return 4}function he(){let e=N();if(e==="browser")return new Worker(new URL("./modules/parser.worker.mjs",import.meta.url),{type:"module"});if(e==="node")try{let{Worker:r}=I("worker_threads");return new r(new URL("./modules/parser.worker.mjs",import.meta.url))}catch{throw new Error("Worker threads are not supported in this Node.js environment. Please use Node.js 12+ or use the single-threaded parser instead.")}throw new Error("Unsupported environment for worker pool")}var C=class{constructor(r={}){this.workers=[];this.initialized=!1;this.initPromise=null;this.pending=[];this.options=r;let t=X();this.workerCount=r.workerCount?Math.min(Math.max(1,r.workerCount),t):t,this.init()}async init(){if(!this.initialized){if(this.initPromise){await this.initPromise;return}this.initPromise=(async()=>{let r=Array.from({length:this.workerCount},()=>(async()=>{let t=he(),n=pe(t),i={...this.options};delete i.workerCount;let l=await new n(i);return{worker:t,proxy:l,busy:!1}})());this.workers=await Promise.all(r),this.initialized=!0})();try{await this.initPromise}finally{this.initPromise=null}}}async getAvailableWorker(){await this.init();let r=this.workers.find(t=>!t.busy);return r?(r.busy=!0,r):await new Promise(t=>{this.pending.push(n=>{n.busy=!0,t(n)})})}releaseWorker(r){let t=this.pending.shift();if(t){t(r);return}r.busy=!1}async parseToHTML(r){let t=await this.getAvailableWorker();try{return await t.proxy.parseToHTML(r)}finally{this.releaseWorker(t)}}async parseToHAST(r){let t=await this.getAvailableWorker();try{return await t.proxy.parseToHAST(r)}finally{this.releaseWorker(t)}}async batchParseToHTML(r){return await this.init(),Promise.all(r.map(t=>this.parseToHTML(t)))}async batchParseToHAST(r){return await this.init(),Promise.all(r.map(t=>this.parseToHAST(t)))}async updateOptions(r){await this.init(),this.options={...this.options,...r};let t={...this.options};delete t.workerCount,await Promise.all(this.workers.map(n=>n.proxy.updateOptions(t)))}async destroy(){if(this.initialized){for(let{worker:r}of this.workers)r.terminate();this.workers=[],this.initialized=!1}}getPoolInfo(){return{workerCount:this.workerCount,activeWorkers:this.workers.length,busyWorkers:this.workers.filter(r=>r.busy).length,maxWorkers:X(),environment:N(),initialized:this.initialized}}};function de(e={}){return new C(e)}export{S as Parser,C as ParserWorkerPool,fe as createParser,de as createWorkerPool};
9
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL21vZHVsZXMvY29yZS50cyIsICIuLi9zcmMvdXRpbHMvY3JlYXRlU2FuaXRpemVTY2hlbWEudHMiLCAiLi4vc3JjL2NvbnN0cy90YWdGaWx0ZXIudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtaXNANi4wLjEvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtaXMvbGliL2luZGV4LmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXZpc2l0LXBhcmVudHNANi4wLjIvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cy9saWIvY29sb3Iubm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzQDYuMC4yL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0LXBhcmVudHMvbGliL2luZGV4LmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXZpc2l0QDUuMC4wL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0L2xpYi9pbmRleC5qcyIsICIuLi9zcmMvcGx1Z2luL3JlaHlwZUNvbnZlcnRBYm5vcm1hbFRhZ3NUb1RleHQudHMiLCAiLi4vc3JjL2NvbnN0cy9tYXRoamF4ZGVmYXVsdENvbmZpZy50cyIsICIuLi9zcmMvcGx1Z2luL3JlbWFya01hdGhEZWxpbWl0ZXJzLnRzIiwgIi4uL3NyYy9tb2R1bGVzL3BhcnNlci50cyIsICIuLi9zcmMvbW9kdWxlcy9wYXJzZXIud29ya2VyUG9vbC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgRXh0ZW5kc1Byb3BzLCBSZW5kZXJUeXBlIH0gZnJvbSAnLi4vdHlwZXMvcHJvcHMnO1xuaW1wb3J0IHsgUGx1Z2dhYmxlTGlzdCwgUHJvY2Vzc29yLCB1bmlmaWVkIH0gZnJvbSAndW5pZmllZCc7XG5pbXBvcnQgeyBSb290IH0gZnJvbSAnaGFzdCc7XG5pbXBvcnQgcmVtYXJrUGFyc2UgZnJvbSAncmVtYXJrLXBhcnNlJztcbmltcG9ydCByZW1hcmtHZm0gZnJvbSAncmVtYXJrLWdmbSc7XG5pbXBvcnQgcmVtYXJrUmVoeXBlIGZyb20gJ3JlbWFyay1yZWh5cGUnO1xuaW1wb3J0IHJlaHlwZVN0cmluZ2lmeSBmcm9tICdyZWh5cGUtc3RyaW5naWZ5JztcbmltcG9ydCByZW1hcmtNYXRoIGZyb20gJ3JlbWFyay1tYXRoJztcbmltcG9ydCByZWh5cGVTYW5pdGl6ZSBmcm9tICdyZWh5cGUtc2FuaXRpemUnO1xuaW1wb3J0IHJlaHlwZVJhdyBmcm9tICdyZWh5cGUtcmF3JztcbmltcG9ydCB7IGNyZWF0ZVNhbml0aXplU2NoZW1hIH0gZnJvbSAnLi4vdXRpbHMvY3JlYXRlU2FuaXRpemVTY2hlbWEnO1xuaW1wb3J0IHsgcmVoeXBlQ29udmVydEFibm9ybWFsVGFnc1RvVGV4dCB9IGZyb20gJy4uL3BsdWdpbi9yZWh5cGVDb252ZXJ0QWJub3JtYWxUYWdzVG9UZXh0JztcbmltcG9ydCByZWh5cGVNYXRoSmF4Q2h0bWwgZnJvbSAncmVoeXBlLW1hdGhqYXgvY2h0bWwnO1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zIGFzIE1hdGhKYXhPcHRpb25zIH0gZnJvbSAncmVoeXBlLW1hdGhqYXgvY2h0bWwnO1xuaW1wb3J0IHsgREVGQVVMVF9NQVRISkFYX0NPTkZJRyB9IGZyb20gJy4uL2NvbnN0cy9tYXRoamF4ZGVmYXVsdENvbmZpZyc7XG5pbXBvcnQgeyByZW1hcmtNYXRoRGVsaW1pdGVycyB9IGZyb20gJy4uL3BsdWdpbi9yZW1hcmtNYXRoRGVsaW1pdGVycyc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxudHlwZSBBbnlQcm9jZXNzb3IgPSBQcm9jZXNzb3I8YW55LCBhbnksIGFueSwgYW55LCBhbnk+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlclByb3BzIHtcbiAgY3VzdG9tVGFncz86IHN0cmluZ1tdO1xuICBleHRlbmRlZEdyYW1tYXI/OiBFeHRlbmRzUHJvcHNbXTtcbiAgLyoqXG4gICAqIFJlbWFyayBwbHVnaW5zIGFwcGVuZGVkIGJlZm9yZSBgcmVtYXJrUmVoeXBlYCAocHJvY2VzcyBNYXJrZG93biBBU1QpXG4gICAqL1xuICByZW1hcmtQbHVnaW5zPzogUGx1Z2dhYmxlTGlzdDtcbiAgLyoqXG4gICAqIFJlaHlwZSBwbHVnaW5zIGFwcGVuZGVkIGFmdGVyIGByZWh5cGVSYXcvcmVoeXBlU2FuaXRpemVgIChwcm9jZXNzIEhUTUwgQVNUKVxuICAgKi9cbiAgcmVoeXBlUGx1Z2lucz86IFBsdWdnYWJsZUxpc3Q7XG4gIC8qKlxuICAgKiBNYXRoSmF4IGNvbmZpZyBvcHRpb25zIChvbmx5IGVmZmVjdGl2ZSB3aGVuIGV4dGVuZGVkR3JhbW1hciBpbmNsdWRlcyAnbWF0aGpheCcpXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1hdGhqYXgub3JnL2VuL2xhdGVzdC9vcHRpb25zL2luZGV4Lmh0bWxcbiAgICovXG4gIG1hdGhKYXhDb25maWc/OiBNYXRoSmF4T3B0aW9ucztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3VwcG9ydCBMYVRlWCBzeW50YXggKHVzaW5nIFxcXFwoIGFuZCBcXFxcWyBhcyBtYXRoIGRlbGltaXRlcnMpXG4gICAqIFdoZW4gdHJ1ZSwgZW5hYmxlcyByZW1hcmtNYXRoRGVsaW1pdGVycyB0byBwYXJzZSBMYVRlWCBzeW50YXhcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHN1cHBvcnRzTGFUZVg/OiBib29sZWFuO1xufVxuZXhwb3J0IGNvbnN0IGdldFBhcnNlciA9IDxUIGV4dGVuZHMgUmVuZGVyVHlwZT4oXG4gIHRhcmdldDogVCxcbiAgb3B0aW9uOiBSZW5kZXJQcm9wc1xuKTogVCBleHRlbmRzICdodG1sJ1xuICA/IFByb2Nlc3NvcjxSb290LCBSb290LCBSb290LCBSb290LCBzdHJpbmc+XG4gIDogUHJvY2Vzc29yPFJvb3QsIFJvb3QsIFJvb3QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkPiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjdXN0b21UYWdzID0gW10sXG4gICAgcmVtYXJrUGx1Z2lucyA9IFtdLFxuICAgIHJlaHlwZVBsdWdpbnMgPSBbXSxcbiAgICBleHRlbmRlZEdyYW1tYXIgPSBbXSxcbiAgICBtYXRoSmF4Q29uZmlnLFxuICAgIHN1cHBvcnRzTGFUZVggPSBmYWxzZSxcbiAgfSA9IG9wdGlvbjtcbiAgY29uc3QgZXh0ZW5kZWRHcmFtbWFyU2V0ID0gbmV3IFNldChleHRlbmRlZEdyYW1tYXIpO1xuICBsZXQgcGFyc2VyOiBBbnlQcm9jZXNzb3IgPSB1bmlmaWVkKCkudXNlKHJlbWFya1BhcnNlKSBhcyBBbnlQcm9jZXNzb3I7XG4gIGlmIChleHRlbmRlZEdyYW1tYXJTZXQuaGFzKCdnZm0nKSkgcGFyc2VyID0gcGFyc2VyLnVzZShyZW1hcmtHZm0pO1xuICBpZiAoZXh0ZW5kZWRHcmFtbWFyU2V0LmhhcygnbWF0aGpheCcpKSB7XG4gICAgaWYgKHN1cHBvcnRzTGFUZVgpIHtcbiAgICAgIHBhcnNlciA9IHBhcnNlci51c2UocmVtYXJrTWF0aERlbGltaXRlcnMpO1xuICAgIH1cbiAgICBwYXJzZXIgPSBwYXJzZXIudXNlKHJlbWFya01hdGgpO1xuICB9XG5cbiAgLy8gQXBwZW5kIHJlbWFyayBwbHVnaW5zIGJlZm9yZSByZW1hcmtSZWh5cGVcbiAgaWYgKHJlbWFya1BsdWdpbnMubGVuZ3RoID4gMCkge1xuICAgIHBhcnNlciA9IHBhcnNlci51c2UocmVtYXJrUGx1Z2lucyk7XG4gIH1cblxuICBwYXJzZXIgPSBwYXJzZXJcbiAgICAudXNlKHJlbWFya1JlaHlwZSwgeyBhbGxvd0Rhbmdlcm91c0h0bWw6IHRydWUgfSlcbiAgICAudXNlKHJlaHlwZVJhdylcbiAgICAudXNlKHJlaHlwZUNvbnZlcnRBYm5vcm1hbFRhZ3NUb1RleHQsIGN1c3RvbVRhZ3MpXG4gICAgLnVzZShyZWh5cGVTYW5pdGl6ZSwgY3JlYXRlU2FuaXRpemVTY2hlbWEoY3VzdG9tVGFncykpO1xuXG4gIGlmIChleHRlbmRlZEdyYW1tYXJTZXQuaGFzKCdtYXRoamF4JykpIHtcbiAgICBjb25zdCBtZXJnZWRDb25maWc6IE1hdGhKYXhPcHRpb25zID0gbWF0aEpheENvbmZpZyA/PyBERUZBVUxUX01BVEhKQVhfQ09ORklHO1xuICAgIHBhcnNlciA9IHBhcnNlci51c2UocmVoeXBlTWF0aEpheENodG1sLCBtZXJnZWRDb25maWcpO1xuICB9XG5cbiAgLy8gQXBwZW5kIHJlaHlwZSBwbHVnaW5zIGFmdGVyIHJlaHlwZVJhdy9yZWh5cGVTYW5pdGl6ZVxuICBpZiAocmVoeXBlUGx1Z2lucy5sZW5ndGggPiAwKSB7XG4gICAgcGFyc2VyID0gcGFyc2VyLnVzZShyZWh5cGVQbHVnaW5zKTtcbiAgfVxuXG4gIGlmICh0YXJnZXQgPT09ICdodG1sJykge1xuICAgIHJldHVybiBwYXJzZXIudXNlKHJlaHlwZVN0cmluZ2lmeSwge1xuICAgICAgYWxsb3dEYW5nZXJvdXNIdG1sOiB0cnVlLFxuICAgIH0pIGFzIFQgZXh0ZW5kcyAnaHRtbCdcbiAgICAgID8gUHJvY2Vzc29yPFJvb3QsIFJvb3QsIFJvb3QsIFJvb3QsIHN0cmluZz5cbiAgICAgIDogUHJvY2Vzc29yPFJvb3QsIFJvb3QsIFJvb3QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkPjtcbiAgfVxuICByZXR1cm4gcGFyc2VyIGFzIFQgZXh0ZW5kcyAnaHRtbCdcbiAgICA/IFByb2Nlc3NvcjxSb290LCBSb290LCBSb290LCBSb290LCBzdHJpbmc+XG4gICAgOiBQcm9jZXNzb3I8Um9vdCwgUm9vdCwgUm9vdCwgdW5kZWZpbmVkLCB1bmRlZmluZWQ+O1xufTtcbiIsICIvLyBDcmVhdGUgc2FuaXRpemUgc2NoZW1hXG5pbXBvcnQgeyBkZWZhdWx0U2NoZW1hIH0gZnJvbSAncmVoeXBlLXNhbml0aXplJztcbmltcG9ydCB7IE1BVEhNTF9BVFRSSUJVVEVTLCBNQVRITUxfVEFHX05BTUVTIH0gZnJvbSAnLi4vY29uc3RzL3RhZ0ZpbHRlcic7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVTYW5pdGl6ZVNjaGVtYSA9IChjdXN0b21UYWdzOiBzdHJpbmdbXSA9IFtdKTogdHlwZW9mIGRlZmF1bHRTY2hlbWEgPT4gKHtcbiAgLi4uZGVmYXVsdFNjaGVtYSxcbiAgdGFnTmFtZXM6IFsuLi4oZGVmYXVsdFNjaGVtYS50YWdOYW1lcyB8fCBbXSksIC4uLk1BVEhNTF9UQUdfTkFNRVMsIC4uLmN1c3RvbVRhZ3NdLFxuICBhdHRyaWJ1dGVzOiB7XG4gICAgLi4uZGVmYXVsdFNjaGVtYS5hdHRyaWJ1dGVzLFxuXG4gICAgLy8gQWxsb3cgc3JjIGF0dHJpYnV0ZSBmb3IgaW1nIHRhZ3Mgd2l0aCBmaWxlOi8vIHByb3RvY29sIGFuZCBvdGhlciBwcm90b2NvbHNcbiAgICBpbWc6IFsnc3JjJywgJ2FsdCcsICd0aXRsZScsICd3aWR0aCcsICdoZWlnaHQnLCAnc3R5bGUnLCAnY2xhc3MnXSxcbiAgICAvLyBUaGUgYGxhbmd1YWdlLSpgIHJlZ2V4IGlzIGFsbG93ZWQgYnkgZGVmYXVsdC5cbiAgICBjb2RlOiBbWydjbGFzc05hbWUnLCAvXmxhbmd1YWdlLS4vLCAnbWF0aC1pbmxpbmUnLCAnbWF0aC1kaXNwbGF5J11dLFxuICAgIC4uLk1BVEhNTF9BVFRSSUJVVEVTLFxuICAgIC8vIEFkZCBiYXNpYyBhdHRyaWJ1dGVzIGZvciBjdXN0b20gdGFnc1xuICAgIC4uLmN1c3RvbVRhZ3MucmVkdWNlKFxuICAgICAgKGFjYywgdGFnKSA9PiB7XG4gICAgICAgIGFjY1t0YWddID0gWydjbGFzcycsICdjbGFzc05hbWUnLCAnc3R5bGUnLCAnaWQnLCAncHJvcCcsICdzcmMnXTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sXG4gICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT5cbiAgICApLFxuICB9LFxuICBwcm90b2NvbHM6IHtcbiAgICAuLi5kZWZhdWx0U2NoZW1hLnByb3RvY29scyxcbiAgICBzcmM6IFsnaHR0cCcsICdodHRwcycsICdkYXRhJywgJ2ZpbGUnXSxcbiAgfSxcbn0pO1xuIiwgImV4cG9ydCBjb25zdCBNQVRITUxfVEFHX05BTUVTOiBzdHJpbmdbXSA9IFtcbiAgJ21hdGgnLFxuICAnbXJvdycsXG4gICdtaScsXG4gICdtbicsXG4gICdtbycsXG4gICdtZnJhYycsXG4gICdtc3VwJyxcbiAgJ21zdWInLFxuICAnbXVuZGVyJyxcbiAgJ21vdmVyJyxcbiAgJ211bmRlcm92ZXInLFxuICAnbXNxcnQnLFxuICAnbXJvb3QnLFxuICAnbXRleHQnLFxuICAnbXNwYWNlJyxcbiAgJ21lbmNsb3NlJyxcbiAgJ21wYWRkZWQnLFxuICAnbXBoYW50b20nLFxuICAnbXRhYmxlJyxcbiAgJ210cicsXG4gICdtdGQnLFxuICAnbWxhYmVsZWR0cicsXG4gICdtYWxpZ25ncm91cCcsXG4gICdtYWxpZ25tYXJrJyxcbiAgJ21zdHlsZScsXG4gICdtZXJyb3InLFxuICAnbWFjdGlvbicsXG4gICdzZW1hbnRpY3MnLFxuICAnYW5ub3RhdGlvbicsXG4gICdhbm5vdGF0aW9uLXhtbCcsXG5dIGFzIGNvbnN0O1xuXG4vLyBNYXRoTUwgYXR0cmlidXRlIGNvbmZpZ3VyYXRpb25cbmV4cG9ydCBjb25zdCBNQVRITUxfQVRUUklCVVRFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge1xuICBtYXRoOiBbJ2Rpc3BsYXknLCAnY2xhc3MnLCAnc3R5bGUnLCAneG1sbnMnXSxcbiAgbXJvdzogWydjbGFzcycsICdzdHlsZSddLFxuICBtaTogWydjbGFzcycsICdzdHlsZScsICdtYXRodmFyaWFudCddLFxuICBtbjogWydjbGFzcycsICdzdHlsZSddLFxuICBtbzogW1xuICAgICdjbGFzcycsXG4gICAgJ3N0eWxlJyxcbiAgICAnZmVuY2UnLFxuICAgICdzZXBhcmF0b3InLFxuICAgICdzdHJldGNoeScsXG4gICAgJ3N5bW1ldHJpYycsXG4gICAgJ2xhcmdlb3AnLFxuICAgICdtb3ZhYmxlbGltaXRzJyxcbiAgICAnYWNjZW50JyxcbiAgICAnbHNwYWNlJyxcbiAgICAncnNwYWNlJyxcbiAgICAnZm9ybScsXG4gIF0sXG4gIG1mcmFjOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ2xpbmV0aGlja25lc3MnLCAnbnVtYWxpZ24nLCAnZGVub21hbGlnbicsICdiZXZlbGxlZCddLFxuICBtc3VwOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3N1cGVyc2NyaXB0c2hpZnQnXSxcbiAgbXN1YjogWydjbGFzcycsICdzdHlsZScsICdzdWJzY3JpcHRzaGlmdCddLFxuICBtdW5kZXI6IFsnY2xhc3MnLCAnc3R5bGUnLCAnYWNjZW50dW5kZXInXSxcbiAgbW92ZXI6IFsnY2xhc3MnLCAnc3R5bGUnLCAnYWNjZW50J10sXG4gIG11bmRlcm92ZXI6IFsnY2xhc3MnLCAnc3R5bGUnLCAnYWNjZW50JywgJ2FjY2VudHVuZGVyJ10sXG4gIG1zcXJ0OiBbJ2NsYXNzJywgJ3N0eWxlJ10sXG4gIG1yb290OiBbJ2NsYXNzJywgJ3N0eWxlJ10sXG4gIG10ZXh0OiBbJ2NsYXNzJywgJ3N0eWxlJywgJ21hdGh2YXJpYW50J10sXG4gIG1zcGFjZTogWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnLCAnZGVwdGgnXSxcbiAgbWVuY2xvc2U6IFsnY2xhc3MnLCAnc3R5bGUnLCAnbm90YXRpb24nXSxcbiAgbXBhZGRlZDogWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnLCAnZGVwdGgnLCAnbHNwYWNlJywgJ3ZvZmZzZXQnXSxcbiAgbXBoYW50b206IFsnY2xhc3MnLCAnc3R5bGUnXSxcbiAgbXRhYmxlOiBbXG4gICAgJ2NsYXNzJyxcbiAgICAnc3R5bGUnLFxuICAgICdhbGlnbicsXG4gICAgJ3Jvd2FsaWduJyxcbiAgICAnY29sdW1uYWxpZ24nLFxuICAgICdncm91cGFsaWduJyxcbiAgICAnYWxpZ25tZW50c2NvcGUnLFxuICAgICdjb2x1bW53aWR0aCcsXG4gICAgJ3dpZHRoJyxcbiAgICAncm93c3BhY2luZycsXG4gICAgJ2NvbHVtbnNwYWNpbmcnLFxuICAgICdyb3dsaW5lcycsXG4gICAgJ2NvbHVtbmxpbmVzJyxcbiAgICAnZnJhbWUnLFxuICAgICdmcmFtZXNwYWNpbmcnLFxuICAgICdlcXVhbHJvd3MnLFxuICAgICdlcXVhbGNvbHVtbnMnLFxuICAgICdkaXNwbGF5c3R5bGUnLFxuICAgICdzaWRlJyxcbiAgICAnbWlubGFiZWxzcGFjaW5nJyxcbiAgXSxcbiAgbXRyOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3Jvd2FsaWduJywgJ2NvbHVtbmFsaWduJywgJ2dyb3VwYWxpZ24nXSxcbiAgbXRkOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3Jvd3NwYW4nLCAnY29sdW1uc3BhbicsICdyb3dhbGlnbicsICdjb2x1bW5hbGlnbicsICdncm91cGFsaWduJ10sXG4gIG1sYWJlbGVkdHI6IFsnY2xhc3MnLCAnc3R5bGUnLCAncm93YWxpZ24nLCAnY29sdW1uYWxpZ24nLCAnZ3JvdXBhbGlnbiddLFxuICBtYWxpZ25ncm91cDogWydjbGFzcycsICdzdHlsZScsICdncm91cGFsaWduJ10sXG4gIG1hbGlnbm1hcms6IFsnY2xhc3MnLCAnc3R5bGUnLCAnZWRnZSddLFxuICBtc3R5bGU6IFtcbiAgICAnY2xhc3MnLFxuICAgICdzdHlsZScsXG4gICAgJ3NjcmlwdGxldmVsJyxcbiAgICAnZGlzcGxheXN0eWxlJyxcbiAgICAnc2NyaXB0c2l6ZW11bHRpcGxpZXInLFxuICAgICdzY3JpcHRtaW5zaXplJyxcbiAgICAnaW5maXhsaW5lYnJlYWtzdHlsZScsXG4gICAgJ2RlY2ltYWxwb2ludCcsXG4gICAgJ21hdGh2YXJpYW50JyxcbiAgICAnbWF0aHNpemUnLFxuICAgICdtYXRoY29sb3InLFxuICAgICdtYXRoYmFja2dyb3VuZCcsXG4gIF0sXG4gIG1lcnJvcjogWydjbGFzcycsICdzdHlsZSddLFxuICBtYWN0aW9uOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ2FjdGlvbnR5cGUnLCAnc2VsZWN0aW9uJ10sXG4gIHNlbWFudGljczogWydjbGFzcycsICdzdHlsZSddLFxuICBhbm5vdGF0aW9uOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ2VuY29kaW5nJ10sXG4gICdhbm5vdGF0aW9uLXhtbCc6IFsnY2xhc3MnLCAnc3R5bGUnLCAnZW5jb2RpbmcnXSxcbn07XG4iLCAiLyoqXG4gKiBAaW1wb3J0IHtOb2RlLCBQYXJlbnR9IGZyb20gJ3VuaXN0J1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEZuXG4gKiBAdGVtcGxhdGUgRmFsbGJhY2tcbiAqIEB0eXBlZGVmIHtGbiBleHRlbmRzICh2YWx1ZTogYW55KSA9PiB2YWx1ZSBpcyBpbmZlciBUaGluZyA/IFRoaW5nIDogRmFsbGJhY2t9IFByZWRpY2F0ZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENoZWNrXG4gKiAgIENoZWNrIHRoYXQgYW4gYXJiaXRyYXJ5IHZhbHVlIGlzIGEgbm9kZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdGhpc1xuICogICBUaGUgZ2l2ZW4gY29udGV4dC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gW25vZGVdXG4gKiAgIEFueXRoaW5nICh0eXBpY2FsbHkgYSBub2RlKS5cbiAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gW2luZGV4XVxuICogICBUaGUgbm9kZVx1MjAxOXMgcG9zaXRpb24gaW4gaXRzIHBhcmVudC5cbiAqIEBwYXJhbSB7UGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZH0gW3BhcmVudF1cbiAqICAgVGhlIG5vZGVcdTIwMTlzIHBhcmVudC5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogICBXaGV0aGVyIHRoaXMgaXMgYSBub2RlIGFuZCBwYXNzZXMgYSB0ZXN0LlxuICpcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IE5vZGV9IFByb3BzXG4gKiAgIE9iamVjdCB0byBjaGVjayBmb3IgZXF1aXZhbGVuY2UuXG4gKlxuICogICBOb3RlOiBgTm9kZWAgaXMgaW5jbHVkZWQgYXMgaXQgaXMgY29tbW9uIGJ1dCBpcyBub3QgaW5kZXhhYmxlLlxuICpcbiAqIEB0eXBlZGVmIHtBcnJheTxQcm9wcyB8IFRlc3RGdW5jdGlvbiB8IHN0cmluZz4gfCBSZWFkb25seUFycmF5PFByb3BzIHwgVGVzdEZ1bmN0aW9uIHwgc3RyaW5nPiB8IFByb3BzIHwgVGVzdEZ1bmN0aW9uIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gVGVzdFxuICogICBDaGVjayBmb3IgYW4gYXJiaXRyYXJ5IG5vZGUuXG4gKlxuICogQGNhbGxiYWNrIFRlc3RGdW5jdGlvblxuICogICBDaGVjayBpZiBhIG5vZGUgcGFzc2VzIGEgdGVzdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdGhpc1xuICogICBUaGUgZ2l2ZW4gY29udGV4dC5cbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICogICBBIG5vZGUuXG4gKiBAcGFyYW0ge251bWJlciB8IHVuZGVmaW5lZH0gW2luZGV4XVxuICogICBUaGUgbm9kZVx1MjAxOXMgcG9zaXRpb24gaW4gaXRzIHBhcmVudC5cbiAqIEBwYXJhbSB7UGFyZW50IHwgdW5kZWZpbmVkfSBbcGFyZW50XVxuICogICBUaGUgbm9kZVx1MjAxOXMgcGFyZW50LlxuICogQHJldHVybnMge2Jvb2xlYW4gfCB1bmRlZmluZWQgfCB2b2lkfVxuICogICBXaGV0aGVyIHRoaXMgbm9kZSBwYXNzZXMgdGhlIHRlc3QuXG4gKlxuICogICBOb3RlOiBgdm9pZGAgaXMgaW5jbHVkZWQgdW50aWwgVFMgc2VlcyBubyByZXR1cm4gYXMgYHVuZGVmaW5lZGAuXG4gKi9cblxuLyoqXG4gKiBDaGVjayBpZiBgbm9kZWAgaXMgYSBgTm9kZWAgYW5kIHdoZXRoZXIgaXQgcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gbm9kZVxuICogICBUaGluZyB0byBjaGVjaywgdHlwaWNhbGx5IGBOb2RlYC5cbiAqIEBwYXJhbSB7VGVzdH0gdGVzdFxuICogICBBIGNoZWNrIGZvciBhIHNwZWNpZmljIG5vZGUuXG4gKiBAcGFyYW0ge251bWJlciB8IG51bGwgfCB1bmRlZmluZWR9IGluZGV4XG4gKiAgIFRoZSBub2RlXHUyMDE5cyBwb3NpdGlvbiBpbiBpdHMgcGFyZW50LlxuICogQHBhcmFtIHtQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkfSBwYXJlbnRcbiAqICAgVGhlIG5vZGVcdTIwMTlzIHBhcmVudC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gY29udGV4dFxuICogICBDb250ZXh0IG9iamVjdCAoYHRoaXNgKSB0byBwYXNzIHRvIGB0ZXN0YCBmdW5jdGlvbnMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqICAgV2hldGhlciBgbm9kZWAgaXMgYSBub2RlIGFuZCBwYXNzZXMgYSB0ZXN0LlxuICovXG5leHBvcnQgY29uc3QgaXMgPVxuICAvLyBOb3RlOiBvdmVybG9hZHMgaW4gSlNEb2MgY2FuXHUyMDE5dCB5ZXQgdXNlIGRpZmZlcmVudCBgQHRlbXBsYXRlYHMuXG4gIC8qKlxuICAgKiBAdHlwZSB7KFxuICAgKiAgICg8Q29uZGl0aW9uIGV4dGVuZHMgUmVhZG9ubHlBcnJheTxzdHJpbmc+Pihub2RlOiB1bmtub3duLCB0ZXN0OiBDb25kaXRpb24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSAmIHt0eXBlOiBDb25kaXRpb25bbnVtYmVyXX0pICZcbiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIEFycmF5PHN0cmluZz4+KG5vZGU6IHVua25vd24sIHRlc3Q6IENvbmRpdGlvbiwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYge3R5cGU6IENvbmRpdGlvbltudW1iZXJdfSkgJlxuICAgKiAgICg8Q29uZGl0aW9uIGV4dGVuZHMgc3RyaW5nPihub2RlOiB1bmtub3duLCB0ZXN0OiBDb25kaXRpb24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSAmIHt0eXBlOiBDb25kaXRpb259KSAmXG4gICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBQcm9wcz4obm9kZTogdW5rbm93biwgdGVzdDogQ29uZGl0aW9uLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiBDb25kaXRpb24pICZcbiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIFRlc3RGdW5jdGlvbj4obm9kZTogdW5rbm93biwgdGVzdDogQ29uZGl0aW9uLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiBQcmVkaWNhdGU8Q29uZGl0aW9uLCBOb2RlPikgJlxuICAgKiAgICgobm9kZT86IG51bGwgfCB1bmRlZmluZWQpID0+IGZhbHNlKSAmXG4gICAqICAgKChub2RlOiB1bmtub3duLCB0ZXN0PzogbnVsbCB8IHVuZGVmaW5lZCwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlKSAmXG4gICAqICAgKChub2RlOiB1bmtub3duLCB0ZXN0PzogVGVzdCwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gYm9vbGVhbilcbiAgICogKX1cbiAgICovXG4gIChcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3Vua25vd259IFtub2RlXVxuICAgICAqIEBwYXJhbSB7VGVzdH0gW3Rlc3RdXG4gICAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBbaW5kZXhdXG4gICAgICogQHBhcmFtIHtQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkfSBbcGFyZW50XVxuICAgICAqIEBwYXJhbSB7dW5rbm93bn0gW2NvbnRleHRdXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcbiAgICBmdW5jdGlvbiAobm9kZSwgdGVzdCwgaW5kZXgsIHBhcmVudCwgY29udGV4dCkge1xuICAgICAgY29uc3QgY2hlY2sgPSBjb252ZXJ0KHRlc3QpXG5cbiAgICAgIGlmIChcbiAgICAgICAgaW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBpbmRleCAhPT0gbnVsbCAmJlxuICAgICAgICAodHlwZW9mIGluZGV4ICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgIGluZGV4IDwgMCB8fFxuICAgICAgICAgIGluZGV4ID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBwb3NpdGl2ZSBmaW5pdGUgaW5kZXgnKVxuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHBhcmVudCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHBhcmVudCAhPT0gbnVsbCAmJlxuICAgICAgICAoIWlzKHBhcmVudCkgfHwgIXBhcmVudC5jaGlsZHJlbilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHBhcmVudCBub2RlJylcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAocGFyZW50ID09PSB1bmRlZmluZWQgfHwgcGFyZW50ID09PSBudWxsKSAhPT1cbiAgICAgICAgKGluZGV4ID09PSB1bmRlZmluZWQgfHwgaW5kZXggPT09IG51bGwpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBib3RoIHBhcmVudCBhbmQgaW5kZXgnKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbG9va3NMaWtlQU5vZGUobm9kZSlcbiAgICAgICAgPyBjaGVjay5jYWxsKGNvbnRleHQsIG5vZGUsIGluZGV4LCBwYXJlbnQpXG4gICAgICAgIDogZmFsc2VcbiAgICB9XG4gIClcblxuLyoqXG4gKiBHZW5lcmF0ZSBhbiBhc3NlcnRpb24gZnJvbSBhIHRlc3QuXG4gKlxuICogVXNlZnVsIGlmIHlvdVx1MjAxOXJlIGdvaW5nIHRvIHRlc3QgbWFueSBub2RlcywgZm9yIGV4YW1wbGUgd2hlbiBjcmVhdGluZyBhXG4gKiB1dGlsaXR5IHdoZXJlIHNvbWV0aGluZyBlbHNlIHBhc3NlcyBhIGNvbXBhdGlibGUgdGVzdC5cbiAqXG4gKiBUaGUgY3JlYXRlZCBmdW5jdGlvbiBpcyBhIGJpdCBmYXN0ZXIgYmVjYXVzZSBpdCBleHBlY3RzIHZhbGlkIGlucHV0IG9ubHk6XG4gKiBhIGBub2RlYCwgYGluZGV4YCwgYW5kIGBwYXJlbnRgLlxuICpcbiAqIEBwYXJhbSB7VGVzdH0gdGVzdFxuICogICAqICAgd2hlbiBudWxsaXNoLCBjaGVja3MgaWYgYG5vZGVgIGlzIGEgYE5vZGVgLlxuICogICAqICAgd2hlbiBgc3RyaW5nYCwgd29ya3MgbGlrZSBwYXNzaW5nIGAobm9kZSkgPT4gbm9kZS50eXBlID09PSB0ZXN0YC5cbiAqICAgKiAgIHdoZW4gYGZ1bmN0aW9uYCBjaGVja3MgaWYgZnVuY3Rpb24gcGFzc2VkIHRoZSBub2RlIGlzIHRydWUuXG4gKiAgICogICB3aGVuIGBvYmplY3RgLCBjaGVja3MgdGhhdCBhbGwga2V5cyBpbiB0ZXN0IGFyZSBpbiBub2RlLCBhbmQgdGhhdCB0aGV5IGhhdmUgKHN0cmljdGx5KSBlcXVhbCB2YWx1ZXMuXG4gKiAgICogICB3aGVuIGBhcnJheWAsIGNoZWNrcyBpZiBhbnkgb25lIG9mIHRoZSBzdWJ0ZXN0cyBwYXNzLlxuICogQHJldHVybnMge0NoZWNrfVxuICogICBBbiBhc3NlcnRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0ID1cbiAgLy8gTm90ZTogb3ZlcmxvYWRzIGluIEpTRG9jIGNhblx1MjAxOXQgeWV0IHVzZSBkaWZmZXJlbnQgYEB0ZW1wbGF0ZWBzLlxuICAvKipcbiAgICogQHR5cGUgeyhcbiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIHN0cmluZz4odGVzdDogQ29uZGl0aW9uKSA9PiAobm9kZTogdW5rbm93biwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYge3R5cGU6IENvbmRpdGlvbn0pICZcbiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIFByb3BzPih0ZXN0OiBDb25kaXRpb24pID0+IChub2RlOiB1bmtub3duLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiBDb25kaXRpb24pICZcbiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIFRlc3RGdW5jdGlvbj4odGVzdDogQ29uZGl0aW9uKSA9PiAobm9kZTogdW5rbm93biwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYgUHJlZGljYXRlPENvbmRpdGlvbiwgTm9kZT4pICZcbiAgICogICAoKHRlc3Q/OiBudWxsIHwgdW5kZWZpbmVkKSA9PiAobm9kZT86IHVua25vd24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSkgJlxuICAgKiAgICgodGVzdD86IFRlc3QpID0+IENoZWNrKVxuICAgKiApfVxuICAgKi9cbiAgKFxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VGVzdH0gW3Rlc3RdXG4gICAgICogQHJldHVybnMge0NoZWNrfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgICBpZiAodGVzdCA9PT0gbnVsbCB8fCB0ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG9rXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdGVzdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gY2FzdEZhY3RvcnkodGVzdClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0ZXN0KVxuICAgICAgICAgID8gYW55RmFjdG9yeSh0ZXN0KVxuICAgICAgICAgIDogLy8gQ2FzdCBiZWNhdXNlIGBSZWFkb25seUFycmF5YCBnb2VzIGludG8gdGhlIGFib3ZlIGJ1dCBgaXNBcnJheWBcbiAgICAgICAgICAgIC8vIG5hcnJvd3MgdG8gYEFycmF5YC5cbiAgICAgICAgICAgIHByb3BlcnRpZXNGYWN0b3J5KC8qKiBAdHlwZSB7UHJvcHN9ICovICh0ZXN0KSlcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdHlwZUZhY3RvcnkodGVzdClcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBmdW5jdGlvbiwgc3RyaW5nLCBvciBvYmplY3QgYXMgdGVzdCcpXG4gICAgfVxuICApXG5cbi8qKlxuICogQHBhcmFtIHtBcnJheTxQcm9wcyB8IFRlc3RGdW5jdGlvbiB8IHN0cmluZz59IHRlc3RzXG4gKiBAcmV0dXJucyB7Q2hlY2t9XG4gKi9cbmZ1bmN0aW9uIGFueUZhY3RvcnkodGVzdHMpIHtcbiAgLyoqIEB0eXBlIHtBcnJheTxDaGVjaz59ICovXG4gIGNvbnN0IGNoZWNrcyA9IFtdXG4gIGxldCBpbmRleCA9IC0xXG5cbiAgd2hpbGUgKCsraW5kZXggPCB0ZXN0cy5sZW5ndGgpIHtcbiAgICBjaGVja3NbaW5kZXhdID0gY29udmVydCh0ZXN0c1tpbmRleF0pXG4gIH1cblxuICByZXR1cm4gY2FzdEZhY3RvcnkoYW55KVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dW5rbm93bn1cbiAgICogQHR5cGUge1Rlc3RGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGFueSguLi5wYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGluZGV4ID0gLTFcblxuICAgIHdoaWxlICgrK2luZGV4IDwgY2hlY2tzLmxlbmd0aCkge1xuICAgICAgaWYgKGNoZWNrc1tpbmRleF0uYXBwbHkodGhpcywgcGFyYW1ldGVycykpIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLyoqXG4gKiBUdXJuIGFuIG9iamVjdCBpbnRvIGEgdGVzdCBmb3IgYSBub2RlIHdpdGggYSBjZXJ0YWluIGZpZWxkcy5cbiAqXG4gKiBAcGFyYW0ge1Byb3BzfSBjaGVja1xuICogQHJldHVybnMge0NoZWNrfVxuICovXG5mdW5jdGlvbiBwcm9wZXJ0aWVzRmFjdG9yeShjaGVjaykge1xuICBjb25zdCBjaGVja0FzUmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKGNoZWNrKVxuXG4gIHJldHVybiBjYXN0RmFjdG9yeShhbGwpXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGFsbChub2RlKSB7XG4gICAgY29uc3Qgbm9kZUFzUmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKFxuICAgICAgLyoqIEB0eXBlIHt1bmtub3dufSAqLyAobm9kZSlcbiAgICApXG5cbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICBsZXQga2V5XG5cbiAgICBmb3IgKGtleSBpbiBjaGVjaykge1xuICAgICAgaWYgKG5vZGVBc1JlY29yZFtrZXldICE9PSBjaGVja0FzUmVjb3JkW2tleV0pIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cblxuLyoqXG4gKiBUdXJuIGEgc3RyaW5nIGludG8gYSB0ZXN0IGZvciBhIG5vZGUgd2l0aCBhIGNlcnRhaW4gdHlwZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hlY2tcbiAqIEByZXR1cm5zIHtDaGVja31cbiAqL1xuZnVuY3Rpb24gdHlwZUZhY3RvcnkoY2hlY2spIHtcbiAgcmV0dXJuIGNhc3RGYWN0b3J5KHR5cGUpXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKi9cbiAgZnVuY3Rpb24gdHlwZShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUgJiYgbm9kZS50eXBlID09PSBjaGVja1xuICB9XG59XG5cbi8qKlxuICogVHVybiBhIGN1c3RvbSB0ZXN0IGludG8gYSB0ZXN0IGZvciBhIG5vZGUgdGhhdCBwYXNzZXMgdGhhdCB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7VGVzdEZ1bmN0aW9ufSB0ZXN0RnVuY3Rpb25cbiAqIEByZXR1cm5zIHtDaGVja31cbiAqL1xuZnVuY3Rpb24gY2FzdEZhY3RvcnkodGVzdEZ1bmN0aW9uKSB7XG4gIHJldHVybiBjaGVja1xuXG4gIC8qKlxuICAgKiBAdGhpcyB7dW5rbm93bn1cbiAgICogQHR5cGUge0NoZWNrfVxuICAgKi9cbiAgZnVuY3Rpb24gY2hlY2sodmFsdWUsIGluZGV4LCBwYXJlbnQpIHtcbiAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgIGxvb2tzTGlrZUFOb2RlKHZhbHVlKSAmJlxuICAgICAgICB0ZXN0RnVuY3Rpb24uY2FsbChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIHR5cGVvZiBpbmRleCA9PT0gJ251bWJlcicgPyBpbmRleCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBwYXJlbnQgfHwgdW5kZWZpbmVkXG4gICAgICAgIClcbiAgICApXG4gIH1cbn1cblxuZnVuY3Rpb24gb2soKSB7XG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIE5vZGV9XG4gKi9cbmZ1bmN0aW9uIGxvb2tzTGlrZUFOb2RlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICd0eXBlJyBpbiB2YWx1ZVxufVxuIiwgIi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGRcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xvcihkKSB7XG4gIHJldHVybiAnXFx1MDAxQlszM20nICsgZCArICdcXHUwMDFCWzM5bSdcbn1cbiIsICIvKipcbiAqIEBpbXBvcnQge05vZGUgYXMgVW5pc3ROb2RlLCBQYXJlbnQgYXMgVW5pc3RQYXJlbnR9IGZyb20gJ3VuaXN0J1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0V4Y2x1ZGU8aW1wb3J0KCd1bmlzdC11dGlsLWlzJykuVGVzdCwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZH0gVGVzdFxuICogICBUZXN0IGZyb20gYHVuaXN0LXV0aWwtaXNgLlxuICpcbiAqICAgTm90ZTogd2UgaGF2ZSByZW1vdmUgYW5kIGFkZCBgdW5kZWZpbmVkYCwgYmVjYXVzZSBvdGhlcndpc2Ugd2hlbiBnZW5lcmF0aW5nXG4gKiAgIGF1dG9tYXRpYyBgLmQudHNgIGZpbGVzLCBUUyB0cmllcyB0byBmbGF0dGVuIHBhdGhzIGZyb20gYSBsb2NhbCBwZXJzcGVjdGl2ZSxcbiAqICAgd2hpY2ggZG9lc25cdTIwMTl0IHdvcmsgd2hlbiBwdWJsaXNoaW5nIG9uIG5wbS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIEZuIGV4dGVuZHMgKHZhbHVlOiBhbnkpID0+IHZhbHVlIGlzIGluZmVyIFRoaW5nXG4gKiAgID8gVGhpbmdcbiAqICAgOiBGYWxsYmFja1xuICogKX0gUHJlZGljYXRlXG4gKiAgIEdldCB0aGUgdmFsdWUgb2YgYSB0eXBlIGd1YXJkIGBGbmAuXG4gKiBAdGVtcGxhdGUgRm5cbiAqICAgVmFsdWU7IHR5cGljYWxseSBmdW5jdGlvbiB0aGF0IGlzIGEgdHlwZSBndWFyZCAoc3VjaCBhcyBgKHgpOiB4IGlzIFlgKS5cbiAqIEB0ZW1wbGF0ZSBGYWxsYmFja1xuICogICBWYWx1ZSB0byB5aWVsZCBpZiBgRm5gIGlzIG5vdCBhIHR5cGUgZ3VhcmQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBDaGVjayBleHRlbmRzIG51bGwgfCB1bmRlZmluZWQgLy8gTm8gdGVzdC5cbiAqICAgPyBWYWx1ZVxuICogICA6IFZhbHVlIGV4dGVuZHMge3R5cGU6IENoZWNrfSAvLyBTdHJpbmcgKHR5cGUpIHRlc3QuXG4gKiAgID8gVmFsdWVcbiAqICAgOiBWYWx1ZSBleHRlbmRzIENoZWNrIC8vIFBhcnRpYWwgdGVzdC5cbiAqICAgPyBWYWx1ZVxuICogICA6IENoZWNrIGV4dGVuZHMgRnVuY3Rpb24gLy8gRnVuY3Rpb24gdGVzdC5cbiAqICAgPyBQcmVkaWNhdGU8Q2hlY2ssIFZhbHVlPiBleHRlbmRzIFZhbHVlXG4gKiAgICAgPyBQcmVkaWNhdGU8Q2hlY2ssIFZhbHVlPlxuICogICAgIDogbmV2ZXJcbiAqICAgOiBuZXZlciAvLyBTb21lIG90aGVyIHRlc3Q/XG4gKiApfSBNYXRjaGVzT25lXG4gKiAgIENoZWNrIHdoZXRoZXIgYSBub2RlIG1hdGNoZXMgYSBwcmltaXRpdmUgY2hlY2sgaW4gdGhlIHR5cGUgc3lzdGVtLlxuICogQHRlbXBsYXRlIFZhbHVlXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgdW5pc3QgYE5vZGVgLlxuICogQHRlbXBsYXRlIENoZWNrXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgYHVuaXN0LXV0aWwtaXNgLWNvbXBhdGlibGUgdGVzdCwgYnV0IG5vdCBhcnJheXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBDaGVjayBleHRlbmRzIFJlYWRvbmx5QXJyYXk8aW5mZXIgVD5cbiAqICAgPyBNYXRjaGVzT25lPFZhbHVlLCBUPlxuICogICA6IENoZWNrIGV4dGVuZHMgQXJyYXk8aW5mZXIgVD5cbiAqICAgPyBNYXRjaGVzT25lPFZhbHVlLCBUPlxuICogICA6IE1hdGNoZXNPbmU8VmFsdWUsIENoZWNrPlxuICogKX0gTWF0Y2hlc1xuICogICBDaGVjayB3aGV0aGVyIGEgbm9kZSBtYXRjaGVzIGEgY2hlY2sgaW4gdGhlIHR5cGUgc3lzdGVtLlxuICogQHRlbXBsYXRlIFZhbHVlXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgdW5pc3QgYE5vZGVgLlxuICogQHRlbXBsYXRlIENoZWNrXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgYHVuaXN0LXV0aWwtaXNgLWNvbXBhdGlibGUgdGVzdC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHswIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB8IDggfCA5IHwgMTB9IFVpbnRcbiAqICAgTnVtYmVyOyBjYXBwZWQgcmVhc29uYWJseS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtJIGV4dGVuZHMgMCA/IDEgOiBJIGV4dGVuZHMgMSA/IDIgOiBJIGV4dGVuZHMgMiA/IDMgOiBJIGV4dGVuZHMgMyA/IDQgOiBJIGV4dGVuZHMgNCA/IDUgOiBJIGV4dGVuZHMgNSA/IDYgOiBJIGV4dGVuZHMgNiA/IDcgOiBJIGV4dGVuZHMgNyA/IDggOiBJIGV4dGVuZHMgOCA/IDkgOiAxMH0gSW5jcmVtZW50XG4gKiAgIEluY3JlbWVudCBhIG51bWJlciBpbiB0aGUgdHlwZSBzeXN0ZW0uXG4gKiBAdGVtcGxhdGUge1VpbnR9IFtJPTBdXG4gKiAgIEluZGV4LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgTm9kZSBleHRlbmRzIFVuaXN0UGFyZW50XG4gKiAgID8gTm9kZSBleHRlbmRzIHtjaGlsZHJlbjogQXJyYXk8aW5mZXIgQ2hpbGRyZW4+fVxuICogICAgID8gQ2hpbGQgZXh0ZW5kcyBDaGlsZHJlbiA/IE5vZGUgOiBuZXZlclxuICogICAgIDogbmV2ZXJcbiAqICAgOiBuZXZlclxuICogKX0gSW50ZXJuYWxQYXJlbnRcbiAqICAgQ29sbGVjdCBub2RlcyB0aGF0IGNhbiBiZSBwYXJlbnRzIG9mIGBDaGlsZGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gTm9kZVxuICogICBBbGwgbm9kZSB0eXBlcyBpbiBhIHRyZWUuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gQ2hpbGRcbiAqICAgTm9kZSB0byBzZWFyY2ggZm9yLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0ludGVybmFsUGFyZW50PEluY2x1c2l2ZURlc2NlbmRhbnQ8VHJlZT4sIENoaWxkPn0gUGFyZW50XG4gKiAgIENvbGxlY3Qgbm9kZXMgaW4gYFRyZWVgIHRoYXQgY2FuIGJlIHBhcmVudHMgb2YgYENoaWxkYC5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBUcmVlXG4gKiAgIEFsbCBub2RlIHR5cGVzIGluIGEgdHJlZS5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBDaGlsZFxuICogICBOb2RlIHRvIHNlYXJjaCBmb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBEZXB0aCBleHRlbmRzIE1heFxuICogICA/IG5ldmVyXG4gKiAgIDpcbiAqICAgICB8IEludGVybmFsUGFyZW50PE5vZGUsIENoaWxkPlxuICogICAgIHwgSW50ZXJuYWxBbmNlc3RvcjxOb2RlLCBJbnRlcm5hbFBhcmVudDxOb2RlLCBDaGlsZD4sIE1heCwgSW5jcmVtZW50PERlcHRoPj5cbiAqICl9IEludGVybmFsQW5jZXN0b3JcbiAqICAgQ29sbGVjdCBub2RlcyBpbiBgVHJlZWAgdGhhdCBjYW4gYmUgYW5jZXN0b3JzIG9mIGBDaGlsZGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gTm9kZVxuICogICBBbGwgbm9kZSB0eXBlcyBpbiBhIHRyZWUuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gQ2hpbGRcbiAqICAgTm9kZSB0byBzZWFyY2ggZm9yLlxuICogQHRlbXBsYXRlIHtVaW50fSBbTWF4PTEwXVxuICogICBNYXg7IHNlYXJjaGVzIHVwIHRvIHRoaXMgZGVwdGguXG4gKiBAdGVtcGxhdGUge1VpbnR9IFtEZXB0aD0wXVxuICogICBDdXJyZW50IGRlcHRoLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0ludGVybmFsQW5jZXN0b3I8SW5jbHVzaXZlRGVzY2VuZGFudDxUcmVlPiwgQ2hpbGQ+fSBBbmNlc3RvclxuICogICBDb2xsZWN0IG5vZGVzIGluIGBUcmVlYCB0aGF0IGNhbiBiZSBhbmNlc3RvcnMgb2YgYENoaWxkYC5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBUcmVlXG4gKiAgIEFsbCBub2RlIHR5cGVzIGluIGEgdHJlZS5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBDaGlsZFxuICogICBOb2RlIHRvIHNlYXJjaCBmb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBUcmVlIGV4dGVuZHMgVW5pc3RQYXJlbnRcbiAqICAgICA/IERlcHRoIGV4dGVuZHMgTWF4XG4gKiAgICAgICA/IFRyZWVcbiAqICAgICAgIDogVHJlZSB8IEluY2x1c2l2ZURlc2NlbmRhbnQ8VHJlZVsnY2hpbGRyZW4nXVtudW1iZXJdLCBNYXgsIEluY3JlbWVudDxEZXB0aD4+XG4gKiAgICAgOiBUcmVlXG4gKiApfSBJbmNsdXNpdmVEZXNjZW5kYW50XG4gKiAgIENvbGxlY3QgYWxsIChpbmNsdXNpdmUpIGRlc2NlbmRhbnRzIG9mIGBUcmVlYC5cbiAqXG4gKiAgID4gXHVEODNEXHVEQzQ5ICoqTm90ZSoqOiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhpcyBzZWVtcyB0byBiZSB0aGUgZmFzdGVzdCB3YXkgdG9cbiAqICAgPiByZWN1cnNlIHdpdGhvdXQgYWN0dWFsbHkgcnVubmluZyBpbnRvIGFuIGluZmluaXRlIGxvb3AsIHdoaWNoIHRoZVxuICogICA+IHByZXZpb3VzIHZlcnNpb24gZGlkLlxuICogICA+XG4gKiAgID4gUHJhY3RpY2FsbHksIGEgbWF4IG9mIGAyYCBpcyB0eXBpY2FsbHkgZW5vdWdoIGFzc3VtaW5nIGEgYFJvb3RgIGlzXG4gKiAgID4gcGFzc2VkLCBidXQgaXQgZG9lc25cdTIwMTl0IGltcHJvdmUgcGVyZm9ybWFuY2UuXG4gKiAgID4gSXQgZ2V0cyBoaWdoZXIgd2l0aCBgTGlzdCA+IExpc3RJdGVtID4gVGFibGUgPiBUYWJsZVJvdyA+IFRhYmxlQ2VsbGAuXG4gKiAgID4gVXNpbmcgdXAgdG8gYDEwYCBkb2Vzblx1MjAxOXQgaHVydCBvciBoZWxwIGVpdGhlci5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBUcmVlXG4gKiAgIFRyZWUgdHlwZS5cbiAqIEB0ZW1wbGF0ZSB7VWludH0gW01heD0xMF1cbiAqICAgTWF4OyBzZWFyY2hlcyB1cCB0byB0aGlzIGRlcHRoLlxuICogQHRlbXBsYXRlIHtVaW50fSBbRGVwdGg9MF1cbiAqICAgQ3VycmVudCBkZXB0aC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnc2tpcCcgfCBib29sZWFufSBBY3Rpb25cbiAqICAgVW5pb24gb2YgdGhlIGFjdGlvbiB0eXBlcy5cbiAqXG4gKiBAdHlwZWRlZiB7bnVtYmVyfSBJbmRleFxuICogICBNb3ZlIHRvIHRoZSBzaWJsaW5nIGF0IGBpbmRleGAgbmV4dCAoYWZ0ZXIgbm9kZSBpdHNlbGYgaXMgY29tcGxldGVseVxuICogICB0cmF2ZXJzZWQpLlxuICpcbiAqICAgVXNlZnVsIGlmIG11dGF0aW5nIHRoZSB0cmVlLCBzdWNoIGFzIHJlbW92aW5nIHRoZSBub2RlIHRoZSB2aXNpdG9yIGlzXG4gKiAgIGN1cnJlbnRseSBvbiwgb3IgYW55IG9mIGl0cyBwcmV2aW91cyBzaWJsaW5ncy5cbiAqICAgUmVzdWx0cyBsZXNzIHRoYW4gMCBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYGNoaWxkcmVuLmxlbmd0aGAgc3RvcFxuICogICB0cmF2ZXJzaW5nIHRoZSBwYXJlbnQuXG4gKlxuICogQHR5cGVkZWYge1soQWN0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCB8IHZvaWQpPywgKEluZGV4IHwgbnVsbCB8IHVuZGVmaW5lZCk/XX0gQWN0aW9uVHVwbGVcbiAqICAgTGlzdCB3aXRoIG9uZSBvciB0d28gdmFsdWVzLCB0aGUgZmlyc3QgYW4gYWN0aW9uLCB0aGUgc2Vjb25kIGFuIGluZGV4LlxuICpcbiAqIEB0eXBlZGVmIHtBY3Rpb24gfCBBY3Rpb25UdXBsZSB8IEluZGV4IHwgbnVsbCB8IHVuZGVmaW5lZCB8IHZvaWR9IFZpc2l0b3JSZXN1bHRcbiAqICAgQW55IHZhbHVlIHRoYXQgY2FuIGJlIHJldHVybmVkIGZyb20gYSB2aXNpdG9yLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFZpc2l0b3JcbiAqICAgSGFuZGxlIGEgbm9kZSAobWF0Y2hpbmcgYHRlc3RgLCBpZiBnaXZlbikuXG4gKlxuICogICBWaXNpdG9ycyBhcmUgZnJlZSB0byB0cmFuc2Zvcm0gYG5vZGVgLlxuICogICBUaGV5IGNhbiBhbHNvIHRyYW5zZm9ybSB0aGUgcGFyZW50IG9mIG5vZGUgKHRoZSBsYXN0IG9mIGBhbmNlc3RvcnNgKS5cbiAqXG4gKiAgIFJlcGxhY2luZyBgbm9kZWAgaXRzZWxmLCBpZiBgU0tJUGAgaXMgbm90IHJldHVybmVkLCBzdGlsbCBjYXVzZXMgaXRzXG4gKiAgIGRlc2NlbmRhbnRzIHRvIGJlIHdhbGtlZCAod2hpY2ggaXMgYSBidWcpLlxuICpcbiAqICAgV2hlbiBhZGRpbmcgb3IgcmVtb3ZpbmcgcHJldmlvdXMgc2libGluZ3Mgb2YgYG5vZGVgIChvciBuZXh0IHNpYmxpbmdzLCBpblxuICogICBjYXNlIG9mIHJldmVyc2UpLCB0aGUgYFZpc2l0b3JgIHNob3VsZCByZXR1cm4gYSBuZXcgYEluZGV4YCB0byBzcGVjaWZ5IHRoZVxuICogICBzaWJsaW5nIHRvIHRyYXZlcnNlIGFmdGVyIGBub2RlYCBpcyB0cmF2ZXJzZWQuXG4gKiAgIEFkZGluZyBvciByZW1vdmluZyBuZXh0IHNpYmxpbmdzIG9mIGBub2RlYCAob3IgcHJldmlvdXMgc2libGluZ3MsIGluIGNhc2VcbiAqICAgb2YgcmV2ZXJzZSkgaXMgaGFuZGxlZCBhcyBleHBlY3RlZCB3aXRob3V0IG5lZWRpbmcgdG8gcmV0dXJuIGEgbmV3IGBJbmRleGAuXG4gKlxuICogICBSZW1vdmluZyB0aGUgY2hpbGRyZW4gcHJvcGVydHkgb2YgYW4gYW5jZXN0b3Igc3RpbGwgcmVzdWx0cyBpbiB0aGVtIGJlaW5nXG4gKiAgIHRyYXZlcnNlZC5cbiAqIEBwYXJhbSB7VmlzaXRlZH0gbm9kZVxuICogICBGb3VuZCBub2RlLlxuICogQHBhcmFtIHtBcnJheTxWaXNpdGVkUGFyZW50cz59IGFuY2VzdG9yc1xuICogICBBbmNlc3RvcnMgb2YgYG5vZGVgLlxuICogQHJldHVybnMge1Zpc2l0b3JSZXN1bHR9XG4gKiAgIFdoYXQgdG8gZG8gbmV4dC5cbiAqXG4gKiAgIEFuIGBJbmRleGAgaXMgdHJlYXRlZCBhcyBhIHR1cGxlIG9mIGBbQ09OVElOVUUsIEluZGV4XWAuXG4gKiAgIEFuIGBBY3Rpb25gIGlzIHRyZWF0ZWQgYXMgYSB0dXBsZSBvZiBgW0FjdGlvbl1gLlxuICpcbiAqICAgUGFzc2luZyBhIHR1cGxlIGJhY2sgb25seSBtYWtlcyBzZW5zZSBpZiB0aGUgYEFjdGlvbmAgaXMgYFNLSVBgLlxuICogICBXaGVuIHRoZSBgQWN0aW9uYCBpcyBgRVhJVGAsIHRoYXQgYWN0aW9uIGNhbiBiZSByZXR1cm5lZC5cbiAqICAgV2hlbiB0aGUgYEFjdGlvbmAgaXMgYENPTlRJTlVFYCwgYEluZGV4YCBjYW4gYmUgcmV0dXJuZWQuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gW1Zpc2l0ZWQ9VW5pc3ROb2RlXVxuICogICBWaXNpdGVkIG5vZGUgdHlwZS5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3RQYXJlbnR9IFtWaXNpdGVkUGFyZW50cz1VbmlzdFBhcmVudF1cbiAqICAgQW5jZXN0b3IgdHlwZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtWaXNpdG9yPE1hdGNoZXM8SW5jbHVzaXZlRGVzY2VuZGFudDxUcmVlPiwgQ2hlY2s+LCBBbmNlc3RvcjxUcmVlLCBNYXRjaGVzPEluY2x1c2l2ZURlc2NlbmRhbnQ8VHJlZT4sIENoZWNrPj4+fSBCdWlsZFZpc2l0b3JcbiAqICAgQnVpbGQgYSB0eXBlZCBgVmlzaXRvcmAgZnVuY3Rpb24gZnJvbSBhIHRyZWUgYW5kIGEgdGVzdC5cbiAqXG4gKiAgIEl0IHdpbGwgaW5mZXIgd2hpY2ggdmFsdWVzIGFyZSBwYXNzZWQgYXMgYG5vZGVgIGFuZCB3aGljaCBhcyBgcGFyZW50c2AuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gW1RyZWU9VW5pc3ROb2RlXVxuICogICBUcmVlIHR5cGUuXG4gKiBAdGVtcGxhdGUge1Rlc3R9IFtDaGVjaz1UZXN0XVxuICogICBUZXN0IHR5cGUuXG4gKi9cblxuaW1wb3J0IHtjb252ZXJ0fSBmcm9tICd1bmlzdC11dGlsLWlzJ1xuaW1wb3J0IHtjb2xvcn0gZnJvbSAndW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzL2RvLW5vdC11c2UtY29sb3InXG5cbi8qKiBAdHlwZSB7UmVhZG9ubHk8QWN0aW9uVHVwbGU+fSAqL1xuY29uc3QgZW1wdHkgPSBbXVxuXG4vKipcbiAqIENvbnRpbnVlIHRyYXZlcnNpbmcgYXMgbm9ybWFsLlxuICovXG5leHBvcnQgY29uc3QgQ09OVElOVUUgPSB0cnVlXG5cbi8qKlxuICogU3RvcCB0cmF2ZXJzaW5nIGltbWVkaWF0ZWx5LlxuICovXG5leHBvcnQgY29uc3QgRVhJVCA9IGZhbHNlXG5cbi8qKlxuICogRG8gbm90IHRyYXZlcnNlIHRoaXMgbm9kZVx1MjAxOXMgY2hpbGRyZW4uXG4gKi9cbmV4cG9ydCBjb25zdCBTS0lQID0gJ3NraXAnXG5cbi8qKlxuICogVmlzaXQgbm9kZXMsIHdpdGggYW5jZXN0cmFsIGluZm9ybWF0aW9uLlxuICpcbiAqIFRoaXMgYWxnb3JpdGhtIHBlcmZvcm1zICpkZXB0aC1maXJzdCogKnRyZWUgdHJhdmVyc2FsKiBpbiAqcHJlb3JkZXIqXG4gKiAoKipOTFIqKikgb3IgaWYgYHJldmVyc2VgIGlzIGdpdmVuLCBpbiAqcmV2ZXJzZSBwcmVvcmRlciogKCoqTlJMKiopLlxuICpcbiAqIFlvdSBjYW4gY2hvb3NlIGZvciB3aGljaCBub2RlcyBgdmlzaXRvcmAgaXMgY2FsbGVkIGJ5IHBhc3NpbmcgYSBgdGVzdGAuXG4gKiBGb3IgY29tcGxleCB0ZXN0cywgeW91IHNob3VsZCB0ZXN0IHlvdXJzZWxmIGluIGB2aXNpdG9yYCwgYXMgaXQgd2lsbCBiZVxuICogZmFzdGVyIGFuZCB3aWxsIGhhdmUgaW1wcm92ZWQgdHlwZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBXYWxraW5nIHRoZSB0cmVlIGlzIGFuIGludGVuc2l2ZSB0YXNrLlxuICogTWFrZSB1c2Ugb2YgdGhlIHJldHVybiB2YWx1ZXMgb2YgdGhlIHZpc2l0b3Igd2hlbiBwb3NzaWJsZS5cbiAqIEluc3RlYWQgb2Ygd2Fsa2luZyBhIHRyZWUgbXVsdGlwbGUgdGltZXMsIHdhbGsgaXQgb25jZSwgdXNlIGB1bmlzdC11dGlsLWlzYFxuICogdG8gY2hlY2sgaWYgYSBub2RlIG1hdGNoZXMsIGFuZCB0aGVuIHBlcmZvcm0gZGlmZmVyZW50IG9wZXJhdGlvbnMuXG4gKlxuICogWW91IGNhbiBjaGFuZ2UgdGhlIHRyZWUuXG4gKiBTZWUgYFZpc2l0b3JgIGZvciBtb3JlIGluZm8uXG4gKlxuICogQG92ZXJsb2FkXG4gKiBAcGFyYW0ge1RyZWV9IHRyZWVcbiAqIEBwYXJhbSB7Q2hlY2t9IGNoZWNrXG4gKiBAcGFyYW0ge0J1aWxkVmlzaXRvcjxUcmVlLCBDaGVjaz59IHZpc2l0b3JcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWR9IFtyZXZlcnNlXVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqXG4gKiBAb3ZlcmxvYWRcbiAqIEBwYXJhbSB7VHJlZX0gdHJlZVxuICogQHBhcmFtIHtCdWlsZFZpc2l0b3I8VHJlZT59IHZpc2l0b3JcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWR9IFtyZXZlcnNlXVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqXG4gKiBAcGFyYW0ge1VuaXN0Tm9kZX0gdHJlZVxuICogICBUcmVlIHRvIHRyYXZlcnNlLlxuICogQHBhcmFtIHtWaXNpdG9yIHwgVGVzdH0gdGVzdFxuICogICBgdW5pc3QtdXRpbC1pc2AtY29tcGF0aWJsZSB0ZXN0XG4gKiBAcGFyYW0ge1Zpc2l0b3IgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZH0gW3Zpc2l0b3JdXG4gKiAgIEhhbmRsZSBlYWNoIG5vZGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkfSBbcmV2ZXJzZV1cbiAqICAgVHJhdmVyc2UgaW4gcmV2ZXJzZSBwcmVvcmRlciAoTlJMKSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHByZW9yZGVyIChOTFIpLlxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqICAgTm90aGluZy5cbiAqXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gVHJlZVxuICogICBOb2RlIHR5cGUuXG4gKiBAdGVtcGxhdGUge1Rlc3R9IENoZWNrXG4gKiAgIGB1bmlzdC11dGlsLWlzYC1jb21wYXRpYmxlIHRlc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFBhcmVudHModHJlZSwgdGVzdCwgdmlzaXRvciwgcmV2ZXJzZSkge1xuICAvKiogQHR5cGUge1Rlc3R9ICovXG4gIGxldCBjaGVja1xuXG4gIGlmICh0eXBlb2YgdGVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmlzaXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldmVyc2UgPSB2aXNpdG9yXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBubyB2aXNpdG9yIGdpdmVuLCBzbyBgdmlzaXRvcmAgaXMgdGVzdC5cbiAgICB2aXNpdG9yID0gdGVzdFxuICB9IGVsc2Uge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdmlzaXRvciBnaXZlbiwgc28gYHRlc3RgIGlzblx1MjAxOXQgYSB2aXNpdG9yLlxuICAgIGNoZWNrID0gdGVzdFxuICB9XG5cbiAgY29uc3QgaXMgPSBjb252ZXJ0KGNoZWNrKVxuICBjb25zdCBzdGVwID0gcmV2ZXJzZSA/IC0xIDogMVxuXG4gIGZhY3RvcnkodHJlZSwgdW5kZWZpbmVkLCBbXSkoKVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1VuaXN0Tm9kZX0gbm9kZVxuICAgKiBAcGFyYW0ge251bWJlciB8IHVuZGVmaW5lZH0gaW5kZXhcbiAgICogQHBhcmFtIHtBcnJheTxVbmlzdFBhcmVudD59IHBhcmVudHNcbiAgICovXG4gIGZ1bmN0aW9uIGZhY3Rvcnkobm9kZSwgaW5kZXgsIHBhcmVudHMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChcbiAgICAgIG5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnID8gbm9kZSA6IHt9XG4gICAgKVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZS50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgbmFtZSA9XG4gICAgICAgIC8vIGBoYXN0YFxuICAgICAgICB0eXBlb2YgdmFsdWUudGFnTmFtZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IHZhbHVlLnRhZ05hbWVcbiAgICAgICAgICA6IC8vIGB4YXN0YFxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlLm5hbWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IHZhbHVlLm5hbWVcbiAgICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2aXNpdCwgJ25hbWUnLCB7XG4gICAgICAgIHZhbHVlOlxuICAgICAgICAgICdub2RlICgnICsgY29sb3Iobm9kZS50eXBlICsgKG5hbWUgPyAnPCcgKyBuYW1lICsgJz4nIDogJycpKSArICcpJ1xuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdmlzaXRcblxuICAgIGZ1bmN0aW9uIHZpc2l0KCkge1xuICAgICAgLyoqIEB0eXBlIHtSZWFkb25seTxBY3Rpb25UdXBsZT59ICovXG4gICAgICBsZXQgcmVzdWx0ID0gZW1wdHlcbiAgICAgIC8qKiBAdHlwZSB7UmVhZG9ubHk8QWN0aW9uVHVwbGU+fSAqL1xuICAgICAgbGV0IHN1YnJlc3VsdFxuICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICBsZXQgb2Zmc2V0XG4gICAgICAvKiogQHR5cGUge0FycmF5PFVuaXN0UGFyZW50Pn0gKi9cbiAgICAgIGxldCBncmFuZHBhcmVudHNcblxuICAgICAgaWYgKCF0ZXN0IHx8IGlzKG5vZGUsIGluZGV4LCBwYXJlbnRzW3BhcmVudHMubGVuZ3RoIC0gMV0gfHwgdW5kZWZpbmVkKSkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBgdmlzaXRvcmAgaXMgbm93IGEgdmlzaXRvci5cbiAgICAgICAgcmVzdWx0ID0gdG9SZXN1bHQodmlzaXRvcihub2RlLCBwYXJlbnRzKSlcblxuICAgICAgICBpZiAocmVzdWx0WzBdID09PSBFWElUKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICgnY2hpbGRyZW4nIGluIG5vZGUgJiYgbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBub2RlQXNQYXJlbnQgPSAvKiogQHR5cGUge1VuaXN0UGFyZW50fSAqLyAobm9kZSlcblxuICAgICAgICBpZiAobm9kZUFzUGFyZW50LmNoaWxkcmVuICYmIHJlc3VsdFswXSAhPT0gU0tJUCkge1xuICAgICAgICAgIG9mZnNldCA9IChyZXZlcnNlID8gbm9kZUFzUGFyZW50LmNoaWxkcmVuLmxlbmd0aCA6IC0xKSArIHN0ZXBcbiAgICAgICAgICBncmFuZHBhcmVudHMgPSBwYXJlbnRzLmNvbmNhdChub2RlQXNQYXJlbnQpXG5cbiAgICAgICAgICB3aGlsZSAob2Zmc2V0ID4gLTEgJiYgb2Zmc2V0IDwgbm9kZUFzUGFyZW50LmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlQXNQYXJlbnQuY2hpbGRyZW5bb2Zmc2V0XVxuXG4gICAgICAgICAgICBzdWJyZXN1bHQgPSBmYWN0b3J5KGNoaWxkLCBvZmZzZXQsIGdyYW5kcGFyZW50cykoKVxuXG4gICAgICAgICAgICBpZiAoc3VicmVzdWx0WzBdID09PSBFWElUKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzdWJyZXN1bHRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb2Zmc2V0ID1cbiAgICAgICAgICAgICAgdHlwZW9mIHN1YnJlc3VsdFsxXSA9PT0gJ251bWJlcicgPyBzdWJyZXN1bHRbMV0gOiBvZmZzZXQgKyBzdGVwXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUdXJuIGEgcmV0dXJuIHZhbHVlIGludG8gYSBjbGVhbiByZXN1bHQuXG4gKlxuICogQHBhcmFtIHtWaXNpdG9yUmVzdWx0fSB2YWx1ZVxuICogICBWYWxpZCByZXR1cm4gdmFsdWVzIGZyb20gdmlzaXRvcnMuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8QWN0aW9uVHVwbGU+fVxuICogICBDbGVhbiByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIHRvUmVzdWx0KHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gW0NPTlRJTlVFLCB2YWx1ZV1cbiAgfVxuXG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gZW1wdHkgOiBbdmFsdWVdXG59XG4iLCAiLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCd1bmlzdCcpLk5vZGV9IFVuaXN0Tm9kZVxuICogQHR5cGVkZWYge2ltcG9ydCgndW5pc3QnKS5QYXJlbnR9IFVuaXN0UGFyZW50XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCd1bmlzdC11dGlsLXZpc2l0LXBhcmVudHMnKS5WaXNpdG9yUmVzdWx0fSBWaXNpdG9yUmVzdWx0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7RXhjbHVkZTxpbXBvcnQoJ3VuaXN0LXV0aWwtaXMnKS5UZXN0LCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkfSBUZXN0XG4gKiAgIFRlc3QgZnJvbSBgdW5pc3QtdXRpbC1pc2AuXG4gKlxuICogICBOb3RlOiB3ZSBoYXZlIHJlbW92ZSBhbmQgYWRkIGB1bmRlZmluZWRgLCBiZWNhdXNlIG90aGVyd2lzZSB3aGVuIGdlbmVyYXRpbmdcbiAqICAgYXV0b21hdGljIGAuZC50c2AgZmlsZXMsIFRTIHRyaWVzIHRvIGZsYXR0ZW4gcGF0aHMgZnJvbSBhIGxvY2FsIHBlcnNwZWN0aXZlLFxuICogICB3aGljaCBkb2Vzblx1MjAxOXQgd29yayB3aGVuIHB1Ymxpc2hpbmcgb24gbnBtLlxuICovXG5cbi8vIFRvIGRvOiB1c2UgdHlwZXMgZnJvbSBgdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzYCB3aGVuIGl0XHUyMDE5cyByZWxlYXNlZC5cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBGbiBleHRlbmRzICh2YWx1ZTogYW55KSA9PiB2YWx1ZSBpcyBpbmZlciBUaGluZ1xuICogICA/IFRoaW5nXG4gKiAgIDogRmFsbGJhY2tcbiAqICl9IFByZWRpY2F0ZVxuICogICBHZXQgdGhlIHZhbHVlIG9mIGEgdHlwZSBndWFyZCBgRm5gLlxuICogQHRlbXBsYXRlIEZuXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgZnVuY3Rpb24gdGhhdCBpcyBhIHR5cGUgZ3VhcmQgKHN1Y2ggYXMgYCh4KTogeCBpcyBZYCkuXG4gKiBAdGVtcGxhdGUgRmFsbGJhY2tcbiAqICAgVmFsdWUgdG8geWllbGQgaWYgYEZuYCBpcyBub3QgYSB0eXBlIGd1YXJkLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgQ2hlY2sgZXh0ZW5kcyBudWxsIHwgdW5kZWZpbmVkIC8vIE5vIHRlc3QuXG4gKiAgID8gVmFsdWVcbiAqICAgOiBWYWx1ZSBleHRlbmRzIHt0eXBlOiBDaGVja30gLy8gU3RyaW5nICh0eXBlKSB0ZXN0LlxuICogICA/IFZhbHVlXG4gKiAgIDogVmFsdWUgZXh0ZW5kcyBDaGVjayAvLyBQYXJ0aWFsIHRlc3QuXG4gKiAgID8gVmFsdWVcbiAqICAgOiBDaGVjayBleHRlbmRzIEZ1bmN0aW9uIC8vIEZ1bmN0aW9uIHRlc3QuXG4gKiAgID8gUHJlZGljYXRlPENoZWNrLCBWYWx1ZT4gZXh0ZW5kcyBWYWx1ZVxuICogICAgID8gUHJlZGljYXRlPENoZWNrLCBWYWx1ZT5cbiAqICAgICA6IG5ldmVyXG4gKiAgIDogbmV2ZXIgLy8gU29tZSBvdGhlciB0ZXN0P1xuICogKX0gTWF0Y2hlc09uZVxuICogICBDaGVjayB3aGV0aGVyIGEgbm9kZSBtYXRjaGVzIGEgcHJpbWl0aXZlIGNoZWNrIGluIHRoZSB0eXBlIHN5c3RlbS5cbiAqIEB0ZW1wbGF0ZSBWYWx1ZVxuICogICBWYWx1ZTsgdHlwaWNhbGx5IHVuaXN0IGBOb2RlYC5cbiAqIEB0ZW1wbGF0ZSBDaGVja1xuICogICBWYWx1ZTsgdHlwaWNhbGx5IGB1bmlzdC11dGlsLWlzYC1jb21wYXRpYmxlIHRlc3QsIGJ1dCBub3QgYXJyYXlzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgQ2hlY2sgZXh0ZW5kcyBBcnJheTxhbnk+XG4gKiAgID8gTWF0Y2hlc09uZTxWYWx1ZSwgQ2hlY2tba2V5b2YgQ2hlY2tdPlxuICogICA6IE1hdGNoZXNPbmU8VmFsdWUsIENoZWNrPlxuICogKX0gTWF0Y2hlc1xuICogICBDaGVjayB3aGV0aGVyIGEgbm9kZSBtYXRjaGVzIGEgY2hlY2sgaW4gdGhlIHR5cGUgc3lzdGVtLlxuICogQHRlbXBsYXRlIFZhbHVlXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgdW5pc3QgYE5vZGVgLlxuICogQHRlbXBsYXRlIENoZWNrXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgYHVuaXN0LXV0aWwtaXNgLWNvbXBhdGlibGUgdGVzdC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHswIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB8IDggfCA5IHwgMTB9IFVpbnRcbiAqICAgTnVtYmVyOyBjYXBwZWQgcmVhc29uYWJseS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtJIGV4dGVuZHMgMCA/IDEgOiBJIGV4dGVuZHMgMSA/IDIgOiBJIGV4dGVuZHMgMiA/IDMgOiBJIGV4dGVuZHMgMyA/IDQgOiBJIGV4dGVuZHMgNCA/IDUgOiBJIGV4dGVuZHMgNSA/IDYgOiBJIGV4dGVuZHMgNiA/IDcgOiBJIGV4dGVuZHMgNyA/IDggOiBJIGV4dGVuZHMgOCA/IDkgOiAxMH0gSW5jcmVtZW50XG4gKiAgIEluY3JlbWVudCBhIG51bWJlciBpbiB0aGUgdHlwZSBzeXN0ZW0uXG4gKiBAdGVtcGxhdGUge1VpbnR9IFtJPTBdXG4gKiAgIEluZGV4LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgTm9kZSBleHRlbmRzIFVuaXN0UGFyZW50XG4gKiAgID8gTm9kZSBleHRlbmRzIHtjaGlsZHJlbjogQXJyYXk8aW5mZXIgQ2hpbGRyZW4+fVxuICogICAgID8gQ2hpbGQgZXh0ZW5kcyBDaGlsZHJlbiA/IE5vZGUgOiBuZXZlclxuICogICAgIDogbmV2ZXJcbiAqICAgOiBuZXZlclxuICogKX0gSW50ZXJuYWxQYXJlbnRcbiAqICAgQ29sbGVjdCBub2RlcyB0aGF0IGNhbiBiZSBwYXJlbnRzIG9mIGBDaGlsZGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gTm9kZVxuICogICBBbGwgbm9kZSB0eXBlcyBpbiBhIHRyZWUuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gQ2hpbGRcbiAqICAgTm9kZSB0byBzZWFyY2ggZm9yLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0ludGVybmFsUGFyZW50PEluY2x1c2l2ZURlc2NlbmRhbnQ8VHJlZT4sIENoaWxkPn0gUGFyZW50XG4gKiAgIENvbGxlY3Qgbm9kZXMgaW4gYFRyZWVgIHRoYXQgY2FuIGJlIHBhcmVudHMgb2YgYENoaWxkYC5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBUcmVlXG4gKiAgIEFsbCBub2RlIHR5cGVzIGluIGEgdHJlZS5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBDaGlsZFxuICogICBOb2RlIHRvIHNlYXJjaCBmb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBEZXB0aCBleHRlbmRzIE1heFxuICogICA/IG5ldmVyXG4gKiAgIDpcbiAqICAgICB8IEludGVybmFsUGFyZW50PE5vZGUsIENoaWxkPlxuICogICAgIHwgSW50ZXJuYWxBbmNlc3RvcjxOb2RlLCBJbnRlcm5hbFBhcmVudDxOb2RlLCBDaGlsZD4sIE1heCwgSW5jcmVtZW50PERlcHRoPj5cbiAqICl9IEludGVybmFsQW5jZXN0b3JcbiAqICAgQ29sbGVjdCBub2RlcyBpbiBgVHJlZWAgdGhhdCBjYW4gYmUgYW5jZXN0b3JzIG9mIGBDaGlsZGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gTm9kZVxuICogICBBbGwgbm9kZSB0eXBlcyBpbiBhIHRyZWUuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gQ2hpbGRcbiAqICAgTm9kZSB0byBzZWFyY2ggZm9yLlxuICogQHRlbXBsYXRlIHtVaW50fSBbTWF4PTEwXVxuICogICBNYXg7IHNlYXJjaGVzIHVwIHRvIHRoaXMgZGVwdGguXG4gKiBAdGVtcGxhdGUge1VpbnR9IFtEZXB0aD0wXVxuICogICBDdXJyZW50IGRlcHRoLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgVHJlZSBleHRlbmRzIFVuaXN0UGFyZW50XG4gKiAgICAgPyBEZXB0aCBleHRlbmRzIE1heFxuICogICAgICAgPyBUcmVlXG4gKiAgICAgICA6IFRyZWUgfCBJbmNsdXNpdmVEZXNjZW5kYW50PFRyZWVbJ2NoaWxkcmVuJ11bbnVtYmVyXSwgTWF4LCBJbmNyZW1lbnQ8RGVwdGg+PlxuICogICAgIDogVHJlZVxuICogKX0gSW5jbHVzaXZlRGVzY2VuZGFudFxuICogICBDb2xsZWN0IGFsbCAoaW5jbHVzaXZlKSBkZXNjZW5kYW50cyBvZiBgVHJlZWAuXG4gKlxuICogICA+IFx1RDgzRFx1REM0OSAqKk5vdGUqKjogZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoaXMgc2VlbXMgdG8gYmUgdGhlIGZhc3Rlc3Qgd2F5IHRvXG4gKiAgID4gcmVjdXJzZSB3aXRob3V0IGFjdHVhbGx5IHJ1bm5pbmcgaW50byBhbiBpbmZpbml0ZSBsb29wLCB3aGljaCB0aGVcbiAqICAgPiBwcmV2aW91cyB2ZXJzaW9uIGRpZC5cbiAqICAgPlxuICogICA+IFByYWN0aWNhbGx5LCBhIG1heCBvZiBgMmAgaXMgdHlwaWNhbGx5IGVub3VnaCBhc3N1bWluZyBhIGBSb290YCBpc1xuICogICA+IHBhc3NlZCwgYnV0IGl0IGRvZXNuXHUyMDE5dCBpbXByb3ZlIHBlcmZvcm1hbmNlLlxuICogICA+IEl0IGdldHMgaGlnaGVyIHdpdGggYExpc3QgPiBMaXN0SXRlbSA+IFRhYmxlID4gVGFibGVSb3cgPiBUYWJsZUNlbGxgLlxuICogICA+IFVzaW5nIHVwIHRvIGAxMGAgZG9lc25cdTIwMTl0IGh1cnQgb3IgaGVscCBlaXRoZXIuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gVHJlZVxuICogICBUcmVlIHR5cGUuXG4gKiBAdGVtcGxhdGUge1VpbnR9IFtNYXg9MTBdXG4gKiAgIE1heDsgc2VhcmNoZXMgdXAgdG8gdGhpcyBkZXB0aC5cbiAqIEB0ZW1wbGF0ZSB7VWludH0gW0RlcHRoPTBdXG4gKiAgIEN1cnJlbnQgZGVwdGguXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgVmlzaXRvclxuICogICBIYW5kbGUgYSBub2RlIChtYXRjaGluZyBgdGVzdGAsIGlmIGdpdmVuKS5cbiAqXG4gKiAgIFZpc2l0b3JzIGFyZSBmcmVlIHRvIHRyYW5zZm9ybSBgbm9kZWAuXG4gKiAgIFRoZXkgY2FuIGFsc28gdHJhbnNmb3JtIGBwYXJlbnRgLlxuICpcbiAqICAgUmVwbGFjaW5nIGBub2RlYCBpdHNlbGYsIGlmIGBTS0lQYCBpcyBub3QgcmV0dXJuZWQsIHN0aWxsIGNhdXNlcyBpdHNcbiAqICAgZGVzY2VuZGFudHMgdG8gYmUgd2Fsa2VkICh3aGljaCBpcyBhIGJ1ZykuXG4gKlxuICogICBXaGVuIGFkZGluZyBvciByZW1vdmluZyBwcmV2aW91cyBzaWJsaW5ncyBvZiBgbm9kZWAgKG9yIG5leHQgc2libGluZ3MsIGluXG4gKiAgIGNhc2Ugb2YgcmV2ZXJzZSksIHRoZSBgVmlzaXRvcmAgc2hvdWxkIHJldHVybiBhIG5ldyBgSW5kZXhgIHRvIHNwZWNpZnkgdGhlXG4gKiAgIHNpYmxpbmcgdG8gdHJhdmVyc2UgYWZ0ZXIgYG5vZGVgIGlzIHRyYXZlcnNlZC5cbiAqICAgQWRkaW5nIG9yIHJlbW92aW5nIG5leHQgc2libGluZ3Mgb2YgYG5vZGVgIChvciBwcmV2aW91cyBzaWJsaW5ncywgaW4gY2FzZVxuICogICBvZiByZXZlcnNlKSBpcyBoYW5kbGVkIGFzIGV4cGVjdGVkIHdpdGhvdXQgbmVlZGluZyB0byByZXR1cm4gYSBuZXcgYEluZGV4YC5cbiAqXG4gKiAgIFJlbW92aW5nIHRoZSBjaGlsZHJlbiBwcm9wZXJ0eSBvZiBgcGFyZW50YCBzdGlsbCByZXN1bHRzIGluIHRoZW0gYmVpbmdcbiAqICAgdHJhdmVyc2VkLlxuICogQHBhcmFtIHtWaXNpdGVkfSBub2RlXG4gKiAgIEZvdW5kIG5vZGUuXG4gKiBAcGFyYW0ge1Zpc2l0ZWQgZXh0ZW5kcyBVbmlzdE5vZGUgPyBudW1iZXIgfCB1bmRlZmluZWQgOiBuZXZlcn0gaW5kZXhcbiAqICAgSW5kZXggb2YgYG5vZGVgIGluIGBwYXJlbnRgLlxuICogQHBhcmFtIHtBbmNlc3RvciBleHRlbmRzIFVuaXN0UGFyZW50ID8gQW5jZXN0b3IgfCB1bmRlZmluZWQgOiBuZXZlcn0gcGFyZW50XG4gKiAgIFBhcmVudCBvZiBgbm9kZWAuXG4gKiBAcmV0dXJucyB7VmlzaXRvclJlc3VsdH1cbiAqICAgV2hhdCB0byBkbyBuZXh0LlxuICpcbiAqICAgQW4gYEluZGV4YCBpcyB0cmVhdGVkIGFzIGEgdHVwbGUgb2YgYFtDT05USU5VRSwgSW5kZXhdYC5cbiAqICAgQW4gYEFjdGlvbmAgaXMgdHJlYXRlZCBhcyBhIHR1cGxlIG9mIGBbQWN0aW9uXWAuXG4gKlxuICogICBQYXNzaW5nIGEgdHVwbGUgYmFjayBvbmx5IG1ha2VzIHNlbnNlIGlmIHRoZSBgQWN0aW9uYCBpcyBgU0tJUGAuXG4gKiAgIFdoZW4gdGhlIGBBY3Rpb25gIGlzIGBFWElUYCwgdGhhdCBhY3Rpb24gY2FuIGJlIHJldHVybmVkLlxuICogICBXaGVuIHRoZSBgQWN0aW9uYCBpcyBgQ09OVElOVUVgLCBgSW5kZXhgIGNhbiBiZSByZXR1cm5lZC5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBbVmlzaXRlZD1VbmlzdE5vZGVdXG4gKiAgIFZpc2l0ZWQgbm9kZSB0eXBlLlxuICogQHRlbXBsYXRlIHtVbmlzdFBhcmVudH0gW0FuY2VzdG9yPVVuaXN0UGFyZW50XVxuICogICBBbmNlc3RvciB0eXBlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1Zpc2l0b3I8VmlzaXRlZCwgUGFyZW50PEFuY2VzdG9yLCBWaXNpdGVkPj59IEJ1aWxkVmlzaXRvckZyb21NYXRjaFxuICogICBCdWlsZCBhIHR5cGVkIGBWaXNpdG9yYCBmdW5jdGlvbiBmcm9tIGEgbm9kZSBhbmQgYWxsIHBvc3NpYmxlIHBhcmVudHMuXG4gKlxuICogICBJdCB3aWxsIGluZmVyIHdoaWNoIHZhbHVlcyBhcmUgcGFzc2VkIGFzIGBub2RlYCBhbmQgd2hpY2ggYXMgYHBhcmVudGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gVmlzaXRlZFxuICogICBOb2RlIHR5cGUuXG4gKiBAdGVtcGxhdGUge1VuaXN0UGFyZW50fSBBbmNlc3RvclxuICogICBQYXJlbnQgdHlwZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIEJ1aWxkVmlzaXRvckZyb21NYXRjaDxcbiAqICAgICBNYXRjaGVzPERlc2NlbmRhbnQsIENoZWNrPixcbiAqICAgICBFeHRyYWN0PERlc2NlbmRhbnQsIFVuaXN0UGFyZW50PlxuICogICA+XG4gKiApfSBCdWlsZFZpc2l0b3JGcm9tRGVzY2VuZGFudHNcbiAqICAgQnVpbGQgYSB0eXBlZCBgVmlzaXRvcmAgZnVuY3Rpb24gZnJvbSBhIGxpc3Qgb2YgZGVzY2VuZGFudHMgYW5kIGEgdGVzdC5cbiAqXG4gKiAgIEl0IHdpbGwgaW5mZXIgd2hpY2ggdmFsdWVzIGFyZSBwYXNzZWQgYXMgYG5vZGVgIGFuZCB3aGljaCBhcyBgcGFyZW50YC5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBEZXNjZW5kYW50XG4gKiAgIE5vZGUgdHlwZS5cbiAqIEB0ZW1wbGF0ZSB7VGVzdH0gQ2hlY2tcbiAqICAgVGVzdCB0eXBlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgQnVpbGRWaXNpdG9yRnJvbURlc2NlbmRhbnRzPFxuICogICAgIEluY2x1c2l2ZURlc2NlbmRhbnQ8VHJlZT4sXG4gKiAgICAgQ2hlY2tcbiAqICAgPlxuICogKX0gQnVpbGRWaXNpdG9yXG4gKiAgIEJ1aWxkIGEgdHlwZWQgYFZpc2l0b3JgIGZ1bmN0aW9uIGZyb20gYSB0cmVlIGFuZCBhIHRlc3QuXG4gKlxuICogICBJdCB3aWxsIGluZmVyIHdoaWNoIHZhbHVlcyBhcmUgcGFzc2VkIGFzIGBub2RlYCBhbmQgd2hpY2ggYXMgYHBhcmVudGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gW1RyZWU9VW5pc3ROb2RlXVxuICogICBOb2RlIHR5cGUuXG4gKiBAdGVtcGxhdGUge1Rlc3R9IFtDaGVjaz1UZXN0XVxuICogICBUZXN0IHR5cGUuXG4gKi9cblxuaW1wb3J0IHt2aXNpdFBhcmVudHN9IGZyb20gJ3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cydcblxuZXhwb3J0IHtDT05USU5VRSwgRVhJVCwgU0tJUH0gZnJvbSAndW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzJ1xuXG4vKipcbiAqIFZpc2l0IG5vZGVzLlxuICpcbiAqIFRoaXMgYWxnb3JpdGhtIHBlcmZvcm1zICpkZXB0aC1maXJzdCogKnRyZWUgdHJhdmVyc2FsKiBpbiAqcHJlb3JkZXIqXG4gKiAoKipOTFIqKikgb3IgaWYgYHJldmVyc2VgIGlzIGdpdmVuLCBpbiAqcmV2ZXJzZSBwcmVvcmRlciogKCoqTlJMKiopLlxuICpcbiAqIFlvdSBjYW4gY2hvb3NlIGZvciB3aGljaCBub2RlcyBgdmlzaXRvcmAgaXMgY2FsbGVkIGJ5IHBhc3NpbmcgYSBgdGVzdGAuXG4gKiBGb3IgY29tcGxleCB0ZXN0cywgeW91IHNob3VsZCB0ZXN0IHlvdXJzZWxmIGluIGB2aXNpdG9yYCwgYXMgaXQgd2lsbCBiZVxuICogZmFzdGVyIGFuZCB3aWxsIGhhdmUgaW1wcm92ZWQgdHlwZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBXYWxraW5nIHRoZSB0cmVlIGlzIGFuIGludGVuc2l2ZSB0YXNrLlxuICogTWFrZSB1c2Ugb2YgdGhlIHJldHVybiB2YWx1ZXMgb2YgdGhlIHZpc2l0b3Igd2hlbiBwb3NzaWJsZS5cbiAqIEluc3RlYWQgb2Ygd2Fsa2luZyBhIHRyZWUgbXVsdGlwbGUgdGltZXMsIHdhbGsgaXQgb25jZSwgdXNlIGB1bmlzdC11dGlsLWlzYFxuICogdG8gY2hlY2sgaWYgYSBub2RlIG1hdGNoZXMsIGFuZCB0aGVuIHBlcmZvcm0gZGlmZmVyZW50IG9wZXJhdGlvbnMuXG4gKlxuICogWW91IGNhbiBjaGFuZ2UgdGhlIHRyZWUuXG4gKiBTZWUgYFZpc2l0b3JgIGZvciBtb3JlIGluZm8uXG4gKlxuICogQG92ZXJsb2FkXG4gKiBAcGFyYW0ge1RyZWV9IHRyZWVcbiAqIEBwYXJhbSB7Q2hlY2t9IGNoZWNrXG4gKiBAcGFyYW0ge0J1aWxkVmlzaXRvcjxUcmVlLCBDaGVjaz59IHZpc2l0b3JcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWR9IFtyZXZlcnNlXVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqXG4gKiBAb3ZlcmxvYWRcbiAqIEBwYXJhbSB7VHJlZX0gdHJlZVxuICogQHBhcmFtIHtCdWlsZFZpc2l0b3I8VHJlZT59IHZpc2l0b3JcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWR9IFtyZXZlcnNlXVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqXG4gKiBAcGFyYW0ge1VuaXN0Tm9kZX0gdHJlZVxuICogICBUcmVlIHRvIHRyYXZlcnNlLlxuICogQHBhcmFtIHtWaXNpdG9yIHwgVGVzdH0gdGVzdE9yVmlzaXRvclxuICogICBgdW5pc3QtdXRpbC1pc2AtY29tcGF0aWJsZSB0ZXN0IChvcHRpb25hbCwgb21pdCB0byBwYXNzIGEgdmlzaXRvcikuXG4gKiBAcGFyYW0ge1Zpc2l0b3IgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZH0gW3Zpc2l0b3JPclJldmVyc2VdXG4gKiAgIEhhbmRsZSBlYWNoIG5vZGUgKHdoZW4gdGVzdCBpcyBvbWl0dGVkLCBwYXNzIGByZXZlcnNlYCkuXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkfSBbbWF5YmVSZXZlcnNlPWZhbHNlXVxuICogICBUcmF2ZXJzZSBpbiByZXZlcnNlIHByZW9yZGVyIChOUkwpIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgcHJlb3JkZXIgKE5MUikuXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICogICBOb3RoaW5nLlxuICpcbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBUcmVlXG4gKiAgIE5vZGUgdHlwZS5cbiAqIEB0ZW1wbGF0ZSB7VGVzdH0gQ2hlY2tcbiAqICAgYHVuaXN0LXV0aWwtaXNgLWNvbXBhdGlibGUgdGVzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0KHRyZWUsIHRlc3RPclZpc2l0b3IsIHZpc2l0b3JPclJldmVyc2UsIG1heWJlUmV2ZXJzZSkge1xuICAvKiogQHR5cGUge2Jvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgcmV2ZXJzZVxuICAvKiogQHR5cGUge1Rlc3R9ICovXG4gIGxldCB0ZXN0XG4gIC8qKiBAdHlwZSB7VmlzaXRvcn0gKi9cbiAgbGV0IHZpc2l0b3JcblxuICBpZiAoXG4gICAgdHlwZW9mIHRlc3RPclZpc2l0b3IgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmlzaXRvck9yUmV2ZXJzZSAhPT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICB0ZXN0ID0gdW5kZWZpbmVkXG4gICAgdmlzaXRvciA9IHRlc3RPclZpc2l0b3JcbiAgICByZXZlcnNlID0gdmlzaXRvck9yUmV2ZXJzZVxuICB9IGVsc2Uge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGFzc3VtZSB0aGUgb3ZlcmxvYWQgd2l0aCB0ZXN0IHdhcyBnaXZlbi5cbiAgICB0ZXN0ID0gdGVzdE9yVmlzaXRvclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGFzc3VtZSB0aGUgb3ZlcmxvYWQgd2l0aCB0ZXN0IHdhcyBnaXZlbi5cbiAgICB2aXNpdG9yID0gdmlzaXRvck9yUmV2ZXJzZVxuICAgIHJldmVyc2UgPSBtYXliZVJldmVyc2VcbiAgfVxuXG4gIHZpc2l0UGFyZW50cyh0cmVlLCB0ZXN0LCBvdmVybG9hZCwgcmV2ZXJzZSlcblxuICAvKipcbiAgICogQHBhcmFtIHtVbmlzdE5vZGV9IG5vZGVcbiAgICogQHBhcmFtIHtBcnJheTxVbmlzdFBhcmVudD59IHBhcmVudHNcbiAgICovXG4gIGZ1bmN0aW9uIG92ZXJsb2FkKG5vZGUsIHBhcmVudHMpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRzW3BhcmVudHMubGVuZ3RoIC0gMV1cbiAgICBjb25zdCBpbmRleCA9IHBhcmVudCA/IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKG5vZGUpIDogdW5kZWZpbmVkXG4gICAgcmV0dXJuIHZpc2l0b3Iobm9kZSwgaW5kZXgsIHBhcmVudClcbiAgfVxufVxuIiwgImltcG9ydCB7IFJvb3QsIEVsZW1lbnQsIFRleHQgfSBmcm9tICdoYXN0JztcbmltcG9ydCB7IGNyZWF0ZVNhbml0aXplU2NoZW1hIH0gZnJvbSAnLi4vdXRpbHMvY3JlYXRlU2FuaXRpemVTY2hlbWEnO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tICd1bmlzdC11dGlsLXZpc2l0JztcbmV4cG9ydCBjb25zdCByZWh5cGVDb252ZXJ0QWJub3JtYWxUYWdzVG9UZXh0ID0gKGN1c3RvbVRhZ3M6IHN0cmluZ1tdID0gW10pID0+IHtcbiAgcmV0dXJuICh0cmVlOiBSb290KSA9PiB7XG4gICAgLy8gR2V0IGFsbCBhbGxvd2VkIHRhZyBuYW1lcyAoSFRNTCArIE1hdGhNTCArIGN1c3RvbVRhZ3MpXG4gICAgY29uc3Qgc2NoZW1hID0gY3JlYXRlU2FuaXRpemVTY2hlbWEoY3VzdG9tVGFncyk7XG4gICAgY29uc3QgYWxsb3dlZFRhZ05hbWVzID0gbmV3IFNldChzY2hlbWEudGFnTmFtZXMgfHwgW10pO1xuXG4gICAgdmlzaXQodHJlZSwgJ2VsZW1lbnQnLCAobm9kZSwgaW5kZXgsIHBhcmVudCkgPT4ge1xuICAgICAgaWYgKCFwYXJlbnQgfHwgaW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0YWdOYW1lID0gKG5vZGUgYXMgRWxlbWVudCkudGFnTmFtZTtcblxuICAgICAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGFibm9ybWFsIHRhZzpcbiAgICAgIC8vIDEuIE5vdCBpbiB0aGUgYWxsb3dlZCB0YWcgbGlzdFxuICAgICAgLy8gMi4gQW5kIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBFbmdsaXNoIGxldHRlcnNcbiAgICAgIGNvbnN0IGlzQWJub3JtYWxUYWcgPSAhYWxsb3dlZFRhZ05hbWVzLmhhcyh0YWdOYW1lKSAmJiAvW15hLXpBLVpdLy50ZXN0KHRhZ05hbWUpO1xuXG4gICAgICBpZiAoaXNBYm5vcm1hbFRhZykge1xuICAgICAgICAvLyBSZWJ1aWxkIHRoZSBvcmlnaW5hbCB0YWcgc3RyaW5nXG4gICAgICAgIGxldCB0YWdTdHJpbmcgPSBgPCR7dGFnTmFtZX1gO1xuXG4gICAgICAgIC8vIEFwcGVuZCBhdHRyaWJ1dGVzXG4gICAgICAgIGlmICgobm9kZSBhcyBFbGVtZW50KS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoKG5vZGUgYXMgRWxlbWVudCkucHJvcGVydGllcykpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICB0YWdTdHJpbmcgKz0gYCAke2tleX09XCIke3ZhbHVlLmpvaW4oJyAnKX1cImA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdGFnU3RyaW5nICs9IGAgJHtrZXl9PVwiJHt2YWx1ZX1cImA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGNoaWxkIGNvbnRlbnRcbiAgICAgICAgbGV0IGlubmVyQ29udGVudCA9ICcnO1xuICAgICAgICBpZiAoKG5vZGUgYXMgRWxlbWVudCkuY2hpbGRyZW4gJiYgKG5vZGUgYXMgRWxlbWVudCkuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHByb2Nlc3MgY2hpbGQgbm9kZXNcbiAgICAgICAgICBjb25zdCBwcm9jZXNzQ2hpbGRyZW4gPSAoY2hpbGRyZW46IEFycmF5PEVsZW1lbnQgfCBUZXh0Pik6IHN0cmluZyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5cbiAgICAgICAgICAgICAgLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkIGFzIFRleHQpLnZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQudHlwZSA9PT0gJ2VsZW1lbnQnKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50Q2hpbGQgPSBjaGlsZCBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkVGFnID0gYDwke2VsZW1lbnRDaGlsZC50YWdOYW1lfWA7XG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudENoaWxkLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZWxlbWVudENoaWxkLnByb3BlcnRpZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFRhZyArPSBgICR7a2V5fT1cIiR7dmFsdWUuam9pbignICcpfVwiYDtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkVGFnICs9IGAgJHtrZXl9PVwiJHt2YWx1ZX1cImA7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjaGlsZFRhZyArPSAnPic7XG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudENoaWxkLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkVGFnICs9IHByb2Nlc3NDaGlsZHJlbihlbGVtZW50Q2hpbGQuY2hpbGRyZW4gYXMgQXJyYXk8RWxlbWVudCB8IFRleHQ+KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNoaWxkVGFnICs9IGA8LyR7ZWxlbWVudENoaWxkLnRhZ05hbWV9PmA7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRUYWc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaW5uZXJDb250ZW50ID0gcHJvY2Vzc0NoaWxkcmVuKChub2RlIGFzIEVsZW1lbnQpLmNoaWxkcmVuIGFzIEFycmF5PEVsZW1lbnQgfCBUZXh0Pik7XG4gICAgICAgIH1cblxuICAgICAgICB0YWdTdHJpbmcgKz0gYD4ke2lubmVyQ29udGVudH08LyR7dGFnTmFtZX0+YDtcblxuICAgICAgICAvLyBDcmVhdGUgYSB0ZXh0IG5vZGUgdG8gcmVwbGFjZSB0aGUgYWJub3JtYWwgdGFnXG4gICAgICAgIGNvbnN0IHRleHROb2RlOiBUZXh0ID0ge1xuICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICB2YWx1ZTogdGFnU3RyaW5nLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFJlcGxhY2Ugbm9kZVxuICAgICAgICBwYXJlbnQuY2hpbGRyZW5baW5kZXhdID0gdGV4dE5vZGU7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59O1xuIiwgImNvbnN0IE1BVEhfSkFYRk9OVF9VUkwgPSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9tYXRoamF4QDMvZXM1L291dHB1dC9jaHRtbC9mb250cy93b2ZmLXYyJztcbmV4cG9ydCBjb25zdCBERUZBVUxUX01BVEhKQVhfQ09ORklHID0ge1xuICBjaHRtbDoge1xuICAgIGZvbnRVUkw6IE1BVEhfSkFYRk9OVF9VUkwsXG4gIH0sXG59O1xuIiwgImltcG9ydCB0eXBlIHsgUHJvY2Vzc29yIH0gZnJvbSAndW5pZmllZCc7XG5cbmNvbnN0IGNvdW50UHJlY2VkaW5nQmFja3NsYXNoZXMgPSAoaW5wdXQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IG51bWJlciA9PiB7XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAobGV0IGkgPSBpbmRleCAtIDE7IGkgPj0gMCAmJiBpbnB1dFtpXSA9PT0gJ1xcXFwnOyBpLS0pIGNvdW50Kys7XG4gIHJldHVybiBjb3VudDtcbn07XG5cbmNvbnN0IGlzVW5lc2NhcGVkRGVsaW1pdGVyID0gKGlucHV0OiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIG5leHRDaGFyOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgaWYgKGlucHV0W2luZGV4XSAhPT0gJ1xcXFwnIHx8IGlucHV0W2luZGV4ICsgMV0gIT09IG5leHRDaGFyKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBjb3VudFByZWNlZGluZ0JhY2tzbGFzaGVzKGlucHV0LCBpbmRleCkgJSAyID09PSAwO1xufTtcblxuY29uc3QgZmluZENsb3NpbmdEZWxpbWl0ZXIgPSAoaW5wdXQ6IHN0cmluZywgZnJvbUluZGV4OiBudW1iZXIsIGNsb3NlQ2hhcjogJyknIHwgJ10nKTogbnVtYmVyID0+IHtcbiAgZm9yIChsZXQgaSA9IGZyb21JbmRleDsgaSA8IGlucHV0Lmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGlmIChpc1VuZXNjYXBlZERlbGltaXRlcihpbnB1dCwgaSwgY2xvc2VDaGFyKSkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuY29uc3QgaXNMaW5lU3RhcnQgPSAoaW5wdXQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4gPT5cbiAgaW5kZXggPT09IDAgfHwgaW5wdXRbaW5kZXggLSAxXSA9PT0gJ1xcbic7XG5cbmNvbnN0IHNjYW5GZW5jZSA9IChcbiAgaW5wdXQ6IHN0cmluZyxcbiAgaW5kZXg6IG51bWJlclxuKTogeyBmZW5jZUNoYXI6ICdgJyB8ICd+JzsgZmVuY2VMZW5ndGg6IG51bWJlciB9IHwgbnVsbCA9PiB7XG4gIGNvbnN0IGNoYXIgPSBpbnB1dFtpbmRleF07XG4gIGlmIChjaGFyICE9PSAnYCcgJiYgY2hhciAhPT0gJ34nKSByZXR1cm4gbnVsbDtcbiAgbGV0IGZlbmNlTGVuZ3RoID0gMDtcbiAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgaW5wdXQubGVuZ3RoICYmIGlucHV0W2ldID09PSBjaGFyOyBpKyspIGZlbmNlTGVuZ3RoKys7XG4gIGlmIChmZW5jZUxlbmd0aCA8IDMpIHJldHVybiBudWxsO1xuICByZXR1cm4geyBmZW5jZUNoYXI6IGNoYXIsIGZlbmNlTGVuZ3RoIH07XG59O1xuXG5jb25zdCBpc0luZGVudGVkQ29kZUxpbmUgPSAoaW5wdXQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICBpZiAoIWlzTGluZVN0YXJ0KGlucHV0LCBpbmRleCkpIHJldHVybiBmYWxzZTtcbiAgaWYgKGlucHV0W2luZGV4XSA9PT0gJ1xcdCcpIHJldHVybiB0cnVlO1xuICByZXR1cm4gaW5wdXQuc2xpY2UoaW5kZXgsIGluZGV4ICsgNCkgPT09ICcgICAgJztcbn07XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVMYXRleFBhcmVuc01hdGggPSAoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGxldCBvdXRwdXQgPSAnJztcblxuICBsZXQgaW5GZW5jZWRDb2RlQmxvY2sgPSBmYWxzZTtcbiAgbGV0IGZlbmNlQ2hhcjogJ2AnIHwgJ34nIHwgbnVsbCA9IG51bGw7XG4gIGxldCBmZW5jZUxlbmd0aCA9IDA7XG5cbiAgbGV0IGluSW5saW5lQ29kZSA9IGZhbHNlO1xuICBsZXQgaW5saW5lQ29kZVRpY2tMZW5ndGggPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyApIHtcbiAgICBpZiAoIWluRmVuY2VkQ29kZUJsb2NrICYmICFpbklubGluZUNvZGUgJiYgaXNJbmRlbnRlZENvZGVMaW5lKGlucHV0LCBpKSkge1xuICAgICAgY29uc3QgZW5kID0gaW5wdXQuaW5kZXhPZignXFxuJywgaSk7XG4gICAgICBpZiAoZW5kID09PSAtMSkgcmV0dXJuIG91dHB1dCArIGlucHV0LnNsaWNlKGkpO1xuICAgICAgb3V0cHV0ICs9IGlucHV0LnNsaWNlKGksIGVuZCArIDEpO1xuICAgICAgaSA9IGVuZCArIDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIWluSW5saW5lQ29kZSAmJiBpc0xpbmVTdGFydChpbnB1dCwgaSkpIHtcbiAgICAgIGNvbnN0IGZlbmNlID0gc2NhbkZlbmNlKGlucHV0LCBpKTtcbiAgICAgIGlmIChmZW5jZSkge1xuICAgICAgICBpZiAoIWluRmVuY2VkQ29kZUJsb2NrKSB7XG4gICAgICAgICAgaW5GZW5jZWRDb2RlQmxvY2sgPSB0cnVlO1xuICAgICAgICAgIGZlbmNlQ2hhciA9IGZlbmNlLmZlbmNlQ2hhcjtcbiAgICAgICAgICBmZW5jZUxlbmd0aCA9IGZlbmNlLmZlbmNlTGVuZ3RoO1xuICAgICAgICB9IGVsc2UgaWYgKGZlbmNlQ2hhciA9PT0gZmVuY2UuZmVuY2VDaGFyICYmIGZlbmNlLmZlbmNlTGVuZ3RoID49IGZlbmNlTGVuZ3RoKSB7XG4gICAgICAgICAgaW5GZW5jZWRDb2RlQmxvY2sgPSBmYWxzZTtcbiAgICAgICAgICBmZW5jZUNoYXIgPSBudWxsO1xuICAgICAgICAgIGZlbmNlTGVuZ3RoID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVuZCA9IGlucHV0LmluZGV4T2YoJ1xcbicsIGkpO1xuICAgICAgICBpZiAoZW5kID09PSAtMSkgcmV0dXJuIG91dHB1dCArIGlucHV0LnNsaWNlKGkpO1xuICAgICAgICBvdXRwdXQgKz0gaW5wdXQuc2xpY2UoaSwgZW5kICsgMSk7XG4gICAgICAgIGkgPSBlbmQgKyAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWluRmVuY2VkQ29kZUJsb2NrKSB7XG4gICAgICBpZiAoIWluSW5saW5lQ29kZSAmJiBpbnB1dFtpXSA9PT0gJ2AnKSB7XG4gICAgICAgIGxldCB0aWNrcyA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSBpOyBqIDwgaW5wdXQubGVuZ3RoICYmIGlucHV0W2pdID09PSAnYCc7IGorKykgdGlja3MrKztcbiAgICAgICAgaW5JbmxpbmVDb2RlID0gdHJ1ZTtcbiAgICAgICAgaW5saW5lQ29kZVRpY2tMZW5ndGggPSB0aWNrcztcbiAgICAgICAgb3V0cHV0ICs9IGlucHV0LnNsaWNlKGksIGkgKyB0aWNrcyk7XG4gICAgICAgIGkgKz0gdGlja3M7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5JbmxpbmVDb2RlKSB7XG4gICAgICAgIGlmIChpbnB1dFtpXSA9PT0gJ2AnKSB7XG4gICAgICAgICAgbGV0IHRpY2tzID0gMDtcbiAgICAgICAgICBmb3IgKGxldCBqID0gaTsgaiA8IGlucHV0Lmxlbmd0aCAmJiBpbnB1dFtqXSA9PT0gJ2AnOyBqKyspIHRpY2tzKys7XG4gICAgICAgICAgaWYgKHRpY2tzID49IGlubGluZUNvZGVUaWNrTGVuZ3RoKSB7XG4gICAgICAgICAgICBvdXRwdXQgKz0gaW5wdXQuc2xpY2UoaSwgaSArIGlubGluZUNvZGVUaWNrTGVuZ3RoKTtcbiAgICAgICAgICAgIGkgKz0gaW5saW5lQ29kZVRpY2tMZW5ndGg7XG4gICAgICAgICAgICBpbklubGluZUNvZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlubGluZUNvZGVUaWNrTGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXRwdXQgKz0gaW5wdXRbaV07XG4gICAgICAgIGkrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpbkZlbmNlZENvZGVCbG9jayAmJiAhaW5JbmxpbmVDb2RlKSB7XG4gICAgICBpZiAoaXNVbmVzY2FwZWREZWxpbWl0ZXIoaW5wdXQsIGksICcoJykpIHtcbiAgICAgICAgY29uc3QgY2xvc2VJbmRleCA9IGZpbmRDbG9zaW5nRGVsaW1pdGVyKGlucHV0LCBpICsgMiwgJyknKTtcbiAgICAgICAgaWYgKGNsb3NlSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgY29uc3QgaW5uZXIgPSBpbnB1dC5zbGljZShpICsgMiwgY2xvc2VJbmRleCk7XG4gICAgICAgICAgb3V0cHV0ICs9IGAkJHtpbm5lcn0kYDtcbiAgICAgICAgICBpID0gY2xvc2VJbmRleCArIDI7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzVW5lc2NhcGVkRGVsaW1pdGVyKGlucHV0LCBpLCAnWycpKSB7XG4gICAgICAgIGNvbnN0IGNsb3NlSW5kZXggPSBmaW5kQ2xvc2luZ0RlbGltaXRlcihpbnB1dCwgaSArIDIsICddJyk7XG4gICAgICAgIGlmIChjbG9zZUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGNvbnN0IGlubmVyID0gaW5wdXQuc2xpY2UoaSArIDIsIGNsb3NlSW5kZXgpO1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaW5uZXIuc3RhcnRzV2l0aCgnXFxuJykgPyAnJyA6ICdcXG4nO1xuICAgICAgICAgIGNvbnN0IGVuZCA9IGlubmVyLmVuZHNXaXRoKCdcXG4nKSA/ICcnIDogJ1xcbic7XG4gICAgICAgICAgb3V0cHV0ICs9IGAkJCR7c3RhcnR9JHtpbm5lcn0ke2VuZH0kJGA7XG4gICAgICAgICAgaSA9IGNsb3NlSW5kZXggKyAyO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3V0cHV0ICs9IGlucHV0W2ldO1xuICAgIGkrKztcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmV4cG9ydCBjb25zdCByZW1hcmtNYXRoRGVsaW1pdGVycyA9IGZ1bmN0aW9uIHJlbWFya01hdGhEZWxpbWl0ZXJzKHRoaXM6IFByb2Nlc3Nvcik6IHZvaWQge1xuICBjb25zdCBjdXJyZW50UGFyc2VyID0gdGhpcy5wYXJzZXIgfHwgdGhpcy5QYXJzZXI7XG4gIGlmICghY3VycmVudFBhcnNlcikgcmV0dXJuO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHRoaXMuUGFyc2VyID0gZnVuY3Rpb24gd3JhcHBlZFBhcnNlcihkb2N1bWVudDogdW5rbm93biwgZmlsZTogYW55KSB7XG4gICAgbGV0IG5leHREb2N1bWVudCA9IGRvY3VtZW50O1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplTGF0ZXhQYXJlbnNNYXRoKGRvY3VtZW50KTtcbiAgICAgIG5leHREb2N1bWVudCA9IG5vcm1hbGl6ZWQ7XG4gICAgICBpZiAoZmlsZSAmJiB0eXBlb2YgZmlsZS52YWx1ZSA9PT0gJ3N0cmluZycpIGZpbGUudmFsdWUgPSBub3JtYWxpemVkO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHJldHVybiBjdXJyZW50UGFyc2VyKG5leHREb2N1bWVudCBhcyBhbnksIGZpbGUpO1xuICB9IGFzIHVua25vd24gYXMgUHJvY2Vzc29yWydQYXJzZXInXTtcblxuICBpZiAodGhpcy5wYXJzZXIpIHRoaXMucGFyc2VyID0gdGhpcy5QYXJzZXIgYXMgdW5rbm93biBhcyB0eXBlb2YgdGhpcy5wYXJzZXI7XG59O1xuIiwgImltcG9ydCB7IFJvb3QgfSBmcm9tICdoYXN0JztcbmltcG9ydCB7IGdldFBhcnNlciB9IGZyb20gJy4vY29yZSc7XG5pbXBvcnQgdHlwZSB7IFJlbmRlclByb3BzIGFzIFBhcnNlck9wdGlvbnMgfSBmcm9tICcuL2NvcmUnO1xuZXhwb3J0IHsgUGFyc2VyT3B0aW9ucyB9O1xuLyoqXG4gKiBcdTUzNTVcdTdFQkZcdTdBMEIgTWFya2Rvd24gXHU4OUUzXHU2NzkwXHU1NjY4XG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJzZXIge1xuICBwcml2YXRlIG9wdGlvbnM6IFBhcnNlck9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogUGFyc2VyT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBcdTg5RTNcdTY3OTAgTWFya2Rvd24gXHU1MjMwIEhUTUxcbiAgICogQHBhcmFtIG1hcmtkb3duIE1hcmtkb3duIFx1NUI1N1x1N0IyNlx1NEUzMlxuICAgKiBAcmV0dXJucyBIVE1MIFx1NUI1N1x1N0IyNlx1NEUzMlxuICAgKi9cbiAgYXN5bmMgcGFyc2VUb0hUTUwobWFya2Rvd246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcHJvY2Vzc29yID0gZ2V0UGFyc2VyKCdodG1sJywgdGhpcy5vcHRpb25zKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9jZXNzb3IucHJvY2VzcyhtYXJrZG93bik7XG4gICAgcmV0dXJuIFN0cmluZyhyZXN1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFx1ODlFM1x1Njc5MCBNYXJrZG93biBcdTUyMzAgSEFTVFxuICAgKiBAcGFyYW0gbWFya2Rvd24gTWFya2Rvd24gXHU1QjU3XHU3QjI2XHU0RTMyXG4gICAqIEByZXR1cm5zIEhBU1QgUm9vdCBcdTgyODJcdTcwQjlcbiAgICovXG4gIGFzeW5jIHBhcnNlVG9IQVNUKG1hcmtkb3duOiBzdHJpbmcpOiBQcm9taXNlPFJvb3Q+IHtcbiAgICBjb25zdCBwcm9jZXNzb3IgPSBnZXRQYXJzZXIoJ2hhc3QnLCB0aGlzLm9wdGlvbnMpO1xuICAgIGNvbnN0IHRyZWUgPSBwcm9jZXNzb3IucGFyc2UobWFya2Rvd24pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb2Nlc3Nvci5ydW4odHJlZSk7XG4gICAgcmV0dXJuIHJlc3VsdCBhcyBSb290O1xuICB9XG5cbiAgLyoqXG4gICAqIFx1NjI3OVx1OTFDRlx1ODlFM1x1Njc5MCBNYXJrZG93biBcdTUyMzAgSFRNTFxuICAgKiBAcGFyYW0gbWFya2Rvd25zIE1hcmtkb3duIFx1NUI1N1x1N0IyNlx1NEUzMlx1NjU3MFx1N0VDNFxuICAgKiBAcmV0dXJucyBIVE1MIFx1NUI1N1x1N0IyNlx1NEUzMlx1NjU3MFx1N0VDNFxuICAgKi9cbiAgYXN5bmMgYmF0Y2hQYXJzZVRvSFRNTChtYXJrZG93bnM6IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHByb2Nlc3NvciA9IGdldFBhcnNlcignaHRtbCcsIHRoaXMub3B0aW9ucyk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgbWFya2Rvd25zLm1hcChhc3luYyAobWQpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvY2Vzc29yLnByb2Nlc3MobWQpO1xuICAgICAgICByZXR1cm4gU3RyaW5nKHJlc3VsdCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogXHU2Mjc5XHU5MUNGXHU4OUUzXHU2NzkwIE1hcmtkb3duIFx1NTIzMCBIQVNUXG4gICAqIEBwYXJhbSBtYXJrZG93bnMgTWFya2Rvd24gXHU1QjU3XHU3QjI2XHU0RTMyXHU2NTcwXHU3RUM0XG4gICAqIEByZXR1cm5zIEhBU1QgUm9vdCBcdTgyODJcdTcwQjlcdTY1NzBcdTdFQzRcbiAgICovXG4gIGFzeW5jIGJhdGNoUGFyc2VUb0hBU1QobWFya2Rvd25zOiBzdHJpbmdbXSk6IFByb21pc2U8Um9vdFtdPiB7XG4gICAgY29uc3QgcHJvY2Vzc29yID0gZ2V0UGFyc2VyKCdoYXN0JywgdGhpcy5vcHRpb25zKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBtYXJrZG93bnMubWFwKGFzeW5jIChtZCkgPT4ge1xuICAgICAgICBjb25zdCB0cmVlID0gcHJvY2Vzc29yLnBhcnNlKG1kKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvY2Vzc29yLnJ1bih0cmVlKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBSb290O1xuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogXHU1MjFCXHU1RUZBXHU1MzU1XHU3RUJGXHU3QTBCXHU4OUUzXHU2NzkwXHU1NjY4XHU1QjlFXHU0RjhCXG4gKiBAcGFyYW0gb3B0aW9ucyBcdTg5RTNcdTY3OTBcdTU2NjhcdTkwMDlcdTk4NzlcbiAqIEByZXR1cm5zIFBhcnNlciBcdTVCOUVcdTRGOEJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBhcnNlcihvcHRpb25zOiBQYXJzZXJPcHRpb25zID0ge30pOiBQYXJzZXIge1xuICByZXR1cm4gbmV3IFBhcnNlcihvcHRpb25zKTtcbn1cbiIsICJpbXBvcnQgeyB3cmFwLCBSZW1vdGUgfSBmcm9tICdjb21saW5rJztcbmltcG9ydCB7IFJvb3QgfSBmcm9tICdoYXN0JztcbmltcG9ydCB0eXBlIHsgUGFyc2VyT3B0aW9ucyB9IGZyb20gJy4vcGFyc2VyJztcblxuLyoqXG4gKiBXb3JrZXIgXHU1QjlFXHU0RjhCXHU2M0E1XHU1M0UzXG4gKi9cbmludGVyZmFjZSBQYXJzZXJXb3JrZXJTZXJ2aWNlIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIG5ldyAoX29wdGlvbnM6IFBhcnNlck9wdGlvbnMpOiBQYXJzZXJXb3JrZXJTZXJ2aWNlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgcGFyc2VUb0hUTUwoX21hcmtkb3duOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBwYXJzZVRvSEFTVChfbWFya2Rvd246IHN0cmluZyk6IFByb21pc2U8Um9vdD47XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICB1cGRhdGVPcHRpb25zKF9vcHRpb25zOiBQYXJzZXJPcHRpb25zKTogdm9pZDtcbn1cblxuLyoqXG4gKiBcdTgzQjdcdTUzRDZcdTczQUZcdTU4ODNcdTdDN0JcdTU3OEJcbiAqL1xuZnVuY3Rpb24gZ2V0RW52aXJvbm1lbnQoKTogJ2Jyb3dzZXInIHwgJ25vZGUnIHwgJ3Vua25vd24nIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiAnYnJvd3Nlcic7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy52ZXJzaW9ucz8ubm9kZSkge1xuICAgIHJldHVybiAnbm9kZSc7XG4gIH1cbiAgcmV0dXJuICd1bmtub3duJztcbn1cblxuLyoqXG4gKiBcdTgzQjdcdTUzRDZcdTY3MDBcdTU5MjdcdTUzRUZcdTc1MjhcdTdFQkZcdTdBMEJcdTY1NzBcbiAqL1xuZnVuY3Rpb24gZ2V0TWF4V29ya2VycygpOiBudW1iZXIge1xuICBjb25zdCBlbnYgPSBnZXRFbnZpcm9ubWVudCgpO1xuXG4gIGlmIChlbnYgPT09ICdicm93c2VyJykge1xuICAgIC8vIFx1NkQ0Rlx1ODlDOFx1NTY2OFx1NzNBRlx1NTg4M1x1RkYxQVx1NEY3Rlx1NzUyOCBuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeVxuICAgIC8vIFx1OTAxQVx1NUUzOFx1OTY1MFx1NTIzNlx1NEUzQSBDUFUgXHU2ODM4XHU1RkMzXHU2NTcwXHVGRjBDXHU0RjQ2XHU2RDRGXHU4OUM4XHU1NjY4XHU1M0VGXHU4MEZEXHU2NzA5XHU4MUVBXHU1REYxXHU3Njg0XHU5NjUwXHU1MjM2XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgbmF2ID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgPyAobmF2aWdhdG9yIGFzIGFueSkgOiBudWxsO1xuICAgIGNvbnN0IGNvcmVzID0gbmF2Py5oYXJkd2FyZUNvbmN1cnJlbmN5IHx8IDQ7XG4gICAgLy8gXHU5NjUwXHU1MjM2XHU2NzAwXHU1OTI3XHU0RTNBIDggXHU0RTJBIFdvcmtlclx1RkYwQ1x1OTA3Rlx1NTE0RFx1OEZDN1x1NUVBNlx1NTM2MFx1NzUyOFx1OEQ0NFx1NkU5MFxuICAgIHJldHVybiBNYXRoLm1pbihjb3JlcywgOCk7XG4gIH1cblxuICBpZiAoZW52ID09PSAnbm9kZScpIHtcbiAgICAvLyBOb2RlLmpzIFx1NzNBRlx1NTg4M1x1RkYxQVx1NEY3Rlx1NzUyOCBvcy5jcHVzKClcbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICBjb25zdCBvcyA9IHJlcXVpcmUoJ29zJyk7XG4gICAgICBjb25zdCBjb3JlcyA9IG9zLmNwdXMoKT8ubGVuZ3RoIHx8IDQ7XG4gICAgICAvLyBOb2RlLmpzIFx1NEUyRFx1NEU1Rlx1OTY1MFx1NTIzNlx1NjcwMFx1NTkyN1x1NEUzQSA4IFx1NEUyQSBXb3JrZXJcbiAgICAgIHJldHVybiBNYXRoLm1pbihjb3JlcywgOCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gNDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gNDtcbn1cblxuLyoqXG4gKiBcdTUyMUJcdTVFRkEgV29ya2VyIFx1NUI5RVx1NEY4QlxuICovXG5mdW5jdGlvbiBjcmVhdGVXb3JrZXIoKTogV29ya2VyIHtcbiAgY29uc3QgZW52ID0gZ2V0RW52aXJvbm1lbnQoKTtcblxuICBpZiAoZW52ID09PSAnYnJvd3NlcicpIHtcbiAgICAvLyBcdTZENEZcdTg5QzhcdTU2NjhcdTczQUZcdTU4ODNcdUZGMUFcdTRGN0ZcdTc1MjggV2ViIFdvcmtlclxuICAgIHJldHVybiBuZXcgV29ya2VyKG5ldyBVUkwoJy4vbW9kdWxlcy9wYXJzZXIud29ya2VyLm1qcycsIGltcG9ydC5tZXRhLnVybCksIHtcbiAgICAgIHR5cGU6ICdtb2R1bGUnLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGVudiA9PT0gJ25vZGUnKSB7XG4gICAgLy8gTm9kZS5qcyBcdTczQUZcdTU4ODNcdUZGMUFcdTRGN0ZcdTc1Mjggd29ya2VyX3RocmVhZHNcbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICBjb25zdCB7IFdvcmtlciB9ID0gcmVxdWlyZSgnd29ya2VyX3RocmVhZHMnKTtcbiAgICAgIHJldHVybiBuZXcgV29ya2VyKG5ldyBVUkwoJy4vbW9kdWxlcy9wYXJzZXIud29ya2VyLm1qcycsIGltcG9ydC5tZXRhLnVybCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnV29ya2VyIHRocmVhZHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBOb2RlLmpzIGVudmlyb25tZW50LiAnICtcbiAgICAgICAgICAnUGxlYXNlIHVzZSBOb2RlLmpzIDEyKyBvciB1c2UgdGhlIHNpbmdsZS10aHJlYWRlZCBwYXJzZXIgaW5zdGVhZC4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgZW52aXJvbm1lbnQgZm9yIHdvcmtlciBwb29sJyk7XG59XG5cbi8qKlxuICogV29ya2VyIFx1NkM2MFx1OTE0RFx1N0Y2RVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtlclBvb2xPcHRpb25zIGV4dGVuZHMgUGFyc2VyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXb3JrZXIgXHU2NTcwXHU5MUNGXHVGRjBDXHU5RUQ4XHU4QkE0XHU0RTNBIENQVSBcdTY4MzhcdTVGQzNcdTY1NzBcdUZGMDhcdTY3MDBcdTU5MjcgOFx1RkYwOVxuICAgKi9cbiAgd29ya2VyQ291bnQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogV29ya2VyIFx1NkM2MFx1NzJCNlx1NjAwMVxuICovXG5pbnRlcmZhY2UgV29ya2VyU3RhdGUge1xuICB3b3JrZXI6IFdvcmtlcjtcbiAgcHJveHk6IFJlbW90ZTxQYXJzZXJXb3JrZXJTZXJ2aWNlPjtcbiAgYnVzeTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBcdTU5MUFcdTdFQkZcdTdBMEIgTWFya2Rvd24gXHU4OUUzXHU2NzkwXHU1NjY4XHVGRjA4XHU0RjdGXHU3NTI4IFdvcmtlciBcdTZDNjBcdUZGMDlcbiAqL1xuZXhwb3J0IGNsYXNzIFBhcnNlcldvcmtlclBvb2wge1xuICBwcml2YXRlIG9wdGlvbnM6IFdvcmtlclBvb2xPcHRpb25zO1xuICBwcml2YXRlIHdvcmtlcnM6IFdvcmtlclN0YXRlW10gPSBbXTtcbiAgcHJpdmF0ZSB3b3JrZXJDb3VudDogbnVtYmVyO1xuICBwcml2YXRlIGluaXRpYWxpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgaW5pdFByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIHByaXZhdGUgcGVuZGluZzogQXJyYXk8KHdvcmtlcjogV29ya2VyU3RhdGUpID0+IHZvaWQ+ID0gW107XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogV29ya2VyUG9vbE9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgY29uc3QgbWF4V29ya2VycyA9IGdldE1heFdvcmtlcnMoKTtcbiAgICB0aGlzLndvcmtlckNvdW50ID0gb3B0aW9ucy53b3JrZXJDb3VudFxuICAgICAgPyBNYXRoLm1pbihNYXRoLm1heCgxLCBvcHRpb25zLndvcmtlckNvdW50KSwgbWF4V29ya2VycylcbiAgICAgIDogbWF4V29ya2VycztcbiAgICAvLyBcdTdBQ0JcdTUzNzNcdTVGMDBcdTU5Q0JcdTUyMURcdTU5Q0JcdTUzMTYgV29ya2VyIFx1NkM2MFxuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFx1NTIxRFx1NTlDQlx1NTMxNiBXb3JrZXIgXHU2QzYwXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5pbml0UHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0UHJvbWlzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHdvcmtlclByb21pc2VzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdGhpcy53b3JrZXJDb3VudCB9LCAoKSA9PiB7XG4gICAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHdvcmtlciA9IGNyZWF0ZVdvcmtlcigpO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgY29uc3QgV29ya2VyQ2xhc3MgPSB3cmFwPGFueT4od29ya2VyKSBhcyBhbnk7XG4gICAgICAgICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9IHsgLi4udGhpcy5vcHRpb25zIH07XG4gICAgICAgICAgZGVsZXRlIChwYXJzZXJPcHRpb25zIGFzIHsgd29ya2VyQ291bnQ/OiBudW1iZXIgfSkud29ya2VyQ291bnQ7XG4gICAgICAgICAgY29uc3QgcHJveHkgPSBhd2FpdCBuZXcgV29ya2VyQ2xhc3MocGFyc2VyT3B0aW9ucyk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd29ya2VyLFxuICAgICAgICAgICAgcHJveHksXG4gICAgICAgICAgICBidXN5OiBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMud29ya2VycyA9IGF3YWl0IFByb21pc2UuYWxsKHdvcmtlclByb21pc2VzKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH0pKCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0UHJvbWlzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pbml0UHJvbWlzZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFx1ODNCN1x1NTNENlx1N0E3QVx1OTVGMlx1NzY4NCBXb3JrZXJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXZhaWxhYmxlV29ya2VyKCk6IFByb21pc2U8V29ya2VyU3RhdGU+IHtcbiAgICBhd2FpdCB0aGlzLmluaXQoKTtcblxuICAgIC8vIFx1NjdFNVx1NjI3RVx1N0E3QVx1OTVGMlx1NzY4NCBXb3JrZXJcbiAgICBsZXQgd29ya2VyID0gdGhpcy53b3JrZXJzLmZpbmQoKHcpID0+ICF3LmJ1c3kpO1xuXG4gICAgLy8gXHU1OTgyXHU2NzlDXHU2MjQwXHU2NzA5IFdvcmtlciBcdTkwRkRcdTVGRDlcdUZGMENcdTYzOTJcdTk2MUZcdTdCNDlcdTVGODVcdTkxQ0FcdTY1M0VcbiAgICBpZiAoIXdvcmtlcikge1xuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPFdvcmtlclN0YXRlPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aGlzLnBlbmRpbmcucHVzaCgoYXZhaWxhYmxlKSA9PiB7XG4gICAgICAgICAgYXZhaWxhYmxlLmJ1c3kgPSB0cnVlO1xuICAgICAgICAgIHJlc29sdmUoYXZhaWxhYmxlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB3b3JrZXIuYnVzeSA9IHRydWU7XG4gICAgcmV0dXJuIHdvcmtlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBcdTkxQ0FcdTY1M0UgV29ya2VyXG4gICAqL1xuICBwcml2YXRlIHJlbGVhc2VXb3JrZXIod29ya2VyOiBXb3JrZXJTdGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLnBlbmRpbmcuc2hpZnQoKTtcbiAgICBpZiAobmV4dCkge1xuICAgICAgbmV4dCh3b3JrZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3b3JrZXIuYnVzeSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFx1ODlFM1x1Njc5MCBNYXJrZG93biBcdTUyMzAgSFRNTFxuICAgKiBAcGFyYW0gbWFya2Rvd24gTWFya2Rvd24gXHU1QjU3XHU3QjI2XHU0RTMyXG4gICAqIEByZXR1cm5zIEhUTUwgXHU1QjU3XHU3QjI2XHU0RTMyXG4gICAqL1xuICBhc3luYyBwYXJzZVRvSFRNTChtYXJrZG93bjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB3b3JrZXIgPSBhd2FpdCB0aGlzLmdldEF2YWlsYWJsZVdvcmtlcigpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgd29ya2VyLnByb3h5LnBhcnNlVG9IVE1MKG1hcmtkb3duKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5yZWxlYXNlV29ya2VyKHdvcmtlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFx1ODlFM1x1Njc5MCBNYXJrZG93biBcdTUyMzAgSEFTVFxuICAgKiBAcGFyYW0gbWFya2Rvd24gTWFya2Rvd24gXHU1QjU3XHU3QjI2XHU0RTMyXG4gICAqIEByZXR1cm5zIEhBU1QgUm9vdCBcdTgyODJcdTcwQjlcbiAgICovXG4gIGFzeW5jIHBhcnNlVG9IQVNUKG1hcmtkb3duOiBzdHJpbmcpOiBQcm9taXNlPFJvb3Q+IHtcbiAgICBjb25zdCB3b3JrZXIgPSBhd2FpdCB0aGlzLmdldEF2YWlsYWJsZVdvcmtlcigpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgd29ya2VyLnByb3h5LnBhcnNlVG9IQVNUKG1hcmtkb3duKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5yZWxlYXNlV29ya2VyKHdvcmtlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFx1NjI3OVx1OTFDRlx1ODlFM1x1Njc5MCBNYXJrZG93biBcdTUyMzAgSFRNTFx1RkYwOFx1NUU3Nlx1ODg0Q1x1NTkwNFx1NzQwNlx1RkYwOVxuICAgKiBAcGFyYW0gbWFya2Rvd25zIE1hcmtkb3duIFx1NUI1N1x1N0IyNlx1NEUzMlx1NjU3MFx1N0VDNFxuICAgKiBAcmV0dXJucyBIVE1MIFx1NUI1N1x1N0IyNlx1NEUzMlx1NjU3MFx1N0VDNFxuICAgKi9cbiAgYXN5bmMgYmF0Y2hQYXJzZVRvSFRNTChtYXJrZG93bnM6IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChtYXJrZG93bnMubWFwKChtZCkgPT4gdGhpcy5wYXJzZVRvSFRNTChtZCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcdTYyNzlcdTkxQ0ZcdTg5RTNcdTY3OTAgTWFya2Rvd24gXHU1MjMwIEhBU1RcdUZGMDhcdTVFNzZcdTg4NENcdTU5MDRcdTc0MDZcdUZGMDlcbiAgICogQHBhcmFtIG1hcmtkb3ducyBNYXJrZG93biBcdTVCNTdcdTdCMjZcdTRFMzJcdTY1NzBcdTdFQzRcbiAgICogQHJldHVybnMgSEFTVCBSb290IFx1ODI4Mlx1NzBCOVx1NjU3MFx1N0VDNFxuICAgKi9cbiAgYXN5bmMgYmF0Y2hQYXJzZVRvSEFTVChtYXJrZG93bnM6IHN0cmluZ1tdKTogUHJvbWlzZTxSb290W10+IHtcbiAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwobWFya2Rvd25zLm1hcCgobWQpID0+IHRoaXMucGFyc2VUb0hBU1QobWQpKSk7XG4gIH1cblxuICAvKipcbiAgICogXHU2NkY0XHU2NUIwXHU2MjQwXHU2NzA5IFdvcmtlciBcdTc2ODRcdTkwMDlcdTk4NzlcbiAgICogQHBhcmFtIG9wdGlvbnMgXHU2NUIwXHU3Njg0XHU4OUUzXHU2NzkwXHU1NjY4XHU5MDA5XHU5ODc5XG4gICAqL1xuICBhc3luYyB1cGRhdGVPcHRpb25zKG9wdGlvbnM6IFBhcnRpYWw8UGFyc2VyT3B0aW9ucz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICB0aGlzLm9wdGlvbnMgPSB7IC4uLnRoaXMub3B0aW9ucywgLi4ub3B0aW9ucyB9O1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPSB7IC4uLnRoaXMub3B0aW9ucyB9O1xuICAgIGRlbGV0ZSAocGFyc2VyT3B0aW9ucyBhcyB7IHdvcmtlckNvdW50PzogbnVtYmVyIH0pLndvcmtlckNvdW50O1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMud29ya2Vycy5tYXAoKHcpID0+IHcucHJveHkudXBkYXRlT3B0aW9ucyhwYXJzZXJPcHRpb25zKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFx1OTUwMFx1NkJDMSBXb3JrZXIgXHU2QzYwXG4gICAqL1xuICBhc3luYyBkZXN0cm95KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCB7IHdvcmtlciB9IG9mIHRoaXMud29ya2Vycykge1xuICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgIH1cbiAgICB0aGlzLndvcmtlcnMgPSBbXTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogXHU4M0I3XHU1M0Q2IFdvcmtlciBcdTZDNjBcdTRGRTFcdTYwNkZcbiAgICovXG4gIGdldFBvb2xJbmZvKCk6IHtcbiAgICB3b3JrZXJDb3VudDogbnVtYmVyO1xuICAgIGFjdGl2ZVdvcmtlcnM6IG51bWJlcjtcbiAgICBidXN5V29ya2VyczogbnVtYmVyO1xuICAgIG1heFdvcmtlcnM6IG51bWJlcjtcbiAgICBlbnZpcm9ubWVudDogJ2Jyb3dzZXInIHwgJ25vZGUnIHwgJ3Vua25vd24nO1xuICAgIGluaXRpYWxpemVkOiBib29sZWFuO1xuICB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgd29ya2VyQ291bnQ6IHRoaXMud29ya2VyQ291bnQsXG4gICAgICBhY3RpdmVXb3JrZXJzOiB0aGlzLndvcmtlcnMubGVuZ3RoLFxuICAgICAgYnVzeVdvcmtlcnM6IHRoaXMud29ya2Vycy5maWx0ZXIoKHcpID0+IHcuYnVzeSkubGVuZ3RoLFxuICAgICAgbWF4V29ya2VyczogZ2V0TWF4V29ya2VycygpLFxuICAgICAgZW52aXJvbm1lbnQ6IGdldEVudmlyb25tZW50KCksXG4gICAgICBpbml0aWFsaXplZDogdGhpcy5pbml0aWFsaXplZCxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogXHU1MjFCXHU1RUZBXHU1OTFBXHU3RUJGXHU3QTBCXHU4OUUzXHU2NzkwXHU1NjY4XHU1QjlFXHU0RjhCXG4gKiBAcGFyYW0gb3B0aW9ucyBcdTg5RTNcdTY3OTBcdTU2NjhcdTkwMDlcdTk4NzlcdUZGMDhcdTUzMDVcdTU0MkIgV29ya2VyIFx1NjU3MFx1OTFDRlx1RkYwOVxuICogQHJldHVybnMgUGFyc2VyV29ya2VyUG9vbCBcdTVCOUVcdTRGOEJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdvcmtlclBvb2wob3B0aW9uczogV29ya2VyUG9vbE9wdGlvbnMgPSB7fSk6IFBhcnNlcldvcmtlclBvb2wge1xuICByZXR1cm4gbmV3IFBhcnNlcldvcmtlclBvb2wob3B0aW9ucyk7XG59XG4iXSwKICAi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LElBQUssS0FBSyxRQUM1QkEsRUFBTyxVQUFVLEVBRW5CLEtBQUssUUFBVSxDQUFDLEVBQ2hCLEtBQUssWUFBYyxHQUNyQixDQUtBLGFBT0UsQ0FDQSxNQUFPLENBQ0wsWUFBYSxLQUFLLFlBQ2xCLGNBQWUsS0FBSyxRQUFRLE9BQzVCLFlBQWEsS0FBSyxRQUFRLE9BQVFJLEdBQU1BLEVBQUUsSUFBSSxFQUFFLE9BQ2hELFdBQVliLEVBQWMsRUFDMUIsWUFBYUQsRUFBZSxFQUM1QixZQUFhLEtBQUssV0FDcEIsQ0FDRixDQUNGLEVBT08sU0FBU3FCLEdBQWlCZCxFQUE2QixDQUFDLEVBQXFCLENBQ2xGLE9BQU8sSUFBSUQsRUFBaUJDLENBQU8sQ0FDckMiLAogICJuYW1lcyI6IFsidW5pZmllZCIsICJyZW1hcmtQYXJzZSIsICJyZW1hcmtHZm0iLCAicmVtYXJrUmVoeXBlIiwgInJlaHlwZVN0cmluZ2lmeSIsICJyZW1hcmtNYXRoIiwgInJlaHlwZVNhbml0aXplIiwgInJlaHlwZVJhdyIsICJkZWZhdWx0U2NoZW1hIiwgIk1BVEhNTF9UQUdfTkFNRVMiLCAiTUFUSE1MX0FUVFJJQlVURVMiLCAiY3JlYXRlU2FuaXRpemVTY2hlbWEiLCAiY3VzdG9tVGFncyIsICJkZWZhdWx0U2NoZW1hIiwgIk1BVEhNTF9UQUdfTkFNRVMiLCAiTUFUSE1MX0FUVFJJQlVURVMiLCAiYWNjIiwgInRhZyIsICJjb252ZXJ0IiwgInRlc3QiLCAib2siLCAiY2FzdEZhY3RvcnkiLCAiYW55RmFjdG9yeSIsICJwcm9wZXJ0aWVzRmFjdG9yeSIsICJ0eXBlRmFjdG9yeSIsICJ0ZXN0cyIsICJjaGVja3MiLCAiaW5kZXgiLCAiYW55IiwgInBhcmFtZXRlcnMiLCAiY2hlY2siLCAiY2hlY2tBc1JlY29yZCIsICJhbGwiLCAibm9kZSIsICJub2RlQXNSZWNvcmQiLCAia2V5IiwgInR5cGUiLCAidGVzdEZ1bmN0aW9uIiwgInZhbHVlIiwgInBhcmVudCIsICJsb29rc0xpa2VBTm9kZSIsICJjb2xvciIsICJkIiwgImVtcHR5IiwgIkNPTlRJTlVFIiwgIkVYSVQiLCAiU0tJUCIsICJ2aXNpdFBhcmVudHMiLCAidHJlZSIsICJ0ZXN0IiwgInZpc2l0b3IiLCAicmV2ZXJzZSIsICJjaGVjayIsICJpcyIsICJjb252ZXJ0IiwgInN0ZXAiLCAiZmFjdG9yeSIsICJub2RlIiwgImluZGV4IiwgInBhcmVudHMiLCAidmFsdWUiLCAibmFtZSIsICJ2aXNpdCIsICJjb2xvciIsICJyZXN1bHQiLCAic3VicmVzdWx0IiwgIm9mZnNldCIsICJncmFuZHBhcmVudHMiLCAidG9SZXN1bHQiLCAibm9kZUFzUGFyZW50IiwgImNoaWxkIiwgInZpc2l0IiwgInRyZWUiLCAidGVzdE9yVmlzaXRvciIsICJ2aXNpdG9yT3JSZXZlcnNlIiwgIm1heWJlUmV2ZXJzZSIsICJyZXZlcnNlIiwgInRlc3QiLCAidmlzaXRvciIsICJ2aXNpdFBhcmVudHMiLCAib3ZlcmxvYWQiLCAibm9kZSIsICJwYXJlbnRzIiwgInBhcmVudCIsICJpbmRleCIsICJyZWh5cGVDb252ZXJ0QWJub3JtYWxUYWdzVG9UZXh0IiwgImN1c3RvbVRhZ3MiLCAidHJlZSIsICJzY2hlbWEiLCAiY3JlYXRlU2FuaXRpemVTY2hlbWEiLCAiYWxsb3dlZFRhZ05hbWVzIiwgInZpc2l0IiwgIm5vZGUiLCAiaW5kZXgiLCAicGFyZW50IiwgInRhZ05hbWUiLCAidGFnU3RyaW5nIiwgImtleSIsICJ2YWx1ZSIsICJpbm5lckNvbnRlbnQiLCAicHJvY2Vzc0NoaWxkcmVuIiwgImNoaWxkcmVuIiwgImNoaWxkIiwgImVsZW1lbnRDaGlsZCIsICJjaGlsZFRhZyIsICJ0ZXh0Tm9kZSIsICJyZWh5cGVNYXRoSmF4Q2h0bWwiLCAiTUFUSF9KQVhGT05UX1VSTCIsICJERUZBVUxUX01BVEhKQVhfQ09ORklHIiwgImNvdW50UHJlY2VkaW5nQmFja3NsYXNoZXMiLCAiaW5wdXQiLCAiaW5kZXgiLCAiY291bnQiLCAiaSIsICJpc1VuZXNjYXBlZERlbGltaXRlciIsICJuZXh0Q2hhciIsICJmaW5kQ2xvc2luZ0RlbGltaXRlciIsICJmcm9tSW5kZXgiLCAiY2xvc2VDaGFyIiwgImlzTGluZVN0YXJ0IiwgInNjYW5GZW5jZSIsICJjaGFyIiwgImZlbmNlTGVuZ3RoIiwgImlzSW5kZW50ZWRDb2RlTGluZSIsICJub3JtYWxpemVMYXRleFBhcmVuc01hdGgiLCAib3V0cHV0IiwgImluRmVuY2VkQ29kZUJsb2NrIiwgImZlbmNlQ2hhciIsICJpbklubGluZUNvZGUiLCAiaW5saW5lQ29kZVRpY2tMZW5ndGgiLCAiZW5kIiwgImZlbmNlIiwgInRpY2tzIiwgImoiLCAiY2xvc2VJbmRleCIsICJpbm5lciIsICJzdGFydCIsICJyZW1hcmtNYXRoRGVsaW1pdGVycyIsICJjdXJyZW50UGFyc2VyIiwgImRvY3VtZW50IiwgImZpbGUiLCAibmV4dERvY3VtZW50IiwgIm5vcm1hbGl6ZWQiLCAiZ2V0UGFyc2VyIiwgInRhcmdldCIsICJvcHRpb24iLCAiY3VzdG9tVGFncyIsICJyZW1hcmtQbHVnaW5zIiwgInJlaHlwZVBsdWdpbnMiLCAiZXh0ZW5kZWRHcmFtbWFyIiwgIm1hdGhKYXhDb25maWciLCAic3VwcG9ydHNMYVRlWCIsICJleHRlbmRlZEdyYW1tYXJTZXQiLCAicGFyc2VyIiwgInVuaWZpZWQiLCAicmVtYXJrUGFyc2UiLCAicmVtYXJrR2ZtIiwgInJlbWFya01hdGhEZWxpbWl0ZXJzIiwgInJlbWFya01hdGgiLCAicmVtYXJrUmVoeXBlIiwgInJlaHlwZVJhdyIsICJyZWh5cGVDb252ZXJ0QWJub3JtYWxUYWdzVG9UZXh0IiwgInJlaHlwZVNhbml0aXplIiwgImNyZWF0ZVNhbml0aXplU2NoZW1hIiwgIm1lcmdlZENvbmZpZyIsICJERUZBVUxUX01BVEhKQVhfQ09ORklHIiwgInJlaHlwZU1hdGhKYXhDaHRtbCIsICJyZWh5cGVTdHJpbmdpZnkiLCAiUGFyc2VyIiwgIm9wdGlvbnMiLCAibWFya2Rvd24iLCAicmVzdWx0IiwgImdldFBhcnNlciIsICJwcm9jZXNzb3IiLCAidHJlZSIsICJtYXJrZG93bnMiLCAibWQiLCAiY3JlYXRlUGFyc2VyIiwgIndyYXAiLCAiZ2V0RW52aXJvbm1lbnQiLCAiZ2V0TWF4V29ya2VycyIsICJlbnYiLCAiY29yZXMiLCAiY3JlYXRlV29ya2VyIiwgIldvcmtlciIsICJQYXJzZXJXb3JrZXJQb29sIiwgIm9wdGlvbnMiLCAibWF4V29ya2VycyIsICJ3b3JrZXJQcm9taXNlcyIsICJ3b3JrZXIiLCAiV29ya2VyQ2xhc3MiLCAicGFyc2VyT3B0aW9ucyIsICJwcm94eSIsICJ3IiwgInJlc29sdmUiLCAiYXZhaWxhYmxlIiwgIm5leHQiLCAibWFya2Rvd24iLCAibWFya2Rvd25zIiwgIm1kIiwgImNyZWF0ZVdvcmtlclBvb2wiXQp9Cg==
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,9 @@
1
+ import{expose as le}from"comlink";import{unified as V}from"unified";import ee from"remark-parse";import te from"remark-gfm";import re from"remark-rehype";import ne from"rehype-stringify";import se from"remark-math";import oe from"rehype-sanitize";import ie from"rehype-raw";import{defaultSchema as b}from"rehype-sanitize";var $=["math","mrow","mi","mn","mo","mfrac","msup","msub","munder","mover","munderover","msqrt","mroot","mtext","mspace","menclose","mpadded","mphantom","mtable","mtr","mtd","mlabeledtr","maligngroup","malignmark","mstyle","merror","maction","semantics","annotation","annotation-xml"],v={math:["display","class","style","xmlns"],mrow:["class","style"],mi:["class","style","mathvariant"],mn:["class","style"],mo:["class","style","fence","separator","stretchy","symmetric","largeop","movablelimits","accent","lspace","rspace","form"],mfrac:["class","style","linethickness","numalign","denomalign","bevelled"],msup:["class","style","superscriptshift"],msub:["class","style","subscriptshift"],munder:["class","style","accentunder"],mover:["class","style","accent"],munderover:["class","style","accent","accentunder"],msqrt:["class","style"],mroot:["class","style"],mtext:["class","style","mathvariant"],mspace:["class","style","width","height","depth"],menclose:["class","style","notation"],mpadded:["class","style","width","height","depth","lspace","voffset"],mphantom:["class","style"],mtable:["class","style","align","rowalign","columnalign","groupalign","alignmentscope","columnwidth","width","rowspacing","columnspacing","rowlines","columnlines","frame","framespacing","equalrows","equalcolumns","displaystyle","side","minlabelspacing"],mtr:["class","style","rowalign","columnalign","groupalign"],mtd:["class","style","rowspan","columnspan","rowalign","columnalign","groupalign"],mlabeledtr:["class","style","rowalign","columnalign","groupalign"],maligngroup:["class","style","groupalign"],malignmark:["class","style","edge"],mstyle:["class","style","scriptlevel","displaystyle","scriptsizemultiplier","scriptminsize","infixlinebreakstyle","decimalpoint","mathvariant","mathsize","mathcolor","mathbackground"],merror:["class","style"],maction:["class","style","actiontype","selection"],semantics:["class","style"],annotation:["class","style","encoding"],"annotation-xml":["class","style","encoding"]};var A=(e=[])=>({...b,tagNames:[...b.tagNames||[],...$,...e],attributes:{...b.attributes,img:["src","alt","title","width","height","style","class"],code:[["className",/^language-./,"math-inline","math-display"]],...v,...e.reduce((t,r)=>(t[r]=["class","className","style","id","prop","src"],t),{})},protocols:{...b.protocols,src:["http","https","data","file"]}});var R=(function(e){if(e==null)return G;if(typeof e=="function")return w(e);if(typeof e=="object")return Array.isArray(e)?D(e):J(e);if(typeof e=="string")return X(e);throw new Error("Expected function, string, or object as test")});function D(e){let t=[],r=-1;for(;++r<e.length;)t[r]=R(e[r]);return w(i);function i(...a){let l=-1;for(;++l<t.length;)if(t[l].apply(this,a))return!0;return!1}}function J(e){let t=e;return w(r);function r(i){let a=i,l;for(l in e)if(a[l]!==t[l])return!1;return!0}}function X(e){return w(t);function t(r){return r&&r.type===e}}function w(e){return t;function t(r,i,a){return!!(B(r)&&e.call(this,r,typeof i=="number"?i:void 0,a||void 0))}}function G(){return!0}function B(e){return e!==null&&typeof e=="object"&&"type"in e}function O(e){return"\x1B[33m"+e+"\x1B[39m"}var j=[],k=!0,E=!1,N="skip";function C(e,t,r,i){let a;typeof t=="function"&&typeof r!="function"?(i=r,r=t):a=t;let l=R(a),c=i?-1:1;n(e,void 0,[])();function n(o,s,f){let g=o&&typeof o=="object"?o:{};if(typeof g.type=="string"){let m=typeof g.tagName=="string"?g.tagName:typeof g.name=="string"?g.name:void 0;Object.defineProperty(T,"name",{value:"node ("+O(o.type+(m?"<"+m+">":""))+")"})}return T;function T(){let m=j,d,u,y;if((!t||l(o,s,f[f.length-1]||void 0))&&(m=q(r(o,f)),m[0]===E))return m;if("children"in o&&o.children){let x=o;if(x.children&&m[0]!==N)for(u=(i?x.children.length:-1)+c,y=f.concat(x);u>-1&&u<x.children.length;){let P=x.children[u];if(d=n(P,u,y)(),d[0]===E)return d;u=typeof d[1]=="number"?d[1]:u+c}}return m}}}function q(e){return Array.isArray(e)?e:typeof e=="number"?[k,e]:e==null?j:[e]}function I(e,t,r,i){let a,l,c;typeof t=="function"&&typeof r!="function"?(l=void 0,c=t,a=r):(l=t,c=r,a=i),C(e,l,n,a);function n(o,s){let f=s[s.length-1],g=f?f.children.indexOf(o):void 0;return c(o,g,f)}}var _=(e=[])=>t=>{let r=A(e),i=new Set(r.tagNames||[]);I(t,"element",(a,l,c)=>{if(!c||l===void 0)return;let n=a.tagName;if(!i.has(n)&&/[^a-zA-Z]/.test(n)){let s=`<${n}`;if(a.properties)for(let[T,m]of Object.entries(a.properties))Array.isArray(m)?s+=` ${T}="${m.join(" ")}"`:m!=null&&(s+=` ${T}="${m}"`);let f="";if(a.children&&a.children.length>0){let T=m=>m.map(d=>{if(d.type==="text")return d.value;if(d.type==="element"){let u=d,y=`<${u.tagName}`;if(u.properties)for(let[x,P]of Object.entries(u.properties))Array.isArray(P)?y+=` ${x}="${P.join(" ")}"`:P!=null&&(y+=` ${x}="${P}"`);return y+=">",u.children&&(y+=T(u.children)),y+=`</${u.tagName}>`,y}return""}).join("");f=T(a.children)}s+=`>${f}</${n}>`;let g={type:"text",value:s};c.children[l]=g}})};import ae from"rehype-mathjax/chtml";var K="https://cdn.jsdelivr.net/npm/mathjax@3/es5/output/chtml/fonts/woff-v2",F={chtml:{fontURL:K}};var W=(e,t)=>{let r=0;for(let i=t-1;i>=0&&e[i]==="\\";i--)r++;return r},S=(e,t,r)=>e[t]!=="\\"||e[t+1]!==r?!1:W(e,t)%2===0,H=(e,t,r)=>{for(let i=t;i<e.length-1;i++)if(S(e,i,r))return i;return-1},U=(e,t)=>t===0||e[t-1]===`
2
+ `,Y=(e,t)=>{let r=e[t];if(r!=="`"&&r!=="~")return null;let i=0;for(let a=t;a<e.length&&e[a]===r;a++)i++;return i<3?null:{fenceChar:r,fenceLength:i}},Z=(e,t)=>U(e,t)?e[t]===" "?!0:e.slice(t,t+4)===" ":!1,Q=e=>{let t="",r=!1,i=null,a=0,l=!1,c=0;for(let n=0;n<e.length;){if(!r&&!l&&Z(e,n)){let o=e.indexOf(`
3
+ `,n);if(o===-1)return t+e.slice(n);t+=e.slice(n,o+1),n=o+1;continue}if(!l&&U(e,n)){let o=Y(e,n);if(o){r?i===o.fenceChar&&o.fenceLength>=a&&(r=!1,i=null,a=0):(r=!0,i=o.fenceChar,a=o.fenceLength);let s=e.indexOf(`
4
+ `,n);if(s===-1)return t+e.slice(n);t+=e.slice(n,s+1),n=s+1;continue}}if(!r){if(!l&&e[n]==="`"){let o=0;for(let s=n;s<e.length&&e[s]==="`";s++)o++;l=!0,c=o,t+=e.slice(n,n+o),n+=o;continue}if(l){if(e[n]==="`"){let o=0;for(let s=n;s<e.length&&e[s]==="`";s++)o++;if(o>=c){t+=e.slice(n,n+c),n+=c,l=!1,c=0;continue}}t+=e[n],n++;continue}}if(!r&&!l){if(S(e,n,"(")){let o=H(e,n+2,")");if(o!==-1){let s=e.slice(n+2,o);t+=`$${s}$`,n=o+2;continue}}if(S(e,n,"[")){let o=H(e,n+2,"]");if(o!==-1){let s=e.slice(n+2,o),f=s.startsWith(`
5
+ `)?"":`
6
+ `,g=s.endsWith(`
7
+ `)?"":`
8
+ `;t+=`$$${f}${s}${g}$$`,n=o+2;continue}}}t+=e[n],n++}return t},z=function(){let t=this.parser||this.Parser;t&&(this.Parser=function(i,a){let l=i;if(typeof i=="string"){let c=Q(i);l=c,a&&typeof a.value=="string"&&(a.value=c)}return t(l,a)},this.parser&&(this.parser=this.Parser))};var L=(e,t)=>{let{customTags:r=[],remarkPlugins:i=[],rehypePlugins:a=[],extendedGrammar:l=[],mathJaxConfig:c,supportsLaTeX:n=!1}=t,o=new Set(l),s=V().use(ee);if(o.has("gfm")&&(s=s.use(te)),o.has("mathjax")&&(n&&(s=s.use(z)),s=s.use(se)),i.length>0&&(s=s.use(i)),s=s.use(re,{allowDangerousHtml:!0}).use(ie).use(_,r).use(oe,A(r)),o.has("mathjax")){let f=c??F;s=s.use(ae,f)}return a.length>0&&(s=s.use(a)),e==="html"?s.use(ne,{allowDangerousHtml:!0}):s};var M=class{constructor(t={}){this.options=t}async parseToHTML(t){let i=await L("html",this.options).process(t);return String(i)}async parseToHAST(t){let r=L("hast",this.options),i=r.parse(t);return await r.run(i)}updateOptions(t){this.options=t}};le(M);
9
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL21vZHVsZXMvcGFyc2VyLndvcmtlci50cyIsICIuLi8uLi9zcmMvbW9kdWxlcy9jb3JlLnRzIiwgIi4uLy4uL3NyYy91dGlscy9jcmVhdGVTYW5pdGl6ZVNjaGVtYS50cyIsICIuLi8uLi9zcmMvY29uc3RzL3RhZ0ZpbHRlci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5pc3QtdXRpbC1pc0A2LjAuMS9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC1pcy9saWIvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50c0A2LjAuMi9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzL2xpYi9jb2xvci5ub2RlLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXZpc2l0LXBhcmVudHNANi4wLjIvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cy9saWIvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtdmlzaXRANS4wLjAvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQvbGliL2luZGV4LmpzIiwgIi4uLy4uL3NyYy9wbHVnaW4vcmVoeXBlQ29udmVydEFibm9ybWFsVGFnc1RvVGV4dC50cyIsICIuLi8uLi9zcmMvY29uc3RzL21hdGhqYXhkZWZhdWx0Q29uZmlnLnRzIiwgIi4uLy4uL3NyYy9wbHVnaW4vcmVtYXJrTWF0aERlbGltaXRlcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGV4cG9zZSB9IGZyb20gJ2NvbWxpbmsnO1xuaW1wb3J0IHsgUm9vdCB9IGZyb20gJ2hhc3QnO1xuaW1wb3J0IHsgZ2V0UGFyc2VyIH0gZnJvbSAnLi9jb3JlJztcbmltcG9ydCB0eXBlIHsgUGFyc2VyT3B0aW9ucyB9IGZyb20gJy4vcGFyc2VyJztcblxuLyoqXG4gKiBXb3JrZXIgXHU0RTJEXHU3Njg0XHU4OUUzXHU2NzkwXHU1NjY4XHU2NzBEXHU1MkExXG4gKi9cbmNsYXNzIFBhcnNlcldvcmtlclNlcnZpY2Uge1xuICBwcml2YXRlIG9wdGlvbnM6IFBhcnNlck9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogUGFyc2VyT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBcdTg5RTNcdTY3OTAgTWFya2Rvd24gXHU1MjMwIEhUTUxcbiAgICovXG4gIGFzeW5jIHBhcnNlVG9IVE1MKG1hcmtkb3duOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHByb2Nlc3NvciA9IGdldFBhcnNlcignaHRtbCcsIHRoaXMub3B0aW9ucyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvY2Vzc29yLnByb2Nlc3MobWFya2Rvd24pO1xuICAgIHJldHVybiBTdHJpbmcocmVzdWx0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcdTg5RTNcdTY3OTAgTWFya2Rvd24gXHU1MjMwIEhBU1RcbiAgICovXG4gIGFzeW5jIHBhcnNlVG9IQVNUKG1hcmtkb3duOiBzdHJpbmcpOiBQcm9taXNlPFJvb3Q+IHtcbiAgICBjb25zdCBwcm9jZXNzb3IgPSBnZXRQYXJzZXIoJ2hhc3QnLCB0aGlzLm9wdGlvbnMpO1xuICAgIGNvbnN0IHRyZWUgPSBwcm9jZXNzb3IucGFyc2UobWFya2Rvd24pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb2Nlc3Nvci5ydW4odHJlZSk7XG4gICAgcmV0dXJuIHJlc3VsdCBhcyBSb290O1xuICB9XG5cbiAgLyoqXG4gICAqIFx1NjZGNFx1NjVCMFx1OTAwOVx1OTg3OVxuICAgKi9cbiAgdXBkYXRlT3B0aW9ucyhvcHRpb25zOiBQYXJzZXJPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxufVxuXG4vLyBcdTY2QjRcdTk3MzIgV29ya2VyIFx1NjcwRFx1NTJBMVxuZXhwb3NlKFBhcnNlcldvcmtlclNlcnZpY2UpO1xuIiwgImltcG9ydCB7IEV4dGVuZHNQcm9wcywgUmVuZGVyVHlwZSB9IGZyb20gJy4uL3R5cGVzL3Byb3BzJztcbmltcG9ydCB7IFBsdWdnYWJsZUxpc3QsIFByb2Nlc3NvciwgdW5pZmllZCB9IGZyb20gJ3VuaWZpZWQnO1xuaW1wb3J0IHsgUm9vdCB9IGZyb20gJ2hhc3QnO1xuaW1wb3J0IHJlbWFya1BhcnNlIGZyb20gJ3JlbWFyay1wYXJzZSc7XG5pbXBvcnQgcmVtYXJrR2ZtIGZyb20gJ3JlbWFyay1nZm0nO1xuaW1wb3J0IHJlbWFya1JlaHlwZSBmcm9tICdyZW1hcmstcmVoeXBlJztcbmltcG9ydCByZWh5cGVTdHJpbmdpZnkgZnJvbSAncmVoeXBlLXN0cmluZ2lmeSc7XG5pbXBvcnQgcmVtYXJrTWF0aCBmcm9tICdyZW1hcmstbWF0aCc7XG5pbXBvcnQgcmVoeXBlU2FuaXRpemUgZnJvbSAncmVoeXBlLXNhbml0aXplJztcbmltcG9ydCByZWh5cGVSYXcgZnJvbSAncmVoeXBlLXJhdyc7XG5pbXBvcnQgeyBjcmVhdGVTYW5pdGl6ZVNjaGVtYSB9IGZyb20gJy4uL3V0aWxzL2NyZWF0ZVNhbml0aXplU2NoZW1hJztcbmltcG9ydCB7IHJlaHlwZUNvbnZlcnRBYm5vcm1hbFRhZ3NUb1RleHQgfSBmcm9tICcuLi9wbHVnaW4vcmVoeXBlQ29udmVydEFibm9ybWFsVGFnc1RvVGV4dCc7XG5pbXBvcnQgcmVoeXBlTWF0aEpheENodG1sIGZyb20gJ3JlaHlwZS1tYXRoamF4L2NodG1sJztcbmltcG9ydCB0eXBlIHsgT3B0aW9ucyBhcyBNYXRoSmF4T3B0aW9ucyB9IGZyb20gJ3JlaHlwZS1tYXRoamF4L2NodG1sJztcbmltcG9ydCB7IERFRkFVTFRfTUFUSEpBWF9DT05GSUcgfSBmcm9tICcuLi9jb25zdHMvbWF0aGpheGRlZmF1bHRDb25maWcnO1xuaW1wb3J0IHsgcmVtYXJrTWF0aERlbGltaXRlcnMgfSBmcm9tICcuLi9wbHVnaW4vcmVtYXJrTWF0aERlbGltaXRlcnMnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbnR5cGUgQW55UHJvY2Vzc29yID0gUHJvY2Vzc29yPGFueSwgYW55LCBhbnksIGFueSwgYW55PjtcblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJQcm9wcyB7XG4gIGN1c3RvbVRhZ3M/OiBzdHJpbmdbXTtcbiAgZXh0ZW5kZWRHcmFtbWFyPzogRXh0ZW5kc1Byb3BzW107XG4gIC8qKlxuICAgKiBSZW1hcmsgcGx1Z2lucyBhcHBlbmRlZCBiZWZvcmUgYHJlbWFya1JlaHlwZWAgKHByb2Nlc3MgTWFya2Rvd24gQVNUKVxuICAgKi9cbiAgcmVtYXJrUGx1Z2lucz86IFBsdWdnYWJsZUxpc3Q7XG4gIC8qKlxuICAgKiBSZWh5cGUgcGx1Z2lucyBhcHBlbmRlZCBhZnRlciBgcmVoeXBlUmF3L3JlaHlwZVNhbml0aXplYCAocHJvY2VzcyBIVE1MIEFTVClcbiAgICovXG4gIHJlaHlwZVBsdWdpbnM/OiBQbHVnZ2FibGVMaXN0O1xuICAvKipcbiAgICogTWF0aEpheCBjb25maWcgb3B0aW9ucyAob25seSBlZmZlY3RpdmUgd2hlbiBleHRlbmRlZEdyYW1tYXIgaW5jbHVkZXMgJ21hdGhqYXgnKVxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5tYXRoamF4Lm9yZy9lbi9sYXRlc3Qvb3B0aW9ucy9pbmRleC5odG1sXG4gICAqL1xuICBtYXRoSmF4Q29uZmlnPzogTWF0aEpheE9wdGlvbnM7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN1cHBvcnQgTGFUZVggc3ludGF4ICh1c2luZyBcXFxcKCBhbmQgXFxcXFsgYXMgbWF0aCBkZWxpbWl0ZXJzKVxuICAgKiBXaGVuIHRydWUsIGVuYWJsZXMgcmVtYXJrTWF0aERlbGltaXRlcnMgdG8gcGFyc2UgTGFUZVggc3ludGF4XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBzdXBwb3J0c0xhVGVYPzogYm9vbGVhbjtcbn1cbmV4cG9ydCBjb25zdCBnZXRQYXJzZXIgPSA8VCBleHRlbmRzIFJlbmRlclR5cGU+KFxuICB0YXJnZXQ6IFQsXG4gIG9wdGlvbjogUmVuZGVyUHJvcHNcbik6IFQgZXh0ZW5kcyAnaHRtbCdcbiAgPyBQcm9jZXNzb3I8Um9vdCwgUm9vdCwgUm9vdCwgUm9vdCwgc3RyaW5nPlxuICA6IFByb2Nlc3NvcjxSb290LCBSb290LCBSb290LCB1bmRlZmluZWQsIHVuZGVmaW5lZD4gPT4ge1xuICBjb25zdCB7XG4gICAgY3VzdG9tVGFncyA9IFtdLFxuICAgIHJlbWFya1BsdWdpbnMgPSBbXSxcbiAgICByZWh5cGVQbHVnaW5zID0gW10sXG4gICAgZXh0ZW5kZWRHcmFtbWFyID0gW10sXG4gICAgbWF0aEpheENvbmZpZyxcbiAgICBzdXBwb3J0c0xhVGVYID0gZmFsc2UsXG4gIH0gPSBvcHRpb247XG4gIGNvbnN0IGV4dGVuZGVkR3JhbW1hclNldCA9IG5ldyBTZXQoZXh0ZW5kZWRHcmFtbWFyKTtcbiAgbGV0IHBhcnNlcjogQW55UHJvY2Vzc29yID0gdW5pZmllZCgpLnVzZShyZW1hcmtQYXJzZSkgYXMgQW55UHJvY2Vzc29yO1xuICBpZiAoZXh0ZW5kZWRHcmFtbWFyU2V0LmhhcygnZ2ZtJykpIHBhcnNlciA9IHBhcnNlci51c2UocmVtYXJrR2ZtKTtcbiAgaWYgKGV4dGVuZGVkR3JhbW1hclNldC5oYXMoJ21hdGhqYXgnKSkge1xuICAgIGlmIChzdXBwb3J0c0xhVGVYKSB7XG4gICAgICBwYXJzZXIgPSBwYXJzZXIudXNlKHJlbWFya01hdGhEZWxpbWl0ZXJzKTtcbiAgICB9XG4gICAgcGFyc2VyID0gcGFyc2VyLnVzZShyZW1hcmtNYXRoKTtcbiAgfVxuXG4gIC8vIEFwcGVuZCByZW1hcmsgcGx1Z2lucyBiZWZvcmUgcmVtYXJrUmVoeXBlXG4gIGlmIChyZW1hcmtQbHVnaW5zLmxlbmd0aCA+IDApIHtcbiAgICBwYXJzZXIgPSBwYXJzZXIudXNlKHJlbWFya1BsdWdpbnMpO1xuICB9XG5cbiAgcGFyc2VyID0gcGFyc2VyXG4gICAgLnVzZShyZW1hcmtSZWh5cGUsIHsgYWxsb3dEYW5nZXJvdXNIdG1sOiB0cnVlIH0pXG4gICAgLnVzZShyZWh5cGVSYXcpXG4gICAgLnVzZShyZWh5cGVDb252ZXJ0QWJub3JtYWxUYWdzVG9UZXh0LCBjdXN0b21UYWdzKVxuICAgIC51c2UocmVoeXBlU2FuaXRpemUsIGNyZWF0ZVNhbml0aXplU2NoZW1hKGN1c3RvbVRhZ3MpKTtcblxuICBpZiAoZXh0ZW5kZWRHcmFtbWFyU2V0LmhhcygnbWF0aGpheCcpKSB7XG4gICAgY29uc3QgbWVyZ2VkQ29uZmlnOiBNYXRoSmF4T3B0aW9ucyA9IG1hdGhKYXhDb25maWcgPz8gREVGQVVMVF9NQVRISkFYX0NPTkZJRztcbiAgICBwYXJzZXIgPSBwYXJzZXIudXNlKHJlaHlwZU1hdGhKYXhDaHRtbCwgbWVyZ2VkQ29uZmlnKTtcbiAgfVxuXG4gIC8vIEFwcGVuZCByZWh5cGUgcGx1Z2lucyBhZnRlciByZWh5cGVSYXcvcmVoeXBlU2FuaXRpemVcbiAgaWYgKHJlaHlwZVBsdWdpbnMubGVuZ3RoID4gMCkge1xuICAgIHBhcnNlciA9IHBhcnNlci51c2UocmVoeXBlUGx1Z2lucyk7XG4gIH1cblxuICBpZiAodGFyZ2V0ID09PSAnaHRtbCcpIHtcbiAgICByZXR1cm4gcGFyc2VyLnVzZShyZWh5cGVTdHJpbmdpZnksIHtcbiAgICAgIGFsbG93RGFuZ2Vyb3VzSHRtbDogdHJ1ZSxcbiAgICB9KSBhcyBUIGV4dGVuZHMgJ2h0bWwnXG4gICAgICA/IFByb2Nlc3NvcjxSb290LCBSb290LCBSb290LCBSb290LCBzdHJpbmc+XG4gICAgICA6IFByb2Nlc3NvcjxSb290LCBSb290LCBSb290LCB1bmRlZmluZWQsIHVuZGVmaW5lZD47XG4gIH1cbiAgcmV0dXJuIHBhcnNlciBhcyBUIGV4dGVuZHMgJ2h0bWwnXG4gICAgPyBQcm9jZXNzb3I8Um9vdCwgUm9vdCwgUm9vdCwgUm9vdCwgc3RyaW5nPlxuICAgIDogUHJvY2Vzc29yPFJvb3QsIFJvb3QsIFJvb3QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkPjtcbn07XG4iLCAiLy8gQ3JlYXRlIHNhbml0aXplIHNjaGVtYVxuaW1wb3J0IHsgZGVmYXVsdFNjaGVtYSB9IGZyb20gJ3JlaHlwZS1zYW5pdGl6ZSc7XG5pbXBvcnQgeyBNQVRITUxfQVRUUklCVVRFUywgTUFUSE1MX1RBR19OQU1FUyB9IGZyb20gJy4uL2NvbnN0cy90YWdGaWx0ZXInO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlU2FuaXRpemVTY2hlbWEgPSAoY3VzdG9tVGFnczogc3RyaW5nW10gPSBbXSk6IHR5cGVvZiBkZWZhdWx0U2NoZW1hID0+ICh7XG4gIC4uLmRlZmF1bHRTY2hlbWEsXG4gIHRhZ05hbWVzOiBbLi4uKGRlZmF1bHRTY2hlbWEudGFnTmFtZXMgfHwgW10pLCAuLi5NQVRITUxfVEFHX05BTUVTLCAuLi5jdXN0b21UYWdzXSxcbiAgYXR0cmlidXRlczoge1xuICAgIC4uLmRlZmF1bHRTY2hlbWEuYXR0cmlidXRlcyxcblxuICAgIC8vIEFsbG93IHNyYyBhdHRyaWJ1dGUgZm9yIGltZyB0YWdzIHdpdGggZmlsZTovLyBwcm90b2NvbCBhbmQgb3RoZXIgcHJvdG9jb2xzXG4gICAgaW1nOiBbJ3NyYycsICdhbHQnLCAndGl0bGUnLCAnd2lkdGgnLCAnaGVpZ2h0JywgJ3N0eWxlJywgJ2NsYXNzJ10sXG4gICAgLy8gVGhlIGBsYW5ndWFnZS0qYCByZWdleCBpcyBhbGxvd2VkIGJ5IGRlZmF1bHQuXG4gICAgY29kZTogW1snY2xhc3NOYW1lJywgL15sYW5ndWFnZS0uLywgJ21hdGgtaW5saW5lJywgJ21hdGgtZGlzcGxheSddXSxcbiAgICAuLi5NQVRITUxfQVRUUklCVVRFUyxcbiAgICAvLyBBZGQgYmFzaWMgYXR0cmlidXRlcyBmb3IgY3VzdG9tIHRhZ3NcbiAgICAuLi5jdXN0b21UYWdzLnJlZHVjZShcbiAgICAgIChhY2MsIHRhZykgPT4ge1xuICAgICAgICBhY2NbdGFnXSA9IFsnY2xhc3MnLCAnY2xhc3NOYW1lJywgJ3N0eWxlJywgJ2lkJywgJ3Byb3AnLCAnc3JjJ107XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LFxuICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nW10+XG4gICAgKSxcbiAgfSxcbiAgcHJvdG9jb2xzOiB7XG4gICAgLi4uZGVmYXVsdFNjaGVtYS5wcm90b2NvbHMsXG4gICAgc3JjOiBbJ2h0dHAnLCAnaHR0cHMnLCAnZGF0YScsICdmaWxlJ10sXG4gIH0sXG59KTtcbiIsICJleHBvcnQgY29uc3QgTUFUSE1MX1RBR19OQU1FUzogc3RyaW5nW10gPSBbXG4gICdtYXRoJyxcbiAgJ21yb3cnLFxuICAnbWknLFxuICAnbW4nLFxuICAnbW8nLFxuICAnbWZyYWMnLFxuICAnbXN1cCcsXG4gICdtc3ViJyxcbiAgJ211bmRlcicsXG4gICdtb3ZlcicsXG4gICdtdW5kZXJvdmVyJyxcbiAgJ21zcXJ0JyxcbiAgJ21yb290JyxcbiAgJ210ZXh0JyxcbiAgJ21zcGFjZScsXG4gICdtZW5jbG9zZScsXG4gICdtcGFkZGVkJyxcbiAgJ21waGFudG9tJyxcbiAgJ210YWJsZScsXG4gICdtdHInLFxuICAnbXRkJyxcbiAgJ21sYWJlbGVkdHInLFxuICAnbWFsaWduZ3JvdXAnLFxuICAnbWFsaWdubWFyaycsXG4gICdtc3R5bGUnLFxuICAnbWVycm9yJyxcbiAgJ21hY3Rpb24nLFxuICAnc2VtYW50aWNzJyxcbiAgJ2Fubm90YXRpb24nLFxuICAnYW5ub3RhdGlvbi14bWwnLFxuXSBhcyBjb25zdDtcblxuLy8gTWF0aE1MIGF0dHJpYnV0ZSBjb25maWd1cmF0aW9uXG5leHBvcnQgY29uc3QgTUFUSE1MX0FUVFJJQlVURVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHtcbiAgbWF0aDogWydkaXNwbGF5JywgJ2NsYXNzJywgJ3N0eWxlJywgJ3htbG5zJ10sXG4gIG1yb3c6IFsnY2xhc3MnLCAnc3R5bGUnXSxcbiAgbWk6IFsnY2xhc3MnLCAnc3R5bGUnLCAnbWF0aHZhcmlhbnQnXSxcbiAgbW46IFsnY2xhc3MnLCAnc3R5bGUnXSxcbiAgbW86IFtcbiAgICAnY2xhc3MnLFxuICAgICdzdHlsZScsXG4gICAgJ2ZlbmNlJyxcbiAgICAnc2VwYXJhdG9yJyxcbiAgICAnc3RyZXRjaHknLFxuICAgICdzeW1tZXRyaWMnLFxuICAgICdsYXJnZW9wJyxcbiAgICAnbW92YWJsZWxpbWl0cycsXG4gICAgJ2FjY2VudCcsXG4gICAgJ2xzcGFjZScsXG4gICAgJ3JzcGFjZScsXG4gICAgJ2Zvcm0nLFxuICBdLFxuICBtZnJhYzogWydjbGFzcycsICdzdHlsZScsICdsaW5ldGhpY2tuZXNzJywgJ251bWFsaWduJywgJ2Rlbm9tYWxpZ24nLCAnYmV2ZWxsZWQnXSxcbiAgbXN1cDogWydjbGFzcycsICdzdHlsZScsICdzdXBlcnNjcmlwdHNoaWZ0J10sXG4gIG1zdWI6IFsnY2xhc3MnLCAnc3R5bGUnLCAnc3Vic2NyaXB0c2hpZnQnXSxcbiAgbXVuZGVyOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ2FjY2VudHVuZGVyJ10sXG4gIG1vdmVyOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ2FjY2VudCddLFxuICBtdW5kZXJvdmVyOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ2FjY2VudCcsICdhY2NlbnR1bmRlciddLFxuICBtc3FydDogWydjbGFzcycsICdzdHlsZSddLFxuICBtcm9vdDogWydjbGFzcycsICdzdHlsZSddLFxuICBtdGV4dDogWydjbGFzcycsICdzdHlsZScsICdtYXRodmFyaWFudCddLFxuICBtc3BhY2U6IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0JywgJ2RlcHRoJ10sXG4gIG1lbmNsb3NlOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ25vdGF0aW9uJ10sXG4gIG1wYWRkZWQ6IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0JywgJ2RlcHRoJywgJ2xzcGFjZScsICd2b2Zmc2V0J10sXG4gIG1waGFudG9tOiBbJ2NsYXNzJywgJ3N0eWxlJ10sXG4gIG10YWJsZTogW1xuICAgICdjbGFzcycsXG4gICAgJ3N0eWxlJyxcbiAgICAnYWxpZ24nLFxuICAgICdyb3dhbGlnbicsXG4gICAgJ2NvbHVtbmFsaWduJyxcbiAgICAnZ3JvdXBhbGlnbicsXG4gICAgJ2FsaWdubWVudHNjb3BlJyxcbiAgICAnY29sdW1ud2lkdGgnLFxuICAgICd3aWR0aCcsXG4gICAgJ3Jvd3NwYWNpbmcnLFxuICAgICdjb2x1bW5zcGFjaW5nJyxcbiAgICAncm93bGluZXMnLFxuICAgICdjb2x1bW5saW5lcycsXG4gICAgJ2ZyYW1lJyxcbiAgICAnZnJhbWVzcGFjaW5nJyxcbiAgICAnZXF1YWxyb3dzJyxcbiAgICAnZXF1YWxjb2x1bW5zJyxcbiAgICAnZGlzcGxheXN0eWxlJyxcbiAgICAnc2lkZScsXG4gICAgJ21pbmxhYmVsc3BhY2luZycsXG4gIF0sXG4gIG10cjogWydjbGFzcycsICdzdHlsZScsICdyb3dhbGlnbicsICdjb2x1bW5hbGlnbicsICdncm91cGFsaWduJ10sXG4gIG10ZDogWydjbGFzcycsICdzdHlsZScsICdyb3dzcGFuJywgJ2NvbHVtbnNwYW4nLCAncm93YWxpZ24nLCAnY29sdW1uYWxpZ24nLCAnZ3JvdXBhbGlnbiddLFxuICBtbGFiZWxlZHRyOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3Jvd2FsaWduJywgJ2NvbHVtbmFsaWduJywgJ2dyb3VwYWxpZ24nXSxcbiAgbWFsaWduZ3JvdXA6IFsnY2xhc3MnLCAnc3R5bGUnLCAnZ3JvdXBhbGlnbiddLFxuICBtYWxpZ25tYXJrOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ2VkZ2UnXSxcbiAgbXN0eWxlOiBbXG4gICAgJ2NsYXNzJyxcbiAgICAnc3R5bGUnLFxuICAgICdzY3JpcHRsZXZlbCcsXG4gICAgJ2Rpc3BsYXlzdHlsZScsXG4gICAgJ3NjcmlwdHNpemVtdWx0aXBsaWVyJyxcbiAgICAnc2NyaXB0bWluc2l6ZScsXG4gICAgJ2luZml4bGluZWJyZWFrc3R5bGUnLFxuICAgICdkZWNpbWFscG9pbnQnLFxuICAgICdtYXRodmFyaWFudCcsXG4gICAgJ21hdGhzaXplJyxcbiAgICAnbWF0aGNvbG9yJyxcbiAgICAnbWF0aGJhY2tncm91bmQnLFxuICBdLFxuICBtZXJyb3I6IFsnY2xhc3MnLCAnc3R5bGUnXSxcbiAgbWFjdGlvbjogWydjbGFzcycsICdzdHlsZScsICdhY3Rpb250eXBlJywgJ3NlbGVjdGlvbiddLFxuICBzZW1hbnRpY3M6IFsnY2xhc3MnLCAnc3R5bGUnXSxcbiAgYW5ub3RhdGlvbjogWydjbGFzcycsICdzdHlsZScsICdlbmNvZGluZyddLFxuICAnYW5ub3RhdGlvbi14bWwnOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ2VuY29kaW5nJ10sXG59O1xuIiwgIi8qKlxuICogQGltcG9ydCB7Tm9kZSwgUGFyZW50fSBmcm9tICd1bmlzdCdcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBGblxuICogQHRlbXBsYXRlIEZhbGxiYWNrXG4gKiBAdHlwZWRlZiB7Rm4gZXh0ZW5kcyAodmFsdWU6IGFueSkgPT4gdmFsdWUgaXMgaW5mZXIgVGhpbmcgPyBUaGluZyA6IEZhbGxiYWNrfSBQcmVkaWNhdGVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDaGVja1xuICogICBDaGVjayB0aGF0IGFuIGFyYml0cmFyeSB2YWx1ZSBpcyBhIG5vZGUuXG4gKiBAcGFyYW0ge3Vua25vd259IHRoaXNcbiAqICAgVGhlIGdpdmVuIGNvbnRleHQuXG4gKiBAcGFyYW0ge3Vua25vd259IFtub2RlXVxuICogICBBbnl0aGluZyAodHlwaWNhbGx5IGEgbm9kZSkuXG4gKiBAcGFyYW0ge251bWJlciB8IG51bGwgfCB1bmRlZmluZWR9IFtpbmRleF1cbiAqICAgVGhlIG5vZGVcdTIwMTlzIHBvc2l0aW9uIGluIGl0cyBwYXJlbnQuXG4gKiBAcGFyYW0ge1BhcmVudCB8IG51bGwgfCB1bmRlZmluZWR9IFtwYXJlbnRdXG4gKiAgIFRoZSBub2RlXHUyMDE5cyBwYXJlbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqICAgV2hldGhlciB0aGlzIGlzIGEgbm9kZSBhbmQgcGFzc2VzIGEgdGVzdC5cbiAqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBOb2RlfSBQcm9wc1xuICogICBPYmplY3QgdG8gY2hlY2sgZm9yIGVxdWl2YWxlbmNlLlxuICpcbiAqICAgTm90ZTogYE5vZGVgIGlzIGluY2x1ZGVkIGFzIGl0IGlzIGNvbW1vbiBidXQgaXMgbm90IGluZGV4YWJsZS5cbiAqXG4gKiBAdHlwZWRlZiB7QXJyYXk8UHJvcHMgfCBUZXN0RnVuY3Rpb24gfCBzdHJpbmc+IHwgUmVhZG9ubHlBcnJheTxQcm9wcyB8IFRlc3RGdW5jdGlvbiB8IHN0cmluZz4gfCBQcm9wcyB8IFRlc3RGdW5jdGlvbiB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFRlc3RcbiAqICAgQ2hlY2sgZm9yIGFuIGFyYml0cmFyeSBub2RlLlxuICpcbiAqIEBjYWxsYmFjayBUZXN0RnVuY3Rpb25cbiAqICAgQ2hlY2sgaWYgYSBub2RlIHBhc3NlcyBhIHRlc3QuXG4gKiBAcGFyYW0ge3Vua25vd259IHRoaXNcbiAqICAgVGhlIGdpdmVuIGNvbnRleHQuXG4gKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAqICAgQSBub2RlLlxuICogQHBhcmFtIHtudW1iZXIgfCB1bmRlZmluZWR9IFtpbmRleF1cbiAqICAgVGhlIG5vZGVcdTIwMTlzIHBvc2l0aW9uIGluIGl0cyBwYXJlbnQuXG4gKiBAcGFyYW0ge1BhcmVudCB8IHVuZGVmaW5lZH0gW3BhcmVudF1cbiAqICAgVGhlIG5vZGVcdTIwMTlzIHBhcmVudC5cbiAqIEByZXR1cm5zIHtib29sZWFuIHwgdW5kZWZpbmVkIHwgdm9pZH1cbiAqICAgV2hldGhlciB0aGlzIG5vZGUgcGFzc2VzIHRoZSB0ZXN0LlxuICpcbiAqICAgTm90ZTogYHZvaWRgIGlzIGluY2x1ZGVkIHVudGlsIFRTIHNlZXMgbm8gcmV0dXJuIGFzIGB1bmRlZmluZWRgLlxuICovXG5cbi8qKlxuICogQ2hlY2sgaWYgYG5vZGVgIGlzIGEgYE5vZGVgIGFuZCB3aGV0aGVyIGl0IHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG5vZGVcbiAqICAgVGhpbmcgdG8gY2hlY2ssIHR5cGljYWxseSBgTm9kZWAuXG4gKiBAcGFyYW0ge1Rlc3R9IHRlc3RcbiAqICAgQSBjaGVjayBmb3IgYSBzcGVjaWZpYyBub2RlLlxuICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBpbmRleFxuICogICBUaGUgbm9kZVx1MjAxOXMgcG9zaXRpb24gaW4gaXRzIHBhcmVudC5cbiAqIEBwYXJhbSB7UGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZH0gcGFyZW50XG4gKiAgIFRoZSBub2RlXHUyMDE5cyBwYXJlbnQuXG4gKiBAcGFyYW0ge3Vua25vd259IGNvbnRleHRcbiAqICAgQ29udGV4dCBvYmplY3QgKGB0aGlzYCkgdG8gcGFzcyB0byBgdGVzdGAgZnVuY3Rpb25zLlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiAgIFdoZXRoZXIgYG5vZGVgIGlzIGEgbm9kZSBhbmQgcGFzc2VzIGEgdGVzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzID1cbiAgLy8gTm90ZTogb3ZlcmxvYWRzIGluIEpTRG9jIGNhblx1MjAxOXQgeWV0IHVzZSBkaWZmZXJlbnQgYEB0ZW1wbGF0ZWBzLlxuICAvKipcbiAgICogQHR5cGUgeyhcbiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIFJlYWRvbmx5QXJyYXk8c3RyaW5nPj4obm9kZTogdW5rbm93biwgdGVzdDogQ29uZGl0aW9uLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiB7dHlwZTogQ29uZGl0aW9uW251bWJlcl19KSAmXG4gICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBBcnJheTxzdHJpbmc+Pihub2RlOiB1bmtub3duLCB0ZXN0OiBDb25kaXRpb24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSAmIHt0eXBlOiBDb25kaXRpb25bbnVtYmVyXX0pICZcbiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIHN0cmluZz4obm9kZTogdW5rbm93biwgdGVzdDogQ29uZGl0aW9uLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiB7dHlwZTogQ29uZGl0aW9ufSkgJlxuICAgKiAgICg8Q29uZGl0aW9uIGV4dGVuZHMgUHJvcHM+KG5vZGU6IHVua25vd24sIHRlc3Q6IENvbmRpdGlvbiwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYgQ29uZGl0aW9uKSAmXG4gICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBUZXN0RnVuY3Rpb24+KG5vZGU6IHVua25vd24sIHRlc3Q6IENvbmRpdGlvbiwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYgUHJlZGljYXRlPENvbmRpdGlvbiwgTm9kZT4pICZcbiAgICogICAoKG5vZGU/OiBudWxsIHwgdW5kZWZpbmVkKSA9PiBmYWxzZSkgJlxuICAgKiAgICgobm9kZTogdW5rbm93biwgdGVzdD86IG51bGwgfCB1bmRlZmluZWQsIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSkgJlxuICAgKiAgICgobm9kZTogdW5rbm93biwgdGVzdD86IFRlc3QsIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IGJvb2xlYW4pXG4gICAqICl9XG4gICAqL1xuICAoXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHt1bmtub3dufSBbbm9kZV1cbiAgICAgKiBAcGFyYW0ge1Rlc3R9IFt0ZXN0XVxuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gW2luZGV4XVxuICAgICAqIEBwYXJhbSB7UGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZH0gW3BhcmVudF1cbiAgICAgKiBAcGFyYW0ge3Vua25vd259IFtjb250ZXh0XVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zXG4gICAgZnVuY3Rpb24gKG5vZGUsIHRlc3QsIGluZGV4LCBwYXJlbnQsIGNvbnRleHQpIHtcbiAgICAgIGNvbnN0IGNoZWNrID0gY29udmVydCh0ZXN0KVxuXG4gICAgICBpZiAoXG4gICAgICAgIGluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgaW5kZXggIT09IG51bGwgJiZcbiAgICAgICAgKHR5cGVvZiBpbmRleCAhPT0gJ251bWJlcicgfHxcbiAgICAgICAgICBpbmRleCA8IDAgfHxcbiAgICAgICAgICBpbmRleCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcG9zaXRpdmUgZmluaXRlIGluZGV4JylcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBwYXJlbnQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBwYXJlbnQgIT09IG51bGwgJiZcbiAgICAgICAgKCFpcyhwYXJlbnQpIHx8ICFwYXJlbnQuY2hpbGRyZW4pXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBwYXJlbnQgbm9kZScpXG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgKHBhcmVudCA9PT0gdW5kZWZpbmVkIHx8IHBhcmVudCA9PT0gbnVsbCkgIT09XG4gICAgICAgIChpbmRleCA9PT0gdW5kZWZpbmVkIHx8IGluZGV4ID09PSBudWxsKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYm90aCBwYXJlbnQgYW5kIGluZGV4JylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvb2tzTGlrZUFOb2RlKG5vZGUpXG4gICAgICAgID8gY2hlY2suY2FsbChjb250ZXh0LCBub2RlLCBpbmRleCwgcGFyZW50KVxuICAgICAgICA6IGZhbHNlXG4gICAgfVxuICApXG5cbi8qKlxuICogR2VuZXJhdGUgYW4gYXNzZXJ0aW9uIGZyb20gYSB0ZXN0LlxuICpcbiAqIFVzZWZ1bCBpZiB5b3VcdTIwMTlyZSBnb2luZyB0byB0ZXN0IG1hbnkgbm9kZXMsIGZvciBleGFtcGxlIHdoZW4gY3JlYXRpbmcgYVxuICogdXRpbGl0eSB3aGVyZSBzb21ldGhpbmcgZWxzZSBwYXNzZXMgYSBjb21wYXRpYmxlIHRlc3QuXG4gKlxuICogVGhlIGNyZWF0ZWQgZnVuY3Rpb24gaXMgYSBiaXQgZmFzdGVyIGJlY2F1c2UgaXQgZXhwZWN0cyB2YWxpZCBpbnB1dCBvbmx5OlxuICogYSBgbm9kZWAsIGBpbmRleGAsIGFuZCBgcGFyZW50YC5cbiAqXG4gKiBAcGFyYW0ge1Rlc3R9IHRlc3RcbiAqICAgKiAgIHdoZW4gbnVsbGlzaCwgY2hlY2tzIGlmIGBub2RlYCBpcyBhIGBOb2RlYC5cbiAqICAgKiAgIHdoZW4gYHN0cmluZ2AsIHdvcmtzIGxpa2UgcGFzc2luZyBgKG5vZGUpID0+IG5vZGUudHlwZSA9PT0gdGVzdGAuXG4gKiAgICogICB3aGVuIGBmdW5jdGlvbmAgY2hlY2tzIGlmIGZ1bmN0aW9uIHBhc3NlZCB0aGUgbm9kZSBpcyB0cnVlLlxuICogICAqICAgd2hlbiBgb2JqZWN0YCwgY2hlY2tzIHRoYXQgYWxsIGtleXMgaW4gdGVzdCBhcmUgaW4gbm9kZSwgYW5kIHRoYXQgdGhleSBoYXZlIChzdHJpY3RseSkgZXF1YWwgdmFsdWVzLlxuICogICAqICAgd2hlbiBgYXJyYXlgLCBjaGVja3MgaWYgYW55IG9uZSBvZiB0aGUgc3VidGVzdHMgcGFzcy5cbiAqIEByZXR1cm5zIHtDaGVja31cbiAqICAgQW4gYXNzZXJ0aW9uLlxuICovXG5leHBvcnQgY29uc3QgY29udmVydCA9XG4gIC8vIE5vdGU6IG92ZXJsb2FkcyBpbiBKU0RvYyBjYW5cdTIwMTl0IHlldCB1c2UgZGlmZmVyZW50IGBAdGVtcGxhdGVgcy5cbiAgLyoqXG4gICAqIEB0eXBlIHsoXG4gICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBzdHJpbmc+KHRlc3Q6IENvbmRpdGlvbikgPT4gKG5vZGU6IHVua25vd24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSAmIHt0eXBlOiBDb25kaXRpb259KSAmXG4gICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBQcm9wcz4odGVzdDogQ29uZGl0aW9uKSA9PiAobm9kZTogdW5rbm93biwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYgQ29uZGl0aW9uKSAmXG4gICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBUZXN0RnVuY3Rpb24+KHRlc3Q6IENvbmRpdGlvbikgPT4gKG5vZGU6IHVua25vd24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSAmIFByZWRpY2F0ZTxDb25kaXRpb24sIE5vZGU+KSAmXG4gICAqICAgKCh0ZXN0PzogbnVsbCB8IHVuZGVmaW5lZCkgPT4gKG5vZGU/OiB1bmtub3duLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUpICZcbiAgICogICAoKHRlc3Q/OiBUZXN0KSA9PiBDaGVjaylcbiAgICogKX1cbiAgICovXG4gIChcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1Rlc3R9IFt0ZXN0XVxuICAgICAqIEByZXR1cm5zIHtDaGVja31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiAodGVzdCkge1xuICAgICAgaWYgKHRlc3QgPT09IG51bGwgfHwgdGVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBva1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHRlc3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGNhc3RGYWN0b3J5KHRlc3QpXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdGVzdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGVzdClcbiAgICAgICAgICA/IGFueUZhY3RvcnkodGVzdClcbiAgICAgICAgICA6IC8vIENhc3QgYmVjYXVzZSBgUmVhZG9ubHlBcnJheWAgZ29lcyBpbnRvIHRoZSBhYm92ZSBidXQgYGlzQXJyYXlgXG4gICAgICAgICAgICAvLyBuYXJyb3dzIHRvIGBBcnJheWAuXG4gICAgICAgICAgICBwcm9wZXJ0aWVzRmFjdG9yeSgvKiogQHR5cGUge1Byb3BzfSAqLyAodGVzdCkpXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdGVzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVGYWN0b3J5KHRlc3QpXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZnVuY3Rpb24sIHN0cmluZywgb3Igb2JqZWN0IGFzIHRlc3QnKVxuICAgIH1cbiAgKVxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXk8UHJvcHMgfCBUZXN0RnVuY3Rpb24gfCBzdHJpbmc+fSB0ZXN0c1xuICogQHJldHVybnMge0NoZWNrfVxuICovXG5mdW5jdGlvbiBhbnlGYWN0b3J5KHRlc3RzKSB7XG4gIC8qKiBAdHlwZSB7QXJyYXk8Q2hlY2s+fSAqL1xuICBjb25zdCBjaGVja3MgPSBbXVxuICBsZXQgaW5kZXggPSAtMVxuXG4gIHdoaWxlICgrK2luZGV4IDwgdGVzdHMubGVuZ3RoKSB7XG4gICAgY2hlY2tzW2luZGV4XSA9IGNvbnZlcnQodGVzdHNbaW5kZXhdKVxuICB9XG5cbiAgcmV0dXJuIGNhc3RGYWN0b3J5KGFueSlcblxuICAvKipcbiAgICogQHRoaXMge3Vua25vd259XG4gICAqIEB0eXBlIHtUZXN0RnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBhbnkoLi4ucGFyYW1ldGVycykge1xuICAgIGxldCBpbmRleCA9IC0xXG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGNoZWNrcy5sZW5ndGgpIHtcbiAgICAgIGlmIChjaGVja3NbaW5kZXhdLmFwcGx5KHRoaXMsIHBhcmFtZXRlcnMpKSByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8qKlxuICogVHVybiBhbiBvYmplY3QgaW50byBhIHRlc3QgZm9yIGEgbm9kZSB3aXRoIGEgY2VydGFpbiBmaWVsZHMuXG4gKlxuICogQHBhcmFtIHtQcm9wc30gY2hlY2tcbiAqIEByZXR1cm5zIHtDaGVja31cbiAqL1xuZnVuY3Rpb24gcHJvcGVydGllc0ZhY3RvcnkoY2hlY2spIHtcbiAgY29uc3QgY2hlY2tBc1JlY29yZCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChjaGVjaylcblxuICByZXR1cm4gY2FzdEZhY3RvcnkoYWxsKVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBhbGwobm9kZSkge1xuICAgIGNvbnN0IG5vZGVBc1JlY29yZCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChcbiAgICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKG5vZGUpXG4gICAgKVxuXG4gICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgbGV0IGtleVxuXG4gICAgZm9yIChrZXkgaW4gY2hlY2spIHtcbiAgICAgIGlmIChub2RlQXNSZWNvcmRba2V5XSAhPT0gY2hlY2tBc1JlY29yZFtrZXldKSByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59XG5cbi8qKlxuICogVHVybiBhIHN0cmluZyBpbnRvIGEgdGVzdCBmb3IgYSBub2RlIHdpdGggYSBjZXJ0YWluIHR5cGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNoZWNrXG4gKiBAcmV0dXJucyB7Q2hlY2t9XG4gKi9cbmZ1bmN0aW9uIHR5cGVGYWN0b3J5KGNoZWNrKSB7XG4gIHJldHVybiBjYXN0RmFjdG9yeSh0eXBlKVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICovXG4gIGZ1bmN0aW9uIHR5cGUobm9kZSkge1xuICAgIHJldHVybiBub2RlICYmIG5vZGUudHlwZSA9PT0gY2hlY2tcbiAgfVxufVxuXG4vKipcbiAqIFR1cm4gYSBjdXN0b20gdGVzdCBpbnRvIGEgdGVzdCBmb3IgYSBub2RlIHRoYXQgcGFzc2VzIHRoYXQgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge1Rlc3RGdW5jdGlvbn0gdGVzdEZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7Q2hlY2t9XG4gKi9cbmZ1bmN0aW9uIGNhc3RGYWN0b3J5KHRlc3RGdW5jdGlvbikge1xuICByZXR1cm4gY2hlY2tcblxuICAvKipcbiAgICogQHRoaXMge3Vua25vd259XG4gICAqIEB0eXBlIHtDaGVja31cbiAgICovXG4gIGZ1bmN0aW9uIGNoZWNrKHZhbHVlLCBpbmRleCwgcGFyZW50KSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oXG4gICAgICBsb29rc0xpa2VBTm9kZSh2YWx1ZSkgJiZcbiAgICAgICAgdGVzdEZ1bmN0aW9uLmNhbGwoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICB0eXBlb2YgaW5kZXggPT09ICdudW1iZXInID8gaW5kZXggOiB1bmRlZmluZWQsXG4gICAgICAgICAgcGFyZW50IHx8IHVuZGVmaW5lZFxuICAgICAgICApXG4gICAgKVxuICB9XG59XG5cbmZ1bmN0aW9uIG9rKCkge1xuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBOb2RlfVxuICovXG5mdW5jdGlvbiBsb29rc0xpa2VBTm9kZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAndHlwZScgaW4gdmFsdWVcbn1cbiIsICIvKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBkXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3IoZCkge1xuICByZXR1cm4gJ1xcdTAwMUJbMzNtJyArIGQgKyAnXFx1MDAxQlszOW0nXG59XG4iLCAiLyoqXG4gKiBAaW1wb3J0IHtOb2RlIGFzIFVuaXN0Tm9kZSwgUGFyZW50IGFzIFVuaXN0UGFyZW50fSBmcm9tICd1bmlzdCdcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFeGNsdWRlPGltcG9ydCgndW5pc3QtdXRpbC1pcycpLlRlc3QsIHVuZGVmaW5lZD4gfCB1bmRlZmluZWR9IFRlc3RcbiAqICAgVGVzdCBmcm9tIGB1bmlzdC11dGlsLWlzYC5cbiAqXG4gKiAgIE5vdGU6IHdlIGhhdmUgcmVtb3ZlIGFuZCBhZGQgYHVuZGVmaW5lZGAsIGJlY2F1c2Ugb3RoZXJ3aXNlIHdoZW4gZ2VuZXJhdGluZ1xuICogICBhdXRvbWF0aWMgYC5kLnRzYCBmaWxlcywgVFMgdHJpZXMgdG8gZmxhdHRlbiBwYXRocyBmcm9tIGEgbG9jYWwgcGVyc3BlY3RpdmUsXG4gKiAgIHdoaWNoIGRvZXNuXHUyMDE5dCB3b3JrIHdoZW4gcHVibGlzaGluZyBvbiBucG0uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBGbiBleHRlbmRzICh2YWx1ZTogYW55KSA9PiB2YWx1ZSBpcyBpbmZlciBUaGluZ1xuICogICA/IFRoaW5nXG4gKiAgIDogRmFsbGJhY2tcbiAqICl9IFByZWRpY2F0ZVxuICogICBHZXQgdGhlIHZhbHVlIG9mIGEgdHlwZSBndWFyZCBgRm5gLlxuICogQHRlbXBsYXRlIEZuXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgZnVuY3Rpb24gdGhhdCBpcyBhIHR5cGUgZ3VhcmQgKHN1Y2ggYXMgYCh4KTogeCBpcyBZYCkuXG4gKiBAdGVtcGxhdGUgRmFsbGJhY2tcbiAqICAgVmFsdWUgdG8geWllbGQgaWYgYEZuYCBpcyBub3QgYSB0eXBlIGd1YXJkLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgQ2hlY2sgZXh0ZW5kcyBudWxsIHwgdW5kZWZpbmVkIC8vIE5vIHRlc3QuXG4gKiAgID8gVmFsdWVcbiAqICAgOiBWYWx1ZSBleHRlbmRzIHt0eXBlOiBDaGVja30gLy8gU3RyaW5nICh0eXBlKSB0ZXN0LlxuICogICA/IFZhbHVlXG4gKiAgIDogVmFsdWUgZXh0ZW5kcyBDaGVjayAvLyBQYXJ0aWFsIHRlc3QuXG4gKiAgID8gVmFsdWVcbiAqICAgOiBDaGVjayBleHRlbmRzIEZ1bmN0aW9uIC8vIEZ1bmN0aW9uIHRlc3QuXG4gKiAgID8gUHJlZGljYXRlPENoZWNrLCBWYWx1ZT4gZXh0ZW5kcyBWYWx1ZVxuICogICAgID8gUHJlZGljYXRlPENoZWNrLCBWYWx1ZT5cbiAqICAgICA6IG5ldmVyXG4gKiAgIDogbmV2ZXIgLy8gU29tZSBvdGhlciB0ZXN0P1xuICogKX0gTWF0Y2hlc09uZVxuICogICBDaGVjayB3aGV0aGVyIGEgbm9kZSBtYXRjaGVzIGEgcHJpbWl0aXZlIGNoZWNrIGluIHRoZSB0eXBlIHN5c3RlbS5cbiAqIEB0ZW1wbGF0ZSBWYWx1ZVxuICogICBWYWx1ZTsgdHlwaWNhbGx5IHVuaXN0IGBOb2RlYC5cbiAqIEB0ZW1wbGF0ZSBDaGVja1xuICogICBWYWx1ZTsgdHlwaWNhbGx5IGB1bmlzdC11dGlsLWlzYC1jb21wYXRpYmxlIHRlc3QsIGJ1dCBub3QgYXJyYXlzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgQ2hlY2sgZXh0ZW5kcyBSZWFkb25seUFycmF5PGluZmVyIFQ+XG4gKiAgID8gTWF0Y2hlc09uZTxWYWx1ZSwgVD5cbiAqICAgOiBDaGVjayBleHRlbmRzIEFycmF5PGluZmVyIFQ+XG4gKiAgID8gTWF0Y2hlc09uZTxWYWx1ZSwgVD5cbiAqICAgOiBNYXRjaGVzT25lPFZhbHVlLCBDaGVjaz5cbiAqICl9IE1hdGNoZXNcbiAqICAgQ2hlY2sgd2hldGhlciBhIG5vZGUgbWF0Y2hlcyBhIGNoZWNrIGluIHRoZSB0eXBlIHN5c3RlbS5cbiAqIEB0ZW1wbGF0ZSBWYWx1ZVxuICogICBWYWx1ZTsgdHlwaWNhbGx5IHVuaXN0IGBOb2RlYC5cbiAqIEB0ZW1wbGF0ZSBDaGVja1xuICogICBWYWx1ZTsgdHlwaWNhbGx5IGB1bmlzdC11dGlsLWlzYC1jb21wYXRpYmxlIHRlc3QuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7MCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8IDcgfCA4IHwgOSB8IDEwfSBVaW50XG4gKiAgIE51bWJlcjsgY2FwcGVkIHJlYXNvbmFibHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SSBleHRlbmRzIDAgPyAxIDogSSBleHRlbmRzIDEgPyAyIDogSSBleHRlbmRzIDIgPyAzIDogSSBleHRlbmRzIDMgPyA0IDogSSBleHRlbmRzIDQgPyA1IDogSSBleHRlbmRzIDUgPyA2IDogSSBleHRlbmRzIDYgPyA3IDogSSBleHRlbmRzIDcgPyA4IDogSSBleHRlbmRzIDggPyA5IDogMTB9IEluY3JlbWVudFxuICogICBJbmNyZW1lbnQgYSBudW1iZXIgaW4gdGhlIHR5cGUgc3lzdGVtLlxuICogQHRlbXBsYXRlIHtVaW50fSBbST0wXVxuICogICBJbmRleC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIE5vZGUgZXh0ZW5kcyBVbmlzdFBhcmVudFxuICogICA/IE5vZGUgZXh0ZW5kcyB7Y2hpbGRyZW46IEFycmF5PGluZmVyIENoaWxkcmVuPn1cbiAqICAgICA/IENoaWxkIGV4dGVuZHMgQ2hpbGRyZW4gPyBOb2RlIDogbmV2ZXJcbiAqICAgICA6IG5ldmVyXG4gKiAgIDogbmV2ZXJcbiAqICl9IEludGVybmFsUGFyZW50XG4gKiAgIENvbGxlY3Qgbm9kZXMgdGhhdCBjYW4gYmUgcGFyZW50cyBvZiBgQ2hpbGRgLlxuICogQHRlbXBsYXRlIHtVbmlzdE5vZGV9IE5vZGVcbiAqICAgQWxsIG5vZGUgdHlwZXMgaW4gYSB0cmVlLlxuICogQHRlbXBsYXRlIHtVbmlzdE5vZGV9IENoaWxkXG4gKiAgIE5vZGUgdG8gc2VhcmNoIGZvci5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtJbnRlcm5hbFBhcmVudDxJbmNsdXNpdmVEZXNjZW5kYW50PFRyZWU+LCBDaGlsZD59IFBhcmVudFxuICogICBDb2xsZWN0IG5vZGVzIGluIGBUcmVlYCB0aGF0IGNhbiBiZSBwYXJlbnRzIG9mIGBDaGlsZGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gVHJlZVxuICogICBBbGwgbm9kZSB0eXBlcyBpbiBhIHRyZWUuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gQ2hpbGRcbiAqICAgTm9kZSB0byBzZWFyY2ggZm9yLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgRGVwdGggZXh0ZW5kcyBNYXhcbiAqICAgPyBuZXZlclxuICogICA6XG4gKiAgICAgfCBJbnRlcm5hbFBhcmVudDxOb2RlLCBDaGlsZD5cbiAqICAgICB8IEludGVybmFsQW5jZXN0b3I8Tm9kZSwgSW50ZXJuYWxQYXJlbnQ8Tm9kZSwgQ2hpbGQ+LCBNYXgsIEluY3JlbWVudDxEZXB0aD4+XG4gKiApfSBJbnRlcm5hbEFuY2VzdG9yXG4gKiAgIENvbGxlY3Qgbm9kZXMgaW4gYFRyZWVgIHRoYXQgY2FuIGJlIGFuY2VzdG9ycyBvZiBgQ2hpbGRgLlxuICogQHRlbXBsYXRlIHtVbmlzdE5vZGV9IE5vZGVcbiAqICAgQWxsIG5vZGUgdHlwZXMgaW4gYSB0cmVlLlxuICogQHRlbXBsYXRlIHtVbmlzdE5vZGV9IENoaWxkXG4gKiAgIE5vZGUgdG8gc2VhcmNoIGZvci5cbiAqIEB0ZW1wbGF0ZSB7VWludH0gW01heD0xMF1cbiAqICAgTWF4OyBzZWFyY2hlcyB1cCB0byB0aGlzIGRlcHRoLlxuICogQHRlbXBsYXRlIHtVaW50fSBbRGVwdGg9MF1cbiAqICAgQ3VycmVudCBkZXB0aC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtJbnRlcm5hbEFuY2VzdG9yPEluY2x1c2l2ZURlc2NlbmRhbnQ8VHJlZT4sIENoaWxkPn0gQW5jZXN0b3JcbiAqICAgQ29sbGVjdCBub2RlcyBpbiBgVHJlZWAgdGhhdCBjYW4gYmUgYW5jZXN0b3JzIG9mIGBDaGlsZGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gVHJlZVxuICogICBBbGwgbm9kZSB0eXBlcyBpbiBhIHRyZWUuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gQ2hpbGRcbiAqICAgTm9kZSB0byBzZWFyY2ggZm9yLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgVHJlZSBleHRlbmRzIFVuaXN0UGFyZW50XG4gKiAgICAgPyBEZXB0aCBleHRlbmRzIE1heFxuICogICAgICAgPyBUcmVlXG4gKiAgICAgICA6IFRyZWUgfCBJbmNsdXNpdmVEZXNjZW5kYW50PFRyZWVbJ2NoaWxkcmVuJ11bbnVtYmVyXSwgTWF4LCBJbmNyZW1lbnQ8RGVwdGg+PlxuICogICAgIDogVHJlZVxuICogKX0gSW5jbHVzaXZlRGVzY2VuZGFudFxuICogICBDb2xsZWN0IGFsbCAoaW5jbHVzaXZlKSBkZXNjZW5kYW50cyBvZiBgVHJlZWAuXG4gKlxuICogICA+IFx1RDgzRFx1REM0OSAqKk5vdGUqKjogZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoaXMgc2VlbXMgdG8gYmUgdGhlIGZhc3Rlc3Qgd2F5IHRvXG4gKiAgID4gcmVjdXJzZSB3aXRob3V0IGFjdHVhbGx5IHJ1bm5pbmcgaW50byBhbiBpbmZpbml0ZSBsb29wLCB3aGljaCB0aGVcbiAqICAgPiBwcmV2aW91cyB2ZXJzaW9uIGRpZC5cbiAqICAgPlxuICogICA+IFByYWN0aWNhbGx5LCBhIG1heCBvZiBgMmAgaXMgdHlwaWNhbGx5IGVub3VnaCBhc3N1bWluZyBhIGBSb290YCBpc1xuICogICA+IHBhc3NlZCwgYnV0IGl0IGRvZXNuXHUyMDE5dCBpbXByb3ZlIHBlcmZvcm1hbmNlLlxuICogICA+IEl0IGdldHMgaGlnaGVyIHdpdGggYExpc3QgPiBMaXN0SXRlbSA+IFRhYmxlID4gVGFibGVSb3cgPiBUYWJsZUNlbGxgLlxuICogICA+IFVzaW5nIHVwIHRvIGAxMGAgZG9lc25cdTIwMTl0IGh1cnQgb3IgaGVscCBlaXRoZXIuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gVHJlZVxuICogICBUcmVlIHR5cGUuXG4gKiBAdGVtcGxhdGUge1VpbnR9IFtNYXg9MTBdXG4gKiAgIE1heDsgc2VhcmNoZXMgdXAgdG8gdGhpcyBkZXB0aC5cbiAqIEB0ZW1wbGF0ZSB7VWludH0gW0RlcHRoPTBdXG4gKiAgIEN1cnJlbnQgZGVwdGguXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J3NraXAnIHwgYm9vbGVhbn0gQWN0aW9uXG4gKiAgIFVuaW9uIG9mIHRoZSBhY3Rpb24gdHlwZXMuXG4gKlxuICogQHR5cGVkZWYge251bWJlcn0gSW5kZXhcbiAqICAgTW92ZSB0byB0aGUgc2libGluZyBhdCBgaW5kZXhgIG5leHQgKGFmdGVyIG5vZGUgaXRzZWxmIGlzIGNvbXBsZXRlbHlcbiAqICAgdHJhdmVyc2VkKS5cbiAqXG4gKiAgIFVzZWZ1bCBpZiBtdXRhdGluZyB0aGUgdHJlZSwgc3VjaCBhcyByZW1vdmluZyB0aGUgbm9kZSB0aGUgdmlzaXRvciBpc1xuICogICBjdXJyZW50bHkgb24sIG9yIGFueSBvZiBpdHMgcHJldmlvdXMgc2libGluZ3MuXG4gKiAgIFJlc3VsdHMgbGVzcyB0aGFuIDAgb3IgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGBjaGlsZHJlbi5sZW5ndGhgIHN0b3BcbiAqICAgdHJhdmVyc2luZyB0aGUgcGFyZW50LlxuICpcbiAqIEB0eXBlZGVmIHtbKEFjdGlvbiB8IG51bGwgfCB1bmRlZmluZWQgfCB2b2lkKT8sIChJbmRleCB8IG51bGwgfCB1bmRlZmluZWQpP119IEFjdGlvblR1cGxlXG4gKiAgIExpc3Qgd2l0aCBvbmUgb3IgdHdvIHZhbHVlcywgdGhlIGZpcnN0IGFuIGFjdGlvbiwgdGhlIHNlY29uZCBhbiBpbmRleC5cbiAqXG4gKiBAdHlwZWRlZiB7QWN0aW9uIHwgQWN0aW9uVHVwbGUgfCBJbmRleCB8IG51bGwgfCB1bmRlZmluZWQgfCB2b2lkfSBWaXNpdG9yUmVzdWx0XG4gKiAgIEFueSB2YWx1ZSB0aGF0IGNhbiBiZSByZXR1cm5lZCBmcm9tIGEgdmlzaXRvci5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBWaXNpdG9yXG4gKiAgIEhhbmRsZSBhIG5vZGUgKG1hdGNoaW5nIGB0ZXN0YCwgaWYgZ2l2ZW4pLlxuICpcbiAqICAgVmlzaXRvcnMgYXJlIGZyZWUgdG8gdHJhbnNmb3JtIGBub2RlYC5cbiAqICAgVGhleSBjYW4gYWxzbyB0cmFuc2Zvcm0gdGhlIHBhcmVudCBvZiBub2RlICh0aGUgbGFzdCBvZiBgYW5jZXN0b3JzYCkuXG4gKlxuICogICBSZXBsYWNpbmcgYG5vZGVgIGl0c2VsZiwgaWYgYFNLSVBgIGlzIG5vdCByZXR1cm5lZCwgc3RpbGwgY2F1c2VzIGl0c1xuICogICBkZXNjZW5kYW50cyB0byBiZSB3YWxrZWQgKHdoaWNoIGlzIGEgYnVnKS5cbiAqXG4gKiAgIFdoZW4gYWRkaW5nIG9yIHJlbW92aW5nIHByZXZpb3VzIHNpYmxpbmdzIG9mIGBub2RlYCAob3IgbmV4dCBzaWJsaW5ncywgaW5cbiAqICAgY2FzZSBvZiByZXZlcnNlKSwgdGhlIGBWaXNpdG9yYCBzaG91bGQgcmV0dXJuIGEgbmV3IGBJbmRleGAgdG8gc3BlY2lmeSB0aGVcbiAqICAgc2libGluZyB0byB0cmF2ZXJzZSBhZnRlciBgbm9kZWAgaXMgdHJhdmVyc2VkLlxuICogICBBZGRpbmcgb3IgcmVtb3ZpbmcgbmV4dCBzaWJsaW5ncyBvZiBgbm9kZWAgKG9yIHByZXZpb3VzIHNpYmxpbmdzLCBpbiBjYXNlXG4gKiAgIG9mIHJldmVyc2UpIGlzIGhhbmRsZWQgYXMgZXhwZWN0ZWQgd2l0aG91dCBuZWVkaW5nIHRvIHJldHVybiBhIG5ldyBgSW5kZXhgLlxuICpcbiAqICAgUmVtb3ZpbmcgdGhlIGNoaWxkcmVuIHByb3BlcnR5IG9mIGFuIGFuY2VzdG9yIHN0aWxsIHJlc3VsdHMgaW4gdGhlbSBiZWluZ1xuICogICB0cmF2ZXJzZWQuXG4gKiBAcGFyYW0ge1Zpc2l0ZWR9IG5vZGVcbiAqICAgRm91bmQgbm9kZS5cbiAqIEBwYXJhbSB7QXJyYXk8VmlzaXRlZFBhcmVudHM+fSBhbmNlc3RvcnNcbiAqICAgQW5jZXN0b3JzIG9mIGBub2RlYC5cbiAqIEByZXR1cm5zIHtWaXNpdG9yUmVzdWx0fVxuICogICBXaGF0IHRvIGRvIG5leHQuXG4gKlxuICogICBBbiBgSW5kZXhgIGlzIHRyZWF0ZWQgYXMgYSB0dXBsZSBvZiBgW0NPTlRJTlVFLCBJbmRleF1gLlxuICogICBBbiBgQWN0aW9uYCBpcyB0cmVhdGVkIGFzIGEgdHVwbGUgb2YgYFtBY3Rpb25dYC5cbiAqXG4gKiAgIFBhc3NpbmcgYSB0dXBsZSBiYWNrIG9ubHkgbWFrZXMgc2Vuc2UgaWYgdGhlIGBBY3Rpb25gIGlzIGBTS0lQYC5cbiAqICAgV2hlbiB0aGUgYEFjdGlvbmAgaXMgYEVYSVRgLCB0aGF0IGFjdGlvbiBjYW4gYmUgcmV0dXJuZWQuXG4gKiAgIFdoZW4gdGhlIGBBY3Rpb25gIGlzIGBDT05USU5VRWAsIGBJbmRleGAgY2FuIGJlIHJldHVybmVkLlxuICogQHRlbXBsYXRlIHtVbmlzdE5vZGV9IFtWaXNpdGVkPVVuaXN0Tm9kZV1cbiAqICAgVmlzaXRlZCBub2RlIHR5cGUuXG4gKiBAdGVtcGxhdGUge1VuaXN0UGFyZW50fSBbVmlzaXRlZFBhcmVudHM9VW5pc3RQYXJlbnRdXG4gKiAgIEFuY2VzdG9yIHR5cGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7VmlzaXRvcjxNYXRjaGVzPEluY2x1c2l2ZURlc2NlbmRhbnQ8VHJlZT4sIENoZWNrPiwgQW5jZXN0b3I8VHJlZSwgTWF0Y2hlczxJbmNsdXNpdmVEZXNjZW5kYW50PFRyZWU+LCBDaGVjaz4+Pn0gQnVpbGRWaXNpdG9yXG4gKiAgIEJ1aWxkIGEgdHlwZWQgYFZpc2l0b3JgIGZ1bmN0aW9uIGZyb20gYSB0cmVlIGFuZCBhIHRlc3QuXG4gKlxuICogICBJdCB3aWxsIGluZmVyIHdoaWNoIHZhbHVlcyBhcmUgcGFzc2VkIGFzIGBub2RlYCBhbmQgd2hpY2ggYXMgYHBhcmVudHNgLlxuICogQHRlbXBsYXRlIHtVbmlzdE5vZGV9IFtUcmVlPVVuaXN0Tm9kZV1cbiAqICAgVHJlZSB0eXBlLlxuICogQHRlbXBsYXRlIHtUZXN0fSBbQ2hlY2s9VGVzdF1cbiAqICAgVGVzdCB0eXBlLlxuICovXG5cbmltcG9ydCB7Y29udmVydH0gZnJvbSAndW5pc3QtdXRpbC1pcydcbmltcG9ydCB7Y29sb3J9IGZyb20gJ3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cy9kby1ub3QtdXNlLWNvbG9yJ1xuXG4vKiogQHR5cGUge1JlYWRvbmx5PEFjdGlvblR1cGxlPn0gKi9cbmNvbnN0IGVtcHR5ID0gW11cblxuLyoqXG4gKiBDb250aW51ZSB0cmF2ZXJzaW5nIGFzIG5vcm1hbC5cbiAqL1xuZXhwb3J0IGNvbnN0IENPTlRJTlVFID0gdHJ1ZVxuXG4vKipcbiAqIFN0b3AgdHJhdmVyc2luZyBpbW1lZGlhdGVseS5cbiAqL1xuZXhwb3J0IGNvbnN0IEVYSVQgPSBmYWxzZVxuXG4vKipcbiAqIERvIG5vdCB0cmF2ZXJzZSB0aGlzIG5vZGVcdTIwMTlzIGNoaWxkcmVuLlxuICovXG5leHBvcnQgY29uc3QgU0tJUCA9ICdza2lwJ1xuXG4vKipcbiAqIFZpc2l0IG5vZGVzLCB3aXRoIGFuY2VzdHJhbCBpbmZvcm1hdGlvbi5cbiAqXG4gKiBUaGlzIGFsZ29yaXRobSBwZXJmb3JtcyAqZGVwdGgtZmlyc3QqICp0cmVlIHRyYXZlcnNhbCogaW4gKnByZW9yZGVyKlxuICogKCoqTkxSKiopIG9yIGlmIGByZXZlcnNlYCBpcyBnaXZlbiwgaW4gKnJldmVyc2UgcHJlb3JkZXIqICgqKk5STCoqKS5cbiAqXG4gKiBZb3UgY2FuIGNob29zZSBmb3Igd2hpY2ggbm9kZXMgYHZpc2l0b3JgIGlzIGNhbGxlZCBieSBwYXNzaW5nIGEgYHRlc3RgLlxuICogRm9yIGNvbXBsZXggdGVzdHMsIHlvdSBzaG91bGQgdGVzdCB5b3Vyc2VsZiBpbiBgdmlzaXRvcmAsIGFzIGl0IHdpbGwgYmVcbiAqIGZhc3RlciBhbmQgd2lsbCBoYXZlIGltcHJvdmVkIHR5cGUgaW5mb3JtYXRpb24uXG4gKlxuICogV2Fsa2luZyB0aGUgdHJlZSBpcyBhbiBpbnRlbnNpdmUgdGFzay5cbiAqIE1ha2UgdXNlIG9mIHRoZSByZXR1cm4gdmFsdWVzIG9mIHRoZSB2aXNpdG9yIHdoZW4gcG9zc2libGUuXG4gKiBJbnN0ZWFkIG9mIHdhbGtpbmcgYSB0cmVlIG11bHRpcGxlIHRpbWVzLCB3YWxrIGl0IG9uY2UsIHVzZSBgdW5pc3QtdXRpbC1pc2BcbiAqIHRvIGNoZWNrIGlmIGEgbm9kZSBtYXRjaGVzLCBhbmQgdGhlbiBwZXJmb3JtIGRpZmZlcmVudCBvcGVyYXRpb25zLlxuICpcbiAqIFlvdSBjYW4gY2hhbmdlIHRoZSB0cmVlLlxuICogU2VlIGBWaXNpdG9yYCBmb3IgbW9yZSBpbmZvLlxuICpcbiAqIEBvdmVybG9hZFxuICogQHBhcmFtIHtUcmVlfSB0cmVlXG4gKiBAcGFyYW0ge0NoZWNrfSBjaGVja1xuICogQHBhcmFtIHtCdWlsZFZpc2l0b3I8VHJlZSwgQ2hlY2s+fSB2aXNpdG9yXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkfSBbcmV2ZXJzZV1cbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKlxuICogQG92ZXJsb2FkXG4gKiBAcGFyYW0ge1RyZWV9IHRyZWVcbiAqIEBwYXJhbSB7QnVpbGRWaXNpdG9yPFRyZWU+fSB2aXNpdG9yXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkfSBbcmV2ZXJzZV1cbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKlxuICogQHBhcmFtIHtVbmlzdE5vZGV9IHRyZWVcbiAqICAgVHJlZSB0byB0cmF2ZXJzZS5cbiAqIEBwYXJhbSB7VmlzaXRvciB8IFRlc3R9IHRlc3RcbiAqICAgYHVuaXN0LXV0aWwtaXNgLWNvbXBhdGlibGUgdGVzdFxuICogQHBhcmFtIHtWaXNpdG9yIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWR9IFt2aXNpdG9yXVxuICogICBIYW5kbGUgZWFjaCBub2RlLlxuICogQHBhcmFtIHtib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZH0gW3JldmVyc2VdXG4gKiAgIFRyYXZlcnNlIGluIHJldmVyc2UgcHJlb3JkZXIgKE5STCkgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBwcmVvcmRlciAoTkxSKS5cbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKiAgIE5vdGhpbmcuXG4gKlxuICogQHRlbXBsYXRlIHtVbmlzdE5vZGV9IFRyZWVcbiAqICAgTm9kZSB0eXBlLlxuICogQHRlbXBsYXRlIHtUZXN0fSBDaGVja1xuICogICBgdW5pc3QtdXRpbC1pc2AtY29tcGF0aWJsZSB0ZXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRQYXJlbnRzKHRyZWUsIHRlc3QsIHZpc2l0b3IsIHJldmVyc2UpIHtcbiAgLyoqIEB0eXBlIHtUZXN0fSAqL1xuICBsZXQgY2hlY2tcblxuICBpZiAodHlwZW9mIHRlc3QgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZpc2l0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXZlcnNlID0gdmlzaXRvclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igbm8gdmlzaXRvciBnaXZlbiwgc28gYHZpc2l0b3JgIGlzIHRlc3QuXG4gICAgdmlzaXRvciA9IHRlc3RcbiAgfSBlbHNlIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHZpc2l0b3IgZ2l2ZW4sIHNvIGB0ZXN0YCBpc25cdTIwMTl0IGEgdmlzaXRvci5cbiAgICBjaGVjayA9IHRlc3RcbiAgfVxuXG4gIGNvbnN0IGlzID0gY29udmVydChjaGVjaylcbiAgY29uc3Qgc3RlcCA9IHJldmVyc2UgPyAtMSA6IDFcblxuICBmYWN0b3J5KHRyZWUsIHVuZGVmaW5lZCwgW10pKClcblxuICAvKipcbiAgICogQHBhcmFtIHtVbmlzdE5vZGV9IG5vZGVcbiAgICogQHBhcmFtIHtudW1iZXIgfCB1bmRlZmluZWR9IGluZGV4XG4gICAqIEBwYXJhbSB7QXJyYXk8VW5pc3RQYXJlbnQ+fSBwYXJlbnRzXG4gICAqL1xuICBmdW5jdGlvbiBmYWN0b3J5KG5vZGUsIGluZGV4LCBwYXJlbnRzKSB7XG4gICAgY29uc3QgdmFsdWUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoXG4gICAgICBub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyA/IG5vZGUgOiB7fVxuICAgIClcblxuICAgIGlmICh0eXBlb2YgdmFsdWUudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IG5hbWUgPVxuICAgICAgICAvLyBgaGFzdGBcbiAgICAgICAgdHlwZW9mIHZhbHVlLnRhZ05hbWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyB2YWx1ZS50YWdOYW1lXG4gICAgICAgICAgOiAvLyBgeGFzdGBcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZS5uYW1lID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyB2YWx1ZS5uYW1lXG4gICAgICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmlzaXQsICduYW1lJywge1xuICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAnbm9kZSAoJyArIGNvbG9yKG5vZGUudHlwZSArIChuYW1lID8gJzwnICsgbmFtZSArICc+JyA6ICcnKSkgKyAnKSdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHZpc2l0XG5cbiAgICBmdW5jdGlvbiB2aXNpdCgpIHtcbiAgICAgIC8qKiBAdHlwZSB7UmVhZG9ubHk8QWN0aW9uVHVwbGU+fSAqL1xuICAgICAgbGV0IHJlc3VsdCA9IGVtcHR5XG4gICAgICAvKiogQHR5cGUge1JlYWRvbmx5PEFjdGlvblR1cGxlPn0gKi9cbiAgICAgIGxldCBzdWJyZXN1bHRcbiAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgbGV0IG9mZnNldFxuICAgICAgLyoqIEB0eXBlIHtBcnJheTxVbmlzdFBhcmVudD59ICovXG4gICAgICBsZXQgZ3JhbmRwYXJlbnRzXG5cbiAgICAgIGlmICghdGVzdCB8fCBpcyhub2RlLCBpbmRleCwgcGFyZW50c1twYXJlbnRzLmxlbmd0aCAtIDFdIHx8IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogYHZpc2l0b3JgIGlzIG5vdyBhIHZpc2l0b3IuXG4gICAgICAgIHJlc3VsdCA9IHRvUmVzdWx0KHZpc2l0b3Iobm9kZSwgcGFyZW50cykpXG5cbiAgICAgICAgaWYgKHJlc3VsdFswXSA9PT0gRVhJVCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoJ2NoaWxkcmVuJyBpbiBub2RlICYmIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3Qgbm9kZUFzUGFyZW50ID0gLyoqIEB0eXBlIHtVbmlzdFBhcmVudH0gKi8gKG5vZGUpXG5cbiAgICAgICAgaWYgKG5vZGVBc1BhcmVudC5jaGlsZHJlbiAmJiByZXN1bHRbMF0gIT09IFNLSVApIHtcbiAgICAgICAgICBvZmZzZXQgPSAocmV2ZXJzZSA/IG5vZGVBc1BhcmVudC5jaGlsZHJlbi5sZW5ndGggOiAtMSkgKyBzdGVwXG4gICAgICAgICAgZ3JhbmRwYXJlbnRzID0gcGFyZW50cy5jb25jYXQobm9kZUFzUGFyZW50KVxuXG4gICAgICAgICAgd2hpbGUgKG9mZnNldCA+IC0xICYmIG9mZnNldCA8IG5vZGVBc1BhcmVudC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbm9kZUFzUGFyZW50LmNoaWxkcmVuW29mZnNldF1cblxuICAgICAgICAgICAgc3VicmVzdWx0ID0gZmFjdG9yeShjaGlsZCwgb2Zmc2V0LCBncmFuZHBhcmVudHMpKClcblxuICAgICAgICAgICAgaWYgKHN1YnJlc3VsdFswXSA9PT0gRVhJVCkge1xuICAgICAgICAgICAgICByZXR1cm4gc3VicmVzdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9mZnNldCA9XG4gICAgICAgICAgICAgIHR5cGVvZiBzdWJyZXN1bHRbMV0gPT09ICdudW1iZXInID8gc3VicmVzdWx0WzFdIDogb2Zmc2V0ICsgc3RlcFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVHVybiBhIHJldHVybiB2YWx1ZSBpbnRvIGEgY2xlYW4gcmVzdWx0LlxuICpcbiAqIEBwYXJhbSB7VmlzaXRvclJlc3VsdH0gdmFsdWVcbiAqICAgVmFsaWQgcmV0dXJuIHZhbHVlcyBmcm9tIHZpc2l0b3JzLlxuICogQHJldHVybnMge1JlYWRvbmx5PEFjdGlvblR1cGxlPn1cbiAqICAgQ2xlYW4gcmVzdWx0LlxuICovXG5mdW5jdGlvbiB0b1Jlc3VsdCh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIFtDT05USU5VRSwgdmFsdWVdXG4gIH1cblxuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/IGVtcHR5IDogW3ZhbHVlXVxufVxuIiwgIi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgndW5pc3QnKS5Ob2RlfSBVbmlzdE5vZGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ3VuaXN0JykuUGFyZW50fSBVbmlzdFBhcmVudFxuICogQHR5cGVkZWYge2ltcG9ydCgndW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzJykuVmlzaXRvclJlc3VsdH0gVmlzaXRvclJlc3VsdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0V4Y2x1ZGU8aW1wb3J0KCd1bmlzdC11dGlsLWlzJykuVGVzdCwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZH0gVGVzdFxuICogICBUZXN0IGZyb20gYHVuaXN0LXV0aWwtaXNgLlxuICpcbiAqICAgTm90ZTogd2UgaGF2ZSByZW1vdmUgYW5kIGFkZCBgdW5kZWZpbmVkYCwgYmVjYXVzZSBvdGhlcndpc2Ugd2hlbiBnZW5lcmF0aW5nXG4gKiAgIGF1dG9tYXRpYyBgLmQudHNgIGZpbGVzLCBUUyB0cmllcyB0byBmbGF0dGVuIHBhdGhzIGZyb20gYSBsb2NhbCBwZXJzcGVjdGl2ZSxcbiAqICAgd2hpY2ggZG9lc25cdTIwMTl0IHdvcmsgd2hlbiBwdWJsaXNoaW5nIG9uIG5wbS5cbiAqL1xuXG4vLyBUbyBkbzogdXNlIHR5cGVzIGZyb20gYHVuaXN0LXV0aWwtdmlzaXQtcGFyZW50c2Agd2hlbiBpdFx1MjAxOXMgcmVsZWFzZWQuXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgRm4gZXh0ZW5kcyAodmFsdWU6IGFueSkgPT4gdmFsdWUgaXMgaW5mZXIgVGhpbmdcbiAqICAgPyBUaGluZ1xuICogICA6IEZhbGxiYWNrXG4gKiApfSBQcmVkaWNhdGVcbiAqICAgR2V0IHRoZSB2YWx1ZSBvZiBhIHR5cGUgZ3VhcmQgYEZuYC5cbiAqIEB0ZW1wbGF0ZSBGblxuICogICBWYWx1ZTsgdHlwaWNhbGx5IGZ1bmN0aW9uIHRoYXQgaXMgYSB0eXBlIGd1YXJkIChzdWNoIGFzIGAoeCk6IHggaXMgWWApLlxuICogQHRlbXBsYXRlIEZhbGxiYWNrXG4gKiAgIFZhbHVlIHRvIHlpZWxkIGlmIGBGbmAgaXMgbm90IGEgdHlwZSBndWFyZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIENoZWNrIGV4dGVuZHMgbnVsbCB8IHVuZGVmaW5lZCAvLyBObyB0ZXN0LlxuICogICA/IFZhbHVlXG4gKiAgIDogVmFsdWUgZXh0ZW5kcyB7dHlwZTogQ2hlY2t9IC8vIFN0cmluZyAodHlwZSkgdGVzdC5cbiAqICAgPyBWYWx1ZVxuICogICA6IFZhbHVlIGV4dGVuZHMgQ2hlY2sgLy8gUGFydGlhbCB0ZXN0LlxuICogICA/IFZhbHVlXG4gKiAgIDogQ2hlY2sgZXh0ZW5kcyBGdW5jdGlvbiAvLyBGdW5jdGlvbiB0ZXN0LlxuICogICA/IFByZWRpY2F0ZTxDaGVjaywgVmFsdWU+IGV4dGVuZHMgVmFsdWVcbiAqICAgICA/IFByZWRpY2F0ZTxDaGVjaywgVmFsdWU+XG4gKiAgICAgOiBuZXZlclxuICogICA6IG5ldmVyIC8vIFNvbWUgb3RoZXIgdGVzdD9cbiAqICl9IE1hdGNoZXNPbmVcbiAqICAgQ2hlY2sgd2hldGhlciBhIG5vZGUgbWF0Y2hlcyBhIHByaW1pdGl2ZSBjaGVjayBpbiB0aGUgdHlwZSBzeXN0ZW0uXG4gKiBAdGVtcGxhdGUgVmFsdWVcbiAqICAgVmFsdWU7IHR5cGljYWxseSB1bmlzdCBgTm9kZWAuXG4gKiBAdGVtcGxhdGUgQ2hlY2tcbiAqICAgVmFsdWU7IHR5cGljYWxseSBgdW5pc3QtdXRpbC1pc2AtY29tcGF0aWJsZSB0ZXN0LCBidXQgbm90IGFycmF5cy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIENoZWNrIGV4dGVuZHMgQXJyYXk8YW55PlxuICogICA/IE1hdGNoZXNPbmU8VmFsdWUsIENoZWNrW2tleW9mIENoZWNrXT5cbiAqICAgOiBNYXRjaGVzT25lPFZhbHVlLCBDaGVjaz5cbiAqICl9IE1hdGNoZXNcbiAqICAgQ2hlY2sgd2hldGhlciBhIG5vZGUgbWF0Y2hlcyBhIGNoZWNrIGluIHRoZSB0eXBlIHN5c3RlbS5cbiAqIEB0ZW1wbGF0ZSBWYWx1ZVxuICogICBWYWx1ZTsgdHlwaWNhbGx5IHVuaXN0IGBOb2RlYC5cbiAqIEB0ZW1wbGF0ZSBDaGVja1xuICogICBWYWx1ZTsgdHlwaWNhbGx5IGB1bmlzdC11dGlsLWlzYC1jb21wYXRpYmxlIHRlc3QuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7MCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8IDcgfCA4IHwgOSB8IDEwfSBVaW50XG4gKiAgIE51bWJlcjsgY2FwcGVkIHJlYXNvbmFibHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SSBleHRlbmRzIDAgPyAxIDogSSBleHRlbmRzIDEgPyAyIDogSSBleHRlbmRzIDIgPyAzIDogSSBleHRlbmRzIDMgPyA0IDogSSBleHRlbmRzIDQgPyA1IDogSSBleHRlbmRzIDUgPyA2IDogSSBleHRlbmRzIDYgPyA3IDogSSBleHRlbmRzIDcgPyA4IDogSSBleHRlbmRzIDggPyA5IDogMTB9IEluY3JlbWVudFxuICogICBJbmNyZW1lbnQgYSBudW1iZXIgaW4gdGhlIHR5cGUgc3lzdGVtLlxuICogQHRlbXBsYXRlIHtVaW50fSBbST0wXVxuICogICBJbmRleC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIE5vZGUgZXh0ZW5kcyBVbmlzdFBhcmVudFxuICogICA/IE5vZGUgZXh0ZW5kcyB7Y2hpbGRyZW46IEFycmF5PGluZmVyIENoaWxkcmVuPn1cbiAqICAgICA/IENoaWxkIGV4dGVuZHMgQ2hpbGRyZW4gPyBOb2RlIDogbmV2ZXJcbiAqICAgICA6IG5ldmVyXG4gKiAgIDogbmV2ZXJcbiAqICl9IEludGVybmFsUGFyZW50XG4gKiAgIENvbGxlY3Qgbm9kZXMgdGhhdCBjYW4gYmUgcGFyZW50cyBvZiBgQ2hpbGRgLlxuICogQHRlbXBsYXRlIHtVbmlzdE5vZGV9IE5vZGVcbiAqICAgQWxsIG5vZGUgdHlwZXMgaW4gYSB0cmVlLlxuICogQHRlbXBsYXRlIHtVbmlzdE5vZGV9IENoaWxkXG4gKiAgIE5vZGUgdG8gc2VhcmNoIGZvci5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtJbnRlcm5hbFBhcmVudDxJbmNsdXNpdmVEZXNjZW5kYW50PFRyZWU+LCBDaGlsZD59IFBhcmVudFxuICogICBDb2xsZWN0IG5vZGVzIGluIGBUcmVlYCB0aGF0IGNhbiBiZSBwYXJlbnRzIG9mIGBDaGlsZGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gVHJlZVxuICogICBBbGwgbm9kZSB0eXBlcyBpbiBhIHRyZWUuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gQ2hpbGRcbiAqICAgTm9kZSB0byBzZWFyY2ggZm9yLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgRGVwdGggZXh0ZW5kcyBNYXhcbiAqICAgPyBuZXZlclxuICogICA6XG4gKiAgICAgfCBJbnRlcm5hbFBhcmVudDxOb2RlLCBDaGlsZD5cbiAqICAgICB8IEludGVybmFsQW5jZXN0b3I8Tm9kZSwgSW50ZXJuYWxQYXJlbnQ8Tm9kZSwgQ2hpbGQ+LCBNYXgsIEluY3JlbWVudDxEZXB0aD4+XG4gKiApfSBJbnRlcm5hbEFuY2VzdG9yXG4gKiAgIENvbGxlY3Qgbm9kZXMgaW4gYFRyZWVgIHRoYXQgY2FuIGJlIGFuY2VzdG9ycyBvZiBgQ2hpbGRgLlxuICogQHRlbXBsYXRlIHtVbmlzdE5vZGV9IE5vZGVcbiAqICAgQWxsIG5vZGUgdHlwZXMgaW4gYSB0cmVlLlxuICogQHRlbXBsYXRlIHtVbmlzdE5vZGV9IENoaWxkXG4gKiAgIE5vZGUgdG8gc2VhcmNoIGZvci5cbiAqIEB0ZW1wbGF0ZSB7VWludH0gW01heD0xMF1cbiAqICAgTWF4OyBzZWFyY2hlcyB1cCB0byB0aGlzIGRlcHRoLlxuICogQHRlbXBsYXRlIHtVaW50fSBbRGVwdGg9MF1cbiAqICAgQ3VycmVudCBkZXB0aC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFRyZWUgZXh0ZW5kcyBVbmlzdFBhcmVudFxuICogICAgID8gRGVwdGggZXh0ZW5kcyBNYXhcbiAqICAgICAgID8gVHJlZVxuICogICAgICAgOiBUcmVlIHwgSW5jbHVzaXZlRGVzY2VuZGFudDxUcmVlWydjaGlsZHJlbiddW251bWJlcl0sIE1heCwgSW5jcmVtZW50PERlcHRoPj5cbiAqICAgICA6IFRyZWVcbiAqICl9IEluY2x1c2l2ZURlc2NlbmRhbnRcbiAqICAgQ29sbGVjdCBhbGwgKGluY2x1c2l2ZSkgZGVzY2VuZGFudHMgb2YgYFRyZWVgLlxuICpcbiAqICAgPiBcdUQ4M0RcdURDNDkgKipOb3RlKio6IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGlzIHNlZW1zIHRvIGJlIHRoZSBmYXN0ZXN0IHdheSB0b1xuICogICA+IHJlY3Vyc2Ugd2l0aG91dCBhY3R1YWxseSBydW5uaW5nIGludG8gYW4gaW5maW5pdGUgbG9vcCwgd2hpY2ggdGhlXG4gKiAgID4gcHJldmlvdXMgdmVyc2lvbiBkaWQuXG4gKiAgID5cbiAqICAgPiBQcmFjdGljYWxseSwgYSBtYXggb2YgYDJgIGlzIHR5cGljYWxseSBlbm91Z2ggYXNzdW1pbmcgYSBgUm9vdGAgaXNcbiAqICAgPiBwYXNzZWQsIGJ1dCBpdCBkb2Vzblx1MjAxOXQgaW1wcm92ZSBwZXJmb3JtYW5jZS5cbiAqICAgPiBJdCBnZXRzIGhpZ2hlciB3aXRoIGBMaXN0ID4gTGlzdEl0ZW0gPiBUYWJsZSA+IFRhYmxlUm93ID4gVGFibGVDZWxsYC5cbiAqICAgPiBVc2luZyB1cCB0byBgMTBgIGRvZXNuXHUyMDE5dCBodXJ0IG9yIGhlbHAgZWl0aGVyLlxuICogQHRlbXBsYXRlIHtVbmlzdE5vZGV9IFRyZWVcbiAqICAgVHJlZSB0eXBlLlxuICogQHRlbXBsYXRlIHtVaW50fSBbTWF4PTEwXVxuICogICBNYXg7IHNlYXJjaGVzIHVwIHRvIHRoaXMgZGVwdGguXG4gKiBAdGVtcGxhdGUge1VpbnR9IFtEZXB0aD0wXVxuICogICBDdXJyZW50IGRlcHRoLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFZpc2l0b3JcbiAqICAgSGFuZGxlIGEgbm9kZSAobWF0Y2hpbmcgYHRlc3RgLCBpZiBnaXZlbikuXG4gKlxuICogICBWaXNpdG9ycyBhcmUgZnJlZSB0byB0cmFuc2Zvcm0gYG5vZGVgLlxuICogICBUaGV5IGNhbiBhbHNvIHRyYW5zZm9ybSBgcGFyZW50YC5cbiAqXG4gKiAgIFJlcGxhY2luZyBgbm9kZWAgaXRzZWxmLCBpZiBgU0tJUGAgaXMgbm90IHJldHVybmVkLCBzdGlsbCBjYXVzZXMgaXRzXG4gKiAgIGRlc2NlbmRhbnRzIHRvIGJlIHdhbGtlZCAod2hpY2ggaXMgYSBidWcpLlxuICpcbiAqICAgV2hlbiBhZGRpbmcgb3IgcmVtb3ZpbmcgcHJldmlvdXMgc2libGluZ3Mgb2YgYG5vZGVgIChvciBuZXh0IHNpYmxpbmdzLCBpblxuICogICBjYXNlIG9mIHJldmVyc2UpLCB0aGUgYFZpc2l0b3JgIHNob3VsZCByZXR1cm4gYSBuZXcgYEluZGV4YCB0byBzcGVjaWZ5IHRoZVxuICogICBzaWJsaW5nIHRvIHRyYXZlcnNlIGFmdGVyIGBub2RlYCBpcyB0cmF2ZXJzZWQuXG4gKiAgIEFkZGluZyBvciByZW1vdmluZyBuZXh0IHNpYmxpbmdzIG9mIGBub2RlYCAob3IgcHJldmlvdXMgc2libGluZ3MsIGluIGNhc2VcbiAqICAgb2YgcmV2ZXJzZSkgaXMgaGFuZGxlZCBhcyBleHBlY3RlZCB3aXRob3V0IG5lZWRpbmcgdG8gcmV0dXJuIGEgbmV3IGBJbmRleGAuXG4gKlxuICogICBSZW1vdmluZyB0aGUgY2hpbGRyZW4gcHJvcGVydHkgb2YgYHBhcmVudGAgc3RpbGwgcmVzdWx0cyBpbiB0aGVtIGJlaW5nXG4gKiAgIHRyYXZlcnNlZC5cbiAqIEBwYXJhbSB7VmlzaXRlZH0gbm9kZVxuICogICBGb3VuZCBub2RlLlxuICogQHBhcmFtIHtWaXNpdGVkIGV4dGVuZHMgVW5pc3ROb2RlID8gbnVtYmVyIHwgdW5kZWZpbmVkIDogbmV2ZXJ9IGluZGV4XG4gKiAgIEluZGV4IG9mIGBub2RlYCBpbiBgcGFyZW50YC5cbiAqIEBwYXJhbSB7QW5jZXN0b3IgZXh0ZW5kcyBVbmlzdFBhcmVudCA/IEFuY2VzdG9yIHwgdW5kZWZpbmVkIDogbmV2ZXJ9IHBhcmVudFxuICogICBQYXJlbnQgb2YgYG5vZGVgLlxuICogQHJldHVybnMge1Zpc2l0b3JSZXN1bHR9XG4gKiAgIFdoYXQgdG8gZG8gbmV4dC5cbiAqXG4gKiAgIEFuIGBJbmRleGAgaXMgdHJlYXRlZCBhcyBhIHR1cGxlIG9mIGBbQ09OVElOVUUsIEluZGV4XWAuXG4gKiAgIEFuIGBBY3Rpb25gIGlzIHRyZWF0ZWQgYXMgYSB0dXBsZSBvZiBgW0FjdGlvbl1gLlxuICpcbiAqICAgUGFzc2luZyBhIHR1cGxlIGJhY2sgb25seSBtYWtlcyBzZW5zZSBpZiB0aGUgYEFjdGlvbmAgaXMgYFNLSVBgLlxuICogICBXaGVuIHRoZSBgQWN0aW9uYCBpcyBgRVhJVGAsIHRoYXQgYWN0aW9uIGNhbiBiZSByZXR1cm5lZC5cbiAqICAgV2hlbiB0aGUgYEFjdGlvbmAgaXMgYENPTlRJTlVFYCwgYEluZGV4YCBjYW4gYmUgcmV0dXJuZWQuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gW1Zpc2l0ZWQ9VW5pc3ROb2RlXVxuICogICBWaXNpdGVkIG5vZGUgdHlwZS5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3RQYXJlbnR9IFtBbmNlc3Rvcj1VbmlzdFBhcmVudF1cbiAqICAgQW5jZXN0b3IgdHlwZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtWaXNpdG9yPFZpc2l0ZWQsIFBhcmVudDxBbmNlc3RvciwgVmlzaXRlZD4+fSBCdWlsZFZpc2l0b3JGcm9tTWF0Y2hcbiAqICAgQnVpbGQgYSB0eXBlZCBgVmlzaXRvcmAgZnVuY3Rpb24gZnJvbSBhIG5vZGUgYW5kIGFsbCBwb3NzaWJsZSBwYXJlbnRzLlxuICpcbiAqICAgSXQgd2lsbCBpbmZlciB3aGljaCB2YWx1ZXMgYXJlIHBhc3NlZCBhcyBgbm9kZWAgYW5kIHdoaWNoIGFzIGBwYXJlbnRgLlxuICogQHRlbXBsYXRlIHtVbmlzdE5vZGV9IFZpc2l0ZWRcbiAqICAgTm9kZSB0eXBlLlxuICogQHRlbXBsYXRlIHtVbmlzdFBhcmVudH0gQW5jZXN0b3JcbiAqICAgUGFyZW50IHR5cGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBCdWlsZFZpc2l0b3JGcm9tTWF0Y2g8XG4gKiAgICAgTWF0Y2hlczxEZXNjZW5kYW50LCBDaGVjaz4sXG4gKiAgICAgRXh0cmFjdDxEZXNjZW5kYW50LCBVbmlzdFBhcmVudD5cbiAqICAgPlxuICogKX0gQnVpbGRWaXNpdG9yRnJvbURlc2NlbmRhbnRzXG4gKiAgIEJ1aWxkIGEgdHlwZWQgYFZpc2l0b3JgIGZ1bmN0aW9uIGZyb20gYSBsaXN0IG9mIGRlc2NlbmRhbnRzIGFuZCBhIHRlc3QuXG4gKlxuICogICBJdCB3aWxsIGluZmVyIHdoaWNoIHZhbHVlcyBhcmUgcGFzc2VkIGFzIGBub2RlYCBhbmQgd2hpY2ggYXMgYHBhcmVudGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gRGVzY2VuZGFudFxuICogICBOb2RlIHR5cGUuXG4gKiBAdGVtcGxhdGUge1Rlc3R9IENoZWNrXG4gKiAgIFRlc3QgdHlwZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIEJ1aWxkVmlzaXRvckZyb21EZXNjZW5kYW50czxcbiAqICAgICBJbmNsdXNpdmVEZXNjZW5kYW50PFRyZWU+LFxuICogICAgIENoZWNrXG4gKiAgID5cbiAqICl9IEJ1aWxkVmlzaXRvclxuICogICBCdWlsZCBhIHR5cGVkIGBWaXNpdG9yYCBmdW5jdGlvbiBmcm9tIGEgdHJlZSBhbmQgYSB0ZXN0LlxuICpcbiAqICAgSXQgd2lsbCBpbmZlciB3aGljaCB2YWx1ZXMgYXJlIHBhc3NlZCBhcyBgbm9kZWAgYW5kIHdoaWNoIGFzIGBwYXJlbnRgLlxuICogQHRlbXBsYXRlIHtVbmlzdE5vZGV9IFtUcmVlPVVuaXN0Tm9kZV1cbiAqICAgTm9kZSB0eXBlLlxuICogQHRlbXBsYXRlIHtUZXN0fSBbQ2hlY2s9VGVzdF1cbiAqICAgVGVzdCB0eXBlLlxuICovXG5cbmltcG9ydCB7dmlzaXRQYXJlbnRzfSBmcm9tICd1bmlzdC11dGlsLXZpc2l0LXBhcmVudHMnXG5cbmV4cG9ydCB7Q09OVElOVUUsIEVYSVQsIFNLSVB9IGZyb20gJ3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cydcblxuLyoqXG4gKiBWaXNpdCBub2Rlcy5cbiAqXG4gKiBUaGlzIGFsZ29yaXRobSBwZXJmb3JtcyAqZGVwdGgtZmlyc3QqICp0cmVlIHRyYXZlcnNhbCogaW4gKnByZW9yZGVyKlxuICogKCoqTkxSKiopIG9yIGlmIGByZXZlcnNlYCBpcyBnaXZlbiwgaW4gKnJldmVyc2UgcHJlb3JkZXIqICgqKk5STCoqKS5cbiAqXG4gKiBZb3UgY2FuIGNob29zZSBmb3Igd2hpY2ggbm9kZXMgYHZpc2l0b3JgIGlzIGNhbGxlZCBieSBwYXNzaW5nIGEgYHRlc3RgLlxuICogRm9yIGNvbXBsZXggdGVzdHMsIHlvdSBzaG91bGQgdGVzdCB5b3Vyc2VsZiBpbiBgdmlzaXRvcmAsIGFzIGl0IHdpbGwgYmVcbiAqIGZhc3RlciBhbmQgd2lsbCBoYXZlIGltcHJvdmVkIHR5cGUgaW5mb3JtYXRpb24uXG4gKlxuICogV2Fsa2luZyB0aGUgdHJlZSBpcyBhbiBpbnRlbnNpdmUgdGFzay5cbiAqIE1ha2UgdXNlIG9mIHRoZSByZXR1cm4gdmFsdWVzIG9mIHRoZSB2aXNpdG9yIHdoZW4gcG9zc2libGUuXG4gKiBJbnN0ZWFkIG9mIHdhbGtpbmcgYSB0cmVlIG11bHRpcGxlIHRpbWVzLCB3YWxrIGl0IG9uY2UsIHVzZSBgdW5pc3QtdXRpbC1pc2BcbiAqIHRvIGNoZWNrIGlmIGEgbm9kZSBtYXRjaGVzLCBhbmQgdGhlbiBwZXJmb3JtIGRpZmZlcmVudCBvcGVyYXRpb25zLlxuICpcbiAqIFlvdSBjYW4gY2hhbmdlIHRoZSB0cmVlLlxuICogU2VlIGBWaXNpdG9yYCBmb3IgbW9yZSBpbmZvLlxuICpcbiAqIEBvdmVybG9hZFxuICogQHBhcmFtIHtUcmVlfSB0cmVlXG4gKiBAcGFyYW0ge0NoZWNrfSBjaGVja1xuICogQHBhcmFtIHtCdWlsZFZpc2l0b3I8VHJlZSwgQ2hlY2s+fSB2aXNpdG9yXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkfSBbcmV2ZXJzZV1cbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKlxuICogQG92ZXJsb2FkXG4gKiBAcGFyYW0ge1RyZWV9IHRyZWVcbiAqIEBwYXJhbSB7QnVpbGRWaXNpdG9yPFRyZWU+fSB2aXNpdG9yXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkfSBbcmV2ZXJzZV1cbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKlxuICogQHBhcmFtIHtVbmlzdE5vZGV9IHRyZWVcbiAqICAgVHJlZSB0byB0cmF2ZXJzZS5cbiAqIEBwYXJhbSB7VmlzaXRvciB8IFRlc3R9IHRlc3RPclZpc2l0b3JcbiAqICAgYHVuaXN0LXV0aWwtaXNgLWNvbXBhdGlibGUgdGVzdCAob3B0aW9uYWwsIG9taXQgdG8gcGFzcyBhIHZpc2l0b3IpLlxuICogQHBhcmFtIHtWaXNpdG9yIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWR9IFt2aXNpdG9yT3JSZXZlcnNlXVxuICogICBIYW5kbGUgZWFjaCBub2RlICh3aGVuIHRlc3QgaXMgb21pdHRlZCwgcGFzcyBgcmV2ZXJzZWApLlxuICogQHBhcmFtIHtib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZH0gW21heWJlUmV2ZXJzZT1mYWxzZV1cbiAqICAgVHJhdmVyc2UgaW4gcmV2ZXJzZSBwcmVvcmRlciAoTlJMKSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHByZW9yZGVyIChOTFIpLlxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqICAgTm90aGluZy5cbiAqXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gVHJlZVxuICogICBOb2RlIHR5cGUuXG4gKiBAdGVtcGxhdGUge1Rlc3R9IENoZWNrXG4gKiAgIGB1bmlzdC11dGlsLWlzYC1jb21wYXRpYmxlIHRlc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdCh0cmVlLCB0ZXN0T3JWaXNpdG9yLCB2aXNpdG9yT3JSZXZlcnNlLCBtYXliZVJldmVyc2UpIHtcbiAgLyoqIEB0eXBlIHtib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZH0gKi9cbiAgbGV0IHJldmVyc2VcbiAgLyoqIEB0eXBlIHtUZXN0fSAqL1xuICBsZXQgdGVzdFxuICAvKiogQHR5cGUge1Zpc2l0b3J9ICovXG4gIGxldCB2aXNpdG9yXG5cbiAgaWYgKFxuICAgIHR5cGVvZiB0ZXN0T3JWaXNpdG9yID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIHZpc2l0b3JPclJldmVyc2UgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgdGVzdCA9IHVuZGVmaW5lZFxuICAgIHZpc2l0b3IgPSB0ZXN0T3JWaXNpdG9yXG4gICAgcmV2ZXJzZSA9IHZpc2l0b3JPclJldmVyc2VcbiAgfSBlbHNlIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBhc3N1bWUgdGhlIG92ZXJsb2FkIHdpdGggdGVzdCB3YXMgZ2l2ZW4uXG4gICAgdGVzdCA9IHRlc3RPclZpc2l0b3JcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBhc3N1bWUgdGhlIG92ZXJsb2FkIHdpdGggdGVzdCB3YXMgZ2l2ZW4uXG4gICAgdmlzaXRvciA9IHZpc2l0b3JPclJldmVyc2VcbiAgICByZXZlcnNlID0gbWF5YmVSZXZlcnNlXG4gIH1cblxuICB2aXNpdFBhcmVudHModHJlZSwgdGVzdCwgb3ZlcmxvYWQsIHJldmVyc2UpXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VW5pc3ROb2RlfSBub2RlXG4gICAqIEBwYXJhbSB7QXJyYXk8VW5pc3RQYXJlbnQ+fSBwYXJlbnRzXG4gICAqL1xuICBmdW5jdGlvbiBvdmVybG9hZChub2RlLCBwYXJlbnRzKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcGFyZW50c1twYXJlbnRzLmxlbmd0aCAtIDFdXG4gICAgY29uc3QgaW5kZXggPSBwYXJlbnQgPyBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihub2RlKSA6IHVuZGVmaW5lZFxuICAgIHJldHVybiB2aXNpdG9yKG5vZGUsIGluZGV4LCBwYXJlbnQpXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBSb290LCBFbGVtZW50LCBUZXh0IH0gZnJvbSAnaGFzdCc7XG5pbXBvcnQgeyBjcmVhdGVTYW5pdGl6ZVNjaGVtYSB9IGZyb20gJy4uL3V0aWxzL2NyZWF0ZVNhbml0aXplU2NoZW1hJztcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSAndW5pc3QtdXRpbC12aXNpdCc7XG5leHBvcnQgY29uc3QgcmVoeXBlQ29udmVydEFibm9ybWFsVGFnc1RvVGV4dCA9IChjdXN0b21UYWdzOiBzdHJpbmdbXSA9IFtdKSA9PiB7XG4gIHJldHVybiAodHJlZTogUm9vdCkgPT4ge1xuICAgIC8vIEdldCBhbGwgYWxsb3dlZCB0YWcgbmFtZXMgKEhUTUwgKyBNYXRoTUwgKyBjdXN0b21UYWdzKVxuICAgIGNvbnN0IHNjaGVtYSA9IGNyZWF0ZVNhbml0aXplU2NoZW1hKGN1c3RvbVRhZ3MpO1xuICAgIGNvbnN0IGFsbG93ZWRUYWdOYW1lcyA9IG5ldyBTZXQoc2NoZW1hLnRhZ05hbWVzIHx8IFtdKTtcblxuICAgIHZpc2l0KHRyZWUsICdlbGVtZW50JywgKG5vZGUsIGluZGV4LCBwYXJlbnQpID0+IHtcbiAgICAgIGlmICghcGFyZW50IHx8IGluZGV4ID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdGFnTmFtZSA9IChub2RlIGFzIEVsZW1lbnQpLnRhZ05hbWU7XG5cbiAgICAgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBhYm5vcm1hbCB0YWc6XG4gICAgICAvLyAxLiBOb3QgaW4gdGhlIGFsbG93ZWQgdGFnIGxpc3RcbiAgICAgIC8vIDIuIEFuZCBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gRW5nbGlzaCBsZXR0ZXJzXG4gICAgICBjb25zdCBpc0Fibm9ybWFsVGFnID0gIWFsbG93ZWRUYWdOYW1lcy5oYXModGFnTmFtZSkgJiYgL1teYS16QS1aXS8udGVzdCh0YWdOYW1lKTtcblxuICAgICAgaWYgKGlzQWJub3JtYWxUYWcpIHtcbiAgICAgICAgLy8gUmVidWlsZCB0aGUgb3JpZ2luYWwgdGFnIHN0cmluZ1xuICAgICAgICBsZXQgdGFnU3RyaW5nID0gYDwke3RhZ05hbWV9YDtcblxuICAgICAgICAvLyBBcHBlbmQgYXR0cmlidXRlc1xuICAgICAgICBpZiAoKG5vZGUgYXMgRWxlbWVudCkucHJvcGVydGllcykge1xuICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKChub2RlIGFzIEVsZW1lbnQpLnByb3BlcnRpZXMpKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgdGFnU3RyaW5nICs9IGAgJHtrZXl9PVwiJHt2YWx1ZS5qb2luKCcgJyl9XCJgO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHRhZ1N0cmluZyArPSBgICR7a2V5fT1cIiR7dmFsdWV9XCJgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBjaGlsZCBjb250ZW50XG4gICAgICAgIGxldCBpbm5lckNvbnRlbnQgPSAnJztcbiAgICAgICAgaWYgKChub2RlIGFzIEVsZW1lbnQpLmNoaWxkcmVuICYmIChub2RlIGFzIEVsZW1lbnQpLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBSZWN1cnNpdmVseSBwcm9jZXNzIGNoaWxkIG5vZGVzXG4gICAgICAgICAgY29uc3QgcHJvY2Vzc0NoaWxkcmVuID0gKGNoaWxkcmVuOiBBcnJheTxFbGVtZW50IHwgVGV4dD4pOiBzdHJpbmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuXG4gICAgICAgICAgICAgIC5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZCBhcyBUZXh0KS52YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLnR5cGUgPT09ICdlbGVtZW50Jykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudENoaWxkID0gY2hpbGQgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZFRhZyA9IGA8JHtlbGVtZW50Q2hpbGQudGFnTmFtZX1gO1xuICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRDaGlsZC5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVsZW1lbnRDaGlsZC5wcm9wZXJ0aWVzKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRUYWcgKz0gYCAke2tleX09XCIke3ZhbHVlLmpvaW4oJyAnKX1cImA7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFRhZyArPSBgICR7a2V5fT1cIiR7dmFsdWV9XCJgO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2hpbGRUYWcgKz0gJz4nO1xuICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRDaGlsZC5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZFRhZyArPSBwcm9jZXNzQ2hpbGRyZW4oZWxlbWVudENoaWxkLmNoaWxkcmVuIGFzIEFycmF5PEVsZW1lbnQgfCBUZXh0Pik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjaGlsZFRhZyArPSBgPC8ke2VsZW1lbnRDaGlsZC50YWdOYW1lfT5gO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkVGFnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5qb2luKCcnKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlubmVyQ29udGVudCA9IHByb2Nlc3NDaGlsZHJlbigobm9kZSBhcyBFbGVtZW50KS5jaGlsZHJlbiBhcyBBcnJheTxFbGVtZW50IHwgVGV4dD4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFnU3RyaW5nICs9IGA+JHtpbm5lckNvbnRlbnR9PC8ke3RhZ05hbWV9PmA7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgdGV4dCBub2RlIHRvIHJlcGxhY2UgdGhlIGFibm9ybWFsIHRhZ1xuICAgICAgICBjb25zdCB0ZXh0Tm9kZTogVGV4dCA9IHtcbiAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgdmFsdWU6IHRhZ1N0cmluZyxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBSZXBsYWNlIG5vZGVcbiAgICAgICAgcGFyZW50LmNoaWxkcmVuW2luZGV4XSA9IHRleHROb2RlO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xufTtcbiIsICJjb25zdCBNQVRIX0pBWEZPTlRfVVJMID0gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbWF0aGpheEAzL2VzNS9vdXRwdXQvY2h0bWwvZm9udHMvd29mZi12Mic7XG5leHBvcnQgY29uc3QgREVGQVVMVF9NQVRISkFYX0NPTkZJRyA9IHtcbiAgY2h0bWw6IHtcbiAgICBmb250VVJMOiBNQVRIX0pBWEZPTlRfVVJMLFxuICB9LFxufTtcbiIsICJpbXBvcnQgdHlwZSB7IFByb2Nlc3NvciB9IGZyb20gJ3VuaWZpZWQnO1xuXG5jb25zdCBjb3VudFByZWNlZGluZ0JhY2tzbGFzaGVzID0gKGlucHV0OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGxldCBpID0gaW5kZXggLSAxOyBpID49IDAgJiYgaW5wdXRbaV0gPT09ICdcXFxcJzsgaS0tKSBjb3VudCsrO1xuICByZXR1cm4gY291bnQ7XG59O1xuXG5jb25zdCBpc1VuZXNjYXBlZERlbGltaXRlciA9IChpbnB1dDogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBuZXh0Q2hhcjogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGlmIChpbnB1dFtpbmRleF0gIT09ICdcXFxcJyB8fCBpbnB1dFtpbmRleCArIDFdICE9PSBuZXh0Q2hhcikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gY291bnRQcmVjZWRpbmdCYWNrc2xhc2hlcyhpbnB1dCwgaW5kZXgpICUgMiA9PT0gMDtcbn07XG5cbmNvbnN0IGZpbmRDbG9zaW5nRGVsaW1pdGVyID0gKGlucHV0OiBzdHJpbmcsIGZyb21JbmRleDogbnVtYmVyLCBjbG9zZUNoYXI6ICcpJyB8ICddJyk6IG51bWJlciA9PiB7XG4gIGZvciAobGV0IGkgPSBmcm9tSW5kZXg7IGkgPCBpbnB1dC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBpZiAoaXNVbmVzY2FwZWREZWxpbWl0ZXIoaW5wdXQsIGksIGNsb3NlQ2hhcikpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn07XG5cbmNvbnN0IGlzTGluZVN0YXJ0ID0gKGlucHV0OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBib29sZWFuID0+XG4gIGluZGV4ID09PSAwIHx8IGlucHV0W2luZGV4IC0gMV0gPT09ICdcXG4nO1xuXG5jb25zdCBzY2FuRmVuY2UgPSAoXG4gIGlucHV0OiBzdHJpbmcsXG4gIGluZGV4OiBudW1iZXJcbik6IHsgZmVuY2VDaGFyOiAnYCcgfCAnfic7IGZlbmNlTGVuZ3RoOiBudW1iZXIgfSB8IG51bGwgPT4ge1xuICBjb25zdCBjaGFyID0gaW5wdXRbaW5kZXhdO1xuICBpZiAoY2hhciAhPT0gJ2AnICYmIGNoYXIgIT09ICd+JykgcmV0dXJuIG51bGw7XG4gIGxldCBmZW5jZUxlbmd0aCA9IDA7XG4gIGZvciAobGV0IGkgPSBpbmRleDsgaSA8IGlucHV0Lmxlbmd0aCAmJiBpbnB1dFtpXSA9PT0gY2hhcjsgaSsrKSBmZW5jZUxlbmd0aCsrO1xuICBpZiAoZmVuY2VMZW5ndGggPCAzKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHsgZmVuY2VDaGFyOiBjaGFyLCBmZW5jZUxlbmd0aCB9O1xufTtcblxuY29uc3QgaXNJbmRlbnRlZENvZGVMaW5lID0gKGlucHV0OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgaWYgKCFpc0xpbmVTdGFydChpbnB1dCwgaW5kZXgpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChpbnB1dFtpbmRleF0gPT09ICdcXHQnKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGlucHV0LnNsaWNlKGluZGV4LCBpbmRleCArIDQpID09PSAnICAgICc7XG59O1xuXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplTGF0ZXhQYXJlbnNNYXRoID0gKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBsZXQgb3V0cHV0ID0gJyc7XG5cbiAgbGV0IGluRmVuY2VkQ29kZUJsb2NrID0gZmFsc2U7XG4gIGxldCBmZW5jZUNoYXI6ICdgJyB8ICd+JyB8IG51bGwgPSBudWxsO1xuICBsZXQgZmVuY2VMZW5ndGggPSAwO1xuXG4gIGxldCBpbklubGluZUNvZGUgPSBmYWxzZTtcbiAgbGV0IGlubGluZUNvZGVUaWNrTGVuZ3RoID0gMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgKSB7XG4gICAgaWYgKCFpbkZlbmNlZENvZGVCbG9jayAmJiAhaW5JbmxpbmVDb2RlICYmIGlzSW5kZW50ZWRDb2RlTGluZShpbnB1dCwgaSkpIHtcbiAgICAgIGNvbnN0IGVuZCA9IGlucHV0LmluZGV4T2YoJ1xcbicsIGkpO1xuICAgICAgaWYgKGVuZCA9PT0gLTEpIHJldHVybiBvdXRwdXQgKyBpbnB1dC5zbGljZShpKTtcbiAgICAgIG91dHB1dCArPSBpbnB1dC5zbGljZShpLCBlbmQgKyAxKTtcbiAgICAgIGkgPSBlbmQgKyAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFpbklubGluZUNvZGUgJiYgaXNMaW5lU3RhcnQoaW5wdXQsIGkpKSB7XG4gICAgICBjb25zdCBmZW5jZSA9IHNjYW5GZW5jZShpbnB1dCwgaSk7XG4gICAgICBpZiAoZmVuY2UpIHtcbiAgICAgICAgaWYgKCFpbkZlbmNlZENvZGVCbG9jaykge1xuICAgICAgICAgIGluRmVuY2VkQ29kZUJsb2NrID0gdHJ1ZTtcbiAgICAgICAgICBmZW5jZUNoYXIgPSBmZW5jZS5mZW5jZUNoYXI7XG4gICAgICAgICAgZmVuY2VMZW5ndGggPSBmZW5jZS5mZW5jZUxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmIChmZW5jZUNoYXIgPT09IGZlbmNlLmZlbmNlQ2hhciAmJiBmZW5jZS5mZW5jZUxlbmd0aCA+PSBmZW5jZUxlbmd0aCkge1xuICAgICAgICAgIGluRmVuY2VkQ29kZUJsb2NrID0gZmFsc2U7XG4gICAgICAgICAgZmVuY2VDaGFyID0gbnVsbDtcbiAgICAgICAgICBmZW5jZUxlbmd0aCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbmQgPSBpbnB1dC5pbmRleE9mKCdcXG4nLCBpKTtcbiAgICAgICAgaWYgKGVuZCA9PT0gLTEpIHJldHVybiBvdXRwdXQgKyBpbnB1dC5zbGljZShpKTtcbiAgICAgICAgb3V0cHV0ICs9IGlucHV0LnNsaWNlKGksIGVuZCArIDEpO1xuICAgICAgICBpID0gZW5kICsgMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpbkZlbmNlZENvZGVCbG9jaykge1xuICAgICAgaWYgKCFpbklubGluZUNvZGUgJiYgaW5wdXRbaV0gPT09ICdgJykge1xuICAgICAgICBsZXQgdGlja3MgPSAwO1xuICAgICAgICBmb3IgKGxldCBqID0gaTsgaiA8IGlucHV0Lmxlbmd0aCAmJiBpbnB1dFtqXSA9PT0gJ2AnOyBqKyspIHRpY2tzKys7XG4gICAgICAgIGluSW5saW5lQ29kZSA9IHRydWU7XG4gICAgICAgIGlubGluZUNvZGVUaWNrTGVuZ3RoID0gdGlja3M7XG4gICAgICAgIG91dHB1dCArPSBpbnB1dC5zbGljZShpLCBpICsgdGlja3MpO1xuICAgICAgICBpICs9IHRpY2tzO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluSW5saW5lQ29kZSkge1xuICAgICAgICBpZiAoaW5wdXRbaV0gPT09ICdgJykge1xuICAgICAgICAgIGxldCB0aWNrcyA9IDA7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IGk7IGogPCBpbnB1dC5sZW5ndGggJiYgaW5wdXRbal0gPT09ICdgJzsgaisrKSB0aWNrcysrO1xuICAgICAgICAgIGlmICh0aWNrcyA+PSBpbmxpbmVDb2RlVGlja0xlbmd0aCkge1xuICAgICAgICAgICAgb3V0cHV0ICs9IGlucHV0LnNsaWNlKGksIGkgKyBpbmxpbmVDb2RlVGlja0xlbmd0aCk7XG4gICAgICAgICAgICBpICs9IGlubGluZUNvZGVUaWNrTGVuZ3RoO1xuICAgICAgICAgICAgaW5JbmxpbmVDb2RlID0gZmFsc2U7XG4gICAgICAgICAgICBpbmxpbmVDb2RlVGlja0xlbmd0aCA9IDA7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0ICs9IGlucHV0W2ldO1xuICAgICAgICBpKys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaW5GZW5jZWRDb2RlQmxvY2sgJiYgIWluSW5saW5lQ29kZSkge1xuICAgICAgaWYgKGlzVW5lc2NhcGVkRGVsaW1pdGVyKGlucHV0LCBpLCAnKCcpKSB7XG4gICAgICAgIGNvbnN0IGNsb3NlSW5kZXggPSBmaW5kQ2xvc2luZ0RlbGltaXRlcihpbnB1dCwgaSArIDIsICcpJyk7XG4gICAgICAgIGlmIChjbG9zZUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGNvbnN0IGlubmVyID0gaW5wdXQuc2xpY2UoaSArIDIsIGNsb3NlSW5kZXgpO1xuICAgICAgICAgIG91dHB1dCArPSBgJCR7aW5uZXJ9JGA7XG4gICAgICAgICAgaSA9IGNsb3NlSW5kZXggKyAyO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1VuZXNjYXBlZERlbGltaXRlcihpbnB1dCwgaSwgJ1snKSkge1xuICAgICAgICBjb25zdCBjbG9zZUluZGV4ID0gZmluZENsb3NpbmdEZWxpbWl0ZXIoaW5wdXQsIGkgKyAyLCAnXScpO1xuICAgICAgICBpZiAoY2xvc2VJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBjb25zdCBpbm5lciA9IGlucHV0LnNsaWNlKGkgKyAyLCBjbG9zZUluZGV4KTtcbiAgICAgICAgICBjb25zdCBzdGFydCA9IGlubmVyLnN0YXJ0c1dpdGgoJ1xcbicpID8gJycgOiAnXFxuJztcbiAgICAgICAgICBjb25zdCBlbmQgPSBpbm5lci5lbmRzV2l0aCgnXFxuJykgPyAnJyA6ICdcXG4nO1xuICAgICAgICAgIG91dHB1dCArPSBgJCQke3N0YXJ0fSR7aW5uZXJ9JHtlbmR9JCRgO1xuICAgICAgICAgIGkgPSBjbG9zZUluZGV4ICsgMjtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG91dHB1dCArPSBpbnB1dFtpXTtcbiAgICBpKys7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5leHBvcnQgY29uc3QgcmVtYXJrTWF0aERlbGltaXRlcnMgPSBmdW5jdGlvbiByZW1hcmtNYXRoRGVsaW1pdGVycyh0aGlzOiBQcm9jZXNzb3IpOiB2b2lkIHtcbiAgY29uc3QgY3VycmVudFBhcnNlciA9IHRoaXMucGFyc2VyIHx8IHRoaXMuUGFyc2VyO1xuICBpZiAoIWN1cnJlbnRQYXJzZXIpIHJldHVybjtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICB0aGlzLlBhcnNlciA9IGZ1bmN0aW9uIHdyYXBwZWRQYXJzZXIoZG9jdW1lbnQ6IHVua25vd24sIGZpbGU6IGFueSkge1xuICAgIGxldCBuZXh0RG9jdW1lbnQgPSBkb2N1bWVudDtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUxhdGV4UGFyZW5zTWF0aChkb2N1bWVudCk7XG4gICAgICBuZXh0RG9jdW1lbnQgPSBub3JtYWxpemVkO1xuICAgICAgaWYgKGZpbGUgJiYgdHlwZW9mIGZpbGUudmFsdWUgPT09ICdzdHJpbmcnKSBmaWxlLnZhbHVlID0gbm9ybWFsaXplZDtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICByZXR1cm4gY3VycmVudFBhcnNlcihuZXh0RG9jdW1lbnQgYXMgYW55LCBmaWxlKTtcbiAgfSBhcyB1bmtub3duIGFzIFByb2Nlc3NvclsnUGFyc2VyJ107XG5cbiAgaWYgKHRoaXMucGFyc2VyKSB0aGlzLnBhcnNlciA9IHRoaXMuUGFyc2VyIGFzIHVua25vd24gYXMgdHlwZW9mIHRoaXMucGFyc2VyO1xufTtcbiJdLAogICJtYXBwaW5ncyI6ICJBQUFBLE9BQVMsVUFBQUEsT0FBYyxVQ0N2QixPQUFtQyxXQUFBQyxNQUFlLFVBRWxELE9BQU9DLE9BQWlCLGVBQ3hCLE9BQU9DLE9BQWUsYUFDdEIsT0FBT0MsT0FBa0IsZ0JBQ3pCLE9BQU9DLE9BQXFCLG1CQUM1QixPQUFPQyxPQUFnQixjQUN2QixPQUFPQyxPQUFvQixrQkFDM0IsT0FBT0MsT0FBZSxhQ1J0QixPQUFTLGlCQUFBQyxNQUFxQixrQkNEdkIsSUFBTUMsRUFBNkIsQ0FDeEMsT0FDQSxPQUNBLEtBQ0EsS0FDQSxLQUNBLFFBQ0EsT0FDQSxPQUNBLFNBQ0EsUUFDQSxhQUNBLFFBQ0EsUUFDQSxRQUNBLFNBQ0EsV0FDQSxVQUNBLFdBQ0EsU0FDQSxNQUNBLE1BQ0EsYUFDQSxjQUNBLGFBQ0EsU0FDQSxTQUNBLFVBQ0EsWUFDQSxhQUNBLGdCQUNGLEVBR2FDLEVBQThDLENBQ3pELEtBQU0sQ0FBQyxVQUFXLFFBQVMsUUFBUyxPQUFPLEVBQzNDLEtBQU0sQ0FBQyxRQUFTLE9BQU8sRUFDdkIsR0FBSSxDQUFDLFFBQVMsUUFBUyxhQUFhLEVBQ3BDLEdBQUksQ0FBQyxRQUFTLE9BQU8sRUFDckIsR0FBSSxDQUNGLFFBQ0EsUUFDQSxRQUNBLFlBQ0EsV0FDQSxZQUNBLFVBQ0EsZ0JBQ0EsU0FDQSxTQUNBLFNBQ0EsTUFDRixFQUNBLE1BQU8sQ0FBQyxRQUFTLFFBQVMsZ0JBQWlCLFdBQVksYUFBYyxVQUFVLEVBQy9FLEtBQU0sQ0FB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QUFJSyxFQUFVLEdBSTVCWCxFQUFjLE9BQVMsSUFDekJNLEVBQVNBLEVBQU8sSUFBSU4sQ0FBYSxHQUduQ00sRUFBU0EsRUFDTixJQUFJTSxHQUFjLENBQUUsbUJBQW9CLEVBQUssQ0FBQyxFQUM5QyxJQUFJQyxFQUFTLEVBQ2IsSUFBSUMsRUFBaUNmLENBQVUsRUFDL0MsSUFBSWdCLEdBQWdCQyxFQUFxQmpCLENBQVUsQ0FBQyxFQUVuRE0sRUFBbUIsSUFBSSxTQUFTLEVBQUcsQ0FDckMsSUFBTVksRUFBK0JkLEdBQWlCZSxFQUN0RFosRUFBU0EsRUFBTyxJQUFJYSxHQUFvQkYsQ0FBWSxDQUN0RCxDQU9BLE9BSkloQixFQUFjLE9BQVMsSUFDekJLLEVBQVNBLEVBQU8sSUFBSUwsQ0FBYSxHQUcvQkosSUFBVyxPQUNOUyxFQUFPLElBQUljLEdBQWlCLENBQ2pDLG1CQUFvQixFQUN0QixDQUFDLEVBSUlkLENBR1QsRUR6RkEsSUFBTWUsRUFBTixLQUEwQixDQUd4QixZQUFZQyxFQUF5QixDQUFDLEVBQUcsQ0FDdkMsS0FBSyxRQUFVQSxDQUNqQixDQUtBLE1BQU0sWUFBWUMsRUFBbUMsQ0FFbkQsSUFBTUMsRUFBUyxNQURHQyxFQUFVLE9BQVEsS0FBSyxPQUFPLEVBQ2pCLFFBQVFGLENBQVEsRUFDL0MsT0FBTyxPQUFPQyxDQUFNLENBQ3RCLENBS0EsTUFBTSxZQUFZRCxFQUFpQyxDQUNqRCxJQUFNRyxFQUFZRCxFQUFVLE9BQVEsS0FBSyxPQUFPLEVBQzFDRSxFQUFPRCxFQUFVLE1BQU1ILENBQVEsRUFFckMsT0FEZSxNQUFNRyxFQUFVLElBQUlDLENBQUksQ0FFekMsQ0FLQSxjQUFjTCxFQUE4QixDQUMxQyxLQUFLLFFBQVVBLENBQ2pCLENBQ0YsRUFHQU0sR0FBT1AsQ0FBbUIiLAogICJuYW1lcyI6IFsiZXhwb3NlIiwgInVuaWZpZWQiLCAicmVtYXJrUGFyc2UiLCAicmVtYXJrR2ZtIiwgInJlbWFya1JlaHlwZSIsICJyZWh5cGVTdHJpbmdpZnkiLCAicmVtYXJrTWF0aCIsICJyZWh5cGVTYW5pdGl6ZSIsICJyZWh5cGVSYXciLCAiZGVmYXVsdFNjaGVtYSIsICJNQVRITUxfVEFHX05BTUVTIiwgIk1BVEhNTF9BVFRSSUJVVEVTIiwgImNyZWF0ZVNhbml0aXplU2NoZW1hIiwgImN1c3RvbVRhZ3MiLCAiZGVmYXVsdFNjaGVtYSIsICJNQVRITUxfVEFHX05BTUVTIiwgIk1BVEhNTF9BVFRSSUJVVEVTIiwgImFjYyIsICJ0YWciLCAiY29udmVydCIsICJ0ZXN0IiwgIm9rIiwgImNhc3RGYWN0b3J5IiwgImFueUZhY3RvcnkiLCAicHJvcGVydGllc0ZhY3RvcnkiLCAidHlwZUZhY3RvcnkiLCAidGVzdHMiLCAiY2hlY2tzIiwgImluZGV4IiwgImFueSIsICJwYXJhbWV0ZXJzIiwgImNoZWNrIiwgImNoZWNrQXNSZWNvcmQiLCAiYWxsIiwgIm5vZGUiLCAibm9kZUFzUmVjb3JkIiwgImtleSIsICJ0eXBlIiwgInRlc3RGdW5jdGlvbiIsICJ2YWx1ZSIsICJwYXJlbnQiLCAibG9va3NMaWtlQU5vZGUiLCAiY29sb3IiLCAiZCIsICJlbXB0eSIsICJDT05USU5VRSIsICJFWElUIiwgIlNLSVAiLCAidmlzaXRQYXJlbnRzIiwgInRyZWUiLCAidGVzdCIsICJ2aXNpdG9yIiwgInJldmVyc2UiLCAiY2hlY2siLCAiaXMiLCAiY29udmVydCIsICJzdGVwIiwgImZhY3RvcnkiLCAibm9kZSIsICJpbmRleCIsICJwYXJlbnRzIiwgInZhbHVlIiwgIm5hbWUiLCAidmlzaXQiLCAiY29sb3IiLCAicmVzdWx0IiwgInN1YnJlc3VsdCIsICJvZmZzZXQiLCAiZ3JhbmRwYXJlbnRzIiwgInRvUmVzdWx0IiwgIm5vZGVBc1BhcmVudCIsICJjaGlsZCIsICJ2aXNpdCIsICJ0cmVlIiwgInRlc3RPclZpc2l0b3IiLCAidmlzaXRvck9yUmV2ZXJzZSIsICJtYXliZVJldmVyc2UiLCAicmV2ZXJzZSIsICJ0ZXN0IiwgInZpc2l0b3IiLCAidmlzaXRQYXJlbnRzIiwgIm92ZXJsb2FkIiwgIm5vZGUiLCAicGFyZW50cyIsICJwYXJlbnQiLCAiaW5kZXgiLCAicmVoeXBlQ29udmVydEFibm9ybWFsVGFnc1RvVGV4dCIsICJjdXN0b21UYWdzIiwgInRyZWUiLCAic2NoZW1hIiwgImNyZWF0ZVNhbml0aXplU2NoZW1hIiwgImFsbG93ZWRUYWdOYW1lcyIsICJ2aXNpdCIsICJub2RlIiwgImluZGV4IiwgInBhcmVudCIsICJ0YWdOYW1lIiwgInRhZ1N0cmluZyIsICJrZXkiLCAidmFsdWUiLCAiaW5uZXJDb250ZW50IiwgInByb2Nlc3NDaGlsZHJlbiIsICJjaGlsZHJlbiIsICJjaGlsZCIsICJlbGVtZW50Q2hpbGQiLCAiY2hpbGRUYWciLCAidGV4dE5vZGUiLCAicmVoeXBlTWF0aEpheENodG1sIiwgIk1BVEhfSkFYRk9OVF9VUkwiLCAiREVGQVVMVF9NQVRISkFYX0NPTkZJRyIsICJjb3VudFByZWNlZGluZ0JhY2tzbGFzaGVzIiwgImlucHV0IiwgImluZGV4IiwgImNvdW50IiwgImlzVW5lc2NhcGVkRGVsaW1pdGVyIiwgIm5leHRDaGFyIiwgImZpbmRDbG9zaW5nRGVsaW1pdGVyIiwgImZyb21JbmRleCIsICJjbG9zZUNoYXIiLCAiaXNMaW5lU3RhcnQiLCAic2NhbkZlbmNlIiwgImNoYXIiLCAiZmVuY2VMZW5ndGgiLCAiaSIsICJpc0luZGVudGVkQ29kZUxpbmUiLCAibm9ybWFsaXplTGF0ZXhQYXJlbnNNYXRoIiwgIm91dHB1dCIsICJpbkZlbmNlZENvZGVCbG9jayIsICJmZW5jZUNoYXIiLCAiaW5JbmxpbmVDb2RlIiwgImlubGluZUNvZGVUaWNrTGVuZ3RoIiwgImVuZCIsICJmZW5jZSIsICJ0aWNrcyIsICJqIiwgImNsb3NlSW5kZXgiLCAiaW5uZXIiLCAic3RhcnQiLCAicmVtYXJrTWF0aERlbGltaXRlcnMiLCAiY3VycmVudFBhcnNlciIsICJkb2N1bWVudCIsICJmaWxlIiwgIm5leHREb2N1bWVudCIsICJub3JtYWxpemVkIiwgImdldFBhcnNlciIsICJ0YXJnZXQiLCAib3B0aW9uIiwgImN1c3RvbVRhZ3MiLCAicmVtYXJrUGx1Z2lucyIsICJyZWh5cGVQbHVnaW5zIiwgImV4dGVuZGVkR3JhbW1hciIsICJtYXRoSmF4Q29uZmlnIiwgInN1cHBvcnRzTGFUZVgiLCAiZXh0ZW5kZWRHcmFtbWFyU2V0IiwgInBhcnNlciIsICJ1bmlmaWVkIiwgInJlbWFya1BhcnNlIiwgInJlbWFya0dmbSIsICJyZW1hcmtNYXRoRGVsaW1pdGVycyIsICJyZW1hcmtNYXRoIiwgInJlbWFya1JlaHlwZSIsICJyZWh5cGVSYXciLCAicmVoeXBlQ29udmVydEFibm9ybWFsVGFnc1RvVGV4dCIsICJyZWh5cGVTYW5pdGl6ZSIsICJjcmVhdGVTYW5pdGl6ZVNjaGVtYSIsICJtZXJnZWRDb25maWciLCAiREVGQVVMVF9NQVRISkFYX0NPTkZJRyIsICJyZWh5cGVNYXRoSmF4Q2h0bWwiLCAicmVoeXBlU3RyaW5naWZ5IiwgIlBhcnNlcldvcmtlclNlcnZpY2UiLCAib3B0aW9ucyIsICJtYXJrZG93biIsICJyZXN1bHQiLCAiZ2V0UGFyc2VyIiwgInByb2Nlc3NvciIsICJ0cmVlIiwgImV4cG9zZSJdCn0K
package/package.json ADDED
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "@markdown-next/parser",
3
+ "version": "0.0.1-alpha",
4
+ "description": "Markdown parser for markdown-next with single-threaded and multi-threaded support",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs"
12
+ }
13
+ },
14
+ "files": [
15
+ "./dist",
16
+ "./package.json"
17
+ ],
18
+ "keywords": [
19
+ "markdown",
20
+ "parser",
21
+ "unified",
22
+ "remark",
23
+ "rehype",
24
+ "worker",
25
+ "multi-threaded",
26
+ "comlink"
27
+ ],
28
+ "author": "",
29
+ "license": "MIT",
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://github.com/yourusername/vue-markdown-next.git",
33
+ "directory": "packages/parser"
34
+ },
35
+ "bugs": {
36
+ "url": "https://github.com/yourusername/vue-markdown-next/issues"
37
+ },
38
+ "engines": {
39
+ "node": ">=14.0.0"
40
+ },
41
+ "dependencies": {
42
+ "@types/hast": "^3.0.4",
43
+ "comlink": "^4.4.2",
44
+ "rehype-mathjax": "^7.1.0",
45
+ "rehype-raw": "^7.0.0",
46
+ "rehype-sanitize": "^6.0.0",
47
+ "rehype-stringify": "^10.0.1",
48
+ "remark-gfm": "^4.0.1",
49
+ "remark-math": "^6.0.0",
50
+ "remark-parse": "^11.0.0",
51
+ "remark-rehype": "^11.1.2",
52
+ "tsup": "^8.5.1",
53
+ "unified": "^11.0.5"
54
+ },
55
+ "devDependencies": {
56
+ "@types/node": "^22.19.3",
57
+ "vitest": "^4.0.16"
58
+ },
59
+ "peerDependencies": {
60
+ "typescript": ">=4.5.0"
61
+ },
62
+ "peerDependenciesMeta": {
63
+ "typescript": {
64
+ "optional": true
65
+ }
66
+ },
67
+ "sideEffects": false,
68
+ "scripts": {
69
+ "dev": "tsc --watch",
70
+ "build": "tsup",
71
+ "typecheck": "tsc --noEmit",
72
+ "lint": "eslint src --ext .ts",
73
+ "lint:fix": "eslint src --ext .ts --fix",
74
+ "test": "vitest",
75
+ "coverage": "vitest run --coverage"
76
+ }
77
+ }