@tomer/uneval 0.0.1
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/dist/index.d.mts +54 -0
- package/dist/index.js +2 -0
- package/license +18 -0
- package/package.json +79 -0
- package/readme.md +320 -0
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//#region src/index.d.ts
|
|
2
|
+
/** Options for {@link uneval}. */
|
|
3
|
+
type UnevalOptions = {
|
|
4
|
+
/**
|
|
5
|
+
* A custom function for unevaling values.
|
|
6
|
+
*
|
|
7
|
+
* Return the following types depending on the desired behavior:
|
|
8
|
+
* - `string` to provide a custom uneval result for {@link value}
|
|
9
|
+
* - `null` to omit {@link value} from the output (e.g. in arrays, objects,
|
|
10
|
+
* Sets, Maps). Omitting the root value throws an `Error`.
|
|
11
|
+
* - `undefined` (or don't return anything, which is equivalent) to use the
|
|
12
|
+
* default behavior for {@link value}
|
|
13
|
+
*
|
|
14
|
+
* It can be used to uneval already supported values differently or to uneval
|
|
15
|
+
* unsupported values such as functions.
|
|
16
|
+
*
|
|
17
|
+
* The {@link uneval} param is the same uneval function these options were
|
|
18
|
+
* passed to. You may use it to delegate back to uneval for sub-objects.
|
|
19
|
+
*/
|
|
20
|
+
custom?: (value: unknown, uneval: (value: unknown) => string) => string | null | undefined;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Converts the given {@link value} to JavaScript source code.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```js
|
|
27
|
+
* import assert from 'node:assert'
|
|
28
|
+
* import uneval from '@tomer/uneval'
|
|
29
|
+
*
|
|
30
|
+
* const object = { message: `hello world` }
|
|
31
|
+
*
|
|
32
|
+
* const source = uneval(object)
|
|
33
|
+
* console.log(source)
|
|
34
|
+
* //=> {message:"hello world"}
|
|
35
|
+
*
|
|
36
|
+
* const roundtrippedObject = (0, eval)(`(${source})`)
|
|
37
|
+
* assert.deepEqual(roundtrippedObject, object)
|
|
38
|
+
*
|
|
39
|
+
* const circularObject = {}
|
|
40
|
+
* circularObject.self = circularObject
|
|
41
|
+
*
|
|
42
|
+
* const circularSource = uneval(circularObject)
|
|
43
|
+
* console.log(circularSource)
|
|
44
|
+
* //=> (a=>a.self=a)({})
|
|
45
|
+
*
|
|
46
|
+
* const roundtrippedCircularObject = (0, eval)(`(${circularSource})`)
|
|
47
|
+
* assert.deepEqual(roundtrippedCircularObject, circularObject)
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
declare const uneval: (value: unknown, {
|
|
51
|
+
custom
|
|
52
|
+
}?: UnevalOptions) => string;
|
|
53
|
+
//#endregion
|
|
54
|
+
export { UnevalOptions, uneval as default };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
let e=e=>{let r="";do{r=t[e%t.length]+r,e=~~(e/t.length)-1}while(e>=0);return r.length>1&&(r=`$${r}`),r},t="abcdefghijklmnopqrstuvwxyz";t+=t.toUpperCase();let r=(e,t="")=>`new ${e}${""===t?"":`(${t})`}`,l=(e,t)=>t.l.get(e).t,n=/^[$_\p{ID_Start}][$_\p{ID_Continue}]*$/u,u=e=>!!isNaN(e)&&(o.setFloat64(0,e),o.getBigUint64(0)!=i),o=new DataView(new ArrayBuffer(8));o.setFloat64(0,NaN);let i=o.getBigUint64(0),f=({byteOffset:e,byteLength:t,buffer:r,BYTES_PER_ELEMENT:l},n)=>`${D(r,n)}${e+t==r.byteLength?e>0?`,${e}`:"":`,${+e},${t/l}`}`,$=e=>`Object.assign(${e})`,a=(e,t)=>{let r=t.u;t.u=void 0;let l=D(e,t);return t.u=r,l},s=(e,t)=>{let r="",l=0;for(let n=0;n<e.length;n+=1){let u=e[n],o=t[u];if(o){r+=e.slice(l,n)+o,l=n+1;continue}let i,f=u.charCodeAt(0);if(f>=55296&&f<=56319){let t=e.charCodeAt(n+1);t>=56320&&t<=57343?n++:i=!0}else i=f>=56320&&f<=57343;i?(r+=`${e.slice(l,n)}\\u${f.toString(16)}`,l=n+1):"/"==u&&n>0&&"<"==e[n-1]&&"script"==e.slice(n+1,n+7).toLowerCase()&&(r+=`${e.slice(l,n)}\\u002f`,l=n+1)}return r+=e.slice(l),r},c={"\0":"\\0","\n":"\\n","\r":"\\r","\t":"\\t","\b":"\\b","\f":"\\f","\v":"\\v","\u2028":"\\u2028","\u2029":"\\u2029"},b={'"':'\\"',"\\":"\\\\",...c},y=new Map(Reflect.ownKeys(Symbol).flatMap(e=>{if("string"!=typeof e)return[];if(!n.test(e))return[];let t=Symbol[e];return"symbol"==typeof t?[[t,e]]:[]})),_=e=>{let t=e.constructor?.name;return[m[t],t]},m={Boolean:0,Number:0,RegExp:1,String:0,Array:2,Set:3,Map:4,ArrayBuffer:5,Int8Array:6,Uint8Array:6,Uint8ClampedArray:6,Int16Array:6,Uint16Array:6,Int32Array:6,Uint32Array:6,Float16Array:6,Float32Array:6,Float64Array:6,BigInt64Array:6,BigUint64Array:6,Buffer:7,Date:8,Duration:9,Instant:9,PlainDate:9,PlainDateTime:9,PlainMonthDay:9,PlainTime:9,PlainYearMonth:9,ZonedDateTime:9,URL:10,URLSearchParams:10},p=(e,t)=>{let r=t.o.get(e);if("string"==typeof r)return r;if("function"==typeof e)throw new TypeError("Unsupported function");let[l,n]=_(e);return d[l]?.(e,t,n)??v(e,t)},d=[(e,t)=>`Object(${D(e.valueOf(),t)})`,({source:e,flags:t},l,n)=>e==s(e,c)&&/^[a-z]*$/u.test(t)?`/${e}/${t}`:r(n,`${D(e,l)}${t&&`,${D(t,l)}`}`),(e,t)=>{let r,n=Object.keys(e).flatMap(e=>isNaN(+e)?[]:+e),u=e.length-1 in e?"[]":`Array(${e.length})`,o=e.length-n.length,i=(`${e.length}`.length+2)*n.length;if($(u).length+i<o){let r=n.flatMap(r=>{let n=e[r],u=D(n,t);if(u)return`${r}:${u}`;if(null===u){let u=l(n,t);t.i.push({$:`${l(e,t)}[${r}]=${u}`,_:u})}return[]}).join();return r?$(`${u},{${r}}`):u}let f=Array.from(e,(n,u)=>{if(!(u in e))return r=!0,"";r=!1;let o=D(n,t);if(o)return o;if(null===o){let r=l(n,t);t.i.push({$:`${l(e,t)}[${u}]=${r}`,_:r})}else r=!0;return""});return r&&f.push(""),`[${f.join()}]`},(e,t,n)=>{let u,o=[];for(let r of e){let n=(u?a:D)(r,t);if(void 0===n)continue;if(null===n&&(u=!0,n=l(r,t)),!u){o.push(n);continue}let i=l(e,t);t.i.push({$:`${i}.add(${n})`,_:i})}let i=o.join();return r(n,i&&`[${i}]`)},(e,t,n)=>{let u,o=[];for(let[r,n]of e){let i=(u?a:D)(r,t);null===i&&(u=!0);let f=(u?a:D)(n,t);if(void 0===i||void 0===f)continue;let $=i??l(r,t),s=f??l(n,t);if(!u&&null!=f){o.push(`[${$},${s}]`);continue}let c=l(e,t);t.i.push({$:`${c}.set(${$},${s})`,_:c}),u||o.push(`[${$}]`)}let i=o.join();return r(n,i&&`[${i}]`)},(e,t,n)=>{let u,o,{detached:i,resizable:f,byteLength:$,maxByteLength:a}=e;if(i&&t.i.push({$:`${l(e,t)}.transfer()`}),0==$||-1==(o=(u=new Uint8Array(e.slice())).findIndex(e=>0!=e)))return r(n,f?`${+$},{maxByteLength:${+a}}`:$>0?$:"");if(!f)return`${D(u,t)}.buffer`;let s=u.findLastIndex(e=>0!=e);return t.i.push({$:`new Uint8Array(${l(e,t)}).set([${u.slice(o,s+1)}]${o>0?`,${o}`:""})`}),r(n,`${+$},{maxByteLength:${+a}}`)},(e,t,l)=>{let n="F"==l[0]&&[...e].some(u),o=e.buffer;if(t.o.has(o)||t.l.has(o)||e.byteLength!=o.byteLength||o.resizable||n)return r(l,f(e,t));let i="B"==l[0]?0n:0;return e.some(e=>!Object.is(e,i))?`${l}.of(${Array.from(e,e=>D(e,t)).join()})`:r(l,e.length||"")},(e,t,r)=>{let l=e.buffer;return e.byteOffset||e.byteLength||l.resizable||l.detached?`${r}.from(${f(e,t)})`:`${r}.alloc(0)`},(e,t,l)=>r(l,D(+e,t)),(e,t,r)=>{if("Z"!=r[0])return`Temporal.${r}.from(${D(`${e}`,t)})`;let l=e;return`new Temporal.${r}(${D(l.epochNanoseconds,t)},${D(l.timeZoneId,t)})`},(e,t,l)=>{let n=`${e}`;return r(l,n&&D(n,t))}],v=(e,t)=>{let r,u=[],o=Reflect.ownKeys(e);for(r=0;r<o.length;r++){let i=o[r],f=Object.getOwnPropertyDescriptor(e,i);if(!g(f))break;let $=f.value;if("symbol"==typeof i&&null===t.o.get(i))continue;let a=D($,t);if(void 0===a)continue;if(null!==a){let{$:e,m:r}=j(i,t);u.push({$:r&&e==a?e:`${e}:${a}`});continue}let s=l(e,t),c=l($,t),b="symbol"==typeof i?{$:`${s}[${D(i,t)}]=${c}`,_:c}:i==h?{$:`Object.defineProperty(${s},"${h}",{value:${c},configurable:!0,enumerable:!0,writable:!0})`,_:s}:{$:`${s}${n.test(i)?`.${i}`:`[${D(i,t)}]`}=${c}`,_:c};u.push({p:!0,$:`${j(i,t).$}:null`,v:()=>b})}let i=r;if(i<o.length)for(;r<o.length;r++){let l=o[r],n=Object.getOwnPropertyDescriptor(e,l);u.push(w(l,n,e,t))}let f=u.length;for(;f>0&&u[f-1].p;)f--;for(let e=0;e<u.length;e++){let r=u[e];r.p&&t.i.push(r.v(e<f))}let $=u.slice(0,f),a=`{${$.slice(0,i).map(e=>e.$).join()}}`,s=$.slice(i).map(e=>e.$);s.length&&(a=`Object.defineProperties(${a},{${s.join()}})`);let c=Object.getPrototypeOf(e);return A(c)||(a=`Object.setPrototypeOf(${a},${D(c,t)})`),a},g=e=>"value"in e&&e.enumerable&&e.configurable&&e.writable,w=(e,t,r,n)=>{let u,o,i=[];for(let e of B){if(!(e in t))continue;let r=t[e];if(U.includes(e)){if(null==r&&o)continue;o=!0}let f=D(r,n);void 0!==f&&(null===f&&(u=!0,f=l(r,n)),i.push(`${e}:${f}`))}for(let e of S)t[e]&&i.push(`${e}:!0`);let f=`{${i.join()}}`;return u?{p:!0,$:`${j(e,n).$}:{configurable:!0}`,v:u=>{let o=l(r,n),$=u&&!t.configurable?`{${[...i,"configurable:!1"].join()}}`:f;return{$:`Object.defineProperty(${o},${D(e,n)},${$})`,_:o}}}:{$:`${j(e,n).$}:${f}`}},j=(e,t)=>{if("symbol"==typeof e||e==h)return{$:`[${D(e,t)}]`};let r=e[0];if(r>="0"&&r<="9"){let r=+e;return{$:r>=0&&Number.isSafeInteger(r)&&e==`${r}`?e:D(e,t)}}return n.test(e)?{$:e,m:!0}:{$:D(e,t)}},A=e=>e==Object.prototype||O(e)&&T(e)==P,O=e=>{let t=typeof e;return"object"==t&&!!e||"function"==t},T=e=>Object.getOwnPropertyNames(e).sort().join("\0"),h="__proto__",P=T(Object.prototype),S=["configurable","enumerable","writable"],U=["get","set"],B=["value",...U],D=(e,t)=>{if(!O(e)){let r=t.o.get(e);if(null===r)return;if(void 0!==r)return r}let r=typeof e;return"undefined"==r?"void 0":"boolean"==r?(e=>"!"+ +!e)(e):"number"==r?(e=>{if(e==1/0)return"1/0";if(e==-1/0)return"-1/0";let t=`${e}`;return Object.is(e,-0)?`-${t}`:t.startsWith("0.")?t.slice(1):t.startsWith("-0.")?`-${t.slice(2)}`:t})(e):"bigint"==r?(e=>`${e}n`)(e):"string"==r?`"${s(e,b)}"`:"symbol"==r?((e,t)=>{let r=y.get(e);if(r)return`Symbol.${r}`;if(r=Symbol.keyFor(e),r)return`Symbol.for(${D(r,t)})`;throw new TypeError("Unsupported symbol")})(e,t):null==e?"null":((e,t)=>{if(null===t.o.get(e))return;let r=t.l.get(e);if(!r)return p(e,t);if(t.j.has(e))return null;if(t.u&&(t.u.A=!0),!r.$){let l=t.u;t.u=r,t.j.add(e),r.$=p(e,t),t.j.delete(e),t.u=l,t.O.push(r)}return r.t})(e,t)},E=(e,{custom:t}={})=>{let r=I(e,t),l=D(e,r);if(void 0===l)throw new Error("Root omitted");if(!r.l.size)return l;let n=r.i.map(e=>e.$),u=r.l.get(e);u?r.i.at(-1)?._!=u.t&&n.push(u.t):n.push(l);let o=n.join();(n.length>1||"{"==o[0])&&(o=`(${o})`);let i,f=[],$=[];for(let e of r.O)i||=e.A,i?f.push(`${e.t}=${e.$}`):(f.push(e.t),$.push(e.$));let a=f.join();return`(${f.length>1?`(${a})`:a}=>${o})(${$.join()})`},I=(t,r)=>{let l=new Map,n=new Map,u=t=>{l.has(t)||l.set(t,{t:e(l.size)})},o=new Map,i=(e,t)=>{if(r){let t=n.get(e);if(void 0===t&&(t=r(e,e=>E(e,{custom:r})),void 0!==t&&n.set(e,t)),null===t)return}if(!e||"object"!=typeof e)return;let l=o.get(e);if(l)return u(e),void(2==l&&u(t));o.set(e,2),f(e),o.set(e,1)},f=e=>{let[t]=_(e);if(null==t){for(let t of Reflect.ownKeys(e)){"symbol"==typeof t&&i(t);let r=Object.getOwnPropertyDescriptor(e,t);i(r.value,e),i(r.get,e),i(r.set,e)}let t=Object.getPrototypeOf(e);A(t)||i(t,e)}else if(0==t){let t=e.valueOf();i(t),null===n.get(t)&&n.set(e,null)}else if(2==t)for(let t of Object.keys(e))i(e[t],e);else if(3==t)for(let t of e)i(t,e);else if(4==t)for(let[t,r]of e)i(t,e),i(r,e),2==o.get(r)&&O(t)&&u(t);else if(5==t)(e.detached||e.resizable&&new Uint8Array(e).some(e=>0!=e))&&u(e);else if(7==t||6==t){let{buffer:t}=e;i(t,e),null===n.get(t)&&n.set(e,null)}};return i(t),{l,o:n,j:new Set,O:[],i:[]}};export{E as default};
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2ludGVybmFsL2lkZW50aWZpZXIudHMiLCIuLi9zcmMvaW50ZXJuYWwvY29tbW9uLnRzIiwiLi4vc3JjL2ludGVybmFsL2J1ZmZlci50cyIsIi4uL3NyYy9pbnRlcm5hbC9jb2xsZWN0aW9uLnRzIiwiLi4vc3JjL2ludGVybmFsL3ByaW1pdGl2ZS50cyIsIi4uL3NyYy9pbnRlcm5hbC90ZW1wb3JhbC50cyIsIi4uL3NyYy9pbnRlcm5hbC90eXBlLnRzIiwiLi4vc3JjL2ludGVybmFsL3VybC50cyIsIi4uL3NyYy9pbnRlcm5hbC9vYmplY3QudHMiLCIuLi9zcmMvaW50ZXJuYWwvaW5kZXgudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIFJldHVybnMgYSB1bmlxdWUgdmFsaWQgSlMgaWRlbnRpZmllciBmb3IgdGhlIGdpdmVuIHtAbGluayBpbmRleH0uICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVJZGVudGlmaWVyID0gKGluZGV4OiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBsZXQgaWRlbnRpZmllciA9IGBgXG4gIGRvIHtcbiAgICBpZGVudGlmaWVyID0gSURFTlRJRklFUl9DSEFSU1tpbmRleCAlIElERU5USUZJRVJfQ0hBUlMubGVuZ3RoXSEgKyBpZGVudGlmaWVyXG4gICAgLy8gRm9yIHNtYWxsZXIgYnVuZGxlIHNpemUuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLW1hdGgtdHJ1bmNcbiAgICBpbmRleCA9IH5+KGluZGV4IC8gSURFTlRJRklFUl9DSEFSUy5sZW5ndGgpIC0gMVxuICB9IHdoaWxlIChpbmRleCA+PSAwKVxuXG4gIGlmIChpZGVudGlmaWVyLmxlbmd0aCA+IDEpIHtcbiAgICAvLyBBbnkgaWRlbnRpZmllcnMgd2l0aCAyIG9yIG1vcmUgY2hhcmFjdGVycyBjb3VsZCBjbGFzaCB3aXRoIHJlc2VydmVkXG4gICAgLy8ga2V5d29yZHMgb3IgZ2xvYmFsIGlkZW50aWZpZXJzIHdlIHJlZmVyZW5jZS4gV2UgY291bGQgbGlzdCBhbGwgdGhvc2Ugb3V0XG4gICAgLy8gYW5kIGNoZWNrIHRoZW0sIGJ1dCBlbmRpbmcgdXAgd2l0aCBpZGVudGlmaWVycyBhcmUgbW9yZSB0aGFuXG4gICAgLy8gYElERU5USUZJRVJfQ0hBUlMubGVuZ3RoYCBpbiBsZW5ndGggaXMgc28gcmFyZSBpbiBgdW5ldmFsYCAocmVxdWlyZXMgYVxuICAgIC8vIHRvbiBvZiBzaGFyZWQgb3IgY2lyY3VsYXIgcmVmZXJlbmNlcykgdGhhdCBpdCdzIG5vdCB3b3J0aCBpbmNyZWFzaW5nIHRoZVxuICAgIC8vIGJ1bmRsZSBzaXplIGZvci5cbiAgICBpZGVudGlmaWVyID0gYCQke2lkZW50aWZpZXJ9YFxuICB9XG5cbiAgcmV0dXJuIGlkZW50aWZpZXJcbn1cblxubGV0IElERU5USUZJRVJfQ0hBUlMgPSBgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpgXG5JREVOVElGSUVSX0NIQVJTICs9IElERU5USUZJRVJfQ0hBUlMudG9VcHBlckNhc2UoKVxuIiwiaW1wb3J0IHR5cGUgeyBTdGF0ZSB9IGZyb20gJy4vdHlwZXMudHMnXG5cbmV4cG9ydCBjb25zdCBuZXdJbnN0YW5jZSA9IChuYW1lOiBzdHJpbmcsIGFyZ3M6IHN0cmluZyB8IG51bWJlciA9IGBgKTogc3RyaW5nID0+XG4gIGBuZXcgJHtuYW1lfSR7YXJncyA9PT0gYGAgPyBgYCA6IGAoJHthcmdzfSlgfWBcblxuZXhwb3J0IGNvbnN0IGJpbmRpbmdOYW1lID0gKHZhbHVlOiBvYmplY3QsIHN0YXRlOiBTdGF0ZSk6IHN0cmluZyA9PlxuICBzdGF0ZS5fYmluZGluZ3MuZ2V0KHZhbHVlKSEuX25hbWVcblxuZXhwb3J0IGNvbnN0IFBST1BFUlRZX1JFR19FWFAgPSAvXlskX1xccHtJRF9TdGFydH1dWyRfXFxwe0lEX0NvbnRpbnVlfV0qJC91XG4iLCIvLyBGb3Igc21hbGxlciBidW5kbGUgc2l6ZS5cbi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLW51bWJlci1wcm9wZXJ0aWVzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBlcWVxZXEgKi9cblxuaW1wb3J0IHsgYmluZGluZ05hbWUsIG5ld0luc3RhbmNlIH0gZnJvbSAnLi9jb21tb24udHMnXG5pbXBvcnQgeyB1bmV2YWxJbnRlcm5hbCB9IGZyb20gJy4vaW5kZXgudHMnXG5pbXBvcnQgdHlwZSB7IFN0YXRlLCBVbmV2YWwgfSBmcm9tICcuL3R5cGVzLnRzJ1xuXG5leHBvcnQgdHlwZSBUeXBlZEFycmF5ID1cbiAgfCBJbnQ4QXJyYXlcbiAgfCBVaW50OEFycmF5XG4gIHwgVWludDhDbGFtcGVkQXJyYXlcbiAgfCBJbnQxNkFycmF5XG4gIHwgVWludDE2QXJyYXlcbiAgfCBJbnQzMkFycmF5XG4gIHwgVWludDMyQXJyYXlcbiAgfCBGbG9hdDE2QXJyYXlcbiAgfCBGbG9hdDMyQXJyYXlcbiAgfCBGbG9hdDY0QXJyYXlcbiAgfCBCaWdJbnQ2NEFycmF5XG4gIHwgQmlnVWludDY0QXJyYXlcblxuZXhwb3J0IGNvbnN0IHVuZXZhbFR5cGVkQXJyYXkgPSAoXG4gIHR5cGVkQXJyYXk6IFR5cGVkQXJyYXksXG4gIHN0YXRlOiBTdGF0ZSxcbiAgbmFtZTogc3RyaW5nLFxuKTogc3RyaW5nID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItc3RyaW5nLXN0YXJ0cy1lbmRzLXdpdGhcbiAgY29uc3QgaXNGbG9hdGluZ1BvaW50ID0gbmFtZVswXSA9PSBgRmBcbiAgY29uc3QgaGFzTm9uQ2Fub25pY2FsTmFOID1cbiAgICBpc0Zsb2F0aW5nUG9pbnQgJiZcbiAgICBbLi4uKHR5cGVkQXJyYXkgYXMgRmxvYXQxNkFycmF5IHwgRmxvYXQzMkFycmF5IHwgRmxvYXQ2NEFycmF5KV0uc29tZShcbiAgICAgIGlzTm9uQ2Fub25pY2FsTmFOLFxuICAgIClcblxuICBjb25zdCBhcnJheUJ1ZmZlciA9IHR5cGVkQXJyYXkuYnVmZmVyXG4gIGlmIChcbiAgICAvLyBXZSBoYXZlIHRvIGNvbnN0cnVjdCBmcm9tIGEgYnVmZmVyIGlmIHRoZSBlbmQtdXNlciBwcm92aWRlZCBjdXN0b20gc291cmNlXG4gICAgLy8gZm9yIGl0LlxuICAgIHN0YXRlLl9jdXN0b21Tb3VyY2VzLmhhcyhhcnJheUJ1ZmZlcikgfHxcbiAgICAvLyBXZSBoYXZlIHRvIGNvbnN0cnVjdCBmcm9tIGEgYnVmZmVyIGlmIGl0IGhhcyBhIGJpbmRpbmcsIG1lYW5pbmcgdGhhdCBpdCdzXG4gICAgLy8gc2hhcmVkIGJldHdlZW4gbXVsdGlwbGUgdmFsdWVzLlxuICAgIHN0YXRlLl9iaW5kaW5ncy5oYXMoYXJyYXlCdWZmZXIpIHx8XG4gICAgLy8gQWxzbywgaWYgdGhlIGJ5dGUgbGVuZ3RocyBkaWZmZXIgYmV0d2VlbiB0aGUgdHlwZWQgYXJyYXkgYW5kIHRoZSBidWZmZXIsXG4gICAgLy8gdGhlbiB0aGF0IG1lYW5zIHRoaXMgdHlwZWQgYXJyYXkgaXMgYSB2aWV3IG9mIGEgc2xpY2Ugb2YgYSBidWZmZXIuIFRoZVxuICAgIC8vIG9ubHkgd2F5IHRvIGFjaGlldmUgdGhhdCBpcyBieSBjb25zdHJ1Y3RpbmcgZnJvbSBhIGJ1ZmZlci5cbiAgICB0eXBlZEFycmF5LmJ5dGVMZW5ndGggIT0gYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCB8fFxuICAgIC8vIExhc3RseSwgaWYgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlzIHJlc2l6YWJsZSwgdGhlbiB3ZSBtdXN0IGFsc29cbiAgICAvLyBjb25zdHJ1Y3QgZnJvbSBhIGJ1ZmZlci4gVGhlIGRlZmF1bHQgYnVmZmVyIGNyZWF0ZWQgZnJvbVxuICAgIC8vIGBuZXcgVHlwZWRBcnJheSguLi4pYCBpcyBub3QgcmVzaXphYmxlLlxuICAgIChhcnJheUJ1ZmZlciBhcyBBcnJheUJ1ZmZlcikucmVzaXphYmxlIHx8XG4gICAgLy8gRm9yIGZsb2F0aW5nLXBvaW50IGFycmF5cyB3aXRoIG5vbi1jYW5vbmljYWwgTmFOIHZhbHVlcywgd2UgbXVzdFxuICAgIC8vIGNvbnN0cnVjdCBmcm9tIHRoZSBidWZmZXIgdG8gcHJlc2VydmUgdGhlIGV4YWN0IE5hTiBiaXQgcGF0dGVybi5cbiAgICBoYXNOb25DYW5vbmljYWxOYU5cbiAgKSB7XG4gICAgcmV0dXJuIG5ld0luc3RhbmNlKG5hbWUsIHVuZXZhbEJ1ZmZlcldyYXBwZXJBcmdzKHR5cGVkQXJyYXksIHN0YXRlKSlcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXN0cmluZy1zdGFydHMtZW5kcy13aXRoXG4gIGNvbnN0IHplcm8gPSBuYW1lWzBdID09IGBCYCA/IDBuIDogMFxuICBpZiAodHlwZWRBcnJheS5zb21lKHZhbHVlID0+ICFPYmplY3QuaXModmFsdWUsIHplcm8pKSkge1xuICAgIHJldHVybiBgJHtuYW1lfS5vZigke0FycmF5LmZyb208bnVtYmVyIHwgYmlnaW50LCBzdHJpbmc+KFxuICAgICAgdHlwZWRBcnJheSxcbiAgICAgIHZhbHVlID0+IHVuZXZhbEludGVybmFsKHZhbHVlLCBzdGF0ZSkhLFxuICAgICkuam9pbigpfSlgXG4gIH1cblxuICByZXR1cm4gbmV3SW5zdGFuY2UobmFtZSwgdHlwZWRBcnJheS5sZW5ndGggfHwgYGApXG59XG5cbmNvbnN0IGlzTm9uQ2Fub25pY2FsTmFOID0gKHZhbHVlOiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGZsb2F0NjRTY3JhdGNoVmlldy5zZXRGbG9hdDY0KDAsIHZhbHVlKVxuICByZXR1cm4gZmxvYXQ2NFNjcmF0Y2hWaWV3LmdldEJpZ1VpbnQ2NCgwKSAhPSBDQU5PTklDQUxfTkFOX0JJVFNcbn1cblxuY29uc3QgZmxvYXQ2NFNjcmF0Y2hWaWV3ID0gbmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcig4KSlcbmZsb2F0NjRTY3JhdGNoVmlldy5zZXRGbG9hdDY0KDAsIE5hTilcbmNvbnN0IENBTk9OSUNBTF9OQU5fQklUUyA9IGZsb2F0NjRTY3JhdGNoVmlldy5nZXRCaWdVaW50NjQoMClcblxuZXhwb3J0IGNvbnN0IHVuZXZhbEJ1ZmZlcjogVW5ldmFsPEJ1ZmZlcj4gPSAoYnVmZmVyLCBzdGF0ZSwgbmFtZSkgPT4ge1xuICBjb25zdCBhcnJheUJ1ZmZlciA9IGJ1ZmZlci5idWZmZXIgYXMgQXJyYXlCdWZmZXJcbiAgaWYgKFxuICAgICFidWZmZXIuYnl0ZU9mZnNldCAmJlxuICAgICFidWZmZXIuYnl0ZUxlbmd0aCAmJlxuICAgICFhcnJheUJ1ZmZlci5yZXNpemFibGUgJiZcbiAgICAhYXJyYXlCdWZmZXIuZGV0YWNoZWRcbiAgKSB7XG4gICAgcmV0dXJuIGAke25hbWV9LmFsbG9jKDApYFxuICB9XG5cbiAgcmV0dXJuIGAke25hbWV9LmZyb20oJHt1bmV2YWxCdWZmZXJXcmFwcGVyQXJncyhidWZmZXIsIHN0YXRlKX0pYFxufVxuXG5jb25zdCB1bmV2YWxCdWZmZXJXcmFwcGVyQXJncyA9IChcbiAge1xuICAgIGJ5dGVPZmZzZXQsXG4gICAgYnl0ZUxlbmd0aCxcbiAgICBidWZmZXIsXG4gICAgQllURVNfUEVSX0VMRU1FTlQsXG4gIH06IHtcbiAgICBieXRlT2Zmc2V0OiBudW1iZXJcbiAgICBieXRlTGVuZ3RoOiBudW1iZXJcbiAgICBidWZmZXI6IEFycmF5QnVmZmVyTGlrZVxuICAgIEJZVEVTX1BFUl9FTEVNRU5UOiBudW1iZXJcbiAgfSxcbiAgc3RhdGU6IFN0YXRlLFxuKTogc3RyaW5nID0+XG4gIGAke3VuZXZhbEludGVybmFsKGJ1ZmZlciwgc3RhdGUpIX0ke1xuICAgIGJ5dGVPZmZzZXQgKyBieXRlTGVuZ3RoID09IGJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICA/IGJ5dGVPZmZzZXQgPiAwXG4gICAgICAgID8gYCwke2J5dGVPZmZzZXR9YFxuICAgICAgICA6IGBgXG4gICAgICA6IGAsJHsrYnl0ZU9mZnNldH0sJHtieXRlTGVuZ3RoIC8gQllURVNfUEVSX0VMRU1FTlR9YFxuICB9YFxuXG5leHBvcnQgY29uc3QgdW5ldmFsQXJyYXlCdWZmZXI6IFVuZXZhbDxBcnJheUJ1ZmZlcj4gPSAoXG4gIGFycmF5QnVmZmVyLFxuICBzdGF0ZSxcbiAgbmFtZSxcbikgPT4ge1xuICBjb25zdCB7IGRldGFjaGVkLCByZXNpemFibGUsIGJ5dGVMZW5ndGgsIG1heEJ5dGVMZW5ndGggfSA9IGFycmF5QnVmZmVyXG5cbiAgaWYgKGRldGFjaGVkKSB7XG4gICAgc3RhdGUuX211dGF0aW9ucy5wdXNoKHtcbiAgICAgIF9zb3VyY2U6IGAke2JpbmRpbmdOYW1lKGFycmF5QnVmZmVyLCBzdGF0ZSl9LnRyYW5zZmVyKClgLFxuICAgIH0pXG4gIH1cblxuICBsZXQgdWludDhBcnJheTogVWludDhBcnJheVxuICBsZXQgZmlyc3ROb25aZXJvSW5kZXg6IG51bWJlclxuICBpZiAoXG4gICAgYnl0ZUxlbmd0aCA9PSAwIHx8XG4gICAgKGZpcnN0Tm9uWmVyb0luZGV4ID0gKHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShcbiAgICAgIGFycmF5QnVmZmVyLnNsaWNlKCksXG4gICAgKSkuZmluZEluZGV4KHZhbHVlID0+IHZhbHVlICE9IDApKSA9PSAtMVxuICApIHtcbiAgICByZXR1cm4gbmV3SW5zdGFuY2UoXG4gICAgICBuYW1lLFxuICAgICAgcmVzaXphYmxlXG4gICAgICAgID8gYCR7K2J5dGVMZW5ndGh9LHttYXhCeXRlTGVuZ3RoOiR7K21heEJ5dGVMZW5ndGh9fWBcbiAgICAgICAgOiBieXRlTGVuZ3RoID4gMFxuICAgICAgICAgID8gYnl0ZUxlbmd0aFxuICAgICAgICAgIDogYGAsXG4gICAgKVxuICB9XG5cbiAgaWYgKCFyZXNpemFibGUpIHtcbiAgICByZXR1cm4gYCR7dW5ldmFsSW50ZXJuYWwodWludDhBcnJheSwgc3RhdGUpIX0uYnVmZmVyYFxuICB9XG5cbiAgY29uc3QgbGFzdE5vblplcm9JbmRleCA9IHVpbnQ4QXJyYXkuZmluZExhc3RJbmRleCh2YWx1ZSA9PiB2YWx1ZSAhPSAwKVxuICBzdGF0ZS5fbXV0YXRpb25zLnB1c2goe1xuICAgIF9zb3VyY2U6IGBuZXcgVWludDhBcnJheSgke2JpbmRpbmdOYW1lKGFycmF5QnVmZmVyLCBzdGF0ZSl9KS5zZXQoWyR7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICB1aW50OEFycmF5LnNsaWNlKGZpcnN0Tm9uWmVyb0luZGV4LCBsYXN0Tm9uWmVyb0luZGV4ICsgMSlcbiAgICB9XSR7Zmlyc3ROb25aZXJvSW5kZXggPiAwID8gYCwke2ZpcnN0Tm9uWmVyb0luZGV4fWAgOiBgYH0pYCxcbiAgfSlcbiAgcmV0dXJuIG5ld0luc3RhbmNlKG5hbWUsIGAkeytieXRlTGVuZ3RofSx7bWF4Qnl0ZUxlbmd0aDokeyttYXhCeXRlTGVuZ3RofX1gKVxufVxuIiwiLy8gRm9yIHNtYWxsZXIgYnVuZGxlIHNpemUuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1udW1iZXItcHJvcGVydGllcyAqL1xuXG5pbXBvcnQgeyBiaW5kaW5nTmFtZSwgbmV3SW5zdGFuY2UgfSBmcm9tICcuL2NvbW1vbi50cydcbmltcG9ydCB7IHVuZXZhbEludGVybmFsIH0gZnJvbSAnLi9pbmRleC50cydcbmltcG9ydCB0eXBlIHsgU3RhdGUsIFVuZXZhbCB9IGZyb20gJy4vdHlwZXMudHMnXG5cbmV4cG9ydCBjb25zdCB1bmV2YWxBcnJheTogVW5ldmFsPHVua25vd25bXT4gPSAoYXJyYXksIHN0YXRlKSA9PiB7XG4gIC8vIEdldCBvd24gbnVtZXJpYyBpbmRleCBrZXlzIHRvIGNoZWNrIHNwYXJzaXR5IGluIGBPKGtleXMpYCB0aW1lIGluc3RlYWQgb2ZcbiAgLy8gYE8obGVuZ3RoKWAgdGltZSwgd2hpY2ggY291bGQgcmVzdWx0IGluIERvUy5cbiAgY29uc3QgaW5kaWNlcyA9IE9iamVjdC5rZXlzKGFycmF5KS5mbGF0TWFwKGtleSA9PiAoaXNOYU4oK2tleSkgPyBbXSA6ICtrZXkpKVxuXG4gIGNvbnN0IGhhc1RyYWlsaW5nRW1wdHlTbG90cyA9ICEoYXJyYXkubGVuZ3RoIC0gMSBpbiBhcnJheSlcbiAgY29uc3QgZW1wdHlBcnJheVNvdXJjZSA9IGhhc1RyYWlsaW5nRW1wdHlTbG90c1xuICAgID8gLy8gV2UnbGwgaGF2ZSB0byBzZXQgdGhlIGxlbmd0aCBleHBsaWNpdGx5IGlmIHRoZXJlJ3Mgbm8gZW50cnkgdGhhdFxuICAgICAgLy8gaW1wbGljaXRseSBncm93cyB0aGUgYXJyYXkgdG8gaXRzIGxlbmd0aC5cbiAgICAgIGBBcnJheSgke2FycmF5Lmxlbmd0aH0pYFxuICAgIDogYFtdYFxuXG4gIC8vIEEgY29tbWEgZm9yIGVhY2ggc3BhcnNlIHNsb3QgaW4gYSBkZW5zZSBhcnJheS5cbiAgY29uc3QgZGVuc2VPdmVyaGVhZCA9IGFycmF5Lmxlbmd0aCAtIGluZGljZXMubGVuZ3RoXG4gIC8vIEEgYCR7aW5kZXh9OiAsYCBmb3IgZWFjaCBub24tc3BhcnNlIHNsb3QgaW4gYSBzcGFyc2UgYXJyYXkuXG4gIGNvbnN0IG1heEluZGV4TGVuZ3RoID0gYCR7YXJyYXkubGVuZ3RofWAubGVuZ3RoXG4gIGNvbnN0IGVudHJ5T3ZlcmhlYWQgPSAobWF4SW5kZXhMZW5ndGggKyAyKSAqIGluZGljZXMubGVuZ3RoXG4gIGNvbnN0IHNwYXJzZU92ZXJoZWFkID1cbiAgICB1bmV2YWxPYmplY3RBc3NpZ24oZW1wdHlBcnJheVNvdXJjZSkubGVuZ3RoICsgZW50cnlPdmVyaGVhZFxuICBpZiAoc3BhcnNlT3ZlcmhlYWQgPCBkZW5zZU92ZXJoZWFkKSB7XG4gICAgLy8gVGhlIGFycmF5IGlzIHNwYXJzZSBlbm91Z2ggdGhhdCB0aGUgYE9iamVjdC5hc3NpZ25gIHJlcHJlc2VudGF0aW9uIGlzXG4gICAgLy8gbGlrZWx5IG1vcmUgY29tcGFjdC5cbiAgICBjb25zdCBlbnRyaWVzU291cmNlID0gaW5kaWNlc1xuICAgICAgLmZsYXRNYXAoaW5kZXggPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gYXJyYXlbaW5kZXhdXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHVuZXZhbEludGVybmFsKGl0ZW0sIHN0YXRlKVxuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIGAke2luZGV4fToke3Jlc3VsdH1gXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgaXRlbU5hbWUgPSBiaW5kaW5nTmFtZShpdGVtIGFzIG9iamVjdCwgc3RhdGUpXG4gICAgICAgICAgc3RhdGUuX211dGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIF9zb3VyY2U6IGAke2JpbmRpbmdOYW1lKGFycmF5LCBzdGF0ZSl9WyR7aW5kZXh9XT0ke2l0ZW1OYW1lfWAsXG4gICAgICAgICAgICBfZXZhbHVhdGVzVG86IGl0ZW1OYW1lLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICB9KVxuICAgICAgLmpvaW4oKVxuICAgIHJldHVybiBlbnRyaWVzU291cmNlXG4gICAgICA/IHVuZXZhbE9iamVjdEFzc2lnbihgJHtlbXB0eUFycmF5U291cmNlfSx7JHtlbnRyaWVzU291cmNlfX1gKVxuICAgICAgOiBlbXB0eUFycmF5U291cmNlXG4gIH1cblxuICBsZXQgdHJhaWxpbmdFbXB0eVNsb3Q6IGJvb2xlYW4gfCB1bmRlZmluZWRcbiAgY29uc3QgaXRlbVNvdXJjZXMgPSBBcnJheS5mcm9tKGFycmF5LCAoaXRlbSwgaW5kZXgpID0+IHtcbiAgICBpZiAoIShpbmRleCBpbiBhcnJheSkpIHtcbiAgICAgIHRyYWlsaW5nRW1wdHlTbG90ID0gdHJ1ZVxuICAgICAgcmV0dXJuIGBgXG4gICAgfVxuXG4gICAgdHJhaWxpbmdFbXB0eVNsb3QgPSBmYWxzZVxuICAgIGNvbnN0IHJlc3VsdCA9IHVuZXZhbEludGVybmFsKGl0ZW0sIHN0YXRlKVxuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICBjb25zdCBpdGVtTmFtZSA9IGJpbmRpbmdOYW1lKGl0ZW0gYXMgb2JqZWN0LCBzdGF0ZSlcbiAgICAgIHN0YXRlLl9tdXRhdGlvbnMucHVzaCh7XG4gICAgICAgIF9zb3VyY2U6IGAke2JpbmRpbmdOYW1lKGFycmF5LCBzdGF0ZSl9WyR7aW5kZXh9XT0ke2l0ZW1OYW1lfWAsXG4gICAgICAgIC8vIEFuIGFzc2lnbm1lbnQgZXZhbHVhdGVzIHRvIHRoZSByaWdodC1oYW5kIHNpZGUuXG4gICAgICAgIF9ldmFsdWF0ZXNUbzogaXRlbU5hbWUsXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPbWl0dGVkIHZhbHVlLiBSZW5kZXIgaXQgYXMgYW4gZW1wdHkgc2xvdC5cbiAgICAgIHRyYWlsaW5nRW1wdHlTbG90ID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gYGBcbiAgfSlcbiAgaWYgKHRyYWlsaW5nRW1wdHlTbG90KSB7XG4gICAgLy8gVGhlIGFycmF5IGhhcyBhIHRyYWlsaW5nIGVtcHR5IHNsb3QgKGVpdGhlciBzcGFyc2UgaW5wdXQgb3IgY3VzdG9tXG4gICAgLy8gb21pdHRlZCkuIFRoaXMgcmVxdWlyZXMgYW4gZXh0cmEgY29tbWEgYmVjYXVzZSBvdGhlcndpc2UgdGhlIGxhc3RcbiAgICAvLyBjb21tYSBpcyBpbnRlcnByZXRlZCBhcyBhIG5vLW9wIHRyYWlsaW5nIGNvbW1hLlxuICAgIGl0ZW1Tb3VyY2VzLnB1c2goYGApXG4gIH1cbiAgcmV0dXJuIGBbJHtpdGVtU291cmNlcy5qb2luKCl9XWBcbn1cblxuY29uc3QgdW5ldmFsT2JqZWN0QXNzaWduID0gKGFyZ3M6IHN0cmluZykgPT4gYE9iamVjdC5hc3NpZ24oJHthcmdzfSlgXG5cbmV4cG9ydCBjb25zdCB1bmV2YWxTZXQ6IFVuZXZhbDxTZXQ8dW5rbm93bj4+ID0gKHNldCwgc3RhdGUsIG5hbWUpID0+IHtcbiAgbGV0IGZvdW5kQ2lyY3VsYXI6IHRydWUgfCB1bmRlZmluZWRcbiAgY29uc3QgYXJnU291cmNlczogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNldCkge1xuICAgIC8vIElmIHdlJ3ZlIHNlZW4gYSBjaXJjdWxhciB2YWx1ZSwgdGhlbiBhbGwgcmVtYWluaW5nIHZhbHVlcyB3aWxsIGVuZFxuICAgIC8vIHVwIGluIG11dGF0aW9ucyBzbyB3ZSB1bmV2YWwgdGhlbSB3aXRob3V0IHRoZSBjdXJyZW50IGJpbmRpbmcgdG8gbm90XG4gICAgLy8gYWRkIHVubmVjZXNzYXJ5IGRlcGVuZGVuY2llcyB0byB0aGUgY3VycmVudCBiaW5kaW5nLlxuICAgIGxldCByZXN1bHQgPSAoZm91bmRDaXJjdWxhciA/IHVuZXZhbFdpdGhvdXRDdXJyZW50QmluZGluZyA6IHVuZXZhbEludGVybmFsKShcbiAgICAgIHZhbHVlLFxuICAgICAgc3RhdGUsXG4gICAgKVxuICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gU2tpcCBpZiBvbWl0dGVkLlxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgZm91bmRDaXJjdWxhciA9IHRydWVcbiAgICAgIHJlc3VsdCA9IGJpbmRpbmdOYW1lKHZhbHVlIGFzIG9iamVjdCwgc3RhdGUpXG4gICAgfVxuXG4gICAgaWYgKCFmb3VuZENpcmN1bGFyKSB7XG4gICAgICBhcmdTb3VyY2VzLnB1c2gocmVzdWx0KVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBBZnRlciBhbmQgaW5jbHVkaW5nIHRoZSBmaXJzdCBjaXJjdWxhciB2YWx1ZSwgd2UgYWRkIHNldCB2YWx1ZXNcbiAgICAvLyB2aWEgbXV0YXRpb24gdG8gcHJlc2VydmUgaXRlcmF0aW9uIG9yZGVyLlxuICAgIGNvbnN0IHZhbHVlTmFtZSA9IGJpbmRpbmdOYW1lKHNldCwgc3RhdGUpXG4gICAgc3RhdGUuX211dGF0aW9ucy5wdXNoKHtcbiAgICAgIF9zb3VyY2U6IGAke3ZhbHVlTmFtZX0uYWRkKCR7cmVzdWx0fSlgLFxuICAgICAgLy8gYFNldC5hZGRgIGFsd2F5cyByZXR1cm5zIGB0aGlzYC5cbiAgICAgIF9ldmFsdWF0ZXNUbzogdmFsdWVOYW1lLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBhcmdzU291cmNlID0gYXJnU291cmNlcy5qb2luKClcbiAgcmV0dXJuIG5ld0luc3RhbmNlKG5hbWUsIGFyZ3NTb3VyY2UgJiYgYFske2FyZ3NTb3VyY2V9XWApXG59XG5cbmV4cG9ydCBjb25zdCB1bmV2YWxNYXA6IFVuZXZhbDxNYXA8dW5rbm93biwgdW5rbm93bj4+ID0gKG1hcCwgc3RhdGUsIG5hbWUpID0+IHtcbiAgbGV0IGZvdW5kQ2lyY3VsYXJLZXk6IHRydWUgfCB1bmRlZmluZWRcbiAgY29uc3QgYXJnU291cmNlczogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBtYXApIHtcbiAgICAvLyBJZiB3ZSd2ZSBzZWVuIGEgY2lyY3VsYXIga2V5LCB0aGVuIGFsbCByZW1haW5pbmcgZW50cmllcyB3aWxsIGVuZFxuICAgIC8vIHVwIGluIG11dGF0aW9ucyBzbyB3ZSB1bmV2YWwgdGhlbSB3aXRob3V0IHRoZSBjdXJyZW50IGJpbmRpbmcgdG9cbiAgICAvLyBub3QgYWRkIHVubmVjZXNzYXJ5IGRlcGVuZGVuY2llcyB0byB0aGUgY3VycmVudCBiaW5kaW5nLlxuICAgIGNvbnN0IGtleVJlc3VsdCA9IChcbiAgICAgIGZvdW5kQ2lyY3VsYXJLZXkgPyB1bmV2YWxXaXRob3V0Q3VycmVudEJpbmRpbmcgOiB1bmV2YWxJbnRlcm5hbFxuICAgICkoa2V5LCBzdGF0ZSlcbiAgICBpZiAoa2V5UmVzdWx0ID09PSBudWxsKSB7XG4gICAgICBmb3VuZENpcmN1bGFyS2V5ID0gdHJ1ZVxuICAgIH1cbiAgICBjb25zdCB2YWx1ZVJlc3VsdCA9IChcbiAgICAgIGZvdW5kQ2lyY3VsYXJLZXkgPyB1bmV2YWxXaXRob3V0Q3VycmVudEJpbmRpbmcgOiB1bmV2YWxJbnRlcm5hbFxuICAgICkodmFsdWUsIHN0YXRlKVxuICAgIGlmIChrZXlSZXN1bHQgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZVJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBTa2lwIHRoZSBlbnRpcmUgZW50cnkgaWYga2V5IG9yIHZhbHVlIGlzIG9taXR0ZWQuXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGtleVNvdXJjZSA9IGtleVJlc3VsdCA/PyBiaW5kaW5nTmFtZShrZXkgYXMgb2JqZWN0LCBzdGF0ZSlcbiAgICBjb25zdCB2YWx1ZVNvdXJjZSA9IHZhbHVlUmVzdWx0ID8/IGJpbmRpbmdOYW1lKHZhbHVlIGFzIG9iamVjdCwgc3RhdGUpXG5cbiAgICBpZiAoXG4gICAgICAvLyBBZnRlciBhbmQgaW5jbHVkaW5nIHRoZSBmaXJzdCBjaXJjdWxhciBrZXksIHdlIGFkZCBlbnRyaWVzIHZpYVxuICAgICAgLy8gbXV0YXRpb24gYmVsb3cgdG8gcHJlc2VydmUgaXRlcmF0aW9uIG9yZGVyLlxuICAgICAgIWZvdW5kQ2lyY3VsYXJLZXkgJiZcbiAgICAgIHZhbHVlUmVzdWx0ICE9IG51bGxcbiAgICApIHtcbiAgICAgIGFyZ1NvdXJjZXMucHVzaChgWyR7a2V5U291cmNlfSwke3ZhbHVlU291cmNlfV1gKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZU5hbWUgPSBiaW5kaW5nTmFtZShtYXAsIHN0YXRlKVxuICAgIHN0YXRlLl9tdXRhdGlvbnMucHVzaCh7XG4gICAgICBfc291cmNlOiBgJHt2YWx1ZU5hbWV9LnNldCgke2tleVNvdXJjZX0sJHt2YWx1ZVNvdXJjZX0pYCxcbiAgICAgIC8vIGBNYXAuc2V0YCBhbHdheXMgcmV0dXJucyBgdGhpc2AuXG4gICAgICBfZXZhbHVhdGVzVG86IHZhbHVlTmFtZSxcbiAgICB9KVxuICAgIGlmICghZm91bmRDaXJjdWxhcktleSkge1xuICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIGNpcmN1bGFyLCBidXQgd2UndmUgbm90IHNlZW4gYSBjaXJjdWxhciBrZXksIHRoZW5cbiAgICAgIC8vIGluY2x1ZGUgdGhlIGtleSBpbiB0aGUgY29uc3RydWN0b3IsIGJ1dCBzZXQgdGhlIHZhbHVlIGxhdGVyIHZpYVxuICAgICAgLy8gbXV0YXRpb24uXG4gICAgICBhcmdTb3VyY2VzLnB1c2goYFske2tleVNvdXJjZX1dYClcbiAgICB9XG4gIH1cblxuICBjb25zdCBhcmdzU291cmNlID0gYXJnU291cmNlcy5qb2luKClcbiAgcmV0dXJuIG5ld0luc3RhbmNlKG5hbWUsIGFyZ3NTb3VyY2UgJiYgYFske2FyZ3NTb3VyY2V9XWApXG59XG5cbmNvbnN0IHVuZXZhbFdpdGhvdXRDdXJyZW50QmluZGluZyA9IChcbiAgdmFsdWU6IHVua25vd24sXG4gIHN0YXRlOiBTdGF0ZSxcbik6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBwcmV2aW91c0JpbmRpbmcgPSBzdGF0ZS5fY3VycmVudEJpbmRpbmdcbiAgc3RhdGUuX2N1cnJlbnRCaW5kaW5nID0gdW5kZWZpbmVkXG4gIGNvbnN0IHJlc3VsdCA9IHVuZXZhbEludGVybmFsKHZhbHVlLCBzdGF0ZSlcbiAgc3RhdGUuX2N1cnJlbnRCaW5kaW5nID0gcHJldmlvdXNCaW5kaW5nXG4gIHJldHVybiByZXN1bHRcbn1cbiIsIi8vIEZvciBzbWFsbGVyIGJ1bmRsZSBzaXplLlxuLyogZXNsaW50LWRpc2FibGUgZXFlcWVxICovXG5cbmltcG9ydCB7IG5ld0luc3RhbmNlLCBQUk9QRVJUWV9SRUdfRVhQIH0gZnJvbSAnLi9jb21tb24udHMnXG5pbXBvcnQgeyB1bmV2YWxJbnRlcm5hbCB9IGZyb20gJy4vaW5kZXgudHMnXG5pbXBvcnQgdHlwZSB7IFN0YXRlLCBVbmV2YWwgfSBmcm9tICcuL3R5cGVzLnRzJ1xuXG5leHBvcnQgY29uc3QgdW5ldmFsQm9vbGVhbiA9ICh2YWx1ZTogYm9vbGVhbik6IHN0cmluZyA9PlxuICAvLyBDb252ZXJ0IGBmYWxzZWAgdG8gYCExYCBhbmQgYHRydWVgIHRvIGAhMGBcbiAgYCEkeyshdmFsdWV9YFxuXG5leHBvcnQgY29uc3QgdW5ldmFsTnVtYmVyID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBpZiAodmFsdWUgPT0gSW5maW5pdHkpIHtcbiAgICByZXR1cm4gYDEvMGBcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtSW5maW5pdHkpIHtcbiAgICByZXR1cm4gYC0xLzBgXG4gIH1cblxuICBjb25zdCBzb3VyY2UgPSBgJHt2YWx1ZX1gXG4gIGlmIChPYmplY3QuaXModmFsdWUsIC0wKSkge1xuICAgIC8vIENvbnZlcnRpbmcgLTAgdG8gYSBzdHJpbmcgYmVjb21lcyBgMGAgc28gd2UgaGF2ZSB0byBzcGVjaWFsLWNhc2UgaXQuXG4gICAgcmV0dXJuIGAtJHtzb3VyY2V9YFxuICB9XG5cbiAgLy8gQ29udmVydCBgMC4xMjNgIHRvIGAuMTIzYCBhbmQgIGAtMC4xMjNgIHRvIGAtLjEyM2AuXG4gIGlmIChzb3VyY2Uuc3RhcnRzV2l0aChgMC5gKSkge1xuICAgIHJldHVybiBzb3VyY2Uuc2xpY2UoMSlcbiAgfSBlbHNlIGlmIChzb3VyY2Uuc3RhcnRzV2l0aChgLTAuYCkpIHtcbiAgICByZXR1cm4gYC0ke3NvdXJjZS5zbGljZSgyKX1gXG4gIH1cblxuICByZXR1cm4gc291cmNlXG59XG5cbmV4cG9ydCBjb25zdCB1bmV2YWxCaWdpbnQgPSAodmFsdWU6IGJpZ2ludCk6IHN0cmluZyA9PiBgJHt2YWx1ZX1uYFxuXG4vLyBgY2hhckNvZGVBdGAgaXMgbW9yZSBwZXJmb3JtYW50IGZvciBvdXIgdXNlLWNhc2UgYmVjYXVzZSB3ZSdyZSBkZWFsaW5nIHdpdGhcbi8vIHN0cmluZ3Mga25vd24gdG8gYmUgc2luZ2xlIGNvZGUgdW5pdHMuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1jb2RlLXBvaW50ICovXG5leHBvcnQgY29uc3QgdW5ldmFsTGl0ZXJhbCA9IChcbiAgdmFsdWU6IHN0cmluZyxcbiAgY29kZVVuaXRFc2NhcGVzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pixcbik6IHN0cmluZyA9PiB7XG4gIGxldCBzb3VyY2UgPSBgYFxuXG4gIGxldCBsYXN0SW5kZXggPSAwXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBjb2RlVW5pdCA9IHZhbHVlW2ldIVxuICAgIGNvbnN0IGVzY2FwZWQgPSBjb2RlVW5pdEVzY2FwZXNbY29kZVVuaXRdXG4gICAgaWYgKGVzY2FwZWQpIHtcbiAgICAgIHNvdXJjZSArPSB2YWx1ZS5zbGljZShsYXN0SW5kZXgsIGkpICsgZXNjYXBlZFxuICAgICAgbGFzdEluZGV4ID0gaSArIDFcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgY29kZSA9IGNvZGVVbml0LmNoYXJDb2RlQXQoMClcblxuICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi0xNiNVK0Q4MDBfdG9fVStERkZGXyhzdXJyb2dhdGVzKVxuICAgIGxldCBpc1VucGFpcmVkU3Vycm9nYXRlOiBib29sZWFuIHwgdW5kZWZpbmVkXG4gICAgY29uc3QgaXNMb3dTdXJyb2dhdGUgPSBjb2RlID49IDB4ZDgwMCAmJiBjb2RlIDw9IDB4ZGJmZlxuICAgIGlmIChpc0xvd1N1cnJvZ2F0ZSkge1xuICAgICAgY29uc3QgbmV4dCA9IHZhbHVlLmNoYXJDb2RlQXQoaSArIDEpXG4gICAgICBjb25zdCBpc0hpZ2hTdXJyb2dhdGUgPSBuZXh0ID49IDB4ZGMwMCAmJiBuZXh0IDw9IDB4ZGZmZlxuICAgICAgaWYgKGlzSGlnaFN1cnJvZ2F0ZSkge1xuICAgICAgICBpKytcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzVW5wYWlyZWRTdXJyb2dhdGUgPSB0cnVlXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlzSGlnaFN1cnJvZ2F0ZSA9IGNvZGUgPj0gMHhkYzAwICYmIGNvZGUgPD0gMHhkZmZmXG4gICAgICAvLyBJZiB0aGlzIGlzIGEgaGlnaCBzdXJyb2dhdGUsIHRoZW4gaXQncyB1bnBhaXJlZC4gSWYgaXQgd2VyZSBwYWlyZWQsXG4gICAgICAvLyB0aGVuIHdlIHdvdWxkIGhhdmUgc2tpcHBlZCBpdCBpbiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uIG9mIHRoZSBsb29wLlxuICAgICAgaXNVbnBhaXJlZFN1cnJvZ2F0ZSA9IGlzSGlnaFN1cnJvZ2F0ZVxuICAgIH1cblxuICAgIGlmIChpc1VucGFpcmVkU3Vycm9nYXRlKSB7XG4gICAgICAvLyBFc2NhcGUgdW5wYWlyZWQgc3Vycm9nYXRlcyBpbiB0aGUgc291cmNlLlxuICAgICAgc291cmNlICs9IGAke3ZhbHVlLnNsaWNlKGxhc3RJbmRleCwgaSl9XFxcXHUke2NvZGUudG9TdHJpbmcoMTYpfWBcbiAgICAgIGxhc3RJbmRleCA9IGkgKyAxXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIFByZXZlbnQgWFNTIGF0dGFjayB2aWEgY2xvc2luZyBhbiBpbmxpbmUgc2NyaXB0IHRhZy5cbiAgICBpZiAoXG4gICAgICBjb2RlVW5pdCA9PSBgL2AgJiZcbiAgICAgIGkgPiAwICYmXG4gICAgICB2YWx1ZVtpIC0gMV0gPT0gYDxgICYmXG4gICAgICB2YWx1ZS5zbGljZShpICsgMSwgaSArIDcpLnRvTG93ZXJDYXNlKCkgPT0gYHNjcmlwdGBcbiAgICApIHtcbiAgICAgIHNvdXJjZSArPSBgJHt2YWx1ZS5zbGljZShsYXN0SW5kZXgsIGkpfVxcXFx1MDAyZmBcbiAgICAgIGxhc3RJbmRleCA9IGkgKyAxXG4gICAgfVxuICB9XG5cbiAgc291cmNlICs9IHZhbHVlLnNsaWNlKGxhc3RJbmRleClcbiAgcmV0dXJuIHNvdXJjZVxufVxuLyogZXNsaW50LWVuYWJsZSB1bmljb3JuL3ByZWZlci1jb2RlLXBvaW50ICovXG5cbi8qKlxuICogQ29kZSB1bml0IGVzY2FwZXMgZm9yIGNvZGUgdW5pdHMgdGhhdCBhcmUgbm90IHNhZmUgdG8gaW5jbHVkZSBpbiBKUyBzb3VyY2VcbiAqIGNvZGUgZm9yIGEgbGl0ZXJhbCAobGlrZSBhIGBzdHJpbmdgIG9yIGBSZWdFeHBgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFVOU0FGRV9DT0RFX1VOSVRfRVNDQVBFUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPSB7XG4gICdcXDAnOiBgXFxcXDBgLFxuICAnXFxuJzogYFxcXFxuYCxcbiAgJ1xccic6IGBcXFxccmAsXG4gICdcXHQnOiBgXFxcXHRgLFxuICAnXFxiJzogYFxcXFxiYCxcbiAgJ1xcZic6IGBcXFxcZmAsXG4gICdcXHYnOiBgXFxcXHZgLFxuICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvOTE2ODEzM1xuICAnXFx1MjAyOCc6IGBcXFxcdTIwMjhgLFxuICAnXFx1MjAyOSc6IGBcXFxcdTIwMjlgLFxufVxuXG5leHBvcnQgY29uc3QgU1RSSU5HX0NPREVfVU5JVF9FU0NBUEVTOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHtcbiAgJ1wiJzogYFxcXFxcImAsXG4gICdcXFxcJzogYFxcXFxcXFxcYCxcbiAgLi4uVU5TQUZFX0NPREVfVU5JVF9FU0NBUEVTLFxufVxuXG5leHBvcnQgY29uc3QgdW5ldmFsU3ltYm9sID0gKHZhbHVlOiBzeW1ib2wsIHN0YXRlOiBTdGF0ZSk6IHN0cmluZyA9PiB7XG4gIGxldCBrZXkgPSBXRUxMX0tOT1dOX1NZTUJPTF9UT19LRVkuZ2V0KHZhbHVlKVxuICBpZiAoa2V5KSB7XG4gICAgcmV0dXJuIGBTeW1ib2wuJHtrZXl9YFxuICB9XG5cbiAga2V5ID0gU3ltYm9sLmtleUZvcih2YWx1ZSlcbiAgaWYgKGtleSkge1xuICAgIHJldHVybiBgU3ltYm9sLmZvcigke3VuZXZhbEludGVybmFsKGtleSwgc3RhdGUpfSlgXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKGBVbnN1cHBvcnRlZCBzeW1ib2xgKVxufVxuXG5jb25zdCBXRUxMX0tOT1dOX1NZTUJPTF9UT19LRVk6IFJlYWRvbmx5TWFwPHN5bWJvbCwgc3RyaW5nPiA9IG5ldyBNYXAoXG4gIFJlZmxlY3Qub3duS2V5cyhTeW1ib2wpLmZsYXRNYXAoa2V5ID0+IHtcbiAgICAvLyBUaGlzIGRvZXNuJ3QgaGFwcGVuIGluIHByYWN0aWNlLCBidXQgYmVzdCB0byBiZSBzYWZlIGlmIG9uZSBkYXkgYVxuICAgIC8vIG5vbi1zdHJpbmcga2V5IGFzIGFkZGVkIHRvIGBTeW1ib2xgLlxuICAgIGlmICh0eXBlb2Yga2V5ICE9IGBzdHJpbmdgKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gICAgaWYgKCFQUk9QRVJUWV9SRUdfRVhQLnRlc3Qoa2V5KSkge1xuICAgICAgLy8gRGVmZW5kIGFnYWluc3QgcG9sbHV0aW9uIGF0dGFja3MuXG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBTeW1ib2xba2V5IGFzIGtleW9mIHR5cGVvZiBTeW1ib2xdXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBgc3ltYm9sYCA/IFtbdmFsdWUsIGtleV1dIDogW11cbiAgfSksXG4pXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8td3JhcHBlci1vYmplY3QtdHlwZXNcbmV4cG9ydCBjb25zdCB1bmV2YWxQcmltaXRpdmVXcmFwcGVyOiBVbmV2YWw8Qm9vbGVhbiB8IE51bWJlciB8IFN0cmluZz4gPSAoXG4gIHZhbHVlLFxuICBzdGF0ZSxcbikgPT4gYE9iamVjdCgke3VuZXZhbEludGVybmFsKHZhbHVlLnZhbHVlT2YoKSwgc3RhdGUpfSlgXG5cbmV4cG9ydCBjb25zdCB1bmV2YWxSZWdFeHA6IFVuZXZhbDxSZWdFeHA+ID0gKFxuICB7IHNvdXJjZSwgZmxhZ3MgfSxcbiAgc3RhdGUsXG4gIG5hbWUsXG4pID0+IHtcbiAgY29uc3QgZXNjYXBlZFNvdXJjZSA9IHVuZXZhbExpdGVyYWwoc291cmNlLCBVTlNBRkVfQ09ERV9VTklUX0VTQ0FQRVMpXG4gIHJldHVybiAoXG4gICAgLy8gYFJlZ0V4cC5wcm90b3R5cGUuc291cmNlYCB3aWxsIHJldHVybiB0aGUgZXNjYXBlZCB2ZXJzaW9uIG9mIHRoZVxuICAgIC8vIHNvdXJjZSBiZXR3ZWVuIHRoZSBmb3J3YXJkIHNsYXNoZXMgZm9yIGEgbGl0ZXJhbC4gV2UgY2FuIHVzZSBpdFxuICAgIC8vIGRpcmVjdGx5IGluIHRoZSBgUmVnRXhwYCBsaXRlcmFsLCBidXQgb25seSBpZiB0aGUgYHNvdXJjZWAgaXMgc2FmZVxuICAgIC8vIGZvciBKUyAoZS5nLiBubyB1bmVzY2FwZWQgYFxcMGAgaW5saW5lKS4gV2UgY2FuJ3Qgc2ltcGx5IHVzZVxuICAgIC8vIGBlc2NhcGVkU291cmNlYCBoZXJlIGJlY2F1c2UgdGhhdCBkb2Vzbid0IHJvdW5kdHJpcC5cbiAgICAvLyBpLmUuIGAvXFwwLy5zb3VyY2VgIGlzIGRvZXMgbm90IGVxdWFsIGBuZXcgUmVnRXhwKCdcXDAnKS5zb3VyY2VgLlxuICAgIC8vIFRoZSBmb3JtZXIgaXMgYCdcXFxcMCdgIHdoaWxlIHRoZSBsYXRlciBpcyBgJ1xcMCdgLlxuICAgIHNvdXJjZSA9PSBlc2NhcGVkU291cmNlICYmXG4gICAgICAvLyBUaGlzIHByb3RlY3RzIGFnYWluc3QgUkNFIGZyb20gbW9ua2V5LXBhdGNoZWQgYFJlZ0V4cGAgb2JqZWN0cy5cbiAgICAgIC9eW2Etel0qJC91LnRlc3QoZmxhZ3MpXG4gICAgICA/IGAvJHtzb3VyY2V9LyR7ZmxhZ3N9YFxuICAgICAgOiBuZXdJbnN0YW5jZShcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGAke3VuZXZhbEludGVybmFsKHNvdXJjZSwgc3RhdGUpfSR7XG4gICAgICAgICAgICBmbGFncyAmJiBgLCR7dW5ldmFsSW50ZXJuYWwoZmxhZ3MsIHN0YXRlKX1gXG4gICAgICAgICAgfWAsXG4gICAgICAgIClcbiAgKVxufVxuIiwiLy8gRm9yIHNtYWxsZXIgYnVuZGxlIHNpemUuXG4vKiBlc2xpbnQtZGlzYWJsZSBlcWVxZXEgKi9cblxuaW1wb3J0IHsgbmV3SW5zdGFuY2UgfSBmcm9tICcuL2NvbW1vbi50cydcbmltcG9ydCB7IHVuZXZhbEludGVybmFsIH0gZnJvbSAnLi9pbmRleC50cydcbmltcG9ydCB0eXBlIHsgVW5ldmFsIH0gZnJvbSAnLi90eXBlcy50cydcblxuZXhwb3J0IGNvbnN0IHVuZXZhbERhdGU6IFVuZXZhbDxEYXRlPiA9IChkYXRlLCBzdGF0ZSwgbmFtZSkgPT5cbiAgbmV3SW5zdGFuY2UobmFtZSwgdW5ldmFsSW50ZXJuYWwoK2RhdGUsIHN0YXRlKSlcblxuZXhwb3J0IGNvbnN0IHVuZXZhbFRlbXBvcmFsOiBVbmV2YWw8XG4gIHwgVGVtcG9yYWwuRHVyYXRpb25cbiAgfCBUZW1wb3JhbC5JbnN0YW50XG4gIHwgVGVtcG9yYWwuUGxhaW5EYXRlXG4gIHwgVGVtcG9yYWwuUGxhaW5EYXRlVGltZVxuICB8IFRlbXBvcmFsLlBsYWluTW9udGhEYXlcbiAgfCBUZW1wb3JhbC5QbGFpblRpbWVcbiAgfCBUZW1wb3JhbC5QbGFpblllYXJNb250aFxuICB8IFRlbXBvcmFsLlpvbmVkRGF0ZVRpbWVcbj4gPSAodGVtcG9yYWwsIHN0YXRlLCBuYW1lKSA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXN0cmluZy1zdGFydHMtZW5kcy13aXRoXG4gIGlmIChuYW1lWzBdICE9IGBaYCkge1xuICAgIHJldHVybiBgVGVtcG9yYWwuJHtuYW1lfS5mcm9tKCR7dW5ldmFsSW50ZXJuYWwoXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICBgJHt0ZW1wb3JhbH1gLFxuICAgICAgc3RhdGUsXG4gICAgKX0pYFxuICB9XG5cbiAgLy8gV2UgaGFuZGxlIGBab25lZERhdGVUaW1lYCBkaWZmZXJlbnRseSBmcm9tIHRoYXQgb3RoZXIgYFRlbXBvcmFsYFxuICAvLyBvYmplY3RzIGJlY2F1c2UgYFRlbXBvcmFsLlpvbmVkRGF0ZVRpbWUuZnJvbSh6b25lZERhdGVUaW1lLnRvU3RyaW5nKCkpYFxuICAvLyBkb2VzIG5vdCBhbHdheXMgcm91bmR0cmlwOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC10ZW1wb3JhbC9wdWxsLzMwMTQjaXNzdWVjb21tZW50LTM4NTYwODYyNTNcbiAgY29uc3Qgem9uZWREYXRlVGltZSA9IHRlbXBvcmFsIGFzIFRlbXBvcmFsLlpvbmVkRGF0ZVRpbWVcbiAgcmV0dXJuIGBuZXcgVGVtcG9yYWwuJHtuYW1lfSgke3VuZXZhbEludGVybmFsKFxuICAgIHpvbmVkRGF0ZVRpbWUuZXBvY2hOYW5vc2Vjb25kcyxcbiAgICBzdGF0ZSxcbiAgKX0sJHt1bmV2YWxJbnRlcm5hbCh6b25lZERhdGVUaW1lLnRpbWVab25lSWQsIHN0YXRlKX0pYFxufVxuIiwiLy8gRm9yIHNtYWxsZXIgYnVuZGxlIHNpemUuXG4vKiBlc2xpbnQtZGlzYWJsZSBlcWVxZXEgKi9cblxuZXhwb3J0IGNvbnN0IGdldFR5cGUgPSAoXG4gIHZhbHVlOiBvYmplY3QsXG4pOiBbXSB8IFtudW1iZXIsIHN0cmluZ10gfCBbdW5kZWZpbmVkLCBzdHJpbmddID0+IHtcbiAgLy8gYC5jb25zdHJ1Y3RvcmAgcmV0dXJucyBgdW5kZWZpbmVkYCBmb3Igb2JqZWN0cyB3aXRoIG51bGwgcHJvdG90eXBlLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICBjb25zdCBuYW1lID0gdmFsdWUuY29uc3RydWN0b3I/Lm5hbWVcbiAgcmV0dXJuIFsoVFlQRVMgYXMgUmVjb3JkPHN0cmluZywgbnVtYmVyPilbbmFtZV0sIG5hbWVdXG59XG5cbmV4cG9ydCBjb25zdCBUX1BSSU1JVElWRV9XUkFQUEVSID0gMFxuZXhwb3J0IGNvbnN0IFRfUkVHX0VYUCA9IDFcbmV4cG9ydCBjb25zdCBUX0FSUkFZID0gMlxuZXhwb3J0IGNvbnN0IFRfU0VUID0gM1xuZXhwb3J0IGNvbnN0IFRfTUFQID0gNFxuZXhwb3J0IGNvbnN0IFRfQVJSQVlfQlVGRkVSID0gNVxuZXhwb3J0IGNvbnN0IFRfVFlQRURfQVJSQVkgPSA2XG5leHBvcnQgY29uc3QgVF9CVUZGRVIgPSA3XG5leHBvcnQgY29uc3QgVF9EQVRFID0gOFxuZXhwb3J0IGNvbnN0IFRfVEVNUE9SQUwgPSA5XG5leHBvcnQgY29uc3QgVF9VUkwgPSAxMFxuXG5jb25zdCBUWVBFUyA9IHtcbiAgQm9vbGVhbjogVF9QUklNSVRJVkVfV1JBUFBFUixcbiAgTnVtYmVyOiBUX1BSSU1JVElWRV9XUkFQUEVSLFxuICBSZWdFeHA6IFRfUkVHX0VYUCxcbiAgU3RyaW5nOiBUX1BSSU1JVElWRV9XUkFQUEVSLFxuXG4gIEFycmF5OiBUX0FSUkFZLFxuICBTZXQ6IFRfU0VULFxuICBNYXA6IFRfTUFQLFxuXG4gIEFycmF5QnVmZmVyOiBUX0FSUkFZX0JVRkZFUixcbiAgSW50OEFycmF5OiBUX1RZUEVEX0FSUkFZLFxuICBVaW50OEFycmF5OiBUX1RZUEVEX0FSUkFZLFxuICBVaW50OENsYW1wZWRBcnJheTogVF9UWVBFRF9BUlJBWSxcbiAgSW50MTZBcnJheTogVF9UWVBFRF9BUlJBWSxcbiAgVWludDE2QXJyYXk6IFRfVFlQRURfQVJSQVksXG4gIEludDMyQXJyYXk6IFRfVFlQRURfQVJSQVksXG4gIFVpbnQzMkFycmF5OiBUX1RZUEVEX0FSUkFZLFxuICBGbG9hdDE2QXJyYXk6IFRfVFlQRURfQVJSQVksXG4gIEZsb2F0MzJBcnJheTogVF9UWVBFRF9BUlJBWSxcbiAgRmxvYXQ2NEFycmF5OiBUX1RZUEVEX0FSUkFZLFxuICBCaWdJbnQ2NEFycmF5OiBUX1RZUEVEX0FSUkFZLFxuICBCaWdVaW50NjRBcnJheTogVF9UWVBFRF9BUlJBWSxcbiAgQnVmZmVyOiBUX0JVRkZFUixcblxuICBEYXRlOiBUX0RBVEUsXG4gIER1cmF0aW9uOiBUX1RFTVBPUkFMLFxuICBJbnN0YW50OiBUX1RFTVBPUkFMLFxuICBQbGFpbkRhdGU6IFRfVEVNUE9SQUwsXG4gIFBsYWluRGF0ZVRpbWU6IFRfVEVNUE9SQUwsXG4gIFBsYWluTW9udGhEYXk6IFRfVEVNUE9SQUwsXG4gIFBsYWluVGltZTogVF9URU1QT1JBTCxcbiAgUGxhaW5ZZWFyTW9udGg6IFRfVEVNUE9SQUwsXG4gIFpvbmVkRGF0ZVRpbWU6IFRfVEVNUE9SQUwsXG5cbiAgVVJMOiBUX1VSTCxcbiAgVVJMU2VhcmNoUGFyYW1zOiBUX1VSTCxcbn0gYXMgY29uc3RcbiIsImltcG9ydCB7IG5ld0luc3RhbmNlIH0gZnJvbSAnLi9jb21tb24udHMnXG5pbXBvcnQgeyB1bmV2YWxJbnRlcm5hbCB9IGZyb20gJy4vaW5kZXgudHMnXG5pbXBvcnQgdHlwZSB7IFVuZXZhbCB9IGZyb20gJy4vdHlwZXMudHMnXG5cbmV4cG9ydCBjb25zdCB1bmV2YWxVUkw6IFVuZXZhbDxVUkwgfCBVUkxTZWFyY2hQYXJhbXM+ID0gKHVybCwgc3RhdGUsIG5hbWUpID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICBjb25zdCBzb3VyY2UgPSBgJHt1cmx9YFxuICByZXR1cm4gbmV3SW5zdGFuY2UobmFtZSwgc291cmNlICYmIHVuZXZhbEludGVybmFsKHNvdXJjZSwgc3RhdGUpKVxufVxuIiwiLy8gRm9yIHNtYWxsZXIgYnVuZGxlIHNpemUuXG4vKiBlc2xpbnQtZGlzYWJsZSBlcWVxZXEgKi9cblxuaW1wb3J0IHsgdW5ldmFsQXJyYXlCdWZmZXIsIHVuZXZhbEJ1ZmZlciwgdW5ldmFsVHlwZWRBcnJheSB9IGZyb20gJy4vYnVmZmVyLnRzJ1xuaW1wb3J0IHsgdW5ldmFsQXJyYXksIHVuZXZhbE1hcCwgdW5ldmFsU2V0IH0gZnJvbSAnLi9jb2xsZWN0aW9uLnRzJ1xuaW1wb3J0IHsgYmluZGluZ05hbWUsIFBST1BFUlRZX1JFR19FWFAgfSBmcm9tICcuL2NvbW1vbi50cydcbmltcG9ydCB7IHVuZXZhbEludGVybmFsIH0gZnJvbSAnLi9pbmRleC50cydcbmltcG9ydCB7IHVuZXZhbFByaW1pdGl2ZVdyYXBwZXIsIHVuZXZhbFJlZ0V4cCB9IGZyb20gJy4vcHJpbWl0aXZlLnRzJ1xuaW1wb3J0IHsgdW5ldmFsRGF0ZSwgdW5ldmFsVGVtcG9yYWwgfSBmcm9tICcuL3RlbXBvcmFsLnRzJ1xuaW1wb3J0IHsgZ2V0VHlwZSB9IGZyb20gJy4vdHlwZS50cydcbmltcG9ydCB0eXBlIHsgTXV0YXRpb24sIFN0YXRlLCBVbmV2YWwgfSBmcm9tICcuL3R5cGVzLnRzJ1xuaW1wb3J0IHsgdW5ldmFsVVJMIH0gZnJvbSAnLi91cmwudHMnXG5cbmV4cG9ydCBjb25zdCB1bmV2YWxPYmplY3QgPSAoXG4gIHZhbHVlOiBvYmplY3QsXG4gIHN0YXRlOiBTdGF0ZSxcbik6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoc3RhdGUuX2N1c3RvbVNvdXJjZXMuZ2V0KHZhbHVlKSA9PT0gbnVsbCkge1xuICAgIC8vIFRoZSB1c2VyIGRlY2lkZWQgdG8gb21pdCB0aGlzIHZhbHVlLlxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IGJpbmRpbmcgPSBzdGF0ZS5fYmluZGluZ3MuZ2V0KHZhbHVlKVxuICBpZiAoIWJpbmRpbmcpIHtcbiAgICAvLyBUaGlzIHZhbHVlIGhhcyBubyBiaW5kaW5nIHNvIHdlIGNhbiByZW5kZXIgaXRzIHNvdXJjZSBpbmxpbmUuXG4gICAgcmV0dXJuIHVuZXZhbE9iamVjdEludGVybmFsKHZhbHVlLCBzdGF0ZSlcbiAgfVxuXG4gIGlmIChzdGF0ZS5fY3VycmVudFBhcmVudHMuaGFzKHZhbHVlKSkge1xuICAgIC8vIFJldHVybiBudWxsIHRvIGluZGljYXRlIHRoYXQgdGhpcyB2YWx1ZSBpcyBjaXJjdWxhcmx5IHJlZmVyZW5jZWQgYW5kXG4gICAgLy8gc2hvdWxkIG5vdCBiZSByZW5kZXJlZCBoZXJlLiBJbnN0ZWFkLCB3ZSdsbCBhZGQgYSBtdXRhdGlvbiB0byBhdHRhY2ggdGhlXG4gICAgLy8gY2lyY3VsYXIgcmVmZXJlbmNlIGxhdGVyIChpbiB0aGUgY2FsbGVyKS5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gTm90ZSB0aGUgY3VycmVudCBiaW5kaW5nIGFzIGhhdmluZyBhIGRlcGVuZGVuY3kgKG9uIHRoZSBiaW5kaW5nIHdlJ3JlXG4gIC8vIHJlbmRlcmluZyBiZWxvdykuXG4gIGlmIChzdGF0ZS5fY3VycmVudEJpbmRpbmcpIHtcbiAgICBzdGF0ZS5fY3VycmVudEJpbmRpbmcuX2hhc0RlcGVuZGVuY3kgPSB0cnVlXG4gIH1cblxuICBpZiAoIWJpbmRpbmcuX3NvdXJjZSkge1xuICAgIGNvbnN0IHByZXZpb3VzQmluZGluZyA9IHN0YXRlLl9jdXJyZW50QmluZGluZ1xuXG4gICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSdyZSBlbmNvdW50ZXJpbmcgdGhpcyBiaW5kaW5nLCB0aGVuIHdlIG11c3RcbiAgICAvLyBjb21wdXRlIGFuZCBzZXQgaXRzIHNvdXJjZS5cbiAgICBzdGF0ZS5fY3VycmVudEJpbmRpbmcgPSBiaW5kaW5nXG4gICAgc3RhdGUuX2N1cnJlbnRQYXJlbnRzLmFkZCh2YWx1ZSlcbiAgICBiaW5kaW5nLl9zb3VyY2UgPSB1bmV2YWxPYmplY3RJbnRlcm5hbCh2YWx1ZSwgc3RhdGUpXG4gICAgc3RhdGUuX2N1cnJlbnRQYXJlbnRzLmRlbGV0ZSh2YWx1ZSlcbiAgICBzdGF0ZS5fY3VycmVudEJpbmRpbmcgPSBwcmV2aW91c0JpbmRpbmdcblxuICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIGFkZCB0aGUgYmluZGluZyB0byB0aGUgb3JkZXIgYWZ0ZXIgaXRzIHNvdXJjZSBpc1xuICAgIC8vIHJlbmRlcmVkIHNvIHRoYXQgaXQncyByZW5kZXJlZCBhZnRlciBpdHMgZGVwZW5kZW5jaWVzLlxuICAgIHN0YXRlLl9iaW5kaW5nT3JkZXIucHVzaChiaW5kaW5nKVxuICB9XG5cbiAgcmV0dXJuIGJpbmRpbmcuX25hbWVcbn1cblxuY29uc3QgdW5ldmFsT2JqZWN0SW50ZXJuYWwgPSAodmFsdWU6IG9iamVjdCwgc3RhdGU6IFN0YXRlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgY3VzdG9tU291cmNlID0gc3RhdGUuX2N1c3RvbVNvdXJjZXMuZ2V0KHZhbHVlKVxuICBpZiAodHlwZW9mIGN1c3RvbVNvdXJjZSA9PSBgc3RyaW5nYCkge1xuICAgIHJldHVybiBjdXN0b21Tb3VyY2VcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gYGZ1bmN0aW9uYCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFVuc3VwcG9ydGVkIGZ1bmN0aW9uYClcbiAgfVxuXG4gIGNvbnN0IFt0eXBlLCBuYW1lXSA9IGdldFR5cGUodmFsdWUpXG4gIHJldHVybiB1bmV2YWxzW3R5cGUhXT8uKHZhbHVlLCBzdGF0ZSwgbmFtZSEpID8/IHVuZXZhbE9iamVjdExpa2UodmFsdWUsIHN0YXRlKVxufVxuXG4vLyBUaGUgb3JkZXIgb2YgdGhpcyBhcnJheSBtdXN0IG1hdGNoIHRoZSBudW1lcmljIHZhbHVlcyBvZiBgVF8qYCB2YXJpYWJsZXMuXG5jb25zdCB1bmV2YWxzOiBVbmV2YWw8YW55PltdID0gW1xuICB1bmV2YWxQcmltaXRpdmVXcmFwcGVyLFxuICB1bmV2YWxSZWdFeHAsXG4gIHVuZXZhbEFycmF5LFxuICB1bmV2YWxTZXQsXG4gIHVuZXZhbE1hcCxcbiAgdW5ldmFsQXJyYXlCdWZmZXIsXG4gIHVuZXZhbFR5cGVkQXJyYXksXG4gIHVuZXZhbEJ1ZmZlcixcbiAgdW5ldmFsRGF0ZSxcbiAgdW5ldmFsVGVtcG9yYWwsXG4gIHVuZXZhbFVSTCxcbl1cblxuY29uc3QgdW5ldmFsT2JqZWN0TGlrZSA9IChvYmplY3Q6IG9iamVjdCwgc3RhdGU6IFN0YXRlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZW50cmllczogT2JqZWN0RW50cnlbXSA9IFtdXG5cbiAgY29uc3Qga2V5cyA9IFJlZmxlY3Qub3duS2V5cyhvYmplY3QpXG4gIGxldCBrZXlJbmRleDogbnVtYmVyXG4gIGZvciAoa2V5SW5kZXggPSAwOyBrZXlJbmRleCA8IGtleXMubGVuZ3RoOyBrZXlJbmRleCsrKSB7XG4gICAgY29uc3Qga2V5ID0ga2V5c1trZXlJbmRleF0hXG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBrZXkpIVxuICAgIGlmICghaXNSZWd1bGFyRGF0YURlc2NyaXB0b3IoZGVzY3JpcHRvcikpIHtcbiAgICAgIC8vIEFsbCBwcm9wZXJ0aWVzIGZyb20gdGhpcyBpbmRleCBvbndhcmQgd2lsbCBiZSByZW5kZXJlZCB2aWFcbiAgICAgIC8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgdG8gcHJlc2VydmUgcHJvcGVydHkgb3JkZXIuXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gZGVzY3JpcHRvci52YWx1ZSBhcyB1bmtub3duXG5cbiAgICBpZiAodHlwZW9mIGtleSA9PSBgc3ltYm9sYCAmJiBzdGF0ZS5fY3VzdG9tU291cmNlcy5nZXQoa2V5KSA9PT0gbnVsbCkge1xuICAgICAgLy8gU2tpcCBwcm9wZXJ0aWVzIHdpdGggb21pdHRlZCBzeW1ib2wga2V5cy5cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVSZXN1bHQgPSB1bmV2YWxJbnRlcm5hbCh2YWx1ZSwgc3RhdGUpXG4gICAgaWYgKHZhbHVlUmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFNraXAgcHJvcGVydGllcyB3aXRoIG9taXR0ZWQgdmFsdWVzLlxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHZhbHVlUmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCB7IF9zb3VyY2U6IGtleVNvdXJjZSwgX2lzSWRlbnRpZmllcjogaXNJZGVudGlmaWVyIH0gPVxuICAgICAgICB1bmV2YWxPYmplY3RMaXRlcmFsS2V5KGtleSwgc3RhdGUpXG4gICAgICBlbnRyaWVzLnB1c2goe1xuICAgICAgICBfc291cmNlOlxuICAgICAgICAgIGlzSWRlbnRpZmllciAmJiBrZXlTb3VyY2UgPT0gdmFsdWVSZXN1bHRcbiAgICAgICAgICAgID8ga2V5U291cmNlXG4gICAgICAgICAgICA6IGAke2tleVNvdXJjZX06JHt2YWx1ZVJlc3VsdH1gLFxuICAgICAgfSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3Qgb2JqZWN0TmFtZSA9IGJpbmRpbmdOYW1lKG9iamVjdCwgc3RhdGUpXG4gICAgY29uc3QgdmFsdWVOYW1lID0gYmluZGluZ05hbWUodmFsdWUgYXMgb2JqZWN0LCBzdGF0ZSlcbiAgICBjb25zdCBtdXRhdGlvbjogTXV0YXRpb24gPVxuICAgICAgdHlwZW9mIGtleSA9PSBgc3ltYm9sYFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIF9zb3VyY2U6IGAke29iamVjdE5hbWV9WyR7dW5ldmFsSW50ZXJuYWwoa2V5LCBzdGF0ZSl9XT0ke3ZhbHVlTmFtZX1gLFxuICAgICAgICAgICAgLy8gQW4gYXNzaWdubWVudCBldmFsdWF0ZXMgdG8gdGhlIHJpZ2h0LWhhbmQgc2lkZS5cbiAgICAgICAgICAgIF9ldmFsdWF0ZXNUbzogdmFsdWVOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBrZXkgPT0gX19QUk9UT19fXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIF9zb3VyY2U6IGBPYmplY3QuZGVmaW5lUHJvcGVydHkoJHtvYmplY3ROYW1lfSxcIiR7X19QUk9UT19ffVwiLHt2YWx1ZToke1xuICAgICAgICAgICAgICAgIHZhbHVlTmFtZVxuICAgICAgICAgICAgICB9LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwfSlgLFxuICAgICAgICAgICAgICAvLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBhbHdheXMgcmV0dXJucyB0aGUgaW5wdXQgb2JqZWN0LlxuICAgICAgICAgICAgICBfZXZhbHVhdGVzVG86IG9iamVjdE5hbWUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIF9zb3VyY2U6IGAke29iamVjdE5hbWV9JHtcbiAgICAgICAgICAgICAgICBQUk9QRVJUWV9SRUdfRVhQLnRlc3Qoa2V5KVxuICAgICAgICAgICAgICAgICAgPyBgLiR7a2V5fWBcbiAgICAgICAgICAgICAgICAgIDogYFske3VuZXZhbEludGVybmFsKGtleSwgc3RhdGUpfV1gXG4gICAgICAgICAgICAgIH09JHt2YWx1ZU5hbWV9YCxcbiAgICAgICAgICAgICAgLy8gQW4gYXNzaWdubWVudCBldmFsdWF0ZXMgdG8gdGhlIHJpZ2h0LWhhbmQgc2lkZS5cbiAgICAgICAgICAgICAgX2V2YWx1YXRlc1RvOiB2YWx1ZU5hbWUsXG4gICAgICAgICAgICB9XG4gICAgZW50cmllcy5wdXNoKHtcbiAgICAgIF9pc0NpcmN1bGFyOiB0cnVlLFxuICAgICAgLy8gVGhpcyBpcyBhIHBsYWNlaG9sZGVyIHByb3BlcnR5IGZvciBwcmVzZXJ2aW5nIHByb3BlcnR5IG9yZGVyLiBXZSdsbCBzZXRcbiAgICAgIC8vIHRoZSBwcm9wZXJ0eSdzIGFjdHVhbCB2YWx1ZSBsYXRlciB3aXRoIHRoZSBtdXRhdGlvbiBiZWxvdy5cbiAgICAgIF9zb3VyY2U6IGAke3VuZXZhbE9iamVjdExpdGVyYWxLZXkoa2V5LCBzdGF0ZSkuX3NvdXJjZX06bnVsbGAsXG4gICAgICBfbXV0YXRpb246ICgpID0+IG11dGF0aW9uLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBmaXJzdERlc2NyaXB0b3JJbmRleCA9IGtleUluZGV4XG4gIGlmIChmaXJzdERlc2NyaXB0b3JJbmRleCA8IGtleXMubGVuZ3RoKSB7XG4gICAgZm9yICg7IGtleUluZGV4IDwga2V5cy5sZW5ndGg7IGtleUluZGV4KyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNba2V5SW5kZXhdIVxuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBrZXkpIVxuICAgICAgZW50cmllcy5wdXNoKHVuZXZhbERlc2NyaXB0b3JFbnRyeShrZXksIGRlc2NyaXB0b3IsIG9iamVjdCwgc3RhdGUpKVxuICAgIH1cbiAgfVxuXG4gIC8vIFdlIHVzZSB0aGlzIHRvIHRyaW0gdHJhaWxpbmcgY2lyY3VsYXIgcGxhY2Vob2xkZXJzIGJlY2F1c2UgdGhleSdyZSBub3RcbiAgLy8gbmVjZXNzYXJ5IGZvciBwcmVzZXJ2aW5nIHByb3BlcnR5IG9yZGVyLiBUaGUgbXV0YXRpb25zIG9mIHRyYWlsaW5nIGNpcmN1bGFyXG4gIC8vIHByb3BlcnRpZXMgd2lsbCBlbmQgdXAgcGxhY2luZyB0aGVtIGluIHRoZSByaWdodCBvcmRlci5cbiAgbGV0IHRyYWlsaW5nQ2lyY3VsYXJFbnRyaWVzU3RhcnRJbmRleCA9IGVudHJpZXMubGVuZ3RoXG4gIHdoaWxlIChcbiAgICB0cmFpbGluZ0NpcmN1bGFyRW50cmllc1N0YXJ0SW5kZXggPiAwICYmXG4gICAgZW50cmllc1t0cmFpbGluZ0NpcmN1bGFyRW50cmllc1N0YXJ0SW5kZXggLSAxXSEuX2lzQ2lyY3VsYXJcbiAgKSB7XG4gICAgdHJhaWxpbmdDaXJjdWxhckVudHJpZXNTdGFydEluZGV4LS1cbiAgfVxuXG4gIC8vIFB1c2ggYWxsIGNpcmN1bGFyIG11dGF0aW9ucyBub3cgdGhhdCB3ZSBrbm93IHdoaWNoIGVudHJpZXMgaGF2ZVxuICAvLyBwbGFjZWhvbGRlcnMgKG5vbi10cmFpbGluZykgdnMgd2hpY2ggZG9uJ3QgKHRyYWlsaW5nKS5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2ldIVxuICAgIGlmIChlbnRyeS5faXNDaXJjdWxhcikge1xuICAgICAgY29uc3QgaGFzUGxhY2Vob2xkZXIgPSBpIDwgdHJhaWxpbmdDaXJjdWxhckVudHJpZXNTdGFydEluZGV4XG4gICAgICBzdGF0ZS5fbXV0YXRpb25zLnB1c2goZW50cnkuX211dGF0aW9uKGhhc1BsYWNlaG9sZGVyKSlcbiAgICB9XG4gIH1cblxuICAvLyBDcmVhdGUgdGhlIGluaXRpYWwgb2JqZWN0IGxpdGVyYWwgc291cmNlLlxuICBjb25zdCBsZWFkaW5nRW50cmllcyA9IGVudHJpZXMuc2xpY2UoMCwgdHJhaWxpbmdDaXJjdWxhckVudHJpZXNTdGFydEluZGV4KVxuICBsZXQgc291cmNlID0gYHske2xlYWRpbmdFbnRyaWVzXG4gICAgLnNsaWNlKDAsIGZpcnN0RGVzY3JpcHRvckluZGV4KVxuICAgIC5tYXAoZW50cnkgPT4gZW50cnkuX3NvdXJjZSlcbiAgICAuam9pbigpfX1gXG4gIC8vIFRoZW4gc2V0IHRoZSB0cmFpbGluZyBvYmplY3QgZGVzY3JpcHRvcnMgaWYgdGhleSBhcmUgYW55LlxuICBjb25zdCBkZXNjcmlwdG9yRW50cnlTb3VyY2VzID0gbGVhZGluZ0VudHJpZXNcbiAgICAuc2xpY2UoZmlyc3REZXNjcmlwdG9ySW5kZXgpXG4gICAgLm1hcChlbnRyeSA9PiBlbnRyeS5fc291cmNlKVxuICBpZiAoZGVzY3JpcHRvckVudHJ5U291cmNlcy5sZW5ndGgpIHtcbiAgICBzb3VyY2UgPSBgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoJHtzb3VyY2V9LHske2Rlc2NyaXB0b3JFbnRyeVNvdXJjZXMuam9pbigpfX0pYFxuICB9XG5cbiAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCkgYXMgdW5rbm93blxuICBpZiAoIWlzRGVmYXVsdE9iamVjdFByb3RvdHlwZShwcm90b3R5cGUpKSB7XG4gICAgLy8gV2Ugb25seSByZW5kZXIgdGhlIHByb3RvdHlwZSBpZiBpdCdzIG5vdCBlcXVhbCB0aGUgZGVmYXVsdCBvbmUgaW4gdGhpc1xuICAgIC8vIHJlYWxtLlxuICAgIHNvdXJjZSA9IGBPYmplY3Quc2V0UHJvdG90eXBlT2YoJHtzb3VyY2V9LCR7XG4gICAgICAvLyBUaGlzIG11c3QgYmUgbm9uLW51bGwgYmVjYXVzZSBwcm90b3R5cGVzIGNhbm5vdCBiZSBjaXJjdWxhci4gVHJ5aW5nXG4gICAgICAvLyB0byBtYWtlIHRoZW0gY2lyY3VsYXIgcmVzdWx0cyBpbiBhbiBlcnJvci5cbiAgICAgIHVuZXZhbEludGVybmFsKHByb3RvdHlwZSwgc3RhdGUpIVxuICAgIH0pYFxuICB9XG5cbiAgcmV0dXJuIHNvdXJjZVxufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHtAbGluayBkZXNjcmlwdG9yfSBpcyBmb3IgYSByZWd1bGFyIHByb3BlcnR5LCBtZWFuaW5nIGl0c1xuICogZGVzY3JpcHRvciBhdHRyaWJ1dGVzIGFyZSB0aGUgb25lcyB5b3UnZCBnZXQgZnJvbSBhIHJlZ3VsYXIgb2JqZWN0IGxpdGVyYWxcbiAqIHByb3BlcnR5IChub3QgdGhyb3VnaCBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCkuXG4gKi9cbmNvbnN0IGlzUmVndWxhckRhdGFEZXNjcmlwdG9yID0gKGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcik6IGJvb2xlYW4gPT5cbiAgYHZhbHVlYCBpbiBkZXNjcmlwdG9yICYmXG4gIGRlc2NyaXB0b3IuZW51bWVyYWJsZSEgJiZcbiAgZGVzY3JpcHRvci5jb25maWd1cmFibGUhICYmXG4gIGRlc2NyaXB0b3Iud3JpdGFibGUhXG5cbmNvbnN0IHVuZXZhbERlc2NyaXB0b3JFbnRyeSA9IChcbiAga2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcixcbiAgb2JqZWN0OiBvYmplY3QsXG4gIHN0YXRlOiBTdGF0ZSxcbik6IE9iamVjdEVudHJ5ID0+IHtcbiAgY29uc3QgZGVzY3JpcHRvckVudHJ5U291cmNlczogc3RyaW5nW10gPSBbXVxuXG4gIGxldCBpc0NpcmN1bGFyOiB0cnVlIHwgdW5kZWZpbmVkXG4gIGxldCBpc0dldFNldDogdHJ1ZSB8IHVuZGVmaW5lZFxuICBmb3IgKGNvbnN0IGtleSBvZiBVTktOT1dOX0RFU0NSSVBUT1JfS0VZUykge1xuICAgIGlmICghKGtleSBpbiBkZXNjcmlwdG9yKSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IGRlc2NyaXB0b3Jba2V5XSBhcyB1bmtub3duXG4gICAgaWYgKFxuICAgICAgR0VUX1NFVF9ERVNDUklQVE9SX0tFWVMuaW5jbHVkZXMoXG4gICAgICAgIGtleSBhcyAodHlwZW9mIEdFVF9TRVRfREVTQ1JJUFRPUl9LRVlTKVtudW1iZXJdLFxuICAgICAgKVxuICAgICkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgaXNHZXRTZXQpIHtcbiAgICAgICAgLy8gV2Ugb25seSBuZWVkIG9uZSBvZiBgZ2V0YCBhbmQgYHNldGAgdG8gYmUgc2V0IGluIG9yZGVyIGZvciB0aGVcbiAgICAgICAgLy8gZGVzY3JpcHRvciB0byBub3QgYmUgYSBkYXRhIGRlc2NyaXB0b3IuIElmIGBnZXRgIG9yIGBzZXRgIGlzIGFscmVhZHlcbiAgICAgICAgLy8gc2V0LCBhbmQgdGhpcyBvdGhlciBvbmUgaXMgYHVuZGVmaW5lZGAsIHRoZW4gc2V0dGluZyBpdCB3b3VsZG4ndCBkb1xuICAgICAgICAvLyBhbnl0aGluZy5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGlzR2V0U2V0ID0gdHJ1ZVxuICAgIH1cblxuICAgIGxldCByZXN1bHQgPSB1bmV2YWxJbnRlcm5hbCh2YWx1ZSwgc3RhdGUpXG4gICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBTa2lwIHByb3BlcnRpZXMgd2l0aCBvbWl0dGVkIHZhbHVlcy5cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgIGlzQ2lyY3VsYXIgPSB0cnVlXG4gICAgICByZXN1bHQgPSBiaW5kaW5nTmFtZSh2YWx1ZSBhcyBvYmplY3QsIHN0YXRlKVxuICAgIH1cblxuICAgIGRlc2NyaXB0b3JFbnRyeVNvdXJjZXMucHVzaChgJHtrZXl9OiR7cmVzdWx0fWApXG4gIH1cblxuICAvLyBTZXQgYW55IG5vbi1gZmFsc2VgICh0aGUgZGVmYXVsdCkgZGVzY3JpcHRvciB2YWx1ZXMuXG4gIGZvciAoY29uc3Qga2V5IG9mIEJPT0xFQU5fREVTQ1JJUFRPUl9LRVlTKSB7XG4gICAgaWYgKGRlc2NyaXB0b3Jba2V5XSkge1xuICAgICAgZGVzY3JpcHRvckVudHJ5U291cmNlcy5wdXNoKGAke2tleX06ITBgKVxuICAgIH1cbiAgfVxuICBjb25zdCBkZXNjcmlwdG9yU291cmNlID0gYHske2Rlc2NyaXB0b3JFbnRyeVNvdXJjZXMuam9pbigpfX1gXG5cbiAgaWYgKCFpc0NpcmN1bGFyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9zb3VyY2U6IGAke3VuZXZhbE9iamVjdExpdGVyYWxLZXkoa2V5LCBzdGF0ZSkuX3NvdXJjZX06JHtkZXNjcmlwdG9yU291cmNlfWAsXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBfaXNDaXJjdWxhcjogdHJ1ZSxcbiAgICAvLyBUaGlzIGlzIGEgcGxhY2Vob2xkZXIgcHJvcGVydHkgZm9yIHByZXNlcnZpbmcgcHJvcGVydHkgb3JkZXIuIFdlJ2xsIHNldFxuICAgIC8vIHRoZSBwcm9wZXJ0eSdzIGFjdHVhbCB2YWx1ZSBsYXRlciB3aXRoIHRoZSBtdXRhdGlvbi5cbiAgICAvL1xuICAgIC8vIFdlIGxlYXZlIGFsbCBkZXNjcmlwdG9yIHByb3BlcnRpZXMgZGVmYXVsdGluZyB0byBgZmFsc2VgIGFuZCBgdW5kZWZpbmVkYFxuICAgIC8vIHNvIHdlIG9ubHkgbmVlZCB0byBleHBsaWNpdGx5IGxpc3QgdGhlIGB0cnVlYCBhbmQgbm9uLWB1bmRlZmluZWRgXG4gICAgLy8gZGVzY3JpcHRvciBwcm9wZXJ0aWVzIGluIHRoZSBtdXRhdGlvbi4gSG93ZXZlciwgd2UgbXVzdCBzZXRcbiAgICAvLyBgY29uZmlndXJhYmxlOiB0cnVlYCBiZWNhdXNlIG90aGVyd2lzZSB3ZSBjYW4ndCBtb2RpZnkgdGhlIHByb3BlcnR5XG4gICAgLy8gbGF0ZXIgYXQgYWxsLlxuICAgIF9zb3VyY2U6IGAke3VuZXZhbE9iamVjdExpdGVyYWxLZXkoa2V5LCBzdGF0ZSkuX3NvdXJjZX06e2NvbmZpZ3VyYWJsZTohMH1gLFxuICAgIF9tdXRhdGlvbjogaGFzUGxhY2Vob2xkZXIgPT4ge1xuICAgICAgY29uc3Qgb2JqZWN0TmFtZSA9IGJpbmRpbmdOYW1lKG9iamVjdCwgc3RhdGUpXG5cbiAgICAgIC8vIFdoZW4gYSBwbGFjZWhvbGRlciB3aXRoIGBjb25maWd1cmFibGU6IHRydWVgIHdhcyBlbWl0dGVkLCB0aGVcbiAgICAgIC8vIG11dGF0aW9uIG11c3QgZXhwbGljaXRseSBzZXQgYGNvbmZpZ3VyYWJsZTogZmFsc2VgIHRvIG92ZXJ3cml0ZSBpdC5cbiAgICAgIGNvbnN0IG11dGF0aW9uRGVzY3JpcHRvclNvdXJjZSA9XG4gICAgICAgIGhhc1BsYWNlaG9sZGVyICYmICFkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZVxuICAgICAgICAgID8gYHske1suLi5kZXNjcmlwdG9yRW50cnlTb3VyY2VzLCBgY29uZmlndXJhYmxlOiExYF0uam9pbigpfX1gXG4gICAgICAgICAgOiBkZXNjcmlwdG9yU291cmNlXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9zb3VyY2U6IGBPYmplY3QuZGVmaW5lUHJvcGVydHkoJHtcbiAgICAgICAgICBvYmplY3ROYW1lXG4gICAgICAgIH0sJHt1bmV2YWxJbnRlcm5hbChrZXksIHN0YXRlKX0sJHttdXRhdGlvbkRlc2NyaXB0b3JTb3VyY2V9KWAsXG4gICAgICAgIC8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIGFsd2F5cyByZXR1cm5zIHRoZSBpbnB1dCBvYmplY3QuXG4gICAgICAgIF9ldmFsdWF0ZXNUbzogb2JqZWN0TmFtZSxcbiAgICAgIH1cbiAgICB9LFxuICB9XG59XG5cbnR5cGUgT2JqZWN0RW50cnkgPSB7IF9zb3VyY2U6IHN0cmluZyB9ICYgKFxuICB8IHsgX2lzQ2lyY3VsYXI/OiBuZXZlciB9XG4gIHwgeyBfaXNDaXJjdWxhcjogdHJ1ZTsgX211dGF0aW9uOiAoaGFzUGxhY2Vob2xkZXI6IGJvb2xlYW4pID0+IE11dGF0aW9uIH1cbilcblxuY29uc3QgdW5ldmFsT2JqZWN0TGl0ZXJhbEtleSA9IChcbiAga2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gIHN0YXRlOiBTdGF0ZSxcbik6IHsgX3NvdXJjZTogc3RyaW5nOyBfaXNJZGVudGlmaWVyPzogYm9vbGVhbiB9ID0+IHtcbiAgaWYgKFxuICAgIHR5cGVvZiBrZXkgPT0gYHN5bWJvbGAgfHxcbiAgICAvLyBgeyBbJ19fcHJvdG9fXyddOiAuLi59YCBpcyBhIGhhY2sgZm9yIHNldHRpbmcgYF9fcHJvdG9fX2AgYXMgYW4gb3duXG4gICAgLy8gcHJvcGVydHkgcmF0aGVyIHRoYW4gc2V0dGluZyBgT2JqZWN0LnByb3RvdHlwZWAuXG4gICAga2V5ID09IF9fUFJPVE9fX1xuICApIHtcbiAgICByZXR1cm4geyBfc291cmNlOiBgWyR7dW5ldmFsSW50ZXJuYWwoa2V5LCBzdGF0ZSkhfV1gIH1cbiAgfVxuXG4gIC8vIFRoZSB2YXN0IG1ham9yaXR5IG9mIGtleXMgYXJlIG5vbi1udW1lcmljIHNvIGRvbid0IGJvdGhlciB3aXRoIHRoZVxuICAvLyBleHBlbnNpdmUgbnVtZXJpYyBrZXkgY2hlY2sgYmVsb3cgaWYgdGhlIGtleSBpcyBkZWZpbml0ZWx5IG5vdCBudW1lcmljXG4gIC8vIGJhc2VkIG9uIHRoZSBmaXJzdCBjaGFyYWN0ZXIuXG4gIGNvbnN0IGZpcnN0Q2hhciA9IGtleVswXSFcbiAgaWYgKGZpcnN0Q2hhciA+PSBgMGAgJiYgZmlyc3RDaGFyIDw9IGA5YCkge1xuICAgIGNvbnN0IG51bWJlciA9ICtrZXlcbiAgICBjb25zdCBpc051bWVyaWNLZXkgPVxuICAgICAgLy8gTmVnYXRpdmUgbnVtYmVycyBtdXN0IGJlIHF1b3RlZC5cbiAgICAgIG51bWJlciA+PSAwICYmXG4gICAgICAvLyBOdW1iZXJzIHRoYXQgY2FuJ3QgYmUgc2FmZWx5IHJlcHJlc2VudGVkIGFzIGludGVnZXJzIChlLmcuIGJlY2F1c2VcbiAgICAgIC8vIHRoZXkgYXJlIHRvbyBsYXJnZSkgbXVzdCBiZSBxdW90ZWQuXG4gICAgICBOdW1iZXIuaXNTYWZlSW50ZWdlcihudW1iZXIpICYmXG4gICAgICAvLyBJZiB0aGUga2V5IGRvZXNuJ3Qgcm91bmR0cmlwIHRocm91Z2ggbnVtZXJpYyBjb252ZXJzaW9uLCB0aGVuIGl0J3NcbiAgICAgIC8vIHBhZGRlZCAoZS5nLiBgMDFgKSBhbmQgbXVzdCBiZSBxdW90ZWQgdG8gcmV0YWluIHRoYXQuXG4gICAgICBrZXkgPT0gYCR7bnVtYmVyfWBcbiAgICByZXR1cm4geyBfc291cmNlOiBpc051bWVyaWNLZXkgPyBrZXkgOiB1bmV2YWxJbnRlcm5hbChrZXksIHN0YXRlKSEgfVxuICB9XG5cbiAgaWYgKFBST1BFUlRZX1JFR19FWFAudGVzdChrZXkpKSB7XG4gICAgcmV0dXJuIHsgX3NvdXJjZToga2V5LCBfaXNJZGVudGlmaWVyOiB0cnVlIH1cbiAgfVxuXG4gIHJldHVybiB7IF9zb3VyY2U6IHVuZXZhbEludGVybmFsKGtleSwgc3RhdGUpISB9XG59XG5cbmV4cG9ydCBjb25zdCBpc0RlZmF1bHRPYmplY3RQcm90b3R5cGUgPSAodmFsdWU6IHVua25vd24pOiBib29sZWFuID0+XG4gIHZhbHVlID09IE9iamVjdC5wcm90b3R5cGUgfHxcbiAgKGlzT2JqZWN0KHZhbHVlKSAmJlxuICAgIG93bktleXNTdHJpbmcodmFsdWUpID09IERFRkFVTFRfT0JKRUNUX1BST1RPVFlQRV9LRVlTX1NUUklORylcblxuZXhwb3J0IGNvbnN0IGlzT2JqZWN0ID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgb2JqZWN0ID0+IHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWx1ZVxuICByZXR1cm4gKHR5cGUgPT0gYG9iamVjdGAgJiYgISF2YWx1ZSkgfHwgdHlwZSA9PSBgZnVuY3Rpb25gXG59XG5cbmNvbnN0IG93bktleXNTdHJpbmcgPSAodmFsdWU6IG9iamVjdCkgPT5cbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpLnNvcnQoKS5qb2luKGBcXDBgKVxuXG5jb25zdCBfX1BST1RPX18gPSBgX19wcm90b19fYFxuY29uc3QgREVGQVVMVF9PQkpFQ1RfUFJPVE9UWVBFX0tFWVNfU1RSSU5HID0gb3duS2V5c1N0cmluZyhPYmplY3QucHJvdG90eXBlKVxuXG5jb25zdCBCT09MRUFOX0RFU0NSSVBUT1JfS0VZUyA9IFtcbiAgYGNvbmZpZ3VyYWJsZWAsXG4gIGBlbnVtZXJhYmxlYCxcbiAgYHdyaXRhYmxlYCxcbl0gYXMgY29uc3RcbmNvbnN0IEdFVF9TRVRfREVTQ1JJUFRPUl9LRVlTID0gW2BnZXRgLCBgc2V0YF0gYXMgY29uc3RcbmNvbnN0IFVOS05PV05fREVTQ1JJUFRPUl9LRVlTID0gW2B2YWx1ZWAsIC4uLkdFVF9TRVRfREVTQ1JJUFRPUl9LRVlTXSBhcyBjb25zdFxuIiwiLy8gRm9yIHNtYWxsZXIgYnVuZGxlIHNpemUuXG4vKiBlc2xpbnQtZGlzYWJsZSBlcWVxZXEgKi9cblxuaW1wb3J0IHsgaXNPYmplY3QsIHVuZXZhbE9iamVjdCB9IGZyb20gJy4vb2JqZWN0LnRzJ1xuaW1wb3J0IHtcbiAgU1RSSU5HX0NPREVfVU5JVF9FU0NBUEVTLFxuICB1bmV2YWxCaWdpbnQsXG4gIHVuZXZhbEJvb2xlYW4sXG4gIHVuZXZhbExpdGVyYWwsXG4gIHVuZXZhbE51bWJlcixcbiAgdW5ldmFsU3ltYm9sLFxufSBmcm9tICcuL3ByaW1pdGl2ZS50cydcbmltcG9ydCB0eXBlIHsgU3RhdGUgfSBmcm9tICcuL3R5cGVzLnRzJ1xuXG5leHBvcnQgY29uc3QgdW5ldmFsSW50ZXJuYWwgPSAoKFxuICB2YWx1ZTogdW5rbm93bixcbiAgc3RhdGU6IFN0YXRlLFxuKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9PiB7XG4gIC8vIERvbid0IGNoZWNrIHRoZSBjdXN0b20gc291cmNlIGZvciBvYmplY3RzIG5vdyBiZWNhdXNlIHdlIG1heSBuZWVkIHRvIGNyZWF0ZVxuICAvLyBhIGJpbmRpbmcgaW4gYHVuZXZhbE9iamVjdGAuXG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgY29uc3QgY3VzdG9tU291cmNlID0gc3RhdGUuX2N1c3RvbVNvdXJjZXMuZ2V0KHZhbHVlKVxuICAgIGlmIChjdXN0b21Tb3VyY2UgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoZSB1c2VyIGRlY2lkZWQgdG8gb21pdCB0aGlzIHZhbHVlLlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgICBpZiAoY3VzdG9tU291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRoZSB1c2VyIHByb3ZpZGVkIGEgY3VzdG9tIHNvdXJjZSBmb3IgdGhpcyB2YWx1ZS5cbiAgICAgIHJldHVybiBjdXN0b21Tb3VyY2VcbiAgICB9XG4gIH1cblxuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlXG4gIGlmICh0eXBlID09IGB1bmRlZmluZWRgKSB7XG4gICAgcmV0dXJuIGB2b2lkIDBgXG4gIH0gZWxzZSBpZiAodHlwZSA9PSBgYm9vbGVhbmApIHtcbiAgICByZXR1cm4gdW5ldmFsQm9vbGVhbih2YWx1ZSBhcyBib29sZWFuKVxuICB9IGVsc2UgaWYgKHR5cGUgPT0gYG51bWJlcmApIHtcbiAgICByZXR1cm4gdW5ldmFsTnVtYmVyKHZhbHVlIGFzIG51bWJlcilcbiAgfSBlbHNlIGlmICh0eXBlID09IGBiaWdpbnRgKSB7XG4gICAgcmV0dXJuIHVuZXZhbEJpZ2ludCh2YWx1ZSBhcyBiaWdpbnQpXG4gIH0gZWxzZSBpZiAodHlwZSA9PSBgc3RyaW5nYCkge1xuICAgIHJldHVybiBgXCIke3VuZXZhbExpdGVyYWwodmFsdWUgYXMgc3RyaW5nLCBTVFJJTkdfQ09ERV9VTklUX0VTQ0FQRVMpfVwiYFxuICB9IGVsc2UgaWYgKHR5cGUgPT0gYHN5bWJvbGApIHtcbiAgICByZXR1cm4gdW5ldmFsU3ltYm9sKHZhbHVlIGFzIHN5bWJvbCwgc3RhdGUpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBgbnVsbGAgOiB1bmV2YWxPYmplY3QodmFsdWUsIHN0YXRlKVxuICB9XG59KSBhcyB7XG4gIChcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IGJpZ2ludCB8IHN5bWJvbCB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IFN0YXRlLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKHZhbHVlOiB1bmtub3duLCBzdGF0ZTogU3RhdGUpOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG59XG4iLCIvLyBGb3Igc21hbGxlciBidW5kbGUgc2l6ZS5cbi8qIGVzbGludC1kaXNhYmxlIGVxZXFlcSAqL1xuXG5pbXBvcnQgdHlwZSB7IFR5cGVkQXJyYXkgfSBmcm9tICcuL2ludGVybmFsL2J1ZmZlci50cydcbmltcG9ydCB7IGdlbmVyYXRlSWRlbnRpZmllciB9IGZyb20gJy4vaW50ZXJuYWwvaWRlbnRpZmllci50cydcbmltcG9ydCB7IHVuZXZhbEludGVybmFsIH0gZnJvbSAnLi9pbnRlcm5hbC9pbmRleC50cydcbmltcG9ydCB7IGlzRGVmYXVsdE9iamVjdFByb3RvdHlwZSwgaXNPYmplY3QgfSBmcm9tICcuL2ludGVybmFsL29iamVjdC50cydcbmltcG9ydCB7XG4gIGdldFR5cGUsXG4gIFRfQVJSQVksXG4gIFRfQVJSQVlfQlVGRkVSLFxuICBUX0JVRkZFUixcbiAgVF9NQVAsXG4gIFRfUFJJTUlUSVZFX1dSQVBQRVIsXG4gIFRfU0VULFxuICBUX1RZUEVEX0FSUkFZLFxufSBmcm9tICcuL2ludGVybmFsL3R5cGUudHMnXG5pbXBvcnQgdHlwZSB7IEJpbmRpbmcsIFN0YXRlIH0gZnJvbSAnLi9pbnRlcm5hbC90eXBlcy50cydcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayB1bmV2YWx9LiAqL1xuZXhwb3J0IHR5cGUgVW5ldmFsT3B0aW9ucyA9IHtcbiAgLyoqXG4gICAqIEEgY3VzdG9tIGZ1bmN0aW9uIGZvciB1bmV2YWxpbmcgdmFsdWVzLlxuICAgKlxuICAgKiBSZXR1cm4gdGhlIGZvbGxvd2luZyB0eXBlcyBkZXBlbmRpbmcgb24gdGhlIGRlc2lyZWQgYmVoYXZpb3I6XG4gICAqIC0gYHN0cmluZ2AgdG8gcHJvdmlkZSBhIGN1c3RvbSB1bmV2YWwgcmVzdWx0IGZvciB7QGxpbmsgdmFsdWV9XG4gICAqIC0gYG51bGxgIHRvIG9taXQge0BsaW5rIHZhbHVlfSBmcm9tIHRoZSBvdXRwdXQgKGUuZy4gaW4gYXJyYXlzLCBvYmplY3RzLFxuICAgKiAgIFNldHMsIE1hcHMpLiBPbWl0dGluZyB0aGUgcm9vdCB2YWx1ZSB0aHJvd3MgYW4gYEVycm9yYC5cbiAgICogLSBgdW5kZWZpbmVkYCAob3IgZG9uJ3QgcmV0dXJuIGFueXRoaW5nLCB3aGljaCBpcyBlcXVpdmFsZW50KSB0byB1c2UgdGhlXG4gICAqICAgZGVmYXVsdCBiZWhhdmlvciBmb3Ige0BsaW5rIHZhbHVlfVxuICAgKlxuICAgKiBJdCBjYW4gYmUgdXNlZCB0byB1bmV2YWwgYWxyZWFkeSBzdXBwb3J0ZWQgdmFsdWVzIGRpZmZlcmVudGx5IG9yIHRvIHVuZXZhbFxuICAgKiB1bnN1cHBvcnRlZCB2YWx1ZXMgc3VjaCBhcyBmdW5jdGlvbnMuXG4gICAqXG4gICAqIFRoZSB7QGxpbmsgdW5ldmFsfSBwYXJhbSBpcyB0aGUgc2FtZSB1bmV2YWwgZnVuY3Rpb24gdGhlc2Ugb3B0aW9ucyB3ZXJlXG4gICAqIHBhc3NlZCB0by4gWW91IG1heSB1c2UgaXQgdG8gZGVsZWdhdGUgYmFjayB0byB1bmV2YWwgZm9yIHN1Yi1vYmplY3RzLlxuICAgKi9cbiAgY3VzdG9tPzogKFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHVuZXZhbDogKHZhbHVlOiB1bmtub3duKSA9PiBzdHJpbmcsXG4gICkgPT4gc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxufVxuXG4vLyBUT0RPKCM1MSk6IFN1cHBvcnQgYXJiaXRyYXJ5IHByb3BlcnRpZXMgb24gcmFuZG9tIHR5cGVzIChlLmcuIEFycmF5cywgZXRjLilcbi8qKlxuICogQ29udmVydHMgdGhlIGdpdmVuIHtAbGluayB2YWx1ZX0gdG8gSmF2YVNjcmlwdCBzb3VyY2UgY29kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBganNcbiAqIGltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnXG4gKiBpbXBvcnQgdW5ldmFsIGZyb20gJ0B0b21lci91bmV2YWwnXG4gKlxuICogY29uc3Qgb2JqZWN0ID0geyBtZXNzYWdlOiBgaGVsbG8gd29ybGRgIH1cbiAqXG4gKiBjb25zdCBzb3VyY2UgPSB1bmV2YWwob2JqZWN0KVxuICogY29uc29sZS5sb2coc291cmNlKVxuICogLy89PiB7bWVzc2FnZTpcImhlbGxvIHdvcmxkXCJ9XG4gKlxuICogY29uc3Qgcm91bmR0cmlwcGVkT2JqZWN0ID0gKDAsIGV2YWwpKGAoJHtzb3VyY2V9KWApXG4gKiBhc3NlcnQuZGVlcEVxdWFsKHJvdW5kdHJpcHBlZE9iamVjdCwgb2JqZWN0KVxuICpcbiAqIGNvbnN0IGNpcmN1bGFyT2JqZWN0ID0ge31cbiAqIGNpcmN1bGFyT2JqZWN0LnNlbGYgPSBjaXJjdWxhck9iamVjdFxuICpcbiAqIGNvbnN0IGNpcmN1bGFyU291cmNlID0gdW5ldmFsKGNpcmN1bGFyT2JqZWN0KVxuICogY29uc29sZS5sb2coY2lyY3VsYXJTb3VyY2UpXG4gKiAvLz0+IChhPT5hLnNlbGY9YSkoe30pXG4gKlxuICogY29uc3Qgcm91bmR0cmlwcGVkQ2lyY3VsYXJPYmplY3QgPSAoMCwgZXZhbCkoYCgke2NpcmN1bGFyU291cmNlfSlgKVxuICogYXNzZXJ0LmRlZXBFcXVhbChyb3VuZHRyaXBwZWRDaXJjdWxhck9iamVjdCwgY2lyY3VsYXJPYmplY3QpXG4gKiBgYGBcbiAqL1xuY29uc3QgdW5ldmFsID0gKHZhbHVlOiB1bmtub3duLCB7IGN1c3RvbSB9OiBVbmV2YWxPcHRpb25zID0ge30pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBzdGF0ZSA9IGNyZWF0ZVN0YXRlKHZhbHVlLCBjdXN0b20pXG4gIGNvbnN0IHJlc3VsdCA9IHVuZXZhbEludGVybmFsKHZhbHVlLCBzdGF0ZSlcbiAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSb290IG9taXR0ZWRgKVxuICB9XG5cbiAgaWYgKCFzdGF0ZS5fYmluZGluZ3Muc2l6ZSkge1xuICAgIC8vIElmIG5vIGJpbmRpbmdzIHdlcmUgY3JlYXRlZCwgdGhlbiBpdCdzIGltcG9zc2libGUgZm9yIHRoZSByZXR1cm5lZCBzb3VyY2VcbiAgICAvLyB0byByZWZlcmVuY2Ugb25lLCBzbyBpdCBtdXN0IGJlIGEgc3RyaW5nLlxuICAgIHJldHVybiByZXN1bHQhXG4gIH1cblxuICBjb25zdCBib2R5U291cmNlcyA9IHN0YXRlLl9tdXRhdGlvbnMubWFwKHJlc3VsdCA9PiByZXN1bHQuX3NvdXJjZSlcbiAgY29uc3QgcmV0dXJuQmluZGluZyA9IHN0YXRlLl9iaW5kaW5ncy5nZXQoXG4gICAgLy8gVGhlIHZhbHVlIG11c3QgYmUgYW4gb2JqZWN0IGlmIHdlIGVuZGVkIHVwIG5lZWRpbmcgdG8gY3JlYXRlIGJpbmRpbmdzIGZvclxuICAgIC8vIGl0LiBBIHByaW1pdGl2ZSB2YWx1ZSB3b3VsZCBhbHdheXMgcmVzdWx0IGluIGZ1bGx5IGlubGluZSBzb3VyY2UgYWJvdmUuXG4gICAgdmFsdWUgYXMgb2JqZWN0LFxuICApXG4gIGlmICghcmV0dXJuQmluZGluZykge1xuICAgIC8vIFRoZSB2YWx1ZSB0aGUgcmV0dXJuZWQgc291cmNlIGV2YWx1YXRlcyB0byBkb2Vzbid0IGhhdmUgYSBiaW5kaW5nLCBzbyB3ZVxuICAgIC8vIGFkZCBpdHMgc291cmNlIGlubGluZSBhdCB0aGUgZW5kIG9mIHRoZSBib2R5IGV4cHJlc3Npb24gdG8gcmV0dXJuIGl0LlxuICAgIGJvZHlTb3VyY2VzLnB1c2goXG4gICAgICAvLyBHdWFyYW50ZWVkIHRvIGJlIG5vbi1udWxsIGJlY2F1c2UgdGhhdCBvbmx5IGhhcHBlbnMgd2hlbiBpdCdzIGNpcmN1bGFyLFxuICAgICAgLy8gd2hpY2ggaXQgY2FuJ3QgYmUgaWYgaXQgaGFzIG5vIGJpbmRpbmcuXG4gICAgICByZXN1bHQhLFxuICAgIClcbiAgfSBlbHNlIGlmIChzdGF0ZS5fbXV0YXRpb25zLmF0KC0xKT8uX2V2YWx1YXRlc1RvICE9IHJldHVybkJpbmRpbmcuX25hbWUpIHtcbiAgICAvLyBUaGUgdmFsdWUgdGhlIHJldHVybmVkIHNvdXJjZSBldmFsdWF0ZXMgdG8gZG9lcyBoYXZlIGEgYmluZGluZywgYnV0IHRoZVxuICAgIC8vIGxhc3QgbXV0YXRpb24gaW4gdGhlIGJvZHkgZG9lcyBub3QgZXZhbHVhdGUgdG8gaXQsIHNvIHdlIGhhdmUgdG8gYWRkIGFcbiAgICAvLyByZWZlcmVuY2UgdG8gdGhlIHZhbHVlJ3MgYmluZGluZyBhdCB0aGUgZW5kIG9mIHRoZSBib2R5IGV4cHJlc3Npb24gdG9cbiAgICAvLyByZXR1cm4gaXQuXG4gICAgYm9keVNvdXJjZXMucHVzaChyZXR1cm5CaW5kaW5nLl9uYW1lKVxuICB9XG5cbiAgbGV0IGJvZHlTb3VyY2UgPSBib2R5U291cmNlcy5qb2luKClcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItc3RyaW5nLXN0YXJ0cy1lbmRzLXdpdGhcbiAgaWYgKGJvZHlTb3VyY2VzLmxlbmd0aCA+IDEgfHwgYm9keVNvdXJjZVswXSA9PSBge2ApIHtcbiAgICAvLyBJZiB0aGUgYm9keSBpcyBhIGNvbW1hIGV4cHJlc3Npb24sIHRoZW4gaXQgcmVxdWlyZXMgYSBwYXJlbnRoZXNlcyB0byBiZSBhXG4gICAgLy8gc3ludGFjdGljYWxseSBjb3JyZWN0IGV4cHJlc3Npb24gcmV0dXJuLiBJZiB0aGUgYm9keSBpcyBhbiBvYmplY3QsIHRoZW5cbiAgICAvLyBpdCBhbHNvIG5lZWRzIHBhcmVudGhlc2VzIHNvIHRoYXQgaXQgaXNuJ3QgaW50ZXJwcmV0ZWQgYXMgYSBibG9jay5cbiAgICBib2R5U291cmNlID0gYCgke2JvZHlTb3VyY2V9KWBcbiAgfVxuXG4gIC8vIFdlIHVzZSBhbiBJSUZFJ3MgbGFtYmRhIHBhcmFtZXRlcnMgdG8gZGVjbGFyZSBiaW5kaW5ncyBiZWNhdXNlIGl0J3MgZmV3ZXJcbiAgLy8gYnl0ZXMgdGhhbiB1c2luZyBgdmFyYCBvciBgbGV0YC4gV2UgcGxhY2UgdGhlIGJpbmRpbmcgdmFsdWVzIGluIHRoZSBjYWxsXG4gIC8vIGFyZ3VtZW50cyBmb3IgdGhlIGxlYWRpbmcgYmluZGluZ3MgdGhhdCBkb24ndCBoYXZlIGRlcGVuZGVuY2llcyBhbmQgcGxhY2VcbiAgLy8gaW4gdGhlIGRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhlIHJlc3QuIFRoaXMgaXMgYmVjYXVzZSBkZWZhdWx0XG4gIC8vIHBhcmFtZXRlciB2YWx1ZXMgcmVxdWlyZSBtb3JlIGJ5dGVzIHRoYW4gY2FsbCBhcmd1bWVudHMgKGR1ZSB0byB0aGUgYD1gKS5cbiAgY29uc3QgcGFyYW1ldGVyU291cmNlczogc3RyaW5nW10gPSBbXVxuICBjb25zdCBhcmdTb3VyY2VzOiBzdHJpbmdbXSA9IFtdXG4gIGxldCBoYXNEZXBlbmRlbmN5OiBib29sZWFuIHwgdW5kZWZpbmVkXG4gIGZvciAoY29uc3QgYmluZGluZyBvZiBzdGF0ZS5fYmluZGluZ09yZGVyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgaGFzRGVwZW5kZW5jeSB8fD0gYmluZGluZy5faGFzRGVwZW5kZW5jeVxuICAgIGlmIChoYXNEZXBlbmRlbmN5KSB7XG4gICAgICBwYXJhbWV0ZXJTb3VyY2VzLnB1c2goYCR7YmluZGluZy5fbmFtZX09JHtiaW5kaW5nLl9zb3VyY2V9YClcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1ldGVyU291cmNlcy5wdXNoKGJpbmRpbmcuX25hbWUpXG4gICAgICBhcmdTb3VyY2VzLnB1c2goYmluZGluZy5fc291cmNlISlcbiAgICB9XG4gIH1cblxuICBjb25zdCBwYXJhbWV0ZXJzU291cmNlID0gcGFyYW1ldGVyU291cmNlcy5qb2luKClcbiAgcmV0dXJuIGAoJHtcbiAgICBwYXJhbWV0ZXJTb3VyY2VzLmxlbmd0aCA+IDEgPyBgKCR7cGFyYW1ldGVyc1NvdXJjZX0pYCA6IHBhcmFtZXRlcnNTb3VyY2VcbiAgfT0+JHtib2R5U291cmNlfSkoJHthcmdTb3VyY2VzLmpvaW4oKX0pYFxufVxuXG5jb25zdCBjcmVhdGVTdGF0ZSA9IChcbiAgdmFsdWU6IHVua25vd24sXG4gIGN1c3RvbTogVW5ldmFsT3B0aW9uc1tgY3VzdG9tYF0sXG4pOiBTdGF0ZSA9PiB7XG4gIGNvbnN0IGJpbmRpbmdzID0gbmV3IE1hcDxvYmplY3QsIEJpbmRpbmc+KClcbiAgY29uc3QgY3VzdG9tU291cmNlcyA9IG5ldyBNYXA8dW5rbm93biwgc3RyaW5nIHwgbnVsbD4oKVxuXG4gIGNvbnN0IGVuc3VyZUJpbmRpbmcgPSAodmFsdWU6IG9iamVjdCkgPT4ge1xuICAgIGlmICghYmluZGluZ3MuaGFzKHZhbHVlKSkge1xuICAgICAgYmluZGluZ3Muc2V0KHZhbHVlLCB7IF9uYW1lOiBnZW5lcmF0ZUlkZW50aWZpZXIoYmluZGluZ3Muc2l6ZSkgfSlcbiAgICB9XG4gIH1cblxuICAvLyBWYWx1ZXMgc2VlbiBhdCBhbnkgcG9pbnQgZHVyaW5nIHRyYXZlcnNhbC4gVXNlZCB0byBkZXRlY3QgY2lyY3VsYXIgYW5kXG4gIC8vIHNoYXJlZCByZWZlcmVuY2VzLlxuICBjb25zdCBTT01FV0hFUkUgPSAxXG4gIGNvbnN0IFBBUkVOVCA9IDJcbiAgY29uc3Qgc2VlbkxvY2F0aW9uID0gbmV3IE1hcDxvYmplY3QsIHR5cGVvZiBTT01FV0hFUkUgfCB0eXBlb2YgUEFSRU5UPigpXG5cbiAgY29uc3QgdHJhdmVyc2UgPSAodmFsdWU6IHVua25vd24sIHBhcmVudD86IG9iamVjdCkgPT4ge1xuICAgIGlmIChjdXN0b20pIHtcbiAgICAgIGxldCBzb3VyY2UgPSBjdXN0b21Tb3VyY2VzLmdldCh2YWx1ZSlcbiAgICAgIGlmIChzb3VyY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzb3VyY2UgPSBjdXN0b20odmFsdWUsIHZhbHVlID0+IHVuZXZhbCh2YWx1ZSwgeyBjdXN0b20gfSkpXG4gICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGN1c3RvbVNvdXJjZXMuc2V0KHZhbHVlLCBzb3VyY2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gYG9iamVjdGApIHtcbiAgICAgIC8vIE5vdGUgdGhhdCB3ZSBwdXJwb3NlZnVsbHkgZG8gbm90IHRyYXZlcnNlIGZ1bmN0aW9ucyBoZXJlIGJlY2F1c2Ugd2VcbiAgICAgIC8vIGRvbid0IHN1cHBvcnQgdGhlbSBuYXRpdmVseS5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGxvY2F0aW9uID0gc2VlbkxvY2F0aW9uLmdldCh2YWx1ZSlcbiAgICBpZiAobG9jYXRpb24pIHtcbiAgICAgIC8vIElmIGEgb2JqZWN0IHZhbHVlIGlzIHVzZWQgbW9yZSB0aGFuIG9uY2UsIHRoZW4gaXQgbmVlZHMgYSBiaW5kaW5nIGZvclxuICAgICAgLy8gdGhlIHNoYXJlZCByZWZlcmVuY2UuXG4gICAgICBlbnN1cmVCaW5kaW5nKHZhbHVlKVxuXG4gICAgICBpZiAobG9jYXRpb24gPT0gUEFSRU5UKSB7XG4gICAgICAgIC8vIElmIHRoaXMgdmFsdWUgaXMgcmVmZXJlbmNlZCBjaXJjdWxhcmx5LCB0aGVuIHdlJ2xsIG5lZWQgYSBiaW5kaW5nIGZvclxuICAgICAgICAvLyBpdHMgcGFyZW50IHNvIHRoYXQgd2UgY2FuIG11dGF0ZSBpdCBsYXRlciB0byBhdHRhY2ggdGhlIGNpcmN1bGFyXG4gICAgICAgIC8vIHJlZmVyZW5jZS5cbiAgICAgICAgZW5zdXJlQmluZGluZyhwYXJlbnQhKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2VlbkxvY2F0aW9uLnNldCh2YWx1ZSwgUEFSRU5UKVxuICAgIHRyYXZlcnNlT2JqZWN0KHZhbHVlKVxuICAgIHNlZW5Mb2NhdGlvbi5zZXQodmFsdWUsIFNPTUVXSEVSRSlcbiAgfVxuXG4gIGNvbnN0IHRyYXZlcnNlT2JqZWN0ID0gKHZhbHVlOiBvYmplY3QpID0+IHtcbiAgICBjb25zdCBbdHlwZV0gPSBnZXRUeXBlKHZhbHVlKVxuICAgIGlmICh0eXBlID09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKHZhbHVlKSkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PSBgc3ltYm9sYCkge1xuICAgICAgICAgIHRyYXZlcnNlKGtleSlcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSFcbiAgICAgICAgdHJhdmVyc2UoZGVzY3JpcHRvci52YWx1ZSBhcyB1bmtub3duLCB2YWx1ZSlcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICAgICAgICB0cmF2ZXJzZShkZXNjcmlwdG9yLmdldCwgdmFsdWUpXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcbiAgICAgICAgdHJhdmVyc2UoZGVzY3JpcHRvci5zZXQsIHZhbHVlKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpIGFzIHVua25vd25cbiAgICAgIGlmICghaXNEZWZhdWx0T2JqZWN0UHJvdG90eXBlKHByb3RvdHlwZSkpIHtcbiAgICAgICAgLy8gV2Ugb25seSByZW5kZXIgdGhlIHByb3RvdHlwZSBpZiBpdCdzIG5vdCBlcXVhbCB0aGUgZGVmYXVsdCBvbmUgaW5cbiAgICAgICAgLy8gdGhpcyByZWFsbS5cbiAgICAgICAgdHJhdmVyc2UocHJvdG90eXBlLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVF9QUklNSVRJVkVfV1JBUFBFUikge1xuICAgICAgLy8gVHJhdmVyc2UgdGhlIHVuZGVybHlpbmcgdW5ib3hlZCB2YWx1ZSB0byBhcHBseSBgY3VzdG9tYCB0byBpdC5cbiAgICAgIGNvbnN0IHVuZGVybHlpbmdWYWx1ZSA9IHZhbHVlLnZhbHVlT2YoKVxuICAgICAgdHJhdmVyc2UodW5kZXJseWluZ1ZhbHVlKVxuICAgICAgaWYgKGN1c3RvbVNvdXJjZXMuZ2V0KHVuZGVybHlpbmdWYWx1ZSkgPT09IG51bGwpIHtcbiAgICAgICAgY3VzdG9tU291cmNlcy5zZXQodmFsdWUsIG51bGwpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFRfQVJSQVkpIHtcbiAgICAgIC8vIFVzZSBgT2JqZWN0LmtleXNgIHRvIGF2b2lkIGl0ZXJhdGluZyBlbXB0eSBzbG90cywgd2hpY2ggYXJlIG5vLW9wcyBmb3JcbiAgICAgIC8vIHRyYXZlcnNhbCwgYW5kIHRvIHNhZmVseSBoYW5kbGUgaHVnZSBzcGFyc2UgYXJyYXlzIHdpdGhvdXQgRG9TLlxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSB7XG4gICAgICAgIHRyYXZlcnNlKCh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSwgdmFsdWUpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFRfU0VUKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUgYXMgU2V0PHVua25vd24+KSB7XG4gICAgICAgIHRyYXZlcnNlKGl0ZW0sIHZhbHVlKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUX01BUCkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCBpdGVtXSBvZiB2YWx1ZSBhcyBNYXA8dW5rbm93biwgdW5rbm93bj4pIHtcbiAgICAgICAgdHJhdmVyc2Uoa2V5LCB2YWx1ZSlcbiAgICAgICAgdHJhdmVyc2UoaXRlbSwgdmFsdWUpXG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlZW5Mb2NhdGlvbi5nZXQoXG4gICAgICAgICAgICAvLyBOb3QgZ3VhcmFudGVlZCB0byBiZSBhbiBvYmplY3QsIGJ1dCB0aGF0IGRvZXNuJ3QgbWF0dGVyIGJlY2F1c2VcbiAgICAgICAgICAgIC8vIGl0J3MganVzdCBhIGxvb2t1cCwgYW5kIHRoaXMgc2F2ZXMgYnl0ZXMuXG4gICAgICAgICAgICBpdGVtIGFzIG9iamVjdCxcbiAgICAgICAgICApID09IFBBUkVOVCAmJlxuICAgICAgICAgIGlzT2JqZWN0KGtleSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGl0ZW0gaXMgY2lyY3VsYXIgYW5kIHRoZSBrZXkgaXMgYW4gb2JqZWN0LCB0aGVuIHRoZSBrZXkgYWxzb1xuICAgICAgICAgIC8vIG5lZWRzIGEgYmluZGluZyBzbyB3ZSBjYW4gcmVmZXJlbmNlIGl0IGluIG11dGF0aW9ucy5cbiAgICAgICAgICBlbnN1cmVCaW5kaW5nKGtleSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUX0FSUkFZX0JVRkZFUikge1xuICAgICAgLy8gVE9ETygjNDIpOiBTdXBwb3J0IFR5cGVkQXJyYXlzIGNvbnRhaW5pbmcgZGV0YWNoZWQgQXJyYXlCdWZmZXJzLlxuICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSB2YWx1ZSBhcyBBcnJheUJ1ZmZlclxuICAgICAgaWYgKFxuICAgICAgICAvLyBJZiB0aGUgYEFycmF5QnVmZmVyYCBpcyBkZXRhY2hlZCwgdGhlbiB3ZSBuZWVkIGEgYmluZGluZyB0byBjYWxsXG4gICAgICAgIC8vIGAudHJhbnNmZXIoKWAgb24uXG4gICAgICAgIGFycmF5QnVmZmVyLmRldGFjaGVkIHx8XG4gICAgICAgIC8vIElmIHRoZSBgQXJyYXlCdWZmZXJgIGlzIHJlc2l6YWJsZSBhbmQgaGFzIG5vbi16ZXJvIHZhbHVlcywgdGhlblxuICAgICAgICAvLyB3ZSdsbCBoYXZlIHRvIGNvbnN0cnVjdCBpdCwgcHV0IGl0IGluIGEgYmluZGluZywgdGhlbiBgLnNldCguLi4pYCBpdC5cbiAgICAgICAgKGFycmF5QnVmZmVyLnJlc2l6YWJsZSAmJlxuICAgICAgICAgIG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKS5zb21lKHZhbHVlID0+IHZhbHVlICE9IDApKVxuICAgICAgKSB7XG4gICAgICAgIGVuc3VyZUJpbmRpbmcodmFsdWUpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFRfQlVGRkVSIHx8IHR5cGUgPT0gVF9UWVBFRF9BUlJBWSkge1xuICAgICAgY29uc3QgeyBidWZmZXIgfSA9IHZhbHVlIGFzIEJ1ZmZlciB8IFR5cGVkQXJyYXlcbiAgICAgIHRyYXZlcnNlKGJ1ZmZlciwgdmFsdWUpXG4gICAgICBpZiAoY3VzdG9tU291cmNlcy5nZXQoYnVmZmVyKSA9PT0gbnVsbCkge1xuICAgICAgICBjdXN0b21Tb3VyY2VzLnNldCh2YWx1ZSwgbnVsbClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmF2ZXJzZSh2YWx1ZSlcblxuICByZXR1cm4ge1xuICAgIF9iaW5kaW5nczogYmluZGluZ3MsXG4gICAgX2N1c3RvbVNvdXJjZXM6IGN1c3RvbVNvdXJjZXMsXG4gICAgX2N1cnJlbnRQYXJlbnRzOiBuZXcgU2V0KCksXG4gICAgX2JpbmRpbmdPcmRlcjogW10sXG4gICAgX211dGF0aW9uczogW10sXG4gIH1cbn1c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
|
package/license
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025-2026 Tomer Aberbach
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
|
6
|
+
associated documentation files (the "Software"), to deal in the Software without restriction, including
|
|
7
|
+
without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the
|
|
9
|
+
following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial
|
|
12
|
+
portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
|
15
|
+
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
|
|
16
|
+
EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
17
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
18
|
+
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/package.json
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tomer/uneval",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"author": {
|
|
5
|
+
"name": "Tomer Aberbach",
|
|
6
|
+
"email": "tomer@aberba.ch",
|
|
7
|
+
"url": "https://tomeraberba.ch"
|
|
8
|
+
},
|
|
9
|
+
"description": "Convert a JS value to JS source code, like eval in reverse.",
|
|
10
|
+
"keywords": [
|
|
11
|
+
"eval",
|
|
12
|
+
"source",
|
|
13
|
+
"stringify",
|
|
14
|
+
"serialize",
|
|
15
|
+
"roundtrip",
|
|
16
|
+
"uneval"
|
|
17
|
+
],
|
|
18
|
+
"homepage": "https://github.com/TomerAberbach/uneval",
|
|
19
|
+
"repository": "TomerAberbach/uneval",
|
|
20
|
+
"bugs": {
|
|
21
|
+
"url": "https://github.com/TomerAberbach/uneval/issues"
|
|
22
|
+
},
|
|
23
|
+
"funding": {
|
|
24
|
+
"url": "https://github.com/sponsors/TomerAberbach"
|
|
25
|
+
},
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"files": [
|
|
28
|
+
"dist"
|
|
29
|
+
],
|
|
30
|
+
"type": "module",
|
|
31
|
+
"sideEffects": false,
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">= 22"
|
|
34
|
+
},
|
|
35
|
+
"exports": {
|
|
36
|
+
".": {
|
|
37
|
+
"types": "./dist/index.d.mts",
|
|
38
|
+
"default": "./dist/index.js"
|
|
39
|
+
},
|
|
40
|
+
"./package.json": "./package.json"
|
|
41
|
+
},
|
|
42
|
+
"prettier": "@tomer/prettier-config",
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@fast-check/poisoning": "^0.2.3",
|
|
45
|
+
"@fast-check/vitest": "^0.2.4",
|
|
46
|
+
"@js-temporal/polyfill": "^0.5.1",
|
|
47
|
+
"@rollup/plugin-terser": "^1.0.0",
|
|
48
|
+
"@tomer/eslint-config": "^4.6.1",
|
|
49
|
+
"@tomer/prettier-config": "^4.0.0",
|
|
50
|
+
"@types/jsesc": "^3.0.3",
|
|
51
|
+
"@types/serialize-javascript": "^5.0.4",
|
|
52
|
+
"@vitest/coverage-v8": "^4.0.6",
|
|
53
|
+
"@vitest/expect": "^4.0.6",
|
|
54
|
+
"devalue": "^5.6.3",
|
|
55
|
+
"eslint": "^9.39.2",
|
|
56
|
+
"jest-extended": "^7.0.0",
|
|
57
|
+
"jsdom": "^28.1.0",
|
|
58
|
+
"jsesc": "^3.1.0",
|
|
59
|
+
"magic-string": "^0.30.21",
|
|
60
|
+
"prettier": "^3.8.1",
|
|
61
|
+
"publint": "^0.3.18",
|
|
62
|
+
"serialize-javascript": "^7.0.4",
|
|
63
|
+
"tosource": "2.0.0-alpha.3",
|
|
64
|
+
"tsdown": "^0.20.3",
|
|
65
|
+
"typescript": "^5.9.3",
|
|
66
|
+
"vitest": "^4.0.6"
|
|
67
|
+
},
|
|
68
|
+
"scripts": {
|
|
69
|
+
"format": "prettier --cache --write .",
|
|
70
|
+
"lint": "eslint --cache --cache-location node_modules/.cache/eslint/ --fix .",
|
|
71
|
+
"typecheck": "tsc --noEmit",
|
|
72
|
+
"test": "vitest",
|
|
73
|
+
"coverage": "vitest --coverage",
|
|
74
|
+
"bench": "vitest bench",
|
|
75
|
+
"build": "tsdown",
|
|
76
|
+
"generate-comparison-table": "node scripts/generate-comparison-table.ts",
|
|
77
|
+
"check-comparison-table": "node scripts/generate-comparison-table.ts --check"
|
|
78
|
+
}
|
|
79
|
+
}
|